commit 9d14fb1dcbe2032b6b9dea25e5b4fb4a9f33d21d Author: 筱傑 Date: Tue Feb 27 23:47:25 2024 +0800 Initial Commit - 1.0.0k diff --git a/back.lua b/back.lua new file mode 100644 index 0000000..a7635f3 --- /dev/null +++ b/back.lua @@ -0,0 +1,288 @@ +--Class +Back = Object:extend() + +--Class Methods +function Back:init(selected_back) + if not selected_back then selected_back = G.P_CENTERS.b_red end + self.name = selected_back.name or 'Red Deck' + + self.effect = { + center = selected_back, + text_UI = '', + config = copy_table(selected_back.config) + } + self.loc_name = localize{type = 'name_text', set = 'Back', key = self.effect.center.key} + + local pos = (self.effect.center.unlocked and self.effect.center.pos) or {x = 4, y = 0} + self.pos = self.pos or {} + self.pos.x = pos.x + self.pos.y = pos.y +end + +function Back:get_name() + if self.effect.center.unlocked then return self.loc_name else return localize('k_locked') end +end + +function Back:generate_UI(other, ui_scale, min_dims, challenge) + min_dims = min_dims or 0.7 + ui_scale = ui_scale or 0.9 + local back_config = other or self.effect.center + local name_to_check = other and other.name or self.name + local effect_config = other and other.config or self.effect.config + challenge = G.CHALLENGES[get_challenge_int_from_id(challenge or '') or ''] or {name = 'ERROR'} + + local loc_args, loc_nodes = nil, {} + + if not back_config.unlocked then + if not back_config.unlock_condition then + localize{type = 'descriptions', key = 'demo_locked', set = "Other", nodes = loc_nodes, vars = loc_args} + elseif back_config.unlock_condition.type == 'win_deck' then + local other_name = localize('k_unknown') + if G.P_CENTERS[back_config.unlock_condition.deck].unlocked then + other_name = localize{type = 'name_text', set = 'Back', key = back_config.unlock_condition.deck} + end + loc_args = {other_name} + localize{type = 'descriptions', key = 'deck_locked_win', set = "Other", nodes = loc_nodes, vars = loc_args} + elseif back_config.unlock_condition.type == 'discover_amount' then + loc_args = {tostring(back_config.unlock_condition.amount)} + localize{type = 'descriptions', key = 'deck_locked_discover', set = "Other", nodes = loc_nodes, vars = loc_args} + elseif back_config.unlock_condition.type == 'win_stake' then + local other_name = localize{type = 'name_text', set = 'Stake', key = G.P_CENTER_POOLS.Stake[back_config.unlock_condition.stake].key} + loc_args = {other_name, colours = {get_stake_col(back_config.unlock_condition.stake)}} + localize{type = 'descriptions', key = 'deck_locked_stake', set = "Other", nodes = loc_nodes, vars = loc_args} + end + else + if name_to_check == 'Blue Deck' then loc_args = {effect_config.hands} + elseif name_to_check == 'Red Deck' then loc_args = {effect_config.discards} + elseif name_to_check == 'Yellow Deck' then loc_args = {effect_config.dollars} + elseif name_to_check == 'Green Deck' then loc_args = {effect_config.extra_hand_bonus, effect_config.extra_discard_bonus} + elseif name_to_check == 'Black Deck' then loc_args = {effect_config.joker_slot, -effect_config.hands} + elseif name_to_check == 'Magic Deck' then loc_args = {localize{type = 'name_text', key = 'v_crystal_ball', set = 'Voucher'}, localize{type = 'name_text', key = 'c_fool', set = 'Tarot'}} + elseif name_to_check == 'Nebula Deck' then loc_args = {localize{type = 'name_text', key = 'v_telescope', set = 'Voucher'}, -1} + elseif name_to_check == 'Ghost Deck' then + elseif name_to_check == 'Abandoned Deck' then + elseif name_to_check == 'Checkered Deck' then + elseif name_to_check == 'Zodiac Deck' then loc_args = {localize{type = 'name_text', key = 'v_tarot_merchant', set = 'Voucher'}, + localize{type = 'name_text', key = 'v_planet_merchant', set = 'Voucher'}, + localize{type = 'name_text', key = 'v_overstock_norm', set = 'Voucher'}} + elseif name_to_check == 'Painted Deck' then loc_args = {effect_config.hand_size,effect_config.joker_slot} + elseif name_to_check == 'Anaglyph Deck' then loc_args = {localize{type = 'name_text', key = 'tag_double', set = 'Tag'}} + elseif name_to_check == 'Plasma Deck' then loc_args = {effect_config.ante_scaling} + elseif name_to_check == 'Erratic Deck' then + end + localize{type = 'descriptions', key = back_config.key, set = 'Back', nodes = loc_nodes, vars = loc_args} + end + + return + {n=G.UIT.ROOT, config={align = "cm", minw = min_dims*5, minh = min_dims*2.5, id = self.name, colour = G.C.CLEAR}, nodes={ + name_to_check == 'Challenge Deck' and UIBox_button({button = 'deck_view_challenge', label = {localize(challenge.id, 'challenge_names')}, minw = 2.2, minh = 1, scale = 0.6, id = challenge}) + or desc_from_rows(loc_nodes, true, min_dims*5) + }} +end + +function Back:change_to(new_back) + if not new_back then new_back = G.P_CENTERS.b_red end + self.name = new_back.name or 'Red Deck' + self.effect = { + center = new_back, + text_UI = '', + config = copy_table(new_back.config) + } + self.loc_name = localize{type = 'name_text', set = 'Back', key = self.effect.center.key} + local pos = self.effect.center.unlocked and copy_table(new_back.pos) or {x = 4, y = 0} + self.pos.x = pos.x + self.pos.y = pos.y +end + +function Back:save() + local backTable = { + name = self.name, + pos = self.pos, + effect = self.effect, + key = self.effect.center.key or 'b_red' + } + + return backTable +end + +function Back:trigger_effect(args) + if not args then return end + + if self.name == 'Anaglyph Deck' and args.context == 'eval' and G.GAME.last_blind and G.GAME.last_blind.boss then + G.E_MANAGER:add_event(Event({ + func = (function() + add_tag(Tag('tag_double')) + play_sound('generic1', 0.9 + math.random()*0.1, 0.8) + play_sound('holo1', 1.2 + math.random()*0.1, 0.4) + return true + end) + })) + end + if self.name == 'Plasma Deck' and args.context == 'blind_amount' then + return + end + + if self.name == 'Plasma Deck' and args.context == 'final_scoring_step' then + local tot = args.chips + args.mult + args.chips = math.floor(tot/2) + args.mult = math.floor(tot/2) + update_hand_text({delay = 0}, {mult = args.mult, chips = args.chips}) + + G.E_MANAGER:add_event(Event({ + func = (function() + local text = localize('k_balanced') + play_sound('gong', 0.94, 0.3) + play_sound('gong', 0.94*1.5, 0.2) + play_sound('tarot1', 1.5) + ease_colour(G.C.UI_CHIPS, {0.8, 0.45, 0.85, 1}) + ease_colour(G.C.UI_MULT, {0.8, 0.45, 0.85, 1}) + attention_text({ + scale = 1.4, text = text, hold = 2, align = 'cm', offset = {x = 0,y = -2.7},major = G.play + }) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + blocking = false, + delay = 4.3, + func = (function() + ease_colour(G.C.UI_CHIPS, G.C.BLUE, 2) + ease_colour(G.C.UI_MULT, G.C.RED, 2) + return true + end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + blocking = false, + no_delete = true, + delay = 6.3, + func = (function() + G.C.UI_CHIPS[1], G.C.UI_CHIPS[2], G.C.UI_CHIPS[3], G.C.UI_CHIPS[4] = G.C.BLUE[1], G.C.BLUE[2], G.C.BLUE[3], G.C.BLUE[4] + G.C.UI_MULT[1], G.C.UI_MULT[2], G.C.UI_MULT[3], G.C.UI_MULT[4] = G.C.RED[1], G.C.RED[2], G.C.RED[3], G.C.RED[4] + return true + end) + })) + return true + end) + })) + + delay(0.6) + return args.chips, args.mult + end +end + +function Back:apply_to_run() + + if self.effect.config.voucher then + G.GAME.used_vouchers[self.effect.config.voucher] = true + G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1 + Card.apply_to_run(nil, G.P_CENTERS[self.effect.config.voucher]) + end + if self.effect.config.hands then + G.GAME.starting_params.hands = G.GAME.starting_params.hands + self.effect.config.hands + end + if self.effect.config.consumables then + delay(0.4) + G.E_MANAGER:add_event(Event({ + func = function() + for k, v in ipairs(self.effect.config.consumables) do + local card = create_card('Tarot', G.consumeables, nil, nil, nil, nil, v, 'deck') + card:add_to_deck() + G.consumeables:emplace(card) + end + return true + end + })) + end + + + if self.effect.config.dollars then + G.GAME.starting_params.dollars = G.GAME.starting_params.dollars + self.effect.config.dollars + end + if self.effect.config.remove_faces then + G.GAME.starting_params.no_faces = true + end + + if self.effect.config.spectral_rate then + G.GAME.spectral_rate = self.effect.config.spectral_rate + end + if self.effect.config.discards then + G.GAME.starting_params.discards = G.GAME.starting_params.discards + self.effect.config.discards + end + if self.effect.config.reroll_discount then + G.GAME.starting_params.reroll_cost = G.GAME.starting_params.reroll_cost - self.effect.config.reroll_discount + end + + + if self.effect.config.edition then + G.E_MANAGER:add_event(Event({ + func = function() + local i = 0 + while i < self.effect.config.edition_count do + local card = pseudorandom_element(G.playing_cards, pseudoseed('edition_deck')) + if not card.edition then + i = i + 1 + card:set_edition({[self.effect.config.edition] = true}, nil, true) + end + end + return true + end + })) + end + if self.effect.config.vouchers then + for k, v in pairs(self.effect.config.vouchers) do + G.GAME.used_vouchers[v ] = true + G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1 + Card.apply_to_run(nil, G.P_CENTERS[v]) + end + end + if self.name == 'Checkered Deck' then + G.E_MANAGER:add_event(Event({ + func = function() + for k, v in pairs(G.playing_cards) do + if v.base.suit == 'Clubs' then + v:change_suit('Spades') + end + if v.base.suit == 'Diamonds' then + v:change_suit('Hearts') + end + end + return true + end + })) + end + if self.effect.config.randomize_rank_suit then + G.GAME.starting_params.erratic_suits_and_ranks = true + end + if self.effect.config.joker_slot then + G.GAME.starting_params.joker_slots = G.GAME.starting_params.joker_slots + self.effect.config.joker_slot + end + if self.effect.config.hand_size then + G.GAME.starting_params.hand_size = G.GAME.starting_params.hand_size + self.effect.config.hand_size + end + if self.effect.config.ante_scaling then + G.GAME.starting_params.ante_scaling = self.effect.config.ante_scaling + end + if self.effect.config.consumable_slot then + G.GAME.starting_params.consumable_slots = G.GAME.starting_params.consumable_slots + self.effect.config.consumable_slot + end + if self.effect.config.no_interest then + G.GAME.modifiers.no_interest = true + end + if self.effect.config.extra_hand_bonus then + G.GAME.modifiers.money_per_hand = self.effect.config.extra_hand_bonus + end + if self.effect.config.extra_discard_bonus then + G.GAME.modifiers.money_per_discard = self.effect.config.extra_discard_bonus + end +end + +function Back:load(backTable) + self.name = backTable.name + self.pos = backTable.pos + self.effect = backTable.effect + self.effect.center = G.P_CENTERS[backTable.key] or G.P_CENTERS.b_red + + + self.loc_name = localize{type = 'name_text', set = 'Back', key = self.effect.center.key} +end diff --git a/blind.lua b/blind.lua new file mode 100644 index 0000000..8461b7b --- /dev/null +++ b/blind.lua @@ -0,0 +1,751 @@ +--class +Blind = Moveable:extend() + +--class methods +function Blind:init(X, Y, W, H) + Moveable.init(self,X, Y, W, H) + + self.children = {} + self.config = {} + self.tilt_var = {mx = 0, my = 0, amt = 0} + self.ambient_tilt = 0.3 + self.chips = 0 + self.zoom = true + self.states.collide.can = true + self.colour = copy_table(G.C.BLACK) + self.dark_colour = darken(self.colour, 0.2) + self.children.animatedSprite = AnimatedSprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ANIMATION_ATLAS['blind_chips'], G.P_BLINDS.bl_small.pos) + self.children.animatedSprite.states = self.states + self.children.animatedSprite.states.visible = false + self.children.animatedSprite.states.drag.can = true + self.states.collide.can = true + self.states.drag.can = true + self.loc_debuff_lines = {'',''} + + self.shadow_height = 0 + + if getmetatable(self) == Blind then + table.insert(G.I.CARD, self) + end +end + +function Blind:change_colour(blind_col) + blind_col = blind_col or get_blind_main_colour(self.config.blind.key or '') + local dark_col = mix_colours(blind_col, G.C.BLACK, 0.4) + ease_colour(G.C.DYN_UI.MAIN, blind_col) + ease_colour(G.C.DYN_UI.DARK, dark_col) + + if not self.boss and self.name then + blind_col = darken(G.C.BLACK, 0.05) + dark_col = lighten(G.C.BLACK, 0.07) + else + dark_col = mix_colours(blind_col, G.C.BLACK, 0.2) + end + ease_colour(G.C.DYN_UI.BOSS_MAIN, blind_col) + ease_colour(G.C.DYN_UI.BOSS_DARK, dark_col) +end + +function Blind:set_text() + if self.config.blind then + if self.disabled then + self.loc_name = self.name == '' and self.name or localize{type ='name_text', key = self.config.blind.key, set = 'Blind'} + self.loc_debuff_text = '' + self.loc_debuff_lines[1] = '' + self.loc_debuff_lines[2] = '' + else + local loc_vars = nil + if self.name == 'The Ox' then + loc_vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')} + end + local loc_target = localize{type = 'raw_descriptions', key = self.config.blind.key, set = 'Blind', vars = loc_vars or self.config.blind.vars} + if loc_target then + self.loc_name = self.name == '' and self.name or localize{type ='name_text', key = self.config.blind.key, set = 'Blind'} + self.loc_debuff_text = '' + for k, v in ipairs(loc_target) do + self.loc_debuff_text = self.loc_debuff_text..v..(k <= #loc_target and ' ' or '') + end + self.loc_debuff_lines[1] = loc_target[1] or '' + self.loc_debuff_lines[2] = loc_target[2] or '' + else + self.loc_name = ''; self.loc_debuff_text = '' + self.loc_debuff_lines[1] = '' + self.loc_debuff_lines[2] = '' + end + end + end +end + +function Blind:set_blind(blind, reset, silent) + if not reset then + self.config.blind = blind or {} + self.name = blind and blind.name or '' + self.dollars = blind and blind.dollars or 0 + self.sound_pings = self.dollars + 2 + if G.GAME.modifiers.no_blind_reward and G.GAME.modifiers.no_blind_reward[self:get_type()] then self.dollars = 0 end + self.debuff = blind and blind.debuff or {} + self.pos = blind and blind.pos + self.mult = blind and blind.mult or 0 + self.disabled = false + self.discards_sub = nil + self.hands_sub = nil + self.boss = blind and not not blind.boss + self.blind_set = false + self.triggered = nil + self.prepped = true + self:set_text() + + G.GAME.last_blind = G.GAME.last_blind or {} + G.GAME.last_blind.boss = self.boss + G.GAME.last_blind.name = self.name + + if blind and blind.name then + self:change_colour() + else + self:change_colour(G.C.BLACK) + end + + self.chips = get_blind_amount(G.GAME.round_resets.ante)*self.mult*G.GAME.starting_params.ante_scaling + self.chip_text = number_format(self.chips) + + if not blind then self.chips = 0 end + + G.GAME.current_round.dollars_to_be_earned = self.dollars > 0 and (string.rep(localize('$'), self.dollars)..'') or ('') + G.HUD_blind.alignment.offset.y = -10 + G.HUD_blind:recalculate(false) + + if blind and blind.name and blind.name ~= '' then + self:alert_debuff(true) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.05, + blockable = false, + func = (function() + G.HUD_blind:get_UIE_by_ID("HUD_blind_name").states.visible = false + G.HUD_blind:get_UIE_by_ID("dollars_to_be_earned").parent.parent.states.visible = false + G.HUD_blind.alignment.offset.y = 0 + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.15, + blockable = false, + func = (function() + G.HUD_blind:get_UIE_by_ID("HUD_blind_name").states.visible = true + G.HUD_blind:get_UIE_by_ID("dollars_to_be_earned").parent.parent.states.visible = true + G.HUD_blind:get_UIE_by_ID("dollars_to_be_earned").config.object:pop_in(0) + G.HUD_blind:get_UIE_by_ID("HUD_blind_name").config.object:pop_in(0) + G.HUD_blind:get_UIE_by_ID("HUD_blind_count"):juice_up() + self.children.animatedSprite:set_sprite_pos(self.config.blind.pos) + self.blind_set = true + G.ROOM.jiggle = G.ROOM.jiggle + 3 + if not reset and not silent then + self:juice_up() + if blind then play_sound('chips1', math.random()*0.1 + 0.55, 0.42);play_sound('gold_seal', math.random()*0.1 + 1.85, 0.26)--play_sound('cancel') + end + end + return true + end) + })) + return true + end) + })) + end + + + self.config.h_popup_config ={align="tm", offset = {x=0,y=-0.1},parent = self} + end + + if self.name == 'The Eye' and not reset then + self.hands = { + ["Flush Five"] = false, + ["Flush House"] = false, + ["Five of a Kind"] = false, + ["Straight Flush"] = false, + ["Four of a Kind"] = false, + ["Full House"] = false, + ["Flush"] = false, + ["Straight"] = false, + ["Three of a Kind"] = false, + ["Two Pair"] = false, + ["Pair"] = false, + ["High Card"] = false, + } + end + if self.name == 'The Mouth' and not reset then + self.only_hand = false + end + if self.name == 'The Fish' and not reset then + self.prepped = nil + end + if self.name == 'The Water' and not reset then + self.discards_sub = G.GAME.current_round.discards_left + ease_discard(-self.discards_sub) + end + if self.name == 'The Needle' and not reset then + self.hands_sub = G.GAME.round_resets.hands - 1 + ease_hands_played(-self.hands_sub) + end + if self.name == 'The Manacle' and not reset then + G.hand:change_size(-1) + end + if self.name == 'Amber Acorn' and not reset and #G.jokers.cards > 0 then + G.jokers:unhighlight_all() + for k, v in ipairs(G.jokers.cards) do + v:flip() + end + if #G.jokers.cards > 1 then + G.E_MANAGER:add_event(Event({ trigger = 'after', delay = 0.2, func = function() + G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 0.85);return true end })) + delay(0.15) + G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 1.15);return true end })) + delay(0.15) + G.E_MANAGER:add_event(Event({ func = function() G.jokers:shuffle('aajk'); play_sound('cardSlide1', 1);return true end })) + delay(0.5) + return true end })) + end + end + + --add new debuffs + for _, v in ipairs(G.playing_cards) do + self:debuff_card(v) + end + for _, v in ipairs(G.jokers.cards) do + if not reset then self:debuff_card(v, true) end + end + + G.ARGS.spin.real = (self.config.blind.boss and (self.config.blind.boss.showdown and 0.5 or 0.25) or 0) +end + +function Blind:alert_debuff(first) + if self.loc_debuff_text and self.loc_debuff_text ~= '' then + self.block_play = true + G.E_MANAGER:add_event(Event({ + blockable = false, + blocking = false, + func = (function() + if self.disabled then self.block_play = nil; return true end + if G.STATE == G.STATES.SELECTING_HAND then + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = G.SETTINGS.GAMESPEED*0.05, + blockable = false, + func = (function() + play_sound('whoosh1', 0.55, 0.62) + for i = 1, 4 do + local wait_time = (0.1*(i-1)) + G.E_MANAGER:add_event(Event({ blockable = false, trigger = 'after', delay = G.SETTINGS.GAMESPEED*wait_time, + func = function() + if i == 1 then self:juice_up() end + play_sound('cancel', 0.7 + 0.05*i, 0.7) + return true end })) + end + local hold_time = G.SETTINGS.GAMESPEED*(#self.loc_debuff_text*0.035 + 1.3) + local disp_text = self:get_loc_debuff_text() + attention_text({ + scale = 0.7, text = disp_text, maxw = 12, hold = hold_time, align = 'cm', offset = {x = 0,y = -1},major = G.play + }) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1, + blocking = false, + blockable = false, + func = (function() + self.block_play = nil + if G.buttons then + local _buttons = G.buttons:get_UIE_by_ID('play_button') + _buttons.disable_button = nil + end + return true + end) + })) + return true + end) + })) + return true + end + end) + })) + end +end + +function Blind:get_loc_debuff_text() + local disp_text = (self.config.blind.name == 'The Wheel' and G.GAME.probabilities.normal or '')..self.loc_debuff_text + if (self.config.blind.name == 'The Mouth') and self.only_hand then disp_text = disp_text..' ['..localize(self.only_hand, 'poker_hands')..']' end + return disp_text +end + +function Blind:defeat(silent) + local dissolve_time = 1.3 + local extra_time = 0 + self.dissolve = 0 + self.dissolve_colours = {G.C.BLACK, G.C.RED} + self:juice_up() + self.children.particles = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + timer = 0.01*dissolve_time, + scale = 0.1, + speed = 1.5, + lifespan = 0.7*dissolve_time, + attach = self, + colours = self.dissolve_colours, + fill = true + }) + + local blind_name_dynatext = G.HUD_blind:get_UIE_by_ID('HUD_blind_name').config.object + blind_name_dynatext:pop_out(2) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.5*dissolve_time, + func = (function() self.children.particles.max = 0 return true end) + })) + if not silent then + for i = 1, math.min(self.sound_pings or 3, 7) do + extra_time = extra_time + (0.4+0.15*i)*dissolve_time + G.E_MANAGER:add_event(Event({ blockable = false, trigger = 'after', delay = (0.15 - 0.01*(self.sound_pings or 3))*i*dissolve_time, + func = function() + play_sound('cancel', 0.8 - 0.05*i, 1.7) + if i == math.min((self.sound_pings or 3)+1, 6) then play_sound('whoosh2', 0.7, 0.42) end + return true end })) + end + end + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 1, + delay = 0.7*dissolve_time, + func = (function(t) return t end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.8*dissolve_time, + func = (function() + G.HUD_blind.alignment.offset.y = -10 + return true + end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.95*dissolve_time, + func = (function() + self.dissolve = nil + self:set_blind(nil, nil, true) return true end) + })) + for k, v in ipairs(G.jokers.cards) do + if v.facing == 'back' then v:flip() end + end + if self.name == 'The Manacle' and not self.disabled then + G.hand:change_size(1) + end +end + +function Blind:get_type() + if self.name == "Small Blind" then + return 'Small' + elseif self.name == "Big Blind" then + return 'Big' + elseif self.name and self.name ~= '' then + return 'Boss' + end +end + +function Blind:disable() + self.disabled = true + for k, v in ipairs(G.jokers.cards) do + if v.facing == 'back' then v:flip() end + end + if self.name == 'The Water' then + ease_discard(self.discards_sub) + end + if self.name == 'The Wheel' or self.name == 'The House' or self.name == 'The Mark' or self.name == 'The Fish' then + for i = 1, #G.hand.cards do + if G.hand.cards[i].facing == 'back' then + G.hand.cards[i]:flip() + end + end + for k, v in pairs(G.playing_cards) do + v.ability.wheel_flipped = nil + end + end + if self.name == 'The Needle' then + ease_hands_played(self.hands_sub) + end + if self.name == 'The Wall' then + self.chips = self.chips/2 + self.chip_text = number_format(self.chips) + end + if self.name == 'Cerulean Bell' then + for k, v in ipairs(G.playing_cards) do + v.ability.forced_selection = nil + end + end + if self.name == 'The Manacle' then + G.hand:change_size(1) + + G.FUNCS.draw_from_deck_to_hand(1) + end + if self.name == 'The Serpent' then + end + if self.name == 'Violet Vessel' then + self.chips = self.chips/3 + self.chip_text = number_format(self.chips) + end + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + if self.boss and G.GAME.chips - G.GAME.blind.chips >= 0 then + G.STATE = G.STATES.NEW_ROUND + G.STATE_COMPLETE = false + end + return true + end + })) + for _, v in ipairs(G.playing_cards) do + self:debuff_card(v) + end + for _, v in ipairs(G.jokers.cards) do + self:debuff_card(v) + end + self:set_text() + self:wiggle() +end + +function Blind:wiggle() + self.children.animatedSprite:juice_up(0.3) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) +end + +function Blind:juice_up(_a, _b) + self.children.animatedSprite:juice_up(_a or 0.2, _b or 0.2) +end + +function Blind:hover() + if not G.CONTROLLER.dragging.target or G.CONTROLLER.using_touch then + if not self.hovering and self.states.visible and self.children.animatedSprite.states.visible then + self.hovering = true + self.hover_tilt = 2 + self.children.animatedSprite:juice_up(0.05, 0.02) + play_sound('chips1', math.random()*0.1 + 0.55, 0.12) + Node.hover(self) + end + end +end + +function Blind:stop_hover() + self.hovering = false + self.hover_tilt = 0 + Node.stop_hover(self) +end + +function Blind:draw() + if not self.states.visible then return end + self.tilt_var = self.tilt_var or {} + self.tilt_var.mx, self.tilt_var.my =G.CONTROLLER.cursor_position.x,G.CONTROLLER.cursor_position.y + + self.children.animatedSprite.role.draw_major = self + self.children.animatedSprite:draw_shader('dissolve', 0.1) + self.children.animatedSprite:draw_shader('dissolve') + + for k, v in pairs(self.children) do + if k ~= 'animatedSprite' then + v.VT.scale = self.VT.scale + v:draw() + end + end + add_to_drawhash(self) +end + +function Blind:press_play() + if self.disabled then return end + if self.name == "The Hook" then + G.E_MANAGER:add_event(Event({ func = function() + local any_selected = nil + local _cards = {} + for k, v in ipairs(G.hand.cards) do + _cards[#_cards+1] = v + end + for i = 1, 2 do + if G.hand.cards[i] then + local selected_card, card_key = pseudorandom_element(_cards, pseudoseed('hook')) + G.hand:add_to_highlighted(selected_card, true) + table.remove(_cards, card_key) + any_selected = true + play_sound('card1', 1) + end + end + if any_selected then G.FUNCS.discard_cards_from_highlighted(nil, true) end + return true end })) + self.triggered = true + delay(0.7) + return true + end + if self.name == 'Crimson Heart' then + if G.jokers.cards[1] then + self.triggered = true + self.prepped = true + end + end + if self.name == 'The Fish' then + self.prepped = true + end + if self.name == "The Tooth" then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function() + for i = 1, #G.play.cards do + G.E_MANAGER:add_event(Event({func = function() G.play.cards[i]:juice_up(); return true end })) + ease_dollars(-1) + delay(0.23) + end + return true end })) + self.triggered = true + return true + end +end + +function Blind:modify_hand(cards, poker_hands, text, mult, hand_chips) + if self.disabled then return mult, hand_chips, false end + if self.name == "The Flint" then + self.triggered = true + return math.max(math.floor(mult*0.5 + 0.5), 1), math.max(math.floor(hand_chips*0.5 + 0.5), 0), true + end + return mult, hand_chips, false +end + +function Blind:debuff_hand(cards, hand, handname, check) + if self.disabled then return end + if self.debuff then + self.triggered = false + if self.debuff.hand and next(hand[self.debuff.hand]) then + self.triggered = true + return true + end + if self.debuff.h_size_ge and #cards < self.debuff.h_size_ge then + self.triggered = true + return true + end + if self.debuff.h_size_le and #cards > self.debuff.h_size_le then + self.triggered = true + return true + end + if self.name == "The Eye" then + if self.hands[handname] then + self.triggered = true + return true + end + if not check then self.hands[handname] = true end + end + if self.name == "The Mouth" then + if self.only_hand and self.only_hand ~= handname then + self.triggered = true + return true + end + if not check then self.only_hand = handname end + end + end + if self.name == 'The Arm' then + self.triggered = false + if G.GAME.hands[handname].level > 1 then + self.triggered = true + if not check then + level_up_hand(self.children.animatedSprite, handname, nil, -1) + self:wiggle() + end + end + end + if self.name == 'The Ox' then + self.triggered = false + if handname == G.GAME.current_round.most_played_poker_hand then + self.triggered = true + if not check then + ease_dollars(-G.GAME.dollars, true) + self:wiggle() + end + end + end +end + +function Blind:drawn_to_hand() + if not self.disabled then + if self.name == 'Cerulean Bell' then + local any_forced = nil + for k, v in ipairs(G.hand.cards) do + if v.ability.forced_selection then + any_forced = true + end + end + if not any_forced then + G.hand:unhighlight_all() + local forced_card = pseudorandom_element(G.hand.cards, pseudoseed('cerulean_bell')) + forced_card.ability.forced_selection = true + G.hand:add_to_highlighted(forced_card) + end + end + if self.name == 'Crimson Heart' and self.prepped and G.jokers.cards[1] then + local jokers = {} + for i = 1, #G.jokers.cards do + if not G.jokers.cards[i].debuff or #G.jokers.cards < 2 then jokers[#jokers+1] =G.jokers.cards[i] end + G.jokers.cards[i]:set_debuff(false) + end + local _card = pseudorandom_element(jokers, pseudoseed('crimson_heart')) + if _card then + _card:set_debuff(true) + _card:juice_up() + self:wiggle() + end + end + end + self.prepped = nil +end + +function Blind:stay_flipped(area, card) + if not self.disabled then + if area == G.hand then + if self.name == 'The Wheel' and pseudorandom(pseudoseed('wheel')) < G.GAME.probabilities.normal/7 then + return true + end + if self.name == 'The House' and G.GAME.current_round.hands_played == 0 and G.GAME.current_round.discards_used == 0 then + return true + end + if self.name == 'The Mark' and card:is_face(true) then + return true + end + if self.name == 'The Fish' and self.prepped then + return true + end + end + end +end + +function Blind:debuff_card(card, from_blind) + if self.debuff and not self.disabled and card.area ~= G.jokers then + if self.debuff.suit and card:is_suit(self.debuff.suit, true) then + card:set_debuff(true) + return + end + if self.debuff.is_face =='face' and card:is_face(true) then + card:set_debuff(true) + return + end + if self.name == 'The Pillar' and card.ability.played_this_ante then + card:set_debuff(true) + return + end + if self.debuff.value and self.debuff.value == card.base.value then + card:set_debuff(true) + return + end + if self.debuff.nominal and self.debuff.nominal == card.base.nominal then + card:set_debuff(true) + return + end + end + if self.name == 'Crimson Heart' and not self.disabled and card.area == G.jokers then + return + end + if self.name == 'Verdant Leaf' and not self.disabled and card.area ~= G.jokers then card:set_debuff(true); return end + card:set_debuff(false) +end + +function Blind:move(dt) + Moveable.move(self, dt) + self:align() +end + +function Blind:change_dim(w, h) + self.T.w = w or self.T.w + self.T.h = h or self.T.h + self.children.animatedSprite.T.w = w or self.T.w + self.children.animatedSprite.T.h = h or self.T.h + self.children.animatedSprite:rescale() +end + +function Blind:align() + for k, v in pairs(self.children) do + if k == 'animatedSprite' then + if not v.states.drag.is then + v.T.r = 0.02*math.sin(2*G.TIMERS.REAL+self.T.x) + v.T.y = self.T.y + 0.03*math.sin(0.666*G.TIMERS.REAL+self.T.x) + self.shadow_height = 0.1 - (0.04 + 0.03*math.sin(0.666*G.TIMERS.REAL+self.T.x)) + v.T.x = self.T.x + 0.03*math.sin(0.436*G.TIMERS.REAL+self.T.x) + end + else + v.T.x = self.T.x + v.T.y = self.T.y + v.T.r = self.T.r + end + end +end + +function Blind:save() + local blindTable = { + name = self.name, + dollars = self.dollars, + debuff = self.debuff, + pos = self.pos, + mult = self.mult, + disabled = self.disabled, + discards_sub = self.discards_sub, + hands_sub = self.hands_sub, + boss = self.boss, + config_blind = '', + chips = self.chips, + chip_text =self.chip_text, + hands = self.hands, + only_hand = self.only_hand, + triggered = self.triggered + } + + for k, v in pairs(G.P_BLINDS) do + if v and v.name and v.name == blindTable.name then + blindTable.config_blind = k + end + end + + return blindTable +end + +function Blind:load(blindTable) + self.config.blind = G.P_BLINDS[blindTable.config_blind] or {} + + self.name = blindTable.name + self.dollars = blindTable.dollars + self.debuff = blindTable.debuff + self.pos = blindTable.pos + self.mult = blindTable.mult + self.disabled = blindTable.disabled + self.discards_sub = blindTable.discards_sub + self.hands_sub = blindTable.hands_sub + self.boss = blindTable.boss + self.chips = blindTable.chips + self.chip_text = blindTable.chip_text + self.hands = blindTable.hands + self.only_hand = blindTable.only_hand + self.triggered = blindTable.triggered + + G.ARGS.spin.real = (self.config.blind.boss and (self.config.blind.boss.showdown and 1 or 0.3) or 0) + + if G.P_BLINDS[blindTable.config_blind] then + self.blind_set = true + self.children.animatedSprite.states.visible = true + self.children.animatedSprite:set_sprite_pos(self.config.blind.pos) + self.children.animatedSprite:juice_up(0.3) + self:align() + self.children.animatedSprite:hard_set_VT() + else + self.children.animatedSprite.states.visible = false + end + + self.children.animatedSprite.states = self.states + self:change_colour() + if self.dollars > 0 then + G.GAME.current_round.dollars_to_be_earned = string.rep(localize('$'), self.dollars)..'' + G.HUD_blind:get_UIE_by_ID("dollars_to_be_earned").config.object:pop_in(0) + G.HUD_blind.alignment.offset.y = 0 + end + self:set_text() +end diff --git a/card.lua b/card.lua new file mode 100644 index 0000000..0918548 --- /dev/null +++ b/card.lua @@ -0,0 +1,4715 @@ +--class +Card = Moveable:extend() + +--class methods +function Card:init(X, Y, W, H, card, center, params) + self.params = (type(params) == 'table') and params or {} + + Moveable.init(self,X, Y, W, H) + + self.CT = self.VT + self.config = { + card = card or {}, + center = center + } + self.tilt_var = {mx = 0, my = 0, dx = 0, dy = 0, amt = 0} + self.ambient_tilt = 0.2 + + self.states.collide.can = true + self.states.hover.can = true + self.states.drag.can = true + self.states.click.can = true + + self.playing_card = self.params.playing_card + G.sort_id = (G.sort_id or 0) + 1 + self.sort_id = G.sort_id + + if self.params.viewed_back then self.back = 'viewed_back' + else self.back = 'selected_back' end + self.bypass_discovery_center = self.params.bypass_discovery_center + self.bypass_discovery_ui = self.params.bypass_discovery_ui + self.bypass_lock = self.params.bypass_lock + self.no_ui = self.config.card and self.config.card.no_ui + self.children = {} + self.base_cost = 0 + self.extra_cost = 0 + self.cost = 0 + self.sell_cost = 0 + self.sell_cost_label = 0 + self.children.shadow = Moveable(0, 0, 0, 0) + self.unique_val = 1-self.ID/1603301 + self.edition = nil + self.zoom = true + self:set_ability(center, true) + self:set_base(card, true) + + self.discard_pos = { + r = 3.6*(math.random()-0.5), + x = math.random(), + y = math.random() + } + + self.facing = 'front' + self.sprite_facing = 'front' + self.flipping = nil + self.area = nil + self.highlighted = false + self.click_timeout = 0.3 + self.T.scale = 0.95 + self.debuff = false + + self.rank = nil + self.added_to_deck = nil + + if self.children.front then self.children.front.VT.w = 0 end + self.children.back.VT.w = 0 + self.children.center.VT.w = 0 + + if self.children.front then self.children.front.parent = self; self.children.front.layered_parallax = nil end + self.children.back.parent = self; self.children.back.layered_parallax = nil + self.children.center.parent = self; self.children.center.layered_parallax = nil + + self:set_cost() + + if getmetatable(self) == Card then + table.insert(G.I.CARD, self) + end +end + +function Card:update_alert() + if (self.ability.set == 'Joker' or self.ability.set == 'Voucher' or self.ability.consumeable or self.ability.set == 'Edition' or self.ability.set == 'Booster') then + if self.area and self.area.config.collection and self.config.center then + if self.config.center.alerted and self.children.alert then + self.children.alert:remove() + self.children.alert = nil + elseif not self.config.center.alerted and not self.children.alert and self.config.center.discovered then + self.children.alert = UIBox{ + definition = create_UIBox_card_alert(), + config = {align=(self.ability.set == 'Voucher' and (self.config.center.order%2)==1) and "tli" or "tri", + offset = {x = (self.ability.set == 'Voucher' and (self.config.center.order%2)==1) and 0.1 or -0.1, y = 0.1}, + parent = self} + } + end + end + end +end + +function Card:set_base(card, initial) + card = card or {} + + self.config.card = card + for k, v in pairs(G.P_CARDS) do + if card == v then self.config.card_key = k end + end + + if next(card) then + self:set_sprites(nil, card) + end + + local suit_base_nominal_original = nil + if self.base and self.base.suit_nominal_original then suit_base_nominal_original = self.base.suit_nominal_original end + self.base = { + name = self.config.card.name, + suit = self.config.card.suit, + value = self.config.card.value, + nominal = 0, + suit_nominal = 0, + face_nominal = 0, + colour = G.C.SUITS[self.config.card.suit], + times_played = 0 + } + + if self.base.value == '2' then self.base.nominal = 2; self.base.id = 2 + elseif self.base.value == '3' then self.base.nominal = 3; self.base.id = 3 + elseif self.base.value == '4' then self.base.nominal = 4; self.base.id = 4 + elseif self.base.value == '5' then self.base.nominal = 5; self.base.id = 5 + elseif self.base.value == '6' then self.base.nominal = 6; self.base.id = 6 + elseif self.base.value == '7' then self.base.nominal = 7; self.base.id = 7 + elseif self.base.value == '8' then self.base.nominal = 8; self.base.id = 8 + elseif self.base.value == '9' then self.base.nominal = 9; self.base.id = 9 + elseif self.base.value == '10' then self.base.nominal = 10; self.base.id = 10 + elseif self.base.value == 'Jack' then self.base.nominal = 10; self.base.face_nominal = 0.1; self.base.id = 11 + elseif self.base.value == 'Queen' then self.base.nominal = 10; self.base.face_nominal = 0.2; self.base.id = 12 + elseif self.base.value == 'King' then self.base.nominal = 10; self.base.face_nominal = 0.3; self.base.id = 13 + elseif self.base.value == 'Ace' then self.base.nominal = 11; self.base.face_nominal = 0.4; self.base.id = 14 end + + if initial then self.base.original_value = self.base.value end + + if self.base.suit == 'Diamonds' then self.base.suit_nominal = 0.01; self.base.suit_nominal_original = suit_base_nominal_original or 0.001 + elseif self.base.suit == 'Clubs' then self.base.suit_nominal = 0.02; self.base.suit_nominal_original = suit_base_nominal_original or 0.002 + elseif self.base.suit == 'Hearts' then self.base.suit_nominal = 0.03; self.base.suit_nominal_original = suit_base_nominal_original or 0.003 + elseif self.base.suit == 'Spades' then self.base.suit_nominal = 0.04; self.base.suit_nominal_original = suit_base_nominal_original or 0.004 end + + if not initial then G.GAME.blind:debuff_card(self) end + if self.playing_card and not initial then check_for_unlock({type = 'modify_deck'}) end +end + +function Card:set_sprites(_center, _front) + if _front then + if self.children.front then + self.children.front.atlas = G.ASSET_ATLAS[_front.atlas] or G.ASSET_ATLAS["cards_"..(G.SETTINGS.colourblind_option and 2 or 1)] + self.children.front:set_sprite_pos(self.config.card.pos) + else + self.children.front = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, _front.atlas and G.ASSET_ATLAS[_front.atlas] or G.ASSET_ATLAS["cards_"..(G.SETTINGS.colourblind_option and 2 or 1)], self.config.card.pos) + self.children.front.states.hover = self.states.hover + self.children.front.states.click = self.states.click + self.children.front.states.drag = self.states.drag + self.children.front.states.collide.can = false + self.children.front:set_role({major = self, role_type = 'Glued', draw_major = self}) + end + end + if _center then + if _center.set then + if self.children.center then + self.children.center.atlas = G.ASSET_ATLAS[(_center.atlas or (_center.set == 'Joker' or _center.consumeable or _center.set == 'Voucher') and _center.set) or 'centers'] + self.children.center:set_sprite_pos(_center.pos) + else + if _center.set == 'Joker' and not _center.unlocked and not self.params.bypass_discovery_center then + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS["Joker"], G.j_locked.pos) + elseif self.config.center.set == 'Voucher' and not self.config.center.unlocked and not self.params.bypass_discovery_center then + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS["Voucher"], G.v_locked.pos) + elseif self.config.center.consumeable and self.config.center.demo then + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS["Tarot"], G.c_locked.pos) + elseif not self.params.bypass_discovery_center and (_center.set == 'Edition' or _center.set == 'Joker' or _center.consumeable or _center.set == 'Voucher' or _center.set == 'Booster') and not _center.discovered then + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS[_center.atlas or _center.set], + (_center.set == 'Joker' and G.j_undiscovered.pos) or + (_center.set == 'Edition' and G.j_undiscovered.pos) or + (_center.set == 'Tarot' and G.t_undiscovered.pos) or + (_center.set == 'Planet' and G.p_undiscovered.pos) or + (_center.set == 'Spectral' and G.s_undiscovered.pos) or + (_center.set == 'Voucher' and G.v_undiscovered.pos) or + (_center.set == 'Booster' and G.booster_undiscovered.pos)) + elseif _center.set == 'Joker' or _center.consumeable or _center.set == 'Voucher' then + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS[_center.set], self.config.center.pos) + else + self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS[_center.atlas or 'centers'], _center.pos) + end + self.children.center.states.hover = self.states.hover + self.children.center.states.click = self.states.click + self.children.center.states.drag = self.states.drag + self.children.center.states.collide.can = false + self.children.center:set_role({major = self, role_type = 'Glued', draw_major = self}) + end + if _center.name == 'Half Joker' and (_center.discovered or self.bypass_discovery_center) then + self.children.center.scale.y = self.children.center.scale.y/1.7 + end + if _center.name == 'Photograph' and (_center.discovered or self.bypass_discovery_center) then + self.children.center.scale.y = self.children.center.scale.y/1.2 + end + end + + if _center.soul_pos then + self.children.floating_sprite = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS['Joker'], self.config.center.soul_pos) + self.children.floating_sprite.role.draw_major = self + self.children.floating_sprite.states.hover.can = false + self.children.floating_sprite.states.click.can = false + end + + if not self.children.back then + self.children.back = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS["centers"], self.params.bypass_back or (self.playing_card and G.GAME[self.back].pos or G.P_CENTERS['b_red'].pos)) + self.children.back.states.hover = self.states.hover + self.children.back.states.click = self.states.click + self.children.back.states.drag = self.states.drag + self.children.back.states.collide.can = false + self.children.back:set_role({major = self, role_type = 'Glued', draw_major = self}) + end + end +end + +function Card:set_ability(center, initial, delay_sprites) + local X, Y, W, H = self.T.x, self.T.y, self.T.w, self.T.h + + local old_center = self.config.center + self.config.center = center + for k, v in pairs(G.P_CENTERS) do + if center == v then self.config.center_key = k end + end + + if self.params.discover and not center.discovered then + unlock_card(center) + discover_card(center) + end + + if center.name == "Half Joker" and (center.discovered or self.bypass_discovery_center) then + H = H/1.7 + self.T.h = H + end + + if center.name == "Photograph" and (center.discovered or self.bypass_discovery_center) then + H = H/1.2 + self.T.h = H + end + + if center.name == "Wee Joker" and (center.discovered or self.bypass_discovery_center) then + H = H*0.7 + W = W*0.7 + self.T.h = H + self.T.w = W + end + + if delay_sprites then + G.E_MANAGER:add_event(Event({ + func = function() + if not self.REMOVED then + self:set_sprites(center) + end + return true + end + })) + else + self:set_sprites(center) + end + + if self.ability and old_center and old_center.config.bonus then + self.ability.bonus = self.ability.bonus - old_center.config.bonus + end + + self.ability = { + name = center.name, + effect = center.effect, + set = center.set, + mult = center.config.mult or 0, + h_mult = center.config.h_mult or 0, + h_x_mult = center.config.h_x_mult or 0, + h_dollars = center.config.h_dollars or 0, + p_dollars = center.config.p_dollars or 0, + t_mult = center.config.t_mult or 0, + t_chips = center.config.t_chips or 0, + x_mult = center.config.Xmult or 1, + h_size = center.config.h_size or 0, + d_size = center.config.d_size or 0, + extra = copy_table(center.config.extra) or nil, + extra_value = 0, + type = center.config.type or '', + order = center.order or nil, + forced_selection = self.ability and self.ability.forced_selection or nil, + perma_bonus = self.ability and self.ability.perma_bonus or 0, + } + + self.ability.bonus = (self.ability.bonus or 0) + (center.config.bonus or 0) + + if center.consumeable then + self.ability.consumeable = center.config + end + + if self.ability.name == 'Gold Card' and self.seal == 'Gold' and self.playing_card then + check_for_unlock({type = 'double_gold'}) + end + if self.ability.name == "Invisible Joker" then + self.ability.invis_rounds = 0 + end + if self.ability.name == 'To Do List' 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 + local old_hand = self.ability.to_do_poker_hand + self.ability.to_do_poker_hand = nil + + while not self.ability.to_do_poker_hand do + self.ability.to_do_poker_hand = pseudorandom_element(_poker_hands, pseudoseed((self.area and self.area.config.type == 'title') and 'false_to_do' or 'to_do')) + if self.ability.to_do_poker_hand == old_hand then self.ability.to_do_poker_hand = nil end + end + end + if self.ability.name == 'Caino' then + self.ability.caino_xmult = 1 + end + if self.ability.name == 'Yorick' then + self.ability.yorick_discards = self.ability.extra.discards + end + if self.ability.name == 'Loyalty Card' then + self.ability.burnt_hand = 0 + self.ability.loyalty_remaining = self.ability.extra.every + end + + self.base_cost = center.cost or 1 + + self.ability.hands_played_at_create = G.GAME and G.GAME.hands_played or 0 + + self.label = center.label or self.config.card.label or self.ability.set + if self.ability.set == 'Joker' then self.label = self.ability.name end + if self.ability.set == 'Edition' then self.label = self.ability.name end + if self.ability.consumeable then self.label = self.ability.name end + if self.ability.set == 'Voucher' then self.label = self.ability.name end + if self.ability.set == 'Booster' then + self.label = self.ability.name + self.mouse_damping = 1.5 + end + + if not G.OVERLAY_MENU then + for k, v in pairs(G.P_CENTERS) do + if v.name == self.ability.name then + G.GAME.used_jokers[k] = true + end + end + end + + if G.jokers and self.area == G.jokers then + check_for_unlock({type = 'modify_jokers'}) + end + + if G.consumeables and self.area == G.consumeables then + check_for_unlock({type = 'modify_jokers'}) + end + + if not initial then G.GAME.blind:debuff_card(self) end + if self.playing_card and not initial then check_for_unlock({type = 'modify_deck'}) end +end + +function Card:set_cost() + self.extra_cost = 0 + G.GAME.inflation + if self.edition then + self.extra_cost = self.extra_cost + (self.edition.holo and 3 or 0) + (self.edition.foil and 2 or 0) + + (self.edition.polychrome and 5 or 0) + (self.edition.negative and 5 or 0) + end + self.cost = math.max(1, math.floor((self.base_cost + self.extra_cost + 0.5)*(100-G.GAME.discount_percent)/100)) + if self.ability.set == 'Booster' and G.GAME.modifiers.booster_ante_scaling then self.cost = self.cost + G.GAME.round_resets.ante - 1 end + if self.ability.set == 'Booster' and (not G.SETTINGS.tutorial_complete) and G.SETTINGS.tutorial_progress and (not G.SETTINGS.tutorial_progress.completed_parts['shop_1']) then + self.cost = self.cost + 3 + end + if (self.ability.set == 'Planet' or (self.ability.set == 'Booster' and self.ability.name:find('Celestial'))) and #find_joker('Astronomer') > 0 then self.cost = 0 end + self.sell_cost = math.max(1, math.floor(self.cost/2)) + (self.ability.extra_value or 0) + if self.area and self.ability.couponed and (self.area == G.shop_jokers or self.area == G.shop_booster) then self.cost = 0 end + self.sell_cost_label = self.facing == 'back' and '?' or self.sell_cost +end + +function Card:set_edition(edition, immediate, silent) + self.edition = nil + if not edition then return end + if edition.holo then + if not self.edition then self.edition = {} end + self.edition.mult = G.P_CENTERS.e_holo.config.extra + self.edition.holo = true + self.edition.type = 'holo' + elseif edition.foil then + if not self.edition then self.edition = {} end + self.edition.chips = G.P_CENTERS.e_foil.config.extra + self.edition.foil = true + self.edition.type = 'foil' + elseif edition.polychrome then + if not self.edition then self.edition = {} end + self.edition.x_mult = G.P_CENTERS.e_polychrome.config.extra + self.edition.polychrome = true + self.edition.type = 'polychrome' + elseif edition.negative then + if not self.edition then + self.edition = {} + if self.added_to_deck then --Need to override if adding negative to an existing joker + if self.ability.consumeable then + G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1 + else + G.jokers.config.card_limit = G.jokers.config.card_limit + 1 + end + end + end + self.edition.negative = true + self.edition.type = 'negative' + end + + if self.area and self.area == G.jokers then + if self.edition then + if not G.P_CENTERS['e_'..(self.edition.type)].discovered then + discover_card(G.P_CENTERS['e_'..(self.edition.type)]) + end + else + if not G.P_CENTERS['e_base'].discovered then + discover_card(G.P_CENTERS['e_base']) + end + end + end + + if self.edition and not silent then + G.CONTROLLER.locks.edition = true + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = not immediate and 0.2 or 0, + blockable = not immediate, + func = function() + self:juice_up(1, 0.5) + if self.edition.foil then play_sound('foil1', 1.2, 0.4) end + if self.edition.holo then play_sound('holo1', 1.2*1.58, 0.4) end + if self.edition.polychrome then play_sound('polychrome1', 1.2, 0.7) end + if self.edition.negative then play_sound('negative', 1.5, 0.4) end + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + G.CONTROLLER.locks.edition = false + return true + end + })) + end + + if G.jokers and self.area == G.jokers then + check_for_unlock({type = 'modify_jokers'}) + end + + self:set_cost() +end + +function Card:set_seal(_seal, silent, immediate) + self.seal = nil + if _seal then + self.seal = _seal + if not silent then + G.CONTROLLER.locks.seal = true + if immediate then + self:juice_up(0.3, 0.3) + play_sound('gold_seal', 1.2, 0.4) + G.CONTROLLER.locks.seal = false + else + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.3, + func = function() + self:juice_up(0.3, 0.3) + play_sound('gold_seal', 1.2, 0.4) + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.15, + func = function() + G.CONTROLLER.locks.seal = false + return true + end + })) + end + end + end + if self.ability.name == 'Gold Card' and self.seal == 'Gold' and self.playing_card then + check_for_unlock({type = 'double_gold'}) + end + self:set_cost() +end + +function Card:get_seal(bypass_debuff) + if self.debuff and not bypass_debuff then return end + return self.seal +end + +function Card:set_eternal(_eternal) + if self.config.center.eternal_compat then + self.ability.eternal = _eternal + end +end + +function Card:set_debuff(should_debuff) + if should_debuff ~= self.debuff then + if self.area == G.jokers then if should_debuff then self:remove_from_deck(true) else self:add_to_deck(true) end end + self.debuff = should_debuff + end +end + +function Card:remove_UI() + self.ability_UIBox_table = nil + self.config.h_popup = nil + self.config.h_popup_config = nil + self.no_ui = true +end + +function Card:change_suit(new_suit) + local new_code = (new_suit == 'Diamonds' and 'D_') or + (new_suit == 'Spades' and 'S_') or + (new_suit == 'Clubs' and 'C_') or + (new_suit == 'Hearts' and 'H_') + local new_val = (self.base.value == 'Ace' and 'A') or + (self.base.value == 'King' and 'K') or + (self.base.value == 'Queen' and 'Q') or + (self.base.value == 'Jack' and 'J') or + (self.base.value == '10' and 'T') or + (self.base.value) + local new_card = G.P_CARDS[new_code..new_val] + + self:set_base(new_card) + G.GAME.blind:debuff_card(self) +end + +function Card:add_to_deck(from_debuff) + if not self.config.center.discovered then + discover_card(self.config.center) + end + if not self.added_to_deck then + self.added_to_deck = true + if self.ability.set == 'Enhanced' or self.ability.set == 'Default' then + if self.ability.name == 'Gold Card' and self.seal == 'Gold' and self.playing_card then + check_for_unlock({type = 'double_gold'}) + end + return + end + + if self.edition then + if not G.P_CENTERS['e_'..(self.edition.type)].discovered then + discover_card(G.P_CENTERS['e_'..(self.edition.type)]) + end + else + if not G.P_CENTERS['e_base'].discovered then + discover_card(G.P_CENTERS['e_base']) + end + end + if self.ability.h_size ~= 0 then + G.hand:change_size(self.ability.h_size) + end + if self.ability.d_size > 0 then + G.GAME.round_resets.discards = G.GAME.round_resets.discards + self.ability.d_size + ease_discard(self.ability.d_size) + end + if self.ability.name == 'Credit Card' then + G.GAME.bankrupt_at = G.GAME.bankrupt_at - self.ability.extra + end + if self.ability.name == 'Chicot' and G.GAME.blind and G.GAME.blind.boss and not G.GAME.blind.disabled then + G.GAME.blind:disable() + play_sound('timpani') + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('ph_boss_disabled')}) + end + if self.ability.name == 'Chaos the Clown' then + G.GAME.current_round.free_rerolls = G.GAME.current_round.free_rerolls + 1 + calculate_reroll_cost(true) + end + if self.ability.name == 'Turtle Bean' then + G.hand:change_size(self.ability.extra.h_size) + end + if self.ability.name == 'Oops! All 6s' then + for k, v in pairs(G.GAME.probabilities) do + G.GAME.probabilities[k] = v*2 + end + end + if self.ability.name == 'To the Moon' then + G.GAME.interest_amount = G.GAME.interest_amount + self.ability.extra + end + if self.ability.name == 'Astronomer' then + G.E_MANAGER:add_event(Event({func = function() + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + if self.ability.name == 'Troubadour' then + G.hand:change_size(self.ability.extra.h_size) + G.GAME.round_resets.hands = G.GAME.round_resets.hands + self.ability.extra.h_plays + end + if self.ability.name == 'Stuntman' then + G.hand:change_size(-self.ability.extra.h_size) + end + if self.edition and self.edition.negative and not from_debuff then + if self.ability.consumeable then + G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1 + else + G.jokers.config.card_limit = G.jokers.config.card_limit + 1 + end + end + if G.GAME.blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end + end +end + +function Card:remove_from_deck(from_debuff) + if self.added_to_deck then + self.added_to_deck = false + if self.ability.h_size ~= 0 then + G.hand:change_size(-self.ability.h_size) + end + if self.ability.d_size > 0 then + G.GAME.round_resets.discards = G.GAME.round_resets.discards - self.ability.d_size + ease_discard(-self.ability.d_size) + end + if self.ability.name == 'Credit Card' then + G.GAME.bankrupt_at = G.GAME.bankrupt_at + self.ability.extra + end + if self.ability.name == 'Chaos the Clown' then + G.GAME.current_round.free_rerolls = G.GAME.current_round.free_rerolls - 1 + calculate_reroll_cost(true) + end + if self.ability.name == 'Turtle Bean' then + G.hand:change_size(-self.ability.extra.h_size) + end + if self.ability.name == 'Oops! All 6s' then + for k, v in pairs(G.GAME.probabilities) do + G.GAME.probabilities[k] = v/2 + end + end + if self.ability.name == 'To the Moon' then + G.GAME.interest_amount = G.GAME.interest_amount - self.ability.extra + end + if self.ability.name == 'Astronomer' then + G.E_MANAGER:add_event(Event({func = function() + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + if self.ability.name == 'Troubadour' then + G.hand:change_size(-self.ability.extra.h_size) + G.GAME.round_resets.hands = G.GAME.round_resets.hands - self.ability.extra.h_plays + end + if self.ability.name == 'Stuntman' then + G.hand:change_size(self.ability.extra.h_size) + end + if self.edition and self.edition.negative and not from_debuff and G.jokers then + if self.ability.consumeable then + G.consumeables.config.card_limit = G.consumeables.config.card_limit - 1 + else + G.jokers.config.card_limit = G.jokers.config.card_limit - 1 + end + end + if G.GAME.blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end + end +end + +function Card:generate_UIBox_unlock_table(hidden) + local loc_vars = {no_name = true, not_hidden = not hidden} + + return generate_card_ui(self.config.center, nil, loc_vars, 'Locked') +end + +function Card:generate_UIBox_ability_table() + local card_type, hide_desc = self.ability.set or "None", nil + local loc_vars = nil + local main_start, main_end = nil,nil + local no_badge = nil + + if not self.bypass_lock and self.config.center.unlocked ~= false and + (self.ability.set == 'Joker' or self.ability.set == 'Edition' or self.ability.consumeable or self.ability.set == 'Voucher' or self.ability.set == 'Booster') and + not self.config.center.discovered and + ((self.area ~= G.jokers and self.area ~= G.consumeables and self.area) or not self.area) then + card_type = 'Undiscovered' + end + if self.config.center.unlocked == false and not self.bypass_lock then --For everyting that is locked + card_type = "Locked" + if self.area and self.area == G.shop_demo then loc_vars = {}; no_badge = true end + elseif card_type == 'Undiscovered' and not self.bypass_discovery_ui then -- Any Joker or tarot/planet/voucher that is not yet discovered + hide_desc = true + elseif self.debuff then + loc_vars = { debuffed = true, playing_card = not not self.base.colour, value = self.base.value, suit = self.base.suit, colour = self.base.colour } + elseif card_type == 'Default' or card_type == 'Enhanced' then + loc_vars = { playing_card = not not self.base.colour, value = self.base.value, suit = self.base.suit, colour = self.base.colour, + nominal_chips = self.base.nominal > 0 and self.base.nominal or nil, + bonus_chips = (self.ability.bonus + (self.ability.perma_bonus or 0)) > 0 and (self.ability.bonus + (self.ability.perma_bonus or 0)) or nil, + } + elseif self.ability.set == 'Joker' then -- all remaining jokers + if self.ability.name == 'Joker' then loc_vars = {self.ability.mult} + elseif self.ability.name == 'Jolly Joker' or self.ability.name == 'Zany Joker' or + self.ability.name == 'Mad Joker' or self.ability.name == 'Crazy Joker' or + self.ability.name == 'Droll Joker' then + loc_vars = {self.ability.t_mult, localize(self.ability.type, 'poker_hands')} + elseif self.ability.name == 'Sly Joker' or self.ability.name == 'Wily Joker' or + self.ability.name == 'Clever Joker' or self.ability.name == 'Devious Joker' or + self.ability.name == 'Crafty Joker' then + loc_vars = {self.ability.t_chips, localize(self.ability.type, 'poker_hands')} + elseif self.ability.name == 'Half Joker' then loc_vars = {self.ability.extra.mult, self.ability.extra.size} + elseif self.ability.name == 'Fortune Teller' then loc_vars = {self.ability.extra, (G.GAME.consumeable_usage_total and G.GAME.consumeable_usage_total.tarot or 0)} + elseif self.ability.name == 'Steel Joker' then loc_vars = {self.ability.extra, 1 + self.ability.extra*(self.ability.steel_tally or 0)} + elseif self.ability.name == 'Chaos the Clown' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Space Joker' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra} + elseif self.ability.name == 'Stone Joker' then loc_vars = {self.ability.extra, self.ability.extra*(self.ability.stone_tally or 0)} + elseif self.ability.name == 'Drunkard' then loc_vars = {self.ability.d_size} + elseif self.ability.name == 'Green Joker' then loc_vars = {self.ability.extra.hand_add, self.ability.extra.discard_sub, self.ability.mult} + elseif self.ability.name == 'Credit Card' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Greedy Joker' or self.ability.name == 'Lusty Joker' or + self.ability.name == 'Wrathful Joker' or self.ability.name == 'Gluttonous Joker' then loc_vars = {self.ability.extra.s_mult, localize(self.ability.extra.suit, 'suits_singular')} + elseif self.ability.name == 'Blue Joker' then loc_vars = {self.ability.extra, self.ability.extra*((G.deck and G.deck.cards) and #G.deck.cards or 52)} + elseif self.ability.name == 'Sixth Sense' then loc_vars = {} + elseif self.ability.name == 'Mime' then + elseif self.ability.name == 'Hack' then loc_vars = {self.ability.extra+1} + elseif self.ability.name == 'Pareidolia' then + elseif self.ability.name == 'Faceless Joker' then loc_vars = {self.ability.extra.dollars, self.ability.extra.faces} + elseif self.ability.name == 'Oops! All 6s' then + elseif self.ability.name == 'Juggler' then loc_vars = {self.ability.h_size} + elseif self.ability.name == 'Golden Joker' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Joker Stencil' then loc_vars = {self.ability.x_mult} + elseif self.ability.name == 'Four Fingers' then + elseif self.ability.name == 'Ceremonial Dagger' then loc_vars = {self.ability.mult} + elseif self.ability.name == 'Banner' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Misprint' then + local r_mults = {} + for i = self.ability.extra.min, self.ability.extra.max do + r_mults[#r_mults+1] = tostring(i) + end + local loc_mult = ' '..(localize('k_mult'))..' ' + main_start = { + {n=G.UIT.T, config={text = ' +',colour = G.C.MULT, scale = 0.32}}, + {n=G.UIT.O, config={object = DynaText({string = r_mults, colours = {G.C.RED},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.5, scale = 0.32, min_cycle_time = 0})}}, + {n=G.UIT.O, config={object = DynaText({string = { + {string = 'rand()', colour = G.C.JOKER_GREY},{string = "#@"..(G.deck and G.deck.cards[1] and G.deck.cards[#G.deck.cards].base.id or 11)..(G.deck and G.deck.cards[1] and G.deck.cards[#G.deck.cards].base.suit:sub(1,1) or 'D'), colour = G.C.RED}, + loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult, loc_mult}, + colours = {G.C.UI.TEXT_DARK},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.2011, scale = 0.32, min_cycle_time = 0})}}, + } + elseif self.ability.name == 'Mystic Summit' then loc_vars = {self.ability.extra.mult, self.ability.extra.d_remaining} + elseif self.ability.name == 'Marble Joker' then + elseif self.ability.name == 'Loyalty Card' then loc_vars = {self.ability.extra.Xmult, self.ability.extra.every + 1, localize{type = 'variable', key = (self.ability.loyalty_remaining == 0 and 'loyalty_active' or 'loyalty_inactive'), vars = {self.ability.loyalty_remaining}}} + elseif self.ability.name == '8 Ball' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Dusk' then loc_vars = {self.ability.extra+1} + elseif self.ability.name == 'Raised Fist' then + elseif self.ability.name == 'Fibonacci' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Scary Face' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Abstract Joker' then loc_vars = {self.ability.extra, (G.jokers and G.jokers.cards and #G.jokers.cards or 0)*self.ability.extra} + elseif self.ability.name == 'Delayed Gratification' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Gros Michel' then loc_vars = {self.ability.extra.mult, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds} + elseif self.ability.name == 'Even Steven' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Odd Todd' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Scholar' then loc_vars = {self.ability.extra.mult, self.ability.extra.chips} + elseif self.ability.name == 'Business Card' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra} + elseif self.ability.name == 'Supernova' then + elseif self.ability.name == 'Spare Trousers' then loc_vars = {self.ability.extra, localize('Two Pair', 'poker_hands'), self.ability.mult} + elseif self.ability.name == 'Superposition' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Ride the Bus' then loc_vars = {self.ability.extra, self.ability.mult} + elseif self.ability.name == 'Egg' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Burglar' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Blackboard' then loc_vars = {self.ability.extra, localize('Spades', 'suits_plural'), localize('Clubs', 'suits_plural')} + elseif self.ability.name == 'Runner' then loc_vars = {self.ability.extra.chips, self.ability.extra.chip_mod} + elseif self.ability.name == 'Ice Cream' then loc_vars = {self.ability.extra.chips, self.ability.extra.chip_mod} + elseif self.ability.name == 'DNA' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Splash' then + elseif self.ability.name == 'Constellation' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Hiker' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'To Do List' then loc_vars = {self.ability.extra.dollars, localize(self.ability.to_do_poker_hand, 'poker_hands')} + elseif self.ability.name == 'Smeared Joker' then + elseif self.ability.name == 'Blueprint' then + self.ability.blueprint_compat_ui = self.ability.blueprint_compat_ui or ''; self.ability.blueprint_compat_check = nil + main_end = (self.area and self.area == G.jokers) and { + {n=G.UIT.C, config={align = "bm", minh = 0.4}, nodes={ + {n=G.UIT.C, config={ref_table = self, align = "m", colour = G.C.JOKER_GREY, r = 0.05, padding = 0.06, func = 'blueprint_compat'}, nodes={ + {n=G.UIT.T, config={ref_table = self.ability, ref_value = 'blueprint_compat_ui',colour = G.C.UI.TEXT_LIGHT, scale = 0.32*0.8}}, + }} + }} + } or nil + elseif self.ability.name == 'Cartomancer' then + elseif self.ability.name == 'Astronomer' then loc_vars = {self.ability.extra} + + elseif self.ability.name == 'Golden Ticket' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Mr. Bones' then + elseif self.ability.name == 'Acrobat' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Sock and Buskin' then loc_vars = {self.ability.extra+1} + elseif self.ability.name == 'Swashbuckler' then loc_vars = {self.ability.mult} + elseif self.ability.name == 'Troubadour' then loc_vars = {self.ability.extra.h_size, -self.ability.extra.h_plays} + elseif self.ability.name == 'Certificate' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Throwback' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Hanging Chad' then loc_vars = {self.ability.extra+1} + elseif self.ability.name == 'Rough Gem' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Bloodstone' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds, self.ability.extra.Xmult} + elseif self.ability.name == 'Arrowhead' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Onyx Agate' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Glass Joker' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Showman' then + elseif self.ability.name == 'Flower Pot' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Wee Joker' then loc_vars = {self.ability.extra.chips, self.ability.extra.chip_mod} + elseif self.ability.name == 'Merry Andy' then loc_vars = {self.ability.d_size, self.ability.h_size} + elseif self.ability.name == 'The Idol' then loc_vars = {self.ability.extra, localize(G.GAME.current_round.idol_card.rank, 'ranks'), localize(G.GAME.current_round.idol_card.suit, 'suits_plural'), colours = {G.C.SUITS[G.GAME.current_round.idol_card.suit]}} + elseif self.ability.name == 'Seeing Double' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Matador' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Hit the Road' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'The Duo' or self.ability.name == 'The Trio' + or self.ability.name == 'The Family' or self.ability.name == 'The Order' or self.ability.name == 'The Tribe' then loc_vars = {self.ability.x_mult, localize(self.ability.type, 'poker_hands')} + + elseif self.ability.name == 'Cavendish' then loc_vars = {self.ability.extra.Xmult, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds} + elseif self.ability.name == 'Card Sharp' then loc_vars = {self.ability.extra.Xmult} + elseif self.ability.name == 'Red Card' then loc_vars = {self.ability.extra, self.ability.mult} + elseif self.ability.name == 'Madness' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Square Joker' then loc_vars = {self.ability.extra.chips, self.ability.extra.chip_mod} + elseif self.ability.name == 'Seance' then loc_vars = {localize(self.ability.extra.poker_hand, 'poker_hands')} + elseif self.ability.name == 'Riff-raff' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Vampire' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Shortcut' then + elseif self.ability.name == 'Hologram' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Vagabond' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Baron' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Cloud 9' then loc_vars = {self.ability.extra, self.ability.extra*(self.ability.nine_tally or 0)} + elseif self.ability.name == 'Rocket' then loc_vars = {self.ability.extra.dollars, self.ability.extra.increase} + elseif self.ability.name == 'Obelisk' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Midas Mask' then + elseif self.ability.name == 'Luchador' then + local has_message= (G.GAME and self.area and (self.area == G.jokers)) + if has_message then + local disableable = G.GAME.blind and ((not G.GAME.blind.disabled) and (G.GAME.blind:get_type() == 'Boss')) + main_end = { + {n=G.UIT.C, config={align = "bm", minh = 0.4}, nodes={ + {n=G.UIT.C, config={ref_table = self, align = "m", colour = disableable and G.C.GREEN or G.C.RED, r = 0.05, padding = 0.06}, nodes={ + {n=G.UIT.T, config={text = ' '..localize(disableable and 'k_active' or 'ph_no_boss_active')..' ',colour = G.C.UI.TEXT_LIGHT, scale = 0.32*0.9}}, + }} + }} + } + end + elseif self.ability.name == 'Photograph' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Gift Card' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Turtle Bean' then loc_vars = {self.ability.extra.h_size, self.ability.extra.h_mod} + elseif self.ability.name == 'Erosion' then loc_vars = {self.ability.extra, math.max(0,self.ability.extra*(G.playing_cards and (G.GAME.starting_deck_size - #G.playing_cards) or 0)), G.GAME.starting_deck_size} + elseif self.ability.name == 'Reserved Parking' then loc_vars = {self.ability.extra.dollars, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds} + elseif self.ability.name == 'Mail-In Rebate' then loc_vars = {self.ability.extra, localize(G.GAME.current_round.mail_card.rank, 'ranks')} + elseif self.ability.name == 'To the Moon' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Hallucination' then loc_vars = {G.GAME.probabilities.normal, self.ability.extra} + elseif self.ability.name == 'Lucky Cat' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Baseball Card' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Bull' then loc_vars = {self.ability.extra, self.ability.extra*math.max(0,G.GAME.dollars) or 0} + elseif self.ability.name == 'Diet Cola' then loc_vars = {localize{type = 'name_text', set = 'Tag', key = 'tag_double', nodes = {}}} + elseif self.ability.name == 'Trading Card' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Flash Card' then loc_vars = {self.ability.extra, self.ability.mult} + elseif self.ability.name == 'Popcorn' then loc_vars = {self.ability.mult, self.ability.extra} + elseif self.ability.name == 'Ramen' then loc_vars = {self.ability.x_mult, self.ability.extra} + elseif self.ability.name == 'Ancient Joker' then loc_vars = {self.ability.extra, localize(G.GAME.current_round.ancient_card.suit, 'suits_singular'), colours = {G.C.SUITS[G.GAME.current_round.ancient_card.suit]}} + elseif self.ability.name == 'Walkie Talkie' then loc_vars = {self.ability.extra.chips, self.ability.extra.mult} + elseif self.ability.name == 'Seltzer' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Castle' then loc_vars = {self.ability.extra.chip_mod, localize(G.GAME.current_round.castle_card.suit, 'suits_singular'), self.ability.extra.chips, colours = {G.C.SUITS[G.GAME.current_round.castle_card.suit]}} + elseif self.ability.name == 'Smiley Face' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Campfire' then loc_vars = {self.ability.extra, self.ability.x_mult} + elseif self.ability.name == 'Stuntman' then loc_vars = {self.ability.extra.chip_mod, self.ability.extra.h_size} + elseif self.ability.name == 'Invisible Joker' then loc_vars = {self.ability.extra, self.ability.invis_rounds} + elseif self.ability.name == 'Brainstorm' then + self.ability.blueprint_compat_ui = self.ability.blueprint_compat_ui or ''; self.ability.blueprint_compat_check = nil + main_end = (self.area and self.area == G.jokers) and { + {n=G.UIT.C, config={align = "bm", minh = 0.4}, nodes={ + {n=G.UIT.C, config={ref_table = self, align = "m", colour = G.C.JOKER_GREY, r = 0.05, padding = 0.06, func = 'blueprint_compat'}, nodes={ + {n=G.UIT.T, config={ref_table = self.ability, ref_value = 'blueprint_compat_ui',colour = G.C.UI.TEXT_LIGHT, scale = 0.32*0.8}}, + }} + }} + } or nil + elseif self.ability.name == 'Satellite' then + local planets_used = 0 + for k, v in pairs(G.GAME.consumeable_usage) do if v.set == 'Planet' then planets_used = planets_used + 1 end end + loc_vars = {self.ability.extra, planets_used*self.ability.extra} + elseif self.ability.name == 'Shoot the Moon' then loc_vars = {self.ability.extra} + elseif self.ability.name == "Driver's License" then loc_vars = {self.ability.extra, self.ability.driver_tally or '0'} + elseif self.ability.name == 'Burnt Joker' then + elseif self.ability.name == 'Bootstraps' then loc_vars = {self.ability.extra.mult, self.ability.extra.dollars} + elseif self.ability.name == 'Caino' then loc_vars = {self.ability.extra, self.ability.caino_xmult} + elseif self.ability.name == 'Triboulet' then loc_vars = {self.ability.extra} + elseif self.ability.name == 'Yorick' then loc_vars = {self.ability.extra.xmult, self.ability.extra.discards, self.ability.yorick_discards} + elseif self.ability.name == 'Chicot' then + elseif self.ability.name == 'Perkeo' then loc_vars = {self.ability.extra} + end + end + local badges = {} + if (card_type ~= 'Locked' and card_type ~= 'Undiscovered' and card_type ~= 'Default') or self.debuff then + badges.card_type = card_type + end + if self.ability.set == 'Joker' and self.bypass_discovery_ui and (not no_badge) then + badges.force_rarity = true + end + if self.edition then + if self.edition.type == 'negative' and self.ability.consumeable then + badges[#badges + 1] = 'negative_consumable' + else + badges[#badges + 1] = (self.edition.type == 'holo' and 'holographic' or self.edition.type) + end + end + if self.seal then badges[#badges + 1] = string.lower(self.seal)..'_seal' end + if self.ability.eternal then badges[#badges + 1] = 'eternal' end + if self.pinned then badges[#badges + 1] = 'pinned_left' end + + if self.sticker then loc_vars = loc_vars or {}; loc_vars.sticker=self.sticker end + + return generate_card_ui(self.config.center, nil, loc_vars, card_type, badges, hide_desc, main_start, main_end) +end + +function Card:get_nominal(mod) + local mult = 1 + if mod == 'suit' then mult = 1000 end + if self.ability.effect == 'Stone Card' then mult = -1000 end + return self.base.nominal + self.base.suit_nominal*mult + (self.base.suit_nominal_original or 0)*0.0001*mult + self.base.face_nominal + 0.000001*self.unique_val +end + +function Card:get_id() + if self.ability.effect == 'Stone Card' and not self.vampired then + return -math.random(100, 1000000) + end + return self.base.id +end + +function Card:is_face(from_boss) + if self.debuff and not from_boss then return end + local id = self:get_id() + if id == 11 or id == 12 or id == 13 or next(find_joker("Pareidolia")) then + return true + end +end + +function Card:get_original_rank() + return self.base.original_value +end + +function Card:get_chip_bonus() + if self.debuff then return 0 end + if self.ability.effect == 'Stone Card' then + return self.ability.bonus + (self.ability.perma_bonus or 0) + end + return self.base.nominal + self.ability.bonus + (self.ability.perma_bonus or 0) +end + +function Card:get_chip_mult() + if self.debuff then return 0 end + if self.ability.set == 'Joker' then return 0 end + if self.ability.effect == "Lucky Card" then + if pseudorandom('lucky_mult') < G.GAME.probabilities.normal/5 then + self.lucky_trigger = true + return self.ability.mult + else + return 0 + end + else + return self.ability.mult + end +end + +function Card:get_chip_x_mult(context) + if self.debuff then return 0 end + if self.ability.set == 'Joker' then return 0 end + if self.ability.x_mult <= 1 then return 0 end + return self.ability.x_mult +end + +function Card:get_chip_h_mult() + if self.debuff then return 0 end + return self.ability.h_mult +end + +function Card:get_chip_h_x_mult() + if self.debuff then return 0 end + return self.ability.h_x_mult +end + +function Card:get_edition() + if self.debuff then return end + if self.edition then + local ret = {card = self} + if self.edition.x_mult then + ret.x_mult_mod = self.edition.x_mult + end + if self.edition.mult then + ret.mult_mod = self.edition.mult + end + if self.edition.chips then + ret.chip_mod = self.edition.chips + end + return ret + end +end + +function Card:get_end_of_round_effect(context) + if self.debuff then return {} end + local ret = {} + if self.ability.h_dollars > 0 then + ret.h_dollars = self.ability.h_dollars + ret.card = self + end + if self.seal == 'Blue' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + local card_type = 'Planet' + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card(card_type,G.consumeables, nil, nil, nil, nil, nil, 'blusl') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_planet'), colour = G.C.SECONDARY_SET.Planet}) + ret.effect = true + end + return ret +end + + +function Card:get_p_dollars() + if self.debuff then return 0 end + local ret = 0 + if self.seal == 'Gold' then + ret = ret + 3 + end + if self.ability.p_dollars > 0 then + if self.ability.effect == "Lucky Card" then + if pseudorandom('lucky_money') < G.GAME.probabilities.normal/15 then + self.lucky_trigger = true + ret = ret + self.ability.p_dollars + end + else + ret = ret + self.ability.p_dollars + end + end + if ret > 0 then + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + ret + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + end + return ret +end + +function Card:use_consumeable(area, copier) + stop_use() + if not copier then set_consumeable_usage(self) end + if self.debuff then return nil end + local used_tarot = copier or self + + if self.ability.consumeable.max_highlighted then + update_hand_text({immediate = true, nopulse = true, delay = 0}, {mult = 0, chips = 0, level = '', handname = ''}) + end + + if self.ability.consumeable.mod_conv or self.ability.consumeable.suit_conv then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + for i=1, #G.hand.highlighted do + local percent = 1.15 - (i-0.999)/(#G.hand.highlighted-0.998)*0.3 + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.15,func = function() G.hand.highlighted[i]:flip();play_sound('card1', percent);G.hand.highlighted[i]:juice_up(0.3, 0.3);return true end })) + end + delay(0.2) + if self.ability.name == 'Death' then + local rightmost = G.hand.highlighted[1] + for i=1, #G.hand.highlighted do if G.hand.highlighted[i].T.x > rightmost.T.x then rightmost = G.hand.highlighted[i] end end + for i=1, #G.hand.highlighted do + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() + if G.hand.highlighted[i] ~= rightmost then + copy_card(rightmost, G.hand.highlighted[i]) + end + return true end })) + end + elseif self.ability.name == 'Strength' then + for i=1, #G.hand.highlighted do + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() + local card = G.hand.highlighted[i] + local suit_prefix = string.sub(card.base.suit, 1, 1)..'_' + local rank_suffix = card.base.id == 14 and 2 or math.min(card.base.id+1, 14) + if rank_suffix < 10 then rank_suffix = tostring(rank_suffix) + elseif rank_suffix == 10 then rank_suffix = 'T' + elseif rank_suffix == 11 then rank_suffix = 'J' + elseif rank_suffix == 12 then rank_suffix = 'Q' + elseif rank_suffix == 13 then rank_suffix = 'K' + elseif rank_suffix == 14 then rank_suffix = 'A' + end + card:set_base(G.P_CARDS[suit_prefix..rank_suffix]) + return true end })) + end + elseif self.ability.consumeable.suit_conv then + for i=1, #G.hand.highlighted do + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() G.hand.highlighted[i]:change_suit(self.ability.consumeable.suit_conv);return true end })) + end + else + for i=1, #G.hand.highlighted do + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() G.hand.highlighted[i]:set_ability(G.P_CENTERS[self.ability.consumeable.mod_conv]);return true end })) + end + end + for i=1, #G.hand.highlighted do + local percent = 0.85 + (i-0.999)/(#G.hand.highlighted-0.998)*0.3 + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.15,func = function() G.hand.highlighted[i]:flip();play_sound('tarot2', percent, 0.6);G.hand.highlighted[i]:juice_up(0.3, 0.3);return true end })) + end + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2,func = function() G.hand:unhighlight_all(); return true end })) + delay(0.5) + end + if self.ability.name == 'Black Hole' then + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.8, delay = 0.3}, {handname=localize('k_all_hands'),chips = '...', mult = '...', level=''}) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function() + play_sound('tarot1') + self:juice_up(0.8, 0.5) + G.TAROT_INTERRUPT_PULSE = true + return true end })) + update_hand_text({delay = 0}, {mult = '+', StatusText = true}) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.9, func = function() + play_sound('tarot1') + self:juice_up(0.8, 0.5) + return true end })) + update_hand_text({delay = 0}, {chips = '+', StatusText = true}) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.9, func = function() + play_sound('tarot1') + self:juice_up(0.8, 0.5) + G.TAROT_INTERRUPT_PULSE = nil + return true end })) + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.9, delay = 0}, {level='+1'}) + delay(1.3) + for k, v in pairs(G.GAME.hands) do + level_up_hand(self, k, true) + end + update_hand_text({sound = 'button', volume = 0.7, pitch = 1.1, delay = 0}, {mult = 0, chips = 0, handname = '', level = ''}) + end + if self.ability.name == 'Talisman' or self.ability.name == 'Deja Vu' or self.ability.name == 'Trance' or self.ability.name == 'Medium' then + local conv_card = G.hand.highlighted[1] + G.E_MANAGER:add_event(Event({func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function() + conv_card:set_seal(self.ability.extra, nil, true) + return true end })) + delay(0.5) + end + if self.ability.name == 'Aura' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + local over = false + local edition = poll_edition('aura', nil, true, true) + local aura_card = G.hand.highlighted[1] + aura_card:set_edition(edition, true) + used_tarot:juice_up(0.3, 0.5) + return true end })) + end + if self.ability.name == 'Cryptid' then + G.E_MANAGER:add_event(Event({ + func = function() + local _first_dissolve = nil + local new_cards = {} + for i = 1, self.ability.extra do + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local _card = copy_card(G.hand.highlighted[1], nil, nil, G.playing_card) + _card:add_to_deck() + G.deck.config.card_limit = G.deck.config.card_limit + 1 + table.insert(G.playing_cards, _card) + G.hand:emplace(_card) + _card:start_materialize(nil, _first_dissolve) + _first_dissolve = true + new_cards[#new_cards+1] = _card + end + playing_card_joker_effects(new_cards) + return true + end + })) + end + if self.ability.name == 'Sigil' or self.ability.name == 'Ouija' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + for i=1, #G.hand.cards do + local percent = 1.15 - (i-0.999)/(#G.hand.cards-0.998)*0.3 + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.15,func = function() G.hand.cards[i]:flip();play_sound('card1', percent);G.hand.cards[i]:juice_up(0.3, 0.3);return true end })) + end + delay(0.2) + if self.ability.name == 'Sigil' then + local _suit = pseudorandom_element({'S','H','D','C'}, pseudoseed('sigil')) + for i=1, #G.hand.cards do + G.E_MANAGER:add_event(Event({func = function() + local card = G.hand.cards[i] + local suit_prefix = _suit..'_' + local rank_suffix = card.base.id < 10 and tostring(card.base.id) or + card.base.id == 10 and 'T' or card.base.id == 11 and 'J' or + card.base.id == 12 and 'Q' or card.base.id == 13 and 'K' or + card.base.id == 14 and 'A' + card:set_base(G.P_CARDS[suit_prefix..rank_suffix]) + return true end })) + end + end + if self.ability.name == 'Ouija' then + local _rank = pseudorandom_element({'2','3','4','5','6','7','8','9','T','J','Q','K','A'}, pseudoseed('ouija')) + for i=1, #G.hand.cards do + G.E_MANAGER:add_event(Event({func = function() + local card = G.hand.cards[i] + local suit_prefix = string.sub(card.base.suit, 1, 1)..'_' + local rank_suffix =_rank + card:set_base(G.P_CARDS[suit_prefix..rank_suffix]) + return true end })) + end + G.hand:change_size(-1) + end + for i=1, #G.hand.cards do + local percent = 0.85 + (i-0.999)/(#G.hand.cards-0.998)*0.3 + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.15,func = function() G.hand.cards[i]:flip();play_sound('tarot2', percent, 0.6);G.hand.cards[i]:juice_up(0.3, 0.3);return true end })) + end + delay(0.5) + end + if self.ability.consumeable.hand_type then + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.8, delay = 0.3}, {handname=localize(self.ability.consumeable.hand_type, 'poker_hands'),chips = G.GAME.hands[self.ability.consumeable.hand_type].chips, mult = G.GAME.hands[self.ability.consumeable.hand_type].mult, level=G.GAME.hands[self.ability.consumeable.hand_type].level}) + level_up_hand(used_tarot, self.ability.consumeable.hand_type) + update_hand_text({sound = 'button', volume = 0.7, pitch = 1.1, delay = 0}, {mult = 0, chips = 0, handname = '', level = ''}) + end + if self.ability.consumeable.remove_card then + local destroyed_cards = {} + if self.ability.name == 'The Hanged Man' then + for i=#G.hand.highlighted, 1, -1 do + destroyed_cards[#destroyed_cards+1] = G.hand.highlighted[i] + end + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.2, + func = function() + for i=#G.hand.highlighted, 1, -1 do + local card = G.hand.highlighted[i] + if card.ability.name == 'Glass Card' then + card:shatter() + else + card:start_dissolve(nil, i == #G.hand.highlighted) + end + end + return true end })) + elseif self.ability.name == 'Familiar' or self.ability.name == 'Grim' or self.ability.name == 'Incantation' then + destroyed_cards[#destroyed_cards+1] = pseudorandom_element(G.hand.cards, pseudoseed('random_destroy')) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + for i=#destroyed_cards, 1, -1 do + local card = destroyed_cards[i] + if card.ability.name == 'Glass Card' then + card:shatter() + else + card:start_dissolve(nil, i ~= #destroyed_cards) + end + end + return true end })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.7, + func = function() + local cards = {} + for i=1, self.ability.extra do + cards[i] = true + local _suit, _rank = nil, nil + if self.ability.name == 'Familiar' then + _rank = pseudorandom_element({'J', 'Q', 'K'}, pseudoseed('familiar_create')) + _suit = pseudorandom_element({'S','H','D','C'}, pseudoseed('familiar_create')) + elseif self.ability.name == 'Grim' then + _rank = 'A' + _suit = pseudorandom_element({'S','H','D','C'}, pseudoseed('grim_create')) + elseif self.ability.name == 'Incantation' then + _rank = pseudorandom_element({'2', '3', '4', '5', '6', '7', '8', '9', 'T'}, pseudoseed('incantation_create')) + _suit = pseudorandom_element({'S','H','D','C'}, pseudoseed('incantation_create')) + end + _suit = _suit or 'S'; _rank = _rank or 'A' + local cen_pool = {} + for k, v in pairs(G.P_CENTER_POOLS["Enhanced"]) do + if v.key ~= 'm_stone' then + cen_pool[#cen_pool+1] = v + end + end + create_playing_card({front = G.P_CARDS[_suit..'_'.._rank], center = pseudorandom_element(cen_pool, pseudoseed('spe_card'))}, G.hand, nil, i ~= 1, {G.C.SECONDARY_SET.Spectral}) + end + playing_card_joker_effects(cards) + return true end })) + elseif self.ability.name == 'Immolate' then + local temp_hand = {} + for k, v in ipairs(G.hand.cards) do temp_hand[#temp_hand+1] = v end + table.sort(temp_hand, function (a, b) return not a.playing_card or not b.playing_card or a.playing_card < b.playing_card end) + pseudoshuffle(temp_hand, pseudoseed('immolate')) + + for i = 1, self.ability.extra.destroy do destroyed_cards[#destroyed_cards+1] = temp_hand[i] end + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('tarot1') + used_tarot:juice_up(0.3, 0.5) + return true end })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + for i=#destroyed_cards, 1, -1 do + local card = destroyed_cards[i] + if card.ability.name == 'Glass Card' then + card:shatter() + else + card:start_dissolve(nil, i == #destroyed_cards) + end + end + return true end })) + delay(0.5) + ease_dollars(self.ability.extra.dollars) + end + delay(0.3) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({remove_playing_cards = true, removed = destroyed_cards}) + end + end + if self.ability.name == 'The Fool' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + if G.consumeables.config.card_limit > #G.consumeables.cards then + play_sound('timpani') + local card = create_card('Tarot_Planet', G.consumeables, nil, nil, nil, nil, G.GAME.last_tarot_planet, 'fool') + card:add_to_deck() + G.consumeables:emplace(card) + used_tarot:juice_up(0.3, 0.5) + end + return true end })) + delay(0.6) + end + if self.ability.name == 'The Hermit' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('timpani') + used_tarot:juice_up(0.3, 0.5) + ease_dollars(math.max(0,math.min(G.GAME.dollars, self.ability.extra)), true) + return true end })) + delay(0.6) + end + if self.ability.name == 'Temperance' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('timpani') + used_tarot:juice_up(0.3, 0.5) + ease_dollars(self.ability.money, true) + return true end })) + delay(0.6) + end + if self.ability.name == 'The Emperor' or self.ability.name == 'The High Priestess' then + for i = 1, math.min((self.ability.consumeable.tarots or self.ability.consumeable.planets), G.consumeables.config.card_limit - #G.consumeables.cards) do + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + if G.consumeables.config.card_limit > #G.consumeables.cards then + play_sound('timpani') + local card = create_card((self.ability.name == 'The Emperor' and 'Tarot') or (self.ability.name == 'The High Priestess' and 'Planet'), G.consumeables, nil, nil, nil, nil, nil, (self.ability.name == 'The Emperor' and 'emp') or (self.ability.name == 'The High Priestess' and 'pri')) + card:add_to_deck() + G.consumeables:emplace(card) + used_tarot:juice_up(0.3, 0.5) + end + return true end })) + end + delay(0.6) + end + if self.ability.name == 'Judgement' or self.ability.name == 'The Soul' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('timpani') + local card = create_card('Joker', G.jokers, self.ability.name == 'The Soul', nil, nil, nil, nil, self.ability.name == 'Judgement' and 'jud' or 'sou') + card:add_to_deck() + G.jokers:emplace(card) + if self.ability.name == 'The Soul' then check_for_unlock{type = 'spawn_legendary'} end + used_tarot:juice_up(0.3, 0.5) + return true end })) + delay(0.6) + end + if self.ability.name == 'Ankh' then + --Need to check for edgecases - if there are max Jokers and all are eternal OR there is a max of 1 joker this isn't possible already + --If there are max Jokers and exactly 1 is not eternal, that joker cannot be the one selected + --otherwise, the selected joker can be totally random and all other non-eternal jokers can be removed + local deletable_jokers = {} + for k, v in pairs(G.jokers.cards) do + if not v.ability.eternal then deletable_jokers[#deletable_jokers + 1] = v end + end + local chosen_joker = pseudorandom_element(G.jokers.cards, pseudoseed('ankh_choice')) + local _first_dissolve = nil + G.E_MANAGER:add_event(Event({trigger = 'before', delay = 0.75, func = function() + for k, v in pairs(deletable_jokers) do + if v ~= chosen_joker then + v:start_dissolve(nil, _first_dissolve) + _first_dissolve = true + end + end + return true end })) + G.E_MANAGER:add_event(Event({trigger = 'before', delay = 0.4, func = function() + local card = copy_card(chosen_joker, nil, nil, nil, chosen_joker.edition and chosen_joker.edition.negative) + card:start_materialize() + card:add_to_deck() + if card.edition and card.edition.negative then + card:set_edition(nil, true) + end + G.jokers:emplace(card) + return true end })) + end + if self.ability.name == 'Wraith' then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + play_sound('timpani') + local card = create_card('Joker', G.jokers, nil, 0.99, nil, nil, nil, 'wra') + card:add_to_deck() + G.jokers:emplace(card) + used_tarot:juice_up(0.3, 0.5) + if G.GAME.dollars ~= 0 then + ease_dollars(-G.GAME.dollars, true) + end + return true end })) + delay(0.6) + end + if self.ability.name == 'The Wheel of Fortune' or self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' then + local temp_pool = (self.ability.name == 'The Wheel of Fortune' and self.eligible_strength_jokers) or + ((self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex') and self.eligible_editionless_jokers) or {} + if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' or pseudorandom('wheel_of_fortune') < G.GAME.probabilities.normal/self.ability.extra then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + local over = false + local eligible_card = pseudorandom_element(temp_pool, pseudoseed( + (self.ability.name == 'The Wheel of Fortune' and 'wheel_of_fortune') or + (self.ability.name == 'Ectoplasm' and 'ectoplasm') or + (self.ability.name == 'Hex' and 'hex') + )) + local edition = nil + if self.ability.name == 'Ectoplasm' then + edition = {negative = true} + elseif self.ability.name == 'Hex' then + edition = {polychrome = true} + elseif self.ability.name == 'The Wheel of Fortune' then + edition = poll_edition('wheel_of_fortune', nil, true, true) + end + eligible_card:set_edition(edition, true) + if self.ability.name == 'The Wheel of Fortune' or self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' then check_for_unlock({type = 'have_edition'}) end + if self.ability.name == 'Hex' then + local _first_dissolve = nil + for k, v in pairs(G.jokers.cards) do + if v ~= eligible_card and (not v.ability.eternal) then v:start_dissolve(nil, _first_dissolve);_first_dissolve = true end + end + end + if self.ability.name == 'Ectoplasm' then + G.GAME.ecto_minus = G.GAME.ecto_minus or 1 + G.hand:change_size(-G.GAME.ecto_minus) + G.GAME.ecto_minus = G.GAME.ecto_minus + 1 + end + used_tarot:juice_up(0.3, 0.5) + return true end })) + else + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + attention_text({ + text = localize('k_nope_ex'), + scale = 1.3, + hold = 1.4, + major = used_tarot, + backdrop_colour = G.C.SECONDARY_SET.Tarot, + align = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and 'tm' or 'cm', + offset = {x = 0, y = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and -0.2 or 0}, + silent = true + }) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) + used_tarot:juice_up(0.3, 0.5) + return true end })) + end + delay(0.6) + end +end + +function Card:can_use_consumeable(any_state, skip_check) + if not skip_check and ((G.play and #G.play.cards > 0) or + (G.CONTROLLER.locked) or + (G.GAME.STOP_USE and G.GAME.STOP_USE > 0)) + then return false end + if G.STATE ~= G.STATES.HAND_PLAYED and G.STATE ~= G.STATES.DRAW_TO_HAND and G.STATE ~= G.STATES.PLAY_TAROT or any_state then + + if self.ability.name == 'The Hermit' or self.ability.consumeable.hand_type or self.ability.name == 'Temperance' or self.ability.name == 'Black Hole' then + return true + end + if self.ability.name == 'The Wheel of Fortune' then + if next(self.eligible_strength_jokers) then return true end + end + if self.ability.name == 'Ankh' then + --if there is at least one joker + for k, v in pairs(G.jokers.cards) do + if v.ability.set == 'Joker' and G.jokers.config.card_limit > 1 then + return true + end + end + end + if self.ability.name == 'Aura' then + if G.hand and (#G.hand.highlighted == 1) and G.hand.highlighted[1] and (not G.hand.highlighted[1].edition) then return true end + end + if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' then + if next(self.eligible_editionless_jokers) then return true end + end + if self.ability.name == 'The Emperor' or self.ability.name == 'The High Priestess' then + if #G.consumeables.cards < G.consumeables.config.card_limit or self.area == G.consumeables then return true end + end + if self.ability.name == 'The Fool' then + if (#G.consumeables.cards < G.consumeables.config.card_limit or self.area == G.consumeables) + and G.GAME.last_tarot_planet and G.GAME.last_tarot_planet ~= 'c_fool' then return true end + end + if self.ability.name == 'Judgement' or self.ability.name == 'The Soul' or self.ability.name == 'Wraith' then + if #G.jokers.cards < G.jokers.config.card_limit or self.area == G.jokers then + return true + else + return false + end + end + if G.STATE == G.STATES.SELECTING_HAND or G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK then + if self.ability.consumeable.max_highlighted then + if self.ability.consumeable.mod_num >= #G.hand.highlighted and #G.hand.highlighted >= (self.ability.consumeable.min_highlighted or 1) then + return true + end + end + if (self.ability.name == 'Familiar' or self.ability.name == 'Grim' or + self.ability.name == 'Incantation' or self.ability.name == 'Immolate' or + self.ability.name == 'Sigil' or self.ability.name == 'Ouija') + and #G.hand.cards > 1 then + return true + end + end + end + return false +end + +function Card:check_use() + if self.ability.name == 'Ankh' then + if #G.jokers.cards >= G.jokers.config.card_limit then + alert_no_space(self, G.jokers) + return true + end + end +end + +function Card:sell_card() + G.CONTROLLER.locks.selling_card = true + stop_use() + local area = self.area + G.CONTROLLER:save_cardarea_focus(area == G.jokers and 'jokers' or 'consumeables') + + if self.children.use_button then self.children.use_button:remove(); self.children.use_button = nil end + if self.children.sell_button then self.children.sell_button:remove(); self.children.sell_button = nil end + + self:calculate_joker{selling_self = true} + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2,func = function() + play_sound('coin2') + self:juice_up(0.3, 0.4) + return true + end})) + delay(0.2) + G.E_MANAGER:add_event(Event({trigger = 'immediate',func = function() + ease_dollars(self.sell_cost) + self:start_dissolve({G.C.GOLD}) + delay(0.3) + + inc_career_stat('c_cards_sold', 1) + if self.ability.set == 'Joker' then + inc_career_stat('c_jokers_sold', 1) + end + if self.ability.set == 'Joker' and G.GAME.blind and G.GAME.blind.name == 'Verdant Leaf' then + G.E_MANAGER:add_event(Event({trigger = 'immediate',func = function() + G.GAME.blind:disable() + return true + end})) + end + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.3, blocking = false, + func = function() + G.E_MANAGER:add_event(Event({trigger = 'immediate', + func = function() + G.E_MANAGER:add_event(Event({trigger = 'immediate', + func = function() + G.CONTROLLER.locks.selling_card = nil + G.CONTROLLER:recall_cardarea_focus(area == G.jokers and 'jokers' or 'consumeables') + return true + end})) + return true + end})) + return true + end})) + return true + end})) +end + +function Card:can_sell_card(context) + if (G.play and #G.play.cards > 0) or + (G.CONTROLLER.locked) or + (G.GAME.STOP_USE and G.GAME.STOP_USE > 0) --or + --G.STATE == G.STATES.BLIND_SELECT + then return false end + if (G.SETTINGS.tutorial_complete or G.GAME.pseudorandom.seed ~= 'TUTORIAL' or G.GAME.round_resets.ante > 1) and + self.area and + self.area.config.type == 'joker' and + not self.ability.eternal then + return true + end + return false +end + +function Card:calculate_dollar_bonus() + if self.debuff then return end + if self.ability.set == "Joker" then + if self.ability.name == 'Golden Joker' then + return self.ability.extra + end + if self.ability.name == 'Cloud 9' and self.ability.nine_tally and self.ability.nine_tally > 0 then + return self.ability.extra*(self.ability.nine_tally) + end + if self.ability.name == 'Rocket' then + return self.ability.extra.dollars + end + if self.ability.name == 'Satellite' then + local planets_used = 0 + for k, v in pairs(G.GAME.consumeable_usage) do + if v.set == 'Planet' then planets_used = planets_used + 1 end + end + if planets_used == 0 then return end + return self.ability.extra*planets_used + end + if self.ability.name == 'Delayed Gratification' and G.GAME.current_round.discards_used == 0 and G.GAME.current_round.discards_left > 0 then + return G.GAME.current_round.discards_left*self.ability.extra + end + end +end + +function Card:open() + if self.ability.set == "Booster" then + stop_use() + G.STATE_COMPLETE = false + self.opening = true + + if not self.config.center.discovered then + discover_card(self.config.center) + end + self.states.hover.can = false + + if self.ability.name:find('Arcana') then + G.STATE = G.STATES.TAROT_PACK + G.GAME.pack_size = self.ability.extra + elseif self.ability.name:find('Celestial') then + G.STATE = G.STATES.PLANET_PACK + G.GAME.pack_size = self.ability.extra + elseif self.ability.name:find('Spectral') then + G.STATE = G.STATES.SPECTRAL_PACK + G.GAME.pack_size = self.ability.extra + elseif self.ability.name:find('Standard') then + G.STATE = G.STATES.STANDARD_PACK + G.GAME.pack_size = self.ability.extra + elseif self.ability.name:find('Buffoon') then + G.STATE = G.STATES.BUFFOON_PACK + G.GAME.pack_size = self.ability.extra + end + + G.GAME.pack_choices = self.config.center.config.choose or 1 + + if self.cost > 0 then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function() + inc_career_stat('c_shop_dollars_spent', self.cost) + self:juice_up() + return true end })) + ease_dollars(-self.cost) + else + delay(0.2) + end + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + self:explode() + local pack_cards = {} + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 1.3*math.sqrt(G.SETTINGS.GAMESPEED), blockable = false, blocking = false, func = function() + local _size = self.ability.extra + + for i = 1, _size do + local card = nil + if self.ability.name:find('Arcana') then + if G.GAME.used_vouchers.v_omen_globe and pseudorandom('omen_globe') > 0.8 then + card = create_card("Spectral", G.pack_cards, nil, nil, true, true, nil, 'ar2') + else + card = create_card("Tarot", G.pack_cards, nil, nil, true, true, nil, 'ar1') + end + elseif self.ability.name:find('Celestial') then + if G.GAME.used_vouchers.v_telescope and i == 1 then + local _planet, _hand, _tally = nil, nil, 0 + for k, v in ipairs(G.handlist) do + if G.GAME.hands[v].visible and G.GAME.hands[v].played > _tally then + _hand = v + _tally = G.GAME.hands[v].played + end + end + if _hand then + for k, v in pairs(G.P_CENTER_POOLS.Planet) do + if v.config.hand_type == _hand then + _planet = v.key + end + end + end + card = create_card("Planet", G.pack_cards, nil, nil, true, true, _planet, 'pl1') + else + card = create_card("Planet", G.pack_cards, nil, nil, true, true, nil, 'pl1') + end + elseif self.ability.name:find('Spectral') then + card = create_card("Spectral", G.pack_cards, nil, nil, true, true, nil, 'spe') + elseif self.ability.name:find('Standard') then + card = create_card((pseudorandom(pseudoseed('stdset'..G.GAME.round_resets.ante)) > 0.6) and "Enhanced" or "Base", G.pack_cards, nil, nil, nil, true, nil, 'sta') + local edition_rate = 2 + local edition = poll_edition('standard_edition'..G.GAME.round_resets.ante, edition_rate, true) + card:set_edition(edition) + local seal_rate = 10 + local seal_poll = pseudorandom(pseudoseed('stdseal'..G.GAME.round_resets.ante)) + if seal_poll > 1 - 0.02*seal_rate then + local seal_type = pseudorandom(pseudoseed('stdsealtype'..G.GAME.round_resets.ante)) + if seal_type > 0.75 then card:set_seal('Red') + elseif seal_type > 0.5 then card:set_seal('Blue') + elseif seal_type > 0.25 then card:set_seal('Gold') + else card:set_seal('Purple') + end + end + elseif self.ability.name:find('Buffoon') then + card = create_card("Joker", G.pack_cards, nil, nil, true, true, nil, 'buf') + + end + card.T.x = self.T.x + card.T.y = self.T.y + card:start_materialize({G.C.WHITE, G.C.WHITE}, nil, 1.5*G.SETTINGS.GAMESPEED) + pack_cards[i] = card + end + return true + end})) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 1.3*math.sqrt(G.SETTINGS.GAMESPEED), blockable = false, blocking = false, func = function() + if G.pack_cards then + if G.pack_cards and G.pack_cards.VT.y < G.ROOM.T.h then + for k, v in ipairs(pack_cards) do + G.pack_cards:emplace(v) + end + return true + end + end + end})) + + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({open_booster = true, card = self}) + end + + if G.GAME.modifiers.inflation then + G.GAME.inflation = G.GAME.inflation + 1 + G.E_MANAGER:add_event(Event({func = function() + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + + return true end })) + end +end + +function Card:redeem() + if self.ability.set == "Voucher" then + stop_use() + if not self.config.center.discovered then + discover_card(self.config.center) + end + if self.shop_voucher then G.GAME.current_round.voucher = nil end + + self.states.hover.can = false + G.GAME.used_vouchers[self.config.center_key] = true + local top_dynatext = nil + local bot_dynatext = nil + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() + top_dynatext = DynaText({string = localize{type = 'name_text', set = self.config.center.set, key = self.config.center.key}, colours = {G.C.WHITE}, rotate = 1,shadow = true, bump = true,float=true, scale = 0.9, pop_in = 0.6/G.SPEEDFACTOR, pop_in_rate = 1.5*G.SPEEDFACTOR}) + bot_dynatext = DynaText({string = localize('k_redeemed_ex'), colours = {G.C.WHITE}, rotate = 2,shadow = true, bump = true,float=true, scale = 0.9, pop_in = 1.4/G.SPEEDFACTOR, pop_in_rate = 1.5*G.SPEEDFACTOR, pitch_shift = 0.25}) + self:juice_up(0.3, 0.5) + play_sound('card1') + play_sound('coin1') + self.children.top_disp = UIBox{ + definition = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.O, config={object = top_dynatext}} + }}, + config = {align="tm", offset = {x=0,y=0},parent = self} + } + self.children.bot_disp = UIBox{ + definition = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.O, config={object = bot_dynatext}} + }}, + config = {align="bm", offset = {x=0,y=0},parent = self} + } + return true end })) + ease_dollars(-self.cost) + inc_career_stat('c_shop_dollars_spent', self.cost) + inc_career_stat('c_vouchers_bought', 1) + set_voucher_usage(self) + check_for_unlock({type = 'run_redeem'}) + G.GAME.current_round.voucher = nil + + self:apply_to_run() + + delay(0.6) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({buying_card = true, card = self}) + end + if G.GAME.modifiers.inflation then + G.GAME.inflation = G.GAME.inflation + 1 + G.E_MANAGER:add_event(Event({func = function() + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 2.6, func = function() + top_dynatext:pop_out(4) + bot_dynatext:pop_out(4) + return true end })) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.5, func = function() + self.children.top_disp:remove() + self.children.top_disp = nil + self.children.bot_disp:remove() + self.children.bot_disp = nil + return true end })) + end +end + +function Card:apply_to_run(center) + local center_table = { + name = center and center.name or self and self.ability.name, + extra = center and center.config.extra or self and self.ability.extra + } + if center_table.name == 'Overstock' or center_table.name == 'Overstock Plus' then + G.E_MANAGER:add_event(Event({func = function() + change_shop_size(1) + return true end })) + end + if center_table.name == 'Tarot Merchant' or center_table.name == 'Tarot Tycoon' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.tarot_rate = 4*center_table.extra + return true end })) + end + if center_table.name == 'Planet Merchant' or center_table.name == 'Planet Tycoon' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.planet_rate = 4*center_table.extra + return true end })) + end + if center_table.name == 'Hone' or center_table.name == 'Glow Up' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.edition_rate = center_table.extra + return true end })) + end + if center_table.name == 'Magic Trick' or center_table.name == 'Illusion' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.playing_card_rate = center_table.extra + return true end })) + end + if center_table.name == 'Telescope' or center_table.name == 'Observatory' then + end + if center_table.name == 'Crystal Ball' then + G.E_MANAGER:add_event(Event({func = function() + G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1 + return true end })) + end + if center_table.name == 'Clearance Sale' or center_table.name == 'Liquidation' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.discount_percent = center_table.extra + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + if center_table.name == 'Reroll Surplus' or center_table.name == 'Reroll Glut' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.round_resets.reroll_cost = G.GAME.round_resets.reroll_cost - self.ability.extra + G.GAME.current_round.reroll_cost = math.max(0, G.GAME.current_round.reroll_cost - self.ability.extra) + return true end })) + end + if center_table.name == 'Seed Money' or center_table.name == 'Money Tree' then + G.E_MANAGER:add_event(Event({func = function() + G.GAME.interest_cap = center_table.extra + return true end })) + end + if center_table.name == 'Grabber' or center_table.name == 'Nacho Tong' then + G.GAME.round_resets.hands = G.GAME.round_resets.hands + center_table.extra + ease_hands_played(center_table.extra) + end + if center_table.name == 'Paint Brush' or center_table.name == 'Palette' then + G.hand:change_size(1) + end + if center_table.name == 'Wasteful' or center_table.name == 'Recyclomancy' then + G.GAME.round_resets.discards = G.GAME.round_resets.discards + center_table.extra + ease_discard(center_table.extra) + end + if center_table.name == 'Blank' then + check_for_unlock({type = 'blank_redeems'}) + end + if center_table.name == 'Antimatter' then + G.E_MANAGER:add_event(Event({func = function() + if G.jokers then + G.jokers.config.card_limit = G.jokers.config.card_limit + 1 + end + return true end })) + end + if center_table.name == 'Hieroglyph' or center_table.name == 'Petroglyph' then + ease_ante(-center_table.extra) + G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante + G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante-center_table.extra + + if center_table.name == 'Hieroglyph' then + G.GAME.round_resets.hands = G.GAME.round_resets.hands - center_table.extra + ease_hands_played(-center_table.extra) + end + if center_table.name == 'Petroglyph' then + G.GAME.round_resets.discards = G.GAME.round_resets.discards - center_table.extra + ease_discard(-center_table.extra) + end + end +end + +function Card:explode(dissolve_colours, explode_time_fac) + local explode_time = 1.3*(explode_time_fac or 1)*(math.sqrt(G.SETTINGS.GAMESPEED)) + self.dissolve = 0 + self.dissolve_colours = dissolve_colours + or {G.C.WHITE} + + local start_time = G.TIMERS.TOTAL + local percent = 0 + play_sound('explosion_buildup1') + self.juice = { + scale = 0, + r = 0, + handled_elsewhere = true, + start_time = start_time, + end_time = start_time + explode_time + } + + local childParts1 = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + timer = 0.01*explode_time, + scale = 0.2, + speed = 2, + lifespan = 0.2*explode_time, + attach = self, + colours = self.dissolve_colours, + fill = true + }) + local childParts2 = nil + + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + if self.juice then + percent = (G.TIMERS.TOTAL - start_time)/explode_time + self.juice.r = 0.05*(math.sin(5*G.TIMERS.TOTAL) + math.cos(0.33 + 41.15332*G.TIMERS.TOTAL) + math.cos(67.12*G.TIMERS.TOTAL))*percent + self.juice.scale = percent*0.15 + end + if G.TIMERS.TOTAL - start_time > 1.5*explode_time then return true end + end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 0.3, + delay = 0.9*explode_time, + func = (function(t) return t end) + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.9*explode_time, + func = (function() + childParts2 = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + pulse_max = 30, + timer = 0.003, + scale = 0.6, + speed = 15, + lifespan = 0.5, + attach = self, + colours = self.dissolve_colours, + }) + childParts2:set_role({r_bond = 'Weak'}) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 1, + delay = 0.1*explode_time, + func = (function(t) return t end) + })) + self:juice_up() + G.VIBRATION = G.VIBRATION + 1 + play_sound('explosion_release1') + childParts1:fade(0.3*explode_time) return true end) + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 1.4*explode_time, + func = (function() + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + blocking = false, + ref_value = 'scale', + ref_table = childParts2, + ease_to = 0, + delay = 0.1*explode_time + })) + return true end) + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 1.5*explode_time, + func = (function() self:remove() return true end) + })) +end + +function Card:shatter() + local dissolve_time = 0.7 + self.shattered = true + self.dissolve = 0 + self.dissolve_colours = {{1,1,1,0.8}} + self:juice_up() + local childParts = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + timer = 0.007*dissolve_time, + scale = 0.3, + speed = 4, + lifespan = 0.5*dissolve_time, + attach = self, + colours = self.dissolve_colours, + fill = true + }) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.5*dissolve_time, + func = (function() childParts:fade(0.15*dissolve_time) return true end) + })) + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + play_sound('glass'..math.random(1, 6), math.random()*0.2 + 0.9,0.5) + play_sound('generic1', math.random()*0.2 + 0.9,0.5) + return true end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 1, + delay = 0.5*dissolve_time, + func = (function(t) return t end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.55*dissolve_time, + func = (function() self:remove() return true end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.51*dissolve_time, + })) +end + +function Card:start_dissolve(dissolve_colours, silent, dissolve_time_fac, no_juice) + local dissolve_time = 0.7*(dissolve_time_fac or 1) + self.dissolve = 0 + self.dissolve_colours = dissolve_colours + or {G.C.BLACK, G.C.ORANGE, G.C.RED, G.C.GOLD, G.C.JOKER_GREY} + if not no_juice then self:juice_up() end + local childParts = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + timer = 0.01*dissolve_time, + scale = 0.1, + speed = 2, + lifespan = 0.7*dissolve_time, + attach = self, + colours = self.dissolve_colours, + fill = true + }) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.7*dissolve_time, + func = (function() childParts:fade(0.3*dissolve_time) return true end) + })) + if not silent then + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + play_sound('whoosh2', math.random()*0.2 + 0.9,0.5) + play_sound('crumple'..math.random(1, 5), math.random()*0.2 + 0.9,0.5) + return true end) + })) + end + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 1, + delay = 1*dissolve_time, + func = (function(t) return t end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 1.05*dissolve_time, + func = (function() self:remove() return true end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 1.051*dissolve_time, + })) +end + +function Card:start_materialize(dissolve_colours, silent, timefac) + local dissolve_time = 0.6*(timefac or 1) + self.states.visible = true + self.states.hover.can = false + self.dissolve = 1 + self.dissolve_colours = dissolve_colours or + (self.ability.set == 'Joker' and {G.C.RARITY[self.config.center.rarity]}) or + (self.ability.set == 'Planet' and {G.C.SECONDARY_SET.Planet}) or + (self.ability.set == 'Tarot' and {G.C.SECONDARY_SET.Tarot}) or + (self.ability.set == 'Spectral' and {G.C.SECONDARY_SET.Spectral}) or + (self.ability.set == 'Booster' and {G.C.BOOSTER}) or + (self.ability.set == 'Voucher' and {G.C.SECONDARY_SET.Voucher, G.C.CLEAR}) or + {G.C.GREEN} + self:juice_up() + self.children.particles = Particles(0, 0, 0,0, { + timer_type = 'TOTAL', + timer = 0.025*dissolve_time, + scale = 0.25, + speed = 3, + lifespan = 0.7*dissolve_time, + attach = self, + colours = self.dissolve_colours, + fill = true + }) + if not silent then + if not G.last_materialized or G.last_materialized +0.01 < G.TIMERS.REAL or G.last_materialized > G.TIMERS.REAL then + G.last_materialized = G.TIMERS.REAL + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + play_sound('whoosh1', math.random()*0.1 + 0.6,0.3) + play_sound('crumple'..math.random(1,5), math.random()*0.2 + 1.2,0.8) + return true end) + })) + end + end + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 0.5*dissolve_time, + func = (function() if self.children.particles then self.children.particles.max = 0 end return true end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = self, + ref_value = 'dissolve', + ease_to = 0, + delay = 1*dissolve_time, + func = (function(t) return t end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 1.05*dissolve_time, + func = (function() self.states.hover.can = true; if self.children.particles then self.children.particles:remove(); self.children.particles = nil end return true end) + })) +end + +function Card:calculate_seal(context) + if self.debuff then return nil end + if context.repetition then + if self.seal == 'Red' then + return { + message = localize('k_again_ex'), + repetitions = 1, + card = self + } + end + end + if context.discard then + if self.seal == 'Purple' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, '8ba') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_tarot'), colour = G.C.PURPLE}) + end + end +end + +function Card:calculate_joker(context) + if self.debuff then return nil end + if self.ability.set == "Planet" and not self.debuff then + if context.joker_main then + if G.GAME.used_vouchers.v_observatory and self.ability.consumeable.hand_type == context.scoring_name then + return { + message = localize{type = 'variable', key = 'a_xmult', vars = {G.P_CENTERS.v_observatory.config.extra}}, + Xmult_mod = G.P_CENTERS.v_observatory.config.extra + } + end + end + end + if self.ability.set == "Joker" and not self.debuff then + if self.ability.name == "Blueprint" then + local other_joker = nil + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] == self then other_joker = G.jokers.cards[i+1] end + end + if other_joker and other_joker ~= self then + context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1 + context.blueprint_card = context.blueprint_card or self + if context.blueprint > #G.jokers.cards + 1 then return end + local other_joker_ret = other_joker:calculate_joker(context) + if other_joker_ret then + other_joker_ret.card = context.blueprint_card or self + other_joker_ret.colour = G.C.BLUE + return other_joker_ret + end + end + end + if self.ability.name == "Brainstorm" then + local other_joker = G.jokers.cards[1] + if other_joker and other_joker ~= self then + context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1 + context.blueprint_card = context.blueprint_card or self + if context.blueprint > #G.jokers.cards + 1 then return end + local other_joker_ret = other_joker:calculate_joker(context) + if other_joker_ret then + other_joker_ret.card = context.blueprint_card or self + other_joker_ret.colour = G.C.RED + return other_joker_ret + end + end + end + if context.open_booster then + if self.ability.name == 'Hallucination' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + if pseudorandom('halu'..G.GAME.round_resets.ante) < G.GAME.probabilities.normal/self.ability.extra then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, 'hal') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_tarot'), colour = G.C.PURPLE}) + end + end + elseif context.buying_card then + + elseif context.selling_self then + if self.ability.name == 'Luchador' then + if G.GAME.blind and ((not G.GAME.blind.disabled) and (G.GAME.blind:get_type() == 'Boss')) then + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('ph_boss_disabled')}) + G.GAME.blind:disable() + end + end + if self.ability.name == 'Diet Cola' then + G.E_MANAGER:add_event(Event({ + func = (function() + add_tag(Tag('tag_double')) + play_sound('generic1', 0.9 + math.random()*0.1, 0.8) + play_sound('holo1', 1.2 + math.random()*0.1, 0.4) + return true + end) + })) + end + if self.ability.name == 'Invisible Joker' and (self.ability.invis_rounds >= self.ability.extra) and not context.blueprint then + local eval = function(card) return (card.ability.loyalty_remaining == 0) and not G.RESET_JIGGLES end + juice_card_until(self, eval, true) + local jokers = {} + for i=1, #G.jokers.cards do + if G.jokers.cards[i] ~= self then + jokers[#jokers+1] = G.jokers.cards[i] + end + end + if #jokers > 0 then + if #G.jokers.cards <= G.jokers.config.card_limit then + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_duplicated_ex')}) + local chosen_joker = pseudorandom_element(jokers, pseudoseed('invisible')) + local card = copy_card(chosen_joker, nil, nil, nil, chosen_joker.edition and chosen_joker.edition.negative) + if card.ability.invis_rounds then card.ability.invis_rounds = 0 end + card:add_to_deck() + G.jokers:emplace(card) + else + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_no_room_ex')}) + end + else + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_no_other_jokers')}) + end + end + elseif context.selling_card then + if self.ability.name == 'Campfire' and not context.blueprint then + self.ability.x_mult = self.ability.x_mult + self.ability.extra + G.E_MANAGER:add_event(Event({ + func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_upgrade_ex')}); return true + end})) + end + return + elseif context.reroll_shop then + if self.ability.name == 'Flash Card' and not context.blueprint then + self.ability.mult = self.ability.mult + self.ability.extra + G.E_MANAGER:add_event(Event({ + func = (function() + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_mult', vars = {self.ability.mult}}, colour = G.C.MULT}) + return true + end)})) + end + elseif context.ending_shop then + if self.ability.name == 'Perkeo' then + if G.consumeables.cards[1] then + G.E_MANAGER:add_event(Event({ + func = function() + local card = copy_card(pseudorandom_element(G.consumeables.cards, pseudoseed('perkeo')), nil) + card:set_edition({negative = true}, true) + card:add_to_deck() + G.consumeables:emplace(card) + return true + end})) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_duplicated_ex')}) + end + return + end + return + elseif context.skip_blind then + if self.ability.name == 'Throwback' and not context.blueprint then + G.E_MANAGER:add_event(Event({ + func = function() + card_eval_status_text(self, 'extra', nil, nil, nil, { + message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.x_mult}}, + colour = G.C.RED, + card = self + }) + return true + end})) + end + return + elseif context.skipping_booster then + if self.ability.name == 'Red Card' and not context.blueprint then + self.ability.mult = self.ability.mult + self.ability.extra + G.E_MANAGER:add_event(Event({ + func = function() + card_eval_status_text(self, 'extra', nil, nil, nil, { + message = localize{type = 'variable', key = 'a_mult', vars = {self.ability.extra}}, + colour = G.C.RED, + delay = 0.45, + card = self + }) + return true + end})) + end + return + elseif context.playing_card_added and not self.getting_sliced then + if self.ability.name == 'Hologram' and (not context.blueprint) + and context.cards and context.cards[1] then + self.ability.x_mult = self.ability.x_mult + #context.cards*self.ability.extra + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.x_mult}}}) + end + elseif context.first_hand_drawn then + if self.ability.name == 'Certificate' then + G.E_MANAGER:add_event(Event({ + func = function() + local _card = create_playing_card({ + front = pseudorandom_element(G.P_CARDS, pseudoseed('cert_fr')), + center = G.P_CENTERS.c_base}, G.hand, nil, nil, {G.C.SECONDARY_SET.Enhanced}) + local seal_type = pseudorandom(pseudoseed('certsl')) + if seal_type > 0.75 then _card:set_seal('Red', true) + elseif seal_type > 0.5 then _card:set_seal('Blue', true) + elseif seal_type > 0.25 then _card:set_seal('Gold', true) + else _card:set_seal('Purple', true) + end + G.hand:sort() + if context.blueprint_card then context.blueprint_card:juice_up() else self:juice_up() end + return true + end})) + + playing_card_joker_effects({true}) + end + if self.ability.name == 'DNA' and not context.blueprint then + local eval = function() return G.GAME.current_round.hands_played == 0 end + juice_card_until(self, eval, true) + end + if self.ability.name == 'Trading Card' and not context.blueprint then + local eval = function() return G.GAME.current_round.discards_used == 0 and not G.RESET_JIGGLES end + juice_card_until(self, eval, true) + end + elseif context.setting_blind and not self.getting_sliced then + if self.ability.name == 'Chicot' and not context.blueprint + and context.blind.boss and not self.getting_sliced then + G.E_MANAGER:add_event(Event({func = function() + G.E_MANAGER:add_event(Event({func = function() + G.GAME.blind:disable() + play_sound('timpani') + delay(0.4) + return true end })) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('ph_boss_disabled')}) + return true end })) + end + if self.ability.name == 'Madness' and not context.blueprint then + self.ability.x_mult = self.ability.x_mult + self.ability.extra + local destructable_jokers = {} + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] ~= self and not G.jokers.cards[i].ability.eternal and not G.jokers.cards[i].getting_sliced then destructable_jokers[#destructable_jokers+1] = G.jokers.cards[i] end + end + local joker_to_destroy = #destructable_jokers > 0 and pseudorandom_element(destructable_jokers, pseudoseed('madness')) or nil + + if joker_to_destroy and not (context.blueprint_card or self).getting_sliced then + joker_to_destroy.getting_sliced = true + G.E_MANAGER:add_event(Event({func = function() + (context.blueprint_card or self):juice_up(0.8, 0.8) + joker_to_destroy:start_dissolve({G.C.RED}, nil, 1.6) + return true end })) + end + if not (context.blueprint_card or self).getting_sliced then + card_eval_status_text((context.blueprint_card or self), 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.x_mult}}}) + end + end + if self.ability.name == 'Burglar' and not (context.blueprint_card or self).getting_sliced then + G.E_MANAGER:add_event(Event({func = function() + ease_discard(-G.GAME.current_round.discards_left, nil, true) + ease_hands_played(self.ability.extra) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_hands', vars = {self.ability.extra}}}) + return true end })) + end + if self.ability.name == 'Riff-raff' and not (context.blueprint_card or self).getting_sliced and #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit then + local jokers_to_create = math.min(2, G.jokers.config.card_limit - (#G.jokers.cards + G.GAME.joker_buffer)) + G.GAME.joker_buffer = G.GAME.joker_buffer + jokers_to_create + G.E_MANAGER:add_event(Event({ + func = function() + for i = 1, jokers_to_create do + local card = create_card('Joker', G.jokers, nil, 0, nil, nil, nil, 'rif') + card:add_to_deck() + G.jokers:emplace(card) + card:start_materialize() + G.GAME.joker_buffer = 0 + end + return true + end})) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_plus_joker'), colour = G.C.BLUE}) + end + if self.ability.name == 'Cartomancer' and not (context.blueprint_card or self).getting_sliced and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + func = (function() + G.E_MANAGER:add_event(Event({ + func = function() + local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, 'car') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end})) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_plus_tarot'), colour = G.C.PURPLE}) + return true + end)})) + end + if self.ability.name == 'Ceremonial Dagger' and not context.blueprint then + local my_pos = nil + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] == self then my_pos = i; break end + end + if my_pos and G.jokers.cards[my_pos+1] and not self.getting_sliced and not G.jokers.cards[my_pos+1].ability.eternal and not G.jokers.cards[my_pos+1].getting_sliced then + local sliced_card = G.jokers.cards[my_pos+1] + sliced_card.getting_sliced = true + G.GAME.joker_buffer = G.GAME.joker_buffer - 1 + G.E_MANAGER:add_event(Event({func = function() + G.GAME.joker_buffer = 0 + self.ability.mult = self.ability.mult + sliced_card.sell_cost*2 + self:juice_up(0.8, 0.8) + sliced_card:start_dissolve({HEX("57ecab")}, nil, 1.6) + play_sound('slice1', 0.96+math.random()*0.08) + return true end })) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_mult', vars = {self.ability.mult+2*sliced_card.sell_cost}}, colour = G.C.RED, no_juice = true}) + end + end + if self.ability.name == 'Marble Joker' and not (context.blueprint_card or self).getting_sliced then + G.E_MANAGER:add_event(Event({ + func = function() + local front = pseudorandom_element(G.P_CARDS, pseudoseed('marb_fr')) + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local card = Card(G.play.T.x + G.play.T.w/2, G.play.T.y, G.CARD_W, G.CARD_H, front, G.P_CENTERS.m_stone, {playing_card = G.playing_card}) + card:start_materialize({G.C.SECONDARY_SET.Enhanced}) + G.play:emplace(card) + table.insert(G.playing_cards, card) + return true + end})) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_plus_stone'), colour = G.C.SECONDARY_SET.Enhanced}) + + G.E_MANAGER:add_event(Event({ + func = function() + G.deck.config.card_limit = G.deck.config.card_limit + 1 + return true + end})) + draw_card(G.play,G.deck, 90,'up', nil) + + playing_card_joker_effects({true}) + end + return + elseif context.destroying_card and not context.blueprint then + if self.ability.name == 'Sixth Sense' and #context.full_hand == 1 and context.full_hand[1]:get_id() == 6 and G.GAME.current_round.hands_played == 0 then + if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Spectral',G.consumeables, nil, nil, nil, nil, nil, 'sixth') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_plus_spectral'), colour = G.C.SECONDARY_SET.Spectral}) + end + return true + end + return nil + elseif context.cards_destroyed then + if self.ability.name == 'Caino' and not context.blueprint then + local faces = 0 + for k, v in ipairs(context.glass_shattered) do + if v:is_face() then + faces = faces + 1 + end + end + if faces > 0 then + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + self.ability.caino_xmult = self.ability.caino_xmult + faces*self.ability.extra + return true + end + })) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.caino_xmult + faces*self.ability.extra}}}) + return true + end + })) + end + + return + end + if self.ability.name == 'Glass Joker' and not context.blueprint then + local glasses = 0 + for k, v in ipairs(context.glass_shattered) do + if v.shattered then + glasses = glasses + 1 + end + end + if glasses > 0 then + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + self.ability.x_mult = self.ability.x_mult + self.ability.extra*glasses + return true + end + })) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.x_mult + self.ability.extra*glasses}}}) + return true + end + })) + end + + return + end + + elseif context.remove_playing_cards then + if self.ability.name == 'Caino' and not context.blueprint then + local face_cards = 0 + for k, val in ipairs(context.removed) do + if val:is_face() then face_cards = face_cards + 1 end + end + if face_cards > 0 then + self.ability.caino_xmult = self.ability.caino_xmult + face_cards*self.ability.extra + G.E_MANAGER:add_event(Event({ + func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.caino_xmult}}}); return true + end})) + end + return + end + + if self.ability.name == 'Glass Joker' and not context.blueprint then + local glass_cards = 0 + for k, val in ipairs(context.removed) do + if val.shattered then glass_cards = glass_cards + 1 end + end + if glass_cards > 0 then + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + self.ability.x_mult = self.ability.x_mult + self.ability.extra*glass_cards + return true + end + })) + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type = 'variable', key = 'a_xmult', vars = {self.ability.x_mult + self.ability.extra*glass_cards}}}) + return true + end + })) + end + return + end + elseif context.using_consumeable then + if self.ability.name == 'Glass Joker' and not context.blueprint and context.consumeable.ability.name == 'The Hanged Man' then + local shattered_glass = 0 + for k, val in ipairs(G.hand.highlighted) do + if val.ability.name == 'Glass Card' then shattered_glass = shattered_glass + 1 end + end + if shattered_glass > 0 then + self.ability.x_mult = self.ability.x_mult + self.ability.extra*shattered_glass + G.E_MANAGER:add_event(Event({ + func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}}); return true + end})) + end + return + end + if self.ability.name == 'Fortune Teller' and not context.blueprint and (context.consumeable.ability.set == "Tarot") then + G.E_MANAGER:add_event(Event({ + func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_mult',vars={G.GAME.consumeable_usage_total.tarot}}}); return true + end})) + end + if self.ability.name == 'Constellation' and not context.blueprint and context.consumeable.ability.set == 'Planet' then + self.ability.x_mult = self.ability.x_mult + self.ability.extra + G.E_MANAGER:add_event(Event({ + func = function() card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}}); return true + end})) + return + end + return + elseif context.debuffed_hand then + if self.ability.name == 'Matador' then + if G.GAME.blind.triggered then + ease_dollars(self.ability.extra) + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + message = localize('$')..self.ability.extra, + dollars = self.ability.extra, + colour = G.C.MONEY + } + end + end + elseif context.pre_discard then + if self.ability.name == 'Burnt Joker' and G.GAME.current_round.discards_used <= 0 and not context.hook then + local text,disp_text = G.FUNCS.get_poker_hand_info(G.hand.highlighted) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_upgrade_ex')}) + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.8, delay = 0.3}, {handname=localize(text, 'poker_hands'),chips = G.GAME.hands[text].chips, mult = G.GAME.hands[text].mult, level=G.GAME.hands[text].level}) + level_up_hand(context.blueprint_card or self, text, nil, 1) + update_hand_text({sound = 'button', volume = 0.7, pitch = 1.1, delay = 0}, {mult = 0, chips = 0, handname = '', level = ''}) + end + elseif context.discard then + if self.ability.name == 'Ramen' and not context.blueprint then + if self.ability.x_mult - self.ability.extra <= 1 then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + return { + message = localize('k_eaten_ex'), + colour = G.C.FILTER + } + else + self.ability.x_mult = self.ability.x_mult - self.ability.extra + return { + delay = 0.2, + message = localize{type='variable',key='a_xmult_minus',vars={self.ability.extra}}, + colour = G.C.RED + } + end + end + if self.ability.name == 'Trading Card' and not context.blueprint and + G.GAME.current_round.discards_used <= 0 and #context.full_hand == 1 then + ease_dollars(self.ability.extra) + return { + message = localize('$')..self.ability.extra, + colour = G.C.MONEY, + delay = 0.45, + remove = true, + card = self + } + end + + if self.ability.name == 'Castle' and + not context.other_card.debuff and + context.other_card:is_suit(G.GAME.current_round.castle_card.suit) and not context.blueprint then + self.ability.extra.chips = self.ability.extra.chips + self.ability.extra.chip_mod + + return { + message = localize('k_upgrade_ex'), + card = self, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Mail-In Rebate' and + not context.other_card.debuff and + context.other_card:get_id() == G.GAME.current_round.mail_card.id then + ease_dollars(self.ability.extra) + return { + message = localize('$')..self.ability.extra, + colour = G.C.MONEY, + card = self + } + end + if self.ability.name == 'Hit the Road' and + not context.other_card.debuff and + context.other_card:get_id() == 11 and not context.blueprint then + self.ability.x_mult = self.ability.x_mult + self.ability.extra + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}, + colour = G.C.RED, + delay = 0.45, + card = self + } + end + if self.ability.name == 'Green Joker' and not context.blueprint and context.other_card == context.full_hand[#context.full_hand] then + local prev_mult = self.ability.mult + self.ability.mult = math.max(0, self.ability.mult - self.ability.extra.discard_sub) + if self.ability.mult ~= prev_mult then + return { + message = localize{type='variable',key='a_mult_minus',vars={self.ability.extra.discard_sub}}, + colour = G.C.RED, + card = self + } + end + end + if self.ability.name == 'Yorick' and self.ability.yorick_discards > 0 and not self.ability.yorick_tallied and not context.blueprint then + self.ability.yorick_tallied = true + G.E_MANAGER:add_event(Event({ + func = function() + self.ability.yorick_tallied = nil + self.ability.yorick_discards = self.ability.yorick_discards - 1 + if self.ability.yorick_discards == 0 then + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_active_ex'),colour = G.C.FILTER, delay = 0.45}) + else + card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_remaining',vars={self.ability.yorick_discards}},colour = G.C.FILTER, delay = 0.45}) + end + return true + end})) + return + end + + if self.ability.name == 'Faceless Joker' and context.other_card == context.full_hand[#context.full_hand] then + local face_cards = 0 + for k, v in ipairs(context.full_hand) do + if v:is_face() then face_cards = face_cards + 1 end + end + if face_cards >= self.ability.extra.faces then + G.E_MANAGER:add_event(Event({ + func = function() + ease_dollars(self.ability.extra.dollars) + card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('$')..self.ability.extra.dollars,colour = G.C.MONEY, delay = 0.45}) + return true + end})) + return + end + end + return + elseif context.end_of_round then + if context.individual then + + elseif context.repetition then + if context.cardarea == G.hand then + if self.ability.name == 'Mime' and + (next(context.card_effects[1]) or #context.card_effects > 1) then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + end + elseif not context.blueprint then + if self.ability.name == 'Campfire' and G.GAME.blind.boss and self.ability.x_mult > 1 then + self.ability.x_mult = 1 + return { + message = localize('k_reset'), + colour = G.C.RED + } + end + if self.ability.name == 'Rocket' and G.GAME.blind.boss then + self.ability.extra.dollars = self.ability.extra.dollars + self.ability.extra.increase + return { + message = localize('k_upgrade_ex'), + colour = G.C.MONEY + } + end + if self.ability.name == 'Turtle Bean' and not context.blueprint then + if self.ability.extra.h_size - self.ability.extra.h_mod <= 0 then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + return { + message = localize('k_eaten_ex'), + colour = G.C.FILTER + } + else + self.ability.extra.h_size = self.ability.extra.h_size - self.ability.extra.h_mod + G.hand:change_size(- self.ability.extra.h_mod) + return { + message = localize{type='variable',key='a_handsize_minus',vars={self.ability.extra.h_mod}}, + colour = G.C.FILTER + } + end + end + if self.ability.name == 'Invisible Joker' and not context.blueprint then + self.ability.invis_rounds = self.ability.invis_rounds + 1 + if self.ability.invis_rounds == self.ability.extra then + local eval = function(card) return not card.REMOVED end + juice_card_until(self, eval, true) + end + return { + message = (self.ability.invis_rounds < self.ability.extra) and (self.ability.invis_rounds..'/'..self.ability.extra) or localize('k_active_ex'), + colour = G.C.FILTER + } + end + if self.ability.name == 'Popcorn' and not context.blueprint then + if self.ability.mult - self.ability.extra <= 0 then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + return { + message = localize('k_eaten_ex'), + colour = G.C.RED + } + else + self.ability.mult = self.ability.mult - self.ability.extra + return { + message = localize{type='variable',key='a_mult_minus',vars={self.ability.extra}}, + colour = G.C.MULT + } + end + end + if self.ability.name == 'Egg' then + self.ability.extra_value = self.ability.extra_value + self.ability.extra + self:set_cost() + return { + message = localize('k_val_up'), + colour = G.C.MONEY + } + end + if self.ability.name == 'Gift Card' then + for k, v in ipairs(G.jokers.cards) do + if v.set_cost then + v.ability.extra_value = (v.ability.extra_value or 0) + self.ability.extra + v:set_cost() + end + end + for k, v in ipairs(G.consumeables.cards) do + if v.set_cost then + v.ability.extra_value = (v.ability.extra_value or 0) + self.ability.extra + v:set_cost() + end + end + return { + message = localize('k_val_up'), + colour = G.C.MONEY + } + end + if self.ability.name == 'Hit the Road' and self.ability.x_mult > 1 then + self.ability.x_mult = 1 + return { + message = localize('k_reset'), + colour = G.C.RED + } + end + + if self.ability.name == 'Gros Michel' or self.ability.name == 'Cavendish' then + if pseudorandom(self.ability.name == 'Cavendish' and 'cavendish' or 'gros_michel') < G.GAME.probabilities.normal/self.ability.extra.odds then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + if self.ability.name == 'Gros Michel' then G.GAME.pool_flags.gros_michel_extinct = true end + return { + message = localize('k_extinct_ex') + } + else + return { + message = localize('k_safe_ex') + } + end + end + if self.ability.name == 'Mr. Bones' and context.game_over and + G.GAME.chips/G.GAME.blind.chips >= 0.25 then + G.E_MANAGER:add_event(Event({ + func = function() + G.hand_text_area.blind_chips:juice_up() + G.hand_text_area.game_chips:juice_up() + play_sound('tarot1') + self:start_dissolve() + return true + end + })) + return { + message = localize('k_saved_ex'), + saved = true, + colour = G.C.RED + } + end + end + elseif context.individual then + if context.cardarea == G.play then + if self.ability.name == 'Hiker' then + context.other_card.ability.perma_bonus = context.other_card.ability.perma_bonus or 0 + context.other_card.ability.perma_bonus = context.other_card.ability.perma_bonus + self.ability.extra + return { + extra = {message = localize('k_upgrade_ex'), colour = G.C.CHIPS}, + colour = G.C.CHIPS, + card = self + } + end + if self.ability.name == 'Lucky Cat' and context.other_card.lucky_trigger and not context.blueprint then + self.ability.x_mult = self.ability.x_mult + self.ability.extra + return { + extra = {focus = self, message = localize('k_upgrade_ex'), colour = G.C.MULT}, + card = self + } + end + if self.ability.name == 'Wee Joker' and + context.other_card:get_id() == 2 and not context.blueprint then + self.ability.extra.chips = self.ability.extra.chips + self.ability.extra.chip_mod + + return { + extra = {focus = self, message = localize('k_upgrade_ex')}, + card = self, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Photograph' then + local first_face = nil + for i = 1, #context.scoring_hand do + if context.scoring_hand[i]:is_face() then first_face = context.scoring_hand[i]; break end + end + if context.other_card == first_face then + return { + x_mult = self.ability.extra, + colour = G.C.RED, + card = self + } + end + end + if self.ability.name == 'The Idol' and + context.other_card:get_id() == G.GAME.current_round.idol_card.id and + context.other_card:is_suit(G.GAME.current_round.idol_card.suit) then + return { + x_mult = self.ability.extra, + colour = G.C.RED, + card = self + } + end + if self.ability.name == 'Scary Face' and ( + context.other_card:is_face()) then + return { + chips = self.ability.extra, + card = self + } + end + if self.ability.name == 'Smiley Face' and ( + context.other_card:is_face()) then + return { + mult = self.ability.extra, + card = self + } + end + if self.ability.name == 'Golden Ticket' and + context.other_card.ability.name == 'Gold Card' then + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + dollars = self.ability.extra, + card = self + } + end + if self.ability.name == 'Scholar' and + context.other_card:get_id() == 14 then + return { + chips = self.ability.extra.chips, + mult = self.ability.extra.mult, + card = self + } + end + if self.ability.name == 'Walkie Talkie' and + (context.other_card:get_id() == 10 or context.other_card:get_id() == 4) then + return { + chips = self.ability.extra.chips, + mult = self.ability.extra.mult, + card = self + } + end + if self.ability.name == 'Business Card' and + context.other_card:is_face() and + pseudorandom('business') < G.GAME.probabilities.normal/self.ability.extra then + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + 2 + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + dollars = 2, + card = self + } + end + if self.ability.name == 'Fibonacci' and ( + context.other_card:get_id() == 2 or + context.other_card:get_id() == 3 or + context.other_card:get_id() == 5 or + context.other_card:get_id() == 8 or + context.other_card:get_id() == 14) then + return { + mult = self.ability.extra, + card = self + } + end + if self.ability.name == 'Even Steven' and + context.other_card:get_id() <= 10 and + context.other_card:get_id() >= 0 and + context.other_card:get_id()%2 == 0 + then + return { + mult = self.ability.extra, + card = self + } + end + if self.ability.name == 'Odd Todd' and + ((context.other_card:get_id() <= 10 and + context.other_card:get_id() >= 0 and + context.other_card:get_id()%2 == 1) or + (context.other_card:get_id() == 14)) + then + return { + chips = self.ability.extra, + card = self + } + end + if self.ability.effect == 'Suit Mult' and + context.other_card:is_suit(self.ability.extra.suit) then + return { + mult = self.ability.extra.s_mult, + card = self + } + end + if self.ability.name == 'Rough Gem' and + context.other_card:is_suit("Diamonds") then + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + dollars = self.ability.extra, + card = self + } + end + if self.ability.name == 'Onyx Agate' and + context.other_card:is_suit("Clubs") then + return { + mult = self.ability.extra, + card = self + } + end + if self.ability.name == 'Arrowhead' and + context.other_card:is_suit("Spades") then + return { + chips = self.ability.extra, + card = self + } + end + if self.ability.name == 'Bloodstone' and + context.other_card:is_suit("Hearts") and + pseudorandom('bloodstone') < G.GAME.probabilities.normal/self.ability.extra.odds then + return { + x_mult = self.ability.extra.Xmult, + card = self + } + end + if self.ability.name == 'Ancient Joker' and + context.other_card:is_suit(G.GAME.current_round.ancient_card.suit) then + return { + x_mult = self.ability.extra, + card = self + } + end + if self.ability.name == 'Triboulet' and + (context.other_card:get_id() == 12 or context.other_card:get_id() == 13) then + return { + x_mult = self.ability.extra, + colour = G.C.RED, + card = self + } + end + end + if context.cardarea == G.hand then + if self.ability.name == 'Shoot the Moon' and + context.other_card:get_id() == 12 then + if context.other_card.debuff then + return { + message = localize('k_debuffed'), + colour = G.C.RED, + card = self, + } + else + return { + h_mult = 13, + card = self + } + end + end + if self.ability.name == 'Baron' and + context.other_card:get_id() == 13 then + if context.other_card.debuff then + return { + message = localize('k_debuffed'), + colour = G.C.RED, + card = self, + } + else + return { + x_mult = self.ability.extra, + card = self + } + end + end + if self.ability.name == 'Reserved Parking' and + context.other_card:is_face() and + pseudorandom('parking') < G.GAME.probabilities.normal/self.ability.extra.odds then + if context.other_card.debuff then + return { + message = localize('k_debuffed'), + colour = G.C.RED, + card = self, + } + else + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra.dollars + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + dollars = self.ability.extra.dollars, + card = self + } + end + end + if self.ability.name == 'Raised Fist' then + local temp_Mult, temp_ID = 15, 15 + local raised_card = nil + for i=1, #G.hand.cards do + if temp_ID >= G.hand.cards[i].base.id and G.hand.cards[i].ability.effect ~= 'Stone Card' then temp_Mult = G.hand.cards[i].base.nominal; temp_ID = G.hand.cards[i].base.id; raised_card = G.hand.cards[i] end + end + if raised_card == context.other_card then + if context.other_card.debuff then + return { + message = localize('k_debuffed'), + colour = G.C.RED, + card = self, + } + else + return { + h_mult = 2*temp_Mult, + card = self, + } + end + end + end + end + elseif context.repetition then + if context.cardarea == G.play then + if self.ability.name == 'Sock and Buskin' and ( + context.other_card:is_face()) then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + if self.ability.name == 'Hanging Chad' and ( + context.other_card == context.scoring_hand[1]) then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + if self.ability.name == 'Dusk' and G.GAME.current_round.hands_left == 0 then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + if self.ability.name == 'Seltzer' then + return { + message = localize('k_again_ex'), + repetitions = 1, + card = self + } + end + if self.ability.name == 'Hack' and ( + context.other_card:get_id() == 2 or + context.other_card:get_id() == 3 or + context.other_card:get_id() == 4 or + context.other_card:get_id() == 5) then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + end + if context.cardarea == G.hand then + if self.ability.name == 'Mime' and + (next(context.card_effects[1]) or #context.card_effects > 1) then + return { + message = localize('k_again_ex'), + repetitions = self.ability.extra, + card = self + } + end + end + elseif context.other_joker then + if self.ability.name == 'Baseball Card' and context.other_joker.config.center.rarity == 2 and self ~= context.other_joker then + G.E_MANAGER:add_event(Event({ + func = function() + context.other_joker:juice_up(0.5, 0.5) + return true + end + })) + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + else + if context.cardarea == G.jokers then + if context.before then + if self.ability.name == 'Spare Trousers' and (next(context.poker_hands['Two Pair']) or next(context.poker_hands['Full House'])) and not context.blueprint then + self.ability.mult = self.ability.mult + self.ability.extra + return { + message = localize('k_upgrade_ex'), + colour = G.C.RED, + card = self + } + end + if self.ability.name == 'Space Joker' and pseudorandom('space') < G.GAME.probabilities.normal/self.ability.extra then + return { + card = self, + level_up = true, + message = localize('k_level_up_ex') + } + end + if self.ability.name == 'Square Joker' and #context.full_hand == 4 and not context.blueprint then + self.ability.extra.chips = self.ability.extra.chips + self.ability.extra.chip_mod + return { + message = localize('k_upgrade_ex'), + colour = G.C.CHIPS, + card = self + } + end + if self.ability.name == 'Runner' and next(context.poker_hands['Straight']) and not context.blueprint then + self.ability.extra.chips = self.ability.extra.chips + self.ability.extra.chip_mod + return { + message = localize('k_upgrade_ex'), + colour = G.C.CHIPS, + card = self + } + end + if self.ability.name == 'Midas Mask' and not context.blueprint then + local faces = {} + for k, v in ipairs(context.full_hand) do + if v:is_face() then + faces[#faces+1] = v + v:set_ability(G.P_CENTERS.m_gold, nil, true) + G.E_MANAGER:add_event(Event({ + func = function() + v:juice_up() + return true + end + })) + end + end + if #faces > 0 then + return { + message = localize('k_gold'), + colour = G.C.MONEY, + card = self + } + end + end + if self.ability.name == 'Vampire' and not context.blueprint then + local enhanced = {} + for k, v in ipairs(context.full_hand) do + if v.config.center ~= G.P_CENTERS.c_base and not v.debuff and not v.vampired then + enhanced[#enhanced+1] = v + v.vampired = true + v:set_ability(G.P_CENTERS.c_base, nil, true) + G.E_MANAGER:add_event(Event({ + func = function() + v:juice_up() + v.vampired = nil + return true + end + })) + end + end + + if #enhanced > 0 then + self.ability.x_mult = self.ability.x_mult + self.ability.extra*#enhanced + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}, + colour = G.C.MULT, + card = self + } + end + end + if self.ability.name == 'To Do List' and context.scoring_name == self.ability.to_do_poker_hand then + G.E_MANAGER:add_event(Event({ + func = function() + local _poker_hands = {} + for k, v in pairs(G.GAME.hands) do + if v.visible and k ~= self.ability.to_do_poker_hand then _poker_hands[#_poker_hands+1] = k end + end + self.ability.to_do_poker_hand = pseudorandom_element(_poker_hands, pseudoseed('to_do')) + return true + end + })) + ease_dollars(self.ability.extra.dollars) + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra.dollars + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + message = localize('$')..self.ability.extra.dollars, + dollars = self.ability.extra.dollars, + colour = G.C.MONEY + } + end + if self.ability.name == 'DNA' and G.GAME.current_round.hands_played == 0 then + if #context.full_hand == 1 then + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local _card = copy_card(context.full_hand[1], nil, nil, G.playing_card) + _card:add_to_deck() + G.deck.config.card_limit = G.deck.config.card_limit + 1 + table.insert(G.playing_cards, _card) + G.hand:emplace(_card) + _card.states.visible = nil + + G.E_MANAGER:add_event(Event({ + func = function() + _card:start_materialize() + return true + end + })) + return { + message = localize('k_copied_ex'), + colour = G.C.CHIPS, + card = self, + playing_cards_created = {true} + } + end + end + if self.ability.name == 'Ride the Bus' and not context.blueprint then + local faces = false + for i = 1, #context.scoring_hand do + if context.scoring_hand[i]:is_face() then faces = true end + end + if faces then + local last_mult = self.ability.mult + self.ability.mult = 0 + if last_mult > 0 then + return { + card = self, + message = localize('k_reset') + } + end + else + self.ability.mult = self.ability.mult + self.ability.extra + end + end + if self.ability.name == 'Obelisk' and not context.blueprint then + local reset = true + local play_more_than = (G.GAME.hands[context.scoring_name].played or 0) + for k, v in pairs(G.GAME.hands) do + if k ~= context.scoring_name and v.played >= play_more_than and v.visible then + reset = false + end + end + if reset then + if self.ability.x_mult > 1 then + self.ability.x_mult = 1 + return { + card = self, + message = localize('k_reset') + } + end + else + self.ability.x_mult = self.ability.x_mult + self.ability.extra + end + end + if self.ability.name == 'Green Joker' and not context.blueprint then + self.ability.mult = self.ability.mult + self.ability.extra.hand_add + return { + card = self, + message = localize{type='variable',key='a_mult',vars={self.ability.extra.hand_add}} + } + end + elseif context.after then + if self.ability.name == 'Ice Cream' and not context.blueprint then + if self.ability.extra.chips - self.ability.extra.chip_mod <= 0 then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + return { + message = localize('k_melted_ex'), + colour = G.C.CHIPS + } + else + self.ability.extra.chips = self.ability.extra.chips - self.ability.extra.chip_mod + return { + message = localize{type='variable',key='a_chips_minus',vars={self.ability.extra.chip_mod}}, + colour = G.C.CHIPS + } + end + end + if self.ability.name == 'Seltzer' and not context.blueprint then + if self.ability.extra - 1 <= 0 then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound('tarot1') + self.T.r = -0.2 + self:juice_up(0.3, 0.4) + self.states.drag.is = true + self.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false, + func = function() + G.jokers:remove_card(self) + self:remove() + self = nil + return true; end})) + return true + end + })) + return { + message = localize('k_drank_ex'), + colour = G.C.FILTER + } + else + self.ability.extra = self.ability.extra - 1 + return { + message = self.ability.extra..'', + colour = G.C.FILTER + } + end + end + else + if self.ability.name == 'Loyalty Card' then + self.ability.loyalty_remaining = (self.ability.extra.every-1-(G.GAME.hands_played - self.ability.hands_played_at_create))%(self.ability.extra.every+1) + if context.blueprint then + if self.ability.loyalty_remaining == self.ability.extra.every then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}}, + Xmult_mod = self.ability.extra.Xmult + } + end + else + if self.ability.loyalty_remaining == 0 then + local eval = function(card) return (card.ability.loyalty_remaining == 0) end + juice_card_until(self, eval, true) + elseif self.ability.loyalty_remaining == self.ability.extra.every then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}}, + Xmult_mod = self.ability.extra.Xmult + } + end + end + end + if self.ability.name ~= 'Seeing Double' and self.ability.x_mult > 1 and (self.ability.type == '' or next(context.poker_hands[self.ability.type])) then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}, + colour = G.C.RED, + Xmult_mod = self.ability.x_mult + } + end + if self.ability.t_mult > 0 and next(context.poker_hands[self.ability.type]) then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.t_mult}}, + mult_mod = self.ability.t_mult + } + end + if self.ability.t_chips > 0 and next(context.poker_hands[self.ability.type]) then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.t_chips}}, + chip_mod = self.ability.t_chips + } + end + if self.ability.name == 'Half Joker' and #context.full_hand <= self.ability.extra.size then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.extra.mult}}, + mult_mod = self.ability.extra.mult + } + end + if self.ability.name == 'Abstract Joker' then + local x = 0 + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.set == 'Joker' then x = x + 1 end + end + return { + message = localize{type='variable',key='a_mult',vars={x*self.ability.extra}}, + mult_mod = x*self.ability.extra + } + end + if self.ability.name == 'Acrobat' and G.GAME.current_round.hands_left == 0 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + if self.ability.name == 'Mystic Summit' and G.GAME.current_round.discards_left == self.ability.extra.d_remaining then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.extra.mult}}, + mult_mod = self.ability.extra.mult + } + end + if self.ability.name == 'Misprint' then + local temp_Mult = pseudorandom('misprint', self.ability.extra.min, self.ability.extra.max) + return { + message = localize{type='variable',key='a_mult',vars={temp_Mult}}, + mult_mod = temp_Mult + } + end + if self.ability.name == 'Banner' and G.GAME.current_round.discards_left > 0 then + return { + message = localize{type='variable',key='a_chips',vars={G.GAME.current_round.discards_left*self.ability.extra}}, + chip_mod = G.GAME.current_round.discards_left*self.ability.extra + } + end + if self.ability.name == 'Stuntman' then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chip_mod}}, + chip_mod = self.ability.extra.chip_mod, + } + end + if self.ability.name == 'Matador' then + if G.GAME.blind.triggered then + ease_dollars(self.ability.extra) + G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra + G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) + return { + message = localize('$')..self.ability.extra, + dollars = self.ability.extra, + colour = G.C.MONEY + } + end + end + if self.ability.name == 'Supernova' then + return { + message = localize{type='variable',key='a_mult',vars={G.GAME.hands[context.scoring_name].played}}, + mult_mod = G.GAME.hands[context.scoring_name].played + } + end + if self.ability.name == 'Ceremonial Dagger' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == '8 Ball' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + local eights = 0 + for i = 1, #context.full_hand do + if context.full_hand[i]:get_id() == 8 then eights = eights + 1 end + end + if eights >= self.ability.extra then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Planet',G.consumeables, nil, nil, nil, nil, nil, '8ba') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + return { + message = localize('k_plus_planet'), + colour = G.C.SECONDARY_SET.Planet, + card = self + } + end + end + if self.ability.name == 'Vagabond' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + if G.GAME.dollars <= self.ability.extra then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, 'vag') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + return { + message = localize('k_plus_tarot'), + card = self + } + end + end + if self.ability.name == 'Superposition' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + local aces = 0 + for i = 1, #context.scoring_hand do + if context.scoring_hand[i]:get_id() == 14 then aces = aces + 1 end + end + if aces >= 1 and next(context.poker_hands["Straight"]) then + local card_type = 'Tarot' + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card(card_type,G.consumeables, nil, nil, nil, nil, nil, 'sup') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + return { + message = localize('k_plus_tarot'), + colour = G.C.SECONDARY_SET.Tarot, + card = self + } + end + end + if self.ability.name == 'Seance' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + if next(context.poker_hands[self.ability.extra.poker_hand]) then + G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.0, + func = (function() + local card = create_card('Spectral',G.consumeables, nil, nil, nil, nil, nil, 'sea') + card:add_to_deck() + G.consumeables:emplace(card) + G.GAME.consumeable_buffer = 0 + return true + end)})) + return { + message = localize('k_plus_spectral'), + colour = G.C.SECONDARY_SET.Spectral, + card = self + } + end + end + if self.ability.name == 'Flower Pot' then + local suits = { + ['Hearts'] = 0, + ['Diamonds'] = 0, + ['Spades'] = 0, + ['Clubs'] = 0 + } + for i = 1, #context.scoring_hand do + if context.scoring_hand[i].ability.name ~= 'Wild Card' then + if context.scoring_hand[i]:is_suit('Hearts') and suits["Hearts"] == 0 then suits["Hearts"] = suits["Hearts"] + 1 + elseif context.scoring_hand[i]:is_suit('Diamonds') and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 1 + elseif context.scoring_hand[i]:is_suit('Spades') and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 1 + elseif context.scoring_hand[i]:is_suit('Clubs') and suits["Clubs"] == 0 then suits["Clubs"] = suits["Clubs"] + 1 end + end + end + for i = 1, #context.scoring_hand do + if context.scoring_hand[i].ability.name == 'Wild Card' then + if context.scoring_hand[i]:is_suit('Hearts') and suits["Hearts"] == 0 then suits["Hearts"] = suits["Hearts"] + 1 + elseif context.scoring_hand[i]:is_suit('Diamonds') and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 1 + elseif context.scoring_hand[i]:is_suit('Spades') and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 1 + elseif context.scoring_hand[i]:is_suit('Clubs') and suits["Clubs"] == 0 then suits["Clubs"] = suits["Clubs"] + 1 end + end + end + if suits["Hearts"] > 0 and + suits["Diamonds"] > 0 and + suits["Spades"] > 0 and + suits["Clubs"] > 0 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + end + if self.ability.name == 'Seeing Double' then + local suits = { + ['Hearts'] = 0, + ['Diamonds'] = 0, + ['Spades'] = 0, + ['Clubs'] = 0 + } + for i = 1, #context.scoring_hand do + if context.scoring_hand[i].ability.name ~= 'Wild Card' then + if context.scoring_hand[i]:is_suit('Hearts') then suits["Hearts"] = suits["Hearts"] + 1 end + if context.scoring_hand[i]:is_suit('Diamonds') then suits["Diamonds"] = suits["Diamonds"] + 1 end + if context.scoring_hand[i]:is_suit('Spades') then suits["Spades"] = suits["Spades"] + 1 end + if context.scoring_hand[i]:is_suit('Clubs') then suits["Clubs"] = suits["Clubs"] + 1 end + end + end + for i = 1, #context.scoring_hand do + if context.scoring_hand[i].ability.name == 'Wild Card' then + if context.scoring_hand[i]:is_suit('Clubs') and suits["Clubs"] == 0 then suits["Clubs"] = suits["Clubs"] + 1 + elseif context.scoring_hand[i]:is_suit('Diamonds') and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 1 + elseif context.scoring_hand[i]:is_suit('Spades') and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 1 + elseif context.scoring_hand[i]:is_suit('Hearts') and suits["Hearts"] == 0 then suits["Hearts"] = suits["Hearts"] + 1 end + end + end + if (suits["Hearts"] > 0 or + suits["Diamonds"] > 0 or + suits["Spades"] > 0) and + suits["Clubs"] > 0 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + end + if self.ability.name == 'Wee Joker' then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chips}}, + chip_mod = self.ability.extra.chips, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Castle' and (self.ability.extra.chips > 0) then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chips}}, + chip_mod = self.ability.extra.chips, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Blue Joker' and #G.deck.cards > 0 then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra*#G.deck.cards}}, + chip_mod = self.ability.extra*#G.deck.cards, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Erosion' and (G.GAME.starting_deck_size - #G.playing_cards) > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.extra*(G.GAME.starting_deck_size - #G.playing_cards)}}, + mult_mod = self.ability.extra*(G.GAME.starting_deck_size - #G.playing_cards), + colour = G.C.MULT + } + end + if self.ability.name == 'Square Joker' then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chips}}, + chip_mod = self.ability.extra.chips, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Runner' then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chips}}, + chip_mod = self.ability.extra.chips, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Ice Cream' then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra.chips}}, + chip_mod = self.ability.extra.chips, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Stone Joker' and self.ability.stone_tally > 0 then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra*self.ability.stone_tally}}, + chip_mod = self.ability.extra*self.ability.stone_tally, + colour = G.C.CHIPS + } + end + if self.ability.name == 'Steel Joker' and self.ability.steel_tally > 0 then + return { + message = localize{type='variable',key='a_xmult',vars={1 + self.ability.extra*self.ability.steel_tally}}, + Xmult_mod = 1 + self.ability.extra*self.ability.steel_tally, + colour = G.C.MULT + } + end + if self.ability.name == 'Bull' and (G.GAME.dollars + (G.GAME.dollar_buffer or 0)) > 0 then + return { + message = localize{type='variable',key='a_chips',vars={self.ability.extra*math.max(0,(G.GAME.dollars + (G.GAME.dollar_buffer or 0))) }}, + chip_mod = self.ability.extra*math.max(0,(G.GAME.dollars + (G.GAME.dollar_buffer or 0))), + colour = G.C.CHIPS + } + end + if self.ability.name == "Driver's License" then + if (self.ability.driver_tally or 0) >= 16 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + end + if self.ability.name == "Blackboard" then + local black_suits, all_cards = 0, 0 + for k, v in ipairs(G.hand.cards) do + all_cards = all_cards + 1 + if v:is_suit('Clubs', nil, true) or v:is_suit('Spades', nil, true) then + black_suits = black_suits + 1 + end + end + if black_suits == all_cards then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra}}, + Xmult_mod = self.ability.extra + } + end + end + if self.ability.name == "Joker Stencil" then + if (G.jokers.config.card_limit - #G.jokers.cards) > 0 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}, + Xmult_mod = self.ability.x_mult + } + end + end + if self.ability.name == 'Swashbuckler' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Joker' then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Spare Trousers' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Ride the Bus' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Flash Card' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Popcorn' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Green Joker' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Fortune Teller' and G.GAME.consumeable_usage_total and G.GAME.consumeable_usage_total.tarot > 0 then + return { + message = localize{type='variable',key='a_mult',vars={G.GAME.consumeable_usage_total.tarot}}, + mult_mod = G.GAME.consumeable_usage_total.tarot + } + end + if self.ability.name == 'Gros Michel' then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.extra.mult}}, + mult_mod = self.ability.extra.mult, + } + end + if self.ability.name == 'Cavendish' then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}}, + Xmult_mod = self.ability.extra.Xmult, + } + end + if self.ability.name == 'Red Card' and self.ability.mult > 0 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.mult}}, + mult_mod = self.ability.mult + } + end + if self.ability.name == 'Card Sharp' and G.GAME.hands[context.scoring_name] and G.GAME.hands[context.scoring_name].played_this_round > 1 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra.Xmult}}, + Xmult_mod = self.ability.extra.Xmult, + } + end + if self.ability.name == 'Bootstraps' and math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars) >= 1 then + return { + message = localize{type='variable',key='a_mult',vars={self.ability.extra.mult*math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars)}}, + mult_mod = self.ability.extra.mult*math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars) + } + end + if self.ability.name == 'Caino' and self.ability.caino_xmult > 1 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.caino_xmult}}, + Xmult_mod = self.ability.caino_xmult + } + end + if self.ability.name == 'Yorick' and self.ability.yorick_discards <= 0 then + return { + message = localize{type='variable',key='a_xmult',vars={self.ability.extra.xmult}}, + Xmult_mod = self.ability.extra.xmult, + colour = G.C.RED, + card = self + } + end + end + end + end + end + end + +function Card:is_suit(suit, bypass_debuff, flush_calc) + if flush_calc then + if self.ability.effect == 'Stone Card' then + return false + end + if self.ability.name == "Wild Card" and not self.debuff then + return true + end + if next(find_joker('Smeared Joker')) and (self.base.suit == 'Hearts' or self.base.suit == 'Diamonds') == (suit == 'Hearts' or suit == 'Diamonds') then + return true + end + return self.base.suit == suit + else + if self.debuff and not bypass_debuff then return end + if self.ability.effect == 'Stone Card' then + return false + end + if self.ability.name == "Wild Card" then + return true + end + if next(find_joker('Smeared Joker')) and (self.base.suit == 'Hearts' or self.base.suit == 'Diamonds') == (suit == 'Hearts' or suit == 'Diamonds') then + return true + end + return self.base.suit == suit + end +end + +function Card:set_card_area(area) + self.area = area + self.parent = area + self.layered_parallax = area.layered_parallax +end + +function Card:remove_from_area() + self.area = nil + self.parent = nil + self.layered_parallax = {x = 0, y = 0} +end + +function Card:align() + if self.children.floating_sprite then + self.children.floating_sprite.T.y = self.T.y + self.children.floating_sprite.T.x = self.T.x + self.children.floating_sprite.T.r = self.T.r + end + + if self.children.focused_ui then self.children.focused_ui:set_alignment() end +end + +function Card:flip() + if self.facing == 'front' then + self.flipping = 'f2b' + self.facing='back' + self.pinch.x = true + elseif self.facing == 'back' then + self.ability.wheel_flipped = nil + self.flipping = 'b2f' + self.facing='front' + self.pinch.x = true + end +end + +function Card:update(dt) + if self.flipping == 'f2b' then + if self.sprite_facing == 'front' or true then + if self.VT.w <= 0 then + self.sprite_facing = 'back' + self.pinch.x =false + end + end + end + if self.flipping == 'b2f' then + if self.sprite_facing == 'back' or true then + if self.VT.w <= 0 then + self.sprite_facing = 'front' + self.pinch.x =false + end + end + end + + if not self.states.focus.is and self.children.focused_ui then + self.children.focused_ui:remove() + self.children.focused_ui = nil + end + if self.cost then self.DEBUG_VALUE = self.cost end + + self:update_alert() + if self.ability.consumeable and self.ability.consumeable.max_highlighted then + self.ability.consumeable.mod_num = math.min(5, self.ability.consumeable.max_highlighted) + end + if G.STAGE == G.STAGES.RUN then + if self.ability and self.ability.perma_debuff then self.debuff = true end + + if false then + local display_overwrite_text = nil + local con = nil + if self.highlighted and self.area == G.hand and G.consumeables.highlighted[1] then + con = G.consumeables.highlighted[1] + if con.config.center.config.mod_conv and con:can_use_consumeable() then + display_overwrite_text = true + end + end + + if display_overwrite_text and not self.children.overwrite then + local eval = function(card) return not not card.children.overwrite end + juice_card_until(self, eval, true) + + local front = G.P_CARDS[self.config.card_key] + local center = G.P_CENTERS[con.ability.consumeable.mod_conv or self.config.center_key] + + self.children.overwrite = Card(0,0, G.CARD_W, G.CARD_H, front, center) + self.children.overwrite:set_role({major = self, role_type = 'Glued', draw_major = self}) + self.children.overwrite.states.collide.can = false + self.children.overwrite.parent = self + elseif self.children.overwrite and not display_overwrite_text then + self.children.overwrite:remove() + self.children.overwrite = nil + end + end + + if self.area and ((self.area == G.jokers) or (self.area == G.consumeables)) then + self.bypass_lock = true + self.bypass_discovery_center = true + self.bypass_discovery_ui = true + end + self.sell_cost_label = self.facing == 'back' and '?' or self.sell_cost + + if self.ability.name == 'Temperance' then + self.ability.money = 0 + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.set == 'Joker' then + self.ability.money = self.ability.money + G.jokers.cards[i].sell_cost + end + end + self.ability.money = math.min(self.ability.money, self.ability.extra) + end + if self.ability.name == 'Throwback' then + self.ability.x_mult = 1 + G.GAME.skips*self.ability.extra + end + if self.ability.name == "Driver's License" then + self.ability.driver_tally = 0 + for k, v in pairs(G.playing_cards) do + if v.config.center ~= G.P_CENTERS.c_base then self.ability.driver_tally = self.ability.driver_tally+1 end + end + end + if self.ability.name == "Steel Joker" then + self.ability.steel_tally = 0 + for k, v in pairs(G.playing_cards) do + if v.config.center == G.P_CENTERS.m_steel then self.ability.steel_tally = self.ability.steel_tally+1 end + end + end + if self.ability.name == "Cloud 9" then + self.ability.nine_tally = 0 + for k, v in pairs(G.playing_cards) do + if v:get_id() == 9 then self.ability.nine_tally = self.ability.nine_tally+1 end + end + end + if self.ability.name == "Stone Joker" then + self.ability.stone_tally = 0 + for k, v in pairs(G.playing_cards) do + if v.config.center == G.P_CENTERS.m_stone then self.ability.stone_tally = self.ability.stone_tally+1 end + end + end + if self.ability.name == "Joker Stencil" then + self.ability.x_mult = (G.jokers.config.card_limit - #G.jokers.cards) + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.name == 'Joker Stencil' then self.ability.x_mult = self.ability.x_mult + 1 end + end + end + if self.ability.name == 'The Wheel of Fortune' then + self.eligible_strength_jokers = EMPTY(self.eligible_strength_jokers) + for k, v in pairs(G.jokers.cards) do + if v.ability.set == 'Joker' and (not v.edition) then + table.insert(self.eligible_strength_jokers, v) + end + end + end + if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' then + self.eligible_editionless_jokers = EMPTY(self.eligible_editionless_jokers) + for k, v in pairs(G.jokers.cards) do + if v.ability.set == 'Joker' and (not v.edition) then + table.insert(self.eligible_editionless_jokers, v) + end + end + end + if self.ability.name == 'Blueprint' or self.ability.name == 'Brainstorm' then + local other_joker = nil + if self.ability.name == 'Brainstorm' then + other_joker = G.jokers.cards[1] + elseif self.ability.name == 'Blueprint' then + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] == self then other_joker = G.jokers.cards[i+1] end + end + end + if other_joker and other_joker ~= self and other_joker.config.center.blueprint_compat then + self.ability.blueprint_compat = 'compatible' + else + self.ability.blueprint_compat = 'incompatible' + end + end + if self.ability.name == 'Swashbuckler' then + local sell_cost = 0 + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] == self or (self.area and (self.area ~= G.jokers)) then break end + sell_cost = sell_cost + G.jokers.cards[i].sell_cost + end + self.ability.mult = sell_cost + end + else + if self.ability.name == 'Temperance' then + self.ability.money = 0 + end + end +end + +function Card:hard_set_T(X, Y, W, H) + local x = (X or self.T.x) + local y = (Y or self.T.y) + local w = (W or self.T.w) + local h = (H or self.T.h) + Moveable.hard_set_T(self,x, y, w, h) + if self.children.front then self.children.front:hard_set_T(x, y, w, h) end + self.children.back:hard_set_T(x, y, w, h) + self.children.center:hard_set_T(x, y, w, h) +end + +function Card:move(dt) + Moveable.move(self, dt) + --self:align() + if self.children.h_popup then + self.children.h_popup:set_alignment(self:align_h_popup()) + end +end + +function Card:align_h_popup() + local focused_ui = self.children.focused_ui and true or false + local popup_direction = (self.children.buy_button or (self.area and self.area.config.view_deck) or (self.area and self.area.config.type == 'shop')) and 'cl' or + (self.T.y < G.CARD_H*0.8) and 'bm' or + 'tm' + return { + major = self.children.focused_ui or self, + parent = self, + xy_bond = 'Strong', + r_bond = 'Weak', + wh_bond = 'Weak', + offset = { + x = popup_direction ~= 'cl' and 0 or + focused_ui and -0.05 or + (self.ability.consumeable and 0.0) or + (self.ability.set == 'Voucher' and 0.0) or + -0.05, + y = focused_ui and ( + popup_direction == 'tm' and (self.area and self.area == G.hand and -0.08 or-0.15) or + popup_direction == 'bm' and 0.12 or + 0 + ) or + popup_direction == 'tm' and -0.13 or + popup_direction == 'bm' and 0.1 or + 0 + }, + type = popup_direction, + } +end + +function Card:hover() + self:juice_up(0.05, 0.03) + play_sound('paper1', math.random()*0.2 + 0.9, 0.35) + + --if this is the focused card + if self.states.focus.is and not self.children.focused_ui then + self.children.focused_ui = G.UIDEF.card_focus_ui(self) + end + + if self.facing == 'front' and (not self.states.drag.is or G.CONTROLLER.HID.touch) and not self.no_ui and not G.debug_tooltip_toggle then + if self.children.alert and not self.config.center.alerted then + self.config.center.alerted = true + G:save_progress() + end + + self.ability_UIBox_table = self:generate_UIBox_ability_table() + self.config.h_popup = G.UIDEF.card_h_popup(self) + self.config.h_popup_config = self:align_h_popup() + + Node.hover(self) + end +end + +function Card:stop_hover() + Node.stop_hover(self) +end + +function Card:juice_up(scale, rot_amount) + --G.VIBRATION = G.VIBRATION + 0.4 + local rot_amt = rot_amount and 0.4*pseudorandom_element({rot_amount, -rot_amount}) or pseudorandom_element({0.16, -0.16}) + scale = scale and scale*0.4 or 0.11 + Moveable.juice_up(self, scale, rot_amt) +end + +function Card:draw(layer) + layer = layer or 'both' + + self.hover_tilt = 1 + + if not self.states.visible then return end + + if (layer == 'shadow' or layer == 'both') then + self.ARGS.send_to_shader = self.ARGS.send_to_shader or {} + self.ARGS.send_to_shader[1] = math.min(self.VT.r*3, 1) + G.TIMERS.REAL/(28) + (self.juice and self.juice.r*20 or 0) + self.tilt_var.amt + self.ARGS.send_to_shader[2] = G.TIMERS.REAL + + for k, v in pairs(self.children) do + v.VT.scale = self.VT.scale + end + end + + G.shared_shadow = self.sprite_facing == 'front' and self.children.center or self.children.back + + --Draw the shadow + if not self.no_shadow and G.SETTINGS.GRAPHICS.shadows == 'On' and((layer == 'shadow' or layer == 'both') and (self.ability.effect ~= 'Glass Card' and not self.greyed) and ((self.area and self.area ~= G.discard and self.area.config.type ~= 'deck') or not self.area or self.states.drag.is)) then + self.shadow_height = 0*(0.08 + 0.4*math.sqrt(self.velocity.x^2)) + ((((self.highlighted and self.area == G.play) or self.states.drag.is) and 0.35) or (self.area and self.area.config.type == 'title_2') and 0.04 or 0.1) + G.shared_shadow:draw_shader('dissolve', self.shadow_height) + end + + if (layer == 'card' or layer == 'both') and self.area ~= G.hand then + if self.children.focused_ui then self.children.focused_ui:draw() end + end + + if (layer == 'card' or layer == 'both') then + -- for all hover/tilting: + self.tilt_var = self.overwrite_tilt_var or self.tilt_var or {mx = 0, my = 0, dx = self.tilt_var.dx or 0, dy = self.tilt_var.dy or 0, amt = 0} + local tilt_factor = 0.3 + if not self.overwrite_tilt_var then + if self.states.focus.is then + self.tilt_var.mx, self.tilt_var.my = G.CONTROLLER.cursor_position.x + self.tilt_var.dx*self.T.w*G.TILESCALE*G.TILESIZE, G.CONTROLLER.cursor_position.y + self.tilt_var.dy*self.T.h*G.TILESCALE*G.TILESIZE + self.tilt_var.amt = math.abs(self.hover_offset.y + self.hover_offset.x - 1 + self.tilt_var.dx + self.tilt_var.dy - 1)*tilt_factor + elseif self.states.hover.is then + self.tilt_var.mx, self.tilt_var.my = G.CONTROLLER.cursor_position.x, G.CONTROLLER.cursor_position.y + self.tilt_var.amt = math.abs(self.hover_offset.y + self.hover_offset.x - 1)*tilt_factor + elseif self.ambient_tilt then + local tilt_angle = G.TIMERS.REAL*(1.56 + (self.ID/1.14212)%1) + self.ID/1.35122 + self.tilt_var.mx = ((0.5 + 0.5*self.ambient_tilt*math.cos(tilt_angle))*self.VT.w+self.VT.x+G.ROOM.T.x)*G.TILESIZE*G.TILESCALE + self.tilt_var.my = ((0.5 + 0.5*self.ambient_tilt*math.sin(tilt_angle))*self.VT.h+self.VT.y+G.ROOM.T.y)*G.TILESIZE*G.TILESCALE + self.tilt_var.amt = self.ambient_tilt*(0.5+math.cos(tilt_angle))*tilt_factor + end + end + --Any particles + if self.children.particles then self.children.particles:draw() end + + --Draw any tags/buttons + if self.children.price then self.children.price:draw() end + if self.children.buy_button then + if self.highlighted then + self.children.buy_button.states.visible = true + self.children.buy_button:draw() + if self.children.buy_and_use_button then + self.children.buy_and_use_button:draw() + end + else + self.children.buy_button.states.visible = false + end + end + if self.children.use_button and self.highlighted then self.children.use_button:draw() end + + if self.vortex then + if self.facing == 'back' then + self.children.back:draw_shader('vortex') + else + self.children.center:draw_shader('vortex') + if self.children.front then + self.children.front:draw_shader('vortex') + end + end + + love.graphics.setShader() + elseif self.sprite_facing == 'front' then + --Draw the main part of the card + if (self.edition and self.edition.negative) or (self.ability.name == 'Antimatter' and (self.config.center.discovered or self.bypass_discovery_center)) then + self.children.center:draw_shader('negative', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('negative', nil, self.ARGS.send_to_shader) + end + elseif not self.greyed then + self.children.center:draw_shader('dissolve') + --If the card has a front, draw that next + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('dissolve') + end + end + + --If the card is not yet discovered + if not self.config.center.discovered and (self.ability.consumeable or self.config.center.unlocked) and not self.config.center.demo and not self.bypass_discovery_center then + local shared_sprite = (self.ability.set == 'Edition' or self.ability.set == 'Joker') and G.shared_undiscovered_joker or G.shared_undiscovered_tarot + local scale_mod = -0.05 + 0.05*math.sin(1.8*G.TIMERS.REAL) + local rotate_mod = 0.03*math.sin(1.219*G.TIMERS.REAL) + + shared_sprite.role.draw_major = self + shared_sprite:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod) + end + + if self.ability.name == 'Invisible Joker' and (self.config.center.discovered or self.bypass_discovery_center) then + self.children.center:draw_shader('voucher', nil, self.ARGS.send_to_shader) + end + + --If the card has any edition/seal, add that here + if self.edition or self.seal or self.ability.eternal or self.sticker or self.ability.set == 'Spectral' or self.debuff or self.greyed or self.ability.name == 'The Soul' or self.ability.set == 'Voucher' or self.ability.set == 'Booster' or self.config.center.soul_pos or self.config.center.demo then + if (self.ability.set == 'Voucher' or self.config.center.demo) and (self.ability.name ~= 'Antimatter' or not (self.config.center.discovered or self.bypass_discovery_center)) then + self.children.center:draw_shader('voucher', nil, self.ARGS.send_to_shader) + end + if self.ability.set == 'Booster' or self.ability.set == 'Spectral' then + self.children.center:draw_shader('booster', nil, self.ARGS.send_to_shader) + end + if self.edition and self.edition.holo then + self.children.center:draw_shader('holo', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('holo', nil, self.ARGS.send_to_shader) + end + end + if self.edition and self.edition.foil then + self.children.center:draw_shader('foil', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('foil', nil, self.ARGS.send_to_shader) + end + end + if self.edition and self.edition.polychrome then + self.children.center:draw_shader('polychrome', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('polychrome', nil, self.ARGS.send_to_shader) + end + end + if (self.edition and self.edition.negative) or (self.ability.name == 'Antimatter' and (self.config.center.discovered or self.bypass_discovery_center)) then + self.children.center:draw_shader('negative_shine', nil, self.ARGS.send_to_shader) + end + if self.seal then + G.shared_seals[self.seal].role.draw_major = self + G.shared_seals[self.seal]:draw_shader('dissolve', nil, nil, nil, self.children.center) + if self.seal == 'Gold' then G.shared_seals[self.seal]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) end + end + if self.ability.eternal then + G.shared_sticker_eternal.role.draw_major = self + G.shared_sticker_eternal:draw_shader('dissolve', nil, nil, nil, self.children.center) + G.shared_sticker_eternal:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) + end + if self.sticker and G.shared_stickers[self.sticker] then + G.shared_stickers[self.sticker].role.draw_major = self + G.shared_stickers[self.sticker]:draw_shader('dissolve', nil, nil, nil, self.children.center) + G.shared_stickers[self.sticker]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) + end + + if self.ability.name == 'The Soul' and (self.config.center.discovered or self.bypass_discovery_center) then + local scale_mod = 0.05 + 0.05*math.sin(1.8*G.TIMERS.REAL) + 0.07*math.sin((G.TIMERS.REAL - math.floor(G.TIMERS.REAL))*math.pi*14)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^3 + local rotate_mod = 0.1*math.sin(1.219*G.TIMERS.REAL) + 0.07*math.sin((G.TIMERS.REAL)*math.pi*5)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^2 + + G.shared_soul.role.draw_major = self + G.shared_soul:draw_shader('dissolve',0, nil, nil, self.children.center,scale_mod, rotate_mod,nil, 0.1 + 0.03*math.sin(1.8*G.TIMERS.REAL),nil, 0.6) + G.shared_soul:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod) + end + + if self.config.center.soul_pos and (self.config.center.discovered or self.bypass_discovery_center) then + local scale_mod = 0.07 + 0.02*math.sin(1.8*G.TIMERS.REAL) + 0.00*math.sin((G.TIMERS.REAL - math.floor(G.TIMERS.REAL))*math.pi*14)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^3 + local rotate_mod = 0.05*math.sin(1.219*G.TIMERS.REAL) + 0.00*math.sin((G.TIMERS.REAL)*math.pi*5)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^2 + + if self.ability.name == 'Hologram' then + self.hover_tilt = self.hover_tilt*1.5 + self.children.floating_sprite:draw_shader('hologram', nil, self.ARGS.send_to_shader, nil, self.children.center, 2*scale_mod, 2*rotate_mod) + self.hover_tilt = self.hover_tilt/1.5 + else + self.children.floating_sprite:draw_shader('dissolve',0, nil, nil, self.children.center,scale_mod, rotate_mod,nil, 0.1 + 0.03*math.sin(1.8*G.TIMERS.REAL),nil, 0.6) + self.children.floating_sprite:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod) + end + + end + if self.debuff then + self.children.center:draw_shader('debuff', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('debuff', nil, self.ARGS.send_to_shader) + end + end + if self.greyed then + self.children.center:draw_shader('played', nil, self.ARGS.send_to_shader) + if self.children.front and self.ability.effect ~= 'Stone Card' then + self.children.front:draw_shader('played', nil, self.ARGS.send_to_shader) + end + end + end + elseif self.sprite_facing == 'back' then + local overlay = G.C.WHITE + if self.area and self.area.config.type == 'deck' and self.rank > 3 then + overlay = {0.5 + ((#self.area.cards - self.rank)%7)/50, 0.5 + ((#self.area.cards - self.rank)%7)/50, 0.5 +((#self.area.cards - self.rank)%7)/50, 1} + end + + if self.area and self.area.config.type == 'deck' then + self.children.back:draw(overlay) + else + self.children.back:draw_shader('dissolve') + end + + if self.sticker and G.shared_stickers[self.sticker] then + G.shared_stickers[self.sticker].role.draw_major = self + G.shared_stickers[self.sticker]:draw_shader('dissolve', nil, nil, true, self.children.center) + if self.sticker == 'Gold' then G.shared_stickers[self.sticker]:draw_shader('voucher', nil, self.ARGS.send_to_shader, true, self.children.center) end + end + end + + if self.children.overwrite and self.tilt_var then + + self.children.overwrite.overwrite_tilt_var = copy_table(self.tilt_var) + + end + + for k, v in pairs(self.children) do + if k ~= 'focused_ui' and k ~= "front" and k ~= "overwrite" and k ~= "back" and k ~= "soul_parts" and k ~= "center" and k ~= 'floating_sprite' and k~= "shadow" and k~= "use_button" and k ~= 'buy_button' and k ~= 'buy_and_use_button' and k~= "debuff" and k ~= 'price' and k~= 'particles' and k ~= 'h_popup' then v:draw() end + end + + if self.children.overwrite then + love.graphics.push() + love.graphics.setColor(G.C.BLUE) + G.BRUTE_OVERLAY = {1,1,1,math.sin(5*G.TIMERS.REAL)} + self.children.overwrite:draw('card') + G.BRUTE_OVERLAY = nil + love.graphics.pop() + end + + if (layer == 'card' or layer == 'both') and self.area == G.hand then + if self.children.focused_ui then self.children.focused_ui:draw() end + end + + add_to_drawhash(self) + self:draw_boundingrect() + end +end + +function Card:release(dragged) + if dragged:is(Card) and self.area then + self.area:release(dragged) + end +end + +function Card:highlight(is_higlighted) + self.highlighted = is_higlighted + if self.ability.consumeable or self.ability.set == 'Joker' or (self.area and self.area == G.pack_cards) then + if self.highlighted and self.area and self.area.config.type ~= 'shop' then + local x_off = (self.ability.consumeable and -0.1 or 0) + self.children.use_button = UIBox{ + definition = G.UIDEF.use_and_sell_buttons(self), + config = {align= + ((self.area == G.jokers) or (self.area == G.consumeables)) and "cr" or + "bmi" + , offset = + ((self.area == G.jokers) or (self.area == G.consumeables)) and {x=x_off - 0.4,y=0} or + {x=0,y=0.65}, + parent =self} + } + elseif self.children.use_button then + self.children.use_button:remove() + self.children.use_button = nil + end + end + if self.ability.consumeable or self.ability.set == 'Joker' then + if not self.highlighted and self.area and self.area.config.type == 'joker' and + (#G.jokers.cards >= G.jokers.config.card_limit or (self.edition and self.edition.negative)) then + if G.shop_jokers then G.shop_jokers:unhighlight_all() end + end + end +end + +function Card:click() + if self.area and self.area:can_highlight(self) then + if (self.area == G.hand) and (G.STATE == G.STATES.HAND_PLAYED) then return end + if self.highlighted ~= true then + self.area:add_to_highlighted(self) + else + self.area:remove_from_highlighted(self) + play_sound('cardSlide2', nil, 0.3) + end + end + if self.area and self.area == G.deck and self.area.cards[1] == self then + G.FUNCS.deck_info() + end +end + +function Card:save() + cardTable = { + sort_id = self.sort_id, + save_fields = { + center = self.config.center_key, + card = self.config.card_key, + }, + params = self.params, + no_ui = self.no_ui, + base_cost = self.base_cost, + extra_cost = self.extra_cost, + cost = self.cost, + sell_cost = self.sell_cost, + facing = self.facing, + sprite_facing = self.facing, + flipping = nil, + highlighted = self.highligted, + debuff = self.debuff, + rank = self.rank, + added_to_deck = self.added_to_deck, + label = self.label, + playing_card = self.playing_card, + base = self.base, + ability = self.ability, + pinned = self.pinned, + edition = self.edition, + seal = self.seal, + bypass_discovery_center = self.bypass_discovery_center, + bypass_discovery_ui = self.bypass_discovery_ui, + bypass_lock = self.bypass_lock, + } + return cardTable +end + +function Card:load(cardTable, other_card) + local scale = 1 + self.config = {} + self.config.center_key = cardTable.save_fields.center + self.config.center = G.P_CENTERS[self.config.center_key] + self.params = cardTable.params + + local H = G.CARD_H + local W = G.CARD_W + if self.config.center.name == "Half Joker" then + self.T.h = H*scale/1.7*scale + self.T.w = W*scale + elseif self.config.center.name == "Wee Joker" then + self.T.h = H*scale*0.7*scale + self.T.w = W*scale*0.7*scale + elseif self.config.center.name == "Photograph" then + self.T.h = H*scale/1.2*scale + self.T.w = W*scale + elseif self.config.center.set == 'Booster' then + self.T.h = H*1.27 + self.T.w = W*1.27 + else + self.T.h = H*scale + self.T.w = W*scale + end + self.VT.h = self.T.H + self.VT.w = self.T.w + + self.config.card_key = cardTable.save_fields.card + self.config.card = G.P_CARDS[self.config.card_key] + + self.no_ui = cardTable.no_ui + self.base_cost = cardTable.base_cost + self.extra_cost = cardTable.extra_cost + self.cost = cardTable.cost + self.sell_cost = cardTable.sell_cost + self.facing = cardTable.facing + self.sprite_facing = cardTable.sprite_facing + self.flipping = cardTable.flipping + self.highlighted = cardTable.highlighted + self.debuff = cardTable.debuff + self.rank = cardTable.rank + self.added_to_deck = cardTable.added_to_deck + self.label = cardTable.label + self.playing_card = cardTable.playing_card + self.base = cardTable.base + self.sort_id = cardTable.sort_id + self.bypass_discovery_center = cardTable.bypass_discovery_center + self.bypass_discovery_ui = cardTable.bypass_discovery_ui + self.bypass_lock = cardTable.bypass_lock + + self.ability = cardTable.ability + self.pinned = cardTable.pinned + self.edition = cardTable.edition + self.seal = cardTable.seal + + remove_all(self.children) + self.children = {} + self.children.shadow = Moveable(0, 0, 0, 0) + + self:set_sprites(self.config.center, self.config.card) +end + +function Card:remove() + self.removed = true + + if self.area then self.area:remove_card(self) end + + self:remove_from_deck() + + if not G.OVERLAY_MENU then + for k, v in pairs(G.P_CENTERS) do + if v.name == self.ability.name then + if not next(find_joker(self.ability.name, true)) then + G.GAME.used_jokers[k] = nil + end + end + end + end + + if G.playing_cards then + for k, v in ipairs(G.playing_cards) do + if v == self then + table.remove(G.playing_cards, k) + break + end + end + for k, v in ipairs(G.playing_cards) do + v.playing_card = k + end + end + + remove_all(self.children) + + for k, v in pairs(G.I.CARD) do + if v == self then + table.remove(G.I.CARD, k) + end + end + Moveable.remove(self) +end diff --git a/card_character.lua b/card_character.lua new file mode 100644 index 0000000..6404668 --- /dev/null +++ b/card_character.lua @@ -0,0 +1,164 @@ +--class +Card_Character = Moveable:extend() + +--class methods +function Card_Character:init(args) + Moveable.init(self,args.x or 1, args.y or 1, args.w or G.CARD_W*1.1, args.h or G.CARD_H*1.1) + + self.states.collide.can = false + + self.children = {} + self.config = {args = args} + self.children.card = Card(self.T.x, self.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, args.center or G.P_CENTERS.j_joker, {bypass_discovery_center = true}) + self.children.card.states.visible = false + self.children.card:start_materialize({G.C.BLUE, G.C.WHITE, G.C.RED}) + self.children.card:set_alignment{ + major = self, type = 'cm', offset = {x=0, y=0} + } + self.children.card.jimbo = self + self.children.card.states.collide.can = true + self.children.card.states.focus.can = false + self.children.card.states.hover.can = true + self.children.card.states.drag.can = false + self.children.card.hover = Node.hover + + self.children.particles = Particles(0, 0, 0,0, { + timer = 0.03, + scale = 0.3, + speed = 1.2, + lifespan = 2, + attach = self, + colours = {G.C.RED, G.C.BLUE, G.C.ORANGE}, + fill = true + }) + self.children.particles.static_rotation = true + self.children.particles:set_role{ + role_type = 'Minor', + xy_bond = 'Weak', + r_bond = 'Strong', + major = self, + } + + if getmetatable(self) == Card_Character then + table.insert(G.I.CARD, self) + end +end + +function Card_Character:move(dt) + Moveable.move(self, dt) +end + +function Card_Character:hard_set_VT() + self:align_to_major() + Moveable.hard_set_VT(self) + self:align() + self.children.card:hard_set_VT() +end + +function Card_Character:align() + if self.children.card then + self.children.card.T.x = self.T.x + (self.T.w - self.children.card.T.w)/2 + self.children.card.T.y = self.T.y + (self.T.h - self.children.card.T.h)/2 + end +end + +function Card_Character:add_button(button, func, colour, update_func, snap_to, yoff) + if self.children.button then self.children.button:remove() end + self.config.button_align = {align="bm", offset = {x=0,y=yoff or 0.3},major = self, parent = self} + self.children.button = UIBox{ + definition = create_UIBox_character_button({button = button, func = func, colour = colour, update_func = update_func, maxw = 3}), + config = self.config.button_align + } + if snap_to then G.CONTROLLER:snap_to{node = self.children.button} end +end + +function Card_Character:add_speech_bubble(text_key, align, loc_vars) + if self.children.speech_bubble then self.children.speech_bubble:remove() end + self.config.speech_bubble_align = {align=align or 'bm', offset = {x=0,y=0},parent = self} + self.children.speech_bubble = + UIBox{ + definition = G.UIDEF.speech_bubble(text_key, loc_vars), + config = self.config.speech_bubble_align + } + self.children.speech_bubble:set_role{ + role_type = 'Minor', + xy_bond = 'Weak', + r_bond = 'Strong', + major = self, + } + self.children.speech_bubble.states.visible = false +end + +function Card_Character:remove_button() + if self.children.button then self.children.button:remove(); self.children.button = nil end +end + +function Card_Character:remove_speech_bubble() + if self.children.speech_bubble then self.children.speech_bubble:remove(); self.children.speech_bubble = nil end +end + +function Card_Character:say_stuff(n, not_first) + self.talking = true + if not not_first then + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + if self.children.speech_bubble then self.children.speech_bubble.states.visible = true end + self:say_stuff(n, true) + return true + end + })) + else + if n <= 0 then self.talking = false; return end + local new_said = math.random(1, 11) + while new_said == self.last_said do + new_said = math.random(1, 11) + end + self.last_said = new_said + play_sound('voice'..math.random(1, 11), G.SPEEDFACTOR*(math.random()*0.2+1), 0.5) + self.children.card:juice_up() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, blocking = false, + delay = 0.13, + func = function() + self:say_stuff(n-1, true) + return true + end + }), 'tutorial') + end +end + +function Card_Character:draw(dt) + if self.highlight then + self.children.highlight:draw() + self.highlight:draw() + if self.highlight.draw_children then self.highlight:draw_children() end + end + if self.children.particles then + self.children.particles:draw() + end + if self.children.speech_bubble then + self.children.speech_bubble:draw() + end + if self.children.button and not self.talking then + self.children.button:draw() + end + if self.children.card then + self.children.card:draw() + end + add_to_drawhash(self) + self:draw_boundingrect() +end + +function Card_Character:remove() + G.jimboed = nil + remove_all(self.children) + for k, v in pairs(G.I.CARD) do + if v == self then + table.remove(G.I.CARD, k) + end + end + Moveable.remove(self) +end diff --git a/cardarea.lua b/cardarea.lua new file mode 100644 index 0000000..ddc27b9 --- /dev/null +++ b/cardarea.lua @@ -0,0 +1,668 @@ +--Class +CardArea = Moveable:extend() + +--Class Methods +function CardArea:init(X, Y, W, H, config) + Moveable.init(self, X, Y, W, H) + + self.states.drag.can = false + self.states.hover.can = false + self.states.click.can = false + + + self.config = config or {} + self.card_w = config.card_w or G.CARD_W + self.cards = {} + self.children = {} + self.highlighted = {} + self.config.highlighted_limit = config.highlight_limit or 5 + self.config.card_limit = config.card_limit or 52 + self.config.temp_limit = self.config.card_limit + self.config.card_count = 0 + self.config.type = config.type or 'deck' + self.config.sort = config.sort or 'desc' + self.config.lr_padding = config.lr_padding or 0.1 + self.shuffle_amt = 0 + + if getmetatable(self) == CardArea then + table.insert(G.I.CARDAREA, self) + end +end + +function CardArea:emplace(card, location, stay_flipped) + if location == 'front' or self.config.type == 'deck' then + table.insert(self.cards, 1, card) + else + self.cards[#self.cards+1] = card + end + if card.facing == 'back' and self.config.type ~= 'discard' and self.config.type ~= 'deck' and not stay_flipped then + card:flip() + end + if self == G.hand and stay_flipped then + card.ability.wheel_flipped = true + end + + if #self.cards > self.config.card_limit then + if self == G.deck then + self.config.card_limit = #self.cards + end + end + + card:set_card_area(self) + self:set_ranks() + self:align_cards() + + if self == G.jokers then + local joker_tally = 0 + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.set == 'Joker' then joker_tally = joker_tally + 1 end + end + if joker_tally > G.GAME.max_jokers then G.GAME.max_jokers = joker_tally end + check_for_unlock({type = 'modify_jokers'}) + end + if self == G.deck then check_for_unlock({type = 'modify_deck', deck = self}) end +end + +function CardArea:remove_card(card, discarded_only) + if not self.cards then return end + local _cards = discarded_only and {} or self.cards + if discarded_only then + for k, v in ipairs(self.cards) do + if v.ability and v.ability.discarded then + _cards[#_cards+1] = v + end + end + end + if self.config.type == 'discard' or self.config.type == 'deck' then + card = card or _cards[#_cards] + else + card = card or _cards[1] + end + for i = #self.cards,1,-1 do + if self.cards[i] == card then + card:remove_from_area() + table.remove(self.cards, i) + self:remove_from_highlighted(card, true) + break + end + end + self:set_ranks() + if self == G.deck then check_for_unlock({type = 'modify_deck', deck = self}) end + return card +end + +function CardArea:change_size(delta) + if delta ~= 0 then + G.E_MANAGER:add_event(Event({ + func = function() + self.config.real_card_limit = (self.config.real_card_limit or self.config.card_limit) + delta + self.config.card_limit = math.max(0, self.config.real_card_limit) + if delta > 0 and self.config.real_card_limit > 1 and self == G.hand and self.cards[1] and (G.STATE == G.STATES.DRAW_TO_HAND or G.STATE == G.STATES.SELECTING_HAND) then + local card_count = math.abs(delta) + for i=1, card_count do + draw_card(G.deck,G.hand, i*100/card_count,nil, nil , nil, 0.07) + G.E_MANAGER:add_event(Event({func = function() self:sort() return true end})) + end + end + if self == G.hand then check_for_unlock({type = 'min_hand_size'}) end + return true + end})) + end +end + +function CardArea:can_highlight(card) + if G.CONTROLLER.HID.controller then + if self.config.type == 'hand' + then + return true + end + else + if self.config.type == 'hand' or + self.config.type == 'joker' or + self.config.type == 'consumeable' or + (self.config.type == 'shop' and self.config.highlighted_limit > 0) + then + return true + end + end + return false +end + +function CardArea:add_to_highlighted(card, silent) + --if self.config.highlighted_limit <= #self.highlighted then return end + if self.config.type == 'shop' then + if self.highlighted[1] then + self:remove_from_highlighted(self.highlighted[1]) + end + --if not G.FUNCS.check_for_buy_space(card) then return false end + self.highlighted[#self.highlighted+1] = card + card:highlight(true) + if not silent then play_sound('cardSlide1') end + elseif self.config.type == 'joker' or self.config.type == 'consumeable' then + if #self.highlighted >= self.config.highlighted_limit then + self:remove_from_highlighted(self.highlighted[1]) + end + self.highlighted[#self.highlighted+1] = card + card:highlight(true) + if not silent then play_sound('cardSlide1') end + else + if #self.highlighted >= self.config.highlighted_limit then + card:highlight(false) + else + self.highlighted[#self.highlighted+1] = card + card:highlight(true) + if not silent then play_sound('cardSlide1') end + end + if self == G.hand and G.STATE == G.STATES.SELECTING_HAND then + self:parse_highlighted() + end + end +end + +function CardArea:parse_highlighted() + G.boss_throw_hand = nil + local text,disp_text,poker_hands = G.FUNCS.get_poker_hand_info(self.highlighted) + if text == 'NULL' then + update_hand_text({immediate = true, nopulse = true, delay = 0}, {mult = 0, chips = 0, level = '', handname = ''}) + else + if G.GAME.blind and G.GAME.blind:debuff_hand(self.highlighted, poker_hands, text, true) then + G.boss_throw_hand = true + else + + end + local backwards = nil + for k, v in pairs(self.highlighted) do + if v.facing == 'back' then + backwards = true + end + end + if backwards then + update_hand_text({immediate = true, nopulse = nil, delay = 0}, {handname='????', level='?', mult = '?', chips = '?'}) + else + update_hand_text({immediate = true, nopulse = nil, delay = 0}, {handname=disp_text, level=G.GAME.hands[text].level, mult = G.GAME.hands[text].mult, chips = G.GAME.hands[text].chips}) + end + end +end + +function CardArea:remove_from_highlighted(card, force) + if (not force) and card and card.ability.forced_selection and self == G.hand then return end + for i = #self.highlighted,1,-1 do + if self.highlighted[i] == card then + table.remove(self.highlighted, i) + break + end + end + card:highlight(false) + if self == G.hand and G.STATE == G.STATES.SELECTING_HAND then + self:parse_highlighted() + end +end + +function CardArea:unhighlight_all() + for i = #self.highlighted,1,-1 do + if self.highlighted[i].ability.forced_selection and self == G.hand then + else + self.highlighted[i]:highlight(false) + table.remove(self.highlighted, i) + end + end + if self == G.hand and G.STATE == G.STATES.SELECTING_HAND then + self:parse_highlighted() + end +end + +function CardArea:set_ranks() + for k, card in ipairs(self.cards) do + card.rank = k + card.states.collide.can = true + if k > 1 and self.config.type == 'deck' then + card.states.drag.can = false + card.states.collide.can = false + elseif self.config.type == 'play' or self.config.type == 'shop' or self.config.type == 'consumeable' then + card.states.drag.can = false + else + card.states.drag.can = true + end + end +end + +function CardArea:move(dt) + --Set sliding up/down for the hand area + if self == G.hand then + local desired_y = G.TILE_H - G.hand.T.h - 1.9*((not G.deck_preview and (G.STATE == G.STATES.SELECTING_HAND or G.STATE == G.STATES.DRAW_TO_HAND)) and 1 or 0) + G.hand.T.y = 15*G.real_dt*desired_y + (1-15*G.real_dt)*G.hand.T.y + if math.abs(desired_y - G.hand.T.y) < 0.01 then G.hand.T.y = desired_y end + if G.STATE == G.STATES.TUTORIAL then + G.play.T.y = G.hand.T.y - (3 + 0.6) + end + end + Moveable.move(self, dt) + self:align_cards() +end + +function CardArea:update(dt) + if self == G.hand then + if G.GAME.modifiers.minus_hand_size_per_X_dollar then + self.config.last_poll_size = self.config.last_poll_size or 0 + if math.floor(G.GAME.dollars/G.GAME.modifiers.minus_hand_size_per_X_dollar) ~= self.config.last_poll_size then + self:change_size(self.config.last_poll_size - math.floor(G.GAME.dollars/G.GAME.modifiers.minus_hand_size_per_X_dollar)) + self.config.last_poll_size = math.floor(G.GAME.dollars/G.GAME.modifiers.minus_hand_size_per_X_dollar) + end + end + for k, v in pairs(self.cards) do + if v.ability.forced_selection and not self.highlighted[1] then + self:add_to_highlighted(v) + end + end + end + if self == G.deck then + self.states.collide.can = true + self.states.hover.can = true + self.states.click.can = true + end + --Check and see if controller is being used + if G.CONTROLLER.HID.controller and self ~= G.hand then self:unhighlight_all() end + if self == G.deck and self.config.card_limit > #G.playing_cards then self.config.card_limit = #G.playing_cards end + self.config.temp_limit = math.max(#self.cards, self.config.card_limit) + self.config.card_count = #self.cards +end + +function CardArea:draw() + if not self.states.visible then return end + if G.VIEWING_DECK and (self==G.deck or self==G.hand or self==G.play) then return end + + local state = G.TAROT_INTERRUPT or G.STATE + + self.ARGS.invisible_area_types = self.ARGS.invisible_area_types or {discard=1, voucher=1, play=1, consumeable=1, title = 1, title_2 = 1} + if self.ARGS.invisible_area_types[self.config.type] or + (self.config.type == 'hand' and ({[G.STATES.SHOP]=1, [G.STATES.TAROT_PACK]=1, [G.STATES.SPECTRAL_PACK]=1, [G.STATES.STANDARD_PACK]=1,[G.STATES.BUFFOON_PACK]=1,[G.STATES.PLANET_PACK]=1, [G.STATES.ROUND_EVAL]=1, [G.STATES.BLIND_SELECT]=1})[state]) or + (self.config.type == 'deck' and self ~= G.deck) or + (self.config.type == 'shop' and self ~= G.shop_vouchers) then + else + if not self.children.area_uibox then + local card_count = self ~= G.shop_vouchers and {n=G.UIT.R, config={align = self == G.jokers and 'cl' or self == G.hand and 'cm' or 'cr', padding = 0.03, no_fill = true}, nodes={ + {n=G.UIT.B, config={w = 0.1,h=0.1}}, + {n=G.UIT.T, config={ref_table = self.config, ref_value = 'card_count', scale = 0.3, colour = G.C.WHITE}}, + {n=G.UIT.T, config={text = '/', scale = 0.3, colour = G.C.WHITE}}, + {n=G.UIT.T, config={ref_table = self.config, ref_value = 'card_limit', scale = 0.3, colour = G.C.WHITE}}, + {n=G.UIT.B, config={w = 0.1,h=0.1}} + }} or nil + + self.children.area_uibox = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={minw = self.T.w,minh = self.T.h,align = "cm", padding = 0.1, mid = true, r = 0.1, colour = self ~= G.shop_vouchers and {0,0,0,0.1} or nil, ref_table = self}, nodes={ + self == G.shop_vouchers and + {n=G.UIT.C, config={align = "cm", paddin = 0.1, func = 'shop_voucher_empty', visible = false}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'DEFEAT', scale = 0.6, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'BOSS BLIND', scale = 0.4, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'TO RESTOCK', scale = 0.4, colour = G.C.WHITE}} + }}, + }} or nil, + }}, + card_count + }}, + config = { align = 'cm', offset = {x=0,y=0}, major = self, parent = self} + } + end + self.children.area_uibox:draw() + end + + self:draw_boundingrect() + add_to_drawhash(self) + + self.ARGS.draw_layers = self.ARGS.draw_layers or self.config.draw_layers or {'shadow', 'card'} + for k, v in ipairs(self.ARGS.draw_layers) do + if self.config.type == 'deck' then + for i = #self.cards, 1, -1 do + if self.cards[i] ~= G.CONTROLLER.focused.target then + if i == 1 or i%(self.config.thin_draw or 9) == 0 or i == #self.cards or math.abs(self.cards[i].VT.x - self.T.x) > 1 or math.abs(self.cards[i].VT.y - self.T.y) > 1 then + if G.CONTROLLER.dragging.target ~= self.cards[i] then self.cards[i]:draw(v) end + end + end + end + end + + if self.config.type == 'joker' or self.config.type == 'consumeable' or self.config.type == 'shop' or self.config.type == 'title_2' then + for i = 1, #self.cards do + if self.cards[i] ~= G.CONTROLLER.focused.target then + if not self.cards[i].highlighted then + if G.CONTROLLER.dragging.target ~= self.cards[i] then self.cards[i]:draw(v) end + end + end + end + for i = 1, #self.cards do + if self.cards[i] ~= G.CONTROLLER.focused.target then + if self.cards[i].highlighted then + if G.CONTROLLER.dragging.target ~= self.cards[i] then self.cards[i]:draw(v) end + end + end + end + end + + if self.config.type == 'discard' then + for i = 1, #self.cards do + if self.cards[i] ~= G.CONTROLLER.focused.target then + if math.abs(self.cards[i].VT.x - self.T.x) > 1 then + if G.CONTROLLER.dragging.target ~= self.cards[i] then self.cards[i]:draw(v) end + end + end + end + end + + if self.config.type == 'hand' or self.config.type == 'play' or self.config.type == 'title' or self.config.type == 'voucher' then + for i = 1, #self.cards do + if self.cards[i] ~= G.CONTROLLER.focused.target or self == G.hand then + if G.CONTROLLER.dragging.target ~= self.cards[i] then self.cards[i]:draw(v) end + end + end + end + end + + if self == G.deck then + if G.CONTROLLER.HID.controller and G.STATE == G.STATES.SELECTING_HAND and not self.children.peek_deck then + self.children.peek_deck = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = 'cm', padding = 0.1, r =0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", r =0.1, colour = adjust_alpha(G.C.L_BLACK, 0.5),func = 'set_button_pip', focus_args = {button = 'triggerleft', orientation = 'bm', scale = 0.6, type = 'none'}}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'PEEK', scale = 0.48, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'DECK', scale = 0.38, colour = G.C.WHITE, shadow = true}} + }}, + }}, + }}, + config = { align = 'cl', offset = {x=-0.5,y=0.1}, major = self, parent = self} + } + self.children.peek_deck.states.collide.can = false + elseif (not G.CONTROLLER.HID.controller or G.STATE ~= G.STATES.SELECTING_HAND) and self.children.peek_deck then + self.children.peek_deck:remove() + self.children.peek_deck = nil + end + if not self.children.view_deck then + self.children.view_deck = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = 'cm', padding = 0.1, r =0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05, r =0.1, colour = adjust_alpha(G.C.BLACK, 0.5),func = 'set_button_pip', focus_args = {button = 'triggerright', orientation = 'bm', scale = 0.6}, button = 'deck_info'}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 2}, nodes={ + {n=G.UIT.T, config={text = localize('k_view'), scale = 0.48, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", maxw = 2}, nodes={ + {n=G.UIT.T, config={text = localize('k_deck'), scale = 0.38, colour = G.C.WHITE, shadow = true}} + }}, + }}, + }}, + config = { align = 'cm', offset = {x=0,y=0}, major = self.cards[1] or self, parent = self} + } + self.children.view_deck.states.collide.can = false + end + if G.deck_preview or self.states.collide.is or (G.buttons and G.buttons.states.collide.is and G.CONTROLLER.HID.controller) then self.children.view_deck:draw() end + if self.children.peek_deck then self.children.peek_deck:draw() end + end +end + +function CardArea:align_cards() + if (self == G.hand or self == G.deck or self == G.discard or self == G.play) and G.view_deck and G.view_deck[1] and G.view_deck[1].cards then return end + if self.config.type == 'deck' then + local deck_height = (self.config.deck_height or 0.15)/52 + for k, card in ipairs(self.cards) do + if card.facing == 'front' then card:flip() end + + if not card.states.drag.is then + card.T.x = self.T.x + 0.5*(self.T.w - card.T.w) + self.shadow_parrallax.x*deck_height*(#self.cards/(self == G.deck and 1 or 2) - k) + 0.9*self.shuffle_amt*(1 - k*0.01)*(k%2 == 1 and 1 or -0) + card.T.y = self.T.y + 0.5*(self.T.h - card.T.h) + self.shadow_parrallax.y*deck_height*(#self.cards/(self == G.deck and 1 or 2) - k) + card.T.r = 0 + 0.3*self.shuffle_amt*(1 + k*0.05)*(k%2 == 1 and 1 or -0) + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + end + if self.config.type == 'discard' then + for k, card in ipairs(self.cards) do + if card.facing == 'front' then card:flip() end + + if not card.states.drag.is then + card.T.x = self.T.x + (self.T.w - card.T.w)*card.discard_pos.x + card.T.y = self.T.y + (self.T.h - card.T.h)* card.discard_pos.y + card.T.r = card.discard_pos.r + end + end + end + if self.config.type == 'hand' and (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK) then + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0.4*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ 0.02*math.sin(2*G.TIMERS.REAL+card.T.x) + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = G.hand.T.y - 1.8*card.T.h - highlight_height + 0.1*math.sin(0.666*G.TIMERS.REAL+card.T.x) + math.abs(1.3*(-#self.cards/2 + k-0.5)/(#self.cards))^2-0.3 + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end) + end + if self.config.type == 'hand' and not (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK) then + + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0.2*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ 0.02*math.sin(2*G.TIMERS.REAL+card.T.x) + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + 0.03*math.sin(0.666*G.TIMERS.REAL+card.T.x) + math.abs(0.5*(-#self.cards/2 + k-0.5)/(#self.cards))-0.2 + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end) + end + if self.config.type == 'title' or (self.config.type == 'voucher' and #self.cards == 1) then + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0.2*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ 0.02*math.sin(2*G.TIMERS.REAL+card.T.x) + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + 0.03*math.sin(0.666*G.TIMERS.REAL+card.T.x) + math.abs(0.5*(-#self.cards/2 + k-0.5)/(#self.cards))-(#self.cards>1 and 0.2 or 0) + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end) + end + if self.config.type == 'voucher' and #self.cards > 1 then + local self_w = math.max(self.T.w, 3.2) + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0.2*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ 0.02*math.sin(2*G.TIMERS.REAL+card.T.x+card.T.y) + (k%2 == 0 and 1 or -1)*0.08 + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self_w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + (k%2 == 1 and 1 or -1)*0.27 + (self.T.w-self_w)/2 + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + 0.03*math.sin(0.666*G.TIMERS.REAL+card.T.x) + math.abs(0.5*(-#self.cards/2 + k-0.5)/(#self.cards))-(#self.cards>1 and 0.2 or 0) + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.ability.order < b.ability.order end) + end + if self.config.type == 'play' or self.config.type == 'shop' then + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0 + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + (self.config.card_limit == 1 and 0.5*(self.T.w - card.T.w) or 0) + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end) + end + if self.config.type == 'joker' or self.config.type == 'title_2' then + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + card.T.r = 0.1*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ 0.02*math.sin(2*G.TIMERS.REAL+card.T.x) + local max_cards = math.max(#self.cards, self.config.temp_limit) + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/math.max(max_cards-1, 1) - 0.5*(#self.cards-max_cards)/math.max(max_cards-1, 1)) + 0.5*(self.card_w - card.T.w) + if #self.cards > 2 or (#self.cards > 1 and self == G.consumeables) or (#self.cards > 1 and self.config.spread) then + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/(#self.cards-1)) + 0.5*(self.card_w - card.T.w) + elseif #self.cards > 1 and self ~= G.consumeables then + card.T.x = self.T.x + (self.T.w-self.card_w)*((k - 0.5)/(#self.cards)) + 0.5*(self.card_w - card.T.w) + else + card.T.x = self.T.x + self.T.w/2 - self.card_w/2 + 0.5*(self.card_w - card.T.w) + end + local highlight_height = G.HIGHLIGHT_H/2 + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height+ 0.03*math.sin(0.666*G.TIMERS.REAL+card.T.x) + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end) + end + if self.config.type == 'consumeable'then + for k, card in ipairs(self.cards) do + if not card.states.drag.is then + if #self.cards > 1 then + card.T.x = self.T.x + (self.T.w-self.card_w)*((k-1)/(#self.cards-1)) + 0.5*(self.card_w - card.T.w) + else + card.T.x = self.T.x + self.T.w/2 - self.card_w/2 + 0.5*(self.card_w - card.T.w) + end + local highlight_height = G.HIGHLIGHT_H + if not card.highlighted then highlight_height = 0 end + card.T.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + (not card.highlighted and 0.05*math.sin(2*1.666*G.TIMERS.REAL+card.T.x) or 0) + card.T.x = card.T.x + card.shadow_parrallax.x/30 + end + end + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end) + end + for k, card in ipairs(self.cards) do + card.rank = k + end + if self.children.view_deck then + self.children.view_deck:set_role{major = self.cards[1] or self} + end +end + +function CardArea:hard_set_T(X, Y, W, H) + local x = (X or self.T.x) + local y = (Y or self.T.y) + local w = (W or self.T.w) + local h = (H or self.T.h) + Moveable.hard_set_T(self,x, y, w, h) + self:calculate_parrallax() + self:align_cards() + self:hard_set_cards() +end + +function CardArea:hard_set_cards() + for k, card in pairs(self.cards) do + card:hard_set_T() + card:calculate_parrallax() + end +end + +function CardArea:shuffle(_seed) + pseudoshuffle(self.cards, pseudoseed(_seed or 'shuffle')) + self:set_ranks() +end + +function CardArea:sort(method) + self.config.sort = method or self.config.sort + if self.config.sort == 'desc' then + table.sort(self.cards, function (a, b) return a:get_nominal() > b:get_nominal() end ) + elseif self.config.sort == 'asc' then + table.sort(self.cards, function (a, b) return a:get_nominal() < b:get_nominal() end ) + elseif self.config.sort == 'suit desc' then + table.sort(self.cards, function (a, b) return a:get_nominal('suit') > b:get_nominal('suit') end ) + elseif self.config.sort == 'suit asc' then + table.sort(self.cards, function (a, b) return a:get_nominal('suit') < b:get_nominal('suit') end ) + elseif self.config.sort == 'order' then + table.sort(self.cards, function (a, b) return (a.config.card.order or a.config.center.order) < (b.config.card.order or b.config.center.order) end ) + end +end + +function CardArea:draw_card_from(area, stay_flipped, discarded_only) + if area:is(CardArea) then + if #self.cards < self.config.card_limit or self == G.deck or self == G.hand then + local card = area:remove_card(nil, discarded_only) + if card then + if area == G.discard then + card.T.r = 0 + end + local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(self, card) + if (self == G.hand) and G.GAME.modifiers.flipped_cards then + if pseudorandom(pseudoseed('flipped_card')) < 1/G.GAME.modifiers.flipped_cards then + stay_flipped = true + end + end + self:emplace(card, nil, stay_flipped) + return true + end + end + end +end + +function CardArea:click() + if self == G.deck then + G.FUNCS.deck_info() + end +end + +function CardArea:save() + if not self.cards then return end + local cardAreaTable = { + cards = {}, + config = self.config, + } + for i = 1, #self.cards do + cardAreaTable.cards[#cardAreaTable.cards + 1] = self.cards[i]:save() + end + + return cardAreaTable +end + +function CardArea:load(cardAreaTable) + + if self.cards then remove_all(self.cards) end + self.cards = {} + if self.children then remove_all(self.children) end + self.children = {} + + self.config = cardAreaTable.config + + for i = 1, #cardAreaTable.cards do + loading = true + local card = Card(0, 0, G.CARD_W, G.CARD_H, G.P_CENTERS.j_joker, G.P_CENTERS.c_base) + loading = nil + card:load(cardAreaTable.cards[i]) + self.cards[#self.cards + 1] = card + if card.highlighted then + self.highlighted[#self.highlighted + 1] = card + end + card:set_card_area(self) + end + self:set_ranks() + self:align_cards() + self:hard_set_cards() +end + +function CardArea:remove() + if self.cards then remove_all(self.cards) end + self.cards = nil + if self.children then remove_all(self.children) end + self.children = nil + for k, v in pairs(G.I.CARDAREA) do + if v == self then + table.remove(G.I.CARDAREA, k) + end + end + Moveable.remove(self) +end diff --git a/challenges.lua b/challenges.lua new file mode 100644 index 0000000..8c88877 --- /dev/null +++ b/challenges.lua @@ -0,0 +1,729 @@ +G.CHALLENGES = { + --[[{ + name = 'TEST', + id = 'c_test_1', + rules = { + custom = { + --{id = 'no_reward'}, + {id = 'no_reward_specific', value = 'Big'}, + {id = 'no_extra_hand_money'}, + {id = 'no_interest'}, + {id = 'daily'}, + {id = 'set_seed', value = 'SEEDEEDS'}, + }, + modifiers = { + {id = 'dollars', value = 100}, + {id = 'discards', value = 1}, + {id = 'hands', value = 6}, + {id = 'reroll_cost', value = 10}, + {id = 'joker_slots', value = 8}, + {id = 'consumable_slots', value = 3}, + {id = 'hand_size', value = 5}, + } + }, + jokers = { + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg', edition = 'foil', eternal = true} + }, + consumeables = { + {id = 'c_sigil'} + }, + vouchers = { + {id = 'v_hieroglyph'}, + }, + deck = { + --enhancement = 'm_glass', + --edition = 'foil', + --gold_seal = true, + --yes_ranks = {['3'] = true,T = true}, + --no_ranks = {['4'] = true}, + --yes_suits = {S=true}, + --no_suits = {D=true}, + cards = {{s='D',r='2',e='m_glass',},{s='D',r='3',e='m_glass',},{s='D',r='4',e='m_glass',},{s='D',r='5',e='m_glass',},{s='D',r='6',e='m_glass',},{s='D',r='7',e='m_glass',},{s='D',r='8',e='m_glass',},{s='D',r='9',e='m_glass',},{s='D',r='T',e='m_glass',},{s='D',r='J',e='m_glass',},{s='D',r='Q',e='m_glass',},{s='D',r='K',e='m_glass',},{s='D',r='A',e='m_glass',},{s='C',r='2',e='m_glass',},{s='C',r='3',e='m_glass',},{s='C',r='4',e='m_glass',},{s='C',r='5',e='m_glass',},{s='C',r='6',e='m_glass',},{s='C',r='7',e='m_glass',},{s='C',r='8',e='m_glass',},{s='C',r='9',e='m_glass',},{s='C',r='T',e='m_glass',},{s='C',r='J',e='m_glass',},{s='C',r='Q',e='m_glass',},{s='C',r='K',e='m_glass',},{s='C',r='A',e='m_glass',},{s='H',r='2',e='m_glass',},{s='H',r='3',e='m_glass',},{s='H',r='4',e='m_glass',},{s='H',r='5',e='m_glass',},{s='H',r='6',e='m_glass',},{s='H',r='7',e='m_glass',},{s='H',r='8',e='m_glass',},{s='H',r='9',e='m_glass',},{s='H',r='T',e='m_glass',},{s='H',r='J',e='m_glass',},{s='H',r='Q',e='m_glass',},{s='H',r='K',e='m_glass',},{s='H',r='A',e='m_glass',},{s='S',r='2',e='m_glass',},{s='S',r='3',e='m_glass',},{s='S',r='4',e='m_glass',},{s='S',r='5',e='m_glass',},{s='S',r='6',e='m_glass',},{s='S',r='7',e='m_glass',},{s='S',r='8',e='m_glass',},{s='S',r='9',e='m_glass',},{s='S',r='T',e='m_glass',},{s='S',r='J',e='m_glass',},{s='S',r='Q',e='m_glass',},{s='S',r='K',e='m_glass',},{s='S',r='A',e='m_glass',},}, + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'j_joker'}, + {id = 'j_egg'}, + }, + banned_tags = { + {id = 'tag_garbage'}, + {id = 'tag_handy'}, + }, + banned_other = { + + } + } + },]]-- + { + name = 'The Omelette', + id = 'c_omelette_1', + rules = { + custom = { + {id = 'no_reward'}, + {id = 'no_extra_hand_money'}, + {id = 'no_interest'} + }, + modifiers = { + } + }, + jokers = { + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg'}, + {id = 'j_egg'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'v_seed_money'}, + {id = 'v_money_tree'}, + {id = 'j_to_the_moon'}, + {id = 'j_rocket'}, + {id = 'j_golden'}, + {id = 'j_satellite'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "15 Minute City", + id = 'c_city_1', + rules = { + custom = { + }, + modifiers = { + } + }, + jokers = { + {id = 'j_ride_the_bus', eternal = true}, + {id = 'j_shortcut', eternal = true}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + cards = {{s='D',r='4',},{s='D',r='5',},{s='D',r='6',},{s='D',r='7',},{s='D',r='8',},{s='D',r='9',},{s='D',r='T',},{s='D',r='J',},{s='D',r='Q',},{s='D',r='K',},{s='D',r='J',},{s='D',r='Q',},{s='D',r='K',},{s='C',r='4',},{s='C',r='5',},{s='C',r='6',},{s='C',r='7',},{s='C',r='8',},{s='C',r='9',},{s='C',r='T',},{s='C',r='J',},{s='C',r='Q',},{s='C',r='K',},{s='C',r='J',},{s='C',r='Q',},{s='C',r='K',},{s='H',r='4',},{s='H',r='5',},{s='H',r='6',},{s='H',r='7',},{s='H',r='8',},{s='H',r='9',},{s='H',r='T',},{s='H',r='J',},{s='H',r='Q',},{s='H',r='K',},{s='H',r='J',},{s='H',r='Q',},{s='H',r='K',},{s='S',r='4',},{s='S',r='5',},{s='S',r='6',},{s='S',r='7',},{s='S',r='8',},{s='S',r='9',},{s='S',r='T',},{s='S',r='J',},{s='S',r='Q',},{s='S',r='K',},{s='S',r='J',},{s='S',r='Q',},{s='S',r='K',}}, + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Rich get Richer", + id = 'c_rich_1', + rules = { + custom = { + {id = 'chips_dollar_cap'}, + }, + modifiers = { + {id = 'dollars', value = 100}, + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + {id = 'v_seed_money'}, + {id = 'v_money_tree'}, + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "On a Knife's Edge", + id = 'c_knife_1', + rules = { + custom = { + }, + modifiers = { + } + }, + jokers = { + {id = 'j_ceremonial', eternal = true, pinned = true}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "X-ray Vision", + id = 'c_xray_1', + rules = { + custom = { + {id = 'flipped_cards', value = 4}, + }, + modifiers = { + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Mad World", + id = 'c_mad_world_1', + rules = { + custom = { + {id = 'no_extra_hand_money'}, + {id = 'no_interest'}, + }, + modifiers = { + } + }, + jokers = { + {id = 'j_pareidolia', edition = 'negative', eternal = true}, + {id = 'j_business', eternal = true}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + cards = {{s='D',r='2',},{s='D',r='3',},{s='D',r='4',},{s='D',r='5',},{s='D',r='6',},{s='D',r='7',},{s='D',r='8',},{s='D',r='9',},{s='C',r='2',},{s='C',r='3',},{s='C',r='4',},{s='C',r='5',},{s='C',r='6',},{s='C',r='7',},{s='C',r='8',},{s='C',r='9',},{s='H',r='2',},{s='H',r='3',},{s='H',r='4',},{s='H',r='5',},{s='H',r='6',},{s='H',r='7',},{s='H',r='8',},{s='H',r='9',},{s='S',r='2',},{s='S',r='3',},{s='S',r='4',},{s='S',r='5',},{s='S',r='6',},{s='S',r='7',},{s='S',r='8',},{s='S',r='9',}}, + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Luxury Tax", + id = 'c_luxury_1', + rules = { + custom = { + {id = 'minus_hand_size_per_X_dollar', value = 5}, + }, + modifiers = { + {id = 'hand_size', value = 10}, + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Non-Perishable", + id = 'c_non_perishable_1', + rules = { + custom = { + {id = 'all_eternal'}, + }, + modifiers = { + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'j_gros_michel'}, + {id = 'j_ice_cream'}, + {id = 'j_cavendish'}, + {id = 'j_turtle_bean'}, + {id = 'j_ramen'}, + {id = 'j_diet_cola'}, + {id = 'j_selzer'}, + {id = 'j_popcorn'}, + {id = 'j_mr_bones'}, + {id = 'j_invisible'}, + {id = 'j_luchador'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Medusa", + id = 'c_medusa_1', + rules = { + custom = { + }, + modifiers = { + } + }, + jokers = { + {id = 'j_marble', eternal = true}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck', + cards = {{s='D',r='2',},{s='D',r='3',},{s='D',r='4',},{s='D',r='5',},{s='D',r='6',},{s='D',r='7',},{s='D',r='8',},{s='D',r='9',},{s='D',r='T',},{s='D',r='J',e='m_stone',},{s='D',r='Q',e='m_stone',},{s='D',r='K',e='m_stone',},{s='D',r='A',},{s='C',r='2',},{s='C',r='3',},{s='C',r='4',},{s='C',r='5',},{s='C',r='6',},{s='C',r='7',},{s='C',r='8',},{s='C',r='9',},{s='C',r='T',},{s='C',r='J',e='m_stone',},{s='C',r='Q',e='m_stone',},{s='C',r='K',e='m_stone',},{s='C',r='A',},{s='H',r='2',},{s='H',r='3',},{s='H',r='4',},{s='H',r='5',},{s='H',r='6',},{s='H',r='7',},{s='H',r='8',},{s='H',r='9',},{s='H',r='T',},{s='H',r='J',e='m_stone',},{s='H',r='Q',e='m_stone',},{s='H',r='K',e='m_stone',},{s='H',r='A',},{s='S',r='2',},{s='S',r='3',},{s='S',r='4',},{s='S',r='5',},{s='S',r='6',},{s='S',r='7',},{s='S',r='8',},{s='S',r='9',},{s='S',r='T',},{s='S',r='J',e='m_stone',},{s='S',r='Q',e='m_stone',},{s='S',r='K',e='m_stone',},{s='S',r='A',}, } + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Double or Nothing", + id = 'c_double_nothing_1', + rules = { + custom = { + {id = 'debuff_played_cards'}, + }, + modifiers = { + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck', + cards = {{s='D',r='2',g='Red',},{s='D',r='3',g='Red',},{s='D',r='4',g='Red',},{s='D',r='5',g='Red',},{s='D',r='6',g='Red',},{s='D',r='7',g='Red',},{s='D',r='8',g='Red',},{s='D',r='9',g='Red',},{s='D',r='T',g='Red',},{s='D',r='J',g='Red',},{s='D',r='Q',g='Red',},{s='D',r='K',g='Red',},{s='D',r='A',g='Red',},{s='C',r='2',g='Red',},{s='C',r='3',g='Red',},{s='C',r='4',g='Red',},{s='C',r='5',g='Red',},{s='C',r='6',g='Red',},{s='C',r='7',g='Red',},{s='C',r='8',g='Red',},{s='C',r='9',g='Red',},{s='C',r='T',g='Red',},{s='C',r='J',g='Red',},{s='C',r='Q',g='Red',},{s='C',r='K',g='Red',},{s='C',r='A',g='Red',},{s='H',r='2',g='Red',},{s='H',r='3',g='Red',},{s='H',r='4',g='Red',},{s='H',r='5',g='Red',},{s='H',r='6',g='Red',},{s='H',r='7',g='Red',},{s='H',r='8',g='Red',},{s='H',r='9',g='Red',},{s='H',r='T',g='Red',},{s='H',r='J',g='Red',},{s='H',r='Q',g='Red',},{s='H',r='K',g='Red',},{s='H',r='A',g='Red',},{s='S',r='2',g='Red',},{s='S',r='3',g='Red',},{s='S',r='4',g='Red',},{s='S',r='5',g='Red',},{s='S',r='6',g='Red',},{s='S',r='7',g='Red',},{s='S',r='8',g='Red',},{s='S',r='9',g='Red',},{s='S',r='T',g='Red',},{s='S',r='J',g='Red',},{s='S',r='Q',g='Red',},{s='S',r='K',g='Red',},{s='S',r='A',g='Red',},} + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Typecast", + id = 'c_typecast_1', + rules = { + custom = { + {id = 'set_eternal_ante', value = 4}, + {id = 'set_joker_slots_ante', value = 4}, + }, + modifiers = { + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Inflation", + id = 'c_inflation_1', + rules = { + custom = { + {id = 'inflation'}, + }, + modifiers = { + } + }, + jokers = { + {id = 'j_credit_card'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'v_clearance_sale'}, + {id = 'v_liquidation'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Bram Poker", + id = 'c_bram_poker_1', + rules = { + custom = { + {id = 'no_shop_jokers'}, + }, + modifiers = { + } + }, + jokers = { + {id = 'j_vampire', eternal = true}, + }, + consumeables = { + {id = 'c_empress'}, + {id = 'c_emperor'}, + }, + vouchers = { + {id = 'v_magic_trick'}, + {id = 'v_illusion'}, + }, + deck = { + type = 'Challenge Deck', + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Fragile", + id = 'c_fragile_1', + rules = { + custom = { + }, + modifiers = { + } + }, + jokers = { + {id = 'j_oops', eternal = true, edition = 'negative'}, + {id = 'j_oops', eternal = true, edition = 'negative'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + cards = {{s='D',r='2',e='m_glass',},{s='D',r='3',e='m_glass',},{s='D',r='4',e='m_glass',},{s='D',r='5',e='m_glass',},{s='D',r='6',e='m_glass',},{s='D',r='7',e='m_glass',},{s='D',r='8',e='m_glass',},{s='D',r='9',e='m_glass',},{s='D',r='T',e='m_glass',},{s='D',r='J',e='m_glass',},{s='D',r='Q',e='m_glass',},{s='D',r='K',e='m_glass',},{s='D',r='A',e='m_glass',},{s='C',r='2',e='m_glass',},{s='C',r='3',e='m_glass',},{s='C',r='4',e='m_glass',},{s='C',r='5',e='m_glass',},{s='C',r='6',e='m_glass',},{s='C',r='7',e='m_glass',},{s='C',r='8',e='m_glass',},{s='C',r='9',e='m_glass',},{s='C',r='T',e='m_glass',},{s='C',r='J',e='m_glass',},{s='C',r='Q',e='m_glass',},{s='C',r='K',e='m_glass',},{s='C',r='A',e='m_glass',},{s='H',r='2',e='m_glass',},{s='H',r='3',e='m_glass',},{s='H',r='4',e='m_glass',},{s='H',r='5',e='m_glass',},{s='H',r='6',e='m_glass',},{s='H',r='7',e='m_glass',},{s='H',r='8',e='m_glass',},{s='H',r='9',e='m_glass',},{s='H',r='T',e='m_glass',},{s='H',r='J',e='m_glass',},{s='H',r='Q',e='m_glass',},{s='H',r='K',e='m_glass',},{s='H',r='A',e='m_glass',},{s='S',r='2',e='m_glass',},{s='S',r='3',e='m_glass',},{s='S',r='4',e='m_glass',},{s='S',r='5',e='m_glass',},{s='S',r='6',e='m_glass',},{s='S',r='7',e='m_glass',},{s='S',r='8',e='m_glass',},{s='S',r='9',e='m_glass',},{s='S',r='T',e='m_glass',},{s='S',r='J',e='m_glass',},{s='S',r='Q',e='m_glass',},{s='S',r='K',e='m_glass',},{s='S',r='A',e='m_glass',},}, + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'c_magician'}, + {id = 'c_empress'}, + {id = 'c_heirophant'}, + {id = 'c_chariot'}, + {id = 'c_devil'}, + {id = 'c_tower'}, + {id = 'c_lovers'}, + {id = 'c_incantation'}, + {id = 'c_grim'}, + {id = 'c_familiar'}, + {id = 'p_standard_normal_1', ids = { + 'p_standard_normal_1','p_standard_normal_2','p_standard_normal_3','p_standard_normal_4','p_standard_jumbo_1','p_standard_jumbo_2','p_standard_mega_1','p_standard_mega_2', + }}, + {id = 'j_marble'}, + {id = 'j_vampire'}, + {id = 'j_midas_mask'}, + {id = 'j_certificate'}, + {id = 'v_magic_trick'}, + {id = 'v_illusion'}, + }, + banned_tags = { + {id = 'tag_standard'}, + }, + banned_other = { + } + } + }, + { + name = "Monolith", + id = 'c_monolith_1', + rules = { + custom = { + }, + modifiers = { + } + }, + jokers = { + {id = 'j_obelisk', eternal = true}, + {id = 'j_marble', eternal = true, edition = 'negative'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Blast Off", + id = 'c_blast_off_1', + rules = { + custom = { + }, + modifiers = { + {id = 'hands', value = 2}, + {id = 'discards', value = 2}, + {id = 'joker_slots', value = 4}, + } + }, + jokers = { + {id = 'j_constellation', eternal = true}, + {id = 'j_rocket', eternal = true}, + }, + consumeables = { + }, + vouchers = { + {id = 'v_planet_merchant'}, + {id = 'v_planet_tycoon'}, + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'v_grabber'}, + {id = 'v_nacho_tong'}, + {id = 'j_burglar'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Five-Card Draw", + id = 'c_five_card_1', + rules = { + custom = { + }, + modifiers = { + {id = 'hand_size', value = 5}, + {id = 'joker_slots', value = 7}, + {id = 'discards', value = 6}, + } + }, + jokers = { + {id = 'j_card_sharp'}, + {id = 'j_joker'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'j_juggler'}, + {id = 'j_troubadour'}, + {id = 'j_turtle_bean'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Golden Needle", + id = 'c_golden_needle_1', + rules = { + custom = { + {id = 'discard_cost', value = 1}, + }, + modifiers = { + {id = 'hands', value = 1}, + {id = 'discards', value = 6}, + {id = 'dollars', value = 10}, + } + }, + jokers = { + {id = 'j_credit_card'}, + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'v_grabber'}, + {id = 'v_nacho_tong'}, + {id = 'j_burglar'}, + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Cruelty", + id = 'c_cruelty_1', + rules = { + custom = { + {id = 'no_reward_specific', value = 'Small'}, + {id = 'no_reward_specific', value = 'Big'}, + }, + modifiers = { + {id = 'joker_slots', value = 3}, + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + }, + banned_tags = { + }, + banned_other = { + } + } + }, + { + name = "Jokerless", + id = 'c_jokerless_1', + rules = { + custom = { + {id = 'no_shop_jokers'}, + }, + modifiers = { + {id = 'joker_slots', value = 0}, + } + }, + jokers = { + }, + consumeables = { + }, + vouchers = { + }, + deck = { + type = 'Challenge Deck' + }, + restrictions = { + banned_cards = { + {id = 'c_judgement'}, + {id = 'c_wraith'}, + {id = 'c_soul'}, + {id = 'p_buffoon_normal_1', ids = { + 'p_buffoon_normal_1','p_buffoon_normal_2','p_buffoon_jumbo_1','p_buffoon_mega_1', + }}, + }, + banned_tags = { + {id = 'tag_rare'}, + {id = 'tag_uncommon'}, + {id = 'tag_holo'}, + {id = 'tag_polychrome'}, + {id = 'tag_negative'}, + {id = 'tag_foil'}, + {id = 'tag_buffoon'}, + }, + banned_other = { + } + } + }, +} diff --git a/conf.lua b/conf.lua new file mode 100644 index 0000000..82a48f1 --- /dev/null +++ b/conf.lua @@ -0,0 +1,11 @@ +_RELEASE_MODE = true +_DEMO = false + +function love.conf(t) + t.console = not _RELEASE_MODE + t.title = 'Balatro' + t.window.width = 0 + t.window.height = 0 + t.window.minwidth = 100 + t.window.minheight = 100 +end diff --git a/engine/animatedsprite.lua b/engine/animatedsprite.lua new file mode 100644 index 0000000..6eeb28a --- /dev/null +++ b/engine/animatedsprite.lua @@ -0,0 +1,107 @@ +--Class +AnimatedSprite = Sprite:extend() + +--Class Methods +function AnimatedSprite:init(X, Y, W, H, new_sprite_atlas, sprite_pos) + Sprite.init(self,X, Y, W, H, new_sprite_atlas, sprite_pos) + self.offset = {x = 0, y = 0} + + table.insert(G.ANIMATIONS, self) + if getmetatable(self) == AnimatedSprite then + table.insert(G.I.SPRITE, self) + end +end + +function AnimatedSprite:rescale() + self.scale_mag = math.min(self.scale.x/self.T.w,self.scale.y/self.T.h) +end + +function AnimatedSprite:reset() + self.atlas = G.ANIMATION_ATLAS[self.atlas.name] + self:set_sprite_pos({x = self.animation.x, y = self.animation.y}) +end + +function AnimatedSprite:set_sprite_pos(sprite_pos) + self.animation = { + x= sprite_pos and sprite_pos.x or 0, + y=sprite_pos and sprite_pos.y or 0, + frames=self.atlas.frames,current=0, + w=self.scale.x, h=self.scale.y} + + self.frame_offset = 0 + + self.current_animation = { + current = 0, + frames = self.animation.frames, + w = self.animation.w, + h = self.animation.h} + + self.image_dims = self.image_dims or {} + self.image_dims[1], self.image_dims[2] = self.atlas.image:getDimensions() + + self.sprite = love.graphics.newQuad( + 0, + self.animation.h*self.animation.y, + self.animation.w, + self.animation.h, + self.image_dims[1], self.image_dims[2]) + self.offset_seconds = G.TIMERS.REAL +end + +function AnimatedSprite:get_pos_pixel() + self.RETS.get_pos_pixel = self.RETS.get_pos_pixel or {} + self.RETS.get_pos_pixel[1] = self.current_animation.current + self.RETS.get_pos_pixel[2] = self.animation.y + self.RETS.get_pos_pixel[3] = self.animation.w + self.RETS.get_pos_pixel[4] = self.animation.h + return self.RETS.get_pos_pixel +end + +function AnimatedSprite:draw_self() + if not self.states.visible then return end + + prep_draw(self, 1) + love.graphics.scale(1/self.scale_mag) + love.graphics.setColor(G.C.WHITE) + love.graphics.draw( + self.atlas.image, + self.sprite, + 0 ,0, + 0, + self.VT.w/(self.T.w), + self.VT.h/(self.T.h) + ) + love.graphics.pop() +end + +function AnimatedSprite:animate() + local new_frame = math.floor(G.ANIMATION_FPS*(G.TIMERS.REAL - self.offset_seconds))%self.current_animation.frames + if new_frame ~= self.current_animation.current then + self.current_animation.current = new_frame + self.frame_offset = math.floor(self.animation.w*(self.current_animation.current)) + self.sprite:setViewport( + self.frame_offset, + self.animation.h*self.animation.y, + self.animation.w, + self.animation.h) + end + if self.float then + self.T.r = 0.02*math.sin(2*G.TIMERS.REAL+self.T.x) + self.offset.y = -(1+0.3*math.sin(0.666*G.TIMERS.REAL+self.T.y))*self.shadow_parrallax.y + self.offset.x = -(0.7+0.2*math.sin(0.666*G.TIMERS.REAL+self.T.x))*self.shadow_parrallax.x + end +end + +function AnimatedSprite:remove() + for _, v in pairs(G.ANIMATIONS) do + if v == self then + table.remove(G.ANIMATIONS, k) + end + end + for _, v in pairs(G.I.SPRITE) do + if v == self then + table.remove(G.I.SPRITE, k) + end + end + Sprite.remove(self) +end diff --git a/engine/controller.lua b/engine/controller.lua new file mode 100644 index 0000000..a1ffa53 --- /dev/null +++ b/engine/controller.lua @@ -0,0 +1,1380 @@ +---@class Controller +Controller = Object:extend() + +--The controller contains all engine logic for how human input interacts with any game objects. +function Controller:init() + +--Each of these are calculated per frame to pass along to the corresponding nodes for input handling +self.clicked = {target = nil, handled = true, prev_target = nil} --The node that was clicked this frame +self.focused = {target = nil, handled = true, prev_target = nil } --The node that is being focused on this frame, only applies when using controller +self.dragging = {target = nil, handled = true, prev_target = nil} --The node being dragged this frame +self.hovering = {target = nil, handled = true, prev_target = nil} --The node being hovered this frame +self.released_on = {target = nil, handled = true, prev_target = nil} --The node that the cursor 'Released' on, like letting go of LMB + +self.collision_list = {} --A list of all node that the cursor currently collides with + +--Input values to be determined by this controller - the actual game objects should not have to see any of this +self.cursor_down = {T = {x=0, y=0}, target = nil, time = 0, handled = true} +self.cursor_up = {T = {x=0, y=0}, target = nil, time = 0.1, handled = true} +self.cursor_hover = {T = {x=0, y=0}, target = nil, time = 0, handled = true} +self.cursor_collider = nil --The node that collides with the cursor this frame +self.cursor_position = {x=0,y=0} --NOT IN GAME UNITS + +--For key presses, hold times, and if they are released directly from LOVE +self.pressed_keys = {} +self.held_keys = {} +self.held_key_times = {} +self.released_keys = {} + +--For button presses, hold times, and if they are released directly from LOVE +self.pressed_buttons = {} +self.held_buttons = {} +self.held_button_times = {} +self.released_buttons = {} + +--For all controller interrupts +self.interrupt = { + focus = false, +} + +--For all controller locks +self.locks = {} +self.locked = nil + +--Buttons pressed and released during axis updates +self.axis_buttons = { + l_stick = {current = '', previous = ''}, + r_stick = {current = '', previous = ''}, + l_trig = {current = '', previous = ''}, + r_trig = {current = '', previous = ''} +} + +--The speed that the controller thumbstick moves the cursor +self.axis_cursor_speed = 20 + +--A registry of buttons, each a valid button input name corresponding to a node (likely a button). This is modified with the registry functions +self.button_registry = {} + +--A node representing where the cursor should 'snap' to. When this is set, then next frame should have the cursor to that position or on that node. Use :snap_to +self.snap_cursor_to = nil + +--A stack of cursor positions, this stack changes depending on the depth of menus on screen so the game can remember where you last had your cursor +--This needs to keep track of both positions and nodes if possible, as well as the depth +self.cursor_context = { + layer = 1, + stack = {} +} + +self.cardarea_context = {} + +--Human Interface device flags, these are set per frame to ensure that correct controller updates are taking place +self.HID = { + last_type = '', + dpad = false, + pointer = true, + touch = false, + controller = false, + mouse = true, + axis_cursor = false, +} + +--The gamepad most recently used, if any +self.GAMEPAD = {object = nil, mapping = nil, name = nil} +self.GAMEPAD_CONSOLE = '' --Valid button icons for Xbox, Playstation and Nintendo controllers + +--If we need an emulated gamepad for keyboard controls +self.keyboard_controller = { + getGamepadMappingString = function() return 'balatro_kbm' end, + getGamepadAxis = function() return 0 end +} + +self.is_cursor_down = false +end + +--Sets the gamepad to be the updated gamepad, searches for the console type and sets the art button pips accordingly +--Some code here is from github.com/idbrii/love-gamepadguesser (MIT License) +function Controller:set_gamepad(_gamepad) + if self.GAMEPAD.object ~= _gamepad then + self.GAMEPAD.object = _gamepad + self.GAMEPAD.mapping = _gamepad:getGamepadMappingString() or '' + self.GAMEPAD.name = self.GAMEPAD.mapping:match("^%x*,(.-),") or '' + self.GAMEPAD.temp_console = self:get_console_from_gamepad(self.GAMEPAD.name) + if self.GAMEPAD_CONSOLE ~= self.GAMEPAD.temp_console then + self.GAMEPAD_CONSOLE = self.GAMEPAD.temp_console + for k, v in pairs(G.I.SPRITE) do + if v.atlas == G.ASSET_ATLAS["gamepad_ui"] then + v.sprite_pos.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 + v:set_sprite_pos(v.sprite_pos) + end + end + end + self.GAMEPAD.temp_console = nil + end +end + +--Some code here is from github.com/idbrii/love-gamepadguesser (MIT License) +function Controller:get_console_from_gamepad(_gamepad) + G.ARGS.gamepad_patterns = G.ARGS.gamepad_patterns or + { + Playstation = {"%f[%w]PS%d%f[%D]", "Sony%f[%W]", "Play[Ss]tation"}, + Nintendo = {"Wii%f[%L]", "%f[%u]S?NES%f[%U]", "%f[%l]s?nes%f[%L]", "%f[%u]Switch%f[%L]", "Joy[- ]Cons?%f[%L]",}, + --Keyboard = {'balatro_kbm'} + } + + for k, v in pairs(G.ARGS.gamepad_patterns) do + for kk, vv in ipairs(v) do + if _gamepad:match(vv) then + return k + end + end + end + return 'Xbox' +end + +--The universal controller for what type of HID Device the player is using to interact with the game. The Game should be able to handle switching +--to any viable HID at any time +function Controller:set_HID_flags(HID_type, button) + --we need to determine it the axis input will be handled like a button or pointer + --if button and self.HID.controller and not string.find(button, 'dp') then return end + if HID_type == 'axis' then + self.HID.controller = true + self.HID.last_type = 'axis' + elseif HID_type and HID_type ~= self.HID.last_type then + self.HID.dpad = HID_type == 'button' + self.HID.pointer = HID_type == 'mouse' or HID_type == 'axis_cursor' or HID_type == 'touch' + self.HID.controller = HID_type == 'button' or HID_type == 'axis_cursor' + self.HID.mouse = HID_type == 'mouse' + self.HID.touch = HID_type == 'touch' + self.HID.axis_cursor = HID_type == 'axis_cursor' + self.HID.last_type = HID_type + + if self.HID.mouse then + love.mouse.setVisible(true) + else + love.mouse.setVisible(false) + end + end + if not self.HID.controller then + self.GAMEPAD_CONSOLE = '' + self.GAMEPAD.object = nil + self.GAMEPAD.mapping = nil + self.GAMEPAD.name = nil + end +end + +--Sets the current position of the cursor +function Controller:set_cursor_position() + --If using a mouse for the cursor + if self.HID.mouse or self.HID.touch then + self.interrupt.focus = false + --Never focus if using the mouse + if self.focused.target then + self.focused.target.states.focus.is = false + self.focused.target= nil + end + + --Set the position of the cursor to the love position of the mouse, derive cursor transform from that + self.cursor_position.x, self.cursor_position.y = love.mouse.getPosition() + G.CURSOR.T.x = self.cursor_position.x/(G.TILESCALE*G.TILESIZE) + G.CURSOR.T.y = self.cursor_position.y/(G.TILESCALE*G.TILESIZE) + G.CURSOR.VT.x = G.CURSOR.T.x + G.CURSOR.VT.y = G.CURSOR.T.y + end +end + +--Called every game logic update frame +function Controller:update(dt) + + --parse all locks and set + self.locked = false + + for k, v in pairs(self.locks) do + if v then self.locked = true end + end + if self.locks.frame_set then + self.locks.frame_set = nil + self.overlay_timer = 0 + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + timer = 'UPTIME', + blocking = false, + blockable = false, + no_delete = true, + func = (function() + self.locks.frame = nil + return true + end) + })) + end + + self.overlay_timer = self.overlay_timer or 0 + if G.OVERLAY_MENU then + self.overlay_timer = self.overlay_timer + dt + else + self.overlay_timer = 0 + end + + if self.overlay_timer > 1.5 then self.locks.frame = nil end + + --Remove anything from the registry that is no longer in game + self:cull_registry() + + --Calculate the axis update and set the HID flags if there is any axis input + self:set_HID_flags(self:update_axis(dt)) + + --Set the cursor to be visible only if we are using a mouse or an axis to control the cursor position + if self.HID.pointer and not (self.HID.mouse or self.HID.touch) and not self.interrupt.focus then + G.CURSOR.states.visible = true + else + G.CURSOR.states.visible = false + end + + --For mouse input, reset any controller things and set the cursor to be where the mouse is + self:set_cursor_position() + + --Handle all the button updates and key updates, call the required functions + if not G.screenwipe then + --Key press and release handling + for k, v in pairs(self.pressed_keys) do + if v then self:key_press_update(k, dt) end + end + for k, v in pairs(self.held_keys) do + if v then self:key_hold_update(k, dt) end + end + for k, v in pairs(self.released_keys) do + if v then self:key_release_update(k, dt) end + end + + --Button press and release handling + for k, v in pairs(self.pressed_buttons) do + if v then self:button_press_update(k, dt) end + end + for k, v in pairs(self.held_buttons) do + if v then self:button_hold_update(k, dt) end + end + for k, v in pairs(self.released_buttons) do + if v then self:button_release_update(k, dt) end + end + end + + self.frame_buttonpress = false + + --reset press and release lists + self.pressed_keys = EMPTY(self.pressed_keys) + self.released_keys = EMPTY(self.released_keys) + self.pressed_buttons= EMPTY(self.pressed_buttons) + self.released_buttons = EMPTY(self.released_buttons) + + + --If using controller, update context and snap tos + if self.HID.controller then + --If there is a node/position to snap to from the cursor context layer + if self.cursor_context.stack[self.cursor_context.layer] then + local _context = self.cursor_context.stack[self.cursor_context.layer] + self:snap_to{node = (_context.node and not _context.node.REMOVED and _context.node), T = _context.cursor_pos} + self.interrupt.stack = _context.interrupt + self.cursor_context.stack[self.cursor_context.layer] = nil + end + --If there is a card the was being dragged but no longer is, snap to it + if self.dragging.prev_target and not self.dragging.target and getmetatable(self.dragging.prev_target) == Card and not self.dragging.prev_target.REMOVED then + --Overly complicated coyote time focus, so the user can quickly select cards without things going wonky + if not self.COYOTE_FOCUS then + self:snap_to{node = self.dragging.prev_target} + else + self.COYOTE_FOCUS = nil + end + end + --If the cursor should snap to a location + if self.snap_cursor_to then + self.interrupt.focus = self.interrupt.stack + self.interrupt.stack = false + if self.snap_cursor_to.type == 'node' and not self.snap_cursor_to.node.REMOVED then + self.focused.prev_target = self.focused.target + self.focused.target = self.snap_cursor_to.node + self:update_cursor() + elseif self.snap_cursor_to.type == 'transform' then + self:update_cursor(self.snap_cursor_to.T) + end + if self.focused.prev_target ~= self.focused.target and self.focused.prev_target then self.focused.prev_target.states.focus.is = false end + self.snap_cursor_to = nil + end + end + + --Reset all collision states, get every node that collides with the cursor, then update the focus and hover targets + self:get_cursor_collision(G.CURSOR.T) + self:update_focus() + self:set_cursor_hover() + if self.L_cursor_queue then + self:L_cursor_press(self.L_cursor_queue.x, self.L_cursor_queue.y) + self.L_cursor_queue = nil + end + + self.dragging.prev_target = self.dragging.target + self.released_on.prev_target = self.released_on.target + self.clicked.prev_target = self.clicked.target + self.hovering.prev_target = self.hovering.target + + --Cursor is currently down + if not self.cursor_down.handled then + if self.cursor_down.target.states.drag.can then + self.cursor_down.target.states.drag.is = true + self.cursor_down.target:set_offset(self.cursor_down.T, 'Click') + self.dragging.target = self.cursor_down.target + self.dragging.handled = false + end + self.cursor_down.handled = true + end + + if not self.cursor_up.handled then + --First, stop dragging + if self.dragging.target then + self.dragging.target:stop_drag() + self.dragging.target.states.drag.is = false + self.dragging.target = nil + end + --Now, handle the Cursor release + --Was the Cursor release in the same location as the Cursor press and within Cursor timeout? + if self.cursor_down.target then + if (not self.cursor_down.target.click_timeout or self.cursor_down.target.click_timeout*G.SPEEDFACTOR > self.cursor_up.time - self.cursor_down.time) then + if Vector_Dist(self.cursor_down.T, self.cursor_up.T) < G.MIN_CLICK_DIST then + if self.cursor_down.target.states.click.can then + self.clicked.target = self.cursor_down.target + self.clicked.handled = false + end + --if not, was the Cursor dragging some other thing? + elseif self.dragging.prev_target and self.cursor_up.target and self.cursor_up.target.states.release_on.can then + self.released_on.target = self.cursor_up.target + self.released_on.handled = false + end + end + end + self.cursor_up.handled = true + end + + --Cursor is currently hovering over something + if self.cursor_hover.target and self.cursor_hover.target.states.hover.can and (not self.HID.touch or self.is_cursor_down) then + self.hovering.target = self.cursor_hover.target + if self.hovering.prev_target and self.hovering.prev_target ~= self.hovering.target then self.hovering.prev_target.states.hover.is = false end + self.hovering.target.states.hover.is = true + self.hovering.target:set_offset(self.cursor_hover.T, 'Hover') + elseif (self.cursor_hover.target == nil or (self.HID.touch and not self.is_cursor_down)) and self.hovering.target then + self.hovering.target.states.hover.is = false + self.hovering.target = nil + end + + -------------------------------------------------------------------- + -- Sending all input updates to the game objects + -------------------------------------------------------------------- + --The clicked object + if not self.clicked.handled then + self.clicked.target:click() + self.clicked.handled = true + end + + --Process registry clicks + self:process_registry() + + --The object being dragged + if self.dragging.target then + self.dragging.target:drag() + end + + --The object released on + if not self.released_on.handled and self.dragging.prev_target then + if self.dragging.prev_target == self.hovering.target then self.hovering.target:stop_hover();self.hovering.target = nil end + self.released_on.target:release(self.dragging.prev_target) + self.released_on.handled = true + end + + --The object being hovered over + if self.hovering.target then + self.hovering.target:set_offset(self.cursor_hover.T, 'Hover') + if self.hovering.prev_target ~= self.hovering.target then + if self.hovering.target ~= self.dragging.target and not self.HID.touch then + self.hovering.target:hover() + elseif self.HID.touch then + local _ID = self.hovering.target.ID + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + blocking = false, + delay = G.MIN_HOVER_TIME, + func = function() + if self.hovering.target and _ID == self.hovering.target.ID then + self.hovering.target:hover() + end + return true + end + })) + if self.hovering.prev_target then + self.hovering.prev_target:stop_hover() + end + end + if self.hovering.prev_target then + self.hovering.prev_target:stop_hover() + end + end + elseif self.hovering.prev_target then + self.hovering.prev_target:stop_hover() + end + if self.hovering.target and self.hovering.target == self.dragging.target and not self.HID.touch then + self.hovering.target:stop_hover() + end +end + +--Brute force remove all registries that no longer have valid nodes +function Controller:cull_registry() + for k, registry in pairs(self.button_registry) do + for i=#registry, 1, -1 do + if registry[i].node.REMOVED then + table.remove(registry, i) + end + end + end +end + +--Adds a node to the controller registry. Supply the button that will be pressed in order to click this node +-- +---@param node Node The node that will be clicked when the registry is pressed +---@param registry string The button to register, must be a valid gamepad input +function Controller:add_to_registry(node, registry) + --If the button doesn't have a registry list yet, add it + self.button_registry[registry] = self.button_registry[registry] or {} + + --There really should only ever be one entry per registered button, but that is hard sometimes with all the stuff on screen. + --If that does happen, the most recently registered one will be used and the old one will be kept in case we remove the new button and want to keep the old binding + table.insert(self.button_registry[registry], 1, {node = node, menu = (not not G.OVERLAY_MENU) or (not not G.SETTINGS.paused)}) +end + +--Process any click function of any nodes that have been clicked in the button registry +function Controller:process_registry() + for _, registry in pairs(self.button_registry) do + for i=1, #registry do + if registry[i].click and registry[i].node.click then + if registry[i].menu == not not G.OVERLAY_MENU and + registry[i].node.T.x > -2 and registry[i].node.T.x < G.ROOM.T.w + 2 and + registry[i].node.T.y > -2 and registry[i].node.T.y < G.ROOM.T.h + 2 then + registry[i].node:click() + end + registry[i].click = nil + end + end + end +end + +--Add or remove layers from the context for the cursor. This allows the cursor to 'snap' back to the previous layer when the current layer is removed\ +--in such cases where a menu on screen is removed or nested menus are being navigated +-- +---@param delta number The direction to modify the cursor context, 1 to add a layer, -1 to remove a layer, -1000 to remove all layers except for the base +function Controller:mod_cursor_context_layer(delta) + --Add a layer to the context, reference the node but if that node has been removed also save the cursor position too + if delta == 1 then + local prev_cursor_context = {node = self.focused.target, cursor_pos = {x = G.CURSOR.T.x, y = G.CURSOR.T.y}, interrupt = self.interrupt.focus} + self.cursor_context.stack[self.cursor_context.layer] = prev_cursor_context + self.cursor_context.layer = self.cursor_context.layer + 1 + + --remove the top layer from the stack + elseif delta == -1 then + self.cursor_context.stack[self.cursor_context.layer] = nil + self.cursor_context.layer = self.cursor_context.layer - 1 + + --remove all but the base layer from the stack + elseif delta == -1000 then + self.cursor_context.layer = 1 + self.cursor_context.stack = {self.cursor_context.stack[1]} + + --remove all layers + elseif delta == -2000 then + self.cursor_context.layer = 1 + self.cursor_context.stack = {} + end + + --Navigate focus, will default to the top layer on the stack + self:navigate_focus() +end + +--Snap the cursor to a particular node or transform +function Controller:snap_to(args) + self.snap_cursor_to = {node = args.node, T = args.T, type = args.node and 'node' or 'transform'} +end + +--saves the focus context to be loaded in the future, for example if the shop is rerolled while a card is highlighted +function Controller:save_cardarea_focus(_cardarea) + if G[_cardarea] then + if self.focused.target and self.focused.target.area and self.focused.target.area == G[_cardarea] then + self.cardarea_context[_cardarea] = self.focused.target.rank + return true + else + self.cardarea_context[_cardarea] = nil + end + end +end + +--recalls the focus context for a particular cardarea +function Controller:recall_cardarea_focus(_cardarea) + local ca_string = nil + if type(_cardarea) == 'string' then ca_string = _cardarea; _cardarea = G[_cardarea] end + + if _cardarea and (not self.focused.target or + self.interrupt.focus or + (not self.interrupt.focus and self.focused.target.area and self.focused.target.area == _cardarea)) then + if ca_string and self.cardarea_context[ca_string] then + for i = self.cardarea_context[ca_string], 1, -1 do + if _cardarea.cards[i] then + self:snap_to({node = _cardarea.cards[i]}) + self.interrupt.focus = false + break + end + end + elseif _cardarea.cards and _cardarea.cards[1] then + self:snap_to({node = _cardarea.cards[1]}) + self.interrupt.focus = false + end + end + if ca_string then self.cardarea_context[ca_string] = nil end +end + +--Updated the location of the cursor, either with a specific T or if there is a Node target +function Controller:update_cursor(hard_set_T) + if hard_set_T then + G.CURSOR.T.x = hard_set_T.x + G.CURSOR.T.y = hard_set_T.y + self.cursor_position.x = G.CURSOR.T.x*(G.TILESCALE*G.TILESIZE) + self.cursor_position.y = G.CURSOR.T.y*(G.TILESCALE*G.TILESIZE) + G.CURSOR.VT.x = G.CURSOR.T.x + G.CURSOR.VT.y = G.CURSOR.T.y + return + end + if self.focused.target then + self.cursor_position.x, self.cursor_position.y = self.focused.target:put_focused_cursor() + G.CURSOR.T.x = self.cursor_position.x/(G.TILESCALE*G.TILESIZE) + G.CURSOR.T.y = self.cursor_position.y/(G.TILESCALE*G.TILESIZE) + G.CURSOR.VT.x = G.CURSOR.T.x + G.CURSOR.VT.y = G.CURSOR.T.y + end +end + +--Helper function to set the button presses/releases for the values determined in update_axis() +function Controller:handle_axis_buttons() + for _, v in pairs(G.CONTROLLER.axis_buttons) do + --Button is no longer being pressed + if v.previous ~= '' and (v.current == '' or v.previous ~= v.current) then + G.CONTROLLER:button_release(v.previous) + end + --New button is being pressed + if v.current ~= '' and v.previous ~= v.current then + G.CONTROLLER:button_press(v.current) + end + end +end + +--Handles all axis input for left stick, right stick and triggers. Treats them as buttons or cursors depending on context +function Controller:update_axis(dt) + --Keep track of if there is any cursor movement from the axis changes + local axis_interpretation = nil + + --Advance all the axis buttons to determine if there were any changes + self.axis_buttons.l_stick.previous = self.axis_buttons.l_stick.current; self.axis_buttons.l_stick.current = '' + self.axis_buttons.r_stick.previous = self.axis_buttons.r_stick.current; self.axis_buttons.r_stick.current = '' + self.axis_buttons.l_trig.previous = self.axis_buttons.l_trig.current; self.axis_buttons.l_trig.current = '' + self.axis_buttons.r_trig.previous = self.axis_buttons.r_trig.current; self.axis_buttons.r_trig.current = '' + + if self.HID.controller then + --------------------------------------------------------------- + -- Left Thumbstick + --------------------------------------------------------------- + local l_stick_x = self.GAMEPAD.object:getGamepadAxis('leftx') + local l_stick_y = self.GAMEPAD.object:getGamepadAxis('lefty') + --If there is something being dragged, we want to treat the left stick as a cursor input + if self.dragging.target and math.abs(l_stick_x) + math.abs(l_stick_y) > 0.1 then + axis_interpretation = 'axis_cursor' --There is some cursor movement + + --deadzone of 10% for each axis of l_stick + if math.abs(l_stick_x) < 0.1 then l_stick_x = 0 end + if math.abs(l_stick_y) < 0.1 then l_stick_y = 0 end + l_stick_x = l_stick_x + (l_stick_x>0 and -0.1 or 0) + (l_stick_x<0 and 0.1 or 0) + l_stick_y = l_stick_y + (l_stick_y>0 and -0.1 or 0) + (l_stick_y<0 and 0.1 or 0) + + --Modify the cursor position according to the l_stick axis values + G.CURSOR.T.x = G.CURSOR.T.x + dt*l_stick_x*self.axis_cursor_speed + G.CURSOR.T.y = G.CURSOR.T.y + dt*l_stick_y*self.axis_cursor_speed + G.CURSOR.VT.x = G.CURSOR.T.x + G.CURSOR.VT.y = G.CURSOR.T.y + + self.cursor_position.x = G.CURSOR.T.x*(G.TILESCALE*G.TILESIZE) + self.cursor_position.y = G.CURSOR.T.y*(G.TILESCALE*G.TILESIZE) + + --If nothing is being dragged, we want to treat the left stick as a dpad input + else + self.axis_buttons.l_stick.current = self.axis_buttons.l_stick.previous + if math.abs(l_stick_x) + math.abs(l_stick_y) > 0.5 then + axis_interpretation = 'button' --left stick is no longer a cursor, can be set below from the right stick though + + self.axis_buttons.l_stick.current = math.abs(l_stick_x) > math.abs(l_stick_y) and + (l_stick_x > 0 and 'dpright' or 'dpleft') or + (l_stick_y > 0 and 'dpdown' or 'dpup') + elseif math.abs(l_stick_x) + math.abs(l_stick_y) < 0.3 then + self.axis_buttons.l_stick.current = '' + end + end + + --------------------------------------------------------------- + -- Right Thumbstick + --------------------------------------------------------------- + local r_stick_x = self.GAMEPAD.object:getGamepadAxis('rightx') + local r_stick_y = self.GAMEPAD.object:getGamepadAxis('righty') + G.DEADZONE = 0.2 + local mag = math.sqrt(math.abs(r_stick_x)^2 + math.abs(r_stick_y)^2) + if mag > G.DEADZONE then + axis_interpretation = 'axis_cursor' --There is some cursor movement + + --deadzone of 20% for each axis of l_stick + if math.abs(r_stick_x) < G.DEADZONE then r_stick_x = 0 end + if math.abs(r_stick_y) < G.DEADZONE then r_stick_y = 0 end + r_stick_x = r_stick_x + (r_stick_x>0 and -G.DEADZONE or 0) + (r_stick_x<0 and G.DEADZONE or 0) + r_stick_y = r_stick_y + (r_stick_y>0 and -G.DEADZONE or 0) + (r_stick_y<0 and G.DEADZONE or 0) + + --Modify the cursor position according to the l_stick axis values + G.CURSOR.T.x = G.CURSOR.T.x + dt*r_stick_x*self.axis_cursor_speed + G.CURSOR.T.y = G.CURSOR.T.y + dt*r_stick_y*self.axis_cursor_speed + G.CURSOR.VT.x = G.CURSOR.T.x + G.CURSOR.VT.y = G.CURSOR.T.y + + self.cursor_position.x = G.CURSOR.T.x*(G.TILESCALE*G.TILESIZE) + self.cursor_position.y = G.CURSOR.T.y*(G.TILESCALE*G.TILESIZE) + end + + --------------------------------------------------------------- + -- Triggers + --------------------------------------------------------------- + --Triggers are just buttons + local l_trig = self.GAMEPAD.object:getGamepadAxis('triggerleft') + local r_trig = self.GAMEPAD.object:getGamepadAxis('triggerright') + + --Set the current to be the same as previous, only set to '' if the trigger value is low enough + self.axis_buttons.l_trig.current = self.axis_buttons.l_trig.previous + self.axis_buttons.r_trig.current = self.axis_buttons.r_trig.previous + + --Make a tilting effect when you press the triggers while hovering over a node that has tilt_var + if self.focused.target and self.focused.target.tilt_var then + --self.focused.target.tilt_var.dx = 0.1*(r_trig - l_trig) + 0.9*self.focused.target.tilt_var.dx + end + + if l_trig > 0.5 then + self.axis_buttons.l_trig.current = 'triggerleft' + elseif l_trig < 0.3 then + self.axis_buttons.l_trig.current = '' + end + if r_trig > 0.5 then + self.axis_buttons.r_trig.current = 'triggerright' + elseif r_trig < 0.3 then + self.axis_buttons.r_trig.current = '' + end + + --return 'button' if trigger is being used and axis is not + if self.axis_buttons.r_trig.current ~= '' or self.axis_buttons.l_trig.current ~= '' then + axis_interpretation = axis_interpretation or 'button' + end + + self:handle_axis_buttons() + end + + if axis_interpretation then self.interrupt.focus = false end + + return axis_interpretation +end + +function Controller:button_press_update(button, dt) + if self.locks.frame then return end + self.held_button_times[button] = 0 + self.interrupt.focus = false + + if not self:capture_focused_input(button, 'press', dt) then + if button == "dpup" then + self:navigate_focus('U') + end + if button == "dpdown" then + self:navigate_focus('D') + end + if button == "dpleft" then + self:navigate_focus('L') + end + if button == "dpright" then + self:navigate_focus('R') + end + end + + if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end + self.frame_buttonpress = true + + if self.button_registry[button] and self.button_registry[button][1] and not self.button_registry[button][1].node.under_overlay then + self.button_registry[button][1].click = true + else + if button == 'start' then + if G.STATE == G.STATES.SPLASH then + G:delete_run() + G:main_menu() + end + end + if button == "a" then + if self.focused.target and + self.focused.target.config.focus_args and + self.focused.target.config.focus_args.type == 'slider' and + (not G.CONTROLLER.HID.mouse and not G.CONTROLLER.HID.axis_cursor) then + else + self:L_cursor_press() + end + end + if button == 'b' then + if G.hand and self.focused.target and + self.focused.target.area == G.hand then + self:queue_R_cursor_press() + else + self.interrupt.focus = true + end + end + end +end + +function Controller:button_hold_update(button, dt) + if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end + self.frame_buttonpress = true + if self.held_button_times[button] then + self.held_button_times[button] = self.held_button_times[button] + dt + self:capture_focused_input(button, 'hold', dt) + end + if (button == 'dpleft' or button == 'dpright' or button == 'dpup' or button == 'dpdown') and not self.no_holdcap then + self.repress_timer = self.repress_timer or 0.3 + if self.held_button_times[button] and (self.held_button_times[button] > self.repress_timer) then + self.repress_timer = 0.1 + self.held_button_times[button] = 0 + self:button_press_update(button, dt) + end + end +end + +function Controller:button_release_update(button, dt) + if not self.held_button_times[button] then return end + self.repress_timer = 0.3 + self.held_button_times[button] = nil + if button == 'a' then + self:L_cursor_release() + end +end + +function Controller:key_press_update(key, dt) + if self.locks.frame then return end + if string.sub(key, 1, 2) == 'kp' then key = string.sub(key, 3) end + if key == 'enter' then key = 'return' end + + if self.text_input_hook then + if key == "escape" then + self.text_input_hook = nil + elseif key == "capslock" then + self.capslock = not self.capslock + else + G.FUNCS.text_input_key{ + e=self.text_input_hook, + key = key, + caps = self.held_keys["lshift"] or self.held_keys["rshift"] + } + end + return + end + + if key == "escape" then + if G.STATE == G.STATES.SPLASH then + G:delete_run() + G:main_menu() + else + if not G.OVERLAY_MENU then + G.FUNCS:options() + elseif not G.OVERLAY_MENU.config.no_esc then + G.FUNCS:exit_overlay_menu() + end + end + end + + if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end + self.frame_buttonpress = true + self.held_key_times[key] = 0 + + + if not _RELEASE_MODE then + if key == 'tab' and not G.debug_tools then + G.debug_tools = UIBox{ + definition = create_UIBox_debug_tools(), + config = {align='cr', offset = {x=G.ROOM.T.x + 11,y=0},major = G.ROOM_ATTACH, bond = 'Weak'} + } + G.E_MANAGER:add_event(Event({ + blockable = false, + func = function() + G.debug_tools.alignment.offset.x = -4 + return true + end + })) + end + if self.hovering.target and self.hovering.target:is(Card) then + local _card = self.hovering.target + if G.OVERLAY_MENU then + if key == "1" then + unlock_card(_card.config.center) + _card:set_sprites(_card.config.center) + end + if key == "2" then + unlock_card(_card.config.center) + discover_card(_card.config.center) + _card:set_sprites(_card.config.center) + end + if key == "3" then + if _card.ability.set == 'Joker' and G.jokers and #G.jokers.cards < G.jokers.config.card_limit then + add_joker(_card.config.center.key) + _card:set_sprites(_card.config.center) + end + if _card.ability.consumeable and G.consumeables and #G.consumeables.cards < G.consumeables.config.card_limit then + add_joker(_card.config.center.key) + _card:set_sprites(_card.config.center) + end + end + end + if key == 'q' then + if (_card.ability.set == 'Joker' or _card.playing_card or _card.area) then + local _edition = { + foil = not _card.edition, + holo = _card.edition and _card.edition.foil, + polychrome = _card.edition and _card.edition.holo, + negative = _card.edition and _card.edition.polychrome, + } + _card:set_edition(_edition, true, true) + end + end + end + if key == 'h' then + G.debug_UI_toggle = not G.debug_UI_toggle + end + if key == 'b' then + G:delete_run() + G:start_run({}) + end + if key == 'l' then + G:delete_run() + 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 + G:start_run({savetext = G.SAVED_GAME}) + end + if key == 'j' then + G.debug_splash_size_toggle = not G.debug_splash_size_toggle + G:delete_run() + G:main_menu('splash') + end + if key == '8' then + love.mouse.setVisible( not love.mouse.isVisible() ) + end + if key == '9' then + G.debug_tooltip_toggle = not G.debug_tooltip_toggle + end + if key == "space" then + live_test() + end + if key == 'v' then + if not G.prof then G.prof = require "engine/profile"; G.prof.start() + else G.prof:stop(); + print(G.prof.report()); G.prof = nil end + end + if key == "p" then + G.SETTINGS.perf_mode = not G.SETTINGS.perf_mode + end + end +end + +function Controller:key_hold_update(key, dt) + if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end + --self.frame_buttonpress = true + if self.held_key_times[key] then + if key == "r" and not G.SETTINGS.paused then + if self.held_key_times[key] > 0.7 then + if not G.GAME.won and not G.GAME.seeded and not G.GAME.challenge then + G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt = 0 + end + G:save_settings() + self.held_key_times[key] = nil + G.SETTINGS.current_setup = 'New Run' + G.GAME.viewed_back = nil + G.run_setup_seed = G.GAME.seeded + G.challenge_tab = G.GAME and G.GAME.challenge and G.GAME.challenge_tab or nil + G.forced_seed, G.setup_seed = nil, nil + if G.GAME.seeded then G.forced_seed = G.GAME.pseudorandom.seed end + G.forced_stake = G.GAME.stake + if G.STAGE == G.STAGES.RUN then G.FUNCS.start_setup_run() end + G.forced_stake = nil + G.challenge_tab = nil + G.forced_seed = nil + else + self.held_key_times[key] = self.held_key_times[key] + dt + end + end + end +end + +function Controller:key_release_update(key, dt) + if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end + self.frame_buttonpress = true + if key == "a" and self.held_keys["g"] and not _RELEASE_MODE then + G.DEBUG = not(G.DEBUG) + end + if key == 'tab' and G.debug_tools then + G.debug_tools:remove() + G.debug_tools = nil + end +end + +function Controller:key_press(key) + self.pressed_keys[key] = true + self.held_keys[key] = true +end + +function Controller:key_release(key) + self.held_keys[key] = nil + self.released_keys[key] = true +end + +function Controller:button_press(button) + self.pressed_buttons[button] = true + self.held_buttons[button] = true +end + +function Controller:button_release(button) + self.held_buttons[button] = nil + self.released_buttons[button] = true +end + +function Controller:get_cursor_collision(cursor_trans) + self.collision_list = EMPTY(self.collision_list) + self.nodes_at_cursor = EMPTY(self.nodes_at_cursor) + + if self.COYOTE_FOCUS then return end + if self.dragging.target then + self.dragging.target.states.collide.is = true + self.nodes_at_cursor[#self.nodes_at_cursor+1] = self.dragging.target + self.collision_list[#self.collision_list+1] = self.dragging.target + end + + if not G.DRAW_HASH[1] or + cursor_trans.x-G.ROOM.T.x < -G.DRAW_HASH_BUFF or cursor_trans.x-G.ROOM.T.x > G.TILE_W + G.DRAW_HASH_BUFF or + cursor_trans.y-G.ROOM.T.y < -G.DRAW_HASH_BUFF or cursor_trans.y-G.ROOM.T.y > G.TILE_H + G.DRAW_HASH_BUFF then + return + end + + local DRAW_HASH_SQUARE = G.DRAW_HASH + for i = #DRAW_HASH_SQUARE, 1, -1 do + local v = DRAW_HASH_SQUARE[i] + if v:collides_with_point(cursor_trans) and not v.REMOVED then + self.nodes_at_cursor[#self.nodes_at_cursor+1] = v + if v.states.collide.can then + v.states.collide.is = true + self.collision_list[#self.collision_list+1] = v + end + end + end +end + +function Controller:set_cursor_hover() + self.cursor_hover.T = self.cursor_hover.T or {} + self.cursor_hover.T.x, self.cursor_hover.T.y =G.CURSOR.T.x, G.CURSOR.T.y + self.cursor_hover.time = G.TIMERS.TOTAL + + self.cursor_hover.prev_target = self.cursor_hover.target + self.cursor_hover.target = nil + + if self.interrupt.focus or ((self.locked) and (not G.SETTINGS.paused or G.screenwipe)) or self.locks.frame or self.COYOTE_FOCUS then self.cursor_hover.target = G.ROOM; return end + + if self.HID.controller and self.focused.target and self.focused.target.states.hover.can then + if (self.HID.dpad or self.HID.axis_cursor) and self.focused.target.states.collide.is then + self.cursor_hover.target = self.focused.target + else + for _, v in ipairs(self.collision_list) do + if v.states.hover.can then + self.cursor_hover.target = v + break + end + end + end + else + for _, v in ipairs(self.collision_list) do + if v.states.hover.can and (not v.states.drag.is or self.HID.touch) then + self.cursor_hover.target = v + break + end + end + end + + if not self.cursor_hover.target or (self.dragging.target and not self.HID.touch) then self.cursor_hover.target = G.ROOM end + if self.cursor_hover.target ~= self.cursor_hover.prev_target then self.cursor_hover.handled = false end +end + +function Controller:queue_L_cursor_press(x, y) + if self.locks.frame then return end + if G.STATE == G.STATES.SPLASH then + self:key_press('escape') + end + self.L_cursor_queue = {x = x, y = y} +end + +function Controller:queue_R_cursor_press(x, y) + if self.locks.frame then return end + if not G.SETTINGS.paused and G.hand and G.hand.highlighted[1] then + if (G.play and #G.play.cards > 0) or + (self.locked) or + (self.locks.frame) or + (G.GAME.STOP_USE and G.GAME.STOP_USE > 0) then return end + G.hand:unhighlight_all() + end +end + +function Controller:L_cursor_press(x, y) + x = x or self.cursor_position.x + y = y or self.cursor_position.y + + if ((self.locked) and (not G.SETTINGS.paused or G.screenwipe)) or (self.locks.frame) then return end + + self.cursor_down.T = {x = x/(G.TILESCALE*G.TILESIZE), y = y/(G.TILESCALE*G.TILESIZE)} + self.cursor_down.time = G.TIMERS.TOTAL + self.cursor_down.handled = false + self.cursor_down.target = nil + self.is_cursor_down = true + + local press_node = (self.HID.touch and self.cursor_hover.target) or self.hovering.target or self.focused.target + + if press_node then + self.cursor_down.target = press_node.states.click.can and press_node or press_node:can_drag() or nil + end + + if self.cursor_down.target == nil then + self.cursor_down.target = G.ROOM + end +end + +function Controller:L_cursor_release(x, y) + x = x or self.cursor_position.x + y = y or self.cursor_position.y + + if ((self.locked) and (not G.SETTINGS.paused or G.screenwipe)) or (self.locks.frame) then return end + + self.cursor_up.T = {x = x/(G.TILESCALE*G.TILESIZE), y = y/(G.TILESCALE*G.TILESIZE)} + self.cursor_up.time = G.TIMERS.TOTAL + self.cursor_up.handled = false + self.cursor_up.target = nil + self.is_cursor_down = false + + self.cursor_up.target = self.hovering.target or self.focused.target + + if self.cursor_up.target == nil then + self.cursor_up.target = G.ROOM + end +end + +function Controller:is_node_focusable(node) + local ret_val = false + if node.T.y > G.ROOM.T.h + 3 then return false end + if not node.REMOVED and not node.under_overlay and (node.states.hover.can and not self.dragging.target or self.dragging.target == node) and + (not not node.created_on_pause) == (not not G.SETTINGS.paused) and + (node.states.visible) and (not node.UIBox or node.UIBox.states.visible) then + if self.screen_keyboard then + if node.UIBox and node.UIBox == self.screen_keyboard and node.config.button then + ret_val = true + end + else + if node:is(Card) and (node.facing == 'front' or node.area == G.hand or node.area == G.jokers or (node == G.deck)) and + node.states.hover.can and not node.jimbo then + ret_val = true + end + if node.config and node.config.force_focus then ret_val = true end + if node.config and node.config.button then ret_val = true end + if node.config and node.config.focus_args then + if node.config.focus_args.type == 'none' or node.config.focus_args.funnel_from then + ret_val = false + else + ret_val = true + end + end + end + end + return ret_val +end + +--essentially works like 'hovering' with any nodes that are focusable, but +--the nodes can also be navigated to via controller key inputs. If no direction is supplied, +--this function focuses on any nodes that collide with this cursor. If a direction is +--supplied, focuses on the nearest node in that direction. +function Controller:update_focus(dir) + self.focused.prev_target = self.focused.target + + --Only needed when using a controller, hovering covers all KBM scenarios + if not self.HID.controller or self.interrupt.focus or (self.locked) and (not G.SETTINGS.paused or G.screenwipe) then + if self.focused.target then self.focused.target.states.focus.is = false end + self.focused.target = nil + return + end + + G.ARGS.focus_list = EMPTY(G.ARGS.focus_list) + G.ARGS.focusables = EMPTY(G.ARGS.focusables) + + ------------------------------------------------- + -- Find the focusable starting point + ------------------------------------------------- + --First, is there currently a focusable target that is still valid? + if self.focused.target then + self.focused.target.states.focus.is = false + + --If that node is no longer focusable or if the cursor no longer collides with the node, remove the target + if not self:is_node_focusable(self.focused.target) or not self.focused.target:collides_with_point(G.CURSOR.T) or self.HID.axis_cursor then + self.focused.target = nil + end + end + + --Now we check for 3 criteria: + --1: is there a current focused target and no dpad direction? if so, we simply add the currsnt focused target to the focusable list and set the state to true + --2: if not, and there is no dpad direction, iterate through the node list that the cursor intersects and check if any are focusable, only add the first one + --3: if there is a direction, add all focusable moveables to the focusable list to check later + if not dir and self.focused.target then + self.focused.target.states.focus.can = true + G.ARGS.focusables[#G.ARGS.focusables+1] = self.focused.target + else + if not dir then + for k, v in ipairs(self.nodes_at_cursor) do + v.states.focus.can = false + v.states.focus.is = false + if #G.ARGS.focusables == 0 and self:is_node_focusable(v) then + v.states.focus.can = true + G.ARGS.focusables[#G.ARGS.focusables+1] = v + end + end + else + for k, v in pairs(G.MOVEABLES) do + v.states.focus.can = false + v.states.focus.is = false + if self:is_node_focusable(v) then + v.states.focus.can = true + G.ARGS.focusables[#G.ARGS.focusables+1] = v + end + end + end + end + + --If there are any valid focusables + if #G.ARGS.focusables > 0 then + --If a direction control is supplied, set the target to be the closest node in that direction + if dir then + if (dir == 'L' or dir == 'R') and self.focused.target and self.focused.target:is(Card) and self.focused.target.area == G.hand and G.hand then + local nu_rank = self.focused.target.rank + (dir == 'L' and -1 or 1) + if nu_rank > #G.hand.cards then nu_rank = 1 end + if nu_rank == 0 then nu_rank = #G.hand.cards end + if nu_rank ~= self.focused.target.rank then G.ARGS.focus_list[1] = {node = G.hand.cards[nu_rank]} end + else + --set the cursor position to where it currently is on screen + G.ARGS.focus_cursor_pos = G.ARGS.focus_cursor_pos or {} + G.ARGS.focus_cursor_pos.x, G.ARGS.focus_cursor_pos.y = G.CURSOR.T.x - G.ROOM.T.x, G.CURSOR.T.y - G.ROOM.T.y + + --if there is a focused target, set the cursor to the midpoint + if self.focused.target then + _ft = self.focused.target + if self.focused.target.config.focus_args and self.focused.target.config.focus_args.funnel_to then + _ft = self.focused.target.config.focus_args.funnel_to + end + G.ARGS.focus_cursor_pos.x, G.ARGS.focus_cursor_pos.y = _ft.T.x + 0.5*_ft.T.w,_ft.T.y + 0.5*_ft.T.h + --if not but there is a focusable hovering target, put the cursor on it instead + elseif self.hovering.target and self.hovering.target.states.focus.can then + G.ARGS.focus_cursor_pos.x, G.ARGS.focus_cursor_pos.y = self.hovering.target:put_focused_cursor() + G.ARGS.focus_cursor_pos.x = G.ARGS.focus_cursor_pos.x / (G.TILESCALE*G.TILESIZE) - G.ROOM.T.x + G.ARGS.focus_cursor_pos.y = G.ARGS.focus_cursor_pos.y / (G.TILESCALE*G.TILESIZE) - G.ROOM.T.y + end + + --set the list to be all the nodes in that direction sorted by the closest node + for _, v in pairs(G.ARGS.focusables) do + if v ~= self.hovering.target and v ~= self.focused.target then + local eligible = false + + if v.config.focus_args and v.config.focus_args.funnel_to then + v = v.config.focus_args.funnel_to + end + + G.ARGS.focus_vec = G.ARGS.focus_vec or {} + G.ARGS.focus_vec.x = v.T.x + 0.5*v.T.w - (G.ARGS.focus_cursor_pos.x) + G.ARGS.focus_vec.y = v.T.y + 0.5*v.T.h - (G.ARGS.focus_cursor_pos.y) + + if v.config.focus_args and v.config.focus_args.nav then + if v.config.focus_args.nav == 'wide' then + if G.ARGS.focus_vec.y > 0.1 and dir == 'D' then eligible = true + elseif G.ARGS.focus_vec.y < -0.1 and dir == 'U' then eligible = true + elseif math.abs(G.ARGS.focus_vec.y) < v.T.h/2 then eligible = true end + elseif v.config.focus_args.nav == 'tall' then + if G.ARGS.focus_vec.x > 0.1 and dir == 'R' then eligible = true + elseif G.ARGS.focus_vec.x < -0.1 and dir == 'L' then eligible = true + elseif math.abs(G.ARGS.focus_vec.x) < v.T.w/2 then eligible = true end + end + elseif math.abs(G.ARGS.focus_vec.x) > math.abs(G.ARGS.focus_vec.y) then + if G.ARGS.focus_vec.x > 0 and dir == 'R' then eligible = true + elseif G.ARGS.focus_vec.x < 0 and dir == 'L' then eligible = true end + else + if G.ARGS.focus_vec.y > 0 and dir == 'D' then eligible = true + elseif G.ARGS.focus_vec.y < 0 and dir == 'U' then eligible = true end + end + + if eligible then + G.ARGS.focus_list[#G.ARGS.focus_list+1] = {node = v, dist = math.abs(G.ARGS.focus_vec.x) + math.abs(G.ARGS.focus_vec.y)} + end + end + end + if #G.ARGS.focus_list < 1 then + if self.focused.target then self.focused.target.states.focus.is = true end + return + end + table.sort(G.ARGS.focus_list, function (a, b) return a.dist < b.dist end) + end + else + if self.focused.target then + G.ARGS.focus_list[#G.ARGS.focus_list+1] = {node = self.focused.target, dist = 0} + else + --otherwise, get the focusable that collides + G.ARGS.focus_list[#G.ARGS.focus_list+1] = {node = G.ARGS.focusables[1], dist = 0} + end + end + end + + --now with the lists created, set the focused target to be the first node in the list + if G.ARGS.focus_list[1] then + if G.ARGS.focus_list[1].node.config and G.ARGS.focus_list[1].node.config.focus_args and G.ARGS.focus_list[1].node.config.focus_args.funnel_from then + self.focused.target = G.ARGS.focus_list[1].node.config.focus_args.funnel_from + else + self.focused.target = G.ARGS.focus_list[1].node + end + if self.focused.target ~= self.focused.prev_target then G.VIBRATION = G.VIBRATION + 0.7 end + else + self.focused.target = nil + end + + if self.focused.target then self.focused.target.states.focus.is = true end +end + +function Controller:capture_focused_input(button, input_type, dt) + local ret = false + local focused = self.focused.target + local extern_button = false + self.no_holdcap = nil + + --Implementing 'coyote time' type selection where a full button press isnt needed to select a card in hand. As long as a button down has been registered + --before a timer is up and the dpad is used to move to the next card it should register + if input_type == 'press' and (button == 'dpleft' or button == 'dpright') and + focused and self.dragging.target and + (self.held_button_times['a'] and self.held_button_times['a'] < 0.12) and + focused.area and focused.area:can_highlight(focused) then + self:L_cursor_release() + self:navigate_focus(button == 'dpleft' and 'L' or 'R') + self.held_button_times['a'] = nil + self.COYOTE_FOCUS = true + ret = true + elseif input_type == 'press' and focused and focused.area and focused == self.dragging.target then + focused.states.drag.is = false + if button == 'dpleft' and focused.rank > 1 then + focused.rank = focused.rank - 1 + focused.area.cards[focused.rank].rank = focused.rank + 1 + table.sort(focused.area.cards, function (a, b) return a.rank < b.rank end) + focused.area:align_cards() + self:update_cursor() + elseif button == 'dpright' and focused.rank < #focused.area.cards then + focused.rank = focused.rank + 1 + focused.area.cards[focused.rank].rank = focused.rank - 1 + table.sort(focused.area.cards, function (a, b) return a.rank < b.rank end) + focused.area:align_cards() + self:update_cursor() + end + focused.states.drag.is = true + ret = true + end + + if G.OVERLAY_MENU and not self.screen_keyboard and input_type == 'press' and G.OVERLAY_MENU:get_UIE_by_ID('tab_shoulders') and (button == 'leftshoulder' or button == 'rightshoulder') then + focused = G.OVERLAY_MENU:get_UIE_by_ID('tab_shoulders') + extern_button = true + end + if G.OVERLAY_MENU and not self.screen_keyboard and input_type == 'press' and G.OVERLAY_MENU:get_UIE_by_ID('cycle_shoulders') and (button == 'leftshoulder' or button == 'rightshoulder') then + focused = G.OVERLAY_MENU:get_UIE_by_ID('cycle_shoulders').children[1] + extern_button = true + end + if focused and focused.config.focus_args then + if focused.config.focus_args.type == 'cycle' and input_type == 'press' then + if ((extern_button and button == 'leftshoulder') or (not extern_button and button == 'dpleft')) then + focused.children[1]:click() + ret = true + end + if ((extern_button and button == 'rightshoulder') or (not extern_button and button == 'dpright')) then + focused.children[3]:click() + ret = true + end + end + if focused.config.focus_args.type == 'tab' and input_type == 'press' then + local proto_choices = focused.UIBox:get_group(nil, focused.children[1].children[1].config.group) + local choices = {} + for k, v in ipairs(proto_choices) do + if v.config.choice and v.config.button then choices[#choices+1] = v end + end + for k, v in ipairs(choices) do + if v.config.chosen then + if ((extern_button and button == 'leftshoulder') or (not extern_button and button == 'dpleft')) then + local next_i = k ~= 1 and (k-1) or (#choices) + if focused.config.focus_args.no_loop and next_i > k then ret = nil + else + choices[next_i]:click() + self:snap_to({node = choices[next_i]}) + self:update_cursor() + ret = true + end + elseif ((extern_button and button == 'rightshoulder') or (not extern_button and button == 'dpright')) then + local next_i = k ~= #choices and (k+1) or (1) + if focused.config.focus_args.no_loop and next_i < k then ret = nil + else + choices[next_i]:click() + self:snap_to({node = choices[next_i]}) + self:update_cursor() + ret = true + end + end + break + end + end + end + if focused.config.focus_args.type == 'slider' then + if button == 'dpleft' then + self.no_holdcap = true + if input_type == 'hold' and self.held_button_times[button] > 0.2 then + G.FUNCS.slider_descreet(focused.children[1], -dt*self.held_button_times[button]*0.6) + end + if input_type == 'press' then + G.FUNCS.slider_descreet(focused.children[1], -0.01) + end + ret = true + end + if button == 'dpright' then + self.no_holdcap = true + if input_type == 'hold' and self.held_button_times[button] > 0.2 then + G.FUNCS.slider_descreet(focused.children[1], dt*self.held_button_times[button]*0.6) + end + if input_type == 'press' then + G.FUNCS.slider_descreet(focused.children[1], 0.01) + end + ret = true + end + end + end + if ret == true then G.VIBRATION = G.VIBRATION +1 end + return ret +end + +function Controller:navigate_focus(dir) + --Get the corresponding focus target first, with or without a direction + self:update_focus(dir) + + --Set the cursor to be in the correct position for that target + self:update_cursor() +end + diff --git a/engine/event.lua b/engine/event.lua new file mode 100644 index 0000000..0733213 --- /dev/null +++ b/engine/event.lua @@ -0,0 +1,195 @@ +--Class +Event = Object:extend() + +--Class Methods +function Event:init(config) + self.trigger = config.trigger or 'immediate' + if config.blocking ~= nil then + self.blocking = config.blocking + else + self.blocking = true + end + if config.blockable ~= nil then + self.blockable = config.blockable + else + self.blockable = true + end + self.complete = false + self.start_timer = config.start_timer or false + self.func = config.func or function() return true end + self.delay = config.delay or 0 + self.no_delete = config.no_delete + self.created_on_pause = config.pause_force or G.SETTINGS.paused + self.timer = config.timer or (self.created_on_pause and 'REAL') or 'TOTAL' + + if self.trigger == 'ease' then + self.ease = { + type = config.ease or 'lerp', + ref_table = config.ref_table, + ref_value = config.ref_value, + start_val = config.ref_table[config.ref_value], + end_val = config.ease_to, + start_time = nil, + end_time = nil, + } + self.func = config.func or function(t) return t end + end + if self.trigger == 'condition' then + self.condition = { + ref_table = config.ref_table, + ref_value = config.ref_value, + stop_val = config.stop_val, + } + self.func = config.func or function() return self.condition.ref_table[self.condition.ref_value] == self.condition.stop_val end + end + self.time = G.TIMERS[self.timer] +end + +function Event:handle(_results) + _results.blocking, _results.completed = self.blocking, self.complete + if self.created_on_pause == false and G.SETTINGS.paused then _results.pause_skip = true; return end + if not self.start_timer then self.time = G.TIMERS[self.timer]; self.start_timer = true end + if self.trigger == 'after' then + if self.time + self.delay <= G.TIMERS[self.timer] then + _results.time_done = true + _results.completed = self.func() + end + end + if self.trigger == 'ease' then + if not self.ease.start_time then + self.ease.start_time = G.TIMERS[self.timer] + self.ease.end_time = G.TIMERS[self.timer] + self.delay + self.ease.start_val = self.ease.ref_table[self.ease.ref_value] + end + if not self.complete then + + if self.ease.end_time >= G.TIMERS[self.timer] then + local percent_done = ((self.ease.end_time - G.TIMERS[self.timer])/(self.ease.end_time - self.ease.start_time)) + + if self.ease.type == 'lerp' then + self.ease.ref_table[self.ease.ref_value] = self.func(percent_done*self.ease.start_val + (1-percent_done)*self.ease.end_val) + end + if self.ease.type == 'elastic' then + percent_done = -math.pow(2, 10 * percent_done - 10) * math.sin((percent_done * 10 - 10.75) * 2*math.pi/3); + self.ease.ref_table[self.ease.ref_value] = self.func(percent_done*self.ease.start_val + (1-percent_done)*self.ease.end_val) + end + if self.ease.type == 'quad' then + percent_done = percent_done * percent_done; + self.ease.ref_table[self.ease.ref_value] = self.func(percent_done*self.ease.start_val + (1-percent_done)*self.ease.end_val) + end + else + self.ease.ref_table[self.ease.ref_value] = self.func(self.ease.end_val) + self.complete = true + _results.completed = true + _results.time_done = true + end + end + end + if self.trigger == 'condition' then + if not self.complete then _results.completed = self.func() end + _results.time_done = true + end + if self.trigger == 'before' then + if not self.complete then _results.completed = self.func() end + if self.time + self.delay <= G.TIMERS[self.timer] then + _results.time_done = true + end + end + if self.trigger == 'immediate' then + _results.completed = self.func() + _results.time_done = true + end + if _results.completed then self.complete = true end +end + +--Class +EventManager = Object:extend() + +--Class Methods +function EventManager:init() + self.queues = { + unlock = {}, + base ={}, + tutorial = {}, + achievement = {}, + other = {} + } + self.queue_timer = G.TIMERS.REAL + self.queue_dt = 1/60 + self.queue_last_processed = G.TIMERS.REAL +end + +function EventManager:add_event(event, queue, front) + queue = queue or 'base' + if event:is(Event) then + if front then + table.insert(self.queues[queue], 1, event) + else + self.queues[queue][#self.queues[queue]+1] = event + end + end +end + +function EventManager:clear_queue(queue, exception) + if not queue then + --clear all queues + for k, v in pairs(self.queues) do + local i=1 + while i <= #v do + if not v[i].no_delete then + table.remove(v, i) + else + i = i + 1 + end + end + end + elseif exception then --clear all but exception + for k, v in pairs(self.queues) do + if k ~= exception then + local i=1 + while i <= #v do + if not v[i].no_delete then + table.remove(v, i) + else + i = i + 1 + end + end + end + end + else + local i=1 + while i <= #self.queues[queue] do + if not self.queues[queue][i].no_delete then + table.remove(self.queues[queue], i) + else + i = i + 1 + end + end + end +end + +function EventManager:update(dt, forced) + self.queue_timer = self.queue_timer+dt + if self.queue_timer >= self.queue_last_processed + self.queue_dt or forced then + self.queue_last_processed = self.queue_last_processed + (forced and 0 or self.queue_dt) + for k, v in pairs(self.queues) do + local blocked = false + local i=1 + while i <= #v do + G.ARGS.event_manager_update = G.ARGS.event_manager_update or {} + local results = G.ARGS.event_manager_update + results.blocking, results.completed, results.time_done, results.pause_skip = false, false, false, false + if (not blocked or not v[i].blockable) then v[i]:handle(results) end + if results.pause_skip then + i = i + 1 + else if not blocked and results.blocking then blocked = true end + if results.completed and results.time_done then + table.remove(v, i) + else + i = i + 1 + end + end + end + end + end +end diff --git a/engine/http_manager.lua b/engine/http_manager.lua new file mode 100644 index 0000000..f4c8455 --- /dev/null +++ b/engine/http_manager.lua @@ -0,0 +1,23 @@ +require "love.system" + +HTTPS = require('https') +local httpencode = function(str) + str = str..'' + local char_to_hex = function(c) + return string.format("%%%02X", string.byte(c)) + end + str = str:gsub("\n", "\r\n"):gsub("([^%w _%%%-%.~])", char_to_hex):gsub(" ", "+") + return str +end + +if (love.system.getOS() == 'OS X' )and (jit.arch == 'arm64' or jit.arch == 'arm' or true) then jit.off() end + +IN_CHANNEL = love.thread.getChannel("http_request") +OUT_CHANNEL = love.thread.getChannel("http_response") + + while true do + --Monitor the channel for any new requests + local request = IN_CHANNEL:demand() -- Value from channel + if request then + end +end diff --git a/engine/moveable.lua b/engine/moveable.lua new file mode 100644 index 0000000..9aadce7 --- /dev/null +++ b/engine/moveable.lua @@ -0,0 +1,502 @@ +---@class Moveable: Node +Moveable = Node:extend() + +--Moveable represents any game object that has the ability to move about the gamespace.\ +--All Moveables have a T (transform) that describes their desired transform in game units, as\ +--well as a VT (Visible Transform) that eases to T over time. This allows for simplified movement where\ +--we only need to set T.x, T.y, etc. to their final position and the engine will ensure the Moveable\ +--VT eases to that final location, regargless of any events or timing. +-- +---@param args {T: table, container: Node} +--**T** The transform ititializer, with keys of x|1, y|2, w|3, h|4, r|5\ +--**container** optional container for this Node, defaults to G.ROOM +function Moveable:init(X,Y,W,H) + local args = (type(X) == 'table') and X or {T ={X or 0,Y or 0,W or 0,H or 0}} + Node.init(self, args) + + --The Visible transform is initally set to the same values as the transform T. + --Note that the VT has an extra 'scale' factor, this is used to manipulate the center-adjusted + --scale of any objects that need to be drawn larger or smaller + self.VT = { + x = self.T.x, + y = self.T.y, + w = self.T.w, + h = self.T.h, + r = self.T.r, + scale = self.T.scale + } + + --To determine location of VT, we need to keep track of the velocity of VT as it approaches T for the next frame + self.velocity = {x = 0, y = 0, r = 0, scale = 0, mag = 0} + + --For more robust drawing, attaching, movement and fewer redundant movement calculations, Moveables each have a 'role' + --that describes a heirarchy of move() calls. Any Moveables with 'Major' role type behave normally, essentially recalculating their + --VT every frame to ensure smooth movement. Moveables can be set to 'Minor' role and attached to some 'Major' moveable + --to weld the Minor moveable to the Major moveable. This makes the dependent moveable set their T and VT to be equal to + --the corresponding 'Major' T and VT, plus some defined offset. + --For finer control over what parts of T and VT are inherited, xy_bond, wh_bond, and r_bond can be set to one of + --'Strong' or 'Weak'. Strong simply copies the values, Weak allows the 'Minor' moveable to calculate their own. + self.role = { + role_type = 'Major', --Major dictates movement, Minor is welded to some major + offset = {x = 0, y = 0}, --Offset from Minor to Major + major = nil, + draw_major = self, + xy_bond = 'Strong', + wh_bond = 'Strong', + r_bond = 'Strong', + scale_bond = 'Strong' + } + + self.alignment = { + type = 'a', + offset = {x = 0, y = 0}, + prev_type = '', + prev_offset = {x = 0, y = 0}, + } + + --the pinch table is used to modify the VT.w and VT.h compared to T.w and T.h. If either x or y pinch is + --set to true, the VT width and or height will ease to 0. If pinch is false, they ease to T.w or T.h + self.pinch = {x = false, y = false} + + --Keep track of the last time this Moveable was moved via :move(dt). When it is successfully moved, set to equal + --the current G.TIMERS.REAL, and if it is called again this frame, doesn't recalculate move(dt) + self.last_moved = -1 + self.last_aligned = -1 + + self.static_rotation = false + + self.offset = {x=0, y=0} + self.Mid = self + + self.shadow_parrallax = {x = 0, y = -1.5} + self.layered_parallax = {x = 0, y = 0} + self.shadow_height = 0.2 + + self:calculate_parrallax() + + table.insert(G.MOVEABLES, self) + if getmetatable(self) == Moveable then + table.insert(G.I.MOVEABLE, self) + end +end +function Moveable:draw() + Node.draw(self) + self:draw_boundingrect() +end + +--Sets the alignment of moveable using roles +-- +---@param args {major: Moveable, bond: string, offset: table, type: string} +--**major** The moveable this moveable will attach to\ +--**bond** The bond type, either 'Strong' or 'Weak'. Strong instantly adjusts VT, Weak manually calculates VT changes\ +--**offset** {x , y} offset from the alignment\ +--**type** the alignment type. Vertical options: c - center, t - top, b - bottom. Horizontal options: l - left, m - middle, r - right. i for inner +function Moveable:set_alignment(args) + args = args or {} + if args.major then + self:set_role({ + role_type = 'Minor', + major = args.major, + xy_bond = args.bond or args.xy_bond or 'Weak', + wh_bond = args.wh_bond or self.role.wh_bond, + r_bond = args.r_bond or self.role.r_bond, + scale_bond = args.scale_bond or self.role.scale_bond, + }) + end + self.alignment.type = args.type or self.alignment.type + if args.offset and (type(args.offset)=='table' and not (args.offset.y and args.offset.x)) or type(args.offset) ~= 'table' then + args.offset = nil + end + self.alignment.offset = args.offset or self.alignment.offset +end + +function Moveable:align_to_major() + if self.alignment.type ~= self.alignment.prev_type then + self.alignment.type_list = { + a = self.alignment.type == 'a', + m = string.find(self.alignment.type, "m"), + c = string.find(self.alignment.type, "c"), + b = string.find(self.alignment.type, "b"), + t = string.find(self.alignment.type, "t"), + l = string.find(self.alignment.type, "l"), + r = string.find(self.alignment.type, "r"), + i = string.find(self.alignment.type, "i"), + } + end + + if self.alignment.prev_offset.x == self.alignment.offset.x and + self.alignment.prev_offset.y == self.alignment.offset.y and + self.alignment.prev_type == self.alignment.type then return end + + self.NEW_ALIGNMENT = true + + if self.alignment.type ~= self.alignment.prev_type then + self.alignment.prev_type = self.alignment.type + end + + if self.alignment.type_list.a or not self.role.major then return end + + if self.alignment.type_list.m then + self.role.offset.x = 0.5*self.role.major.T.w - (self.Mid.T.w)/2 + self.alignment.offset.x - self.Mid.T.x + self.T.x + end + + if self.alignment.type_list.c then + self.role.offset.y = 0.5*self.role.major.T.h - (self.Mid.T.h)/2 + self.alignment.offset.y - self.Mid.T.y + self.T.y + end + + if self.alignment.type_list.b then + if self.alignment.type_list.i then + self.role.offset.y = self.alignment.offset.y + self.role.major.T.h - self.T.h + else + self.role.offset.y = self.alignment.offset.y + self.role.major.T.h + end + end + + if self.alignment.type_list.r then + if self.alignment.type_list.i then + self.role.offset.x = self.alignment.offset.x + self.role.major.T.w - self.T.w + else + self.role.offset.x = self.alignment.offset.x + self.role.major.T.w + end + end + + if self.alignment.type_list.t then + if self.alignment.type_list.i then + self.role.offset.y = self.alignment.offset.y + else + self.role.offset.y = self.alignment.offset.y - self.T.h + end + end + + if self.alignment.type_list.l then + if self.alignment.type_list.i then + self.role.offset.x = self.alignment.offset.x + else + self.role.offset.x = self.alignment.offset.x - self.T.w + end + end + + self.role.offset.x = self.role.offset.x or 0 + self.role.offset.y = self.role.offset.y or 0 + + self.T.x = self.role.major.T.x + self.role.offset.x + self.T.y = self.role.major.T.y + self.role.offset.y + + self.alignment.prev_offset = self.alignment.prev_offset or {} + self.alignment.prev_offset.x, self.alignment.prev_offset.y = self.alignment.offset.x, self.alignment.offset.y +end + +function Moveable:hard_set_T(X, Y, W, H) + self.T.x = X + self.T.y = Y + self.T.w = W + self.T.h = H + + self.velocity.x = 0 + self.velocity.y = 0 + self.velocity.r = 0 + self.velocity.scale = 0 + + self.VT.x = X + self.VT.y = Y + self.VT.w = W + self.VT.h = H + self.VT.r = self.T.r + self.VT.scale = self.T.scale + self:calculate_parrallax() +end + +function Moveable:hard_set_VT() + self.VT.x = self.T.x + self.VT.y = self.T.y + self.VT.w = self.T.w + self.VT.h = self.T.h +end + +function Moveable:drag(offset) + if self.states.drag.can or offset then + self.ARGS.drag_cursor_trans = self.ARGS.drag_cursor_trans or {} + self.ARGS.drag_translation = self.ARGS.drag_translation or {} + local _p = self.ARGS.drag_cursor_trans + local _t = self.ARGS.drag_translation + _p.x = G.CONTROLLER.cursor_position.x/(G.TILESCALE*G.TILESIZE) + _p.y = G.CONTROLLER.cursor_position.y/(G.TILESCALE*G.TILESIZE) + + _t.x, _t.y = -self.container.T.w/2, -self.container.T.h/2 + point_translate(_p, _t) + + point_rotate(_p, self.container.T.r) + + _t.x, _t.y = self.container.T.w/2-self.container.T.x, self.container.T.h/2-self.container.T.y + point_translate(_p, _t) + + if not offset then + offset = self.click_offset + end + + self.T.x = _p.x - offset.x + self.T.y = _p.y - offset.y + self.NEW_ALIGNMENT = true + for k, v in pairs(self.children) do + v:drag(offset) + end + end + if self.states.drag.can then + Node.drag(self) + end +end + +function Moveable:juice_up(amount, rot_amt) + local amount = amount or 0.4 + + local end_time = G.TIMERS.REAL + 0.4 + local start_time = G.TIMERS.REAL + self.juice = { + scale = 0, + scale_amt = amount, + r = 0, + r_amt = ((rot_amt or pseudorandom_element({0.6*amount, -0.6*amount})) or 0), + start_time = start_time, + end_time = end_time + } + self.VT.scale = 1-0.6*amount +end + +function Moveable:move_juice(dt) + if self.juice and not self.juice.handled_elsewhere then + if self.juice.end_time < G.TIMERS.REAL then + self.juice = nil + else + self.juice.scale = self.juice.scale_amt*math.sin(50.8*(G.TIMERS.REAL-self.juice.start_time))*math.max(0, ((self.juice.end_time - G.TIMERS.REAL)/(self.juice.end_time - self.juice.start_time))^3) + self.juice.r = self.juice.r_amt*math.sin(40.8*(G.TIMERS.REAL-self.juice.start_time))*math.max(0, ((self.juice.end_time - G.TIMERS.REAL)/(self.juice.end_time - self.juice.start_time))^2) + end + end +end + +function Moveable:move(dt) + if self.FRAME.MOVE >= G.FRAMES.MOVE then return end + self.FRAME.MAJOR = nil + self.FRAME.MOVE = G.FRAMES.MOVE + if not self.created_on_pause and G.SETTINGS.paused then return end + + --WHY ON EARTH DOES THIS LINE MAKE IT RUN 2X AS FAST??? + ------------------------------------------------------- + local timestart = love.timer.getTime() + ------------------------------------------------------- + + self:align_to_major() + + self.CALCING = nil + if self.role.role_type == 'Glued' then + if self.role.major then self:glue_to_major(self.role.major) end + elseif self.role.role_type == 'Minor' and self.role.major then + if self.role.major.FRAME.MOVE < G.FRAMES.MOVE then self.role.major:move(dt) end + self.STATIONARY = self.role.major.STATIONARY + if (not self.STATIONARY) or self.NEW_ALIGNMENT or + self.config.refresh_movement or + self.juice or + self.role.xy_bond == 'Weak' or + self.role.r_bond == 'Weak' then + self.CALCING = true + self:move_with_major(dt) + end + elseif self.role.role_type == 'Major' then + self.STATIONARY = true + self:move_juice(dt) + self:move_xy(dt) + self:move_r(dt, self.velocity) + self:move_scale(dt) + self:move_wh(dt) + self:calculate_parrallax() + end + self.NEW_ALIGNMENT = false +end + +function Moveable:glue_to_major(major_tab) + self.T = major_tab.T + + self.VT.x = major_tab.VT.x + (0.5*(1 - major_tab.VT.w/(major_tab.T.w))*self.T.w) + self.VT.y = major_tab.VT.y + self.VT.w = major_tab.VT.w + self.VT.h = major_tab.VT.h + self.VT.r = major_tab.VT.r + self.VT.scale = major_tab.VT.scale + + self.pinch = major_tab.pinch + self.shadow_parrallax = major_tab.shadow_parrallax +end + +function Moveable:move_with_major(dt) + if self.role.role_type ~= 'Minor' then return end + local major_tab = self.role.major:get_major() + + self:move_juice(dt) + + if not MWM then + MWM = { + rotated_offset = {}, + angles = {}, + WH = {}, + offs = {}, + } + end + + if self.role.r_bond == 'Weak' then + MWM.rotated_offset.x, MWM.rotated_offset.y = self.role.offset.x + major_tab.offset.x,self.role.offset.y+major_tab.offset.y + else + if major_tab.major.VT.r < 0.0001 and major_tab.major.VT.r > -0.0001 then + MWM.rotated_offset.x = self.role.offset.x + major_tab.offset.x + MWM.rotated_offset.y = self.role.offset.y + major_tab.offset.y + else + MWM.angles.cos, MWM.angles.sin = math.cos(major_tab.major.VT.r),math.sin(major_tab.major.VT.r) + MWM.WH.w, MWM.WH.h = -self.T.w/2 + major_tab.major.T.w/2,-self.T.h/2 + major_tab.major.T.h/2 + MWM.offs.x, MWM.offs.y = self.role.offset.x + major_tab.offset.x - MWM.WH.w,self.role.offset.y + major_tab.offset.y - MWM.WH.h + + MWM.rotated_offset.x = MWM.offs.x*MWM.angles.cos - MWM.offs.y*MWM.angles.sin + MWM.WH.w + MWM.rotated_offset.y = MWM.offs.x*MWM.angles.sin + MWM.offs.y*MWM.angles.cos + MWM.WH.h + end + end + + self.T.x = major_tab.major.T.x + MWM.rotated_offset.x + self.T.y = major_tab.major.T.y + MWM.rotated_offset.y + + if self.role.xy_bond == 'Strong' then + self.VT.x = major_tab.major.VT.x + MWM.rotated_offset.x + self.VT.y = major_tab.major.VT.y + MWM.rotated_offset.y + elseif self.role.xy_bond == 'Weak' then + self:move_xy(dt) + end + + if self.role.r_bond == 'Strong' then + self.VT.r = self.T.r + major_tab.major.VT.r + (self.juice and self.juice.r or 0) + elseif self.role.r_bond == 'Weak' then + self:move_r(dt, self.velocity) + end + + if self.role.scale_bond == 'Strong' then + self.VT.scale = self.T.scale*(major_tab.major.VT.scale/major_tab.major.T.scale) + (self.juice and self.juice.scale or 0) + elseif self.role.scale_bond == 'Weak' then + self:move_scale(dt) + end + + if self.role.wh_bond == 'Strong' then + self.VT.x = self.VT.x + (0.5*(1 - major_tab.major.VT.w/(major_tab.major.T.w))*self.T.w) + self.VT.w = (self.T.w)*(major_tab.major.VT.w/major_tab.major.T.w) + self.VT.h = (self.T.h)*(major_tab.major.VT.h/major_tab.major.T.h) + elseif self.role.wh_bond == 'Weak' then + self:move_wh(dt) + end + + self:calculate_parrallax() +end + +function Moveable:move_xy(dt) + if (self.T.x ~= self.VT.x or math.abs(self.velocity.x) > 0.01) or + (self.T.y ~= self.VT.y or math.abs(self.velocity.y) > 0.01) then + self.velocity.x = G.exp_times.xy*self.velocity.x + (1-G.exp_times.xy)*(self.T.x - self.VT.x)*35*dt + self.velocity.y = G.exp_times.xy*self.velocity.y + (1-G.exp_times.xy)*(self.T.y - self.VT.y)*35*dt + if self.velocity.x*self.velocity.x + self.velocity.y*self.velocity.y > G.exp_times.max_vel*G.exp_times.max_vel then + local actual_vel = math.sqrt(self.velocity.x*self.velocity.x + self.velocity.y*self.velocity.y) + self.velocity.x = G.exp_times.max_vel*self.velocity.x/actual_vel + self.velocity.y = G.exp_times.max_vel*self.velocity.y/actual_vel + end + self.STATIONARY = false + self.VT.x = self.VT.x + self.velocity.x + self.VT.y = self.VT.y + self.velocity.y + if math.abs(self.VT.x - self.T.x) < 0.01 and math.abs(self.velocity.x) < 0.01 then self.VT.x = self.T.x; self.velocity.x = 0 end + if math.abs(self.VT.y - self.T.y) < 0.01 and math.abs(self.velocity.y) < 0.01 then self.VT.y = self.T.y; self.velocity.y = 0 end + end +end + +function Moveable:move_scale(dt) + local des_scale = self.T.scale + (self.zoom and ((self.states.drag.is and 0.1 or 0) + (self.states.hover.is and 0.05 or 0)) or 0) + (self.juice and self.juice.scale or 0) + + if des_scale ~= self.VT.scale or + math.abs(self.velocity.scale) > 0.001 then + self.STATIONARY = false + self.velocity.scale = G.exp_times.scale*self.velocity.scale + (1-G.exp_times.scale)*(des_scale - self.VT.scale) + self.VT.scale = self.VT.scale + self.velocity.scale + end +end + +function Moveable:move_wh(dt) + if (self.T.w ~= self.VT.w and not self.pinch.x) or + (self.T.h ~= self.VT.h and not self.pinch.y) or + (self.VT.w > 0 and self.pinch.x) or + (self.VT.h > 0 and self.pinch.y) then + self.STATIONARY = false + self.VT.w = self.VT.w + (8*dt)*(self.pinch.x and -1 or 1)*self.T.w + self.VT.h = self.VT.h + (8*dt)*(self.pinch.y and -1 or 1)*self.T.h + self.VT.w = math.max(math.min(self.VT.w, self.T.w), 0) + self.VT.h = math.max(math.min(self.VT.h, self.T.h), 0) + end +end + +function Moveable:move_r(dt, vel) + local des_r = self.T.r +0.015*vel.x/dt + (self.juice and self.juice.r*2 or 0) + + if des_r ~= self.VT.r or + math.abs(self.velocity.r) > 0.001 then + self.STATIONARY = false + self.velocity.r = G.exp_times.r*self.velocity.r + (1-G.exp_times.r)*(des_r - self.VT.r) + self.VT.r = self.VT.r + self.velocity.r + end + if math.abs(self.VT.r - self.T.r) < 0.001 and math.abs(self.velocity.r) < 0.001 then self.VT.r = self.T.r; self.velocity.r = 0 end +end + +function Moveable:calculate_parrallax() + if not G.ROOM then return end + self.shadow_parrallax.x = (self.T.x + self.T.w/2 - G.ROOM.T.w/2)/(G.ROOM.T.w/2)*1.5 +end + +function Moveable:set_role(args) + if args.major and not args.major.set_role then return end + if args.offset and (type(args.offset)=='table' and not (args.offset.y and args.offset.x)) or type(args.offset) ~= 'table' then + args.offset = nil + end + self.role = { + role_type = args.role_type or self.role.role_type, + offset = args.offset or self.role.offset, + major = args.major or self.role.major, + xy_bond = args.xy_bond or self.role.xy_bond, + wh_bond = args.wh_bond or self.role.wh_bond, + r_bond = args.r_bond or self.role.r_bond, + scale_bond = args.scale_bond or self.role.scale_bond, + draw_major = args.draw_major or self.role.draw_major, + } + if self.role.role_type == 'Major' then self.role.major = nil end +end + +function Moveable:get_major() + if ( self.role.role_type ~= 'Major' and self.role.major ~= self) and (self.role.xy_bond ~= 'Weak' and self.role.r_bond ~= 'Weak') then + --First, does the major already have their offset precalculated for this frame? + if not self.FRAME.MAJOR or (G.REFRESH_FRAME_MAJOR_CACHE) then + self.FRAME.MAJOR = EMPTY(self.FRAME.MAJOR) + local major = self.role.major:get_major() + self.FRAME.MAJOR.major = major.major + self.FRAME.MAJOR.offset = self.FRAME.MAJOR.offset or {} + self.FRAME.MAJOR.offset.x, self.FRAME.MAJOR.offset.y = major.offset.x + self.role.offset.x + self.layered_parallax.x, major.offset.y + self.role.offset.y + self.layered_parallax.y + end + return self.FRAME.MAJOR + else + self.ARGS.get_major = self.ARGS.get_major or {} + self.ARGS.get_major.major = self + self.ARGS.get_major.offset = self.ARGS.get_major.offset or {} + self.ARGS.get_major.offset.x, self.ARGS.get_major.offset.y = 0,0 + return self.ARGS.get_major + end +end + +function Moveable:remove() + for k, v in ipairs(G.MOVEABLES) do + if v == self then + table.remove(G.MOVEABLES, k) + end + end + for k, v in ipairs(G.I.MOVEABLE) do + if v == self then + table.remove(G.I.MOVEABLE, k) + end + end + Node.remove(self) +end diff --git a/engine/node.lua b/engine/node.lua new file mode 100644 index 0000000..f9b1528 --- /dev/null +++ b/engine/node.lua @@ -0,0 +1,389 @@ +---@class Node +Node = Object:extend() + +--Node represent any game object that needs to have some transform available in the game itself.\ +--Everything that you see in the game is a Node, and some invisible things like the G.ROOM are also\ +--represented here. +-- +---@param args {T: table, container: Node} +--**T** The transform ititializer, with keys of x|1, y|2, w|3, h|4, r|5\ +--**container** optional container for this Node, defaults to G.ROOM +function Node:init(args) + --From args, set the values of self transform + args = args or {} + args.T = args.T or {} + + --Store all argument and return tables here for reuse, because Lua likes to generate garbage + self.ARGS = self.ARGS or {} + self.RETS = {} + + --Config table used for any metadata about this node + self.config = self.config or {} + + --For transform init, accept params in the form x|1, y|2, w|3, h|4, r|5 + self.T = { + x = args.T.x or args.T[1] or 0, + y = args.T.y or args.T[2] or 0, + w = args.T.w or args.T[3] or 1, + h = args.T.h or args.T[4] or 1, + r = args.T.r or args.T[5] or 0, + scale = args.T.scale or args.T[6] or 1, + } + --Transform to use for collision detection + self.CT = self.T + + --Create the offset tables, used to determine things like drag offset and 3d shader effects + self.click_offset = {x = 0, y = 0} + self.hover_offset = {x = 0, y = 0} + + --To keep track of all nodes created on pause. If true, this node moves normally even when the G.TIMERS.TOTAL doesn't increment + self.created_on_pause = G.SETTINGS.paused + + --ID tracker, every Node has a unique ID + G.ID = G.ID or 1 + self.ID = G.ID + G.ID = G.ID + 1 + + --Frame tracker to aid in not doing too many extra calculations + self.FRAME = { + DRAW = -1, + MOVE = -1 + } + + --The states for this Node and all derived nodes. This is how we control the visibility and interactibility of any object + --All nodes do not collide by default. This reduces the size of n for the O(n^2) collision detection + self.states = { + visible = true, + collide = {can = false, is = false}, + focus = {can = false, is = false}, + hover = {can = true, is = false}, + click = {can = true, is = false}, + drag = {can = true, is = false}, + release_on = {can = true, is = false} + } + + --If we provide a container, all nodes within that container are translated with that container as the reference frame. + --For example, if G.ROOM is set at x = 5 and y = 5, and we create a new game object at 0, 0, it will actually be drawn at + --5, 5. This allows us to control things like screen shake, room positioning, rotation, padding, etc. without needing to modify + --every game object that we need to draw + self.container = args.container or G.ROOM + + --The list of children give Node a treelike structure. This can be used for things like drawing, deterministice movement and parallax + --calculations when child nodes rely on updated information from parents, and inherited attributes like button click functions + if not self.children then + self.children = {} + end + + --Add this object to the appropriate instance table only if the metatable matches with NODE + if getmetatable(self) == Node then + table.insert(G.I.NODE, self) + end + + --Unless node was created during a stage transition (when G.STAGE_OBJECT_INTERRUPT is true), add all nodes to their appropriate + --stage object table so they can be easily deleted on stage transition + if not G.STAGE_OBJECT_INTERRUPT then + table.insert(G.STAGE_OBJECTS[G.STAGE], self) + end +end + + +--Draw a bounding rectangle representing the transform of this node. Used in debugging. +function Node:draw_boundingrect() + self.under_overlay = G.under_overlay + + if G.DEBUG then + local transform = self.VT or self.T + love.graphics.push() + love.graphics.scale(G.TILESCALE, G.TILESCALE) + love.graphics.translate(transform.x*G.TILESIZE+transform.w*G.TILESIZE*0.5, + transform.y*G.TILESIZE+transform.h*G.TILESIZE*0.5) + love.graphics.rotate(transform.r) + love.graphics.translate(-transform.w*G.TILESIZE*0.5, + -transform.h*G.TILESIZE*0.5) + if self.DEBUG_VALUE then + love.graphics.setColor(1, 1, 0, 1) + love.graphics.print((self.DEBUG_VALUE or ''), transform.w*G.TILESIZE,transform.h*G.TILESIZE, nil, 1/G.TILESCALE) + end + love.graphics.setLineWidth(1 + (self.states.focus.is and 1 or 0)) + if self.states.collide.is then + love.graphics.setColor(0, 1, 0, 0.3) + else + love.graphics.setColor(1, 0, 0, 0.3) + end + if self.states.focus.can then + love.graphics.setColor(G.C.GOLD) + love.graphics.setLineWidth(1) + end + if self.CALCING then + love.graphics.setColor({0,0,1,1}) + love.graphics.setLineWidth(3) + end + love.graphics.rectangle('line', 0, 0, transform.w*G.TILESIZE,transform.h*G.TILESIZE, 3) + love.graphics.pop() + end +end + +--Draws self, then adds self the the draw hash, then draws all children +function Node:draw() + self:draw_boundingrect() + if self.states.visible then + add_to_drawhash(self) + for _, v in pairs(self.children) do + v:draw() + end + end +end + +--Determines if this node collides with some point. Applies any container translations and rotations, then\ +--applies translations and rotations specific to this node. This means the collision detection effectively\ +--determines if some point intersects this node regargless of rotation. +-- +---@param point {x: number, y: number} +--**x and y** The coordinates of the cursor transformed into game units +function Node:collides_with_point(point) + --First reset the collision state to false + if self.container then + local T = self.CT or self.T + self.ARGS.collides_with_point_point = self.ARGS.collides_with_point_point or {} + self.ARGS.collides_with_point_translation = self.ARGS.collides_with_point_translation or {} + self.ARGS.collides_with_point_rotation = self.ARGS.collides_with_point_rotation or {} + local _p = self.ARGS.collides_with_point_point + local _t = self.ARGS.collides_with_point_translation + local _r = self.ARGS.collides_with_point_rotation + + local _b = self.states.hover.is and G.COLLISION_BUFFER or 0 + + _p.x, _p.y = point.x, point.y + + if self.container ~= self then --if there is some valid container, we need to apply all translations and rotations for the container first + if math.abs(self.container.T.r) < 0.1 then + --Translate to normalize this Node to the center of the container + _t.x, _t.y = -self.container.T.w/2, -self.container.T.h/2 + point_translate(_p, _t) + + --Rotate node about the center of the container + point_rotate(_p, self.container.T.r) + + --Translate node to undo the container translation, essentially reframing it in 'container' space + _t.x, _t.y = self.container.T.w/2-self.container.T.x, self.container.T.h/2-self.container.T.y + point_translate(_p, _t) + else + --Translate node to undo the container translation, essentially reframing it in 'container' space + _t.x, _t.y = -self.container.T.x, -self.container.T.y + point_translate(_p, _t) + end + end + if math.abs(T.r) < 0.1 then + --If we can essentially disregard transform rotation, just treat it like a normal rectangle + if _p.x >= T.x - _b and _p.y >= T.y - _b and _p.x <= T.x + T.w + _b and _p.y <= T.y + T.h + _b then + return true + end + else + --Otherwise we need to do some silly point rotation garbage to determine if the point intersects the rotated rectangle + _r.cos, _r.sin = math.cos(T.r+math.pi/2), math.sin(T.r+math.pi/2) + _p.x, _p.y = _p.x - (T.x + 0.5*(T.w)), _p.y - (T.y + 0.5*(T.h)) + _t.x, _t.y = _p.y*_r.cos - _p.x*_r.sin, _p.y*_r.sin + _p.x*_r.cos + _p.x, _p.y = _t.x + (T.x + 0.5*(T.w)), _t.y + (T.y + 0.5*(T.h)) + + if _p.x >= T.x - _b and _p.y >= T.y - _b + and _p.x <= T.x + T.w + _b and _p.y <= T.y + T.h + _b then + return true + end + end + end +end + +--Sets the offset of passed point in terms of this nodes T.x and T.y +-- +---@param point {x: number, y: number} +---@param type string +--**x and y** The coordinates of the cursor transformed into game units +--**type** the type of offset to set for this Node, either 'Click' or 'Hover' +function Node:set_offset(point, type) + self.ARGS.set_offset_point = self.ARGS.set_offset_point or {} + self.ARGS.set_offset_translation = self.ARGS.set_offset_translation or {} + local _p = self.ARGS.set_offset_point + local _t = self.ARGS.set_offset_translation + + _p.x, _p.y = point.x, point.y + + --Translate to middle of the container + _t.x = -self.container.T.w/2 + _t.y = -self.container.T.h/2 + point_translate(_p, _t) + + --Rotate about the container midpoint according to node rotation + point_rotate(_p, self.container.T.r) + + --Translate node to undo the container translation, essentially reframing it in 'container' space + _t.x = self.container.T.w/2-self.container.T.x + _t.y = self.container.T.h/2-self.container.T.y + point_translate(_p, _t) + + if type == 'Click' then + self.click_offset.x = (_p.x - self.T.x) + self.click_offset.y = (_p.y - self.T.y) + elseif type == 'Hover' then + self.hover_offset.x = (_p.x - self.T.x) + self.hover_offset.y = (_p.y - self.T.y) + end +end + +--If the current container is being 'Dragged', usually by a cursor, determine if any drag popups need to be generated and do so +function Node:drag() + if self.config and self.config.d_popup then + if not self.children.d_popup then + self.children.d_popup = UIBox{ + definition = self.config.d_popup, + config = self.config.d_popup_config + } + self.children.h_popup.states.collide.can = false + table.insert(G.I.POPUP, self.children.d_popup) + self.children.d_popup.states.drag.can = true + end + end +end + +--Determines if this Node can be dragged. This is a simple function but more complex objects may redefine this to return a parent\ +--if the parent needs to drag other children with it +function Node:can_drag() + return self.states.drag.can and self or nil +end + +--Called by the CONTROLLER when this node is no longer being dragged, removes any d_popups +function Node:stop_drag() + if self.children.d_popup then + for k, v in pairs(G.I.POPUP) do + if v == self.children.d_popup then + table.remove(G.I.POPUP, k) + end + end + self.children.d_popup:remove() + self.children.d_popup = nil + end +end + +--If the current container is being 'Hovered', usually by a cursor, determine if any hover popups need to be generated and do so +function Node:hover() + if self.config and self.config.h_popup then + if not self.children.h_popup then + self.config.h_popup_config.instance_type = 'POPUP' + self.children.h_popup = UIBox{ + definition = self.config.h_popup, + config = self.config.h_popup_config, + } + self.children.h_popup.states.collide.can = false + self.children.h_popup.states.drag.can = true + end + end +end + +--Called by the CONTROLLER when this node is no longer being hovered, removes any h_popups +function Node:stop_hover() + if self.children.h_popup then + self.children.h_popup:remove() + self.children.h_popup = nil + end +end + +--Called by the CONTROLLER to determine the position the cursor should be set to for this node +function Node:put_focused_cursor() + return (self.T.x + self.T.w/2 + self.container.T.x)*(G.TILESCALE*G.TILESIZE), (self.T.y + self.T.h/2 + self.container.T.y)*(G.TILESCALE*G.TILESIZE) +end + +--Sets the container of this node and all child nodes to be a new container node +-- +---@param container Node The new node that will behave as this nodes container +function Node:set_container(container) + if self.children then + for _, v in pairs(self.children) do + v:set_container(container) + end + end + self.container = container +end + +--Translation function used before any draw calls, translates this node according to the transform of the container node +function Node:translate_container() + if self.container and self.container ~= self then + love.graphics.translate(self.container.T.w*G.TILESCALE*G.TILESIZE*0.5, self.container.T.h*G.TILESCALE*G.TILESIZE*0.5) + love.graphics.rotate(self.container.T.r) + love.graphics.translate( + -self.container.T.w*G.TILESCALE*G.TILESIZE*0.5 + self.container.T.x*G.TILESCALE*G.TILESIZE, + -self.container.T.h*G.TILESCALE*G.TILESIZE*0.5 + self.container.T.y*G.TILESCALE*G.TILESIZE) + end +end + +--When this Node needs to be deleted, removes self from any tables it may have been added to to destroy any weak references\ +--Also calls the remove method of all children to have them do the same +function Node:remove() + + for k, v in ipairs(G.I.POPUP) do + if v == self then + table.remove(G.I.POPUP, k) + break; + end + end + for k, v in ipairs(G.I.NODE) do + if v == self then + table.remove(G.I.NODE, k) + break; + end + end + for k, v in ipairs(G.STAGE_OBJECTS[G.STAGE]) do + if v == self then + table.remove(G.STAGE_OBJECTS[G.STAGE], k) + break; + end + end + if self.children then + for k, v in pairs(self.children) do + v:remove() + end + end + if G.CONTROLLER.clicked.target ==self then + G.CONTROLLER.clicked.target = nil + end + if G.CONTROLLER.focused.target ==self then + G.CONTROLLER.focused.target = nil + end + if G.CONTROLLER.dragging.target ==self then + G.CONTROLLER.dragging.target = nil + end + if G.CONTROLLER.hovering.target ==self then + G.CONTROLLER.hovering.target = nil + end + if G.CONTROLLER.released_on.target ==self then + G.CONTROLLER.released_on.target = nil + end + if G.CONTROLLER.cursor_down.target ==self then + G.CONTROLLER.cursor_down.target = nil + end + if G.CONTROLLER.cursor_up.target ==self then + G.CONTROLLER.cursor_up.target = nil + end + if G.CONTROLLER.cursor_hover.target ==self then + G.CONTROLLER.cursor_hover.target = nil + end + + self.REMOVED = true +end + +--returns the squared(fast) distance in game units from the center of this node to the center of another node +-- +---@param other_node Node to measure the distance from +function Node:fast_mid_dist(other_node) + return math.sqrt((other_node.T.x + 0.5*other_node.T.w) - (self.T.x + self.T.w))^2 + ((other_node.T.y + 0.5*other_node.T.h) - (self.T.y + self.T.h))^2 +end + +--Prototype for a click release function, when the cursor is released on this node +function Node:release(dragged) end + +--Prototype for a click function +function Node:click() end + +--Prototype animation function for any frame manipulation needed +function Node:animate() end + +--Prototype update function for any object specific logic that needs to occur every frame +function Node:update(dt) end diff --git a/engine/object.lua b/engine/object.lua new file mode 100644 index 0000000..7fad29d --- /dev/null +++ b/engine/object.lua @@ -0,0 +1,37 @@ +--||-- +--This Object implementation was taken from SNKRX (MIT license). Slightly modified, this is a very simple OOP base + +Object = {} +Object.__index = Object +function Object:init() +end + +function Object:extend() + local cls = {} + for k, v in pairs(self) do + if k:find("__") == 1 then + cls[k] = v + end + end + cls.__index = cls + cls.super = self + setmetatable(cls, self) + return cls +end + +function Object:is(T) + local mt = getmetatable(self) + while mt do + if mt == T then + return true + end + mt = getmetatable(mt) + end + return false +end + +function Object:__call(...) + local obj = setmetatable({}, self) + obj:init(...) + return obj +end diff --git a/engine/particles.lua b/engine/particles.lua new file mode 100644 index 0000000..a7d4e9c --- /dev/null +++ b/engine/particles.lua @@ -0,0 +1,177 @@ +---@class Particles: Moveable +Particles = Moveable:extend() + +--Class Methods +function Particles:init(X, Y, W, H, config) + config = config or {} + + Moveable.init(self,X, Y, W, H) + + self.fill = config.fill + self.padding = config.padding or 0 + + if config.attach then + self:set_alignment{ + major = config.attach, + type = 'cm', + bond = 'Strong' + } + table.insert(self.role.major.children,self) + self.parent = self.role.major + self.T.x = self.role.major.T.x + self.padding + self.T.y = self.role.major.T.y + self.padding + if self.fill then + self.T.w = self.role.major.T.w - self.padding + self.T.h = self.role.major.T.h - self.padding + end + end + + self.states.hover.can = false + self.states.click.can = false + self.states.collide.can = false + self.states.drag.can = false + self.states.release_on.can = false + + self.timer = config.timer or 0.5 + self.timer_type = (self.created_on_pause and 'REAL') or config.timer_type or 'REAL' + self.last_real_time = G.TIMERS[self.timer_type] - self.timer + self.last_drawn = 0 + self.lifespan = config.lifespan or 1 + self.fade_alpha = 0 + self.speed = config.speed or 1 + self.max = config.max or 1000000000000000 + self.pulse_max = math.min(20, config.pulse_max or 0) + self.pulsed = 0 + self.vel_variation = config.vel_variation or 1 + self.particles = {} + self.scale = config.scale or 1 + self.colours = config.colours or {G.C.BACKGROUND.D} + + if config.initialize then + for i = 1, 60 do + self.last_real_time = self.last_real_time - 15/60 + self:update(15/60) + self:move(15/60) + end + end + + if getmetatable(self) == Particles then + table.insert(G.I.MOVEABLE, self) + end +end + +function Particles:update(dt) + if G.SETTINGS.paused and not self.created_on_pause then self.last_real_time = G.TIMERS[self.timer_type] ; return end + local added_this_frame = 0 + while G.TIMERS[self.timer_type] > self.last_real_time + self.timer and (#self.particles < self.max or self.pulsed < self.pulse_max) and added_this_frame < 20 do + self.last_real_time = self.last_real_time + self.timer + local new_offset = { + x=self.fill and (0.5-math.random())*self.T.w or 0, + y=self.fill and (0.5-math.random())*self.T.h or 0 + } + if self.fill and self.T.r < 0.1 and self.T.r > -0.1 then + local newer_offset = { + x = math.sin(self.T.r)*new_offset.y + math.cos(self.T.r)*new_offset.x, + y = math.sin(self.T.r)*new_offset.x + math.cos(self.T.r)*new_offset.y, + } + new_offset = newer_offset + end + table.insert(self.particles, { + draw = false, + dir = math.random()*2*math.pi, + facing = math.random()*2*math.pi, + size = math.random()*0.5+0.1, + age = 0, + velocity = self.speed*(self.vel_variation*math.random() + (1-self.vel_variation))*0.7, + r_vel = 0.2*(0.5 - math.random()), + e_prev = 0, + e_curr = 0, + scale = 0, + visible_scale = 0, + time = G.TIMERS[self.timer_type], + colour = pseudorandom_element(self.colours), + offset = new_offset + }) + added_this_frame = added_this_frame + 1 + if self.pulsed <= self.pulse_max then self.pulsed = self.pulsed + 1 end + end +end + +function Particles:move(dt) + if G.SETTINGS.paused and not self.created_on_pause then return end + + Moveable.move(self, dt) + + if self.timer_type ~= 'REAL' then dt = dt*G.SPEEDFACTOR end + + for i=#self.particles,1,-1 do + self.particles[i].draw = true + self.particles[i].e_vel = self.particles[i].e_vel or dt*self.scale + self.particles[i].e_prev = self.particles[i].e_curr + self.particles[i].age = self.particles[i].age + dt + + self.particles[i].e_curr = math.min(2*math.min((self.particles[i].age/self.lifespan)*self.scale, self.scale*((self.lifespan - self.particles[i].age)/self.lifespan)), self.scale) + + self.particles[i].e_vel = (self.particles[i].e_curr - self.particles[i].e_prev)*self.scale*dt + (1-self.scale*dt)*self.particles[i].e_vel + + self.particles[i].scale = self.particles[i].scale + self.particles[i].e_vel + self.particles[i].scale = math.min(2*math.min((self.particles[i].age/self.lifespan)*self.scale, self.scale*((self.lifespan - self.particles[i].age)/self.lifespan)), self.scale) + + if self.particles[i].scale < 0 then + table.remove(self.particles, i) + else + self.particles[i].offset.x = self.particles[i].offset.x + self.particles[i].velocity*math.sin(self.particles[i].dir)*dt + self.particles[i].offset.y = self.particles[i].offset.y + self.particles[i].velocity*math.cos(self.particles[i].dir)*dt + self.particles[i].facing = self.particles[i].facing + self.particles[i].r_vel*dt + self.particles[i].velocity = math.max(0, self.particles[i].velocity - self.particles[i].velocity*0.07*dt) + end + end +end + +function Particles:fade(delay, to) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + timer = self.timer_type, + blockable = false, + blocking = false, + ref_value = 'fade_alpha', + ref_table = self, + ease_to = to or 1, + delay = delay + })) +end + +function Particles:draw(alpha) + alpha = alpha or 1 + prep_draw(self, 1) + love.graphics.translate(self.T.w/2, self.T.h/2) + for k, v in pairs(self.particles) do + if v.draw then + love.graphics.push() + love.graphics.setColor(v.colour[1], v.colour[2], v.colour[3], v.colour[4]*alpha*(1-self.fade_alpha)) + love.graphics.translate(v.offset.x, v.offset.y) + love.graphics.rotate(v.facing) + + love.graphics.rectangle('fill', -v.scale/2, -v.scale/2, v.scale, v.scale) -- origin in the middle + love.graphics.pop() + end + end + love.graphics.pop() + + add_to_drawhash(self) + self:draw_boundingrect() +end + +function Particles:remove() + if self.role.major then + for k, v in pairs(self.role.major.children) do + if v == self and type(k) == 'number' then + table.remove(self.role.major.children, k) + end + end + end + + remove_all(self.children) + + Moveable.remove(self) +end diff --git a/engine/profile.lua b/engine/profile.lua new file mode 100644 index 0000000..fdcb531 --- /dev/null +++ b/engine/profile.lua @@ -0,0 +1,188 @@ +local clock = os.clock + +--- Simple profiler written in Lua. +-- @module profile +-- @alias profile +local profile = {} + +-- function labels +local _labeled = {} +-- function definitions +local _defined = {} +-- time of last call +local _tcalled = {} +-- total execution time +local _telapsed = {} +-- number of calls +local _ncalls = {} +-- list of internal profiler functions +local _internal = {} + +--- This is an internal function. +-- @tparam string event Event type +-- @tparam number line Line number +-- @tparam[opt] table info Debug info table +function profile.hooker(event, line, info) + info = info or debug.getinfo(2, 'fnS') + local f = info.func + -- ignore the profiler itself + if _internal[f] or info.what ~= "Lua" then + return + end + -- get the function name if available + if info.name then + _labeled[f] = info.name + end + -- find the line definition + if not _defined[f] then + _defined[f] = info.short_src..":"..info.linedefined + _ncalls[f] = 0 + _telapsed[f] = 0 + end + if _tcalled[f] then + local dt = clock() - _tcalled[f] + _telapsed[f] = _telapsed[f] + dt + _tcalled[f] = nil + end + if event == "tail call" then + local prev = debug.getinfo(3, 'fnS') + profile.hooker("return", line, prev) + profile.hooker("call", line, info) + elseif event == 'call' then + _tcalled[f] = clock() + else + _ncalls[f] = _ncalls[f] + 1 + end +end + +--- Sets a clock function to be used by the profiler. +-- @tparam function func Clock function that returns a number +function profile.setclock(f) + assert(type(f) == "function", "clock must be a function") + clock = f +end + +--- Starts collecting data. +function profile.start() + if rawget(_G, 'jit') then + jit.off() + jit.flush() + end + debug.sethook(profile.hooker, "cr") +end + +--- Stops collecting data. +function profile.stop() + debug.sethook() + for f in pairs(_tcalled) do + local dt = clock() - _tcalled[f] + _telapsed[f] = _telapsed[f] + dt + _tcalled[f] = nil + end + -- merge closures + local lookup = {} + for f, d in pairs(_defined) do + local id = (_labeled[f] or '?')..d + local f2 = lookup[id] + if f2 then + _ncalls[f2] = _ncalls[f2] + (_ncalls[f] or 0) + _telapsed[f2] = _telapsed[f2] + (_telapsed[f] or 0) + _defined[f], _labeled[f] = nil, nil + _ncalls[f], _telapsed[f] = nil, nil + else + lookup[id] = f + end + end + collectgarbage('collect') +end + +--- Resets all collected data. +function profile.reset() + for f in pairs(_ncalls) do + _ncalls[f] = 0 + end + for f in pairs(_telapsed) do + _telapsed[f] = 0 + end + for f in pairs(_tcalled) do + _tcalled[f] = nil + end + collectgarbage('collect') +end + +--- This is an internal function. +-- @tparam function a First function +-- @tparam function b Second function +function profile.comp(a, b) + local dt = _telapsed[b] - _telapsed[a] + if dt == 0 then + return _ncalls[b] < _ncalls[a] + end + return dt < 0 +end + +--- Iterates all functions that have been called since the profile was started. +-- @tparam[opt] number limit Maximum number of rows +function profile.query(limit) + local t = {} + for f, n in pairs(_ncalls) do + if n > 0 then + t[#t + 1] = f + end + end + table.sort(t, profile.comp) + if limit then + while #t > limit do + table.remove(t) + end + end + for i, f in ipairs(t) do + local dt = 0 + if _tcalled[f] then + dt = clock() - _tcalled[f] + end + t[i] = { i, _labeled[f] or '?', _ncalls[f], _telapsed[f] + dt, _defined[f] } + end + return t +end + +local cols = { 3, 29, 11, 24, 32 } + +--- Generates a text report. +-- @tparam[opt] number limit Maximum number of rows +function profile.report(n) + local out = {} + local report = profile.query(n) + for i, row in ipairs(report) do + for j = 1, 5 do + local s = row[j] + local l2 = cols[j] + s = tostring(s) + local l1 = s:len() + if l1 < l2 then + s = s..(' '):rep(l2-l1) + elseif l1 > l2 then + s = s:sub(l1 - l2 + 1, l1) + end + row[j] = s + end + out[i] = table.concat(row, ' | ') + end + + local row = " +-----+-------------------------------+-------------+--------------------------+----------------------------------+ \n" + local col = " | # | Function | Calls | Time | Code | \n" + local sz = row..col..row + if #out > 0 then + sz = sz..' | '..table.concat(out, ' | \n | ')..' | \n' + end + return '\n'..sz..row +end + +-- store all internal profiler functions +for _, v in pairs(profile) do + if type(v) == "function" then + _internal[v] = true + end +end + +return profile diff --git a/engine/save_manager.lua b/engine/save_manager.lua new file mode 100644 index 0000000..b0e07a5 --- /dev/null +++ b/engine/save_manager.lua @@ -0,0 +1,84 @@ +require "love.system" + +if (love.system.getOS() == 'OS X' ) and (jit.arch == 'arm64' or jit.arch == 'arm' or true) then jit.off() end + +require "love.timer" +require "love.thread" +require 'love.filesystem' +require "engine/object" +require "engine/string_packer" + +--vars needed for sound manager thread +CHANNEL = love.thread.getChannel("save_request") + + while true do + --Monitor the channel for any new requests + local request = CHANNEL:demand() -- Value from channel + if request then + --Saves progress for settings, unlocks, alerts and discoveries + if request.type == 'save_progress' then + local prefix_profile = (request.save_progress.SETTINGS.profile or 1)..'' + if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end + prefix_profile = prefix_profile..'/' + + if not love.filesystem.getInfo(prefix_profile..'meta.jkr') then + love.filesystem.append( prefix_profile..'meta.jkr', 'return {}' ) + end + + local meta = STR_UNPACK(get_compressed(prefix_profile..'meta.jkr') or 'return {}') + meta.unlocked = meta.unlocked or {} + meta.discovered = meta.discovered or {} + meta.alerted = meta.alerted or {} + + local _append = false + + for k, v in pairs(request.save_progress.UDA) do + if string.find(v, 'u') and not meta.unlocked[k] then + meta.unlocked[k] = true + _append = true + end + if string.find(v, 'd') and not meta.discovered[k] then + meta.discovered[k] = true + _append = true + end + if string.find(v, 'a') and not meta.alerted[k] then + meta.alerted[k] = true + _append = true + end + end + if _append then compress_and_save( prefix_profile..'meta.jkr', STR_PACK(meta)) end + + compress_and_save('settings.jkr', request.save_progress.SETTINGS) + compress_and_save(prefix_profile..'profile.jkr', request.save_progress.PROFILE) + + CHANNEL:push('done') + --Saves the settings file + elseif request.type == 'save_settings' then + compress_and_save('settings.jkr', request.save_settings) + compress_and_save(request.profile_num..'/profile.jkr', request.save_profile) + --Saves the metrics file + elseif request.type == 'save_metrics' then + compress_and_save('metrics.jkr', request.save_metrics) + --Saves any notifications + elseif request.type == 'save_notify' then + local prefix_profile = (request.profile_num or 1)..'' + if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end + prefix_profile = prefix_profile..'/' + + if not love.filesystem.getInfo(prefix_profile..'unlock_notify.jkr') then love.filesystem.append( prefix_profile..'unlock_notify.jkr', '') end + local unlock_notify = get_compressed(prefix_profile..'unlock_notify.jkr') or '' + + if request.save_notify and not string.find(unlock_notify, request.save_notify) then + compress_and_save( prefix_profile..'unlock_notify.jkr', unlock_notify..request.save_notify..'\n') + end + + --Saves the run + elseif request.type == 'save_run' then + local prefix_profile = (request.profile_num or 1)..'' + if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end + prefix_profile = prefix_profile..'/' + + compress_and_save(prefix_profile..'save.jkr', request.save_table) + end + end +end diff --git a/engine/sound_manager.lua b/engine/sound_manager.lua new file mode 100644 index 0000000..feadee9 --- /dev/null +++ b/engine/sound_manager.lua @@ -0,0 +1,207 @@ +require "love.audio" +require "love.sound" +require "love.system" + +if (love.system.getOS() == 'OS X' )and (jit.arch == 'arm64' or jit.arch == 'arm' or true) then jit.off() end + +--vars needed for sound manager thread +CHANNEL = love.thread.getChannel("sound_request") +LOAD_CHANNEL = love.thread.getChannel('load_channel') +LOAD_CHANNEL:push('audio thread start') +DISABLE_SFX = false + +--create all sounds from resources and play one each to load into mem +SOURCES = {} +local sound_files = love.filesystem.getDirectoryItems("resources/sounds") + +for _, filename in ipairs(sound_files) do + local extension = string.sub(filename, -4) + for i = 1, 1 do + if extension == '.ogg' then + LOAD_CHANNEL:push('audio file - '..filename) + local sound_code = string.sub(filename, 1, -5) + local s = { + sound = love.audio.newSource("resources/sounds/"..filename,string.find(sound_code,'music') and "stream" or 'static'), + filepath = "resources/sounds/"..filename + } + SOURCES[sound_code] = {} + table.insert(SOURCES[sound_code], s) + s.sound_code = sound_code + s.sound:setVolume(0) + love.audio.play(s.sound) + s.sound:stop() + end + end +end + +function PLAY_SOUND(args) + args.per = args.per or 1 + args.vol = args.vol or 1 + SOURCES[args.sound_code] = SOURCES[args.sound_code] or {} + + for _, s in ipairs(SOURCES[args.sound_code]) do + if s.sound and not s.sound:isPlaying() then + s.original_pitch = args.per + s.original_volume = args.vol + s.created_on_pause = args.overlay_menu + s.created_on_state = args.state + s.sfx_handled = 0 + s.transition_timer = 0 + SET_SFX(s, args) + love.audio.play(s.sound) + return s + end + end + + local should_stream = (string.find(args.sound_code,'music') or string.find(args.sound_code,'ambient')) + local s = {sound = love.audio.newSource("resources/sounds/"..args.sound_code..'.ogg', should_stream and "stream" or 'static')} + table.insert(SOURCES[args.sound_code], s) + s.sound_code = args.sound_code + s.original_pitch = args.per or 1 + s.original_volume = args.vol or 1 + s.created_on_pause = (args.overlay_menu and true or false) + s.created_on_state = args.state + s.sfx_handled = 0 + s.transition_timer = 0 + SET_SFX(s, args) + love.audio.play(s.sound) + return s +end + +function STOP_AUDIO() + for _, source in pairs(SOURCES) do + for _, s in pairs(source) do + if s.sound:isPlaying() then + s.sound:stop() + end + end + end +end + +function SET_SFX(s, args) + if string.find(s.sound_code,'music') then + if s.sound_code == args.desired_track then + s.current_volume = s.current_volume or 1 + s.current_volume = 1*(args.dt*3) + (1-(args.dt*3))*s.current_volume + else + s.current_volume = s.current_volume or 0 + s.current_volume = 0*(args.dt*3) + (1-(args.dt*3))*s.current_volume + end + s.sound:setVolume(s.current_volume*s.original_volume*(args.sound_settings.volume/100.0)*(args.sound_settings.music_volume/100.0)) + s.sound:setPitch(s.original_pitch*args.pitch_mod) + else + if s.temp_pitch ~= s.original_pitch then + s.sound:setPitch(s.original_pitch) + s.temp_pitch = s.original_pitch + end + local sound_vol = s.original_volume*(args.sound_settings.volume/100.0)*(args.sound_settings.game_sounds_volume/100.0) + if s.created_on_state == 13 then sound_vol = sound_vol*args.splash_vol end + if sound_vol <= 0 then + s.sound:stop() + else + s.sound:setVolume(sound_vol) + end + end + end + + function MODULATE(args) + for k, v in pairs(SOURCES) do + if (string.find(k,'music') and (args.desired_track ~= '')) then + if v[1] and v[1].sound and v[1].sound:isPlaying() then + else + RESTART_MUSIC(args) + break; + end + end + end + for k, v in pairs(SOURCES) do + local i=1 + while i <= #v do + if not v[i].sound:isPlaying() then + v[i].sound:release() + table.remove(v, i) + else + i = i + 1 + end + end + + for _, s in pairs(v) do + if s.sound and s.sound:isPlaying() and s.original_volume then + SET_SFX(s, args) + end + end + end + end + + function RESTART_MUSIC(args) + for k, v in pairs(SOURCES) do + if string.find(k,'music') then + for i, s in ipairs(v) do + s.sound:stop() + end + SOURCES[k] = {} + args.per = 0.7 + args.vol = 0.6 + args.sound_code = k + local s = PLAY_SOUND(args) + s.initialized = true + end + end + end + + function AMBIENT(args) + for k, v in pairs(SOURCES) do + if args.ambient_control[k] then + local start_ambient = args.ambient_control[k].vol*(args.sound_settings.volume/100.0)*(args.sound_settings.game_sounds_volume/100.0) > 0 + + for i, s in ipairs(v) do + if s.sound and s.sound:isPlaying() and s.original_volume then + s.original_volume = args.ambient_control[k].vol + SET_SFX(s, args) + start_ambient = false + end + end + + if start_ambient then + args.sound_code = k + args.vol = args.ambient_control[k].vol + args.per = args.ambient_control[k].per + PLAY_SOUND(args) + end + end + end + end + + function RESET_STATES(state) + for k, v in pairs(SOURCES) do + for i, s in ipairs(v) do + s.created_on_state = state + end + end + end + + LOAD_CHANNEL:push('finished') + + while true do + --Monitor the channel for any new requests + local request = CHANNEL:demand() -- Value from channel + if request then + --If the request is for an update to the music track, handle it here + if false then elseif request.type == 'sound' then + PLAY_SOUND(request) + elseif request.type == 'stop' then + STOP_AUDIO() + elseif request.type == 'modulate' then + MODULATE(request) + if request.ambient_control then AMBIENT(request) end + elseif request.type == 'restart_music' then + RESTART_MUSIC() + elseif request.type == 'reset_states' then + for k, v in pairs(SOURCES) do + for i, s in ipairs(v) do + s.created_on_state = request.state + end + end + end + end +end diff --git a/engine/sprite.lua b/engine/sprite.lua new file mode 100644 index 0000000..c11b48c --- /dev/null +++ b/engine/sprite.lua @@ -0,0 +1,215 @@ +--Class +Sprite = Moveable:extend() + +--Class Methods +function Sprite:init(X, Y, W, H, new_sprite_atlas, sprite_pos) + Moveable.init(self,X, Y, W, H) + self.CT = self.VT + self.atlas = new_sprite_atlas + self.scale = {x=self.atlas.px, y=self.atlas.py} + self.scale_mag = math.min(self.scale.x/W,self.scale.y/H) + self.zoom = true + + self:set_sprite_pos(sprite_pos) + + if getmetatable(self) == Sprite then + table.insert(G.I.SPRITE, self) + end +end + +function Sprite:reset() + self.atlas = G.ASSET_ATLAS[self.atlas.name] + self:set_sprite_pos(self.sprite_pos) +end + +function Sprite:set_sprite_pos(sprite_pos) + if sprite_pos and sprite_pos.v then + self.sprite_pos = {x = (math.random(sprite_pos.v)-1), y = sprite_pos.y} + else + self.sprite_pos = sprite_pos or {x=0,y=0} + end + self.sprite_pos_copy = {x = self.sprite_pos.x, y = self.sprite_pos.y} + + self.sprite = love.graphics.newQuad( + self.sprite_pos.x*self.atlas.px, + self.sprite_pos.y*self.atlas.py, + self.scale.x, + self.scale.y, self.atlas.image:getDimensions()) + + self.image_dims = {} + self.image_dims[1], self.image_dims[2] = self.atlas.image:getDimensions() +end + +function Sprite:get_pos_pixel() + self.RETS.get_pos_pixel = self.RETS.get_pos_pixel or {} + self.RETS.get_pos_pixel[1] = self.sprite_pos.x + self.RETS.get_pos_pixel[2] = self.sprite_pos.y + self.RETS.get_pos_pixel[3] = self.atlas.px --self.scale.x + self.RETS.get_pos_pixel[4] = self.atlas.py --self.scale.y + return self.RETS.get_pos_pixel +end + +function Sprite:get_image_dims() + return self.image_dims +end + +function Sprite:define_draw_steps(draw_step_definitions) + self.draw_steps = EMPTY(self.draw_steps) + for k, v in ipairs(draw_step_definitions) do + self.draw_steps[#self.draw_steps+1] = { + shader = v.shader or 'dissolve', + shadow_height = v.shadow_height or nil, + send = v.send or nil, + no_tilt = v.no_tilt or nil, + other_obj = v.other_obj or nil, + ms = v.ms or nil, + mr = v.mr or nil, + mx = v.mx or nil, + my = v.my or nil + } + end +end + +function Sprite:draw_shader(_shader, _shadow_height, _send, _no_tilt, other_obj, ms, mr, mx, my, custom_shader, tilt_shadow) + local _draw_major = self.role.draw_major or self + if _shadow_height then + self.VT.y = self.VT.y - _draw_major.shadow_parrallax.y*_shadow_height + self.VT.x = self.VT.x - _draw_major.shadow_parrallax.x*_shadow_height + self.VT.scale = self.VT.scale*(1-0.2*_shadow_height) + end + + if custom_shader then + if _send then + for k, v in ipairs(_send) do + G.SHADERS[_shader]:send(v.name, v.val or (v.func and v.func()) or v.ref_table[v.ref_value]) + end + end + elseif _shader == 'vortex' then + G.SHADERS['vortex']:send('vortex_amt', G.TIMERS.REAL - (G.vortex_time or 0)) + else + self.ARGS.prep_shader = self.ARGS.prep_shader or {} + self.ARGS.prep_shader.cursor_pos = self.ARGS.prep_shader.cursor_pos or {} + self.ARGS.prep_shader.cursor_pos[1] = _draw_major.tilt_var and _draw_major.tilt_var.mx*G.CANV_SCALE or G.CONTROLLER.cursor_position.x*G.CANV_SCALE + self.ARGS.prep_shader.cursor_pos[2] = _draw_major.tilt_var and _draw_major.tilt_var.my*G.CANV_SCALE or G.CONTROLLER.cursor_position.y*G.CANV_SCALE + + G.SHADERS[_shader or 'dissolve']:send('mouse_screen_pos', self.ARGS.prep_shader.cursor_pos) + G.SHADERS[_shader or 'dissolve']:send('screen_scale', G.TILESCALE*G.TILESIZE*(_draw_major.mouse_damping or 1)*G.CANV_SCALE) + G.SHADERS[_shader or 'dissolve']:send('hovering',((_shadow_height and not tilt_shadow) or _no_tilt) and 0 or (_draw_major.hover_tilt or 0)*(tilt_shadow or 1)) + G.SHADERS[_shader or 'dissolve']:send("dissolve",math.abs(_draw_major.dissolve or 0)) + G.SHADERS[_shader or 'dissolve']:send("time",123.33412*(_draw_major.ID/1.14212 or 12.5123152)%3000) + G.SHADERS[_shader or 'dissolve']:send("texture_details",self:get_pos_pixel()) + G.SHADERS[_shader or 'dissolve']:send("image_details",self:get_image_dims()) + G.SHADERS[_shader or 'dissolve']:send("burn_colour_1",_draw_major.dissolve_colours and _draw_major.dissolve_colours[1] or G.C.CLEAR) + G.SHADERS[_shader or 'dissolve']:send("burn_colour_2",_draw_major.dissolve_colours and _draw_major.dissolve_colours[2] or G.C.CLEAR) + G.SHADERS[_shader or 'dissolve']:send("shadow",(not not _shadow_height)) + if _send then G.SHADERS[_shader or 'dissolve']:send(_shader,_send) end + end + + love.graphics.setShader( G.SHADERS[_shader or 'dissolve'], G.SHADERS[_shader or 'dissolve']) + + if other_obj then + self:draw_from(other_obj, ms, mr, mx, my) + else + self:draw_self() + end + + love.graphics.setShader() + + if _shadow_height then + self.VT.y = self.VT.y + _draw_major.shadow_parrallax.y*_shadow_height + self.VT.x = self.VT.x + _draw_major.shadow_parrallax.x*_shadow_height + self.VT.scale = self.VT.scale/(1-0.2*_shadow_height) + end +end + +function Sprite:draw_self(overlay) + if not self.states.visible then return end + if self.sprite_pos.x ~= self.sprite_pos_copy.x or self.sprite_pos.y ~= self.sprite_pos_copy.y then + self:set_sprite_pos(self.sprite_pos) + end + prep_draw(self, 1) + love.graphics.scale(1/(self.scale.x/self.VT.w), 1/(self.scale.y/self.VT.h)) + love.graphics.setColor(overlay or G.BRUTE_OVERLAY or G.C.WHITE) + if self.video then + self.video_dims = self.video_dims or { + w = self.video:getWidth(), + h = self.video:getHeight(), + } + love.graphics.draw( + self.video, + 0 ,0, + 0, + self.VT.w/(self.T.w)/(self.video_dims.w/self.scale.x), + self.VT.h/(self.T.h)/(self.video_dims.h/self.scale.y) + ) + else + love.graphics.draw( + self.atlas.image, + self.sprite, + 0 ,0, + 0, + self.VT.w/(self.T.w), + self.VT.h/(self.T.h) + ) + end + love.graphics.pop() + add_to_drawhash(self) + self:draw_boundingrect() + if self.shader_tab then love.graphics.setShader() end +end + +function Sprite:draw(overlay) + if not self.states.visible then return end + if self.draw_steps then + for k, v in ipairs(self.draw_steps) do + self:draw_shader(v.shader, v.shadow_height, v.send, v.no_tilt, v.other_obj, v.ms, v.mr, v.mx, v.my, not not v.send) + end + else + self:draw_self(overlay) + end + + add_to_drawhash(self) + for k, v in pairs(self.children) do + if k ~= 'h_popup' then v:draw() end + end + add_to_drawhash(self) + self:draw_boundingrect() +end + +function Sprite:draw_from(other_obj, ms, mr, mx, my) + self.ARGS.draw_from_offset = self.ARGS.draw_from_offset or {} + self.ARGS.draw_from_offset.x = mx or 0 + self.ARGS.draw_from_offset.y = my or 0 + prep_draw(other_obj, (1 + (ms or 0)), (mr or 0), self.ARGS.draw_from_offset, true) + love.graphics.scale(1/(other_obj.scale_mag or other_obj.VT.scale)) + love.graphics.setColor(G.BRUTE_OVERLAY or G.C.WHITE) + love.graphics.draw( + self.atlas.image, + self.sprite, + -(other_obj.T.w/2 -other_obj.VT.w/2)*10, + 0, + 0, + other_obj.VT.w/(other_obj.T.w), + other_obj.VT.h/(other_obj.T.h) + ) + self:draw_boundingrect() + love.graphics.pop() +end + +function Sprite:remove() + if self.video then + self.video:release() + end + for k, v in pairs(G.ANIMATIONS) do + if v == self then + table.remove(G.ANIMATIONS, k) + end + end + for k, v in pairs(G.I.SPRITE) do + if v == self then + table.remove(G.I.SPRITE, k) + end + end + + Moveable.remove(self) +end diff --git a/engine/string_packer.lua b/engine/string_packer.lua new file mode 100644 index 0000000..0ff7ada --- /dev/null +++ b/engine/string_packer.lua @@ -0,0 +1,72 @@ +--[[ +MIT License +Copyright (c) 2017 Robert Herlihy +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +]] + +--I modified this A LOT. Needed to make it quicker if it is being saved to file every few seconds during a game +function STR_PACK(data, recursive) + local ret_str = (recursive and "" or "return ").."{" + + for i, v in pairs(data) do + local type_i, type_v = type(i), type(v) + assert((type_i ~= "table"), "Data table cannot have an table as a key reference") + if type_i == "string" then + i = '['..string.format("%q",i)..']' + else + i = "["..i.."]" + end + if type_v == "table" then + if v.is and v:is(Object) then + v = [["]].."MANUAL_REPLACE"..[["]] + else + v = STR_PACK(v, true) + end + else + if type_v == "string" then v = string.format("%q", v) end + if type_v == "boolean" then v = v and "true" or "false" end + end + ret_str = ret_str..i.."="..v.."," + end + + return ret_str.."}" +end + +function STR_UNPACK(str) + return assert(loadstring(str))() +end + +function get_compressed(_file) + local file_data = love.filesystem.getInfo(_file) + if file_data ~= nil then + local file_string = love.filesystem.read(_file) + if file_string ~= '' then + if string.sub(file_string, 1, 6) ~= 'return' then + local success = nil + success, file_string = pcall(love.data.decompress, 'string', 'deflate', file_string) + if not success then return nil end + end + return file_string + end + end +end + +function compress_and_save(_file, _data) + local save_string = type(_data) == 'table' and STR_PACK(_data) or _data + save_string = love.data.compress('string', 'deflate', save_string, 1) + love.filesystem.write(_file,save_string) +end diff --git a/engine/text.lua b/engine/text.lua new file mode 100644 index 0000000..7540a67 --- /dev/null +++ b/engine/text.lua @@ -0,0 +1,315 @@ +--Class +DynaText = Moveable:extend() + +--Class Methods +function DynaText:init(config) + config = config or {} + self.config = config + self.shadow = config.shadow + self.scale = config.scale or 1 + self.pop_in_rate = config.pop_in_rate or 3 + self.bump_rate = config.bump_rate or 2.666 + self.bump_amount = config.bump_amount or 1 + self.font = config.font or G.LANG.font + if config.string and type(config.string) ~= 'table' then config.string = {config.string} end + self.string = (config.string and type(config.string) == 'table' and config.string[1]) or {'HELLO WORLD'} + self.text_offset = { + x = self.font.TEXT_OFFSET.x*self.scale + (self.config.x_offset or 0), + y = self.font.TEXT_OFFSET.y*self.scale + (self.config.y_offset or 0), + } + self.colours = config.colours or {G.C.RED} + self.created_time = G.TIMERS.REAL + self.silent = (config.silent) + + self.start_pop_in = self.config.pop_in + + config.W = 0 + config.H = 0 + + self.strings = {} + self.focused_string = 1 + + self:update_text(true) + if self.config.maxw and self.config.W > self.config.maxw then + self.start_pop_in = self.config.pop_in + self.scale = self.scale*(self.config.maxw/self.config.W) + self:update_text(true) + end + + if #self.strings > 1 then + self.pop_delay = self.config.pop_delay or 1.5 + self:pop_out(4) + end + + Moveable.init(self,config.X or 0, config.Y or 0, config.W, config.H) + + self.T.r = self.config.text_rot or 0 + + self.states.hover.can = false + self.states.click.can = false + self.states.collide.can = false + self.states.drag.can = false + self.states.release_on.can = false + + self:set_role{ + wh_bond = 'Weak', + scale_bond = 'Weak' + } + + if getmetatable(self) == DynaText then + table.insert(G.I.MOVEABLE, self) + end +end + +function DynaText:update(dt) + self:update_text() + self:align_letters() +end + +function DynaText:update_text(first_pass) + self.config.W = 0 + self.config.H = 0 + + for k, v in ipairs(self.config.string) do + if (type(v) == 'table' and v.ref_table) or first_pass then + local part_a, part_b = 0,1000000 + local new_string = v + local outer_colour = nil + local inner_colour = nil + local part_scale = 1 + if type(v) == 'table' and (v.ref_table or v.string) then + new_string = (v.prefix or '')..tostring(v.ref_table and v.ref_table[v.ref_value] or v.string)..(v.suffix or '') + part_a = #(v.prefix or '') + part_b = #new_string - #(v.suffix or '') + if v.scale then part_scale = v.scale end + if first_pass then + outer_colour = v.outer_colour or nil + inner_colour = v.colour or nil + end + v = new_string + end + + self.strings[k] = self.strings[k] or {} + local old_string = self.strings[k].string + if old_string ~= new_string or first_pass then + if self.start_pop_in then self.reset_pop_in = true end + self.reset_pop_in = self.reset_pop_in or self.config.reset_pop_in + if not self.reset_pop_in then + self.config.pop_out = nil + self.config.pop_in = nil + else + self.config.pop_in = self.config.pop_in or 0 + self.created_time = G.TIMERS.REAL + end + self.strings[k].string = v + local old_letters = self.strings[k].letters + local tempW = 0 + local tempH = 0 + local current_letter = 1 + self.strings[k].letters = {}--EMPTY(self.strings[k].letters) + + for _, c in utf8.chars(v) do + local old_letter = old_letters and old_letters[current_letter] or nil + local let_tab = {letter = love.graphics.newText(self.font.FONT, c), char = c, scale = old_letter and old_letter.scale or part_scale} + self.strings[k].letters[current_letter] = let_tab + local tx = self.font.FONT:getWidth(c)*self.scale*part_scale*G.TILESCALE*self.font.FONTSCALE + 2.7*(self.config.spacing or 0)*G.TILESCALE*self.font.FONTSCALE + local ty = self.font.FONT:getHeight(c)*self.scale*part_scale*G.TILESCALE*self.font.FONTSCALE*self.font.TEXT_HEIGHT_SCALE + let_tab.offset = old_letter and old_letter.offset or {x = 0, y = 0} + let_tab.dims = {x = tx/(self.font.FONTSCALE*G.TILESCALE), y = ty/(self.font.FONTSCALE*G.TILESCALE)} + let_tab.pop_in = first_pass and (old_letter and old_letter.pop_in or (self.config.pop_in and 0 or 1)) or 1 + let_tab.prefix = current_letter <= part_a and outer_colour or nil + let_tab.suffix = current_letter > part_b and outer_colour or nil + let_tab.colour = inner_colour or nil + if k > 1 then let_tab.pop_in = 0 end + tempW = tempW + tx/(G.TILESIZE*G.TILESCALE) + tempH = math.max(ty/(G.TILESIZE*G.TILESCALE), tempH) + current_letter = current_letter + 1 + end + + self.strings[k].W = tempW + self.strings[k].H = tempH + end + end + + if self.strings[k].W > self.config.W then self.config.W = self.strings[k].W; self.strings[k].W_offset = 0 end + if self.strings[k].H > self.config.H then self.config.H = self.strings[k].H; self.strings[k].H_offset = 0 end + end + + if self.T then + if (self.T.w ~= self.config.W or self.T.h ~= self.config.H) and (not first_pass or self.reset_pop_in) then + self.ui_object_updated = true + self.non_recalc = self.config.non_recalc + end + self.T.w = self.config.W + self.T.h = self.config.H + end + + self.reset_pop_in = false + self.start_pop_in = false + + for k, v in ipairs(self.strings) do + v.W_offset = 0.5*(self.config.W - v.W) + v.H_offset = 0.5*(self.config.H - v.H + (self.config.offset_y or 0)) + end +end + +function DynaText:pop_out(pop_out_timer) + self.config.pop_out = pop_out_timer or 1 + self.pop_out_time = G.TIMERS.REAL + (self.pop_delay or 0) +end + +function DynaText:pop_in(pop_in_timer) + self.reset_pop_in = true + self.config.pop_out = nil + self.config.pop_in = pop_in_timer or 0 + self.created_time = G.TIMERS.REAL + + for k, letter in ipairs(self.strings[self.focused_string].letters) do + letter.pop_in = 0 + end + + self:update_text() +end + +function DynaText:align_letters() + if self.pop_cycle then + self.focused_string = (self.config.random_element and math.random(1, #self.strings)) or self.focused_string == #self.strings and 1 or self.focused_string+1 + self.pop_cycle = false + for k, letter in ipairs(self.strings[self.focused_string].letters) do + letter.pop_in = 0 + end + self.config.pop_in = 0.1 + self.config.pop_out = nil + self.created_time = G.TIMERS.REAL + end + self.string = self.strings[self.focused_string].string + for k, letter in ipairs(self.strings[self.focused_string].letters) do + if self.config.pop_out then + letter.pop_in = math.min(1, math.max((self.config.min_cycle_time or 1)-(G.TIMERS.REAL - self.pop_out_time)*self.config.pop_out/(self.config.min_cycle_time or 1), 0)) + letter.pop_in = letter.pop_in*letter.pop_in + if k == #self.strings[self.focused_string].letters and letter.pop_in <= 0 and #self.strings > 1 then self.pop_cycle = true end + elseif self.config.pop_in then + local prev_pop_in = letter.pop_in + letter.pop_in = math.min(1, math.max((G.TIMERS.REAL - self.config.pop_in - self.created_time)*#self.string*self.pop_in_rate - k + 1, self.config.min_cycle_time == 0 and 1 or 0)) + letter.pop_in = letter.pop_in*letter.pop_in + if prev_pop_in <=0 and letter.pop_in > 0 and not self.silent and + (#self.string < 10 or k%2 == 0) then + if self.T.x > G.ROOM.T.w+2 or + self.T.y > G.ROOM.T.h+2 or + self.T.x <-2 or + self.T.y <-2 then else + play_sound('paper1', 0.45+0.05*math.random()+(0.3/#self.string)*k + (self.config.pitch_shift or 0)) + end + end + if k == #self.strings[self.focused_string].letters and letter.pop_in >= 1 then + if #self.strings > 1 then + self.pop_delay = (G.TIMERS.REAL - self.config.pop_in - self.created_time + (self.config.pop_delay or 1.5)) + self:pop_out(4) + else + self.config.pop_in = nil + end + end + end + letter.r = 0 + letter.scale = 1 + if self.config.rotate then letter.r = (self.config.rotate == 2 and -1 or 1)*(0.2*(-#self.strings[self.focused_string].letters/2 - 0.5 + k)/(#self.strings[self.focused_string].letters)+ 0.02*math.sin(2*G.TIMERS.REAL+k)) end + if self.config.pulse then + letter.scale = letter.scale + (1/self.config.pulse.width)*self.config.pulse.amount*(math.max( + math.min((self.config.pulse.start - G.TIMERS.REAL)*self.config.pulse.speed + k + self.config.pulse.width, + (G.TIMERS.REAL - self.config.pulse.start)*self.config.pulse.speed - k + self.config.pulse.width+ 2), + 0)) + letter.r = letter.r + (letter.scale - 1)*(0.02*(-#self.strings[self.focused_string].letters/2 - 0.5 + k)) + if self.config.pulse.start > G.TIMERS.REAL + 2*self.config.pulse.speed*#self.strings[self.focused_string].letters then + self.config.pulse = nil + end + end + if self.config.quiver then + letter.scale = letter.scale + (0.1*self.config.quiver.amount) + letter.r = letter.r + 0.3*self.config.quiver.amount*( + math.sin(41.12342*G.TIMERS.REAL*self.config.quiver.speed + k*1223.2) + + math.cos(63.21231*G.TIMERS.REAL*self.config.quiver.speed + k*1112.2)*math.sin(36.1231*G.TIMERS.REAL*self.config.quiver.speed) + + math.cos(95.123*G.TIMERS.REAL*self.config.quiver.speed + k*1233.2) - + math.sin(30.133421*G.TIMERS.REAL*self.config.quiver.speed + k*123.2)) + end + if self.config.float then letter.offset.y = math.sqrt(self.scale)*(2+(self.font.FONTSCALE/G.TILESIZE)*2000*math.sin(2.666*G.TIMERS.REAL+200*k)) + 60*(letter.scale-1) end + if self.config.bump then letter.offset.y = self.bump_amount*math.sqrt(self.scale)*7*math.max(0, (5+self.bump_rate)*math.sin(self.bump_rate*G.TIMERS.REAL+200*k) - 3 - self.bump_rate) end + end +end + +function DynaText:set_quiver(amt) + self.config.quiver = { + speed = 0.5, + amount = amt or 0.7, + silent = false + } +end + +function DynaText:pulse(amt) + self.config.pulse = { + speed = 40, + width = 2.5, + start = G.TIMERS.REAL, + amount = amt or 0.2, + silent = false + } +end + +function DynaText:draw() + if self.children.particle_effect then self.children.particle_effect:draw() end + + if self.shadow then + prep_draw(self, 1) + love.graphics.translate(self.strings[self.focused_string].W_offset + self.text_offset.x*self.font.FONTSCALE/G.TILESIZE, self.strings[self.focused_string].H_offset + self.text_offset.y*self.font.FONTSCALE/G.TILESIZE) + if self.config.spacing then love.graphics.translate(self.config.spacing*self.font.FONTSCALE/G.TILESIZE, 0) end + if self.config.shadow_colour then + love.graphics.setColor(self.config.shadow_colour) + else + love.graphics.setColor(0, 0, 0, 0.3*self.colours[1][4]) + end + for k, letter in ipairs(self.strings[self.focused_string].letters) do + local real_pop_in = self.config.min_cycle_time == 0 and 1 or letter.pop_in + love.graphics.draw( + letter.letter, + 0.5*(letter.dims.x - letter.offset.x)*self.font.FONTSCALE/G.TILESIZE -self.shadow_parrallax.x*self.scale/(G.TILESIZE), + 0.5*(letter.dims.y)*self.font.FONTSCALE/G.TILESIZE -self.shadow_parrallax.y*self.scale/(G.TILESIZE), + letter.r or 0, + real_pop_in*self.scale*self.font.FONTSCALE/G.TILESIZE, + real_pop_in*self.scale*self.font.FONTSCALE/G.TILESIZE, + 0.5*letter.dims.x/self.scale, + 0.5*letter.dims.y/self.scale + ) + love.graphics.translate(letter.dims.x*self.font.FONTSCALE/G.TILESIZE, 0) + end + love.graphics.pop() + end + + prep_draw(self, 1) + love.graphics.translate(self.strings[self.focused_string].W_offset + self.text_offset.x*self.font.FONTSCALE/G.TILESIZE, self.strings[self.focused_string].H_offset + self.text_offset.y*self.font.FONTSCALE/G.TILESIZE) + if self.config.spacing then love.graphics.translate(self.config.spacing*self.font.FONTSCALE/G.TILESIZE, 0) end + self.ARGS.draw_shadow_norm = self.ARGS.draw_shadow_norm or {} + local _shadow_norm = self.ARGS.draw_shadow_norm + _shadow_norm.x, _shadow_norm.y = + self.shadow_parrallax.x/math.sqrt(self.shadow_parrallax.y*self.shadow_parrallax.y + self.shadow_parrallax.x*self.shadow_parrallax.x)*self.font.FONTSCALE/G.TILESIZE, + self.shadow_parrallax.y/math.sqrt(self.shadow_parrallax.y*self.shadow_parrallax.y + self.shadow_parrallax.x*self.shadow_parrallax.x)*self.font.FONTSCALE/G.TILESIZE + + for k, letter in ipairs(self.strings[self.focused_string].letters) do + local real_pop_in = self.config.min_cycle_time == 0 and 1 or letter.pop_in + love.graphics.setColor(letter.prefix or letter.suffix or letter.colour or self.colours[k%#self.colours + 1]) + + love.graphics.draw( + letter.letter, + 0.5*(letter.dims.x - letter.offset.x)*self.font.FONTSCALE/G.TILESIZE + _shadow_norm.x, + 0.5*(letter.dims.y - letter.offset.y)*self.font.FONTSCALE/G.TILESIZE + _shadow_norm.y, + letter.r or 0, + real_pop_in*letter.scale*self.scale*self.font.FONTSCALE/G.TILESIZE, + real_pop_in*letter.scale*self.scale*self.font.FONTSCALE/G.TILESIZE, + 0.5*letter.dims.x/(self.scale), + 0.5*letter.dims.y/(self.scale) + ) + love.graphics.translate(letter.dims.x*self.font.FONTSCALE/G.TILESIZE, 0) + end + love.graphics.pop() + + add_to_drawhash(self) + self:draw_boundingrect() +end diff --git a/engine/ui.lua b/engine/ui.lua new file mode 100644 index 0000000..1c537a2 --- /dev/null +++ b/engine/ui.lua @@ -0,0 +1,1049 @@ +--Class +UIBox = Moveable:extend() + +--The base level and container of a graph of 1 or more UIElements. These UIEs are\ +--essentially a node based UI implementation. As the root node of the graph, this\ +--node is the first called for any movement, updates, or changes to ensure that all child\ +--nodes are updated and modified in the correct order.\\ +--The UI_definitions file houses the majority of the definition tables needed for UIBox initialization. +-- +---@param args {T: table, definition: table, config: table} +--**T** A standard transform in game units describing the inital position and size of the object with x, y, w, h\ +--ex - {x = 1, y = 5, w = 2, h = 2, r = 0} +-- +--**definition** A table containing a valid UIBox definition. These are mostly generated from UI_definitions +-- +--**config** A configuration table for the UIBox +--ex - { align = 'cm', offset = {x = 1, y = 1}, parent_rect = A, attach_rect = B, can_collide = true } +function UIBox:init(args) + --First initialize the moveable + Moveable.init(self,{args.T}) + + --Initialization of fields + self.states.drag.can = false + self.draw_layers = {} --if we need to explicitly change the draw order of the UIEs + + --The definition table that contains the schematic of this UIBox + self.definition = args.definition + + if args.config then + self.config = args.config + args.config.major = args.config.major or args.config.parent or self + + self:set_alignment({ + major = args.config.major, + type = args.config.align or args.config.type or '', + bond = args.config.bond or 'Strong', + offset = args.config.offset or {x=0,y=0} + }) + self:set_role{ + xy_bond = args.config.xy_bond, + r_bond = args.config.r_bond, + wh_bond = args.config.wh_bond or 'Weak', + scale_bond = args.config.scale_bond or 'Weak' + } + self.states.collide.can = true + + if args.config.can_collide == nil then + self.states.collide.can = true + else + self.states.collide.can = args.config.can_collide + end + + self.parent = self.config.parent + end + + --inherit the layered_parallax from the parent if there is any + --self.layered_parallax = self.role.major and self.role.major.layered_parallax or self.layered_parallax + + --Initialization of the UIBox from the definition + --First, set parent-child relationships to create the tree structure of the box + + self:set_parent_child(self.definition, nil) + --Set the midpoint for any future alignments to use + self.Mid = self.Mid or self.UIRoot + --Calculate the correct and width/height and offset for each node + self:calculate_xywh(self.UIRoot, self.T) + + --set the transform w/h to equal that of the calculated box + self.T.w = self.UIRoot.T.w + self.T.h = self.UIRoot.T.h + --Then, calculate the correct width and height for each container + self.UIRoot:set_wh() + --Then, set all of the correct alignments for the ui elements\ + + self.UIRoot:set_alignments() + + self:align_to_major() + self.VT.x, self.VT.y = self.T.x, self.T.y + self.VT.w, self.VT.h = self.T.w, self.T.h + + if self.Mid ~= self and self.Mid.parent and false then + self.VT.x = self.VT.x - self.Mid.role.offset.x + (self.Mid.parent.config.padding or 0) + self.VT.y = self.VT.y - self.Mid.role.offset.y + (self.Mid.parent.config.padding or 0) + end + + self.UIRoot:initialize_VT(true) + if getmetatable(self) == UIBox then + if args.config.instance_type then + table.insert(G.I[args.config.instance_type], self) + else + table.insert(G.I.UIBOX, self) + end + end +end + +function UIBox:get_UIE_by_ID(id, node) + if not node then node = self.UIRoot end + if node.config and node.config.id == id then return node end + for k, v in pairs(node.children) do + local res = self:get_UIE_by_ID(id, v) + if res then + return res + elseif v.config.object and v.config.object.get_UIE_by_ID then + res = v.config.object:get_UIE_by_ID(id, nil) + if res then + return res + end + end + end + return nil +end + +function UIBox:calculate_xywh(node, _T, recalculate, _scale) + node.ARGS.xywh_node_trans = node.ARGS.xywh_node_trans or {} + local _nt = node.ARGS.xywh_node_trans + local _ct = {} + + _ct.x, _ct.y, _ct.w, _ct.h = 0,0,0,0 + + local padding = node.config.padding or G.UIT.padding + --current node does not contain anything + if node.UIT == G.UIT.B or node.UIT == G.UIT.T or node.UIT == G.UIT.O then + _nt.x, _nt.y, _nt.w, _nt.h = + _T.x, + _T.y, + node.config.w or (node.config.object and node.config.object.T.w), + node.config.h or (node.config.object and node.config.object.T.h) + + if node.UIT == G.UIT.T then + node.config.text_drawable = nil + local scale = node.config.scale or 1 + if node.config.ref_table and node.config.ref_value then + node.config.text = tostring(node.config.ref_table[node.config.ref_value]) + if node.config.func and not recalculate then G.FUNCS[node.config.func](node) end + end + if not node.config.text then node.config.text = '[UI ERROR]' end + node.config.lang = node.config.lang or G.LANG + local tx = node.config.lang.font.FONT:getWidth(node.config.text)*node.config.lang.font.squish*scale*G.TILESCALE*node.config.lang.font.FONTSCALE + local ty = node.config.lang.font.FONT:getHeight()*scale*G.TILESCALE*node.config.lang.font.FONTSCALE*node.config.lang.font.TEXT_HEIGHT_SCALE + if node.config.vert then local thunk = tx; tx = ty; ty = thunk end + _nt.x, _nt.y, _nt.w, _nt.h = + _T.x, + _T.y, + tx/(G.TILESIZE*G.TILESCALE), + ty/(G.TILESIZE*G.TILESCALE) + + node.content_dimensions = node.content_dimensions or {} + node.content_dimensions.w = _T.w + node.content_dimensions.h = _T.h + node:set_values(_nt, recalculate) + elseif node.UIT == G.UIT.B or node.UIT == G.UIT.O then + node.content_dimensions = node.content_dimensions or {} + node.content_dimensions.w = _nt.w + node.content_dimensions.h = _nt.h + node:set_values(_nt, recalculate) + end + return _nt.w, _nt.h + else --For all other node containers, treat them explicitly like a column + for i = 1, 2 do + if i == 1 or (i == 2 and ((node.config.maxw and _ct.w > node.config.maxw) or (node.config.maxh and _ct.h > node.config.maxh))) then + local fac = _scale or 1 + if i == 2 then + local restriction = node.config.maxw or node.config.maxh + fac = fac*restriction/(node.config.maxw and _ct.w or _ct.h) + end + _nt.x, _nt.y, _nt.w, _nt.h = + _T.x, + _T.y, + node.config.minw or 0, + node.config.minh or 0 + + if node.UIT == G.UIT.ROOT then + _nt.x, _nt.y, _nt.w, _nt.h = 0, 0, node.config.minw or 0, node.config.minh or 0 + end + _ct.x, _ct.y, _ct.w, _ct.h = _nt.x+padding, _nt.y+padding, 0, 0 + local _tw, _th + for k, v in ipairs(node.children) do + if getmetatable(v) == UIElement then + if v.config and v.config.scale then v.config.scale = v.config.scale*fac end + _tw, _th = self:calculate_xywh(v, _ct, recalculate, fac) + if _th and _tw then + if v.UIT == G.UIT.R then + _ct.h = _ct.h + _th + padding + _ct.y = _ct.y + _th + padding + if _tw + padding > _ct.w then _ct.w = _tw + padding end + if v.config and v.config.emboss then + _ct.h = _ct.h + v.config.emboss + _ct.y = _ct.y + v.config.emboss + end + else + _ct.w = _ct.w + _tw + padding + _ct.x = _ct.x + _tw + padding + if _th + padding > _ct.h then _ct.h = _th + padding end + if v.config and v.config.emboss then + _ct.h = _ct.h + v.config.emboss + end + end + end + end + end + end + end + + node.content_dimensions = node.content_dimensions or {} + node.content_dimensions.w = _ct.w + padding + node.content_dimensions.h = _ct.h + padding + _nt.w = math.max(_ct.w + padding, _nt.w) + _nt.h = math.max(_ct.h + padding, _nt.h)-- + node:set_values(_nt, recalculate) + return _nt.w, _nt.h + end +end + +function UIBox:remove_group(node, group) + node = node or self.UIRoot + for k, v in pairs(node.children) do + if self:remove_group(v, group) then node.children[k] = nil end + end + if node.config and node.config.group and node.config.group == group then node:remove(); return true end + + if not node.parent or true then self:calculate_xywh(self.UIRoot, self.T, true); self.UIRoot:set_wh(); self.UIRoot:set_alignment() end--self:recalculate() end +end + +function UIBox:get_group(node, group, ingroup) + node = node or self.UIRoot + ingroup = ingroup or {} + for k, v in pairs(node.children) do + self:get_group(v, group, ingroup) + end + if node.config and node.config.group and node.config.group == group then table.insert(ingroup, node); return ingroup end + return ingroup +end + +function UIBox:set_parent_child(node, parent) + local UIE = UIElement(parent, self, node.n, node.config) + + --set the group of the element + if parent and parent.config and parent.config.group then if UIE.config then UIE.config.group = parent.config.group else UIE.config = {group = parent.config.group} end end + + --set the button for the element + if parent and parent.config and parent.config.button then if UIE.config then UIE.config.button_UIE = parent else UIE.config = {button_UIE = parent} end end + if parent and parent.config and parent.config.button_UIE then if UIE.config then UIE.config.button_UIE = parent.config.button_UIE else UIE.config = {button = parent.config.button} end end + + if node.n and node.n == G.UIT.O and UIE.config.button then + UIE.config.object.states.click.can = false + end + + --current node is a container + if (node.n and node.n == G.UIT.C or node.n == G.UIT.R or node.n == G.UIT.ROOT) and node.nodes then + for k, v in pairs(node.nodes) do + self:set_parent_child(v, UIE) + end + end + + if not parent then + self.UIRoot = UIE + self.UIRoot.parent = self + else + table.insert(parent.children, UIE) + end + if node.config and node.config.mid then + self.Mid = UIE + end +end +function UIBox:remove() + if self == G.OVERLAY_MENU then G.REFRESH_ALERTS = true end + self.UIRoot:remove() + for k, v in pairs(G.I[self.config.instance_type or 'UIBOX']) do + if v == self then + table.remove(G.I[self.config.instance_type or 'UIBOX'], k) + end + end + remove_all(self.children) + Moveable.remove(self) +end + +function UIBox:draw() + if self.FRAME.DRAW >= G.FRAMES.DRAW and not G.OVERLAY_TUTORIAL then return end + self.FRAME.DRAW = G.FRAMES.DRAW + + for k, v in pairs(self.children) do + if k ~= 'h_popup' and k ~= 'alert' then v:draw() end + end + + if self.states.visible then + add_to_drawhash(self) + self.UIRoot:draw_self() + self.UIRoot:draw_children() + for k, v in ipairs(self.draw_layers) do + if v.draw_self then v:draw_self() else v:draw() end + if v.draw_children then v:draw_children() end + end + end + + if self.children.alert then self.children.alert:draw() end + + self:draw_boundingrect() +end + +function UIBox:recalculate() + --Calculate the correct dimensions and width/height and offset for each node + self:calculate_xywh(self.UIRoot, self.T, true) + --Then, calculate the correct width and height for each container + self.UIRoot:set_wh() + --Then, set all of the correct alignments for the ui elements + self.UIRoot:set_alignments() + self.T.w = self.UIRoot.T.w + self.T.h = self.UIRoot.T.h + G.REFRESH_FRAME_MAJOR_CACHE = (G.REFRESH_FRAME_MAJOR_CACHE or 0) + 1 + self.UIRoot:initialize_VT() + G.REFRESH_FRAME_MAJOR_CACHE = (G.REFRESH_FRAME_MAJOR_CACHE > 1 and G.REFRESH_FRAME_MAJOR_CACHE - 1 or nil) +end + +function UIBox:move(dt) + Moveable.move(self, dt) + Moveable.move(self.UIRoot, dt) +end + +function UIBox:drag(offset) + Moveable.drag(self,offset) + Moveable.move(self.UIRoot, dt) +end + +function UIBox:add_child(node, parent) + self:set_parent_child(node, parent) + self:recalculate() +end + +function UIBox:set_container(container) + self.UIRoot:set_container(container) + Node.set_container(self, container) +end + +function UIBox:print_topology(indent) + local box_str = '| UIBox | - ID:'..self.ID..' w/h:'..self.T.w..'/'..self.T.h + local indent = indent or 0 + box_str = box_str..self.UIRoot:print_topology(indent) + return box_str +end + +--Class +UIElement = Moveable:extend() +--Class Methods +function UIElement:init(parent, new_UIBox, new_UIT, config) + self.parent = parent + self.UIT = new_UIT + self.UIBox = new_UIBox + self.config = config or {} + if self.config and self.config.object then self.config.object.parent = self end + self.children = {} + self.ARGS = self.ARGS or {} + self.content_dimensions = {w=0, h=0} +end +function UIElement:set_values(_T, recalculate) + if not recalculate or not self.T then + Moveable.init(self,{T = _T}) + self.states.click.can = false + self.states.drag.can = false + self.static_rotation = true + else + self.T.x = _T.x + self.T.y = _T.y + self.T.w = _T.w + self.T.h = _T.h + end + + if self.config.button_UIE then self.states.collide.can = true; self.states.hover.can = false; self.states.click.can = true end + if self.config.button then self.states.collide.can = true; self.states.click.can = true end + + if self.config.on_demand_tooltip or self.config.tooltip or self.config.detailed_tooltip then + self.states.collide.can = true + end + + self:set_role{role_type = 'Minor', major = self.UIBox, offset = {x = _T.x, y = _T.y}, wh_bond = 'Weak', scale_bond = 'Weak'} + + if self.config.draw_layer then + self.UIBox.draw_layers[self.config.draw_layer] = self + end + + if self.config.collideable then self.states.collide.can = true end + + if self.config.can_collide ~= nil then + self.states.collide.can = self.config.can_collide + if self.config.object then self.config.object.states.collide.can = self.states.collide.can end + end + + if self.UIT == G.UIT.O and not self.config.no_role then + self.config.object:set_role(self.config.role or {role_type = 'Minor', major = self, xy_bond = 'Strong', wh_bond = 'Weak', scale_bond = 'Weak'}) + end + + if self.config and self.config.ref_value and self.config.ref_table then + self.config.prev_value = self.config.ref_table[self.config.ref_value] + end + + if self.UIT == G.UIT.T then self.static_rotation = true end + + if self.config.juice then + if self.UIT == G.UIT.ROOT then self:juice_up() end + if self.UIT == G.UIT.T then self:juice_up() end + if self.UIT == G.UIT.O then self.config.object:juice_up(0.5) end + if self.UIT == G.UIT.B then self:juice_up() end + if self.UIT == G.UIT.C then self:juice_up() end + if self.UIT == G.UIT.R then self:juice_up() end + self.config.juice = false + end + + if not self.config.colour then + if self.UIT == G.UIT.ROOT then self.config.colour = G.C.UI.BACKGROUND_DARK end + if self.UIT == G.UIT.T then self.config.colour = G.C.UI.TEXT_LIGHT end + if self.UIT == G.UIT.O then self.config.colour = G.C.WHITE end + if self.UIT == G.UIT.B then self.config.colour = G.C.CLEAR end + if self.UIT == G.UIT.C then self.config.colour = G.C.CLEAR end + if self.UIT == G.UIT.R then self.config.colour = G.C.CLEAR end + end + if not self.config.outline_colour then + if self.UIT == G.UIT.ROOT then self.config.outline_colour = G.C.UI.OUTLINE_LIGHT end + if self.UIT == G.UIT.T then self.config.outline_colour = G.C.UI.OUTLINE_LIGHT end + if self.UIT == G.UIT.O then self.config.colour = G.C.UI.OUTLINE_LIGHT end + if self.UIT == G.UIT.B then self.config.outline_colour = G.C.UI.OUTLINE_LIGHT end + if self.UIT == G.UIT.C then self.config.outline_colour = G.C.UI.OUTLINE_LIGHT end + if self.UIT == G.UIT.R then self.config.outline_colour = G.C.UI.OUTLINE_LIGHT end + end + + if self.config.focus_args and not self.config.focus_args.registered then + if self.config.focus_args.button then + G.CONTROLLER:add_to_registry(self.config.button_UIE or self, self.config.focus_args.button) + end + + if self.config.focus_args.snap_to then + G.CONTROLLER:snap_to{node = self} + end + + if self.config.focus_args.funnel_to then + local _par = self.parent + while _par and _par:is(UIElement) do + if _par.config.focus_args and _par.config.focus_args.funnel_from then + _par.config.focus_args.funnel_from = self + self.config.focus_args.funnel_to = _par + break + end + _par = _par.parent + end + end + self.config.focus_args.registered = true + end + + if self.config.force_focus then self.states.collide.can = true end + + if self.config.button_delay and not self.config.button_delay_start then + self.config.button_delay_start = G.TIMERS.REAL + self.config.button_delay_end = G.TIMERS.REAL + self.config.button_delay + self.config.button_delay_progress = 0 + end + + self.layered_parallax = self.layered_parallax or {x=0, y=0} + + if self.config and self.config.func and (((self.config.button_UIE or self.config.button) and self.config.func ~= 'set_button_pip') or self.config.insta_func) then G.FUNCS[self.config.func](self) end +end + +function UIElement:print_topology(indent) + local UIT = '????' + for k, v in pairs(G.UIT) do + if v == self.UIT then UIT = ''..k end + end + local box_str = '\n'..(string.rep(" ", indent))..'| '..UIT..' | - ID:'..self.ID..' w/h:'..self.T.w..'/'..self.T.h + if UIT == 'O' then + box_str = box_str..' OBJ:'..( + getmetatable(self.config.object) == CardArea and 'CardArea' or + getmetatable(self.config.object) == Card and 'Card' or + getmetatable(self.config.object) == UIBox and 'UIBox' or + getmetatable(self.config.object) == Particles and 'Particles' or + getmetatable(self.config.object) == DynaText and 'DynaText' or + getmetatable(self.config.object) == Sprite and 'Sprite' or + getmetatable(self.config.object) == AnimatedSprite and 'AnimatedSprite' or + 'OTHER' + ) + elseif UIT == 'T' then + box_str = box_str..' TEXT:'..(self.config.text or 'REF') + end + + for k, v in ipairs(self.children) do + if v.print_topology then + box_str = box_str..v:print_topology(indent+1) + end + end + return box_str +end + +function UIElement:initialize_VT() + self:move_with_major(0) + self:calculate_parrallax() + + for _, v in pairs(self.children) do + if v.initialize_VT then v:initialize_VT() end + end + + self.VT.w, self.VT.h = self.T.w, self.T.h + + if self.UIT == G.UIT.T then self:update_text() end + if self.config.object then + if not self.config.no_role then + self.config.object:hard_set_T(self.T.x, self.T.y, self.T.w, self.T.h) + self.config.object:move_with_major(0) + self.config.object.alignment.prev_type = '' + self.config.object:align_to_major() + end + if self.config.object.recalculate then + self.config.object:recalculate() + end + end +end + +function UIElement:juice_up(amount, rot_amt) + if self.UIT == G.UIT.O then + if self.config.object then self.config.object:juice_up(amount, rot_amt) end + else + Moveable.juice_up(self, amount, rot_amt) + end +end + +function UIElement:can_drag() + if self.states.drag.can then return self end + return self.UIBox:can_drag() +end + +function UIElement:draw() +end + +function UIElement:draw_children(layer) + if self.states.visible then + for k, v in pairs(self.children) do + if not v.config.draw_layer and k ~= 'h_popup' and k~= 'alert' then + if v.draw_self and not v.config.draw_after then v:draw_self() else v:draw() end + if v.draw_children then v:draw_children() end + if v.draw_self and v.config.draw_after then v:draw_self() else v:draw() end + end + end + end +end + +function UIElement:set_wh() + --Iterate through all children of this node + local padding = (self.config and self.config.padding) or G.UIT.padding + + local _max_w, _max_h = 0,0 + + if next(self.children) == nil or self.config.no_fill then + return self.T.w, self.T.h + else + for k, w in pairs(self.children) do + if w.set_wh then + local _cw, _ch = w:set_wh() + if _cw and _ch then + if _cw > _max_w then _max_w = _cw end + if _ch > _max_h then _max_h = _ch end + else + _max_w = padding + _max_h = padding + end + end + end + for k, w in pairs(self.children) do + if w.UIT == G.UIT.R then w.T.w = _max_w end + if w.UIT == G.UIT.C then w.T.h = _max_h end + end + end + return self.T.w, self.T.h +end + +function UIElement:align(x, y) + self.role.offset.y = self.role.offset.y + y + self.role.offset.x = self.role.offset.x + x + for _, v in pairs(self.children) do + if v.align then + v:align(x, y) + end + end +end + +function UIElement:set_alignments() + --vertically centered is c = centered + --horizontally centered is m = middle + --top and left are default + --bottom is b + --right is r + for k, v in pairs(self.children) do + if self.config and self.config.align and v.align then + + local padding = self.config.padding or G.UIT.padding + + if string.find(self.config.align, "c") then + if v.UIT == G.UIT.T or v.UIT == G.UIT.B or v.UIT == G.UIT.O then + v:align(0,0.5*(self.T.h - 2*padding - v.T.h)) + else + v:align(0,0.5*(self.T.h - self.content_dimensions.h)) + end + end + if string.find(self.config.align, "m") then + v:align(0.5*(self.T.w - self.content_dimensions.w),0) + end + if string.find(self.config.align, "b") then + v:align(0, self.T.h - self.content_dimensions.h) + end + if string.find(self.config.align, "r") then + v:align((self.T.w - self.content_dimensions.w), 0) + end + end + if v.set_alignments then v:set_alignments() end + end +end +function UIElement:update_text() + if self.config and self.config.text and not self.config.text_drawable then + self.config.lang = self.config.lang or G.LANG + self.config.text_drawable = love.graphics.newText(self.config.lang.font.FONT, {G.C.WHITE,self.config.text}) + end + + if self.config.ref_table and self.config.ref_table[self.config.ref_value] ~= self.config.prev_value then + self.config.text = tostring(self.config.ref_table[self.config.ref_value]) + self.config.text_drawable:set(self.config.text) + if not self.config.no_recalc and self.config.prev_value and string.len(self.config.prev_value) ~= string.len(self.config.text) then self.UIBox:recalculate() end + self.config.prev_value = self.config.ref_table[self.config.ref_value] + end +end + +function UIElement:update_object() + if self.config.ref_table and self.config.ref_value and self.config.ref_table[self.config.ref_value] ~= self.config.object then + self.config.object = self.config.ref_table[self.config.ref_value] + self.UIBox:recalculate() + end + + if self.config.object then + self.config.object.config.refresh_movement = true + if self.config.object.states.hover.is and not self.states.hover.is then + self:hover() + self.states.hover.is = true + end + if not self.config.object.states.hover.is and self.states.hover.is then + self:stop_hover() + self.states.hover.is = false + end + end + + if self.config.object and self.config.object.ui_object_updated then + self.config.object.ui_object_updated = nil + self.config.object.parent = self + self.config.object:set_role(self.config.role or {role_type = 'Minor', major = self}) + self.config.object:move_with_major(0) + if self.config.object.non_recalc then + self.parent.content_dimensions.w = self.config.object.T.w + self:align(self.parent.T.x - self.config.object.T.x, self.parent.T.y - self.config.object.T.y) + self.parent:set_alignments() + else + self.UIBox:recalculate() + end + end +end +function UIElement:draw_self() + if not self.states.visible then + if self.config.force_focus then add_to_drawhash(self) end + return + end + + if self.config.force_focus or self.config.force_collision or self.config.button_UIE or self.config.button or self.states.collide.can then + add_to_drawhash(self) + end + + local button_active = true + local parallax_dist = 1.5 + local button_being_pressed = false + + if (self.config.button or self.config.button_UIE) then + self.layered_parallax.x = ((self.parent and self.parent ~= self.UIBox and self.parent.layered_parallax.x or 0) + (self.config.shadow and 0.4*self.shadow_parrallax.x or 0)/G.TILESIZE) + self.layered_parallax.y = ((self.parent and self.parent ~= self.UIBox and self.parent.layered_parallax.y or 0) + (self.config.shadow and 0.4*self.shadow_parrallax.y or 0)/G.TILESIZE) + + if self.config.button and ((self.last_clicked and self.last_clicked > G.TIMERS.REAL - 0.1) or ((self.config.button and (self.states.hover.is or self.states.drag.is)) + and G.CONTROLLER.is_cursor_down)) then + self.layered_parallax.x = self.layered_parallax.x - parallax_dist*self.shadow_parrallax.x/G.TILESIZE*(self.config.button_dist or 1) + self.layered_parallax.y = self.layered_parallax.y - parallax_dist*self.shadow_parrallax.y/G.TILESIZE*(self.config.button_dist or 1) + parallax_dist = 0 + button_being_pressed = true + end + + if self.config.button_UIE and not self.config.button_UIE.config.button then button_active = false end + end + + if self.config.colour[4] > 0.01 then + if self.UIT == G.UIT.T and self.config.scale then + self.ARGS.text_parallax = self.ARGS.text_parallax or {} + self.ARGS.text_parallax.sx = -self.shadow_parrallax.x*0.5/(self.config.scale*self.config.lang.font.FONTSCALE) + self.ARGS.text_parallax.sy = -self.shadow_parrallax.y*0.5/(self.config.scale*self.config.lang.font.FONTSCALE) + + if (self.config.button_UIE and button_active) or (not self.config.button_UIE and self.config.shadow and G.SETTINGS.GRAPHICS.shadows == 'On') then + prep_draw(self, 0.97) + if self.config.vert then love.graphics.translate(0,self.VT.h); love.graphics.rotate(-math.pi/2) end + if (self.config.shadow or (self.config.button_UIE and button_active)) and G.SETTINGS.GRAPHICS.shadows == 'On' then + love.graphics.setColor(0, 0, 0, 0.3*self.config.colour[4]) + love.graphics.draw( + self.config.text_drawable, + (self.config.lang.font.TEXT_OFFSET.x + (self.config.vert and -self.ARGS.text_parallax.sy or self.ARGS.text_parallax.sx))*(self.config.scale or 1)*self.config.lang.font.FONTSCALE/G.TILESIZE, + (self.config.lang.font.TEXT_OFFSET.y + (self.config.vert and self.ARGS.text_parallax.sx or self.ARGS.text_parallax.sy))*(self.config.scale or 1)*self.config.lang.font.FONTSCALE/G.TILESIZE, + 0, + (self.config.scale)*self.config.lang.font.squish*self.config.lang.font.FONTSCALE/G.TILESIZE, + (self.config.scale)*self.config.lang.font.FONTSCALE/G.TILESIZE + ) + end + love.graphics.pop() + end + + prep_draw(self, 1) + if self.config.vert then love.graphics.translate(0,self.VT.h); love.graphics.rotate(-math.pi/2) end + if not button_active then + love.graphics.setColor(G.C.UI.TEXT_INACTIVE) + else + love.graphics.setColor(self.config.colour) + end + love.graphics.draw( + self.config.text_drawable, + self.config.lang.font.TEXT_OFFSET.x*(self.config.scale)*self.config.lang.font.FONTSCALE/G.TILESIZE, + self.config.lang.font.TEXT_OFFSET.y*(self.config.scale)*self.config.lang.font.FONTSCALE/G.TILESIZE, + 0, + (self.config.scale)*self.config.lang.font.squish*self.config.lang.font.FONTSCALE/G.TILESIZE, + (self.config.scale)*self.config.lang.font.FONTSCALE/G.TILESIZE + ) + love.graphics.pop() + elseif self.UIT == G.UIT.B or self.UIT == G.UIT.C or self.UIT == G.UIT.R or self.UIT == G.UIT.ROOT then + prep_draw(self, 1) + love.graphics.scale(1/(G.TILESIZE)) + if self.config.shadow and G.SETTINGS.GRAPHICS.shadows == 'On' then + love.graphics.scale(0.98) + if self.config.shadow_colour then + love.graphics.setColor(self.config.shadow_colour) + else + love.graphics.setColor(0,0,0,0.3*self.config.colour[4]) + end + if self.config.r and self.VT.w > 0.01 then + self:draw_pixellated_rect('shadow', parallax_dist) + else + love.graphics.rectangle('fill', -self.shadow_parrallax.x*parallax_dist, -self.shadow_parrallax.y*parallax_dist, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE) + end + love.graphics.scale(1/0.98) + end + + love.graphics.scale(button_being_pressed and 0.985 or 1) + if self.config.emboss then + love.graphics.setColor(darken(self.config.colour, self.states.hover.is and 0.5 or 0.3, true)) + self:draw_pixellated_rect('emboss', parallax_dist, self.config.emboss) + end + local collided_button = self.config.button_UIE or self + self.ARGS.button_colours = self.ARGS.button_colours or {} + self.ARGS.button_colours[1] = self.config.button_delay and mix_colours(self.config.colour, G.C.L_BLACK, 0.5) or self.config.colour + self.ARGS.button_colours[2] = (((collided_button.config.hover and collided_button.states.hover.is) or (collided_button.last_clicked and collided_button.last_clicked > G.TIMERS.REAL - 0.1)) and G.C.UI.HOVER or nil) + for k, v in ipairs(self.ARGS.button_colours) do + love.graphics.setColor(v) + if self.config.r and self.VT.w > 0.01 then + if self.config.button_delay then + love.graphics.setColor(G.C.GREY) + self:draw_pixellated_rect('fill', parallax_dist) + love.graphics.setColor(v) + self:draw_pixellated_rect('fill', parallax_dist, nil, self.config.button_delay_progress) + elseif self.config.progress_bar then + love.graphics.setColor(self.config.progress_bar.empty_col or G.C.GREY) + self:draw_pixellated_rect('fill', parallax_dist) + love.graphics.setColor(self.config.progress_bar.filled_col or G.C.BLUE) + self:draw_pixellated_rect('fill', parallax_dist, nil, self.config.progress_bar.ref_table[self.config.progress_bar.ref_value]/self.config.progress_bar.max) + else + self:draw_pixellated_rect('fill', parallax_dist) + end + else + love.graphics.rectangle('fill', 0,0, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE) + end + end + love.graphics.pop() + elseif self.UIT == G.UIT.O and self.config.object then + --Draw the outline for highlighted objext + if self.config.focus_with_object and self.config.object.states.focus.is then + self.object_focus_timer = self.object_focus_timer or G.TIMERS.REAL + local lw = 50*math.max(0, self.object_focus_timer - G.TIMERS.REAL + 0.3)^2 + prep_draw(self, 1) + love.graphics.scale((1)/(G.TILESIZE)) + love.graphics.setLineWidth(lw + 1.5) + love.graphics.setColor(adjust_alpha(G.C.WHITE, 0.2*lw, true)) + self:draw_pixellated_rect('fill', parallax_dist) + love.graphics.setColor(self.config.colour[4] > 0 and mix_colours(G.C.WHITE, self.config.colour, 0.8) or G.C.WHITE) + self:draw_pixellated_rect('line', parallax_dist) + love.graphics.pop() + else + self.object_focus_timer = nil + end + self.config.object:draw() + end + end + + --Draw the outline of the object + if self.config.outline and self.config.outline_colour[4] > 0.01 then + if self.config.outline then + prep_draw(self, 1) + love.graphics.scale(1/(G.TILESIZE)) + love.graphics.setLineWidth(self.config.outline) + if self.config.line_emboss then + love.graphics.setColor(darken(self.config.outline_colour, self.states.hover.is and 0.5 or 0.3, true)) + self:draw_pixellated_rect('line_emboss', parallax_dist, self.config.line_emboss) + end + love.graphics.setColor(self.config.outline_colour) + if self.config.r and self.VT.w > 0.01 then + self:draw_pixellated_rect('line', parallax_dist) + else + love.graphics.rectangle('line', 0,0, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE) + end + love.graphics.pop() + end + end + + --Draw the outline for highlighted buttons + if self.states.focus.is then + self.focus_timer = self.focus_timer or G.TIMERS.REAL + local lw = 50*math.max(0, self.focus_timer - G.TIMERS.REAL + 0.3)^2 + prep_draw(self, 1) + love.graphics.scale((1)/(G.TILESIZE)) + love.graphics.setLineWidth(lw + 1.5) + love.graphics.setColor(adjust_alpha(G.C.WHITE, 0.2*lw, true)) + self:draw_pixellated_rect('fill', parallax_dist) + love.graphics.setColor(self.config.colour[4] > 0 and mix_colours(G.C.WHITE, self.config.colour, 0.8) or G.C.WHITE) + self:draw_pixellated_rect('line', parallax_dist) + love.graphics.pop() + else + self.focus_timer = nil + end + + --Draw the 'chosen triangle' + if self.config.chosen then + prep_draw(self, 0.98) + love.graphics.scale(1/(G.TILESIZE)) + if self.config.shadow and G.SETTINGS.GRAPHICS.shadows == 'On' then + love.graphics.setColor(0,0,0,0.3*self.config.colour[4]) + love.graphics.polygon("fill", get_chosen_triangle_from_rect(self.layered_parallax.x - self.shadow_parrallax.x*parallax_dist*0.5, self.layered_parallax.y - self.shadow_parrallax.y*parallax_dist*0.5, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE, self.config.chosen == 'vert')) + end + love.graphics.pop() + + prep_draw(self, 1) + love.graphics.scale(1/(G.TILESIZE)) + love.graphics.setColor(G.C.RED) + love.graphics.polygon("fill", get_chosen_triangle_from_rect(self.layered_parallax.x, self.layered_parallax.y, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE, self.config.chosen == 'vert')) + love.graphics.pop() + end + self:draw_boundingrect() +end + +function UIElement:draw_pixellated_rect(_type, _parallax, _emboss, _progress) + if not self.pixellated_rect or + #self.pixellated_rect[_type].vertices < 1 or + _parallax ~= self.pixellated_rect.parallax or + self.pixellated_rect.w ~= self.VT.w or + self.pixellated_rect.h ~= self.VT.h or + self.pixellated_rect.sw ~= self.shadow_parrallax.x or + self.pixellated_rect.sh ~= self.shadow_parrallax.y or + self.pixellated_rect.progress ~= (_progress or 1) + then + self.pixellated_rect = { + w = self.VT.w, + h = self.VT.h, + sw = self.shadow_parrallax.x, + sh = self.shadow_parrallax.y, + progress = (_progress or 1), + fill = {vertices = {}}, + shadow = {vertices = {}}, + line = {vertices = {}}, + emboss = {vertices = {}}, + line_emboss = {vertices = {}}, + parallax = _parallax + } + local ext_up = self.config.ext_up and self.config.ext_up*G.TILESIZE or 0 + local res = self.config.res or math.min(self.VT.w, self.VT.h + math.abs(ext_up)/G.TILESIZE) > 3.5 and 0.8 or math.min(self.VT.w, self.VT.h + math.abs(ext_up)/G.TILESIZE) > 0.3 and 0.6 or 0.15 + local totw, toth, subw, subh = self.VT.w*G.TILESIZE, (self.VT.h + math.abs(ext_up)/G.TILESIZE)*G.TILESIZE, self.VT.w*G.TILESIZE-4*res, (self.VT.h + math.abs(ext_up)/G.TILESIZE)*G.TILESIZE-4*res + + local vertices = { + subw/2, subh/2-ext_up, + 0,4*res-ext_up, + 1*res,4*res-ext_up, + 1*res,2*res-ext_up, + 2*res,2*res-ext_up, + 2*res,1*res-ext_up, + 4*res,1*res-ext_up, + 4*res,0*res-ext_up, + subw,0*res-ext_up, + subw,1*res-ext_up, + subw+2*res,1*res-ext_up, + subw+2*res,2*res-ext_up, + subw+3*res,2*res-ext_up, + subw+3*res,4*res-ext_up, + totw,4*res-ext_up, + totw,subh-ext_up, + subw+3*res, subh-ext_up, + subw+3*res, subh+2*res-ext_up, + subw+2*res, subh+2*res-ext_up, + subw+2*res, subh+3*res-ext_up, + subw, subh+3*res-ext_up, + subw, toth-ext_up, + 4*res, toth-ext_up, + 4*res, subh+3*res-ext_up, + 2*res, subh+3*res-ext_up, + 2*res, subh+2*res-ext_up, + 1*res, subh+2*res-ext_up, + 1*res, subh-ext_up, + 0, subh-ext_up, + 0,4*res-ext_up, + } + for k, v in ipairs(vertices) do + if k%2 == 1 and v > totw*self.pixellated_rect.progress then v = totw*self.pixellated_rect.progress end + self.pixellated_rect.fill.vertices[k] = v + if k > 4 then + self.pixellated_rect.line.vertices[k-4] = v + if _emboss then + self.pixellated_rect.line_emboss.vertices[k-4] = v + (k%2 == 0 and -_emboss*self.shadow_parrallax.y or -0.7*_emboss*self.shadow_parrallax.x) + end + end + if k%2 == 0 then + self.pixellated_rect.shadow.vertices[k] = v -self.shadow_parrallax.y*_parallax + if _emboss then + self.pixellated_rect.emboss.vertices[k] = v + _emboss*G.TILESIZE + end + else + self.pixellated_rect.shadow.vertices[k] = v -self.shadow_parrallax.x*_parallax + if _emboss then + self.pixellated_rect.emboss.vertices[k] = v + end + end + end + end + + love.graphics.polygon((_type == 'line' or _type == 'line_emboss') and 'line' or "fill", self.pixellated_rect[_type].vertices) +end + +function UIElement:update(dt) + G.ARGS.FUNC_TRACKER = G.ARGS.FUNC_TRACKER or {} + if self.config.button_delay then + self.config.button_temp = self.config.button or self.config.button_temp + self.config.button = nil + self.config.button_delay_progress = (G.TIMERS.REAL - self.config.button_delay_start)/self.config.button_delay + if G.TIMERS.REAL >= self.config.button_delay_end then self.config.button_delay = nil end + end + if self.config.button_temp and not self.config.button_delay then self.config.button = self.config.button_temp end + if self.button_clicked then self.button_clicked = nil end + if self.config and self.config.func then + G.ARGS.FUNC_TRACKER[self.config.func] = (G.ARGS.FUNC_TRACKER[self.config.func] or 0) + 1 + G.FUNCS[self.config.func](self) + end + if self.UIT == G.UIT.T then self:update_text() end + if self.UIT == G.UIT.O then self:update_object() end + Node.update(self, dt) +end + +function UIElement:collides_with_point(cursor_trans) + if self.UIBox.states.collide.can then + return Node.collides_with_point(self, cursor_trans) + else + return false + end +end + +function UIElement:click() + if self.config.button and (not self.last_clicked or self.last_clicked + 0.1 < G.TIMERS.REAL) and self.states.visible and not self.under_overlay and not self.disable_button then + if self.config.one_press then self.disable_button = true end + self.last_clicked = G.TIMERS.REAL + + --Removes a layer from the overlay menu stack + if self.config.id == 'overlay_menu_back_button' then + G.CONTROLLER:mod_cursor_context_layer(-1) + G.NO_MOD_CURSOR_STACK = true + end + if G.OVERLAY_TUTORIAL and G.OVERLAY_TUTORIAL.button_listen == self.config.button then + G.FUNCS.tut_next() + end + G.FUNCS[self.config.button](self) + + G.NO_MOD_CURSOR_STACK = nil + + if self.config.choice then + local choices = self.UIBox:get_group(nil, self.config.group) + for k, v in pairs(choices) do + if v.config and v.config.choice then v.config.chosen = false end + end + self.config.chosen = true + end + play_sound('button', 1, 0.3) + G.ROOM.jiggle = G.ROOM.jiggle + 0.5 + self.button_clicked = true + end + if self.config.button_UIE then + self.config.button_UIE:click() + end +end + +function UIElement:put_focused_cursor() + if self.config.focus_args and self.config.focus_args.type == 'tab' then + for k, v in pairs(self.children) do + if v.children[1].config.chosen then return v.children[1]:put_focused_cursor() end + end + else + return Node.put_focused_cursor(self) + end +end + +function UIElement:remove() + if self.config and self.config.object then + self.config.object:remove() + self.config.object = nil + end + + if self == G.CONTROLLER.text_input_hook then + G.CONTROLLER.text_input_hook = nil + end + remove_all(self.children) + + Moveable.remove(self) +end + +function UIElement:hover() + if self.config and self.config.on_demand_tooltip then + self.config.h_popup = create_popup_UIBox_tooltip(self.config.on_demand_tooltip) + self.config.h_popup_config ={align=self.T.y > G.ROOM.T.h/2 and 'tm' or 'bm', offset = {x=0,y=self.T.y > G.ROOM.T.h/2 and -0.1 or 0.1}, parent = self} + end + if self.config.tooltip then + self.config.h_popup = create_popup_UIBox_tooltip(self.config.tooltip) + self.config.h_popup_config ={align="tm", offset = {x=0,y=-0.1}, parent = self} + end + if self.config.detailed_tooltip and G.CONTROLLER.HID.pointer then + self.config.h_popup = create_UIBox_detailed_tooltip(self.config.detailed_tooltip) + self.config.h_popup_config ={align="tm", offset = {x=0,y=-0.1}, parent = self} + end + Node.hover(self) +end + +function UIElement:stop_hover() + Node.stop_hover(self) + if self.config and self.config.on_demand_tooltip then + self.config.h_popup = nil + end +end + +function UIElement:release(other) + if self.parent then self.parent:release(other) end +end + +function is_UI_containter(node) + if node.UIT ~= G.UIT.C and node.UIT ~= G.UIT.R and node.UIT ~= G.UIT.ROOT then + return false + end + return true +end diff --git a/functions/UI_definitions.lua b/functions/UI_definitions.lua new file mode 100644 index 0000000..29986a2 --- /dev/null +++ b/functions/UI_definitions.lua @@ -0,0 +1,5842 @@ +--Create a global UIDEF that contains all UI definition functions\ +--As a rule, these contain functions that return a table T representing the definition for a UIBox +G.UIDEF = {} + +function create_UIBox_debug_tools() + G.debug_tool_config = G.debug_tool_config or {} + G.FUNCS.DT_add_money = function() if G.STAGE == G.STAGES.RUN then ease_dollars(10) end end + G.FUNCS.DT_add_round = function() if G.STAGE == G.STAGES.RUN then ease_round(1) end end + G.FUNCS.DT_add_ante = function() if G.STAGE == G.STAGES.RUN then ease_ante(1) end end + G.FUNCS.DT_add_hand = function() if G.STAGE == G.STAGES.RUN then ease_hands_played(1) end end + G.FUNCS.DT_add_discard = function() if G.STAGE == G.STAGES.RUN then ease_discard(1) end end + G.FUNCS.DT_reroll_boss = function() if G.STAGE == G.STAGES.RUN and G.blind_select_opts then G.from_boss_tag = true; G.FUNCS.reroll_boss(); G.from_boss_tag = nil end end + G.FUNCS.DT_toggle_background = function() G.debug_background_toggle = not G.debug_background_toggle end + G.FUNCS.DT_add_chips = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {chips = 10 + G.GAME.current_round.current_hand.chips}); play_sound('chips1') end end + G.FUNCS.DT_add_mult = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {mult = 10 + G.GAME.current_round.current_hand.mult}); play_sound('multhit1') end end + G.FUNCS.DT_x_chips = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {chips = 2*G.GAME.current_round.current_hand.chips}); play_sound('chips1') end end + G.FUNCS.DT_x_mult = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {mult = 10*G.GAME.current_round.current_hand.mult}); play_sound('multhit2') end end + G.FUNCS.DT_chip_mult_reset = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {mult = 0, chips = 0}) end end + G.FUNCS.DT_win_game = function() if G.STAGE == G.STAGES.RUN then win_game() end end + G.FUNCS.DT_lose_game = function() if G.STAGE == G.STAGES.RUN then G.STATE = G.STATES.GAME_OVER; G.STATE_COMPLETE = false end end + G.FUNCS.DT_jimbo_toggle = function() + if G.DT_jimbo then + if G.DT_jimbo.children.particles.states.visible then + if G.DT_jimbo.children.card.states.visible then + G.DT_jimbo.children.card.states.visible = false + else + G.DT_jimbo.children.card.states.visible = true + G.DT_jimbo.children.particles.states.visible = false + end + else + G.DT_jimbo:remove() + G.DT_jimbo = nil + if G.SPLASH_LOGO then + G.SPLASH_LOGO.states.visible = true + if G.title_top and G.title_top.cards[1] then G.title_top.cards[1].states.visible = true end + end + end + else + if G.SPLASH_LOGO then + G.SPLASH_LOGO.states.visible = false + if G.title_top and G.title_top.cards[1] then G.title_top.cards[1].states.visible = false end + end + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.4, + blockable = false, + func = function() + G.DT_jimbo = Card_Character({x = G.ROOM.T.w/2,y = G.ROOM.T.h/2}) + + G.DT_jimbo:set_alignment{ + major = G.ROOM_ATTACH, + type = 'cm' + } + return true + end + })) + + end end + G.FUNCS.DT_jimbo_talk = function() + if G.DT_jimbo then + G.DT_jimbo:add_speech_bubble({ + " ", + " ", + " ", + }, 'cr') + G.DT_jimbo:say_stuff(4) end + end + + local t = {n=G.UIT.ROOT, config = {align = 'cm', r = 0.1}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "While in collection, hover over a card", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "and press the following keys:", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLUE, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = "[1] Unlock", scale = 0.25, colour = G.C.WHITE}} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLUE, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = "[2] Discover", scale = 0.25, colour = G.C.WHITE}} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLUE, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = "[3] Spawn", scale = 0.25, colour = G.C.WHITE}} + }} + }} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "Hover over any Joker/Playing card", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "and press [Q] to cycle Edition", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "Press [H] to isolate background", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "Press [J] to play splash animation", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "Press [8] to toggle cursor", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = "Press [9] to toggle all tooltips", scale = 0.25, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.15}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ + UIBox_button{ label = {"$10"}, button = "DT_add_money", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"+1 Round"}, button = "DT_add_round", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"+1 Ante"}, button = "DT_add_ante", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"+1 Hand"}, button = "DT_add_hand", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"+1 Discard"}, button = "DT_add_discard", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Boss Reroll"}, button = "DT_reroll_boss", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Background"}, button = "DT_toggle_background", minw = 1.7, minh = 0.4, scale = 0.35}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ + UIBox_button{ label = {"+10 chips"}, button = "DT_add_chips", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"+10 mult"}, button = "DT_add_mult", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"X2 chips"}, button = "DT_x_chips", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"X10 mult"}, button = "DT_x_mult", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Win this Run"}, button = "DT_win_game", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Lose this Run"}, button = "DT_lose_game", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Reset"}, button = "DT_chip_mult_reset", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Jimbo"}, button = "DT_jimbo_toggle", minw = 1.7, minh = 0.4, scale = 0.35}, + UIBox_button{ label = {"Jimbo talk"}, button = "DT_jimbo_talk", minw = 1.7, minh = 0.4, scale = 0.35}, + }} + }} + }, true) + }} + return t +end + +function create_UIBox_notify_alert(_achievement, _type) + local _c, _atlas = G.P_CENTERS[_achievement], + _type == 'Joker' and G.ASSET_ATLAS["Joker"] or + _type == 'Voucher' and G.ASSET_ATLAS["Voucher"] or + _type == 'Back' and G.ASSET_ATLAS["centers"] or + G.ASSET_ATLAS["icons"] + + local t_s = Sprite(0,0,1.5*(_atlas.px/_atlas.py),1.5,_atlas, _c and _c.pos or {x=3, y=0}) + t_s.states.drag.can = false + t_s.states.hover.can = false + t_s.states.collide.can = false + + local subtext = _type == 'achievement' and localize(G.F_TROPHIES and 'k_trophy' or 'k_achievement') or + _type == 'Joker' and localize('k_joker') or + _type == 'Voucher' and localize('k_voucher') or + _type == 'Back' and localize('k_deck') or 'ERROR' + + if _achievement == 'b_challenge' then subtext = localize('k_challenges') end + local name = _type == 'achievement' and localize(_achievement, 'achievement_names') or 'ERROR' + + local t = {n=G.UIT.ROOT, config = {align = 'cl', r = 0.1, padding = 0.06, colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + {n=G.UIT.R, config={align = "cl", padding = 0.2, minw = 20, r = 0.1, colour = G.C.BLACK, outline = 1.5, outline_colour = G.C.GREY}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1}, nodes={ + {n=G.UIT.O, config={object = t_s}}, + }}, + _type ~= 'achievement' and {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={ + {n=G.UIT.T, config={text = subtext, scale = 0.5, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={ + {n=G.UIT.T, config={text = localize('k_unlocked_ex'), scale = 0.35, colour = G.C.FILTER, shadow = true}}, + }} + }} + or {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 3.4, padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = name, scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={ + {n=G.UIT.T, config={text = subtext, scale = 0.3, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={ + {n=G.UIT.T, config={text = localize('k_unlocked_ex'), scale = 0.35, colour = G.C.FILTER, shadow = true}}, + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_online_high_scores() + G.HTTP_MANAGER.out_channel:push({get_score = true}) + local padding, col, minw = 0.05, G.C.UI.TRANSPARENT_DARK, 0 + local t = {n=G.UIT.ROOT, config = {align = 'cm', minw=minw, r = 0.1, colour = col, padding = padding}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.BLACK}, nodes={ + }} + }} + return t +end + +function create_UIBox_high_scores_filling(_resp) + local scores = {} + _resp = assert(loadstring(_resp))() + if not _resp then + return {n=G.UIT.ROOT, config = {align = 'cm', r = 0.1, colour = G.C.L_BLACK, padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, minh = 1.3}, nodes={ + {n=G.UIT.T, config={text = 'ERROR', scale = 0.9, colour = G.C.RED, shadow = true}}, + }} + }} + end + for i = 1, 6 do + local v = _resp[i] or {username = '-'} + v.score = v.score and math.floor(v.score) or nil + local name_col = v.username == (G.SETTINGS.COMP and G.SETTINGS.COMP.name or nil) and G.C.FILTER or G.C.WHITE + scores[#scores+1] = {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cl", padding = 0, minw = 0.3}, nodes={ + {n=G.UIT.T, config={text = i..'.', scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cl", padding = 0, minw = 1.7, maxw = 1.6}, nodes={ + {n=G.UIT.T, config={text = (v.username), scale = math.min(0.6, 8*0.56/v.username:len()), colour = v.score and name_col or G.C.UI.TRANSPARENT_LIGHT, shadow = true}} + }}, + {n=G.UIT.C, config={align = "cl", minh = 0.8, r = 0.1, minw = 2.5, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 2.6}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {type(v.score) == 'number' and number_format(v.score) or ''}, colours = {G.C.RED},shadow = true, float = true,maxw = 2.5, scale = math.min(0.75, score_number_scale(1.5, v.score))})}}, + }}, + }}, + }}, + }} + end + return {n=G.UIT.ROOT, config = {align = 'cm', r = 0.1, colour = G.C.L_BLACK, padding = 0.05}, nodes=scores} +end + +function G.UIDEF.use_and_sell_buttons(card) + local sell = nil + local use = nil + if card.area and card.area.config.type == 'joker' then + sell = {n=G.UIT.C, config={align = "cr"}, nodes={ + {n=G.UIT.C, config={ref_table = card, align = "cr",padding = 0.1, r=0.08, minw = 1.25, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'sell_card', func = 'can_sell_card'}, nodes={ + {n=G.UIT.B, config = {w=0.1,h=0.6}}, + {n=G.UIT.C, config={align = "tm"}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 1.25}, nodes={ + {n=G.UIT.T, config={text = localize('b_sell'),colour = G.C.UI.TEXT_LIGHT, scale = 0.4, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('$'),colour = G.C.WHITE, scale = 0.4, shadow = true}}, + {n=G.UIT.T, config={ref_table = card, ref_value = 'sell_cost_label',colour = G.C.WHITE, scale = 0.55, shadow = true}} + }} + }} + }}, + }} + end + if card.ability.consumeable then + if (card.area == G.pack_cards and G.pack_cards) then + return { + n=G.UIT.ROOT, config = {padding = 0, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={mid = true}, nodes={ + }}, + {n=G.UIT.R, config={ref_table = card, r = 0.08, padding = 0.1, align = "bm", minw = 0.5*card.T.w - 0.15, minh = 0.8*card.T.h, maxw = 0.7*card.T.w - 0.15, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'use_card', func = 'can_use_consumeable'}, nodes={ + {n=G.UIT.T, config={text = localize('b_use'),colour = G.C.UI.TEXT_LIGHT, scale = 0.55, shadow = true}} + }}, + }} + end + use = + {n=G.UIT.C, config={align = "cr"}, nodes={ + + {n=G.UIT.C, config={ref_table = card, align = "cr",maxw = 1.25, padding = 0.1, r=0.08, minw = 1.25, minh = (card.area and card.area.config.type == 'joker') and 0 or 1, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'use_card', func = 'can_use_consumeable'}, nodes={ + {n=G.UIT.B, config = {w=0.1,h=0.6}}, + {n=G.UIT.T, config={text = localize('b_use'),colour = G.C.UI.TEXT_LIGHT, scale = 0.55, shadow = true}} + }} + }} + elseif card.area and card.area == G.pack_cards then + return { + n=G.UIT.ROOT, config = {padding = 0, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={ref_table = card, r = 0.08, padding = 0.1, align = "bm", minw = 0.5*card.T.w - 0.15, maxw = 0.9*card.T.w - 0.15, minh = 0.3*card.T.h, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'use_card', func = 'can_select_card'}, nodes={ + {n=G.UIT.T, config={text = localize('b_select'),colour = G.C.UI.TEXT_LIGHT, scale = 0.45, shadow = true}} + }}, + }} + end + local t = { + n=G.UIT.ROOT, config = {padding = 0, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={padding = 0.15, align = 'cl'}, nodes={ + {n=G.UIT.R, config={align = 'cl'}, nodes={ + sell + }}, + {n=G.UIT.R, config={align = 'cl'}, nodes={ + use + }}, + }}, + }} + return t +end + +function G.UIDEF.card_focus_ui(card) + local card_width = card.T.w + (card.ability.consumeable and -0.1 or card.ability.set == 'Voucher' and -0.16 or 0) + + local playing_card_colour = copy_table(G.C.WHITE) + playing_card_colour[4] = 1.5 + if G.hand and card.area == G.hand then ease_value(playing_card_colour, 4, -1.5, nil, 'REAL',nil, 0.2, 'quad') end + + local t_card_norm = {x = card.T.x + card.T.w/2 - G.ROOM.T.w/2, y = 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*t_card_norm.x*card.T.w, y = 0.007*t_card_norm.y*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 card_norm = {x = card.T.x + card.T.w/2 - G.ROOM.T.w/2, y = card.T.y + card.T.h/2 - G.ROOM.T.h/2} + Moveable.set_alignment(card.children.focused_ui, {offset = {x= 0.007*card_norm.x*card.T.w, y = 0.007*card_norm.y*card.T.h}}) + end + + local base_attach = base_background:get_UIE_by_ID('ATTACH_TO_ME') + + --The card UI can have BUY, REDEEM, USE, and SELL buttons depending on the context of the card + if card.area == G.shop_jokers and G.shop_jokers then --Add a buy button + local buy_and_use = nil + if card.ability.consumeable then + base_attach.children.buy_and_use = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'buy_and_use', + func = 'can_buy_and_use', button = 'buy_from_shop', card_width = card_width + } + buy_and_use = true + end + base_attach.children.buy = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'buy', + func = 'can_buy', button = 'buy_from_shop', card_width = card_width, buy_and_use = buy_and_use + } + end + if card.area == G.shop_vouchers and G.shop_vouchers then --Add a redeem button + base_attach.children.redeem = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'buy', + func = 'can_redeem', button = 'redeem_from_shop', card_width = card_width + } + end + if card.area == G.shop_booster and G.shop_booster then --Add a redeem button + base_attach.children.redeem = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'buy', + func = 'can_open', button = 'open_booster', card_width = card_width*0.85 + } + end + if ((card.area == G.consumeables and G.consumeables) or (card.area == G.pack_cards and G.pack_cards)) and + card.ability.consumeable then --Add a use button + base_attach.children.use = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'use', + func = 'can_use_consumeable', button = 'use_card', card_width = card_width + } + end + if (card.area == G.pack_cards and G.pack_cards) and not card.ability.consumeable then --Add a use button + base_attach.children.use = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'select', + func = 'can_select_card', button = 'use_card', card_width = card_width + } + end + if (card.area == G.jokers and G.jokers or card.area == G.consumeables and G.consumeables) and G.STATE ~= G.STATES.TUTORIAL then --Add a sell button + base_attach.children.sell = G.UIDEF.card_focus_button{ + card = card, parent = base_attach, type = 'sell', + func = 'can_sell_card', button = 'sell_card', card_width = card_width + } + end + + return base_background +end + +function G.UIDEF.card_focus_button(args) + if not args then return end + + local button_contents = {} + if args.type == 'sell' then + button_contents = + {n=G.UIT.C, config={align = "cl"}, nodes={ + {n=G.UIT.R, config={align = "cl", maxw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('b_sell'),colour = G.C.UI.TEXT_LIGHT, scale = 0.4, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cl"}, nodes={ + {n=G.UIT.T, config={text = localize('$'),colour = G.C.WHITE, scale = 0.4, shadow = true}}, + {n=G.UIT.T, config={ref_table = args.card, ref_value = 'sell_cost_label',colour = G.C.WHITE, scale = 0.55, shadow = true}} + }} + }} + elseif args.type == 'buy' then + button_contents = {n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.WHITE, scale = 0.5}} + elseif args.type == 'select' then + button_contents = {n=G.UIT.T, config={text = localize('b_select'),colour = G.C.WHITE, scale = 0.3}} + elseif args.type == 'redeem' then + button_contents = {n=G.UIT.T, config={text = localize('b_redeem'),colour = G.C.WHITE, scale = 0.5}} + elseif args.type == 'use' then + button_contents = {n=G.UIT.T, config={text = localize('b_use'),colour = G.C.WHITE, scale = 0.5}} + elseif args.type == 'buy_and_use' then + button_contents = + {n=G.UIT.C, config={align = "cr"}, nodes={ + {n=G.UIT.R, config={align = "cr", maxw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.UI.TEXT_LIGHT, scale = 0.4, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cr", maxw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('b_and_use'),colour = G.C.WHITE, scale = 0.3, shadow = true}}, + }} + }} + end + + return UIBox{ + T = {args.card.VT.x,args.card.VT.y,0,0}, + definition = + {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={id = args.type == 'buy_and_use' and 'buy_and_use' or nil, ref_table = args.card, ref_parent = args.parent, align = args.type == 'sell' and 'cl' or 'cr', colour = G.C.BLACK, shadow = true, r = 0.08, func = args.func, one_press = true, button = args.button, focus_args = {type = 'none'}, hover = true}, nodes={ + {n=G.UIT.R, config={align = args.type == 'sell' and 'cl' or 'cr', minw = 1 + (args.type == 'select' and 0.1 or 0), minh = args.type == 'sell' and 1.5 or 1, padding = 0.08, + focus_args = {button = args.type == 'sell' and 'leftshoulder' or args.type == 'buy_and_use' and 'leftshoulder' or 'rightshoulder', scale = 0.55, orientation = args.type == 'sell' and 'tli' or 'tri', offset = {x = args.type == 'sell' and 0.1 or -0.1, y = 0}, type = 'none'}, + func = 'set_button_pip'}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.3}, nodes={}}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + args.type ~= 'sell' and {n=G.UIT.C, config={align = "cm",minw = 0.2, minh = 0.6}, nodes={}} or nil, + {n=G.UIT.C, config={align = "cm", maxw = 1}, nodes={ + button_contents + }}, + args.type == 'sell' and {n=G.UIT.C, config={align = "cm",minw = 0.2, minh = 0.6}, nodes={}} or nil, + }} + }} + }} + }}, + config = { + align = args.type == 'sell' and 'cl' or 'cr', + offset = {x=(args.type == 'sell' and -1 or 1)*((args.card_width or 0) - 0.17 - args.card.T.w/2),y=args.type == 'buy_and_use' and 0.6 or (args.buy_and_use) and -0.6 or 0}, + parent = args.parent, + } + } +end + +function G.UIDEF.speech_bubble(text_key, loc_vars) + local text = {} + if loc_vars and loc_vars.quip then + localize{type = 'quips', key = text_key or 'lq_1', vars = loc_vars or {}, nodes = text} + else + localize{type = 'tutorial', key = text_key or 'sb_1', vars = loc_vars or {}, nodes = text} + end + local row = {} + for k, v in ipairs(text) do + row[#row+1] = {n=G.UIT.R, config={align = "cl"}, nodes=v} + end + local t = {n=G.UIT.ROOT, config = {align = "cm", minh = 1,r = 0.3, padding = 0.07, minw = 1, colour = G.C.JOKER_GREY, shadow = true}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.1, minw = 1, colour = G.C.WHITE}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.03, minw = 1, colour = G.C.WHITE}, nodes=row}} + } + }} + return t +end + +function create_UIBox_highlight(rect) + local t = {n=G.UIT.ROOT, config = {align = "cm", minh = rect.T.h+0.1, minw = rect.T.w+0.15, r = 0.15, colour = G.C.DARK_EDITION}, nodes={ + }} +return t +end + +function G.UIDEF.deck_preview(args) + + local _minh, _minw = 0.35, 0.5 + local suit_labels = {} + local suit_counts = { + Spades = 0, + Hearts = 0, + Clubs = 0, + Diamonds = 0 + } + local mod_suit_counts = { + Spades = 0, + Hearts = 0, + Clubs = 0, + Diamonds = 0 + } + local mod_suit_diff = false + local wheel_flipped, wheel_flipped_text = 0, nil + local flip_col = G.C.WHITE + local rank_counts = {} + local deck_tables = {} + remove_nils(G.playing_cards) + table.sort(G.playing_cards, function (a, b) return a:get_nominal('suit') > b:get_nominal('suit') end ) + local SUITS = { + Spades = {}, + Hearts = {}, + Clubs = {}, + Diamonds = {}, + } + + for k, v in pairs(SUITS) do + for i = 1, 14 do + SUITS[k][#SUITS[k]+1] = {} + end + end + + local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'} + local stones = nil + local rank_name_mapping = {'A','K','Q','J','10',9,8,7,6,5,4,3,2} + + for k, v in ipairs(G.playing_cards) do + if v.ability.effect == 'Stone Card' then + stones = stones or 0 + end + if (v.area and v.area == G.deck) or v.ability.wheel_flipped then + if v.ability.wheel_flipped then wheel_flipped = wheel_flipped + 1 end + if v.ability.effect == 'Stone Card' then + stones = stones + 1 + else + for kk, vv in pairs(suit_counts) do + if v.base.suit == kk then suit_counts[kk] = suit_counts[kk] + 1 end + if v:is_suit(kk) then mod_suit_counts[kk] = mod_suit_counts[kk] + 1 end + end + if SUITS[v.base.suit][v.base.id] then + table.insert(SUITS[v.base.suit][v.base.id], v) + end + rank_counts[v.base.id] = (rank_counts[v.base.id] or 0) + 1 + end + end + end + + wheel_flipped_text = (wheel_flipped > 0) and {n=G.UIT.T, config={text = '?',colour = G.C.FILTER, scale =0.25, shadow = true}} or nil + flip_col = wheel_flipped_text and mix_colours(G.C.FILTER, G.C.WHITE,0.7) or G.C.WHITE + + suit_labels[#suit_labels+1] = {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.04, minw = _minw, minh = 2*_minh+0.25}, nodes={ + stones and {n=G.UIT.T, config={text = localize('ph_deck_preview_stones')..': ',colour = G.C.WHITE, scale =0.25, shadow = true}} + or nil, + stones and {n=G.UIT.T, config={text = ''..stones,colour = (stones > 0 and G.C.WHITE or G.C.UI.TRANSPARENT_LIGHT), scale =0.4, shadow = true}} + or nil, + }} + + local _row = {} + local _bg_col = G.C.JOKER_GREY + for k, v in ipairs(rank_name_mapping) do + local _tscale = 0.3 + local _colour = G.C.BLACK + local rank_col = v == 'A' and _bg_col or (v == 'K' or v == 'Q' or v == 'J') and G.C.WHITE or _bg_col + rank_col = mix_colours(rank_col, _bg_col, 0.8) + + local _col = {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, minw = _minw, minh = _minh, colour = rank_col, emboss = 0.04, padding = 0.03}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = ''..v,colour = _colour, scale =1.6*_tscale}}, + }}, + {n=G.UIT.R, config={align = "cm", minw = _minw+0.04, minh = _minh, colour = G.C.L_BLACK, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = ''..(rank_counts[15 - k] or 0),colour = flip_col, scale =_tscale, shadow = true}} + }} + }} + }} + table.insert(_row, _col) + end + table.insert(deck_tables, {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes=_row}) + + for j = 1, 4 do + _row = {} + _bg_col = mix_colours(G.C.SUITS[suit_map[j]], G.C.L_BLACK, 0.7) + for i = 14, 2, -1 do + local _tscale = #SUITS[suit_map[j]][i] > 0 and 0.3 or 0.25 + local _colour = #SUITS[suit_map[j]][i] > 0 and flip_col or G.C.UI.TRANSPARENT_LIGHT + + local _col = {n=G.UIT.C, config={align = "cm",padding = 0.05, minw = _minw+0.098, minh = _minh}, nodes={ + {n=G.UIT.T, config={text = ''..#SUITS[suit_map[j]][i],colour = _colour, scale =_tscale, shadow = true, lang = G.LANGUAGES['en-us']}}, + }} + table.insert(_row, _col) + end + table.insert(deck_tables, {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.04, minh = 0.4, colour = _bg_col}, nodes=_row}) + end + + for k, v in ipairs(suit_map) do + local _x = (v == 'Spades' and 3) or (v == 'Hearts' and 0) or (v == 'Clubs' and 2) or (v == 'Diamonds' and 1) + local t_s = Sprite(0,0,0.3,0.3,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=_x, y=1}) + t_s.states.drag.can = false + t_s.states.hover.can = false + t_s.states.collide.can = false + + if mod_suit_counts[v] ~= suit_counts[v] then mod_suit_diff = true end + + suit_labels[#suit_labels+1] = + {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.03, colour = G.C.JOKER_GREY}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = _minw, minh = _minh}, nodes={ + {n=G.UIT.O, config={can_collide = false, object = t_s}} + }}, + {n=G.UIT.C, config={align = "cm", minw = _minw*2.4, minh = _minh, colour = G.C.L_BLACK, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = ''..suit_counts[v],colour = flip_col, scale =0.3, shadow = true, lang = G.LANGUAGES['en-us']}}, + mod_suit_counts[v] ~= suit_counts[v] and {n=G.UIT.T, config={text = ' ('..mod_suit_counts[v]..')',colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7), scale =0.28, shadow = true, lang = G.LANGUAGES['en-us']}} or nil, + }} + }} + end + + + local t = + {n=G.UIT.ROOT, config={align = "cm", colour = G.C.JOKER_GREY, r = 0.1, emboss = 0.05, padding = 0.07}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, emboss = 0.05, colour = G.C.BLACK, padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.04}, nodes=suit_labels}, + {n=G.UIT.C, config={align = "cm", padding = 0.02}, nodes=deck_tables} + }}, + mod_suit_diff and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7)}, nodes = {}}, + {n=G.UIT.T, config={text =' '..localize('ph_deck_preview_effective'),colour = G.C.WHITE, scale =0.3}}, + }} or nil, + wheel_flipped_text and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = flip_col}, nodes = {}}, + {n=G.UIT.T, config={text =' '..(wheel_flipped > 1 and + localize{type = 'variable', key = 'deck_preview_wheel_plural', vars = {wheel_flipped}} or + localize{type = 'variable', key = 'deck_preview_wheel_singular', vars = {wheel_flipped}}),colour = G.C.WHITE, scale =0.3}}, + }} or nil, + }} + }} + return t +end + +function create_UIBox_character_button(args) + local button = args.button or "NONE" + local func = args.func or nil + local colour = args.colour or G.C.RED + local update_func = args.update_func or nil + + local t = {n=G.UIT.ROOT, config = {align = "cm", padding = 0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "tm", minw = 1.9, padding = 0.2, minh = 1.2, r = 0.1, hover = true, colour = colour, button = func, func = update_func, shadow = true, maxw = args.maxw}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = button, scale = 0.55, colour = G.C.UI.TEXT_LIGHT, focus_args = {button = 'x', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }}, + }} + return t +end + +function G.UIDEF.shop() + G.shop_jokers = CardArea( + G.hand.T.x+0, + G.hand.T.y+G.ROOM.T.y + 9, + G.GAME.shop.joker_max*1.02*G.CARD_W, + 1.05*G.CARD_H, + {card_limit = G.GAME.shop.joker_max, type = 'shop', highlight_limit = 1}) + + + G.shop_vouchers = CardArea( + G.hand.T.x+0, + G.hand.T.y+G.ROOM.T.y + 9, + 2.1*G.CARD_W, + 1.05*G.CARD_H, + {card_limit = 1, type = 'shop', highlight_limit = 1}) + + G.shop_booster = CardArea( + G.hand.T.x+0, + G.hand.T.y+G.ROOM.T.y + 9, + 2.4*G.CARD_W, + 1.15*G.CARD_H, + {card_limit = 2, type = 'shop', highlight_limit = 1, card_w = 1.27*G.CARD_W}) + + local shop_sign = AnimatedSprite(0,0, 4.4, 2.2, G.ANIMATION_ATLAS['shop_sign']) + shop_sign:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + G.SHOP_SIGN = UIBox{ + definition = + {n=G.UIT.ROOT, config = {colour = G.C.DYN_UI.MAIN, emboss = 0.05, align = 'cm', r = 0.1, padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, minw = 4.72, minh = 3.1, colour = G.C.DYN_UI.DARK, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = shop_sign}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_improve_run')}, colours = {lighten(G.C.GOLD, 0.3)},shadow = true, rotate = true, float = true, bump = true, scale = 0.5, spacing = 1, pop_in = 1.5, maxw = 4.3})}} + }}, + }}, + }}, + config = { + align="cm", + offset = {x=0,y=-15}, + major = G.HUD:get_UIE_by_ID('row_blind'), + bond = 'Weak' + } + } + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.SHOP_SIGN.alignment.offset.y = 0 + return true + end) + })) + local t = {n=G.UIT.ROOT, config = {align = 'cl', colour = G.C.CLEAR}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.1, emboss = 0.05, r = 0.1, colour = G.C.DYN_UI.BOSS_MAIN}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R,config={id = 'next_round_button', align = "cm", minw = 2.8, minh = 1.5, r=0.15,colour = G.C.RED, one_press = true, button = 'toggle_shop', hover = true,shadow = true}, nodes = { + {n=G.UIT.R, config={align = "cm", padding = 0.07, focus_args = {button = 'y', orientation = 'cr'}, func = 'set_button_pip'}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 1.3}, nodes={ + {n=G.UIT.T, config={text = localize('b_next_round_1'), scale = 0.4, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", maxw = 1.3}, nodes={ + {n=G.UIT.T, config={text = localize('b_next_round_2'), scale = 0.4, colour = G.C.WHITE, shadow = true}} + }} + }}, + }}, + {n=G.UIT.R, config={align = "cm", minw = 2.8, minh = 1.6, r=0.15,colour = G.C.GREEN, button = 'reroll_shop', func = 'can_reroll', hover = true,shadow = true}, nodes = { + {n=G.UIT.R, config={align = "cm", padding = 0.07, focus_args = {button = 'x', orientation = 'cr'}, func = 'set_button_pip'}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 1.3}, nodes={ + {n=G.UIT.T, config={text = localize('k_reroll'), scale = 0.4, colour = G.C.WHITE, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", maxw = 1.3, minw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('$'), scale = 0.7, colour = G.C.WHITE, shadow = true}}, + {n=G.UIT.T, config={ref_table = G.GAME.current_round, ref_value = 'reroll_cost', scale = 0.75, colour = G.C.WHITE, shadow = true}}, + }} + }} + }}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.2, r=0.2, colour = G.C.L_BLACK, emboss = 0.05, minw = 8.2}, nodes={ + {n=G.UIT.O, config={object = G.shop_jokers}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.2}, nodes={}}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.15, r=0.2, colour = G.C.L_BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.2, r=0.2, colour = G.C.BLACK, maxh = G.shop_vouchers.T.h+0.4}, nodes={ + {n=G.UIT.T, config={text = localize{type = 'variable', key = 'ante_x_voucher', vars = {G.GAME.round_resets.ante}}, scale = 0.45, colour = G.C.L_BLACK, vert = true}}, + {n=G.UIT.O, config={object = G.shop_vouchers}}, + }}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.15, r=0.2, colour = G.C.L_BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.O, config={object = G.shop_booster}}, + }}, + }} + } + }, + + }, false) + }} + return t +end + + function create_card_for_shop(area) + if area == G.shop_jokers and G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_shop and G.SETTINGS.tutorial_progress.forced_shop[#G.SETTINGS.tutorial_progress.forced_shop] then + local t = G.SETTINGS.tutorial_progress.forced_shop + local _center = G.P_CENTERS[t[#t]] or G.P_CENTERS.c_empress + local card = Card(area.T.x + area.T.w/2, area.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, _center, {bypass_discovery_center = true, bypass_discovery_ui = true}) + t[#t] = nil + if not t[1] then G.SETTINGS.tutorial_progress.forced_shop = nil end + + create_shop_card_ui(card) + return card + else + local forced_tag = nil + for k, v in ipairs(G.GAME.tags) do + if not forced_tag then + forced_tag = v:apply_to_run({type = 'store_joker_create', area = area}) + if forced_tag then + for kk, vv in ipairs(G.GAME.tags) do + if vv:apply_to_run({type = 'store_joker_modify', card = forced_tag}) then break end + end + return forced_tag end + end + end + G.GAME.spectral_rate = G.GAME.spectral_rate or 0 + local total_rate = G.GAME.joker_rate + G.GAME.tarot_rate + G.GAME.planet_rate + G.GAME.playing_card_rate + G.GAME.spectral_rate + local polled_rate = pseudorandom(pseudoseed('cdt'..G.GAME.round_resets.ante))*total_rate + local check_rate = 0 + for _, v in ipairs({ + {type = 'Joker', val = G.GAME.joker_rate}, + {type = 'Tarot', val = G.GAME.tarot_rate}, + {type = 'Planet', val = G.GAME.planet_rate}, + {type = (G.GAME.used_vouchers["v_illusion"] and pseudorandom(pseudoseed('illusion')) > 0.6) and 'Enhanced' or 'Base', val = G.GAME.playing_card_rate}, + {type = 'Spectral', val = G.GAME.spectral_rate}, + }) do + if polled_rate > check_rate and polled_rate <= check_rate + v.val then + local card = create_card(v.type, area, nil, nil, nil, nil, nil, 'sho') + create_shop_card_ui(card, v.type, area) + G.E_MANAGER:add_event(Event({ + func = (function() + for k, v in ipairs(G.GAME.tags) do + if v:apply_to_run({type = 'store_joker_modify', card = card}) then break end + end + return true + end) + })) + if (v.type == 'Base' or v.type == 'Enhanced') and G.GAME.used_vouchers["v_illusion"] and pseudorandom(pseudoseed('illusion')) > 0.8 then + local edition_poll = pseudorandom(pseudoseed('illusion')) + local edition = {} + if edition_poll > 1 - 0.15 then edition.polychrome = true + elseif edition_poll > 0.5 then edition.holo = true + else edition.foil = true + end + card:set_edition(edition) + end + return card + end + check_rate = check_rate + v.val + end + end + end + + function create_shop_card_ui(card, type, area) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.43, + blocking = false, + blockable = false, + func = (function() + if card.opening then return true end + local t1 = { + n=G.UIT.ROOT, config = {minw = 0.6, align = 'tm', colour = darken(G.C.BLACK, 0.2), shadow = true, r = 0.05, padding = 0.05, minh = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = lighten(G.C.BLACK, 0.1), r = 0.1, minw = 1, minh = 0.55, emboss = 0.05, padding = 0.03}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{prefix = localize('$'), ref_table = card, ref_value = 'cost'}}, colours = {G.C.MONEY},shadow = true, silent = true, bump = true, pop_in = 0, scale = 0.5})}}, + }} + }} + local t2 = card.ability.set == 'Voucher' and { + n=G.UIT.ROOT, config = {ref_table = card, minw = 1.1, maxw = 1.3, padding = 0.1, align = 'bm', colour = G.C.GREEN, shadow = true, r = 0.08, minh = 0.94, func = 'can_redeem', one_press = true, button = 'redeem_from_shop', hover = true}, nodes={ + {n=G.UIT.T, config={text = localize('b_redeem'),colour = G.C.WHITE, scale = 0.4}} + }} or card.ability.set == 'Booster' and { + n=G.UIT.ROOT, config = {ref_table = card, minw = 1.1, maxw = 1.3, padding = 0.1, align = 'bm', colour = G.C.GREEN, shadow = true, r = 0.08, minh = 0.94, func = 'can_open', one_press = true, button = 'open_booster', hover = true}, nodes={ + {n=G.UIT.T, config={text = localize('b_open'),colour = G.C.WHITE, scale = 0.5}} + }} or { + n=G.UIT.ROOT, config = {ref_table = card, minw = 1.1, maxw = 1.3, padding = 0.1, align = 'bm', colour = G.C.GOLD, shadow = true, r = 0.08, minh = 0.94, func = 'can_buy', one_press = true, button = 'buy_from_shop', hover = true}, nodes={ + {n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.WHITE, scale = 0.5}} + }} + local t3 = { + n=G.UIT.ROOT, config = {id = 'buy_and_use', ref_table = card, minh = 1.1, padding = 0.1, align = 'cr', colour = G.C.RED, shadow = true, r = 0.08, minw = 1.1, func = 'can_buy_and_use', one_press = true, button = 'buy_from_shop', hover = true, focus_args = {type = 'none'}}, nodes={ + {n=G.UIT.B, config = {w=0.1,h=0.6}}, + {n=G.UIT.C, config = {align = 'cm'}, nodes={ + {n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.WHITE, scale = 0.5}} + }}, + {n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={ + {n=G.UIT.T, config={text = localize('b_and_use'),colour = G.C.WHITE, scale = 0.3}} + }}, + }} + }} + + + card.children.price = UIBox{ + definition = t1, + config = { + align="tm", + offset = {x=0,y=1.5}, + major = card, + bond = 'Weak', + parent = card + } + } + + card.children.buy_button = UIBox{ + definition = t2, + config = { + align="bm", + offset = {x=0,y=-0.3}, + major = card, + bond = 'Weak', + parent = card + } + } + + if card.ability.consumeable then --and card:can_use_consumeable(true, true) + card.children.buy_and_use_button = UIBox{ + definition = t3, + config = { + align="cr", + offset = {x=-0.3,y=0}, + major = card, + bond = 'Weak', + parent = card + } + } + end + + card.children.price.alignment.offset.y = card.ability.set == 'Booster' and 0.5 or 0.38 + + return true + end) + })) + end + + + function attention_text(args) + args = args or {} + args.text = args.text or 'test' + args.scale = args.scale or 1 + args.colour = copy_table(args.colour or G.C.WHITE) + args.hold = (args.hold or 0) + 0.1*(G.SPEEDFACTOR) + args.pos = args.pos or {x = 0, y = 0} + args.align = args.align or 'cm' + args.emboss = args.emboss or nil + + args.fade = 1 + + if args.cover then + args.cover_colour = copy_table(args.cover_colour or G.C.RED) + args.cover_colour_l = copy_table(lighten(args.cover_colour, 0.2)) + args.cover_colour_d = copy_table(darken(args.cover_colour, 0.2)) + else + args.cover_colour = copy_table(G.C.CLEAR) + end + + args.uibox_config = { + align = args.align or 'cm', + offset = args.offset or {x=0,y=0}, + major = args.cover or args.major or nil, + } + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0, + blockable = false, + blocking = false, + func = function() + args.AT = UIBox{ + T = {args.pos.x,args.pos.y,0,0}, + definition = + {n=G.UIT.ROOT, config = {align = args.cover_align or 'cm', minw = (args.cover and args.cover.T.w or 0.001) + (args.cover_padding or 0), minh = (args.cover and args.cover.T.h or 0.001) + (args.cover_padding or 0), padding = 0.03, r = 0.1, emboss = args.emboss, colour = args.cover_colour}, nodes={ + {n=G.UIT.O, config={draw_layer = 1, object = DynaText({scale = args.scale, string = args.text, maxw = args.maxw, colours = {args.colour},float = true, shadow = true, silent = not args.noisy, args.scale, pop_in = 0, pop_in_rate = 6, rotate = args.rotate or nil})}}, + }}, + config = args.uibox_config + } + args.AT.attention_text = true + + args.text = args.AT.UIRoot.children[1].config.object + args.text:pulse(0.5) + + if args.cover then + Particles(args.pos.x,args.pos.y, 0,0, { + timer_type = 'TOTAL', + timer = 0.01, + pulse_max = 15, + max = 0, + scale = 0.3, + vel_variation = 0.2, + padding = 0.1, + fill=true, + lifespan = 0.5, + speed = 2.5, + attach = args.AT.UIRoot, + colours = {args.cover_colour, args.cover_colour_l, args.cover_colour_d}, + }) + end + if args.backdrop_colour then + args.backdrop_colour = copy_table(args.backdrop_colour) + Particles(args.pos.x,args.pos.y,0,0,{ + timer_type = 'TOTAL', + timer = 5, + scale = 2.4*(args.backdrop_scale or 1), + lifespan = 5, + speed = 0, + attach = args.AT, + colours = {args.backdrop_colour} + }) + end + return true + end + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = args.hold, + blockable = false, + blocking = false, + func = function() + if not args.start_time then + args.start_time = G.TIMERS.TOTAL + args.text:pop_out(3) + else + --args.AT:align_to_attach() + args.fade = math.max(0, 1 - 3*(G.TIMERS.TOTAL - args.start_time)) + if args.cover_colour then args.cover_colour[4] = math.min(args.cover_colour[4], 2*args.fade) end + if args.cover_colour_l then args.cover_colour_l[4] = math.min(args.cover_colour_l[4], args.fade) end + if args.cover_colour_d then args.cover_colour_d[4] = math.min(args.cover_colour_d[4], args.fade) end + if args.backdrop_colour then args.backdrop_colour[4] = math.min(args.backdrop_colour[4], args.fade) end + args.colour[4] = math.min(args.colour[4], args.fade) + if args.fade <= 0 then + args.AT:remove() + return true + end + end + end + })) + end + + function create_UIBox_buttons() + local text_scale = 0.45 + local button_height = 1.3 + local play_button = {n=G.UIT.C, config={id = 'play_button', align = "tm", minw = 2.5, padding = 0.3, r = 0.1, hover = true, colour = G.C.BLUE, button = "play_cards_from_highlighted", one_press = true, shadow = true, func = 'can_play'}, nodes={ + {n=G.UIT.R, config={align = "bcm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('b_play_hand'), scale = text_scale, colour = G.C.UI.TEXT_LIGHT, focus_args = {button = 'x', orientation = 'bm'}, func = 'set_button_pip'}} + }}, + }} + + local discard_button = {n=G.UIT.C, config={id = 'discard_button',align = "tm", padding = 0.3, r = 0.1, minw = 2.5, minh = button_height, hover = true, colour = G.C.RED, button = "discard_cards_from_highlighted", one_press = true, shadow = true, func = 'can_discard'}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('b_discard'), scale = text_scale, colour = G.C.UI.TEXT_LIGHT, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + + local t = { + n=G.UIT.ROOT, config = {align = "cm", minw = 1, minh = 0.3,padding = 0.15, r = 0.1, colour = G.C.CLEAR}, nodes={ + G.SETTINGS.play_button_pos == 1 and discard_button or play_button, + + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour =G.C.UI.TRANSPARENT_DARK, outline = 1.5, outline_colour = mix_colours(G.C.WHITE,G.C.JOKER_GREY, 0.7), line_emboss = 1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('b_sort_hand'), scale = text_scale*0.8, colour = G.C.UI.TEXT_LIGHT}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 0.7, minw = 0.9, padding = 0.1, r = 0.1, hover = true, colour =G.C.ORANGE, button = "sort_hand_value", shadow = true}, nodes={ + {n=G.UIT.T, config={text = localize('k_rank'), scale = text_scale*0.7, colour = G.C.UI.TEXT_LIGHT}} + }}, + {n=G.UIT.C, config={align = "cm", minh = 0.7, minw = 0.9, padding = 0.1, r = 0.1, hover = true, colour =G.C.ORANGE, button = "sort_hand_suit", shadow = true}, nodes={ + {n=G.UIT.T, config={text = localize('k_suit'), scale = text_scale*0.7, colour = G.C.UI.TEXT_LIGHT}} + }} + }} + }} + }}, + + G.SETTINGS.play_button_pos == 1 and play_button or discard_button, + } + } + return t + end + + function desc_from_rows(desc_nodes, empty, maxw) + local t = {} + for k, v in ipairs(desc_nodes) do + t[#t+1] = {n=G.UIT.R, config={align = "cm", maxw = maxw}, nodes=v} + end + return {n=G.UIT.R, config={align = "cm", colour = empty and G.C.CLEAR or G.C.UI.BACKGROUND_WHITE, r = 0.1, padding = 0.04, minw = 2, minh = 0.8, emboss = not empty and 0.05 or nil, filler = true}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=t} + }} + end + + function transparent_multiline_text(desc_nodes) + local t = {} + for k, v in ipairs(desc_nodes) do + t[#t+1] = {n=G.UIT.R, config={align = "cm", maxw = maxw}, nodes=v} + end + return {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=t} + end + + function info_tip_from_rows(desc_nodes, name) + local t = {} + for k, v in ipairs(desc_nodes) do + t[#t+1] = {n=G.UIT.R, config={align = "cm"}, nodes=v} + end + return {n=G.UIT.R, config={align = "cm", colour = lighten(G.C.GREY, 0.15), r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "tm", minh = 0.36, padding = 0.03}, nodes={{n=G.UIT.T, config={text = name, scale = 0.32, colour = G.C.UI.TEXT_LIGHT}}}}, + {n=G.UIT.R, config={align = "cm", minw = 1.5, minh = 0.4, r = 0.1, padding = 0.05, colour = G.C.WHITE}, nodes={{n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=t}}} + }} + end + + function overlay_infotip(text_rows) + local t = {} + if type(text_rows) ~= 'table' then text_rows = {"ERROR"} end + for k, v in ipairs(text_rows) do + t[#t+1] = {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = v,colour = G.C.UI.TEXT_LIGHT, scale = 0.45, juice = true, shadow = true, lang = text_rows.lang}} + }} + end + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR, padding = 0.1}, nodes=t} + end + + function name_from_rows(name_nodes, background_colour) + if not name_nodes or (type(name_nodes) ~= 'table') or not next(name_nodes) then return end + return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = background_colour, emboss = background_colour and 0.05 or nil}, nodes=name_nodes} + end + + function G.UIDEF.card_h_popup(card) + if card.ability_UIBox_table then + local AUT = card.ability_UIBox_table + local debuffed = card.debuff + local card_type_colour = get_type_colour(card.config.center or card.config, card) + local card_type_background = + (AUT.card_type == 'Locked' and G.C.BLACK) or + ((AUT.card_type == 'Undiscovered') and darken(G.C.JOKER_GREY, 0.3)) or + (AUT.card_type == 'Enhanced' or AUT.card_type == 'Default') and darken(G.C.BLACK, 0.1) or + (debuffed and darken(G.C.BLACK, 0.1)) or + (card_type_colour and darken(G.C.BLACK, 0.1)) or + G.C.SET[AUT.card_type] or + {0, 1, 1, 1} + + local outer_padding = 0.05 + local card_type = localize('k_'..string.lower(AUT.card_type)) + + if AUT.card_type == 'Joker' or (AUT.badges and AUT.badges.force_rarity) then card_type = ({localize('k_common'), localize('k_uncommon'), localize('k_rare'), localize('k_legendary')})[card.config.center.rarity] end + if AUT.card_type == 'Enhanced' then card_type = localize{type = 'name_text', key = card.config.center.key, set = 'Enhanced'} end + card_type = (debuffed and AUT.card_type ~= 'Enhanced') and localize('k_debuffed') or card_type + + local disp_type, is_playing_card = + (AUT.card_type ~= 'Locked' and AUT.card_type ~= 'Undiscovered' and AUT.card_type ~= 'Default') or debuffed, + AUT.card_type == 'Enhanced' or AUT.card_type == 'Default' + + local info_boxes = {} + local badges = {} + + if AUT.badges.card_type or AUT.badges.force_rarity then + badges[#badges + 1] = create_badge(((card.ability.name == 'Pluto' or card.ability.name == 'Ceres' or card.ability.name == 'Eris') and localize('k_dwarf_planet')) or (card.ability.name == 'Planet X' and localize('k_planet_q') or card_type),card_type_colour, nil, 1.2) + end + if AUT.badges then + for k, v in ipairs(AUT.badges) do + if v == 'negative_consumable' then v = 'negative' end + badges[#badges + 1] = create_badge(localize(v, "labels"), get_badge_colour(v)) + end + end + + if AUT.info then + for k, v in ipairs(AUT.info) do + info_boxes[#info_boxes+1] = + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = lighten(G.C.JOKER_GREY, 0.5), r = 0.1, padding = 0.05, emboss = 0.05}, nodes={ + info_tip_from_rows(v, v.name), + }} + }} + end + end + + return {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "cm", func = 'show_infotip',object = Moveable(),ref_table = next(info_boxes) and info_boxes or nil}, nodes={ + {n=G.UIT.R, config={padding = outer_padding, r = 0.12, colour = lighten(G.C.JOKER_GREY, 0.5), emboss = 0.07}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.07, r = 0.1, colour = adjust_alpha(card_type_background, 0.8)}, nodes={ + name_from_rows(AUT.name, is_playing_card and G.C.WHITE or nil), + desc_from_rows(AUT.main), + badges[1] and {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=badges} or nil, + }} + }} + }}, + }} + end + end + + function get_badge_colour(key) + G.BADGE_COL = G.BADGE_COL or { + eternal = G.C.ETERNAL, + foil = G.C.DARK_EDITION, + holographic = G.C.DARK_EDITION, + polychrome = G.C.DARK_EDITION, + negative = G.C.DARK_EDITION, + gold_seal = G.C.GOLD, + red_seal = G.C.RED, + blue_seal = G.C.BLUE, + purple_seal = G.C.PURPLE, + pinned_left = G.C.ORANGE, + } + return G.BADGE_COL[key] or {1, 0, 0, 1} + end + + function create_badge(_string, _badge_col, _text_col, scaling) + scaling = scaling or 1 + return {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = _badge_col or G.C.GREEN, r = 0.1, minw = 2, minh = 0.4*scaling, emboss = 0.05, padding = 0.03*scaling}, nodes={ + {n=G.UIT.B, config={h=0.1,w=0.03}}, + {n=G.UIT.O, config={object = DynaText({string = _string or 'ERROR', colours = {_text_col or G.C.WHITE},float = true, shadow = true, offset_y = -0.05, silent = true, spacing = 1, scale = 0.33*scaling})}}, + {n=G.UIT.B, config={h=0.1,w=0.03}}, + }} + }} + end + + function create_UIBox_detailed_tooltip(_center) + local full_UI_table = { + main = {}, + info = {}, + type = {}, + name = 'done', + badges = badges or {} + } + local desc = generate_card_ui(_center, full_UI_table, nil, _center.set, nil) + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = lighten(G.C.JOKER_GREY, 0.5), r = 0.1, padding = 0.05, emboss = 0.05}, nodes={ + info_tip_from_rows(desc.info[1], desc.info[1].name), + }} + }} + end + + function create_popup_UIBox_tooltip(tooltip) + local title = tooltip.title or nil + local text = tooltip.text or {} + local rows = {} + if title then + local r = {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = title,colour = G.C.UI.TEXT_DARK, scale = 0.4}}}}}} + table.insert(rows, r) + end + for i = 1, #text do + if type(text[i]) == 'table' then + local r = {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes={ + {n=G.UIT.T, config={ref_table = text[i].ref_table, ref_value = text[i].ref_value,colour = G.C.UI.TEXT_DARK, scale = 0.4}}}} + table.insert(rows, r) + else + local r = {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes={ + {n=G.UIT.T, config={text = text[i],colour = G.C.UI.TEXT_DARK, scale = 0.4}}}} + table.insert(rows, r) + end + end + if tooltip.filler then + table.insert(rows, tooltip.filler.func(tooltip.filler.args)) + end + local t = { + n=G.UIT.ROOT, config = {align = "cm", padding = 0.05, r=0.1, colour = G.C.RED, emboss = 0.05}, nodes= + {{n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.WHITE, emboss = 0.05}, nodes=rows}}} + return t + end + +function create_UIBox_HUD_blind() + local scale = 0.4 + local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5) + G.GAME.blind:change_dim(1.5,1.5) + + return {n=G.UIT.ROOT, config={align = "cm", minw = 4.5, r = 0.1, colour = G.C.BLACK, emboss = 0.05, padding = 0.05, func = 'HUD_blind_visible', id = 'HUD_blind'}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.7, r = 0.1, emboss = 0.05, colour = G.C.DYN_UI.MAIN}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 3}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.blind, ref_value = 'loc_name'}}, colours = {G.C.UI.TEXT_LIGHT},shadow = true, rotate = true, silent = true, float = true, scale = 1.6*scale, y_offset = -4}),id = 'HUD_blind_name'}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 2.74, r = 0.1,colour = G.C.DYN_UI.DARK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.3, maxw = 4.2}, nodes={ + {n=G.UIT.T, config={ref_table = {val = ''}, ref_value = 'val', scale = scale*0.9, colour = G.C.UI.TEXT_LIGHT, func = 'HUD_blind_debuff_prefix'}}, + {n=G.UIT.T, config={ref_table = G.GAME.blind.loc_debuff_lines, ref_value = 1, scale = scale*0.9, colour = G.C.UI.TEXT_LIGHT, id = 'HUD_blind_debuff_1', func = 'HUD_blind_debuff'}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.3, maxw = 4.2}, nodes={ + {n=G.UIT.T, config={ref_table = G.GAME.blind.loc_debuff_lines, ref_value = 2, scale = scale*0.9, colour = G.C.UI.TEXT_LIGHT, id = 'HUD_blind_debuff_2', func = 'HUD_blind_debuff'}} + }}, + }}, + {n=G.UIT.R, config={align = "cm",padding = 0.15}, nodes={ + {n=G.UIT.O, config={object = G.GAME.blind, draw_layer = 1}}, + {n=G.UIT.C, config={align = "cm",r = 0.1, padding = 0.05, emboss = 0.05, minw = 2.9, colour = G.C.BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_score_at_least'), scale = 0.3, colour = G.C.WHITE, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.6}, nodes={ + {n=G.UIT.O, config={w=0.5,h=0.5, colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}}, + {n=G.UIT.B, config={h=0.1,w=0.1}}, + {n=G.UIT.T, config={ref_table = G.GAME.blind, ref_value = 'chip_text', scale = 0.001, colour = G.C.RED, shadow = true, id = 'HUD_blind_count', func = 'blind_chip_UI_scale'}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.45, maxw = 2.8, func = 'HUD_blind_reward'}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_reward'), scale = 0.3, colour = G.C.WHITE}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.current_round, ref_value = 'dollars_to_be_earned'}}, colours = {G.C.MONEY},shadow = true, rotate = true, bump = true, silent = true, scale = 0.45}),id = 'dollars_to_be_earned'}}, + }}, + }}, + }}, + }}, + }} +end + +function add_tag(_tag) + G.HUD_tags = G.HUD_tags or {} + local tag_sprite_ui = _tag:generate_UI() + G.HUD_tags[#G.HUD_tags+1] = UIBox{ + definition = {n=G.UIT.ROOT, config={align = "cm",padding = 0.05, colour = G.C.CLEAR}, nodes={ + tag_sprite_ui + }}, + config = { + align = G.HUD_tags[1] and 'tm' or 'bri', + offset = G.HUD_tags[1] and {x=0,y=0} or {x=0.7,y=0}, + major = G.HUD_tags[1] and G.HUD_tags[#G.HUD_tags] or G.ROOM_ATTACH} + } + discover_card(G.P_TAGS[_tag.key]) + + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'tag_add', tag = _tag}) + end + + G.GAME.tags[#G.GAME.tags+1] = _tag + _tag.HUD_tag = G.HUD_tags[#G.HUD_tags] +end + +function create_UIBox_HUD() + local scale = 0.4 + local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5) + + local contents = {} + + local spacing = 0.13 + local temp_col = G.C.DYN_UI.BOSS_MAIN + local temp_col2 = G.C.DYN_UI.BOSS_DARK + contents.round = { + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={id = 'hud_hands',align = "cm", padding = 0.05, minw = 1.45, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.33, maxw = 1.35}, nodes={ + {n=G.UIT.T, config={text = localize('k_hud_hands'), scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.current_round, ref_value = 'hands_left'}}, font = G.LANGUAGES['en-us'].font, colours = {G.C.BLUE},shadow = true, rotate = true, scale = 2*scale}),id = 'hand_UI_count'}}, + }} + }}, + {n=G.UIT.C, config={minw = spacing},nodes={}}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 1.45, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.33, maxw = 1.35}, nodes={ + {n=G.UIT.T, config={text = localize('k_hud_discards'), scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.current_round, ref_value = 'discards_left'}}, font = G.LANGUAGES['en-us'].font, colours = {G.C.RED},shadow = true, rotate = true, scale = 2*scale}),id = 'discard_UI_count'}}, + }} + }}, + }}, + }}, + {n=G.UIT.R, config={minh = spacing},nodes={}}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 1.45*2 + spacing, minh = 1.15, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, minw = 1.28*2+spacing, minh = 1, colour = temp_col2}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'dollars', prefix = localize('$')}}, maxw = 1.35, colours = {G.C.MONEY}, font = G.LANGUAGES['en-us'].font, shadow = true,spacing = 2, bump = true, scale = 2.2*scale}), id = 'dollar_text_UI'}} + }}, + }}, + }}, + }}, + {n=G.UIT.R, config={minh = spacing},nodes={}}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={id = 'hud_ante',align = "cm", padding = 0.05, minw = 1.45, minh = 1, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.33, maxw = 1.35}, nodes={ + {n=G.UIT.T, config={text = localize('k_ante'), scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.round_resets, ref_value = 'ante'}}, colours = {G.C.IMPORTANT},shadow = true, font = G.LANGUAGES['en-us'].font, scale = 2*scale}),id = 'ante_UI_count'}}, + {n=G.UIT.T, config={text = " ", scale = 0.3*scale}}, + {n=G.UIT.T, config={text = "/ ", scale = 0.7*scale, colour = G.C.WHITE, shadow = true}}, + {n=G.UIT.T, config={ref_table = G.GAME, ref_value='win_ante', scale = scale, colour = G.C.WHITE, shadow = true}} + }}, + }}, + {n=G.UIT.C, config={minw = spacing},nodes={}}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 1.45, minh = 1, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 1.35}, nodes={ + {n=G.UIT.T, config={text = localize('k_round'), minh = 0.33, scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2, id = 'row_round_text'}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'round'}}, colours = {G.C.IMPORTANT},shadow = true, scale = 2*scale}),id = 'round_UI_count'}}, + }}, + }}, + }}, + } + + contents.hand = + {n=G.UIT.R, config={align = "cm", id = 'hand_text_area', colour = darken(G.C.BLACK, 0.1), r = 0.1, emboss = 0.05, padding = 0.03}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 1.1}, nodes={ + {n=G.UIT.O, config={id = 'hand_name', func = 'hand_text_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "handname_text"}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, float = true, scale = scale*1.4})}}, + {n=G.UIT.O, config={id = 'hand_chip_total', func = 'hand_chip_total_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "chip_total_text"}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, float = true, scale = scale*1.4})}}, + {n=G.UIT.T, config={ref_table = G.GAME.current_round.current_hand, ref_value='hand_level', scale = scale, colour = G.C.UI.TEXT_LIGHT, id = 'hand_level', shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 1, padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cr", minw = 2, minh =1, r = 0.1,colour = G.C.UI_CHIPS, id = 'hand_chip_area', emboss = 0.05}, nodes={ + {n=G.UIT.O, config={func = 'flame_handler',no_role = true, id = 'flame_chips', object = Moveable(0,0,0,0), w = 0, h = 0}}, + {n=G.UIT.O, config={id = 'hand_chips', func = 'hand_chip_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "chip_text"}}, colours = {G.C.UI.TEXT_LIGHT}, font = G.LANGUAGES['en-us'].font, shadow = true, float = true, scale = scale*2.3})}}, + {n=G.UIT.B, config={w=0.1,h=0.1}}, + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = "X", lang = G.LANGUAGES['en-us'], scale = scale*2, colour = G.C.UI_MULT, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cl", minw = 2, minh=1, r = 0.1,colour = G.C.UI_MULT, id = 'hand_mult_area', emboss = 0.05}, nodes={ + {n=G.UIT.O, config={func = 'flame_handler',no_role = true, id = 'flame_mult', object = Moveable(0,0,0,0), w = 0, h = 0}}, + {n=G.UIT.B, config={w=0.1,h=0.1}}, + {n=G.UIT.O, config={id = 'hand_mult', func = 'hand_mult_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "mult_text"}}, colours = {G.C.UI.TEXT_LIGHT}, font = G.LANGUAGES['en-us'].font, shadow = true, float = true, scale = scale*2.3})}}, + }} + }} + }} + }} + contents.dollars_chips = {n=G.UIT.R, config={align = "cm",r=0.1, padding = 0,colour = G.C.DYN_UI.BOSS_MAIN, emboss = 0.05, id = 'row_dollars_chips'}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 1.3}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.3}, nodes={ + {n=G.UIT.T, config={text = localize('k_round'), scale = 0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.3}, nodes={ + {n=G.UIT.T, config={text =localize('k_lower_score'), scale = 0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }}, + {n=G.UIT.C, config={align = "cm", minw = 3.3, minh = 0.7, r = 0.1, colour = G.C.DYN_UI.BOSS_DARK}, nodes={ + {n=G.UIT.O, config={w=0.5,h=0.5 , object = stake_sprite, hover = true, can_collide = false}}, + {n=G.UIT.B, config={w=0.1,h=0.1}}, + {n=G.UIT.T, config={ref_table = G.GAME, ref_value = 'chips_text', lang = G.LANGUAGES['en-us'], scale = 0.85, colour = G.C.WHITE, id = 'chip_UI_count', func = 'chip_UI_set', shadow = true}} + }} + }} + }} + + contents.buttons = { + {n=G.UIT.C, config={align = "cm", r=0.1, colour = G.C.CLEAR, shadow = true, id = 'button_area', padding = 0.2}, nodes={ + {n=G.UIT.R, config={id = 'run_info_button', align = "cm", minh = 1.75, minw = 1.5,padding = 0.05, r = 0.1, hover = true, colour = G.C.RED, button = "run_info", shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.4}, nodes={ + {n=G.UIT.T, config={text = localize('b_run_info_1'), scale = 1.2*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.4}, nodes={ + {n=G.UIT.T, config={text = localize('b_run_info_2'), scale = 1*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true, focus_args = {button = G.F_GUIDE and 'guide' or 'back', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }}, + {n=G.UIT.R, config={align = "cm", minh = 1.75, minw = 1.5,padding = 0.05, r = 0.1, hover = true, colour = G.C.ORANGE, button = "options", shadow = true}, nodes={ + {n=G.UIT.C, config={align = "cm", maxw = 1.4, focus_args = {button = 'start', orientation = 'bm'}, func = 'set_button_pip'}, nodes={ + {n=G.UIT.T, config={text = localize('b_options'), scale = scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + }} + }} + } + + return {n=G.UIT.ROOT, config = {align = "cm", padding = 0.03, colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + {n=G.UIT.R, config = {align = "cm", padding= 0.05, colour = G.C.DYN_UI.MAIN, r=0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = G.C.DYN_UI.BOSS_DARK, r=0.1, minh = 30, padding = 0.08}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.3}, nodes={}}, + {n=G.UIT.R, config={align = "cm", id = 'row_blind', minw = 1, minh = 3.75}, nodes={}}, + contents.dollars_chips, + contents.hand, + {n=G.UIT.R, config={align = "cm", id = 'row_round'}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes=contents.buttons}, + {n=G.UIT.C, config={align = "cm"}, nodes=contents.round} + }}, + }} + }} + }} +end + +function create_UIBox_blind_select() + G.blind_prompt_box = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, padding = 0.2}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('ph_choose_blind_1'), colours = {G.C.WHITE}, shadow = true, bump = true, scale = 0.6, pop_in = 0.5, maxw = 5}), id = 'prompt_dynatext1'}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('ph_choose_blind_2'), colours = {G.C.WHITE}, shadow = true, bump = true, scale = 0.7, pop_in = 0.5, maxw = 5, silent = true}), id = 'prompt_dynatext2'}} + }}, + (G.GAME.used_vouchers["v_retcon"] or G.GAME.used_vouchers["v_directors_cut"]) and + UIBox_button({label = {localize('b_reroll_boss'), localize('$')..'10'}, button = "reroll_boss", func = 'reroll_boss_button'}) or nil + }}, + config = {align="cm", offset = {x=0,y=-15},major = G.HUD:get_UIE_by_ID('row_blind'), bond = 'Weak'} + } + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.blind_prompt_box.alignment.offset.y = 0 + return true + end) + })) + + local width = G.hand.T.w + G.GAME.blind_on_deck = + not (G.GAME.round_resets.blind_states.Small == 'Defeated' or G.GAME.round_resets.blind_states.Small == 'Skipped' or G.GAME.round_resets.blind_states.Small == 'Hide') and 'Small' or + not (G.GAME.round_resets.blind_states.Big == 'Defeated' or G.GAME.round_resets.blind_states.Big == 'Skipped'or G.GAME.round_resets.blind_states.Big == 'Hide') and 'Big' or + 'Boss' + + G.blind_select_opts = {} + G.blind_select_opts.small = G.GAME.round_resets.blind_states['Small'] ~= 'Hide' and UIBox{definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={UIBox_dyn_container({create_UIBox_blind_choice('Small')},false,get_blind_main_colour('Small'))}}, config = {align="bmi", offset = {x=0,y=0}}} or nil + G.blind_select_opts.big = G.GAME.round_resets.blind_states['Big'] ~= 'Hide' and UIBox{definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={UIBox_dyn_container({create_UIBox_blind_choice('Big')},false,get_blind_main_colour('Big'))}}, config = {align="bmi", offset = {x=0,y=0}}} or nil + G.blind_select_opts.boss = G.GAME.round_resets.blind_states['Boss'] ~= 'Hide' and UIBox{definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={UIBox_dyn_container({create_UIBox_blind_choice('Boss')},false,get_blind_main_colour('Boss'), mix_colours(G.C.BLACK, get_blind_main_colour('Boss'), 0.8))}}, config = {align="bmi", offset = {x=0,y=0}}} or nil + + local t = {n=G.UIT.ROOT, config = {align = 'tm',minw = width, r = 0.15, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.5}, nodes={ + G.GAME.round_resets.blind_states['Small'] ~= 'Hide' and {n=G.UIT.O, config={align = "cm", object = G.blind_select_opts.small}} or nil, + G.GAME.round_resets.blind_states['Big'] ~= 'Hide' and {n=G.UIT.O, config={align = "cm", object = G.blind_select_opts.big}} or nil, + G.GAME.round_resets.blind_states['Boss'] ~= 'Hide' and {n=G.UIT.O, config={align = "cm", object = G.blind_select_opts.boss}} or nil, + }} + }} + return t +end + +function create_UIBox_blind_tag(blind_choice, run_info) + G.GAME.round_resets.blind_tags = G.GAME.round_resets.blind_tags or {} + if not G.GAME.round_resets.blind_tags[blind_choice] then return nil end + local _tag = Tag(G.GAME.round_resets.blind_tags[blind_choice], nil, blind_choice) + local _tag_ui, _tag_sprite = _tag:generate_UI() + _tag_sprite.states.collide.can = not not run_info + return + {n=G.UIT.R, config={id = 'tag_container', ref_table = _tag, align = "cm"}, nodes={ + {n=G.UIT.R, config={align = 'tm', minh = 0.65}, nodes={ + {n=G.UIT.T, config={text = localize('k_or'), scale = 0.55, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}}, + }}, + {n=G.UIT.R, config={id = 'tag_'..blind_choice, align = "cm", r = 0.1, padding = 0.1, minw = 1, can_collide = true, ref_table = _tag_sprite}, nodes={ + {n=G.UIT.C, config={id = 'tag_desc', align = "cm", minh = 1}, nodes={ + _tag_ui + }}, + not run_info and {n=G.UIT.C, config={align = "cm", colour = G.C.UI.BACKGROUND_INACTIVE, minh = 0.6, minw = 2, maxw = 2, padding = 0.07, r = 0.1, shadow = true, hover = true, one_press = true, button = 'skip_blind', func = 'hover_tag_proxy', ref_table = _tag}, nodes={ + {n=G.UIT.T, config={text = localize('b_skip_blind'), scale = 0.4, colour = G.C.UI.TEXT_INACTIVE}} + }} or {n=G.UIT.C, config={align = "cm", padding = 0.1, emboss = 0.05, colour = mix_colours(G.C.BLUE, G.C.BLACK, 0.4), r = 0.1, maxw = 2}, nodes={ + {n=G.UIT.T, config={text = localize('b_skip_reward'), scale = 0.35, colour = G.C.WHITE}}, + }}, + }} + }} +end + +function create_UIBox_blind_choice(type, run_info) + if not G.GAME.blind_on_deck then + G.GAME.blind_on_deck = 'Small' + end + if not run_info then G.GAME.round_resets.blind_states[G.GAME.blind_on_deck] = 'Select' end + + local disabled = false + type = type or 'Small' + + local blind_choice = { + config = G.P_BLINDS[G.GAME.round_resets.blind_choices[type]], + } + + blind_choice.animation = AnimatedSprite(0,0, 1.4, 1.4, G.ANIMATION_ATLAS['blind_chips'], blind_choice.config.pos) + blind_choice.animation:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + local extras = nil + local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5) + + G.GAME.orbital_choices = G.GAME.orbital_choices or {} + G.GAME.orbital_choices[G.GAME.round_resets.ante] = G.GAME.orbital_choices[G.GAME.round_resets.ante] or {} + + if not G.GAME.orbital_choices[G.GAME.round_resets.ante][type] then + local _poker_hands = {} + for k, v in pairs(G.GAME.hands) do + if v.visible then _poker_hands[#_poker_hands+1] = k end + end + + G.GAME.orbital_choices[G.GAME.round_resets.ante][type] = pseudorandom_element(_poker_hands, pseudoseed('orbital')) + end + + + + if type == 'Small' then + extras = create_UIBox_blind_tag(type, run_info) + elseif type == 'Big' then + extras = create_UIBox_blind_tag(type, run_info) + elseif not run_info then + local dt1 = DynaText({string = {{string = localize('ph_up_ante_1'), colour = G.C.FILTER}}, colours = {G.C.BLACK}, scale = 0.55, silent = true, pop_delay = 4.5, shadow = true, bump = true, maxw = 3}) + local dt2 = DynaText({string = {{string = localize('ph_up_ante_2'), colour = G.C.WHITE}},colours = {G.C.CHANCE}, scale = 0.35, silent = true, pop_delay = 4.5, shadow = true, maxw = 3}) + local dt3 = DynaText({string = {{string = localize('ph_up_ante_3'), colour = G.C.WHITE}},colours = {G.C.CHANCE}, scale = 0.35, silent = true, pop_delay = 4.5, shadow = true, maxw = 3}) + extras = + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.07, r = 0.1, colour = {0,0,0,0.12}, minw = 2.9}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = dt1}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = dt2}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = dt3}}, + }}, + }}, + }} + end + G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante + local loc_target = localize{type = 'raw_descriptions', key = blind_choice.config.key, set = 'Blind', vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')}} + local loc_name = localize{type = 'name_text', key = blind_choice.config.key, set = 'Blind'} + local text_table = loc_target + local blind_col = get_blind_main_colour(type) + local blind_amt = get_blind_amount(G.GAME.round_resets.blind_ante)*blind_choice.config.mult*G.GAME.starting_params.ante_scaling + + local blind_state = G.GAME.round_resets.blind_states[type] + local _reward = true + if G.GAME.modifiers.no_blind_reward and G.GAME.modifiers.no_blind_reward[type] then _reward = nil end + if blind_state == 'Select' then blind_state = 'Current' end + local run_info_colour = run_info and (blind_state == 'Defeated' and G.C.GREY or blind_state == 'Skipped' and G.C.BLUE or blind_state == 'Upcoming' and G.C.ORANGE or blind_state == 'Current' and G.C.RED or G.C.GOLD) + local t = + {n=G.UIT.R, config={id = type, align = "tm", func = 'blind_choice_handler', minh = not run_info and 10 or nil, ref_table = {deck = nil, run_info = run_info}, r = 0.1, padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = mix_colours(G.C.BLACK, G.C.L_BLACK, 0.5), r = 0.1, outline = 1, outline_colour = G.C.L_BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={ + not run_info and {n=G.UIT.R, config={id = 'select_blind_button', align = "cm", ref_table = blind_choice.config, colour = disabled and G.C.UI.BACKGROUND_INACTIVE or G.C.ORANGE, minh = 0.6, minw = 2.7, padding = 0.07, r = 0.1, shadow = true, hover = true, one_press = true, button = 'select_blind'}, nodes={ + {n=G.UIT.T, config={ref_table = G.GAME.round_resets.loc_blind_states, ref_value = type, scale = 0.45, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.UI.TEXT_LIGHT, shadow = not disabled}} + }} or + {n=G.UIT.R, config={id = 'select_blind_button', align = "cm", ref_table = blind_choice.config, colour = run_info_colour, minh = 0.6, minw = 2.7, padding = 0.07, r = 0.1, emboss = 0.08}, nodes={ + {n=G.UIT.T, config={text = localize(blind_state, 'blind_states'), scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }}, + {n=G.UIT.R, config={id = 'blind_name',align = "cm", padding = 0.07}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, outline = 1, outline_colour = blind_col, colour = darken(blind_col, 0.3), minw = 2.9, emboss = 0.1, padding = 0.07, line_emboss = 1}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = loc_name, colours = {disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE}, shadow = not disabled, float = not disabled, y_offset = -4, scale = 0.45, maxw =2.8})}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={id = 'blind_desc', align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 1.5}, nodes={ + {n=G.UIT.O, config={object = blind_choice.animation}}, + }}, + text_table[1] and {n=G.UIT.R, config={align = "cm", minh = 0.7, padding = 0.05, minw = 2.9}, nodes={ + text_table[1] and {n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={ + {n=G.UIT.T, config={id = blind_choice.config.key, ref_table = {val = ''}, ref_value = 'val', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled, func = 'HUD_blind_debuff_prefix'}}, + {n=G.UIT.T, config={text = text_table[1] or '-', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}} + }} or nil, + text_table[2] and {n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={ + {n=G.UIT.T, config={text = text_table[2] or '-', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}} + }} or nil, + }} or nil, + }}, + {n=G.UIT.R, config={align = "cm",r = 0.1, padding = 0.05, minw = 3.1, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 3}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_score_at_least'), scale = 0.3, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.6}, nodes={ + {n=G.UIT.O, config={w=0.5,h=0.5, colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}}, + {n=G.UIT.B, config={h=0.1,w=0.1}}, + {n=G.UIT.T, config={text = number_format(blind_amt), scale = score_number_scale(0.9, blind_amt), colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.RED, shadow = not disabled}} + }}, + _reward and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_reward'), scale = 0.35, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}}, + {n=G.UIT.T, config={text = string.rep(localize("$"), blind_choice.config.dollars)..'+', scale = 0.35, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.MONEY, shadow = not disabled}} + }} or nil, + }}, + }}, + }}, + }}, + {n=G.UIT.R, config={id = 'blind_extras', align = "cm"}, nodes={ + extras, + }} + + }} + return t +end + +function create_UIBox_round_evaluation() + local width = G.hand.T.w-2 + local t = {n=G.UIT.ROOT, config = {align = 'tm',colour = G.C.CLEAR}, nodes={ + UIBox_dyn_container( + { + {n=G.UIT.R, config={align = "tm", minw = width, minh = 3, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", minw = width, minh = 1.4}, nodes={}}, + {n=G.UIT.R, config={align = "cm", minw = width, id = 'base_round_eval'}, nodes={}}, + {n=G.UIT.R, config={align = "cm", minw = width, id = 'bonus_round_eval'}, nodes={}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={}}, + {n=G.UIT.R, config={align = "cm", minw = width, id = 'eval_bottom'}, nodes={}} + },false) + }} +return t +end + +function create_UIBox_arcana_pack() + local _size = G.GAME.pack_size + G.pack_cards = CardArea( + G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y, + _size*G.CARD_W, + 1.05*G.CARD_H, + {card_limit = _size, type = 'consumeable', highlight_limit = 1}) + + local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={ + {n=G.UIT.O, config={object = G.pack_cards}}, + }} + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + }}, + {n=G.UIT.R, config={align = "tm"}, nodes={ + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}}, + {n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={ + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('k_arcana_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}} + }}, + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}} + }}, + }} + }), + }}, + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={ + {n=G.UIT.R,config={minh =0.2}, nodes={}}, + {n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = { + {n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_spectral_pack() + local _size = G.GAME.pack_size + G.pack_cards = CardArea( + G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y, + _size*G.CARD_W, + 1.05*G.CARD_H, + {card_limit = _size, type = 'consumeable', highlight_limit = 1}) + + local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={ + {n=G.UIT.O, config={object = G.pack_cards}}, + }} + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + }}, + {n=G.UIT.R, config={align = "tm"}, nodes={ + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}}, + {n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={ + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('k_spectral_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}} + }}, + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}} + }}, + }} + }), + }}, + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={ + {n=G.UIT.R,config={minh =0.2}, nodes={}}, + {n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = { + {n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_standard_pack() + local _size = G.GAME.pack_size + G.pack_cards = CardArea( + G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y, + _size*G.CARD_W*1.1, + 1.05*G.CARD_H, + {card_limit = _size, type = 'consumeable', highlight_limit = 1}) + + local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={ + {n=G.UIT.O, config={object = G.pack_cards}}, + }} + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + }}, + {n=G.UIT.R, config={align = "tm"}, nodes={ + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}}, + {n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={ + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('k_standard_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}} + }}, + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}} + }}, + }} + }), + }}, + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={ + {n=G.UIT.R,config={minh =0.2}, nodes={}}, + {n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = { + {n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_buffoon_pack() + local _size = G.GAME.pack_size + G.pack_cards = CardArea( + G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y, + _size*G.CARD_W*1.1, + 1.05*G.CARD_H, + {card_limit = _size, type = 'consumeable', highlight_limit = 1}) + + local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={ + {n=G.UIT.O, config={object = G.pack_cards}}, + }} + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + }}, + {n=G.UIT.R, config={align = "tm"}, nodes={ + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}}, + {n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={ + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('k_buffoon_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}} + }}, + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}} + }}, + }} + }), + }}, + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={ + {n=G.UIT.R,config={minh =0.2}, nodes={}}, + {n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = { + {n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_celestial_pack() + local _size = G.GAME.pack_size + G.pack_cards = CardArea( + G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y, + _size*G.CARD_W*1.1 + 0.5, + 1.05*G.CARD_H, + {card_limit = _size, type = 'consumeable', highlight_limit = 1}) + + local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={ + {n=G.UIT.O, config={object = G.pack_cards}}, + }} + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + }}, + {n=G.UIT.R, config={align = "tm"}, nodes={ + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}}, + {n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={ + UIBox_dyn_container({ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={ + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize('k_celestial_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}} + }}, + {n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}, + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}} + }}, + }} + }), + }}, + {n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={ + {n=G.UIT.R,config={minh =0.2}, nodes={}}, + {n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = { + {n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}} + }} + }} + }} + }} + }} + return t +end + +function create_UIBox_card_alert(args) + args = args or {} + return {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, refresh_movement = true}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.15, minw = 0.42, minh = 0.42, colour = args.no_bg and G.C.CLEAR or args.bg_col or (args.red_bad and darken(G.C.RED, 0.1) or G.C.RED), draw_layer = 1, emboss = 0.05, refresh_movement = true}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = args.text or '!', colours = {G.C.WHITE},shadow = true, rotate = true,H_offset = args.y_offset or 0,bump_rate = args.text and 3 or 7, bump_amount = args.bump_amount or 3, bump = true,maxw = args.maxw, text_rot = args.text_rot or 0.2, spacing = 3*(args.scale or 1), scale = args.scale or 0.48})}} + }}, + }} +end + +function create_slider(args) + args = args or {} + args.colour = args.colour or G.C.RED + args.w = args.w or 1 + args.h = args.h or 0.5 + args.label_scale = args.label_scale or 0.5 + args.text_scale = args.text_scale or 0.3 + args.min = args.min or 0 + args.max = args.max or 1 + args.decimal_places = args.decimal_places or 0 + args.text = string.format("%."..tostring(args.decimal_places).."f", args.ref_table[args.ref_value]) + local startval = args.w * (args.ref_table[args.ref_value] - args.min)/(args.max - args.min) + + local t = + {n=G.UIT.C, config={align = "cm", minw = args.w, min_h = args.h, padding = 0.1, r = 0.1, colour = G.C.CLEAR, focus_args = {type = 'slider'}}, nodes={ + {n=G.UIT.C, config={align = "cl", minw = args.w, r = 0.1,min_h = args.h,collideable = true, hover = true, colour = G.C.BLACK,emboss = 0.05,func = 'slider', refresh_movement = true}, nodes={ + {n=G.UIT.B, config={w=startval,h=args.h, r = 0.1, colour = args.colour, ref_table = args, refresh_movement = true}}, + }}, + {n=G.UIT.C, config={align = "cm", minh = args.h,r = 0.1, minw = 0.8, colour = args.colour,shadow = true}, nodes={ + {n=G.UIT.T, config={ref_table = args, ref_value = 'text', scale = args.text_scale, colour = G.C.UI.TEXT_LIGHT, decimal_places = args.decimal_places}} + }}, + }} + if args.label then + t = {n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.1*args.label_scale, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = args.label, scale = args.label_scale, colour = G.C.UI.TEXT_LIGHT}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + t + }} + }} + end + return t +end + +function create_toggle(args) + args = args or {} + args.active_colour = args.active_colour or G.C.RED + args.inactive_colour = args.inactive_colour or G.C.BLACK + args.w = args.w or 3 + args.h = args.h or 0.5 + args.scale = args.scale or 1 + args.label = args.label or 'TEST?' + args.label_scale = args.label_scale or 0.4 + args.ref_table = args.ref_table or {} + args.ref_value = args.ref_value or 'test' + + local check = Sprite(0,0,0.5*args.scale,0.5*args.scale,G.ASSET_ATLAS["icons"], {x=1, y=0}) + check.states.drag.can = false + check.states.visible = false + + local info = nil + if args.info then + info = {} + for k, v in ipairs(args.info) do + table.insert(info, {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={ + {n=G.UIT.T, config={text = v, scale = 0.25, colour = G.C.UI.TEXT_LIGHT}} + }}) + end + info = {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes=info} + end + + local t = + {n=args.col and G.UIT.C or G.UIT.R, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.CLEAR, focus_args = {funnel_from = true}}, nodes={ + {n=G.UIT.C, config={align = "cr", minw = args.w}, nodes={ + {n=G.UIT.T, config={text = args.label, scale = args.label_scale, colour = G.C.UI.TEXT_LIGHT}}, + {n=G.UIT.B, config={w = 0.1, h = 0.1}}, + }}, + {n=G.UIT.C, config={align = "cl", minw = 0.3*args.w}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, padding = 0.03, minw = 0.4*args.scale, minh = 0.4*args.scale, outline_colour = G.C.WHITE, outline = 1.2*args.scale, line_emboss = 0.5*args.scale, ref_table = args, + colour = args.inactive_colour, + button = 'toggle_button', button_dist = 0.2, hover = true, toggle_callback = args.callback, func = 'toggle', focus_args = {funnel_to = true}}, nodes={ + {n=G.UIT.O, config={object = check}}, + }}, + }} + }}, + }} + if args.info then + t = {n=args.col and G.UIT.C or G.UIT.R, config={align = "cm"}, nodes={ + t, + info, + }} + end + return t +end + +function create_option_cycle(args) + args = args or {} + args.colour = args.colour or G.C.RED + args.options = args.options or { + 'Option 1', + 'Option 2' + } + args.current_option = args.current_option or 1 + args.current_option_val = args.options[args.current_option] + args.opt_callback = args.opt_callback or nil + args.scale = args.scale or 1 + args.ref_table = args.ref_table or nil + args.ref_value = args.ref_value or nil + args.w = (args.w or 2.5)*args.scale + args.h = (args.h or 0.8)*args.scale + args.text_scale = (args.text_scale or 0.5)*args.scale + args.l = '<' + args.r = '>' + args.focus_args = args.focus_args or {} + args.focus_args.type = 'cycle' + + local info = nil + if args.info then + info = {} + for k, v in ipairs(args.info) do + table.insert(info, {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={ + {n=G.UIT.T, config={text = v, scale = 0.3*args.scale, colour = G.C.UI.TEXT_LIGHT}} + }}) + end + info = {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes=info} + end + + local disabled = #args.options < 2 + local pips = {} + for i = 1, #args.options do + pips[#pips+1] = {n=G.UIT.B, config={w = 0.1*args.scale, h = 0.1*args.scale, r = 0.05, id = 'pip_'..i, colour = args.current_option == i and G.C.WHITE or G.C.BLACK}} + end + + local choice_pips = not args.no_pips and {n=G.UIT.R, config={align = "cm", padding = (0.05 - (#args.options > 15 and 0.03 or 0))*args.scale}, nodes=pips} or nil + + local t = + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.CLEAR, id = args.id and (not args.label and args.id or nil) or nil, focus_args = args.focus_args}, nodes={ + {n=G.UIT.C, config={align = "cm",r = 0.1, minw = 0.6*args.scale, hover = not disabled, colour = not disabled and args.colour or G.C.BLACK,shadow = not disabled, button = not disabled and 'option_cycle' or nil, ref_table = args, ref_value = 'l', focus_args = {type = 'none'}}, nodes={ + {n=G.UIT.T, config={ref_table = args, ref_value = 'l', scale = args.text_scale, colour = not disabled and G.C.UI.TEXT_LIGHT or G.C.UI.TEXT_INACTIVE}} + }}, + args.mid and + {n=G.UIT.C, config={id = 'cycle_main'}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={ + args.mid + }}, + not disabled and choice_pips or nil + }} + or {n=G.UIT.C, config={id = 'cycle_main', align = "cm", minw = args.w, minh = args.h, r = 0.1, padding = 0.05, colour = args.colour,emboss = 0.1, hover = true, can_collide = true, on_demand_tooltip = args.on_demand_tooltip}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{ref_table = args, ref_value = "current_option_val"}}, colours = {G.C.UI.TEXT_LIGHT},pop_in = 0, pop_in_rate = 8, reset_pop_in = true,shadow = true, float = true, silent = true, bump = true, scale = args.text_scale, non_recalc = true})}}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={ + }}, + not disabled and choice_pips or nil + }} + }}, + {n=G.UIT.C, config={align = "cm",r = 0.1, minw = 0.6*args.scale, hover = not disabled, colour = not disabled and args.colour or G.C.BLACK,shadow = not disabled, button = not disabled and 'option_cycle' or nil, ref_table = args, ref_value = 'r', focus_args = {type = 'none'}}, nodes={ + {n=G.UIT.T, config={ref_table = args, ref_value = 'r', scale = args.text_scale, colour = not disabled and G.C.UI.TEXT_LIGHT or G.C.UI.TEXT_INACTIVE}} + }}, + }} + + if args.cycle_shoulders then + t = + {n=G.UIT.R, config={align = "cm", colour = G.C.CLEAR}, nodes = { + {n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'leftshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = -0.1, y = 0}}}, nodes = {}}, + {n=G.UIT.C, config={id = 'cycle_shoulders', padding = 0.1}, nodes={t}}, + {n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'rightshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = 0.1, y = 0}}}, nodes = {}}, + }} + else + t = + {n=G.UIT.R, config={align = "cm", colour = G.C.CLEAR, padding = 0.0}, nodes = { + t + }} + end + if args.label or args.info then + t = {n=G.UIT.R, config={align = "cm", padding = 0.05, id = args.id or nil}, nodes={ + args.label and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = args.label, scale = 0.5*args.scale, colour = G.C.UI.TEXT_LIGHT}} + }} or nil, + t, + info, + }} + end + return t +end + +function create_tabs(args) + args = args or {} + args.colour = args.colour or G.C.RED + args.tab_alignment = args.tab_alignment or 'cm' + args.opt_callback = args.opt_callback or nil + args.scale = args.scale or 1 + args.tab_w = args.tab_w or 0 + args.tab_h = args.tab_h or 0 + args.text_scale = (args.text_scale or 0.5) + args.tabs = args.tabs or { + { + label = 'tab 1', + chosen = true, + func = nil, + tab_definition_function = function() return {n=G.UIT.ROOT, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'A', scale = 1, colour = G.C.UI.TEXT_LIGHT}} + }} end + }, + { + label = 'tab 2', + chosen = false, + tab_definition_function = function() return {n=G.UIT.ROOT, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'B', scale = 1, colour = G.C.UI.TEXT_LIGHT}} + }} end + }, + { + label = 'tab 3', + chosen = false, + tab_definition_function = function() return {n=G.UIT.ROOT, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = 'C', scale = 1, colour = G.C.UI.TEXT_LIGHT}} + }} end + } + } + + local tab_buttons = {} + + for k, v in ipairs(args.tabs) do + if v.chosen then args.current = {k = k, v = v} end + tab_buttons[#tab_buttons+1] = UIBox_button({id = 'tab_but_'..(v.label or ''), ref_table = v, button = 'change_tab', label = {v.label}, minh = 0.8*args.scale, minw = 2.5*args.scale, col = true, choice = true, scale = args.text_scale, chosen = v.chosen, func = v.func, focus_args = {type = 'none'}}) + end + + local t = + {n=G.UIT.R, config={padding = 0.0, align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", colour = G.C.CLEAR}, nodes = { + (#args.tabs > 1 and not args.no_shoulders) and {n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'leftshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = -0.1, y = 0}}}, nodes = {}} or nil, + {n=G.UIT.C, config={id = args.no_shoulders and 'no_shoulders' or 'tab_shoulders', ref_table = args, align = "cm", padding = 0.15, group = 1, collideable = true, focus_args = #args.tabs > 1 and {type = 'tab', nav = 'wide',snap_to = args.snap_to_nav, no_loop = args.no_loop} or nil}, nodes=tab_buttons}, + (#args.tabs > 1 and not args.no_shoulders) and {n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'rightshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = 0.1, y = 0}}}, nodes = {}} or nil, + }}, + {n=G.UIT.R, config={align = args.tab_alignment, padding = args.padding or 0.1, no_fill = true, minh = args.tab_h, minw = args.tab_w}, nodes={ + {n=G.UIT.O, config={id = 'tab_contents', object = UIBox{definition = args.current.v.tab_definition_function(args.current.v.tab_definition_function_args), config = {offset = {x=0,y=0}}}}} + }}, + }} + + return t +end + +function create_text_input(args) + args = args or {} + args.colour = copy_table(args.colour) or copy_table(G.C.BLUE) + args.hooked_colour = copy_table(args.hooked_colour) or darken(copy_table(G.C.BLUE), 0.3) + args.w = args.w or 2.5 + args.h = args.h or 0.7 + args.text_scale = args.text_scale or 0.4 + args.max_length = args.max_length or 16 + args.all_caps = args.all_caps or false + args.prompt_text = args.prompt_text or localize('k_enter_text') + args.current_prompt_text = '' + + local text = {ref_table = args.ref_table, ref_value = args.ref_value, letters = {}, current_position = string.len(args.ref_table[args.ref_value])} + local ui_letters = {} + for i = 1, args.max_length do + text.letters[i] = (args.ref_table[args.ref_value] and (string.sub(args.ref_table[args.ref_value], i, i) or '')) or '' + ui_letters[i] = {n=G.UIT.T, config={ref_table = text.letters, ref_value = i, scale = args.text_scale, colour = G.C.UI.TEXT_LIGHT, id = 'letter_'..i}} + end + args.text = text + + local position_text_colour = lighten(copy_table(G.C.BLUE), 0.4) + + ui_letters[#ui_letters+1] = {n=G.UIT.T, config={ref_table = args, ref_value = 'current_prompt_text', scale = args.text_scale, colour = lighten(copy_table(args.colour), 0.4), id = 'prompt'}} + ui_letters[#ui_letters+1] = {n=G.UIT.B, config={r = 0.03,w=0.1, h=0.4, colour = position_text_colour, id = 'position', func = 'flash'}} + + local t = + {n=G.UIT.C, config={align = "cm", draw_layer = 1, colour = G.C.CLEAR}, nodes = { + {n=G.UIT.C, config={id = 'text_input', align = "cm", padding = 0.05, r = 0.1, draw_layer = 2, hover = true, colour = args.colour,minw = args.w, min_h = args.h, button = 'select_text_input', shadow = true}, nodes={ + {n=G.UIT.R, config={ref_table = args, padding = 0.05, align = "cm", r = 0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={ref_table = args, align = "cm", r = 0.1, colour = G.C.CLEAR, func = 'text_input'}, nodes= + ui_letters + } + }} + }} + }} + return t +end + +function create_keyboard_input(args) + local keyboard_rows = { + '1234567890', + 'QWERTYUIOP', + 'ASDFGHJKL', + 'ZXCVBNM', + args.space_key and ' ' or nil + } + local keyboard_button_rows = { + {},{},{},{},{} + } + for k, v in ipairs(keyboard_rows) do + for i = 1, #v do + local c = v:sub(i,i) + keyboard_button_rows[k][#keyboard_button_rows[k] +1] = create_keyboard_button(c, c == ' ' and 'y' or nil) + end + end + return {n=G.UIT.ROOT, config={align = "cm", padding = 15, r = 0.1, colour = {G.C.GREY[1], G.C.GREY[2], G.C.GREY[3],0.7}}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes = { + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLACK, emboss = 0.05, r = 0.1, mid = true}, nodes = { + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes = { + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes = { + {n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[1]}, + {n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[2]}, + {n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[3]}, + {n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[4]}, + {n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[5]} + }}, + (args.backspace_key or args.return_key) and {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes = { + args.backspace_key and {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={create_keyboard_button('backspace', 'x')}} or nil, + args.return_key and {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={create_keyboard_button('return', 'start')}} or nil, + {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={create_keyboard_button('back', 'b')}} + }} or nil + }}, + }} + }}, + + }} +end + +function create_keyboard_button(key, binding) + local key_label = (key == 'backspace' and 'Backspace') or (key == ' ' and 'Space') or (key == 'back' and 'Back') or (key == 'return' and 'Enter') or key + return UIBox_button{ label = {key_label}, button = "key_button", ref_table = {key = key == 'back' and 'return' or key}, + minw = key == ' ' and 6 or key == 'return' and 2.5 or key == 'backspace' and 2.5 or key == 'back' and 2.5 or 0.8, + minh = key == 'return' and 1.5 or key == 'backspace' and 1.5 or key == 'back' and 0.8 or 0.7, + col = true, colour = G.C.GREY, focus_args = binding and {button = binding, orientation = (key == ' ' or key == 'back') and 'cr' or 'bm', set_button_pip= true} or nil} +end + +function create_dynatext_pips(args) + args = args or {} + + args.active_colour = copy_table(args.colour) or G.C.RED + args.inactive_colour = copy_table(args.inactive_colour) or {0,0,0,0.08} + args.w = args.w or 0.07 + args.h = args.h or 0.07 + + if not (args.dynatext) or not (#args.dynatext.strings > 1) then return end + + local pips = {} + + for i = 1, #args.dynatext.strings do + pips[i] = {n=G.UIT.C, config={ref_table = args.dynatext, minw = args.w, minh = args.h, colour = G.C.UI.TEXT_INACTIVE, r = 0.1, id = 'pip_'..i, pipcol1 = args.active_colour, pipcol2 = args.inactive_colour, func = 'pip_dynatext'}} + end + + return {n=G.UIT.R, config={padding = 0.05, align = "cm"}, nodes=pips} +end + +function create_UIBox_options() + local current_seed = nil + local restart = nil + local main_menu = nil + local your_collection = nil + local credits = nil + + G.E_MANAGER:add_event(Event({ + blockable = false, + func = function() + G.REFRESH_ALERTS = true + return true + end + })) + + if G.STAGE == G.STAGES.RUN then + restart = UIBox_button{id = 'restart_button', label = {localize('b_start_new_run')}, button = "setup_run", minw = 5} + main_menu = UIBox_button{ label = {localize('b_main_menu')}, button = "go_to_menu", minw = 5} + your_collection = UIBox_button{ label = {localize('b_collection')}, button = "your_collection", minw = 5, id = 'your_collection'} + current_seed = {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('b_seed')..": ", scale = 0.4, colour = G.C.WHITE}} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0, minh = 0.8}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0, minh = 0.8}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, colour = G.GAME.seeded and G.C.RED or G.C.BLACK, minw = 1.8, minh = 0.5, padding = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={ text = tostring(G.GAME.pseudorandom.seed), scale = 0.43, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }} + }} + }}, + UIBox_button({col = true, button = 'copy_seed', label = {localize('b_copy')}, colour = G.C.BLUE, scale = 0.3, minw = 1.3, minh = 0.5,}), + }} + end + if G.STAGE == G.STAGES.MAIN_MENU then + credits = UIBox_button{ label = {localize('b_credits')}, button = "show_credits", minw = 5} + end + + local settings = UIBox_button({button = 'settings', label = {localize('b_settings')}, minw = 5, focus_args = {snap_to = true}}) + local high_scores = UIBox_button{ label = {localize('b_stats')}, button = "high_scores", minw = 5} + + local t = create_UIBox_generic_options({ contents = { + settings, + G.GAME.seeded and current_seed or nil, + restart, + main_menu, + high_scores, + your_collection, + credits + }}) + return t +end + +function create_UIBox_settings() + local tabs = {} + tabs[#tabs+1] = { + label = localize('b_set_game'), + chosen = true, + tab_definition_function = G.UIDEF.settings_tab, + tab_definition_function_args = 'Game' + } + if G.F_VIDEO_SETTINGS then tabs[#tabs+1] = { + label = localize('b_set_video'), + tab_definition_function = G.UIDEF.settings_tab, + tab_definition_function_args = 'Video' + } + end + tabs[#tabs+1] = { + label = localize('b_set_graphics'), + tab_definition_function = G.UIDEF.settings_tab, + tab_definition_function_args = 'Graphics' + } + tabs[#tabs+1] = { + label = localize('b_set_audio'), + tab_definition_function = G.UIDEF.settings_tab, + tab_definition_function_args = 'Audio' + } + + local t = create_UIBox_generic_options({back_func = 'options',contents = {create_tabs( + {tabs = tabs, + tab_h = 7.05, + tab_alignment = 'tm', + snap_to_nav = true} + )}}) +return t +end + +function G.UIDEF.settings_tab(tab) + if tab == 'Game' then + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + create_option_cycle({label = localize('b_set_gamespeed'),scale = 0.8, options = {0.5, 1, 2, 4}, opt_callback = 'change_gamespeed', current_option = (G.SETTINGS.GAMESPEED == 0.5 and 1 or G.SETTINGS.GAMESPEED == 4 and 4 or G.SETTINGS.GAMESPEED + 1)}), + create_option_cycle({w = 5, label = localize('b_set_play_discard_pos'),scale = 0.8, options = localize('ml_play_discard_pos_opt'), opt_callback = 'change_play_discard_position', current_option = (G.SETTINGS.play_button_pos)}), + G.F_RUMBLE and create_toggle({label = localize('b_set_rumble'), ref_table = G.SETTINGS, ref_value = 'rumble'}) or nil, + create_slider({label = localize('b_set_screenshake'),w = 4, h = 0.4, ref_table = G.SETTINGS, ref_value = 'screenshake', min = 0, max = 100}), + create_toggle({label = localize('b_high_contrast_cards'), ref_table = G.SETTINGS, ref_value = 'colourblind_option', callback = ( + function(_set_toggle) + local new_colour_proto = G.C["SO_"..(G.SETTINGS.colourblind_option and 2 or 1)] + G.C.SUITS.Hearts = new_colour_proto.Hearts + G.C.SUITS.Diamonds = new_colour_proto.Diamonds + G.C.SUITS.Spades = new_colour_proto.Spades + G.C.SUITS.Clubs = new_colour_proto.Clubs + for k, v in pairs(G.I.SPRITE) do + if v.atlas and string.find(v.atlas.name, 'cards_') then + v.atlas = G.ASSET_ATLAS["cards_"..(G.SETTINGS.colourblind_option and 2 or 1)] + end + end + end + )}), + G.F_CRASH_REPORTS and create_toggle({label = localize('b_set_crash_reports'), ref_table = G.SETTINGS, ref_value = 'crashreports', info = localize('ml_crash_report_info')}) or nil, + }} + elseif tab == 'Video' then + --Reset the queue so there are no pending changes + G.SETTINGS.QUEUED_CHANGE = {} + + --Refresh the display information for all displays based on the screenmode selected + local res_option = GET_DISPLAYINFO(G.SETTINGS.WINDOW.screenmode, G.SETTINGS.WINDOW.selected_display) + + return + {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + create_option_cycle({w = 4,scale = 0.8, label = localize('b_set_monitor'), options = G.SETTINGS.WINDOW.display_names, opt_callback = 'change_display', current_option = (G.SETTINGS.WINDOW.selected_display)}), + create_option_cycle({w = 4,scale = 0.8, label = localize('b_set_windowmode'), options = localize('ml_windowmode_opt'), opt_callback = 'change_screenmode', current_option = (({Windowed = 1, Fullscreen = 2, Borderless = 3})[G.SETTINGS.WINDOW.screenmode] or 1)}), + {n=G.UIT.R, config={align = "cm", id = 'resolution_cycle'}, nodes={create_option_cycle({w = 4,scale = 0.8, options = G.SETTINGS.WINDOW.DISPLAYS[G.SETTINGS.WINDOW.selected_display].screen_resolutions.strings, opt_callback = 'change_screen_resolution',current_option = res_option or 1})}}, + {n=G.UIT.R, config={align = "cm"}, nodes={create_option_cycle({w = 4,scale = 0.8, options = localize('ml_vsync_opt'), opt_callback = 'change_vsync',current_option = G.SETTINGS.WINDOW.vsync == 0 and 2 or 1})}}, + UIBox_button({button = 'apply_window_changes', label = {localize('b_set_apply')}, minw = 3, func = 'can_apply_window_changes'}), + }} + elseif tab == 'Audio' then + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + create_slider({label = localize('b_set_master_vol'), w = 5, h = 0.4, ref_table = G.SETTINGS.SOUND, ref_value = 'volume', min = 0, max = 100}), + create_slider({label = localize('b_set_music_vol'), w = 5, h = 0.4, ref_table = G.SETTINGS.SOUND, ref_value = 'music_volume', min = 0, max = 100}), + create_slider({label = localize('b_set_game_vol'), w = 5, h = 0.4, ref_table = G.SETTINGS.SOUND, ref_value = 'game_sounds_volume', min = 0, max = 100}), + }} + elseif tab == 'Graphics' then + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + create_option_cycle({w = 4,scale = 0.8, label = localize("b_set_shadows"),options = localize('ml_shadow_opt'), opt_callback = 'change_shadows', current_option = (G.SETTINGS.GRAPHICS.shadows == 'On' and 1 or 2)}), + create_option_cycle({w = 4,scale = 0.8, label = localize("b_set_pixel_smoothing"),options = localize('ml_smoothing_opt'), opt_callback = 'change_pixel_smoothing', current_option = G.SETTINGS.GRAPHICS.texture_scaling}), + create_slider({label = localize('b_set_CRT'),w = 4, h = 0.4, ref_table = G.SETTINGS.GRAPHICS, ref_value = 'crt', min = 0, max = 100}), + create_option_cycle({w = 4,scale = 0.8, label = localize("b_set_CRT_bloom"),options = localize('ml_bloom_opt'), opt_callback = 'change_crt_bloom', current_option = G.SETTINGS.GRAPHICS.bloom}), + }} + end + + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR, minh = 5, minw = 5}, nodes={}} +end + +function create_UIBox_test_framework(variables) + variables = variables or {}; + local nodes = {} + for k, v in pairs(variables) do + if v.type == 'cycle' then + table.insert(nodes, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = v.label or '', scale = 0.5, colour = G.C.UI.TEXT_DARK}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = v.options, opt_callback = 'test_framework_cycle_callback', ref_table = v.ref_table, ref_value = v.ref_value}) + }}, + }}) + elseif v.type == 'slider' then + table.insert(nodes, + {n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.05, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = v.label, scale = 0.5, colour = G.C.UI.TEXT_DARK}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + create_slider({w = 5, h = 0.4, ref_table = v.ref_table, ref_value = v.ref_value, min = v.min or 0, max = v.max or 1}), + }}, + }}) + elseif v.type == 'text_input' then + table.insert(nodes, + {n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.05, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = v.label, scale = 0.5, colour = G.C.UI.TEXT_DARK}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + create_text_input(v.options), + }}, + }}) + end + end + local t = {n=G.UIT.ROOT, config = {align = "cm", minw = G.ROOM.T.w*5, minh = G.ROOM.T.h*5,padding = 0.15, r = 0.1, colour = {G.C.BLACK[1], G.C.BLACK[2], G.C.BLACK[3],0.6}}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 1,r = 0.3, padding = 0.1, minw = 1, colour = G.C.WHITE, shadow = true}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.2, minw = 1, colour = G.C.CLEAR, outline = 1, outline_colour = G.C.BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes= + nodes + }, + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, hover = true, colour = G.C.ORANGE, button = "exit_overlay_menu", shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.T, config={text = "Back", scale = 0.5, colour = G.C.UI.TEXT_LIGHT}} + }} + }}, + }} + }} + }} +return t +end + +function G.UIDEF.usage_tabs() + return create_UIBox_generic_options({back_func = 'high_scores', contents ={create_tabs( + {tabs = { + { + label = localize('b_stat_jokers'), + chosen = true, + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'joker_usage'}, + }, + { + label = localize('b_stat_consumables'), + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'consumeable_usage'}, + }, + { + label = localize('b_stat_tarots'), + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'consumeable_usage', 'Tarot'}, + }, + { + label = localize('b_stat_planets'), + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'consumeable_usage', 'Planet'}, + }, + { + label = localize('b_stat_spectrals'), + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'consumeable_usage', 'Spectral'}, + }, + { + label = localize('b_stat_vouchers'), + tab_definition_function = create_UIBox_usage, + tab_definition_function_args = {'voucher_usage', 'Voucher'}, + }, + }, + tab_h = 8, + snap_to_nav = true})}}) +end + +function create_UIBox_usage(args) + args = args or {} + _type, _set = args[1], args[2] + local used_cards = {} + local max_amt = 0 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile][_type]) do + if G.P_CENTERS[k] and (not _set or G.P_CENTERS[k].set == _set) and G.P_CENTERS[k].discovered then + used_cards[#used_cards + 1] = {count = v.count, key = k} + if v.count > max_amt then max_amt = v.count end + end + end + + local _col = G.C.SECONDARY_SET[_set] or G.C.RED + + table.sort(used_cards, function (a, b) return a.count > b.count end ) + + local histograms = {} + + for i = 1, 10 do + local v = used_cards[i] + if v then + local card = Card(0,0, 0.7*G.CARD_W, 0.7*G.CARD_H, nil, G.P_CENTERS[v.key]) + card.ambient_tilt = 0.8 + local cardarea = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + G.CARD_W*0.7, + G.CARD_H*0.7, + {card_limit = 2, type = 'title', highlight_limit = 0}) + cardarea:emplace(card) + + histograms[#histograms +1] = + {n=G.UIT.C, config={align = "bm",minh = 6.2, colour = G.C.UI.TRANSPARENT_DARK, r = 0.1}, nodes={ + + {n=G.UIT.R, config={align = "bm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.7*G.CARD_H+0.1} , nodes={ + {n=G.UIT.O, config={object = cardarea}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = v.count, scale = 0.35, colour = mix_colours(G.C.FILTER, G.C.WHITE, 0.8), shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = v.count/max_amt*3.6, minw = 0.8, colour = G.C.SECONDARY_SET[G.P_CENTERS[v.key].set] or G.C.RED, res = 0.15, r = 0.001}, nodes={}}, + }}, + }}, + }} + else + histograms[#histograms +1] = + {n=G.UIT.C, config={align = "bm",minh = 6.2, colour = G.C.UI.TRANSPARENT_DARK, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "bm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.7*G.CARD_H+0.1, minw = 0.7*G.CARD_W} , nodes={ + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = '-', scale = 0.35, colour = mix_colours(G.C.FILTER, G.C.WHITE, 0.8), shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.2, minw = 0.8, colour = G.C.UI.TRANSPARENT_LIGHT, res = 0.15, r = 0.001}, nodes={}}, + }}, + }}, + }} + end + end + + local t = {n=G.UIT.ROOT, config={align = "cm", minw = 3, padding = 0.1, r = 0.1, colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.B, config={w=0.2,h=0.2,r =0.1,colour = G.C.FILTER}}, + {n=G.UIT.T, config={text = + _type == 'joker_usage' and localize('ph_stat_joker') or + _type == 'consumeable_usage' and localize('ph_stat_consumable') or + _type == 'voucher_usage' and localize('ph_stat_voucher'), + scale = 0.35, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes=histograms}, + }} + + return t +end + +function create_UIBox_high_scores() + fetch_achievements() + set_profile_progress() + set_discover_tallies() + + local scores = { + create_UIBox_high_scores_row("hand"), + create_UIBox_high_scores_row("furthest_round"), + create_UIBox_high_scores_row("furthest_ante"), + create_UIBox_high_scores_row("poker_hand"), + create_UIBox_high_scores_row("most_money"), + create_UIBox_high_scores_row("win_streak"), + } + G.focused_profile = G.SETTINGS.profile + local cheevs = {} + + local t = create_UIBox_generic_options({ back_func = 'options', snap_back = true, contents = { + {n=G.UIT.C, config={align = "cm", minw = 3, padding = 0.2, r = 0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes= + scores + }, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.CLEAR}, nodes={ + create_progress_box(), + UIBox_button({button = 'usage', label = {localize('k_card_stats')}, minw = 7.5, minh =1, focus_args = {nav = 'wide'}}), + }}, + not G.F_NO_ACHIEVEMENTS and {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.CLEAR}, nodes=cheevs} or nil + }}) + + return t +end + +function create_progress_box(_profile_progress, smaller) + local rows, protos = {}, {'collection', 'challenges', 'joker_stickers', 'deck_stake_wins'} + _profile_progress = _profile_progress or G.PROFILES[G.SETTINGS.profile].progress + + + _profile_progress.overall_tally, _profile_progress.overall_of = + _profile_progress.discovered.tally/_profile_progress.discovered.of + + _profile_progress.deck_stakes.tally/_profile_progress.deck_stakes.of + + _profile_progress.joker_stickers.tally/_profile_progress.joker_stickers.of + + _profile_progress.challenges.tally/_profile_progress.challenges.of, + 4 + + local text_scale = smaller and 0.7 or 1 + local bar_colour = G.PROFILES[G.focused_profile].all_unlocked and G.C.RED or G.C.BLUE + + for _, v in ipairs(protos) do + local tab, val, max = nil,nil,nil + if v == 'collection' then + tab, val, max = _profile_progress.discovered, 'tally', _profile_progress.discovered.of + elseif v == 'deck_stake_wins' then + tab, val, max = _profile_progress.deck_stakes, 'tally', _profile_progress.deck_stakes.of + elseif v == 'joker_stickers' then + tab, val, max = _profile_progress.joker_stickers, 'tally', _profile_progress.joker_stickers.of + elseif v == 'challenges' then + tab, val, max = _profile_progress.challenges, 'tally', _profile_progress.challenges.of + end + local filling = v == 'collection' and { + {n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.discovered.tally/_profile_progress.discovered.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}}, + {n=G.UIT.T, config={text = " (".._profile_progress.discovered.tally..'/'.._profile_progress.discovered.of..")", scale = 0.35, colour = G.C.JOKER_GREY}} + } or v == 'deck_stake_wins' and { + {n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.deck_stakes.tally/_profile_progress.deck_stakes.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}}, + {n=G.UIT.T, config={text = " (".._profile_progress.deck_stakes.tally..'/'.._profile_progress.deck_stakes.of..")", scale = 0.35, colour = G.C.JOKER_GREY}} + } or v == 'joker_stickers' and { + {n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.joker_stickers.tally/_profile_progress.joker_stickers.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}}, + {n=G.UIT.T, config={text = " (".._profile_progress.joker_stickers.tally..'/'.._profile_progress.joker_stickers.of..")", scale = 0.35, colour = G.C.JOKER_GREY}} + } or v == 'challenges' and { + {n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.challenges.tally/_profile_progress.challenges.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}}, + {n=G.UIT.T, config={text = " (".._profile_progress.challenges.tally..'/'.._profile_progress.challenges.of..")", scale = 0.35, colour = G.C.JOKER_GREY}} + } + + rows[#rows+1] = {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 3.5*text_scale, maxw = 3.5*text_scale}, nodes={ + {n=G.UIT.T, config={text = localize('k_'..v), scale = 0.5*text_scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cl", minh =smaller and 0.5 or 0.8, r = 0.1, minw = 3.5*text_scale, colour = G.C.BLACK, emboss = 0.05, + progress_bar = { + max = max, ref_table = tab, ref_value = val, empty_col = G.C.BLACK, filled_col = adjust_alpha(bar_colour, 0.5) + }}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 3.5*text_scale}, nodes=filling}, + }}, + }} + end + + return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 3.5*text_scale, maxw = 3.5*text_scale}, nodes={ + {n=G.UIT.T, config={text = localize('k_progress'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cl", minh = 0.6, r = 0.1, minw = 3.5*text_scale, colour = G.C.BLACK, emboss = 0.05, + progress_bar = { + max = _profile_progress.overall_of, ref_table = _profile_progress, ref_value = 'overall_tally', empty_col = G.C.BLACK, filled_col = adjust_alpha(bar_colour, 0.5) + }}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 3.5*text_scale}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.overall_tally/_profile_progress.overall_of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55})}}, + }}, + }} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes=rows}, + }} +end + +function create_UIBox_high_scores_row(score) + if not G.PROFILES[G.SETTINGS.profile].high_scores[score] then return nil end + local label_scale = 0.65 - 0.025*math.max(string.len(G.PROFILES[G.SETTINGS.profile].high_scores[score].label)-8, 0) + local label_w, score_w, h = 3.5, 4, 0.8 + local score_tab = {} + + if score == 'poker_hand' then + local handname, amount = localize('k_none'), 0 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].hand_usage) do if v.count > amount then handname = v.order; amount = v.count end end + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {amount < 1 and handname or localize(handname,'poker_hands')}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55})}}, + {n=G.UIT.T, config={text = " ("..amount..")", scale = 0.45, colour = G.C.JOKER_GREY}} + } + elseif score == 'most_money' then + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {localize('$')..number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.MONEY},shadow = true, float = true, scale = score_number_scale(0.85, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)})}}, + } + elseif score == 'win_streak' then + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.WHITE},shadow = true, float = true, scale = score_number_scale(0.85, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)})}}, + {n=G.UIT.T, config={text = " ("..G.PROFILES[G.SETTINGS.profile].high_scores["current_streak"].amt..")", scale = 0.45, colour = G.C.JOKER_GREY}} + } + elseif score == 'hand' then + local chip_sprite = Sprite(0,0,0.4,0.4,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0}) + chip_sprite.states.drag.can = false + score_tab = { + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={w=0.4,h=0.4 , object = chip_sprite}} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.RED},shadow = true, float = true, scale = math.min(0.75, score_number_scale(1.5, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt))})}}, + }}, + } + elseif score == 'collection' then + score_tab = { + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {'%'..math.floor(0.01+100*G.PROFILES[G.SETTINGS.profile].high_scores[score].amt/G.PROFILES[G.SETTINGS.profile].high_scores[score].tot)}, colours = {G.C.WHITE},shadow = true, float = true, scale = math.min(0.75, score_number_scale(1.5, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt))})}}, + {n=G.UIT.T, config={text = " ("..G.PROFILES[G.SETTINGS.profile].high_scores[score].amt..'/'..G.PROFILES[G.SETTINGS.profile].high_scores[score].tot..")", scale = 0.45, colour = G.C.JOKER_GREY}} + }}, + } + else + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.FILTER},shadow = true, float = true, scale = score_number_scale(0.85, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)})}}, + } + end + return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, minw = label_w, maxw = label_w}, nodes={ + {n=G.UIT.T, config={text = localize(score, 'high_scores'), scale = label_scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cl", minh = h, r = 0.1, minw = score_w, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = score_w, maxw = score_w}, nodes=score_tab}, + }}, + }} +end + +function create_UIBox_win() + local show_lose_cta = false + local eased_green = copy_table(G.C.GREEN) + eased_green[4] = 0 + ease_value(eased_green, 4, 0.5, nil, nil, true) + local t = create_UIBox_generic_options({ padding = 0, bg_colour = eased_green , colour = G.C.BLACK, outline_colour = G.C.EDITION, no_back = true, no_esc = true, contents = { + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_you_win')}, colours = {G.C.EDITION},shadow = true, float = true, spacing = 10, rotate = true, scale = 1.5, pop_in = 0.4, maxw = 6.5})}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.15}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('hand'), + create_UIBox_round_scores_row('poker_hand'), + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('cards_played', G.C.BLUE), + create_UIBox_round_scores_row('cards_discarded', G.C.RED), + create_UIBox_round_scores_row('cards_purchased', G.C.MONEY), + create_UIBox_round_scores_row('times_rerolled', G.C.GREEN), + create_UIBox_round_scores_row('new_collection', G.C.WHITE), + create_UIBox_round_scores_row('seed', G.C.WHITE), + UIBox_button({button = 'copy_seed', label = {localize('b_copy')}, colour = G.C.BLUE, scale = 0.3, minw = 2.3, minh = 0.4,}), + }}, + {n=G.UIT.C, config={align = "tr", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('furthest_ante', G.C.FILTER), + create_UIBox_round_scores_row('furthest_round', G.C.FILTER), + {n=G.UIT.R, config={align = "cm", minh = 0.4, minw = 0.1}, nodes={}}, + show_win_cta and UIBox_button({id = 'win_cta', button = 'show_main_cta', label = {localize('b_next')}, colour = G.C.GREEN, scale = 0.8, minw = 2.5, minh = 2.5, focus_args = {nav = 'wide', snap_to = true}}) or nil, + not show_win_cta and UIBox_button({id = 'from_game_won', button = 'notify_then_setup_run', label = {localize('b_start_new_run')}, minw = 2.5, maxw = 2.5, minh = 1, focus_args = {nav = 'wide', snap_to = true}}) or nil, + not show_win_cta and {n=G.UIT.R, config={align = "cm", minh = 0.2, minw = 0.1}, nodes={}} or nil, + not show_win_cta and UIBox_button({button = 'go_to_menu', label = {localize('b_main_menu')}, minw = 2.5, maxw = 2.5, minh = 1, focus_args = {nav = 'wide'}}) or nil, + }} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.08}, nodes={ + UIBox_button({button = 'exit_overlay_menu', label = {localize('b_endless')}, minw = 6.5, maxw = 5, minh = 1.2, scale = 0.7, shadow = true, colour = G.C.BLUE, focus_args = {nav = 'wide', button = 'x',set_button_pip = true}}), + }}, + }} + }} + }}) + t.nodes[1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 2}, nodes={ + {n=G.UIT.O, config={padding = 0, id = 'jimbo_spot', object = Moveable(0,0,G.CARD_W*1.1, G.CARD_H*1.1)}}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={t.nodes[1]} + }} + } + --t.nodes[1].config.mid = true + t.config.id = 'you_win_UI' + return t +end + +function create_UIBox_exit_CTA() + + local t = create_UIBox_generic_options({ back_label = 'Quit Game', back_func = 'quit' , colour = G.C.BLACK, back_colour = G.C.RED, padding = 0, contents = { + {n=G.UIT.C, config={align = "tm", padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_demo_thanks_1')}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.9})}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_demo_thanks_2')}, colours = {G.C.WHITE},shadow = true, bump = true, rotate = true, pop_in = 0.2, scale = 1.4})}}, + }}, + {n=G.UIT.R, config={align = "tm", padding = 0.12, emboss = 0.1, colour = G.C.L_BLACK, r = 0.1}, nodes={ + simple_text_container('ml_demo_thanks_message',{colour = G.C.UI.TEXT_LIGHT, scale = 0.55, shadow = true}), + {n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={ + UIBox_button({button = 'wishlist_steam', label = {localize('b_wishlist')}, minw = 5.9, minh = 1.1, scale = 0.5, shadow = true, colour = G.C.GREEN, focus_args = {nav = 'wide', button = 'x',set_button_pip = true, snap_to = true}}), + UIBox_button({button = 'go_to_playbalatro', label = {localize('b_playbalatro')}, minw = 4.9, minh = 0.8, scale = 0.4, shadow = true, colour = G.C.BLUE, focus_args = {nav = 'wide', button = 'y',set_button_pip = true}}), + }}, + }}, + }} + }}) + t.nodes[2] = t.nodes[1] + t.nodes[1] = {n=G.UIT.C, config={align = "cm", padding = 2}, nodes={ + {n=G.UIT.O, config={padding = 0, id = 'jimbo_spot', object = Moveable(0,0,G.CARD_W*1.1, G.CARD_H*1.1)}}, + }} + --t.nodes[1].config.mid = true + return t +end + +function create_UIBox_small_cta() + return {n=G.UIT.ROOT, config={align = "cm", minw = 4, minh = 3}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_demo_thanks_1')}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.3})}}, + }} +end + +function create_UIBox_demo_video_CTA() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 21.7, + blockable = false, + blocking = false, + func = (function() + G.exception_queue = 'other' + G.FUNCS.go_to_demo_cta() + G.exception_queue = nil + return true + end)}), 'other') + + RESTART_MUSIC() + + local video_file = love.graphics.newVideo('resources/democta.ogv') + local vid_sprite = Sprite(0,0,11*16/9,11,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0}) + video_file:getSource():setVolume(G.SETTINGS.SOUND.volume*G.SETTINGS.SOUND.game_sounds_volume/(100*100)) + vid_sprite.video = video_file + video_file:play() + + local t = create_UIBox_generic_options({ back_delay = 7, back_label = localize('b_skip'), back_func = 'go_to_demo_cta' , colour = G.C.BLACK, padding = 0, contents = { + {n=G.UIT.O, config={object = vid_sprite}}, + }}) + return t +end + +function create_UIBox_game_over() + local show_lose_cta = false + + + local eased_red = copy_table(G.GAME.round_resets.ante <= G.GAME.win_ante and G.C.RED or G.C.BLUE) + eased_red[4] = 0 + ease_value(eased_red, 4, 0.8, nil, nil, true) + local t = create_UIBox_generic_options({ bg_colour = eased_red ,no_back = true, padding = 0, contents = { + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_game_over')}, colours = {G.C.RED},shadow = true, float = true, scale = 1.5, pop_in = 0.4, maxw = 6.5})}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.15}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.BLACK, emboss = 0.05, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('hand'), + create_UIBox_round_scores_row('poker_hand'), + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('cards_played', G.C.BLUE), + create_UIBox_round_scores_row('cards_discarded', G.C.RED), + create_UIBox_round_scores_row('cards_purchased', G.C.MONEY), + create_UIBox_round_scores_row('times_rerolled', G.C.GREEN), + create_UIBox_round_scores_row('new_collection', G.C.WHITE), + create_UIBox_round_scores_row('seed', G.C.WHITE), + UIBox_button({button = 'copy_seed', label = {localize('b_copy')}, colour = G.C.BLUE, scale = 0.3, minw = 2.3, minh = 0.4, focus_args = {nav = 'wide'}}), + }}, + {n=G.UIT.C, config={align = "tr", padding = 0.08}, nodes={ + create_UIBox_round_scores_row('furthest_ante', G.C.FILTER), + create_UIBox_round_scores_row('furthest_round', G.C.FILTER), + create_UIBox_round_scores_row('defeated_by'), + }} + }} + }}, + show_lose_cta and + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={id = 'lose_cta', align = "cm", minw = 5, padding = 0.1, r = 0.1, hover = true, colour = G.C.GREEN, button = "show_main_cta", shadow = true}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.T, config={text = localize('b_next'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, focus_args = {nav = 'wide', snap_to = true}}} + }} + }} + }} or + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R, config={id = 'from_game_over', align = "cm", minw = 5, padding = 0.1, r = 0.1, hover = true, colour = G.C.RED, button = "notify_then_setup_run", shadow = true, focus_args = {nav = 'wide', snap_to = true}}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true, maxw = 4.8}, nodes={ + {n=G.UIT.T, config={text = localize('b_start_new_run'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}} + }} + }}, + {n=G.UIT.R, config={align = "cm", minw = 5, padding = 0.1, r = 0.1, hover = true, colour = G.C.RED, button = "go_to_menu", shadow = true, focus_args = {nav = 'wide'}}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true, maxw = 4.8}, nodes={ + {n=G.UIT.T, config={text = localize('b_main_menu'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}} + }} + }} + }} + }}, + }} +}}) + t.nodes[1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 2}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={padding = 0, id = 'jimbo_spot', object = Moveable(0,0,G.CARD_W*1.1, G.CARD_H*1.1)}}, + }}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={t.nodes[1]}}} +} + + --t.nodes[1].config.mid = true + return t +end + +function create_UIBox_round_scores_row(score, text_colour) + local label = G.GAME.round_scores[score] and localize('ph_score_'..score) or '' + local check_high_score = false + local score_tab = {} + local label_w, score_w, h = ({hand=true,poker_hand=true})[score] and 3.5 or 2.9, ({hand=true,poker_hand=true})[score] and 3.5 or 1, 0.5 + + if score == 'furthest_ante' then + label_w = 1.9 + check_high_score = true + label = localize('k_ante') + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round_resets.ante)}, colours = {text_colour or G.C.FILTER},shadow = true, float = true, scale = 0.45})}}, + } + end + if score == 'furthest_round' then + label_w = 1.9 + check_high_score = true + label = localize('k_round') + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round)}, colours = {text_colour or G.C.FILTER},shadow = true, float = true, scale = 0.45})}}, + } + end + if score == 'seed' then + label_w = 1.9 + score_w = 1.9 + label = localize('k_seed') + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {G.GAME.pseudorandom.seed}, colours = {text_colour or G.C.WHITE},shadow = true, float = true, scale = 0.45})}}, + } + end + if score == 'defeated_by' then + label = localize('k_defeated_by') + local blind_choice = {config = G.GAME.blind.config.blind or G.P_BLINDS.bl_small} + blind_choice.animation = AnimatedSprite(0,0, 1.4, 1.4, G.ANIMATION_ATLAS['blind_chips'], blind_choice.config.pos) + blind_choice.animation:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + + score_tab = { + {n=G.UIT.R, config={align = "cm", minh = 0.6}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = localize{type ='name_text', key = blind_choice.config.key, set = 'Blind'}, colours = {G.C.WHITE},shadow = true, float = true,maxw = 2.2, scale = 0.45})}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.O, config={object = blind_choice.animation}} + }}, + } + end + + local label_scale = 0.5 + + if score == 'poker_hand' then + local handname, amount = localize('k_none'), 0 + for k, v in pairs(G.GAME.hand_usage) do if v.count > amount then handname = v.order; amount = v.count end end + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {amount <1 and handname or localize(handname,'poker_hands')}, colours = {text_colour or G.C.WHITE},shadow = true, float = true, scale = 0.45, maxw = 2.5})}}, + {n=G.UIT.T, config={text = " ("..amount..")", scale = 0.35, colour = G.C.JOKER_GREY}} + } + elseif score == 'hand' then + check_high_score = true + local chip_sprite = Sprite(0,0,0.3,0.3,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0}) + chip_sprite.states.drag.can = false + score_tab = { + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={w=0.3,h=0.3 , object = chip_sprite}} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round_scores[score].amt)}, colours = {text_colour or G.C.RED},shadow = true, float = true, scale = math.min(0.6, score_number_scale(1.2, G.GAME.round_scores[score].amt))})}}, + }}, + } + elseif G.GAME.round_scores[score] and not score_tab[1] then + score_tab = { + {n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round_scores[score].amt)}, colours = {text_colour or G.C.FILTER},shadow = true, float = true, scale = score_number_scale(0.6, G.GAME.round_scores[score].amt)})}}, + } + end + return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05, func = check_high_score and 'high_score_alert' or nil, id = score}, nodes={ + {n=score=='defeated_by' and G.UIT.R or G.UIT.C, config={align = "cm", padding = 0.02, minw = label_w, maxw = label_w}, nodes={ + {n=G.UIT.T, config={text = label, scale = label_scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=score=='defeated_by' and G.UIT.R or G.UIT.C, config={align = "cr"}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = h, r = 0.1, minw = score=='defeated_by' and label_w or score_w, colour = (score == 'seed' and G.GAME.seeded) and G.C.RED or G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = score_w}, nodes=score_tab}, + }} + }}, + }} +end + +function create_UIBox_hand_tip(handname) + if not G.GAME.hands[handname].example then return {n=G.UIT.R, config={align = "cm"},nodes = {}} end + local cardarea = CardArea( + 2,2, + 3.5*G.CARD_W, + 0.75*G.CARD_H, + {card_limit = 5, type = 'title', highlight_limit = 0}) + for k, v in ipairs(G.GAME.hands[handname].example) do + local card = Card(0,0, 0.5*G.CARD_W, 0.5*G.CARD_H, G.P_CARDS[v[1]], G.P_CENTERS.c_base) + if v[2] then card:juice_up(0.3, 0.2) end + if k == 1 then play_sound('paper1',0.95 + math.random()*0.1, 0.3) end + ease_value(card.T, 'scale',v[2] and 0.25 or -0.15,nil,'REAL',true,0.2) + cardarea:emplace(card) + end + + return {n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, r = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = cardarea}} + }} + }} +end + +function create_UIBox_current_hand_row(handname, simple) + return (G.GAME.hands[handname].visible) and + (not simple and + {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05, hover = true, force_focus = true, on_demand_tooltip = {text = localize(handname, 'poker_hand_descriptions'), filler = {func = create_UIBox_hand_tip, args = handname}}}, nodes={ + {n=G.UIT.C, config={align = "cl", padding = 0, minw = 5}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.01, r = 0.1, colour = G.C.HAND_LEVELS[math.min(7, G.GAME.hands[handname].level)], minw = 1.5, outline = 0.8, outline_colour = G.C.WHITE}, nodes={ + {n=G.UIT.T, config={text = localize('k_level_prefix')..G.GAME.hands[handname].level, scale = 0.5, colour = G.C.UI.TEXT_DARK}} + }}, + {n=G.UIT.C, config={align = "cm", minw = 4.5, maxw = 4.5}, nodes={ + {n=G.UIT.T, config={text = ' '..localize(handname,'poker_hands'), scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLACK,r = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cr", padding = 0.01, r = 0.1, colour = G.C.CHIPS, minw = 1.1}, nodes={ + {n=G.UIT.T, config={text = G.GAME.hands[handname].chips, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}, + {n=G.UIT.B, config={w = 0.08, h = 0.01}} + }}, + {n=G.UIT.T, config={text = "X", scale = 0.45, colour = G.C.MULT}}, + {n=G.UIT.C, config={align = "cl", padding = 0.01, r = 0.1, colour = G.C.MULT, minw = 1.1}, nodes={ + {n=G.UIT.B, config={w = 0.08,h = 0.01}}, + {n=G.UIT.T, config={text = G.GAME.hands[handname].mult, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}} + }} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = ' #', scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.L_BLACK,r = 0.1, minw = 0.9}, nodes={ + {n=G.UIT.T, config={text = G.GAME.hands[handname].played, scale = 0.45, colour = G.C.FILTER, shadow = true}}, + }} + }} + or {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), force_focus = true, emboss = 0.05, hover = true, on_demand_tooltip = {text = localize(handname, 'poker_hand_descriptions'), filler = {func = create_UIBox_hand_tip, args = handname}}, focus_args = {snap_to = (simple and handname == 'Straight Flush')}}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0, minw = 5}, nodes={ + {n=G.UIT.T, config={text = localize(handname,'poker_hands'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }}) + or nil +end + +function create_UIBox_current_hands(simple) + local hands = { + create_UIBox_current_hand_row("Flush Five", simple), + create_UIBox_current_hand_row("Flush House", simple), + create_UIBox_current_hand_row("Five of a Kind", simple), + create_UIBox_current_hand_row("Straight Flush", simple), + create_UIBox_current_hand_row("Four of a Kind", simple), + create_UIBox_current_hand_row("Full House", simple), + create_UIBox_current_hand_row("Flush", simple), + create_UIBox_current_hand_row("Straight", simple), + create_UIBox_current_hand_row("Three of a Kind", simple), + create_UIBox_current_hand_row("Two Pair", simple), + create_UIBox_current_hand_row("Pair", simple), + create_UIBox_current_hand_row("High Card", simple) + } + + local t = {n=G.UIT.ROOT, config={align = "cm", minw = 3, padding = 0.1, r = 0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes= + hands + }, + }} + + return t +end + +function G.UIDEF.deck_info(_show_remaining) + return create_UIBox_generic_options({contents ={create_tabs( + {tabs = _show_remaining and { + { + label = localize('b_remaining'), + chosen = true, + tab_definition_function = G.UIDEF.view_deck, + tab_definition_function_args = true, + }, + { + label = localize('b_full_deck'), + tab_definition_function = G.UIDEF.view_deck + }, + } or { + { + label = localize('b_full_deck'), + chosen = true, + tab_definition_function = G.UIDEF.view_deck + }, + }, + tab_h = 8, + snap_to_nav = true})}}) +end + +function G.UIDEF.run_info() + return create_UIBox_generic_options({contents ={create_tabs( + {tabs = { + { + label = localize('b_poker_hands'), + chosen = true, + tab_definition_function = create_UIBox_current_hands, + }, + { + label = localize('b_blinds'), + tab_definition_function = G.UIDEF.current_blinds, + }, + { + label = localize('b_vouchers'), + tab_definition_function = G.UIDEF.used_vouchers, + }, + G.GAME.stake > 1 and { + label = localize('b_stake'), + tab_definition_function = G.UIDEF.current_stake, + } or nil, + }, + tab_h = 8, + snap_to_nav = true})}}) +end + +function G.UIDEF.current_blinds() + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR, padding = 0.2}, nodes={ + G.GAME.round_resets.blind_states['Small'] ~= 'Hide' and {n=G.UIT.C, config={align = "tm", padding = 0.1, outline = 2, r = 0.1, line_emboss = 0.2, outline_colour = G.C.BLACK}, nodes={ + create_UIBox_blind_choice('Small', true) + }} or nil, + G.GAME.round_resets.blind_states['Big'] ~= 'Hide' and {n=G.UIT.C, config={align = "tm", padding = 0.1, outline = 2, r = 0.1, line_emboss = 0.2, outline_colour = G.C.BLACK}, nodes={ + create_UIBox_blind_choice('Big', true) + }} or nil, + G.GAME.round_resets.blind_states['Boss'] ~= 'Hide' and {n=G.UIT.C, config={align = "tm", padding = 0.1, outline = 2, r = 0.1, line_emboss = 0.2, outline_colour = G.C.BLACK}, nodes={ + create_UIBox_blind_choice('Boss', true) + }} or nil + }} +end + +function G.UIDEF.deck_stake_column(_deck_key) + local deck_usage = G.PROFILES[G.SETTINGS.profile].deck_usage[_deck_key] + local stake_col = {} + local valid_option = nil + for i = #G.P_CENTER_POOLS['Stake'], 1, -1 do + local _wins = deck_usage and deck_usage.wins[i] or 0 + if (deck_usage and deck_usage.wins[i-1]) or i == 1 or G.PROFILES[G.SETTINGS.profile].all_unlocked then valid_option = true end + stake_col[#stake_col+1] = {n=G.UIT.R, config={id = i, align = "cm", colour = _wins > 0 and G.C.GREY or G.C.CLEAR, outline = 0, outline_colour = G.C.WHITE, r = 0.1, minh = 0.25, minw = valid_option and 0.45 or 0.25, func = 'RUN_SETUP_check_back_stake_highlight'}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = valid_option and 0.17 or 0.13, minw = valid_option and 0.37 or 0.13, colour = _wins > 0 and get_stake_col(i) or G.C.UI.TRANSPARENT_LIGHT, r = 0.1},nodes={}} + }} + if i > 1 then stake_col[#stake_col+1] = {n=G.UIT.R, config={align = "cm", minh = 0.1, minw = 0.04},nodes={}} end + end + return {n=G.UIT.ROOT, config={align = 'cm', colour = G.C.CLEAR}, nodes =stake_col} +end + +function G.UIDEF.current_stake() + local other_col = nil + if G.GAME.stake > 2 then + local stake_desc_rows = {{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = localize('k_also_applied'), scale = 0.4, colour = G.C.WHITE}} + }} + } + for i = G.GAME.stake-1, 2, -1 do + local _stake_desc = {} + local _stake_center = G.P_CENTER_POOLS.Stake[i] + localize{type = 'descriptions', key = _stake_center.key, set = _stake_center.set, nodes = _stake_desc} + local _full_desc = {} + for k, v in ipairs(_stake_desc) do + _full_desc[#_full_desc+1] = {n=G.UIT.R, config={align = "cm"}, nodes=v} + end + _full_desc[#_full_desc] = nil + stake_desc_rows[#stake_desc_rows+1] = {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = 'cm'}, nodes ={{n=G.UIT.C, config={align = "cm", colour = get_stake_col(i), r = 0.1, minh = 0.35, minw = 0.35, emboss = 0.05}, nodes={}}, {n=G.UIT.B, config={w=0.1,h=0.1}}}}, + {n=G.UIT.C, config={align = "cm", padding = 0.03, colour = G.C.WHITE, r = 0.1, minh = 0.7, minw = 4.8}, nodes=_full_desc}, + }} + end + other_col = {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.L_BLACK}, nodes=stake_desc_rows} + end + + local stake_sprite = get_stake_sprite(G.GAME.stake, 0.8) + local _stake_desc = {} + local _stake_center = G.P_CENTER_POOLS.Stake[G.GAME.stake] + localize{type = 'descriptions', key = _stake_center.key, set = _stake_center.set, nodes = _stake_desc} + local _full_desc = {} + for k, v in ipairs(_stake_desc) do + _full_desc[#_full_desc+1] = {n=G.UIT.R, config={align = "cm"}, nodes=v} + end + _full_desc[#_full_desc] = nil + local current_col = {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, minw = 4}, nodes={ + {n=G.UIT.O, config={colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}}, + {n=G.UIT.T, config={text = localize{type = 'name_text', key = G.P_CENTER_POOLS.Stake[G.GAME.stake].key, set = 'Stake'}, scale = 0.45, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = get_stake_col(G.GAME.stake), r = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.WHITE, r = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.03, minh = 0.7, minw = 3.8}, nodes=_full_desc} + }} + }} + }} + + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, r = 0.1, padding = 0.1}, nodes={ + current_col,other_col + }} +end + +function G.UIDEF.view_deck(unplayed_only) + local deck_tables = {} + remove_nils(G.playing_cards) + G.VIEWING_DECK = true + table.sort(G.playing_cards, function (a, b) return a:get_nominal('suit') > b:get_nominal('suit') end ) + local SUITS = { + Spades = {}, + Hearts = {}, + Clubs = {}, + Diamonds = {}, + } + local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'} + for k, v in ipairs(G.playing_cards) do + table.insert(SUITS[v.base.suit], v) + end + for j = 1, 4 do + if SUITS[suit_map[j]][1] then + local view_deck = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 6.5*G.CARD_W, + 0.6*G.CARD_H, + {card_limit = #SUITS[suit_map[j]], type = 'title', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.7, draw_layers = {'card'}}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = view_deck}} + }} + ) + + for i = 1, #SUITS[suit_map[j]] do + if SUITS[suit_map[j]][i] then + local greyed, _scale = nil, 0.7 + if unplayed_only and not ((SUITS[suit_map[j]][i].area and SUITS[suit_map[j]][i].area == G.deck) or SUITS[suit_map[j]][i].ability.wheel_flipped) then + greyed = true + end + local copy = copy_card(SUITS[suit_map[j]][i],nil, _scale) + copy.greyed = greyed + copy.T.x = view_deck.T.x + view_deck.T.w/2 + copy.T.y = view_deck.T.y + + copy:hard_set_T() + view_deck:emplace(copy) + end + end + end + end + + local flip_col = G.C.WHITE + + local suit_tallies = {['Spades'] = 0, ['Hearts'] = 0, ['Clubs'] = 0, ['Diamonds'] = 0} + local mod_suit_tallies = {['Spades'] = 0, ['Hearts'] = 0, ['Clubs'] = 0, ['Diamonds'] = 0} + local rank_tallies = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + local mod_rank_tallies = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} + local rank_name_mapping = {2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A'} + local face_tally = 0 + local mod_face_tally = 0 + local num_tally = 0 + local mod_num_tally = 0 + local ace_tally = 0 + local mod_ace_tally = 0 + local wheel_flipped = 0 + + for k, v in ipairs(G.playing_cards) do + if v.ability.name ~= 'Stone Card' and (not unplayed_only or ((v.area and v.area == G.deck) or v.ability.wheel_flipped)) then + if v.ability.wheel_flipped and unplayed_only then wheel_flipped = wheel_flipped + 1 end + --For the suits + suit_tallies[v.base.suit] = (suit_tallies[v.base.suit] or 0) + 1 + mod_suit_tallies['Spades'] = (mod_suit_tallies['Spades'] or 0) + (v:is_suit('Spades') and 1 or 0) + mod_suit_tallies['Hearts'] = (mod_suit_tallies['Hearts'] or 0) + (v:is_suit('Hearts') and 1 or 0) + mod_suit_tallies['Clubs'] = (mod_suit_tallies['Clubs'] or 0) + (v:is_suit('Clubs') and 1 or 0) + mod_suit_tallies['Diamonds'] = (mod_suit_tallies['Diamonds'] or 0) + (v:is_suit('Diamonds') and 1 or 0) + + --for face cards/numbered cards/aces + local card_id = v:get_id() + face_tally = face_tally + ((card_id ==11 or card_id ==12 or card_id ==13) and 1 or 0) + mod_face_tally = mod_face_tally + (v:is_face() and 1 or 0) + if card_id > 1 and card_id < 11 then + num_tally = num_tally + 1 + if not v.debuff then mod_num_tally = mod_num_tally + 1 end + end + if card_id == 14 then + ace_tally = ace_tally + 1 + if not v.debuff then mod_ace_tally = mod_ace_tally + 1 end + end + + --ranks + rank_tallies[card_id - 1] = rank_tallies[card_id - 1] + 1 + if not v.debuff then mod_rank_tallies[card_id - 1] = mod_rank_tallies[card_id - 1] + 1 end + end + end + + local modded = (face_tally ~= mod_face_tally) or + (mod_suit_tallies['Spades'] ~= suit_tallies['Spades']) or + (mod_suit_tallies['Hearts'] ~= suit_tallies['Hearts']) or + (mod_suit_tallies['Clubs'] ~= suit_tallies['Clubs']) or + (mod_suit_tallies['Diamonds'] ~= suit_tallies['Diamonds']) + + if wheel_flipped > 0 then flip_col = mix_colours(G.C.FILTER, G.C.WHITE,0.7) end + + local rank_cols = {} + for i = 13, 1, -1 do + local mod_delta = mod_rank_tallies[i] ~= rank_tallies[i] + rank_cols[#rank_cols+1] = {n=G.UIT.R, config={align = "cm", padding = 0.07}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, padding = 0.04, emboss = 0.04, minw = 0.5, colour = G.C.L_BLACK}, nodes={ + {n=G.UIT.T, config={text = rank_name_mapping[i],colour = G.C.JOKER_GREY, scale = 0.35, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cr", minw = 0.4}, nodes={ + mod_delta and {n=G.UIT.O, config={object = DynaText({string = {{string = ''..rank_tallies[i], colour = flip_col},{string =''..mod_rank_tallies[i], colour = G.C.BLUE}}, colours = {G.C.RED}, scale = 0.4, y_offset = -2, silent = true, shadow = true, pop_in_rate = 10, pop_delay = 4})}} or + {n=G.UIT.T, config={text = rank_tallies[i] or 'NIL',colour = flip_col, scale = 0.45, shadow = true}}, + }} + }} + end + + + local t = + {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={}}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 1.5, minh = 2, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, colour = G.C.L_BLACK, emboss = 0.05, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = G.GAME.selected_back.loc_name, colours = {G.C.WHITE}, bump = true, rotate = true, shadow = true, scale = 0.6 - string.len(G.GAME.selected_back.loc_name)*0.01})}}, + }}, + {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.1, minw = 2.5, minh = 1.3, colour = G.C.WHITE, emboss = 0.05}, nodes={ + {n=G.UIT.O, config={object = UIBox{ + definition = G.GAME.selected_back:generate_UI(nil,0.7, 0.5, G.GAME.challenge), + config = {offset = {x=0,y=0}} + }}} + }} + }}, + {n=G.UIT.R, config={align = "cm", r = 0.1, outline_colour = G.C.L_BLACK, line_emboss = 0.05, outline = 1.5}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.07}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{string = localize('k_base_cards'), colour = G.C.RED}, modded and {string = localize('k_effective'), colour = G.C.BLUE} or nil}, colours = {G.C.RED}, silent = true,scale = 0.4,pop_in_rate = 10, pop_delay = 4})}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.1}, nodes={ + tally_sprite({x=1,y=0},{{string = ''..ace_tally, colour = flip_col},{string =''..mod_ace_tally, colour = G.C.BLUE}}, {localize('k_aces')}),--Aces + tally_sprite({x=2,y=0},{{string = ''..face_tally, colour = flip_col},{string =''..mod_face_tally, colour = G.C.BLUE}}, {localize('k_face_cards')}),--Face + tally_sprite({x=3,y=0},{{string = ''..num_tally, colour = flip_col},{string =''..mod_num_tally, colour = G.C.BLUE}}, {localize('k_numbered_cards')}),--Numbers + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.1}, nodes={ + tally_sprite({x=3,y=1}, {{string = ''..suit_tallies['Spades'], colour = flip_col},{string =''..mod_suit_tallies['Spades'], colour = G.C.BLUE}}, {localize('Spades', 'suits_plural')}), + tally_sprite({x=0,y=1}, {{string = ''..suit_tallies['Hearts'], colour = flip_col},{string =''..mod_suit_tallies['Hearts'], colour = G.C.BLUE}}, {localize('Hearts', 'suits_plural')}), + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.1}, nodes={ + tally_sprite({x=2,y=1}, {{string = ''..suit_tallies['Clubs'], colour = flip_col},{string =''..mod_suit_tallies['Clubs'], colour = G.C.BLUE}}, {localize('Clubs', 'suits_plural')}), + tally_sprite({x=1,y=1}, {{string = ''..suit_tallies['Diamonds'], colour = flip_col},{string =''..mod_suit_tallies['Diamonds'], colour = G.C.BLUE}}, {localize('Diamonds', 'suits_plural')}), + }}, + }} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes=rank_cols}, + {n=G.UIT.B, config={w = 0.1, h = 0.1}}, + }}, + {n=G.UIT.B, config={w = 0.2, h = 0.1}}, + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.8, padding = 0.05}, nodes={ + modded and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7)}, nodes = {}}, + {n=G.UIT.T, config={text =' '..localize('ph_deck_preview_effective'),colour = G.C.WHITE, scale =0.3}}, + }} or nil, + wheel_flipped > 0 and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = flip_col}, nodes = {}}, + {n=G.UIT.T, config={text =' '..(wheel_flipped > 1 and + localize{type = 'variable', key = 'deck_preview_wheel_plural', vars = {wheel_flipped}} or + localize{type = 'variable', key = 'deck_preview_wheel_singular', vars = {wheel_flipped}}),colour = G.C.WHITE, scale =0.3}}, + }} or nil, + }} + }} + return t +end + +function tally_sprite(pos, value, tooltip) + local text_colour = G.C.BLACK + if type(value) == "table" and value[1].string==value[2].string then + text_colour = value[1].colour or G.C.WHITE + value = value[1].string + end + local t_s = Sprite(0,0,0.5,0.5,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=pos.x or 0, y=pos.y or 0}) + t_s.states.drag.can = false + t_s.states.hover.can = false + t_s.states.collide.can = false + return + {n=G.UIT.C, config={align = "cm", padding = 0.07,force_focus = true, focus_args = {type = 'tally_sprite'}, tooltip = {text = tooltip}}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.04, emboss = 0.05, colour = G.C.JOKER_GREY}, nodes={ + {n=G.UIT.O, config={w=0.5,h=0.5 ,can_collide = false, object = t_s, tooltip = {text = tooltip}}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + type(value) == "table" and {n=G.UIT.O, config={object = DynaText({string = value, colours = {G.C.RED}, scale = 0.4, silent = true, shadow = true, pop_in_rate = 10, pop_delay = 4})}} or + {n=G.UIT.T, config={text = value or 'NIL',colour = text_colour, scale = 0.4, shadow = true}}, + }}, + }} +end + +function G.UIDEF.used_vouchers() + + local silent = false + local keys_used = {} + local area_count = 0 + local voucher_areas = {} + local voucher_tables = {} + local voucher_table_rows = {} + for k, v in ipairs(G.P_CENTER_POOLS["Voucher"]) do + local key = 1 + math.floor((k-0.1)/2) + keys_used[key] = keys_used[key] or {} + if G.GAME.used_vouchers[v.key] then + keys_used[key][#keys_used[key]+1] = v + end + end + for k, v in ipairs(keys_used) do + if next(v) then + area_count = area_count + 1 + end + end + for k, v in ipairs(keys_used) do + if next(v) then + if #voucher_areas == 5 or #voucher_areas == 10 then + table.insert(voucher_table_rows, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes=voucher_tables} + ) + voucher_tables = {} + end + voucher_areas[#voucher_areas + 1] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + (#v == 1 and 1 or 1.33)*G.CARD_W, + (area_count >=10 and 0.75 or 1.07)*G.CARD_H, + {card_limit = 2, type = 'voucher', highlight_limit = 0}) + for kk, vv in ipairs(v) do + local center = G.P_CENTERS[vv.key] + local card = Card(voucher_areas[#voucher_areas].T.x + voucher_areas[#voucher_areas].T.w/2, voucher_areas[#voucher_areas].T.y, G.CARD_W, G.CARD_H, nil, center, {bypass_discovery_center=true,bypass_discovery_ui=true,bypass_lock=true}) + card.ability.order = vv.order + card:start_materialize(nil, silent) + silent = true + voucher_areas[#voucher_areas]:emplace(card) + end + table.insert(voucher_tables, + {n=G.UIT.C, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = voucher_areas[#voucher_areas]}} + }} + ) + end + end + table.insert(voucher_table_rows, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes=voucher_tables} + ) + + + local t = silent and {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_vouchers_redeemed')}, colours = {G.C.UI.TEXT_LIGHT}, bump = true, scale = 0.6})}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.5}, nodes={ + }}, + {n=G.UIT.R, config={align = "cm", colour = G.C.BLACK, r = 1, padding = 0.15, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes=voucher_table_rows}, + }} + }} or + {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('ph_no_vouchers')}, colours = {G.C.UI.TEXT_LIGHT}, bump = true, scale = 0.6})}} + }} + return t +end + + + +function create_UIBox_your_collection() + set_discover_tallies() + G.E_MANAGER:add_event(Event({ + blockable = false, + func = function() + G.REFRESH_ALERTS = true + return true + end + })) + local t = create_UIBox_generic_options({ back_func = G.STAGE == G.STAGES.RUN and 'options' or 'exit_overlay_menu', contents = { + {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ + UIBox_button({button = 'your_collection_jokers', label = {localize('b_jokers')}, count = G.DISCOVER_TALLIES.jokers, minw = 5, minh = 1.7, scale = 0.6, id = 'your_collection_jokers'}), + UIBox_button({button = 'your_collection_decks', label = {localize('b_decks')}, count = G.DISCOVER_TALLIES.backs, minw = 5}), + UIBox_button({button = 'your_collection_vouchers', label = {localize('b_vouchers')}, count = G.DISCOVER_TALLIES.vouchers, minw = 5, id = 'your_collection_vouchers'}), + {n=G.UIT.R, config={align = "cm", padding = 0.1, r=0.2, colour = G.C.BLACK}, nodes={ + {n=G.UIT.C, config={align = "cm", maxh=2.9}, nodes={ + {n=G.UIT.T, config={text = localize('k_cap_consumables'), scale = 0.45, colour = G.C.L_BLACK, vert = true, maxh=2.2}}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ + UIBox_button({button = 'your_collection_tarots', label = {localize('b_tarot_cards')}, count = G.DISCOVER_TALLIES.tarots, minw = 4, id = 'your_collection_tarots', colour = G.C.SECONDARY_SET.Tarot}), + UIBox_button({button = 'your_collection_planets', label = {localize('b_planet_cards')}, count = G.DISCOVER_TALLIES.planets, minw = 4, id = 'your_collection_planets', colour = G.C.SECONDARY_SET.Planet}), + UIBox_button({button = 'your_collection_spectrals', label = {localize('b_spectral_cards')}, count = G.DISCOVER_TALLIES.spectrals, minw = 4, id = 'your_collection_spectrals', colour = G.C.SECONDARY_SET.Spectral}), + }} + }}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ + UIBox_button({button = 'your_collection_enhancements', label = {localize('b_enhanced_cards')}, minw = 5}), + UIBox_button({button = 'your_collection_seals', label = {localize('b_seals')}, minw = 5, id = 'your_collection_seals'}), + UIBox_button({button = 'your_collection_editions', label = {localize('b_editions')}, count = G.DISCOVER_TALLIES.editions, minw = 5, id = 'your_collection_editions'}), + UIBox_button({button = 'your_collection_boosters', label = {localize('b_booster_packs')}, count = G.DISCOVER_TALLIES.boosters, minw = 5, id = 'your_collection_boosters'}), + UIBox_button({button = 'your_collection_tags', label = {localize('b_tags')}, count = G.DISCOVER_TALLIES.tags, minw = 5, id = 'your_collection_tags'}), + UIBox_button({button = 'your_collection_blinds', label = {localize('b_blinds')}, count = G.DISCOVER_TALLIES.blinds, minw = 5, minh = 2.0, id = 'your_collection_blinds', focus_args = {snap_to = true}}), + }}, + + }}) + return t +end + +function create_UIBox_your_collection_jokers() + local deck_tables = {} + + G.your_collection = {} + for j = 1, 3 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 5*G.CARD_W, + 0.95*G.CARD_H, + {card_limit = 5, type = 'title', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0.07, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + local joker_options = {} + for i = 1, math.ceil(#G.P_CENTER_POOLS.Joker/(5*#G.your_collection)) do + table.insert(joker_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Joker/(5*#G.your_collection)))) + end + + for i = 1, 5 do + for j = 1, #G.your_collection do + local center = G.P_CENTER_POOLS["Joker"][i+(j-1)*5] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) + card.sticker = get_joker_win_sticker(center) + G.your_collection[j]:emplace(card) + end + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = joker_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_joker_page', current_option = 1, colour = G.C.RED, no_pips = true, focus_args = {snap_to = true, nav = 'wide'}}) + }} + }}) + return t +end + +function create_UIBox_your_collection_tarots() + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + (4.25+j)*G.CARD_W, + 1*G.CARD_H, + {card_limit = 4 + j, type = 'title', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + local tarot_options = {} + for i = 1, math.floor(#G.P_CENTER_POOLS.Tarot/11) do + table.insert(tarot_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.floor(#G.P_CENTER_POOLS.Tarot/11))) + end + + for j = 1, #G.your_collection do + for i = 1, 4+j do + local center = G.P_CENTER_POOLS["Tarot"][i+(j-1)*(5)] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = tarot_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_tarot_page', focus_args = {snap_to = true, nav = 'wide'},current_option = 1, colour = G.C.RED, no_pips = true}) + }} + }}) + return t +end + +function create_UIBox_your_collection_boosters() + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + (5.25)*G.CARD_W, + 1.3*G.CARD_H, + {card_limit = 4, type = 'title', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + local booster_options = {} + for i = 1, math.ceil(#G.P_CENTER_POOLS.Booster/8) do + table.insert(booster_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Booster/8))) + end + + for j = 1, #G.your_collection do + for i = 1, 4 do + local center = G.P_CENTER_POOLS["Booster"][i+(j-1)*4] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W*1.27, G.CARD_H*1.27, nil, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = booster_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_booster_page', focus_args = {snap_to = true, nav = 'wide'},current_option = 1, colour = G.C.RED, no_pips = true}) + }} + }}) + return t +end + +function create_UIBox_your_collection_planets() + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + (6.25)*G.CARD_W, + 1*G.CARD_H, + {card_limit = 6, type = 'title', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + for j = 1, #G.your_collection do + for i = 1, 6 do + local center = G.P_CENTER_POOLS["Planet"][i+(j-1)*(6)] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm", padding = 0.7}, nodes={}}, + }}) + return t +end + +function create_UIBox_your_collection_spectrals() + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + (3.25+j)*G.CARD_W, + 1*G.CARD_H, + {card_limit = 3+j, type = 'title', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + for j = 1, #G.your_collection do + for i = 1, 3+j do + local center = G.P_CENTER_POOLS["Spectral"][i+(j-1)*3 + j - 1] + + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + + local spectral_options = {} + for i = 1, math.floor(#G.P_CENTER_POOLS.Tarot/9) do + table.insert(spectral_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.floor(#G.P_CENTER_POOLS.Spectral/9))) + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + create_option_cycle({options = spectral_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_spectral_page', focus_args = {snap_to = true, nav = 'wide'},current_option = 1, colour = G.C.RED, no_pips = true}) + }}, + }}) + return t +end + +function create_UIBox_your_collection_vouchers(exit) + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 4.25*G.CARD_W, + 1*G.CARD_H, + {card_limit = 4, type = 'voucher', highlight_limit = 0, collection = true}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + local voucher_options = {} + for i = 1, math.ceil(#G.P_CENTER_POOLS.Voucher/(4*#G.your_collection)) do + table.insert(voucher_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Voucher/(4*#G.your_collection)))) + end + + for i = 1, 4 do + for j = 1, #G.your_collection do + local center = G.P_CENTER_POOLS["Voucher"][i+(j-1)*4] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) + card.ability.order = i+(j-1)*4 + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ back_func = exit or 'your_collection', contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_option_cycle({options = voucher_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_voucher_page', focus_args = {snap_to = true, nav = 'wide'}, current_option = 1, colour = G.C.RED, no_pips = true}) + }} + }}) + return t +end + +function create_UIBox_your_collection_seals(exit) + local deck_tables = {} + + G.your_collection = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 4.25*G.CARD_W, + 1.03*G.CARD_H, + {card_limit = 4, type = 'title', highlight_limit = 0}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection}} + }} + ) + + for k, v in ipairs(G.P_CENTER_POOLS['Seal']) do + local center = G.P_CENTERS.c_base + local card = Card(G.your_collection.T.x + G.your_collection.T.w/2, G.your_collection.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) + card:set_seal(v.key, true) + G.your_collection:emplace(card) + end + + local t = create_UIBox_generic_options({ infotip = localize('ml_edition_seal_enhancement_explanation'), back_func = exit or 'your_collection', snap_back = true, contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + }}) + return t +end + +function create_UIBox_your_collection_enhancements(exit) + local deck_tables = {} + + G.your_collection = {} + for j = 1, 2 do + G.your_collection[j] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 4.25*G.CARD_W, + 1.03*G.CARD_H, + {card_limit = 4, type = 'title', highlight_limit = 0}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[j]}} + }} + ) + end + + for i = 1, 4 do + for j = 1, #G.your_collection do + local center = G.P_CENTER_POOLS["Enhanced"][i+(j-1)*4] + local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) + G.your_collection[j]:emplace(card) + end + end + + local t = create_UIBox_generic_options({ infotip = localize('ml_edition_seal_enhancement_explanation'), back_func = exit or 'your_collection', snap_back = true, contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, + }}) + return t +end + +function create_UIBox_your_collection_editions() + G.your_collection = {} + G.your_collection[1] = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 5.3*G.CARD_W, + 1.03*G.CARD_H, + {card_limit = 5, type = 'title', highlight_limit = 0, collection = true}) + local deck_tables = + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.O, config={object = G.your_collection[1]}} + }} + + local editions = {'base', 'foil','holo','polychrome','negative'} + + for i = 1, 5 do + local card = Card(G.your_collection[1].T.x + G.your_collection[1].T.w/2, G.your_collection[1].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['e_'..editions[i]]) + card:start_materialize() + if G.P_CENTERS['e_'..editions[i]].discovered then card:set_edition({[editions[i]] = true}, true, true) end + G.your_collection[1]:emplace(card) + end + + INIT_COLLECTION_CARD_ALERTS() + + local t = create_UIBox_generic_options({ infotip = localize('ml_edition_seal_enhancement_explanation'), back_func = 'your_collection', snap_back = true, contents = { + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={deck_tables}}, + }}) + return t +end + +function create_UIBox_your_collection_decks() + G.GAME.viewed_back = Back(G.P_CENTERS.b_red) + + local area = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 1.2*G.CARD_W, + 1.2*G.CARD_H, + {card_limit = 52, type = 'deck', highlight_limit = 0}) + + for i = 1, 52 do + local card = Card(G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, G.CARD_W*1.2, G.CARD_H*1.2, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base, {playing_card = i, viewed_back = true}) + card.sprite_facing = 'back' + card.facing = 'back' + area:emplace(card) + if i == 52 then G.sticker_card = card; card.sticker = get_deck_win_sticker(G.GAME.viewed_back.effect.center) end + end + + local ordered_names = {} + for k, v in ipairs(G.P_CENTER_POOLS.Back) do + ordered_names[#ordered_names+1] = v.name + end + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + create_option_cycle({options = ordered_names, opt_callback = 'change_viewed_back', current_option = 1, colour = G.C.RED, w = 4.5, focus_args = {snap_to = true}, mid = + {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.2}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = area}} + }}, + {n=G.UIT.C, config={align = "tm", minw = 3.7, minh = 2.1, r = 0.1, colour = G.C.L_BLACK, padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", emboss = 0.1, r = 0.1, minw = 4, maxw = 4, minh = 0.6}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_back_name', object = Moveable()}}, + }}, + {n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, emboss = 0.1, minh = 2.2, r = 0.1}, nodes={ + {n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back', object = UIBox{definition = G.GAME.viewed_back:generate_UI(), config = {offset = {x=0,y=0}}}}} + }} + }}, + }}, + }}}), + }}) + return t +end + +function create_UIBox_your_collection_tags() + local tag_matrix = { + {},{},{},{}, + } + local tag_tab = {} + for k, v in pairs(G.P_TAGS) do + tag_tab[#tag_tab+1] = v + end + + table.sort(tag_tab, function (a, b) return a.order < b.order end) + + local tags_to_be_alerted = {} + for k, v in ipairs(tag_tab) do + local discovered = v.discovered + local temp_tag = Tag(v.key, true) + if not v.discovered then temp_tag.hide_ability = true end + local temp_tag_ui, temp_tag_sprite = temp_tag:generate_UI() + tag_matrix[math.ceil((k-1)/6+0.001)][1+((k-1)%6)] = {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + temp_tag_ui, + }} + if discovered and not v.alerted then + tags_to_be_alerted[#tags_to_be_alerted+1] = temp_tag_sprite + end + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + for _, v in ipairs(tags_to_be_alerted) do + v.children.alert = UIBox{ + definition = create_UIBox_card_alert(), + config = { align="tri", offset = {x = 0.1, y = 0.1}, parent = v} + } + v.children.alert.states.collide.can = false + end + return true + end) + })) + + + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { + {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK, padding = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[1]}, + {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[2]}, + {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[3]}, + {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[4]}, + }} + }} + }} + }}) + return t +end + +function create_UIBox_your_collection_blinds(exit) + local blind_matrix = { + {},{},{}, {}, {}, {} + } + local blind_tab = {} + for k, v in pairs(G.P_BLINDS) do + blind_tab[#blind_tab+1] = v + end + + table.sort(blind_tab, function (a, b) return a.order < b.order end) + + local blinds_to_be_alerted = {} + for k, v in ipairs(blind_tab) do + local discovered = v.discovered + local temp_blind = AnimatedSprite(0,0,1.3,1.3, G.ANIMATION_ATLAS['blind_chips'], discovered and v.pos or G.b_undiscovered.pos) + temp_blind:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + if k == 1 then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.CONTROLLER:snap_to{node = temp_blind} + return true + end) + })) + end + temp_blind.float = true + temp_blind.states.hover.can = true + temp_blind.states.drag.can = false + temp_blind.states.collide.can = true + temp_blind.config = {blind = v, force_focus = true} + if discovered and not v.alerted then + blinds_to_be_alerted[#blinds_to_be_alerted+1] = temp_blind + end + temp_blind.hover = function() + if not G.CONTROLLER.dragging.target or G.CONTROLLER.using_touch then + if not temp_blind.hovering and temp_blind.states.visible then + temp_blind.hovering = true + temp_blind.hover_tilt = 3 + temp_blind:juice_up(0.05, 0.02) + play_sound('chips1', math.random()*0.1 + 0.55, 0.12) + temp_blind.config.h_popup = create_UIBox_blind_popup(v, discovered) + temp_blind.config.h_popup_config ={align = 'cl', offset = {x=-0.1,y=0},parent = temp_blind} + Node.hover(temp_blind) + if temp_blind.children.alert then + temp_blind.children.alert:remove() + temp_blind.children.alert = nil + temp_blind.config.blind.alerted = true + G:save_progress() + end + end + end + temp_blind.stop_hover = function() temp_blind.hovering = false; Node.stop_hover(temp_blind); temp_blind.hover_tilt = 0 end + end + blind_matrix[math.ceil((k-1)/5+0.001)][1+((k-1)%5)] = {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + (k==6 or k ==16 or k == 26) and {n=G.UIT.B, config={h=0.2,w=0.5}} or nil, + {n=G.UIT.O, config={object = temp_blind, focus_with_object = true}}, + (k==5 or k ==15 or k == 25) and {n=G.UIT.B, config={h=0.2,w=0.5}} or nil, + }} + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + for _, v in ipairs(blinds_to_be_alerted) do + v.children.alert = UIBox{ + definition = create_UIBox_card_alert(), + config = { align="tri", offset = {x = 0.1, y = 0.1}, parent = v} + } + v.children.alert.states.collide.can = false + end + return true + end) + })) + + local ante_amounts = {} + for i = 1, math.min(16, math.max(16, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt)) do + local spacing = 1 - math.min(20, math.max(15, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt))*0.06 + if spacing > 0 and i > 1 then + ante_amounts[#ante_amounts+1] = {n=G.UIT.R, config={minh = spacing}, nodes={}} + end + local blind_chip = Sprite(0,0,0.2,0.2,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0}) + blind_chip.states.drag.can = false + ante_amounts[#ante_amounts+1] = {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 0.7}, nodes={ + {n=G.UIT.T, config={text = i, scale = 0.4, colour = G.C.FILTER, shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cr", minw = 2.8}, nodes={ + {n=G.UIT.O, config={object = blind_chip}}, + {n=G.UIT.C, config={align = "cm", minw = 0.03, minh = 0.01}, nodes={}}, + {n=G.UIT.T, config={text =number_format(get_blind_amount(i)), scale = 0.4, colour = i <= G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt and G.C.RED or G.C.JOKER_GREY, shadow = true}}, + }} + }} + end + + local extras = nil + local t = create_UIBox_generic_options({ back_func = exit or 'your_collection', contents = { + {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK, padding = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.L_BLACK, padding = 0.1, force_focus = true, focus_args = {nav = 'tall'}}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 0.7}, nodes={ + {n=G.UIT.T, config={text = localize('k_ante_cap'), scale = 0.4, colour = lighten(G.C.FILTER, 0.2), shadow = true}}, + }}, + {n=G.UIT.C, config={align = "cr", minw = 2.8}, nodes={ + {n=G.UIT.T, config={text = localize('k_base_cap'), scale = 0.4, colour = lighten(G.C.RED, 0.2), shadow = true}}, + }} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes=ante_amounts} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[1]}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[2]}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[3]}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[4]}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[5]}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[6]}, + }} + }} + }} + }}) + return t +end + +function create_UIBox_blind_popup(blind, discovered, vars) + local blind_text = {} + + local _dollars = blind.dollars + local loc_target = localize{type = 'raw_descriptions', key = blind.key, set = 'Blind', vars = vars or blind.vars} + local loc_name = localize{type = 'name_text', key = blind.key, set = 'Blind'} + + if discovered then + local ability_text = {} + if loc_target then + for k, v in ipairs(loc_target) do + ability_text[#ability_text + 1] = {n=G.UIT.R, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = (k ==1 and blind.name == 'The Wheel' and '1' or '')..v, scale = 0.35, shadow = true, colour = G.C.WHITE}}}} + end + end + local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.4) + blind_text[#blind_text + 1] = + {n=G.UIT.R, config={align = "cm", emboss = 0.05, r = 0.1, minw = 2.5, padding = 0.07, colour = G.C.WHITE}, nodes={ + {n=G.UIT.R, config={align = "cm", maxw = 2.4}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_score_at_least'), scale = 0.35, colour = G.C.UI.TEXT_DARK}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={object = stake_sprite}}, + {n=G.UIT.T, config={text = blind.mult..localize('k_x_base'), scale = 0.4, colour = G.C.RED}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('ph_blind_reward'), scale = 0.35, colour = G.C.UI.TEXT_DARK}}, + {n=G.UIT.O, config={object = DynaText({string = {_dollars and string.rep(localize('$'),_dollars) or '-'}, colours = {G.C.MONEY}, rotate = true, bump = true, silent = true, scale = 0.45})}}, + }}, + ability_text[1] and {n=G.UIT.R, config={align = "cm", padding = 0.08, colour = mix_colours(blind.boss_colour, G.C.GREY, 0.4), r = 0.1, emboss = 0.05, minw = 2.5, minh = 0.9}, nodes=ability_text} or nil + }} + else + blind_text[#blind_text + 1] = + {n=G.UIT.R, config={align = "cm", emboss = 0.05, r = 0.1, minw = 2.5, padding = 0.1, colour = G.C.WHITE}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('ph_defeat_this_blind_1'), scale = 0.4, colour = G.C.UI.TEXT_DARK}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('ph_defeat_this_blind_2'), scale = 0.4, colour = G.C.UI.TEXT_DARK}}, + }}, + }} + end + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = lighten(G.C.JOKER_GREY, 0.5), r = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "cm", emboss = 0.05, r = 0.1, minw = 2.5, padding = 0.1, colour = not discovered and G.C.JOKER_GREY or blind.boss_colour or G.C.GREY}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = discovered and loc_name or localize('k_not_discovered'), colours = {G.C.UI.TEXT_LIGHT}, shadow = true, rotate = not discovered, spacing = discovered and 2 or 0, bump = true, scale = 0.4})}}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes=blind_text}, + }} +end + + +function create_UIBox_card_unlock(card_center) + G.your_collection = CardArea( + G.ROOM.T.x + G.ROOM.T.w/2,G.ROOM.T.h, + 1*G.CARD_W, + 1*G.CARD_H, + {card_limit = 2, type = 'consumeable', highlight_limit = 0}) + + local card = Card(G.your_collection.T.x + G.your_collection.T.w/2 - G.CARD_W/2, G.your_collection.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, card_center, {bypass_discovery_center = true, bypass_discovery_ui = true}) + local locked_card = Card(G.your_collection.T.x + G.your_collection.T.w/2 - G.CARD_W/2, G.your_collection.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, card_center.set == 'Voucher' and G.v_locked or G.j_locked) + locked_card:remove_UI() + locked_card.ID = card.ID + card.states.click.can = false + locked_card.states.click.can = false + card.states.visible = false + card.no_ui = true + + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, + func = (function() G.OVERLAY_MENU.joker_unlock_table = card.ID return true end) })) + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 0.6, + func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:juice_up(0.3, 0.2); play_sound('cancel', 0.8) end; return true end) })) + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 1.15, + func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:juice_up(0.45, 0.3); play_sound('cancel', 0.92) end; return true end) })) + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 1.8, + func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:juice_up(0.6, 0.4); play_sound('cancel', 1.03) end; return true end) })) + + G.E_MANAGER:add_event(Event({ + timer = 'REAL', + blockable = false, + blocking = false, + trigger = 'after', + delay = 2.3, + func = (function() + if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:start_dissolve({G.C.BLACK}) end + return true end) + })) + G.E_MANAGER:add_event(Event({ + timer = 'REAL', + blockable = false, + blocking = false, + trigger = 'after', + delay = 2.7, + func = (function() + if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then + card:start_materialize({G.C.BLUE}, true) + play_sound('crumple1', 0.8, 1); + end + return true end) + })) + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 2.78, + func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then card.no_ui = nil; play_sound('timpani', 0.8, 1.8) end return true end) })) + G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 2.95, + func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then play_sound('timpani', 1, 1.8) end return true end) })) + + G.your_collection:emplace(card) + G.your_collection:emplace(locked_card) + + local t = create_UIBox_generic_options({padding = 0,back_label = localize('b_continue'), no_pip = true, snap_back = true, back_func = 'continue_unlock', minw = 4.5, contents = { + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {card_center.set == 'Voucher' and localize('k_voucher') or localize('k_joker')}, colours = {G.C.BLUE},shadow = true, rotate = true, bump = true, pop_in = 0.3, pop_in_rate = 2, scale = 1.2})}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('k_unlocked_ex')}, colours = {G.C.RED},shadow = true, rotate = true, bump = true, pop_in = 0.6, pop_in_rate = 2, scale = 0.8})}} + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0, draw_layer = 1}, nodes={ + {n=G.UIT.O, config={object = G.your_collection}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.05, emboss = 0.05, colour = G.C.WHITE, r = 0.1}, nodes={ + desc_from_rows(card:generate_UIBox_unlock_table(true).main) + }} + }} + }} + }} + }}) + return t +end + +function create_UIBox_deck_unlock(deck_center) + G.GAME.viewed_back = Back(deck_center) + local area = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 1.2*G.CARD_W, + 1.2*G.CARD_H, + {card_limit = 52, type = 'deck', highlight_limit = 0}) + + for i = 1, 52 do + local card = Card(G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, G.CARD_W*1.2, G.CARD_H*1.2, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base, {bypass_back = deck_center.pos, playing_card = i, viewed_back = true}) + area:emplace(card) + card[deck_center.key] = true + card.sprite_facing = 'back' + card.facing = 'back' + end + local deck_criteria = {} + if deck_center.unlock_condition.type == 'win_deck' then + local other_name = localize{type = 'name_text', set = 'Back', key = deck_center.unlock_condition.deck} + localize{type = 'descriptions', key = 'deck_locked_win', set = "Other", nodes = deck_criteria, vars = {other_name}, default_col = G.C.WHITE, shadow = true} + elseif deck_center.unlock_condition.type == 'win_stake' then + local other_name = localize{type = 'name_text', set = 'Stake', key = G.P_CENTER_POOLS.Stake[deck_center.unlock_condition.stake].key} + localize{type = 'descriptions', key = 'deck_locked_stake', set = "Other", nodes = deck_criteria, vars = {other_name, colours = {get_stake_col(deck_center.unlock_condition.stake)}}, default_col = G.C.WHITE, shadow = true} + elseif deck_center.unlock_condition.type == 'discover_amount' then + localize{type = 'descriptions', key = 'deck_locked_discover', set = "Other", nodes = deck_criteria, vars = {deck_center.unlock_condition.amount}, default_col = G.C.WHITE, shadow = true} + end + + local deck_criteria_cols = {} + for k, v in ipairs(deck_criteria) do + if k > 1 then deck_criteria_cols[#deck_criteria_cols+1] = {n=G.UIT.C, config={align = "cm", padding = 0, minw = 0.1}, nodes={}} end + deck_criteria_cols[#deck_criteria_cols+1] = {n=G.UIT.C, config={align = "cm", padding = 0}, nodes=v} + end + + local t = create_UIBox_generic_options({ back_label = localize('b_continue'), no_pip = true, snap_back = true, back_func = 'continue_unlock', minw = 7, contents = { + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {{string = localize{type = 'name_text', set = 'Back', key = deck_center.key}, suffix = ' '..localize('k_unlocked_ex'), outer_colour = G.C.UI.TEXT_LIGHT}}, colours = {G.C.BLUE},shadow = true, rotate = true, float = true, scale = 0.7, pop_in = 0.1})}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes=deck_criteria_cols}, + {n=G.UIT.R, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.2}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = area}} + }}, + {n=G.UIT.C, config={align = "cm", r = 0.2, colour = G.C.WHITE, emboss = 0.05, padding = 0.2, minw = 4}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes=G.GAME.viewed_back:generate_UI(deck_center).nodes} + }} + }} + }}) + return t +end + +function G.UIDEF.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 = "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, + }, + { + 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 = "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 = "Publishing", 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 = "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 Elliot', 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 = 'Kevin Shrapnell', 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 = 'Rob Crossley', 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 = 'Liz Cheng-Moore', 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 = 'Charlotte Riley', 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 = 'Alexander Saunders', 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 = 'Naman Budhwar', 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 = 'Tomasz Wisniowski', 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 = 'Patrick Johnson', 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 = 'Wout van Halderen', 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 = 'Shawn Cotter', 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 = 'Marta Matyjewicz', 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 = 'Krzysztof Niedzielski', 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 = 'Rebecca Bell', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, 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 = 'Jose Olivares', 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 = 'Alex Flynn', 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 = 'Justas Pugaciauskas', 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 = 'Jessica Chu', 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 = 'Millicent Su', 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 = 'Carla Malavasi', 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 = 'Pawel Kwietniak', 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 = 'Ela Müller', 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 = 'Fox Hambly', 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 = 'Edgar Khoo', 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 = 'Dami Ajiboye', 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 = 'Jean Claude Vidanes', 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 = 'Joanna Kierońska', 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 = "cm", padding = 0.1}, nodes={ + {n=G.UIT.R, 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}}, + }}, + (love.system.getOS() == 'Nintendo Switch') and {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Platform help", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}}, + }} or {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = "Xbox and 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 = "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", 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 = '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 = "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 = "Quality Assurance", 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 = "iXie Gaming", scale = text_scale*0.6, colour = G.C.BLUE, 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}}, + }}, + }}, + }}, + }}, + }} + }} + 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}, 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}}, + }}, + {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}}, + }}, + }}, + }} + 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' + }, + { + 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' + }, + { + label = localize('b_challenges'), + tab_definition_function = G.UIDEF.challenges, + tab_definition_function_args = from_game_over, + chosen = _challenge_chosen + }, + }, + snap_to_nav = true}), + }}, + }}) + return t +end + +function G.UIDEF.profile_select() + G.focused_profile = G.focused_profile or G.SETTINGS.profile or 1 + + local t = create_UIBox_generic_options({padding = 0,contents ={ + {n=G.UIT.R, config={align = "cm", padding = 0, draw_layer = 1, minw = 4}, nodes={ + create_tabs( + {tabs = { + { + label = 1, + chosen = G.focused_profile == 1, + tab_definition_function = G.UIDEF.profile_option, + tab_definition_function_args = 1 + }, + { + label = 2, + chosen = G.focused_profile == 2, + tab_definition_function = G.UIDEF.profile_option, + tab_definition_function_args = 2 + }, + { + label = 3, + chosen = G.focused_profile == 3, + tab_definition_function = G.UIDEF.profile_option, + tab_definition_function_args = 3 + } + }, + snap_to_nav = true}), + }}, + }}) + return t +end + +function G.UIDEF.profile_option(_profile) + set_discover_tallies() + G.focused_profile = _profile + local profile_data = get_compressed(G.focused_profile..'/'..'profile.jkr') + if profile_data ~= nil then + profile_data = STR_UNPACK(profile_data) + profile_data.name = profile_data.name or ("P".._profile) + end + G.PROFILES[_profile].name = profile_data and profile_data.name or '' + + local lwidth, rwidth, scale = 1, 1, 1 + G.CHECK_PROFILE_DATA = nil + local t = {n=G.UIT.ROOT, config={align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = 'cm',padding = 0.1, minh = 0.8}, nodes={ + ((_profile == G.SETTINGS.profile) or not profile_data) and {n=G.UIT.R, config={align = "cm"}, nodes={ + create_text_input({ + w = 4, max_length = 16, prompt_text = localize('k_enter_name'), + ref_table = G.PROFILES[_profile], ref_value = 'name',extended_corpus = true, keyboard_offset = 1, + callback = function() + G:save_settings() + G.FILE_HANDLER.force = true + end + }), + }} or {n=G.UIT.R, config={align = 'cm',padding = 0.1, minw = 4, r = 0.1, colour = G.C.BLACK, minh = 0.6}, nodes={ + {n=G.UIT.T, config={text = G.PROFILES[_profile].name, scale = 0.45, colour = G.C.WHITE}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 6}, nodes={ + (G.PROFILES[_profile].progress and G.PROFILES[_profile].progress.discovered) and create_progress_box(G.PROFILES[_profile].progress, 0.5) or + {n=G.UIT.C, config={align = "cm", minh = 4, minw = 5.2, colour = G.C.BLACK, r = 0.1}, nodes={ + {n=G.UIT.T, config={text = localize('k_empty_caps'), scale = 0.5, colour = G.C.UI.TRANSPARENT_LIGHT}} + }}, + }}, + {n=G.UIT.C, config={align = "cm", minh = 4}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 1}, nodes={ + profile_data and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_wins'),colour = G.C.UI.TEXT_LIGHT, scale = scale*0.7}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_LIGHT, scale = scale*0.7}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth}, nodes={{n=G.UIT.T, config={text = tostring(profile_data.career_stats.c_wins),colour = G.C.RED, shadow = true, scale = 1*scale}}}} + }} or nil, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.R, config={align = "cm", minw = 4, maxw = 4, minh = 0.8, padding = 0.2, r = 0.1, hover = true, colour = G.C.BLUE,func = 'can_load_profile', button = "load_profile", shadow = true, focus_args = {nav = 'wide'}}, nodes={ + {n=G.UIT.T, config={text = _profile == G.SETTINGS.profile and localize('b_current_profile') or profile_data and localize('b_load_profile') or localize('b_create_profile'), ref_value = 'load_button_text', scale = 0.5, colour = G.C.UI.TEXT_LIGHT}} + }} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0, minh = 0.7}, nodes={ + {n=G.UIT.R, config={align = "cm", minw = 3, maxw = 4, minh = 0.6, padding = 0.2, r = 0.1, hover = true, colour = G.C.RED,func = 'can_delete_profile', button = "delete_profile", shadow = true, focus_args = {nav = 'wide'}}, nodes={ + {n=G.UIT.T, config={text = _profile == G.SETTINGS.profile and localize('b_reset_profile') or localize('b_delete_profile'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}} + }} + }}, + (_profile == G.SETTINGS.profile and not G.PROFILES[G.SETTINGS.profile].all_unlocked) and {n=G.UIT.R, config={align = "cm", padding = 0, minh = 0.7}, nodes={ + {n=G.UIT.R, config={align = "cm", minw = 3, maxw = 4, minh = 0.6, padding = 0.2, r = 0.1, hover = true, colour = G.C.ORANGE,func = 'can_unlock_all', button = "unlock_all", shadow = true, focus_args = {nav = 'wide'}}, nodes={ + {n=G.UIT.T, config={text = localize('b_unlock_all'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}} + }} + }} or {n=G.UIT.R, config={align = "cm", minw = 3, maxw = 4, minh = 0.7}, nodes={ + G.PROFILES[_profile].all_unlocked and ((not G.F_NO_ACHIEVEMENTS) and {n=G.UIT.T, config={text = localize(G.F_TROPHIES and 'k_trophies_disabled' or 'k_achievements_disabled'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}} or + nil) or nil + }}, + }}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={id = 'warning_text', text = localize('ph_click_confirm'), scale = 0.4, colour = G.C.CLEAR}} + }} + }} + return t +end + +function G.UIDEF.stake_description(_stake) + local _stake_center = G.P_CENTER_POOLS.Stake[_stake] + local ret_nodes = {} + if _stake_center then localize{type = 'descriptions', key = _stake_center.key, set = _stake_center.set, nodes = ret_nodes} end + + local desc_t = {} + for k, v in ipairs(ret_nodes) do + desc_t[#desc_t+1] = {n=G.UIT.R, config={align = "cm", maxw = 5.3}, nodes=v} + end + + return {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.L_BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize{type = 'name_text', key = _stake_center.key, set = _stake_center.set}, scale = 0.35, colour = G.C.WHITE}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.03, colour = G.C.WHITE, r = 0.1, minh = 1, minw = 5.5}, nodes=desc_t} + }} +end + +function G.UIDEF.stake_option(_type) + local middle = {n=G.UIT.R, config={align = "cm", minh = 1.7, minw = 7.3}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_stake2', object = Moveable()}}, + }} + + local max_stake = get_deck_win_stake(G.GAME.viewed_back.effect.center.key) + if G.PROFILES[G.SETTINGS.profile].all_unlocked then max_stake = 8 end + local stake_options = {} + for i = 1, math.min(max_stake+1, 8) do + stake_options[i] = i + end + + return {n=G.UIT.ROOT, config={align = "tm", colour = G.C.CLEAR, minh = 2.03, minw = 8.3}, nodes={_type == 'Continue' and middle or create_option_cycle({options = + stake_options, + opt_callback = 'change_stake', current_option = G.viewed_stake, colour = G.C.RED, w = 6, mid = middle + }) +}} +end + +function G.UIDEF.viewed_stake_option() + G.viewed_stake = G.viewed_stake or 1 + local max_stake = get_deck_win_stake(G.GAME.viewed_back.effect.center.key) + if G.PROFILES[G.SETTINGS.profile].all_unlocked then max_stake = 8 end + + G.viewed_stake = math.min(max_stake+1, G.viewed_stake) + if _type ~= 'Continue' then G.PROFILES[G.SETTINGS.profile].MEMORY.stake = G.viewed_stake end + + local stake_sprite = get_stake_sprite(G.viewed_stake) + + return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, r = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('k_stake'), scale = 0.4, colour = G.C.L_BLACK, vert = true}} + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}}, + }}, + G.UIDEF.stake_description(G.viewed_stake) + }} + }} +end + +function G.UIDEF.challenge_list(from_game_over) + G.CHALLENGE_PAGE_SIZE = 10 + local challenge_pages = {} + for i = 1, math.ceil(#G.CHALLENGES/G.CHALLENGE_PAGE_SIZE) do + table.insert(challenge_pages, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.CHALLENGES/G.CHALLENGE_PAGE_SIZE))) + end + G.E_MANAGER:add_event(Event({func = (function() + G.FUNCS.change_challenge_list_page{cycle_config = {current_option = 1}} + return true end)})) + + local _ch_comp, _ch_tot = 0,#G.CHALLENGES + for k, v in ipairs(G.CHALLENGES) do + if v.id and G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id or ''] then + _ch_comp = _ch_comp + 1 + end + end + + local t = create_UIBox_generic_options({ back_id = from_game_over and 'from_game_over' or nil, back_func = 'setup_run', back_id = 'challenge_list', contents = { + {n=G.UIT.C, config={align = "cm", padding = 0.0}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.1, minh = 7, minw = 4.2}, nodes={ + {n=G.UIT.O, config={id = 'challenge_list', object = Moveable()}}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + create_option_cycle({id = 'challenge_page',scale = 0.9, h = 0.3, w = 3.5, options = challenge_pages, cycle_shoulders = true, opt_callback = 'change_challenge_list_page', current_option = 1, colour = G.C.RED, no_pips = true, focus_args = {snap_to = true}}) + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ + {n=G.UIT.T, config={text = localize{type = 'variable', key = 'challenges_completed', vars = {_ch_comp, _ch_tot}}, scale = 0.4, colour = G.C.WHITE}}, + }}, + + }}, + {n=G.UIT.C, config={align = "cm", minh = 9, minw = 11.5}, nodes={ + {n=G.UIT.O, config={id = 'challenge_area', object = Moveable()}}, + }}, + }}) + return t +end + +function G.UIDEF.challenge_list_page(_page) + local snapped = false + local challenge_list = {} + for k, v in ipairs(G.CHALLENGES) do + if k > G.CHALLENGE_PAGE_SIZE*(_page or 0) and k <= G.CHALLENGE_PAGE_SIZE*((_page or 0) + 1) then + if G.CONTROLLER.focused.target and G.CONTROLLER.focused.target.config.id == 'challenge_page' then snapped = true end + local challenge_completed = G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id or ''] + local challenge_unlocked = G.PROFILES[G.SETTINGS.profile].challenges_unlocked and (G.PROFILES[G.SETTINGS.profile].challenges_unlocked >= k) + + challenge_list[#challenge_list+1] = + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = 'cl', minw = 0.8}, nodes = { + {n=G.UIT.T, config={text = k..'', scale = 0.4, colour = G.C.WHITE}}, + }}, + UIBox_button({id = k, col = true, label = {challenge_unlocked and localize(v.id, 'challenge_names') or localize('k_locked'),}, button = challenge_unlocked and 'change_challenge_description' or 'nil', colour = challenge_unlocked and G.C.RED or G.C.GREY, minw = 4, scale = 0.4, minh = 0.6, focus_args = {snap_to = not snapped}}), + {n=G.UIT.C, config={align = 'cm', padding = 0.05, minw = 0.6}, nodes = { + {n=G.UIT.C, config={minh = 0.4, minw = 0.4, emboss = 0.05, r = 0.1, colour = challenge_completed and G.C.GREEN or G.C.BLACK}, nodes = { + challenge_completed and {n=G.UIT.O, config={object = Sprite(0,0,0.4,0.4, G.ASSET_ATLAS["icons"], {x=1, y=0})}} or nil + }}, + }}, + }} + snapped = true + end + end + + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.1, colour = G.C.CLEAR}, nodes=challenge_list} +end + +function G.UIDEF.challenge_description(_id, daily, is_row) + local challenge = G.CHALLENGES[_id] + if not challenge then return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, minh = 8.82, minw = 11.5, r = 0.1}, nodes={{n=G.UIT.T, config={text = "Select a 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 + end + if not banned_cards[1] then banned_cards[#banned_cards+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_m_none', vars = {}}} end + if not banned_tags[1] then banned_tags[#banned_tags+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_none', vars = {}}} end + if not banned_other[1] then banned_other[#banned_other+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_none', vars = {}}} end + + local banned_cards = {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.RED}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6}, nodes={ + {n=G.UIT.T, config={text = localize('k_banned_cards'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 4.1, minw =7.33, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes= + banned_cards + } + }} + + local banned_tags = {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.RED}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6, maxw = 1.48}, nodes={ + {n=G.UIT.T, config={text = localize('k_banned_tags'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 4.1, minw = 1.48, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes= + banned_tags} + }} + + local banned_other = {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.RED}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6, maxw = 1.84}, nodes={ + {n=G.UIT.T, config={text = localize('k_other'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + }}, + {n=G.UIT.R, config={align = "cm", minh = 4.1, minw = 2, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes= + banned_other} + }} + + return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1, colour = G.C.L_BLACK, r = 0.1}, nodes={ + banned_cards, banned_tags, banned_other + }} + }} + elseif args._tab == 'Deck' then + local challenge = G.CHALLENGES[args._id] + local deck_tables = {} + local SUITS = { + S = {}, + H = {}, + C = {}, + D = {}, + } + local suit_map = {'S', 'H', 'C', 'D'} + local card_protos = nil + local _de = nil + if challenge then + _de = challenge.deck + end + + if _de and _de.cards then + card_protos = _de.cards + end + + if not card_protos then + card_protos = {} + for k, v in pairs(G.P_CARDS) do + local _r, _s = string.sub(k, 3, 3), string.sub(k, 1, 1) + local keep, _e, _d, _g = true, nil, nil, nil + if _de then + if _de.yes_ranks and not _de.yes_ranks[_r] then keep = false end + if _de.no_ranks and _de.no_ranks[_r] then keep = false end + if _de.yes_suits and not _de.yes_suits[_s] then keep = false end + if _de.no_suits and _de.no_suits[_s] then keep = false end + if _de.enhancement then _e = _de.enhancement end + if _de.edition then _d = _de.edition end + if _de.seal then _g = _de.seal end + end + + if keep then card_protos[#card_protos+1] = {s=_s,r=_r,e=_e,d=_d,g=_g} end + end + end + for k, v in ipairs(card_protos) do + local _card = Card(0,0, G.CARD_W*0.45, G.CARD_H*0.45, G.P_CARDS[v.s..'_'..v.r], G.P_CENTERS[v.e or 'c_base']) + if v.d then _card:set_edition({[v.d] = true}, true, true) end + if v.g then _card:set_seal(v.g, true, true) end + SUITS[v.s][#SUITS[v.s]+1] = _card + end + + for j = 1, 4 do + if SUITS[suit_map[j]][1] then + table.sort(SUITS[suit_map[j]], function(a,b) return a:get_nominal() > b:get_nominal() end ) + local view_deck = CardArea( + 0,0, + 5.5*G.CARD_W, + 0.42*G.CARD_H, + {card_limit = #SUITS[suit_map[j]], type = 'title_2', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.5, draw_layers = {'card'}}) + table.insert(deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = view_deck}} + }} + ) + + for i = 1, #SUITS[suit_map[j]] do + if SUITS[suit_map[j]][i] then + view_deck:emplace(SUITS[suit_map[j]][i]) + end + end + end + end + return {n=G.UIT.ROOT, config={align = "cm", padding = 0, colour = G.C.BLACK, r = 0.1, minw = 11.4, minh = 4.2}, nodes=deck_tables} + end +end + +function G.UIDEF.run_setup_option(type) + if not G.SAVED_GAME then + G.SAVED_GAME = get_compressed(G.SETTINGS.profile..'/'..'save.jkr') + if G.SAVED_GAME ~= nil then G.SAVED_GAME = STR_UNPACK(G.SAVED_GAME) end + end + + G.SETTINGS.current_setup = type + G.GAME.viewed_back = Back(get_deck_from_name(G.PROFILES[G.SETTINGS.profile].MEMORY.deck)) + + G.PROFILES[G.SETTINGS.profile].MEMORY.stake = G.PROFILES[G.SETTINGS.profile].MEMORY.stake or 1 + + if type == 'Continue' then + + G.viewed_stake = 1 + if G.SAVED_GAME ~= nil then + saved_game = G.SAVED_GAME + local viewed_deck = 'b_red' + for k, v in pairs(G.P_CENTERS) do + if v.name == saved_game.BACK.name then viewed_deck = k end + end + G.GAME.viewed_back:change_to(G.P_CENTERS[viewed_deck]) + G.viewed_stake = saved_game.GAME.stake or 1 + end + end + + if type == 'New Run' then + if G.OVERLAY_MENU then + local seed_toggle = G.OVERLAY_MENU:get_UIE_by_ID('run_setup_seed') + if seed_toggle then seed_toggle.states.visible = true end + end + G.viewed_stake = G.PROFILES[G.SETTINGS.profile].MEMORY.stake or 1 + G.FUNCS.change_stake({to_key = G.viewed_stake}) + else + G.run_setup_seed = nil + if G.OVERLAY_MENU then + local seed_toggle = G.OVERLAY_MENU:get_UIE_by_ID('run_setup_seed') + if seed_toggle then seed_toggle.states.visible = false end + end + end + + local area = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + G.CARD_W, + G.CARD_H, + {card_limit = 5, type = 'deck', highlight_limit = 0, deck_height = 0.75, thin_draw = 1}) + + for i = 1, 10 do + local card = Card(G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, G.CARD_W, G.CARD_H, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base, {playing_card = i, viewed_back = true}) + card.sprite_facing = 'back' + card.facing = 'back' + area:emplace(card) + if i == 10 then G.sticker_card = card; card.sticker = get_deck_win_sticker(G.GAME.viewed_back.effect.center) end + end + + local ordered_names, viewed_deck = {}, 1 + for k, v in ipairs(G.P_CENTER_POOLS.Back) do + ordered_names[#ordered_names+1] = v.name + if v.name == G.GAME.viewed_back.name then viewed_deck = k end + end + + local lwidth, rwidth = 1.4, 1.8 + + local type_colour = G.C.BLUE + + local scale = 0.39 + G.setup_seed = '' + + local t = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR, minh = 6.6, minw = 6}, nodes={ + type == 'Continue' and {n=G.UIT.R, config={align = "tm", minh = 3.8, padding = 0.15}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 3.3, minw = 6.8}, nodes={ + {n=G.UIT.C, config={align = "cm", colour = G.C.BLACK, padding = 0.15, r = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", shadow = false}, nodes={ + {n=G.UIT.O, config={object = area}} + }}, + }},{n=G.UIT.C, config={align = "cm", minw = 4, maxw = 4, minh = 1.7, r = 0.1, colour = G.C.L_BLACK, padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 4, maxw = 4, minh = 0.6}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_back_name', object = Moveable()}}, + }}, + {n=G.UIT.R, config={align = "cm", colour = G.C.WHITE,padding = 0.03, minh = 1.75, r = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_round'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = tostring(saved_game.GAME.round),colour = G.C.RED, scale = 0.8*scale}}}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_ante'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = tostring(saved_game.GAME.round_resets.ante),colour = G.C.BLUE, scale = 0.8*scale}}}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_money'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('$')..tostring(saved_game.GAME.dollars),colour = G.C.ORANGE, scale = 0.8*scale}}}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_best_hand'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = number_format(saved_game.GAME.round_scores.hand.amt),colour = G.C.RED, scale = scale_number(saved_game.GAME.round_scores.hand.amt, 0.8*scale)}}}} + }}, + saved_game.GAME.seeded and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_seed'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}}, + {n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = tostring(saved_game.GAME.pseudorandom.seed),colour = G.C.RED, scale = 0.8*scale}}}} + }} or nil, + }} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back_stake_column', object = UIBox{definition = G.UIDEF.deck_stake_column(G.GAME.viewed_back.effect.center.key), config = {offset = {x=0,y=0}}}}} + }} + }} + }}}} or + {n=G.UIT.R, config={align = "cm", minh = 3.8}, nodes={ + create_option_cycle({options = ordered_names, opt_callback = 'change_viewed_back', current_option = viewed_deck, colour = G.C.RED, w = 3.5, mid = + {n=G.UIT.R, config={align = "cm", minh = 3.3, minw = 5}, nodes={ + {n=G.UIT.C, config={align = "cm", colour = G.C.BLACK, padding = 0.15, r = 0.1, emboss = 0.05}, nodes={ + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm", shadow = false}, nodes={ + {n=G.UIT.O, config={object = area}} + }}, + }},{n=G.UIT.C, config={align = "cm", minh = 1.7, r = 0.1, colour = G.C.L_BLACK, padding = 0.1}, nodes={ + {n=G.UIT.R, config={align = "cm", r = 0.1, minw = 4, maxw = 4, minh = 0.6}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_back_name', object = Moveable()}}, + }}, + {n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, minh = 1.7, r = 0.1}, nodes={ + {n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back', object = UIBox{definition = G.GAME.viewed_back:generate_UI(), config = {offset = {x=0,y=0}}}}} + }} + }}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back_stake_column', object = UIBox{definition = G.UIDEF.deck_stake_column(G.GAME.viewed_back.effect.center.key), config = {offset = {x=0,y=0}}}}} + }} + }} + }} + }) + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + type == 'Continue' and {n=G.UIT.R, config={align = "cm", minh = 2.2, minw = 5}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 0.17}, nodes={}}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_stake', insta_func = true, object = Moveable()}}, + }} + }} + or {n=G.UIT.R, config={align = "cm", minh = 2.2, minw = 6.8}, nodes={ + {n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_stake', insta_func = true, object = Moveable()}}, + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.05, minh = 0.9}, nodes={ + {n=G.UIT.O, config={align = "cm", func = 'toggle_seeded_run', object = Moveable()}, nodes={ + }}, + }}, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 2.4, id = 'run_setup_seed'}, nodes={ + type == 'New Run' and create_toggle{col = true, label = localize('k_seeded_run'), label_scale = 0.25, w = 0, scale = 0.7, ref_table = G, ref_value = 'run_setup_seed'} or nil + }}, + {n=G.UIT.C, config={align = "cm", minw = 5, minh = 0.8, padding = 0.2, r = 0.1, hover = true, colour = G.C.BLUE, button = "start_setup_run", shadow = true, func = 'can_start_run'}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.T, config={text = localize('b_play_cap'), scale = 0.8, colour = G.C.UI.TEXT_LIGHT,func = 'set_button_pip', focus_args = {button = 'x',set_button_pip = true}}} + }} + }}, + {n=G.UIT.C, config={align = "cm", minw = 2.5}, nodes={}} + }} + }} + return t +end + +function create_button_binding_pip(args) + + local button_sprite_map = { + ['a'] = G.F_SWAP_AB_PIPS and 1 or 0, + ['b'] = G.F_SWAP_AB_PIPS and 0 or 1, + ['x'] = 2, + ['y'] = 3, + ['leftshoulder'] = 4, + ['rightshoulder'] = 5, + ['triggerleft'] = 6, + ['triggerright'] = 7, + ['start'] = 8, + ['back'] = 9, + ['dpadup'] = 10, + ['dpadright'] = 11, + ['dpaddown'] = 12, + ['dpadleft'] = 13, + ['left'] = 14, + ['right'] = 15, + ['leftstick'] = 16, + ['rightstick'] = 17, + ['guide'] = 19 + } + local BUTTON_SPRITE = Sprite(0,0,args.scale or 0.45,args.scale or 0.45,G.ASSET_ATLAS["gamepad_ui"], + {x=button_sprite_map[args.button], + y=G.CONTROLLER.GAMEPAD_CONSOLE == 'Nintendo' and 2 or G.CONTROLLER.GAMEPAD_CONSOLE == 'Playstation' and (G.F_PS4_PLAYSTATION_GLYPHS and 3 or 1) or 0}) + + return {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.O, config={object = BUTTON_SPRITE}}, + }} +end + +function create_UIBox_profile_button() + + local letters = {} + if G.F_DISP_USERNAME then + for _, c in utf8.chars(G.F_DISP_USERNAME) do + local _char = c + local leng = G.LANGUAGES['all1'].font.FONT:hasGlyphs(c) + letters[#letters+1] = {n=G.UIT.T, config={lang = G.LANGUAGES[leng and 'all1' or 'all2'],text = _char, scale = 0.3, colour = mix_colours(G.C.GREEN, G.C.WHITE, 0.7), shadow = true}} + end + end + + if not G.PROFILES[G.SETTINGS.profile].name then + G.PROFILES[G.SETTINGS.profile].name = "P"..G.SETTINGS.profile + end + + return {n=G.UIT.ROOT, config = {align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('k_profile'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.15, minw = 2, minh = 0.8, maxw = 2, r = 0.1, hover = true, colour = mix_colours(G.C.WHITE, G.C.GREY, 0.2), button = 'profile_select', shadow = true}, nodes={ + {n=G.UIT.T, config={ref_table = G.PROFILES[G.SETTINGS.profile], ref_value = 'name', scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + }} + }}, + G.F_DISP_USERNAME and {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.T, config={text = localize('k_playing_as'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }}, + {n=G.UIT.R, config={align = "cm", minh = 0.12}, nodes={}}, + {n=G.UIT.R, config={align = "cm", maxw = 2}, nodes=letters} + }} or nil, + }} +end + +function create_UIBox_main_menu_buttons() + local text_scale = 0.45 + local language = nil + if not G.F_ENGLISH_ONLY then + language = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=2, y=0}) + language.states.drag.can = false + end + local discord = nil + local twitter = nil + if G.F_DISCORD then + discord = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=0, y=0}) + discord.states.drag.can = false + twitter = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=0, y=1}) + twitter.states.drag.can = false + end + + local quit_func = 'quit' + + local t = { + n=G.UIT.ROOT, config = {align = "cm",colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "bm"}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK, mid = true}, nodes={ + UIBox_button{id = 'main_menu_play', button = not G.SETTINGS.tutorial_complete and "start_run" or "setup_run", colour = G.C.BLUE, minw = 3.65, minh = 1.55, label = {localize('b_play_cap')}, scale = text_scale*2, col = true}, + {n=G.UIT.C, config={align = "cm"}, nodes={ + UIBox_button{button = 'options', colour = G.C.ORANGE, minw = 2.65, minh = 1.35, label = {localize('b_options_cap')}, scale = text_scale * 1.2, col = true}, + G.F_QUIT_BUTTON and {n=G.UIT.C, config={align = "cm", minw = 0.2}, nodes={}} or nil, + G.F_QUIT_BUTTON and UIBox_button{button = quit_func, colour = G.C.RED, minw = 2.65, minh = 1.35, label = {localize('b_quit_cap')}, scale = text_scale * 1.2, col = true} or nil, + }}, + UIBox_button{id = 'collection_button', button = "your_collection", colour = G.C.PALE_GREEN, minw = 3.65, minh = 1.55, label = {localize('b_collection_cap')}, scale = text_scale*1.5, col = true}, + }}, + }}, + {n=G.UIT.C, config={align = "br", minw = 3.2, padding = 0.1}, nodes={ + G.F_DISCORD and {n=G.UIT.R, config = {align = "cm", padding = 0.2}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, hover = true, colour = mix_colours(G.C.BLUE, G.C.GREY, 0.4), button = 'go_to_discord', shadow = true}, nodes={ + {n=G.UIT.O, config={object = discord}}, + }}, + {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, hover = true, colour = G.C.BLACK, button = 'go_to_twitter', shadow = true}, nodes={ + {n=G.UIT.O, config={object = twitter}}, + }} + }} or nil, + not G.F_ENGLISH_ONLY and {n=G.UIT.R, config = {align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.15, minw = 1, r = 0.1, hover = true, colour = mix_colours(G.C.WHITE, G.C.GREY, 0.2), button = 'language_selection', shadow = true}, nodes={ + {n=G.UIT.O, config={object = language}}, + {n=G.UIT.T, config={text = G.LANG.label, scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}} + }} + }} or nil, + }}, + }} + return t +end + +function create_UIBox_main_menu_competittion_name() + G.SETTINGS.COMP.name = '' + local t = { + n=G.UIT.ROOT, config = {align = "cm",colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK, mid = true}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + create_text_input({ + w = 4, max_length = 16,prompt_text = 'Enter Name', + ref_table = G.SETTINGS.COMP, ref_value = 'name' + }), + }}, + UIBox_button{button = "confirm_contest_name", colour = G.C.PALE_GREEN, minw = 2.65, minh = 1, label = {'Confirm'}, scale = 0.5}, + }}, + }} + return t +end + +function G.UIDEF.language_selector() + local rows = {} + local langs = {} + for k, v in pairs(G.LANGUAGES) do + if not v.omit then + langs[#langs+1] = v + end + end + table.sort(langs, (function(a, b) return a.label < b.label end)) + local _row = {} + for k, v in ipairs(langs) do + _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}} + }} + }} + 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}, + {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}} + }}, + }} + }}) + return t +end + +function create_UIBox_highlight(rect) + local t = {n=G.UIT.ROOT, config = {align = "cm", minh = rect.T.h+0.1, minw = rect.T.w+0.15, r = 0.15, colour = G.C.DARK_EDITION}, nodes={ + }} +return t +end + +function create_UIBox_generic_options(args) + args = args or {} + local back_func = args.back_func or "exit_overlay_menu" + local contents = args.contents or ({n=G.UIT.T, config={text = "EMPTY",colour = G.C.UI.RED, scale = 0.4}}) + if args.infotip then + G.E_MANAGER:add_event(Event({ + blocking = false, + blockable = false, + timer = 'REAL', + func = function() + if G.OVERLAY_MENU then + local _infotip_object = G.OVERLAY_MENU:get_UIE_by_ID('overlay_menu_infotip') + if _infotip_object then + _infotip_object.config.object:remove() + _infotip_object.config.object = UIBox{ + definition = overlay_infotip(args.infotip), + config = {offset = {x=0,y=0}, align = 'bm', parent = _infotip_object} + } + end + end + return true + end + })) + end + + return {n=G.UIT.ROOT, config = {align = "cm", minw = G.ROOM.T.w*5, minh = G.ROOM.T.h*5,padding = 0.1, r = 0.1, colour = args.bg_colour or {G.C.GREY[1], G.C.GREY[2], G.C.GREY[3],0.7}}, nodes={ + {n=G.UIT.R, config={align = "cm", minh = 1,r = 0.3, padding = 0.07, minw = 1, colour = args.outline_colour or G.C.JOKER_GREY, emboss = 0.1}, nodes={ + {n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.2, minw = 1, colour = args.colour or G.C.L_BLACK}, nodes={ + {n=G.UIT.R, config={align = "cm",padding = args.padding or 0.2, minw = args.minw or 7}, nodes= + contents + }, + not args.no_back and {n=G.UIT.R, config={id = args.back_id or 'overlay_menu_back_button', align = "cm", minw = 2.5, button_delay = args.back_delay, padding =0.1, r = 0.1, hover = true, colour = args.back_colour or G.C.ORANGE, button = back_func, shadow = true, focus_args = {nav = 'wide', button = 'b', snap_to = args.snap_back}}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={ + {n=G.UIT.T, config={id = args.back_id or nil, text = args.back_label or localize('b_back'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true, func = not args.no_pip and 'set_button_pip' or nil, focus_args = not args.no_pip and {button = args.back_button or 'b'} or nil}} + }} + }} or nil + }}, + }}, + {n=G.UIT.R, config={align = "cm"}, nodes={ + {n=G.UIT.O, config={id = 'overlay_menu_infotip', object = Moveable()}}, + }}, + }} +end + +function UIBox_dyn_container(inner_table, horizontal, colour_override, background_override, flipped, padding) + return {n=G.UIT.R, config = {align = "cm", padding= 0.03, colour = G.C.UI.TRANSPARENT_DARK, r=0.1}, nodes={ + {n=G.UIT.R, config = {align = "cm", padding= 0.05, colour = colour_override or G.C.DYN_UI.MAIN, r=0.1}, nodes={ + {n=G.UIT.R, config={align = horizontal and "cl" or (flipped and 'bm' or "tm"), colour = background_override or G.C.DYN_UI.BOSS_DARK, minw = horizontal and 100 or 0, minh = horizontal and 0 or 30, r=0.1, padding = padding or 0.08}, nodes= + inner_table + }}}}} +end + +function simple_text_container(_loc, args) + if not _loc then return nil end + args = args or {} + local container = {} + local loc_result = localize(_loc) + if loc_result and type(loc_result) == 'table' then + for k, v in ipairs(loc_result) do + container[#container+1] = + {n=G.UIT.R, config = {align = "cm", padding= 0}, nodes={ + {n=G.UIT.T, config={text = v, scale = args.scale or 0.35, colour = args.colour or G.C.UI.TEXT_DARK, shadow = args.shadow}} + }} + end + return {n=args.col and G.UIT.C or G.UIT.R, config = {align = "cm", padding= args.padding or 0.03}, nodes=container} + end +end + +function UIBox_button(args) + args = args or {} + args.button = args.button or "exit_overlay_menu" + args.func = args.func or nil + args.colour = args.colour or G.C.RED + args.choice = args.choice or nil + args.chosen = args.chosen or nil + args.label = args.label or {'LABEL'} + args.minw = args.minw or 2.7 + args.maxw = args.maxw or (args.minw - 0.2) + if args.minw < args.maxw then args.maxw = args.minw - 0.2 end + args.minh = args.minh or 0.9 + args.scale = args.scale or 0.5 + args.focus_args = args.focus_args or nil + args.text_colour = args.text_colour or G.C.UI.TEXT_LIGHT + local but_UIT = args.col == true and G.UIT.C or G.UIT.R + + local but_UI_label = {} + + local button_pip = nil + for k, v in ipairs(args.label) do + if k == #args.label and args.focus_args and args.focus_args.set_button_pip then + button_pip ='set_button_pip' + end + table.insert(but_UI_label, {n=G.UIT.R, config={align = "cm", padding = 0, minw = args.minw, maxw = args.maxw}, nodes={ + {n=G.UIT.T, config={text = v, scale = args.scale, colour = args.text_colour, shadow = args.shadow, focus_args = button_pip and args.focus_args or nil, func = button_pip, ref_table = args.ref_table}} + }}) + end + + if args.count then + table.insert(but_UI_label, + {n=G.UIT.R, config={align = "cm", minh = 0.4}, nodes={ + {n=G.UIT.T, config={scale = 0.35,text = args.count.tally..' / '..args.count.of, colour = {1,1,1,0.9}}} + }} + ) + end + + return + {n= but_UIT, config = {align = 'cm'}, nodes={ + {n= G.UIT.C, config={ + align = "cm", + padding = args.padding or 0, + r = 0.1, + hover = true, + colour = args.colour, + one_press = args.one_press, + button = (args.button ~= 'nil') and args.button or nil, + choice = args.choice, + chosen = args.chosen, + focus_args = args.focus_args, + minh = args.minh - 0.3*(args.count and 1 or 0), + shadow = true, + func = args.func, + id = args.id, + back_func = args.back_func, + ref_table = args.ref_table, + mid = args.mid + }, nodes= + but_UI_label + }}} +end diff --git a/functions/button_callbacks.lua b/functions/button_callbacks.lua new file mode 100644 index 0000000..087bbfe --- /dev/null +++ b/functions/button_callbacks.lua @@ -0,0 +1,3158 @@ +--Moves the tutorial to the next step in queue +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.tut_next = function(e) + if G.OVERLAY_TUTORIAL then + G.OVERLAY_TUTORIAL.Jimbo:remove_button() + G.OVERLAY_TUTORIAL.Jimbo:remove_speech_bubble() + G.OVERLAY_TUTORIAL.step_complete = false + G.OVERLAY_TUTORIAL.step = G.OVERLAY_TUTORIAL.step+1 + end +end + +--Ensures the compatibility indicator for the Blueprint and Brainstorm Jokers +--matches with any new changes of compatibility determined by the Joker +-- +---@param e {} +--**e** Is the UIE that called this function\ +--**e.config.ref_table** points to the joker +G.FUNCS.blueprint_compat = function(e) + if e.config.ref_table.ability.blueprint_compat ~= e.config.ref_table.ability.blueprint_compat_check then + if e.config.ref_table.ability.blueprint_compat == 'compatible' then + e.config.colour = mix_colours(G.C.GREEN, G.C.JOKER_GREY, 0.8) + elseif e.config.ref_table.ability.blueprint_compat == 'incompatible' then + e.config.colour = mix_colours(G.C.RED, G.C.JOKER_GREY, 0.8) + end + e.config.ref_table.ability.blueprint_compat_ui = ' '..localize('k_'..e.config.ref_table.ability.blueprint_compat)..' ' + e.config.ref_table.ability.blueprint_compat_check = e.config.ref_table.ability.blueprint_compat + end +end + +--Sorts G.hand in descending order by suit (spades, hearts, clubs, diamonds, then rank) +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.sort_hand_suit = function(e) + G.hand:sort('suit desc') + play_sound('paper1') +end + +--Sorts G.hand in descending order by rank (rank, then spades, hearts, clubs, diamonds) +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.sort_hand_value = function(e) + G.hand:sort('desc') + play_sound('paper1') +end + +--Checks if the cost of a non voucher card is greater than what the player can afford and changes the +--buy button visuals accordingly +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_buy = function(e) + if (e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at) and (e.config.ref_table.cost > 0) then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.ORANGE + e.config.button = 'buy_from_shop' + end + if e.config.ref_parent and e.config.ref_parent.children.buy_and_use then + if e.config.ref_parent.children.buy_and_use.states.visible then + e.UIBox.alignment.offset.y = -0.6 + else + e.UIBox.alignment.offset.y = 0 + end + end +end + +--Checks if the cost of a non voucher card is greater than what the player can afford and changes the +--buy button visuals accordingly +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_buy_and_use = function(e) + if (((e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at) and (e.config.ref_table.cost > 0)) or (not e.config.ref_table:can_use_consumeable())) then + e.UIBox.states.visible = false + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + if e.config.ref_table.highlighted then + e.UIBox.states.visible = true + end + e.config.colour = G.C.SECONDARY_SET.Voucher + e.config.button = 'buy_from_shop' + end +end + +--Checks if the cost of a voucher card is greater than what the player can afford and changes the +--redeem button visuals accordingly +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_redeem = function(e) + if e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.GREEN + e.config.button = 'use_card' + end +end + +--Checks if the cost of a booster pack is too much +--adjusts booster button visuals accordingly +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_open = function(e) + if (e.config.ref_table.cost) > 0 and (e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at) then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.GREEN + e.config.button = 'use_card' + end +end + +--ensures that the HUD blind section is only visible when there is an active blind +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.HUD_blind_visible = function(e) + if G.GAME.blind and (G.GAME.blind.name ~= '' and G.GAME.blind.blind_set) then + G.GAME.blind.states.visible = true + elseif G.GAME.blind then + G.GAME.blind.states.visible = false + end +end + +--Expands or contracts the 'debuff text' area of the blind HUD when it changes, +--either bigger with a new boss or smaller when it is disabled, or for a smaller blind +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.HUD_blind_debuff = function(e) + if G.GAME.blind and G.GAME.blind.loc_debuff_text and G.GAME.blind.loc_debuff_text ~= '' then + if e.parent.config.minh == 0 or e.config.prev_loc ~= G.GAME.blind.loc_debuff_text then + e.parent.config.minh = 0.35 + e.config.scale = 0.36 + if G.GAME.blind.loc_debuff_lines[e.config.ref_value] == '' then e.config.scale = 0.0; e.parent.config.minh = 0.001 end + e.config.prev_loc = G.GAME.blind.loc_debuff_text + e.UIBox:recalculate(true) + end + else + if e.parent.config.minh > 0 then + e.parent.config.minh = 0 + e.config.scale = 0 + e.UIBox:recalculate(true) + end + end +end + +--Adds the prefix for the debuff text for the wheel blind +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.HUD_blind_debuff_prefix = function(e) + if (G.GAME.blind and G.GAME.blind.name == 'The Wheel' and not G.GAME.blind.disabled) or + e.config.id == 'bl_wheel' then + e.config.ref_table.val = ''..G.GAME.probabilities.normal + e.config.scale = 0.32 + else + e.config.ref_table.val = '' + e.config.scale = 0 + end +end + +G.FUNCS.HUD_blind_reward = function(e) + if G.GAME.modifiers.no_blind_reward and (G.GAME.blind and G.GAME.modifiers.no_blind_reward[G.GAME.blind:get_type()]) then + if e.config.minh > 0.44 then + e.config.minh = 0.4 + e.children[1].config.text = localize('k_no_reward') + --e.children[2].states.visible = false + e.UIBox:recalculate(true) + end + else + if e.config.minh < 0.45 then + e.config.minh = 0.45 + e.children[1].config.text = localize('k_reward')..': ' + e.children[2].states.visible = true + e.UIBox:recalculate(true) + end + end +end + +--Determines if there is a valid save file to load and continue from main menu +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_continue = function(e) + if e.config.func then --refers to this function, or 'can_continue', so this doesn't run repeatedly + local _can_continue = nil + local savefile = love.filesystem.getInfo(G.SETTINGS.profile..'/'..'save.jkr') + if savefile == nil then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + 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 + if not G.SAVED_GAME.VERSION or G.SAVED_GAME.VERSION < '0.9.2' then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + _can_continue = true + end + end + e.config.func = nil + return _can_continue + end +end + +G.FUNCS.can_load_profile = function(e) + if G.SETTINGS.profile == G.focused_profile then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.BLUE + e.config.button = 'load_profile' + end +end + +G.FUNCS.load_profile = function(delete_prof_data) + G.SAVED_GAME = nil + G.E_MANAGER:clear_queue() + G.FUNCS.wipe_on() + G.E_MANAGER:add_event(Event({ + no_delete = true, + func = function() + G:delete_run() + local _name = nil + if G.PROFILES[G.focused_profile].name and G.PROFILES[G.focused_profile].name ~= '' then + _name = G.PROFILES[G.focused_profile].name + end + if delete_prof_data then G.PROFILES[G.focused_profile] = {} end + G.DISCOVER_TALLIES = nil + G.PROGRESS = nil + G:load_profile(G.focused_profile) + G.PROFILES[G.focused_profile].name = _name + G:init_item_prototypes() + return true + end + })) + G.E_MANAGER:add_event(Event({ + no_delete = true, + blockable = true, + blocking = false, + func = function() + G:main_menu() + G.FILE_HANDLER.force = true + return true + end + })) + G.FUNCS.wipe_off() +end + +G.FUNCS.can_delete_profile = function(e) + G.CHECK_PROFILE_DATA = G.CHECK_PROFILE_DATA or love.filesystem.getInfo(G.focused_profile..'/'..'profile.jkr') + if (not G.CHECK_PROFILE_DATA) or e.config.disable_button then + G.CHECK_PROFILE_DATA = false + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.RED + e.config.button = 'delete_profile' + end +end + +G.FUNCS.delete_profile = function(e) + local warning_text = e.UIBox:get_UIE_by_ID('warning_text') + if warning_text.config.colour ~= G.C.WHITE then + warning_text:juice_up() + warning_text.config.colour = G.C.WHITE + warning_text.config.shadow = true + e.config.disable_button = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.35, blockable = false, blocking = false, func = function() + e.config.disable_button = nil;return true end})) + + play_sound('tarot2', 1, 0.4) + else + love.filesystem.remove(G.focused_profile..'/'..'profile.jkr') + love.filesystem.remove(G.focused_profile..'/'..'save.jkr') + love.filesystem.remove(G.focused_profile..'/'..'meta.jkr') + love.filesystem.remove(G.focused_profile..'/'..'unlock_notify.jkr') + love.filesystem.remove(G.focused_profile..'') + G.SAVED_GAME = nil + G.DISCOVER_TALLIES = nil + G.PROGRESS = nil + G.PROFILES[G.focused_profile] = {} + if G.focused_profile == G.SETTINGS.profile then + G.FUNCS.load_profile(true) + else + local tab_but = G.OVERLAY_MENU:get_UIE_by_ID('tab_but_'..G.focused_profile) + G.FUNCS.change_tab(tab_but) + end + end +end + +G.FUNCS.can_unlock_all = function(e) + if G.PROFILES[G.SETTINGS.profile].all_unlocked or e.config.disable_button then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.GREY + e.config.button = 'unlock_all' + end +end + +G.FUNCS.unlock_all = function(e) + local _infotip_object = G.OVERLAY_MENU:get_UIE_by_ID('overlay_menu_infotip') + + if (not _infotip_object.config.set) and (not G.F_NO_ACHIEVEMENTS) then + _infotip_object.config.object:remove() + _infotip_object.config.object = UIBox{ + definition = overlay_infotip(localize(G.F_TROPHIES and 'ml_unlock_all_trophies' or 'ml_unlock_all_explanation')), + config = {offset = {x=0,y=0}, align = 'bm', parent = _infotip_object} + } + _infotip_object.config.object.UIRoot:juice_up() + _infotip_object.config.set = true + e.config.disable_button = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.35, blockable = false, blocking = false, func = function() + e.config.disable_button = nil;return true end})) + + play_sound('tarot2', 1, 0.4) + else + G.PROFILES[G.SETTINGS.profile].all_unlocked = true + for k, v in pairs(G.P_CENTERS) do + if not v.demo and not v.wip then + v.alerted = true + v.discovered = true + v.unlocked = true + end + end + for k, v in pairs(G.P_BLINDS) do + if not v.demo and not v.wip then + v.alerted = true + v.discovered = true + v.unlocked = true + end + end + for k, v in pairs(G.P_TAGS) do + if not v.demo and not v.wip then + v.alerted = true + v.discovered = true + v.unlocked = true + end + end + set_profile_progress() + set_discover_tallies() + G:save_progress() + G.FILE_HANDLER.force = true + + local tab_but = G.OVERLAY_MENU:get_UIE_by_ID('tab_but_'..G.focused_profile) + G.FUNCS.change_tab(tab_but) + end +end + +--Creates an alert on this UIE if the round score for this id is a career high score +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.high_score_alert = function(e) + if e.config.id and not e.children.alert then + if G.GAME.round_scores[e.config.id] and G.GAME.round_scores[e.config.id].high_score then + e.children.alert = UIBox{ + definition = create_UIBox_card_alert({no_bg = true,text = localize('k_high_score_ex'), scale = 0.3}), + config = { + instance_type = 'ALERT', + align="tri", + offset = {x = 0.3, y = -0.18}, + major = e, parent = e} + } + e.children.alert.states.collide.can = false + end + end +end + +G.FUNCS.beta_lang_alert = function(e) + if not e.children.alert then + if e.config.ref_table and e.config.ref_table.beta then + e.children.alert = UIBox{ + definition = create_UIBox_card_alert({no_bg = true, text = 'BETA', scale = 0.35}), + config = { + instance_type = 'ALERT', + align="tri", + offset = {x = 0.07, y = -0.07}, + major = e, parent = e} + } + G.DEBUG_VALUE = e.children.alert + e.children.alert.states.collide.can = false + end + end +end + +--Creates a binding pip on this UIE if controller is being used +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.set_button_pip = function(e) + if G.CONTROLLER.HID.controller and e.config.focus_args and not e.children.button_pip then + e.children.button_pip = UIBox{ + definition = create_button_binding_pip{button = e.config.focus_args.button, scale = e.config.focus_args.scale}, + config = { + align= e.config.focus_args.orientation or 'cr', + offset = e.config.focus_args.offset or e.config.focus_args.orientation == 'bm' and {x = 0, y = 0.02} or {x = 0.1, y = 0.02}, + major = e, parent = e} + } + e.children.button_pip.states.collide.can = false + end + if not G.CONTROLLER.HID.controller and e.children.button_pip then + e.children.button_pip:remove() + e.children.button_pip = nil + end +end + +--Flashes text input cursor for the hooked text input, otherwise sets the width and alpha to 0 +-- +---@param e {} +--**e** Is the UIE cursor that called this function +G.FUNCS.flash = function(e) + if G.CONTROLLER.text_input_hook then + if (math.floor(G.TIMERS.REAL*2))%2 == 1 then + e.config.colour[4] = 0 + else + e.config.colour[4] = 1 + end + if e.config.w ~= 0.1 then e.config.w = 0.1; e.UIBox:recalculate(true) end + else + e.config.colour[4] = 0 + if e.config.w ~= 0 then e.config.w = 0; e.UIBox:recalculate(true) end + end +end + +--highlights/lowlights the pips for any dynatext with multiple values based on which one is displaying +-- +---@param e {} +--**e** Is the dynatext that called this function +G.FUNCS.pip_dynatext = function(e) + if 'pip_'..tostring(e.config.ref_table.focused_string) == e.config.id then + if e.config.pip_state ~= 1 then + e.config.colour = e.config.pipcol1 + e.config.pip_state = 1 + end + elseif e.config.pip_state ~= 2 then + e.config.colour = e.config.pipcol2 + e.config.pip_state = 2 + end +end + +--for the toggle +-- +---@param e {} +--**e** Is the slider UIE that called this function +function G.FUNCS.toggle_button(e) + e.config.ref_table.ref_table[e.config.ref_table.ref_value] = not e.config.ref_table.ref_table[e.config.ref_table.ref_value] + if e.config.toggle_callback then + e.config.toggle_callback(e.config.ref_table.ref_table[e.config.ref_table.ref_value]) + end +end + +--for the toggle +-- +---@param e {} +--**e** Is the slider UIE that called this function +function G.FUNCS.toggle(e) + if not e.config.ref_table.ref_table[e.config.ref_table.ref_value] and e.config.toggle_active then + e.config.toggle_active = nil + e.config.colour = e.config.ref_table.inactive_colour + e.children[1].states.visible = false + e.children[1].config.object.states.visible = false + elseif e.config.ref_table.ref_table[e.config.ref_table.ref_value] and not e.config.toggle_active then + e.config.toggle_active = true + e.config.colour = e.config.ref_table.active_colour + e.children[1].states.visible = true + e.children[1].config.object.states.visible = true + end + +end + + +--Modifies the slider value if it is being dragged. e contains the 'container' for the bar and +--c contains the 'child' for the bar. either can be dragged. The value is lerped between the size +--of the child bar and the parent bar depending on any min/max values. Also changes the display text for the slider. +-- +---@param e {} +--**e** Is the slider UIE that called this function +function G.FUNCS.slider(e) + local c = e.children[1] + e.states.drag.can = true + c.states.drag.can = true + if G.CONTROLLER and G.CONTROLLER.dragging.target and + (G.CONTROLLER.dragging.target == e or + G.CONTROLLER.dragging.target == c) then + local rt = c.config.ref_table + rt.ref_table[rt.ref_value] = math.min(rt.max,math.max(rt.min, rt.min + (rt.max - rt.min)*(G.CURSOR.T.x - e.parent.T.x - G.ROOM.T.x)/e.T.w)) + rt.text = string.format("%."..tostring(rt.decimal_places).."f", rt.ref_table[rt.ref_value]) + c.T.w = (rt.ref_table[rt.ref_value] - rt.min)/(rt.max - rt.min)*rt.w + c.config.w = c.T.w + if rt.callback then G.FUNCS[rt.callback](rt) end + end +end + +--Modifies the slider value descreetly by percentage +--c contains the 'child' for the bar. either can be dragged. The value is lerped between the size +--of the child bar and the parent bar depending on any min/max values. Also changes the display text for the slider. +-- +---@param e {} +--**e** Is the slider UIE that called this function +function G.FUNCS.slider_descreet(e, per) + local c = e.children[1] + e.states.drag.can = true + c.states.drag.can = true + if per then + local rt = c.config.ref_table + rt.ref_table[rt.ref_value] = math.min(rt.max,math.max(rt.min, rt.ref_table[rt.ref_value] + per*(rt.max - rt.min))) + rt.text = string.format("%."..tostring(rt.decimal_places).."f", rt.ref_table[rt.ref_value]) + c.T.w = (rt.ref_table[rt.ref_value] - rt.min)/(rt.max - rt.min)*rt.w + c.config.w = c.T.w + end +end + +--When clicked, changes the selected option from an option cycle. Wraps around. +--Modifies any pips to show the currently selected option and resets last pip. +--Calls any functions from opt_callback defined in the option cycle when the value changes. +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.option_cycle = function(e) + local from_val = e.config.ref_table.options[e.config.ref_table.current_option] + local from_key = e.config.ref_table.current_option + local old_pip = e.UIBox:get_UIE_by_ID('pip_'..e.config.ref_table.current_option, e.parent.parent) + local cycle_main = e.UIBox:get_UIE_by_ID('cycle_main', e.parent.parent) + + if cycle_main and cycle_main.config.h_popup then + cycle_main:stop_hover() + G.E_MANAGER:add_event(Event({ + func = function() + cycle_main:hover() + return true + end + })) + end + + if e.config.ref_value == 'l' then + --cycle left + e.config.ref_table.current_option = e.config.ref_table.current_option - 1 + if e.config.ref_table.current_option <= 0 then e.config.ref_table.current_option = #e.config.ref_table.options end + else + --cycle right + e.config.ref_table.current_option = e.config.ref_table.current_option + 1 + if e.config.ref_table.current_option > #e.config.ref_table.options then e.config.ref_table.current_option = 1 end + end + local to_val = e.config.ref_table.options[e.config.ref_table.current_option] + local to_key = e.config.ref_table.current_option + e.config.ref_table.current_option_val = e.config.ref_table.options[e.config.ref_table.current_option] + + local new_pip = e.UIBox:get_UIE_by_ID('pip_'..e.config.ref_table.current_option, e.parent.parent) + + if old_pip then old_pip.config.colour = G.C.BLACK end + if new_pip then new_pip.config.colour = G.C.WHITE end + + if e.config.ref_table.opt_callback then + G.FUNCS[e.config.ref_table.opt_callback]{ + from_val = from_val, + to_val = to_val, + from_key = from_key, + to_key = to_key, + cycle_config = e.config.ref_table + } + end +end + +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +-- CYCLE CALLBACKS +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + +--Generalized test framework callback for any testing option cycles +-- +---@param args {cycle_config: table, to_val: value} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** is the value the option is changing to +G.FUNCS.test_framework_cycle_callback = function(args) + args = args or {} + if args.cycle_config and args.cycle_config.ref_table and args.cycle_config.ref_value then + args.cycle_config.ref_table[args.cycle_config.ref_value] = args.to_val + end +end + +--Changing the current page being viewed for the Joker Collection +-- +---@param args {cycle_config: table} +--**cycle_config** Is the config table from the original option cycle UIE +G.FUNCS.your_collection_joker_page = function(args) + if not args or not args.cycle_config then return end + for j = 1, #G.your_collection do + for i = #G.your_collection[j].cards,1, -1 do + local c = G.your_collection[j]:remove_card(G.your_collection[j].cards[i]) + c:remove() + c = nil + end + end + for i = 1, 5 do + for j = 1, #G.your_collection do + local center = G.P_CENTER_POOLS["Joker"][i+(j-1)*5 + (5*#G.your_collection*(args.cycle_config.current_option - 1))] + 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, G.P_CARDS.empty, center) + card.sticker = get_joker_win_sticker(center) + G.your_collection[j]:emplace(card) + end + end + INIT_COLLECTION_CARD_ALERTS() +end + +--Changing the current page being viewed for the tarot and planet card collection +-- +---@param args {cycle_config: table} +--**cycle_config** Is the config table from the original option cycle UIE +G.FUNCS.your_collection_tarot_page = function(args) + if not args or not args.cycle_config then return end + for j = 1, #G.your_collection do + for i = #G.your_collection[j].cards,1, -1 do + local c = G.your_collection[j]:remove_card(G.your_collection[j].cards[i]) + c:remove() + c = nil + end + 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) + (11*(args.cycle_config.current_option - 1))] + 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, G.P_CARDS.empty, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + INIT_COLLECTION_CARD_ALERTS() +end + +G.FUNCS.your_collection_spectral_page = function(args) + if not args or not args.cycle_config then return end + for j = 1, #G.your_collection do + for i = #G.your_collection[j].cards,1, -1 do + local c = G.your_collection[j]:remove_card(G.your_collection[j].cards[i]) + c:remove() + c = nil + end + end + + for j = 1, #G.your_collection do + for i = 1, 3+j do + local center = G.P_CENTER_POOLS["Spectral"][i+(j-1)*(4) + (9*(args.cycle_config.current_option - 1))] + 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, G.P_CARDS.empty, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + INIT_COLLECTION_CARD_ALERTS() +end + +--Changing the current page being viewed for the booster pack card collection +-- +---@param args {cycle_config: table} +--**cycle_config** Is the config table from the original option cycle UIE +G.FUNCS.your_collection_booster_page = function(args) + if not args or not args.cycle_config then return end + for j = 1, #G.your_collection do + for i = #G.your_collection[j].cards,1, -1 do + local c = G.your_collection[j]:remove_card(G.your_collection[j].cards[i]) + c:remove() + c = nil + end + end + + for j = 1, #G.your_collection do + for i = 1, 4 do + local center = G.P_CENTER_POOLS["Booster"][i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))] + 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() +end + +--Changing the current page being viewed for the voucher collection +-- +---@param args {cycle_config: table} +--**cycle_config** Is the config table from the original option cycle UIE +G.FUNCS.your_collection_voucher_page = function(args) + if not args or not args.cycle_config then return end + for j = 1, #G.your_collection do + for i = #G.your_collection[j].cards,1, -1 do + local c = G.your_collection[j]:remove_card(G.your_collection[j].cards[i]) + c:remove() + c = nil + end + end + for i = 1, 4 do + for j = 1, #G.your_collection do + local center = G.P_CENTER_POOLS["Voucher"][i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))] + 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, G.P_CARDS.empty, center) + card:start_materialize(nil, i>1 or j>1) + G.your_collection[j]:emplace(card) + end + end + INIT_COLLECTION_CARD_ALERTS() +end + +--Changing the selected card back +-- +---@param args {to_val: value} +--**to_val** Deck back name being changed to +G.FUNCS.change_selected_back = function(args) + G.GAME.selected_back:change_to(G.P_CENTER_POOLS.Back[args.to_key]) +end + +--Changing the collection viewed card back +-- +---@param args {to_val: value} +--**to_val** Deck back name being changed to +G.FUNCS.change_viewed_back = function(args) + G.viewed_stake = G.viewed_stake or 1 + G.GAME.viewed_back:change_to(G.P_CENTER_POOLS.Back[args.to_key]) + if G.sticker_card then G.sticker_card.sticker = get_deck_win_sticker(G.GAME.viewed_back.effect.center) end + local max_stake = get_deck_win_stake(G.GAME.viewed_back.effect.center.key) or 0 + G.viewed_stake = math.min(G.viewed_stake, max_stake + 1) + G.PROFILES[G.SETTINGS.profile].MEMORY.deck = args.to_val +end + +G.FUNCS.change_stake = function(args) + G.viewed_stake = args.to_key + G.PROFILES[G.SETTINGS.profile].MEMORY.stake = args.to_key +end + +--Switch VSync on or off - add the change to the settings change queue +-- +---@param args {to_key: key} +--**to_key** new VSync key setting, 1 for On, 2 for Off +G.FUNCS.change_vsync = function(args) + G.SETTINGS.QUEUED_CHANGE.vsync = (G.SETTINGS.WINDOW.vsync == 0 and args.to_key == 1 and 1) or (G.SETTINGS.WINDOW.vsync == 1 and args.to_key == 2 and 0) or nil +end + +--Changes the screen resolution to the cycled resolution.\ +--Note - an issue with windows scaling above 100% means that these resolutions may not match the actual monitor resolution, +--they are more like render resolutions adjusted to fit the screen with scaling +-- +---@param args {cycle_config: table, to_key: key} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_key** The new resolution setting, refers to a resolution table generated with the option cycle +G.FUNCS.change_screen_resolution = function(args) + local curr_disp = G.SETTINGS.WINDOW.selected_display + local to_resolution = G.SETTINGS.WINDOW.DISPLAYS[curr_disp].screen_resolutions.values[args.to_key] + G.SETTINGS.QUEUED_CHANGE.screenres = {w = to_resolution.w, h = to_resolution.h} + +end + +--Changes the screen mode\ +--Options: Windowed, Fullscreen, Borderless +-- +---@param args {cycle_config: table, to_val: value} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new screenmode setting value +G.FUNCS.change_screenmode = function(args) + G.ARGS.screenmode_vals = G.ARGS.screenmode_vals or {"Windowed", "Fullscreen", "Borderless"} + G.SETTINGS.QUEUED_CHANGE.screenmode = G.ARGS.screenmode_vals[args.to_key] + G.FUNCS.change_window_cycle_UI() +end + +--Changes the displaying monitors +-- +---@param args {cycle_config: table, to_key: key} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_key** The new screenmode setting key +G.FUNCS.change_display = function(args) + G.SETTINGS.QUEUED_CHANGE.selected_display = args.to_key + G.FUNCS.change_window_cycle_UI() +end + +--Helper function to re-add the resolution cycle UIE with updated data +G.FUNCS.change_window_cycle_UI = function() + if G.OVERLAY_MENU then + local swap_node = G.OVERLAY_MENU:get_UIE_by_ID('resolution_cycle') + if swap_node then + local focused_display, focused_screenmode = G.SETTINGS.QUEUED_CHANGE.selected_display or G.SETTINGS.WINDOW.selected_display, G.SETTINGS.QUEUED_CHANGE.screenmode or G.SETTINGS.WINDOW.screenmode + + --Refresh the display information + local res_option = GET_DISPLAYINFO(focused_screenmode, focused_display) + + --Remove the old cycle, replace it with a new updated one reflecting any changes + swap_node.children[1]:remove() + swap_node.children[1] = nil + swap_node.UIBox:add_child( + create_option_cycle({w = 4,scale = 0.8, options = G.SETTINGS.WINDOW.DISPLAYS[focused_display].screen_resolutions.strings, opt_callback = 'change_screen_resolution',current_option = res_option or 1}), + swap_node) + end + end +end + +--Changes the speed that the game runs at, does not affect all timers, just G.TIMERS.TOTAL +-- +---@param args {cycle_config: table, to_val: value} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new screenmode setting key +G.FUNCS.change_gamespeed = function(args) + G.SETTINGS.GAMESPEED = args.to_val +end + +--Changes the relative position of play and discard buttons +-- +---@param args {cycle_config: table, to_key: value} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new screenmode setting key +G.FUNCS.change_play_discard_position = function(args) + G.SETTINGS.play_button_pos = args.to_key + if G.buttons then + G.buttons:remove() + G.buttons = UIBox{ + definition = create_UIBox_buttons(), + config = {align="bm", offset = {x=0,y=0.3},major = G.hand, bond = 'Weak'} + } + end +end + +--Changes the Shadow setting +-- +---@param args {cycle_config: table, to_val: value} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new value for shadows, 'On' or 'Off' +G.FUNCS.change_shadows = function(args) + G.SETTINGS.GRAPHICS.shadows = args.to_key == 1 and 'On' or 'Off' + G:save_settings() +end + +--Changes the Pixel smoothing, all sprites need to be realoaded when this changes\ +-- +---@param args {cycle_config: table, to_key: key} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new value for shadows, 'On' or 'Off' +G.FUNCS.change_pixel_smoothing = function(args) + G.SETTINGS.GRAPHICS.texture_scaling = args.to_key--^2 + G:set_render_settings() + G:save_settings() +end + +--Changes the Bloom amount for the CRT effect, number of samples to take for bloom\ +-- +---@param args {cycle_config: table, to_key: key} +--**cycle_config** Is the config table from the original option cycle UIE\ +--**to_val** The new value for shadows, 'On' or 'Off' +G.FUNCS.change_crt_bloom = function(args) + G.SETTINGS.GRAPHICS.bloom = args.to_key + G:save_settings() +end + +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +-- TEXT ENTRY +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + +--passes a keyboard input to the controller when a key UI button is pressed +-- +---@param e table +-- +--[e is the UI Element that calls this update function, contains ARGS in e.config.ref_table] +G.FUNCS.key_button = function(e) + local args = e.config.ref_table + if args.key then G.CONTROLLER:key_press_update(args.key) end +end + +--Modifies the text input to show the current text value being modified. Shows the prompt text if\ +--the text input area is not hooked. Also modifies the UIE colour to show the hooked/non hooked colour\ +--If using a keyboard, pops it up here or removes it if using KBM +-- +---@param e table +-- +--[e is the UI Element that calls this update function, contains ARGS in e.config.ref_table] +G.FUNCS.text_input = function(e) + local args =e.config.ref_table + if G.CONTROLLER.text_input_hook == e then + e.parent.parent.config.colour = args.hooked_colour + args.current_prompt_text = '' + args.current_position_text = args.position_text + else + e.parent.parent.config.colour = args.colour + args.current_prompt_text = (args.text.ref_table[args.text.ref_value] == '' and args.prompt_text or '') + args.current_position_text = '' + end + + local OSkeyboard_e = e.parent.parent.parent + if G.CONTROLLER.text_input_hook == e and G.CONTROLLER.HID.controller then + if not OSkeyboard_e.children.controller_keyboard then + OSkeyboard_e.children.controller_keyboard = UIBox{ + definition = create_keyboard_input{backspace_key = true, return_key = true, space_key = false}, + config = { + align= 'cm', + offset = {x = 0, y = G.CONTROLLER.text_input_hook.config.ref_table.keyboard_offset or -4}, + major = e.UIBox, parent = OSkeyboard_e} + } + G.CONTROLLER.screen_keyboard = OSkeyboard_e.children.controller_keyboard + G.CONTROLLER:mod_cursor_context_layer(1) + end + elseif OSkeyboard_e.children.controller_keyboard then + OSkeyboard_e.children.controller_keyboard:remove() + OSkeyboard_e.children.controller_keyboard = nil + G.CONTROLLER.screen_keyboard = nil + G.CONTROLLER:mod_cursor_context_layer(-1) + end +end + +G.FUNCS.paste_seed = function(e) + G.CONTROLLER.text_input_hook = e.UIBox:get_UIE_by_ID('text_input').children[1].children[1] + for i = 1, 8 do + G.FUNCS.text_input_key({key = 'right'}) + end + for i = 1, 8 do + G.FUNCS.text_input_key({key = 'backspace'}) + end + local clipboard = (G.F_LOCAL_CLIPBOARD and G.CLIPBOARD or love.system.getClipboardText()) or '' + for i = 1, #clipboard do + local c = clipboard:sub(i,i) + G.FUNCS.text_input_key({key = c}) + end + G.FUNCS.text_input_key({key = 'return'}) +end + +--When clicked, hooks the text input defined by e->1->1, which should be the text input UIE +-- +---@param e table +-- +--[e is the UI Element that calls this click function] +G.FUNCS.select_text_input = function(e) + G.CONTROLLER.text_input_hook = e.children[1].children[1] + + --Start by setting the cursor position to the correct location + TRANSPOSE_TEXT_INPUT(0) + e.UIBox:recalculate(true) +end + +--Handles all key inputs for the hooked text input. +-- +---@param args {key: string, caps: boolean} +--**key** the key being pressed\ +--**caps** if the key should be capitalized +G.FUNCS.text_input_key = function(args) + args = args or {} + + if args.key == '[' or args.key == ']' then return end + if args.key == '0' then args.key = 'o' end + + --shortcut to hook config + local hook_config = G.CONTROLLER.text_input_hook.config.ref_table + hook_config.orig_colour = hook_config.orig_colour or copy_table(hook_config.colour) + + args.key = args.key or '%' + args.caps = args.caps or G.CONTROLLER.capslock or hook_config.all_caps --capitalize if caps lock or hook requires + + --Some special keys need to be mapped accordingly before passing through the corpus + local keymap = { + space = ' ', + backspace = 'BACKSPACE', + delete = 'DELETE', + ['return'] = 'RETURN', + right = 'RIGHT', + left = 'LEFT' + } + local hook = G.CONTROLLER.text_input_hook + local corpus = '123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'..(hook.config.ref_table.extended_corpus and " 0!$&()<>?:{}+-=,.[]_" or '') + + if hook.config.ref_table.extended_corpus then + local lower_ext = '1234567890-=;\',./' + local upper_ext = '!@#$%^&*()_+:"<>?' + if string.find(lower_ext, args.key) and args.caps then + args.key = string.sub(string.sub(upper_ext,string.find(lower_ext, args.key)), 0, 1) + end + end + local text = hook_config.text + + --set key to mapped key or upper if caps is true + args.key = keymap[args.key] or (args.caps and string.upper(args.key) or args.key) + + --Start by setting the cursor position to the correct location + TRANSPOSE_TEXT_INPUT(0) + + if string.len(text.ref_table[text.ref_value]) > 0 and args.key == 'BACKSPACE' then --If not at start, remove preceding letter + MODIFY_TEXT_INPUT{ + letter = '', + text_table = text, + pos = text.current_position, + delete = true + } + TRANSPOSE_TEXT_INPUT(-1) + elseif string.len(text.ref_table[text.ref_value]) > 0 and args.key == 'DELETE' then --if not at end, remove following letter + MODIFY_TEXT_INPUT{ + letter = '', + text_table = text, + pos = text.current_position+1, + delete = true + } + TRANSPOSE_TEXT_INPUT(0) + elseif args.key == 'RETURN' then --Release the hook + if hook.config.ref_table.callback then hook.config.ref_table.callback() end + hook.parent.parent.config.colour = hook_config.colour + local temp_colour = copy_table(hook_config.orig_colour) + hook_config.colour[1] = G.C.WHITE[1] + hook_config.colour[2] = G.C.WHITE[2] + hook_config.colour[3] = G.C.WHITE[3] + ease_colour(hook_config.colour, temp_colour) + G.CONTROLLER.text_input_hook = nil + elseif args.key == 'LEFT' then --Move cursor position to the left + TRANSPOSE_TEXT_INPUT(-1) + elseif args.key == 'RIGHT' then --Move cursor position to the right + TRANSPOSE_TEXT_INPUT(1) + elseif hook_config.max_length > string.len(text.ref_table[text.ref_value]) and + (string.len(args.key) == 1) and + string.find( corpus, args.key , 1, true) then --check to make sure the key is in the valid corpus, add it to the string + MODIFY_TEXT_INPUT{ + letter = args.key, + text_table = text, + pos = text.current_position+1 + } + TRANSPOSE_TEXT_INPUT(1) + end +end + +--Helper function for G.FUNCS.text_input_key +function GET_TEXT_FROM_INPUT() + local new_text = '' + local hook = G.CONTROLLER.text_input_hook + for i = 1, #hook.children do + if hook.children[i].config and hook.children[i].config.id:sub(1, 7) == 'letter_' and hook.children[i].config.text ~= '' then + new_text = new_text..hook.children[i].config.text + end + end + return new_text +end + +--Helper function for G.FUNCS.text_input_key +-- +---@param args {letter: string, text_table: table, pos: number, delete: boolean} +--**letter** the letter being pressed\ +--**text_table** the table full of letters from hook\ +--**pos** the current position of the iterator\ +--**delete** if the action is a deletion action +function MODIFY_TEXT_INPUT(args) + args = args or {} + + if args.delete and args.pos > 0 then + if args.pos >= #args.text_table.letters then + args.text_table.letters[args.pos] = '' + else + args.text_table.letters[args.pos] = args.text_table.letters[args.pos+1] + MODIFY_TEXT_INPUT{ + letter = args.letter, + text_table = args.text_table, + pos = args.pos+1, + delete = args.delete + } + end + return + end + local swapped_letter = args.text_table.letters[args.pos] + args.text_table.letters[args.pos] = args.letter + if swapped_letter and swapped_letter ~= '' then + MODIFY_TEXT_INPUT{ + letter = swapped_letter, + text_table = args.text_table, + pos = args.pos+1 + } + end +end + +--Helper function for G.FUNCS.text_input_key\ +--Moves the cursor left or right. Typing a key, deleting or backspacing also counts\ +--as a cursor move, since empty strings are used to fill the hook +-- +---@param amount number +function TRANSPOSE_TEXT_INPUT(amount) + local position_child = nil + local hook = G.CONTROLLER.text_input_hook + local text = G.CONTROLLER.text_input_hook.config.ref_table.text + for i = 1, #hook.children do + if hook.children[i].config then + if hook.children[i].config.id == 'position' then + position_child = i; break + end + end + end + + local dir = (amount/math.abs(amount)) or 0 + + while amount ~= 0 do + if position_child + dir < 1 or position_child + dir >= #hook.children then break end + local real_letter = hook.children[position_child+dir].config.id:sub(1, 7) == 'letter_' and hook.children[position_child+dir].config.text ~= '' + SWAP(hook.children, position_child, position_child + dir) + if real_letter then amount = amount - dir end + position_child = position_child + dir + end + + text.current_position = math.min(position_child-1, string.len(text.ref_table[text.ref_value])) + hook.UIBox:recalculate(true) + text.ref_table[text.ref_value] = GET_TEXT_FROM_INPUT() +end + +--Determines if there are any graphical changes in the queue that require window re-initialization, +--changes the button accordingly +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.can_apply_window_changes = function(e) + local can_apply = false + if G.SETTINGS.QUEUED_CHANGE then + if G.SETTINGS.QUEUED_CHANGE.screenmode and + G.SETTINGS.QUEUED_CHANGE.screenmode ~= G.SETTINGS.WINDOW.screenmode then + can_apply = true + elseif G.SETTINGS.QUEUED_CHANGE.screenres then + can_apply = true + elseif G.SETTINGS.QUEUED_CHANGE.vsync then + can_apply = true + elseif G.SETTINGS.QUEUED_CHANGE.selected_display and + G.SETTINGS.QUEUED_CHANGE.selected_display ~= G.SETTINGS.WINDOW.selected_display then + can_apply = true + end + end + + if can_apply then + e.config.button = 'apply_window_changes' + e.config.colour = G.C.RED + else + e.config.button = nil + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + end +end + +--Applies all window changes, including updates to the screenmode, selected display, resolution and vsync.\ +--These changes are all defined in the G.SETTINGS.QUEUED_CHANGE table. Any unchanged settings use the previous value +G.FUNCS.apply_window_changes = function(_initial) + --Set the screenmode setting from Windowed, Fullscreen or Borderless + G.SETTINGS.WINDOW.screenmode = (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.screenmode) or G.SETTINGS.WINDOW.screenmode or 'Windowed' + + --Set the monitor the window should be rendered to + G.SETTINGS.WINDOW.selected_display = (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.selected_display) or G.SETTINGS.WINDOW.selected_display or 1 + + --Set the screen resolution + G.SETTINGS.WINDOW.DISPLAYS[G.SETTINGS.WINDOW.selected_display].screen_res = { + w = (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.screenres and G.SETTINGS.QUEUED_CHANGE.screenres.w) or (G.SETTINGS.screen_res and G.SETTINGS.screen_res.w) or love.graphics.getWidth( ), + h = (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.screenres and G.SETTINGS.QUEUED_CHANGE.screenres.h) or (G.SETTINGS.screen_res and G.SETTINGS.screen_res.h) or love.graphics.getHeight( ) + } + + --Set the vsync value, 0 is off 1 is on + G.SETTINGS.WINDOW.vsync = (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.vsync) or G.SETTINGS.WINDOW.vsync or 1 + + love.window.updateMode( + (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.screenmode == 'Windowed') and love.graphics.getWidth()*0.8 or G.SETTINGS.WINDOW.DISPLAYS[G.SETTINGS.WINDOW.selected_display].screen_res.w, + (G.SETTINGS.QUEUED_CHANGE and G.SETTINGS.QUEUED_CHANGE.screenmode == 'Windowed') and love.graphics.getHeight()*0.8 or G.SETTINGS.WINDOW.DISPLAYS[G.SETTINGS.WINDOW.selected_display].screen_res.h, + {fullscreen = G.SETTINGS.WINDOW.screenmode ~= 'Windowed', + fullscreentype = (G.SETTINGS.WINDOW.screenmode == 'Borderless' and 'desktop') or (G.SETTINGS.WINDOW.screenmode == 'Fullscreen' and 'exclusive') or nil, + vsync = G.SETTINGS.WINDOW.vsync, + resizable = true, + display = G.SETTINGS.WINDOW.selected_display + }) + G.SETTINGS.QUEUED_CHANGE = {} + if _initial ~= true then + love.resize(love.graphics.getWidth(),love.graphics.getHeight()) + G:save_settings() + end + if G.OVERLAY_MENU then + local tab_but = G.OVERLAY_MENU:get_UIE_by_ID('tab_but_Video') + G.FUNCS.change_tab(tab_but) + end +end + +--Iterates through any collection cardareas, applies the initial collection alert update.\ +--This update_alert function for each card is also called by the card in its own update function +function INIT_COLLECTION_CARD_ALERTS() + for j = 1, #G.your_collection do + for _, v in ipairs(G.your_collection[j].cards) do + v:update_alert() + end + end +end + +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +-- RUN SETUP +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + +--Monitors the run option deck to determine if a new 'back' has been chosen from the option cycle\ +--if so, this function removes the old UI describing the ability of the back and replaces it with the new ability UI +-- +---@param e {} +--**e** Is the UIE that called this function +G.FUNCS.RUN_SETUP_check_back = function(e) + if G.GAME.viewed_back.name ~= e.config.id then + --removes the UI from the previously selected back and adds the new one + + e.config.object:remove() + e.config.object = UIBox{ + definition = G.GAME.viewed_back:generate_UI(), + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + e.config.id = G.GAME.viewed_back.name + end +end + +G.FUNCS.RUN_SETUP_check_back_name = function(e) + if G.GAME.viewed_back.name ~= e.config.id then + --removes the UI from the previously selected back and adds the new one + + e.config.object:remove() + e.config.object = UIBox{ + definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back_name', object = DynaText({string = G.GAME.viewed_back:get_name(),maxw = 4, colours = {G.C.WHITE}, shadow = true, bump = true, scale = 0.5, pop_in = 0, silent = true})}}, + }}, + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + e.config.id = G.GAME.viewed_back.name + end +end + +G.FUNCS.RUN_SETUP_check_stake = function(e) + if (G.GAME.viewed_back.name ~= e.config.id) then + e.config.object:remove() + e.config.object = UIBox{ + definition = G.UIDEF.stake_option(G.SETTINGS.current_setup), + config = {offset = {x=0,y=0}, align = 'tmi', parent = e} + } + e.config.id = G.GAME.viewed_back.name + end +end + +G.FUNCS.RUN_SETUP_check_stake2 = function(e) + if (G.viewed_stake ~= e.config.id) then + e.config.object:remove() + e.config.object = UIBox{ + definition = G.UIDEF.viewed_stake_option(), + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + e.config.id = G.viewed_stake + end +end + +G.FUNCS.RUN_SETUP_check_back_stake_column= function(e) + if G.GAME.viewed_back.name ~= e.config.id then + --removes the UI from the previously selected back and adds the new one + e.config.object:remove() + e.config.object = UIBox{ + definition = G.UIDEF.deck_stake_column(G.GAME.viewed_back.effect.center.key), + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + e.config.id = G.GAME.viewed_back.name + end +end + +G.FUNCS.RUN_SETUP_check_back_stake_highlight= function(e) + if G.viewed_stake == e.config.id and e.config.outline < 0.1 then + e.config.outline = 0.8 + elseif G.viewed_stake ~= e.config.id and e.config.outline > 0.1 then + e.config.outline = 0 + end +end + +G.FUNCS.change_tab = function(e) + if not e then return end + local _infotip_object = G.OVERLAY_MENU:get_UIE_by_ID('overlay_menu_infotip') + if _infotip_object and _infotip_object.config.object then + _infotip_object.config.object:remove() + _infotip_object.config.object = Moveable() + end + + local tab_contents = e.UIBox:get_UIE_by_ID('tab_contents') + tab_contents.config.object:remove() + tab_contents.config.object = UIBox{ + definition = e.config.ref_table.tab_definition_function(e.config.ref_table.tab_definition_function_args), + config = {offset = {x=0,y=0}, parent = tab_contents, type = 'cm'} + } + tab_contents.UIBox:recalculate() +end + +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +-- OVERLAY MENUS +--|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| + +--The overlay menu is a full screen menu interface, and is usually called from button presses. The base Overlay menu function here\ +--creates a global G.OVERLAY_MENU that represents this full screen UIBox. The game may be paused at this time as well\ +--The generated UIBox is created below the visible screen area and eased up to the center of the screen +-- +---@param args {definition: table, config: table, pause: boolean} +--**definition** The definition table for the UIBox\ +--**config** A configuration table for the UIBox\ +--**pause** Whether the game should be paused on creation of the UIBox +G.FUNCS.overlay_menu = function(args) + if not args then return end + --Remove any existing overlays if there is one + if G.OVERLAY_MENU then G.OVERLAY_MENU:remove() end + G.CONTROLLER.locks.frame_set = true + G.CONTROLLER.locks.frame = true + G.CONTROLLER.cursor_down.target = nil + G.CONTROLLER:mod_cursor_context_layer(G.NO_MOD_CURSOR_STACK and 0 or 1) + + args.config = args.config or {} + args.config = { + align = args.config.align or "cm", + offset = args.config.offset or {x=0,y=10}, + major = args.config.major or G.ROOM_ATTACH, + bond = 'Weak', + no_esc = args.config.no_esc + } + G.OVERLAY_MENU = true + --Generate the UIBox + G.OVERLAY_MENU = UIBox{ + definition = args.definition, + config = args.config + } + + --Set the offset and align. The menu overlay can be initially offset in the y direction and this will ensure it slides to middle + G.OVERLAY_MENU.alignment.offset.y = 0 + G.ROOM.jiggle = G.ROOM.jiggle + 1 + G.OVERLAY_MENU:align_to_major() +end + +--Removes the overlay menu if one exists, unpauses the game, and saves the settings to file +G.FUNCS.exit_overlay_menu = function() + if not G.OVERLAY_MENU then return end + G.CONTROLLER.locks.frame_set = true + G.CONTROLLER.locks.frame = true + G.CONTROLLER:mod_cursor_context_layer(-1000) + G.OVERLAY_MENU:remove() + G.OVERLAY_MENU = nil + G.VIEWING_DECK = nil + G.SETTINGS.paused = false + + --Save settings to file + G:save_settings() +end + +--Removes overlay menu and immediately generates the next unlock menu if there is one +G.FUNCS.continue_unlock = function() + G.FUNCS.exit_overlay_menu() + G.CONTROLLER:mod_cursor_context_layer(-2000) + G.E_MANAGER:update(0, true) +end + +G.FUNCS.test_framework = function(options) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_test_framework(options), + } +end + +G.FUNCS.options = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_options(), + } +end + +G.FUNCS.current_hands = function(e, simple) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_current_hands(simple), + } +end + +G.FUNCS.run_info = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.run_info(), + } +end + +G.FUNCS.deck_info = function(e) + G.SETTINGS.paused = true + if G.deck_preview then + G.deck_preview:remove() + G.deck_preview = nil + end + G.FUNCS.overlay_menu{ + definition = G.UIDEF.deck_info( + G.STATE == G.STATES.SELECTING_HAND or G.STATE == G.STATES.HAND_PLAYED or G.STATE == G.STATES.DRAW_TO_HAND + ), + } +end + +G.FUNCS.settings = function(e, instant) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_settings(), + config = {offset = {x=0,y=instant and 0 or 10}} +} +end + +G.FUNCS.show_credits = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.credits(), + } +end + +G.FUNCS.language_selection = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.language_selector(), + } +end + +G.FUNCS.your_collection = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection(), + } +end + +G.FUNCS.your_collection_blinds = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_blinds(), + } +end + +G.FUNCS.your_collection_jokers = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_jokers(), + } +end + +G.FUNCS.your_collection_tarots = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_tarots(), + } +end + +G.FUNCS.your_collection_planets = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_planets(), + } +end + +G.FUNCS.your_collection_spectrals = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_spectrals(), + } +end + +G.FUNCS.your_collection_vouchers = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_vouchers(), + } +end + +G.FUNCS.your_collection_enhancements_exit_overlay_menu = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_enhancements('exit_overlay_menu'), + } +end + +G.FUNCS.your_collection_enhancements = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_enhancements(), + } +end + +G.FUNCS.your_collection_decks = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_decks(), + } +end + +G.FUNCS.your_collection_editions = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_editions(), + } +end + +G.FUNCS.your_collection_tags = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_tags(), + } +end + +G.FUNCS.your_collection_seals = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_seals(), + } +end + +G.FUNCS.your_collection_boosters = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_your_collection_boosters(), + } +end + +G.FUNCS.challenge_list = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.challenge_list((e.config.id == 'from_game_over')), + } + if (e.config.id == 'from_game_over') then G.OVERLAY_MENU.config.no_esc =true end +end + +G.FUNCS.high_scores = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_high_scores(), + } +end + +G.FUNCS.usage = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.usage_tabs() + } +end + +G.FUNCS.setup_run = function(e) + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.run_setup((e.config.id == 'from_game_over' or e.config.id == 'from_game_won' or e.config.id == 'challenge_list') and e.config.id), + } + if (e.config.id == 'from_game_over' or e.config.id == 'from_game_won') then G.OVERLAY_MENU.config.no_esc =true end +end + +G.FUNCS.wait_for_high_scores = function(e) + if G.ARGS.HIGH_SCORE_RESPONSE then + e.config.object:remove() + e.config.object = UIBox{ + definition = create_UIBox_high_scores_filling(G.ARGS.HIGH_SCORE_RESPONSE), + config = {offset = {x=0,y=0}, align = 'cm', parent = e} + } + G.ARGS.HIGH_SCORE_RESPONSE = nil + end +end + +G.FUNCS.notify_then_setup_run = function(e) + G.OVERLAY_MENU:remove() + G.OVERLAY_MENU = nil + + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + unlock_notify() + return true + end) + })) + + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + if #G.E_MANAGER.queues.unlock <= 0 and not G.OVERLAY_MENU then + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.UIDEF.run_setup((e.config.id == 'from_game_over' or e.config.id == 'from_game_won') and e.config.id), + } + if (e.config.id == 'from_game_over' or e.config.id == 'from_game_won') then G.OVERLAY_MENU.config.no_esc =true end + return true + end + end) + })) +end + +G.FUNCS.change_challenge_description = function(e) + if G.OVERLAY_MENU then + local desc_area = G.OVERLAY_MENU:get_UIE_by_ID('challenge_area') + if desc_area and desc_area.config.oid ~= e.config.id then + if desc_area.config.old_chosen then desc_area.config.old_chosen.config.chosen = nil end + e.config.chosen = 'vert' + if desc_area.config.object then + desc_area.config.object:remove() + end + desc_area.config.object = UIBox{ + definition = G.UIDEF.challenge_description(e.config.id), + config = {offset = {x=0,y=0}, align = 'cm', parent = desc_area} + } + desc_area.config.oid = e.config.id + desc_area.config.old_chosen = e + end + end +end + +G.FUNCS.change_challenge_list_page = function(args) + if not args or not args.cycle_config then return end + if G.OVERLAY_MENU then + local ch_list = G.OVERLAY_MENU:get_UIE_by_ID('challenge_list') + if ch_list then + if ch_list.config.object then + ch_list.config.object:remove() + end + ch_list.config.object = UIBox{ + definition = G.UIDEF.challenge_list_page(args.cycle_config.current_option-1), + config = {offset = {x=0,y=0}, align = 'cm', parent = ch_list} + } + G.FUNCS.change_challenge_description{config = {id = 'nil'}} + end + end +end + +G.FUNCS.deck_view_challenge = function(e) + G.FUNCS.overlay_menu{ + definition = create_UIBox_generic_options({back_func = 'deck_info', contents ={ + G.UIDEF.challenge_description(get_challenge_int_from_id(e.config.id.id or ''), nil, true) + } + }) + } +end + +G.FUNCS.profile_select = function(e) + G.SETTINGS.paused = true + G.focused_profile = G.SETTINGS.profile + + for i = 1, 3 do + if i ~= G.focused_profile and love.filesystem.getInfo(i..'/'..'profile.jkr') then G:load_profile(i) end + end + G:load_profile(G.focused_profile) + + G.FUNCS.overlay_menu{ + definition = G.UIDEF.profile_select(), + } +end + +G.FUNCS.quit = function(e) + love.event.quit() +end + +G.FUNCS.quit_cta = function(e) + G.SETTINGS.paused = true + G.SETTINGS.DEMO.quit_CTA_shown = true + + G:save_progress() + + G.FUNCS.overlay_menu{ + definition = create_UIBox_exit_CTA(), + config = {no_esc = true} + } + local Jimbo = nil + + if not G.jimboed then + G.jimboed = true + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = 2.5, + func = (function() + if G.OVERLAY_MENU and G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') then + Jimbo = Card_Character({x = 0, y = 5}) + local spot = G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') + spot.config.object:remove() + spot.config.object = Jimbo + Jimbo.ui_object_updated = true + Jimbo:add_speech_bubble( {"Having fun?", {{text = "Wishlist Balatro!", type = 'GREEN'}}}) + Jimbo:say_stuff(5) + end + return true + end) + })) + end +end + +G.FUNCS.demo_survey = function(e) + love.system.openURL( "https://forms.gle/WX26BHq1AwwV5xyH9")--"https://forms.gle/P8F4WzdCsccrm15T6" ) +end + +G.FUNCS.louisf_insta = function(e) + love.system.openURL( "https://www.instagram.com/louisfsoundtracks/" ) +end + +G.FUNCS.wishlist_steam = function(e) + love.system.openURL( "https://store.steampowered.com/app/2379780/Balatro/#game_area_purchase" ) +end + +G.FUNCS.go_to_playbalatro = function(e) + love.system.openURL( "https://www.playbalatro.com" ) +end + +G.FUNCS.go_to_discord = function(e) + love.system.openURL( "https://discord.gg/balatro" ) +end + +G.FUNCS.go_to_discord_loc = function(e) + love.system.openURL( "https://discord.com/channels/1116389027176787968/1207803392978853898" ) +end + +G.FUNCS.loc_survey = function(e) + love.system.openURL( "https://forms.gle/pL5tMh1oXLmv8czz9" ) +end + +G.FUNCS.go_to_twitter = function(e) + love.system.openURL( "https://twitter.com/LocalThunk" ) +end + +G.FUNCS.unlock_this = function(e) + unlock_achievement(e.config.id) +end + +G.FUNCS.reset_achievements = function(e) + G.ACHIEVEMENTS = nil + G.SETTINGS.ACHIEVEMENTS_EARNED = {} + G:save_progress() + G.FUNCS.exit_overlay_menu() +end + +G.FUNCS.warn_lang = function(e) + local _infotip_object = G.OVERLAY_MENU:get_UIE_by_ID('overlay_menu_infotip') + if (_infotip_object.config.set ~= e.config.ref_table.label) and (not G.F_NO_ACHIEVEMENTS) then + _infotip_object.config.object:remove() + _infotip_object.config.object = UIBox{ + definition = overlay_infotip({e.config.ref_table.warning[1],e.config.ref_table.warning[2],e.config.ref_table.warning[3], lang = e.config.ref_table}), + config = {offset = {x=0,y=0}, align = 'bm', parent = _infotip_object} + } + _infotip_object.config.object.UIRoot:juice_up() + _infotip_object.config.set = e.config.ref_table.label + e.config.disable_button = true + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.35, blockable = false, blocking = false, func = function() + e.config.disable_button = nil;return true end})) + e.config.button = 'change_lang' + play_sound('tarot2', 1, 0.4) + end +end + + + +G.FUNCS.change_lang = function(e) + local lang = e.config.ref_table + if not lang or lang == G.LANG then + G.FUNCS.exit_overlay_menu() + else + G.SETTINGS.language = lang.key + G:set_language() + G.E_MANAGER:clear_queue() + G.FUNCS.wipe_on() + G.E_MANAGER:add_event(Event({ + no_delete = true, + blockable = true, + blocking = false, + func = function() + G:delete_run() + G:init_item_prototypes() + G:main_menu() + return true + end + })) + G.FUNCS.wipe_off() + end +end + +G.FUNCS.copy_seed = function(e) + if G.F_LOCAL_CLIPBOARD then + G.CLIPBOARD = G.GAME.pseudorandom.seed + else + love.system.setClipboardText(G.GAME.pseudorandom.seed) + end +end + +G.FUNCS.start_setup_run = function(e) + if G.OVERLAY_MENU then G.FUNCS.exit_overlay_menu() end + if G.SETTINGS.current_setup == 'New Run' then + if not G.GAME or (not G.GAME.won and not G.GAME.seeded) then + if G.SAVED_GAME ~= nil then + if not G.SAVED_GAME.GAME.won then + G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt = 0 + end + G:save_settings() + end + end + local _seed = G.run_setup_seed and G.setup_seed or G.forced_seed or nil + local _challenge = G.challenge_tab or nil + local _stake = G.forced_stake or G.PROFILES[G.SETTINGS.profile].MEMORY.stake or 1 + G.FUNCS.start_run(e, {stake = _stake, seed = _seed, challenge = _challenge}) + + elseif G.SETTINGS.current_setup == 'Continue' then + if G.SAVED_GAME ~= nil then + G.FUNCS.start_run(nil, {savetext = G.SAVED_GAME}) + end + end +end + +G.FUNCS.start_challenge_run = function(e) + if G.OVERLAY_MENU then G.FUNCS.exit_overlay_menu() end + G.FUNCS.start_run(e, {stake = 1, challenge = G.CHALLENGES[e.config.id]}) +end + +function G.FUNCS.toggle_seeded_run(e) + if e.config.object and not G.run_setup_seed then + e.config.object:remove() + e.config.object = nil + elseif not e.config.object and G.run_setup_seed then + e.config.object = UIBox{ + definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={ + {n=G.UIT.C, config={align = "cm", minw = 2.5, padding = 0.05}, nodes={ + simple_text_container('ml_disabled_seed',{colour = G.C.UI.TEXT_LIGHT, scale = 0.26, shadow = true}), + }}, + {n=G.UIT.C, config={align = "cm", minw = 0.1}, nodes={ + create_text_input({max_length = 8, all_caps = true, ref_table = G, ref_value = 'setup_seed', prompt_text = localize('k_enter_seed')}), + {n=G.UIT.C, config={align = "cm", minw = 0.1}, nodes={}}, + UIBox_button({label = localize('ml_paste_seed'),minw = 1, minh = 0.6, button = 'paste_seed', colour = G.C.BLUE, scale = 0.3, col = true}) + }}, + + {n=G.UIT.C, config={align = "cm", minw = 2.5}, nodes={ + }}, + }}, + config = {offset = {x=0,y=0}, parent = e, type = 'cm'} + } + e.config.object:recalculate() + end +end + +G.FUNCS.start_tutorial = function(e) + if G.OVERLAY_MENU then G.FUNCS.exit_overlay_menu() end + G.SETTINGS.tutorial_progress = + { + forced_shop = {'j_joker', 'c_empress'}, + forced_voucher = 'v_grabber', + forced_tags = {'tag_handy', 'tag_garbage'}, + hold_parts = {}, + completed_parts = {}, + } + G.SETTINGS.tutorial_complete = false + G.FUNCS.start_run(e) +end + +G.FUNCS.chip_UI_set = function(e) + local new_chips_text = number_format(G.GAME.chips) + if G.GAME.chips_text ~= new_chips_text then + e.config.scale = math.min(0.8, scale_number(G.GAME.chips, 1.1)) + G.GAME.chips_text = new_chips_text + end +end + +G.FUNCS.blind_chip_UI_scale = function(e) + if G.GAME.blind and G.GAME.blind.chips then + e.config.scale = scale_number(G.GAME.blind.chips, 0.7, 100000) + end +end + +function scale_number(number, scale, max) + G.E_SWITCH_POINT = G.E_SWITCH_POINT or 100000000000 + if not number or type(number) ~= 'number' then return scale end + if not max then max = 10000 end + if number >= G.E_SWITCH_POINT then + scale = scale*math.floor(math.log(max*10, 10))/math.floor(math.log(1000000*10, 10)) + elseif number >= max then + scale = scale*math.floor(math.log(max*10, 10))/math.floor(math.log(number*10, 10)) + end + return scale +end + +G.FUNCS.hand_mult_UI_set = function(e) + local new_mult_text = number_format(G.GAME.current_round.current_hand.mult) + if new_mult_text ~= G.GAME.current_round.current_hand.mult_text then + G.GAME.current_round.current_hand.mult_text = new_mult_text + e.config.object.scale = scale_number(G.GAME.current_round.current_hand.mult, 0.9, 1000) + e.config.object:update_text() + if not G.TAROT_INTERRUPT_PULSE then G.FUNCS.text_super_juice(e, math.max(0,math.floor(math.log10(type(G.GAME.current_round.current_hand.mult) == 'number' and G.GAME.current_round.current_hand.mult or 1)))) end + end +end + +G.FUNCS.hand_chip_UI_set = function(e) + local new_chip_text = number_format(G.GAME.current_round.current_hand.chips) + if new_chip_text ~= G.GAME.current_round.current_hand.chip_text then + G.GAME.current_round.current_hand.chip_text = new_chip_text + e.config.object.scale = scale_number(G.GAME.current_round.current_hand.chips, 0.9, 1000) + e.config.object:update_text() + if not G.TAROT_INTERRUPT_PULSE then G.FUNCS.text_super_juice(e, math.max(0,math.floor(math.log10(type(G.GAME.current_round.current_hand.chips) == 'number' and G.GAME.current_round.current_hand.chips or 1)))) end + end +end + +G.FUNCS.hand_chip_total_UI_set = function(e) + if G.GAME.current_round.current_hand.chip_total < 1 then + G.GAME.current_round.current_hand.chip_total_text = '' + else + local new_chip_total_text = number_format(G.GAME.current_round.current_hand.chip_total) + if new_chip_total_text ~= G.GAME.current_round.current_hand.chip_total_text then + e.config.object.scale = scale_number(G.GAME.current_round.current_hand.chip_total, 0.95, 100000000) + + G.GAME.current_round.current_hand.chip_total_text = new_chip_total_text + if not G.ARGS.hand_chip_total_UI_set or G.ARGS.hand_chip_total_UI_set < G.GAME.current_round.current_hand.chip_total then + G.FUNCS.text_super_juice(e, math.floor(math.log10(G.GAME.current_round.current_hand.chip_total))) + end + G.ARGS.hand_chip_total_UI_set = G.GAME.current_round.current_hand.chip_total + --e.UIBox:recalculate() + end + end +end + +function G.FUNCS.text_super_juice(e, _amount) + e.config.object:set_quiver(0.03*_amount) + e.config.object:pulse(0.3 + 0.08*_amount) + e.config.object:update_text() + e.config.object:align_letters() + e:update_object() +end + +G.FUNCS.flame_handler = function(e) + G.C.UI_CHIPLICK = G.C.UI_CHIPLICK or {1, 1, 1, 1} + G.C.UI_MULTLICK = G.C.UI_MULTLICK or {1, 1, 1, 1} + for i=1, 3 do + G.C.UI_CHIPLICK[i] = math.min(math.max(((G.C.UI_CHIPS[i]*0.5+G.C.YELLOW[i]*0.5) + 0.1)^2, 0.1), 1) + G.C.UI_MULTLICK[i] = math.min(math.max(((G.C.UI_MULT[i]*0.5+G.C.YELLOW[i]*0.5) + 0.1)^2, 0.1), 1) + end + + G.ARGS.flame_handler = G.ARGS.flame_handler or { + chips = { + id = 'flame_chips', + arg_tab = 'chip_flames', + colour = G.C.UI_CHIPS, + accent = G.C.UI_CHIPLICK + }, + mult = { + id = 'flame_mult', + arg_tab = 'mult_flames', + colour = G.C.UI_MULT, + accent = G.C.UI_MULTLICK + } + } + for k, v in pairs(G.ARGS.flame_handler) do + if e.config.id == v.id then + if not e.config.object:is(Sprite) or e.config.object.ID ~= v.ID then + e.config.object:remove() + e.config.object = Sprite(0, 0, 2.5, 2.5, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + v.ID = e.config.object.ID + G.ARGS[v.arg_tab] = { + intensity = 0, + real_intensity = 0, + intensity_vel = 0, + colour_1 = v.colour, + colour_2 = v.accent, + timer = G.TIMERS.REAL + } + e.config.object:set_alignment({ + major = e.parent, + type = 'bmi', + offset = {x=0,y=0}, + xy_bond = 'Weak' + }) + e.config.object:define_draw_steps({{ + shader = 'flame', + send = { + {name = 'time', ref_table = G.ARGS[v.arg_tab], ref_value = 'timer'}, + {name = 'amount', ref_table = G.ARGS[v.arg_tab], ref_value = 'real_intensity'}, + {name = 'image_details', ref_table = e.config.object, ref_value = 'image_dims'}, + {name = 'texture_details', ref_table = e.config.object.RETS, ref_value = 'get_pos_pixel'}, + {name = 'colour_1', ref_table = G.ARGS[v.arg_tab], ref_value = 'colour_1'}, + {name = 'colour_2', ref_table = G.ARGS[v.arg_tab], ref_value = 'colour_2'}, + {name = 'id', val = e.config.object.ID}, + }}}) + e.config.object:get_pos_pixel() + end + local _F = G.ARGS[v.arg_tab] + local exptime = math.exp(-0.4*G.real_dt) + + if G.ARGS.score_intensity.earned_score >= G.ARGS.score_intensity.required_score and G.ARGS.score_intensity.required_score > 0 then + _F.intensity = ((G.pack_cards and not G.pack_cards.REMOVED) or (G.TAROT_INTERRUPT)) and 0 or math.max(0., math.log(G.ARGS.score_intensity.earned_score, 5)-2) + else + _F.intensity = 0 + end + + _F.timer = _F.timer + G.real_dt*(1 + _F.intensity*0.2) + if _F.intensity_vel < 0 then _F.intensity_vel = _F.intensity_vel*(1 - 10*G.real_dt) end + _F.intensity_vel = (1-exptime)*(_F.intensity - _F.real_intensity)*G.real_dt*25 + exptime*_F.intensity_vel + _F.real_intensity = math.max(0, _F.real_intensity + _F.intensity_vel) + _F.change = (_F.change or 0)*(1 - 4.*G.real_dt) + ( 4.*G.real_dt)*(_F.real_intensity < _F.intensity - 0.0 and 1 or 0)*_F.real_intensity + end + end +end + +G.FUNCS.hand_text_UI_set = function(e) + if G.GAME.current_round.current_hand.handname ~= G.GAME.current_round.current_hand.handname_text then + G.GAME.current_round.current_hand.handname_text = G.GAME.current_round.current_hand.handname + if G.GAME.current_round.current_hand.handname:len() >= 13 then + e.config.object.scale = 12*0.56/G.GAME.current_round.current_hand.handname:len() + else + e.config.object.scale = 2.4/math.sqrt(G.GAME.current_round.current_hand.handname:len()+5) + end + e.config.object:update_text() + end +end + + G.FUNCS.can_play = function(e) + if #G.hand.highlighted <= 0 or G.GAME.blind.block_play or #G.hand.highlighted > 5 then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.BLUE + e.config.button = 'play_cards_from_highlighted' + end + end + + G.FUNCS.can_start_run = function(e) + if not G.GAME.viewed_back.effect.center.unlocked then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.BLUE + e.config.button = 'start_setup_run' + end + end + + G.FUNCS.visible_blind = function(e) + if next(G.GAME.blind.config.blind) then + e.states.visible = true + else + e.states.visible = false + end + end + + G.FUNCS.can_reroll = function(e) + if ((G.GAME.dollars-G.GAME.bankrupt_at) - G.GAME.current_round.reroll_cost < 0) and G.GAME.current_round.reroll_cost ~= 0 then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + --e.children[1].children[1].config.shadow = false + --e.children[2].children[1].config.shadow = false + --e.children[2].children[2].config.shadow = false + else + e.config.colour = G.C.GREEN + e.config.button = 'reroll_shop' + --e.children[1].children[1].config.shadow = true + --e.children[2].children[1].config.shadow = true + --e.children[2].children[2].config.shadow = true + end + end + + G.FUNCS.can_discard = function(e) + if G.GAME.current_round.discards_left <= 0 or #G.hand.highlighted <= 0 then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.RED + e.config.button = 'discard_cards_from_highlighted' + end + end + + G.FUNCS.can_use_consumeable = function(e) + if e.config.ref_table:can_use_consumeable() then + e.config.colour = G.C.RED + e.config.button = 'use_card' + else + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + end + end + + G.FUNCS.can_select_card = function(e) + if e.config.ref_table.ability.set ~= 'Joker' or (e.config.ref_table.edition and e.config.ref_table.edition.negative) or #G.jokers.cards < G.jokers.config.card_limit then + e.config.colour = G.C.GREEN + e.config.button = 'use_card' + else + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + end + end + + G.FUNCS.can_sell_card = function(e) + if e.config.ref_table:can_sell_card() then + e.config.colour = G.C.GREEN + e.config.button = 'sell_card' + else + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + end + end + + G.FUNCS.can_skip_booster = function(e) + if G.pack_cards and G.pack_cards.cards[1] and + (G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.STANDARD_PACK or G.STATE == G.STATES.BUFFOON_PACK or (G.hand and G.hand.cards[1])) then + e.config.colour = G.C.GREY + e.config.button = 'skip_booster' + else + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + end + end + + G.FUNCS.show_infotip = function(e) + if e.config.ref_table then + e.children.info = UIBox{ + definition = {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, padding = 0.02}, nodes=e.config.ref_table}, + config = {offset = {x=-0.03,y=0}, align = 'cl', parent = e} + } + e.children.info:align_to_major() + e.config.ref_table = nil + end + end + + + G.FUNCS.use_card = function(e, mute, nosave) + e.config.button = nil + local card = e.config.ref_table + local area = card.area + local prev_state = G.STATE + local dont_dissolve = nil + local delay_fac = 1 + + if card:check_use() then + G.E_MANAGER:add_event(Event({func = function() + e.disable_button = nil + e.config.button = 'use_card' + return true end })) + return + end + + if card.ability.set == 'Booster' and not nosave and G.STATE == G.STATES.SHOP then + save_with_action({ + type = 'use_card', + card = card.sort_id, + }) + end + + G.TAROT_INTERRUPT = G.STATE + if card.ability.set == 'Booster' then G.GAME.PACK_INTERRUPT = G.STATE end + G.STATE = (G.STATE == G.STATES.TAROT_PACK and G.STATES.TAROT_PACK) or + (G.STATE == G.STATES.PLANET_PACK and G.STATES.PLANET_PACK) or + (G.STATE == G.STATES.SPECTRAL_PACK and G.STATES.SPECTRAL_PACK) or + (G.STATE == G.STATES.STANDARD_PACK and G.STATES.STANDARD_PACK) or + (G.STATE == G.STATES.BUFFOON_PACK and G.STATES.BUFFOON_PACK) or + G.STATES.PLAY_TAROT + + G.CONTROLLER.locks.use = true + if G.booster_pack and not G.booster_pack.alignment.offset.py and (card.ability.consumeable or not (G.GAME.pack_choices and G.GAME.pack_choices > 1)) then + G.booster_pack.alignment.offset.py = G.booster_pack.alignment.offset.y + G.booster_pack.alignment.offset.y = G.ROOM.T.y + 29 + end + if G.shop and not G.shop.alignment.offset.py then + G.shop.alignment.offset.py = G.shop.alignment.offset.y + G.shop.alignment.offset.y = G.ROOM.T.y + 29 + end + if G.blind_select and not G.blind_select.alignment.offset.py then + G.blind_select.alignment.offset.py = G.blind_select.alignment.offset.y + G.blind_select.alignment.offset.y = G.ROOM.T.y + 39 + end + if G.round_eval and not G.round_eval.alignment.offset.py then + G.round_eval.alignment.offset.py = G.round_eval.alignment.offset.y + G.round_eval.alignment.offset.y = G.ROOM.T.y + 29 + end + + if card.children.use_button then card.children.use_button:remove(); card.children.use_button = nil end + if card.children.sell_button then card.children.sell_button:remove(); card.children.sell_button = nil end + if card.children.price then card.children.price:remove(); card.children.price = nil end + + if card.area then card.area:remove_card(card) end + + if card.ability.consumeable then + if G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.SPECTRAL_PACK then + card.T.x = G.hand.T.x + G.hand.T.w/2 - card.T.w/2 + card.T.y = G.hand.T.y + G.hand.T.h/2 - card.T.h/2 - 0.5 + discover_card(card.config.center) + else draw_card(G.hand, G.play, 1, 'up', true, card, nil, mute) end + delay(0.2) + e.config.ref_table:use_consumeable(area) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({using_consumeable = true, consumeable = card}) + end + elseif card.ability.set == 'Enhanced' or card.ability.set == 'Default' then + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + G.deck:emplace(card) + play_sound('card1', 0.8, 0.6) + play_sound('generic1') + card.playing_card = G.playing_card + playing_card_joker_effects({card}) + card:add_to_deck() + table.insert(G.playing_cards, card) + dont_dissolve = true + delay_fac = 0.2 + elseif card.ability.set == 'Joker' then + card:add_to_deck() + G.jokers:emplace(card) + play_sound('card1', 0.8, 0.6) + play_sound('generic1') + dont_dissolve = true + delay_fac = 0.2 + elseif card.ability.set == 'Booster' then + delay(0.1) + if card.ability.booster_pos then G.GAME.current_round.used_packs[card.ability.booster_pos] = 'USED' end + draw_card(G.hand, G.play, 1, 'up', true, card, nil, true) + if not card.from_tag then + G.GAME.round_scores.cards_purchased.amt = G.GAME.round_scores.cards_purchased.amt + 1 + end + e.config.ref_table:open() + elseif card.ability.set == 'Voucher' then + delay(0.1) + draw_card(G.hand, G.play, 1, 'up', true, card, nil, true) + G.GAME.round_scores.cards_purchased.amt = G.GAME.round_scores.cards_purchased.amt + 1 + e.config.ref_table:redeem() + end + if card.ability.set == 'Booster' then + G.CONTROLLER.locks.use = false + G.TAROT_INTERRUPT = nil + else + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2, + func = function() + if not dont_dissolve then card:start_dissolve() end + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1, + func = function() + G.STATE = prev_state + G.TAROT_INTERRUPT=nil + G.CONTROLLER.locks.use = false + + if (prev_state == G.STATES.TAROT_PACK or prev_state == G.STATES.PLANET_PACK or + prev_state == G.STATES.SPECTRAL_PACK or prev_state == G.STATES.STANDARD_PACK or + prev_state == G.STATES.BUFFOON_PACK) and G.booster_pack then + if area == G.consumeables then + G.booster_pack.alignment.offset.y = G.booster_pack.alignment.offset.py + G.booster_pack.alignment.offset.py = nil + elseif G.GAME.pack_choices and G.GAME.pack_choices > 1 then + if G.booster_pack.alignment.offset.py then + G.booster_pack.alignment.offset.y = G.booster_pack.alignment.offset.py + G.booster_pack.alignment.offset.py = nil + end + G.GAME.pack_choices = G.GAME.pack_choices - 1 + else + G.CONTROLLER.interrupt.focus = true + if prev_state == G.STATES.TAROT_PACK then inc_career_stat('c_tarot_reading_used', 1) end + if prev_state == G.STATES.PLANET_PACK then inc_career_stat('c_planetarium_used', 1) end + G.FUNCS.end_consumeable(nil, delay_fac) + end + else + if G.shop then + G.shop.alignment.offset.y = G.shop.alignment.offset.py + G.shop.alignment.offset.py = nil + end + if G.blind_select then + G.blind_select.alignment.offset.y = G.blind_select.alignment.offset.py + G.blind_select.alignment.offset.py = nil + end + if G.round_eval then + G.round_eval.alignment.offset.y = G.round_eval.alignment.offset.py + G.round_eval.alignment.offset.py = nil + end + if area and area.cards[1] then + G.E_MANAGER:add_event(Event({func = function() + G.E_MANAGER:add_event(Event({func = function() + G.CONTROLLER.interrupt.focus = nil + if card.ability.set == 'Voucher' then + G.CONTROLLER:snap_to({node = G.shop:get_UIE_by_ID('next_round_button')}) + elseif area then + G.CONTROLLER:recall_cardarea_focus(area) + end + return true end })) + return true end })) + end + end + return true + end})) + return true + end})) + end + end + + G.FUNCS.sell_card = function(e) + local card = e.config.ref_table + card:sell_card() + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] ~= card then + G.jokers.cards[i]:calculate_joker({selling_card = true, card = card}) + end + end + end + + G.FUNCS.can_confirm_contest_name = function(e) + if G.SETTINGS.COMP and G.SETTINGS.COMP.name ~= '' then + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + else + e.config.colour = G.C.PALE_GREEN + e.config.button = 'confirm_contest_name' + end + end + + G.FUNCS.confirm_contest_name = function(e) + G.SETTINGS.COMP.submission_name = true + if G.MAIN_MENU_UI then G.MAIN_MENU_UI:remove() end + if G.PROFILE_BUTTON then G.PROFILE_BUTTON:remove() end + set_main_menu_UI() + G:save_progress() + G.FILE_HANDLER.force = true + end + + G.FUNCS.change_contest_name = function(e) + G.SETTINGS.COMP.name = '' + if G.MAIN_MENU_UI then G.MAIN_MENU_UI:remove() end + if G.PROFILE_BUTTON then G.PROFILE_BUTTON:remove() end + set_main_menu_UI() + end + + G.FUNCS.skip_tutorial_section = function(e) + G.OVERLAY_TUTORIAL.skip_steps = true + + if G.OVERLAY_TUTORIAL.Jimbo then G.OVERLAY_TUTORIAL.Jimbo:remove() end + if G.OVERLAY_TUTORIAL.content then G.OVERLAY_TUTORIAL.content:remove() end + G.OVERLAY_TUTORIAL:remove() + G.OVERLAY_TUTORIAL = nil + G.E_MANAGER:clear_queue('tutorial') + if G.SETTINGS.tutorial_progress.section == 'small_blind' then + G.SETTINGS.tutorial_progress.completed_parts['small_blind'] = true + elseif G.SETTINGS.tutorial_progress.section == 'big_blind' then + G.SETTINGS.tutorial_progress.completed_parts['big_blind'] = true + G.SETTINGS.tutorial_progress.forced_tags = nil + elseif G.SETTINGS.tutorial_progress.section == 'second_hand' then + G.SETTINGS.tutorial_progress.completed_parts['second_hand'] = true + G.SETTINGS.tutorial_progress.hold_parts['second_hand'] = true + elseif G.SETTINGS.tutorial_progress.section == 'first_hand' then + G.SETTINGS.tutorial_progress.completed_parts['first_hand'] = true + G.SETTINGS.tutorial_progress.completed_parts['first_hand_2'] = true + G.SETTINGS.tutorial_progress.completed_parts['first_hand_3'] = true + G.SETTINGS.tutorial_progress.completed_parts['first_hand_4'] = true + G.SETTINGS.tutorial_progress.completed_parts['first_hand_section'] = true + elseif G.SETTINGS.tutorial_progress.section == 'shop' then + G.SETTINGS.tutorial_progress.completed_parts['shop_1'] = true + G.SETTINGS.tutorial_progress.forced_voucher = nil + end + end + +G.FUNCS.shop_voucher_empty = function(e) + if (G.shop_vouchers and G.shop_vouchers.cards and (G.shop_vouchers.cards[1] or G.GAME.current_round.voucher)) then + e.states.visible = false + elseif G.SETTINGS.language ~= 'en-us' then + e.states.visible = false + else + e.states.visible = true + end +end + +G.FUNCS.check_for_buy_space = function(card) + if card.ability.set ~= 'Voucher' and + card.ability.set ~= 'Enhanced' and + card.ability.set ~= 'Default' and + not (card.ability.set == 'Joker' and #G.jokers.cards < G.jokers.config.card_limit + ((card.edition and card.edition.negative) and 1 or 0)) and + not (card.ability.consumeable and #G.consumeables.cards < G.consumeables.config.card_limit + ((card.edition and card.edition.negative) and 1 or 0)) then + alert_no_space(card, card.ability.consumeable and G.consumeables or G.jokers) + return false + end + return true +end + +G.FUNCS.buy_from_shop = function(e) + local c1 = e.config.ref_table + if c1 and c1:is(Card) then + if e.config.id ~= 'buy_and_use' then + if not G.FUNCS.check_for_buy_space(c1) then + e.disable_button = nil + return false + end + end + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + c1.area:remove_card(c1) + c1:add_to_deck() + if c1.children.price then c1.children.price:remove() end + c1.children.price = nil + if c1.children.buy_button then c1.children.buy_button:remove() end + c1.children.buy_button = nil + remove_nils(c1.children) + if c1.ability.set == 'Default' or c1.ability.set == 'Enhanced' then + inc_career_stat('c_playing_cards_bought', 1) + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + G.deck:emplace(c1) + c1.playing_card = G.playing_card + playing_card_joker_effects({c1}) + table.insert(G.playing_cards, c1) + elseif e.config.id ~= 'buy_and_use' then + if c1.ability.consumeable then + G.consumeables:emplace(c1) + else + G.jokers:emplace(c1) + end + G.E_MANAGER:add_event(Event({func = function() c1:calculate_joker({buying_card = true, card = c1}) return true end})) + end + --Tallies for unlocks + G.GAME.round_scores.cards_purchased.amt = G.GAME.round_scores.cards_purchased.amt + 1 + if c1.ability.consumeable then + if c1.config.center.set == 'Planet' then + inc_career_stat('c_planets_bought', 1) + elseif c1.config.center.set == 'Tarot' then + inc_career_stat('c_tarots_bought', 1) + end + elseif c1.ability.set == 'Joker' then + G.GAME.current_round.jokers_purchased = G.GAME.current_round.jokers_purchased + 1 + end + + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({buying_card = true, card = c1}) + end + + if G.GAME.modifiers.inflation then + G.GAME.inflation = G.GAME.inflation + 1 + G.E_MANAGER:add_event(Event({func = function() + for k, v in pairs(G.I.CARD) do + if v.set_cost then v:set_cost() end + end + return true end })) + end + + play_sound('card1') + inc_career_stat('c_shop_dollars_spent', c1.cost) + if c1.cost ~= 0 then + ease_dollars(-c1.cost) + end + G.CONTROLLER:save_cardarea_focus('jokers') + G.CONTROLLER:recall_cardarea_focus('jokers') + + if e.config.id == 'buy_and_use' then + G.FUNCS.use_card(e, true) + end + return true + end + })) + end +end + + G.FUNCS.toggle_shop = function(e) + stop_use() + G.CONTROLLER.locks.toggle_shop = true + if G.shop then + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({ending_shop = true}) + end + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.shop.alignment.offset.y = G.ROOM.T.y + 29 + G.SHOP_SIGN.alignment.offset.y = -15 + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = function() + G.shop:remove() + G.shop = nil + G.SHOP_SIGN:remove() + G.SHOP_SIGN = nil + G.STATE_COMPLETE = false + G.STATE = G.STATES.BLIND_SELECT + if G.GAME.round_resets.blind_states.Boss == 'Defeated' then + G.GAME.round_resets.blind_ante = G.GAME.round_resets.ante + G.GAME.round_resets.blind_tags.Small = get_next_tag_key() + G.GAME.round_resets.blind_tags.Big = get_next_tag_key() + end + G.CONTROLLER.locks.toggle_shop = nil + return true + end + })) + end + end + + G.FUNCS.select_blind = function(e) + stop_use() + if G.blind_select then + G.GAME.facing_blind = true + G.blind_prompt_box:get_UIE_by_ID('prompt_dynatext1').config.object.pop_delay = 0 + G.blind_prompt_box:get_UIE_by_ID('prompt_dynatext1').config.object:pop_out(5) + G.blind_prompt_box:get_UIE_by_ID('prompt_dynatext2').config.object.pop_delay = 0 + G.blind_prompt_box:get_UIE_by_ID('prompt_dynatext2').config.object:pop_out(5) + + G.E_MANAGER:add_event(Event({ + trigger = 'before', delay = 0.2, + func = function() + G.blind_prompt_box.alignment.offset.y = -10 + G.blind_select.alignment.offset.y = 40 + G.blind_select.alignment.offset.x = 0 + return true + end})) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + ease_round(1) + inc_career_stat('c_rounds', 1) + if _DEMO then + G.SETTINGS.DEMO_ROUNDS = (G.SETTINGS.DEMO_ROUNDS or 0) + 1 + inc_steam_stat('demo_rounds') + G:save_settings() + end + G.GAME.round_resets.blind = e.config.ref_table + G.GAME.round_resets.blind_states[G.GAME.blind_on_deck] = 'Current' + G.blind_select:remove() + G.blind_prompt_box:remove() + G.blind_select = nil + delay(0.2) + return true + end})) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + new_round() + return true + end + })) + end + end + + G.FUNCS.skip_booster = function(e) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({skipping_booster = true}) + end + G.FUNCS.end_consumeable(e) + end + + G.FUNCS.end_consumeable = function(e, delayfac) + delayfac = delayfac or 1 + stop_use() + if G.booster_pack then + if G.booster_pack_sparkles then G.booster_pack_sparkles:fade(1*delayfac) end + if G.booster_pack_stars then G.booster_pack_stars:fade(1*delayfac) end + if G.booster_pack_meteors then G.booster_pack_meteors:fade(1*delayfac) end + G.booster_pack.alignment.offset.y = G.ROOM.T.y + 9 + + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2*delayfac,blocking = false, blockable = false, + func = function() + G.booster_pack:remove() + G.booster_pack = nil + return true + end})) + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 1*delayfac,blocking = false, blockable = false, + func = function() + if G.booster_pack_sparkles then G.booster_pack_sparkles:remove(); G.booster_pack_sparkles = nil end + if G.booster_pack_stars then G.booster_pack_stars:remove(); G.booster_pack_stars = nil end + if G.booster_pack_meteors then G.booster_pack_meteors:remove(); G.booster_pack_meteors = nil end + return true + end})) + end + + delay(0.2*delayfac) + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2*delayfac, + func = function() + G.FUNCS.draw_from_hand_to_deck() + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2*delayfac, + func = function() + if G.shop and G.shop.alignment.offset.py then + G.shop.alignment.offset.y = G.shop.alignment.offset.py + G.shop.alignment.offset.py = nil + end + if G.blind_select and G.blind_select.alignment.offset.py then + G.blind_select.alignment.offset.y = G.blind_select.alignment.offset.py + G.blind_select.alignment.offset.py = nil + end + if G.round_eval and G.round_eval.alignment.offset.py then + G.round_eval.alignment.offset.y = G.round_eval.alignment.offset.py + G.round_eval.alignment.offset.py = nil + end + G.CONTROLLER.interrupt.focus = true + + G.E_MANAGER:add_event(Event({func = function() + if G.shop then G.CONTROLLER:snap_to({node = G.shop:get_UIE_by_ID('next_round_button')}) end + return true end })) + G.STATE = G.GAME.PACK_INTERRUPT + ease_background_colour_blind(G.GAME.PACK_INTERRUPT) + G.GAME.PACK_INTERRUPT = nil + return true + end})) + for i = 1, #G.GAME.tags do + if G.GAME.tags[i]:apply_to_run({type = 'new_blind_choice'}) then break end + end + + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2*delayfac, + func = function() + save_run() + return true + end})) + + return true + end})) + end + + G.FUNCS.blind_choice_handler = function(e) + if not e.config.ref_table.run_info and G.blind_select and G.blind_select.VT.y < 10 and e.config.id and G.blind_select_opts[string.lower(e.config.id)] then + if e.UIBox.role.xy_bond ~= 'Weak' then e.UIBox:set_role({xy_bond = 'Weak'}) end + if (e.config.ref_table.deck ~= 'on' and e.config.id == G.GAME.blind_on_deck) or + (e.config.ref_table.deck ~= 'off' and e.config.id ~= G.GAME.blind_on_deck) then + + local _blind_choice = G.blind_select_opts[string.lower(e.config.id)] + local _top_button = e.UIBox:get_UIE_by_ID('select_blind_button') + local _border = e.UIBox.UIRoot.children[1].children[1] + local _tag = e.UIBox:get_UIE_by_ID('tag_'..e.config.id) + local _tag_container = e.UIBox:get_UIE_by_ID('tag_container') + if _tag_container and not G.SETTINGS.tutorial_complete and not G.SETTINGS.tutorial_progress.completed_parts['shop_1'] then _tag_container.states.visible = false + elseif _tag_container then _tag_container.states.visible = true end + if e.config.id == G.GAME.blind_on_deck then + e.config.ref_table.deck = 'on' + e.config.draw_after = false + e.config.colour = G.C.CLEAR + _border.parent.config.outline = 2 + _border.parent.config.outline_colour = G.C.UI.TRANSPARENT_DARK + _border.config.outline_colour = _border.config.outline and _border.config.outline_colour or get_blind_main_colour(e.config.id) + _border.config.outline = 1.5 + _blind_choice.alignment.offset.y = -0.9 + if _tag and _tag_container then + _tag_container.children[2].config.draw_after = false + _tag_container.children[2].config.colour = G.C.BLACK + _tag.children[2].config.button = 'skip_blind' + _tag.config.outline_colour = adjust_alpha(G.C.BLUE, 0.5) + _tag.children[2].config.hover = true + _tag.children[2].config.colour = G.C.RED + _tag.children[2].children[1].config.colour = G.C.UI.TEXT_LIGHT + local _sprite = _tag.config.ref_table + _sprite.config.force_focus = nil + end + if _top_button then + G.E_MANAGER:add_event(Event({func = function() + G.CONTROLLER:snap_to({node = _top_button}) + return true end })) + _top_button.config.button = 'select_blind' + _top_button.config.colour = G.C.FILTER + _top_button.config.hover = true + _top_button.children[1].config.colour = G.C.WHITE + end + elseif e.config.id ~= G.GAME.blind_on_deck then + e.config.ref_table.deck = 'off' + e.config.draw_after = true + e.config.colour = adjust_alpha(G.GAME.round_resets.blind_states[e.config.id] == 'Skipped' and mix_colours(G.C.BLUE, G.C.L_BLACK, 0.1) or G.C.L_BLACK, 0.5) + _border.parent.config.outline = nil + _border.parent.config.outline_colour = nil + _border.config.outline_colour = nil + _border.config.outline = nil + _blind_choice.alignment.offset.y = -0.2 + if _tag and _tag_container then + if G.GAME.round_resets.blind_states[e.config.id] == 'Skipped' or + G.GAME.round_resets.blind_states[e.config.id] == 'Defeated' then + _tag_container.children[2]:set_role({xy_bond = 'Weak'}) + _tag_container.children[2]:align(0, 10) + _tag_container.children[1]:set_role({xy_bond = 'Weak'}) + _tag_container.children[1]:align(0, 10) + end + if G.GAME.round_resets.blind_states[e.config.id] == 'Skipped' then + _blind_choice.children.alert = UIBox{ + definition = create_UIBox_card_alert({text_rot = -0.35, no_bg = true,text = localize('k_skipped_cap'), bump_amount = 1, scale = 0.9, maxw = 3.4}), + config = { + align="tmi", + offset = {x = 0, y = 2.2}, + major = _blind_choice, parent = _blind_choice} + } + end + _tag.children[2].config.button = nil + _tag.config.outline_colour = G.C.UI.BACKGROUND_INACTIVE + _tag.children[2].config.hover = false + _tag.children[2].config.colour = G.C.UI.BACKGROUND_INACTIVE + _tag.children[2].children[1].config.colour = G.C.UI.TEXT_INACTIVE + local _sprite = _tag.config.ref_table + _sprite.config.force_focus = true + end + if _top_button then + _top_button.config.colour = G.C.UI.BACKGROUND_INACTIVE + _top_button.config.button = nil + _top_button.config.hover = false + _top_button.children[1].config.colour = G.C.UI.TEXT_INACTIVE + end + end + end + end + end + + G.FUNCS.hover_tag_proxy = function(e) + if not e.parent or not e.parent.states then return end + if (e.states.hover.is or e.parent.states.hover.is) and (e.created_on_pause == G.SETTINGS.paused) and + not e.parent.children.alert then + local _sprite = e.config.ref_table:get_uibox_table() + e.parent.children.alert = UIBox{ + definition = G.UIDEF.card_h_popup(_sprite), + config = {align="tm", offset = {x = 0, y = -0.1}, + major = e.parent, + instance_type = 'POPUP'}, + } + _sprite:juice_up(0.05, 0.02) + play_sound('paper1', math.random()*0.1 + 0.55, 0.42) + play_sound('tarot2', math.random()*0.1 + 0.55, 0.09) + e.parent.children.alert.states.collide.can = false + elseif e.parent.children.alert and + ((not e.states.collide.is and not e.parent.states.collide.is) or (e.created_on_pause ~= G.SETTINGS.paused)) then + e.parent.children.alert:remove() + e.parent.children.alert = nil + end + end + + G.FUNCS.skip_blind = function(e) + stop_use() + G.CONTROLLER.locks.skip_blind = true + G.E_MANAGER:add_event(Event({ + no_delete = true, + trigger = 'after', + blocking = false,blockable = false, + delay = 2.5, + timer = 'TOTAL', + func = function() + G.CONTROLLER.locks.skip_blind = nil + return true + end + })) + local _tag = e.UIBox:get_UIE_by_ID('tag_container') + G.GAME.skips = (G.GAME.skips or 0) + 1 + if _tag then + add_tag(_tag.config.ref_table) + local skipped, skip_to = G.GAME.blind_on_deck or 'Small', + G.GAME.blind_on_deck == 'Small' and 'Big' or G.GAME.blind_on_deck == 'Big' and 'Boss' or 'Boss' + G.GAME.round_resets.blind_states[skipped] = 'Skipped' + G.GAME.round_resets.blind_states[skip_to] = 'Select' + G.GAME.blind_on_deck = skip_to + play_sound('generic1') + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + delay(0.3) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({skip_blind = true}) + end + save_run() + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'immediate'}) + end + for i = 1, #G.GAME.tags do + if G.GAME.tags[i]:apply_to_run({type = 'new_blind_choice'}) then break end + end + return true + end + })) + end + end + + G.FUNCS.reroll_boss_button = function(e) + if ((G.GAME.dollars-G.GAME.bankrupt_at) - 10 >= 0) and + (G.GAME.used_vouchers["v_retcon"] or + (G.GAME.used_vouchers["v_directors_cut"] and not G.GAME.round_resets.boss_rerolled)) then + e.config.colour = G.C.RED + e.config.button = 'reroll_boss' + e.children[1].children[1].config.shadow = true + if e.children[2] then e.children[2].children[1].config.shadow = true end + else + e.config.colour = G.C.UI.BACKGROUND_INACTIVE + e.config.button = nil + e.children[1].children[1].config.shadow = false + if e.children[2] then e.children[2].children[1].config.shadow = false end + end + end + + G.FUNCS.reroll_boss = function(e) + stop_use() + G.GAME.round_resets.boss_rerolled = true + if not G.from_boss_tag then ease_dollars(-10) end + G.from_boss_tag = nil + G.CONTROLLER.locks.boss_reroll = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + play_sound('other1') + G.blind_select_opts.boss:set_role({xy_bond = 'Weak'}) + G.blind_select_opts.boss.alignment.offset.y = 20 + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.3, + func = (function() + local par = G.blind_select_opts.boss.parent + G.GAME.round_resets.blind_choices.Boss = get_new_boss() + + G.blind_select_opts.boss:remove() + G.blind_select_opts.boss = UIBox{ + T = {par.T.x, 0, 0, 0, }, + 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=G.ROOM.T.y + 9}, + major = par, + xy_bond = 'Weak' + } + } + par.config.object = G.blind_select_opts.boss + par.config.object:recalculate() + G.blind_select_opts.boss.parent = par + G.blind_select_opts.boss.alignment.offset.y = 0 + + G.E_MANAGER:add_event(Event({blocking = false, trigger = 'after', delay = 0.5,func = function() + G.CONTROLLER.locks.boss_reroll = nil + return true + end + })) + + save_run() + for i = 1, #G.GAME.tags do + if G.GAME.tags[i]:apply_to_run({type = 'new_blind_choice'}) then break end + end + return true + end) + })) + end + + G.FUNCS.reroll_shop = function(e) + stop_use() + G.CONTROLLER.locks.shop_reroll = true + if G.CONTROLLER:save_cardarea_focus('shop_jokers') then G.CONTROLLER.interrupt.focus = true end + if G.GAME.current_round.reroll_cost > 0 then + inc_career_stat('c_shop_dollars_spent', G.GAME.current_round.reroll_cost) + inc_career_stat('c_shop_rerolls', 1) + ease_dollars(-G.GAME.current_round.reroll_cost) + end + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + local final_free = G.GAME.current_round.free_rerolls > 0 + G.GAME.current_round.free_rerolls = math.max(G.GAME.current_round.free_rerolls - 1, 0) + G.GAME.round_scores.times_rerolled.amt = G.GAME.round_scores.times_rerolled.amt + 1 + + calculate_reroll_cost(final_free) + for i = #G.shop_jokers.cards,1, -1 do + local c = G.shop_jokers:remove_card(G.shop_jokers.cards[i]) + c:remove() + c = nil + end + + --save_run() + + play_sound('coin2') + play_sound('other1') + + for i = 1, G.GAME.shop.joker_max - #G.shop_jokers.cards do + local new_shop_card = create_card_for_shop(G.shop_jokers) + G.shop_jokers:emplace(new_shop_card) + new_shop_card:juice_up() + end + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.3, + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + G.CONTROLLER.interrupt.focus = false + G.CONTROLLER.locks.shop_reroll = false + G.CONTROLLER:recall_cardarea_focus('shop_jokers') + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({reroll_shop = true}) + end + return true + end + })) + return true + end + })) + G.E_MANAGER:add_event(Event({ func = function() save_run(); return true end})) + end + +G.FUNCS.cash_out = function(e) + stop_use() + if G.round_eval then + e.config.button = nil + G.round_eval.alignment.offset.y = G.ROOM.T.y + 15 + G.round_eval.alignment.offset.x = 0 + G.deck:shuffle('cashout'..G.GAME.round_resets.ante) + G.deck:hard_set_T() + delay(0.3) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + if G.round_eval then + G.round_eval:remove() + G.round_eval = nil + end + G.GAME.current_round.jokers_purchased = 0 + G.GAME.current_round.discards_left = math.max(0, G.GAME.round_resets.discards + G.GAME.round_bonus.discards) + G.GAME.current_round.hands_left = (math.max(1, G.GAME.round_resets.hands + G.GAME.round_bonus.next_hands)) + G.STATE = G.STATES.SHOP + G.GAME.shop_free = nil + G.GAME.shop_d6ed = nil + G.STATE_COMPLETE = false + return true + end + })) + ease_dollars(G.GAME.current_round.dollars) + G.E_MANAGER:add_event(Event({ + func = function() + G.GAME.previous_round.dollars = G.GAME.dollars + return true + end + })) + play_sound("coin7") + G.VIBRATION = G.VIBRATION + 1 + end + ease_chips(0) + delay(0.6) +end + +G.FUNCS.start_run = function(e, args) + G.SETTINGS.paused = true + if e and e.config.id == 'restart_button' then G.GAME.viewed_back = nil end + G.E_MANAGER:clear_queue() + G.FUNCS.wipe_on() + G.E_MANAGER:add_event(Event({ + no_delete = true, + func = function() + G:delete_run() + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + no_delete = true, + func = function() + G:start_run(args) + return true + end + })) + G.FUNCS.wipe_off() +end + +G.FUNCS.go_to_menu = function(e) + G.SETTINGS.paused = true + G.E_MANAGER:clear_queue() + G.FUNCS.wipe_on() + G.E_MANAGER:add_event(Event({ + no_delete = true, + func = function() + G:delete_run() + return true + end + })) + G.E_MANAGER:add_event(Event({ + no_delete = true, + blockable = true, + blocking = false, + func = function() + G:main_menu('game') + return true + end + })) + G.FUNCS.wipe_off() +end + +G.FUNCS.go_to_demo_cta = function(e) + G.SETTINGS.paused = true + G.E_MANAGER:clear_queue(nil, G.exception_queue) + play_sound('explosion_buildup1', nil, 0.3) + play_sound('whoosh1', 0.7, 0.8) + play_sound('introPad1', 0.704, 0.8) + G.video_organ = 0.6 + G.FUNCS.wipe_on(nil, true, nil, G.C.WHITE) + G.E_MANAGER:add_event(Event({ + no_delete = true, + func = function() + G:delete_run() + return true + end + })) + G.E_MANAGER:add_event(Event({ + no_delete = true, + blockable = true, + blocking = false, + func = function() + G:demo_cta() + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, + no_delete = true, + blockable = false, + blocking = false, + func = function() + G.video_organ = nil + G.normal_music_speed = nil + return true + end })) + return true + end + })) + G.FUNCS.wipe_off() +end + +G.FUNCS.show_main_cta = function(e) + if e then + if e.config.id == 'lose_cta' and not G.SETTINGS.DEMO.lose_CTA_shown then + G.SETTINGS.DEMO.lose_CTA_shown = true + end + if e.config.id == 'win_cta' and not G.SETTINGS.DEMO.win_CTA_shown then + G.SETTINGS.DEMO.win_CTA_shown = true + end + end + + G:save_progress() + + G.SETTINGS.paused = true + G.normal_music_speed = true + + G.FUNCS.overlay_menu{ + definition = create_UIBox_demo_video_CTA(), + config = {no_esc = true} + } +end + +G.FUNCS.wipe_on = function(message, no_card, timefac, alt_colour) + timefac = timefac or 1 + if G.screenwipe then return end + G.CONTROLLER.locks.wipe = true + G.STAGE_OBJECT_INTERRUPT = true + local colours = { + black = HEX("4f6367FF"), + white = {1, 1, 1, 1} + } + if not no_card then + G.screenwipecard = Card(1, 1, G.CARD_W, G.CARD_H, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base) + G.screenwipecard.sprite_facing = 'back' + G.screenwipecard.facing = 'back' + G.screenwipecard.states.hover.can = false + G.screenwipecard:juice_up(0.5, 1) + end + local message_t = nil + if message then + message_t = {} + for k, v in ipairs(message) do + table.insert(message_t, {n=G.UIT.R, config={align = "cm"}, nodes={{n=G.UIT.O, config={object = DynaText({string = v or '', colours = {math.min(G.C.BACKGROUND.C[1], G.C.BACKGROUND.C[2]) > 0.5 and G.C.BLACK or G.C.WHITE},shadow = true, silent = k ~= 1, float = true, scale = 1.3, pop_in = 0, pop_in_rate = 2, rotate = 1})}}}}) + end + end + + G.screenwipe = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = "cm", minw =0, minh =0 ,padding = 0.15, r = 0.1, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm"}, nodes={ + message and {n=G.UIT.R, config={id = 'text', align = "cm", padding = 0.7}, nodes=message_t} or nil, + not no_card and {n=G.UIT.O, config={object = G.screenwipecard, role = {role_type = 'Major'}}} or nil + }}, + }}, + config = {align="cm", offset = {x=0,y=0}, major = G.ROOM_ATTACH} + } + G.screenwipe.colours = colours + G.screenwipe.children.particles = Particles(0, 0, 0,0, { + timer = 0, + max = 1, + scale = 40, + speed = 0, + lifespan = 1.7*timefac, + attach = G.screenwipe, + colours = {alt_colour or G.C.BACKGROUND.C} + }) + G.STAGE_OBJECT_INTERRUPT = nil + G.screenwipe.alignment.offset.y = 0 + if message then + for k, v in ipairs(G.screenwipe:get_UIE_by_ID('text').children) do + v.children[1].config.object:pulse() + end + end + + + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.7, + no_delete = true, + blockable = false, + func = function() + if not no_card then + G.screenwipecard:flip() + play_sound('cardFan2') + end + return true + end + })) +end + +G.FUNCS.wipe_off = function() + G.E_MANAGER:add_event(Event({ + no_delete = true, + func = function() + delay(0.3) + G.screenwipe.children.particles.max = 0 + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + no_delete = true, + blockable = false, + blocking = false, + timer = 'REAL', + ref_table = G.screenwipe.colours.black, + ref_value = 4, + ease_to = 0, + delay = 0.3, + func = (function(t) return t end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + no_delete = true, + blockable = false, + blocking = false, + timer = 'REAL', + ref_table = G.screenwipe.colours.white, + ref_value = 4, + ease_to = 0, + delay = 0.3, + func = (function(t) return t end) + })) + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.55, + no_delete = true, + blocking = false, + timer = 'REAL', + func = function() + if G.screenwipecard then G.screenwipecard:start_dissolve({G.C.BLACK, G.C.ORANGE,G.C.GOLD, G.C.RED}) end + if G.screenwipe:get_UIE_by_ID('text') then + for k, v in ipairs(G.screenwipe:get_UIE_by_ID('text').children) do + v.children[1].config.object:pop_out(4) + end + end + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1.1, + no_delete = true, + blocking = false, + timer = 'REAL', + func = function() + G.screenwipe.children.particles:remove() + G.screenwipe:remove() + G.screenwipe.children.particles = nil + G.screenwipe = nil + G.screenwipecard = nil + G.CONTROLLER.locks.wipe = false + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1.2, + no_delete = true, + blocking = true, + timer = 'REAL', + func = function() + return true + end + })) +end diff --git a/functions/common_events.lua b/functions/common_events.lua new file mode 100644 index 0000000..97ed21f --- /dev/null +++ b/functions/common_events.lua @@ -0,0 +1,2715 @@ +function set_screen_positions() + if G.STAGE == G.STAGES.RUN then + G.hand.T.x = G.TILE_W - G.hand.T.w - 2.85 + G.hand.T.y = G.TILE_H - G.hand.T.h + + G.play.T.x = G.hand.T.x + (G.hand.T.w - G.play.T.w)/2 + G.play.T.y = G.hand.T.y - 3.6 + + G.jokers.T.x = G.hand.T.x - 0.1 + G.jokers.T.y = 0 + + G.consumeables.T.x = G.jokers.T.x + G.jokers.T.w + 0.2 + G.consumeables.T.y = 0 + + G.deck.T.x = G.TILE_W - G.deck.T.w - 0.5 + G.deck.T.y = G.TILE_H - G.deck.T.h + + G.discard.T.x = G.jokers.T.x + G.jokers.T.w/2 + 0.3 + 15 + G.discard.T.y = 4.2 + + G.hand:hard_set_VT() + G.play:hard_set_VT() + G.jokers:hard_set_VT() + G.consumeables:hard_set_VT() + G.deck:hard_set_VT() + G.discard:hard_set_VT() + end + if G.STAGE == G.STAGES.MAIN_MENU then + if G.STATE == G.STATES.DEMO_CTA then + G.title_top.T.x = G.TILE_W/2 - G.title_top.T.w/2 + G.title_top.T.y = G.TILE_H/2 - G.title_top.T.h/2 - 2 + else + G.title_top.T.x = G.TILE_W/2 - G.title_top.T.w/2 + G.title_top.T.y = G.TILE_H/2 - G.title_top.T.h/2 -(G.debug_splash_size_toggle and 2 or 1.2)--||||||||||||||||| + end + + G.title_top:hard_set_VT() + end +end + +function ease_chips(mod) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + local chip_UI = G.HUD:get_UIE_by_ID('chip_UI_count') + + mod = mod or 0 + + --Ease from current chips to the new number of chips + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = false, + ref_table = G.GAME, + ref_value = 'chips', + ease_to = mod, + delay = 0.3, + func = (function(t) return math.floor(t) end) + })) + --Popup text next to the chips in UI showing number of chips gained/lost + chip_UI:juice_up() + --Play a chip sound + play_sound('chips2') + return true + end + })) +end + +function ease_dollars(mod, instant) + local function _mod(mod) + local dollar_UI = G.HUD:get_UIE_by_ID('dollar_text_UI') + mod = mod or 0 + local text = '+'..localize('$') + local col = G.C.MONEY + if mod < 0 then + text = '-'..localize('$') + col = G.C.RED + else + inc_career_stat('c_dollars_earned', mod) + end + --Ease from current chips to the new number of chips + G.GAME.dollars = G.GAME.dollars + mod + check_and_set_high_score('most_money', G.GAME.dollars) + check_for_unlock({type = 'money'}) + dollar_UI.config.object:update() + G.HUD:recalculate() + --Popup text next to the chips in UI showing number of chips gained/lost + attention_text({ + text = text..tostring(math.abs(mod)), + scale = 0.8, + hold = 0.7, + cover = dollar_UI.parent, + cover_colour = col, + align = 'cm', + }) + --Play a chip sound + play_sound('coin1') + end + if instant then + _mod(mod) + else + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + _mod(mod) + return true + end + })) + end +end + +function ease_discard(mod, instant, silent) + local _mod = function(mod) + if math.abs(math.max(G.GAME.current_round.discards_left, mod)) == 0 then return end + local discard_UI = G.HUD:get_UIE_by_ID('discard_UI_count') + mod = mod or 0 + mod = math.max(-G.GAME.current_round.discards_left, mod) + local text = '+' + local col = G.C.GREEN + if mod < 0 then + text = '' + col = G.C.RED + end + --Ease from current chips to the new number of chips + G.GAME.current_round.discards_left = G.GAME.current_round.discards_left + mod + --Popup text next to the chips in UI showing number of chips gained/lost + discard_UI.config.object:update() + G.HUD:recalculate() + attention_text({ + text = text..mod, + scale = 0.8, + hold = 0.7, + cover = discard_UI.parent, + cover_colour = col, + align = 'cm', + }) + --Play a chip sound + if not silent then play_sound('chips2') end + end + if instant then + _mod(mod) + else + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + _mod(mod) + return true + end + })) + end +end + +function ease_hands_played(mod, instant) + local _mod = function(mod) + local hand_UI = G.HUD:get_UIE_by_ID('hand_UI_count') + mod = mod or 0 + local text = '+' + local col = G.C.GREEN + if mod < 0 then + text = '' + col = G.C.RED + end + --Ease from current chips to the new number of chips + G.GAME.current_round.hands_left = G.GAME.current_round.hands_left + mod + hand_UI.config.object:update() + G.HUD:recalculate() + --Popup text next to the chips in UI showing number of chips gained/lost + attention_text({ + text = text..mod, + scale = 0.8, + hold = 0.7, + cover = hand_UI.parent, + cover_colour = col, + align = 'cm', + }) + --Play a chip sound + play_sound('chips2') + end + if instant then + _mod(mod) + else + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + _mod(mod) + return true + end + })) + end +end + +function ease_ante(mod) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + local ante_UI = G.hand_text_area.ante + mod = mod or 0 + local text = '+' + local col = G.C.IMPORTANT + if mod < 0 then + text = '-' + col = G.C.RED + end + G.GAME.round_resets.ante = G.GAME.round_resets.ante + mod + check_and_set_high_score('furthest_ante', G.GAME.round_resets.ante) + ante_UI.config.object:update() + G.HUD:recalculate() + --Popup text next to the chips in UI showing number of chips gained/lost + attention_text({ + text = text..tostring(math.abs(mod)), + scale = 1, + hold = 0.7, + cover = ante_UI.parent, + cover_colour = col, + align = 'cm', + }) + --Play a chip sound + play_sound('highlight2', 0.685, 0.2) + play_sound('generic1') + return true + end + })) +end + +function ease_round(mod) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + local round_UI = G.hand_text_area.round + mod = mod or 0 + local text = '+' + local col = G.C.IMPORTANT + if mod < 0 then + text = '' + col = G.C.RED + end + G.GAME.round = G.GAME.round + mod + check_and_set_high_score('furthest_round', G.GAME.round) + check_and_set_high_score('furthest_ante', G.GAME.round_resets.ante) + round_UI.config.object:update() + G.HUD:recalculate() + --Popup text next to the chips in UI showing number of chips gained/lost + attention_text({ + text = text..tostring(math.abs(mod)), + scale = 1, + hold = 0.7, + cover = round_UI.parent, + cover_colour = col, + align = 'cm', + }) + --Play a chip sound + play_sound('timpani', 0.8) + play_sound('generic1') + return true + end + })) +end + +function ease_value(ref_table, ref_value, mod, floored, timer_type, not_blockable, delay, ease_type) + mod = mod or 0 + + --Ease from current chips to the new number of chips + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blockable = (not_blockable == false), + blocking = false, + ref_table = ref_table, + ref_value = ref_value, + ease_to = ref_table[ref_value] + mod, + timer = timer_type, + delay = delay or 0.3, + type = ease_type or nil, + func = (function(t) if floored then return math.floor(t) else return t end end) + })) +end + +function ease_background_colour(args) + for k, v in pairs(G.C.BACKGROUND) do + if args.new_colour and (k == 'C' or k == 'L' or k == 'D') then + if args.special_colour and args.tertiary_colour then + local col_key = k == 'L' and 'new_colour' or k == 'C' and 'special_colour' or k == 'D' and 'tertiary_colour' + ease_value(v, 1, args[col_key][1] - v[1], false, nil, true, 0.6) + ease_value(v, 2, args[col_key][2] - v[2], false, nil, true, 0.6) + ease_value(v, 3, args[col_key][3] - v[3], false, nil, true, 0.6) + else + local brightness = k == 'L' and 1.3 or k == 'D' and (args.special_colour and 0.4 or 0.7) or 0.9 + if k == 'C' and args.special_colour then + ease_value(v, 1, args.special_colour[1] - v[1], false, nil, true, 0.6) + ease_value(v, 2, args.special_colour[2] - v[2], false, nil, true, 0.6) + ease_value(v, 3, args.special_colour[3] - v[3], false, nil, true, 0.6) + else + ease_value(v, 1, args.new_colour[1]*brightness - v[1], false, nil, true, 0.6) + ease_value(v, 2, args.new_colour[2]*brightness - v[2], false, nil, true, 0.6) + ease_value(v, 3, args.new_colour[3]*brightness - v[3], false, nil, true, 0.6) + end + end + end + end + if args.contrast then + ease_value(G.C.BACKGROUND, 'contrast', args.contrast - G.C.BACKGROUND.contrast, false, nil, true, 0.6) + end +end + +function ease_colour(old_colour, new_colour, delay) + ease_value(old_colour, 1, new_colour[1] - old_colour[1], false, 'REAL', nil, delay) + ease_value(old_colour, 2, new_colour[2] - old_colour[2], false, 'REAL', nil, delay) + ease_value(old_colour, 3, new_colour[3] - old_colour[3], false, 'REAL', nil, delay) + ease_value(old_colour, 4, new_colour[4] - old_colour[4], false, 'REAL', nil, delay) +end + + +function ease_background_colour_blind(state, blind_override) + local blindname = ((blind_override or (G.GAME.blind and G.GAME.blind.name ~= '' and G.GAME.blind.name)) or 'Small Blind') + local blindname = (blindname == '' and 'Small Blind' or blindname) + + --For the blind related colours + if state == G.STATES.SHOP then + ease_colour(G.C.DYN_UI.MAIN, mix_colours(G.C.RED, G.C.BLACK, 0.9)) + elseif state == G.STATES.TAROT_PACK then + ease_colour(G.C.DYN_UI.MAIN, mix_colours(G.C.WHITE, G.C.BLACK, 0.9)) + elseif state == G.STATES.SPECTRAL_PACK then + ease_colour(G.C.DYN_UI.MAIN, mix_colours(G.C.SECONDARY_SET.Spectral, G.C.BLACK, 0.9)) + elseif state == G.STATES.STANDARD_PACK then + ease_colour(G.C.DYN_UI.MAIN, G.C.RED) + elseif state == G.STATES.BUFFOON_PACK then + ease_colour(G.C.DYN_UI.MAIN, G.C.FILTER) + elseif state == G.STATES.PLANET_PACK then + ease_colour(G.C.DYN_UI.MAIN, mix_colours(G.C.SECONDARY_SET.Planet, G.C.BLACK, 0.9)) + elseif G.GAME.blind then + G.GAME.blind:change_colour() + end + --For the actual background colour + if state == G.STATES.TAROT_PACK then + ease_background_colour{new_colour = G.C.PURPLE, special_colour = darken(G.C.BLACK, 0.2), contrast = 1.5} + elseif state == G.STATES.SPECTRAL_PACK then + ease_background_colour{new_colour = G.C.SECONDARY_SET.Spectral, special_colour = darken(G.C.BLACK, 0.2), contrast = 2} + elseif state == G.STATES.STANDARD_PACK then + ease_background_colour{new_colour = darken(G.C.BLACK, 0.2), special_colour = G.C.RED, contrast = 3} + elseif state == G.STATES.BUFFOON_PACK then + ease_background_colour{new_colour = G.C.FILTER, special_colour = G.C.BLACK, contrast = 2} + elseif state == G.STATES.PLANET_PACK then + ease_background_colour{new_colour = G.C.BLACK, contrast = 3} + elseif G.GAME.won then + ease_background_colour{new_colour = G.C.BLIND.won, contrast = 1} + elseif blindname == 'Small Blind' or blindname == 'Big Blind' or blindname == '' then + ease_background_colour{new_colour = G.C.BLIND['Small'], contrast = 1} + else + + local boss_col = G.C.BLACK + for k, v in pairs(G.P_BLINDS) do + if v.name == blindname then + if v.boss.showdown then + ease_background_colour{new_colour = G.C.BLUE, special_colour = G.C.RED, tertiary_colour = darken(G.C.BLACK, 0.4), contrast = 3} + return + end + boss_col = v.boss_colour or G.C.BLACK + end + end + ease_background_colour{new_colour = lighten(mix_colours(boss_col, G.C.BLACK, 0.3), 0.1), special_colour = boss_col, contrast = 2} + end +end + +function delay(time, queue) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = time or 1, + func = function() + return true + end + }), queue) +end + +function add_joker(joker, edition, silent, eternal) + local _area = G.P_CENTERS[joker].consumeable and G.consumeables or G.jokers + local _T = _area and _area.T or {x = G.ROOM.T.w/2 - G.CARD_W/2, y = G.ROOM.T.h/2 - G.CARD_H/2} + local card = Card(_T.x, _T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[joker],{discover = true, bypass_discovery_center = true, bypass_discovery_ui = true, bypass_back = G.GAME.selected_back.pos }) + card:start_materialize(nil, silent) + if _area then card:add_to_deck() end + if edition then card:set_edition{[edition] = true} end + if eternal then card:set_eternal(true) end + if _area and card.ability.set == 'Joker' then _area:emplace(card) + elseif G.consumeables then G.consumeables:emplace(card) end + card.created_on_pause = nil + return card +end + +function draw_card(from, to, percent, dir, sort, card, delay, mute, stay_flipped, vol, discarded_only) + percent = percent or 50 + delay = delay or 0.1 + if dir == 'down' then + percent = 1-percent + end + sort = sort or false + local drawn = nil + + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = delay, + func = function() + if card then + if from then card = from:remove_card(card) end + if card then drawn = true end + local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(to, card) + if G.GAME.modifiers.flipped_cards and to == G.hand then + if pseudorandom(pseudoseed('flipped_card')) < 1/G.GAME.modifiers.flipped_cards then + stay_flipped = true + end + end + to:emplace(card, nil, stay_flipped) + else + if to:draw_card_from(from, stay_flipped, discarded_only) then drawn = true end + end + if not mute and drawn then + if from == G.deck or from == G.hand or from == G.play or from == G.jokers or from == G.consumeables or from == G.discard then + G.VIBRATION = G.VIBRATION + 0.6 + end + play_sound('card1', 0.85 + percent*0.2/100, 0.6*(vol or 1)) + end + if sort then + to:sort() + end + return true + end + })) +end + +function highlight_card(card, percent, dir) + percent = percent or 0.5 + local highlight = true + if dir == 'down' then + percent = 1-percent + highlight = false + end + + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.1, + func = function() + card:highlight(highlight) + play_sound('cardSlide1', 0.85 + percent*0.2) + return true + end + })) +end + +function play_area_status_text(text, silent, delay) + local delay = delay or 0.6 + G.E_MANAGER:add_event(Event({ + trigger = (delay==0 and 'immediate' or 'before'), + delay = delay, + func = function() + attention_text({ + scale = 0.9, text = text, hold = 0.9, align = 'tm', + major = G.play, offset = {x = 0, y = -1} + }) + if not silent then + G.ROOM.jiggle = G.ROOM.jiggle + 2 + play_sound('cardFan2') + end + return true + end + })) +end + +function level_up_hand(card, hand, instant, amount) + amount = amount or 1 + G.GAME.hands[hand].level = math.max(0, G.GAME.hands[hand].level + amount) + G.GAME.hands[hand].mult = math.max(G.GAME.hands[hand].s_mult + G.GAME.hands[hand].l_mult*(G.GAME.hands[hand].level - 1), 1) + G.GAME.hands[hand].chips = math.max(G.GAME.hands[hand].s_chips + G.GAME.hands[hand].l_chips*(G.GAME.hands[hand].level - 1), 0) + if not instant then + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function() + play_sound('tarot1') + if card then card:juice_up(0.8, 0.5) end + G.TAROT_INTERRUPT_PULSE = true + return true end })) + update_hand_text({delay = 0}, {mult = G.GAME.hands[hand].mult, StatusText = true}) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.9, func = function() + play_sound('tarot1') + if card then card:juice_up(0.8, 0.5) end + return true end })) + update_hand_text({delay = 0}, {chips = G.GAME.hands[hand].chips, StatusText = true}) + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.9, func = function() + play_sound('tarot1') + if card then card:juice_up(0.8, 0.5) end + G.TAROT_INTERRUPT_PULSE = nil + return true end })) + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.9, delay = 0}, {level=G.GAME.hands[hand].level}) + delay(1.3) + end + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() check_for_unlock{type = 'upgrade_hand', hand = hand, level = G.GAME.hands[hand].level} return true end) + })) +end + +function update_hand_text(config, vals) + G.E_MANAGER:add_event(Event({--This is the Hand name text for the poker hand + trigger = 'before', + blockable = not config.immediate, + delay = config.delay or 0.8, + func = function() + local col = G.C.GREEN + if vals.chips and G.GAME.current_round.current_hand.chips ~= vals.chips then + local delta = (type(vals.chips) == 'number' and type(G.GAME.current_round.current_hand.chips) == 'number') and (vals.chips - G.GAME.current_round.current_hand.chips) or 0 + if delta < 0 then delta = ''..delta; col = G.C.RED + elseif delta > 0 then delta = '+'..delta + else delta = ''..delta + end + if type(vals.chips) == 'string' then delta = vals.chips end + G.GAME.current_round.current_hand.chips = vals.chips + G.hand_text_area.chips:update(0) + if vals.StatusText then + attention_text({ + text =delta, + scale = 0.8, + hold = 1, + cover = G.hand_text_area.chips.parent, + cover_colour = mix_colours(G.C.CHIPS, col, 0.1), + emboss = 0.05, + align = 'cm', + cover_align = 'cr' + }) + end + end + if vals.mult and G.GAME.current_round.current_hand.mult ~= vals.mult then + local delta = (type(vals.mult) == 'number' and type(G.GAME.current_round.current_hand.mult) == 'number')and (vals.mult - G.GAME.current_round.current_hand.mult) or 0 + if delta < 0 then delta = ''..delta; col = G.C.RED + elseif delta > 0 then delta = '+'..delta + else delta = ''..delta + end + if type(vals.mult) == 'string' then delta = vals.mult end + G.GAME.current_round.current_hand.mult = vals.mult + G.hand_text_area.mult:update(0) + if vals.StatusText then + attention_text({ + text =delta, + scale = 0.8, + hold = 1, + cover = G.hand_text_area.mult.parent, + cover_colour = mix_colours(G.C.MULT, col, 0.1), + emboss = 0.05, + align = 'cm', + cover_align = 'cl' + }) + end + if not G.TAROT_INTERRUPT then G.hand_text_area.mult:juice_up() end + end + if vals.handname and G.GAME.current_round.current_hand.handname ~= vals.handname then + G.GAME.current_round.current_hand.handname = vals.handname + if not config.nopulse then + G.hand_text_area.handname.config.object:pulse(0.2) + end + end + if vals.chip_total then G.GAME.current_round.current_hand.chip_total = vals.chip_total;G.hand_text_area.chip_total.config.object:pulse(0.5) end + if vals.level and G.GAME.current_round.current_hand.hand_level ~= ' '..localize('k_lvl')..tostring(vals.level) then + if vals.level == '' then + G.GAME.current_round.current_hand.hand_level = vals.level + else + G.GAME.current_round.current_hand.hand_level = ' '..localize('k_lvl')..tostring(vals.level) + if type(vals.level) == 'number' then + G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[math.min(vals.level, 7)] + else + G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[1] + end + G.hand_text_area.hand_level:juice_up() + end + end + if config.sound and not config.modded then play_sound(config.sound, config.pitch or 1, config.volume or 1) end + if config.modded then + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_1'):juice_up(0.3, 0) + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_2'):juice_up(0.3, 0) + G.GAME.blind:juice_up() + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) + end + return true + end})) +end + +function eval_card(card, context) + context = context or {} + local ret = {} + + if context.repetition_only then + local seals = card:calculate_seal(context) + if seals then + ret.seals = seals + end + return ret + end + + if context.cardarea == G.play then + local chips = card:get_chip_bonus() + if chips > 0 then + ret.chips = chips + end + + local mult = card:get_chip_mult() + if mult > 0 then + ret.mult = mult + end + + local x_mult = card:get_chip_x_mult(context) + if x_mult > 0 then + ret.x_mult = x_mult + end + + local p_dollars = card:get_p_dollars() + if p_dollars > 0 then + ret.p_dollars = p_dollars + end + + local jokers = card:calculate_joker(context) + if jokers then + ret.jokers = jokers + end + + local edition = card:get_edition(context) + if edition then + ret.edition = edition + end + end + + if context.cardarea == G.hand then + local h_mult = card:get_chip_h_mult() + if h_mult > 0 then + ret.h_mult = h_mult + end + + local h_x_mult = card:get_chip_h_x_mult() + if h_x_mult > 0 then + ret.x_mult = h_x_mult + end + + local jokers = card:calculate_joker(context) + if jokers then + ret.jokers = jokers + end + end + + if context.cardarea == G.jokers or context.card == G.consumeables then + local jokers = nil + if context.edition then + jokers = card:get_edition(context) + elseif context.other_joker then + jokers = context.other_joker:calculate_joker(context) + else + jokers = card:calculate_joker(context) + end + if jokers then + ret.jokers = jokers + end + end + + return ret +end + +function set_alerts() + if G.REFRESH_ALERTS then + G.REFRESH_ALERTS = nil + local alert_joker, alert_voucher, alert_tarot, alert_planet, alert_spectral, alert_blind, alert_edition, alert_tag, alert_seal, alert_booster = false,false,false,false,false,false,false,false,false,false + for k, v in pairs(G.P_CENTERS) do + if v.discovered and not v.alerted then + if v.set == 'Voucher' then alert_voucher = true end + if v.set == 'Tarot' then alert_tarot = true end + if v.set == 'Planet' then alert_planet = true end + if v.set == 'Spectral' then alert_spectral = true end + if v.set == 'Joker' then alert_joker = true end + if v.set == 'Edition' then alert_edition = true end + if v.set == 'Booster' then alert_booster = true end + end + end + for k, v in pairs(G.P_BLINDS) do + if v.discovered and not v.alerted then + alert_blind = true + end + end + for k, v in pairs(G.P_TAGS) do + if v.discovered and not v.alerted then + alert_tag = true + end + end + for k, v in pairs(G.P_SEALS) do + if v.discovered and not v.alerted then + alert_seal = true + end + end + + local alert_any = alert_voucher or alert_joker or alert_tarot or alert_planet or alert_spectral or alert_blind or alert_edition or alert_seal or alert_tag + + G.ARGS.set_alerts_alertables = G.ARGS.set_alerts_alertables or { + {id = 'your_collection', alert_uibox_name = 'your_collection_alert'}, + {id = 'your_collection_jokers', alert_uibox_name = 'your_collection_jokers_alert'}, + {id = 'your_collection_tarots', alert_uibox_name = 'your_collection_tarots_alert'}, + {id = 'your_collection_planets', alert_uibox_name = 'your_collection_planets_alert'}, + {id = 'your_collection_spectrals', alert_uibox_name = 'your_collection_spectrals_alert'}, + {id = 'your_collection_vouchers', alert_uibox_name = 'your_collection_vouchers_alert'}, + {id = 'your_collection_editions', alert_uibox_name = 'your_collection_editions_alert'}, + {id = 'your_collection_blinds', alert_uibox_name = 'your_collection_blinds_alert'}, + {id = 'your_collection_tags', alert_uibox_name = 'your_collection_tags_alert'}, + {id = 'your_collection_seals', alert_uibox_name = 'your_collection_seals_alert'}, + {id = 'your_collection_boosters', alert_uibox_name = 'your_collection_boosters_alert'}, + } + G.ARGS.set_alerts_alertables[1].should_alert = alert_any + G.ARGS.set_alerts_alertables[2].should_alert = alert_joker + G.ARGS.set_alerts_alertables[3].should_alert = alert_tarot + G.ARGS.set_alerts_alertables[4].should_alert = alert_planet + G.ARGS.set_alerts_alertables[5].should_alert = alert_spectral + G.ARGS.set_alerts_alertables[6].should_alert = alert_voucher + G.ARGS.set_alerts_alertables[7].should_alert = alert_edition + G.ARGS.set_alerts_alertables[8].should_alert = alert_blind + G.ARGS.set_alerts_alertables[9].should_alert = alert_tag + G.ARGS.set_alerts_alertables[10].should_alert = alert_seal + G.ARGS.set_alerts_alertables[11].should_alert = alert_booster + + for k, v in ipairs(G.ARGS.set_alerts_alertables) do + if G.OVERLAY_MENU and G.OVERLAY_MENU:get_UIE_by_ID(v.id) then + if v.should_alert then + if not G[v.alert_uibox_name] then + G[v.alert_uibox_name] = UIBox{ + definition = create_UIBox_card_alert({red_bad = true}), + config = {align="tri", offset = {x = 0.05, y = -0.05}, major = G.OVERLAY_MENU:get_UIE_by_ID(v.id), instance_type = 'ALERT'} + } + G[v.alert_uibox_name].states.collide.can = false + end + elseif G[v.alert_uibox_name] then + G[v.alert_uibox_name]:remove() + G[v.alert_uibox_name] = nil + end + elseif G[v.alert_uibox_name] then + G[v.alert_uibox_name]:remove() + G[v.alert_uibox_name] = nil + end + end + + if G.MAIN_MENU_UI then + if alert_any then + if not G.collection_alert then + G.collection_alert = UIBox{definition = create_UIBox_card_alert(), config = {align="tri", offset = {x = 0.05, y = -0.05}, major = G.MAIN_MENU_UI:get_UIE_by_ID('collection_button')}} + G.collection_alert.states.collide.can = false + end + elseif G.collection_alert then + G.collection_alert:remove() + G.collection_alert = nil + end + elseif G.collection_alert then + G.collection_alert:remove() + G.collection_alert = nil + end + end +end + +function set_main_menu_UI() + G.MAIN_MENU_UI = UIBox{ + definition = create_UIBox_main_menu_buttons(), + config = {align="bmi", offset = {x=0,y=10}, major = G.ROOM_ATTACH, bond = 'Weak'} + } + G.MAIN_MENU_UI.alignment.offset.y = 0 + G.MAIN_MENU_UI:align_to_major() + G.E_MANAGER:add_event(Event({ + blockable = false, + blocking = false, + func = (function() + if (not G.F_DISP_USERNAME) or (type(G.F_DISP_USERNAME) == 'string') then + G.PROFILE_BUTTON = UIBox{ + definition = create_UIBox_profile_button(), + config = {align="bli", offset = {x=-10,y=0}, major = G.ROOM_ATTACH, bond = 'Weak'}} + G.PROFILE_BUTTON.alignment.offset.x = 0 + G.PROFILE_BUTTON:align_to_major() + return true + end + end) + })) + + + G.CONTROLLER:snap_to{node = G.MAIN_MENU_UI:get_UIE_by_ID('main_menu_play')} +end + +function card_eval_status_text(card, eval_type, amt, percent, dir, extra) + percent = percent or (0.9 + 0.2*math.random()) + if dir == 'down' then + percent = 1-percent + end + + if extra and extra.focus then card = extra.focus end + + local text = '' + local sound = nil + local volume = 1 + local card_aligned = 'bm' + local y_off = 0.15*G.CARD_H + if card.area == G.jokers or card.area == G.consumeables then + y_off = 0.05*card.T.h + elseif card.area == G.hand then + y_off = -0.05*G.CARD_H + card_aligned = 'tm' + elseif card.area == G.play then + y_off = -0.05*G.CARD_H + card_aligned = 'tm' + elseif card.jimbo then + y_off = -0.05*G.CARD_H + card_aligned = 'tm' + end + local config = {} + local delay = 0.65 + local colour = config.colour or (extra and extra.colour) or ( G.C.FILTER ) + local extrafunc = nil + + if eval_type == 'debuff' then + sound = 'cancel' + amt = 1 + colour = G.C.RED + config.scale = 0.6 + text = localize('k_debuffed') + elseif eval_type == 'chips' then + sound = 'chips1' + amt = amt + colour = G.C.CHIPS + text = localize{type='variable',key='a_chips',vars={amt}} + delay = 0.6 + elseif eval_type == 'mult' then + sound = 'multhit1'--'other1' + amt = amt + text = localize{type='variable',key='a_mult',vars={amt}} + colour = G.C.MULT + config.type = 'fade' + config.scale = 0.7 + elseif (eval_type == 'x_mult') or (eval_type == 'h_x_mult') then + sound = 'multhit2' + volume = 0.7 + amt = amt + text = localize{type='variable',key='a_xmult',vars={amt}} + colour = G.C.XMULT + config.type = 'fade' + config.scale = 0.7 + elseif eval_type == 'h_mult' then + sound = 'multhit1' + amt = amt + text = localize{type='variable',key='a_mult',vars={amt}} + colour = G.C.MULT + config.type = 'fade' + config.scale = 0.7 + elseif eval_type == 'dollars' then + sound = 'coin3' + amt = amt + text = localize("$")..tostring(amt) + colour = G.C.MONEY + elseif eval_type == 'swap' then + sound = 'generic1' + amt = amt + text = localize('k_swapped_ex') + colour = G.C.PURPLE + elseif eval_type == 'extra' or eval_type == 'jokers' then + sound = extra.edition and 'foil2' or extra.mult_mod and 'multhit1' or extra.Xmult_mod and 'multhit2' or 'generic1' + if extra.edition then + colour = G.C.DARK_EDITION + end + volume = extra.edition and 0.3 or sound == 'multhit2' and 0.7 or 1 + delay = extra.delay or 0.75 + amt = 1 + text = extra.message or text + if not extra.edition and (extra.mult_mod or extra.Xmult_mod) then + colour = G.C.MULT + end + if extra.chip_mod then + config.type = 'fall' + colour = G.C.CHIPS + config.scale = 0.7 + elseif extra.swap then + config.type = 'fall' + colour = G.C.PURPLE + config.scale = 0.7 + else + config.type = 'fall' + config.scale = 0.7 + end + end + delay = delay*1.25 + + if amt > 0 then + if extra and extra.instant then + if extrafunc then extrafunc() end + attention_text({ + text = text, + scale = config.scale or 1, + hold = delay - 0.2, + backdrop_colour = colour, + align = card_aligned, + major = card, + offset = {x = 0, y = y_off} + }) + play_sound(sound, 0.8+percent*0.2, volume) + if not extra or not extra.no_juice then + card:juice_up(0.6, 0.1) + G.ROOM.jiggle = G.ROOM.jiggle + 0.7 + end + else + G.E_MANAGER:add_event(Event({ --Add bonus chips from this card + trigger = 'before', + delay = delay, + func = function() + if extrafunc then extrafunc() end + attention_text({ + text = text, + scale = config.scale or 1, + hold = delay - 0.2, + backdrop_colour = colour, + align = card_aligned, + major = card, + offset = {x = 0, y = y_off} + }) + play_sound(sound, 0.8+percent*0.2, volume) + if not extra or not extra.no_juice then + card:juice_up(0.6, 0.1) + G.ROOM.jiggle = G.ROOM.jiggle + 0.7 + end + return true + end + })) + end + end + if extra and extra.playing_cards_created then + playing_card_joker_effects(extra.playing_cards_created) + end +end + +function add_round_eval_row(config) + local config = config or {} + local width = G.round_eval.T.w - 0.51 + local num_dollars = config.dollars or 1 + local scale = 0.9 + + if config.name ~= 'bottom' then + if config.name ~= 'blind1' then + if not G.round_eval.divider_added then + G.E_MANAGER:add_event(Event({ + trigger = 'after',delay = 0.25, + func = function() + local spacer = {n=G.UIT.R, config={align = "cm", minw = width}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {'......................................'}, colours = {G.C.WHITE},shadow = true, float = true, y_offset = -30, scale = 0.45, spacing = 13.5, font = G.LANGUAGES['en-us'].font, pop_in = 0})}} + }} + G.round_eval:add_child(spacer,G.round_eval:get_UIE_by_ID(config.bonus and 'bonus_round_eval' or 'base_round_eval')) + return true + end + })) + delay(0.6) + G.round_eval.divider_added = true + end + else + delay(0.2) + end + + delay(0.2) + + G.E_MANAGER:add_event(Event({ + trigger = 'before',delay = 0.5, + func = function() + --Add the far left text and context first: + local left_text = {} + if config.name == 'blind1' then + local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5) + local blind_sprite = AnimatedSprite(0, 0, 1.2,1.2, G.ANIMATION_ATLAS['blind_chips'], copy_table(G.GAME.blind.pos)) + blind_sprite:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + table.insert(left_text, {n=G.UIT.O, config={w=1.2,h=1.2 , object = blind_sprite, hover = true, can_collide = false}}) + + table.insert(left_text, + config.saved and + {n=G.UIT.C, config={padding = 0.05, align = 'cm'}, nodes={ + {n=G.UIT.R, config={align = 'cm'}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {' '..localize('ph_mr_bones')..' '}, colours = {G.C.FILTER}, shadow = true, pop_in = 0, scale = 0.5*scale, silent = true})}} + }} + }} + or {n=G.UIT.C, config={padding = 0.05, align = 'cm'}, nodes={ + {n=G.UIT.R, config={align = 'cm'}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {' '..localize('ph_score_at_least')..' '}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}} + }}, + {n=G.UIT.R, config={align = 'cm', minh = 0.8}, nodes={ + {n=G.UIT.O, config={w=0.5,h=0.5 , object = stake_sprite, hover = true, can_collide = false}}, + {n=G.UIT.T, config={text = G.GAME.blind.chip_text, scale = scale_number(G.GAME.blind.chips, scale, 100000), colour = G.C.RED, shadow = true}} + }} + }}) + elseif string.find(config.name, 'tag') then + local blind_sprite = Sprite(0, 0, 0.7,0.7, G.ASSET_ATLAS['tags'], copy_table(config.pos)) + blind_sprite:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'} + }) + blind_sprite:juice_up() + table.insert(left_text, {n=G.UIT.O, config={w=0.7,h=0.7 , object = blind_sprite, hover = true, can_collide = false}}) + table.insert(left_text, {n=G.UIT.O, config={object = DynaText({string = {config.condition}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}}) + elseif config.name == 'hands' then + table.insert(left_text, {n=G.UIT.T, config={text = config.disp or config.dollars, scale = 0.8*scale, colour = G.C.BLUE, shadow = true, juice = true}}) + table.insert(left_text, {n=G.UIT.O, config={object = DynaText({string = {" "..localize{type = 'variable', key = 'remaining_hand_money', vars = {G.GAME.modifiers.money_per_hand or 1}}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}}) + elseif config.name == 'discards' then + table.insert(left_text, {n=G.UIT.T, config={text = config.disp or config.dollars, scale = 0.8*scale, colour = G.C.RED, shadow = true, juice = true}}) + table.insert(left_text, {n=G.UIT.O, config={object = DynaText({string = {" "..localize{type = 'variable', key = 'remaining_discard_money', vars = {G.GAME.modifiers.money_per_discard or 0}}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}}) + elseif string.find(config.name, 'joker') then + table.insert(left_text, {n=G.UIT.O, config={object = DynaText({string = localize{type = 'name_text', set = config.card.config.center.set, key = config.card.config.center.key}, colours = {G.C.FILTER}, shadow = true, pop_in = 0, scale = 0.6*scale, silent = true})}}) + elseif config.name == 'interest' then + table.insert(left_text, {n=G.UIT.T, config={text = num_dollars, scale = 0.8*scale, colour = G.C.MONEY, shadow = true, juice = true}}) + table.insert(left_text,{n=G.UIT.O, config={object = DynaText({string = {" "..localize{type = 'variable', key = 'interest', vars = {G.GAME.interest_amount, 5, G.GAME.interest_amount*G.GAME.interest_cap/5}}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}}) + end + local full_row = {n=G.UIT.R, config={align = "cm", minw = 5}, nodes={ + {n=G.UIT.C, config={padding = 0.05, minw = width*0.55, minh = 0.61, align = "cl"}, nodes=left_text}, + {n=G.UIT.C, config={padding = 0.05,minw = width*0.45, align = "cr"}, nodes={{n=G.UIT.C, config={align = "cm", id = 'dollar_'..config.name},nodes={}}}} + }} + + if config.name == 'blind1' then + G.GAME.blind:juice_up() + end + G.round_eval:add_child(full_row,G.round_eval:get_UIE_by_ID(config.bonus and 'bonus_round_eval' or 'base_round_eval')) + play_sound('cancel', config.pitch or 1) + play_sound('highlight1',( 1.5*config.pitch) or 1, 0.2) + if config.card then config.card:juice_up(0.7, 0.46) end + return true + end + })) + local dollar_row = 0 + if num_dollars > 60 then + local dollar_string = localize('$')..num_dollars + G.E_MANAGER:add_event(Event({ + trigger = 'before',delay = 0.38, + func = function() + G.round_eval:add_child( + {n=G.UIT.R, config={align = "cm", id = 'dollar_row_'..(dollar_row+1)..'_'..config.name}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {localize('$')..num_dollars}, colours = {G.C.MONEY}, shadow = true, pop_in = 0, scale = 0.65, float = true})}} + }}, + G.round_eval:get_UIE_by_ID('dollar_'..config.name)) + + play_sound('coin3', 0.9+0.2*math.random(), 0.7) + play_sound('coin6', 1.3, 0.8) + return true + end + })) + else + for i = 1, num_dollars or 1 do + G.E_MANAGER:add_event(Event({ + trigger = 'before',delay = 0.18 - ((num_dollars > 20 and 0.13) or (num_dollars > 9 and 0.1) or 0), + func = function() + if i%30 == 1 then + G.round_eval:add_child( + {n=G.UIT.R, config={align = "cm", id = 'dollar_row_'..(dollar_row+1)..'_'..config.name}, nodes={}}, + G.round_eval:get_UIE_by_ID('dollar_'..config.name)) + dollar_row = dollar_row+1 + end + + local r = {n=G.UIT.T, config={text = localize('$'), colour = G.C.MONEY, scale = ((num_dollars > 20 and 0.28) or (num_dollars > 9 and 0.43) or 0.58), shadow = true, hover = true, can_collide = false, juice = true}} + play_sound('coin3', 0.9+0.2*math.random(), 0.7 - (num_dollars > 20 and 0.2 or 0)) + + if config.name == 'blind1' then + G.GAME.current_round.dollars_to_be_earned = G.GAME.current_round.dollars_to_be_earned:sub(2) + end + + G.round_eval:add_child(r,G.round_eval:get_UIE_by_ID('dollar_row_'..(dollar_row)..'_'..config.name)) + G.VIBRATION = G.VIBRATION + 0.4 + return true + end + })) + end + end + else + delay(0.4) + G.E_MANAGER:add_event(Event({ + trigger = 'before',delay = 0.5, + func = function() + UIBox{ + definition = {n=G.UIT.ROOT, config={align = 'cm', colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={id = 'cash_out_button', align = "cm", padding = 0.1, minw = 7, r = 0.15, colour = G.C.ORANGE, shadow = true, hover = true, one_press = true, button = 'cash_out', focus_args = {snap_to = true}}, nodes={ + {n=G.UIT.T, config={text = localize('b_cash_out')..": ", scale = 1, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + {n=G.UIT.T, config={text = localize('$')..config.dollars, scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}} + }},}}, + config = { + align = 'tmi', + offset ={x=0,y=0.4}, + major = G.round_eval} + } + + --local left_text = {n=G.UIT.R, config={id = 'cash_out_button', align = "cm", padding = 0.1, minw = 2, r = 0.15, colour = G.C.ORANGE, shadow = true, hover = true, one_press = true, button = 'cash_out', focus_args = {snap_to = true}}, nodes={ + -- {n=G.UIT.T, config={text = localize('b_cash_out')..": ", scale = 1, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, + -- {n=G.UIT.T, config={text = localize('$')..config.dollars, scale = 1.3*scale, colour = G.C.WHITE, shadow = true, juice = true}} + --}} + --G.round_eval:add_child(left_text,G.round_eval:get_UIE_by_ID('eval_bottom')) + + G.GAME.current_round.dollars = config.dollars + + play_sound('coin6', config.pitch or 1) + G.VIBRATION = G.VIBRATION + 1 + return true + end + })) + end +end + +function change_shop_size(mod) + if not G.GAME.shop then return end + G.GAME.shop.joker_max = G.GAME.shop.joker_max + mod + if G.shop_jokers and G.shop_jokers.cards then + if mod < 0 then + --Remove jokers in shop + for i = #G.shop_jokers.cards, G.GAME.shop.joker_max+1, -1 do + if G.shop_jokers.cards[i] then + G.shop_jokers.cards[i]:remove() + end + end + end + G.shop_jokers.config.card_limit = G.GAME.shop.joker_max + G.shop_jokers.T.w = G.GAME.shop.joker_max*1.01*G.CARD_W + G.shop:recalculate() + if mod > 0 then + for i = 1, G.GAME.shop.joker_max - #G.shop_jokers.cards do + G.shop_jokers:emplace(create_card_for_shop(G.shop_jokers)) + end + end + end +end + +function juice_card(card) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() card:juice_up(0.7);return true end) + })) +end + +function update_canvas_juice(dt) + G.JIGGLE_VIBRATION = G.ROOM.jiggle or 0 + if not G.SETTINGS.screenshake or (type(G.SETTINGS.screenshake) ~= 'number') then + G.SETTINGS.screenshake = 50 + end + local shake_amt = math.max(0,G.SETTINGS.screenshake-30)/100 + G.ARGS.eased_cursor_pos = G.ARGS.eased_cursor_pos or {x=G.CURSOR.T.x,y=G.CURSOR.T.y, sx = G.CONTROLLER.cursor_position.x, sy = G.CONTROLLER.cursor_position.y} + G.ARGS.eased_cursor_pos.x = G.ARGS.eased_cursor_pos.x*(1-3*dt) + 3*dt*(shake_amt*G.CURSOR.T.x + (1-shake_amt)*G.ROOM.T.w/2) + G.ARGS.eased_cursor_pos.y = G.ARGS.eased_cursor_pos.y*(1-3*dt) + 3*dt*(shake_amt*G.CURSOR.T.y + (1-shake_amt)*G.ROOM.T.h/2) + G.ARGS.eased_cursor_pos.sx = G.ARGS.eased_cursor_pos.sx*(1-3*dt) + 3*dt*(shake_amt*G.CONTROLLER.cursor_position.x + (1-shake_amt)*G.WINDOWTRANS.real_window_w/2) + G.ARGS.eased_cursor_pos.sy = G.ARGS.eased_cursor_pos.sy*(1-3*dt) + 3*dt*(shake_amt*G.CONTROLLER.cursor_position.y + (1-shake_amt)*G.WINDOWTRANS.real_window_h/2) + + shake_amt = G.SETTINGS.screenshake/100*3 + if shake_amt < 0.05 then shake_amt = 0 end + + G.ROOM.jiggle = (G.ROOM.jiggle or 0)*(1-5*dt)*(shake_amt > 0.05 and 1 or 0) + G.ROOM.T.r = (0.001*math.sin(0.3*G.TIMERS.REAL)+ 0.002*(G.ROOM.jiggle)*math.sin(39.913*G.TIMERS.REAL))*shake_amt + G.ROOM.T.x = G.ROOM_ORIG.x + (shake_amt)*(0.015*math.sin(0.913*G.TIMERS.REAL) + 0.01*(G.ROOM.jiggle*shake_amt)*math.sin(19.913*G.TIMERS.REAL) + (G.ARGS.eased_cursor_pos.x - 0.5*(G.ROOM.T.w + G.ROOM_ORIG.x))*0.01) + G.ROOM.T.y = G.ROOM_ORIG.y + (shake_amt)*(0.015*math.sin(0.952*G.TIMERS.REAL) + 0.01*(G.ROOM.jiggle*shake_amt)*math.sin(21.913*G.TIMERS.REAL) + (G.ARGS.eased_cursor_pos.y - 0.5*(G.ROOM.T.h + G.ROOM_ORIG.y))*0.01) + + G.JIGGLE_VIBRATION = G.JIGGLE_VIBRATION*(1-5*dt) + G.CURR_VIBRATION = G.CURR_VIBRATION or 0 + G.CURR_VIBRATION = math.min(1, G.CURR_VIBRATION + G.VIBRATION + G.JIGGLE_VIBRATION*0.2) + G.VIBRATION = 0 + G.CURR_VIBRATION = (1-15*dt)*G.CURR_VIBRATION + if not G.SETTINGS.rumble then G.CURR_VIBRATION = 0 end + if G.CONTROLLER.GAMEPAD.object and G.F_RUMBLE then G.CONTROLLER.GAMEPAD.object:setVibration(G.CURR_VIBRATION*0.4*G.F_RUMBLE, G.CURR_VIBRATION*0.4*G.F_RUMBLE) end +end + +function juice_card_until(card, eval_func, first, delay) + G.E_MANAGER:add_event(Event({ + trigger = 'after',delay = delay or 0.1, blocking = false, blockable = false, timer = 'REAL', + func = (function() if eval_func(card) then if not first or first then card:juice_up(0.1, 0.1) end;juice_card_until(card, eval_func, nil, 0.8) end return true end) + })) +end + +function check_for_unlock(args) + if not next(args) then return end + if G.GAME.seeded then return end + if args.type == 'win_challenge' then + unlock_achievement('rule_bender') + local _c = true + for k, v in pairs(G.CHALLENGES) do + if not G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id] then + _c = false + end + end + if _c then + unlock_achievement('rule_breaker') + end + end + if G.GAME.challenge then return end + + --|-------------------------------------------- + --|Achievements + --|-------------------------------------------- + if args.type == 'career_stat' then + if args.statname == 'c_cards_played' and G.PROFILES[G.SETTINGS.profile].career_stats[args.statname] >= 2500 then + unlock_achievement('card_player') + end + if args.statname == 'c_cards_discarded' and G.PROFILES[G.SETTINGS.profile].career_stats[args.statname] >= 2500 then + unlock_achievement('card_discarder') + end + end + if args.type == 'ante_up' then + if args.ante >= 4 then + unlock_achievement('ante_up') + end + if args.ante >= 8 then + unlock_achievement('ante_upper') + end + end + if args.type == 'win' then + unlock_achievement('heads_up') + if G.GAME.round <= 12 then + unlock_achievement('speedrunner') + end + if G.GAME.round_scores.times_rerolled.amt <= 0 then + unlock_achievement('you_get_what_you_get') + end + end + if args.type == 'win_stake' then + local highest_win, lowest_win = get_deck_win_stake() + if highest_win >= 2 then + unlock_achievement('low_stakes') + end + if highest_win >= 4 then + unlock_achievement('mid_stakes') + end + if highest_win >= 8 then + unlock_achievement('high_stakes') + end + if lowest_win >= 8 then + unlock_achievement('completionist_plus') + end + if G.PROGRESS and G.PROGRESS.joker_stickers.tally/G.PROGRESS.joker_stickers.of >=1 then + unlock_achievement('completionist_plus_plus') + end + end + if args.type == 'money' then + if G.GAME.dollars >= 400 then + unlock_achievement('nest_egg') + end + end + if args.type == 'hand' then + if args.handname == 'Flush' and args.scoring_hand then + local _w = 0 + for k, v in ipairs(args.scoring_hand) do + if v.ability.name == 'Wild Card' then + _w = _w + 1 + end + end + if _w == #args.scoring_hand then + unlock_achievement('flushed') + end + end + + if args.disp_text == 'Royal Flush' then + unlock_achievement('royale') + end + end + if args.type == 'shatter' then + if #args.shattered >= 2 then + unlock_achievement('shattered') + end + end + if args.type == 'run_redeem' then + local _v = 0 + _v = _v - (G.GAME.starting_voucher_count or 0) + for k, v in pairs(G.GAME.used_vouchers) do + _v = _v + 1 + end + if _v >= 5 and G.GAME.round_resets.ante <= 4 then + unlock_achievement('roi') + end + end + if args.type == 'upgrade_hand' then + if args.level >= 10 then + unlock_achievement('retrograde') + end + end + if args.type == 'chip_score' then + if args.chips >= 10000 then + unlock_achievement('_10k') + end + if args.chips >= 1000000 then + unlock_achievement('_1000k') + end + if args.chips >= 100000000 then + unlock_achievement('_100000k') + end + end + if args.type == 'modify_deck' then + if G.deck and G.deck.config.card_limit <= 20 then + unlock_achievement('tiny_hands') + end + if G.deck and G.deck.config.card_limit >= 80 then + unlock_achievement('big_hands') + end + end + if args.type == 'spawn_legendary' then + unlock_achievement('legendary') + end + if args.type == 'discover_amount' then + if G.DISCOVER_TALLIES.vouchers.tally/G.DISCOVER_TALLIES.vouchers.of >=1 then + unlock_achievement('extreme_couponer') + end + if G.DISCOVER_TALLIES.spectrals.tally/G.DISCOVER_TALLIES.spectrals.of >=1 then + unlock_achievement('clairvoyance') + end + if G.DISCOVER_TALLIES.tarots.tally/G.DISCOVER_TALLIES.tarots.of >=1 then + unlock_achievement('cartomancy') + end + if G.DISCOVER_TALLIES.planets.tally/G.DISCOVER_TALLIES.planets.of >=1 then + unlock_achievement('astronomy') + end + if G.DISCOVER_TALLIES.total.tally/G.DISCOVER_TALLIES.total.of >=1 then + unlock_achievement('completionist') + end + end + --------------------------------------------- + + local i=1 + while i <= #G.P_LOCKED do + local ret = false + local card = G.P_LOCKED[i] + if not card.unlocked and card.unlock_condition and args.type == 'career_stat' then + if args.statname == card.unlock_condition.type and G.PROFILES[G.SETTINGS.profile].career_stats[args.statname] >= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + end + + if not card.unlocked and card.unlock_condition and card.unlock_condition.type == args.type then + if args.type == 'hand' and args.handname == card.unlock_condition.extra then + ret = true + unlock_card(card) + end + if args.type == 'min_hand_size' and G.hand and G.hand.config.card_limit <= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + if args.type == 'interest_streak' and card.unlock_condition.extra <= G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak then + ret = true + unlock_card(card) + end + if args.type == 'run_card_replays' then + for k, v in ipairs(G.playing_cards) do + if v.base.times_played >= card.unlock_condition.extra then + ret = true + unlock_card(card) + break + end + end + end + if args.type == 'play_all_hearts' then + local played = true + for k, v in ipairs(G.deck.cards) do + if v.ability.name ~= 'Stone Card' and v.base.suit == 'Hearts' then + played = false + end + end + for k, v in ipairs(G.hand.cards) do + if v.ability.name ~= 'Stone Card' and v.base.suit == 'Hearts' then + played = false + end + end + if played then + ret = true + unlock_card(card) + end + end + if args.type == 'run_redeem' then + local vouchers_redeemed = 0 + for k, v in pairs(G.GAME.used_vouchers) do + vouchers_redeemed = vouchers_redeemed + 1 + end + if vouchers_redeemed >= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + end + if args.type == 'have_edition' then + local shiny_jokers = 0 + for k, v in ipairs(G.jokers.cards) do + if v.edition then shiny_jokers = shiny_jokers + 1 end + end + if shiny_jokers >= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + end + if args.type == 'double_gold' then + ret = true + unlock_card(card) + end + if args.type == 'continue_game' then + ret = true + unlock_card(card) + end + if args.type == 'blank_redeems' then + if G.PROFILES[G.SETTINGS.profile].voucher_usage['v_blank'] and G.PROFILES[G.SETTINGS.profile].voucher_usage['v_blank'].count >= card.unlock_condition.extra then + unlock_card(card) + end + end + if args.type == 'modify_deck' then + if card.unlock_condition.extra and card.unlock_condition.extra.suit then + local count = 0 + for _, v in pairs(G.playing_cards) do + if v.base.suit == card.unlock_condition.extra.suit then count = count + 1 end + end + if count >= card.unlock_condition.extra.count then + ret = true + unlock_card(card) + end + end + if card.unlock_condition.extra and card.unlock_condition.extra.enhancement then + local count = 0 + for _, v in pairs(G.playing_cards) do + if v.ability.name == card.unlock_condition.extra.enhancement then count = count + 1 end + end + if count >= card.unlock_condition.extra.count then + ret = true + unlock_card(card) + end + end + if card.unlock_condition.extra and card.unlock_condition.extra.tally then + local count = 0 + for _, v in pairs(G.playing_cards) do + if v.ability.set == 'Enhanced' then count = count + 1 end + end + if count >= card.unlock_condition.extra.count then + ret = true + unlock_card(card) + end + end + end + if args.type == 'discover_amount' then + if card.unlock_condition.amount then + if card.unlock_condition.amount <= args.amount then + ret = true + unlock_card(card) + end + end + if card.unlock_condition.tarot_count then + if card.unlock_condition.tarot_count <= args.tarot_count then + ret = true + unlock_card(card) + end + end + if card.unlock_condition.planet_count then + if card.unlock_condition.planet_count <= args.planet_count then + ret = true + unlock_card(card) + end + end + end + if args.type == 'win_deck' then + if card.unlock_condition.deck then + if get_deck_win_stake(card.unlock_condition.deck) > 0 then + ret = true + unlock_card(card) + end + end + end + if args.type == 'win_stake' then + if card.unlock_condition.stake then + if get_deck_win_stake() >= card.unlock_condition.stake then + ret = true + unlock_card(card) + end + end + end + if args.type == 'discover_planets' then + local count = 0 + for k, v in pairs(G.P_CENTERS) do + if v.set == 'Planet' and v.discovered then count = count + 1 end + end + if count >= 9 then + ret = true + unlock_card(card) + end + end + if args.type == 'blind_discoveries' then + local discovered_blinds = 0 + for k, v in pairs(G.P_BLINDS) do + if v.discovered then + discovered_blinds = discovered_blinds + 1 + end + end + if discovered_blinds >= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + end + if args.type == 'modify_jokers' and G.jokers then + if card.unlock_condition.extra.count then + local count = 0 + for _, v in pairs(G.jokers.cards) do + if v.ability.set == 'Joker' and v.edition and v.edition.polychrome and card.unlock_condition.extra.polychrome then count = count + 1 end + end + if count >= card.unlock_condition.extra.count then + ret = true + unlock_card(card) + end + end + end + if args.type == 'money' then + if card.unlock_condition.extra <= G.GAME.dollars then + ret = true + unlock_card(card) + end + end + if args.type == 'round_win' then + if card.name == 'Matador' then + if G.GAME.current_round.hands_played == 1 and + G.GAME.current_round.discards_left == G.GAME.round_resets.discards and + G.GAME.blind:get_type() == 'Boss' then + ret = true + unlock_card(card) + end + end + if card.name == 'Troubadour' then + if G.PROFILES[G.SETTINGS.profile].career_stats.c_single_hand_round_streak >= card.unlock_condition.extra then + ret = true + unlock_card(card) + end + end + if card.name == 'Hanging Chad' then + if G.GAME.last_hand_played == card.unlock_condition.extra and G.GAME.blind:get_type() == 'Boss' then + ret = true + unlock_card(card) + end + end + end + if args.type == 'ante_up' then + if card.unlock_condition.ante then + if args.ante == card.unlock_condition.ante then + ret = true + unlock_card(card) + end + end + end + if args.type == 'hand_contents' then + if card.name == 'Seeing Double' then + local tally = 0 + for j = 1, #args.cards do + if args.cards[j]:get_id() == 7 and args.cards[j]:is_suit('Clubs') then + tally = tally+1 + end + end + if tally >= 4 then + ret = true + unlock_card(card) + end + end + + if card.name == 'Golden Ticket' then + local tally = 0 + for j = 1, #args.cards do + if args.cards[j].ability.name == 'Gold Card' then + tally = tally+1 + end + end + if tally >= 5 then + ret = true + unlock_card(card) + end + end + end + if args.type == 'discard_custom' then + if card.name == 'Hit the Road' then + local tally = 0 + for j = 1, #args.cards do + if args.cards[j]:get_id() == 11 then + tally = tally+1 + end + end + if tally >= 5 then + ret = true + unlock_card(card) + end + end + if card.name == 'Brainstorm' then + local eval = evaluate_poker_hand(args.cards) + if next(eval['Straight Flush']) then + local min = 10 + for j = 1, #args.cards do + if args.cards[j]:get_id() < min then min = args.cards[j]:get_id() end + end + if min == 10 then + ret = true + unlock_card(card) + end + end + end + end + if args.type == 'win_no_hand' and G.GAME.hands[card.unlock_condition.extra].played == 0 then + ret = true + unlock_card(card) + end + if args.type == 'win_custom' then + if card.name == 'Invisible Joker' and + G.GAME.max_jokers <= 4 then + ret = true + unlock_card(card) + end + if card.name == 'Blueprint' then + ret = true + unlock_card(card) + end + end + if args.type == 'win' then + if card.unlock_condition.n_rounds >= G.GAME.round then + ret = true + unlock_card(card) + end + end + if args.type == 'chip_score' then + if card.unlock_condition.chips <= args.chips then + ret = true + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + unlock_card(card) + return true end + })) + return true end + })) + end + end + end + if ret == true then + table.remove(G.P_LOCKED, i) + else + i = i + 1 + end + end +end + +function unlock_card(card) + if card.unlocked == false then + if G.GAME.seeded or G.GAME.challenge then return end + if card.unlocked or card.wip then return end + G:save_notify(card) + card.unlocked = true + if card.set == 'Back' then discover_card(card) end + table.sort(G.P_CENTER_POOLS["Back"], function (a, b) return (a.order - (a.unlocked and 100 or 0)) < (b.order - (b.unlocked and 100 or 0)) end) + G:save_progress() + G.FILE_HANDLER.force = true + notify_alert(card.key, card.set) + end +end + +function fetch_achievements() + G.ACHIEVEMENTS = G.ACHIEVEMENTS or { + ante_up = {order = 1, tier = 3, earned = false, steamid = "BAL_01"}, + ante_upper = {order = 2, tier = 3, earned = false, steamid = "BAL_02"}, + heads_up = {order = 3, tier = 2, earned = false, steamid = "BAL_03"}, + low_stakes = {order = 4, tier = 2, earned = false, steamid = "BAL_04"}, + mid_stakes = {order = 5, tier = 2, earned = false, steamid = "BAL_05"}, + high_stakes = {order = 6, tier = 2, earned = false, steamid = "BAL_06"}, + card_player = {order = 7, tier = 3, earned = false, steamid = "BAL_07"}, + card_discarder = {order = 8, tier = 3, earned = false, steamid = "BAL_08"}, + nest_egg = {order = 9, tier = 2, earned = false, steamid = "BAL_09"}, + flushed = {order = 10, tier = 3, earned = false, steamid = "BAL_10"}, + speedrunner = {order = 11, tier = 2, earned = false, steamid = "BAL_11"}, + roi = {order = 12, tier = 3, earned = false, steamid = "BAL_12"}, + shattered = {order = 13, tier = 3, earned = false, steamid = "BAL_13"}, + royale = {order = 14, tier = 3, earned = false, steamid = "BAL_14"}, + retrograde = {order = 15, tier = 2, earned = false, steamid = "BAL_15"}, + _10k = {order = 16, tier = 3, earned = false, steamid = "BAL_16"}, + _1000k = {order = 17, tier = 2, earned = false, steamid = "BAL_17"}, + _100000k = {order = 18, tier = 1, earned = false, steamid = "BAL_18"}, + tiny_hands = {order = 19, tier = 2, earned = false, steamid = "BAL_19"}, + big_hands = {order = 20, tier = 2, earned = false, steamid = "BAL_20"}, + you_get_what_you_get = {order = 21, tier = 3, earned = false, steamid = "BAL_21"}, + rule_bender = {order = 22, tier = 3, earned = false, steamid = "BAL_22"}, + rule_breaker = {order = 23, tier = 1, earned = false, steamid = "BAL_23"}, + legendary = {order = 24, tier = 3, earned = false, steamid = "BAL_24"}, + astronomy = {order = 25, tier = 3, earned = false, steamid = "BAL_25"}, + cartomancy = {order = 26, tier = 3, earned = false, steamid = "BAL_26"}, + clairvoyance = {order = 27, tier = 2, earned = false, steamid = "BAL_27"}, + extreme_couponer = {order = 28, tier = 1, earned = false, steamid = "BAL_28"}, + completionist = {order = 29, tier = 1, earned = false, steamid = "BAL_29"}, + completionist_plus = {order = 30, tier = 1, earned = false, steamid = "BAL_30"}, + completionist_plus_plus={order = 31, tier = 1, earned = false, steamid = "BAL_31"}, + } + + if G.F_NO_ACHIEVEMENTS then return end + + --|FROM LOCAL SETTINGS FILE + --|------------------------------------------------------- + if not G.STEAM then --|set this to false if you get this information from elsewhere + G.SETTINGS.ACHIEVEMENTS_EARNED = G.SETTINGS.ACHIEVEMENTS_EARNED or {} + for k, v in pairs(G.SETTINGS.ACHIEVEMENTS_EARNED) do + if G.ACHIEVEMENTS[k] then + G.ACHIEVEMENTS[k].earned = true + end + end + end + --|------------------------------------------------------- + + --|STEAM ACHIEVEMENTS + --|------------------------------------------------------- + if G.STEAM and not G.STEAM.initial_fetch then + for k, v in pairs(G.ACHIEVEMENTS) do + local achievement_name = v.steamid + local success, achieved = G.STEAM.userStats.getAchievement(achievement_name) + if success then + v.earned = not not achieved + end + end + G.STEAM.initial_fetch = true + end + --|------------------------------------------------------- + + --|Other platforms + --|------------------------------------------------------- + + --|------------------------------------------------------- +end + +function unlock_achievement(achievement_name) + if G.PROFILES[G.SETTINGS.profile].all_unlocked then return end + G.E_MANAGER:add_event(Event({ + no_delete = true, + blockable = false, + blocking = false, + func = function() + if G.STATE ~= G.STATES.HAND_PLAYED then + if G.PROFILES[G.SETTINGS.profile].all_unlocked then return end + local achievement_set = false + if G.F_NO_ACHIEVEMENTS then return end + + --|LOCAL SETTINGS FILE + --|------------------------------------------------------- + if not G.ACHIEVEMENTS then fetch_achievements() end + + G.SETTINGS.ACHIEVEMENTS_EARNED[achievement_name] = true + G:save_progress() + if G.ACHIEVEMENTS[achievement_name] and not G.STEAM then + if not G.ACHIEVEMENTS[achievement_name].earned then + --|THIS IS THE FIRST TIME THIS ACHIEVEMENT HAS BEEN EARNED + achievement_set = true + G.FILE_HANDLER.force = true + end + G.ACHIEVEMENTS[achievement_name].earned = true + end + --|------------------------------------------------------- + + + --|STEAM ACHIEVEMENTS + --|------------------------------------------------------- + if G.STEAM then + if G.ACHIEVEMENTS[achievement_name] then + if not G.ACHIEVEMENTS[achievement_name].earned then + --|THIS IS THE FIRST TIME THIS ACHIEVEMENT HAS BEEN EARNED + achievement_set = true + G.FILE_HANDLER.force = true + local achievement_code = G.ACHIEVEMENTS[achievement_name].steamid + local success, achieved = G.STEAM.userStats.getAchievement(achievement_code) + if not success or not achieved then + G.STEAM.send_control.update_queued = true + G.STEAM.userStats.setAchievement(achievement_code) + end + end + G.ACHIEVEMENTS[achievement_name].earned = true + end + end + --|------------------------------------------------------- + + --|Other platforms + --|------------------------------------------------------- + + --|------------------------------------------------------- + + if achievement_set then notify_alert(achievement_name) end + return true + end + end + }), 'achievement') +end + +function notify_alert(_achievement, _type) + _type = _type or 'achievement' + G.E_MANAGER:add_event(Event({ + no_delete = true, + pause_force = true, + timer = 'UPTIME', + func = function() + if G.achievement_notification then + G.achievement_notification:remove() + G.achievement_notification = nil + end + G.achievement_notification = G.achievement_notification or UIBox{ + definition = create_UIBox_notify_alert(_achievement, _type), + config = {align='cr', offset = {x=20,y=0},major = G.ROOM_ATTACH, bond = 'Weak'} + } + return true + end + }), 'achievement') + G.E_MANAGER:add_event(Event({ + no_delete = true, + trigger = 'after', + pause_force = true, + timer = 'UPTIME', + delay = 0.1, + func = function() + G.achievement_notification.alignment.offset.x = G.ROOM.T.x - G.achievement_notification.UIRoot.children[1].children[1].T.w - 0.8 + return true + end + }), 'achievement') + G.E_MANAGER:add_event(Event({ + no_delete = true, + pause_force = true, + trigger = 'after', + timer = 'UPTIME', + delay = 0.1, + func = function() + play_sound('highlight1', nil, 0.5) + play_sound('foil2', 0.5, 0.4) + return true + end + }), 'achievement') + G.E_MANAGER:add_event(Event({ + no_delete = true, + pause_force = true, + trigger = 'after', + delay = 3, + timer = 'UPTIME', + func = function() + G.achievement_notification.alignment.offset.x = 20 + return true + end + }), 'achievement') + G.E_MANAGER:add_event(Event({ + no_delete = true, + pause_force = true, + trigger = 'after', + delay = 0.5, + timer = 'UPTIME', + func = function() + if G.achievement_notification then + G.achievement_notification:remove() + G.achievement_notification = nil + end + return true + end + }), 'achievement') +end + +function inc_steam_stat(stat_name) + if not G.STEAM then return end + local success, current_stat = G.STEAM.userStats.getStatInt(stat_name) + if success then + G.STEAM.userStats.setStatInt(stat_name, current_stat+1) + G.STEAM.send_control.update_queued = true + end +end + +function unlock_notify() + local _UN = get_compressed(G.SETTINGS.profile..'/'..'unlock_notify.jkr') + if _UN then + for key in string.gmatch(_UN .. "\n", "(.-)\n") do + create_unlock_overlay(key) + end + love.filesystem.remove(G.SETTINGS.profile..'/'..'unlock_notify.jkr') + end +end + +function create_unlock_overlay(key) + if G.P_CENTERS[key] then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + no_delete = true, + func = (function() + if not G.OVERLAY_MENU then + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = G.P_CENTERS[key].set == 'Back' and create_UIBox_deck_unlock(G.P_CENTERS[key]) or create_UIBox_card_unlock(G.P_CENTERS[key]), + } + play_sound('foil1', 0.7, 0.3) + play_sound('gong', 1.4, 0.15) + return true + end + end) + }), 'unlock') + end +end + +function discover_card(card) + if G.GAME.seeded or G.GAME.challenge then return end + card = card or {} + if card.discovered or card.wip then return end + if card and not card.discovered then + card.alert = true + G.GAME.round_scores.new_collection.amt = G.GAME.round_scores.new_collection.amt+1 + end + card.discovered = true + set_discover_tallies() + G.E_MANAGER:add_event(Event({ + func = (function() + G:save_progress() + return true end)})) +end + +function get_deck_from_name(_name) + for k, v in pairs(G.P_CENTERS) do + if v.name == _name then return v end + end +end + +function get_next_voucher_key(_from_tag) + local _pool, _pool_key = get_current_pool('Voucher') + if _from_tag then _pool_key = 'Voucher_fromtag' end + local center = pseudorandom_element(_pool, pseudoseed(_pool_key)) + local it = 1 + while center == 'UNAVAILABLE' do + it = it + 1 + center = pseudorandom_element(_pool, pseudoseed(_pool_key..'_resample'..it)) + end + + return center +end + +function get_next_tag_key(append) + if G.FORCE_TAG then return G.FORCE_TAG end + local _pool, _pool_key = get_current_pool('Tag', nil, nil, append) + local _tag = pseudorandom_element(_pool, pseudoseed(_pool_key)) + local it = 1 + while _tag == 'UNAVAILABLE' do + it = it + 1 + _tag = pseudorandom_element(_pool, pseudoseed(_pool_key..'_resample'..it)) + end + + return _tag +end + +function create_playing_card(card_init, area, skip_materialize, silent, colours) + card_init = card_init or {} + card_init.front = card_init.front or pseudorandom_element(G.P_CARDS, pseudoseed('front')) + card_init.center = card_init.center or G.P_CENTERS.c_base + + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local _area = area or G.hand + local card = Card(_area.T.x, _area.T.y, G.CARD_W, G.CARD_H, card_init.front, card_init.center, {playing_card = G.playing_card}) + table.insert(G.playing_cards, card) + card.playing_card = G.playing_card + + if area then area:emplace(card) end + if not skip_materialize then card:start_materialize(colours, silent) end + + return card +end + +function get_pack(_key, _type) + local cume, it, center = 0, 0, nil + for k, v in ipairs(G.P_CENTER_POOLS['Booster']) do + if (not _type or _type == v.kind) and not G.GAME.banned_keys[v.key] then cume = cume + (v.weight or 1 ) end + end + local poll = pseudorandom(pseudoseed((_key or 'pack_generic')..G.GAME.round_resets.ante))*cume + for k, v in ipairs(G.P_CENTER_POOLS['Booster']) do + if not G.GAME.banned_keys[v.key] then + if not _type or _type == v.kind then it = it + (v.weight or 1) end + if it >= poll and it - (v.weight or 1) <= poll then center = v; break end + end + end + return center +end + +function get_current_pool(_type, _rarity, _legendary, _append) + --create the pool + G.ARGS.TEMP_POOL = EMPTY(G.ARGS.TEMP_POOL) + local _pool, _starting_pool, _pool_key, _pool_size = G.ARGS.TEMP_POOL, nil, '', 0 + + if _type == 'Joker' then + local rarity = _rarity or pseudorandom('rarity'..G.GAME.round_resets.ante..(_append or '')) + rarity = (_legendary and 4) or (rarity > 0.95 and 3) or (rarity > 0.7 and 2) or 1 + _starting_pool, _pool_key = G.P_JOKER_RARITY_POOLS[rarity], 'Joker'..rarity..(_append or '') + else _starting_pool, _pool_key = G.P_CENTER_POOLS[_type], _type..(_append or '') + end + + --cull the pool + for k, v in ipairs(_starting_pool) do + local add = nil + if _type == 'Enhanced' then + add = true + elseif _type == 'Demo' then + if v.pos and v.config then add = true end + elseif _type == 'Tag' then + if (not v.requires or (G.P_CENTERS[v.requires] and G.P_CENTERS[v.requires].discovered)) and + (not v.min_ante or v.min_ante <= G.GAME.round_resets.ante) then + add = true + end + elseif not (G.GAME.used_jokers[v.key] and not next(find_joker("Showman"))) and + (v.unlocked ~= false or v.rarity == 4) then + if v.set == 'Voucher' then + if not G.GAME.used_vouchers[v.key] then + local include = true + if v.requires then + for kk, vv in pairs(v.requires) do + if not G.GAME.used_vouchers[vv] then + include = false + end + end + end + if G.shop_vouchers and G.shop_vouchers.cards then + for kk, vv in ipairs(G.shop_vouchers.cards) do + if vv.config.center.key == v.key then include = false end + end + end + if include then + add = true + end + end + elseif v.set == 'Planet' then + if (not v.config.softlock or G.GAME.hands[v.config.hand_type].played > 0) then + add = true + end + elseif v.enhancement_gate then + add = nil + for kk, vv in pairs(G.playing_cards) do + if vv.config.center.key == v.enhancement_gate then + add = true + end + end + else + add = true + end + if v.name == 'Black Hole' or v.name == 'The Soul' then + add = false + end + end + + if v.no_pool_flag and G.GAME.pool_flags[v.no_pool_flag] then add = nil end + if v.yes_pool_flag and not G.GAME.pool_flags[v.yes_pool_flag] then add = nil end + + if add and not G.GAME.banned_keys[v.key] then + _pool[#_pool + 1] = v.key + _pool_size = _pool_size + 1 + else + _pool[#_pool + 1] = 'UNAVAILABLE' + end + end + + --if pool is empty + if _pool_size == 0 then + _pool = EMPTY(G.ARGS.TEMP_POOL) + if _type == 'Tarot' or _type == 'Tarot_Planet' then _pool[#_pool + 1] = "c_fool" + elseif _type == 'Planet' then _pool[#_pool + 1] = "c_pluto" + elseif _type == 'Spectral' then _pool[#_pool + 1] = "c_incantation" + elseif _type == 'Joker' then _pool[#_pool + 1] = "j_joker" + elseif _type == 'Demo' then _pool[#_pool + 1] = "j_joker" + elseif _type == 'Voucher' then _pool[#_pool + 1] = "v_blank" + elseif _type == 'Tag' then _pool[#_pool + 1] = "tag_handy" + else _pool[#_pool + 1] = "j_joker" + end + end + + return _pool, _pool_key..G.GAME.round_resets.ante +end + + +function poll_edition(_key, _mod, _no_neg, _guaranteed) + _mod = _mod or 1 + local edition_poll = pseudorandom(pseudoseed(_key or 'edition_generic')) + if _guaranteed then + if edition_poll > 1 - 0.003*25 and not _no_neg then + return {negative = true} + elseif edition_poll > 1 - 0.006*25 then + return {polychrome = true} + elseif edition_poll > 1 - 0.02*25 then + return {holo = true} + elseif edition_poll > 1 - 0.04*25 then + return {foil = true} + end + else + if edition_poll > 1 - 0.003*_mod and not _no_neg then + return {negative = true} + elseif edition_poll > 1 - 0.006*G.GAME.edition_rate*_mod then + return {polychrome = true} + elseif edition_poll > 1 - 0.02*G.GAME.edition_rate*_mod then + return {holo = true} + elseif edition_poll > 1 - 0.04*G.GAME.edition_rate*_mod then + return {foil = true} + end + end + return nil +end + +function create_card(_type, area, legendary, _rarity, skip_materialize, soulable, forced_key, key_append) + local area = area or G.jokers + local center = G.P_CENTERS.b_red + + + --should pool be skipped with a forced key + if not forced_key and soulable and (not G.GAME.banned_keys['c_soul']) then + if (_type == 'Tarot' or _type == 'Spectral' or _type == 'Tarot_Planet') and + not (G.GAME.used_jokers['c_soul'] and not next(find_joker("Showman"))) then + if pseudorandom('soul_'.._type..G.GAME.round_resets.ante) > 0.997 then + forced_key = 'c_soul' + end + end + if (_type == 'Planet' or _type == 'Spectral') and + not (G.GAME.used_jokers['c_black_hole'] and not next(find_joker("Showman"))) then + if pseudorandom('soul_'.._type..G.GAME.round_resets.ante) > 0.997 then + forced_key = 'c_black_hole' + end + end + end + + if _type == 'Base' then + forced_key = 'c_base' + end + + + + if forced_key and not G.GAME.banned_keys[forced_key] then + center = G.P_CENTERS[forced_key] + _type = (center.set ~= 'Default' and center.set or _type) + else + local _pool, _pool_key = get_current_pool(_type, _rarity, legendary, key_append) + center = pseudorandom_element(_pool, pseudoseed(_pool_key)) + local it = 1 + while center == 'UNAVAILABLE' do + it = it + 1 + center = pseudorandom_element(_pool, pseudoseed(_pool_key..'_resample'..it)) + end + + center = G.P_CENTERS[center] + end + + local front = ((_type=='Base' or _type == 'Enhanced') and pseudorandom_element(G.P_CARDS, pseudoseed('front'..(key_append or '')..G.GAME.round_resets.ante))) or nil + + local card = Card(area.T.x + area.T.w/2, area.T.y, G.CARD_W, G.CARD_H, front, center, + {bypass_discovery_center = area==G.shop_jokers or area == G.pack_cards or area == G.shop_vouchers or (G.shop_demo and area==G.shop_demo) or area==G.jokers or area==G.consumeables, + bypass_discovery_ui = area==G.shop_jokers or area == G.pack_cards or area==G.shop_vouchers or (G.shop_demo and area==G.shop_demo), + discover = area==G.jokers or area==G.consumeables, + bypass_back = G.GAME.selected_back.pos}) + if card.ability.consumeable and not skip_materialize then card:start_materialize() end + + if _type == 'Joker' then + if G.GAME.modifiers.all_eternal then + card:set_eternal(true) + end + if area == G.shop_jokers then + if G.GAME.modifiers.enable_eternals_in_shop and pseudorandom('stake_shop_joker_eternal'..G.GAME.round_resets.ante) > 0.7 then + card:set_eternal(true) + end + end + + local edition = poll_edition('edi'..(key_append or '')..G.GAME.round_resets.ante) + card:set_edition(edition) + check_for_unlock({type = 'have_edition'}) + end + return card +end + +function copy_card(other, new_card, card_scale, playing_card, strip_edition) + local new_card = new_card or Card(other.T.x, other.T.y, G.CARD_W*(card_scale or 1), G.CARD_H*(card_scale or 1), G.P_CARDS.empty, G.P_CENTERS.c_base, {playing_card = playing_card}) + new_card:set_ability(other.config.center) + new_card.ability.type = other.ability.type + new_card:set_base(other.config.card) + for k, v in pairs(other.ability) do + if type(v) == 'table' then + new_card.ability[k] = copy_table(v) + else + new_card.ability[k] = v + end + end + + if not strip_edition then + new_card:set_edition(other.edition or {}, nil, true) + end + check_for_unlock({type = 'have_edition'}) + new_card:set_seal(other.seal, true) + if other.params then + new_card.params = other.params + new_card.params.playing_card = playing_card + end + new_card.debuff = other.debuff + new_card.pinned = other.pinned + return new_card +end + +function tutorial_info(args) + local overlay_colour = {0.32,0.36,0.41,0} + ease_value(overlay_colour, 4, 0.6, nil, 'REAL', true,0.4) + G.OVERLAY_TUTORIAL = G.OVERLAY_TUTORIAL or UIBox{ + definition = {n=G.UIT.ROOT, config = {align = "cm", padding = 32.05, r=0.1, colour = overlay_colour, emboss = 0.05}, nodes={ + {n=G.UIT.R, config={align = "tr", minh = G.ROOM.T.h, minw = G.ROOM.T.w}, nodes={ + UIBox_button{label = {localize('b_skip').." >"}, button = "skip_tutorial_section", minw = 1.3, scale = 0.45, colour = G.C.JOKER_GREY} + }} + }}, + config = { + align = "cm", + offset = {x=0,y=3.2}, + major = G.ROOM_ATTACH, + bond = 'Weak' + } + } + G.OVERLAY_TUTORIAL.step = G.OVERLAY_TUTORIAL.step or 1 + G.OVERLAY_TUTORIAL.step_complete = false + local row_dollars_chips = G.HUD:get_UIE_by_ID('row_dollars_chips') + local align = args.align or "tm" + local step = args.step or 1 + local attach = args.attach or {major = row_dollars_chips, type = 'tm', offset = {x=0, y=-0.5}} + local pos = args.pos or {x=attach.major.T.x + attach.major.T.w/2, y=attach.major.T.y + attach.major.T.h/2} + local button = args.button or {button = localize('b_next'), func = 'tut_next'} + args.highlight = args.highlight or {} + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.3, + func = function() + if G.OVERLAY_TUTORIAL and G.OVERLAY_TUTORIAL.step == step and + not G.OVERLAY_TUTORIAL.step_complete then + G.CONTROLLER.interrupt.focus = true + G.OVERLAY_TUTORIAL.Jimbo = G.OVERLAY_TUTORIAL.Jimbo or Card_Character(pos) + if type(args.highlight) == 'function' then args.highlight = args.highlight() end + args.highlight[#args.highlight+1] = G.OVERLAY_TUTORIAL.Jimbo + G.OVERLAY_TUTORIAL.Jimbo:add_speech_bubble(args.text_key, align, args.loc_vars) + G.OVERLAY_TUTORIAL.Jimbo:set_alignment(attach) + if args.hard_set then G.OVERLAY_TUTORIAL.Jimbo:hard_set_VT() end + G.OVERLAY_TUTORIAL.button_listen = nil + if G.OVERLAY_TUTORIAL.content then G.OVERLAY_TUTORIAL.content:remove() end + if args.content then + G.OVERLAY_TUTORIAL.content = UIBox{ + definition = args.content(), + config = { + align = args.content_config and args.content_config.align or "cm", + offset = args.content_config and args.content_config.offset or {x=0,y=0}, + major = args.content_config and args.content_config.major or G.OVERLAY_TUTORIAL.Jimbo, + bond = 'Weak' + } + } + args.highlight[#args.highlight+1] = G.OVERLAY_TUTORIAL.content + end + if args.button_listen then G.OVERLAY_TUTORIAL.button_listen = args.button_listen end + if not args.no_button then G.OVERLAY_TUTORIAL.Jimbo:add_button(button.button, button.func, button.colour, button.update_func, true) end + G.OVERLAY_TUTORIAL.Jimbo:say_stuff(2*(#(G.localization.misc.tutorial[args.text_key] or {}))+1) + if args.snap_to then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + blocking = false, blockable = false, + func = function() + if G.OVERLAY_TUTORIAL and G.OVERLAY_TUTORIAL.Jimbo and not G.OVERLAY_TUTORIAL.Jimbo.talking then + local _snap_to = args.snap_to() + if _snap_to then + G.CONTROLLER.interrupt.focus = false + G.CONTROLLER:snap_to({node = args.snap_to()}) + end + return true + end + end + }), 'tutorial') + end + if args.highlight then G.OVERLAY_TUTORIAL.highlights = args.highlight end + G.OVERLAY_TUTORIAL.step_complete = true + end + return not G.OVERLAY_TUTORIAL or G.OVERLAY_TUTORIAL.step > step or G.OVERLAY_TUTORIAL.skip_steps + end + }), 'tutorial') + return step+1 +end + +function calculate_reroll_cost(skip_increment) + if G.GAME.current_round.free_rerolls < 0 then G.GAME.current_round.free_rerolls = 0 end + if G.GAME.current_round.free_rerolls > 0 then G.GAME.current_round.reroll_cost = 0; return end + G.GAME.current_round.reroll_cost_increase = G.GAME.current_round.reroll_cost_increase or 0 + if not skip_increment then G.GAME.current_round.reroll_cost_increase = G.GAME.current_round.reroll_cost_increase + 1 end + G.GAME.current_round.reroll_cost = (G.GAME.round_resets.temp_reroll_cost or G.GAME.round_resets.reroll_cost) + G.GAME.current_round.reroll_cost_increase +end + +function reset_idol_card() + G.GAME.current_round.idol_card.rank = 'Ace' + G.GAME.current_round.idol_card.suit = 'Spades' + local valid_idol_cards = {} + for k, v in ipairs(G.playing_cards) do + if v.ability.effect ~= 'Stone Card' then + valid_idol_cards[#valid_idol_cards+1] = v + end + end + if valid_idol_cards[1] then + local idol_card = pseudorandom_element(valid_idol_cards, pseudoseed('idol'..G.GAME.round_resets.ante)) + G.GAME.current_round.idol_card.rank = idol_card.base.value + G.GAME.current_round.idol_card.suit = idol_card.base.suit + G.GAME.current_round.idol_card.id = idol_card.base.id + end +end + +function reset_mail_rank() + G.GAME.current_round.mail_card.rank = 'Ace' + local valid_mail_cards = {} + for k, v in ipairs(G.playing_cards) do + if v.ability.effect ~= 'Stone Card' then + valid_mail_cards[#valid_mail_cards+1] = v + end + end + if valid_mail_cards[1] then + local mail_card = pseudorandom_element(valid_mail_cards, pseudoseed('mail'..G.GAME.round_resets.ante)) + G.GAME.current_round.mail_card.rank = mail_card.base.value + G.GAME.current_round.mail_card.id = mail_card.base.id + end +end + +function reset_ancient_card() + local ancient_card = pseudorandom_element({'Spades','Hearts','Clubs','Diamonds'}, pseudoseed('anc'..G.GAME.round_resets.ante)) + G.GAME.current_round.ancient_card.suit = ancient_card +end + +function reset_castle_card() + G.GAME.current_round.castle_card.suit = 'Spades' + local valid_castle_cards = {} + for k, v in ipairs(G.playing_cards) do + if v.ability.effect ~= 'Stone Card' then + valid_castle_cards[#valid_castle_cards+1] = v + end + end + if valid_castle_cards[1] then + local castle_card = pseudorandom_element(valid_castle_cards, pseudoseed('cas'..G.GAME.round_resets.ante)) + G.GAME.current_round.castle_card.suit = castle_card.base.suit + end +end + +function get_new_boss() + G.GAME.perscribed_bosses = G.GAME.perscribed_bosses or { + } + if G.GAME.perscribed_bosses and G.GAME.perscribed_bosses[G.GAME.round_resets.ante] then + local ret_boss = G.GAME.perscribed_bosses[G.GAME.round_resets.ante] + G.GAME.perscribed_bosses[G.GAME.round_resets.ante] = nil + G.GAME.bosses_used[ret_boss] = G.GAME.bosses_used[ret_boss] + 1 + return ret_boss + end + if G.FORCE_BOSS then return G.FORCE_BOSS end + + local eligible_bosses = {} + for k, v in pairs(G.P_BLINDS) do + if not v.boss then + + elseif not v.boss.showdown and (v.boss.min <= math.max(1, G.GAME.round_resets.ante) and ((math.max(1, G.GAME.round_resets.ante))%G.GAME.win_ante ~= 0 or G.GAME.round_resets.ante < 2)) then + eligible_bosses[k] = true + elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then + eligible_bosses[k] = true + end + end + + local min_use = 100 + for k, v in pairs(G.GAME.bosses_used) do + if eligible_bosses[k] then + eligible_bosses[k] = v + if eligible_bosses[k] <= min_use then + min_use = eligible_bosses[k] + end + end + end + for k, v in pairs(eligible_bosses) do + if eligible_bosses[k] then + if eligible_bosses[k] > min_use then + eligible_bosses[k] = nil + end + end + end + local _, boss = pseudorandom_element(eligible_bosses, pseudoseed('boss')) + G.GAME.bosses_used[boss] = G.GAME.bosses_used[boss] + 1 + + return boss +end + +function get_type_colour(_c, card) + return + ((_c.unlocked == false and not (card and card.bypass_lock)) and G.C.BLACK) or + ((_c.unlocked ~= false and (_c.set == 'Joker' or _c.consumeable or _c.set == 'Voucher') and not _c.discoveredand and not ((_c.area ~= G.jokers and _c.area ~= G.consumeables and _c.area) or not _c.area)) and G.C.JOKER_GREY) or + (card and card.debuff and mix_colours(G.C.RED, G.C.GREY, 0.7)) or + (_c.set == 'Joker' and G.C.RARITY[_c.rarity]) or + (_c.set == 'Edition' and G.C.DARK_EDITION) or + (_c.set == 'Booster' and G.C.BOOSTER) or + G.C.SECONDARY_SET[_c.set] or + {0, 1, 1, 1} +end + +function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end) + local first_pass = nil + if not full_UI_table then + first_pass = true + full_UI_table = { + main = {}, + info = {}, + type = {}, + name = nil, + badges = badges or {} + } + end + + local desc_nodes = (not full_UI_table.name and full_UI_table.main) or full_UI_table.info + local name_override = nil + local info_queue = {} + + if full_UI_table.name then + full_UI_table.info[#full_UI_table.info+1] = {} + desc_nodes = full_UI_table.info[#full_UI_table.info] + end + + if not full_UI_table.name then + if specific_vars and specific_vars.no_name then + full_UI_table.name = true + elseif card_type == 'Locked' then + full_UI_table.name = localize{type = 'name', set = 'Other', key = 'locked', nodes = {}} + elseif card_type == 'Undiscovered' then + full_UI_table.name = localize{type = 'name', set = 'Other', key = 'undiscovered_'..(string.lower(_c.set)), name_nodes = {}} + elseif specific_vars and (card_type == 'Default' or card_type == 'Enhanced') then + if (_c.name == 'Stone Card') then full_UI_table.name = true end + if (specific_vars.playing_card and (_c.name ~= 'Stone Card')) then + full_UI_table.name = {} + localize{type = 'other', key = 'playing_card', set = 'Other', nodes = full_UI_table.name, vars = {localize(specific_vars.value, 'ranks'), localize(specific_vars.suit, 'suits_plural'), colours = {specific_vars.colour}}} + full_UI_table.name = full_UI_table.name[1] + end + elseif card_type == 'Booster' then + + else + full_UI_table.name = localize{type = 'name', set = _c.set, key = _c.key, nodes = full_UI_table.name} + end + full_UI_table.card_type = card_type or _c.set + end + + local loc_vars = {} + if main_start then + desc_nodes[#desc_nodes+1] = main_start + end + + if _c.set == 'Other' then + localize{type = 'other', key = _c.key, nodes = desc_nodes, vars = specific_vars} + elseif card_type == 'Locked' then + if _c.wip then localize{type = 'other', key = 'wip_locked', set = 'Other', nodes = desc_nodes, vars = loc_vars} + elseif _c.demo and specific_vars then localize{type = 'other', key = 'demo_shop_locked', nodes = desc_nodes, vars = loc_vars} + elseif _c.demo then localize{type = 'other', key = 'demo_locked', nodes = desc_nodes, vars = loc_vars} + else + if _c.name == 'Golden Ticket' then + elseif _c.name == 'Mr. Bones' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_losses} + elseif _c.name == 'Acrobat' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_hands_played} + elseif _c.name == 'Sock and Buskin' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_face_cards_played} + elseif _c.name == 'Swashbuckler' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_jokers_sold} + elseif _c.name == 'Troubadour' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Certificate' then + elseif _c.name == 'Smeared Joker' then loc_vars = {_c.unlock_condition.extra.count,localize{type = 'name_text', key = _c.unlock_condition.extra.e_key, set = 'Enhanced'}} + elseif _c.name == 'Throwback' then + elseif _c.name == 'Hanging Chad' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'Rough Gem' then loc_vars = {_c.unlock_condition.extra.count, localize(_c.unlock_condition.extra.suit, 'suits_singular')} + elseif _c.name == 'Bloodstone' then loc_vars = {_c.unlock_condition.extra.count, localize(_c.unlock_condition.extra.suit, 'suits_singular')} + elseif _c.name == 'Arrowhead' then loc_vars = {_c.unlock_condition.extra.count, localize(_c.unlock_condition.extra.suit, 'suits_singular')} + elseif _c.name == 'Onyx Agate' then loc_vars = {_c.unlock_condition.extra.count, localize(_c.unlock_condition.extra.suit, 'suits_singular')} + elseif _c.name == 'Glass Joker' then loc_vars = {_c.unlock_condition.extra.count, localize{type = 'name_text', key = _c.unlock_condition.extra.e_key, set = 'Enhanced'}} + elseif _c.name == 'Showman' then loc_vars = {_c.unlock_condition.ante} + elseif _c.name == 'Flower Pot' then loc_vars = {_c.unlock_condition.ante} + elseif _c.name == 'Blueprint' then + elseif _c.name == 'Wee Joker' then loc_vars = {_c.unlock_condition.n_rounds} + elseif _c.name == 'Merry Andy' then loc_vars = {_c.unlock_condition.n_rounds} + elseif _c.name == 'Oops! All 6s' then loc_vars = {number_format(_c.unlock_condition.chips)} + elseif _c.name == 'The Idol' then loc_vars = {number_format(_c.unlock_condition.chips)} + elseif _c.name == 'Seeing Double' then loc_vars = {localize("ph_4_7_of_clubs")} + elseif _c.name == 'Matador' then + elseif _c.name == 'Hit the Road' then + elseif _c.name == 'The Duo' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'The Trio' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'The Family' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'The Order' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'The Tribe' then loc_vars = {localize(_c.unlock_condition.extra, 'poker_hands')} + elseif _c.name == 'Stuntman' then loc_vars = {number_format(_c.unlock_condition.chips)} + elseif _c.name == 'Invisible Joker' then + elseif _c.name == 'Brainstorm' then + elseif _c.name == 'Satellite' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Shoot the Moon' then + elseif _c.name == "Driver's License" then loc_vars = {_c.unlock_condition.extra.count} + elseif _c.name == 'Cartomancer' then loc_vars = {_c.unlock_condition.tarot_count} + elseif _c.name == 'Astronomer' then + elseif _c.name == 'Burnt Joker' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_cards_sold} + elseif _c.name == 'Bootstraps' then loc_vars = {_c.unlock_condition.extra.count} + --Vouchers + elseif _c.name == 'Overstock Plus' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_shop_dollars_spent} + elseif _c.name == 'Liquidation' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Tarot Tycoon' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_tarots_bought} + elseif _c.name == 'Planet Tycoon' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_planets_bought} + elseif _c.name == 'Glow Up' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Reroll Glut' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_shop_rerolls} + elseif _c.name == 'Omen Globe' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_tarot_reading_used} + elseif _c.name == 'Observatory' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_planetarium_used} + elseif _c.name == 'Nacho Tong' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_cards_played} + elseif _c.name == 'Recyclomancy' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_cards_discarded} + elseif _c.name == 'Money Tree' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak} + elseif _c.name == 'Antimatter' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].voucher_usage.v_blank and G.PROFILES[G.SETTINGS.profile].voucher_usage.v_blank.count or 0} + elseif _c.name == 'Illusion' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_playing_cards_bought} + elseif _c.name == 'Petroglyph' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Retcon' then loc_vars = {_c.unlock_condition.extra} + elseif _c.name == 'Palette' then loc_vars = {_c.unlock_condition.extra} + end + + if _c.rarity and _c.rarity == 4 and specific_vars and not specific_vars.not_hidden then + localize{type = 'unlocks', key = 'joker_locked_legendary', set = 'Other', nodes = desc_nodes, vars = loc_vars} + else + + localize{type = 'unlocks', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + end + end + elseif hide_desc then + localize{type = 'other', key = 'undiscovered_'..(string.lower(_c.set)), set = _c.set, nodes = desc_nodes} + elseif specific_vars and specific_vars.debuffed then + localize{type = 'other', key = 'debuffed_'..(specific_vars.playing_card and 'playing_card' or 'default'), nodes = desc_nodes} + elseif _c.set == 'Joker' then + if _c.name == 'Stone Joker' or _c.name == 'Marble Joker' then info_queue[#info_queue+1] = G.P_CENTERS.m_stone + elseif _c.name == 'Steel Joker' then info_queue[#info_queue+1] = G.P_CENTERS.m_steel + elseif _c.name == 'Glass Joker' then info_queue[#info_queue+1] = G.P_CENTERS.m_glass + elseif _c.name == 'Golden Ticket' then info_queue[#info_queue+1] = G.P_CENTERS.m_gold + elseif _c.name == 'Lucky Cat' then info_queue[#info_queue+1] = G.P_CENTERS.m_lucky + elseif _c.name == 'Midas Mask' then info_queue[#info_queue+1] = G.P_CENTERS.m_gold + elseif _c.name == 'Invisible Joker' then + if G.jokers and G.jokers.cards then + for k, v in ipairs(G.jokers.cards) do + if (v.edition and v.edition.negative) and (G.localization.descriptions.Other.remove_negative)then + main_end = {} + localize{type = 'other', key = 'remove_negative', nodes = main_end, vars = {}} + main_end = main_end[1] + break + end + end + end + elseif _c.name == 'Diet Cola' then info_queue[#info_queue+1] = {key = 'tag_double', set = 'Tag'} + elseif _c.name == 'Perkeo' then info_queue[#info_queue+1] = {key = 'e_negative_consumable', set = 'Edition', config = {extra = 1}} + end + if specific_vars and specific_vars.pinned then info_queue[#info_queue+1] = {key = 'pinned_left', set = 'Other'} end + if specific_vars and specific_vars.sticker then info_queue[#info_queue+1] = {key = string.lower(specific_vars.sticker)..'_sticker', set = 'Other'} end + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = specific_vars or {}} + elseif _c.set == 'Tag' then + if _c.name == 'Negative Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_negative + elseif _c.name == 'Foil Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_foil + elseif _c.name == 'Holographic Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_holo + elseif _c.name == 'Polychrome Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome + elseif _c.name == 'Charm Tag' then info_queue[#info_queue+1] = G.P_CENTERS.p_arcana_mega_1 + elseif _c.name == 'Meteor Tag' then info_queue[#info_queue+1] = G.P_CENTERS.p_celestial_mega_1 + elseif _c.name == 'Ethereal Tag' then info_queue[#info_queue+1] = G.P_CENTERS.p_spectral_normal_1 + elseif _c.name == 'Standard Tag' then info_queue[#info_queue+1] = G.P_CENTERS.p_standard_mega_1 + elseif _c.name == 'Buffoon Tag' then info_queue[#info_queue+1] = G.P_CENTERS.p_buffoon_mega_1 + end + localize{type = 'descriptions', key = _c.key, set = 'Tag', nodes = desc_nodes, vars = specific_vars or {}} + elseif _c.set == 'Voucher' then + if _c.name == "Overstock" or _c.name == 'Overstock Plus' then + elseif _c.name == "Tarot Merchant" or _c.name == "Tarot Tycoon" then loc_vars = {_c.config.extra_disp} + elseif _c.name == "Planet Merchant" or _c.name == "Planet Tycoon" then loc_vars = {_c.config.extra_disp} + elseif _c.name == "Hone" or _c.name == "Glow Up" then loc_vars = {_c.config.extra} + elseif _c.name == "Reroll Surplus" or _c.name == "Reroll Glut" then loc_vars = {_c.config.extra} + elseif _c.name == "Grabber" or _c.name == "Nacho Tong" then loc_vars = {_c.config.extra} + elseif _c.name == "Wasteful" or _c.name == "Recyclomancy" then loc_vars = {_c.config.extra} + elseif _c.name == "Seed Money" or _c.name == "Money Tree" then loc_vars = {_c.config.extra/5} + elseif _c.name == "Blank" or _c.name == "Antimatter" then + elseif _c.name == "Hieroglyph" or _c.name == "Petroglyph" then loc_vars = {_c.config.extra} + elseif _c.name == "Director's Cut" or _c.name == "Retcon" then loc_vars = {_c.config.extra} + elseif _c.name == "Paint Brush" or _c.name == "Palette" then loc_vars = {_c.config.extra} + elseif _c.name == "Telescope" or _c.name == "Observatory" then loc_vars = {_c.config.extra} + elseif _c.name == "Clearance Sale" or _c.name == "Liquidation" then loc_vars = {_c.config.extra} + end + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + elseif _c.set == 'Edition' then + loc_vars = {_c.config.extra} + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + elseif _c.set == 'Default' and specific_vars then + if specific_vars.nominal_chips then + localize{type = 'other', key = 'card_chips', nodes = desc_nodes, vars = {specific_vars.nominal_chips}} + end + if specific_vars.bonus_chips then + localize{type = 'other', key = 'card_extra_chips', nodes = desc_nodes, vars = {specific_vars.bonus_chips}} + end + elseif _c.set == 'Enhanced' then + if specific_vars and _c.name ~= 'Stone Card' and specific_vars.nominal_chips then + localize{type = 'other', key = 'card_chips', nodes = desc_nodes, vars = {specific_vars.nominal_chips}} + end + if _c.effect == 'Mult Card' then loc_vars = {_c.config.mult} + elseif _c.effect == 'Wild Card' then + elseif _c.effect == 'Glass Card' then loc_vars = {_c.config.Xmult, G.GAME.probabilities.normal, _c.config.extra} + elseif _c.effect == 'Steel Card' then loc_vars = {_c.config.h_x_mult} + elseif _c.effect == 'Stone Card' then loc_vars = {((specific_vars and specific_vars.bonus_chips) or _c.config.bonus)} + elseif _c.effect == 'Gold Card' then loc_vars = {_c.config.h_dollars} + elseif _c.effect == 'Lucky Card' then loc_vars = {G.GAME.probabilities.normal, _c.config.mult, 5, _c.config.p_dollars, 15} + end + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + if _c.name ~= 'Stone Card' and ((specific_vars and specific_vars.bonus_chips) or _c.config.bonus) then + localize{type = 'other', key = 'card_extra_chips', nodes = desc_nodes, vars = {((specific_vars and specific_vars.bonus_chips) or _c.config.bonus)}} + end + elseif _c.set == 'Booster' then + local desc_override = 'p_arcana_normal' + if _c.name == 'Arcana Pack' then desc_override = 'p_arcana_normal'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Jumbo Arcana Pack' then desc_override = 'p_arcana_jumbo'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Mega Arcana Pack' then desc_override = 'p_arcana_mega'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Celestial Pack' then desc_override = 'p_celestial_normal'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Jumbo Celestial Pack' then desc_override = 'p_celestial_jumbo'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Mega Celestial Pack' then desc_override = 'p_celestial_mega'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Spectral Pack' then desc_override = 'p_spectral_normal'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Jumbo Spectral Pack' then desc_override = 'p_spectral_jumbo'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Mega Spectral Pack' then desc_override = 'p_spectral_mega'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Standard Pack' then desc_override = 'p_standard_normal'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Jumbo Standard Pack' then desc_override = 'p_standard_jumbo'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Mega Standard Pack' then desc_override = 'p_standard_mega'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Buffoon Pack' then desc_override = 'p_buffoon_normal'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Jumbo Buffoon Pack' then desc_override = 'p_buffoon_jumbo'; loc_vars = {_c.config.choose, _c.config.extra} + elseif _c.name == 'Mega Buffoon Pack' then desc_override = 'p_buffoon_mega'; loc_vars = {_c.config.choose, _c.config.extra} + end + name_override = desc_override + if not full_UI_table.name then full_UI_table.name = localize{type = 'name', set = 'Other', key = name_override, nodes = full_UI_table.name} end + localize{type = 'other', key = desc_override, nodes = desc_nodes, vars = loc_vars} + elseif _c.set == 'Spectral' then + if _c.name == 'Familiar' or _c.name == 'Grim' or _c.name == 'Incantation' then loc_vars = {_c.config.extra} + elseif _c.name == 'Immolate' then loc_vars = {_c.config.extra.destroy, _c.config.extra.dollars} + elseif _c.name == 'Hex' then info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome + elseif _c.name == 'Talisman' then info_queue[#info_queue+1] = {key = 'gold_seal', set = 'Other'} + elseif _c.name == 'Deja Vu' then info_queue[#info_queue+1] = {key = 'red_seal', set = 'Other'} + elseif _c.name == 'Trance' then info_queue[#info_queue+1] = {key = 'blue_seal', set = 'Other'} + elseif _c.name == 'Medium' then info_queue[#info_queue+1] = {key = 'purple_seal', set = 'Other'} + elseif _c.name == 'Ankh' then + if G.jokers and G.jokers.cards then + for k, v in ipairs(G.jokers.cards) do + if (v.edition and v.edition.negative) and (G.localization.descriptions.Other.remove_negative)then + info_queue[#info_queue+1] = G.P_CENTERS.e_negative + main_end = {} + localize{type = 'other', key = 'remove_negative', nodes = main_end, vars = {}} + main_end = main_end[1] + break + end + end + end + elseif _c.name == 'Cryptid' then loc_vars = {_c.config.extra} + end + if _c.name == 'Ectoplasm' then info_queue[#info_queue+1] = G.P_CENTERS.e_negative; loc_vars = {G.GAME.ecto_minus or 1} end + if _c.name == 'Aura' then + info_queue[#info_queue+1] = G.P_CENTERS.e_foil + info_queue[#info_queue+1] = G.P_CENTERS.e_holo + info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome + end + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + elseif _c.set == 'Planet' then + loc_vars = { + G.GAME.hands[_c.config.hand_type].level,localize(_c.config.hand_type, 'poker_hands'), G.GAME.hands[_c.config.hand_type].l_mult, G.GAME.hands[_c.config.hand_type].l_chips, + colours = {(G.GAME.hands[_c.config.hand_type].level==1 and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[math.min(7, G.GAME.hands[_c.config.hand_type].level)])} + } + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + elseif _c.set == 'Tarot' then + if _c.name == "The Fool" then + local fool_c = G.GAME.last_tarot_planet and G.P_CENTERS[G.GAME.last_tarot_planet] or nil + local last_tarot_planet = fool_c and localize{type = 'name_text', key = fool_c.key, set = fool_c.set} or localize('k_none') + local colour = (not fool_c or fool_c.name == 'The Fool') and G.C.RED or G.C.GREEN + main_end = { + {n=G.UIT.C, config={align = "bm", padding = 0.02}, nodes={ + {n=G.UIT.C, config={align = "m", colour = colour, r = 0.05, padding = 0.05}, nodes={ + {n=G.UIT.T, config={text = ' '..last_tarot_planet..' ', colour = G.C.UI.TEXT_LIGHT, scale = 0.3, shadow = true}}, + }} + }} + } + loc_vars = {last_tarot_planet} + if not (not fool_c or fool_c.name == 'The Fool') then + info_queue[#info_queue+1] = fool_c + end + elseif _c.name == "The Magician" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The High Priestess" then loc_vars = {_c.config.planets} + elseif _c.name == "The Empress" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Emperor" then loc_vars = {_c.config.tarots} + elseif _c.name == "The Hierophant" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Lovers" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Chariot" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "Justice" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Hermit" then loc_vars = {_c.config.extra} + elseif _c.name == "The Wheel of Fortune" then loc_vars = {G.GAME.probabilities.normal, _c.config.extra}; info_queue[#info_queue+1] = G.P_CENTERS.e_foil; info_queue[#info_queue+1] = G.P_CENTERS.e_holo; info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome; + elseif _c.name == "Strength" then loc_vars = {_c.config.max_highlighted} + elseif _c.name == "The Hanged Man" then loc_vars = {_c.config.max_highlighted} + elseif _c.name == "Death" then loc_vars = {_c.config.max_highlighted} + elseif _c.name == "Temperance" then + local _money = 0 + if G.jokers then + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.set == 'Joker' then + _money = _money + G.jokers.cards[i].sell_cost + end + end + end + loc_vars = {_c.config.extra, math.min(_c.config.extra, _money)} + elseif _c.name == "The Devil" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Tower" then loc_vars = {_c.config.max_highlighted, localize{type = 'name_text', set = 'Enhanced', key = _c.config.mod_conv}}; info_queue[#info_queue+1] = G.P_CENTERS[_c.config.mod_conv] + elseif _c.name == "The Star" then loc_vars = {_c.config.max_highlighted, localize(_c.config.suit_conv, 'suits_plural'), colours = {G.C.SUITS[_c.config.suit_conv]}} + elseif _c.name == "The Moon" then loc_vars = {_c.config.max_highlighted, localize(_c.config.suit_conv, 'suits_plural'), colours = {G.C.SUITS[_c.config.suit_conv]}} + elseif _c.name == "The Sun" then loc_vars = {_c.config.max_highlighted, localize(_c.config.suit_conv, 'suits_plural'), colours = {G.C.SUITS[_c.config.suit_conv]}} + elseif _c.name == "Judgement" then + elseif _c.name == "The World" then loc_vars = {_c.config.max_highlighted, localize(_c.config.suit_conv, 'suits_plural'), colours = {G.C.SUITS[_c.config.suit_conv]}} + end + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + end + + if main_end then + desc_nodes[#desc_nodes+1] = main_end + end + + --Fill all remaining info if this is the main desc + if not ((specific_vars and not specific_vars.sticker) and (card_type == 'Default' or card_type == 'Enhanced')) then + if desc_nodes == full_UI_table.main and not full_UI_table.name then + localize{type = 'name', key = _c.key, set = _c.set, nodes = full_UI_table.name} + if not full_UI_table.name then full_UI_table.name = {} end + elseif desc_nodes ~= full_UI_table.main then + desc_nodes.name = localize{type = 'name_text', key = name_override or _c.key, set = name_override and 'Other' or _c.set} + end + end + + if first_pass and not (_c.set == 'Edition') and badges then + for k, v in ipairs(badges) do + if v == 'foil' then info_queue[#info_queue+1] = G.P_CENTERS['e_foil'] end + if v == 'holographic' then info_queue[#info_queue+1] = G.P_CENTERS['e_holo'] end + if v == 'polychrome' then info_queue[#info_queue+1] = G.P_CENTERS['e_polychrome'] end + if v == 'negative' then info_queue[#info_queue+1] = G.P_CENTERS['e_negative'] end + if v == 'negative_consumable' then info_queue[#info_queue+1] = {key = 'e_negative_consumable', set = 'Edition', config = {extra = 1}} end + if v == 'gold_seal' then info_queue[#info_queue+1] = {key = 'gold_seal', set = 'Other'} end + if v == 'blue_seal' then info_queue[#info_queue+1] = {key = 'blue_seal', set = 'Other'} end + if v == 'red_seal' then info_queue[#info_queue+1] = {key = 'red_seal', set = 'Other'} end + if v == 'purple_seal' then info_queue[#info_queue+1] = {key = 'purple_seal', set = 'Other'} end + if v == 'eternal' then info_queue[#info_queue+1] = {key = 'eternal', set = 'Other'} end + if v == 'pinned_left' then info_queue[#info_queue+1] = {key = 'pinned_left', set = 'Other'} end + end + end + + for _, v in ipairs(info_queue) do + generate_card_ui(v, full_UI_table) + end + + return full_UI_table +end diff --git a/functions/misc_functions.lua b/functions/misc_functions.lua new file mode 100644 index 0000000..865d172 --- /dev/null +++ b/functions/misc_functions.lua @@ -0,0 +1,1908 @@ +--Updates all display information for all displays for a given screenmode. Returns the key for the resolution option cycle +-- +---@param screenmode string optional arg for one of 'Windowed', 'Fullscreen', or 'Borderless' +---@param display number optional arg to match fullscreen resolution with only the current display +function GET_DISPLAYINFO(screenmode, display) + --default the display to the current display, otherwise we need to return all available modes for the selected display + display = display or G.SETTINGS.WINDOW.selcted_display or 1 + + --default to current mode/'windowed', otherwise return all available options for specified mode + screenmode = screenmode or G.SETTINGS.WINDOW.screenmode or 'Windowed' + + --Get a count of the connected displays and iterate through them to update our window setting options accordingly + local display_count = love.window.getDisplayCount() + local res_option = 1 --This is the mode that the fullscreen option will default to for resolution, if we can find it in the list for the current monitor + local realw, realh = love.window.getMode() --the actual render resolution the window is currently using + local current_res_values = {w = realw, h = realh} + + --reset names to populate for displays + G.SETTINGS.WINDOW.display_names = {} + + for i = 1, display_count do + --reset the screen resolution table for this display and set the name + G.SETTINGS.WINDOW.DISPLAYS[i] = {} + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions = { + strings = {}, + values = {}, + } + G.SETTINGS.WINDOW.display_names[i] = ''..i + + --Get the render resolution and desktop resolution, this is a workaround to a known OpenGL issue where windows doesn't supply the correct DPI scaling factor + local render_w, render_h = love.window.getDesktopDimensions(i) + local unscaled_dims = love.window.getFullscreenModes(i)[1] + + --determine the DPI scale here, this can be used to determine the actual render resolution per display + G.SETTINGS.WINDOW.DISPLAYS[i].DPI_scale = 1--math.floor((0.5*unscaled_dims.width/render_w + 0.5*unscaled_dims.height/render_h)*500 + 0.5)/500 + G.SETTINGS.WINDOW.DISPLAYS[i].MONITOR_DIMS = unscaled_dims + + if screenmode == 'Fullscreen' then --Iterate through all possible screenmodes and populate the screen_resolutions table + --if the real resolution of the window is found, make sure we return that value + for _, v in ipairs(love.window.getFullscreenModes(i)) do + local _w, _h = v.width*G.SETTINGS.WINDOW.DISPLAYS[i].DPI_scale, v.height*G.SETTINGS.WINDOW.DISPLAYS[i].DPI_scale + if _w <= G.SETTINGS.WINDOW.DISPLAYS[i].MONITOR_DIMS.width and _h <= G.SETTINGS.WINDOW.DISPLAYS[i].MONITOR_DIMS.height then + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.strings[#G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.strings+1] = ''..v.width..' X '..v.height + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.values[#G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.values+1] = {w = v.width, h = v.height} + if i == G.SETTINGS.WINDOW.selected_display and i == display and current_res_values.w == v.width and current_res_values.h == v.height then + res_option = #G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.values + end + end + end + elseif screenmode == 'Windowed' then + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.strings[1] = '-' + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.values[1] = {w = 1280, h = 720} + elseif screenmode == 'Borderless' then + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.strings[1] = + ''..G.SETTINGS.WINDOW.DISPLAYS[i].MONITOR_DIMS.width/G.SETTINGS.WINDOW.DISPLAYS[i].DPI_scale..' X ' + ..G.SETTINGS.WINDOW.DISPLAYS[i].MONITOR_DIMS.height/G.SETTINGS.WINDOW.DISPLAYS[i].DPI_scale + G.SETTINGS.WINDOW.DISPLAYS[i].screen_resolutions.values[1] = current_res_values + end + end + return res_option +end + +function timer_checkpoint(label, type, reset) + if not G.F_ENABLE_PERF_OVERLAY then return end + G.check = G.check or { + draw = { + checkpoint_list = {}, + checkpoints = 0, + last_time = 0, + }, + update = { + checkpoint_list = {}, + checkpoints = 0, + last_time = 0, + } + } + local cp = G.check[type] + if reset then + cp.last_time = love.timer.getTime() + cp.checkpoints = 0 + return + end + + cp.checkpoint_list[cp.checkpoints+1] = cp.checkpoint_list[cp.checkpoints+1] or {} + cp.checkpoints = cp.checkpoints+1 + cp.checkpoint_list[cp.checkpoints].label = label + cp.checkpoint_list[cp.checkpoints].time = love.timer.getTime() + cp.checkpoint_list[cp.checkpoints].TTC = cp.checkpoint_list[cp.checkpoints].time - cp.last_time + cp.checkpoint_list[cp.checkpoints].trend = cp.checkpoint_list[cp.checkpoints].trend or {} + cp.checkpoint_list[cp.checkpoints].states = cp.checkpoint_list[cp.checkpoints].states or {} + table.insert(cp.checkpoint_list[cp.checkpoints].trend, 1, cp.checkpoint_list[cp.checkpoints].TTC) + table.insert(cp.checkpoint_list[cp.checkpoints].states, 1, G.STATE) + cp.checkpoint_list[cp.checkpoints].trend[401] = nil + cp.checkpoint_list[cp.checkpoints].states[401] = nil + cp.last_time = cp.checkpoint_list[cp.checkpoints].time + + local av = 0 + for k, v in ipairs(cp.checkpoint_list[cp.checkpoints].trend) do + av = av + v/#cp.checkpoint_list[cp.checkpoints].trend + end + cp.checkpoint_list[cp.checkpoints].average = av +end + +function boot_timer(_label, _next, progress) + progress = progress or 0 + G.LOADING = G.LOADING or { + font = love.graphics.setNewFont("resources/fonts/m6x11plus.ttf", 20), + love.graphics.dis + } + local realw, realh = love.window.getMode() + love.graphics.setCanvas() + love.graphics.push() + love.graphics.setShader() + love.graphics.clear(0,0,0,1) + love.graphics.setColor(0.6, 0.8, 0.9,1) + if progress > 0 then love.graphics.rectangle('fill', realw/2 - 150, realh/2 - 15, progress*300, 30, 5) end + love.graphics.setColor(1, 1, 1,1) + love.graphics.setLineWidth(3) + love.graphics.rectangle('line', realw/2 - 150, realh/2 - 15, 300, 30, 5) + if G.F_VERBOSE and not _RELEASE_MODE then love.graphics.print("LOADING: ".._next, realw/2 - 150, realh/2 +40) end + love.graphics.pop() + love.graphics.present() + + G.ARGS.bt = G.ARGS.bt or love.timer.getTime() + G.ARGS.bt = love.timer.getTime() +end + +function EMPTY(t) + if not t then return {} end + for k, v in pairs(t) do + t[k] = nil + end + return t +end + +function interp(per, max, min) +min = min or 0 + if per and max then + return per*(max - min) + min + end +end + +function remove_all(t) + for i=#t, 1, -1 do + local v=t[i] + table.remove(t, i) + if v and v.children then + remove_all(v.children) + end + if v then v:remove() end + v = nil + end + for _, v in pairs(t) do + if v.children then remove_all(v.children) end + v:remove() + v = nil + end +end + +function Vector_Dist(trans1, trans2, mid) + local x = trans1.x - trans2.x + (mid and 0.5*(trans1.w-trans2.w) or 0) + local y = trans1.y - trans2.y + (mid and 0.5*(trans1.h-trans2.h) or 0) + return math.sqrt((x)*(x) + (y)*(y)) +end + +function Vector_Len(trans1) + return math.sqrt((trans1.x)*(trans1.x) + (trans1.y)*(trans1.y)) +end + +function Vector_Sub(trans1, trans2) + return {x = trans1.x - trans2.x, y = trans1.y - trans2.y} +end + +function get_index(t, val) + local index = nil + for i, v in pairs(t) do + if v == val then + index = i + end + end + return index +end + +function table_length(t) + local count = 0 + for _ in pairs(t) do count = count + 1 end + return count +end + +function remove_nils(t) + local ans = {} + for _,v in pairs(t) do + ans[ #ans+1 ] = v + end + return ans + end + +function SWAP(t, i, j) + if not t or not i or not j then return end + local temp = t[i] + t[i] = t[j] + t[j] = temp +end + +function pseudoshuffle(list, seed) + if seed then math.randomseed(seed) end + + if list[1] and list[1].sort_id then + table.sort(list, function (a, b) return (a.sort_id or 1) < (b.sort_id or 2) end) + end + + for i = #list, 2, -1 do + local j = math.random(i) + list[i], list[j] = list[j], list[i] + end +end + +function pseudorandom_element(_t, seed) + if seed then math.randomseed(seed) end + local keys = {} + for k, v in pairs(_t) do + keys[#keys+1] = {k = k,v = v} + end + + if keys[1] and keys[1].v and type(keys[1].v) == 'table' and keys[1].v.sort_id then + table.sort(keys, function (a, b) return a.v.sort_id < b.v.sort_id end) + else + table.sort(keys, function (a, b) return a.k < b.k end) + end + + local key = keys[math.random(#keys)].k + return _t[key], key +end + +function random_string(length, seed) + if seed then math.randomseed(seed) end + local ret = '' + for i = 1, length do + ret = ret..string.char(math.random() > 0.7 and math.random(string.byte('1'),string.byte('9')) or (math.random() > 0.45 and math.random(string.byte('A'),string.byte('N')) or math.random(string.byte('P'),string.byte('Z')))) + end + return string.upper(ret) +end + +function pseudohash(str) + if true then + local num = 1 + for i=#str, 1, -1 do + num = ((1.1239285023/num)*string.byte(str, i)*math.pi + math.pi*i)%1 + end + return num + else + str = string.sub(string.format("%-16s",str), 1, 24) + + local h = 0 + + for i=#str, 1, -1 do + h = bit.bxor(h, bit.lshift(h, 7) + bit.rshift(h, 3) + string.byte(str, i)) + end + return tonumber(string.format("%.13f",math.sqrt(math.abs(h))%1)) + end +end + +function pseudoseed(key) + if key == 'seed' then return math.random() end + + if not G.GAME.pseudorandom[key] then + G.GAME.pseudorandom[key] = pseudohash(key..(G.GAME.pseudorandom.seed or '')) + end + + G.GAME.pseudorandom[key] = math.abs(tonumber(string.format("%.13f", (2.134453429141+G.GAME.pseudorandom[key]*1.72431234)%1))) + return (G.GAME.pseudorandom[key] + (G.GAME.pseudorandom.hashed_seed or 0))/2 +end + +function pseudorandom(seed, min, max) + if type(seed) == 'string' then seed = pseudoseed(seed) end + math.randomseed(seed) + if min and max then return math.random(min, max) + else return math.random() end +end + +function tprint(tbl, indent) + if not indent then indent = 0 end + local toprint = string.rep(" ", indent) .. "{\r\n" + indent = indent + 2 + for k, v in pairs(tbl) do + toprint = toprint .. string.rep(" ", indent) + if (type(k) == "number") then + toprint = toprint .. "[" .. k .. "] = " + elseif (type(k) == "string") then + toprint = toprint .. k .. "= " + end + if (type(v) == "number") then + toprint = toprint .. v .. ",\r\n" + elseif (type(v) == "string") then + toprint = toprint .. "\"" .. v .. "\",\r\n" + elseif (type(v) == "table") then + if indent>=10 then + toprint = toprint .. tostring(v) .. ",\r\n" + else + toprint = toprint .. tostring(v) .. tprint(v, indent + 1) .. ",\r\n" + end + else + toprint = toprint .. "\"" .. tostring(v) .. "\",\r\n" + end + end + toprint = toprint .. string.rep(" ", indent-2) .. "}" + return toprint +end + +function sortingFunction(e1, e2) + return e1.order < e2.order +end + +function HEX(hex) + if #hex <= 6 then hex = hex.."FF" end + local _,_,r,g,b,a = hex:find('(%x%x)(%x%x)(%x%x)(%x%x)') + local color = {tonumber(r,16)/255,tonumber(g,16)/255,tonumber(b,16)/255,tonumber(a,16)/255 or 255} + return color +end + +function get_blind_main_colour(blind) --either in the form of the blind key for the P_BLINDS table or type + local disabled = false + blind = blind or '' + if blind == 'Boss' or blind == 'Small' or blind == 'Big' then + G.GAME.round_resets.blind_states = G.GAME.round_resets.blind_states or {} + if G.GAME.round_resets.blind_states[blind] == 'Defeated' or G.GAME.round_resets.blind_states[blind] == 'Skipped' then disabled = true end + blind = G.GAME.round_resets.blind_choices[blind] + end + return (disabled or not G.P_BLINDS[blind]) and G.C.BLACK or + G.P_BLINDS[blind].boss_colour or + (blind == 'bl_small' and mix_colours(G.C.BLUE, G.C.BLACK, 0.6) or + blind == 'bl_big' and mix_colours(G.C.ORANGE, G.C.BLACK, 0.6)) or G.C.BLACK +end + +function evaluate_poker_hand(hand) + + local results = { + ["Flush Five"] = {}, + ["Flush House"] = {}, + ["Five of a Kind"] = {}, + ["Straight Flush"] = {}, + ["Four of a Kind"] = {}, + ["Full House"] = {}, + ["Flush"] = {}, + ["Straight"] = {}, + ["Three of a Kind"] = {}, + ["Two Pair"] = {}, + ["Pair"] = {}, + ["High Card"] = {}, + top = nil + } + + if next(get_X_same(5,hand)) and next(get_flush(hand)) then + results["Flush Five"] = get_X_same(5,hand) + if not results.top then results.top = results["Flush Five"] end + end + + if next(get_X_same(3,hand)) and next(get_X_same(2,hand)) and next(get_flush(hand)) then + local fh_hand = {} + local fh_3 = get_X_same(3,hand)[1] + local fh_2 = get_X_same(2,hand)[1] + for i=1, #fh_3 do + fh_hand[#fh_hand+1] = fh_3[i] + end + for i=1, #fh_2 do + fh_hand[#fh_hand+1] = fh_2[i] + end + table.insert(results["Flush House"], fh_hand) + if not results.top then results.top = results["Flush House"] end + end + + if next(get_X_same(5,hand)) then + results["Five of a Kind"] = get_X_same(5,hand) + if not results.top then results.top = results["Five of a Kind"] end + end + + if next(get_flush(hand)) and next(get_straight(hand)) then + local _s, _f, ret = get_straight(hand), get_flush(hand), {} + for _, v in ipairs(_f[1]) do + ret[#ret+1] = v + end + for _, v in ipairs(_s[1]) do + local in_straight = nil + for _, vv in ipairs(_f[1]) do + if vv == v then in_straight = true end + end + if not in_straight then ret[#ret+1] = v end + end + + results["Straight Flush"] = {ret} + if not results.top then results.top = results["Straight Flush"] end + end + + if next(get_X_same(4,hand)) then + results["Four of a Kind"] = get_X_same(4,hand) + if not results.top then results.top = results["Four of a Kind"] end + end + + if next(get_X_same(3,hand)) and next(get_X_same(2,hand)) then + local fh_hand = {} + local fh_3 = get_X_same(3,hand)[1] + local fh_2 = get_X_same(2,hand)[1] + for i=1, #fh_3 do + fh_hand[#fh_hand+1] = fh_3[i] + end + for i=1, #fh_2 do + fh_hand[#fh_hand+1] = fh_2[i] + end + table.insert(results["Full House"], fh_hand) + if not results.top then results.top = results["Full House"] end + end + + if next(get_flush(hand)) then + results["Flush"] = get_flush(hand) + if not results.top then results.top = results["Flush"] end + end + + if next(get_straight(hand)) then + results["Straight"] = get_straight(hand) + if not results.top then results.top = results["Straight"] end + end + + if next(get_X_same(3,hand)) then + results["Three of a Kind"] = get_X_same(3,hand) + if not results.top then results.top = results["Three of a Kind"] end + end + + if #get_X_same(2,hand) == 2 then + local fh_hand = {} + local r = get_X_same(2,hand) + local fh_2a = r[1] + local fh_2b = r[2] + for i=1, #fh_2a do + fh_hand[#fh_hand+1] = fh_2a[i] + end + for i=1, #fh_2b do + fh_hand[#fh_hand+1] = fh_2b[i] + end + table.insert(results["Two Pair"], fh_hand) + if not results.top then results.top = results["Two Pair"] end + end + + if next(get_X_same(2,hand)) then + results["Pair"] = get_X_same(2,hand) + if not results.top then results.top = results["Pair"] end + end + + if next(get_highest(hand)) then + results["High Card"] = get_highest(hand) + if not results.top then results.top = results["High Card"] end + end + + if results["Five of a Kind"][1] then + results["Four of a Kind"] = {results["Five of a Kind"][1], results["Five of a Kind"][2], results["Five of a Kind"][3], results["Five of a Kind"][4]} + end + + if results["Four of a Kind"][1] then + results["Three of a Kind"] = {results["Four of a Kind"][1], results["Four of a Kind"][2], results["Four of a Kind"][3]} + end + + if results["Three of a Kind"][1] then + results["Pair"] = {results["Three of a Kind"][1], results["Three of a Kind"][2]} + end + + return results +end + +function get_flush(hand) + local ret = {} + local four_fingers = next(find_joker('Four Fingers')) + local suits = { + "Spades", + "Hearts", + "Clubs", + "Diamonds" + } + if #hand > 5 or #hand < (5 - (four_fingers and 1 or 0)) then return ret else + for j = 1, #suits do + local t = {} + local suit = suits[j] + local flush_count = 0 + for i=1, #hand do + if hand[i]:is_suit(suit, nil, true) then flush_count = flush_count + 1; t[#t+1] = hand[i] end + end + if flush_count >= (5 - (four_fingers and 1 or 0)) then + table.insert(ret, t) + return ret + end + end + return {} + end +end + +function get_straight(hand) + local ret = {} + local four_fingers = next(find_joker('Four Fingers')) + if #hand > 5 or #hand < (5 - (four_fingers and 1 or 0)) then return ret else + local t = {} + local IDS = {} + for i=1, #hand do + local id = hand[i]:get_id() + if id > 1 and id < 15 then + if IDS[id] then + IDS[id][#IDS[id]+1] = hand[i] + else + IDS[id] = {hand[i]} + end + end + end + + local straight_length = 0 + local straight = false + local can_skip = next(find_joker('Shortcut')) + local skipped_rank = false + for j = 1, 14 do + if IDS[j == 1 and 14 or j] then + straight_length = straight_length + 1 + skipped_rank = false + for k, v in ipairs(IDS[j == 1 and 14 or j]) do + t[#t+1] = v + end + elseif can_skip and not skipped_rank and j ~= 14 then + skipped_rank = true + else + straight_length = 0 + skipped_rank = false + if not straight then t = {} end + if straight then break end + end + if straight_length >= (5 - (four_fingers and 1 or 0)) then straight = true end + end + if not straight then return ret end + table.insert(ret, t) + return ret + end +end + +function get_X_same(num, hand) + local vals = {{},{},{},{},{},{},{},{},{},{},{},{},{},{}} + for i=#hand, 1, -1 do + local curr = {} + table.insert(curr, hand[i]) + for j=1, #hand do + if hand[i]:get_id() == hand[j]:get_id() and i ~= j then + table.insert(curr, hand[j]) + end + end + if #curr == num then + vals[curr[1]:get_id()] = curr + end + end + local ret = {} + for i=#vals, 1, -1 do + if next(vals[i]) then table.insert(ret, vals[i]) end + end + return ret +end + +function get_highest(hand) + local highest = nil + for k, v in ipairs(hand) do + if not highest or v:get_nominal() > highest:get_nominal() then + highest = v + end + end + if #hand > 0 then return {{highest}} else return {} end +end + +function reset_drawhash() + G.DRAW_HASH = EMPTY(G.DRAW_HASH) +end + +--The drawhash is a hash table of all drawn nodes and all nodes that may be invisible but still collide with the cursor +function add_to_drawhash(obj) + if obj then + G.DRAW_HASH[#G.DRAW_HASH+1] = obj + end +end + +function mix_colours(C1, C2, proportionC1) + return { + (C1[1] or 0.5)*proportionC1 + (C2[1] or 0.5)*(1-proportionC1), + (C1[2] or 0.5)*proportionC1 + (C2[2] or 0.5)*(1-proportionC1), + (C1[3] or 0.5)*proportionC1 + (C2[3] or 0.5)*(1-proportionC1), + (C1[4] or 1)*proportionC1 + (C2[4] or 1)*(1-proportionC1), + } +end + +function mod_chips(_chips) + if G.GAME.modifiers.chips_dollar_cap then + _chips = math.min(_chips, math.max(G.GAME.dollars, 0)) + end + return _chips +end + +function mod_mult(_mult) + return _mult +end + +function play_sound(sound_code, per, vol) + if G.F_MUTE then return end + if sound_code and not G.muted and G.SETTINGS.SOUND.volume > 0 then + G.ARGS.play_sound = G.ARGS.play_sound or {} + G.ARGS.play_sound.type = 'sound' + G.ARGS.play_sound.time = G.TIMERS.REAL + G.ARGS.play_sound.crt = G.SETTINGS.GRAPHICS.crt + G.ARGS.play_sound.sound_code = sound_code + G.ARGS.play_sound.per = per + G.ARGS.play_sound.vol = vol + G.ARGS.play_sound.pitch_mod = G.PITCH_MOD + G.ARGS.play_sound.state = G.STATE + G.ARGS.play_sound.music_control = G.SETTINGS.music_control + G.ARGS.play_sound.sound_settings = G.SETTINGS.SOUND + G.ARGS.play_sound.splash_vol = G.SPLASH_VOL + G.ARGS.play_sound.overlay_menu = not (not G.OVERLAY_MENU) + if G.F_SOUND_THREAD then + G.SOUND_MANAGER.channel:push(G.ARGS.play_sound) + else + PLAY_SOUND(G.ARGS.play_sound) + end + end +end + +function modulate_sound(dt) + --volume of the splash screen is set here + G.SPLASH_VOL = 2*dt*(G.STATE == G.STATES.SPLASH and 1 or 0) + (G.SPLASH_VOL or 1)*(1-2*dt) + + --Control the music here + local desired_track = + G.video_soundtrack or + (G.STATE == G.STATES.SPLASH and '') or + (G.booster_pack_sparkles and not G.booster_pack_sparkles.REMOVED and 'music2') or + (G.booster_pack_meteors and not G.booster_pack_meteors.REMOVED and 'music3') or + (G.booster_pack and not G.booster_pack.REMOVED and 'music2') or + (G.shop and not G.shop.REMOVED and 'music4') or + (G.GAME.blind and G.GAME.blind.boss and 'music5') or + ('music1') + + G.PITCH_MOD = (G.PITCH_MOD or 1)*(1 - dt) + dt*((not G.normal_music_speed and G.STATE == G.STATES.GAME_OVER) and 0.5 or 1) + + --For ambient sound control + G.SETTINGS.ambient_control = G.SETTINGS.ambient_control or {} + G.ARGS.score_intensity = G.ARGS.score_intensity or {} + if type(G.GAME.current_round.current_hand.chips) ~= 'number' or type(G.GAME.current_round.current_hand.mult) ~= 'number' then + G.ARGS.score_intensity.earned_score = 0 + else + G.ARGS.score_intensity.earned_score = G.GAME.current_round.current_hand.chips*G.GAME.current_round.current_hand.mult + end + G.ARGS.score_intensity.required_score = G.GAME.blind and G.GAME.blind.chips or 0 + G.ARGS.score_intensity.flames = math.min(1, (G.STAGE == G.STAGES.RUN and 1 or 0)*( + (G.ARGS.chip_flames and (G.ARGS.chip_flames.real_intensity + G.ARGS.chip_flames.change) or 0))/10) + G.ARGS.score_intensity.organ = G.video_organ or G.ARGS.score_intensity.required_score > 0 and math.max(math.min(0.4, 0.1*math.log(G.ARGS.score_intensity.earned_score/(G.ARGS.score_intensity.required_score+1), 5)),0.) or 0 + + local AC = G.SETTINGS.ambient_control + G.ARGS.ambient_sounds = G.ARGS.ambient_sounds or { + ambientFire2 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.9*((G.ARGS.score_intensity.flames > 0.3) and 1 or G.ARGS.score_intensity.flames/0.3) end}, + ambientFire1 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.8*((G.ARGS.score_intensity.flames > 0.3) and (G.ARGS.score_intensity.flames-0.3)/0.7 or 0) end}, + ambientFire3 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.4*((G.ARGS.chip_flames and G.ARGS.chip_flames.change or 0) + (G.ARGS.mult_flames and G.ARGS.mult_flames.change or 0)) end}, + ambientOrgan1 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.6*(G.SETTINGS.SOUND.music_volume + 100)/200*(G.ARGS.score_intensity.organ) end}, + } + + for k, v in pairs(G.ARGS.ambient_sounds) do + AC[k] = AC[k] or {} + AC[k].per = (k == 'ambientOrgan1') and 0.7 or (k == 'ambientFire1' and 1.1) or (k == 'ambientFire2' and 1.05) or 1 + AC[k].vol = (not G.video_organ and G.STATE == G.STATES.SPLASH) and 0 or AC[k].vol and v.volfunc(AC[k].vol) or 0 + end + + G.ARGS.push = G.ARGS.push or {} + G.ARGS.push.type = 'modulate' + G.ARGS.push.pitch_mod = G.PITCH_MOD + G.ARGS.push.state = G.STATE + G.ARGS.push.time = G.TIMERS.REAL + G.ARGS.push.dt = dt + G.ARGS.push.desired_track = desired_track + G.ARGS.push.sound_settings = G.SETTINGS.SOUND + G.ARGS.push.splash_vol = G.SPLASH_VOL + G.ARGS.push.overlay_menu = not (not G.OVERLAY_MENU) + G.ARGS.push.ambient_control = G.SETTINGS.ambient_control + + if G.F_SOUND_THREAD then + G.SOUND_MANAGER.channel:push(G.ARGS.push) + else + MODULATE(G.ARGS.push) + end +end + +function count_of_suit(area, suit) + local num = 0 + for _,c in pairs(area.cards) do + if c.base.suit == suit then + num = num +1 + end + end + return num +end + +function prep_draw(moveable, scale, rotate, offset) + love.graphics.push() + love.graphics.scale(G.TILESCALE*G.TILESIZE) + love.graphics.translate( + moveable.VT.x+moveable.VT.w/2 + (offset and offset.x or 0) + ((moveable.layered_parallax and moveable.layered_parallax.x) or ((moveable.parent and moveable.parent.layered_parallax and moveable.parent.layered_parallax.x)) or 0), + moveable.VT.y+moveable.VT.h/2 + (offset and offset.y or 0) + ((moveable.layered_parallax and moveable.layered_parallax.y) or ((moveable.parent and moveable.parent.layered_parallax and moveable.parent.layered_parallax.y)) or 0)) + if moveable.VT.r ~= 0 or moveable.juice or rotate then love.graphics.rotate(moveable.VT.r + (rotate or 0)) end + love.graphics.translate( + -scale*moveable.VT.w*(moveable.VT.scale)/2, + -scale*moveable.VT.h*(moveable.VT.scale)/2) + love.graphics.scale(moveable.VT.scale*scale) +end + +function get_chosen_triangle_from_rect(x, y, w, h, vert) + local scale = 2 + if vert then + x = x + math.min(0.6*math.sin(G.TIMERS.REAL*9)*scale+0.2, 0) + return { + x-3.5*scale, y+h/2 - 1.5*scale, + x-0.5*scale, y+h/2 + 0, + x-3.5*scale,y+h/2 + 1.5*scale + } + else + y = y + math.min(0.6*math.sin(G.TIMERS.REAL*9)*scale+0.2, 0) + return { + x+w/2 - 1.5*scale, y-4*scale, + x+w/2 + 0, y-1.1*scale, + x+w/2 + 1.5*scale, y-4*scale + } + end +end + +function point_translate(_T, delta) + _T.x = (_T.x + delta.x) or 0 + _T.y = (_T.y + delta.y) or 0 +end + +function point_rotate(_T, angle) + local _cos, _sin, _ox, _oy = math.cos(angle+math.pi/2), math.sin(angle+math.pi/2), _T.x , _T.y + _T.x = -_oy*_cos + _ox*_sin + _T.y = _oy*_sin + _ox*_cos +end + +function lighten(colour, percent, no_tab) + if no_tab then + return + colour[1]*(1-percent)+percent, + colour[2]*(1-percent)+percent, + colour[3]*(1-percent)+percent, + colour[4] + end + return { + colour[1]*(1-percent)+percent, + colour[2]*(1-percent)+percent, + colour[3]*(1-percent)+percent, + colour[4] + } +end + +function darken(colour, percent, no_tab) + if no_tab then + return + colour[1]*(1-percent), + colour[2]*(1-percent), + colour[3]*(1-percent), + colour[4] + end + return { + colour[1]*(1-percent), + colour[2]*(1-percent), + colour[3]*(1-percent), + colour[4] + } +end + +function adjust_alpha(colour, new_alpha, no_tab) + if no_tab then + return + colour[1], + colour[2], + colour[3], + new_alpha + end + return { + colour[1], + colour[2], + colour[3], + new_alpha + } +end + +function alert_no_space(card, area) + G.CONTROLLER.locks.no_space = true + attention_text({ + scale = 0.9, text = localize('k_no_space_ex'), hold = 0.9, align = 'cm', + cover = area, cover_padding = 0.1, cover_colour = adjust_alpha(G.C.BLACK, 0.7) + }) + card:juice_up(0.3, 0.2) + for i = 1, #area.cards do + area.cards[i]:juice_up(0.15) + end + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) + + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.5*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, + func = function() + G.CONTROLLER.locks.no_space = nil + return true end})) +end + +function find_joker(name, non_debuff) + local jokers = {} + if not G.jokers or not G.jokers.cards then return {} end + for k, v in pairs(G.jokers.cards) do + if v and type(v) == 'table' and v.ability.name == name and (non_debuff or not v.debuff) then + table.insert(jokers, v) + end + end + for k, v in pairs(G.consumeables.cards) do + if v and type(v) == 'table' and v.ability.name == name and (non_debuff or not v.debuff) then + table.insert(jokers, v) + end + end + return jokers +end + +function get_blind_amount(ante) + local k = 0.75 + if not G.GAME.modifiers.scaling or G.GAME.modifiers.scaling == 1 then + local amounts = { + 300, 800, 2800, 6000, 11000, 20000, 35000, 50000 + } + if ante < 1 then return 100 end + if ante <= 8 then return amounts[ante] end + local a, b, c, d = amounts[8],1.6,ante-8, 1 + 0.2*(ante-8) + local amount = math.floor(a*(b+(k*c)^d)^c) + amount = amount - amount%(10^math.floor(math.log10(amount)-1)) + return amount + elseif G.GAME.modifiers.scaling == 2 then + local amounts = { + 300, 1000, 3200, 9000, 18000, 32000, 56000, 90000 + } + if ante < 1 then return 100 end + if ante <= 8 then return amounts[ante] end + local a, b, c, d = amounts[8],1.6,ante-8, 1 + 0.2*(ante-8) + local amount = math.floor(a*(b+(k*c)^d)^c) + amount = amount - amount%(10^math.floor(math.log10(amount)-1)) + return amount + elseif G.GAME.modifiers.scaling == 3 then + local amounts = { + 300, 1200, 3600, 10000, 25000, 50000, 90000, 180000 + } + if ante < 1 then return 100 end + if ante <= 8 then return amounts[ante] end + local a, b, c, d = amounts[8],1.6,ante-8, 1 + 0.2*(ante-8) + local amount = math.floor(a*(b+(k*c)^d)^c) + amount = amount - amount%(10^math.floor(math.log10(amount)-1)) + return amount + end +end + +function number_format(num) + G.E_SWITCH_POINT = G.E_SWITCH_POINT or 100000000000 + if not num or type(num) ~= 'number' then return num or '' end + if num >= G.E_SWITCH_POINT then + local x = string.format("%.4g",num) + local fac = math.floor(math.log(tonumber(x), 10)) + return string.format("%.3f",x/(10^fac))..'e'..fac + end + return string.format(num ~= math.floor(num) and (num >= 100 and "%.0f" or num >= 10 and "%.1f" or "%.2f") or "%.0f", num):reverse():gsub("(%d%d%d)", "%1,"):gsub(",$", ""):reverse() +end + +function score_number_scale(scale, amt) + G.E_SWITCH_POINT = G.E_SWITCH_POINT or 100000000000 + if type(amt) ~= 'number' then return 0.7*(scale or 1) end + if amt >= G.E_SWITCH_POINT then + return 0.7*(scale or 1) + elseif amt >= 1000000 then + return 14*0.75/(math.floor(math.log(amt))+4)*(scale or 1) + else + return 0.75*(scale or 1) + end +end + +function copy_table(O) + local O_type = type(O) + local copy + if O_type == 'table' then + copy = {} + for k, v in next, O, nil do + copy[copy_table(k)] = copy_table(v) + end + setmetatable(copy, copy_table(getmetatable(O))) + else + copy = O + end + return copy +end + +function send_score(_score) + if G.F_HTTP_SCORES and G.SETTINGS.COMP and G.F_STREAMER_EVENT then + G.HTTP_MANAGER.out_channel:push({ + set_score = true, + score = _score, + username = G.SETTINGS.COMP.name, + uid = tostring(G.STEAM.user.getSteamID()), + version = G.VERSION + }) + end +end + +function send_name() + if G.F_HTTP_SCORES and G.SETTINGS.COMP and G.F_STREAMER_EVENT then + G.HTTP_MANAGER.out_channel:push({ + set_name = true, + username = G.SETTINGS.COMP.name, + uid = tostring(G.STEAM.user.getSteamID()), + version = G.VERSION + }) + end +end + +function check_and_set_high_score(score, amt) + if not amt or type(amt) ~= 'number' then return end + if G.GAME.round_scores[score] and math.floor(amt) > G.GAME.round_scores[score].amt then + G.GAME.round_scores[score].amt = math.floor(amt) + end + if G.GAME.seeded then return end + if score == 'hand' and G.SETTINGS.COMP and ((not G.SETTINGS.COMP.score) or (G.SETTINGS.COMP.score < math.floor(amt))) then + G.SETTINGS.COMP.score = amt + send_score(math.floor(amt)) + end + if G.PROFILES[G.SETTINGS.profile].high_scores[score] and math.floor(amt) > G.PROFILES[G.SETTINGS.profile].high_scores[score].amt then + if G.GAME.round_scores[score] then G.GAME.round_scores[score].high_score = true end + G.PROFILES[G.SETTINGS.profile].high_scores[score].amt = math.floor(amt) + G:save_settings() + end +end + +function set_joker_usage() + for k, v in pairs(G.jokers.cards) do + if v.config.center_key and v.ability.set == 'Joker' then + if G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] then + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].count = G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].count + 1 + else + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] = {count = 1, order = v.config.center.order, wins = {}, losses = {}} + end + end + end + G:save_settings() +end + +function set_joker_win() + for k, v in pairs(G.jokers.cards) do + if v.config.center_key and v.ability.set == 'Joker' then + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] = G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] or {count = 1, order = v.config.center.order, wins = {}, losses = {}} + if G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] then + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins = G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins or {} + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins[G.GAME.stake] = (G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins[G.GAME.stake] or 0) + 1 + end + end + end + G:save_settings() +end + +function get_joker_win_sticker(_center, index) + if G.PROFILES[G.SETTINGS.profile].joker_usage[_center.key] and + G.PROFILES[G.SETTINGS.profile].joker_usage[_center.key].wins then + local _w = 0 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].joker_usage[_center.key].wins) do + _w = math.max(k, _w) + end + if index then return _w end + if _w > 0 then return G.sticker_map[_w] end + end + if index then return 0 end +end + +function set_joker_loss() + for k, v in pairs(G.jokers.cards) do + if v.config.center_key and v.ability.set == 'Joker' then + if G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] then + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses = G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses or {} + G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses[G.GAME.stake] = (G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses[G.GAME.stake] or 0) + 1 + end + end + end + G:save_settings() +end + +function set_deck_usage() + if G.GAME.selected_back and G.GAME.selected_back.effect and G.GAME.selected_back.effect.center and G.GAME.selected_back.effect.center.key then + local deck_key = G.GAME.selected_back.effect.center.key + if G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then + G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].count = G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].count + 1 + else + G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] = {count = 1, order = G.GAME.selected_back.effect.center.order, wins = {}, losses = {}} + end + G:save_settings() + end +end + +function set_deck_win() + if G.GAME.selected_back and G.GAME.selected_back.effect and G.GAME.selected_back.effect.center and G.GAME.selected_back.effect.center.key then + local deck_key = G.GAME.selected_back.effect.center.key + if not G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] = {count = 1, order = G.GAME.selected_back.effect.center.order, wins = {}, losses = {}} end + if G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then + G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].wins[G.GAME.stake] = (G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].wins[G.GAME.stake] or 0) + 1 + for i = 1, G.GAME.stake do + G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].wins[i] = (G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].wins[i] or 1) + end + end + set_challenge_unlock() + G:save_settings() + end +end + +function set_challenge_unlock() + if G.PROFILES[G.SETTINGS.profile].all_unlocked then return end + if G.PROFILES[G.SETTINGS.profile].challenges_unlocked then + 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 + G.PROFILES[G.SETTINGS.profile].challenges_unlocked = math.min(_ch_tot, _ch_comp+5) + else + 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 + if deck_wins >= G.CHALLENGE_WINS and not G.PROFILES[G.SETTINGS.profile].challenges_unlocked then + G.PROFILES[G.SETTINGS.profile].challenges_unlocked = 5 + notify_alert('b_challenge', "Back") + end + end +end + +function get_deck_win_stake(_deck_key) + if not _deck_key then + local _w, _w_low = 0, nil + local deck_count = 0 + for _, deck in pairs(G.PROFILES[G.SETTINGS.profile].deck_usage) do + deck_count = deck_count + 1 + for k, v in pairs(deck.wins) do + _w = math.max(k, _w) + end + _w_low = _w_low and (math.min(_w_low, _w)) or _w + end + return _w, ((deck_count >= #G.P_CENTER_POOLS.Back) and _w_low or 0) + end + if G.PROFILES[G.SETTINGS.profile].deck_usage[_deck_key] and + G.PROFILES[G.SETTINGS.profile].deck_usage[_deck_key].wins then + local _w = 0 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].deck_usage[_deck_key].wins) do + _w = math.max(k, _w) + end + return _w + end + return 0 +end + +function get_deck_win_sticker(_center) + if G.PROFILES[G.SETTINGS.profile].deck_usage[_center.key] and + G.PROFILES[G.SETTINGS.profile].deck_usage[_center.key].wins then + local _w = -1 + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].deck_usage[_center.key].wins) do + _w = math.max(k, _w) + end + if _w > 0 then return G.sticker_map[_w] end + end +end + +function set_deck_loss() + if G.GAME.selected_back and G.GAME.selected_back.effect and G.GAME.selected_back.effect.center and G.GAME.selected_back.effect.center.key then + local deck_key = G.GAME.selected_back.effect.center.key + if not G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] = {count = 1, order = G.GAME.selected_back.effect.center.order, wins = {}, losses = {}} end + if G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then + G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].losses[G.GAME.stake] = (G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key].losses[G.GAME.stake] or 0) + 1 + end + G:save_settings() + end +end + +function set_consumeable_usage(card) + if card.config.center_key and card.ability.consumeable then + if G.PROFILES[G.SETTINGS.profile].consumeable_usage[card.config.center_key] then + G.PROFILES[G.SETTINGS.profile].consumeable_usage[card.config.center_key].count = G.PROFILES[G.SETTINGS.profile].consumeable_usage[card.config.center_key].count + 1 + else + G.PROFILES[G.SETTINGS.profile].consumeable_usage[card.config.center_key] = {count = 1, order = card.config.center.order} + end + if G.GAME.consumeable_usage[card.config.center_key] then + G.GAME.consumeable_usage[card.config.center_key].count = G.GAME.consumeable_usage[card.config.center_key].count + 1 + else + G.GAME.consumeable_usage[card.config.center_key] = {count = 1, order = card.config.center.order, set = card.ability.set} + end + G.GAME.consumeable_usage_total = G.GAME.consumeable_usage_total or {tarot = 0, planet = 0, spectral = 0, tarot_planet = 0, all = 0} + if card.config.center.set == 'Tarot' then + G.GAME.consumeable_usage_total.tarot = G.GAME.consumeable_usage_total.tarot + 1 + G.GAME.consumeable_usage_total.tarot_planet = G.GAME.consumeable_usage_total.tarot_planet + 1 + elseif card.config.center.set == 'Planet' then + G.GAME.consumeable_usage_total.planet = G.GAME.consumeable_usage_total.planet + 1 + G.GAME.consumeable_usage_total.tarot_planet = G.GAME.consumeable_usage_total.tarot_planet + 1 + elseif card.config.center.set == 'Spectral' then G.GAME.consumeable_usage_total.spectral = G.GAME.consumeable_usage_total.spectral + 1 + end + + G.GAME.consumeable_usage_total.all = G.GAME.consumeable_usage_total.all + 1 + + if not card.config.center.discovered then + discover_card(card) + end + + if card.config.center.set == 'Tarot' or card.config.center.set == 'Planet' then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.GAME.last_tarot_planet = card.config.center_key + return true + end + })) + return true + end + })) + end + + end + G:save_settings() +end + +function set_voucher_usage(card) + if card.config.center_key and card.ability.set == 'Voucher' then + if G.PROFILES[G.SETTINGS.profile].voucher_usage[card.config.center_key] then + G.PROFILES[G.SETTINGS.profile].voucher_usage[card.config.center_key].count = G.PROFILES[G.SETTINGS.profile].voucher_usage[card.config.center_key].count + 1 + else + G.PROFILES[G.SETTINGS.profile].voucher_usage[card.config.center_key] = {count = 1, order = card.config.center.order} + end + end + G:save_settings() +end + +function set_hand_usage(hand) + local hand_label = hand + hand = hand:gsub("%s+", "") + if G.PROFILES[G.SETTINGS.profile].hand_usage[hand] then + G.PROFILES[G.SETTINGS.profile].hand_usage[hand].count = G.PROFILES[G.SETTINGS.profile].hand_usage[hand].count + 1 + else + G.PROFILES[G.SETTINGS.profile].hand_usage[hand] = {count = 1, order = hand_label} + end + if G.GAME.hand_usage[hand] then + G.GAME.hand_usage[hand].count = G.GAME.hand_usage[hand].count + 1 + else + G.GAME.hand_usage[hand] = {count = 1, order = hand_label} + end + G:save_settings() +end + +function set_profile_progress() + G.PROGRESS = G.PROGRESS or { + joker_stickers = {tally = 0, of = 0}, + deck_stakes = {tally = 0, of = 0}, + challenges = {tally = 0, of = 0}, + } + for _, v in pairs(G.PROGRESS) do + if type(v) == 'table' then + v.tally = 0 + v.of = 0 + end + end + + for _, v in pairs(G.P_CENTERS) do + if v.set == 'Back' and not v.omit then + G.PROGRESS.deck_stakes.of = G.PROGRESS.deck_stakes.of + #G.P_CENTER_POOLS.Stake + G.PROGRESS.deck_stakes.tally = G.PROGRESS.deck_stakes.tally + get_deck_win_stake(v.key) + end + if v.set == 'Joker' then + G.PROGRESS.joker_stickers.of = G.PROGRESS.joker_stickers.of + #G.P_CENTER_POOLS.Stake + G.PROGRESS.joker_stickers.tally = G.PROGRESS.joker_stickers.tally + get_joker_win_sticker(v, true) + end + end + + for _, v in pairs(G.CHALLENGES) do + G.PROGRESS.challenges.of = G.PROGRESS.challenges.of + 1 + if G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id] then + G.PROGRESS.challenges.tally = G.PROGRESS.challenges.tally + 1 + end + end + + G.PROFILES[G.SETTINGS.profile].progress.joker_stickers = copy_table(G.PROGRESS.joker_stickers) + G.PROFILES[G.SETTINGS.profile].progress.deck_stakes = copy_table(G.PROGRESS.deck_stakes) + G.PROFILES[G.SETTINGS.profile].progress.challenges = copy_table(G.PROGRESS.challenges) +end + +function set_discover_tallies() + G.DISCOVER_TALLIES = G.DISCOVER_TALLIES or { + blinds = {tally = 0, of = 0}, + tags = {tally = 0, of = 0}, + jokers = {tally = 0, of = 0}, + consumeables = {tally = 0, of = 0}, + tarots = {tally = 0, of = 0}, + planets = {tally = 0, of = 0}, + spectrals = {tally = 0, of = 0}, + vouchers = {tally = 0, of = 0}, + boosters = {tally = 0, of = 0}, + editions = {tally = 0, of = 0}, + backs = {tally = 0, of = 0}, + total = {tally = 0, of = 0}, + } + for _, v in pairs(G.DISCOVER_TALLIES) do + v.tally = 0 + v.of = 0 + end + + for _, v in pairs(G.P_CENTERS) do + if not v.omit then + if v.set and ((v.set == 'Joker') or v.consumeable or (v.set == 'Edition') or (v.set == 'Voucher') or (v.set == 'Back') or (v.set == 'Booster')) then + G.DISCOVER_TALLIES.total.of = G.DISCOVER_TALLIES.total.of+1 + if v.discovered then + G.DISCOVER_TALLIES.total.tally = G.DISCOVER_TALLIES.total.tally+1 + end + end + if v.set and v.set == 'Joker' then + G.DISCOVER_TALLIES.jokers.of = G.DISCOVER_TALLIES.jokers.of+1 + if v.discovered then + G.DISCOVER_TALLIES.jokers.tally = G.DISCOVER_TALLIES.jokers.tally+1 + end + end + if v.set and v.set == 'Back' then + G.DISCOVER_TALLIES.backs.of = G.DISCOVER_TALLIES.backs.of+1 + if v.unlocked then + G.DISCOVER_TALLIES.backs.tally = G.DISCOVER_TALLIES.backs.tally+1 + end + end + if v.set and v.consumeable then + G.DISCOVER_TALLIES.consumeables.of = G.DISCOVER_TALLIES.consumeables.of+1 + if v.discovered then + G.DISCOVER_TALLIES.consumeables.tally = G.DISCOVER_TALLIES.consumeables.tally+1 + end + if v.set == 'Planet' then + G.DISCOVER_TALLIES.planets.of = G.DISCOVER_TALLIES.planets.of+1 + if v.discovered then + G.DISCOVER_TALLIES.planets.tally = G.DISCOVER_TALLIES.planets.tally+1 + end + elseif v.set == 'Spectral' then + G.DISCOVER_TALLIES.spectrals.of = G.DISCOVER_TALLIES.spectrals.of+1 + if v.discovered then + G.DISCOVER_TALLIES.spectrals.tally = G.DISCOVER_TALLIES.spectrals.tally+1 + end + elseif v.set == 'Tarot' then + G.DISCOVER_TALLIES.tarots.of = G.DISCOVER_TALLIES.tarots.of+1 + if v.discovered then + G.DISCOVER_TALLIES.tarots.tally = G.DISCOVER_TALLIES.tarots.tally+1 + end + end + end + if v.set and v.set == 'Voucher' then + G.DISCOVER_TALLIES.vouchers.of = G.DISCOVER_TALLIES.vouchers.of+1 + if v.discovered then + G.DISCOVER_TALLIES.vouchers.tally = G.DISCOVER_TALLIES.vouchers.tally+1 + end + end + if v.set and v.set == 'Booster' then + G.DISCOVER_TALLIES.boosters.of = G.DISCOVER_TALLIES.boosters.of+1 + if v.discovered then + G.DISCOVER_TALLIES.boosters.tally = G.DISCOVER_TALLIES.boosters.tally+1 + end + end + if v.set and v.set == 'Edition' then + G.DISCOVER_TALLIES.editions.of = G.DISCOVER_TALLIES.editions.of+1 + if v.discovered then + G.DISCOVER_TALLIES.editions.tally = G.DISCOVER_TALLIES.editions.tally+1 + end + end + end + end + for _, v in pairs(G.P_BLINDS) do + G.DISCOVER_TALLIES.total.of = G.DISCOVER_TALLIES.total.of+1 + G.DISCOVER_TALLIES.blinds.of = G.DISCOVER_TALLIES.blinds.of+1 + if v.discovered then + G.DISCOVER_TALLIES.blinds.tally = G.DISCOVER_TALLIES.blinds.tally+1 + G.DISCOVER_TALLIES.total.tally = G.DISCOVER_TALLIES.total.tally+1 + end + end + for _, v in pairs(G.P_TAGS) do + G.DISCOVER_TALLIES.total.of = G.DISCOVER_TALLIES.total.of+1 + G.DISCOVER_TALLIES.tags.of = G.DISCOVER_TALLIES.tags.of+1 + if v.discovered then + G.DISCOVER_TALLIES.tags.tally = G.DISCOVER_TALLIES.tags.tally+1 + G.DISCOVER_TALLIES.total.tally = G.DISCOVER_TALLIES.total.tally+1 + end + end + G.PROFILES[G.SETTINGS.profile].high_scores.collection.amt = G.DISCOVER_TALLIES.total.tally + G.PROFILES[G.SETTINGS.profile].high_scores.collection.tot = G.DISCOVER_TALLIES.total.of + G.PROFILES[G.SETTINGS.profile].progress.discovered = copy_table(G.DISCOVER_TALLIES.total) + + if check_for_unlock then check_for_unlock({type = 'discover_amount', + amount = G.DISCOVER_TALLIES.total.tally, + planet_count = G.DISCOVER_TALLIES.planets.tally, + tarot_count = G.DISCOVER_TALLIES.tarots.tally}) + end +end + +function stop_use() + G.GAME.STOP_USE = (G.GAME.STOP_USE or 0) + 1 + dec_stop_use(6) +end + +function dec_stop_use(_depth) + if _depth > 0 then + G.E_MANAGER:add_event(Event({ + blocking = false, + no_delete = true, + func = (function() + dec_stop_use(_depth - 1) + return true end)})) + else + G.E_MANAGER:add_event(Event({ + blocking = false, + no_delete = true, + func = (function() + G.GAME.STOP_USE = math.max(G.GAME.STOP_USE - 1, 0) + return true end)})) + end +end + +function inc_career_stat(stat, mod) + if G.GAME.seeded or G.GAME.challenge then return end + if not G.PROFILES[G.SETTINGS.profile].career_stats[stat] then G.PROFILES[G.SETTINGS.profile].career_stats[stat] = 0 end + G.PROFILES[G.SETTINGS.profile].career_stats[stat] = G.PROFILES[G.SETTINGS.profile].career_stats[stat] + (mod or 0) + G:save_settings() +end + +function recursive_table_cull(t) + local ret_t = {} + for k, v in pairs(t) do + if type(v) == 'table' then + if v.is and v:is(Object) then ret_t[k] = [["]].."MANUAL_REPLACE"..[["]] + else ret_t[k] = recursive_table_cull(v) + end + else ret_t[k] = v end + end + return ret_t +end + +function save_with_action(action) + print('SAVE WITH ACTION') + G.action = action + save_run() + G.action = nil +end + +function save_run() + if G.F_NO_SAVING == true then return end + local cardAreas = {} + for k, v in pairs(G) do + if (type(v) == "table") and v.is and v:is(CardArea) then + local cardAreaSer = v:save() + if cardAreaSer then cardAreas[k] = cardAreaSer end + end + end + + local tags = {} + for k, v in ipairs(G.GAME.tags) do + if (type(v) == "table") and v.is and v:is(Tag) then + local tagSer = v:save() + if tagSer then tags[k] = tagSer end + end + end + + G.culled_table = recursive_table_cull{ + cardAreas = cardAreas, + tags = tags, + GAME = G.GAME, + STATE = G.STATE, + ACTION = G.action or nil, + BLIND = G.GAME.blind:save(), + BACK = G.GAME.selected_back:save(), + VERSION = G.VERSION + } + G.ARGS.save_run = G.culled_table + + G.FILE_HANDLER = G.FILE_HANDLER or {} + G.FILE_HANDLER.run = true + G.FILE_HANDLER.update_queued = true +end + +function remove_save() + love.filesystem.remove(G.SETTINGS.profile..'/save.jkr') + G.SAVED_GAME = nil + G.FILE_HANDLER.run = nil +end + +function loc_colour(_c, _default) + G.ARGS.LOC_COLOURS = G.ARGS.LOC_COLOURS or { + red = G.C.RED, + mult = G.C.MULT, + blue = G.C.BLUE, + chips = G.C.CHIPS, + green = G.C.GREEN, + money = G.C.MONEY, + gold = G.C.GOLD, + attention = G.C.FILTER, + purple = G.C.PURPLE, + white = G.C.WHITE, + inactive = G.C.UI.TEXT_INACTIVE, + spades = G.C.SUITS.Spades, + hearts = G.C.SUITS.Hearts, + clubs = G.C.SUITS.Clubs, + diamonds = G.C.SUITS.Diamonds, + tarot = G.C.SECONDARY_SET.Tarot, + planet = G.C.SECONDARY_SET.Planet, + spectral = G.C.SECONDARY_SET.Spectral, + edition = G.C.EDITION, + dark_edition = G.C.DARK_EDITION, + legendary = G.C.RARITY[4], + enhanced = G.C.SECONDARY_SET.Enhanced + } + return G.ARGS.LOC_COLOURS[_c] or _default or G.C.UI.TEXT_DARK +end + +function init_localization() + G.localization.misc.v_dictionary_parsed = {} + for k, v in pairs(G.localization.misc.v_dictionary) do + if type(v) == 'table' then + G.localization.misc.v_dictionary_parsed[k] = {multi_line = true} + for kk, vv in ipairs(v) do + G.localization.misc.v_dictionary_parsed[k][kk] = loc_parse_string(vv) + end + else + G.localization.misc.v_dictionary_parsed[k] = loc_parse_string(v) + end + end + G.localization.misc.v_text_parsed = {} + for k, v in pairs(G.localization.misc.v_text) do + G.localization.misc.v_text_parsed[k] = {} + for kk, vv in ipairs(v) do + G.localization.misc.v_text_parsed[k][kk] = loc_parse_string(vv) + end + end + G.localization.tutorial_parsed = {} + for k, v in pairs(G.localization.misc.tutorial) do + G.localization.tutorial_parsed[k] = {multi_line = true} + for kk, vv in ipairs(v) do + G.localization.tutorial_parsed[k][kk] = loc_parse_string(vv) + end + end + G.localization.quips_parsed = {} + for k, v in pairs(G.localization.misc.quips or {}) do + G.localization.quips_parsed[k] = {multi_line = true} + for kk, vv in ipairs(v) do + G.localization.quips_parsed[k][kk] = loc_parse_string(vv) + end + end + for g_k, group in pairs(G.localization) do + if g_k == 'descriptions' then + for _, set in pairs(group) do + for _, center in pairs(set) do + center.text_parsed = {} + for _, line in ipairs(center.text) do + center.text_parsed[#center.text_parsed+1] = loc_parse_string(line) + end + center.name_parsed = {} + for _, line in ipairs(type(center.name) == 'table' and center.name or {center.name}) do + center.name_parsed[#center.name_parsed+1] = loc_parse_string(line) + end + if center.unlock then + center.unlock_parsed = {} + for _, line in ipairs(center.unlock) do + center.unlock_parsed[#center.unlock_parsed+1] = loc_parse_string(line) + end + end + end + end + end + end +end + +function playing_card_joker_effects(cards) + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({playing_card_added = true, cards = cards}) + end +end + +function convert_save_to_meta() + if love.filesystem.getInfo(G.SETTINGS.profile..'/'..'unlocked_jokers.jkr') then + local _meta = { + unlocked = {}, + alerted = {}, + discovered = {} + } + if love.filesystem.getInfo(G.SETTINGS.profile..'/'..'unlocked_jokers.jkr') then + for line in string.gmatch( (get_compressed(G.SETTINGS.profile..'/'..'unlocked_jokers.jkr') or '').. "\n", "([^\n]*)\n") do + local key = line:gsub("%s+", "") + if key and (key ~= '') then + _meta.unlocked[key] = true + end + end + end + if love.filesystem.getInfo(G.SETTINGS.profile..'/'..'discovered_jokers.jkr') then + for line in string.gmatch( (get_compressed(G.SETTINGS.profile..'/'..'discovered_jokers.jkr') or '').. "\n", "([^\n]*)\n") do + local key = line:gsub("%s+", "") + if key and (key ~= '') then + _meta.discovered[key] = true + end + end + end + if love.filesystem.getInfo(G.SETTINGS.profile..'/'..'alerted_jokers.jkr') then + for line in string.gmatch( (get_compressed(G.SETTINGS.profile..'/'..'alerted_jokers.jkr') or '').. "\n", "([^\n]*)\n") do + local key = line:gsub("%s+", "") + if key and (key ~= '') then + _meta.alerted[key] = true + end + end + end + love.filesystem.remove(G.SETTINGS.profile..'/'..'unlocked_jokers.jkr') + love.filesystem.remove(G.SETTINGS.profile..'/'..'discovered_jokers.jkr') + love.filesystem.remove(G.SETTINGS.profile..'/'..'alerted_jokers.jkr') + + compress_and_save( G.SETTINGS.profile..'/'..'meta.jkr', STR_PACK(_meta)) + end +end + +function card_from_control(control) + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local _card = Card(G.deck.T.x, G.deck.T.y, G.CARD_W, G.CARD_H, G.P_CARDS[control.s..'_'..control.r], G.P_CENTERS[control.e or 'c_base'], {playing_card = G.playing_card}) + if control.d then _card:set_edition({[control.d] = true}, true, true) end + if control.g then _card:set_seal(control.g, true, true) end + G.deck:emplace(_card) + table.insert(G.playing_cards, _card) +end + +function loc_parse_string(line) + local parsed_line = {} + local control = {} + local _c, _c_name, _c_val, _c_gather = nil, nil, nil, nil + local _s_gather, _s_ref = nil, nil + local str_parts, str_it = {}, 1 + for i = 1, #line do + local char = line:sub(i,i) + if char == '{' then --Start of a control section, extract all controls + if str_parts[1] then parsed_line[#parsed_line+1] = {strings = str_parts, control = control or {}} end + str_parts, str_it = {}, 1 + control, _c, _c_name, _c_val, _c_gather = {}, nil, nil, nil, nil + _s_gather, _s_ref = nil, nil + _c = true + elseif _c and not (char == ':' or char == '}') and not _c_gather then _c_name = (_c_name or '')..char + elseif _c and char == ':' then _c_gather = true + elseif _c and not (char == ',' or char == '}') and _c_gather then _c_val = (_c_val or '')..char + elseif _c and (char == ',' or char == '}') then _c_gather = nil; if _c_name then control[_c_name] = _c_val end; _c_name = nil; _c_val = nil; if char == '}' then _c = nil end + + elseif not _c and char ~= '#' and not _s_gather then str_parts[str_it] = (str_parts[str_it] or '')..(control['X'] and char:gsub("%s+", "") or char) + elseif not _c and char == '#' and not _s_gather then _s_gather = true; if str_parts[str_it] then str_it = str_it + 1 end + elseif not _c and char == '#' and _s_gather then _s_gather = nil; if _s_ref then str_parts[str_it] = {_s_ref}; str_it = str_it + 1; _s_ref = nil end + elseif not _c and _s_gather then _s_ref = (_s_ref or '')..char + end + if i == #line then + if str_parts[1] then parsed_line[#parsed_line+1] = {strings = str_parts, control = control or {}} end + return parsed_line + end + end +end + +--UTF8 handler for special characters, from https://github.com/blitmap/lua-utf8-simple +utf8 = {pattern = '[%z\1-\127\194-\244][\128-\191]*'} +utf8.map = + function (s, f, no_subs) + local i = 0 + + if no_subs then + for b, e in s:gmatch('()' .. utf8.pattern .. '()') do + i = i + 1 + local c = e - b + f(i, c, b) + end + else + for b, c in s:gmatch('()(' .. utf8.pattern .. ')') do + i = i + 1 + f(i, c, b) + end + end + end +utf8.chars = + function (s, no_subs) + return coroutine.wrap(function () return utf8.map(s, coroutine.yield, no_subs) end) + end + +function localize(args, misc_cat) + if args and not (type(args) == 'table') then + if misc_cat and G.localization.misc[misc_cat] then return G.localization.misc[misc_cat][args] or 'ERROR' end + return G.localization.misc.dictionary[args] or 'ERROR' + end + + local loc_target = nil + local ret_string = nil + if args.type == 'other' then + loc_target = G.localization.descriptions.Other[args.key] + elseif args.type == 'descriptions' or args.type == 'unlocks' then + loc_target = G.localization.descriptions[args.set][args.key] + elseif args.type == 'tutorial' then + loc_target = G.localization.tutorial_parsed[args.key] + elseif args.type == 'quips' then + loc_target = G.localization.quips_parsed[args.key] + elseif args.type == 'raw_descriptions' then + loc_target = G.localization.descriptions[args.set][args.key] + local multi_line = {} + if loc_target then + for _, lines in ipairs(args.type == 'unlocks' and loc_target.unlock_parsed or args.type == 'name' and loc_target.name_parsed or args.type == 'text' and loc_target or loc_target.text_parsed) do + local final_line = '' + for _, part in ipairs(lines) do + local assembled_string = '' + for _, subpart in ipairs(part.strings) do + assembled_string = assembled_string..(type(subpart) == 'string' and subpart or args.vars[tonumber(subpart[1])] or 'ERROR') + end + final_line = final_line..assembled_string + end + multi_line[#multi_line+1] = final_line + end + end + return multi_line + elseif args.type == 'text' then + loc_target = G.localization.misc.v_text_parsed[args.key] + elseif args.type == 'variable' then + loc_target = G.localization.misc.v_dictionary_parsed[args.key] + if not loc_target then return 'ERROR' end + if loc_target.multi_line then + local assembled_strings = {} + for k, v in ipairs(loc_target) do + local assembled_string = '' + for _, subpart in ipairs(v[1].strings) do + assembled_string = assembled_string..(type(subpart) == 'string' and subpart or args.vars[tonumber(subpart[1])]) + end + assembled_strings[k] = assembled_string + end + return assembled_strings or {'ERROR'} + else + local assembled_string = '' + for _, subpart in ipairs(loc_target[1].strings) do + assembled_string = assembled_string..(type(subpart) == 'string' and subpart or args.vars[tonumber(subpart[1])]) + end + ret_string = assembled_string or 'ERROR' + end + elseif args.type == 'name_text' then + if pcall(function() ret_string = G.localization.descriptions[(args.set or args.node.config.center.set)][args.key or args.node.config.center.key].name end) then + else ret_string = "ERROR" end + elseif args.type == 'name' then + loc_target = G.localization.descriptions[(args.set or args.node.config.center.set)][args.key or args.node.config.center.key] + end + + if ret_string then return ret_string end + + if loc_target then + for _, lines in ipairs(args.type == 'unlocks' and loc_target.unlock_parsed or args.type == 'name' and loc_target.name_parsed or (args.type == 'text' or args.type == 'tutorial' or args.type == 'quips') and loc_target or loc_target.text_parsed) do + local final_line = {} + for _, part in ipairs(lines) do + local assembled_string = '' + for _, subpart in ipairs(part.strings) do + assembled_string = assembled_string..(type(subpart) == 'string' and subpart or args.vars[tonumber(subpart[1])] or 'ERROR') + end + local desc_scale = G.LANG.font.DESCSCALE + if args.type == 'name' then + final_line[#final_line+1] = {n=G.UIT.O, config={ + object = DynaText({string = {assembled_string}, + colours = {(part.control.V and args.vars.colours[tonumber(part.control.V)]) or (part.control.C and loc_colour(part.control.C)) or G.C.UI.TEXT_LIGHT}, + bump = true, + silent = true, + pop_in = 0, + pop_in_rate = 4, + maxw = 5, + shadow = true, + y_offset = -0.6, + spacing = math.max(0, 0.32*(17 - #assembled_string)), + scale = (0.55 - 0.004*#assembled_string)*(part.control.s and tonumber(part.control.s) or 1)*desc_scale + }) + }} + elseif part.control.E then + local _float, _silent, _pop_in, _bump, _spacing = nil, true, nil, nil, nil + if part.control.E == '1' then + _float = true; _silent = true; _pop_in = 0 + elseif part.control.E == '2' then + _bump = true; _spacing = 1 + end + final_line[#final_line+1] = {n=G.UIT.O, config={ + object = DynaText({string = {assembled_string}, colours = {part.control.V and args.vars.colours[tonumber(part.control.V)] or loc_colour(part.control.C or nil)}, + float = _float, + silent = _silent, + pop_in = _pop_in, + bump = _bump, + spacing = _spacing, + scale = 0.32*(part.control.s and tonumber(part.control.s) or 1)*desc_scale}) + }} + elseif part.control.X then + final_line[#final_line+1] = {n=G.UIT.C, config={align = "m", colour = loc_colour(part.control.X), r = 0.05, padding = 0.03, res = 0.15}, nodes={ + {n=G.UIT.T, config={ + text = assembled_string, + colour = loc_colour(part.control.C or nil), + scale = 0.32*(part.control.s and tonumber(part.control.s) or 1)*desc_scale}}, + }} + else + final_line[#final_line+1] = {n=G.UIT.T, config={ + detailed_tooltip = part.control.T and (G.P_CENTERS[part.control.T] or G.P_TAGS[part.control.T]) or nil, + text = assembled_string, + shadow = args.shadow, + colour = part.control.V and args.vars.colours[tonumber(part.control.V)] or loc_colour(part.control.C or nil, args.default_col), + scale = 0.32*(part.control.s and tonumber(part.control.s) or 1)*desc_scale},} + end + end + if args.type == 'name' or args.type == 'text' then return final_line end + args.nodes[#args.nodes+1] = final_line + end + end +end + +function get_stake_sprite(_stake, _scale) + _stake = _stake or 1 + _scale = _scale or 1 + local stake_sprite = Sprite(0,0,_scale*1,_scale*1,G.ASSET_ATLAS["chips"], G.P_CENTER_POOLS.Stake[_stake].pos) + stake_sprite.states.drag.can = false + if _stake == 8 then + stake_sprite.draw = function(_sprite) + _sprite.ARGS.send_to_shader = _sprite.ARGS.send_to_shader or {} + _sprite.ARGS.send_to_shader[1] = math.min(_sprite.VT.r*3, 1) + G.TIMERS.REAL/(18) + (_sprite.juice and _sprite.juice.r*20 or 0) + 1 + _sprite.ARGS.send_to_shader[2] = G.TIMERS.REAL + + Sprite.draw_shader(_sprite, 'dissolve') + Sprite.draw_shader(_sprite, 'voucher', nil, _sprite.ARGS.send_to_shader) + end + end + return stake_sprite +end + +function get_stake_col(_stake) + G.C.STAKES = G.C.STAKES or { + G.C.WHITE, + G.C.RED, + G.C.GREEN, + G.C.BLACK, + G.C.BLUE, + G.C.PURPLE, + G.C.ORANGE, + G.C.GOLD + } + return G.C.STAKES[_stake] +end + +function get_challenge_int_from_id(_id) + for k, v in pairs(G.CHALLENGES) do + if v.id == _id then return k end + end + return 0 +end + +function get_starting_params() +return { + dollars = 4, + hand_size = 8, + discards = 3, + hands = 4, + reroll_cost = 5, + joker_slots = 5, + ante_scaling = 1, + consumable_slots = 2, + no_faces = false, + erratic_suits_and_ranks = false, + } +end + +function get_challenge_rule(_challenge, _type, _id) + if _challenge and _challenge.rules and _challenge.rules[_type] then + for k, v in ipairs(_challenge.rules[_type]) do + if _id == v.id then return v.value end + end + end +end + +--SOUND +function PLAY_SOUND(args) + args.per = args.per or 1 + args.vol = args.vol or 1 + SOURCES[args.sound_code] = SOURCES[args.sound_code] or {} + + local should_stream = (string.find(args.sound_code,'music') or string.find(args.sound_code,'ambient')) + local s = {sound = love.audio.newSource("resources/sounds/"..args.sound_code..'.ogg', should_stream and "stream" or 'static')} + table.insert(SOURCES[args.sound_code], s) + s.sound_code = args.sound_code + s.original_pitch = args.per or 1 + s.original_volume = args.vol or 1 + s.created_on_pause = (args.overlay_menu and true or false) + s.created_on_state = args.state + s.sfx_handled = 0 + s.transition_timer = 0 + SET_SFX(s, args) + love.audio.play(s.sound) + return s +end + +function STOP_AUDIO() + for _, source in pairs(SOURCES) do + for _, s in pairs(source) do + if s.sound:isPlaying() then + s.sound:stop() + end + end + end +end + +function SET_SFX(s, args) + if string.find(s.sound_code,'music') then + if s.sound_code == args.desired_track then + s.current_volume = s.current_volume or 1 + s.current_volume = 1*(args.dt*3) + (1-(args.dt*3))*s.current_volume + else + s.current_volume = s.current_volume or 0 + s.current_volume = 0*(args.dt*3) + (1-(args.dt*3))*s.current_volume + end + s.sound:setVolume(s.current_volume*s.original_volume*(args.sound_settings.volume/100.0)*(args.sound_settings.music_volume/100.0)) + s.sound:setPitch(s.original_pitch*args.pitch_mod) + else + if s.temp_pitch ~= s.original_pitch then + s.sound:setPitch(s.original_pitch) + s.temp_pitch = s.original_pitch + end + local sound_vol = s.original_volume*(args.sound_settings.volume/100.0)*(args.sound_settings.game_sounds_volume/100.0) + if s.created_on_state == 13 then sound_vol = sound_vol*args.splash_vol end + if sound_vol <= 0 then + s.sound:stop() + else + s.sound:setVolume(sound_vol) + end + end +end + +function MODULATE(args) + for k, v in pairs(SOURCES) do + if (string.find(k,'music') and (args.desired_track ~= '')) then + if v[1] and v[1].sound and v[1].sound:isPlaying() then + else + RESTART_MUSIC(args) + break; + end + end + end + + for k, v in pairs(SOURCES) do + local i=1 + while i <= #v do + if not v[i].sound:isPlaying() then + table.remove(v, i) + else + i = i + 1 + end + end + + for i, s in ipairs(v) do + if s.sound and s.sound:isPlaying() and s.original_volume then + SET_SFX(s, args) + end + end + end +end + +function RESTART_MUSIC(args) + for k, v in pairs(SOURCES) do + if string.find(k,'music') then + for i, s in ipairs(v) do + s.sound:stop() + end + SOURCES[k] = {} + args.per = 0.7 + args.vol = 0.6 + args.sound_code = k + local s = PLAY_SOUND(args) + s.initialized = true + end + end +end + +function AMBIENT(args) + for k, v in pairs(SOURCES) do + if args.ambient_control[k] then + local start_ambient = args.ambient_control[k].vol > 0 + + for i, s in ipairs(v) do + if s.sound and s.sound:isPlaying() and s.original_volume then + s.original_volume = args.ambient_control[k].vol + SET_SFX(s, args) + start_ambient = false + end + end + + if start_ambient then + args.sound_code = k + args.vol = args.ambient_control[k].vol + args.per = args.ambient_control[k].per + PLAY_SOUND(args) + end + end + end +end + +function RESET_STATES(state) + for k, v in pairs(SOURCES) do + for i, s in ipairs(v) do + s.created_on_state = state + end + end +end diff --git a/functions/state_events.lua b/functions/state_events.lua new file mode 100644 index 0000000..5790813 --- /dev/null +++ b/functions/state_events.lua @@ -0,0 +1,1635 @@ +function win_game() + if not G.GAME.seeded and not G.GAME.challenge then + set_joker_win() + set_deck_win() + + check_and_set_high_score('win_streak', G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt+1) + check_and_set_high_score('current_streak', G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt+1) + check_for_unlock({type = 'win_no_hand'}) + check_for_unlock({type = 'win_no'}) + check_for_unlock({type = 'win_custom'}) + check_for_unlock({type = 'win_deck'}) + check_for_unlock({type = 'win_stake'}) + check_for_unlock({type = 'win'}) + inc_career_stat('c_wins', 1) + end + + set_profile_progress() + + if G.GAME.challenge then + G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[G.GAME.challenge] = true + set_challenge_unlock() + check_for_unlock({type = 'win_challenge'}) + G:save_settings() + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + play_sound('win') + G.SETTINGS.paused = true + + G.FUNCS.overlay_menu{ + definition = create_UIBox_win(), + config = {no_esc = true} + } + local Jimbo = nil + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 2.5, + blocking = false, + func = (function() + if G.OVERLAY_MENU and G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') then + Jimbo = Card_Character({x = 0, y = 5}) + local spot = G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') + spot.config.object:remove() + spot.config.object = Jimbo + Jimbo.ui_object_updated = true + Jimbo:add_speech_bubble('wq_'..math.random(1,7), nil, {quip = true}) + Jimbo:say_stuff(5) + if G.F_JAN_CTA then + G.E_MANAGER:add_event(Event({ + func = function() + Jimbo:add_button(localize('b_wishlist'), 'wishlist_steam', G.C.DARK_EDITION, nil, true, 1.6) + return true + end})) + end + end + return true + end) + })) + + return true + end) + })) + + if not G.GAME.seeded and not G.GAME.challenge then + G.PROFILES[G.SETTINGS.profile].stake = math.max(G.PROFILES[G.SETTINGS.profile].stake or 1, (G.GAME.stake or 1)+1) + end + G:save_progress() + G.FILE_HANDLER.force = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + if not G.SETTINGS.paused then + G.GAME.current_round.round_text = 'Endless Round ' + return true + end + end) + })) +end + +function end_round() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.2, + func = function() + local game_over = true + local game_won = false + G.RESET_BLIND_STATES = true + G.RESET_JIGGLES = true + if G.GAME.chips - G.GAME.blind.chips >= 0 then + game_over = false + end + for i = 1, #G.jokers.cards do + local eval = nil + eval = G.jokers.cards[i]:calculate_joker({end_of_round = true, game_over = game_over}) + if eval then + if eval.saved then + game_over = false + end + card_eval_status_text(G.jokers.cards[i], 'jokers', nil, nil, nil, eval) + end + end + if G.GAME.round_resets.ante == G.GAME.win_ante and G.GAME.blind:get_type() == 'Boss' then + game_won = true + G.GAME.won = true + end + if game_over then + G.STATE = G.STATES.GAME_OVER + if not G.GAME.won and not G.GAME.seeded and not G.GAME.challenge then + G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt = 0 + end + G:save_settings() + G.FILE_HANDLER.force = true + G.STATE_COMPLETE = false + else + G.GAME.unused_discards = (G.GAME.unused_discards or 0) + G.GAME.current_round.discards_left + if G.GAME.blind and G.GAME.blind.config.blind then + discover_card(G.GAME.blind.config.blind) + end + + if G.GAME.blind:get_type() == 'Boss' then + local _handname, _played, _order = 'High Card', -1, 100 + for k, v in pairs(G.GAME.hands) do + if v.played > _played or (v.played == _played and _order > v.order) then + _played = v.played + _handname = k + end + end + G.GAME.current_round.most_played_poker_hand = _handname + end + + if G.GAME.blind:get_type() == 'Boss' and not G.GAME.seeded and not G.GAME.challenge then + G.GAME.current_boss_streak = G.GAME.current_boss_streak + 1 + check_and_set_high_score('boss_streak', G.GAME.current_boss_streak) + end + + if G.GAME.current_round.hands_played == 1 then + inc_career_stat('c_single_hand_round_streak', 1) + else + if not G.GAME.seeded and not G.GAME.challenge then + G.PROFILES[G.SETTINGS.profile].career_stats.c_single_hand_round_streak = 0 + G:save_settings() + end + end + + check_for_unlock({type = 'round_win'}) + set_joker_usage() + if game_won and not G.GAME.win_notified then + G.GAME.win_notified = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + blocking = false, + blockable = false, + func = (function() + if G.STATE == G.STATES.ROUND_EVAL then + win_game() + G.GAME.won = true + return true + end + end) + })) + end + for i=1, #G.hand.cards do + --Check for hand doubling + local reps = {1} + local j = 1 + while j <= #reps do + local percent = (i-0.999)/(#G.hand.cards-0.998) + (j-1)*0.1 + if reps[j] ~= 1 then card_eval_status_text((reps[j].jokers or reps[j].seals).card, 'jokers', nil, nil, nil, (reps[j].jokers or reps[j].seals)) end + + --calculate the hand effects + local effects = {G.hand.cards[i]:get_end_of_round_effect()} + for k=1, #G.jokers.cards do + --calculate the joker individual card effects + local eval = G.jokers.cards[k]:calculate_joker({cardarea = G.hand, other_card = G.hand.cards[i], individual = true, end_of_round = true}) + if eval then + table.insert(effects, eval) + end + end + + if reps[j] == 1 then + --Check for hand doubling + --From Red seal + local eval = eval_card(G.hand.cards[i], {end_of_round = true,cardarea = G.hand, repetition = true, repetition_only = true}) + if next(eval) and (next(effects[1]) or #effects > 1) then + for h = 1, eval.seals.repetitions do + reps[#reps+1] = eval + end + end + + --from Jokers + for j=1, #G.jokers.cards do + --calculate the joker effects + local eval = eval_card(G.jokers.cards[j], {cardarea = G.hand, other_card = G.hand.cards[i], repetition = true, end_of_round = true, card_effects = effects}) + if next(eval) then + for h = 1, eval.jokers.repetitions do + reps[#reps+1] = eval + end + end + end + end + + for ii = 1, #effects do + --if this effect came from a joker + if effects[ii].card then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() effects[ii].card:juice_up(0.7);return true end) + })) + end + + --If dollars + if effects[ii].h_dollars then + ease_dollars(effects[ii].h_dollars) + card_eval_status_text(G.hand.cards[i], 'dollars', effects[ii].h_dollars, percent) + end + + --Any extras + if effects[ii].extra then + card_eval_status_text(G.hand.cards[i], 'extra', nil, percent, nil, effects[ii].extra) + end + end + j = j + 1 + end + end + delay(0.3) + + + G.FUNCS.draw_from_hand_to_discard() + if G.GAME.blind:get_type() == 'Boss' then + G.GAME.voucher_restock = nil + if G.GAME.modifiers.set_eternal_ante and (G.GAME.round_resets.ante == G.GAME.modifiers.set_eternal_ante) then + for k, v in ipairs(G.jokers.cards) do + v:set_eternal(true) + end + end + if G.GAME.modifiers.set_joker_slots_ante and (G.GAME.round_resets.ante == G.GAME.modifiers.set_joker_slots_ante) then + G.jokers.config.card_limit = 0 + end + delay(0.4); ease_ante(1); delay(0.4); check_for_unlock({type = 'ante_up', ante = G.GAME.round_resets.ante + 1}) + end + G.FUNCS.draw_from_discard_to_deck() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.3, + func = function() + G.STATE = G.STATES.ROUND_EVAL + G.STATE_COMPLETE = false + + if G.GAME.round_resets.blind == G.P_BLINDS.bl_small then + G.GAME.round_resets.blind_states.Small = 'Defeated' + elseif G.GAME.round_resets.blind == G.P_BLINDS.bl_big then + G.GAME.round_resets.blind_states.Big = 'Defeated' + else + G.GAME.current_round.voucher = get_next_voucher_key() + G.GAME.round_resets.blind_states.Boss = 'Defeated' + for k, v in ipairs(G.playing_cards) do + v.ability.played_this_ante = nil + end + end + + if G.GAME.round_resets.temp_handsize then G.hand:change_size(-G.GAME.round_resets.temp_handsize); G.GAME.round_resets.temp_handsize = nil end + if G.GAME.round_resets.temp_reroll_cost then G.GAME.round_resets.temp_reroll_cost = nil; calculate_reroll_cost(true) end + + reset_idol_card() + reset_mail_rank() + reset_ancient_card() + reset_castle_card() + for k, v in ipairs(G.playing_cards) do + v.ability.discarded = nil + v.ability.forced_selection = nil + end + return true + end + })) + end + return true + end + })) + end + +function new_round() + G.RESET_JIGGLES = nil + delay(0.4) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.GAME.current_round.discards_left = math.max(0, G.GAME.round_resets.discards + G.GAME.round_bonus.discards) + G.GAME.current_round.hands_left = (math.max(1, G.GAME.round_resets.hands + G.GAME.round_bonus.next_hands)) + G.GAME.current_round.hands_played = 0 + G.GAME.current_round.discards_used = 0 + G.GAME.current_round.reroll_cost_increase = 0 + G.GAME.current_round.used_packs = {} + + for k, v in pairs(G.GAME.hands) do + v.played_this_round = 0 + end + + for k, v in pairs(G.playing_cards) do + v.ability.wheel_flipped = nil + end + + local chaos = find_joker('Chaos the Clown') + G.GAME.current_round.free_rerolls = #chaos + calculate_reroll_cost(true) + + G.GAME.round_bonus.next_hands = 0 + G.GAME.round_bonus.discards = 0 + + local blhash = '' + if G.GAME.round_resets.blind == G.P_BLINDS.bl_small then + G.GAME.round_resets.blind_states.Small = 'Current' + G.GAME.current_boss_streak = 0 + blhash = 'S' + elseif G.GAME.round_resets.blind == G.P_BLINDS.bl_big then + G.GAME.round_resets.blind_states.Big = 'Current' + G.GAME.current_boss_streak = 0 + blhash = 'B' + else + G.GAME.round_resets.blind_states.Boss = 'Current' + blhash = 'L' + end + G.GAME.subhash = (G.GAME.round_resets.ante)..(blhash) + + G.GAME.blind:set_blind(G.GAME.round_resets.blind) + + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({setting_blind = true, blind = G.GAME.round_resets.blind}) + end + delay(0.4) + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.STATE = G.STATES.DRAW_TO_HAND + G.deck:shuffle('nr'..G.GAME.round_resets.ante) + G.deck:hard_set_T() + G.STATE_COMPLETE = false + return true + end + })) + return true + end + })) +end + +G.FUNCS.draw_from_deck_to_hand = function(e) + if not (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and + G.hand.config.card_limit <= 0 and #G.hand.cards == 0 then + G.STATE = G.STATES.GAME_OVER; G.STATE_COMPLETE = false + return true + end + + local hand_space = e or math.min(#G.deck.cards, G.hand.config.card_limit - #G.hand.cards) + if G.GAME.blind.name == 'The Serpent' and + not G.GAME.blind.disabled and + (G.GAME.current_round.hands_played > 0 or + G.GAME.current_round.discards_used > 0) then + hand_space = math.min(#G.deck.cards, 3) + end + delay(0.3) + for i=1, hand_space do --draw cards from deckL + if G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK then + draw_card(G.deck,G.hand, i*100/hand_space,'up', true) + else + draw_card(G.deck,G.hand, i*100/hand_space,'up', true) + end + end +end + +G.FUNCS.discard_cards_from_highlighted = function(e, hook) + stop_use() + G.CONTROLLER.interrupt.focus = true + G.CONTROLLER:save_cardarea_focus('hand') + + for k, v in ipairs(G.playing_cards) do + v.ability.forced_selection = nil + end + + if G.CONTROLLER.focused.target and G.CONTROLLER.focused.target.area == G.hand then G.card_area_focus_reset = {area = G.hand, rank = G.CONTROLLER.focused.target.rank} end + local highlighted_count = math.min(#G.hand.highlighted, G.discard.config.card_limit - #G.play.cards) + if highlighted_count > 0 then + update_hand_text({immediate = true, nopulse = true, delay = 0}, {mult = 0, chips = 0, level = '', handname = ''}) + table.sort(G.hand.highlighted, function(a,b) return a.T.x < b.T.x end) + inc_career_stat('c_cards_discarded', highlighted_count) + for j = 1, #G.jokers.cards do + G.jokers.cards[j]:calculate_joker({pre_discard = true, full_hand = G.hand.highlighted, hook = hook}) + end + local cards = {} + local destroyed_cards = {} + for i=1, highlighted_count do + G.hand.highlighted[i]:calculate_seal({discard = true}) + local removed = false + for j = 1, #G.jokers.cards do + local eval = nil + eval = G.jokers.cards[j]:calculate_joker({discard = true, other_card = G.hand.highlighted[i], full_hand = G.hand.highlighted}) + if eval then + if eval.remove then removed = true end + card_eval_status_text(G.jokers.cards[j], 'jokers', nil, 1, nil, eval) + end + end + table.insert(cards, G.hand.highlighted[i]) + if removed then + destroyed_cards[#destroyed_cards + 1] = G.hand.highlighted[i] + if G.hand.highlighted[i].ability.name == 'Glass Card' then + G.hand.highlighted[i]:shatter() + else + G.hand.highlighted[i]:start_dissolve() + end + else + G.hand.highlighted[i].ability.discarded = true + draw_card(G.hand, G.discard, i*100/highlighted_count, 'down', false, G.hand.highlighted[i]) + end + end + + if destroyed_cards[1] then + for j=1, #G.jokers.cards do + eval_card(G.jokers.cards[j], {cardarea = G.jokers, remove_playing_cards = true, removed = destroyed_cards}) + end + end + + G.GAME.round_scores.cards_discarded.amt = G.GAME.round_scores.cards_discarded.amt + #cards + check_for_unlock({type = 'discard_custom', cards = cards}) + if not hook then + if G.GAME.modifiers.discard_cost then + ease_dollars(-G.GAME.modifiers.discard_cost) + end + ease_discard(-1) + G.GAME.current_round.discards_used = G.GAME.current_round.discards_used + 1 + G.STATE = G.STATES.DRAW_TO_HAND + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.STATE_COMPLETE = false + return true + end + })) + end + end +end + +G.FUNCS.play_cards_from_highlighted = function(e) + if G.play and G.play.cards[1] then return end + --check the hand first + + stop_use() + G.GAME.blind.triggered = false + G.CONTROLLER.interrupt.focus = true + G.CONTROLLER:save_cardarea_focus('hand') + + for k, v in ipairs(G.playing_cards) do + v.ability.forced_selection = nil + end + + table.sort(G.hand.highlighted, function(a,b) return a.T.x < b.T.x end) + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.STATE = G.STATES.HAND_PLAYED + G.STATE_COMPLETE = true + return true + end + })) + inc_career_stat('c_cards_played', #G.hand.highlighted) + inc_career_stat('c_hands_played', 1) + ease_hands_played(-1) + delay(0.4) + + for i=1, #G.hand.highlighted do + if G.hand.highlighted[i]:is_face() then inc_career_stat('c_face_cards_played', 1) end + G.hand.highlighted[i].base.times_played = G.hand.highlighted[i].base.times_played + 1 + G.hand.highlighted[i].ability.played_this_ante = true + G.GAME.round_scores.cards_played.amt = G.GAME.round_scores.cards_played.amt + 1 + draw_card(G.hand, G.play, i*100/#G.hand.highlighted, 'up', nil, G.hand.highlighted[i]) + end + + check_for_unlock({type = 'run_card_replays'}) + + if G.GAME.blind:press_play() then + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_1'):juice_up(0.3, 0) + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_2'):juice_up(0.3, 0) + G.GAME.blind:juice_up() + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) + return true + end) + })) + delay(0.4) + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + check_for_unlock({type = 'hand_contents', cards = G.play.cards}) + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.FUNCS.evaluate_play() + return true + end + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = function() + check_for_unlock({type = 'play_all_hearts'}) + G.FUNCS.draw_from_play_to_discard() + G.GAME.hands_played = G.GAME.hands_played + 1 + G.GAME.current_round.hands_played = G.GAME.current_round.hands_played + 1 + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.STATE_COMPLETE = false + return true + end + })) + return true + end) + })) +end + +G.FUNCS.get_poker_hand_info = function(_cards) + local poker_hands = evaluate_poker_hand(_cards) + local scoring_hand = {} + local text,disp_text,loc_disp_text = 'NULL','NULL', 'NULL' + if next(poker_hands["Flush Five"]) then text = "Flush Five"; scoring_hand = poker_hands["Flush Five"][1] + elseif next(poker_hands["Flush House"]) then text = "Flush House"; scoring_hand = poker_hands["Flush House"][1] + elseif next(poker_hands["Five of a Kind"]) then text = "Five of a Kind"; scoring_hand = poker_hands["Five of a Kind"][1] + elseif next(poker_hands["Straight Flush"]) then text = "Straight Flush"; scoring_hand = poker_hands["Straight Flush"][1] + elseif next(poker_hands["Four of a Kind"]) then text = "Four of a Kind"; scoring_hand = poker_hands["Four of a Kind"][1] + elseif next(poker_hands["Full House"]) then text = "Full House"; scoring_hand = poker_hands["Full House"][1] + elseif next(poker_hands["Flush"]) then text = "Flush"; scoring_hand = poker_hands["Flush"][1] + elseif next(poker_hands["Straight"]) then text = "Straight"; scoring_hand = poker_hands["Straight"][1] + elseif next(poker_hands["Three of a Kind"]) then text = "Three of a Kind"; scoring_hand = poker_hands["Three of a Kind"][1] + elseif next(poker_hands["Two Pair"]) then text = "Two Pair"; scoring_hand = poker_hands["Two Pair"][1] + elseif next(poker_hands["Pair"]) then text = "Pair"; scoring_hand = poker_hands["Pair"][1] + elseif next(poker_hands["High Card"]) then text = "High Card"; scoring_hand = poker_hands["High Card"][1] end + + disp_text = text + if text =='Straight Flush' then + local min = 10 + for j = 1, #scoring_hand do + if scoring_hand[j]:get_id() < min then min =scoring_hand[j]:get_id() end + end + if min >= 10 then + disp_text = 'Royal Flush' + end + end + loc_disp_text = localize(disp_text, 'poker_hands') + return text, loc_disp_text, poker_hands, scoring_hand, disp_text +end + +G.FUNCS.evaluate_play = function(e) + local text,disp_text,poker_hands,scoring_hand,non_loc_disp_text = G.FUNCS.get_poker_hand_info(G.play.cards) + + G.GAME.hands[text].played = G.GAME.hands[text].played + 1 + G.GAME.hands[text].played_this_round = G.GAME.hands[text].played_this_round + 1 + G.GAME.last_hand_played = text + set_hand_usage(text) + G.GAME.hands[text].visible = true + + --Add all the pure bonus cards to the scoring hand + local pures = {} + for i=1, #G.play.cards do + if next(find_joker('Splash')) then + scoring_hand[i] = G.play.cards[i] + else + if G.play.cards[i].ability.effect == 'Stone Card' then + local inside = false + for j=1, #scoring_hand do + if scoring_hand[j] == G.play.cards[i] then + inside = true + end + end + if not inside then table.insert(pures, G.play.cards[i]) end + end + end + end + for i=1, #pures do + table.insert(scoring_hand, pures[i]) + end + table.sort(scoring_hand, function (a, b) return a.T.x < b.T.x end ) + delay(0.2) + for i=1, #scoring_hand do + --Highlight all the cards used in scoring and play a sound indicating highlight + highlight_card(scoring_hand[i],(i-0.999)/5,'up') + end + + local percent = 0.3 + local percent_delta = 0.08 + + if G.GAME.current_round.current_hand.handname ~= disp_text then delay(0.3) end + update_hand_text({sound = G.GAME.current_round.current_hand.handname ~= disp_text and 'button' or nil, volume = 0.4, immediate = true, nopulse = nil, + delay = G.GAME.current_round.current_hand.handname ~= disp_text and 0.4 or 0}, {handname=disp_text, level=G.GAME.hands[text].level, mult = G.GAME.hands[text].mult, chips = G.GAME.hands[text].chips}) + + if not G.GAME.blind:debuff_hand(G.play.cards, poker_hands, text) then + mult = mod_mult(G.GAME.hands[text].mult) + hand_chips = mod_chips(G.GAME.hands[text].chips) + + check_for_unlock({type = 'hand', handname = text, disp_text = non_loc_disp_text, scoring_hand = scoring_hand, full_hand = G.play.cards}) + + delay(0.4) + + if G.GAME.first_used_hand_level and G.GAME.first_used_hand_level > 0 then + level_up_hand(G.deck.cards[1], text, nil, G.GAME.first_used_hand_level) + G.GAME.first_used_hand_level = nil + end + + local hand_text_set = false + for i=1, #G.jokers.cards do + --calculate the joker effects + local effects = eval_card(G.jokers.cards[i], {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, before = true}) + if effects.jokers then + card_eval_status_text(G.jokers.cards[i], 'jokers', nil, percent, nil, effects.jokers) + percent = percent + percent_delta + if effects.jokers.level_up then + level_up_hand(G.jokers.cards[i], text) + end + end + end + + mult = mod_mult(G.GAME.hands[text].mult) + hand_chips = mod_chips(G.GAME.hands[text].chips) + + local modded = false + + mult, hand_chips, modded = G.GAME.blind:modify_hand(G.play.cards, poker_hands, text, mult, hand_chips) + mult, hand_chips = mod_mult(mult), mod_chips(hand_chips) + if modded then update_hand_text({sound = 'chips2', modded = modded}, {chips = hand_chips, mult = mult}) end + for i=1, #scoring_hand do + --add cards played to list + if scoring_hand[i].ability.effect ~= 'Stone Card' then + G.GAME.cards_played[scoring_hand[i].base.value].total = G.GAME.cards_played[scoring_hand[i].base.value].total + 1 + G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true + end + --if card is debuffed + if scoring_hand[i].debuff then + G.GAME.blind.triggered = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_1'):juice_up(0.3, 0) + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_2'):juice_up(0.3, 0) + G.GAME.blind:juice_up();return true end) + })) + card_eval_status_text(scoring_hand[i], 'debuff') + else + --Check for play doubling + local reps = {1} + + --From Red seal + local eval = eval_card(scoring_hand[i], {repetition_only = true,cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, repetition = true}) + if next(eval) then + for h = 1, eval.seals.repetitions do + reps[#reps+1] = eval + end + end + --From jokers + for j=1, #G.jokers.cards do + --calculate the joker effects + local eval = eval_card(G.jokers.cards[j], {cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = scoring_hand[i], repetition = true}) + if next(eval) and eval.jokers then + for h = 1, eval.jokers.repetitions do + reps[#reps+1] = eval + end + end + end + for j=1,#reps do + percent = percent + percent_delta + if reps[j] ~= 1 then + card_eval_status_text((reps[j].jokers or reps[j].seals).card, 'jokers', nil, nil, nil, (reps[j].jokers or reps[j].seals)) + end + + --calculate the hand effects + local effects = {eval_card(scoring_hand[i], {cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, poker_hand = text})} + for k=1, #G.jokers.cards do + --calculate the joker individual card effects + local eval = G.jokers.cards[k]:calculate_joker({cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = scoring_hand[i], individual = true}) + if eval then + table.insert(effects, eval) + end + end + scoring_hand[i].lucky_trigger = nil + + for ii = 1, #effects do + --If chips added, do chip add event and add the chips to the total + if effects[ii].chips then + if effects[ii].card then juice_card(effects[ii].card) end + hand_chips = mod_chips(hand_chips + effects[ii].chips) + update_hand_text({delay = 0}, {chips = hand_chips}) + card_eval_status_text(scoring_hand[i], 'chips', effects[ii].chips, percent) + end + + --If mult added, do mult add event and add the mult to the total + if effects[ii].mult then + if effects[ii].card then juice_card(effects[ii].card) end + mult = mod_mult(mult + effects[ii].mult) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(scoring_hand[i], 'mult', effects[ii].mult, percent) + end + + --If play dollars added, add dollars to total + if effects[ii].p_dollars then + if effects[ii].card then juice_card(effects[ii].card) end + ease_dollars(effects[ii].p_dollars) + card_eval_status_text(scoring_hand[i], 'dollars', effects[ii].p_dollars, percent) + end + + --If dollars added, add dollars to total + if effects[ii].dollars then + if effects[ii].card then juice_card(effects[ii].card) end + ease_dollars(effects[ii].dollars) + card_eval_status_text(scoring_hand[i], 'dollars', effects[ii].dollars, percent) + end + + --Any extra effects + if effects[ii].extra then + if effects[ii].card then juice_card(effects[ii].card) end + local extras = {mult = false, hand_chips = false} + if effects[ii].extra.mult_mod then mult =mod_mult( mult + effects[ii].extra.mult_mod);extras.mult = true end + if effects[ii].extra.chip_mod then hand_chips = mod_chips(hand_chips + effects[ii].extra.chip_mod);extras.hand_chips = true end + if effects[ii].extra.swap then + local old_mult = mult + mult = mod_mult(hand_chips) + hand_chips = mod_chips(old_mult) + extras.hand_chips = true; extras.mult = true + end + update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult}) + card_eval_status_text(scoring_hand[i], 'extra', nil, percent, nil, effects[ii].extra) + end + + --If x_mult added, do mult add event and mult the mult to the total + if effects[ii].x_mult then + if effects[ii].card then juice_card(effects[ii].card) end + mult = mod_mult(mult*effects[ii].x_mult) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(scoring_hand[i], 'x_mult', effects[ii].x_mult, percent) + end + + --calculate the card edition effects + if effects[ii].edition then + hand_chips = mod_chips(hand_chips + (effects[ii].edition.chip_mod or 0)) + mult = mult + (effects[ii].edition.mult_mod or 0) + mult = mod_mult(mult*(effects[ii].edition.x_mult_mod or 1)) + update_hand_text({delay = 0}, { + chips = effects[ii].edition.chip_mod and hand_chips or nil, + mult = (effects[ii].edition.mult_mod or effects[ii].edition.x_mult_mod) and mult or nil, + }) + card_eval_status_text(scoring_hand[i], 'extra', nil, percent, nil, { + message = (effects[ii].edition.chip_mod and localize{type='variable',key='a_chips',vars={effects[ii].edition.chip_mod}}) or + (effects[ii].edition.mult_mod and localize{type='variable',key='a_mult',vars={effects[ii].edition.mult_mod}}) or + (effects[ii].edition.x_mult_mod and localize{type='variable',key='a_xmult',vars={effects[ii].edition.x_mult_mod}}), + chip_mod = effects[ii].edition.chip_mod, + mult_mod = effects[ii].edition.mult_mod, + x_mult_mod = effects[ii].edition.x_mult_mod, + colour = G.C.DARK_EDITION, + edition = true}) + end + end + end + end + end + + delay(0.3) + local mod_percent = false + for i=1, #G.hand.cards do + if mod_percent then percent = percent + percent_delta end + mod_percent = false + + --Check for hand doubling + local reps = {1} + local j = 1 + while j <= #reps do + if reps[j] ~= 1 then + card_eval_status_text((reps[j].jokers or reps[j].seals).card, 'jokers', nil, nil, nil, (reps[j].jokers or reps[j].seals)) + percent = percent + percent_delta + end + + --calculate the hand effects + local effects = {eval_card(G.hand.cards[i], {cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands})} + + for k=1, #G.jokers.cards do + --calculate the joker individual card effects + local eval = G.jokers.cards[k]:calculate_joker({cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = G.hand.cards[i], individual = true}) + if eval then + mod_percent = true + table.insert(effects, eval) + end + end + + if reps[j] == 1 then + --Check for hand doubling + + --From Red seal + local eval = eval_card(G.hand.cards[i], {repetition_only = true,cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, repetition = true, card_effects = effects}) + if next(eval) and (next(effects[1]) or #effects > 1) then + for h = 1, eval.seals.repetitions do + reps[#reps+1] = eval + end + end + + --From Joker + for j=1, #G.jokers.cards do + --calculate the joker effects + local eval = eval_card(G.jokers.cards[j], {cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = G.hand.cards[i], repetition = true, card_effects = effects}) + if next(eval) then + for h = 1, eval.jokers.repetitions do + reps[#reps+1] = eval + end + end + end + end + + for ii = 1, #effects do + --if this effect came from a joker + if effects[ii].card then + mod_percent = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() effects[ii].card:juice_up(0.7);return true end) + })) + end + + --If hold mult added, do hold mult add event and add the mult to the total + + --If dollars added, add dollars to total + if effects[ii].dollars then + ease_dollars(effects[ii].dollars) + card_eval_status_text(G.hand.cards[i], 'dollars', effects[ii].dollars, percent) + end + + if effects[ii].h_mult then + mod_percent = true + mult = mod_mult(mult + effects[ii].h_mult) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(G.hand.cards[i], 'h_mult', effects[ii].h_mult, percent) + end + + if effects[ii].x_mult then + mod_percent = true + mult = mod_mult(mult*effects[ii].x_mult) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(G.hand.cards[i], 'x_mult', effects[ii].x_mult, percent) + end + + if effects[ii].message then + mod_percent = true + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(G.hand.cards[i], 'extra', nil, percent, nil, effects[ii]) + end + end + j = j +1 + end + end + --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + --Joker Effects + --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + percent = percent + percent_delta + for i=1, #G.jokers.cards + #G.consumeables.cards do + local _card = G.jokers.cards[i] or G.consumeables.cards[i - #G.jokers.cards] + --calculate the joker edition effects + local edition_effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true}) + if edition_effects.jokers then + edition_effects.jokers.edition = true + if edition_effects.jokers.chip_mod then + hand_chips = mod_chips(hand_chips + edition_effects.jokers.chip_mod) + update_hand_text({delay = 0}, {chips = hand_chips}) + card_eval_status_text(_card, 'jokers', nil, percent, nil, { + message = localize{type='variable',key='a_chips',vars={edition_effects.jokers.chip_mod}}, + chip_mod = edition_effects.jokers.chip_mod, + colour = G.C.EDITION, + edition = true}) + end + if edition_effects.jokers.mult_mod then + mult = mod_mult(mult + edition_effects.jokers.mult_mod) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(_card, 'jokers', nil, percent, nil, { + message = localize{type='variable',key='a_mult',vars={edition_effects.jokers.mult_mod}}, + mult_mod = edition_effects.jokers.mult_mod, + colour = G.C.DARK_EDITION, + edition = true}) + end + percent = percent+percent_delta + end + + --calculate the joker effects + local effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, joker_main = true}) + + --Any Joker effects + if effects.jokers then + local extras = {mult = false, hand_chips = false} + if effects.jokers.mult_mod then mult = mod_mult(mult + effects.jokers.mult_mod);extras.mult = true end + if effects.jokers.chip_mod then hand_chips = mod_chips(hand_chips + effects.jokers.chip_mod);extras.hand_chips = true end + if effects.jokers.Xmult_mod then mult = mod_mult(mult*effects.jokers.Xmult_mod);extras.mult = true end + update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult}) + card_eval_status_text(_card, 'jokers', nil, percent, nil, effects.jokers) + percent = percent+percent_delta + end + + --Joker on Joker effects + for _, v in ipairs(G.jokers.cards) do + local effect = v:calculate_joker{full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_joker = _card} + if effect then + local extras = {mult = false, hand_chips = false} + if effect.mult_mod then mult = mod_mult(mult + effect.mult_mod);extras.mult = true end + if effect.chip_mod then hand_chips = mod_chips(hand_chips + effect.chip_mod);extras.hand_chips = true end + if effect.Xmult_mod then mult = mod_mult(mult*effect.Xmult_mod);extras.mult = true end + if extras.mult or extras.hand_chips then update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult}) end + if extras.mult or extras.hand_chips then card_eval_status_text(v, 'jokers', nil, percent, nil, effect) end + percent = percent+percent_delta + end + end + + if edition_effects.jokers then + if edition_effects.jokers.x_mult_mod then + mult = mod_mult(mult*edition_effects.jokers.x_mult_mod) + update_hand_text({delay = 0}, {mult = mult}) + card_eval_status_text(_card, 'jokers', nil, percent, nil, { + message = localize{type='variable',key='a_xmult',vars={edition_effects.jokers.x_mult_mod}}, + x_mult_mod = edition_effects.jokers.x_mult_mod, + colour = G.C.EDITION, + edition = true}) + end + percent = percent+percent_delta + end + end + + local nu_chip, nu_mult = G.GAME.selected_back:trigger_effect{context = 'final_scoring_step', chips = hand_chips, mult = mult} + mult = mod_mult(nu_mult or mult) + hand_chips = mod_chips(nu_chip or hand_chips) + + local cards_destroyed = {} + for i=1, #scoring_hand do + local destroyed = nil + --un-highlight all cards + highlight_card(scoring_hand[i],(i-0.999)/(#scoring_hand-0.998),'down') + + for j = 1, #G.jokers.cards do + destroyed = G.jokers.cards[j]:calculate_joker({destroying_card = scoring_hand[i], full_hand = G.play.cards}) + if destroyed then break end + end + + if scoring_hand[i].ability.name == 'Glass Card' and not scoring_hand[i].debuff and pseudorandom('glass') < G.GAME.probabilities.normal/scoring_hand[i].ability.extra then + destroyed = true + end + + if destroyed then + if scoring_hand[i].ability.name == 'Glass Card' then + scoring_hand[i].shattered = true + else + scoring_hand[i].destroyed = true + end + cards_destroyed[#cards_destroyed+1] = scoring_hand[i] + end + end + for j=1, #G.jokers.cards do + eval_card(G.jokers.cards[j], {cardarea = G.jokers, remove_playing_cards = true, removed = cards_destroyed}) + end + + local glass_shattered = {} + for k, v in ipairs(cards_destroyed) do + if v.shattered then glass_shattered[#glass_shattered+1] = v end + end + + check_for_unlock{type = 'shatter', shattered = glass_shattered} + + for i=1, #cards_destroyed do + G.E_MANAGER:add_event(Event({ + func = function() + if cards_destroyed[i].ability.name == 'Glass Card' then + cards_destroyed[i]:shatter() + else + cards_destroyed[i]:start_dissolve() + end + return true + end + })) + end + else + mult = mod_mult(0) + hand_chips = mod_chips(0) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_1'):juice_up(0.3, 0) + G.HUD_blind:get_UIE_by_ID('HUD_blind_debuff_2'):juice_up(0.3, 0) + G.GAME.blind:juice_up() + G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.06*G.SETTINGS.GAMESPEED, blockable = false, blocking = false, func = function() + play_sound('tarot2', 0.76, 0.4);return true end})) + play_sound('tarot2', 1, 0.4) + return true + end) + })) + + play_area_status_text("Not Allowed!")--localize('k_not_allowed_ex'), true) + --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + --Joker Debuff Effects + --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- + for i=1, #G.jokers.cards do + + --calculate the joker effects + local effects = eval_card(G.jokers.cards[i], {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, debuffed_hand = true}) + + --Any Joker effects + if effects.jokers then + card_eval_status_text(G.jokers.cards[i], 'jokers', nil, percent, nil, effects.jokers) + percent = percent+percent_delta + end + end + end + G.E_MANAGER:add_event(Event({ + trigger = 'after',delay = 0.4, + func = (function() update_hand_text({delay = 0, immediate = true}, {mult = 0, chips = 0, chip_total = math.floor(hand_chips*mult), level = '', handname = ''});play_sound('button', 0.9, 0.6);return true end) + })) + check_and_set_high_score('hand', hand_chips*mult) + + check_for_unlock({type = 'chip_score', chips = math.floor(hand_chips*mult)}) + + if hand_chips*mult > 0 then + delay(0.8) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() play_sound('chips2');return true end) + })) + end + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blocking = false, + ref_table = G.GAME, + ref_value = 'chips', + ease_to = G.GAME.chips + math.floor(hand_chips*mult), + delay = 0.5, + func = (function(t) return math.floor(t) end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'ease', + blocking = true, + ref_table = G.GAME.current_round.current_hand, + ref_value = 'chip_total', + ease_to = 0, + delay = 0.5, + func = (function(t) return math.floor(t) end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() G.GAME.current_round.current_hand.handname = '';return true end) + })) + delay(0.3) + + for i=1, #G.jokers.cards do + --calculate the joker after hand played effects + local effects = eval_card(G.jokers.cards[i], {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, after = true}) + if effects.jokers then + card_eval_status_text(G.jokers.cards[i], 'jokers', nil, percent, nil, effects.jokers) + percent = percent + percent_delta + end + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + if G.GAME.modifiers.debuff_played_cards then + for k, v in ipairs(scoring_hand) do v.ability.perma_debuff = true end + end + return true end) + })) + + end + + G.FUNCS.draw_from_play_to_discard = function(e) + local play_count = #G.play.cards + local it = 1 + for k, v in ipairs(G.play.cards) do + if (not v.shattered) and (not v.destroyed) then + draw_card(G.play,G.discard, it*100/play_count,'down', false, v) + it = it + 1 + end + end + end + + G.FUNCS.draw_from_play_to_hand = function(cards) + local gold_count = #cards + for i=1, gold_count do --draw cards from play + if not cards[i].shattered and not cards[i].destroyed then + draw_card(G.play,G.hand, i*100/gold_count,'up', true, cards[i]) + end + end + end + + G.FUNCS.draw_from_discard_to_deck = function(e) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + local discard_count = #G.discard.cards + for i=1, discard_count do --draw cards from deck + draw_card(G.discard, G.deck, i*100/discard_count,'up', nil ,nil, 0.005, i%2==0, nil, math.max((21-i)/20,0.7)) + end + return true + end + })) + end + + G.FUNCS.draw_from_hand_to_deck = function(e) + local hand_count = #G.hand.cards + for i=1, hand_count do --draw cards from deck + draw_card(G.hand, G.deck, i*100/hand_count,'down', nil, nil, 0.08) + end + end + + G.FUNCS.draw_from_hand_to_discard = function(e) + local hand_count = #G.hand.cards + for i=1, hand_count do + draw_card(G.hand,G.discard, i*100/hand_count,'down', nil, nil, 0.07) + end +end + +G.FUNCS.evaluate_round = function() + local pitch = 0.95 + local dollars = 0 + + if G.GAME.chips - G.GAME.blind.chips >= 0 then + add_round_eval_row({dollars = G.GAME.blind.dollars, name='blind1', pitch = pitch}) + pitch = pitch + 0.06 + dollars = dollars + G.GAME.blind.dollars + else + add_round_eval_row({dollars = 0, name='blind1', pitch = pitch, saved = true}) + pitch = pitch + 0.06 + end + + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 1.3*math.min(G.GAME.blind.dollars+2, 7)/2*0.15 + 0.5, + func = function() + G.GAME.blind:defeat() + return true + end + })) + delay(0.2) + G.E_MANAGER:add_event(Event({ + func = function() + ease_background_colour_blind(G.STATES.ROUND_EVAL, '') + return true + end + })) + G.GAME.selected_back:trigger_effect({context = 'eval'}) + + if G.GAME.current_round.hands_left > 0 and not G.GAME.modifiers.no_extra_hand_money then + add_round_eval_row({dollars = G.GAME.current_round.hands_left*(G.GAME.modifiers.money_per_hand or 1), disp = G.GAME.current_round.hands_left, bonus = true, name='hands', pitch = pitch}) + pitch = pitch + 0.06 + dollars = dollars + G.GAME.current_round.hands_left*(G.GAME.modifiers.money_per_hand or 1) + end + if G.GAME.current_round.discards_left > 0 and G.GAME.modifiers.money_per_discard then + add_round_eval_row({dollars = G.GAME.current_round.discards_left*(G.GAME.modifiers.money_per_discard), disp = G.GAME.current_round.discards_left, bonus = true, name='discards', pitch = pitch}) + pitch = pitch + 0.06 + dollars = dollars + G.GAME.current_round.discards_left*(G.GAME.modifiers.money_per_discard) + end + for i = 1, #G.jokers.cards do + local ret = G.jokers.cards[i]:calculate_dollar_bonus() + if ret then + add_round_eval_row({dollars = ret, bonus = true, name='joker'..i, pitch = pitch, card = G.jokers.cards[i]}) + pitch = pitch + 0.06 + dollars = dollars + ret + end + end + for i = 1, #G.GAME.tags do + local ret = G.GAME.tags[i]:apply_to_run({type = 'eval'}) + if ret then + add_round_eval_row({dollars = ret.dollars, bonus = true, name='tag'..i, pitch = pitch, condition = ret.condition, pos = ret.pos, tag = ret.tag}) + pitch = pitch + 0.06 + dollars = dollars + ret.dollars + end + end + if G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest then + add_round_eval_row({bonus = true, name='interest', pitch = pitch, dollars = G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)}) + pitch = pitch + 0.06 + if not G.GAME.seeded and not G.GAME.challenge then + if G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) == G.GAME.interest_amount*G.GAME.interest_cap/5 then + G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak = G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak + 1 + else + G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak = 0 + end + end + check_for_unlock({type = 'interest_streak'}) + dollars = dollars + G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) + end + + pitch = pitch + 0.06 + + add_round_eval_row({name = 'bottom', dollars = dollars}) +end + +G.FUNCS.tutorial_controller = function() + if G.F_SKIP_TUTORIAL then + G.SETTINGS.tutorial_complete = true + G.SETTINGS.tutorial_progress = nil + return + end + G.SETTINGS.tutorial_progress = G.SETTINGS.tutorial_progress or + { + forced_shop = {'j_joker', 'c_empress'}, + forced_voucher = 'v_grabber', + forced_tags = {'tag_handy', 'tag_garbage'}, + hold_parts = {}, + completed_parts = {}, + } + if not G.SETTINGS.paused and (not G.SETTINGS.tutorial_complete) then + if G.STATE == G.STATES.BLIND_SELECT and G.blind_select and not G.SETTINGS.tutorial_progress.completed_parts['small_blind'] then + G.SETTINGS.tutorial_progress.section = 'small_blind' + G.FUNCS.tutorial_part('small_blind') + G.SETTINGS.tutorial_progress.completed_parts['small_blind'] = true + G:save_progress() + end + if G.STATE == G.STATES.BLIND_SELECT and G.blind_select and not G.SETTINGS.tutorial_progress.completed_parts['big_blind'] and G.GAME.round > 0 then + G.SETTINGS.tutorial_progress.section = 'big_blind' + G.FUNCS.tutorial_part('big_blind') + G.SETTINGS.tutorial_progress.completed_parts['big_blind'] = true + G.SETTINGS.tutorial_progress.forced_tags = nil + G:save_progress() + end + if G.STATE == G.STATES.SELECTING_HAND and not G.SETTINGS.tutorial_progress.completed_parts['second_hand'] and G.SETTINGS.tutorial_progress.hold_parts['big_blind'] then + G.SETTINGS.tutorial_progress.section = 'second_hand' + G.FUNCS.tutorial_part('second_hand') + G.SETTINGS.tutorial_progress.completed_parts['second_hand'] = true + G:save_progress() + end + if G.SETTINGS.tutorial_progress.hold_parts['second_hand'] then + G.SETTINGS.tutorial_complete = true + end + if not G.SETTINGS.tutorial_progress.completed_parts['first_hand_section'] then + if G.STATE == G.STATES.SELECTING_HAND and not G.SETTINGS.tutorial_progress.completed_parts['first_hand'] then + G.SETTINGS.tutorial_progress.section = 'first_hand' + G.FUNCS.tutorial_part('first_hand') + G.SETTINGS.tutorial_progress.completed_parts['first_hand'] = true + G:save_progress() + end + if G.STATE == G.STATES.SELECTING_HAND and not G.SETTINGS.tutorial_progress.completed_parts['first_hand_2'] and G.SETTINGS.tutorial_progress.hold_parts['first_hand'] then + G.FUNCS.tutorial_part('first_hand_2') + G.SETTINGS.tutorial_progress.completed_parts['first_hand_2'] = true + G:save_progress() + end + if G.STATE == G.STATES.SELECTING_HAND and not G.SETTINGS.tutorial_progress.completed_parts['first_hand_3'] and G.SETTINGS.tutorial_progress.hold_parts['first_hand_2'] then + G.FUNCS.tutorial_part('first_hand_3') + G.SETTINGS.tutorial_progress.completed_parts['first_hand_3'] = true + G:save_progress() + end + if G.STATE == G.STATES.SELECTING_HAND and not G.SETTINGS.tutorial_progress.completed_parts['first_hand_4'] and G.SETTINGS.tutorial_progress.hold_parts['first_hand_3'] then + G.FUNCS.tutorial_part('first_hand_4') + G.SETTINGS.tutorial_progress.completed_parts['first_hand_4'] = true + G.SETTINGS.tutorial_progress.completed_parts['first_hand_section'] = true + G:save_progress() + end + end + if G.STATE == G.STATES.SHOP and G.shop and G.shop.VT.y < 5 and not G.SETTINGS.tutorial_progress.completed_parts['shop_1'] then + G.SETTINGS.tutorial_progress.section = 'shop' + G.FUNCS.tutorial_part('shop_1') + G.SETTINGS.tutorial_progress.completed_parts['shop_1'] = true + G.SETTINGS.tutorial_progress.forced_voucher = nil + G:save_progress() + end + end +end + +G.FUNCS.tutorial_part = function(_part) + local step = 1 + G.SETTINGS.paused = true + if _part == 'small_blind' then + step = tutorial_info({ + text_key = 'sb_1', + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + step = tutorial_info({ + text_key = 'sb_2', + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + step = tutorial_info({ + text_key = 'sb_3', + highlight = { + G.blind_select.UIRoot.children[1].children[1].config.object:get_UIE_by_ID('blind_name'), + G.blind_select.UIRoot.children[1].children[1].config.object:get_UIE_by_ID('blind_desc'), + }, + attach = {major = G.blind_select.UIRoot.children[1].children[1], type = 'tr', offset = {x = 2, y = 4}}, + step = step, + }) + step = tutorial_info({ + text_key = 'sb_4', + highlight = { + G.blind_select.UIRoot.children[1].children[1] + }, + snap_to = function() + if G.blind_select and G.blind_select.UIRoot and G.blind_select.UIRoot.children[1] and G.blind_select.UIRoot.children[1].children[1] and G.blind_select.UIRoot.children[1].children[1].config.object then + return G.blind_select.UIRoot.children[1].children[1].config.object:get_UIE_by_ID('select_blind_button') end + end, + attach = {major = G.blind_select.UIRoot.children[1].children[1], type = 'tr', offset = {x = 2, y = 4}}, + step = step, + no_button = true, + button_listen = 'select_blind' + }) + elseif _part == 'big_blind' then + step = tutorial_info({ + text_key = 'bb_1', + highlight = { + G.blind_select.UIRoot.children[1].children[2].config.object:get_UIE_by_ID('blind_name'), + G.blind_select.UIRoot.children[1].children[2].config.object:get_UIE_by_ID('blind_desc'), + }, + hard_set = true, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + step = tutorial_info({ + text_key = 'bb_2', + highlight = { + G.blind_select.UIRoot.children[1].children[2].config.object:get_UIE_by_ID('blind_name'), + G.blind_select.UIRoot.children[1].children[2].config.object:get_UIE_by_ID('tag_desc'), + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + step = tutorial_info({ + text_key = 'bb_3', + highlight = { + G.blind_select.UIRoot.children[1].children[3].config.object:get_UIE_by_ID('blind_name'), + G.blind_select.UIRoot.children[1].children[3].config.object:get_UIE_by_ID('blind_desc'), + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + step = tutorial_info({ + text_key = 'bb_4', + highlight = { + G.blind_select.UIRoot.children[1].children[3].config.object:get_UIE_by_ID('blind_name'), + G.blind_select.UIRoot.children[1].children[3].config.object:get_UIE_by_ID('blind_desc'), + G.blind_select.UIRoot.children[1].children[3].config.object:get_UIE_by_ID('blind_extras'), + G.HUD:get_UIE_by_ID('hud_ante') + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + step = tutorial_info({ + text_key = 'bb_5', + loc_vars = {G.GAME.win_ante}, + highlight = { + G.blind_select, + G.HUD:get_UIE_by_ID('hud_ante') + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + no_button = true, + snap_to = function() + if G.blind_select and G.blind_select.UIRoot and G.blind_select.UIRoot.children[1] and G.blind_select.UIRoot.children[1].children[2] and + G.blind_select.UIRoot.children[1].children[2].config.object then + return G.blind_select.UIRoot.children[1].children[2].config.object:get_UIE_by_ID('select_blind_button') end + end, + button_listen = 'select_blind' + }) + elseif _part == 'first_hand' then + step = tutorial_info({ + text_key = 'fh_1', + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + step = tutorial_info({ + text_key = 'fh_2', + highlight = { + G.HUD:get_UIE_by_ID('hand_text_area') + }, + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + step = tutorial_info({ + text_key = 'fh_3', + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + highlight = { + G.HUD:get_UIE_by_ID('run_info_button') + }, + no_button = true, + button_listen = 'run_info', + snap_to = function() return G.HUD:get_UIE_by_ID('run_info_button') end, + step = step, + }) + elseif _part == 'first_hand_2' then + step = tutorial_info({ + hard_set = true, + text_key = 'fh_4', + highlight = { + G.hand, + G.HUD:get_UIE_by_ID('run_info_button') + }, + attach = {major = G.hand, type = 'cl', offset = {x = -1.5, y = 0}}, + snap_to = function() return G.hand.cards[1] end, + step = step, + }) + step = tutorial_info({ + text_key = 'fh_5', + highlight = { + G.hand, + G.buttons:get_UIE_by_ID('play_button'), + G.HUD:get_UIE_by_ID('run_info_button') + }, + attach = {major = G.hand, type = 'cl', offset = {x = -1.5, y = 0}}, + no_button = true, + button_listen = 'play_cards_from_highlighted', + step = step, + }) + elseif _part == 'first_hand_3' then + step = tutorial_info({ + hard_set = true, + text_key = 'fh_6', + highlight = { + G.hand, + G.buttons:get_UIE_by_ID('discard_button'), + G.HUD:get_UIE_by_ID('run_info_button') + }, + attach = {major = G.hand, type = 'cl', offset = {x = -1.5, y = 0}}, + no_button = true, + button_listen = 'discard_cards_from_highlighted', + step = step, + }) + elseif _part == 'first_hand_4' then + step = tutorial_info({ + hard_set = true, + text_key = 'fh_7', + highlight = { + G.HUD:get_UIE_by_ID('hud_hands').parent, + }, + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + step = tutorial_info({ + text_key = 'fh_8', + highlight = { + G.HUD:get_UIE_by_ID('hud_hands').parent, + G.HUD:get_UIE_by_ID('row_dollars_chips'), + G.HUD_blind + }, + attach = {major = G.ROOM_ATTACH, type = 'cm', offset = {x = 0, y = 0}}, + step = step, + }) + elseif _part == 'second_hand' then + step = tutorial_info({ + text_key = 'sh_1', + hard_set = true, + highlight = { + G.jokers + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + local empress = find_joker('The Empress')[1] + if empress then + step = tutorial_info({ + text_key = 'sh_2', + highlight = { + empress + }, + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + step = step, + }) + step = tutorial_info({ + text_key = 'sh_3', + attach = {major = G.HUD, type = 'cm', offset = {x = 0, y = -2}}, + highlight = { + empress, + G.hand + }, + no_button = true, + button_listen = 'use_card', + snap_to = function() return G.hand.cards[1] end, + step = step, + }) + end + elseif _part == 'shop_1' then + step = tutorial_info({ + hard_set = true, + text_key = 's_1', + highlight = { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent + }, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 4}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_2', + highlight = { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.shop_jokers.cards[2], + }, + snap_to = function() return G.shop_jokers.cards[2] end, + attach = {major = G.shop, type = 'tr', offset = {x = -0.5, y = 6}}, + no_button = true, + button_listen = 'buy_from_shop', + step = step, + }) + step = tutorial_info({ + text_key = 's_3', + loc_vars = {#G.P_CENTER_POOLS.Joker}, + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.jokers.cards[1], + } end, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_4', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.jokers.cards[1], + } end, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_5', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.jokers, + } end, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_6', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.shop_jokers.cards[1], + } end, + snap_to = function() return G.shop_jokers.cards[1] end, + no_button = true, + button_listen = 'buy_from_shop', + attach = {major = G.shop, type = 'tr', offset = {x = -0.5, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_7', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.consumeables.cards[#G.consumeables.cards], + } end, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_8', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.consumeables + } end, + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_9', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.shop_vouchers, + } end, + snap_to = function() return G.shop_vouchers.cards[1] end, + attach = {major = G.shop, type = 'tr', offset = {x = -4, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_10', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.shop_vouchers, + } end, + attach = {major = G.shop, type = 'tr', offset = {x = -4, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_11', + highlight = function() return { + G.SHOP_SIGN, + G.HUD:get_UIE_by_ID('dollar_text_UI').parent.parent.parent, + G.shop_booster, + } end, + snap_to = function() return G.shop_booster.cards[1] end, + attach = {major = G.shop, type = 'tl', offset = {x = 3, y = 6}}, + step = step, + }) + step = tutorial_info({ + text_key = 's_12', + highlight = function() return { + G.shop:get_UIE_by_ID('next_round_button'), + } end, + snap_to = function() if G.shop then return G.shop:get_UIE_by_ID('next_round_button') end end, + no_button = true, + button_listen = 'toggle_shop', + attach = {major = G.shop, type = 'tm', offset = {x = 0, y = 6}}, + step = step, + }) + end + + + G.E_MANAGER:add_event(Event({ + blockable = false, + timer = 'REAL', + func = function() + if (G.OVERLAY_TUTORIAL.step == step and + not G.OVERLAY_TUTORIAL.step_complete) or G.OVERLAY_TUTORIAL.skip_steps then + if G.OVERLAY_TUTORIAL.Jimbo then G.OVERLAY_TUTORIAL.Jimbo:remove() end + if G.OVERLAY_TUTORIAL.content then G.OVERLAY_TUTORIAL.content:remove() end + G.OVERLAY_TUTORIAL:remove() + G.OVERLAY_TUTORIAL = nil + G.SETTINGS.tutorial_progress.hold_parts[_part]=true + return true + end + return G.OVERLAY_TUTORIAL.step > step or G.OVERLAY_TUTORIAL.skip_steps + end + }), 'tutorial') + G.SETTINGS.paused = false +end diff --git a/functions/test_functions.lua b/functions/test_functions.lua new file mode 100644 index 0000000..2d02ed6 --- /dev/null +++ b/functions/test_functions.lua @@ -0,0 +1,237 @@ +function live_test() + add_joker('j_popcorn', 'negative') +end + +function do_action(action) + local action = { + type = 'use_card', + target_area = "shop_booster", + target_card = 1, + } + + do_action(action) + + if action.type == 'use_card' then + G.FUNCS.use_card({config = {ref_table = G[action.target_area].cards[action.target_card]}}) + end +end + +function graphics_stress() + local _r = {} + for i = 1,50 do + local _c = {} + for j =1,50 do + _c[#_c+1] = {n=G.UIT.C, config={align = "cm", minw = 0.05,minh = 0.05,colour = G.C.BLUE}, nodes={ + {n=G.UIT.T, config={text = "A", scale = 0.15, colour = G.C.WHITE}} + }} + end + _r[#_r+1] = {n=G.UIT.R, config={align = "cm", minw = 0.05,minh = 0.05,colour = G.C.BLUE, padding = 0.05}, nodes=_c} + end + local uidef = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes=_r} + + G.STRESS = UIBox{ + definition = uidef, + config = {align="cm", offset = {x=0,y=0},major = G.ROOM_ATTACH} + } +end + +function aprint(text) + if _RELEASE_MODE then return end + attention_text({ + text = text, + scale = 0.8, + hold = 5.7, + cover = G.deck or G.MAIN_MENU_UI, + cover_colour = G.C.RED, + align = 'cm', + }) +end + +function play_video() + G.video_control = G.video_control or { + {video = 'A3', _s = 0.1, _e = 4.65, track = 'music1'}, + {video = 'E1', _s = 3.69, _e = 6.55}, + {video = 'C3', _s = 1.9, _e = 4.3, track = 'music3'}, + {video = 'E5', _s = 5.9, _e = 9.2, track = 'music1'}, + {video = 'C4a', _s = 1.3, _e = 4.5, track = 'music2'}, + {video = 'E4', _s = 4, _e = 7.2, track = 'music1'}, + {video = 'D4', _s = 0.3, _e = 3.2, track = 'music4'}, + {video = 'C2', _s = 2.0, _e = 4.4, track = 'music1'}, + {video = 'B3', _s = 2.7, _e = 5.3}, + {video = 'B4', _s = 21.5, _e = 24.8}, + {video = 'D5', _s = 1.2, _e = 3.8, track = 'music1'}, + {video_organ = 0.1,video = 'E2', _s = 1.5, _e = 4.1}, + {video_organ = 0.2,video = 'E3', _s = 3.5, _e = 7.5}, + {video_organ = 0.4, video = 'D3', _s = 1.9, _e = 4.3, track = 'music1'}, + --[[ old one + {video = 'A1', _s = 2.5, _e = 13.9, track = 'music1'}, + {video = '_A2', _s = 0.4, _e = 3.15}, + {video = 'A3', _s = 0.2, _e = 2.25}, + {video = 'A4', _s = 3.4, _e = 8.2}, + {video = '_B1', _s = 0.15, _e = 4.4}, + {video = 'B3', _s = 2.7, _e = 5.3}, + {video = 'B4', _s = 21.5, _e = 27.6}, + {video = '_C1', _s = 0.25, _e = 3.2, track = 'music4'}, + {video = 'C2', _s = 1.4, _e = 4.4}, + {video = 'C3', _s = 1.9, _e = 4.3, track = 'music3'}, + {video = 'C4a', _s = 1.3, _e = 4.5, track = 'music2'}, + {video = '_C5', _s = 0.1, _e = 3.4, track = 'music1'}, + {video = 'C4b', _s = 0.15, _e = 3.5}, + {video = 'D4', _s = 0.3, _e = 3.7, track = 'music4'}, + {video = 'D3', _s = 1.6, _e = 4.8, track = 'music1'}, + {video = 'D1', _s = 1.4, _e = 3.5, track = 'music4'}, + {video = 'D5', _s = 1.0, _e = 3.8, track = 'music1'}, + {video = 'E1', _s = 3, _e = 6.55}, + {video = 'E2', _s = 0., _e = 4.1}, + {video = 'E3', _s = 3.5, _e = 7.5}, + {video = 'E4', _s = 4, _e = 7.2}, + {video = 'E5', _s = 5.9, _e = 9.2, track = 'music1'}, + {video = 'F1', _s = 4.2, _e = 8.1}, + {video_organ = 0.1, video = 'F5', _s = 2.25, _e = 5.4}, + {video_organ = 0.05, video = 'F6', _s = 0, _e = 2.3}, + {video_organ = 0.2, video = 'F2', _s = 0.2, _e = 1.6}, + {video_organ = 0.4, video = 'F3', _s = 2.6, _e = 4.2}, ]]-- + } + + G.video_volume = 1 + G.video_volume_real = 0 + + G.E_MANAGER:add_event(Event({ + blocking = false, blockable = false, + func = function() + G.video_volume_real = G.video_volume_real*(1 - 4*G.real_dt) + 4*G.real_dt*G.video_volume + if G.video then G.video:getSource( ):setVolume(G.video_volume_real) end + end + })) + + local trailer_time = 0 + + for k, v in pairs(G.video_control) do + if v.start then + local nu_vc = {} + for i = k, #G.video_control do + nu_vc[#nu_vc+1] = G.video_control[i] + end + G.video_control = nu_vc + break + end + end + + + --prep clips because keyframes + for k, v in pairs(G.video_control) do + trailer_time = trailer_time + (v._e - v._s) + v.video_file = love.graphics.newVideo('resources/videos/'..v.video..'.ogv') + v.video_file:seek(math.max(v._s or 0.3, 0.3) - 0.29) + G.E_MANAGER:add_event(Event({ + func = function() + v.video_file:play() + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.29, + func = function() + v.video_file:pause() + v.video_file:seek(v._s or 0) + return true + end + })) + end + delay(1.5) + + for k, v in pairs(G.video_control) do + if v.text then + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 1.4, + func = function() + G.FUNCS.wipe_on(v.text, true, 1.4) + G.video_volume = 0 + return true + end + })) + G.E_MANAGER:add_event(Event({ + func = function() + if G.video then G.video:pause() end + G.video = v.video_file + if v.track then G.video_soundtrack = v.track end + if v.video_organ then G.video_organ = v.video_organ end + G.video:play() + G.video_volume = 1 + return true + end + })) + G.FUNCS.wipe_off() + else + G.E_MANAGER:add_event(Event({ + func = function() + if G.video then G.video:pause() end + G.video = v.video_file + if v.track then G.video_soundtrack = v.track end + if v.video_organ then G.video_organ = v.video_organ end + G.video:play() + return true + end + })) + end + local _delay = v._e - (v._s or 0) - (v.text and 1.5 or 0) + delay(_delay - 0.15) + G.E_MANAGER:add_event(Event({ + func = function() + G.screenglitch = true + G.screenwipe_amt = 1 + return true + end + })) + delay(0.15) + G.E_MANAGER:add_event(Event({ + blocking = false, + trigger = 'after', + delay = 0.3, + func = function() + G.screenglitch = false + return true + end + })) + end + local flash_col = copy_table(G.C.WHITE) + G.E_MANAGER:add_event(Event({ + trigger = 'before', + delay = 0.6, + func = function() + G.FUNCS.wipe_on(nil, true, 2, flash_col) + return true + end + })) + G.E_MANAGER:add_event(Event({ + func = function() + + G.E_MANAGER:add_event(Event({ + trigger = 'after', delay = 0.9, blockable = false, + func = function() + G.video:pause() + G.video = nil + G.video_soundtrack = 'music1' + G.video_organ = 0 + return true + end + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', delay = 0.9, blockable = false, + func = function() + G.screenglitch = false + G.TIMERS.REAL = 4 + G.TIMERS.TOTAL = 4 + flash_col[4] = 0 + G:main_menu('splash') + return true + end + })) + + return true + end + })) + G.FUNCS.wipe_off() +end diff --git a/game.lua b/game.lua new file mode 100644 index 0000000..1f816c6 --- /dev/null +++ b/game.lua @@ -0,0 +1,3550 @@ +--Class +Game = Object:extend() + +--Class Methods +function Game:init() + G = self + + self:set_globals() +end + +function Game:start_up() + --Load the settings file + local settings = get_compressed('settings.jkr') + local settings_ver = nil + if settings then + local settings_file = STR_UNPACK(settings) + if G.VERSION >= '1.0.0' and (love.system.getOS() == 'NOPE') and ((not settings_file.version) or (settings_file.version < '1.0.0')) then + for i = 1, 3 do + love.filesystem.remove(i..'/'..'profile.jkr') + love.filesystem.remove(i..'/'..'save.jkr') + love.filesystem.remove(i..'/'..'meta.jkr') + love.filesystem.remove(i..'/'..'unlock_notify.jkr') + love.filesystem.remove(i..'') + end + for k, v in pairs(settings_file) do + self.SETTINGS[k] = v + end + self.SETTINGS.profile = 1 + self.SETTINGS.tutorial_progress = nil + else + if G.VERSION < '1.0.0' then + settings_ver = settings_file.version + end + for k, v in pairs(settings_file) do + self.SETTINGS[k] = v + end + end + end + self.SETTINGS.version = settings_ver or G.VERSION + self.SETTINGS.paused = nil + + local new_colour_proto = self.C["SO_"..(self.SETTINGS.colourblind_option and 2 or 1)] + self.C.SUITS.Hearts = new_colour_proto.Hearts + self.C.SUITS.Diamonds = new_colour_proto.Diamonds + self.C.SUITS.Spades = new_colour_proto.Spades + self.C.SUITS.Clubs = new_colour_proto.Clubs + + boot_timer('start', 'settings', 0.1) + + if self.SETTINGS.GRAPHICS.texture_scaling then + self.SETTINGS.GRAPHICS.texture_scaling = self.SETTINGS.GRAPHICS.texture_scaling > 1 and 2 or 1 + end + + if self.SETTINGS.DEMO and not self.F_CTA then + self.SETTINGS.DEMO = { + total_uptime = 0, + timed_CTA_shown = true, + win_CTA_shown = true, + quit_CTA_shown = true + } + end + + --create all sounds from resources and play one each to load into mem + SOURCES = {} + local sound_files = love.filesystem.getDirectoryItems("resources/sounds") + + for _, filename in ipairs(sound_files) do + local extension = string.sub(filename, -4) + if extension == '.ogg' then + local sound_code = string.sub(filename, 1, -5) + SOURCES[sound_code] = {} + end + end + + self.SETTINGS.language = self.SETTINGS.language or 'en-us' + boot_timer('settings', 'window init', 0.2) + self:init_window() + + if G.F_SOUND_THREAD then + boot_timer('window init', 'soundmanager2') + --call the sound manager to prepare the thread to play sounds + self.SOUND_MANAGER = { + thread = love.thread.newThread('engine/sound_manager.lua'), + channel = love.thread.getChannel('sound_request'), + load_channel = love.thread.getChannel('load_channel') + } + self.SOUND_MANAGER.thread:start(1) + + local sound_loaded, prev_file = false, 'none' + while not sound_loaded and false do + --Monitor the channel for any new requests + local request = self.SOUND_MANAGER.load_channel:pop() -- Value from channel + if request then + --If the request is for an update to the music track, handle it here + if request == 'finished' then sound_loaded = true + else + boot_timer(request, prev_file) + prev_file = request + end + end + love.timer.sleep(0.001) + end + + boot_timer('soundmanager2', 'savemanager',0.22) + end + + boot_timer('window init', 'savemanager') + --call the save manager to wait for any save requests + G.SAVE_MANAGER = { + thread = love.thread.newThread('engine/save_manager.lua'), + channel = love.thread.getChannel('save_request') + } + G.SAVE_MANAGER.thread:start(2) + boot_timer('savemanager', 'shaders',0.4) + + --call the http manager + G.HTTP_MANAGER = { + thread = love.thread.newThread('engine/http_manager.lua'), + out_channel = love.thread.getChannel('http_request'), + in_channel = love.thread.getChannel('http_response') + } + if G.F_HTTP_SCORES then + G.HTTP_MANAGER.thread:start() + end + + --Load all shaders from resources + self.SHADERS = {} + local shader_files = love.filesystem.getDirectoryItems("resources/shaders") + for k, filename in ipairs(shader_files) do + local extension = string.sub(filename, -3) + if extension == '.fs' then + local shader_name = string.sub(filename, 1, -4) + self.SHADERS[shader_name] = love.graphics.newShader("resources/shaders/"..filename) + end + end + + boot_timer('shaders', 'controllers',0.7) + + --Input handler/controller for game objects + self.CONTROLLER = Controller() + love.joystick.loadGamepadMappings("resources/gamecontrollerdb.txt") + if self.F_RUMBLE then + local joysticks = love.joystick.getJoysticks() + if joysticks then + if joysticks[1] then + self.CONTROLLER:set_gamepad(joysticks[2] or joysticks[1]) + end + end + end + boot_timer('controllers', 'localization',0.8) + + if self.SETTINGS.GRAPHICS.texture_scaling then + self.SETTINGS.GRAPHICS.texture_scaling = self.SETTINGS.GRAPHICS.texture_scaling > 1 and 2 or 1 + end + + self:load_profile(G.SETTINGS.profile or 1) + + self.SETTINGS.QUEUED_CHANGE = {} + self.SETTINGS.music_control = {desired_track = '', current_track = '', lerp = 1} + + self:set_render_settings() + + self:set_language() + + self:init_item_prototypes() + boot_timer('protos', 'shared sprites',0.9) + + --For globally shared sprites + self.shared_debuff = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], {x=4, y = 0}) + + self.shared_soul = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], self.P_CENTERS.soul.pos) + self.shared_undiscovered_joker = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], self.P_CENTERS.undiscovered_joker.pos) + self.shared_undiscovered_tarot = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], self.P_CENTERS.undiscovered_tarot.pos) + + self.shared_sticker_eternal = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 0,y = 0}) + self.shared_stickers = { + White = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 1,y = 0}), + Red = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 2,y = 0}), + Green = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 3,y = 0}), + Black = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 0,y = 1}), + Blue = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 4,y = 0}), + Purple = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 1,y = 1}), + Orange = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 2,y = 1}), + Gold = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 3,y = 1}) + } + self.shared_seals = { + Gold = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], {x = 2,y = 0}), + Purple = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], {x = 4,y = 4}), + Red = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], {x = 5,y = 4}), + Blue = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["centers"], {x = 6,y = 4}), + } + self.sticker_map = { + 'White','Red','Green','Black','Blue','Purple','Orange','Gold' + } + boot_timer('shared sprites', 'prep stage',0.95) + + --For the visible cursor + G.STAGE_OBJECT_INTERRUPT =true + self.CURSOR = Sprite(0,0,0.3, 0.3, self.ASSET_ATLAS['gamepad_ui'], {x = 18, y = 0}) + self.CURSOR.states.collide.can = false + G.STAGE_OBJECT_INTERRUPT = false + + --Create the event manager for the game + self.E_MANAGER = EventManager() + self.SPEEDFACTOR = 1 + + + self:prep_stage(G.STAGES.MAIN_MENU, G.STATES.SPLASH, true) + set_profile_progress() + boot_timer('prep stage', 'splash prep',1) + self:splash_screen() + boot_timer('splash prep', 'end',1) +end + +function Game:init_item_prototypes() + --Initialize all prototypes for units/items + self.P_SEALS = { + Gold = {order = 1, discovered = false, set = "Seal"}, + Red = {order = 2, discovered = false, set = "Seal"}, + Blue = {order = 3, discovered = false, set = "Seal"}, + Purple = {order = 4, discovered = false, set = "Seal"}, + } + self.P_TAGS = { + tag_uncommon = {name = 'Uncommon Tag', set = 'Tag', discovered = false, min_ante = nil, order = 1, config = {type = 'store_joker_create'}, pos = {x = 0,y = 0}}, + tag_rare = {name = 'Rare Tag', set = 'Tag', discovered = false, min_ante = nil, order = 2, config = {type = 'store_joker_create', odds = 3}, requires = 'j_blueprint', pos = {x = 1,y = 0}}, + tag_negative = {name = 'Negative Tag', set = 'Tag', discovered = false, min_ante = 2, order = 3, config = {type = 'store_joker_modify', edition = 'negative', odds = 5}, requires = 'e_negative', pos = {x = 2, y = 0}}, + tag_foil = {name = 'Foil Tag', set = 'Tag', discovered = false, min_ante = nil, order = 4, config = {type = 'store_joker_modify', edition = 'foil', odds = 2}, requires = 'e_foil', pos = {x = 3,y = 0}}, + tag_holo = {name = 'Holographic Tag', set = 'Tag', discovered = false, min_ante = nil, order = 5, config = {type = 'store_joker_modify', edition = 'holo', odds = 3}, requires = 'e_holo', pos = {x = 0,y = 1}}, + tag_polychrome = {name = 'Polychrome Tag', set = 'Tag', discovered = false, min_ante = nil, order = 6, config = {type = 'store_joker_modify', edition = 'polychrome', odds = 4}, requires = 'e_polychrome', pos = {x = 1,y = 1}}, + tag_investment = {name = 'Investment Tag', set = 'Tag', discovered = false, min_ante = nil, order = 7, config = {type = 'eval', dollars = 15}, pos = {x = 2,y = 1}}, + tag_voucher = {name = 'Voucher Tag', set = 'Tag', discovered = false, min_ante = nil, order = 8, config = {type = 'voucher_add'}, pos = {x = 3,y = 1}}, + tag_boss = {name = 'Boss Tag', set = 'Tag', discovered = false, min_ante = nil, order = 9, config = {type = 'new_blind_choice', }, pos = {x = 0,y = 2}}, + tag_standard = {name = 'Standard Tag', set = 'Tag', discovered = false, min_ante = 2, order = 10, config = {type = 'new_blind_choice', }, pos = {x = 1,y = 2}}, + tag_charm = {name = 'Charm Tag', set = 'Tag', discovered = false, min_ante = nil, order = 11, config = {type = 'new_blind_choice', }, pos = {x = 2,y = 2}}, + tag_meteor = {name = 'Meteor Tag', set = 'Tag', discovered = false, min_ante = 2, order = 12, config = {type = 'new_blind_choice', }, pos = {x = 3,y = 2}}, + tag_buffoon = {name = 'Buffoon Tag', set = 'Tag', discovered = false, min_ante = 2, order = 13, config = {type = 'new_blind_choice', }, pos = {x = 4,y = 2}}, + tag_handy = {name = 'Handy Tag', set = 'Tag', discovered = false, min_ante = 2, order = 14, config = {type = 'immediate', dollars_per_hand = 1}, pos = {x = 1,y = 3}}, + tag_garbage = {name = 'Garbage Tag', set = 'Tag', discovered = false, min_ante = 2, order = 15, config = {type = 'immediate', dollars_per_discard = 1}, pos = {x = 2,y = 3}}, + tag_ethereal = {name = 'Ethereal Tag', set = 'Tag', discovered = false, min_ante = 2, order = 16, config = {type = 'new_blind_choice'}, pos = {x = 3,y = 3}}, + tag_coupon = {name = 'Coupon Tag', set = 'Tag', discovered = false, min_ante = nil, order = 17, config = {type = 'shop_final_pass', }, pos = {x = 4,y = 0}}, + tag_double = {name = 'Double Tag', set = 'Tag', discovered = false, min_ante = nil, order = 18, config = {type = 'tag_add', }, pos = {x = 5,y = 0}}, + tag_juggle = {name = 'Juggle Tag', set = 'Tag', discovered = false, min_ante = nil, order = 19, config = {type = 'round_start_bonus', h_size = 3}, pos = {x = 5,y = 1}}, + tag_d_six = {name = 'D6 Tag', set = 'Tag', discovered = false, min_ante = nil, order = 20, config = {type = 'shop_start', }, pos = {x = 5,y = 3}}, + tag_top_up = {name = 'Top-up Tag', set = 'Tag', discovered = false, min_ante = 2, order = 21, config = {type = 'immediate', spawn_jokers = 2}, pos = {x = 4,y = 1}}, + tag_skip = {name = 'Skip Tag', set = 'Tag', discovered = false, min_ante = nil, order = 22, config = {type = 'immediate', skip_bonus = 5}, pos = {x = 0,y = 3}}, + tag_orbital = {name = 'Orbital Tag', set = 'Tag', discovered = false, min_ante = 2, order = 23, config = {type = 'immediate', levels = 3}, pos = {x = 5,y = 2}}, + tag_economy = {name = 'Economy Tag', set = 'Tag', discovered = false, min_ante = nil, order = 24, config = {type = 'immediate', max = 40}, pos = {x = 4,y = 3}}, + } + self.tag_undiscovered = {name = 'Not Discovered', order = 1, config = {type = ''}, pos = {x=3,y=4}} + + self.P_STAKES = { + stake_white = {name = 'White Chip', unlocked = true, order = 1, pos = {x = 0,y = 0}, stake_level = 1, set = 'Stake'}, + stake_red = {name = 'Red Chip', unlocked = false, order = 2, pos = {x = 1,y = 0}, stake_level = 2, set = 'Stake'}, + stake_green = {name = 'Green Chip', unlocked = false, order = 3, pos = {x = 2,y = 0}, stake_level = 3, set = 'Stake'}, + stake_black = {name = 'Black Chip', unlocked = false, order = 4, pos = {x = 4,y = 0}, stake_level = 4, set = 'Stake'}, + stake_blue = {name = 'Blue Chip', unlocked = false, order = 5, pos = {x = 3,y = 0}, stake_level = 5, set = 'Stake'}, + stake_purple = {name = 'Purple Chip', unlocked = false, order = 6, pos = {x = 0,y = 1}, stake_level = 6, set = 'Stake'}, + stake_orange = {name = 'Orange Chip', unlocked = false, order = 7, pos = {x = 1,y = 1}, stake_level = 7, set = 'Stake'}, + stake_gold = {name = 'Gold Chip', unlocked = false, order = 8, pos = {x = 2,y = 1}, stake_level = 8, set = 'Stake'}, + } + + self.P_BLINDS = { + bl_small = {name = 'Small Blind', defeated = false, order = 1, dollars = 3, mult = 1, vars = {}, debuff_text = '', debuff = {}, pos = {x=0, y=0}}, + bl_big = {name = 'Big Blind', defeated = false, order = 2, dollars = 4, mult = 1.5,vars = {}, debuff_text = '', debuff = {}, pos = {x=0, y=1}}, + bl_ox = {name = 'The Ox', defeated = false, order = 4, dollars = 5, mult = 2, vars = {localize('ph_most_played')}, debuff = {}, pos = {x=0, y=2}, boss = {min = 6, max = 10}, boss_colour = HEX('b95b08')}, + bl_hook = {name = 'The Hook', defeated = false, order = 3, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=7}, boss = {min = 1, max = 10}, boss_colour = HEX('a84024')}, + bl_mouth = {name = 'The Mouth', defeated = false, order = 17, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=18}, boss = {min = 2, max = 10}, boss_colour = HEX('ae718e')}, + bl_fish = {name = 'The Fish', defeated = false, order = 10, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=5}, boss = {min = 2, max = 10}, boss_colour = HEX('3e85bd')}, + bl_club = {name = 'The Club', defeated = false, order = 9, dollars = 5, mult = 2, vars = {}, debuff = {suit = 'Clubs'}, pos = {x=0, y=4}, boss = {min = 1, max = 10}, boss_colour = HEX('b9cb92')}, + bl_manacle = {name = 'The Manacle', defeated = false, order = 15, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=8}, boss = {min = 1, max = 10}, boss_colour = HEX('575757')}, + bl_tooth = {name = 'The Tooth', defeated = false, order = 23, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=22}, boss = {min = 3, max = 10}, boss_colour = HEX('b52d2d')}, + bl_wall = {name = 'The Wall', defeated = false, order = 6, dollars = 5, mult = 4, vars = {}, debuff = {}, pos = {x=0, y=9}, boss = {min = 2, max = 10}, boss_colour = HEX('8a59a5')}, + bl_house = {name = 'The House', defeated = false, order = 5, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=3}, boss ={min = 2, max = 10}, boss_colour = HEX('5186a8')}, + bl_mark = {name = 'The Mark', defeated = false, order = 25, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=23}, boss = {min = 2, max = 10}, boss_colour = HEX('6a3847')}, + + bl_final_bell = {name = 'Cerulean Bell',defeated = false, order = 30, dollars = 8, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=26}, boss = {showdown = true, min = 10, max = 10}, boss_colour = HEX('009cfd')}, + bl_wheel = {name = 'The Wheel', defeated = false, order = 7, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=10}, boss = {min = 2, max = 10}, boss_colour = HEX('50bf7c')}, + bl_arm = {name = 'The Arm', defeated = false, order = 8, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=11}, boss = {min = 2, max = 10}, boss_colour = HEX('6865f3')}, + bl_psychic = {name = 'The Psychic', defeated = false, order = 11, dollars = 5, mult = 2, vars = {}, debuff = {h_size_ge = 5}, pos = {x=0, y=12}, boss = {min = 1, max = 10}, boss_colour = HEX('efc03c')}, + bl_goad = {name = 'The Goad', defeated = false, order = 12, dollars = 5, mult = 2, vars = {}, debuff = {suit = 'Spades'}, pos = {x=0, y=13}, boss = {min = 1, max = 10}, boss_colour = HEX('b95c96')}, + bl_water = {name = 'The Water', defeated = false, order = 13, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=14}, boss = {min = 2, max = 10}, boss_colour = HEX('c6e0eb')}, + bl_eye = {name = 'The Eye', defeated = false, order = 16, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=17}, boss = {min = 3, max = 10}, boss_colour = HEX('4b71e4')}, + bl_plant = {name = 'The Plant', defeated = false, order = 18, dollars = 5, mult = 2, vars = {}, debuff = {is_face = 'face'}, pos = {x=0, y=19}, boss = {min = 4, max = 10}, boss_colour = HEX('709284')}, + bl_needle = {name = 'The Needle', defeated = false, order = 21, dollars = 5, mult = 1, vars = {}, debuff = {}, pos = {x=0, y=20}, boss = {min = 2, max = 10}, boss_colour = HEX('5c6e31')}, + bl_head = {name = 'The Head', defeated = false, order = 22, dollars = 5, mult = 2, vars = {}, debuff = {suit = 'Hearts'}, pos = {x=0, y=21}, boss = {min = 1, max = 10}, boss_colour = HEX('ac9db4')}, + bl_final_leaf = {name = 'Verdant Leaf', defeated = false, order = 27, dollars = 8, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=28}, boss = {showdown = true, min = 10, max = 10}, boss_colour = HEX('56a786')}, + bl_final_vessel = {name = 'Violet Vessel',defeated = false, order = 28, dollars = 8, mult = 6, vars = {}, debuff = {}, pos = {x=0, y=29}, boss = {showdown = true, min = 10, max = 10}, boss_colour = HEX('8a71e1')}, + bl_window = {name = 'The Window', defeated = false, order = 14, dollars = 5, mult = 2, vars = {}, debuff = {suit = 'Diamonds'}, pos = {x=0, y=6}, boss = {min = 1, max = 10}, boss_colour = HEX('a9a295')}, + bl_serpent = {name = 'The Serpent', defeated = false, order = 19, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=15}, boss = {min = 5, max = 10}, boss_colour = HEX('439a4f')}, + bl_pillar = {name = 'The Pillar', defeated = false, order = 20, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=16}, boss = {min = 1, max = 10}, boss_colour = HEX('7e6752')}, + bl_flint = {name = 'The Flint', defeated = false, order = 24, dollars = 5, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=24}, boss = {min = 2, max = 10}, boss_colour = HEX('e56a2f')}, + bl_final_acorn = {name = 'Amber Acorn', defeated = false, order = 26, dollars = 8, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=27}, boss = {showdown = true, min = 10, max = 10}, boss_colour = HEX('fda200')}, + bl_final_heart = {name = 'Crimson Heart',defeated = false, order = 29, dollars = 8, mult = 2, vars = {}, debuff = {}, pos = {x=0, y=25}, boss = {showdown = true, min = 10, max = 10}, boss_colour = HEX('ac3232')}, + + } + self.b_undiscovered = {name = 'Undiscovered', debuff_text = 'Defeat this blind to discover', pos = {x=0,y=30}} + + self.P_CARDS = { + H_2={name = "2 of Hearts",value = '2', suit = 'Hearts', pos = {x=0,y=0}}, + H_3={name = "3 of Hearts",value = '3', suit = 'Hearts', pos = {x=1,y=0}}, + H_4={name = "4 of Hearts",value = '4', suit = 'Hearts', pos = {x=2,y=0}}, + H_5={name = "5 of Hearts",value = '5', suit = 'Hearts', pos = {x=3,y=0}}, + H_6={name = "6 of Hearts",value = '6', suit = 'Hearts', pos = {x=4,y=0}}, + H_7={name = "7 of Hearts",value = '7', suit = 'Hearts', pos = {x=5,y=0}}, + H_8={name = "8 of Hearts",value = '8', suit = 'Hearts', pos = {x=6,y=0}}, + H_9={name = "9 of Hearts",value = '9', suit = 'Hearts', pos = {x=7,y=0}}, + H_T={name = "10 of Hearts",value = '10', suit = 'Hearts', pos = {x=8,y=0}}, + H_J={name = "Jack of Hearts",value = 'Jack', suit = 'Hearts', pos = {x=9,y=0}}, + H_Q={name = "Queen of Hearts",value = 'Queen', suit = 'Hearts', pos = {x=10,y=0}}, + H_K={name = "King of Hearts",value = 'King', suit = 'Hearts', pos = {x=11,y=0}}, + H_A={name = "Ace of Hearts",value = 'Ace', suit = 'Hearts', pos = {x=12,y=0}}, + C_2={name = "2 of Clubs",value = '2', suit = 'Clubs', pos = {x=0,y=1}}, + C_3={name = "3 of Clubs",value = '3', suit = 'Clubs', pos = {x=1,y=1}}, + C_4={name = "4 of Clubs",value = '4', suit = 'Clubs', pos = {x=2,y=1}}, + C_5={name = "5 of Clubs",value = '5', suit = 'Clubs', pos = {x=3,y=1}}, + C_6={name = "6 of Clubs",value = '6', suit = 'Clubs', pos = {x=4,y=1}}, + C_7={name = "7 of Clubs",value = '7', suit = 'Clubs', pos = {x=5,y=1}}, + C_8={name = "8 of Clubs",value = '8', suit = 'Clubs', pos = {x=6,y=1}}, + C_9={name = "9 of Clubs",value = '9', suit = 'Clubs', pos = {x=7,y=1}}, + C_T={name = "10 of Clubs",value = '10', suit = 'Clubs', pos = {x=8,y=1}}, + C_J={name = "Jack of Clubs",value = 'Jack', suit = 'Clubs', pos = {x=9,y=1}}, + C_Q={name = "Queen of Clubs",value = 'Queen', suit = 'Clubs', pos = {x=10,y=1}}, + C_K={name = "King of Clubs",value = 'King', suit = 'Clubs', pos = {x=11,y=1}}, + C_A={name = "Ace of Clubs",value = 'Ace', suit = 'Clubs', pos = {x=12,y=1}}, + D_2={name = "2 of Diamonds",value = '2', suit = 'Diamonds', pos = {x=0,y=2}}, + D_3={name = "3 of Diamonds",value = '3', suit = 'Diamonds', pos = {x=1,y=2}}, + D_4={name = "4 of Diamonds",value = '4', suit = 'Diamonds', pos = {x=2,y=2}}, + D_5={name = "5 of Diamonds",value = '5', suit = 'Diamonds', pos = {x=3,y=2}}, + D_6={name = "6 of Diamonds",value = '6', suit = 'Diamonds', pos = {x=4,y=2}}, + D_7={name = "7 of Diamonds",value = '7', suit = 'Diamonds', pos = {x=5,y=2}}, + D_8={name = "8 of Diamonds",value = '8', suit = 'Diamonds', pos = {x=6,y=2}}, + D_9={name = "9 of Diamonds",value = '9', suit = 'Diamonds', pos = {x=7,y=2}}, + D_T={name = "10 of Diamonds",value = '10', suit = 'Diamonds', pos = {x=8,y=2}}, + D_J={name = "Jack of Diamonds",value = 'Jack', suit = 'Diamonds', pos = {x=9,y=2}}, + D_Q={name = "Queen of Diamonds",value = 'Queen', suit = 'Diamonds', pos = {x=10,y=2}}, + D_K={name = "King of Diamonds",value = 'King', suit = 'Diamonds', pos = {x=11,y=2}}, + D_A={name = "Ace of Diamonds",value = 'Ace', suit = 'Diamonds', pos = {x=12,y=2}}, + S_2={name = "2 of Spades",value = '2', suit = 'Spades', pos = {x=0,y=3}}, + S_3={name = "3 of Spades",value = '3', suit = 'Spades', pos = {x=1,y=3}}, + S_4={name = "4 of Spades",value = '4', suit = 'Spades', pos = {x=2,y=3}}, + S_5={name = "5 of Spades",value = '5', suit = 'Spades', pos = {x=3,y=3}}, + S_6={name = "6 of Spades",value = '6', suit = 'Spades', pos = {x=4,y=3}}, + S_7={name = "7 of Spades",value = '7', suit = 'Spades', pos = {x=5,y=3}}, + S_8={name = "8 of Spades",value = '8', suit = 'Spades', pos = {x=6,y=3}}, + S_9={name = "9 of Spades",value = '9', suit = 'Spades', pos = {x=7,y=3}}, + S_T={name = "10 of Spades",value = '10', suit = 'Spades', pos = {x=8,y=3}}, + S_J={name = "Jack of Spades",value = 'Jack', suit = 'Spades', pos = {x=9,y=3}}, + S_Q={name = "Queen of Spades",value = 'Queen', suit = 'Spades', pos = {x=10,y=3}}, + S_K={name = "King of Spades",value = 'King', suit = 'Spades', pos = {x=11,y=3}}, + S_A={name = "Ace of Spades",value = 'Ace', suit = 'Spades', pos = {x=12,y=3}}, + } + + self.j_locked = {unlocked = false, max = 1, name = "Locked", pos = {x=8,y=9}, set = "Joker", cost_mult = 1.0,config = {}} + self.v_locked = {unlocked = false, max = 1, name = "Locked", pos = {x=8,y=3}, set = "Voucher", cost_mult = 1.0,config = {}} + self.c_locked = {unlocked = false, max = 1, name = "Locked", pos = {x=4,y=2}, set = "Tarot", cost_mult = 1.0,config = {}} + self.j_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=9,y=9}, set = "Joker", cost_mult = 1.0,config = {}} + self.t_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=6,y=2}, set = "Tarot", cost_mult = 1.0,config = {}} + self.p_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=7,y=2}, set = "Planet", cost_mult = 1.0,config = {}} + self.s_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=5,y=2}, set = "Spectral", cost_mult = 1.0,config = {}} + self.v_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=8,y=2}, set = "Voucher", cost_mult = 1.0,config = {}} + self.booster_undiscovered = {unlocked = false, max = 1, name = "Locked", pos = {x=0,y=5}, set = "Booster", cost_mult = 1.0,config = {}} + + self.P_CENTERS = { + c_base={max = 500, freq = 1, line = 'base', name = "Default Base", pos = {x=1,y=0}, set = "Default", label = 'Base Card', effect = "Base", cost_mult = 1.0, config = {}}, + + --Jokers + j_joker= {order = 1, unlocked = true, start_alerted = true, discovered = true, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 2, name = "Joker", pos = {x=0,y=0}, set = "Joker", effect = "Mult", cost_mult = 1.0, config = {mult = 4}}, + j_greedy_joker= {order = 2, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Greedy Joker", pos = {x=6,y=1}, set = "Joker", effect = "Suit Mult", cost_mult = 1.0, config = {extra = {s_mult = 4, suit = 'Diamonds'}}}, + j_lusty_joker= {order = 3, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Lusty Joker", pos = {x=7,y=1}, set = "Joker", effect = "Suit Mult", cost_mult = 1.0, config = {extra = {s_mult = 4, suit = 'Hearts'}}}, + j_wrathful_joker= {order = 4, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Wrathful Joker", pos = {x=8,y=1}, set = "Joker", effect = "Suit Mult", cost_mult = 1.0, config = {extra = {s_mult = 4, suit = 'Spades'}}}, + j_gluttenous_joker= {order = 5, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Gluttonous Joker", pos = {x=9,y=1}, set = "Joker", effect = "Suit Mult", cost_mult = 1.0, config = {extra = {s_mult = 4, suit = 'Clubs'}}}, + j_jolly= {order = 6, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 3, name = "Jolly Joker", pos = {x=2,y=0}, set = "Joker", effect = "Type Mult", cost_mult = 1.0, config = {t_mult = 8, type = 'Pair'}}, + j_zany= {order = 7, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Zany Joker", pos = {x=3,y=0}, set = "Joker", effect = "Type Mult", cost_mult = 1.0, config = {t_mult = 12, type = 'Three of a Kind'}}, + j_mad= {order = 8, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Mad Joker", pos = {x=4,y=0}, set = "Joker", effect = "Type Mult", cost_mult = 1.0, config = {t_mult = 20, type = 'Four of a Kind'}}, + j_crazy= {order = 9, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Crazy Joker", pos = {x=5,y=0}, set = "Joker", effect = "Type Mult", cost_mult = 1.0, config = {t_mult = 12, type = 'Straight'}}, + j_droll= {order = 10, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Droll Joker", pos = {x=6,y=0}, set = "Joker", effect = "Type Mult", cost_mult = 1.0, config = {t_mult = 10, type = 'Flush'}}, + j_sly= {order = 11, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 3, name = "Sly Joker",set = "Joker", config = {t_chips = 50, type = 'Pair'}, pos = {x=0,y=14}}, + j_wily= {order = 12, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Wily Joker",set = "Joker", config = {t_chips = 100, type = 'Three of a Kind'}, pos = {x=1,y=14}}, + j_clever= {order = 13, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Clever Joker",set = "Joker", config = {t_chips = 150, type = 'Four of a Kind'}, pos = {x=2,y=14}}, + j_devious= {order = 14, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Devious Joker",set = "Joker", config = {t_chips = 100, type = 'Straight'}, pos = {x=3,y=14}}, + j_crafty= {order = 15, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Crafty Joker",set = "Joker", config = {t_chips = 80, type = 'Flush'}, pos = {x=4,y=14}}, + + j_half= {order = 16, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Half Joker", pos = {x=7,y=0}, set = "Joker", effect = "Hand Size Mult", cost_mult = 1.0, config = {extra = {mult = 20, size = 3}}}, + j_stencil= {order = 17, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 8, name = "Joker Stencil", pos = {x=2,y=5}, set = "Joker", effect = "Hand Size Mult", cost_mult = 1.0, config = {}}, + j_four_fingers= {order = 18, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 7, name = "Four Fingers", pos = {x=6,y=6}, set = "Joker", effect = "", config = {}}, + j_mime= {order = 19, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Mime", pos = {x=4,y=1}, set = "Joker", effect = "Hand card double", cost_mult = 1.0, config = {extra = 1}}, + j_credit_card= {order = 20, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 1, cost = 1, name = "Credit Card", pos = {x=5,y=1}, set = "Joker", effect = "Credit", cost_mult = 1.0, config = {extra = 20}}, + j_ceremonial= {order = 21, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Ceremonial Dagger", pos = {x=5,y=5}, set = "Joker", effect = "", config = {mult = 0}}, + j_banner= {order = 22, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Banner", pos = {x=1,y=2}, set = "Joker", effect = "Discard Chips", cost_mult = 1.0, config = {extra = 40}}, + j_mystic_summit= {order = 23, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Mystic Summit", pos = {x=2,y=2}, set = "Joker", effect = "No Discard Mult", cost_mult = 1.0, config = {extra = {mult = 15, d_remaining = 0}}}, + j_marble= {order = 24, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Marble Joker", pos = {x=3,y=2}, set = "Joker", effect = "Stone card hands", cost_mult = 1.0, config = {extra = 1}}, + j_loyalty_card= {order = 25, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Loyalty Card", pos = {x=4,y=2}, set = "Joker", effect = "1 in 10 mult", cost_mult = 1.0, config = {extra = {Xmult = 4, every = 5, remaining = "5 remaining"}}}, + j_8_ball= {order = 26, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "8 Ball", pos = {x=0,y=5}, set = "Joker", effect = "Spawn Tarot", cost_mult = 1.0, config = {extra= 2}}, + j_misprint= {order = 27, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Misprint", pos = {x=6,y=2}, set = "Joker", effect = "Random Mult", cost_mult = 1.0, config = {extra = {max = 23, min = 0}}}, + j_dusk= {order = 28, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Dusk", pos = {x=4,y=7}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = '', extra = '', hidden = true}}, + j_raised_fist= {order = 29, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Raised Fist", pos = {x=8,y=2}, set = "Joker", effect = "Socialized Mult", cost_mult = 1.0, config = {}}, + j_chaos= {order = 30, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 1, cost = 4, name = "Chaos the Clown", pos = {x=1,y=0}, set = "Joker", effect = "Bonus Rerolls", cost_mult = 1.0, config = {extra = 1}}, + + j_fibonacci= {order = 31, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Fibonacci", pos = {x=1,y=5}, set = "Joker", effect = "Card Mult", cost_mult = 1.0, config = {extra = 8}}, + j_steel_joker= {order = 32, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Steel Joker", pos = {x=7,y=2}, set = "Joker", effect = "Steel Card Buff", cost_mult = 1.0, config = {extra = 0.25}, enhancement_gate = 'm_steel'}, + j_scary_face= {order = 33, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Scary Face", pos = {x=2,y=3}, set = "Joker", effect = "Scary Face Cards", cost_mult = 1.0, config = {extra = 30}}, + j_abstract= {order = 34, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Abstract Joker", pos = {x=3,y=3}, set = "Joker", effect = "Joker Mult", cost_mult = 1.0, config = {extra = 3}}, + j_delayed_grat= {order = 35, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 1, cost = 4, name = "Delayed Gratification", pos = {x=4,y=3}, set = "Joker", effect = "Discard dollars", cost_mult = 1.0, config = {extra = 2}}, + j_hack= {order = 36, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Hack", pos = {x=5,y=2}, set = "Joker", effect = "Low Card double", cost_mult = 1.0, config = {extra = 1}}, + j_pareidolia= {order = 37, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 5, name = "Pareidolia", pos = {x=6,y=3}, set = "Joker", effect = "All face cards", cost_mult = 1.0, config = {}}, + j_gros_michel= {order = 38, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = false, rarity = 1, cost = 5, name = "Gros Michel", pos = {x=7,y=6}, set = "Joker", effect = "", config = {extra = {odds = 4, mult = 15}}, no_pool_flag = 'gros_michel_extinct'}, + j_even_steven= {order = 39, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Even Steven", pos = {x=8,y=3}, set = "Joker", effect = "Even Card Buff", cost_mult = 1.0, config = {extra = 4}}, + j_odd_todd= {order = 40, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Odd Todd", pos = {x=9,y=3}, set = "Joker", effect = "Odd Card Buff", cost_mult = 1.0, config = {extra = 30}}, + j_scholar= {order = 41, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Scholar", pos = {x=0,y=4}, set = "Joker", effect = "Ace Buff", cost_mult = 1.0, config = {extra = {mult = 4, chips = 20}}}, + j_business= {order = 42, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Business Card", pos = {x=1,y=4}, set = "Joker", effect = "Face Card dollar Chance", cost_mult = 1.0, config = {extra = 2}}, + j_supernova= {order = 43, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Supernova", pos = {x=2,y=4}, set = "Joker", effect = "Hand played mult", cost_mult = 1.0, config = {extra = 1}}, + j_ride_the_bus= {order = 44, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 6, name = "Ride the Bus", pos = {x=1,y=6}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = 'discard_custom'}}, + j_space= {order = 45, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Space Joker", pos = {x=3,y=5}, set = "Joker", effect = "Upgrade Hand chance", cost_mult = 1.0, config = {extra = 4}}, + + j_egg= {order = 46, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 1, cost = 4, name = 'Egg', pos = {x = 0, y = 10}, set = 'Joker', config = {extra = 3}}, + j_burglar= {order = 47, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = 'Burglar', pos = {x = 1, y = 10}, set = 'Joker', config = {extra = 3}}, + j_blackboard= {order = 48, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = 'Blackboard', pos = {x = 2, y = 10}, set = 'Joker', config = {extra = 3}}, + j_runner= {order = 49, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = 'Runner', pos = {x = 3, y = 10}, set = 'Joker', config = {extra = {chips = 20, chip_mod = 10}}}, + j_ice_cream= {order = 50, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = false, rarity = 1, cost = 5, name = 'Ice Cream', pos = {x = 4, y = 10}, set = 'Joker', config = {extra = {chips = 100, chip_mod = 5}}}, + j_dna= {order = 51, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = 'DNA', pos = {x = 5, y = 10}, set = 'Joker', config = {}}, + j_splash= {order = 52, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 1, cost = 3, name = 'Splash', pos = {x = 6, y = 10}, set = 'Joker', config = {}}, + j_blue_joker= {order = 53, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = 'Blue Joker', pos = {x = 7, y = 10}, set = 'Joker', config = {extra = 2}}, + j_sixth_sense= {order = 54, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 3, cost = 6, name = 'Sixth Sense', pos = {x = 8, y = 10}, set = 'Joker', config = {}}, + j_constellation= {order = 55, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = 'Constellation', pos = {x = 9, y = 10}, set = 'Joker', config = {extra = 0.1, Xmult = 1}}, + j_hiker= {order = 56, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = 'Hiker', pos = {x = 0, y = 11}, set = 'Joker', config = {extra = 4}}, + j_faceless= {order = 57, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = 'Faceless Joker', pos = {x = 1, y = 11}, set = 'Joker', config = {extra = {dollars = 5, faces = 3}}}, + j_green_joker= {order = 58, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = 'Green Joker', pos = {x = 2, y = 11}, set = 'Joker', config = {extra = {hand_add = 1, discard_sub = 1}}}, + j_superposition= {order = 59, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = 'Superposition', pos = {x = 3, y = 11}, set = 'Joker', config = {}}, + j_todo_list= {order = 60, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = 'To Do List', pos = {x = 4, y = 11}, set = 'Joker', config = {extra = {dollars = 5, poker_hand = 'High Card'}}}, + + j_cavendish= {order = 61, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = false, rarity = 1, cost = 4, name = "Cavendish", pos = {x=5,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = {odds = 1000, Xmult = 3}}, yes_pool_flag = 'gros_michel_extinct'}, + j_card_sharp= {order = 62, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Card Sharp", pos = {x=6,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = {Xmult = 3}}}, + j_red_card= {order = 63, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Red Card", pos = {x=7,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = 3}}, + j_madness= {order = 64, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Madness", pos = {x=8,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = 0.5}}, + j_square= {order = 65, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Square Joker", pos = {x=9,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = {chips = 16, chip_mod = 4}}}, + j_seance= {order = 66, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 7, name = "Seance", pos = {x=0,y=12}, set = "Joker", cost_mult = 1.0, config = {extra = {poker_hand = 'Straight Flush'}}}, + j_riff_raff= {order = 67, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Riff-raff", pos = {x=1,y=12}, set = "Joker", cost_mult = 1.0, config = {extra = 2}}, + j_vampire= {order = 68, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Vampire",set = "Joker", config = {extra = 0.2, Xmult = 1}, pos = {x=2,y=12}}, + j_shortcut= {order = 69, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 7, name = "Shortcut",set = "Joker", config = {}, pos = {x=3,y=12}}, + j_hologram= {order = 70, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Hologram",set = "Joker", config = {extra = 0.25, Xmult = 1}, pos = {x=4,y=12}, soul_pos = {x=2, y=9},}, + j_vagabond= {order = 71, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Vagabond",set = "Joker", config = {extra = 3}, pos = {x=5,y=12}}, + j_baron= {order = 72, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Baron",set = "Joker", config = {extra = 1.5}, pos = {x=6,y=12}}, + j_cloud_9= {order = 73, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Cloud 9",set = "Joker", config = {extra = 1}, pos = {x=7,y=12}}, + j_rocket= {order = 74, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Rocket",set = "Joker", config = {extra = {dollars = 1, increase = 2}}, pos = {x=8,y=12}}, + j_obelisk= {order = 75, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Obelisk",set = "Joker", config = {extra = 0.2, Xmult = 1}, pos = {x=9,y=12}}, + + j_midas_mask= {order = 76, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Midas Mask",set = "Joker", config = {}, pos = {x=0,y=13}}, + j_luchador= {order = 77, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Luchador",set = "Joker", config = {}, pos = {x=1,y=13}}, + j_photograph= {order = 78, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Photograph",set = "Joker", config = {extra = 2}, pos = {x=2,y=13}}, + j_gift= {order = 79, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Gift Card",set = "Joker", config = {extra = 1}, pos = {x=3,y=13}}, + j_turtle_bean= {order = 80, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = false, rarity = 2, cost = 6, name = "Turtle Bean",set = "Joker", config = {extra = {h_size = 5, h_mod = 1}}, pos = {x=4,y=13}}, + j_erosion= {order = 81, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Erosion",set = "Joker", config = {extra = 4}, pos = {x=5,y=13}}, + j_reserved_parking= {order = 82, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Reserved Parking",set = "Joker", config = {extra = {odds = 2, dollars = 1}}, pos = {x=6,y=13}}, + j_mail= {order = 83, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Mail-In Rebate",set = "Joker", config = {extra = 3}, pos = {x=7,y=13}}, + j_to_the_moon= {order = 84, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 5, name = "To the Moon",set = "Joker", config = {extra = 1}, pos = {x=8,y=13}}, + j_hallucination= {order = 85, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Hallucination",set = "Joker", config = {extra = 2}, pos = {x=9,y=13}}, + j_fortune_teller= {order = 86, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 6, name = "Fortune Teller", pos = {x=7,y=5}, set = "Joker", effect = "", config = {extra = 1}}, + j_juggler= {order = 87, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 1, cost = 4, name = "Juggler", pos = {x=0,y=1}, set = "Joker", effect = "Hand Size", cost_mult = 1.0, config = {h_size = 1}}, + j_drunkard= {order = 88, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 1, cost = 4, name = "Drunkard", pos = {x=1,y=1}, set = "Joker", effect = "Discard Size", cost_mult = 1.0, config = {d_size = 1}}, + j_stone= {order = 89, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Stone Joker", pos = {x=9,y=0}, set = "Joker", effect = "Stone Card Buff", cost_mult = 1.0, config = {extra = 25}, enhancement_gate = 'm_stone'}, + j_golden= {order = 90, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 1, cost = 6, name = "Golden Joker", pos = {x=9,y=2}, set = "Joker", effect = "Bonus dollars", cost_mult = 1.0, config = {extra = 4}}, + + j_lucky_cat= {order = 91, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Lucky Cat",set = "Joker", config = {Xmult = 1, extra = 0.2}, pos = {x=5,y=14}, enhancement_gate = 'm_lucky'}, + j_baseball= {order = 92, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Baseball Card",set = "Joker", config = {extra = 1.5}, pos = {x=6,y=14}}, + j_bull= {order = 93, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Bull",set = "Joker", config = {extra = 2}, pos = {x=7,y=14}}, + j_diet_cola= {order = 94, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = false, rarity = 2, cost = 6, name = "Diet Cola",set = "Joker", config = {}, pos = {x=8,y=14}}, + j_trading= {order = 95, unlocked = true, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 5, name = "Trading Card",set = "Joker", config = {extra = 3}, pos = {x=9,y=14}}, + j_flash= {order = 96, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = "Flash Card",set = "Joker", config = {extra = 2, mult = 0}, pos = {x=0,y=15}}, + j_popcorn= {order = 97, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = false, rarity = 1, cost = 5, name = "Popcorn",set = "Joker", config = {mult = 20, extra = 4}, pos = {x=1,y=15}}, + j_trousers= {order = 98, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Spare Trousers",set = "Joker", config = {extra = 2}, pos = {x=4,y=15}}, + j_ancient= {order = 99, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Ancient Joker",set = "Joker", config = {extra = 1.5}, pos = {x=7,y=15}}, + j_ramen= {order = 100, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = false, rarity = 2, cost = 6, name = "Ramen",set = "Joker", config = {Xmult = 2, extra = 0.01}, pos = {x=2,y=15}}, + j_walkie_talkie= {order = 101, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Walkie Talkie",set = "Joker", config = {extra = {chips = 10, mult = 4}}, pos = {x=8,y=15}}, + j_selzer= {order = 102, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = false, rarity = 2, cost = 6, name = "Seltzer",set = "Joker", config = {extra = 10}, pos = {x=3,y=15}}, + j_castle= {order = 103, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Castle",set = "Joker", config = {extra = {chips = 0, chip_mod = 3}}, pos = {x=9,y=15}}, + j_smiley= {order = 104, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Smiley Face",set = "Joker", config = {extra = 4}, pos = {x=6,y=15}}, + j_campfire= {order = 105, unlocked = true, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 9, name = "Campfire",set = "Joker", config = {extra = 0.5}, pos = {x=5,y=15}}, + + j_ticket= {order = 106, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Golden Ticket", pos = {x=5,y=3}, set = "Joker", effect = "dollars for Gold cards", cost_mult = 1.0, config = {extra = 3},unlock_condition = {type = 'hand_contents', extra = 'Gold'}, enhancement_gate = 'm_gold'}, + j_mr_bones= {order = 107, unlocked = false, discovered = false, blueprint_compat = false, eternal_compat = false, rarity = 2, cost = 5, name = "Mr. Bones", pos = {x=3,y=4}, set = "Joker", effect = "Prevent Death", cost_mult = 1.0, config = {},unlock_condition = {type = 'c_losses', extra = 5}}, + j_acrobat= {order = 108, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Acrobat", pos = {x=2,y=1}, set = "Joker", effect = "Shop size", cost_mult = 1.0, config = {extra = 3},unlock_condition = {type = 'c_hands_played', extra = 200}}, + j_sock_and_buskin= {order = 109, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Sock and Buskin", pos = {x=3,y=1}, set = "Joker", effect = "Face card double", cost_mult = 1.0, config = {extra = 1},unlock_condition = {type = 'c_face_cards_played', extra = 300}}, + j_swashbuckler= {order = 110, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Swashbuckler", pos = {x=9,y=5}, set = "Joker", effect = "Set Mult", cost_mult = 1.0, config = {mult = 1},unlock_condition = {type = 'c_jokers_sold', extra = 20}}, + j_troubadour= {order = 111, unlocked = false, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Troubadour", pos = {x=0,y=2}, set = "Joker", effect = "Hand Size, Plays", cost_mult = 1.0, config = {extra = {h_size = 2, h_plays = -1}}, unlock_condition = {type = 'round_win', extra = 5}}, + j_certificate= {order = 112, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Certificate", pos = {x=8,y=8}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'double_gold'}}, + j_smeared= {order = 113, unlocked = false, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 7, name = "Smeared Joker", pos = {x=4,y=6}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'modify_deck', extra = {count = 3, enhancement = 'Wild Card', e_key = 'm_wild'}}}, + j_throwback= {order = 114, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Throwback", pos = {x=5,y=7}, set = "Joker", effect = "", config = {extra = 0.25}, unlock_condition = {type = 'continue_game'}}, + j_hanging_chad= {order = 115, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Hanging Chad", pos = {x=9,y=6}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = 'round_win', extra = 'High Card'}}, + j_rough_gem= {order = 116, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Rough Gem", pos = {x=9,y=7}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = 'modify_deck', extra = {count = 30, suit = 'Diamonds'}}}, + j_bloodstone= {order = 117, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Bloodstone", pos = {x=0,y=8}, set = "Joker", effect = "", config = {extra = {odds = 3, Xmult = 2}}, unlock_condition = {type = 'modify_deck', extra = {count = 30, suit = 'Hearts'}}}, + j_arrowhead= {order = 118, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Arrowhead", pos = {x=1,y=8}, set = "Joker", effect = "", config = {extra = 50}, unlock_condition = {type = 'modify_deck', extra = {count = 30, suit = 'Spades'}}}, + j_onyx_agate= {order = 119, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Onyx Agate", pos = {x=2,y=8}, set = "Joker", effect = "", config = {extra = 8}, unlock_condition = {type = 'modify_deck', extra = {count = 30, suit = 'Clubs'}}}, + j_glass= {order = 120, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Glass Joker", pos = {x=1,y=3}, set = "Joker", effect = "Glass Card", cost_mult = 1.0, config = {extra = 0.5, Xmult = 1}, unlock_condition = {type = 'modify_deck', extra = {count = 5, enhancement = 'Glass Card', e_key = 'm_glass'}}, enhancement_gate = 'm_glass'}, + + j_ring_master= {order = 121, unlocked = false, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 5, name = "Showman", pos = {x=6,y=5}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'ante_up', ante = 4}}, + j_flower_pot= {order = 122, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Flower Pot", pos = {x=0,y=6}, set = "Joker", effect = "", config = {extra = 3}, unlock_condition = {type = 'ante_up', ante = 8}}, + j_blueprint= {order = 123, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 10,name = "Blueprint", pos = {x=0,y=3}, set = "Joker", effect = "Copycat", cost_mult = 1.0, config = {},unlock_condition = {type = 'win_custom'}}, + j_wee= {order = 124, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Wee Joker", pos = {x=0,y=0}, set = "Joker", effect = "", config = {extra = {chips = 10, chip_mod = 8}}, unlock_condition = {type = 'win', n_rounds = 18}}, + j_merry_andy= {order = 125, unlocked = false, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 7, name = "Merry Andy", pos = {x=8,y=0}, set = "Joker", effect = "", cost_mult = 1.0, config = {d_size = 3, h_size = -1}, unlock_condition = {type = 'win', n_rounds = 12}}, + j_oops= {order = 126, unlocked = false, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 4, name = "Oops! All 6s", pos = {x=5,y=6}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'chip_score', chips = 10000}}, + j_idol= {order = 127, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "The Idol", pos = {x=6,y=7}, set = "Joker", effect = "", config = {extra = 2}, unlock_condition = {type = 'chip_score', chips = 1000000}}, + j_seeing_double= {order = 128, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Seeing Double", pos = {x=4,y=4}, set = "Joker", effect = "X1.5 Mult club 7", cost_mult = 1.0, config = {extra = 2},unlock_condition = {type = 'hand_contents', extra = 'four 7 of Clubs'}}, + j_matador= {order = 129, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Matador", pos = {x=4,y=5}, set = "Joker", effect = "", config = {extra = 8}, unlock_condition = {type = 'round_win'}}, + j_hit_the_road= {order = 130, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Hit the Road", pos = {x=8,y=5}, set = "Joker", effect = "Jack Discard Effect", cost_mult = 1.0, config = {extra = 0.5}, unlock_condition = {type = 'discard_custom'}}, + j_duo= {order = 131, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "The Duo", pos = {x=5,y=4}, set = "Joker", effect = "X1.5 Mult", cost_mult = 1.0, config = {Xmult = 2, type = 'Pair'}, unlock_condition = {type = 'win_no_hand', extra = 'Pair'}}, + j_trio= {order = 132, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "The Trio", pos = {x=6,y=4}, set = "Joker", effect = "X2 Mult", cost_mult = 1.0, config = {Xmult = 3, type = 'Three of a Kind'}, unlock_condition = {type = 'win_no_hand', extra = 'Three of a Kind'}}, + j_family= {order = 133, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "The Family", pos = {x=7,y=4}, set = "Joker", effect = "X3 Mult", cost_mult = 1.0, config = {Xmult = 4, type = 'Four of a Kind'}, unlock_condition = {type = 'win_no_hand', extra = 'Four of a Kind'}}, + j_order= {order = 134, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "The Order", pos = {x=8,y=4}, set = "Joker", effect = "X3 Mult", cost_mult = 1.0, config = {Xmult = 3, type = 'Straight'}, unlock_condition = {type = 'win_no_hand', extra = 'Straight'}}, + j_tribe= {order = 135, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "The Tribe", pos = {x=9,y=4}, set = "Joker", effect = "X3 Mult", cost_mult = 1.0, config = {Xmult = 2, type = 'Flush'}, unlock_condition = {type = 'win_no_hand', extra = 'Flush'}}, + + j_stuntman= {order = 136, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Stuntman", pos = {x=8,y=6}, set = "Joker", effect = "", config = {extra = {h_size = 2, chip_mod = 300}}, unlock_condition = {type = 'chip_score', chips = 100000000}}, + j_invisible= {order = 137, unlocked = false, discovered = false, blueprint_compat = false, eternal_compat = false, rarity = 3, cost = 10, name = "Invisible Joker", pos = {x=1,y=7}, set = "Joker", effect = "", config = {extra = 3}, unlock_condition = {type = 'win_custom'}}, + j_brainstorm= {order = 138, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 10, name = "Brainstorm", pos = {x=7,y=7}, set = "Joker", effect = "Copycat", config = {}, unlock_condition = {type = 'discard_custom'}}, + j_satellite= {order = 139, unlocked = false, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Satellite", pos = {x=8,y=7}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = 'money', extra = 400}}, + j_shoot_the_moon= {order = 140, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 1, cost = 5, name = "Shoot the Moon", pos = {x=2,y=6}, set = "Joker", effect = "", config = {extra = 13}, unlock_condition = {type = 'play_all_hearts'}}, + j_drivers_license= {order = 141, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 3, cost = 7, name = "Driver's License", pos = {x=0,y=7}, set = "Joker", effect = "", config = {extra = 3}, unlock_condition = {type = 'modify_deck', extra = {count = 16, tally = 'total'}}}, + j_cartomancer= {order = 142, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Cartomancer", pos = {x=7,y=3}, set = "Joker", effect = "Tarot Buff", cost_mult = 1.0, config = {}, unlock_condition = {type = 'discover_amount', tarot_count = 22}}, + j_astronomer= {order = 143, unlocked = false, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 2, cost = 8, name = "Astronomer", pos = {x=2,y=7}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'discover_amount', planet_count = 12}}, + j_burnt= {order = 144, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Burnt Joker", pos = {x=3,y=7}, set = "Joker", effect = "", config = {h_size = 0, extra = 4}, unlock_condition = {type = 'c_cards_sold', extra = 50}}, + j_bootstraps= {order = 145, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Bootstraps", pos = {x=9,y=8}, set = "Joker", effect = "", config = {extra = {mult = 2, dollars = 5}}, unlock_condition = {type = 'modify_jokers', extra = {polychrome = true, count = 2}}}, + j_caino= {order = 146, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 4, cost = 20, name = "Caino", pos = {x=3,y=8}, soul_pos = {x=3, y=9}, set = "Joker", effect = "", config = {extra = 1}, unlock_condition = {type = '', extra = '', hidden = true}}, + j_triboulet= {order = 147, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 4, cost = 20, name = "Triboulet", pos = {x=4,y=8}, soul_pos = {x=4, y=9}, set = "Joker", effect = "", config = {extra = 2}, unlock_condition = {type = '', extra = '', hidden = true}}, + j_yorick= {order = 148, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 4, cost = 20, name = "Yorick", pos = {x=5,y=8}, soul_pos = {x=5, y=9}, set = "Joker", effect = "", config = {extra = {xmult = 5, discards = 23}}, unlock_condition = {type = '', extra = '', hidden = true}}, + j_chicot= {order = 149, unlocked = false, discovered = false, blueprint_compat = false, eternal_compat = true, rarity = 4, cost = 20, name = "Chicot", pos = {x=6,y=8}, soul_pos = {x=6, y=9}, set = "Joker", effect = "", config = {}, unlock_condition = {type = '', extra = '', hidden = true}}, + j_perkeo= {order = 150, unlocked = false, discovered = false, blueprint_compat = true, eternal_compat = true, rarity = 4, cost = 20, name = "Perkeo", pos = {x=7,y=8}, soul_pos = {x=7, y=9}, set = "Joker", effect = "", config = {}, unlock_condition = {type = '', extra = '', hidden = true}}, + + + + --All Consumeables + + --Tarots + c_fool= {order = 1, discovered = false, cost = 3, consumeable = true, name = "The Fool", pos = {x=0,y=0}, set = "Tarot", effect = "Disable Blind Effect", cost_mult = 1.0, config = {}}, + c_magician= {order = 2, discovered = false, cost = 3, consumeable = true, name = "The Magician", pos = {x=1,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_lucky', max_highlighted = 1}}, + c_high_priestess= {order = 3, discovered = false, cost = 3, consumeable = true, name = "The High Priestess", pos = {x=2,y=0}, set = "Tarot", effect = "Round Bonus", cost_mult = 1.0, config = {planets = 2}}, + c_empress= {order = 4, discovered = false, cost = 3, consumeable = true, name = "The Empress", pos = {x=3,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_mult', max_highlighted = 2}}, + c_emperor= {order = 5, discovered = false, cost = 3, consumeable = true, name = "The Emperor", pos = {x=4,y=0}, set = "Tarot", effect = "Round Bonus", cost_mult = 1.0, config = {tarots = 2}}, + c_heirophant= {order = 6, discovered = false, cost = 3, consumeable = true, name = "The Hierophant", pos = {x=5,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_bonus', max_highlighted = 2}}, + c_lovers= {order = 7, discovered = false, cost = 3, consumeable = true, name = "The Lovers", pos = {x=6,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_wild', max_highlighted = 1}}, + c_chariot= {order = 8, discovered = false, cost = 3, consumeable = true, name = "The Chariot", pos = {x=7,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_steel', max_highlighted = 1}}, + c_justice= {order = 9, discovered = false, cost = 3, consumeable = true, name = "Justice", pos = {x=8,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_glass', max_highlighted = 1}}, + c_hermit= {order = 10, discovered = false, cost = 3, consumeable = true, name = "The Hermit", pos = {x=9,y=0}, set = "Tarot", effect = "Dollar Doubler", cost_mult = 1.0, config = {extra = 20}}, + c_wheel_of_fortune= {order = 11, discovered = false, cost = 3, consumeable = true, name = "The Wheel of Fortune", pos = {x=0,y=1}, set = "Tarot", effect = "Round Bonus", cost_mult = 1.0, config = {extra = 4}}, + c_strength= {order = 12, discovered = false, cost = 3, consumeable = true, name = "Strength", pos = {x=1,y=1}, set = "Tarot", effect = "Round Bonus", cost_mult = 1.0, config = {mod_conv = 'up_rank', max_highlighted = 2}}, + c_hanged_man= {order = 13, discovered = false, cost = 3, consumeable = true, name = "The Hanged Man", pos = {x=2,y=1}, set = "Tarot", effect = "Card Removal", cost_mult = 1.0, config = {remove_card = true, max_highlighted = 2}}, + c_death= {order = 14, discovered = false, cost = 3, consumeable = true, name = "Death", pos = {x=3,y=1}, set = "Tarot", effect = "Card Conversion", cost_mult = 1.0, config = {mod_conv = 'card', max_highlighted = 2, min_highlighted = 2}}, + c_temperance= {order = 15, discovered = false, cost = 3, consumeable = true, name = "Temperance", pos = {x=4,y=1}, set = "Tarot", effect = "Joker Payout", cost_mult = 1.0, config = {extra = 50}}, + c_devil= {order = 16, discovered = false, cost = 3, consumeable = true, name = "The Devil", pos = {x=5,y=1}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_gold', max_highlighted = 1}}, + c_tower= {order = 17, discovered = false, cost = 3, consumeable = true, name = "The Tower", pos = {x=6,y=1}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_stone', max_highlighted = 1}}, + c_star= {order = 18, discovered = false, cost = 3, consumeable = true, name = "The Star", pos = {x=7,y=1}, set = "Tarot", effect = "Suit Conversion", cost_mult = 1.0, config = {suit_conv = 'Diamonds', max_highlighted = 3}}, + c_moon= {order = 19, discovered = false, cost = 3, consumeable = true, name = "The Moon", pos = {x=8,y=1}, set = "Tarot", effect = "Suit Conversion", cost_mult = 1.0, config = {suit_conv = 'Clubs', max_highlighted = 3}}, + c_sun= {order = 20, discovered = false, cost = 3, consumeable = true, name = "The Sun", pos = {x=9,y=1}, set = "Tarot", effect = "Suit Conversion", cost_mult = 1.0, config = {suit_conv = 'Hearts', max_highlighted = 3}}, + c_judgement= {order = 21, discovered = false, cost = 3, consumeable = true, name = "Judgement", pos = {x=0,y=2}, set = "Tarot", effect = "Random Joker", cost_mult = 1.0, config = {}}, + c_world= {order = 22, discovered = false, cost = 3, consumeable = true, name = "The World", pos = {x=1,y=2}, set = "Tarot", effect = "Suit Conversion", cost_mult = 1.0, config = {suit_conv = 'Spades', max_highlighted = 3}}, + + --Planets + c_mercury= {order = 1, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Mercury", pos = {x=0,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Pair'}}, + c_venus= {order = 2, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Venus", pos = {x=1,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Three of a Kind'}}, + c_earth= {order = 3, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Earth", pos = {x=2,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Full House'}}, + c_mars= {order = 4, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Mars", pos = {x=3,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Four of a Kind'}}, + c_jupiter= {order = 5, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Jupiter", pos = {x=4,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Flush'}}, + c_saturn= {order = 6, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Saturn", pos = {x=5,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Straight'}}, + c_uranus= {order = 7, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Uranus", pos = {x=6,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Two Pair'}}, + c_neptune= {order = 8, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Neptune", pos = {x=7,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Straight Flush'}}, + c_pluto= {order = 9, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Pluto", pos = {x=8,y=3}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'High Card'}}, + c_planet_x= {order = 10, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Planet X", pos = {x=9,y=2}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Five of a Kind', softlock = true}}, + c_ceres= {order = 11, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Ceres", pos = {x=8,y=2}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Flush House', softlock = true}}, + c_eris= {order = 12, discovered = false, cost = 3, consumeable = true, freq = 1, name = "Eris", pos = {x=3,y=2}, set = "Planet", effect = "Hand Upgrade", cost_mult = 1.0, config = {hand_type = 'Flush Five', softlock = true}}, + + --Spectral + c_familiar= {order = 1, discovered = false, cost = 4, consumeable = true, name = "Familiar", pos = {x=0,y=4}, set = "Spectral", config = {remove_card = true, extra = 3}}, + c_grim= {order = 2, discovered = false, cost = 4, consumeable = true, name = "Grim", pos = {x=1,y=4}, set = "Spectral", config = {remove_card = true, extra = 2}}, + c_incantation= {order = 3, discovered = false, cost = 4, consumeable = true, name = "Incantation", pos = {x=2,y=4}, set = "Spectral", config = {remove_card = true, extra = 4}}, + c_talisman= {order = 4, discovered = false, cost = 4, consumeable = true, name = "Talisman", pos = {x=3,y=4}, set = "Spectral", config = {extra = 'Gold', max_highlighted = 1}}, + c_aura= {order = 5, discovered = false, cost = 4, consumeable = true, name = "Aura", pos = {x=4,y=4}, set = "Spectral", config = {}}, + c_wraith= {order = 6, discovered = false, cost = 4, consumeable = true, name = "Wraith", pos = {x=5,y=4}, set = "Spectral", config = {}}, + c_sigil= {order = 7, discovered = false, cost = 4, consumeable = true, name = "Sigil", pos = {x=6,y=4}, set = "Spectral", config = {}}, + c_ouija= {order = 8, discovered = false, cost = 4, consumeable = true, name = "Ouija", pos = {x=7,y=4}, set = "Spectral", config = {}}, + c_ectoplasm= {order = 9, discovered = false, cost = 4, consumeable = true, name = "Ectoplasm", pos = {x=8,y=4}, set = "Spectral", config = {}}, + c_immolate= {order = 10, discovered = false, cost = 4, consumeable = true, name = "Immolate", pos = {x=9,y=4}, set = "Spectral", config = {remove_card = true, extra = {destroy = 5, dollars = 20}}}, + c_ankh= {order = 11, discovered = false, cost = 4, consumeable = true, name = "Ankh", pos = {x=0,y=5}, set = "Spectral", config = {extra = 2}}, + c_deja_vu= {order = 12, discovered = false, cost = 4, consumeable = true, name = "Deja Vu", pos = {x=1,y=5}, set = "Spectral", config = {extra = 'Red', max_highlighted = 1}}, + c_hex= {order = 13, discovered = false, cost = 4, consumeable = true, name = "Hex", pos = {x=2,y=5}, set = "Spectral", config = {extra = 2}}, + c_trance= {order = 14, discovered = false, cost = 4, consumeable = true, name = "Trance", pos = {x=3,y=5}, set = "Spectral", config = {extra = 'Blue', max_highlighted = 1}}, + c_medium= {order = 15, discovered = false, cost = 4, consumeable = true, name = "Medium", pos = {x=4,y=5}, set = "Spectral", config = {extra = 'Purple', max_highlighted = 1}}, + c_cryptid= {order = 16, discovered = false, cost = 4, consumeable = true, name = "Cryptid", pos = {x=5,y=5}, set = "Spectral", config = {extra = 2, max_highlighted = 1}}, + c_soul= {order = 17, discovered = false, cost = 4, consumeable = true, name = "The Soul", pos = {x=2,y=2}, set = "Spectral", effect = "Unlocker", config = {}, hidden = true}, + c_black_hole= {order = 18, discovered = false, cost = 4, consumeable = true, name = "Black Hole", pos = {x=9,y=3}, set = "Spectral", config = {}, hidden = true}, + + --Vouchers + + v_overstock_norm = {order = 1, discovered = false, unlocked = true , available = true, cost = 10, name = "Overstock", pos = {x=0,y=0}, set = "Voucher", config = {}}, + v_clearance_sale= {order = 3, discovered = false, unlocked = true , available = true, cost = 10, name = "Clearance Sale", pos = {x=3,y=0}, set = "Voucher", config = {extra = 25}}, + v_hone= {order = 5, discovered = false, unlocked = true , available = true, cost = 10, name = "Hone", pos = {x=4,y=0}, set = "Voucher", config = {extra = 2}}, + v_reroll_surplus= {order = 7, discovered = false, unlocked = true , available = true, cost = 10, name = "Reroll Surplus", pos = {x=0,y=2}, set = "Voucher", config = {extra = 2}}, + v_crystal_ball= {order = 9, discovered = false, unlocked = true , available = true, cost = 10, name = "Crystal Ball", pos = {x=2,y=2}, set = "Voucher", config = {extra = 3}}, + v_telescope= {order = 11, discovered = false, unlocked = true , available = true, cost = 10, name = "Telescope", pos = {x=3,y=2}, set = "Voucher", config = {extra = 3}}, + v_grabber= {order = 13, discovered = false, unlocked = true , available = true, cost = 10, name = "Grabber", pos = {x=5,y=0}, set = "Voucher", config = {extra = 1}}, + v_wasteful= {order = 15, discovered = false, unlocked = true , available = true, cost = 10, name = "Wasteful", pos = {x=6,y=0}, set = "Voucher", config = {extra = 1}}, + v_tarot_merchant= {order = 17, discovered = false, unlocked = true , available = true, cost = 10, name = "Tarot Merchant", pos = {x=1,y=0}, set = "Voucher", config = {extra = 9.6/4, extra_disp = 2}}, + v_planet_merchant= {order = 19, discovered = false, unlocked = true , available = true, cost = 10, name = "Planet Merchant", pos = {x=2,y=0}, set = "Voucher", config = {extra = 9.6/4, extra_disp = 2}}, + v_seed_money= {order = 21, discovered = false, unlocked = true , available = true, cost = 10, name = "Seed Money", pos = {x=1,y=2}, set = "Voucher", config = {extra = 50}}, + v_blank= {order = 23, discovered = false, unlocked = true , available = true, cost = 10, name = "Blank", pos = {x=7,y=0}, set = "Voucher", config = {extra = 5}}, + v_magic_trick= {order = 25, discovered = false, unlocked = true , available = true, cost = 10, name = "Magic Trick", pos = {x=4,y=2}, set = "Voucher", config = {extra = 4}}, + v_hieroglyph= {order = 27, discovered = false, unlocked = true , available = true, cost = 10, name = "Hieroglyph", pos = {x=5,y=2}, set = "Voucher", config = {extra = 1}}, + v_directors_cut= {order = 29, discovered = false, unlocked = true , available = true, cost = 10, name = "Director's Cut", pos = {x=6,y=2}, set = "Voucher", config = {extra = 10}}, + v_paint_brush= {order = 31, discovered = false, unlocked = true , available = true, cost = 10, name = "Paint Brush", pos = {x=7,y=2}, set = "Voucher", config = {extra = 1}}, + + v_overstock_plus= {order = 2, discovered = false, unlocked = false, available = true, cost = 10, name = "Overstock Plus", pos = {x=0,y=1}, set = "Voucher", config = {}, requires = {'v_overstock_norm'},unlock_condition = {type = 'c_shop_dollars_spent', extra = 2500}}, + v_liquidation= {order = 4, discovered = false, unlocked = false, available = true, cost = 10, name = "Liquidation", pos = {x=3,y=1}, set = "Voucher", config = {extra = 50}, requires = {'v_clearance_sale'},unlock_condition = {type = 'run_redeem', extra = 10}}, + v_glow_up= {order = 6, discovered = false, unlocked = false, available = true, cost = 10, name = "Glow Up", pos = {x=4,y=1}, set = "Voucher", config = {extra = 4}, requires = {'v_hone'},unlock_condition = {type = 'have_edition', extra = 5}}, + v_reroll_glut= {order = 8, discovered = false, unlocked = false, available = true, cost = 10, name = "Reroll Glut", pos = {x=0,y=3}, set = "Voucher", config = {extra = 2}, requires = {'v_reroll_surplus'},unlock_condition = {type = 'c_shop_rerolls', extra = 100}}, + v_omen_globe= {order = 10, discovered = false, unlocked = false, available = true, cost = 10, name = "Omen Globe", pos = {x=2,y=3}, set = "Voucher", config = {extra = 4}, requires = {'v_crystal_ball'},unlock_condition = {type = 'c_tarot_reading_used', extra = 25}}, + v_observatory= {order = 12, discovered = false, unlocked = false, available = true, cost = 10, name = "Observatory", pos = {x=3,y=3}, set = "Voucher", config = {extra = 1.5}, requires = {'v_telescope'},unlock_condition = {type = 'c_planetarium_used', extra = 25}}, + v_nacho_tong= {order = 14, discovered = false, unlocked = false, available = true, cost = 10, name = "Nacho Tong", pos = {x=5,y=1}, set = "Voucher", config = {extra = 1}, requires = {'v_grabber'},unlock_condition = {type = 'c_cards_played', extra = 2500}}, + v_recyclomancy= {order = 16, discovered = false, unlocked = false, available = true, cost = 10, name = "Recyclomancy", pos = {x=6,y=1}, set = "Voucher", config = {extra = 1}, requires = {'v_wasteful'},unlock_condition = {type = 'c_cards_discarded', extra = 2500}}, + v_tarot_tycoon= {order = 18, discovered = false, unlocked = false, available = true,cost = 10, name = "Tarot Tycoon", pos = {x=1,y=1}, set = "Voucher", config = {extra = 32/4, extra_disp = 4}, requires = {'v_tarot_merchant'},unlock_condition = {type = 'c_tarots_bought', extra = 50}}, + v_planet_tycoon= {order = 20, discovered = false, unlocked = false, available = true,cost = 10, name = "Planet Tycoon", pos = {x=2,y=1}, set = "Voucher", config = {extra = 32/4, extra_disp = 4}, requires = {'v_planet_merchant'},unlock_condition = {type = 'c_planets_bought', extra = 50}}, + v_money_tree= {order = 22, discovered = false, unlocked = false, available = true, cost = 10, name = "Money Tree", pos = {x=1,y=3}, set = "Voucher", config = {extra = 100}, requires = {'v_seed_money'},unlock_condition = {type = 'interest_streak', extra = 10}}, + v_antimatter= {order = 24, discovered = false, unlocked = false, available = true, cost = 10, name = "Antimatter", pos = {x=7,y=1}, set = "Voucher", config = {extra = 15}, requires = {'v_blank'},unlock_condition = {type = 'blank_redeems', extra = 10}}, + v_illusion= {order = 26, discovered = false, unlocked = false, available = true, cost = 10, name = "Illusion", pos = {x=4,y=3}, set = "Voucher", config = {extra = 4}, requires = {'v_magic_trick'},unlock_condition = {type = 'c_playing_cards_bought', extra = 20}}, + v_petroglyph= {order = 28, discovered = false, unlocked = false, available = true, cost = 10, name = "Petroglyph", pos = {x=5,y=3}, set = "Voucher", config = {extra = 1}, requires = {'v_hieroglyph'},unlock_condition = {type = 'ante_up', ante = 12, extra = 12}}, + v_retcon= {order = 30, discovered = false, unlocked = false, available = true, cost = 10, name = "Retcon", pos = {x=6,y=3}, set = "Voucher", config = {extra = 10}, requires = {'v_directors_cut'},unlock_condition = {type = 'blind_discoveries', extra = 25}}, + v_palette= {order = 32, discovered = false, unlocked = false, available = true, cost = 10, name = "Palette", pos = {x=7,y=3}, set = "Voucher", config = {extra = 1}, requires = {'v_paint_brush'},unlock_condition = {type = 'min_hand_size', extra = 5}}, + + --Backs + + b_red= {name = "Red Deck", stake = 1, unlocked = true,order = 1, pos = {x=0,y=0}, set = "Back", config = {discards = 1}, discovered = true}, + b_blue= {name = "Blue Deck", stake = 1, unlocked = false,order = 2, pos = {x=0,y=2}, set = "Back", config = {hands = 1}, unlock_condition = {type = 'discover_amount', amount = 20}}, + b_yellow= {name = "Yellow Deck", stake = 1, unlocked = false,order = 3, pos = {x=1,y=2}, set = "Back", config = {dollars = 10}, unlock_condition = {type = 'discover_amount', amount = 50}}, + b_green= {name = "Green Deck", stake = 1, unlocked = false,order = 4, pos = {x=2,y=2}, set = "Back", config = {extra_hand_bonus = 2, extra_discard_bonus = 1, no_interest = true}, unlock_condition = {type = 'discover_amount', amount = 75}}, + b_black= {name = "Black Deck", stake = 1, unlocked = false,order = 5, pos = {x=3,y=2}, set = "Back", config = {hands = -1, joker_slot = 1}, unlock_condition = {type = 'discover_amount', amount = 100}}, + b_magic= {name = "Magic Deck", stake = 1, unlocked = false,order = 6, pos = {x=0,y=3}, set = "Back", config = {voucher = 'v_crystal_ball', consumables = {'c_fool', 'c_fool'}}, unlock_condition = {type = 'win_deck', deck = 'b_red'}}, + b_nebula= {name = "Nebula Deck", stake = 1, unlocked = false,order = 7, pos = {x=3,y=0}, set = "Back", config = {voucher = 'v_telescope', consumable_slot = -1}, unlock_condition = {type = 'win_deck', deck = 'b_blue'}}, + b_ghost= {name = "Ghost Deck", stake = 1, unlocked = false,order = 8, pos = {x=6,y=2}, set = "Back", config = {spectral_rate = 2, consumables = {'c_hex'}}, unlock_condition = {type = 'win_deck', deck = 'b_yellow'}}, + b_abandoned= {name = "Abandoned Deck", stake = 1, unlocked = false,order = 9, pos = {x=3,y=3}, set = "Back", config = {remove_faces = true}, unlock_condition = {type = 'win_deck', deck = 'b_green'}}, + b_checkered= {name = "Checkered Deck", stake = 1, unlocked = false,order = 10,pos = {x=1,y=3}, set = "Back", config = {}, unlock_condition = {type = 'win_deck', deck = 'b_black'}}, + b_zodiac= {name = "Zodiac Deck", stake = 1, unlocked = false,order = 11, pos = {x=3,y=4}, set = "Back", config = {vouchers = {'v_tarot_merchant','v_planet_merchant', 'v_overstock_norm'}}, unlock_condition = {type = 'win_stake', stake = 2}}, + b_painted= {name = "Painted Deck", stake = 1, unlocked = false,order = 12, pos = {x=4,y=3}, set = "Back", config = {hand_size = 2, joker_slot = -1}, unlock_condition = {type = 'win_stake', stake=3}}, + b_anaglyph= {name = "Anaglyph Deck", stake = 1, unlocked = false,order = 13, pos = {x=2,y=4}, set = "Back", config = {}, unlock_condition = {type = 'win_stake', stake = 4}}, + b_plasma= {name = "Plasma Deck", stake = 1, unlocked = false,order = 14, pos = {x=4,y=2}, set = "Back", config = {ante_scaling = 2}, unlock_condition = {type = 'win_stake', stake=5}}, + b_erratic= {name = "Erratic Deck", stake = 1, unlocked = false,order = 15, pos = {x=2,y=3}, set = "Back", config = {randomize_rank_suit = true}, unlock_condition = {type = 'win_stake', stake=7}}, + + b_challenge= {name = "Challenge Deck", stake = 1, unlocked = true,order = 16, pos = {x=0,y=4}, set = "Back", config = {}, omit = true}, + + + --All enhanced card types here + m_bonus = {max = 500, order = 2, name = "Bonus", set = "Enhanced", pos = {x=1,y=1}, effect = "Bonus Card", label = "Bonus Card", config = {bonus=30}}, + m_mult = {max = 500, order = 3, name = "Mult", set = "Enhanced", pos = {x=2,y=1}, effect = "Mult Card", label = "Mult Card", config = {mult = 4}}, + m_wild = {max = 500, order = 4, name = "Wild Card", set = "Enhanced", pos = {x=3,y=1}, effect = "Wild Card", label = "Wild Card", config = {}}, + m_glass = {max = 500, order = 5, name = "Glass Card", set = "Enhanced", pos = {x=5,y=1}, effect = "Glass Card", label = "Glass Card", config = {Xmult = 2, extra = 4}}, + m_steel = {max = 500, order = 6, name = "Steel Card", set = "Enhanced", pos = {x=6,y=1}, effect = "Steel Card", label = "Steel Card", config = {h_x_mult = 1.5}}, + m_stone = {max = 500, order = 7, name = "Stone Card", set = "Enhanced", pos = {x=5,y=0}, effect = "Stone Card", label = "Stone Card", config = {bonus = 50}}, + m_gold = {max = 500, order = 8, name = "Gold Card", set = "Enhanced", pos = {x=6,y=0}, effect = "Gold Card", label = "Gold Card", config = {h_dollars = 3}}, + m_lucky = {max = 500, order = 9, name = "Lucky Card", set = "Enhanced", pos = {x=4,y=1}, effect = "Lucky Card", label = "Lucky Card", config = {mult=20, p_dollars = 20}}, + + --editions + e_base = {order = 1, unlocked = true, discovered = false, name = "Base", pos = {x=0,y=0}, atlas = 'Joker', set = "Edition", config = {}}, + e_foil = {order = 2, unlocked = true, discovered = false, name = "Foil", pos = {x=0,y=0}, atlas = 'Joker', set = "Edition", config = {extra = 50}}, + e_holo = {order = 3, unlocked = true, discovered = false, name = "Holographic", pos = {x=0,y=0}, atlas = 'Joker', set = "Edition", config = {extra = 10}}, + e_polychrome = {order = 4, unlocked = true, discovered = false, name = "Polychrome", pos = {x=0,y=0}, atlas = 'Joker', set = "Edition", config = {extra = 1.5}}, + e_negative = {order = 5, unlocked = true, discovered = false, name = "Negative", pos = {x=0,y=0}, atlas = 'Joker', set = "Edition", config = {extra = 1}}, + + --booster packs + p_arcana_normal_1 = {order = 1, discovered = false, name = "Arcana Pack", weight = 1, kind = 'Arcana', cost = 4, pos = {x=0,y=0}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_arcana_normal_2 = {order = 2, discovered = false, name = "Arcana Pack", weight = 1, kind = 'Arcana', cost = 4, pos = {x=1,y=0}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_arcana_normal_3 = {order = 3, discovered = false, name = "Arcana Pack", weight = 1, kind = 'Arcana', cost = 4, pos = {x=2,y=0}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_arcana_normal_4 = {order = 4, discovered = false, name = "Arcana Pack", weight = 1, kind = 'Arcana', cost = 4, pos = {x=3,y=0}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_arcana_jumbo_1 = {order = 5, discovered = false, name = "Jumbo Arcana Pack", weight = 1, kind = 'Arcana', cost = 6, pos = {x=0,y=2}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_arcana_jumbo_2 = {order = 6, discovered = false, name = "Jumbo Arcana Pack", weight = 1, kind = 'Arcana', cost = 6, pos = {x=1,y=2}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_arcana_mega_1 = {order = 7, discovered = false, name = "Mega Arcana Pack", weight = 0.25, kind = 'Arcana', cost = 8, pos = {x=2,y=2}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_arcana_mega_2 = {order = 8, discovered = false, name = "Mega Arcana Pack", weight = 0.25, kind = 'Arcana', cost = 8, pos = {x=3,y=2}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_celestial_normal_1 = {order = 9, discovered = false, name = "Celestial Pack", weight = 1, kind = 'Celestial', cost = 4, pos = {x=0,y=1}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_celestial_normal_2 = {order = 10, discovered = false, name = "Celestial Pack", weight = 1, kind = 'Celestial', cost = 4, pos = {x=1,y=1}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_celestial_normal_3 = {order = 11, discovered = false, name = "Celestial Pack", weight = 1, kind = 'Celestial', cost = 4, pos = {x=2,y=1}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_celestial_normal_4 = {order = 12, discovered = false, name = "Celestial Pack", weight = 1, kind = 'Celestial', cost = 4, pos = {x=3,y=1}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_celestial_jumbo_1 = {order = 13, discovered = false, name = "Jumbo Celestial Pack", weight = 1, kind = 'Celestial', cost = 6, pos = {x=0,y=3}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_celestial_jumbo_2 = {order = 14, discovered = false, name = "Jumbo Celestial Pack", weight = 1, kind = 'Celestial', cost = 6, pos = {x=1,y=3}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_celestial_mega_1 = {order = 15, discovered = false, name = "Mega Celestial Pack", weight = 0.25, kind = 'Celestial', cost = 8, pos = {x=2,y=3}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_celestial_mega_2 = {order = 16, discovered = false, name = "Mega Celestial Pack", weight = 0.25, kind = 'Celestial', cost = 8, pos = {x=3,y=3}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_spectral_normal_1 = {order = 29, discovered = false, name = "Spectral Pack", weight = 0.3, kind = 'Spectral', cost = 4, pos = {x=0,y=4}, atlas = 'Booster', set = 'Booster', config = {extra = 2, choose = 1}}, + p_spectral_normal_2 = {order = 30, discovered = false, name = "Spectral Pack", weight = 0.3, kind = 'Spectral', cost = 4, pos = {x=1,y=4}, atlas = 'Booster', set = 'Booster', config = {extra = 2, choose = 1}}, + p_spectral_jumbo_1 = {order = 31, discovered = false, name = "Jumbo Spectral Pack", weight = 0.3, kind = 'Spectral', cost = 6, pos = {x=2,y=4}, atlas = 'Booster', set = 'Booster', config = {extra = 4, choose = 1}}, + p_spectral_mega_1 = {order = 32, discovered = false, name = "Mega Spectral Pack", weight = 0.07, kind = 'Spectral', cost = 8, pos = {x=3,y=4}, atlas = 'Booster', set = 'Booster', config = {extra = 4, choose = 2}}, + p_standard_normal_1 = {order = 17, discovered = false, name = "Standard Pack", weight = 1, kind = 'Standard', cost = 4, pos = {x=0,y=6}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_standard_normal_2 = {order = 18, discovered = false, name = "Standard Pack", weight = 1, kind = 'Standard', cost = 4, pos = {x=1,y=6}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_standard_normal_3 = {order = 19, discovered = false, name = "Standard Pack", weight = 1, kind = 'Standard', cost = 4, pos = {x=2,y=6}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_standard_normal_4 = {order = 20, discovered = false, name = "Standard Pack", weight = 1, kind = 'Standard', cost = 4, pos = {x=3,y=6}, atlas = 'Booster', set = 'Booster', config = {extra = 3, choose = 1}}, + p_standard_jumbo_1 = {order = 21, discovered = false, name = "Jumbo Standard Pack", weight = 1, kind = 'Standard', cost = 6, pos = {x=0,y=7}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_standard_jumbo_2 = {order = 22, discovered = false, name = "Jumbo Standard Pack", weight = 1, kind = 'Standard', cost = 6, pos = {x=1,y=7}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 1}}, + p_standard_mega_1 = {order = 23, discovered = false, name = "Mega Standard Pack", weight = 0.25, kind = 'Standard', cost = 8, pos = {x=2,y=7}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_standard_mega_2 = {order = 24, discovered = false, name = "Mega Standard Pack", weight = 0.25, kind = 'Standard', cost = 8, pos = {x=3,y=7}, atlas = 'Booster', set = 'Booster', config = {extra = 5, choose = 2}}, + p_buffoon_normal_1 = {order = 25, discovered = false, name = "Buffoon Pack", weight = 0.6, kind = 'Buffoon', cost = 4, pos = {x=0,y=8}, atlas = 'Booster', set = 'Booster', config = {extra = 2, choose = 1}}, + p_buffoon_normal_2 = {order = 26, discovered = false, name = "Buffoon Pack", weight = 0.6, kind = 'Buffoon', cost = 4, pos = {x=1,y=8}, atlas = 'Booster', set = 'Booster', config = {extra = 2, choose = 1}}, + p_buffoon_jumbo_1 = {order = 27, discovered = false, name = "Jumbo Buffoon Pack", weight = 0.6, kind = 'Buffoon', cost = 6, pos = {x=2,y=8}, atlas = 'Booster', set = 'Booster', config = {extra = 4, choose = 1}}, + p_buffoon_mega_1 = {order = 28, discovered = false, name = "Mega Buffoon Pack", weight = 0.15, kind = 'Buffoon', cost = 8, pos = {x=3,y=8}, atlas = 'Booster', set = 'Booster', config = {extra = 4, choose = 2}}, + + --Extras + soul={pos = {x=0,y=1}}, + undiscovered_joker={pos = {x=5,y=3}}, + undiscovered_tarot={pos = {x=6,y=3}}, + } + + self.P_CENTER_POOLS = { + Booster = {}, + Default = {}, + Enhanced = {}, + Edition = {}, + Joker = {}, + Tarot = {}, + Planet = {}, + Tarot_Planet = {}, + Spectral = {}, + Consumeables = {}, + Voucher = {}, + Back = {}, + Tag = {}, + Seal = {}, + Stake = {}, + Demo = {} + } + + self.P_JOKER_RARITY_POOLS = { + {},{},{},{} + } + + self.P_LOCKED = {} + + self:save_progress() + + + ------------------------------------- + local TESTHELPER_unlocks = false and not _RELEASE_MODE + ------------------------------------- + if not love.filesystem.getInfo(G.SETTINGS.profile..'') then love.filesystem.createDirectory( G.SETTINGS.profile..'' ) end + if not love.filesystem.getInfo(G.SETTINGS.profile..'/'..'meta.jkr') then love.filesystem.append( G.SETTINGS.profile..'/'..'meta.jkr', 'return {}') end + + convert_save_to_meta() + + local meta = STR_UNPACK(get_compressed(G.SETTINGS.profile..'/'..'meta.jkr') or 'return {}') + meta.unlocked = meta.unlocked or {} + meta.discovered = meta.discovered or {} + meta.alerted = meta.alerted or {} + + for k, v in pairs(self.P_CENTERS) do + if not v.wip and not v.demo then + if TESTHELPER_unlocks then v.unlocked = true; v.discovered = true;v.alerted = true end --REMOVE THIS + if not v.unlocked and (string.find(k, '^j_') or string.find(k, '^b_') or string.find(k, '^v_')) and meta.unlocked[k] then + v.unlocked = true + end + if not v.unlocked and (string.find(k, '^j_') or string.find(k, '^b_') or string.find(k, '^v_')) then self.P_LOCKED[#self.P_LOCKED+1] = v end + if not v.discovered and (string.find(k, '^j_') or string.find(k, '^b_') or string.find(k, '^e_') or string.find(k, '^c_') or string.find(k, '^p_') or string.find(k, '^v_')) and meta.discovered[k] then + v.discovered = true + end + if v.discovered and meta.alerted[k] or v.set == 'Back' or v.start_alerted then + v.alerted = true + elseif v.discovered then + v.alerted = false + end + end + end + + table.sort(self.P_LOCKED, function (a, b) return not a.order or not b.order or a.order < b.order end) + + for k, v in pairs(self.P_BLINDS) do + v.key = k + if not v.wip and not v.demo then + if TESTHELPER_unlocks then v.discovered = true; v.alerted = true end --REMOVE THIS + if not v.discovered and meta.discovered[k] then + v.discovered = true + end + if v.discovered and meta.alerted[k] then + v.alerted = true + elseif v.discovered then + v.alerted = false + end + end + end + for k, v in pairs(self.P_TAGS) do + v.key = k + if not v.wip and not v.demo then + if TESTHELPER_unlocks then v.discovered = true; v.alerted = true end --REMOVE THIS + if not v.discovered and meta.discovered[k] then + v.discovered = true + end + if v.discovered and meta.alerted[k] then + v.alerted = true + elseif v.discovered then + v.alerted = false + end + table.insert(self.P_CENTER_POOLS['Tag'], v) + end + end + for k, v in pairs(self.P_SEALS) do + v.key = k + if not v.wip and not v.demo then + if TESTHELPER_unlocks then v.discovered = true; v.alerted = true end --REMOVE THIS + if not v.discovered and meta.discovered[k] then + v.discovered = true + end + if v.discovered and meta.alerted[k] then + v.alerted = true + elseif v.discovered then + v.alerted = false + end + table.insert(self.P_CENTER_POOLS['Seal'], v) + end + end + for k, v in pairs(self.P_STAKES) do + v.key = k + table.insert(self.P_CENTER_POOLS['Stake'], v) + end + + for k, v in pairs(self.P_CENTERS) do + v.key = k + if v.set == 'Joker' then table.insert(self.P_CENTER_POOLS['Joker'], v) end + if v.set and v.demo and v.pos then table.insert(self.P_CENTER_POOLS['Demo'], v) end + if not v.wip then + if v.set and v.set ~= 'Joker' and not v.skip_pool and not v.omit then table.insert(self.P_CENTER_POOLS[v.set], v) end + if v.set == 'Tarot' or v.set == 'Planet' then table.insert(self.P_CENTER_POOLS['Tarot_Planet'], v) end + if v.consumeable then table.insert(self.P_CENTER_POOLS['Consumeables'], v) end + if v.rarity and v.set == 'Joker' and not v.demo then table.insert(self.P_JOKER_RARITY_POOLS[v.rarity], v) end + end + end + + table.sort(self.P_CENTER_POOLS["Joker"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Tarot"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Planet"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Tarot_Planet"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Spectral"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Voucher"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Booster"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Consumeables"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Back"], function (a, b) return (a.order - (a.unlocked and 100 or 0)) < (b.order - (b.unlocked and 100 or 0)) end) + table.sort(self.P_CENTER_POOLS["Enhanced"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Stake"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Tag"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Seal"], function (a, b) return a.order < b.order end) + table.sort(self.P_CENTER_POOLS["Demo"], function (a, b) return a.order + (a.set == 'Joker' and 1000 or 0) < b.order + (b.set == 'Joker' and 1000 or 0) end) + for i = 1, 4 do + table.sort(self.P_JOKER_RARITY_POOLS[i], function (a, b) return a.order < b.order end) + end +end + +function Game:load_profile(_profile) + if not G.PROFILES[_profile] then _profile = 1 end + G.SETTINGS.profile = _profile + + --Load the settings file + local info = get_compressed(_profile..'/profile.jkr') + if info ~= nil then + for k, v in pairs(STR_UNPACK(info)) do + G.PROFILES[G.SETTINGS.profile][k] = v + end + end + + local temp_profile = { + MEMORY = { + deck = 'Red Deck', + stake = 1, + }, + stake = 1, + + high_scores = { + hand = {label = 'Best Hand', amt = 0}, + furthest_round = {label = 'Highest Round', amt = 0}, + furthest_ante = {label = 'Highest Ante', amt = 0}, + most_money = {label = 'Most Money', amt = 0}, + boss_streak = {label = 'Most Bosses in a Row', amt = 0}, + collection = {label = 'Collection', amt = 0, tot = 1}, + win_streak = {label = 'Best Win Streak', amt = 0}, + current_streak = {label = '', amt = 0}, + poker_hand = {label = 'Most Played Hand', amt = 0} + }, + + career_stats = { + c_round_interest_cap_streak = 0, + c_dollars_earned = 0, + c_shop_dollars_spent = 0, + c_tarots_bought = 0, + c_planets_bought = 0, + c_playing_cards_bought = 0, + c_vouchers_bought = 0, + c_tarot_reading_used = 0, + c_planetarium_used = 0, + c_shop_rerolls = 0, + c_cards_played = 0, + c_cards_discarded = 0, + c_losses = 0, + c_wins = 0, + c_rounds = 0, + c_hands_played = 0, + c_face_cards_played = 0, + c_jokers_sold = 0, + c_cards_sold = 0, + c_single_hand_round_streak = 0, + }, + progress = { + + }, + joker_usage = {}, + consumeable_usage = {}, + voucher_usage = {}, + hand_usage = {}, + deck_usage = {}, + deck_stakes = {}, + challenges_unlocked = nil, + challenge_progress = { + completed = {}, + unlocked = {} + } + } + local recursive_init + recursive_init = function(t1, t2) + for k, v in pairs(t1) do + if not t2[k] then + t2[k] = v + elseif type(t2[k]) == 'table' and type(v) == 'table' then + recursive_init(v, t2[k]) + end + end + end + + recursive_init(temp_profile, G.PROFILES[G.SETTINGS.profile]) +end + +function Game:set_language() + if not self.LANGUAGES then + if not (love.filesystem.read('localization/'..G.SETTINGS.language..'.lua')) or G.F_ENGLISH_ONLY then + ------------------------------------------ + --SET LANGUAGE FOR FIRST TIME STARTUP HERE + + ------------------------------------------ + + G.SETTINGS.language = 'en-us' + end + ------------------------------------------------------- + --IF LANGUAGE NEEDS TO BE SET ON EVERY REBOOT, SET HERE + + ------------------------------------------------------- + + self.LANGUAGES = { + ['en-us'] = {font = 1, label = "English", key = 'en-us', button = "Language Feedback", warning = {'This language is still in Beta. To help us','improve it, please click on the feedback button.', 'Click again to confirm'}}, + ['de'] = {font = 1, label = "Deutsch", key = 'de', beta = true, button = "Feedback zur Übersetzung", warning = {'Diese Übersetzung ist noch im Beta-Stadium. Willst du uns helfen,','sie zu verbessern? Dann klicke bitte auf die Feedback-Taste.', "Zum Bestätigen erneut klicken"}}, + ['es_419'] = {font = 1, label = "Español (México)", key = 'es_419', beta = true, button = "Sugerencias de idioma", warning = {'Este idioma todavía está en Beta. Pulsa el botón','de sugerencias para ayudarnos a mejorarlo.', "Haz clic de nuevo para confirmar"}}, + ['es_ES'] = {font = 1, label = "Español (España)", key = 'es_ES', beta = true, button = "Sugerencias de idioma", warning = {'Este idioma todavía está en Beta. Pulsa el botón','de sugerencias para ayudarnos a mejorarlo.', "Haz clic de nuevo para confirmar"}}, + ['fr'] = {font = 1, label = "Français", key = 'fr', beta = true, button = "Partager votre avis", warning = {'La traduction française est encore en version bêta. ','Veuillez cliquer sur le bouton pour nous donner votre avis.', "Cliquez à nouveau pour confirmer"}}, + ['id'] = {font = 1, label = "Bahasa Indonesia", key = 'id', beta = true, button = "Umpan Balik Bahasa", warning = {'Bahasa ini masih dalam tahap Beta. Untuk membantu','kami meningkatkannya, silakan klik tombol umpan balik.', "Klik lagi untuk mengonfirmasi"}}, + ['it'] = {font = 1, label = "Italiano", key = 'it', beta = true, button = "Feedback traduzione", warning = {'Questa traduzione è ancora in Beta. Per','aiutarci a migliorarla, clicca il tasto feedback', "Fai clic di nuovo per confermare"}}, + ['ja'] = {font = 5, label = "日本語", key = 'ja', beta = true, button = "提案する", warning = {'この翻訳は現在ベータ版です。提案があった場合、','ボタンをクリックしてください。', "もう一度クリックして確認"}}, + ['ko'] = {font = 4, label = "한국어", key = 'ko', beta = true, button = "번역 피드백", warning = {'이 언어는 아직 베타 단계에 있습니다. ','번역을 도와주시려면 피드백 버튼을 눌러주세요.', "다시 클릭해서 확인하세요"}}, + ['nl'] = {font = 1, label = "Nederlands", key = 'nl', beta = true, button = "Taal suggesties", warning = {'Deze taal is nog in de Beta fase. Help ons het te ','verbeteren door op de suggestie knop te klikken.', "Klik opnieuw om te bevestigen"}}, + ['pl'] = {font = 1, label = "Polski", key = 'pl', beta = true, button = "Wyślij uwagi do tłumaczenia", warning = {'Polska wersja językowa jest w fazie Beta. By pomóc nam poprawić',' jakość tłumaczenia, kliknij przycisk i podziel się swoją opinią i uwagami.', "Kliknij ponownie, aby potwierdzić"}}, + ['pt_BR'] = {font = 1, label = "Português", key = 'pt_BR', beta = true, button = "Feedback de Tradução", warning = {'Esta tradução ainda está em Beta. Se quiser nos ajudar','a melhorá-la, clique no botão de feedback por favor', "Clique novamente para confirmar"}}, + ['ru'] = {font = 6, label = "Русский", key = 'ru', beta = true, button = "Отзыв о языке", warning = {'Этот язык все еще находится в Бета-версии. Чтобы помочь','нам его улучшить, пожалуйста, нажмите на кнопку обратной связи.', "Щелкните снова, чтобы подтвердить"}}, + ['zh_CN'] = {font = 2, label = "简体中文", key = 'zh_CN', beta = true, button = "意见反馈", warning = {'这个语言目前尚为Beta版本。 请帮助我们改善翻译品质,','点击”意见反馈” 来提供你的意见。', "再次点击确认"}}, + ['zh_TW'] = {font = 3, label = "繁體中文", key = 'zh_TW', beta = true, button = "意見回饋", warning = {'這個語言目前尚為Beta版本。請幫助我們改善翻譯品質,','點擊”意見回饋” 來提供你的意見。', "再按一下即可確認"}}, + ['all1'] = {font = 8, label = "English", key = 'all', omit = true}, + ['all2'] = {font = 9, label = "English", key = 'all', omit = true}, + } + --if G.F_ENGLISH_ONLY then + -- self.LANGUAGES = { + -- ['en-us'] = self.LANGUAGES['en-us'] + -- } + --end + + --load the font and set filter + self.FONTS = { + {file = "resources/fonts/m6x11plus.ttf", render_scale = self.TILESIZE*10, TEXT_HEIGHT_SCALE = 0.83, TEXT_OFFSET = {x=10,y=-20}, FONTSCALE = 0.1, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/NotoSansSC-Bold.ttf", render_scale = self.TILESIZE*7, TEXT_HEIGHT_SCALE = 0.7, TEXT_OFFSET = {x=0,y=-35}, FONTSCALE = 0.12, squish = 1, DESCSCALE = 1.1}, + {file = "resources/fonts/NotoSansTC-Bold.ttf", render_scale = self.TILESIZE*7, TEXT_HEIGHT_SCALE = 0.7, TEXT_OFFSET = {x=0,y=-35}, FONTSCALE = 0.12, squish = 1, DESCSCALE = 1.1}, + {file = "resources/fonts/NotoSansKR-Bold.ttf", render_scale = self.TILESIZE*7, TEXT_HEIGHT_SCALE = 0.8, TEXT_OFFSET = {x=0,y=-20}, FONTSCALE = 0.12, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/NotoSansJP-Bold.ttf", render_scale = self.TILESIZE*7, TEXT_HEIGHT_SCALE = 0.8, TEXT_OFFSET = {x=0,y=-20}, FONTSCALE = 0.12, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/NotoSans-Bold.ttf", render_scale = self.TILESIZE*7, TEXT_HEIGHT_SCALE = 0.65, TEXT_OFFSET = {x=0,y=-40}, FONTSCALE = 0.12, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/m6x11plus.ttf", render_scale = self.TILESIZE*10, TEXT_HEIGHT_SCALE = 0.9, TEXT_OFFSET = {x=10,y=15}, FONTSCALE = 0.1, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/GoNotoCurrent-Bold.ttf", render_scale = self.TILESIZE*10, TEXT_HEIGHT_SCALE = 0.8, TEXT_OFFSET = {x=10,y=-20}, FONTSCALE = 0.1, squish = 1, DESCSCALE = 1}, + {file = "resources/fonts/GoNotoCJKCore.ttf", render_scale = self.TILESIZE*10, TEXT_HEIGHT_SCALE = 0.8, TEXT_OFFSET = {x=10,y=-20}, FONTSCALE = 0.1, squish = 1, DESCSCALE = 1}, + } + for _, v in ipairs(self.FONTS) do + if love.filesystem.getInfo(v.file) then + v.FONT = love.graphics.newFont( v.file, v.render_scale) + end + end + for _, v in pairs(self.LANGUAGES) do + v.font = self.FONTS[v.font] + end + end + + self.LANG = self.LANGUAGES[self.SETTINGS.language] or self.LANGUAGES['en-us'] + + local localization = love.filesystem.getInfo('localization/'..G.SETTINGS.language..'.lua') + if localization ~= nil then + print(G.SETTINGS.language) + self.localization = assert(loadstring(love.filesystem.read('localization/'..G.SETTINGS.language..'.lua')))() + init_localization() + end +end + +function Game:set_render_settings() + self.SETTINGS.GRAPHICS.texture_scaling = self.SETTINGS.GRAPHICS.texture_scaling or 2 + + --Set fiter to linear interpolation and nearest, best for pixel art + love.graphics.setDefaultFilter( + self.SETTINGS.GRAPHICS.texture_scaling == 1 and 'nearest' or 'linear', + self.SETTINGS.GRAPHICS.texture_scaling == 1 and 'nearest' or 'linear', 1) + + --self.CANVAS = self.CANVAS or love.graphics.newCanvas(500, 500, {readable = true}) + love.graphics.setLineStyle("rough") + + --spritesheets + self.animation_atli = { + {name = "blind_chips", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/BlindChips.png",px=34,py=34, frames = 21}, + {name = "shop_sign", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/ShopSignAnimation.png",px=113,py=57, frames = 4} + } + self.asset_atli = { + {name = "cards_1", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/8BitDeck.png",px=71,py=95}, + {name = "cards_2", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/8BitDeck_opt2.png",px=71,py=95}, + {name = "centers", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/Enhancers.png",px=71,py=95}, + {name = "Joker", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/Jokers.png",px=71,py=95}, + {name = "Tarot", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/Tarots.png",px=71,py=95}, + {name = "Voucher", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/Vouchers.png",px=71,py=95}, + {name = "Booster", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/boosters.png",px=71,py=95}, + {name = "ui_1", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/ui_assets.png",px=18,py=18}, + {name = "ui_2", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/ui_assets_opt2.png",px=18,py=18}, + {name = "balatro", path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/balatro.png",px=333,py=216}, + {name = 'gamepad_ui', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/gamepad_ui.png",px=32,py=32}, + {name = 'icons', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/icons.png",px=66,py=66}, + {name = 'tags', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/tags.png",px=34,py=34}, + {name = 'stickers', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/stickers.png",px=71,py=95}, + {name = 'chips', path = "resources/textures/"..self.SETTINGS.GRAPHICS.texture_scaling.."x/chips.png",px=29,py=29} + } + self.asset_images = { + {name = "playstack_logo", path = "resources/textures/1x/playstack-logo.png", px=1417,py=1417}, + {name = "localthunk_logo", path = "resources/textures/1x/localthunk-logo.png", px=1390,py=560} + } + + --Load in all atli defined above + for i=1, #self.animation_atli do + self.ANIMATION_ATLAS[self.animation_atli[i].name] = {} + self.ANIMATION_ATLAS[self.animation_atli[i].name].name = self.animation_atli[i].name + self.ANIMATION_ATLAS[self.animation_atli[i].name].image = love.graphics.newImage(self.animation_atli[i].path, {mipmaps = true, dpiscale = self.SETTINGS.GRAPHICS.texture_scaling}) + self.ANIMATION_ATLAS[self.animation_atli[i].name].px = self.animation_atli[i].px + self.ANIMATION_ATLAS[self.animation_atli[i].name].py = self.animation_atli[i].py + self.ANIMATION_ATLAS[self.animation_atli[i].name].frames = self.animation_atli[i].frames + end + + for i=1, #self.asset_atli do + self.ASSET_ATLAS[self.asset_atli[i].name] = {} + self.ASSET_ATLAS[self.asset_atli[i].name].name = self.asset_atli[i].name + self.ASSET_ATLAS[self.asset_atli[i].name].image = love.graphics.newImage(self.asset_atli[i].path, {mipmaps = true, dpiscale = self.SETTINGS.GRAPHICS.texture_scaling}) + self.ASSET_ATLAS[self.asset_atli[i].name].type = self.asset_atli[i].type + self.ASSET_ATLAS[self.asset_atli[i].name].px = self.asset_atli[i].px + self.ASSET_ATLAS[self.asset_atli[i].name].py = self.asset_atli[i].py + end + for i=1, #self.asset_images do + self.ASSET_ATLAS[self.asset_images[i].name] = {} + self.ASSET_ATLAS[self.asset_images[i].name].name = self.asset_images[i].name + self.ASSET_ATLAS[self.asset_images[i].name].image = love.graphics.newImage(self.asset_images[i].path, {mipmaps = true, dpiscale = 1}) + self.ASSET_ATLAS[self.asset_images[i].name].type = self.asset_images[i].type + self.ASSET_ATLAS[self.asset_images[i].name].px = self.asset_images[i].px + self.ASSET_ATLAS[self.asset_images[i].name].py = self.asset_images[i].py + end + + for _, v in pairs(G.I.SPRITE) do + v:reset() + end + + self.ASSET_ATLAS.Planet = self.ASSET_ATLAS.Tarot + self.ASSET_ATLAS.Spectral = self.ASSET_ATLAS.Tarot +end + +function Game:init_window(reset) + --Initialize the window + self.ROOM_PADDING_H= 0.7 + self.ROOM_PADDING_W = 1 + self.WINDOWTRANS = { + x = 0, y = 0, + w = self.TILE_W+2*self.ROOM_PADDING_W, + h = self.TILE_H+2*self.ROOM_PADDING_H + } + self.window_prev = { + orig_scale = self.TILESCALE, + w=self.WINDOWTRANS.w*self.TILESIZE*self.TILESCALE, + h=self.WINDOWTRANS.h*self.TILESIZE*self.TILESCALE, + orig_ratio = self.WINDOWTRANS.w*self.TILESIZE*self.TILESCALE/(self.WINDOWTRANS.h*self.TILESIZE*self.TILESCALE)} + G.SETTINGS.QUEUED_CHANGE = G.SETTINGS.QUEUED_CHANGE or {} + G.SETTINGS.QUEUED_CHANGE.screenmode = G.SETTINGS.WINDOW.screenmode + + G.FUNCS.apply_window_changes(true) +end + +function Game:delete_run() + if self.ROOM then + remove_all(G.STAGE_OBJECTS[G.STAGE]) + self.load_shop_booster = nil + self.load_shop_jokers = nil + self.load_shop_vouchers = nil + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.deck_preview then self.deck_preview:remove(); self.deck_preview = nil end + if self.shop then self.shop:remove(); self.shop = nil end + if self.blind_select then self.blind_select:remove(); self.blind_select = nil end + if self.booster_pack then self.booster_pack:remove(); self.booster_pack = nil end + if self.MAIN_MENU_UI then self.MAIN_MENU_UI:remove(); self.MAIN_MENU_UI = nil end + if self.SPLASH_FRONT then self.SPLASH_FRONT:remove(); self.SPLASH_FRONT = nil end + if self.SPLASH_BACK then self.SPLASH_BACK:remove(); self.SPLASH_BACK = nil end + if self.SPLASH_LOGO then self.SPLASH_LOGO:remove(); self.SPLASH_LOGO = nil end + if self.GAME_OVER_UI then self.GAME_OVER_UI:remove(); self.GAME_OVER_UI = nil end + if self.collection_alert then self.collection_alert:remove(); self.collection_alert = nil end + if self.HUD then self.HUD:remove(); self.HUD = nil end + if self.HUD_blind then self.HUD_blind:remove(); self.HUD_blind = nil end + if self.HUD_tags then + for k, v in pairs(self.HUD_tags) do + v:remove() + end + self.HUD_tags = nil + end + if self.OVERLAY_MENU then self.OVERLAY_MENU:remove(); self.OVERLAY_MENU = nil end + if self.OVERLAY_TUTORIAL then + G.OVERLAY_TUTORIAL.Jimbo:remove() + if G.OVERLAY_TUTORIAL.content then G.OVERLAY_TUTORIAL.content:remove() end + G.OVERLAY_TUTORIAL:remove() + G.OVERLAY_TUTORIAL = nil + end + for k, v in pairs(G) do + if (type(v) == "table") and v.is and v:is(CardArea) then + G[k] = nil + end + end + G.I.CARD = {} + end + G.VIEWING_DECK = nil + G.E_MANAGER:clear_queue() + G.CONTROLLER:mod_cursor_context_layer(-1000) + G.CONTROLLER.focus_cursor_stack = {} + G.CONTROLLER.focus_cursor_stack_level = 1 + if G.GAME then G.GAME.won = false end + + G.STATE = -1 +end + + + +function Game:save_progress() + G.ARGS.save_progress = G.ARGS.save_progress or {} + G.ARGS.save_progress.UDA = EMPTY(G.ARGS.save_progress.UDA) + G.ARGS.save_progress.SETTINGS = G.SETTINGS + G.ARGS.save_progress.PROFILE = G.PROFILES[G.SETTINGS.profile] + + for k, v in pairs(self.P_CENTERS) do + G.ARGS.save_progress.UDA[k] = (v.unlocked and 'u' or '')..(v.discovered and 'd' or '')..(v.alerted and 'a' or '') + end + for k, v in pairs(self.P_BLINDS) do + G.ARGS.save_progress.UDA[k] = (v.unlocked and 'u' or '')..(v.discovered and 'd' or '')..(v.alerted and 'a' or '') + end + for k, v in pairs(self.P_TAGS) do + G.ARGS.save_progress.UDA[k] = (v.unlocked and 'u' or '')..(v.discovered and 'd' or '')..(v.alerted and 'a' or '') + end + for k, v in pairs(self.P_SEALS) do + G.ARGS.save_progress.UDA[k] = (v.unlocked and 'u' or '')..(v.discovered and 'd' or '')..(v.alerted and 'a' or '') + end + + G.FILE_HANDLER = G.FILE_HANDLER or {} + G.FILE_HANDLER.progress = true + G.FILE_HANDLER.update_queued = true +end + +function Game:save_notify(card) + G.SAVE_MANAGER.channel:push({ + type = 'save_notify', + save_notify = card.key, + profile_num = G.SETTINGS.profile + }) +end + +function Game:save_settings() + G.ARGS.save_settings = G.SETTINGS + G.FILE_HANDLER = G.FILE_HANDLER or {} + G.FILE_HANDLER.settings = true + G.FILE_HANDLER.update_queued = true +end + +function Game:save_metrics() + G.ARGS.save_metrics = G.METRICS + G.FILE_HANDLER = G.FILE_HANDLER or {} + G.FILE_HANDLER.settings = true + G.FILE_HANDLER.update_queued = true +end + +function Game:prep_stage(new_stage, new_state, new_game_obj) + for k, v in pairs(self.CONTROLLER.locks) do + self.CONTROLLER.locks[k] = nil + end + if new_game_obj then self.GAME = self:init_game_object() end + self.STAGE = new_stage or self.STAGES.MAIN_MENU + self.STATE = new_state or self.STATES.MENU + self.STATE_COMPLETE = false + self.SETTINGS.paused = false + + self.ROOM = Node{T={ + x = self.ROOM_PADDING_W, + y = self.ROOM_PADDING_H, + w = self.TILE_W, + h = self.TILE_H} + } + self.ROOM.jiggle = 0 + self.ROOM.states.drag.can = false + self.ROOM:set_container(self.ROOM) + + self.ROOM_ATTACH = Moveable{T={ + x = 0, + y = 0, + w = self.TILE_W, + h = self.TILE_H} + } + self.ROOM_ATTACH.states.drag.can = false + self.ROOM_ATTACH:set_container(self.ROOM) + love.resize(love.graphics.getWidth( ),love.graphics.getHeight( )) +end + +function Game:sandbox() + G.TIMERS.REAL = 0 + G.TIMERS.TOTAL = 0 + + self:prep_stage(G.STAGES.SANDBOX, G.STATES.SANDBOX, true) + self.GAME.selected_back = Back(G.P_CENTERS.b_red) + + ease_background_colour{new_colour = G.C.BLACK, contrast = 1} + + G.SANDBOX = { + vort_time = 7, + vort_speed = 0, + col_op = {'RED','BLUE','GREEN','BLACK','L_BLACK','WHITE','EDITION','DARK_EDITION','ORANGE','PURPLE'}, + col1 = G.C.RED,col2 = G.C.BLUE, + mid_flash = 0, + joker_text = '', + edition = 'base', + tilt = 1, + card_size = 1, + base_size = {w = G.CARD_W, h = G.CARD_H}, + gamespeed = 0 + } + + if G.SPLASH_FRONT then G.SPLASH_FRONT:remove(); G.SPLASH_FRONT = nil end + if G.SPLASH_BACK then G.SPLASH_BACK:remove(); G.SPLASH_BACK = nil end + + G.SPLASH_BACK = Sprite(-30, -13, G.ROOM.T.w+60, G.ROOM.T.h+22, G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x = 2, y = 0}) + G.SPLASH_BACK:set_alignment({ + major = G.ROOM_ATTACH, + type = 'cm', + offset = {x=0,y=0} + }) + + G.SPLASH_BACK:define_draw_steps({{ + shader = 'splash', + send = { + {name = 'time', ref_table = G.SANDBOX, ref_value = 'vort_time'}, + {name = 'vort_speed', val = 0.4}, + {name = 'colour_1', ref_table = G.SANDBOX, ref_value = 'col1'}, + {name = 'colour_2', ref_table = G.SANDBOX, ref_value = 'col2'}, + {name = 'mid_flash', ref_table = G.SANDBOX, ref_value = 'mid_flash'}, + {name = 'vort_offset', val = 0}, + }}}) + + function create_UIBox_sandbox_controls() + G.FUNCS.col1change = function(args) + G.SANDBOX.col1 = G.C[args.to_val] + end + G.FUNCS.col2change = function(args) + G.SANDBOX.col2 = G.C[args.to_val] + end + G.FUNCS.edition_change = function(args) + G.SANDBOX.edition = args.to_val + if G.SANDBOX.joker then G.SANDBOX.joker:set_edition({[args.to_val] = true}, true, true) end + end + G.FUNCS.pulseme = function(e) + if math.random() > 0.998 then e.config.object:pulse(1) end + end + G.FUNCS.spawn_joker = function(e) G.FUNCS.rem_joker(); G.SANDBOX.joker = add_joker(G.SANDBOX.joker_text, G.SANDBOX.edition) end + G.FUNCS.rem_joker = function(e) if G.SANDBOX.joker then G.SANDBOX.joker:remove(); G.SANDBOX.joker = nil end end + G.FUNCS.do_time = function(args) if args.to_val == 'PLAY' then G.SANDBOX.gamespeed = 1 else G.SANDBOX.gamespeed = 0 end end + G.FUNCS.cb = function(rt) G.CARD_W = rt.ref_table[rt.ref_value]*G.SANDBOX.base_size.w; G.CARD_H = rt.ref_table[rt.ref_value]*G.SANDBOX.base_size.h end + G.E_MANAGER:add_event(Event({ + func = (function() + G.SANDBOX.file_reload_timer = (G.SANDBOX.file_reload_timer or 0) + if G.SANDBOX.file_reload_timer < G.TIMERS.REAL then + G.SANDBOX.file_reload_timer = G.SANDBOX.file_reload_timer+0.25 + end + if G.SANDBOX.joker then G.SANDBOX.joker.ambient_tilt = G.SANDBOX.tilt end + G.SANDBOX.vort_time = G.SANDBOX.vort_time + G.real_dt*G.SANDBOX.gamespeed + G.CONTROLLER.lock_input = false + 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, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK}, nodes={ + create_slider({label = 'Time', w = 2, h = 0.3, text_scale = 0.2, label_scale = 0.3, ref_table = G.SANDBOX, ref_value = 'vort_time', min = 0, max = 30}), + create_option_cycle({options = {'PLAY','PAUSE'}, opt_callback = 'do_time', current_option = 1, colour = G.C.RED, w = 2, scale = 0.7}), + create_slider({label = 'tilt', w = 2, h = 0.3, text_scale = 0.2, label_scale = 0.3, ref_table = G.SANDBOX, ref_value = 'tilt', min = 0, max = 3, decimal_places = 2}), + create_slider({label = 'Card size', w = 2, h = 0.3, text_scale = 0.2, label_scale = 0.3, ref_table = G.SANDBOX, ref_value = 'card_size', min = 0.1, max = 3, callback = 'cb', decimal_places = 2}), + create_option_cycle({options = G.SANDBOX.col_op, opt_callback = 'col1change', current_option = 1, colour = G.C.RED, w = 2, scale = 0.7}), + create_option_cycle({options = G.SANDBOX.col_op, opt_callback = 'col2change', current_option = 2, colour = G.C.RED, w = 2, scale = 0.7}), + {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes = { + UIBox_button{ label = {"+"}, button = "spawn_joker", minw = 0.7, col = true}, + create_text_input({prompt_text = 'Joker key', extended_corpus = true, ref_table = G.SANDBOX, ref_value = 'joker_text', text_scale = 0.3, w = 1.5, h = 0.6}), + UIBox_button{ label = {"-"}, button = "rem_joker", minw = 0.7, col = true}, + }}, + create_option_cycle({options = {'base', 'foil', 'holo', 'polychrome','negative'}, opt_callback = 'edition_change', current_option = 1, colour = G.C.RED, w = 2, scale = 0.7}), + }} + }} + return t + end + + + G.SANDBOX.UI = UIBox{ + definition = create_UIBox_sandbox_controls(), + config = {align="cli", offset = {x=0,y=0}, major = G.ROOM_ATTACH, bond = 'Weak'} + } + + G.SANDBOX.UI:recalculate(true) +end + +function Game:splash_screen() + --If the skip splash screen option is set, immediately go to the main menu here + if G.SETTINGS.skip_splash == 'Yes' then + G:main_menu() + return + end + + self:prep_stage(G.STAGES.MAIN_MENU, G.STATES.SPLASH, true) + G.E_MANAGER:add_event(Event({ + func = (function() + discover_card() + return true + end) + })) + + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + G.TIMERS.TOTAL = 0 + G.TIMERS.REAL = 0 + --Prep the splash screen shaders for both the background(colour swirl) and the foreground(white flash), starting at black + G.SPLASH_BACK = Sprite(-30, -13, G.ROOM.T.w+60, G.ROOM.T.h+22, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + G.SPLASH_BACK:define_draw_steps({{ + shader = 'splash', + send = { + {name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'}, + {name = 'vort_speed', val = 1}, + {name = 'colour_1', ref_table = G.C, ref_value = 'BLUE'}, + {name = 'colour_2', ref_table = G.C, ref_value = 'WHITE'}, + {name = 'mid_flash', val = 0}, + {name = 'vort_offset', val = (2*90.15315131*os.time())%100000}, + }}}) + G.SPLASH_BACK:set_alignment({ + major = G.ROOM_ATTACH, + type = 'cm', + offset = {x=0,y=0} + }) + G.SPLASH_FRONT = Sprite(0,-20, G.ROOM.T.w*2, G.ROOM.T.h*4, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + G.SPLASH_FRONT:define_draw_steps({{ + shader = 'flash', + send = { + {name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'}, + {name = 'mid_flash', val = 1} + }}}) + G.SPLASH_FRONT:set_alignment({ + major = G.ROOM_ATTACH, + type = 'cm', + offset = {x=0,y=0} + }) + + --spawn in splash card + local SC = nil + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2,func = (function() + local SC_scale = 1.2 + SC = Card(G.ROOM.T.w/2 - SC_scale*G.CARD_W/2, 10. + G.ROOM.T.h/2 - SC_scale*G.CARD_H/2, SC_scale*G.CARD_W, SC_scale*G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['j_joker']) + SC.T.y = G.ROOM.T.h/2 - SC_scale*G.CARD_H/2 + SC.ambient_tilt = 1 + SC.states.drag.can = false + SC.states.hover.can = false + SC.no_ui = true + G.VIBRATION = G.VIBRATION + 2 + play_sound('whoosh1', 0.7, 0.2) + play_sound('introPad1', 0.704, 0.6) + return true;end)})) + + --dissolve fool card and start to fade in the vortex + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 1.8,func = (function() --||||||||||| + SC:start_dissolve({G.C.WHITE, G.C.WHITE},true, 12, true) + play_sound('magic_crumple', 1, 0.5) + play_sound('splash_buildup', 1, 0.7) + return true;end)})) + + --create all the cards and suck them in + function make_splash_card(args) + args = args or {} + local angle = math.random()*2*3.14 + local card_size = (args.scale or 1.5)*(math.random() + 1) + local card_pos = args.card_pos or { + x = (18 + card_size)*math.sin(angle), + y = (18 + card_size)*math.cos(angle) + } + local card = Card( card_pos.x + G.ROOM.T.w/2 - G.CARD_W*card_size/2, + card_pos.y + G.ROOM.T.h/2 - G.CARD_H*card_size/2, + card_size*G.CARD_W, card_size*G.CARD_H, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base) + if math.random() > 0.8 then card.sprite_facing = 'back'; card.facing = 'back' end + card.no_shadow = true + card.states.hover.can = false + card.states.drag.can = false + card.vortex = true and not args.no_vortex + card.T.r = angle + return card, card_pos + end + + G.vortex_time = G.TIMERS.REAL + local temp_del = nil + + for i = 1, 200 do + temp_del = temp_del or 3 + G.E_MANAGER:add_event(Event({ + trigger = 'after', + blockable = false, + delay = temp_del, + func = (function() + local card, card_pos = make_splash_card({scale = 2 - i/300}) + local speed = math.max(2. - i*0.005, 0.001) + ease_value(card.T, 'scale', -card.T.scale, nil, nil, nil, 1.*speed, 'elastic') + ease_value(card.T, 'x', -card_pos.x, nil, nil, nil, 0.9*speed) + ease_value(card.T, 'y', -card_pos.y, nil, nil, nil, 0.9*speed) + local temp_pitch = i*0.007 + 0.6 + local temp_i = i + G.E_MANAGER:add_event(Event({ + blockable = false, + func = (function() + if card.T.scale <= 0 then + if temp_i < 30 then + play_sound('whoosh1', temp_pitch + math.random()*0.05, 0.25*(1 - temp_i/50)) + end + + if temp_i == 15 then + play_sound('whoosh_long',0.9, 0.7) + end + G.VIBRATION = G.VIBRATION + 0.1 + card:remove() + return true + end + end)})) + return true + end)})) + temp_del = temp_del + math.max(1/(i), math.max(0.2*(170-i)/500, 0.016)) + end + + --when faded to white, spit out the 'Fool's' cards and slowly have them settle in to place + G.E_MANAGER:add_event(Event({trigger = 'after',delay = 2.,func = (function() + G.SPLASH_BACK:remove() + G.SPLASH_BACK = G.SPLASH_FRONT + G.SPLASH_FRONT = nil + G:main_menu('splash') + return true;end)})) + return true + end) + })) +end + +function Game:main_menu(change_context) --True if main menu is accessed from the splash screen, false if it is skipped or accessed from the game + if change_context ~= 'splash' then + --Skip the timer to 14 seconds for all shaders that need it + G.TIMERS.REAL = 12 + G.TIMERS.TOTAL = 12 + else + --keep all sounds that came from splash screen + RESET_STATES(G.STATES.MENU) + end + + --Prepare the main menu, reset the default deck + self:prep_stage(G.STAGES.MAIN_MENU, G.STATES.MENU, true) + self.GAME.selected_back = Back(G.P_CENTERS.b_red) + + if (not G.SETTINGS.tutorial_complete) and G.SETTINGS.tutorial_progress.completed_parts['big_blind'] then G.SETTINGS.tutorial_complete = true end + + G.FUNCS.change_shadows{to_key = G.SETTINGS.GRAPHICS.shadows == 'On' and 1 or 2} + + ease_background_colour{new_colour = G.C.BLACK, contrast = 1} + + if G.SPLASH_FRONT then G.SPLASH_FRONT:remove(); G.SPLASH_FRONT = nil end + if G.SPLASH_BACK then G.SPLASH_BACK:remove(); G.SPLASH_BACK = nil end + G.SPLASH_BACK = Sprite(-30, -13, G.ROOM.T.w+60, G.ROOM.T.h+22, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + G.SPLASH_BACK:set_alignment({ + major = G.ROOM_ATTACH, + type = 'cm', + offset = {x=0,y=0} + }) + local splash_args = {mid_flash = change_context == 'splash' and 1.6 or 0.} + ease_value(splash_args, 'mid_flash', -(change_context == 'splash' and 1.6 or 0), nil, nil, nil, 4) + + G.SPLASH_BACK:define_draw_steps({{ + shader = 'splash', + send = { + {name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'}, + {name = 'vort_speed', val = 0.4}, + {name = 'colour_1', ref_table = G.C, ref_value = 'RED'}, + {name = 'colour_2', ref_table = G.C, ref_value = 'BLUE'}, + {name = 'mid_flash', ref_table = splash_args, ref_value = 'mid_flash'}, + {name = 'vort_offset', val = 0}, + }}}) + + --Display the unlocked decks and cards from the previous run + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + unlock_notify() + return true + end) + })) + + + local SC_scale = 1.1*(G.debug_splash_size_toggle and 0.8 or 1) + local CAI = { + TITLE_TOP_W = G.CARD_W, + TITLE_TOP_H = G.CARD_H, + } + self.title_top = CardArea( + 0, 0, + CAI.TITLE_TOP_W,CAI.TITLE_TOP_H, + {card_limit = 1, type = 'title'}) + + + G.SPLASH_LOGO = Sprite(0, 0, + 13*SC_scale, + 13*SC_scale*(G.ASSET_ATLAS["balatro"].py/G.ASSET_ATLAS["balatro"].px), + G.ASSET_ATLAS["balatro"], {x=0,y=0}) + + G.SPLASH_LOGO:set_alignment({ + major = G.title_top, + type = 'cm', + bond = 'Strong', + offset = {x=0,y=0} + }) + G.SPLASH_LOGO:define_draw_steps({{ + shader = 'dissolve', + }}) + + G.SPLASH_LOGO.dissolve_colours = {G.C.WHITE, G.C.WHITE} + G.SPLASH_LOGO.dissolve = 1 + + + local replace_card = Card(self.title_top.T.x, self.title_top.T.y, 1.2*G.CARD_W*SC_scale, 1.2*G.CARD_H*SC_scale, G.P_CARDS.S_A, G.P_CENTERS.c_base) + self.title_top:emplace(replace_card) + + replace_card.states.visible = false + replace_card.no_ui = true + replace_card.ambient_tilt = 0.0 + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = change_context == 'game' and 1.5 or 0, + blockable = false, + blocking = false, + func = (function() + if change_context == 'splash' then + replace_card.states.visible = true + replace_card:start_materialize({G.C.WHITE,G.C.WHITE}, true, 2.5) + play_sound('whoosh1', math.random()*0.1 + 0.3,0.3) + play_sound('crumple'..math.random(1,5), math.random()*0.2 + 0.6,0.65) + else + replace_card.states.visible = true + replace_card:start_materialize({G.C.WHITE,G.C.WHITE}, nil, 1.2) + end + G.VIBRATION = G.VIBRATION + 1 + return true + end)})) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = change_context == 'splash' and 1.8 or change_context == 'game' and 2 or 0.5, + blockable = false, + blocking = false, + func = (function() + play_sound('magic_crumple'..(change_context == 'splash' and 2 or 3), (change_context == 'splash' and 1 or 1.3), 0.9) + play_sound('whoosh1', 0.4, 0.8) + ease_value(G.SPLASH_LOGO, 'dissolve', -1, nil, nil, nil, change_context == 'splash' and 2.3 or 0.9) + G.VIBRATION = G.VIBRATION + 1.5 + return true + end)})) + + delay(0.1 + (change_context == 'splash' and 2 or change_context == 'game' and 1.5 or 0)) + + if replace_card and (G.P_CENTERS.j_blueprint.unlocked) then + local viable_unlockables = {} + for k, v in ipairs(self.P_LOCKED) do + if (v.set == 'Voucher' or v.set == 'Joker') and not v.demo then + viable_unlockables[#viable_unlockables+1] = v + end + end + if #viable_unlockables > 0 then + local card + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 4.04, + func = (function() + card = Card(self.title_top.T.x, self.title_top.T.y, 1.2*G.CARD_W*SC_scale, 1.2*G.CARD_H*SC_scale, nil, pseudorandom_element(viable_unlockables) or self.P_CENTERS.j_joker) + card.no_ui = #viable_unlockables == 0 + card.states.visible = false + replace_card.parent = nil + replace_card:start_dissolve({G.C.BLACK, G.C.ORANGE, G.C.RED, G.C.GOLD}) + return true + end)})) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1.04, + func = (function() + card:start_materialize() + self.title_top:emplace(card) + return true + end)})) + end + end + + G.E_MANAGER:add_event(Event({func = function() G.CONTROLLER.lock_input = false; return true end})) + set_screen_positions() + + self.title_top:sort('order') + self.title_top:set_ranks() + self.title_top:align_cards() + self.title_top:hard_set_cards() + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = change_context == 'splash' and 4.05 or change_context == 'game' and 3 or 1.5, + blockable = false, + blocking = false, + func = (function() + set_main_menu_UI() + return true + end) + })) + + --Do all career stat unlock checking here as well + for k, v in pairs(G.PROFILES[G.SETTINGS.profile].career_stats) do + check_for_unlock({type = 'career_stat', statname = k}) + end + check_for_unlock({type = 'blind_discoveries'}) + + G.E_MANAGER:add_event(Event({ + blockable = false, + func = function() + set_discover_tallies() + set_profile_progress() + G.REFRESH_ALERTS = true + return true + end + })) + + --VERSION + UIBox{ + definition = + {n=G.UIT.ROOT, config={align = "cm", colour = G.C.UI.TRANSPARENT_DARK}, nodes={ + {n=G.UIT.T, config={text = G.VERSION, scale = 0.3, colour = G.C.UI.TEXT_LIGHT}} + }}, + config = {align="tri", offset = {x=0,y=0}, major = G.ROOM_ATTACH, bond = 'Weak'} + } +end + +function Game:demo_cta() --True if main menu is accessed from the splash screen, false if it is skipped or accessed from the game + --G.TIMERS.REAL = 12 + --G.TIMERS.TOTAL = 12 + --Prepare the main menu, reset the default deck + self:prep_stage(G.STAGES.MAIN_MENU, G.STATES.DEMO_CTA, true) + + self.GAME.selected_back = Back(G.P_CENTERS.b_red) + + G.FUNCS.change_shadows{to_key = G.SETTINGS.GRAPHICS.shadows == 'On' and 1 or 2} + + ease_background_colour{new_colour = G.C.BLACK, contrast = 1} + + if G.SPLASH_FRONT then G.SPLASH_FRONT:remove(); G.SPLASH_FRONT = nil end + if G.SPLASH_BACK then G.SPLASH_BACK:remove(); G.SPLASH_BACK = nil end + G.SPLASH_BACK = Sprite(-30, -13, G.ROOM.T.w+60, G.ROOM.T.h+22, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + G.SPLASH_BACK:set_alignment({ + major = G.ROOM_ATTACH, + type = 'cm', + offset = {x=0,y=0} + }) + local splash_args = {mid_flash = 1.6} + ease_value(splash_args, 'mid_flash', -1.6, nil, nil, nil, 4) + + G.SPLASH_BACK:define_draw_steps({{ + shader = 'splash', + send = { + {name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'}, + {name = 'vort_speed', val = 0.4}, + {name = 'colour_1', ref_table = G.C, ref_value = 'RED'}, + {name = 'colour_2', ref_table = G.C, ref_value = 'BLUE'}, + {name = 'mid_flash', ref_table = splash_args, ref_value = 'mid_flash'}, + {name = 'vort_offset', val = 0}, + }}}) + + local SC_scale = 0.9*(G.debug_splash_size_toggle and 0.8 or 1) + + local CAI = { + TITLE_TOP_W = G.CARD_W, + TITLE_TOP_H = G.CARD_H, + } + self.title_top = CardArea( + 0, 0, + CAI.TITLE_TOP_W,CAI.TITLE_TOP_H, + {card_limit = 1, type = 'title'}) + + + G.SPLASH_LOGO = Sprite(0, 0, + 13*SC_scale, + 13*SC_scale*(G.ASSET_ATLAS["balatro"].py/G.ASSET_ATLAS["balatro"].px), + G.ASSET_ATLAS["balatro"], {x=0,y=0}) + + G.SPLASH_LOGO:set_alignment({ + major = G.title_top, + type = 'cm', + bond = 'Strong', + offset = {x=0,y=0} + }) + G.SPLASH_LOGO:define_draw_steps({{ + shader = 'dissolve', + }}) + + G.SPLASH_LOGO.dissolve_colours = {G.C.WHITE, G.C.WHITE} + G.SPLASH_LOGO.dissolve = 1 + + local replace_card = Card(self.title_top.T.x, self.title_top.T.y, 1.2*G.CARD_W*SC_scale, 1.2*G.CARD_H*SC_scale, G.P_CARDS.S_A, G.P_CENTERS.c_base) + self.title_top:emplace(replace_card) + + replace_card.states.visible = false + replace_card.no_ui = true + replace_card.ambient_tilt = 0.0 + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1.1, + blockable = false, + blocking = false, + func = (function() + replace_card.states.visible = true + replace_card:start_materialize({G.C.WHITE,G.C.WHITE}, true, 2.5) + play_sound('whoosh1', math.random()*0.1 + 0.3,0.3) + play_sound('crumple'..math.random(1,5), math.random()*0.2 + 0.6,0.65) + return true + end)})) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 1.8, + blockable = false, + blocking = false, + func = (function() + play_sound('magic_crumple'..(2), 1, 0.9) + play_sound('whoosh1', 0.4, 0.8) + ease_value(G.SPLASH_LOGO, 'dissolve', -1, nil, nil, nil, 2.3) + return true + end)})) + + delay(0.1 + 2) + + G.E_MANAGER:add_event(Event({func = function() G.CONTROLLER.lock_input = false; return true end})) + set_screen_positions() + + self.title_top:sort('order') + self.title_top:set_ranks() + self.title_top:align_cards() + self.title_top:hard_set_cards() + + local playstack = Sprite(0,0,1.7,1.7,G.ASSET_ATLAS["playstack_logo"], {x=0, y=0}) + playstack.states.drag.can = false + local localthunk = Sprite(0,0,1*1390/560,1,G.ASSET_ATLAS["localthunk_logo"], {x=0, y=0}) + localthunk.states.drag.can = false + + self.MAIN_MENU_UI = UIBox{ + definition = {n=G.UIT.ROOT, config = {align = "cm",colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={align = "cm", padding = 0.3}, nodes={ + {n=G.UIT.O, config={object = DynaText({string = {'Sign up for the next demo!'}, colours = {G.C.WHITE},shadow = true, rotate = true, float = true, bump = true, scale = 0.9, spacing = 1, pop_in = 4.5})}} + }}, + {n=G.UIT.R, config={align = "cm", padding = 0.3}, nodes={ + {n=G.UIT.C, config={align = "cl", minw = 5, minh = 1}, nodes={ + UIBox_button{button = 'go_to_menu', colour = G.C.ORANGE, minw = 2, minh = 1, label = {'BACK'}, scale = 0.4, col = true}, + }}, + UIBox_button{id = 'demo_cta_playbalatro', button = "go_to_playbalatro", colour = G.C.BLUE, minw = 7.65, minh = 1.95, label = {'PLAYBALATRO.COM'}, scale = 0.9, col = true}, + {n=G.UIT.C, config={align = "cr", minw = 5, minh = 1}, nodes={ + {n=G.UIT.O, config={object = localthunk}}, + {n=G.UIT.O, config={object = playstack}}, + }} + }} + }}, + config = {align="bmi", offset = {x=0,y=10}, major = G.ROOM_ATTACH, bond = 'Weak'} + } + self.MAIN_MENU_UI.states.visible = false + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 4.05, + blockable = false, + blocking = false, + func = (function() + self.MAIN_MENU_UI.states.visible = true + self.MAIN_MENU_UI.alignment.offset.y = 0 + self.MAIN_MENU_UI:align_to_major() + G.CONTROLLER:snap_to{node = self.MAIN_MENU_UI:get_UIE_by_ID('demo_cta_playbalatro')} + return true + end) + })) +end + +function Game:init_game_object() + local bosses_used = {} + for k, v in pairs(G.P_BLINDS) do + if v.boss then bosses_used[k] = 0 end + end + return { + won = false, + round_scores = { + furthest_ante = {label = 'Ante', amt = 0}, + furthest_round = {label = 'Round', amt = 0}, + hand = {label = 'Best Hand', amt = 0}, + poker_hand = {label = 'Most Played Hand', amt = 0}, + new_collection = {label = 'New Discoveries', amt = 0}, + cards_played = {label = 'Cards Played', amt = 0}, + cards_discarded = {label = 'Cards Discarded', amt = 0}, + times_rerolled = {label = 'Times Rerolled', amt = 0}, + cards_purchased = {label = 'Cards Purchased', amt = 0}, + }, + joker_usage = {}, + consumeable_usage = {}, + hand_usage = {}, + last_tarot_planet = nil, + win_ante = 8, + stake = 1, + modifiers = {}, + starting_params = get_starting_params(), + banned_keys = {}, + round = 0, + probabilities = { + normal = 1, + }, + bosses_used = bosses_used, + pseudorandom = {}, + starting_deck_size = 52, + ecto_minus = 1, + pack_size = 2, + skips = 0, + STOP_USE = 0, + edition_rate = 1, + joker_rate = 20, + tarot_rate = 4, + planet_rate = 4, + spectral_rate = 0, + playing_card_rate = 0, + consumeable_buffer = 0, + joker_buffer = 0, + discount_percent = 0, + interest_cap = 25, + interest_amount = 1, + inflation = 0, + hands_played = 0, + unused_discards = 0, + blind = nil, + chips = 0, + chips_text = '0', + voucher_text = '', + dollars = 0, + max_jokers = 0, + bankrupt_at = 0, + current_boss_streak = 0, + base_reroll_cost = 5, + blind_on_deck = nil, + sort = 'desc', + previous_round = { + dollars = 4 + }, + tags = {}, + tag_tally = 0, + pool_flags = {}, + used_jokers = {}, + used_vouchers = {}, + current_round = { + current_hand = { + chips = 0, + chip_text = '0', + mult = 0, + mult_text = '0', + chip_total = 0, + chip_total_text = '', + handname = "", + hand_level = '' + }, + used_packs = {}, + cards_flipped = 0, + round_text = 'Round ', + idol_card = {suit = 'Spades', rank = 'Ace'}, + mail_card = {rank = 'Ace'}, + ancient_card = {suit = 'Spades'}, + castle_card = {suit = 'Spades'}, + hands_left = 0, + hands_played = 0, + discards_left = 0, + discards_used = 0, + dollars = 0, + reroll_cost = 5, + reroll_cost_increase = 0, + jokers_purchased = 0, + free_rerolls = 0, + round_dollars = 0, + dollars_to_be_earned = '!!!', + most_played_poker_hand = 'High Card', + }, + round_resets = { + hands = 1, + discards = 1, + reroll_cost = 1, + temp_reroll_cost = nil, + temp_handsize = nil, + ante = 1, + blind_ante = 1, + blind_states = {Small = 'Select', Big = 'Upcoming', Boss = 'Upcoming'}, + loc_blind_states = {Small = '', Big = '', Boss = ''}, + blind_choices = {Small = 'bl_small', Big = 'bl_big'}, + boss_rerolled = false, + }, + round_bonus = { + next_hands = 0, + discards = 0, + }, + shop = { + joker_max = 2, + }, + cards_played = { + ['Ace'] = {suits = {}, total = 0}, + ['2'] = {suits = {}, total = 0}, + ['3'] = {suits = {}, total = 0}, + ['4'] = {suits = {}, total = 0}, + ['5'] = {suits = {}, total = 0}, + ['6'] = {suits = {}, total = 0}, + ['7'] = {suits = {}, total = 0}, + ['8'] = {suits = {}, total = 0}, + ['9'] = {suits = {}, total = 0}, + ['10'] = {suits = {}, total = 0}, + ['Jack'] = {suits = {}, total = 0}, + ['Queen'] = {suits = {}, total = 0}, + ['King'] = {suits = {}, total = 0}, + }, + hands = { + ["Flush Five"] = {visible = false, order = 1, mult = 16, chips = 160, s_mult = 16, s_chips = 160, level = 1, l_mult = 3, l_chips = 40, played = 0, played_this_round = 0, example = {{'S_A', true},{'S_A', true},{'S_A', true},{'S_A', true},{'S_A', true}}}, + ["Flush House"] = {visible = false, order = 2, mult = 14, chips = 140, s_mult = 14, s_chips = 140, level = 1, l_mult = 3, l_chips = 40, played = 0, played_this_round = 0, example = {{'D_7', true},{'D_7', true},{'D_7', true},{'D_4', true},{'D_4', true}}}, + ["Five of a Kind"] = {visible = false, order = 3, mult = 12, chips = 120, s_mult = 12, s_chips = 120, level = 1, l_mult = 3, l_chips = 35, played = 0, played_this_round = 0, example = {{'S_A', true},{'H_A', true},{'H_A', true},{'C_A', true},{'D_A', true}}}, + ["Straight Flush"] = {visible = true, order = 4, mult = 8, chips = 100, s_mult = 8, s_chips = 100, level = 1, l_mult = 3, l_chips = 40, played = 0, played_this_round = 0, example = {{'S_Q', true},{'S_J', true},{'S_T', true},{'S_9', true},{'S_8', true}}}, + ["Four of a Kind"] = {visible = true, order = 5, mult = 7, chips = 60, s_mult = 7, s_chips = 60, level = 1, l_mult = 3, l_chips = 30, played = 0, played_this_round = 0, example = {{'S_J', true},{'H_J', true},{'C_J', true},{'D_J', true},{'C_3', false}}}, + ["Full House"] = {visible = true, order = 6, mult = 4, chips = 40, s_mult = 4, s_chips = 40, level = 1, l_mult = 2, l_chips = 25, played = 0, played_this_round = 0, example = {{'H_K', true},{'C_K', true},{'D_K', true},{'S_2', true},{'D_2', true}}}, + ["Flush"] = {visible = true, order = 7, mult = 4, chips = 35, s_mult = 4, s_chips = 35, level = 1, l_mult = 2, l_chips = 15, played = 0, played_this_round = 0, example = {{'H_A', true},{'H_K', true},{'H_T', true},{'H_5', true},{'H_4', true}}}, + ["Straight"] = {visible = true, order = 8, mult = 4, chips = 30, s_mult = 4, s_chips = 30, level = 1, l_mult = 2, l_chips = 30, played = 0, played_this_round = 0, example = {{'D_J', true},{'C_T', true},{'C_9', true},{'S_8', true},{'H_7', true}}}, + ["Three of a Kind"] = {visible = true, order = 9, mult = 3, chips = 30, s_mult = 3, s_chips = 30, level = 1, l_mult = 2, l_chips = 20, played = 0, played_this_round = 0, example = {{'S_T', true},{'C_T', true},{'D_T', true},{'H_6', false},{'D_5', false}}}, + ["Two Pair"] = {visible = true, order = 10,mult = 2, chips = 20, s_mult = 2, s_chips = 20, level = 1, l_mult = 1, l_chips = 20, played = 0, played_this_round = 0, example = {{'H_A', true},{'D_A', true},{'C_Q', false},{'H_4', true},{'C_4', true}}}, + ["Pair"] = {visible = true, order = 11,mult = 2, chips = 10, s_mult = 2, s_chips = 10, level = 1, l_mult = 1, l_chips = 15, played = 0, played_this_round = 0, example = {{'S_K', false},{'S_9', true},{'D_9', true},{'H_6', false},{'D_3', false}}}, + ["High Card"] = {visible = true, order = 12,mult = 1, chips = 5, s_mult = 1, s_chips = 5, level = 1, l_mult = 1, l_chips = 10, played = 0, played_this_round = 0, example = {{'S_A', true},{'D_Q', false},{'D_9', false},{'C_4', false},{'D_3', false}}}, + } + } +end + +function Game:start_run(args) + args = args or {} + + local saveTable = args.savetext or nil + G.SAVED_GAME = nil + + self:prep_stage(G.STAGES.RUN, saveTable and saveTable.STATE or G.STATES.BLIND_SELECT) + + G.STAGE = G.STAGES.RUN + if saveTable then + check_for_unlock({type = 'continue_game'}) + end + + G.STATE_COMPLETE = false + G.RESET_BLIND_STATES = true + + if not saveTable then ease_background_colour_blind(G.STATE, 'Small Blind') + else ease_background_colour_blind(G.STATE, saveTable.BLIND.name:gsub("%s+", "") ~= '' and saveTable.BLIND.name or 'Small Blind') end + + local selected_back = saveTable and saveTable.BACK.name or (args.challenge and args.challenge.deck and args.challenge.deck.type) or (self.GAME.viewed_back and self.GAME.viewed_back.name) or self.GAME.selected_back and self.GAME.selected_back.name or 'Red Deck' + selected_back = get_deck_from_name(selected_back) + self.GAME = saveTable and saveTable.GAME or self:init_game_object() + self.GAME.modifiers = self.GAME.modifiers or {} + self.GAME.stake = args.stake or self.GAME.stake or 1 + self.GAME.STOP_USE = 0 + self.GAME.selected_back = Back(selected_back) + self.GAME.selected_back_key = selected_back + + G.C.UI_CHIPS[1], G.C.UI_CHIPS[2], G.C.UI_CHIPS[3], G.C.UI_CHIPS[4] = G.C.BLUE[1], G.C.BLUE[2], G.C.BLUE[3], G.C.BLUE[4] + G.C.UI_MULT[1], G.C.UI_MULT[2], G.C.UI_MULT[3], G.C.UI_MULT[4] = G.C.RED[1], G.C.RED[2], G.C.RED[3], G.C.RED[4] + + if not saveTable then + if self.GAME.stake >= 2 then + self.GAME.modifiers.no_blind_reward = self.GAME.modifiers.no_blind_reward or {} + self.GAME.modifiers.no_blind_reward.Small = true + end + if self.GAME.stake >= 3 then self.GAME.modifiers.scaling = 2 end + if self.GAME.stake >= 4 then self.GAME.modifiers.enable_eternals_in_shop = true end + if self.GAME.stake >= 5 then self.GAME.starting_params.discards = self.GAME.starting_params.discards - 1 end + if self.GAME.stake >= 6 then self.GAME.modifiers.scaling = 3 end + if self.GAME.stake >= 7 then self.GAME.modifiers.booster_ante_scaling = true end + if self.GAME.stake >= 8 then + self.GAME.starting_params.hand_size = self.GAME.starting_params.hand_size - 1 + end + + self.GAME.selected_back:apply_to_run() + + if args.challenge then + self.GAME.challenge = args.challenge.id + self.GAME.challenge_tab = args.challenge + local _ch = args.challenge + if _ch.jokers then + for k, v in ipairs(_ch.jokers) do + G.E_MANAGER:add_event(Event({ + func = function() + G.E_MANAGER:add_event(Event({ + func = function() + local _joker = add_joker(v.id, v.edition, k ~= 1) + if v.eternal then _joker:set_eternal(true) end + if v.pinned then _joker.pinned = true end + return true + end + })) + return true + end + })) + end + end + if _ch.consumeables then + for k, v in ipairs(_ch.consumeables) do + G.E_MANAGER:add_event(Event({ + func = function() + add_joker(v.id, nil, k ~= 1) + return true + end + })) + end + end + if _ch.vouchers then + for k, v in ipairs(_ch.vouchers) do + G.E_MANAGER:add_event(Event({ + func = function() + G.GAME.used_vouchers[v.id] = true + G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1 + Card.apply_to_run(nil, G.P_CENTERS[v.id]) + return true + end + })) + end + end + if _ch.rules then + if _ch.rules.modifiers then + for k, v in ipairs(_ch.rules.modifiers) do + self.GAME.starting_params[v.id] = v.value + end + end + if _ch.rules.custom then + for k, v in ipairs(_ch.rules.custom) do + if v.id == 'no_reward' then + self.GAME.modifiers.no_blind_reward = self.GAME.modifiers.no_blind_reward or {} + self.GAME.modifiers.no_blind_reward.Small = true + self.GAME.modifiers.no_blind_reward.Big = true + self.GAME.modifiers.no_blind_reward.Boss = true + elseif v.id == 'no_reward_specific' then + self.GAME.modifiers.no_blind_reward = self.GAME.modifiers.no_blind_reward or {} + self.GAME.modifiers.no_blind_reward[v.value] = true + elseif v.value then + self.GAME.modifiers[v.id] = v.value + elseif v.id == 'no_shop_jokers' then + self.GAME.joker_rate = 0 + else + self.GAME.modifiers[v.id] = true + end + end + end + end + if _ch.restrictions then + if _ch.restrictions.banned_cards then + for k, v in ipairs(_ch.restrictions.banned_cards) do + G.GAME.banned_keys[v.id] = true + if v.ids then + for kk, vv in ipairs(v.ids) do + G.GAME.banned_keys[vv] = true + end + end + end + end + if _ch.restrictions.banned_tags then + for k, v in ipairs(_ch.restrictions.banned_tags) do + G.GAME.banned_keys[v.id] = true + end + end + end + end + + self.GAME.round_resets.hands = self.GAME.starting_params.hands + self.GAME.round_resets.discards = self.GAME.starting_params.discards + self.GAME.round_resets.reroll_cost = self.GAME.starting_params.reroll_cost + self.GAME.dollars = self.GAME.starting_params.dollars + self.GAME.base_reroll_cost = self.GAME.starting_params.reroll_cost + self.GAME.round_resets.reroll_cost = self.GAME.base_reroll_cost + self.GAME.current_round.reroll_cost = self.GAME.base_reroll_cost + end + + G.GAME.chips_text = '' + + if not saveTable then + if args.seed then self.GAME.seeded = true end + self.GAME.pseudorandom.seed = args.seed or (not (G.SETTINGS.tutorial_complete or G.SETTINGS.tutorial_progress.completed_parts['big_blind']) and "TUTORIAL") or random_string(8, G.CONTROLLER.cursor_hover.T.x*0.33411983 + G.CONTROLLER.cursor_hover.T.y*0.874146 + 0.412311010*G.CONTROLLER.cursor_hover.time) + end + + for k, v in pairs(self.GAME.pseudorandom) do if v == 0 then self.GAME.pseudorandom[k] = pseudohash(k..self.GAME.pseudorandom.seed) end end + self.GAME.pseudorandom.hashed_seed = pseudohash(self.GAME.pseudorandom.seed) + + G:save_settings() + + if not self.GAME.round_resets.blind_tags then + self.GAME.round_resets.blind_tags = {} + end + + if not saveTable then + self.GAME.round_resets.blind_choices.Boss = get_new_boss() + self.GAME.current_round.voucher = G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_voucher or get_next_voucher_key() + self.GAME.round_resets.blind_tags.Small = G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_tags and G.SETTINGS.tutorial_progress.forced_tags[1] or get_next_tag_key() + self.GAME.round_resets.blind_tags.Big = G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_tags and G.SETTINGS.tutorial_progress.forced_tags[2] or get_next_tag_key() + else + if self.GAME.round_resets.blind and self.GAME.round_resets.blind.key then + self.GAME.round_resets.blind = G.P_BLINDS[self.GAME.round_resets.blind.key] + end + end + G.CONTROLLER.locks.load = true + G.E_MANAGER:add_event(Event({ + no_delete = true, + trigger = 'after', + blocking = false,blockable = false, + delay = 3.5, + timer = 'TOTAL', + func = function() + G.CONTROLLER.locks.load = nil + return true + end + })) + + if saveTable and saveTable.ACTION then + G.E_MANAGER:add_event(Event({delay = 0.5, trigger = 'after', blocking = false,blockable = false,func = (function() + G.E_MANAGER:add_event(Event({func = (function() + G.E_MANAGER:add_event(Event({func = (function() + for k, v in pairs(G.I.CARD) do + if v.sort_id == saveTable.ACTION.card then + G.FUNCS.use_card({config = {ref_table = v}}, nil, true) + end + end + return true + end) + })) + return true + end) + })) + return true + end) + })) + end + + local CAI = { + discard_W = G.CARD_W, + discard_H = G.CARD_H, + deck_W = G.CARD_W*1.1, + deck_H = 0.95*G.CARD_H, + hand_W = 6*G.CARD_W, + hand_H = 0.95*G.CARD_H, + play_W = 5.3*G.CARD_W, + play_H = 0.95*G.CARD_H, + joker_W = 4.9*G.CARD_W, + joker_H = 0.95*G.CARD_H, + consumeable_W = 2.3*G.CARD_W, + consumeable_H = 0.95*G.CARD_H + } + + + self.consumeables = CardArea( + 0, 0, + CAI.consumeable_W, + CAI.consumeable_H, + {card_limit = self.GAME.starting_params.consumable_slots, type = 'joker', highlight_limit = 1}) + + self.jokers = CardArea( + 0, 0, + CAI.joker_W, + CAI.joker_H, + {card_limit = self.GAME.starting_params.joker_slots, type = 'joker', highlight_limit = 1}) + + self.discard = CardArea( + 0, 0, + CAI.discard_W,CAI.discard_H, + {card_limit = 500, type = 'discard'}) + self.deck = CardArea( + 0, 0, + CAI.deck_W,CAI.deck_H, + {card_limit = 52, type = 'deck'}) + self.hand = CardArea( + 0, 0, + CAI.hand_W,CAI.hand_H, + {card_limit = self.GAME.starting_params.hand_size, type = 'hand'}) + self.play = CardArea( + 0, 0, + CAI.play_W,CAI.play_H, + {card_limit = 5, type = 'play'}) + + G.playing_cards = {} + + set_screen_positions() + + G.SPLASH_BACK = Sprite(-30, -6, G.ROOM.T.w+60, G.ROOM.T.h+12, G.ASSET_ATLAS["ui_1"], {x = 2, y = 0}) + G.SPLASH_BACK:set_alignment({ + major = G.play, + type = 'cm', + bond = 'Strong', + offset = {x=0,y=0} + }) + + G.ARGS.spin = { + amount = 0, + real = 0, + eased = 0 + } + + G.SPLASH_BACK:define_draw_steps({{ + shader = 'background', + send = { + {name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'}, + {name = 'spin_time', ref_table = G.TIMERS, ref_value = 'BACKGROUND'}, + {name = 'colour_1', ref_table = G.C.BACKGROUND, ref_value = 'C'}, + {name = 'colour_2', ref_table = G.C.BACKGROUND, ref_value = 'L'}, + {name = 'colour_3', ref_table = G.C.BACKGROUND, ref_value = 'D'}, + {name = 'contrast', ref_table = G.C.BACKGROUND, ref_value = 'contrast'}, + {name = 'spin_amount', ref_table = G.ARGS.spin, ref_value = 'amount'} + }}}) + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + blocking = false, + blockable = false, + func = (function() + local _dt = G.ARGS.spin.amount > G.ARGS.spin.eased and G.real_dt*2. or 0.3*G.real_dt + local delta = G.ARGS.spin.real - G.ARGS.spin.eased + if math.abs(delta) > _dt then delta = delta*_dt/math.abs(delta) end + G.ARGS.spin.eased = G.ARGS.spin.eased + delta + G.ARGS.spin.amount = _dt*(G.ARGS.spin.eased) + (1 - _dt)*G.ARGS.spin.amount + G.TIMERS.BACKGROUND = G.TIMERS.BACKGROUND - 60*(G.ARGS.spin.eased - G.ARGS.spin.amount)*_dt + end) + })) + + if saveTable then + local cardAreas = saveTable.cardAreas + for k, v in pairs(cardAreas) do + if G[k] then G[k]:load(v) + else + G.DEBUG_VALUE = '' + G['load_'..k] = v + print("ERROR LOADING GAME: Card area '"..k.."' not instantiated before load") end + end + + for k, v in pairs(G.I.CARD) do + if v.playing_card then + table.insert(G.playing_cards, v) + end + end + for k, v in pairs(G.I.CARDAREA) do + v:align_cards() + v:hard_set_cards() + end + table.sort(G.playing_cards, function (a, b) return a.playing_card > b.playing_card end ) + else + local card_protos = nil + local _de = nil + if args.challenge and args.challenge.deck then + _de = args.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(self.P_CARDS) do + local _ = nil + if self.GAME.starting_params.erratic_suits_and_ranks then _, k = pseudorandom_element(G.P_CARDS, pseudoseed('erratic')) end + local _r, _s = string.sub(k, 3, 3), string.sub(k, 1, 1) + local keep, _e, _d, _g = true, nil, nil, nil + if _de then + if _de.yes_ranks and not _de.yes_ranks[_r] then keep = false end + if _de.no_ranks and _de.no_ranks[_r] then keep = false end + if _de.yes_suits and not _de.yes_suits[_s] then keep = false end + if _de.no_suits and _de.no_suits[_s] then keep = false end + if _de.enhancement then _e = _de.enhancement end + if _de.edition then _d = _de.edition end + if _de.gold_seal then _g = _de.gold_seal end + end + + if self.GAME.starting_params.no_faces and (_r == 'K' or _r == 'Q' or _r == 'J') then keep = false end + + if keep then card_protos[#card_protos+1] = {s=_s,r=_r,e=_e,d=_d,g=_g} end + end + end + + if self.GAME.starting_params.extra_cards then + for k, v in pairs(self.GAME.starting_params.extra_cards) do + card_protos[#card_protos+1] = v + end + end + + for k, v in ipairs(card_protos) do + card_from_control(v) + end + + self.GAME.starting_deck_size = #G.playing_cards + end + + delay(0.5) + + if not saveTable then + G.GAME.current_round.discards_left = G.GAME.round_resets.discards + G.GAME.current_round.hands_left = G.GAME.round_resets.hands + self.deck:shuffle() + self.deck:hard_set_T() + reset_idol_card() + reset_mail_rank() + reset_ancient_card() + reset_castle_card() + end + + G.GAME.blind = Blind(0,0,2, 1) + self.deck:align_cards() + self.deck:hard_set_cards() + + self.HUD = UIBox{ + definition = create_UIBox_HUD(), + config = {align=('cli'), offset = {x=-0.7,y=0},major = G.ROOM_ATTACH} + } + self.HUD_blind = UIBox{ + definition = create_UIBox_HUD_blind(), + config = {major = G.HUD:get_UIE_by_ID('row_blind'), align = 'cm', offset = {x=0,y=-10}, bond = 'Weak'} + } + self.HUD_tags = {} + + G.hand_text_area = { + chips = self.HUD:get_UIE_by_ID('hand_chips'), + mult = self.HUD:get_UIE_by_ID('hand_mult'), + ante = self.HUD:get_UIE_by_ID('ante_UI_count'), + round = self.HUD:get_UIE_by_ID('round_UI_count'), + chip_total = self.HUD:get_UIE_by_ID('hand_chip_total'), + handname = self.HUD:get_UIE_by_ID('hand_name'), + hand_level = self.HUD:get_UIE_by_ID('hand_level'), + game_chips = self.HUD:get_UIE_by_ID('chip_UI_count'), + blind_chips = self.HUD_blind:get_UIE_by_ID('HUD_blind_count'), + blind_spacer = self.HUD:get_UIE_by_ID('blind_spacer') + } + + check_and_set_high_score('most_money', G.GAME.dollars) + + if saveTable then + G.GAME.blind:load(saveTable.BLIND) + G.GAME.tags = {} + local tags = saveTable.tags or {} + for k, v in ipairs(tags) do + local _tag = Tag('tag_uncommon') + _tag:load(v) + add_tag(_tag) + end + else + G.GAME.blind:set_blind(nil, nil, true) + end + + G.FUNCS.blind_chip_UI_scale(G.hand_text_area.blind_chips) + + self.HUD:recalculate() + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() + unlock_notify() + return true + end) + })) + +end + +function Game:update(dt) + + + G.MAJORS = 0 + G.MINORS = 0 + + G.FRAMES.MOVE = G.FRAMES.MOVE + 1 + timer_checkpoint('start->discovery', 'update') + if not G.SETTINGS.tutorial_complete then G.FUNCS.tutorial_controller() end + timer_checkpoint('tallies', 'update') + modulate_sound(dt) + timer_checkpoint('sounds', 'update') + update_canvas_juice(dt) + timer_checkpoint('canvas and juice', 'update') + --Smooth out the dts to avoid any big jumps + self.TIMERS.REAL = self.TIMERS.REAL + dt + self.TIMERS.UPTIME = self.TIMERS.UPTIME + dt + self.SETTINGS.DEMO.total_uptime = (self.SETTINGS.DEMO.total_uptime or 0) + dt + self.TIMERS.BACKGROUND = self.TIMERS.BACKGROUND + dt*(G.ARGS.spin and G.ARGS.spin.amount or 0) + self.real_dt = dt + + if self.real_dt > 0.05 then print('LONG DT @ '..math.floor(G.TIMERS.REAL)..': '..self.real_dt) end + if not G.fbf or G.new_frame then + G.new_frame = false + + set_alerts() + timer_checkpoint('alerts', 'update') + + local http_resp = G.HTTP_MANAGER.in_channel:pop() + if http_resp then + G.ARGS.HIGH_SCORE_RESPONSE = http_resp + end + + + if G.SETTINGS.paused then dt = 0 end + + if G.STATE ~= G.ACC_state then G.ACC = 0 end + G.ACC_state = G.STATE + + if (G.STATE == G.STATES.HAND_PLAYED) or (G.STATE == G.STATES.NEW_ROUND) then + G.ACC = math.min((G.ACC or 0) + dt*0.2*self.SETTINGS.GAMESPEED, 16) + else + G.ACC = 0 + end + + self.SPEEDFACTOR = (G.STAGE == G.STAGES.RUN and not G.SETTINGS.paused and not G.screenwipe) and self.SETTINGS.GAMESPEED or 1 + self.SPEEDFACTOR = self.SPEEDFACTOR + math.max(0, math.abs(G.ACC) - 2) + + self.TIMERS.TOTAL = self.TIMERS.TOTAL + dt*(self.SPEEDFACTOR) + + self.C.DARK_EDITION[1] = 0.6+0.2*math.sin(self.TIMERS.REAL*1.3) + self.C.DARK_EDITION[3] = 0.6+0.2*(1- math.sin(self.TIMERS.REAL*1.3)) + self.C.DARK_EDITION[2] = math.min(self.C.DARK_EDITION[3], self.C.DARK_EDITION[1]) + + self.C.EDITION[1] = 0.7+0.2*(1+math.sin(self.TIMERS.REAL*1.5 + 0)) + self.C.EDITION[3] = 0.7+0.2*(1+math.sin(self.TIMERS.REAL*1.5 + 3)) + self.C.EDITION[2] = 0.7+0.2*(1+math.sin(self.TIMERS.REAL*1.5 + 6)) + + + self.E_MANAGER:update(self.real_dt) + timer_checkpoint('e_manager', 'update') + + if G.GAME.blind and G.boss_throw_hand and self.STATE == self.STATES.SELECTING_HAND then + if not self.boss_warning_text then + self.boss_warning_text = UIBox{ + definition = + {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, padding = 0.2}, nodes={ + {n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={ + {n=G.UIT.O, config={object = DynaText({scale = 0.7, string = localize('ph_unscored_hand'), maxw = 9, colours = {G.C.WHITE},float = true, shadow = true, silent = true, pop_in = 0, pop_in_rate = 6})}}, + }}, + {n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={ + {n=G.UIT.O, config={object = DynaText({scale = 0.6, string = G.GAME.blind:get_loc_debuff_text(), maxw = 9, colours = {G.C.WHITE},float = true, shadow = true, silent = true, pop_in = 0, pop_in_rate = 6})}}, + }} + }}, + config = { + align = 'cm', + offset ={x=0,y=-3.1}, + major = G.play, + } + } + self.boss_warning_text.attention_text = true + self.boss_warning_text.states.collide.can = false + G.GAME.blind.children.animatedSprite:juice_up(0.05, 0.02) + play_sound('chips1', math.random()*0.1 + 0.55, 0.12) + end + else + G.boss_throw_hand = nil + if self.boss_warning_text then + self.boss_warning_text:remove() + self.boss_warning_text = nil + end + end + + + if self.STATE == self.STATES.SELECTING_HAND then + if (not G.hand.cards[1]) and G.deck.cards[1] then + G.STATE = G.STATES.DRAW_TO_HAND + G.STATE_COMPLETE = false + else + self:update_selecting_hand(dt) + end + end + + if self.STATE == self.STATES.SHOP then + self:update_shop(dt) + end + + if self.STATE == self.STATES.PLAY_TAROT then + self:update_play_tarot(dt) + end + + if self.STATE == self.STATES.HAND_PLAYED then + self:update_hand_played(dt) + end + + if self.STATE == self.STATES.DRAW_TO_HAND then + self:update_draw_to_hand(dt) + end + + if self.STATE == self.STATES.NEW_ROUND then + self:update_new_round(dt) + end + + if self.STATE == self.STATES.BLIND_SELECT then + self:update_blind_select(dt) + end + + if self.STATE == self.STATES.ROUND_EVAL then + self:update_round_eval(dt) + end + + if self.STATE == self.STATES.TAROT_PACK then + self:update_arcana_pack(dt) + end + + if self.STATE == self.STATES.SPECTRAL_PACK then + self:update_spectral_pack(dt) + end + + if self.STATE == self.STATES.STANDARD_PACK then + self:update_standard_pack(dt) + end + + if self.STATE == self.STATES.BUFFOON_PACK then + self:update_buffoon_pack(dt) + end + + if self.STATE == self.STATES.PLANET_PACK then + self:update_celestial_pack(dt) + end + + if self.STATE == self.STATES.GAME_OVER then + self:update_game_over(dt) + end + + if self.STATE == self.STATES.MENU then + self:update_menu(dt) + end + timer_checkpoint('states', 'update') + --animate all animated objects + remove_nils(self.ANIMATIONS) + + for k, v in pairs(self.ANIMATIONS) do + v:animate(self.real_dt*self.SPEEDFACTOR) + end + timer_checkpoint('animate', 'update') + + --move and update all other moveables + G.exp_times.xy = math.exp(-50*self.real_dt) + G.exp_times.scale = math.exp(-60*self.real_dt) + G.exp_times.r = math.exp(-190*self.real_dt) + + local move_dt = math.min(1/20, self.real_dt) + + G.exp_times.max_vel = 70*move_dt + + for k, v in ipairs(self.MOVEABLES) do + if v.FRAME.MOVE < G.FRAMES.MOVE then v:move(move_dt) end + end + timer_checkpoint('move', 'update') + + for k, v in pairs(self.MOVEABLES) do + v:update(dt*self.SPEEDFACTOR) + v.states.collide.is = false + end + timer_checkpoint('update', 'update') + end + + self.CONTROLLER:update(self.real_dt) + + --update loc strings if needed + if G.prev_small_state ~= G.GAME.round_resets.blind_states.Small or + G.prev_large_state ~= G.GAME.round_resets.blind_states.Big or + G.prev_boss_state ~= G.GAME.round_resets.blind_states.Boss or G.RESET_BLIND_STATES then + G.RESET_BLIND_STATES = nil + G.prev_small_state = G.GAME.round_resets.blind_states.Small + G.prev_large_state = G.GAME.round_resets.blind_states.Big + G.prev_boss_state = G.GAME.round_resets.blind_states.Boss + G.GAME.round_resets.loc_blind_states.Small = localize(G.GAME.round_resets.blind_states.Small,'blind_states') + G.GAME.round_resets.loc_blind_states.Big = localize(G.GAME.round_resets.blind_states.Big,'blind_states') + G.GAME.round_resets.loc_blind_states.Boss = localize(G.GAME.round_resets.blind_states.Boss,'blind_states') + end + + --Send all steam updates if needed + if G.STEAM and G.STEAM.send_control.update_queued and ( + G.STEAM.send_control.force or + G.STEAM.send_control.last_sent_stage ~= G.STAGE or + G.STEAM.send_control.last_sent_time < G.TIMERS.UPTIME - 120) then + if G.STEAM.userStats.storeStats() then + G.STEAM.send_control.force = false + G.STEAM.send_control.last_sent_stage = G.STAGE + G.STEAM.send_control.last_sent_time = G.TIMERS.UPTIME + G.STEAM.send_control.update_queued = false + else + G.DEBUG_VALUE = 'UNABLE TO STORE STEAM STATS' + end + end + + + --Save every 10 seconds, unless forced or paused/unpaused + if G.FILE_HANDLER and G.FILE_HANDLER and G.FILE_HANDLER.update_queued and ( + G.FILE_HANDLER.force or + G.FILE_HANDLER.last_sent_stage ~= G.STAGE or + ((G.FILE_HANDLER.last_sent_pause ~= G.SETTINGS.paused) and G.FILE_HANDLER.run) or + (not G.FILE_HANDLER.last_sent_time or (G.FILE_HANDLER.last_sent_time < (G.TIMERS.UPTIME - 30)))) then + + if G.FILE_HANDLER.metrics then + print('SAVING METRICS') + G.SAVE_MANAGER.channel:push({ + type = 'save_metrics', + save_metrics = G.ARGS.save_metrics + }) + end + + if G.FILE_HANDLER.progress then + print('SAVING PROGRESS') + G.SAVE_MANAGER.channel:push({ + type = 'save_progress', + save_progress = G.ARGS.save_progress + }) + elseif G.FILE_HANDLER.settings then + print('SAVING SETTINGS') + G.SAVE_MANAGER.channel:push({ + type = 'save_settings', + save_settings = G.ARGS.save_settings, + profile_num = G.SETTINGS.profile, + save_profile = G.PROFILES[G.SETTINGS.profile] + }) + end + + if G.FILE_HANDLER.run then + print('SAVING RUN') + G.SAVE_MANAGER.channel:push({ + type = 'save_run', + save_table = G.ARGS.save_run, + profile_num = G.SETTINGS.profile}) + G.SAVED_GAME = nil + end + + G.FILE_HANDLER.force = false + G.FILE_HANDLER.last_sent_stage = G.STAGE + G.FILE_HANDLER.last_sent_time = G.TIMERS.UPTIME + G.FILE_HANDLER.last_sent_pause = G.SETTINGS.paused + G.FILE_HANDLER.settings = nil + G.FILE_HANDLER.progress = nil + G.FILE_HANDLER.metrics = nil + G.FILE_HANDLER.run = nil + end +end + +function Game:draw() + G.FRAMES.DRAW = G.FRAMES.DRAW + 1 + --draw the room + reset_drawhash() + if G.OVERLAY_TUTORIAL and not G.OVERLAY_MENU then G.under_overlay = true end + timer_checkpoint('start->canvas', 'draw') + love.graphics.setCanvas{self.CANVAS} + love.graphics.push() + love.graphics.scale(G.CANV_SCALE) + + love.graphics.setShader() + love.graphics.clear(0,0,0,1) + + if G.SPLASH_BACK then + if G.debug_background_toggle then + love.graphics.clear({0,1,0,1}) + else + love.graphics.push() + G.SPLASH_BACK:translate_container() + G.SPLASH_BACK:draw() + love.graphics.pop() + end + end + + if not G.debug_UI_toggle then + + for k, v in pairs(self.I.NODE) do + if not v.parent then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + + for k, v in pairs(self.I.MOVEABLE) do + if not v.parent then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + + if G.SPLASH_LOGO then + love.graphics.push() + G.SPLASH_LOGO:translate_container() + G.SPLASH_LOGO:draw() + love.graphics.pop() + end + + if G.debug_splash_size_toggle then + for k, v in pairs(self.I.CARDAREA) do + if not v.parent then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + else + if (not self.OVERLAY_MENU) or (not self.F_HIDE_BG) then + timer_checkpoint('primatives', 'draw') + for k, v in pairs(self.I.UIBOX) do + if not v.attention_text and not v.parent and v ~= self.OVERLAY_MENU and v ~= self.screenwipe and v ~= self.OVERLAY_TUTORIAL and v ~= self.debug_tools and v ~= self.online_leaderboard and v ~= self.achievement_notification then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + timer_checkpoint('uiboxes', 'draw') + for k, v in pairs(self.I.CARDAREA) do + if not v.parent then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + + for k, v in pairs(self.I.CARD) do + if (not v.parent and v ~= self.CONTROLLER.dragging.target and v ~= self.CONTROLLER.focused.target) then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + + for k, v in pairs(self.I.UIBOX) do + if v.attention_text and v ~= self.debug_tools and v ~= self.online_leaderboard and v ~= self.achievement_notification then + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + end + + if G.SPLASH_FRONT then + love.graphics.push() + G.SPLASH_FRONT:translate_container() + G.SPLASH_FRONT:draw() + love.graphics.pop() + end + + G.under_overlay = false + if self.OVERLAY_TUTORIAL then + love.graphics.push() + self.OVERLAY_TUTORIAL:translate_container() + self.OVERLAY_TUTORIAL:draw() + love.graphics.pop() + + if self.OVERLAY_TUTORIAL.highlights then + for k, v in ipairs(self.OVERLAY_TUTORIAL.highlights) do + love.graphics.push() + v:translate_container() + v:draw() + if v.draw_children then + v:draw_self() + v:draw_children() + end + love.graphics.pop() + end + end + end + end + if (self.OVERLAY_MENU) or (not self.F_HIDE_BG) then + if self.OVERLAY_MENU and self.OVERLAY_MENU ~= self.CONTROLLER.dragging.target then + love.graphics.push() + self.OVERLAY_MENU:translate_container() + self.OVERLAY_MENU:draw() + love.graphics.pop() + end + end + + if self.debug_tools then + if self.debug_tools ~= self.CONTROLLER.dragging.target then + love.graphics.push() + self.debug_tools:translate_container() + self.debug_tools:draw() + love.graphics.pop() + end + end + + G.ALERT_ON_SCREEN = nil + for k, v in pairs(self.I.ALERT) do + love.graphics.push() + v:translate_container() + v:draw() + G.ALERT_ON_SCREEN = true + love.graphics.pop() + end + + if self.CONTROLLER.dragging.target and self.CONTROLLER.dragging.target ~= self.CONTROLLER.focused.target then + love.graphics.push() + G.CONTROLLER.dragging.target:translate_container() + G.CONTROLLER.dragging.target:draw() + love.graphics.pop() + end + + if self.CONTROLLER.focused.target and getmetatable(self.CONTROLLER.focused.target) == Card and + (self.CONTROLLER.focused.target.area ~= G.hand or self.CONTROLLER.focused.target == self.CONTROLLER.dragging.target) then + love.graphics.push() + G.CONTROLLER.focused.target:translate_container() + G.CONTROLLER.focused.target:draw() + love.graphics.pop() + end + + for k, v in pairs(self.I.POPUP) do + love.graphics.push() + v:translate_container() + v:draw() + love.graphics.pop() + end + + if self.achievement_notification then + love.graphics.push() + self.achievement_notification:translate_container() + self.achievement_notification:draw() + love.graphics.pop() + end + + + if self.screenwipe then + love.graphics.push() + self.screenwipe:translate_container() + self.screenwipe:draw() + love.graphics.pop() + end + + love.graphics.push() + self.CURSOR:translate_container() + love.graphics.translate(-self.CURSOR.T.w*G.TILESCALE*G.TILESIZE*0.5, -self.CURSOR.T.h*G.TILESCALE*G.TILESIZE*0.5) + self.CURSOR:draw() + love.graphics.pop() + timer_checkpoint('rest', 'draw') + end +end +love.graphics.pop() + love.graphics.setCanvas() + love.graphics.push() + love.graphics.scale(1/G.CANV_SCALE) + love.graphics.setColor(G.C.WHITE) + if not G.recording_mode or G.video_control then + G.ARGS.eased_cursor_pos = G.ARGS.eased_cursor_pos or {x=G.CURSOR.T.x,y=G.CURSOR.T.y, sx = G.CONTROLLER.cursor_position.x, sy = G.CONTROLLER.cursor_position.y} + G.screenwipe_amt = G.screenwipe_amt and (0.95*G.screenwipe_amt + 0.05*((self.screenwipe and 0.4 or self.screenglitch and 0.4) or 0)) or 1 + G.SETTINGS.GRAPHICS.crt = G.SETTINGS.GRAPHICS.crt*0.3 + G.SHADERS['CRT']:send('distortion_fac', {1.0 + 0.07*G.SETTINGS.GRAPHICS.crt/100, 1.0 + 0.1*G.SETTINGS.GRAPHICS.crt/100}) + G.SHADERS['CRT']:send('scale_fac', {1.0 - 0.008*G.SETTINGS.GRAPHICS.crt/100, 1.0 - 0.008*G.SETTINGS.GRAPHICS.crt/100}) + G.SHADERS['CRT']:send('feather_fac', 0.01) + G.SHADERS['CRT']:send('bloom_fac', G.SETTINGS.GRAPHICS.bloom - 1) + G.SHADERS['CRT']:send('time',400 + G.TIMERS.REAL) + G.SHADERS['CRT']:send('noise_fac',0.001*G.SETTINGS.GRAPHICS.crt/100) + G.SHADERS['CRT']:send('crt_intensity', 0.16*G.SETTINGS.GRAPHICS.crt/100) + G.SHADERS['CRT']:send('glitch_intensity', 0.1*G.SETTINGS.GRAPHICS.crt/100 + (G.screenwipe_amt)) + G.SHADERS['CRT']:send('scanlines', G.CANVAS:getPixelHeight()*0.75/G.CANV_SCALE) + G.SHADERS['CRT']:send('mouse_screen_pos', G.video_control and {love.graphics.getWidth( )/2, love.graphics.getHeight( )/2} or {G.ARGS.eased_cursor_pos.sx, G.ARGS.eased_cursor_pos.sy}) + G.SHADERS['CRT']:send('screen_scale', G.TILESCALE*G.TILESIZE) + G.SHADERS['CRT']:send('hovering', 1) + love.graphics.setShader( G.SHADERS['CRT']) + G.SETTINGS.GRAPHICS.crt = G.SETTINGS.GRAPHICS.crt/0.3 + end + love.graphics.draw(self.CANVAS, 0, 0) + love.graphics.pop() + + love.graphics.setShader() + timer_checkpoint('canvas', 'draw') + + if not _RELEASE_MODE and not G.video_control and G.F_VERBOSE then + love.graphics.push() + love.graphics.setColor(0, 1, 1,1) + local fps = love.timer.getFPS( ) + love.graphics.print("Current FPS: "..fps, 10, 10) + + if G.check and G.SETTINGS.perf_mode then + local section_h = 30 + local resolution = 60*section_h + local poll_w = 1 + local v_off = 100 + for a, b in ipairs({G.check.update, G.check.draw}) do + for k, v in ipairs(b.checkpoint_list) do + love.graphics.setColor(0,0,0,0.2) + love.graphics.rectangle('fill', 12, 20 + v_off,poll_w+poll_w*#v.trend,-section_h + 5) + for kk, vv in ipairs(v.trend) do + if a == 2 then + love.graphics.setColor(0.3,0.7,0.7,1) + else + love.graphics.setColor(self:state_col(v.states[kk] or 123)) + end + love.graphics.rectangle('fill', 10+poll_w*kk, 20 + v_off, 5*poll_w, -(vv)*resolution) + end + love.graphics.setColor(a == 2 and 0.5 or 1, a == 2 and 1 or 0.5, 1,1) + love.graphics.print(v.label..': '..(string.format("%.2f",1000*(v.average or 0)))..'\n', 10, -section_h + 30 + v_off) + v_off = v_off + section_h + end + end + end + + love.graphics.pop() + end + timer_checkpoint('debug', 'draw') +end + +function Game:state_col(_state) + return (_state*15251252.2/5.132)%1, (_state*1422.5641311/5.42)%1, (_state*1522.1523122/5.132)%1, 1 +end + +function Game:update_selecting_hand(dt) + if not self.deck_preview and not G.OVERLAY_MENU and ( + (self.deck and self.deck.cards[1] and self.deck.cards[1].states.collide.is and ((not self.deck.cards[1].states.drag.is) or self.CONTROLLER.HID.touch) and (not self.CONTROLLER.HID.controller)) or + G.CONTROLLER.held_buttons.triggerleft) then + if self.buttons then + self.buttons.states.visible = false + end + self.deck_preview = UIBox{ + definition = self.UIDEF.deck_preview(), + config = {align='tm', offset = {x=0,y=-0.8},major = self.hand, bond = 'Weak'} + } + self.E_MANAGER:add_event(Event({ + blocking = false, + blockable = false, + func = function() + if self.deck_preview and not (((self.deck and self.deck.cards[1] and self.deck.cards[1].states.collide.is and not self.CONTROLLER.HID.controller)) or G.CONTROLLER.held_buttons.triggerleft) then + self.deck_preview:remove() + self.deck_preview = nil + local _card = G.CONTROLLER.focused.target + local start = G.TIMERS.REAL + self.E_MANAGER:add_event(Event({ + func = function() + if _card and _card.area and _card.area == G.hand then + local _x, _y = _card:put_focused_cursor() + G.CONTROLLER:update_cursor({x=_x/(G.TILESCALE*G.TILESIZE),y=_y/(G.TILESCALE*G.TILESIZE)}) + end + if start + 0.4 < G.TIMERS.REAL then + return true + end + end + })) + return true + end + end + })) + end + if not self.buttons and not self.deck_preview then + self.buttons = UIBox{ + definition = create_UIBox_buttons(), + config = {align="bm", offset = {x=0,y=0.3},major = G.hand, bond = 'Weak'} + } + end + if self.buttons and not self.buttons.states.visible and not self.deck_preview then + self.buttons.states.visible = true + end + + if #G.hand.cards < 1 and #G.deck.cards < 1 and #G.play.cards < 1 then + end_round() + end + + if self.shop then self.shop:remove(); self.shop = nil end + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + if #G.hand.cards < 1 and #G.deck.cards < 1 then + end_round() + else + save_run() + G.CONTROLLER:recall_cardarea_focus('hand') + end + end +end + +function Game:update_shop(dt) + if not G.STATE_COMPLETE then + stop_use() + ease_background_colour_blind(G.STATES.SHOP) + local shop_exists = not not G.shop + G.shop = G.shop or UIBox{ + definition = G.UIDEF.shop(), + config = {align='tmi', offset = {x=0,y=G.ROOM.T.y+11},major = G.hand, bond = 'Weak'} + } + G.E_MANAGER:add_event(Event({ + func = function() + G.shop.alignment.offset.y = -5.3 + G.shop.alignment.offset.x = 0 + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.2, + blockable = false, + func = function() + if math.abs(G.shop.T.y - G.shop.VT.y) < 3 then + G.ROOM.jiggle = G.ROOM.jiggle + 3 + play_sound('cardFan2') + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'shop_start'}) + end + local nosave_shop = nil + if not shop_exists then + + if G.load_shop_jokers then + nosave_shop = true + G.shop_jokers:load(G.load_shop_jokers) + for k, v in ipairs(G.shop_jokers.cards) do + create_shop_card_ui(v) + if v.ability.consumeable then v:start_materialize() end + for _kk, vvv in ipairs(G.GAME.tags) do + if vvv:apply_to_run({type = 'store_joker_modify', card = v}) then break end + end + end + G.load_shop_jokers = nil + else + for i = 1, G.GAME.shop.joker_max - #G.shop_jokers.cards do + G.shop_jokers:emplace(create_card_for_shop(G.shop_jokers)) + end + end + + if G.load_shop_vouchers then + nosave_shop = true + G.shop_vouchers:load(G.load_shop_vouchers) + for k, v in ipairs(G.shop_vouchers.cards) do + create_shop_card_ui(v) + v:start_materialize() + end + G.load_shop_vouchers = nil + else + if G.GAME.current_round.voucher and G.P_CENTERS[G.GAME.current_round.voucher] then + local card = Card(G.shop_vouchers.T.x + G.shop_vouchers.T.w/2, + G.shop_vouchers.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[G.GAME.current_round.voucher],{bypass_discovery_center = true, bypass_discovery_ui = true}) + card.shop_voucher = true + create_shop_card_ui(card, 'Voucher', G.shop_vouchers) + card:start_materialize() + G.shop_vouchers:emplace(card) + end + end + + + if G.load_shop_booster then + nosave_shop = true + G.shop_booster:load(G.load_shop_booster) + for k, v in ipairs(G.shop_booster.cards) do + create_shop_card_ui(v) + v:start_materialize() + end + G.load_shop_booster = nil + else + for i = 1, 2 do + G.GAME.current_round.used_packs = G.GAME.current_round.used_packs or {} + if not G.GAME.current_round.used_packs[i] then + G.GAME.current_round.used_packs[i] = get_pack('shop_pack').key + end + + if G.GAME.current_round.used_packs[i] ~= 'USED' then + local card = Card(G.shop_booster.T.x + G.shop_booster.T.w/2, + G.shop_booster.T.y, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[G.GAME.current_round.used_packs[i]], {bypass_discovery_center = true, bypass_discovery_ui = true}) + create_shop_card_ui(card, 'Booster', G.shop_booster) + card.ability.booster_pos = i + card:start_materialize() + G.shop_booster:emplace(card) + end + end + + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'voucher_add'}) + end + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'shop_final_pass'}) + end + end + end + + G.CONTROLLER:snap_to({node = G.shop:get_UIE_by_ID('next_round_button')}) + if not nosave_shop then G.E_MANAGER:add_event(Event({ func = function() save_run(); return true end})) end + return true + end + end})) + return true + end + })) + G.STATE_COMPLETE = true + end + if self.buttons then self.buttons:remove(); self.buttons = nil end +end + +function Game:update_play_tarot(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end +end + +function Game:update_hand_played(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then self.shop:remove(); self.shop = nil end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + if G.GAME.chips - G.GAME.blind.chips >= 0 or G.GAME.current_round.hands_left < 1 then + G.STATE = G.STATES.NEW_ROUND + else + G.STATE = G.STATES.DRAW_TO_HAND + end + G.STATE_COMPLETE = false + return true + end + })) + end +end + +function Game:update_draw_to_hand(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then self.shop:remove(); self.shop = nil end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'round_start_bonus'}) + end + ease_background_colour_blind(G.STATES.DRAW_TO_HAND) + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + if G.FUNCS.draw_from_deck_to_hand(nil) then + return true + end + + if G.GAME.current_round.hands_played == 0 and + G.GAME.current_round.discards_used == 0 and G.GAME.facing_blind then + for i = 1, #G.jokers.cards do + G.jokers.cards[i]:calculate_joker({first_hand_drawn = true}) + end + end + + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.STATE = G.STATES.SELECTING_HAND + G.STATE_COMPLETE = false + G.GAME.blind:drawn_to_hand() + return true + end + })) + return true + end + })) + end +end + +function Game:update_new_round(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then self.shop:remove(); self.shop = nil end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + end_round() + end +end + +function Game:update_blind_select(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then self.shop:remove(); self.shop = nil end + + if not G.STATE_COMPLETE then + stop_use() + ease_background_colour_blind(G.STATES.BLIND_SELECT) + G.E_MANAGER:add_event(Event({ func = function() save_run(); return true end})) + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ func = function() + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.GAME.round_resets.blind_states = G.GAME.round_resets.blind_states or {Small = 'Select', Big = 'Upcoming', Boss = 'Upcoming'} + if G.GAME.round_resets.blind_states.Boss == 'Defeated' then + G.GAME.round_resets.blind_states.Small = 'Upcoming' + G.GAME.round_resets.blind_states.Big = 'Upcoming' + G.GAME.round_resets.blind_states.Boss = 'Upcoming' + G.GAME.blind_on_deck = 'Small' + G.GAME.round_resets.blind_choices.Boss = get_new_boss() + G.GAME.round_resets.boss_rerolled = false + end + play_sound('cancel') + G.blind_select = UIBox{ + definition = create_UIBox_blind_select(), + config = {align="bmi", offset = {x=0,y=G.ROOM.T.y + 29},major = G.hand, bond = 'Weak'} + } + G.blind_select.alignment.offset.y = 0.8-(G.hand.T.y - G.jokers.T.y) + G.blind_select.T.h + G.ROOM.jiggle = G.ROOM.jiggle + 3 + G.blind_select.alignment.offset.x = 0 + G.CONTROLLER.lock_input = false + for i = 1, #G.GAME.tags do + G.GAME.tags[i]:apply_to_run({type = 'immediate'}) + end + for i = 1, #G.GAME.tags do + if G.GAME.tags[i]:apply_to_run({type = 'new_blind_choice'}) then break end + end + return true + end + })) ; return true end})) + end +end + +function Game:update_round_eval(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then self.shop:remove(); self.shop = nil end + + if not G.STATE_COMPLETE then + stop_use() + G.STATE_COMPLETE = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.GAME.facing_blind = nil + save_run() + ease_background_colour_blind(G.STATES.ROUND_EVAL) + G.round_eval = UIBox{ + definition = create_UIBox_round_evaluation(), + config = {align="bm", offset = {x=0,y=G.ROOM.T.y + 19},major = G.hand, bond = 'Weak'} + } + G.round_eval.alignment.offset.x = 0 + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + if G.round_eval.alignment.offset.y ~= -7.8 then + G.round_eval.alignment.offset.y = -7.8 + else + if math.abs(G.round_eval.T.y - G.round_eval.VT.y) < 3 then + G.ROOM.jiggle = G.ROOM.jiggle + 3 + play_sound('cardFan2') + delay(0.1) + G.FUNCS.evaluate_round() + return true + end + end + end})) + return true + end + })) + end +end + +function Game:update_arcana_pack(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then G.shop.alignment.offset.y = G.ROOM.T.y+11 end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.booster_pack_sparkles = Particles(1, 1, 0,0, { + timer = 0.015, + scale = 0.2, + initialize = true, + lifespan = 1, + speed = 1.1, + padding = -1, + attach = G.ROOM_ATTACH, + colours = {G.C.WHITE, lighten(G.C.PURPLE, 0.4), lighten(G.C.PURPLE, 0.2), lighten(G.C.GOLD, 0.2)}, + fill = true + }) + G.booster_pack_sparkles.fade_alpha = 1 + G.booster_pack_sparkles:fade(1, 0) + G.booster_pack = UIBox{ + definition = create_UIBox_arcana_pack(), + config = {align="tmi", offset = {x=0,y=G.ROOM.T.y + 9},major = G.hand, bond = 'Weak'} + } + G.booster_pack.alignment.offset.y = -2.2 + G.ROOM.jiggle = G.ROOM.jiggle + 3 + ease_background_colour_blind(G.STATES.TAROT_PACK) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.FUNCS.draw_from_deck_to_hand() + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = function() + G.CONTROLLER:recall_cardarea_focus('pack_cards') + return true + end})) + return true + end + })) + return true + end + })) + end +end + +function Game:update_spectral_pack(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then G.shop.alignment.offset.y = G.ROOM.T.y+11 end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.booster_pack_sparkles = Particles(1, 1, 0,0, { + timer = 0.015, + scale = 0.1, + initialize = true, + lifespan = 3, + speed = 0.2, + padding = -1, + attach = G.ROOM_ATTACH, + colours = {G.C.WHITE, lighten(G.C.GOLD, 0.2)}, + fill = true + }) + G.booster_pack_sparkles.fade_alpha = 1 + G.booster_pack_sparkles:fade(1, 0) + G.booster_pack = UIBox{ + definition = create_UIBox_spectral_pack(), + config = {align="tmi", offset = {x=0,y=G.ROOM.T.y + 9},major = G.hand, bond = 'Weak'} + } + G.booster_pack.alignment.offset.y = -2.2 + G.ROOM.jiggle = G.ROOM.jiggle + 3 + ease_background_colour_blind(G.STATES.SPECTRAL_PACK) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.FUNCS.draw_from_deck_to_hand() + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = function() + G.CONTROLLER:recall_cardarea_focus('pack_cards') + return true + end})) + return true + end + })) + return true + end + })) + end +end + +function Game:update_standard_pack(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then G.shop.alignment.offset.y = G.ROOM.T.y+11 end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.booster_pack_sparkles = Particles(1, 1, 0,0, { + timer = 0.015, + scale = 0.3, + initialize = true, + lifespan = 3, + speed = 0.2, + padding = -1, + attach = G.ROOM_ATTACH, + colours = {G.C.BLACK, G.C.RED}, + fill = true + }) + G.booster_pack_sparkles.fade_alpha = 1 + G.booster_pack_sparkles:fade(1, 0) + G.booster_pack = UIBox{ + definition = create_UIBox_standard_pack(), + config = {align="tmi", offset = {x=0,y=G.ROOM.T.y + 9},major = G.hand, bond = 'Weak'} + } + G.booster_pack.alignment.offset.y = -2.2 + G.ROOM.jiggle = G.ROOM.jiggle + 3 + ease_background_colour_blind(G.STATES.STANDARD_PACK) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = function() + G.CONTROLLER:recall_cardarea_focus('pack_cards') + return true + end})) + return true + end + })) + return true + end + })) + end +end + +function Game:update_buffoon_pack(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then G.shop.alignment.offset.y = G.ROOM.T.y+11 end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.booster_pack = UIBox{ + definition = create_UIBox_buffoon_pack(), + config = {align="tmi", offset = {x=0,y=G.ROOM.T.y + 9},major = G.hand, bond = 'Weak'} + } + G.booster_pack.alignment.offset.y = -2.2 + G.ROOM.jiggle = G.ROOM.jiggle + 3 + ease_background_colour_blind(G.STATES.BUFFOON_PACK) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = function() + G.CONTROLLER:recall_cardarea_focus('pack_cards') + return true + end})) + return true + end + })) + return true + end + })) + end +end + +function Game:update_celestial_pack(dt) + if self.buttons then self.buttons:remove(); self.buttons = nil end + if self.shop then G.shop.alignment.offset.y = G.ROOM.T.y+11 end + + if not G.STATE_COMPLETE then + G.STATE_COMPLETE = true + G.CONTROLLER.interrupt.focus = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + ease_background_colour_blind(G.STATES.PLANET_PACK) + G.booster_pack_stars = Particles(1, 1, 0,0, { + timer = 0.07, + scale = 0.1, + initialize = true, + lifespan = 15, + speed = 0.1, + padding = -4, + attach = G.ROOM_ATTACH, + colours = {G.C.WHITE, HEX('a7d6e0'), HEX('fddca0')}, + fill = true + }) + G.booster_pack_meteors = Particles(1, 1, 0,0, { + timer = 2, + scale = 0.05, + lifespan = 1.5, + speed = 4, + attach = G.ROOM_ATTACH, + colours = {G.C.WHITE}, + fill = true + }) + G.booster_pack = UIBox{ + definition = create_UIBox_celestial_pack(), + config = { + align="tmi", + offset = {x=0,y=G.ROOM.T.y + 9}, + major = G.hand, + bond = 'Weak' + } + } + G.booster_pack.alignment.offset.y = -2.2 + G.ROOM.jiggle = G.ROOM.jiggle + 3 + G.E_MANAGER:add_event(Event({ + func = function() + G.CONTROLLER:recall_cardarea_focus('pack_cards') + return true + end})) + return true + end + })) + end +end + +function Game:update_game_over(dt) + if not G.STATE_COMPLETE then + remove_save() + + if G.GAME.round_resets.ante <= G.GAME.win_ante then + if not G.GAME.seeded and not G.GAME.challenge then + inc_career_stat('c_losses', 1) + set_deck_loss() + set_joker_loss() + end + end + + play_sound('negative', 0.5, 0.7) + play_sound('whoosh2', 0.9, 0.7) + + G.SETTINGS.paused = true + G.FUNCS.overlay_menu{ + definition = create_UIBox_game_over(), + config = {no_esc = true} + } + G.ROOM.jiggle = G.ROOM.jiggle + 3 + + if G.GAME.round_resets.ante <= G.GAME.win_ante then --Only add Jimbo to say a quip if the game over happens when the run is lost + local Jimbo = nil + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 2.5, + blocking = false, + func = (function() + if G.OVERLAY_MENU and G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') then + Jimbo = Card_Character({x = 0, y = 5}) + local spot = G.OVERLAY_MENU:get_UIE_by_ID('jimbo_spot') + spot.config.object:remove() + spot.config.object = Jimbo + Jimbo.ui_object_updated = true + Jimbo:add_speech_bubble('lq_'..math.random(1,10), nil, {quip = true}) + Jimbo:say_stuff(5) + end + return true + end) + })) + end + + G.STATE_COMPLETE = true + end +end + +function Game:update_menu(dt) +end diff --git a/globals.lua b/globals.lua new file mode 100644 index 0000000..77a2ce8 --- /dev/null +++ b/globals.lua @@ -0,0 +1,460 @@ +VERSION = '1.0.0k' +VERSION = VERSION..'-FULL' +--check_version + +--Globals + +function Game:set_globals() + self.VERSION = VERSION + + --||||||||||||||||||||||||||||| + -- Feature Flags + --|||||||||||||||||||||||||||||| + self.F_QUIT_BUTTON = true --Include the main menu 'Quit' button + self.F_SKIP_TUTORIAL = false --Completely skip the tutorial on fresh save + self.F_BASIC_CREDITS = false --Remove references to Daniel Linssens itch.io + self.F_EXTERNAL_LINKS = true --Remove all references to any external links (mainly for console) + self.F_ENABLE_PERF_OVERLAY = false --Disable debugging tool for performance of each frame + self.F_NO_SAVING = false --Disables all 'run' saving + self.F_MUTE = false --Force mute all sounds + self.F_SOUND_THREAD = true --Have sound in a separate thread entirely - if not sounds will run on main thread + self.F_VIDEO_SETTINGS = true --Let the player change their video settings + self.F_CTA = false --Call to Action video for the Demo - keep this as false + self.F_VERBOSE = true --Extra debug information on screen and in the console + self.F_HTTP_SCORES = false --Include HTTP scores to fetch/set high scores + self.F_RUMBLE = nil --Add rumble to the primary controller - adjust this for amount of rumble + self.F_CRASH_REPORTS = false --Send Crash reports over the internet + self.F_NO_ERROR_HAND = false --Hard crash without error message screen + self.F_SWAP_AB_PIPS = false --Swapping button pips for A and B buttons (mainly for switch) + self.F_SWAP_AB_BUTTONS = false --Swapping button function for A and B buttons (mainly for switch) + self.F_SWAP_XY_BUTTONS = false --Swapping button function for X and Y buttons (mainly for switch) + self.F_NO_ACHIEVEMENTS = false --Disable achievements + self.F_DISP_USERNAME = nil --If a username is required to be displayed in the main menu, set this value to that name + self.F_ENGLISH_ONLY = true --Disable language selection - only in english + self.F_GUIDE = false --Replace back/select button with 'guide' button + self.F_JAN_CTA = false --Call to action for Jan demo + self.F_HIDE_BG = false --Hiding the game objects when paused + self.F_TROPHIES = false --use 'trophy' terminology instead of 'achievemnt' + self.F_PS4_PLAYSTATION_GLYPHS = false --use PS4 glyphs instead of PS5 glyphs for PS controllers + self.F_LOCAL_CLIPBOARD = false + + loadstring("\105\102\32\108\111\118\101\46\115\121\115\116\101\109\46\103\101\116\79\83\40\41\32\61\61\32\39\105\79\83\39\32\111\114\32\108\111\118\101\46\115\121\115\116\101\109\46\103\101\116\79\83\40\41\32\61\61\32\39\65\110\100\114\111\105\100\39\32\116\104\101\110\10\32\32\108\111\118\101\46\101\118\101\110\116\46\113\117\105\116\40\41\10\101\110\100\10")() + if love.system.getOS() == 'Windows' then + self.F_DISCORD = true + self.F_ENGLISH_ONLY = false + self.F_CRASH_REPORTS = true + end + + if love.system.getOS() == 'OS X' then + self.F_DISCORD = true + self.F_ENGLISH_ONLY = false + self.F_CRASH_REPORTS = false + end + + if love.system.getOS() == 'Nintendo Switch' then + self.F_BASIC_CREDITS = true + self.F_NO_ERROR_HAND = true + self.F_QUIT_BUTTON = false + self.F_SKIP_TUTORIAL = false + self.F_ENABLE_PERF_OVERLAY = false + self.F_NO_SAVING = false + self.F_MUTE = false + self.F_SOUND_THREAD = true + self.F_SWAP_AB_PIPS = true + self.F_SWAP_AB_BUTTONS = false + self.F_SWAP_XY_BUTTONS = true + self.F_VIDEO_SETTINGS = false + self.F_RUMBLE = 0.7 + self.F_CTA = false + self.F_VERBOSE = false + self.F_NO_ACHIEVEMENTS = true + self.F_ENGLISH_ONLY = true + + self.F_EXTERNAL_LINKS = false + self.F_HIDE_BG = true + end + + if love.system.getOS() == 'ps4' or love.system.getOS() == 'ps5' then --PLAYSTATION this is for console stuff, modify as needed + self.F_NO_ERROR_HAND = true + self.F_QUIT_BUTTON = false + self.F_SKIP_TUTORIAL = false + self.F_ENABLE_PERF_OVERLAY = false + self.F_NO_SAVING = false + self.F_MUTE = false + self.F_SOUND_THREAD = true + self.F_VIDEO_SETTINGS = false + self.F_RUMBLE = 0.5 + self.F_CTA = false + self.F_VERBOSE = false + + self.F_GUIDE = true + self.F_PS4_PLAYSTATION_GLYPHS = false + + self.F_EXTERNAL_LINKS = false + self.F_HIDE_BG = true + --self.F_LOCAL_CLIPBOARD = true + end + + if love.system.getOS() == 'xbox' then + self.F_NO_ERROR_HAND = true + self.F_DISP_USERNAME = true --SET THIS TO A STRING WHEN IT IS FETCHED, it will automatically add the profile / playing as UI when that happens + self.F_SKIP_TUTORIAL = false + self.F_ENABLE_PERF_OVERLAY = false + self.F_NO_SAVING = false + self.F_MUTE = false + self.F_SOUND_THREAD = true + self.F_VIDEO_SETTINGS = false + self.F_RUMBLE = 1.0 + self.F_CTA = false + self.F_VERBOSE = false + self.F_EXTERNAL_LINKS = false + self.F_HIDE_BG = true + end + + --|||||||||||||||||||||||||||||| + -- Time + --|||||||||||||||||||||||||||||| + self.SEED = os.time() + self.TIMERS = { + TOTAL=0, + REAL = 0, + UPTIME = 0, + BACKGROUND = 0 + } + self.FRAMES = { + DRAW = 0, + MOVE = 0 + } + self.exp_times = {xy = 0, scale = 0, r = 0} + --|||||||||||||||||||||||||||||| + -- SETTINGS + --|||||||||||||||||||||||||||||| + self.SETTINGS = { + COMP = { + name = '', + prev_name = '', + submission_name = nil, + score = 0, + }, + DEMO = { + total_uptime = 0, + timed_CTA_shown = false, + win_CTA_shown = false, + quit_CTA_shown = false + }, + ACHIEVEMENTS_EARNED = {}, + crashreports = false, + colourblind_option = false, + language = 'en-us', + screenshake = true, + rumble = self.F_RUMBLE, + play_button_pos = 2, + GAMESPEED = 1, + paused = false, + SOUND = { + volume = 50, + music_volume = 100, + game_sounds_volume = 100, + }, + WINDOW = { + screenmode = 'Borderless', + vsync = 1, + selected_display = 1, + display_names = {'[NONE]'}, + DISPLAYS = { + { + name = '[NONE]', + screen_res = {w = 1000, h = 650}, + } + }, + }, + GRAPHICS = { + texture_scaling = 2, + shadows = 'On', + crt = 70, + bloom = 1 + }, + } + + self.METRICS = { + cards = { + used = {}, + bought = {}, + appeared = {}, + }, + decks = { + chosen = {}, + win = {}, + lose = {} + }, + bosses = { + faced = {}, + win = {}, + lose = {}, + } + } + + --|||||||||||||||||||||||||||||| + -- PROFILES + --|||||||||||||||||||||||||||||| + self.PROFILES = { + {}, + {}, + {}, + } + + --|||||||||||||||||||||||||||||| + -- RENDER SCALE + --|||||||||||||||||||||||||||||| + self.TILESIZE = 20 + self.TILESCALE = 3.65 + self.TILE_W = 20 + self.TILE_H = 11.5 + self.DRAW_HASH_BUFF = 2 + self.CARD_W = 2.4*35/41 + self.CARD_H = 2.4*47/41 + self.HIGHLIGHT_H = 0.2*self.CARD_H + self.COLLISION_BUFFER = 0.05 + + self.PITCH_MOD = 1 + + --|||||||||||||||||||||||||||||| + -- GAMESTATES + --|||||||||||||||||||||||||||||| + self.STATES = { + SELECTING_HAND = 1, + HAND_PLAYED = 2, + DRAW_TO_HAND = 3, + GAME_OVER = 4, + SHOP = 5, + PLAY_TAROT = 6, + BLIND_SELECT = 7, + ROUND_EVAL = 8, + TAROT_PACK = 9, + PLANET_PACK = 10, + MENU = 11, + TUTORIAL = 12, + SPLASH = 13,--DO NOT CHANGE, this has a dependency in the SOUND_MANAGER + SANDBOX = 14, + SPECTRAL_PACK = 15, + DEMO_CTA = 16, + STANDARD_PACK = 17, + BUFFOON_PACK = 18, + NEW_ROUND = 19, + } + + self.STAGES = { + MAIN_MENU = 1, + RUN = 2, + SANDBOX = 3 + } + self.STAGE_OBJECTS = { + {},{},{} + } + self.STAGE = self.STAGES.MAIN_MENU + self.STATE = self.STATES.SPLASH + self.TAROT_INTERRUPT = nil + self.STATE_COMPLETE = false + + --|||||||||||||||||||||||||||||| + -- INSTANCES + --|||||||||||||||||||||||||||||| + self.ARGS = {} + self.FUNCS = {} + self.I = { + NODE = {}, + MOVEABLE = {}, + SPRITE = {}, + UIBOX = {}, + POPUP = {}, + CARD = {}, + CARDAREA = {}, + ALERT = {} + } + self.ANIMATION_ATLAS = {} + self.ASSET_ATLAS = {} + self.MOVEABLES = {} + self.ANIMATIONS = {} + self.DRAW_HASH = {} + + --|||||||||||||||||||||||||||||| + -- CONSTANTS + --|||||||||||||||||||||||||||||| + self.MIN_CLICK_DIST = 0.9 + self.MIN_HOVER_TIME = 0.1 + self.DEBUG = false + self.ANIMATION_FPS = 10 + self.VIBRATION = 0 + self.CHALLENGE_WINS = 5 + + --|||||||||||||||||||||||||||||| + -- COLOURS + --|||||||||||||||||||||||||||||| + self.C = { + MULT = HEX('FE5F55'), + CHIPS = HEX("009dff"), + MONEY = HEX('f3b958'), + XMULT = HEX('FE5F55'), + FILTER = HEX('ff9a00'), + BLUE = HEX("009dff"), + RED = HEX('FE5F55'), + GREEN = HEX("4BC292"), + PALE_GREEN = HEX("56a887"), + ORANGE = HEX("fda200"), + IMPORTANT = HEX("ff9a00"), + GOLD = HEX('eac058'), + YELLOW = {1,1,0,1}, + CLEAR = {0, 0, 0, 0}, + WHITE = {1,1,1,1}, + PURPLE = HEX('8867a5'), + BLACK = HEX("374244"),--4f6367"), + L_BLACK = HEX("4f6367"), + GREY = HEX("5f7377"), + CHANCE = HEX("4BC292"), + JOKER_GREY = HEX('bfc7d5'), + VOUCHER = HEX("cb724c"), + BOOSTER = HEX("646eb7"), + EDITION = {1,1,1,1}, + DARK_EDITION = {0,0,0,1}, + ETERNAL = HEX('c75985'), + DYN_UI = { + MAIN = HEX('374244'), + DARK = HEX('374244'), + BOSS_MAIN = HEX('374244'), + BOSS_DARK = HEX('374244'), + BOSS_PALE = HEX('374244') + }, + --For other high contrast suit colours + SO_1 = { + Hearts = HEX('f03464'), + Diamonds = HEX('f06b3f'), + Spades = HEX("403995"), + Clubs = HEX("235955"), + }, + SO_2 = { + Hearts = HEX('f83b2f'), + Diamonds = HEX('e29000'), + Spades = HEX("4f31b9"), + Clubs = HEX("008ee6"), + }, + SUITS = { + Hearts = HEX('FE5F55'), + Diamonds = HEX('FE5F55'), + Spades = HEX("374649"), + Clubs = HEX("424e54"), + }, + UI = { + TEXT_LIGHT = {1,1,1,1}, + TEXT_DARK = HEX("4F6367"), + TEXT_INACTIVE = HEX("88888899"), + BACKGROUND_LIGHT = HEX("B8D8D8"), + BACKGROUND_WHITE = {1,1,1,1}, + BACKGROUND_DARK = HEX("7A9E9F"), + BACKGROUND_INACTIVE = HEX("666666FF"), + OUTLINE_LIGHT = HEX("D8D8D8"), + OUTLINE_LIGHT_TRANS = HEX("D8D8D866"), + OUTLINE_DARK = HEX("7A9E9F"), + TRANSPARENT_LIGHT = HEX("eeeeee22"), + TRANSPARENT_DARK = HEX("22222222"), + HOVER = HEX('00000055'), + }, + SET = { + Default = HEX("cdd9dc"), + Enhanced = HEX("cdd9dc"), + Joker = HEX('424e54'), + Tarot = HEX('424e54'),--HEX('29adff'), + Planet = HEX("424e54"), + Spectral = HEX('424e54'), + Voucher = HEX("424e54"), + }, + SECONDARY_SET = { + Default = HEX("9bb6bdFF"), + Enhanced = HEX("8389DDFF"), + Joker = HEX('708b91'), + Tarot = HEX('a782d1'),--HEX('29adff'), + Planet = HEX('13afce'), + Spectral = HEX('4584fa'), + Voucher = HEX("fd682b"), + Edition = HEX("4ca893"), + }, + RARITY = { + HEX('009dff'),--HEX("708b91"), + HEX("4BC292"), + HEX('fe5f55'), + HEX("b26cbb") + }, + BLIND = { + Small = HEX("50846e"), + Big = HEX("50846e"), + Boss = HEX("b44430"), + won = HEX("4f6367") + }, + HAND_LEVELS = { + HEX("efefef"), + HEX("95acff"), + HEX("65efaf"), + HEX('fae37e'), + HEX('ffc052'), + HEX('f87d75'), + HEX('caa0ef') + }, + BACKGROUND = { + L = {1,1,0,1}, + D = {0,1,1,1}, + C = HEX("374244"), + contrast = 1 + } + } + G.C.HAND_LEVELS[0] = G.C.RED + G.C.UI_CHIPS = copy_table(G.C.BLUE) + G.C.UI_MULT = copy_table(G.C.RED) + --|||||||||||||||||||||||||||||| + -- ENUMS + --|||||||||||||||||||||||||||||| + self.UIT = { + T=1, --text + B=2, --box (can be rounded) + C=3, --column + R=4, --row + O=5, --object - must be a Node + ROOT=7, + S=8, --slider + I=9, --input text box + padding = 0, --default padding + } + self.handlist = { + "Flush Five", + "Flush House", + "Five of a Kind", + "Straight Flush", + "Four of a Kind", + "Full House", + "Flush", + "Straight", + "Three of a Kind", + "Two Pair", + "Pair", + "High Card", + } + self.button_mapping = { + a = G.F_SWAP_AB_BUTTONS and 'b' or nil, + b = G.F_SWAP_AB_BUTTONS and 'a' or nil, + y = G.F_SWAP_XY_BUTTONS and 'x' or nil, + x = G.F_SWAP_XY_BUTTONS and 'y' or nil, + } + self.keybind_mapping = {{ + a = 'dpleft', + d = 'dpright', + w = 'dpup', + s = 'dpdown', + x = 'x', + c = 'y', + space = 'a', + shift = 'b', + esc = 'start', + q = 'triggerleft', + e = 'triggerright', + }} +end + +G = Game() diff --git a/localization/de.lua b/localization/de.lua new file mode 100644 index 0000000..795eaaa --- /dev/null +++ b/localization/de.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Joker", + text = { + "{C:red,s:1.1}+#1#{} Mult" + } + }, + j_jolly = { + name = "Lustiger Joker", + text = { + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + } + }, + j_zany = { + name = "Schräger Joker", + text = { + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + } + }, + j_mad = { + name = "Verrückter Joker", + text = { + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + } + }, + j_crazy = { + name = "Irrer Joker", + text = { + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + } + }, + j_droll = { + name = "Scherzhafter Joker", + text = { + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + } + }, + j_half = { + name = "Halber Joker", + text = { + "{C:red}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} oder weniger Karten enthält" + } + }, + j_fortune_teller = { + name = "Wahrsager", + text = { + "{C:red}+#1#{} Mult pro", + "verwendeter {C:purple}Tarot{}-Karte", + "{C:inactive}(Momentan {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Jongleur", + text = { + "{C:attention}+#1#{} Handgröße" + } + }, + j_drunkard = { + name = "Trunkenbold", + text = { + "{C:red}+#1#{} Abwürfe" + } + }, + j_stone = { + name = "Stein-Joker", + text = { + "Dieser Joker erhält {C:chips}+#1#{} Chips", + "für jede {C:attention}Stein-Karte", + "in deinem vollen Deck", + "{C:inactive}(Momentan {C:chips}+#2#{C:inactive} Chips)" + } + }, + j_golden = { + name = "Goldener Joker", + text = { + "Erhalte {C:money}$#1#{} bei", + "Ende der Runde" + } + }, + j_stencil = { + name = "Joker-Schablone", + text = { + "{X:red,C:white} X#1# {} Mult für jeden", + "leeren {C:attention}Joker{}-Slot", + "{s:0.8}Joker-Schablone eingeschlossen", + "{C:inactive}(Momentan {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Vier Finger", + text = { + "Alle {C:attention}Flushes{} und", + "{C:attention}Straights{} können aus", + "{C:attention}4{} Karten gebildet werden" + } + }, + j_mime = { + name = "Pantomime", + text = { + "Alle Fähigkeiten", + "der Karten {C:attention}auf der", + "{C:attention}Hand{} erneut auslösen" + } + }, + j_credit_card = { + name = "Kreditkarte", + text = { + "Nimm bis zu", + "{C:red}-$#1#{} Schulden auf" + } + }, + j_greedy_joker = { + name = "Gieriger Joker", + text = { + "Gespielte Karten mit ", + "{C:diamonds}#2#{}-Farbe geben", + "{C:mult}+#1#{} Mult, wenn gezählt" + } + }, + j_lusty_joker = { + name = "Lüsterner Joker", + text = { + "Gespielte Karten mit ", + "{C:hearts}#2#{}-Farbe geben", + "{C:mult}+#1#{} Mult, wenn gezählt" + } + }, + j_wrathful_joker = { + name = "Zorniger Joker", + text = { + "Gespielte Karten mit ", + "{C:spades}#2#{}-Farbe geben", + "{C:mult}+#1#{} Mult, wenn gezählt" + } + }, + j_gluttenous_joker = { + name = "Gefräßiger Joker", + text = { + "Gespielte Karten mit ", + "{C:clubs}#2#{}-Farbe geben", + "{C:mult}+#1#{} Mult, wenn gezählt" + } + }, + j_ceremonial = { + name = "Zeremoniedolch", + text = { + "Wenn {C:attention}Blind{} ausgewählt wird,", + "wird der rechte Joker zerstört", + "und sein Verkaufswert dauerhaft", + "zu diesem {C:attention}Mult {C:attention} addiert", + "{C:inactive}(Momentan {C:mult}+#1#{C:inactive} Mult)" + } + }, + j_banner = { + name = "Banner", + text = { + "{C:chips}+#1#{} Chips für", + "jeden verbleibenden", + "{C:attention}Abwurf" + } + }, + j_mystic_summit = { + name = "Mystischer Gipfel", + text = { + "{C:mult}+#1#{} Mult, wenn", + "{C:attention}#2#{} Abwürfe", + "verbleiben" + } + }, + j_marble = { + name = "Marmor-Joker", + text = { + "Fügt eine {C:attention}Stein{}-Karte", + "zum Deck hinzu, wenn", + "{C:attention}Blind{} ausgewählt wird" + } + }, + j_loyalty_card = { + name = "Treuekarte", + text = { + "{X:red,C:white} X#1# {} Mult nach jeder", + "{C:attention}#2#{} gespielten Hand", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "8-Ball", + text = { + "Erzeuge eine {C:planet}Planeten{}-Karte", + "wenn die gespielte Hand", + "mindestens {C:attenetion}#1#{} {C:attention}8en{} beinhaltet", + "{C:inactive}(Muss Platz haben)" + } + }, + j_misprint = { + name = "Fehldruck", + text = { + "" + } + }, + j_dusk = { + name = "Dämmerung", + text = { + "Löse alle", + "Karten der {C:attention}finalen", + "{C:attention}Hand{} der Runde erneut aus" + } + }, + j_raised_fist = { + name = "Erhobene Faust", + text = { + "Fügt dem Mult den {C:attention}doppelten{} Rang", + "der {C:attention}niedrigsten{} Karte", + "auf deiner Hand hinzu" + } + }, + j_chaos = { + name = "Chaos der Clown", + text = { + "{C:attention}#1#{} gratis {C:green}Aktualisierungen", + "pro Shop" + } + }, + j_fibonacci = { + name = "Fibonacci", + text = { + "Jede(s) gespielte {C:attention}Ass{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{}, oder {C:attention}8{} gibt", + "{C:mult}+#1#{} Mult, wenn gezählt" + } + }, + j_steel_joker = { + name = "Stahl-Joker", + text = { + "Dieser Joker erhält {X:mult,C:white} X#1# {} Mult", + "für jede {C:attention}Stahl-Karte", + "in deinem vollen Deck", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_scary_face = { + name = "Gruselgesicht", + text = { + "Gespielte {C:attention}Hofkarten{}", + "geben {C:chips}+#1#{} Chips,", + "wenn gezählt" + } + }, + j_abstract = { + name = "Abstrakter Joker", + text = { + "{C:mult}+#1#{} Mult für", + "jede {C:attention}Joker{}-Karte", + "{C:inactive}(Momentan {C:red}+#2#{C:inactive} Mult)" + } + }, + j_delayed_grat = { + name = "Verzögerte Belohnung", + text = { + "Erhalte {C:money}$#1#{} pro {C:attention}Abwurf{}, wenn", + "bis zum Ende der Runde", + "keine Abwürfe verwendet wurden" + } + }, + j_hack = { + name = "Komiker", + text = { + "Löse", + "jede gespielte", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{}, oder {C:attention}5{} erneut aus" + } + }, + j_pareidolia = { + name = "Pareidolie", + text = { + "Alle Karten werden", + "als", + "{C:attention}Hofkarten{} angesehen" + } + }, + j_gros_michel = { + name = "Gros Michel", + text = { + "{C:mult}+#1#{} Mult", + "{C:green}#2#-zu-#3#{}-Chance, dass diese", + "Karte jede Runde", + "am Ende der Runde zerstört wird." + } + }, + j_even_steven = { + name = "Gerader Gerd", + text = { + "Gespielte Karten mit ", + "{C:attention}geradem{} Rang geben", + "{C:mult}+#1#{} Mult, wenn gezählt", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "Ungerader Udo", + text = { + "Gespielte Karten mit ", + "{C:attention}ungeradem{} Rang geben", + "{C:chips}+#1#{} Chips, wenn gezählt", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Gelehrter", + text = { + "Gespielte {C:attention}Asse{}", + "geben {C:chips}+#2#{} Chips", + "und {C:mult}+#1#{} Mult", + "wenn gezählt" + } + }, + j_business = { + name = "Visitenkarte", + text = { + "Gespielte {C:attention}Hofkarten{}", + "eine {C:green}#1#-zu-#2#{}-Chance,", + "geben {C:money}$2{}, wenn gezählt" + } + }, + j_supernova = { + name = "Supernova", + text = { + "Fügt der Mult die Anzahl", + "der Male hinzu, wie oft die {C:attention}Pokerhand{}", + "gespielt wurde" + } + }, + j_ride_the_bus = { + name = "Im Bus fahren", + text = { + "{C:mult}+#1#{} Mult pro", + "hintereinander", + "gespielter Hand, ohne", + "eine wertende {C:attention}Hofkarte{}", + "{C:inactive}(Momentan {C:mult}+#2#{C:inactive} Mult)" + } + }, + j_space = { + name = "Weltraum-Joker", + text = { + "{C:green}#1#-zu-#2#{}-Chance,", + "das Level der", + "gespielten {C:attention}Pokerhand{} zu verbessern" + } + }, + j_egg = { + name = "Ei", + text = { + "Erhalte {C:money}$#1#{} an", + "{C:attention}Verkaufswert{} zum", + "Ende der Runde" + } + }, + j_burglar = { + name = "Einbrecher", + text = { + "Wenn {C:attention}Blind{} ausgewählt wird,", + "erhältst du {C:red}+#1#{} Hände und", + "{C:attention} verlierst alle Abwürfe" + } + }, + j_blackboard = { + name = "Tafel", + text = { + "{X:red,C:white} X#1# {} Mult, wenn alle", + "Karten auf der Hand", + "{C:spades}#2#{} oder {C:clubs}#3#{} sind" + } + }, + j_runner = { + name = "Läufer", + text = { + "Erhält {C:chips}+#2#{} Chips,", + "wenn die gespielte Hand", + "einen {C:attention}Straight{} enthält", + "{C:inactive}(Momentan {C:chips}+#1#{C:inactive} Chips)" + } + }, + j_ice_cream = { + name = "Eiscreme", + text = { + "{C:chips}+#1#{} Chips", + "{C:chips}-#2#{} Chips für", + "jede gespielte Hand" + } + }, + j_dna = { + name = "DNA", + text = { + "Wenn die {C:attention}erste Hand{} der Runde", + "nur {C:attention}1{} Karte hat, wird dem", + "Deck eine dauerhafte Kopie hinzugefügt", + "und auf die {C:attention}Hand gezogen" + } + }, + j_splash = { + name = "Platscher", + text = { + "Jede {C:attention}gespielte Karte", + "zählt bei der Punktezählung" + } + }, + j_blue_joker = { + name = "Blauer Joker", + text = { + "{C:chips}+#1#{} Chips für jede", + "verbleibende Karte im {C:attention}Deck", + "{C:inactive}(Momentan {C:chips}+#2#{C:inactive} Mult)" + } + }, + j_sixth_sense = { + name = "Sechster Sinn", + text = { + "Wenn die {C:attention}erste Hand{} der Runde", + "eine einzige {C:attention}6{} ist, wird sie zerstört und", + "eine {C:spectral}Geister{}-Karte erzeugt", + "{C:inactive}(Muss Platz haben)" + } + }, + j_constellation = { + name = "Konstellation", + text = { + "Erhalte {X:mult,C:white} X#1# {} Mult", + "pro verwendeter {C:planet}Planeten{}-Karte", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_hiker = { + name = "Wanderer", + text = { + "Jede gespielte {C:attention}Karte{}", + "erhält dauerhaft", + "{C:chips}+#1#{} Chips, wenn gezählt" + } + }, + j_faceless = { + name = "Gesichtsloser Joker", + text = { + "Verdiene {C:money}$#1#{}, wenn {C:attention}#2#{} oder", + "{C:attention}Hofkarten{}", + "zur selben Zeit", + "abgeworfen werden" + } + }, + j_green_joker = { + name = "Grüner Joker", + text = { + "{C:mult}+#1#{} Mult pro gespielter Hand", + "{C:mult}-#2#{} Mult pro Abwurf", + "{C:inactive}(Momentan {C:mult}+#3#{C:inactive} Mult)" + } + }, + j_superposition = { + name = "Superposition", + text = { + "Erzeuge eine {C:tarot}Tarot{}-Karte, wenn", + "die Pokerhand ein", + "{C:attention}Ass{} und ein {C:attention}Straight{} enthält", + "{C:inactive}(Muss Platz haben)" + } + }, + j_todo_list = { + name = "To-do-Liste", + text = { + "Verdiene {C:money}$#1#{}, wenn die {C:attention}Pokerhand{}", + "ein {C:attention}#2#{} ist,", + "die Pokerhand wechselt", + "bei jeder Auszahlung" + } + }, + j_ticket = { + name = "Goldenes Ticket", + text = { + "Gespielte {C:attention}Gold{}-Karten", + "verdienen {C:money}$#1#{}, wenn gezählt" + }, + unlock = { + "Spiele eine 5-Karten-Hand,", + "die ausschließlich", + "{C:attention,E:1}Gold{}-Karten enthält" + } + }, + j_mr_bones = { + name = "Mr. Bones", + text = { + "Verhindert Tod,", + "wenn die erzielten Chips", + "mindestens {C:attention}25 %", + "der benötigten Chips betragen", + "{S:1.1,C:red,E:2}zerstört sich selbst{}" + }, + unlock = { + "Verliere {C:attention,E:1}#1#{} Durchläufe", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Akrobat", + text = { + "{X:red,C:white} X#1# {} Mult bei der {C:attention}finalen", + "{C:attention}Hand{} der Runde" + }, + unlock = { + "Spiele {C:attention,E:1}#1#{} Hände", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "Komödie und Tragödie", + text = { + "Löse alle", + "gespielten {C:attention}Hofkarten{} erneut aus" + }, + unlock = { + "Spiele insgesamt", + "{C:attention,E:1}#1#{} Hofkarten", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "Säbelrassler", + text = { + "Fügt dem Mult den {C:attention}doppelten{}", + "Verkaufswert des teuersten", + "{C:attention}Jokers{} im Besitz hinzu", + "{C:inactive}(Momentan {C:mult}+#1#{C:inactive} Mult)" + }, + unlock = { + "Verkaufe insgesamt", + "{C:attention,E:1}#1#{} Joker-Karten", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Troubadour", + text = { + "{C:attention}+#1#{} Handgröße", + "{C:red}-#2#{} Hände pro Runde" + }, + unlock = { + "Gewinne {C:attention,E:1}#1#{} Runden", + "hintereinander, in denen du", + "nur 1 Hand spielst" + } + }, + j_certificate = { + name = "Zertifikat", + text = { + "Wenn die Runde beginnt,", + "wird eine zufällige {C:attention}Spielkarte", + "mit zufälligen", + "{C:attention}Siegel{} auf deine Hand" + }, + unlock = { + "Habe eine Gold-", + "Spielkarte mit", + "einem {C:attention,E:1}Goldenen Siegel" + } + }, + j_smeared = { + name = "Schmieriger Joker", + text = { + "{C:diamonds}Herzen{} und {C:diamonds}Karos", + "zählen als dieselbe Farbe,", + "{C:spades}Piks{} und {C:spades}Kreuzen", + "zählen als dieselbe Farbe" + }, + unlock = { + "Habe mindestens {C:attention}#1#", + "{E:1,C:attention}#2#{} in", + "deinem Deck" + } + }, + j_throwback = { + name = "Rückblick", + text = { + "{X:mult,C:white} X#1# {} Mult für jeden", + "In diesem Durchlauf übersprungenen {C:attention}Blind{}", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "Fahre mit einem gespeicherten Durchlauf", + "aus dem Hauptmenü fort" + } + }, + j_hanging_chad = { + name = "Stanzrest", + text = { + "Löse die {C:attention}erste{} gespielte", + "Karte bei der Punktezählung erneut aus" + }, + unlock = { + "Schlage einen Boss Blind", + "mit einem {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Rohedelstein", + text = { + "Gespielte Karten mit", + "{C:diamonds}Kreuz{}-Farbe verdienen", + "{C:money}$#1#{}, wenn gezählt" + }, + unlock = { + "Habe mindestens {E:1,C:attention}#1#", + "Karten mit {E:1,C:attention}#2#-", + "Farbe in deinem Deck" + } + }, + j_bloodstone = { + name = "Blutstein", + text = { + "{C:green}#1#-zu-#2#{}-Chance auf Erhalt für", + "gespielte Karten mit", + "{C:hearts}Herz{}-Farbe", + "{X:mult,C:white} X#3#{} Mult, wenn gezählt," + }, + unlock = { + "Habe mindestens {E:1,C:attention}#1#", + "Karten mit {E:1,C:attention}#2#-", + "Farbe in deinem Deck" + } + }, + j_arrowhead = { + name = "Pfeilkopf", + text = { + "Gespielte Karten mit", + "{C:spades}Pik{}-Farbe geben", + "{C:chips}+#1#{} Chips, wenn gezählt" + }, + unlock = { + "Habe mindestens {E:1,C:attention}#1#", + "Karten mit {E:1,C:attention}#2#-", + "Farbe in deinem Deck" + } + }, + j_onyx_agate = { + name = "Onyx-Achat", + text = { + "Gespielte Karten mit", + "{C:clubs}Club{}-Farbe geben", + "{C:mult}+#1#{} Mult, wenn gezählt" + }, + unlock = { + "Habe mindestens {E:1,C:attention}#1#", + "Karten mit {E:1,C:attention}#2#-", + "Farbe in deinem Deck" + } + }, + j_glass = { + name = "Glas-Joker", + text = { + "Erhält {X:mult,C:white} X#1# {} Mult", + "für jede {C:attention}Glas-Karte,", + "die zerstört wird", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "Habe mindestens {E:1,C:attention}#1#", + "{E:1,C:attention}#2#en{} in", + "deinem Deck" + } + }, + j_ring_master = { + name = "Ringmeister", + text = { + "{C:attention}Joker{}-, {C:tarot}Tarot{}-, {C:planet}Planeten{}-", + "und {C:spectral}Geister{}-Karten können", + "mehrfach erscheinen" + }, + unlock = { + "Erreiche Anten", + "-Level {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Blumentopf", + text = { + "{X:mult,C:white} X#1# {} Mult, wenn die gespielte", + "Hand eine wertende", + "{C:diamonds}Kreuz{}-Karte, {C:clubs}Kreuz{}-Karte enthält,", + "{C:hearts}Herz{}-Karte und {C:spades}Pik{}-Karte" + }, + unlock = { + "Erreiche Anten", + "-Level {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Bauplan", + text = { + "Kopiert die Fähigkeit des", + "{C:attention}Jokers{} auf der rechten Seite" + }, + unlock = { + "Gewinne einen Durchlauf" + } + }, + j_wee = { + name = "Winziger Joker", + text = { + "Dieser Joker erhält", + "{C:chips}+#2#{} Chips, wenn jede", + "gespielte {C:attention}2{} gezählt wird", + "{C:inactive}(Momentan {C:chips}+#1#{C:inactive} Chips)" + }, + unlock = { + "Gewinne einen Durchlauf in maximal {E:1,C:attention}#1#", + "Runden" + } + }, + j_merry_andy = { + name = "Fröhlicher Andy", + text = { + "{C:red}+#1#{} Abwürfe,", + "{C:red}#2#{} Handgröße" + }, + unlock = { + "Gewinne einen Durchlauf in maximal {E:1,C:attention}#1#", + "Runden" + } + }, + j_oops = { + name = "Ups! Alle 6en", + text = { + "Verdoppelt alle {C:attention}aufgelisteten", + "{C:green,E:1,S:1.1}Wahrscheinlichkeiten", + "{C:inactive}(bspw.: {C:green}1 in 3{C:inactive} -> {C:green}2 in 3{C:inactive})" + }, + unlock = { + "Verdiene in einer Hand", + "mindestens", + "{E:1,C:attention}#1#{} Chips" + } + }, + j_idol = { + name = "Das Idol", + text = { + "Jede gespielte {C:attention}#2#", + "von {V:1}#3#{} gibt", + "{X:mult,C:white} X#1# {} Mult, wenn gezählt", + "{s:0.8}Die Karte ändert sich jede Runde" + }, + unlock = { + "Verdiene in einer Hand", + "mindestens", + "{E:1,C:attention}#1#{} Chips" + } + }, + j_seeing_double = { + name = "Doppelt sehen", + text = { + "{X:mult,C:white} X#1# {} Mult, wenn die gespielte", + "Hand eine wertende", + "{C:clubs}Kreuz{}-Karte und eine wertende", + "Karte einer beliebigen anderen {C:attention}Farbe" + }, + unlock = { + "Spiele eine Hand,", + "die", + "{E:1,C:attention}#1# enthält" + } + }, + j_matador = { + name = "Matador", + text = { + "Verdiene {C:money}$#1#{}, wenn die", + "gespielte Hand die", + "{C:attention}Boss-Blind{}-Fähigkeit auslöst" + }, + unlock = { + "Besiege einen Boss Blind", + "in {E:1,C:attention}1 Hand{}, ohne", + "Abwürfe zu verwenden" + } + }, + j_hit_the_road = { + name = "Rauf auf die Straße", + text = { + "Erhält {X:mult,C:white} X#1# {} Mult", + "pro abgeworfenem", + "{C:attention}Buben{} in dieser Runde", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "Wirf {E:1,C:attention}5", + "{E:1,C:attention}Buben{}", + "zur selben Zeit ab" + } + }, + j_duo = { + name = "Das Duo", + text = { + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + }, + unlock = { + "Gewinne einen Durchlauf", + "ohne", + "{E:1,C:attention}#1# zu spielen" + } + }, + j_trio = { + name = "Das Trio", + text = { + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + }, + unlock = { + "Gewinne einen Durchlauf", + "ohne", + "{E:1,C:attention}#1# zu spielen" + } + }, + j_family = { + name = "Die Familie", + text = { + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + }, + unlock = { + "Gewinne einen Durchlauf", + "ohne", + "{E:1,C:attention}#1# zu spielen" + } + }, + j_order = { + name = "Der Orden", + text = { + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + }, + unlock = { + "Gewinne einen Durchlauf", + "ohne", + "{E:1,C:attention}#1# zu spielen" + } + }, + j_tribe = { + name = "Der Stamm", + text = { + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + }, + unlock = { + "Gewinne einen Durchlauf", + "ohne", + "{E:1,C:attention}#1# zu spielen" + } + }, + j_cavendish = { + name = "Cavendish", + text = { + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2#-zu-#3#{}-Chance, dass diese", + "Karte zerstört wird", + "am Ende der Runde" + } + }, + j_card_sharp = { + name = "Kartenscharf", + text = { + "{X:mult,C:white} X#1# {} Mult, wenn", + "die gespielte {C:attention}Pokerhand{} bereits", + "in dieser Runde gespielt wurde" + } + }, + j_red_card = { + name = "Rote Karte", + text = { + "Erhält {C:red}+#1#{} Mult, wenn ein beliebiges", + "{C:attention}Booster-Paket{} übersprungen wird", + "{C:inactive}(Momentan {C:red}+#2#{C:inactive} Mult)" + } + }, + j_madness = { + name = "Wahnsinn", + text = { + "Wenn {C:attention}Blind{} ausgewählt wird,", + "erhältst du {X:mult,C:white} X#1# {} Mult und", + "{C:attention}zerstörst{} einen zufälligen Joker", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {} Mult)" + } + }, + j_square = { + name = "Quadrat-Joker", + text = { + "Erhält {C:chips}+#2#{} Chips, wenn", + "die gespielte hand", + "exakt {C:attention}4{} Karten enthält", + "{C:inactive}(Momentan {C:chips}#1#{} Chips)" + } + }, + j_seance = { + name = "Séance", + text = { + "Wenn {C:attention}Pokerhand{} eine", + "{C:attention}#1#{} ist, erscheint eine", + "zufällige {C:spectral}Geister{}-Karte", + "{C:inactive}(Muss Platz haben)" + } + }, + j_riff_raff = { + name = "Gesindel", + text = { + "Wenn {C:attention}Blind{} ausgewählt wird,", + "wird {C:attention}#1# {C:blue}gewöhnlicher{C:attention} Joker erzeugt", + "{C:inactive}(Muss Platz haben)" + } + }, + j_stuntman = { + name = "Stuntman", + text = { + "{C:chips}+#1#{} Chips,", + "{C:attention}-#2#{} Handgröße" + }, + unlock = { + "Verdiene in einer Hand", + "mindestens", + "{E:1,C:attention}#1#{} Chips" + } + }, + j_invisible = { + name = "Unsichtbarer Joker", + text = { + "Verkaufe nach {C:attention}#1#{} Runden", + "diese Karte,", + "um einen zufälligen Joker zu {C:attention}duplizieren{}", + "{C:inactive}(Momentan {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Gewinne einen Durchlauf,", + "ohne je mehr als", + "{E:1,C:attention}4 Joker{} zu haben" + } + }, + j_brainstorm = { + name = "Brainstorming", + text = { + "Kopiert die Fähigkeit", + "des {C:attention}Jokers ganz links" + }, + unlock = { + "Wirft einen", + "{E:1,C:attention}Royal Flush ab" + } + }, + j_satellite = { + name = "Satellit", + text = { + "Verdiene {C:money}$#1#{} am Ende", + "der Runde pro einzigartige {C:planet}Planeten-", + "Karte, die in diesem Durchlauf verwendet wird", + "{C:inactive}(Momentan {C:money}$#2#{C:inactive})" + }, + unlock = { + "Habe mindestens", + "{E:1,C:money}$#1#" + } + }, + j_shoot_the_moon = { + name = "Aufs Ganze gehen", + text = { + "{C:mult}+#1#{} Mult für", + "jede {C:attention}Dame{}", + "in der Hand" + }, + unlock = { + "Spiele jedes {E:1,C:attention}Herz", + "in deinem Deck", + "in einer einzigen Runde" + } + }, + j_drivers_license = { + name = "Führerschein", + text = { + "{X:mult,C:white} X#1# {} Mult, wenn du", + "mindestens {C:attention}16", + "verstärkte Karten besitzt", + "{C:inactive}(Momentan {C:attention}#2#{C:inactive})" + }, + unlock = { + "Verstärke {E:1,C:attention}#1#{} Karten", + "in deinem Deck" + } + }, + j_cartomancer = { + name = "Kartenmagier", + text = { + "Erzeuge eine {C:tarot}Tarot{}-Karte", + "wenn {C:attention}Blind{} ausgewählt wird", + "{C:inactive}(Muss Platz haben)" + }, + unlock = { + "Entdecke jede", + "{E:1,C:tarot}Tarot{}-Karte" + } + }, + j_astronomer = { + name = "Astronom", + text = { + "Alle {C:planet}Planeten{}-Karten und", + "{C:planet}Himmelspakete{} in", + "Shop sind {C:attention}gratis" + }, + unlock = { + "Entdecke jede", + "{E:1,C:planet}Planeten{}-Karte" + } + }, + j_burnt = { + name = "Verbrannter Joker", + text = { + "Verbessere das Level", + "der ersten {C:attention}abgeworfenen", + "Pokerhand jeder Runde" + }, + unlock = { + "Verkaufe insgesamt", + "{E:1,C:attention}#1#{} Karten", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Stiefelriemen", + text = { + "{C:mult}+#1#{} Mult für jeden", + "{C:money}$#2#{} in deinem Besitz" + }, + unlock = { + "Habe mindestens {E:1,C:attention}#1#", + "{C:dark_edition}Polychrom{}-Joker" + } + }, + j_caino = { + name = "Canio", + text = { + "Erhält {X:mult,C:white} X#1# {} Mult, wenn", + "eine {C:attention}Hofkarte{}", + "zerstört wird", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "Triboulet", + text = { + "Gespielte {C:attention}Könige{} und", + "{C:attention}Damen{} geben jeweils", + "{X:mult,C:white} X#1#{} Mult, wenn gezählt," + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "Yorick", + text = { + "{X:mult,C:white} X#1# {} Mult, nur nachdem", + "{C:attention}#2#{} Abwürfe verwendet wurden", + "{C:inactive}(Verbleibende Abwürfe: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "Chicot", + text = { + "Deaktiviert den Effekt", + "jedes {C:attention}Boss Blinds" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "Perkeo", + text = { + "Erzeug eine {C:dark_edition}negative{} Kopie von", + "{C:attention}1{} zufälligen {C:attention}verbrauchbaren{}", + "Karte in deinem Besitz", + "am Ende des {C:attention}Shops" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "Listiger Joker", + text = { + "{C:chips}+#1#{} Chips, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + } + }, + j_wily = { + name = "Trickreicher Joker", + text = { + "{C:chips}+#1#{} Chips, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + } + }, + j_clever = { + name = "Schlauer Joker", + text = { + "{C:chips}+#1#{} Chips, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + } + }, + j_devious = { + name = "Verschlagener Joker", + text = { + "{C:chips}+#1#{} Chips, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + } + }, + j_crafty = { + name = "Durchtriebener Joker", + text = { + "{C:chips}+#1#{} Chips, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält" + } + }, + j_vampire = { + name = "Vampir", + text = { + "Erhält {X:mult,C:white} X#1# {} Mult pro", + "gespielter {C:attention}verstärkter Karte{},", + "entfernt Karten-{C:attention}Verstärkung", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_shortcut = { + name = "Abkürzung", + text = { + "Ermöglicht {C:attention}Straights{}", + "mit Lücken von {C:attention}1 Rang", + "{C:inactive}(Bsp.: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Hologramm", + text = { + "Erhält {X:mult,C:white} X#1# {} Mult", + "pro {C:attention}Spielkarte{}, die", + "deinem Deck hinzugefügt wird", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_vagabond = { + name = "Vagabund", + text = { + "Erzeuge eine {C:purple}Tarot{}-Karte,", + "wenn eine Hand gespielt wird", + "mit {C:money}$#1#{} oder weniger" + } + }, + j_baron = { + name = "Baron", + text = { + "Jeder {C:attention}König{}", + "auf der Hand", + "bringt {X:mult,C:white} X#1# {} Mult" + } + }, + j_cloud_9 = { + name = "9 Leben", + text = { + "Verdiene {C:money}$#1#{} für jede", + "{C:attention}9{} in deinem {C:attention}vollen Deck", + "am Ende der Runde", + "{C:inactive}(Momentan {C:money}$#2#{}{C:inactive})," + } + }, + j_rocket = { + name = "Rakete", + text = { + "Verdiene {C:money}$#1#{} am Ende", + "Runde. Erhält {C:money}$#2#{}, wenn", + "Der {C:attention}Boss Blind{} besiegt wird" + } + }, + j_obelisk = { + name = "Obelisk", + text = { + "Erhält {X:mult,C:white} X#1# {} Mult pro", + "hintereinander gespielter Hand,", + "ohne deine", + "meistgespielte {C:attention}Pokerhand zu spielen", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_midas_mask = { + name = "Midas-Maske", + text = { + "Alle {C:attention}Hofkarten{}", + "werden zu {C:attention}Goldkarten{},", + "wenn sie gespielt werden" + } + }, + j_luchador = { + name = "Luchador", + text = { + "Verkaufe diese Karte,", + "um den aktuellen", + "{C:attention}Boss Blind{} zu deaktivieren." + } + }, + j_photograph = { + name = "Fotograf", + text = { + "Die erste gespielte {C:attention}Hofkarte", + "gibt {X:mult,C:white} X#1# {} Mult,", + "wenn gezählt" + } + }, + j_gift = { + name = "Geschenkkarte", + text = { + "{C:money}$#1#{} des {C:attention}Verkaufswerts", + "wird jeder {C:attention}Joker{}-", + "und {C:attention}verbrauchbaren{} Karte hinzugefügt am", + "Ende der Runde" + } + }, + j_turtle_bean = { + name = "Schwarze Bohne", + text = { + "{C:attention}+#1#{} Handgröße,", + "verringert sich um", + "{C:red}#2#{} jede Runde" + } + }, + j_erosion = { + name = "Erosion", + text = { + "{C:red}+#1#{} Mult für jede", + "Karte unter {C:attention}#3#{}", + "in deinem vollen Deck", + "{C:inactive}(Momentan {C:red}+#2#{C:inactive} Mult)" + } + }, + j_reserved_parking = { + name = "Reservierter Parkplatz", + text = { + "Jede {C:attention}Hofkarte{}", + "auf der Hand hat", + "eine Chance von {C:green}#2#-zu-#3#{},", + "um {C:money}$#1#{} zu bringen" + } + }, + j_mail = { + name = "Post-Rabatt", + text = { + "Verdiene {C:money}$#1#{} für", + "jede abgeworfene {C:attention} -Karte#2#{}, Rang", + "ändert sich jede Runde" + } + }, + j_to_the_moon = { + name = "Zum Mond", + text = { + "Verdiene zusätzlich {C:money}$#1#{}", + "{C:attention}Zinsen{} pro {C:money}$5{},", + "die sich zum Ende der Runde auf deiner Hand befindet" + } + }, + j_hallucination = { + name = "Halluzination", + text = { + "Chance von {C:green}#1# in #2#{},", + "eine {C:tarot}Tarot{}-Karte zu erzeugen,", + "wenn ein beliebiges {C:attention}Booster-Paket{} geöffnet wird", + "{C:inactive}(Muss Platz haben)" + } + }, + j_lucky_cat = { + name = "Glückskatze", + text = { + "Erhält jedes Mal {X:mult,C:white} X#1# {} Mult,", + "wenn eine {C:attention}Glückskarte{}", + "{C:green}erfolgreich{} ausgelöst wird", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_baseball = { + name = "Baseballkarte", + text = { + "{C:green}Ungewöhnliche{} Joker", + "bringen jeweils {X:mult,C:white} X#1# {} Mult" + } + }, + j_bull = { + name = "Stier", + text = { + "{C:chips}+#1#{} Chips für jeden", + "{C:money}Dollar{} in deinem Besitz", + "{C:inactive}(Momentan {C:chips}+#2#{C:inactive} Chips)" + } + }, + j_diet_cola = { + name = "Diät-Cola", + text = { + "Verkaufe diese Karte,", + "um eine/n kostenlose/n", + "{C:attention}#1# zu erzeugen" + } + }, + j_trading = { + name = "Sammelkarte", + text = { + "Wenn der {C:attention}erste Abwurf{} der Runde", + "nur {C:attention}1{} Karte hat, zerstöre", + "sie und verdiene {C:money}$#1#" + } + }, + j_flash = { + name = "Blitzkarte", + text = { + "{C:mult}+#1#{} Mult pro", + "{C:attention}Aktualisierung{} im Shop", + "{C:inactive}(Momentan {C:mult}+#2#{C:inactive} Mult)" + } + }, + j_popcorn = { + name = "Popcorn", + text = { + "{C:mult}+#1#{} Mult", + "{C:mult}-#2#{} Mult pro", + "gespielter Runde" + } + }, + j_trousers = { + name = "Ersatzhose", + text = { + "Erhält {C:mult}+#1#{} Mult, wenn", + "die gespielte Hand", + "{C:attention}#2#{} enthält", + "{C:inactive}(Momentan {C:red}+#3#{C:inactive} Mult)" + } + }, + j_ancient = { + name = "Antiker Joker", + text = { + "Jede gespielte Karte mit", + "Farbe {V:1}-#2#{} bringt", + "{X:mult,C:white} X#1#{} Mult, wenn gezählt,", + "{s:0.8}Farbe ändert sich am Ende der Runde" + } + }, + j_ramen = { + name = "Ramen", + text = { + "{X:mult,C:white} X#1# {} Mult,", + "verliert {X:mult,C:white} X#2# {} Mult", + "pro abgeworfener {C:attention}Karte{}" + } + }, + j_walkie_talkie = { + name = "Walkie-Talkie", + text = { + "Jede gespielte {C:attention}10{} oder {C:attention}4", + "bringt {C:chips}+#1#{} Chips und", + "{C:mult} X#2#{} Mult, wenn gezählt," + } + }, + j_selzer = { + name = "Selters", + text = { + "Löse alle", + "gespielten Karten", + "für die nächsten {C:attention}#1#{} Hände erneut aus" + } + }, + j_castle = { + name = "Schloss", + text = { + "Dieser Joker erhält {C:chips}+#1#{} Chips", + "pro abgeworfener {V:1}#2#{}-Karte", + "Farbe ändert sich jede Runde", + "{C:inactive}(Momentan {C:chips}+#3#{C:inactive} Chips)" + } + }, + j_smiley = { + name = "Smiley", + text = { + "Gespielte {C:attention}Hofkarten{}", + "bringen {C:mult}+#1#{} Mult,", + "wenn gezählt" + } + }, + j_campfire = { + name = "Lagerfeuer", + text = { + "Dieser Joker erhält {X:mult,C:white}X#1#{} Mult", + "für jede {C:attention}verkaufte{} Karte, wird zurückgesetzt,", + "wenn {C:attention}Boss Blind{} besiegt wird", + "{C:inactive}(Momentan {X:mult,C:white} X#2# {C:inactive} Mult)" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Überbestand", + text = { + "{C:attention}+1{} im Shop", + "verfügbarer Kartenslot" + } + }, + v_clearance_sale = { + name = "Ausverkauf", + text = { + "Alle Karten und Pakete im", + "Shop sind um {C:attention}#1# %{} reduziert" + } + }, + v_tarot_merchant = { + name = "Tarot-Händler", + text = { + "{C:tarot}Tarot{}-Karten tauchen", + "{C:attention}#1#X{} häufiger", + "im Shop auf" + } + }, + v_planet_merchant = { + name = "Planeten-Händler", + text = { + "{C:planet}Planeten{}-Karten tauchen", + "{C:attention}#1#X{} häufiger", + "im Shop auf" + } + }, + v_hone = { + name = "Schleiferei", + text = { + "{C:dark_edition}Foil{}, {C:dark_edition}holografische{} und", + "{C:dark_edition}Polychrom{}-Karten", + "erscheinen {C:attention}#1#X{} öfter" + } + }, + v_reroll_surplus = { + name = "Aktualisierungsüberschuss", + text = { + "Aktualisierungen kosten", + "{C:money}$#1#{} weniger" + } + }, + v_crystal_ball = { + name = "Kristallkugel", + text = { + "{C:attention}+1{} Slot für Verbrauchsgegenstände" + } + }, + v_telescope = { + name = "Teleskop", + text = { + "{C:attention}Himmelspakete{} enthalten immer", + "die {C:planet}Planeten{}", + "-Karte für deine", + "meistgespielte {C:attention}Pokerhand" + } + }, + v_grabber = { + name = "Greifer", + text = { + "Erhalte dauerhaft", + "{C:blue}+#1#{} Hand", + "pro Runde" + } + }, + v_wasteful = { + name = "Verschwenderisch", + text = { + "Erhalte dauerhaft", + "{C:red}+#1#{} Abwürfe", + "pro Runde" + } + }, + v_seed_money = { + name = "Startkapital", + text = { + "Erhöhe das Limit an", + "verdienten Zinsen", + "pro Runde auf {C:money}$#1#{}" + } + }, + v_blank = { + name = "Leer", + text = { + "{C:inactive}Tut nichts?" + } + }, + v_magic_trick = { + name = "Zaubertrick", + text = { + "{C:attention}Spielkarten{} können", + "aus dem {C:attention}Shop", + "gekauft werden" + } + }, + v_hieroglyph = { + name = "Hieroglyphe", + text = { + "{C:attention}-#1#{} Ante", + "{C:blue}-#1#{} Hand", + "pro Runde", + "{C:attention}-#1#{} Ante" + } + }, + v_directors_cut = { + name = "Director‘s Cut", + text = { + "Boss Blind aktualisieren", + "{C:attention}1{} Mal pro Ante,", + "{C:money}$#1#{} pro Roll" + } + }, + v_pattern = { + name = "Muster", + text = { + "Lässt deine meistgenutzte", + "{C:attention}Verbrauchsgegenstand{}-Karte erscheinen", + "{E:1,V:1}#1#", + "{C:inactive}(Muss Platz haben)" + } + }, + v_overstock_plus = { + name = "Überbestand Plus", + text = { + "{C:attention}+1{} im Shop", + "verfügbarer Kartenslot" + }, + unlock = { + "Gib insgesamt", + "{C:money}$#1#{} im Shop aus", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "Liquidierung", + text = { + "Alle Karten und Pakete im", + "Shop sind um {C:attention}#1# %{} reduziert" + }, + unlock = { + "Löse mindestens", + "{C:attention}#1#{C:voucher} Gutschein{}-Karten", + "in einem Durchlauf ein" + } + }, + v_tarot_tycoon = { + name = "Tarot-Tycoon", + text = { + "{C:tarot}Tarot{}-Karten tauchen", + "{C:attention}#1#X{} häufiger", + "im Shop auf" + }, + unlock = { + "Kaufe insgesamt", + "{C:attention}#1#{C:tarot} Tarot{}-Karten", + "aus dem Shop", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Planeten-Tycoon", + text = { + "{C:planet}Planeten{}-Karten tauchen", + "{C:attention}#1#X{} häufiger", + "im Shop auf" + }, + unlock = { + "Kaufe insgesamt", + "{C:attention}#1#{C:planet} Planeten{}-Karten", + "aus dem Shop", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Glow-Up", + text = { + "{C:dark_edition}Foil{}, {C:dark_edition}holografische{} und", + "{C:dark_edition}Polychrom{}-Karten", + "erscheinen {C:attention}#1#X{} öfter" + }, + unlock = { + "Habe mindestens {C:attention}#1#", + "{C:attention}Joker{}-Karten in der", + "{C:dark_edition}Foil{}, {C:dark_edition}holographischen{} oder", + "{C:dark_edition}Polychrom{}-Edition" + } + }, + v_reroll_glut = { + name = "Aktualisierungsüberfluss", + text = { + "Aktualisierungen kosten", + "{C:money}$#1#{} weniger" + }, + unlock = { + "Aktualisiere den Shop insgesamt", + "{C:attention}#1#{} Mal", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Omen-Globus", + text = { + "{C:spectral}Geister{}-Karten können", + "in jedem beliebigen", + "{C:attention}Arkana-Paket auftauchen" + }, + unlock = { + "Verwende insgesamt {C:attention}#1#", + "{C:tarot}Tarot{}-Karten aus einem beliebigen", + "{C:tarot}Arkana-Paket", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Obvervatorium", + text = { + "{C:planet}Planeten{}-Karten in deinem", + "{C:attention}Verbrauchsgegenstand{}-Bereich geben", + "{X:red,C:white} X#1# {} Mult für ihre", + "festgelegte {C:attention}Pokerhand" + }, + unlock = { + "Verwende insgesamt {C:attention}#1#", + "{C:planet}Planeten{}-Karten aus einem beliebigen", + "{C:planet}Himmelspaket", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Nacho Tong", + text = { + "Erhalte dauerhaft", + "{C:blue}+#1#{} Hand", + "pro Runde" + }, + unlock = { + "Spiele insgesamt", + "{C:attention}#1#{} Karten", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Erneute Weissagung", + text = { + "Erhalte dauerhaft", + "{C:red}+#1#{} Abwurf/Abwürfe", + "pro Runde" + }, + unlock = { + "Wirf insgesamt", + "{C:attention}#1#{} Karten ab", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Geldbaum", + text = { + "Erhöhe das Limit an", + "verdienten Zinsen", + "pro Runde auf {C:money}$#1#{}" + }, + unlock = { + "Maximiere die Zinsen", + "pro Rundeneinnahme für", + "{C:attention}#1#{} Runden hintereinander", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Antimaterie", + text = { + "{C:dark_edition}+1{} Joker-Slot" + }, + unlock = { + "Löse {C:voucher}Leer{}", + "{C:attention}#1#{} Mal ein", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Illusion", + text = { + "{C:attention}Spielkarten{} im Shop", + "können eine {C:enhanced}Verstärkung{},", + "{C:dark_edition}Edition{} und/oder ein {C:attention}Siegel{} haben" + }, + unlock = { + "Kaufe insgesamt", + "{C:attention}#1#{} Spielkarten", + "aus dem Shop", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Petroglyphe", + unlock = { + "Erreiche Anten", + "-Level {E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{} Ante", + "{C:red}-#1#{} Abwurf", + "pro Runde" + } + }, + v_retcon = { + name = "Rückwirkende Kontinuität", + text = { + "Boss Blind aktualisieren", + "{C:attention}unbegrenzt{} oft,", + "{C:money}$#1#{} pro Roll" + }, + unlock = { + "Entdecke", + "{C:attention}#1#{} Blinds" + } + }, + v_tesselation = { + name = "Tessellation", + text = { + "Lässt deine meistgenutzte", + "{C:attention}Joker{}-Karte erscheinen", + "{E:1,V:1}#1#", + "{C:inactive}(Muss Platz haben)" + }, + unlock = { + "Kaufe die {C:dark_edition}Polychrom-", + "Edition deines", + "meistgenutzten {C:attention}Jokers", + "aus dem Shop" + } + }, + v_palette = { + name = "Palette", + text = { + "Halte {C:attention}+#1#{} Karten", + "auf deiner Hand", + "{C:attention}+#1#{} Handgröße" + }, + unlock = { + "Verringere deine Handgröße", + "auf {C:attention}#1#{} Karten" + } + }, + v_paint_brush = { + name = "Pinsel", + text = { + "{C:attention}+#1#{} Handgröße" + } + } + }, + Tarot = { + c_fool = { + name = "Der Narr", + text = { + "Lässt die letzte", + "{C:tarot}Tarot{}- oder {C:planet}Planeten{}-Karten", + "dieses Durchlaufs erscheinen,", + "abgesehen von {s:0.8,C:tarot}Der Narr{s:0.8}" + } + }, + c_magician = { + name = "Der Magier", + text = { + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "Die Hohepriesterin", + text = { + "Lässt bis zu {C:attention}#1#", + "zufällige {C:planet}Planeten{}-Karten erscheinen", + "{C:inactive}(Muss Platz haben)" + } + }, + c_empress = { + name = "Die Herrscherin", + text = { + "Verstärkt {C:attention}#1#", + "gespielte Karten auf", + "{C:attention}#2#n" + } + }, + c_emperor = { + name = "Der Herrscher", + text = { + "Lässt bis zu {C:attention}#1#", + "zufällige {C:tarot}Tarot{}-Karten erscheinen", + "{C:inactive}(Muss Platz haben)" + } + }, + c_heirophant = { + name = "Der Hierophant", + text = { + "Verstärkt {C:attention}#1#", + "gespielte Karten auf", + "{C:attention}#2#n" + } + }, + c_lovers = { + name = "Die Liebenden", + text = { + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "Der Wagen", + text = { + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#" + } + }, + c_justice = { + name = "Gerechtigkeit", + text = { + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "Der Eremit", + text = { + "Verdoppelt Geld", + "{C:inactive}(Max. {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "Das Rad des Schicksals", + text = { + "{C:green}#1#-zu-#2#{}-Chance, die", + "{C:dark_edition}Foil{}, {C:dark_edition}holographische{} oder", + "{C:dark_edition}Polychrom{}-Edition", + "zu einem zufälligen {C:attention}Joker hinzuzufügen" + } + }, + c_strength = { + name = "Kraft", + text = { + "Erhöht den Rang von", + "bis zu {C:attention}#1#{} ausgewählten", + "Karten um {C:attention}1" + } + }, + c_hanged_man = { + name = "Der Gehängte", + text = { + "Zerstört bis zu", + "{C:attention}#1#{} ausgewählte Karten" + } + }, + c_death = { + name = "Tod", + text = { + "Wähle {C:attention}#1#{} Karten,", + "die {C:attention}linke{} Karte", + "wird in die {C:attention}rechte{} Karte verwandelt", + "{C:inactive}(Zur Neuanordnung ziehen)" + } + }, + c_temperance = { + name = "Mäßigkeit", + text = { + "Gibt den gesamten", + "Verkaufswert aller momentanen", + "Joker {C:inactive}(Max. {C:money}$#1#{C:inactive})", + "{C:inactive}(Momentan {C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "Der Teufel", + text = { + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#" + } + }, + c_tower = { + name = "Der Turm", + text = { + "Verstärkt {C:attention}#1#{} ausgewählte", + "Karte in eine", + "{C:attention}#2#" + } + }, + c_star = { + name = "Der Stern", + text = { + "Verwandelt bis zu", + "{C:attention}#1#{} ausgewählte Karten", + "in {V:1}#2#{}" + } + }, + c_moon = { + name = "Der Mond", + text = { + "Verwandelt bis zu", + "{C:attention}#1#{} ausgewählte Karten", + "in {V:1}#2#{}" + } + }, + c_sun = { + name = "Die Sonne", + text = { + "Verwandelt bis zu", + "{C:attention}#1#{} ausgewählte Karten", + "in {V:1}#2#{}" + } + }, + c_judgement = { + name = "Gericht", + text = { + "Lässt eine zufällige", + "{C:attention}Joker{}-Karte erscheinen", + "{C:inactive}(Muss Platz haben)" + } + }, + c_world = { + name = "Die Welt", + text = { + "Verwandelt bis zu", + "{C:attention}#1#{} ausgewählte Karten", + "in {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Merkur", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_venus = { + name = "Venus", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_earth = { + name = "Erde", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_mars = { + name = "Mars", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_jupiter = { + name = "Jupiter", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_saturn = { + name = "Saturn", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_uranus = { + name = "Uranus", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_neptune = { + name = "Neptun", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_pluto = { + name = "Pluto", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_ceres = { + name = "Ceres", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_planet_x = { + name = "Planet X", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + }, + c_eris = { + name = "Eris", + text = { + "{S:0.8}({S:0.8,V:1}Lvl.#1#{S:0.8}){} Aufwertung", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult und", + "{C:chips}+#4#{} Chips" + } + } + }, + Spectral = { + c_familiar = { + name = "Vertrauter", + text = { + "Zerstöre {C:attention}1{} zufällige", + "Karte in deiner Hand und füge", + "{C:attention}#1#{} zufällige {C:attention}verstärkte Hofkarte hinzu", + "hinzu" + } + }, + c_grim = { + name = "Finsternis", + text = { + "Zerstöre {C:attention}1{} zufällige", + "Karte auf deiner Hand,", + "füge {C:attention}#1#{} zufällige {C:attention}verstärkte", + "{C:attention}Asse{} hinzu" + } + }, + c_incantation = { + name = "Beschwörung", + text = { + "Zerstöre {C:attention}1{} zufällige", + "Karte in deine Hand und füge {C:attention}#1#", + "zufällige {C:attention}verstärkte Zahlenkarte hinzu", + "hinzu" + } + }, + c_talisman = { + name = "Talisman", + text = { + "Fügt ein {C:attention}Goldenes Siegel{}", + "zu {C:attention}1{} ausgewählten", + "Karte auf deiner Hand hinzu" + } + }, + c_aura = { + name = "Aura", + text = { + "Füge den {C:dark_edition}Foil{}, {C:dark_edition}holographischen{},", + "oder {C:dark_edition}Polychrom{}-Effekt", + "{C:attention}1{} ausgewählten Karte in deiner Hand hinzu" + } + }, + c_wraith = { + name = "Gespenst", + text = { + "Lässt einen zufälligen", + "{C:red}seltenen{C:attention} Joker{} erscheinen,", + "setzt Geld auf {C:money}$0" + } + }, + c_sigil = { + name = "Siegel", + text = { + "Verwandelt alle Karten", + "auf der Hand in eine einzige", + "zufällige {C:attention}Farbe" + } + }, + c_ouija = { + name = "Ouija", + text = { + "Verwandelt alle Karten", + "auf der Hand in einen einzigen", + "zufälligen {C:attention}Rang", + "{C:red}-1{} Handgröße" + } + }, + c_ectoplasm = { + name = "Ektoplasma", + text = { + "Fügt {C:dark_edition}Negativ{} zu", + "einem zufälligen {C:attention}Joker hinzu,", + "{C:red}-1{} Handgröße" + } + }, + c_immolate = { + name = "Opferung", + text = { + "Zerstört {C:attention}#1#{} zufällige", + "Karten auf der Hand,", + "gibt {C:money}$#2#" + } + }, + c_soul = { + name = "Die Seele", + text = { + "Erschafft einen", + "{C:legendary,E:1}legendären{} Joker", + "{C:inactive}(Muss Platz haben)" + } + }, + c_black_hole = { + name = "Schwarzes Loch", + text = { + "Verbessere jede", + "{C:legendary,E:1}Pokerhand", + "um {C:attention}1{} Level" + } + }, + c_ankh = { + name = "Anch", + text = { + "Erzeuge eine Kopie eines", + "zufälligen {C:attention}Jokers{}, zerstöre", + "alle anderen Joker" + } + }, + c_deja_vu = { + name = "Déjà-vu", + text = { + "Füge ein {C:red}Rotes Siegel{}", + "zu {C:attention}1{} ausgewählten", + "Karte auf deiner Hand hinzu" + } + }, + c_hex = { + name = "Bann", + text = { + "Füge ein {C:dark_edition}Polychrom{}", + "zu einem zufälligen {C:attention}Joker{} hinzu, zerstöre", + "alle anderen Joker" + } + }, + c_trance = { + name = "Trance", + text = { + "Füge ein {C:blue}Blaues Siegel{}", + "zu {C:attention}1{} ausgewählten", + "Karte auf deiner Hand hinzu" + } + }, + c_medium = { + name = "Medium", + text = { + "Füge ein {C:purple}Lila Siegel{}", + "zu {C:attention}1{} ausgewählten", + "Karte auf deiner Hand hinzu" + } + }, + c_cryptid = { + name = "Cryptid", + text = { + "Erzeuge {C:attention}#1#{} Kopien von", + "{C:attention}1{} ausgewählten Karte", + "auf deiner Hand" + } + } + }, + Edition = { + e_base = { + name = "Basis", + text = { + "Keine Extra-Effekte" + } + }, + e_foil = { + name = "Foil", + text = { + "{C:chips}+#1#{} Chips" + } + }, + e_holo = { + name = "Holografisch", + text = { + "{C:mult}+#1#{} Mult" + } + }, + e_polychrome = { + name = "Polychrom", + text = { + "{X:mult,C:white} X#1# {} Mult" + } + }, + e_negative = { + name = "Negativ", + text = { + "{C:dark_edition}+#1#{} Joker-Slot" + } + }, + e_negative_consumable = { + name = "Negativ", + text = { + "{C:dark_edition}+#1#{} Slot für Verbrauchsgegenstände" + } + } + }, + Enhanced = { + m_bonus = { + name = "Bonuskarte", + text = {} + }, + m_mult = { + name = "Mult-Karte", + text = { + "{C:mult}+#1#{} Mult" + } + }, + m_wild = { + name = "Wildcard", + text = { + "Kann als jede Farbe", + "verwendet werden" + } + }, + m_glass = { + name = "Glas-Karte", + text = { + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2#-zu-#3#{} Chance,", + "die Karte zu zerstören" + } + }, + m_steel = { + name = "Stahl-Karte", + text = { + "{X:mult,C:white} X#1# {} Mult", + "während sich diese Karte", + "auf der Hand befindet" + } + }, + m_stone = { + name = "Stein-Karte", + text = { + "{C:chips}+#1#{} Chips,", + "kein Rang oder Farbe" + } + }, + m_gold = { + name = "Gold-Karte", + text = { + "{C:money}$#1#{}, wenn diese", + "zum Ende der Runde", + "auf der Hand ist" + } + }, + m_lucky = { + name = "Glückskarte", + text = { + "{C:green}#1#-zu-#3#{} Chance,", + "{C:mult}+#2#{} Mult zu erhalten", + "{C:green}#1#-zu-#5#{} Chance,", + "{C:money}$#4# zu gewinnen" + } + } + }, + Stake = { + stake_white = { + name = "Weißer Einsatz", + text = { + "Basis-Schwierigkeit" + } + }, + stake_red = { + name = "Roter Einsatz", + text = { + "{C:attention}Small Blind{} gibt", + "kein Belohnungsgeld", + "{s:0.8}Gilt für alle vorherigen Einsätze" + } + }, + stake_green = { + name = "Grüner Einsatz", + text = { + "Benötigte Punktzahl skaliert", + "schneller für jede {C:attention}Ante", + "{s:0.8}Gilt für alle vorherigen Einsätze" + } + }, + stake_blue = { + name = "Blauer Einsatz", + text = { + "{C:red}-1{} Abwurf", + "{s:0.8}Gilt für alle vorherigen Einsätze" + } + }, + stake_black = { + name = "Schwarzer Einsatz", + text = { + "Shop kann {C:attention}ewige{} Joker haben", + "{C:inactive,s:0.8}(Kann nicht verkauft oder zerstört werden)", + "{s:0.8}Gilt für alle vorherigen Einsätze" + } + }, + stake_purple = { + name = "Lila Einsatz", + text = { + "Benötigte Punktzahl skaliert", + "schneller für jede {C:attention}Ante", + "{s:0.8}Gilt für alle vorherigen Einsätze" + } + }, + stake_orange = { + name = "Orangener Einsatz", + text = { + "{C:attention}Booster-Pakete{} kosten", + "{C:money}$1{} mehr pro Ante", + "{s:0.8}Gilt für alle vorherigen Einsätze" + } + }, + stake_gold = { + name = "Goldener Einsatz", + text = { + "{C:red}-1{} Handgröße", + "{s:0.8}Gilt für alle vorherigen Einsätze" + } + } + }, + Tag = { + tag_uncommon = { + name = "Ungewöhnlicher Tag", + text = { + "Shop hat einen", + "{C:green}ungewöhnlichen Joker" + } + }, + tag_rare = { + name = "Seltener Tag", + text = { + "Shop hat einen", + "{C:red}seltenen Joker" + } + }, + tag_negative = { + name = "Negativer Tag", + text = { + "Shop hat einen", + "{C:dark_edition}negativen Joker" + } + }, + tag_foil = { + name = "Foil-Tag", + text = { + "Shop hat einen", + "{C:dark_edition}Foil-Joker" + } + }, + tag_holo = { + name = "Holografischer Tag", + text = { + "Shop hat einen", + "{C:dark_edition}holografischen Joker" + } + }, + tag_polychrome = { + name = "Polychrom-Tag", + text = { + "Shop hat einen", + "{C:dark_edition}Polychrom-Joker" + } + }, + tag_investment = { + name = "Investment-Tag", + text = { + "Nachdem du den", + "Boss Blind besiegst,", + "erhältst du {C:money}$#1#" + } + }, + tag_voucher = { + name = "Gutschein-Tag", + text = { + "Fügt einen {C:voucher}Gutschein", + "im nächsten Shop hinzu" + } + }, + tag_boss = { + name = "Boss-Tag", + text = { + "Aktualisiert den", + "{C:attention}Boss Blind" + } + }, + tag_standard = { + name = "Standard-Tag", + text = { + "Gibt ein gratis", + "{C:attention}Mega-Standardpaket" + } + }, + tag_charm = { + name = "Charme-Tag", + text = { + "Gibt ein gratis", + "{C:tarot}Mega-Arkana-Paket" + } + }, + tag_meteor = { + name = "Meteor-Tag", + text = { + "Gibt ein gratis", + "{C:planet}Mega-Himmelspaket" + } + }, + tag_buffoon = { + name = "Clown-Tag", + text = { + "Gibt ein gratis", + "{C:attention}Clownspaket" + } + }, + tag_handy = { + name = "Nützlicher Tag", + text = { + "Gibt {C:money}$#1#{} pro gespielter", + "{C:blue}Hand{} in diesem Durchlauf", + "{C:inactive}(Gibt {C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "Müll-Tag", + text = { + "Gibt {C:money}$#1#{} pro ungenutztem", + "{C:red}Abwurf{} in diesem Durchlauf", + "{C:inactive}(Gibt {C:money}$#2#{C:inactive})" + } + }, + tag_coupon = { + name = "Coupon-Tag", + text = { + "Anfangskarten und", + "Booster-Pakete sind", + "im nächsten Shop gratis" + } + }, + tag_double = { + name = "Doppel-Tag", + text = { + "Gibt eine Kopie des", + "nächsten ausgewählten {C:attention}Tags{},", + "{s:0.8,C:attention}Doppel-Tag{s:0.8} ausgeschlossen" + } + }, + tag_juggle = { + name = "Jongleur-Tag", + text = { + "{C:attention}+#1#{} Handgröße", + "in der nächsten Runde" + } + }, + tag_d_six = { + name = "D6-Tag", + text = { + "Aktualisiert im nächsten Shop,", + "beginnt bei {C:money}$0" + } + }, + tag_top_up = { + name = "Auffüllungs-Tag", + text = { + "Erzeugt bis zu {C:attention}#1#", + "{C:blue}gewöhnliche{} Joker erscheinen", + "{C:inactive}(Muss Platz haben)" + } + }, + tag_skip = { + name = "Tempo-Tag", + text = { + "Gibt in diesem Durchlauf {C:money}$#1#{}", + "pro übersprungenem Blind", + "{C:inactive}(Gibt {C:money}$#2#{C:inactive})" + } + }, + tag_orbital = { + name = "Orbital-Tag", + text = { + "Verbessere {C:attention}#1#", + "um {C:attention}#2# Levels" + } + }, + tag_economy = { + name = "Sparer-Tag", + text = { + "Verdoppelt dein Geld", + "{C:inactive}(Max. {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "Ätherischer Tag", + text = { + "Gibt ein gratis", + "{C:planet}Geisterpaket" + } + } + }, + Blind = { + bl_small = { + name = "Small Blind", + text = {} + }, + bl_big = { + name = "Big Blind", + text = {} + }, + bl_hook = { + name = "Der Haken", + text = { + "Wirft 2 zufällige", + "Karten pro gespielter Hand ab" + } + }, + bl_wall = { + name = "Die Mauer", + text = { + "Extragroßer Blind" + } + }, + bl_wheel = { + name = "Das Rad", + text = { + " von 7 Karten wird", + "mit dem Gesicht nach unten gezogen" + } + }, + bl_arm = { + name = "Der Arm", + text = { + "Verringere das Level der", + "gespielten Pokerhand" + } + }, + bl_psychic = { + name = "Der Hellseher", + text = { + "Muss 5 Karten spielen" + } + }, + bl_goad = { + name = "Der Ansporn", + text = { + "Alle Pik-Karten", + "werden geschwächt" + } + }, + bl_water = { + name = "Das Wasser", + text = { + "Beginne mit", + "0 Abwürfen" + } + }, + bl_eye = { + name = "Das Auge", + text = { + "Keine wiederholten", + "Handtypen diese Runde" + } + }, + bl_mouth = { + name = "Der Mund", + text = { + "Spiele nur 1 Hand", + "in dieser Runde" + } + }, + bl_plant = { + name = "Die Pflanze", + text = { + "Alle Hofkarten", + "werden geschwächt" + } + }, + bl_needle = { + name = "Die Nadel", + text = { + "Spiele nur 1 Hand" + } + }, + bl_head = { + name = "Der Kopf", + text = { + "Alle Herz-Karten", + "werden geschwächt" + } + }, + bl_tooth = { + name = "Der Zahn", + text = { + "Verliere $1 pro", + "gespielter Karte" + } + }, + bl_final_leaf = { + name = "Grünes Blatt", + text = { + "Alle Karten werden geschwächt,", + "bis 1 Joker verkauft wird" + } + }, + bl_final_vessel = { + name = "Violette Hülle", + text = { + "Sehr großer Blind" + } + }, + bl_ox = { + name = "Der Ochse", + text = { + "Eine #1# zu spielen", + "setzt das Geld auf 0$" + } + }, + bl_house = { + name = "Das Haus", + text = { + "Die erste Hand wird", + "mit dem Gesicht nach unten gezogen" + } + }, + bl_club = { + name = "Das Kreuz", + text = { + "Alle Kreuz-Karten", + "werden geschwächt" + } + }, + bl_fish = { + name = "Der Fisch", + text = { + "Mit dem Gesicht nach unten gezogene Karten", + "nach jeder gespielten Hand" + } + }, + bl_window = { + name = "Das Fenster", + text = { + "Alle Karo-Karten", + "werden geschwächt" + } + }, + bl_manacle = { + name = "Die Handfessel", + text = { + "-1 Handgröße" + } + }, + bl_serpent = { + name = "Die Schlange", + text = { + "Ziehe immer 3 Karten,", + "nachdem du gespielt oder abgeworfen hast" + } + }, + bl_pillar = { + name = "Die Säule", + text = { + "Karten, die vor dieser", + "Ante gespielt wurden, werden geschwächt" + } + }, + bl_flint = { + name = "Der Feuerstein", + text = { + "Basis-Chips und", + "Mults werden halbiert" + } + }, + bl_mark = { + name = "Die Marke", + text = { + "Alle Hofkarten werden", + "mit dem Gesicht nach unten gezogen" + } + }, + bl_final_acorn = { + name = "Bernsteineichel", + text = { + "Dreht alle Joker-Karten um", + "und mischt sie durch" + } + }, + bl_final_heart = { + name = "Purpurrotes Herz", + text = { + "Ein zufälliger Joker", + "wird jede Hand deaktiviert" + } + }, + bl_final_bell = { + name = "Himmelblaue Glocke", + text = { + "Zwingt 1 Karte,", + "immer ausgewählt zu werden" + } + } + }, + Back = { + b_red = { + name = "Rotes Deck", + text = { + "{C:red}+#1#{} Abwurf", + "jede Runde" + } + }, + b_blue = { + name = "Blaues Deck", + text = { + "{C:blue}+#1#{} Hand", + "jede Runde" + } + }, + b_yellow = { + name = "Gelbes Deck", + text = { + "Beginne mit", + "zusätzlichen {C:money}$#1#" + } + }, + b_green = { + name = "Grünes Deck", + text = { + "Zum Ende jeder Runde:", + "{C:money}$#1#{s:0.85} pro verbleibender {C:blue}Hand", + "{C:money}$#1#{s:0.85} pro verbleibenden {C:blue}Abwurfs", + "Verdiene keine {C:attention}Zinsen" + } + }, + b_black = { + name = "Schwarzes Deck", + text = { + "{C:attention}+#1#{} Joker-Slot", + "", + "{C:blue}-#2#{} Hand", + "jede Runde" + } + }, + b_magic = { + name = "Zauberdeck", + text = { + "Beginne den Durchlauf mit dem", + "{C:tarot,T:v_crystal_ball}#1#{}-Gutschein", + "und {C:attention}2{} Kopien", + "von {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Nebula-Deck", + text = { + "Beginne den Durchlauf mit dem", + "{C:planet,T:v_telescope}#1#{}-Gutschein", + "", + "{C:red}#2#{} Slot für Verbrauchsgegenstände" + } + }, + b_metal = { + name = "Metall-Deck", + text = { + "Beginne den Durchlauf mit {C:attention}#1#", + "zu {C:attention}Stahl-Karten", + "verstärkte Spielkarten" + } + }, + b_abandoned = { + name = "Verlassenes Deck", + text = { + "Beginne den Durchlauf", + "ohne {C:attention}Hofkarten", + "in deinem Deck" + } + }, + b_checkered = { + name = "Kariertes Deck", + text = { + "Beginne den Durchlauf mit", + "{C:attention}26{C:spades} Pik-Karten{} und", + "{C:attention}26{C:hearts} Herz-Karten{} im Deck" + } + }, + b_rocky = { + name = "Raues Deck", + text = { + "Beginne den Durchlauf mit {C:attention}#1#", + "zusätzlichen {C:attention}Stein-Karten" + } + }, + b_braided = { + name = "Geflochtenes Deck", + text = { + "Erste gespielte Hand", + "wird auf {C:attention}Lvl. 3 verbessert" + } + }, + b_anaglyph = { + name = "Anaglyphen-Deck", + text = { + "Erhalte nach dem Besiegen jedes", + "{C:attention}Boss Blinds{}", + "einen {C:attention,T:tag_double}#1#{}" + } + }, + b_plasma = { + name = "Plasma-Deck", + text = { + "{C:blue}Chips{} und", + "{C:red}Mult{} werden ausgeglichen, wenn", + "die Punktzahl für die gespielte Hand berechnet wird", + "{C:attention}#1#{}-Basis-Blind-Größe" + } + }, + b_erratic = { + name = "Launisches Deck", + text = { + "Alle {C:attention}Ränge{} und", + "{C:attention}Farben{} im Deck", + "werden durchmischt" + } + }, + b_challenge = { + name = "Herausforderungsdeck", + text = { + "" + } + }, + b_ghost = { + name = "Geisterdeck", + text = { + "{C:spectral}Geister{}-Karten können", + "im Shop auftauchen,", + "beginne mit einer {C:spectral,T:c_hex}Bann{}-Karte" + } + }, + b_zodiac = { + name = "Sternzeichenkarte", + text = { + "Beginne den Durchlauf mit", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "und {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Farbiges Deck", + text = { + "{C:attention}+#1#{} Handgröße", + "{C:red}#2#{} Joker-Slot" + } + } + }, + Other = { + gold_seal = { + name = "Goldenes Siegel", + text = { + "Verdiene {C:money}$3{}, wenn diese", + "Karte gespielt wird", + "und Punktzahlen" + } + }, + white_sticker = { + name = "Weißer Sticker", + text = { + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Weißen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen" + } + }, + red_sticker = { + name = "Roter Sticker", + text = { + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Roten", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen" + } + }, + green_sticker = { + name = "Grüner Sticker", + text = { + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Grünen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen" + } + }, + blue_sticker = { + name = "Blauer Sticker", + text = { + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Blauen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen" + } + }, + black_sticker = { + name = "Schwarzer Sticker", + text = { + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Schwarzen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen" + } + }, + purple_sticker = { + name = "Lila Sticker", + text = { + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Lila", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen" + } + }, + orange_sticker = { + name = "Orangener Sticker", + text = { + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Orangenen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen" + } + }, + gold_sticker = { + name = "Goldener Sticker", + text = { + "Dieser Joker wurde verwendet,", + "um auf der {C:attention}Goldenen", + "{C:attention}-Einsatz{}-Schwierigkeit zu gewinnen" + } + }, + playing_card = { + text = { + "{C:light_black}#1# von {V:1}#2#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} Chips" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1#{} Extra-Chips" + } + }, + locked = { + name = "Gesperrt", + text = {} + }, + debuffed_default = { + name = "Geschwächt", + text = { + "Alle Fähigkeiten", + "sind deaktiviert" + } + }, + debuffed_playing_card = { + name = "Geschwächt", + text = { + "Erzielt keine Chips", + "und alle Fähigkeiten", + "sind deaktiviert" + } + }, + demo_locked = { + name = "Gesperrt", + text = { + "Nicht verfügbar", + "in dieser Demo" + } + }, + demo_shop_locked = { + name = "Gesperrt", + text = { + "Karten aus {C:attention}Jimbos", + "persönlicher Sammlung,", + "verfügbar in der", + "Vollversion von {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Gesperrt", + text = { + "In", + "Arbeit" + } + }, + deck_locked_win = { + name = "Gesperrt", + text = { + "Gewinne einen Durchlauf mit", + "{C:attention}#1#{}", + "auf einer beliebigen Schwierigkeitsstufe" + } + }, + deck_locked_discover = { + name = "Gesperrt", + text = { + "Entdecke mindestens", + "{C:attention}#1#{} Gegenstände aus", + "deiner Sammlung" + } + }, + deck_locked_stake = { + name = "Gesperrt", + text = { + "Gewinne einen Durchlauf mit einem beliebigen", + "Deck auf mindestens", + "Schwierigkeitsstufe {V:1}#1#{}" + } + }, + joker_locked_legendary = { + name = "Gesperrt", + text = { + "Finde diesen Joker", + "aus der {C:spectral}Seelen{}-Karte" + } + }, + undiscovered_joker = { + name = "Nicht entdeckt", + text = { + "Kaufe oder verwende", + "diese Karte in einem", + "Durchlauf ohne Code, um", + "herauszufinden, was sie bewirkt" + } + }, + undiscovered_tarot = { + name = "Nicht entdeckt", + text = { + "Kaufe oder verwende", + "diese Karte in einem", + "Durchlauf ohne Code, um", + "herauszufinden, was sie bewirkt" + } + }, + undiscovered_planet = { + name = "Nicht entdeckt", + text = { + "Kaufe oder verwende", + "diese Karte in einem", + "Durchlauf ohne Code, um", + "herauszufinden, was sie bewirkt" + } + }, + undiscovered_spectral = { + name = "Nicht entdeckt", + text = { + "Kaufe oder verwende", + "diese Karte in einem", + "Durchlauf ohne Code, um", + "herauszufinden, was sie bewirkt" + } + }, + undiscovered_voucher = { + name = "Nicht entdeckt", + text = { + "Löse diesen", + "Gutschein in einem", + "Durchlauf ohne Code ein, um", + "herauszufinden, was er bewirkt" + } + }, + undiscovered_booster = { + name = "Nicht entdeckt", + text = { + "Öffne dieses Paket", + "in einem Durchlauf ohne Code,", + "um herauszufinden, was es bewirkt" + } + }, + undiscovered_edition = { + name = "Nicht entdeckt", + text = { + "Finde diese Edition", + "in einem Durchlauf ohne Code,", + "um herauszufinden, was es bewirkt" + } + }, + undiscovered_tag = { + name = "Nicht entdeckt", + text = { + "Nutze diesen Tag in", + "einem Durchlauf ohne Code, um", + "herauszufinden, was er bewirkt" + } + }, + p_arcana_normal = { + name = "Arkana-Paket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:tarot} Tarot{}-Karten", + "zur sofortigen Verwendung" + } + }, + p_arcana_jumbo = { + name = "Riesiges Arkana-Paket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:tarot} Tarot{}-Karten", + "zur sofortigen Verwendung" + } + }, + p_arcana_mega = { + name = "Mega-Arkana-Paket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:tarot} Tarot{}-Karten", + "zur sofortigen Verwendung" + } + }, + p_celestial_normal = { + name = "Himmelspaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:planet} Planeten{}-Karten", + "zur sofortigen Verwendung" + } + }, + p_celestial_jumbo = { + name = "Riesiges Himmelspaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:planet} Planeten{}-Karten", + "zur sofortigen Verwendung" + } + }, + p_celestial_mega = { + name = "Mega-Himmelspaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:planet} Planeten{}-Karten", + "zur sofortigen Verwendung" + } + }, + p_spectral_normal = { + name = "Geisterpaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:spectral} Geister{}-Karten", + "zur sofortigen Verwendung" + } + }, + p_spectral_jumbo = { + name = "Riesiges Geisterpaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:spectral} Geister{}-Karten", + "zur sofortigen Verwendung" + } + }, + p_spectral_mega = { + name = "Mega-Geisterpaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:spectral} Geister{}-Karten", + "zur sofortigen Verwendung" + } + }, + p_standard_normal = { + name = "Standardpaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:attention} Spielkarten{},", + "um sie deinem Deck hinzuzufügen" + } + }, + p_standard_jumbo = { + name = "Riesiges Standardpaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:attention} Spielkarten{},", + "um sie deinem Deck hinzuzufügen" + } + }, + p_standard_mega = { + name = "Mega-Standardpaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:attention} Spielkarten{},", + "um sie deinem Deck hinzuzufügen" + } + }, + p_buffoon_normal = { + name = "Clownspaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:joker} Joker{}-Karten" + } + }, + p_buffoon_jumbo = { + name = "Riesiges Clownspaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:joker} Joker{}-Karten" + } + }, + p_buffoon_mega = { + name = "Mega-Clownspaket", + text = { + "Wähle {C:attention}#1#{} aus bis zu", + "{C:attention}#2#{C:joker} Joker{}-Karten" + } + }, + pinned_left = { + name = "Angeheftet", + text = { + "Dieser Joker bleibt", + "an der Position", + "ganz links angeheftet" + } + }, + red_seal = { + name = "Rotes Siegel", + text = { + "Löse diese", + "Karte {C:attention}1{}-mal aus" + } + }, + blue_seal = { + name = "Blaues Siegel", + text = { + "Erzeugt eine {C:planet}Planeten{}-Karte", + "wenn diese Karte {C:attention}gehalten{} wird", + "Hand am Ende der Runde" + } + }, + purple_seal = { + name = "Lila Siegel", + text = { + "Erzeugt eine {C:tarot}Tarot{}-Karte", + "bei {C:attention}Abwurf", + "{C:inactive}(Muss Platz haben)" + } + }, + eternal = { + name = "Ewig", + text = { + "Kann nicht verkauft", + "oder zerstört werden" + } + }, + challenge_locked = { + name = "Gesperrt", + text = { + "Gewinne zum Freischalten einen Durchlauf", + "mit mindestens #1# unterschiedlichen Decks", + "Herausforderungsmodus", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Pik", + Hearts = "Herz", + Clubs = "Kreuz", + Diamonds = "Karo" + }, + suits_plural = { + Spades = "Piks", + Hearts = "Herzen", + Clubs = "Kreuze", + Diamonds = "Karos" + }, + blind_states = { + Select = "Auswählen", + Skipped = "Übersprungen", + Current = "Momentan", + Defeated = "Besiegt", + Upcoming = "Anstehend", + Selected = "Ausgewählt" + }, + ranks = { + Ace = "Ass", + King = "König", + Queen = "Dame", + Jack = "Bube", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Beste Hand", + furthest_round = "Höchste Runde", + furthest_ante = "Höchste Ante", + most_money = "Meistes Geld", + boss_streak = "Meiste Bosse hintereinander", + collection = "Sammlung", + win_streak = "Beste Siegesserie", + current_streak = "", + poker_hand = "Meistgespielte Hand" + }, + poker_hands = { + ['Flush House'] = "Flush House", + ['Five of a Kind'] = "Fünfling", + ['Royal Flush'] = "Royal Flush", + ['Straight Flush'] = "Straight Flush", + ['Four of a Kind'] = "Vierling", + ['Full House'] = "Full House", + ['Flush'] = "Flush", + ['Straight'] = "Straight", + ['Three of a Kind'] = "Drilling", + ['Two Pair'] = "Zwei Paare", + ['Pair'] = "Paar", + ['High Card'] = "High Card", + ['Flush Five'] = "Flush Five" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "Ein Drilling und ein Paar mit", + "allen Karten in derselben Farbe" + }, + ['Five of a Kind'] = { + "5 Karten mit demselben Rang" + }, + ['Royal Flush'] = { + "5 Karten hintereinander {aufeinanderfolgende Ränge} mit", + "allen Karten in derselben Farbe" + }, + ['Straight Flush'] = { + "5 Karten hintereinander {aufeinanderfolgende Ränge} mit", + "allen Karten in derselben Farbe" + }, + ['Four of a Kind'] = { + "4 Karten mit demselben Rang. Sie können", + "mit 1 anderen unbewerteten Karte gespielt werden" + }, + ['Full House'] = { + "Ein Drilling und ein Paar" + }, + ['Flush'] = { + "5 Karten mit derselben Farbe" + }, + ['Straight'] = { + "5 Karten hintereinander {aufeinanderfolgende Ränge}" + }, + ['Three of a Kind'] = { + "3 Karten mit demselben Rang. Sie können", + "mit bis zu 2 anderen unbewerteten Karten gespielt werden" + }, + ['Two Pair'] = { + "2 Kartenpaare mit unterschiedlichen Rängen, sie können", + "mit 1 anderen unbewerteten Karte gespielt werden" + }, + ['Pair'] = { + "2 Karten mit demselben Rang. Sie können", + "mit bis zu 3 anderen unbewerteten Karten gespielt werden" + }, + ['High Card'] = { + "Wenn die gespielte Hand keine der oben genannten Hände ist,", + "zählt nur die Karte mit dem höchsten Rang" + }, + ['Flush Five'] = { + "5 Karten mit demselben Rang und derselben Farbe" + } + }, + labels = { + common = "Gewöhnlich", + uncommon = "Ungewöhnlich", + rare = "Selten", + legendary = "Legendär", + tarot = "Tarot", + planet = "Planet", + pluto_planet = "Zwergplanet", + voucher = "Gutschein", + foil = "Foil", + holographic = "Holografisch", + polychrome = "Polychrom", + negative = "Negativ", + gold_seal = "Goldenes Siegel", + locked = "Gesperrt", + blue_seal = "Blaues Siegel", + red_seal = "Rotes Siegel", + purple_seal = "Lila Siegel", + eternal = "Ewig", + pinned_left = "Angeheftet" + }, + dictionary = { + b_sell = "VERKAUFEN", + b_use = "VERWENDEN", + b_select = "AUSWÄHLEN", + b_buy = "KAUFEN", + b_redeem = "EINLÖSEN", + b_open = "ÖFFNEN", + b_and_use = "& VERWENDEN", + b_next_round_1 = "Nächste", + b_next_round_2 = "Runde", + b_play_hand = "Hand spielen", + b_discard = "Abwerfen", + b_sort_hand = "Hand sortieren", + b_run_info_1 = "Starten", + b_run_info_2 = "Info", + b_options = "Optionen", + b_reroll_boss = "Boss aktualisieren", + b_skip_blind = "Blind überspringen", + b_skip_reward = "Belohnung überspringen", + b_skip = "Überspringen", + b_start_new_run = "Neuer Durchlauf", + b_main_menu = "Hauptmenü", + b_collection = "Sammlung", + b_seed = "Code", + b_copy_seed = "Code kopieren", + b_credits = "Credits", + b_stats = "Werte", + b_settings = "Einstellungen", + b_set_game = "Spiel", + b_set_video = "Video", + b_set_graphics = "Grafik", + b_set_audio = "Audio", + b_set_gamespeed = "Spielgeschwindigkeit", + b_set_play_discard_pos = "Spiel-/Abwurf-Tastenposition", + b_set_screenshake = "Bildschirmrütteln", + b_set_crash_reports = "Absturzberichte", + b_set_monitor = "Anzeigemonitor", + b_set_windowmode = "Fenstermodus", + b_set_apply = "Anwenden", + b_set_master_vol = "Gesamtlautstärke", + b_set_music_vol = "Musiklautstärke", + b_set_game_vol = "Spiellautstärke", + b_set_shadows = "Schatten", + b_set_pixel_smoothing = "Pixelart-Glättung", + b_set_CRT = "CRT", + b_set_CRT_bloom = "CRT-Bloom", + b_stat_jokers = "Joker", + b_stat_consumables = "Verbrauchsgegenstände", + b_stat_tarots = "Tarots", + b_stat_planets = "Planeten", + b_stat_spectrals = "Geister", + b_stat_vouchers = "Gutscheine", + b_next = "Weiter", + b_endless = "Endloser Modus", + b_wishlist = "Auf die Steam-Wunschliste setzen", + b_playbalatro = "Besuche playbalatro.com", + b_remaining = "Verbleibend", + b_full_deck = "Volles Deck", + b_poker_hands = "Pokerhände", + b_blinds = "Blinds", + b_vouchers = "Gutscheine", + b_stake = "Einsatz", + b_jokers = "Joker", + b_tarot_cards = "Tarot-Karten", + b_planet_cards = "Planeten-Karten", + b_spectral_cards = "Geister-Karten", + b_enhanced_cards = "Verstärkte Karten", + b_editions = "Editionen", + b_booster_packs = "Booster-Pakete", + b_tags = "Tags", + b_decks = "Decks", + b_continue = "Fortfahren", + b_back = "Zurück", + b_music = "Musik", + b_sounds = "Töne", + b_imagery = "Bilder", + b_new_run = "Neuer Durchlauf", + b_challenges = "Herausforderungen", + b_current_profile = "Aktuelles Profil", + b_load_profile = "Profil laden", + b_create_profile = "Profil erstellen", + b_delete_profile = "Profil löschen", + b_reset_profile = "Profil zurücksetzen", + b_rules = "Regeln", + b_restrictions = "Beschränkungen", + b_deck = "Deck", + b_play_cap = "SPIELEN", + b_options_cap = "OPTIONEN", + b_collection_cap = "SAMMLUNG", + b_quit_cap = "BEENDEN", + b_cash_out = "Auszahlen", + k_unknown = "?????", + k_compatible = "kompatibel", + k_incompatible = "inkompatibel", + k_round = "Runde", + k_ante = "Ante", + k_seed = "Code", + k_reroll = "Aktualisieren", + k_mult = "Mult", + k_rank = "Rang", + k_suit = "Farbe", + k_stake = "Einsatz", + k_common = "Gewöhnlich", + k_uncommon = "Ungewöhnlich", + k_rare = "Selten", + k_legendary = "Legendär", + k_debuffed = "Geschwächt", + k_locked = "Gesperrt", + k_undisovered = "Nicht entdeckt", + k_joker = "Joker", + k_voucher = "Gutschein", + k_tarot = "Tarot", + k_planet = "Planet", + k_dwarf_planet = "Zwergplanet", + k_planet_q = "Planet?", + k_spectral = "Geister", + k_booster = "Booster", + k_edition = "Edition", + k_hud_hands = "Hände", + k_hud_discards = "Abwürfe", + k_lower_score = "Punktzahl", + k_arcana_pack = "Arkana-Paket", + k_celestial_pack = "Himmelspaket", + k_spectral_pack = "Geisterpaket", + k_standard_pack = "Standardpaket", + k_buffoon_pack = "Clownspaket", + k_enter_text = "Text eingeben", + k_defeated_by = "Besiegt von", + k_level_prefix = "Lvl.", + k_also_applied = "Auch angewandt", + k_base_cards = "Basis-Karten", + k_effective = "Effektiv", + k_aces = "Asse", + k_face_cards = "Hofkarten", + k_numbered_cards = "Zahlenkarten", + k_cap_consumables = "VERBRAUCHSGEGENSTÄNDE", + k_page = "Seite", + k_ante_cap = "ANTE", + k_base_cap = "BASIS", + k_jokers_cap = "JOKER", + k_vouchers_cap = "GUTSCHEINE", + k_x_base = "X-Basis", + k_not_discovered = "Nicht entdeckt", + k_unlocked_ex = "Freigeschaltet!", + k_challenge_mode = "Herausforderungsmodus", + k_daily_run = "Täglicher Durchlauf", + k_profile = "Profil", + k_wins = "Siege", + k_empty_caps = "LEER", + k_collection = "Sammlung", + k_stake_level = "Einsatzlevel", + k_none = "Keine", + k_game_modifiers = "Spielmodifikatoren", + k_custom_rules = "Individuelle Regeln", + k_banned_cards = "Verbotene Karten", + k_banned_tags = "Verbotene Tags", + k_other = "Andere", + k_money = "Geld", + k_best_hand = "Beste Hand", + k_seeded_run = "Durchlauf mit Code", + k_enter_seed = "Code eingeben", + k_lvl = "Lvl.", + k_skipped_cap = "ÜBERSPRUNGEN", + k_no_reward = "Keine Belohnung", + k_reward = "Belohnung", + k_nope_ex = "Nö!", + k_or = "oder", + k_balanced = "Ausgewogen", + ph_improve_run = "Verbessere deinen Durchlauf!", + ph_sneak_peek = "Sneak-Peek", + ph_deck_preview_stones = "Steine", + ph_deck_preview_effective = "Effektiver Gesamtwert aufgrund von Jokern, Blinds und Kartenverstärkungen", + ph_blind_score_at_least = "Erreiche mindestens", + ph_blind_reward = "Belohnung:", + ph_up_ante_1 = "Erhöhe die Ante", + ph_up_ante_2 = "Erhöhe alle Blinds", + ph_up_ante_3 = "Aktualisiere Blinds", + ph_stat_joker = "Insgesamt mit dieser Karte abgeschlossene Runden", + ph_stat_consumable = "Wie oft diese Karte gespielt wurde", + ph_stat_voucher = "Wie oft dieser Gutschein eingelöst wurde", + ph_demo_thanks_1 = "Danke fürs Spielen der", + ph_demo_thanks_2 = "BALATRO-DEMO", + ph_game_over = "GAME OVER", + ph_vouchers_redeemed = "In diesem Durchlauf eingelöste Gutscheine", + ph_no_vouchers = "Keine Gutscheine in diesem Durchlauf eingelöst", + ph_defeat_this_blind_1 = "Besiege diesen Blind,", + ph_defeat_this_blind_2 = "um sie zu entdecken", + ph_click_confirm = "Zum Bestätigen erneut klicken", + ph_choose_blind_1 = "Wähle deinen", + ph_choose_blind_2 = "nächsten Blind", + ph_mr_bones = "Von Mr. Bones gerettet", + ph_score_at_least = "Erreiche mindestens", + ph_all_poker_hand = "Alle Pokerhände", + ph_1_level = "+1 Level", + ph_boss_disabled = "Boss deaktiviert!", + ph_most_played = "(Meistgespielte Hand)", + ml_demo_thanks_message = { + "Bitte denke darüber nach,", + "ob du Balatro auf deine Steam-Wunschliste setzen und dich", + "unter playbalatro.com für den Newsletter anmelden möchtest" + }, + ml_eternal = { + "Ewig", + "Kann nicht verkauft", + "oder zerstört werden" + }, + ml_gold_seal_desc = { + "Goldenes Siegel", + "kehrt in die Hand zurück,", + "wenn es gespielt wird" + }, + ml_crash_report_info = { + "Absturzberichte werden den Entwicklern übermittelt,", + "um Probleme in der Zukunft zu vermeiden. Es werden keine", + "personenbezogenen Daten übermittelt." + }, + ml_play_discard_pos_opt = { + "Abwerfen/Spielen", + "Spielen/Abwerfen" + }, + ml_windowmode_opt = { + "Im Fenster", + "Vollbild", + "Randlos" + }, + ml_vsync_opt = { + "V-Sync ein", + "V-Sync aus" + }, + ml_shadow_opt = { + "Ein", + "Aus" + }, + ml_smoothing_opt = { + "Aus", + "Ein" + }, + ml_bloom_opt = { + "Aus", + "Ein" + }, + ml_card_stats = { + "Karte", + "Werte" + }, + ml_paste_seed = { + "Einfügen", + "Code" + }, + ml_disabled_seed = { + "Alle Freischaltungen und", + "Entdeckungen deaktiviert" + }, + ['$'] = "$", + k_redeemed_ex = "Eingelöst!", + k_duplicated_ex = "Dupliziert!", + k_no_room_ex = "Kein Platz!", + k_no_space_ex = "Kein Platz!", + k_no_other_jokers = "Keine anderen Joker!", + k_plus_tarot = "+1 Tarot", + k_plus_stone = "+1 Steine", + k_plus_planet = "+1 Planet", + k_plus_spectral = "+1 Geister", + k_active_ex = "Aktiv!", + k_level_up_ex = "Aufwertung!", + k_upgrade_ex = "Verbesserung!", + k_again_ex = "Nochmal!", + k_val_up = "Wert erhöht!", + k_reset = "Zurücksetzen", + k_extinct_ex = "Erloschen!", + k_safe_ex = "Sicher!", + k_saved_ex = "Gespeichert!", + k_swapped_ex = "Getauscht!", + k_copied_ex = "Kopiert!", + k_melted_ex = "Geschmolzen!", + b_copy = "Kopieren", + b_high_contrast_cards = "Hochkontrastkarten", + b_set_rumble = "Controller-Vibration", + b_seals = "Siegel", + b_new_challenge = "Neue Herausforderung starten", + b_unlock_all = "Alle freischalten", + k_active = "aktiv", + k_deck = "Deck", + k_progress = "Fortschritt", + k_challenges = "Herausforderungen", + k_joker_stickers = "Joker-Sticker", + k_deck_stake_wins = "Deck-Einsatz-Siege", + k_enter_name = "Namen eingeben", + k_gold = "Gold", + k_card_stats = "Kartenwerte", + k_view = "Ansehen", + k_all_hands = "Alle Hände", + k_high_score_ex = "Hochstpunktzahl!", + k_demo_version_ex = "Demo-Version!", + k_playing_as = "Spiele als", + k_choose = "Wählen", + k_achievements_disabled = "Erfolge deaktiviert", + ph_no_boss_active = "kein Boss aktiv", + ph_you_win = "DU GEWINNST!", + ph_you_win_demo = "DU GEWINNST DIE DEMO!", + ph_defeat_the_boss = "Besiege den Boss Blind", + ph_score_furthest_ante = "Ante", + ph_score_furthest_round = "Runde", + ph_score_hand = "Beste Hand", + ph_score_poker_hand = "Meistgespielte Hand", + ph_score_new_collection = "Neue Entdeckungen", + ph_score_cards_played = "Gespielte Karten", + ph_score_cards_discarded = "Abgeworfene Karten", + ph_score_times_rerolled = "Aktualisierungen", + ph_score_cards_purchased = "Gekaufte Karten", + ml_edition_seal_enhancement_explanation = { + "Spielkarten können jeweils 1", + "Verstärkung, Edition und Siegel haben." + }, + ml_unlock_all_explanation = { + "WARNUNG! Wenn du die komplette Sammlung freischaltest,", + "werden Erfolge für dieses Profil deaktiviert!" + }, + k_plus_joker = "+1 Joker", + k_eaten_ex = "Gegessen!", + k_eroded_ex = "Verputzt!", + k_achievement = "Erfolg", + ph_unscored_hand = "Hand erzielt keine Punktzahl", + ph_alert_debuff_confirm = "Drücke zum Bestätigen erneut ‚Spielen‘", + k_drank_ex = "Getrunken!", + k_trophy = "Trophäe", + k_trophies_disabled = "Trophäen deaktiviert", + ml_unlock_all_trophies = { + "WARNUNG! Wenn du die komplette Sammlung freischaltest,", + "werden Trophäen für dieses Profil deaktiviert!" + }, + k_poker_hand = "Pokerhand", + ph_4_7_of_clubs = "vier 7 der Kreuze" + }, + v_dictionary = { + a_xmult = "X#1# Mult", + a_mult = "+#1# Multi.", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# Handgröße", + a_hands = "+#1# Hände", + a_sold_tally = "#1#/#2# Verkauft", + a_remaining = "#1# Verbleibend", + ante_x_voucher = "ANTE-#1#-GUTSCHEIN", + loyalty_active = "Aktiv!", + loyalty_inactive = "#1# verbleibend", + deck_preview_wheel_singular = "Zahlen können niedriger sein, da die #1#-Karte mit dem Gesicht nach unten gezogen wird", + deck_preview_wheel_plural = "Zahlen können niedriger sein, da die #1#-Karten mit dem Gesicht nach unten gezogen werden", + challenges_completed = "#1#/#2# Herausforderungen abgeschlossen", + interest = "#1# Zinsen pro $#2# (#3# max.)", + remaining_hand_money = "Verbleibende Hände ($#1# für jede)", + remaining_discard_money = "Verbleibende Abwürfe ($#1# für jede)", + ml_foil_desc = { + "Foil", + "+#1# Chips" + }, + ml_holo_desc = { + "Holografisch", + "+#1# Mult" + }, + ml_polychrome_desc = { + "Polychrom", + "X#1# Mult" + }, + ml_negative_desc = { + "Negativ", + "+#1# Joker-Slot" + }, + a_mult_minus = "-#1# Mult", + a_handsize_minus = "-#1# Handgröße", + ml_negative_consumable_desc = { + "Negativ", + "+#1# Slot für Verbrauchsgegenstände" + }, + a_xmult_minus = "-X#1# Mult", + unlocked = "#1#/#2# Freigeschaltet", + completed = "#1#/#2# Abgeschlossen" + }, + v_text = { + ch_m_dollars = { + "Beginne mit {C:money}$#1#" + }, + ch_m_hands = { + "{C:blue}#1#{} Hände pro Runde" + }, + ch_m_discards = { + "{C:blue}#1#{} Abwürfe pro Runde" + }, + ch_m_reroll_cost = { + "{C:money}$#1#{} Basis-Aktualisierungskosten" + }, + ch_m_joker_slots = { + "{C:attention}#1#{} Joker-Slots" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} Slots für Verbrauchsgegenstände" + }, + ch_m_hand_size = { + "{C:attention}#1#{} Handgröße" + }, + ch_m_none = { + "{C:inactive}Keine" + }, + ch_c_no_reward = { + "Alle {C:attention}Blinds{} geben kein Belohnungsgeld" + }, + ch_c_no_reward_specific = { + "{C:attention}#1# Blinds{} geben kein Belohnungsgeld" + }, + ch_c_no_extra_hand_money = { + "{C:blue}Extra-Hände{} verdienen kein Geld mehr" + }, + ch_c_no_interest = { + "Erhalte am Ende der Runde keine {C:attention}Zinsen{}" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}Tägliche Herausforderung!" + }, + ch_c_set_seed = { + "1 Versuch mit festgelegtem Code: {C:inactive}{Hidden}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}Chips{} können die aktuellen {C:money}$ nicht übersteigen" + }, + ch_c_none = { + "{C:inactive}Keine" + }, + ch_c_inflation = { + "Erhöht die Preise bei jedem Kauf dauerhaft um {C:money}$1{}" + }, + ch_c_discard_cost = { + "Abwürfe kosten jeweils {C:money}$#1#{}" + }, + ch_c_all_eternal = { + "Alle Shop-Joker sind {C:eternal}ewig{}" + }, + ch_c_flipped_cards = { + "{C:green}1 in #1#{} Karten werden mit dem Gesicht nach unten gezogen" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Halte {C:red}-1{} Karten auf der Hand pro {C:money}$#1#{} in deinem Besitz" + }, + ch_c_no_shop_jokers = { + "Joker tauchen nicht mehr im {C:attention}Shop auf" + }, + ch_c_debuff_played_cards = { + "Alle {C:attention}gespielten{} Karten werden nach der Punktezählung {C:attention}geschwächt{}" + }, + ch_c_set_eternal_ante = { + "Wenn der Ante-{C:attention}#1#{}-Boss besiegt wird, werden alle Joker {C:attention}ewig" + }, + ch_c_set_joker_slots_ante = { + "Wenn der Ante-{C:attention}#1#{}-Boss besiegt wird, werden Joker-Slots auf {C:attention}0 gesetzt" + } + }, + tutorial = { + sb_1 = { + "Hallo! Mein Name lautet", + "{C:attention}Jimbo{}. Ich bin hier,", + "um dir das Spiel beizubringen!" + }, + sb_2 = { + "Dein Ziel ist es,", + "{C:blue}Chips{} zu verdienen, um", + "den gegnerischen {C:attention}Blind zu besiegen" + }, + sb_3 = { + "Das hier ist ein {C:blue}Small Blind{}.", + "Du musst nur", + "{C:attention}300 Chips{} erzielen, um ihn zu schlagen." + }, + sb_4 = { + "Wähle den {C:blue}Small Blind,", + "um die Runde zu beginnen!" + }, + bb_1 = { + "Wähle den {C:attention}Big Blind,", + "um etwas Geld zu verdienen," + }, + bb_2 = { + "oder {C:attention}überspringe ihn,", + "um einen {C:attention}Tag{} zu erhalten! Jeder", + "{C:attention}Tag{} hat einen einzigartigen Effekt," + }, + bb_3 = { + "aber achte auf", + "den {C:attention}Boss Blind{}. Er", + "hat eine Fähigkeit,", + "um die du herum planen musst." + }, + bb_4 = { + "Wenn du ihn schlägst,", + "steigt die {C:attention}Ante{} und alle", + "{C:attention}Blinds{} werden schwieriger" + }, + bb_5 = { + "Schlage die {C:attention}Ante{} #1#, um zu gewinnen.", + "Wähle nun deinen Weg!" + }, + fh_1 = { + "Du verdienst Chips, indem du", + "{C:attention}Pokerhände spielst" + }, + fh_2 = { + "Jede {C:attention}Pokerhand{} verdient einen", + "Basisbetrag an {C:blue}Chips,", + "der mit einigen {C:red}Mult multipliziert wird" + }, + fh_3 = { + "Deine {C:attention}Pokerhände", + "kannst du im Bereich {C:attention}Durchlaufinfo{} ansehen.", + "Dort findest du auch weitere Infos", + "über deinen aktuellen Durchlauf" + }, + fh_4 = { + "Karten verdienen dir außerdem", + "einige {C:blue}Chips{}.", + "Bewege deine Maus darüber, um das zu sehen!" + }, + fh_5 = { + "Wähle nun bis zu", + "{C:attention}5{} Karten zum Spielen", + "und drücke {C:blue}„Hand spielen“" + }, + fh_6 = { + "Du kannst außerdem bis zu", + "ausgewählte Karten {C:red}Abwerfen{},", + "um sogar noch", + "stärkere Hände zu bilden. Probier es aus!" + }, + fh_7 = { + "Aber Vorsicht! Du hast nur eine", + "begrenzte Anzahl an {C:blue}Händen", + "und {C:red}Abwürfen{} pro Runde" + }, + fh_8 = { + "Verdiene {C:attention}300 Chips{}, bevor du", + "keine {C:blue}Hände mehr hast,", + "um diese Runde zu gewinnen.", + "Viel Glück!" + }, + sh_1 = { + "Wenn du mehr Karten erhältst,", + "denk dran, dass du sie neu anordnen kannst.", + "{C:attention}Joker{} werden von", + "links nach rechts ausgelöst" + }, + sh_2 = { + "Und denk dran,", + "deine Verbrauchsgegenstände zu {C:attention}VERWENDEN{}!" + }, + sh_3 = { + "Wähle bis zu {C:attention}2{} Karten", + "auf deiner Hand und drücke", + "{C:attention}„VERWENDEN“{} auf der {C:tarot}Tarot{}-Karte,", + "um sie zu verstärken!" + }, + s_1 = { + "Gut gemacht! Nun, da du", + "eine {E:1}Menge{} {C:money}Geld{} hast,", + "kannst du dir ein paar neue", + "Karten im {C:attention}Shop kaufen" + }, + s_2 = { + "Versuche, diesen", + "schicken Teufel zu kaufen" + }, + s_3 = { + "Das hier ist einer der {C:attention}#1#", + "{C:attention}Joker{}, die du deinem Durchlauf", + "hinzufügen kannst. Jeder {C:attention}Joker", + "macht etwas anderes" + }, + s_4 = { + "Dieser hier fügt {C:red}+4 Mult{} zu", + "jeder Hand hinzu, die du spielst!" + }, + s_5 = { + "Sei wählerisch, du kannst nur", + "{C:attention}5 Joker{}-Karten", + "gleichzeitig haben" + }, + s_6 = { + "Kaufe nun die andere", + "Karte im {C:attention}Shop" + }, + s_7 = { + "Diese {C:tarot}Tarot{}-Karte ist ein", + "{C:attention}Verbrauchsgegenstand{}. Die hier", + "verstärkt deine Spielkarten!", + "Bewahre sie also auf." + }, + s_8 = { + "Du kannst bis zu", + "{C:attention}2 Verbrauchsgegenstand{}-Karten", + "gleichzeitig haben." + }, + s_9 = { + "Wenn du genug ansparst,", + "kannst du dir einen {C:attention}Gutschein{} kaufen.", + "{C:attention}Gutscheine{} verbessern passiv", + "deinen Durchlauf!" + }, + s_10 = { + "{C:attention}Gutscheine{} werden wieder aufgefüllt,", + "nachdem du den", + "{C:attention}Boss Blind{} besiegst." + }, + s_11 = { + "Und sieh dir beide", + "{C:booster}Booster-Pakete{} in", + "jedem Shop an. Sie stecken", + "voller nützlicher Sachen!" + }, + s_12 = { + "Gehen wir über", + "zur {C:attention}nächsten Runde{}." + } + }, + achievement_names = { + ante_up = "Ante-Steigerung!", + ante_upper = "Größere Ante-Steigerung!", + heads_up = "Achtung", + low_stakes = "Niedriger Einsatz", + mid_stakes = "Mittlerer Einsatz", + high_stakes = "Hoher Einsatz", + card_player = "Kartenspieler", + card_discarder = "Kartenabwerfer", + nest_egg = "Notgroschen", + flushed = "Total geflushed", + speedrunner = "Schnellläufer", + roi = "ROI", + shattered = "Zerbrochen", + royale = "Royale", + retrograde = "Retrograd", + _10k = "10k", + _1000k = "1.000k", + _100000k = "100.000k", + tiny_hands = "Winzige Hände", + big_hands = "Große Hände", + you_get_what_you_get = "Du kriegst, was du willst", + rule_bender = "Regelbieger", + rule_breaker = "Regelbrecher", + legendary = "Legendär", + astronomy = "Astronomie", + cartomancy = "Kartenlegen", + clairvoyance = "Hellseherei", + extreme_couponer = "Coupons en masse", + completionist = "Vervollständiger", + completionist_plus = "Vervollständiger+", + completionist_plus_plus = "Vervollständiger++" + }, + achievement_descriptions = { + ante_up = "Erreiche Ante 4", + ante_upper = "Erreiche Ante 8", + heads_up = "Gewinne einen Durchlauf.", + low_stakes = "Gewinne einen Durchlauf mindestens auf der Schwierigkeitsstufe „Roter Einsatz“.", + mid_stakes = "Gewinne einen Durchlauf mindestens auf der Schwierigkeitsstufe „Schwarzer Einsatz“.", + high_stakes = "Gewinne einen Durchlauf mindestens auf der Schwierigkeitsstufe „Goldener Einsatz“.", + card_player = "Spiele mindestens 2.500 Karten.", + card_discarder = "Wirf mindestens 2.500 Karten ab.", + nest_egg = "Besitze mindestens $400 während eines Durchlaufs.", + flushed = "Spiele einen Flush mit 5 Wildcards.", + speedrunner = "Gewinne einen Durchlauf in maximal 12 Runden.", + roi = "Kaufe 5 Gutscheine bis Ante 4.", + shattered = "Zerbrich 2 Glaskarten in einer einzelnen Hand.", + royale = "Spiele einen Royal Flush.", + retrograde = "Bringe eine beliebige Pokerhand auf Level 10.", + _10k = "Erziele 10.000 Chips in einer einzelnen Hand.", + _1000k = "Erziele 1.000.000 Chips in einer einzelnen Hand.", + _100000k = "Erziele 100.000.000 Chips in einer einzelnen Hand.", + tiny_hands = "Dünne dein Deck auf maximal 20 Karten aus", + big_hands = "Halte mindestens 80 Karten in deinem Deck.", + you_get_what_you_get = "Gewinne einen Durchlauf ohne Aktualisierung des Shops.", + rule_bender = "Schließe einen beliebigen Herausforderungsdurchlauf ab.", + rule_breaker = "Schließe jeden Herausforderungsdurchlauf ab.", + legendary = "Entdecke einen legendären Joker.", + astronomy = "Entdecke jede Planeten-Karte.", + cartomancy = "Entdecke jede Tarot-Karte.", + clairvoyance = "Entdecke jede Geister-Karte.", + extreme_couponer = "Entdecke jeden Gutschein.", + completionist = "Entdecke 100 % deiner Sammlung.", + completionist_plus = "Gewinne mit jedem Deck auf der Schwierigkeitsstufe „Goldener Einsatz“.", + completionist_plus_plus = "Verdiene einen Goldenen Sticker bei jedem Joker." + }, + quips = { + wq_1 = { + "Ass-rein!" + }, + wq_2 = { + "Das hast du", + "gut hingekriegt!" + }, + wq_3 = { + "Anscheinend", + "bluffst du!" + }, + wq_4 = { + "Schade, dass", + "die Chips bloß", + "virtuell sind ..." + }, + wq_5 = { + "Anscheinend habe ich", + "dir das gut beigebracht!" + }, + wq_6 = { + "Du hast Aufsehen mit", + "deinen Spielen erregt!" + }, + wq_7 = { + "Zum Glück", + "habe ich nicht", + "gegen dich gewettet" + }, + lq_1 = { + "Vielleicht ist Quartett", + "eher unser", + "Tempo ..." + }, + lq_2 = { + "Wir sind umgeknickt", + "wie Streichhölzer!" + }, + lq_3 = { + "Zeit, dass wir", + "neu mischen und", + "es erneut versuchen!" + }, + lq_4 = { + "Du weißt,", + "wie es heißt:", + "Die Bank gewinnt immer!" + }, + lq_5 = { + "Anscheinend wissen", + "wir jetzt, wer", + "der wahre Joker ist!" + }, + lq_6 = { + "Oh, nein, hast du", + "auch geblufft?" + }, + lq_7 = { + "Anscheinend sind wir", + "die Angeschmierten!" + }, + lq_8 = { + "Hätte ich Hände,", + "würde ich mir", + "die Augen zuhalten!" + }, + lq_9 = { + "Ich bin buchstäblich", + "ein Narr. Was ist", + "deine Ausrede?" + }, + lq_10 = { + "So ein Flop!" + }, + dq_1 = { + "Mannomann! Hoffentlich", + "hast du ein paar Tricks", + "im Ärmel für", + "diese letzte Herausforderung!" + } + }, + challenge_names = { + c_omelette_1 = "Das Omelett", + c_city_1 = "15-Minuten-Stadt", + c_rich_1 = "Reiche werden reicher", + c_knife_1 = "Auf Messers Schneide", + c_xray_1 = "Röntgenblick", + c_mad_world_1 = "Verrückte Welt", + c_luxury_1 = "Luxussteuer", + c_non_perishable_1 = "Haltbar", + c_medusa_1 = "Medusa", + c_double_nothing_1 = "Doppelt oder nichts", + c_typecast_1 = "Typisierung", + c_inflation_1 = "Inflation", + c_bram_poker_1 = "Bram-Poker", + c_fragile_1 = "Zerbrechlich", + c_monolith_1 = "Monolith", + c_blast_off_1 = "Abheben", + c_five_card_1 = "Fünf-Karten-Zug", + c_golden_needle_1 = "Goldene Nadel", + c_cruelty_1 = "Grausamkeit", + c_jokerless_1 = "Jokerlos" + } + } +} \ No newline at end of file diff --git a/localization/en-us.lua b/localization/en-us.lua new file mode 100644 index 0000000..8d37dfd --- /dev/null +++ b/localization/en-us.lua @@ -0,0 +1,4138 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Joker", + text = { + "{C:red,s:1.1}+#1#{} Mult" + } + }, + j_jolly = { + name = "Jolly Joker", + text = { + "{C:red}+#1#{} Mult if played", + "hand contains", + "a {C:attention}#2#" + } + }, + j_zany = { + name = "Zany Joker", + text = { + "{C:red}+#1#{} Mult if played", + "hand contains", + "a {C:attention}#2#" + } + }, + j_mad = { + name = "Mad Joker", + text = { + "{C:red}+#1#{} Mult if played", + "hand contains", + "a {C:attention}#2#" + } + }, + j_crazy = { + name = "Crazy Joker", + text = { + "{C:red}+#1#{} Mult if played", + "hand contains", + "a {C:attention}#2#", + } + }, + j_droll = { + name = "Droll Joker", + text = { + "{C:red}+#1#{} Mult if played", + "hand contains", + "a {C:attention}#2#" + } + }, + j_sly = { + name = "Sly Joker", + text = { + "{C:chips}+#1#{} Chips if played", + "hand contains", + "a {C:attention}#2#" + } + }, + j_wily = { + name = "Wily Joker", + text = { + "{C:chips}+#1#{} Chips if played", + "hand contains", + "a {C:attention}#2#" + } + }, + j_clever = { + name = "Clever Joker", + text = { + "{C:chips}+#1#{} Chips if played", + "hand contains", + "a {C:attention}#2#" + } + }, + j_devious = { + name = "Devious Joker", + text = { + "{C:chips}+#1#{} Chips if played", + "hand contains", + "a {C:attention}#2#" + } + }, + j_crafty = { + name = "Crafty Joker", + text = { + "{C:chips}+#1#{} Chips if played", + "hand contains", + "a {C:attention}#2#" + } + }, + j_half = { + name = "Half Joker", + text = { + "{C:red}+#1#{} Mult if played", + "hand contains", + "{C:attention}#2#{} or fewer cards" + } + }, + j_fortune_teller = { + name = "Fortune Teller", + text = { + "{C:red}+#1#{} Mult per {C:purple}Tarot{}", + "card used this run", + "{C:inactive}(Currently {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Juggler", + text = { + "{C:attention}+#1#{} hand size" + } + }, + j_drunkard = { + name = "Drunkard", + text = { + "{C:red}+#1#{} discard" + } + }, + j_stone = { + name = "Stone Joker", + text = { + "This Joker gains {C:chips}+#1#{} Chips", + "for each {C:attention}Stone Card", + "in your full deck", + "{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)", + } + }, + j_golden = { + name = "Golden Joker", + text = { + "Earn {C:money}$#1#{} at", + "end of round" + } + }, + j_stencil = { + name = "Joker Stencil", + text = { + "{X:red,C:white} X1 {} Mult for each", + "empty {C:attention}Joker{} slot", + "{s:0.8}Joker Stencil included", + "{C:inactive}(Currently {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Four Fingers", + text = { + "All {C:attention}Flushes{} and", + "{C:attention}Straights{} can be", + "made with {C:attention}4{} cards" + } + }, + j_mime = { + name = "Mime", + text = { + "Retrigger all", + "card {C:attention}held in", + "{C:attention}hand{} abilities" + } + }, + j_credit_card = { + name = "Credit Card", + text = { + "Go up to", + "{C:red}-$#1#{} in debt" + } + }, + j_greedy_joker = { + name = "Greedy Joker", + text = { + "Played cards with", + "{C:diamonds}#2#{} suit give", + "{C:mult}+#1#{} Mult when scored", + } + }, + j_lusty_joker = { + name = "Lusty Joker", + text = { + "Played cards with", + "{C:hearts}#2#{} suit give", + "{C:mult}+#1#{} Mult when scored", + } + }, + j_wrathful_joker = { + name = "Wrathful Joker", + text = { + "Played cards with", + "{C:spades}#2#{} suit give", + "{C:mult}+#1#{} Mult when scored", + } + }, + j_gluttenous_joker = { + name = "Gluttonous Joker", + text = { + "Played cards with", + "{C:clubs}#2#{} suit give", + "{C:mult}+#1#{} Mult when scored", + } + }, + j_ceremonial = { + name = "Ceremonial Dagger", + text = { + "When {C:attention}Blind{} is selected,", + "destroy Joker to the right", + "and permanently add {C:attention}double", + "its sell value to this {C:red}Mult", + "{C:inactive}(Currently {C:mult}+#1#{C:inactive} Mult)" + } + }, + j_banner = { + name = "Banner", + text = { + "{C:chips}+#1#{} Chips for", + "each remaining", + "{C:attention}discard" + } + }, + j_mystic_summit = { + name = "Mystic Summit", + text = { + "{C:mult}+#1#{} Mult when", + "{C:attention}#2#{} discards", + "remaining" + } + }, + j_marble = { + name = "Marble Joker", + text = { + "Adds one {C:attention}Stone{} card", + "to deck when", + "{C:attention}Blind{} is selected", + } + }, + j_loyalty_card = { + name = "Loyalty Card", + text = { + "{X:red,C:white} X#1# {} Mult every", + "{C:attention}#2#{} hands played", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "8 Ball", + text = { + "Create a {C:planet}Planet{} card", + "if played hand contains", + "{C:attenetion}#1#{} or more {C:attention}8s{}", + "{C:inactive}(Must have room)" + } + }, + j_dusk = { + name = "Dusk", + text = { + "Retrigger all played", + "cards in {C:attention}final", + "{C:attention}hand{} of round" + } + }, + j_chaos = { + name = "Chaos the Clown", + text = { + "{C:attention}#1#{} free {C:green}Reroll", + "per shop" + } + }, + j_misprint = { + name = "Misprint", + text = { + "" + } + }, + j_raised_fist = { + name = "Raised Fist", + text = { + "Adds {C:attention}double{} the rank", + "of {C:attention}lowest{} card held", + "in hand to Mult" + } + }, + j_fibonacci = { + name = "Fibonacci", + text = { + "Each played {C:attention}Ace{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{}, or {C:attention}8{} gives", + "{C:mult}+#1#{} Mult when scored", + } + }, + j_steel_joker = { + name = "Steel Joker", + text = { + "This Joker gains {X:mult,C:white} X#1# {} Mult", + "for each {C:attention}Steel Card", + "in your full deck", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + } + }, + j_scary_face = { + name = "Scary Face", + text = { + "Played {C:attention}face{} cards", + "give {C:chips}+#1#{} Chips", + "when scored" + } + }, + j_abstract = { + name = "Abstract Joker", + text = { + "{C:mult}+#1#{} Mult for", + "each {C:attention}Joker{} card", + "{C:inactive}(Currently {C:red}+#2#{C:inactive} Mult)" + } + }, + j_delayed_grat = { + name = "Delayed Gratification", + text = { + "Earn {C:money}$#1#{} per {C:attention}discard{} if", + "no discards are used", + "by end of the round" + } + }, + j_pareidolia = { + name = "Pareidolia", + text = { + "All cards are", + "considered", + "{C:attention}face{} cards" + } + }, + j_hack = { + name = "Hack", + text = { + "Retrigger", + "each played", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{}, or {C:attention}5{}", + } + }, + j_gros_michel = { + name = "Gros Michel", + text = { + "{C:mult}+#1#{} Mult", + "{C:green}#2# in #3#{} chance this", + "card is destroyed", + "at end of round" + } + }, + j_even_steven = { + name = "Even Steven", + text = { + "Played cards with", + "{C:attention}even{} rank give", + "{C:mult}+#1#{} Mult when scored", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "Odd Todd", + text = { + "Played cards with", + "{C:attention}odd{} rank give", + "{C:chips}+#1#{} Chips when scored", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Scholar", + text = { + "Played {C:attention}Aces{}", + "give {C:chips}+#2#{} Chips", + "and {C:mult}+#1#{} Mult", + "when scored" + } + }, + j_business = { + name = "Business Card", + text = { + "Played {C:attention}face{} cards have", + "a {C:green}#1# in #2#{} chance to", + "give {C:money}$2{} when scored" + } + }, + j_supernova = { + name = "Supernova", + text = { + "Adds the number of", + "times {C:attention}poker hand{} has", + "been played to Mult" + } + }, + j_superposition = { + name = "Superposition", + text = { + "Create a {C:tarot}Tarot{} card if", + "poker hand contains an", + "{C:attention}Ace{} and a {C:attention}Straight{}", + "{C:inactive}(Must have room)" + } + }, + j_ride_the_bus = { + name = "Ride the Bus", + text = { + "{C:mult}+#1#{} Mult per", + "consecutive hand", + "played without a", + "scoring {C:attention}face{} card", + "{C:inactive}(Currently {C:mult}+#2#{C:inactive} Mult)" + } + }, + j_space = { + name = "Space Joker", + text = { + "{C:green}#1# in #2#{} chance to", + "upgrade level of", + "played {C:attention}poker hand{}" + } + }, + j_egg = { + name = "Egg", + text = { + "Gains {C:money}$#1#{} of", + "{C:attention}sell value{} at", + "end of round" + } + }, + j_burglar = { + name = "Burglar", + text = { + "When {C:attention}Blind{} is selected,", + "gain {C:blue}+#1#{} Hands and", + "{C:attention}lose all discards" + } + }, + j_blackboard = { + name = "Blackboard", + text = { + "{X:red,C:white} X#1# {} Mult if all", + "cards held in hand", + "are {C:spades}#2#{} or {C:clubs}#3#{}" + } + }, + j_runner = { + name = "Runner", + text = { + "Gains {C:chips}+#2#{} Chips", + "if played hand", + "contains a {C:attention}Straight{}", + "{C:inactive}(Currently {C:chips}+#1#{C:inactive} Chips)" + } + }, + j_ice_cream = { + name = "Ice Cream", + text = { + "{C:chips}+#1#{} Chips", + "{C:chips}-#2#{} Chips for", + "every hand played" + } + }, + j_dna = { + name = "DNA", + text = { + "If {C:attention}first hand{} of round", + "has only {C:attention}1{} card, add a", + "permanent copy to deck", + "and draw it to {C:attention}hand" + } + }, + j_splash = { + name = "Splash", + text = { + "Every {C:attention}played card", + "counts in scoring" + } + }, + j_blue_joker = { + name = "Blue Joker", + text = { + "{C:chips}+#1#{} Chips for each", + "remaining card in {C:attention}deck", + "{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)" + } + }, + j_sixth_sense = { + name = "Sixth Sense", + text = { + "If {C:attention}first hand{} of round is", + "a single {C:attention}6{}, destroy it and", + "create a {C:spectral}Spectral{} card", + "{C:inactive}(Must have room)" + } + }, + j_constellation = { + name = "Constellation", + text = { + "Gains {X:mult,C:white} X#1# {} Mult", + "per {C:planet}Planet{} card used", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_hiker = { + name = "Hiker", + text = { + "Every played {C:attention}card{}", + "permanently gains", + "{C:chips}+#1#{} Chips when scored" + } + }, + j_faceless = { + name = "Faceless Joker", + text = { + "Earn {C:money}$#1#{} if {C:attention}#2#{} or", + "more {C:attention}face cards{}", + "are discarded", + "at the same time" + } + }, + j_todo_list = { + name = "To Do List", + text = { + "Earn {C:money}$#1#{} if {C:attention}poker hand{}", + "is a {C:attention}#2#{},", + "poker hand changes", + "on every payout" + } + }, + j_ticket = { + name = "Golden Ticket", + text = { + "Played {C:attention}Gold{} cards", + "earn {C:money}$#1#{} when scored", + }, + unlock = { + "Play a 5 card hand", + "that contains only", + "{C:attention,E:1}Gold{} cards" + } + }, + j_mr_bones = { + name = "Mr. Bones", + text = { + "Prevents Death", + "if chips scored", + "are at least {C:attention}25%", + "of required chips", + "{S:1.1,C:red,E:2}self destructs{}" + }, + unlock = { + "Lose {C:attention,E:1}#1#{} runs", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Acrobat", + text = { + "{X:red,C:white} X#1# {} Mult on {C:attention}final", + "{C:attention}hand{} of round" + }, + unlock = { + "Play {C:attention,E:1}#1#{} hands", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "Sock and Buskin", + text = { + "Retrigger all", + "played {C:attention}face{} cards" + }, + unlock = { + "Play a total of", + "{C:attention,E:1}#1#{} face cards", + "{C:inactive}(#2#)" + } + }, + j_green_joker = { + name = "Green Joker", + text = { + "{C:mult}+#1#{} Mult per hand played", + "{C:mult}-#2#{} Mult per discard", + "{C:inactive}(Currently {C:mult}+#3#{C:inactive} Mult)" + } + }, + j_swashbuckler = { + name = "Swashbuckler", + text = { + "Adds the sell value of", + "all owned {C:attention}Jokers{} left", + "of this card to Mult", + "{C:inactive}(Currently {C:mult}+#1#{C:inactive} Mult)" + }, + unlock = { + "Sell a total of", + "{C:attention,E:1}#1#{} Joker cards", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Troubadour", + text = { + "{C:attention}+#1#{} hand size,", + "{C:red}-#2#{} hands per round" + }, + unlock = { + "Win {C:attention,E:1}#1#{} consecutive", + "rounds by playing", + "only 1 hand" + } + }, + j_certificate = { + name = "Certificate", + text = { + "When round begins,", + "add a random {C:attention}playing", + "{C:attention}card{} with a random", + "{C:attention}seal{} to your hand" + }, + unlock = { + "Have a Gold", + "playing card with", + "a {C:attention,E:1}Gold Seal" + } + }, + j_smeared = { + name = "Smeared Joker", + text = { + "{C:hearts}Hearts{} and {C:diamonds}Diamonds", + "count as the same suit,", + "{C:spades}Spades{} and {C:clubs}Clubs", + "count as the same suit" + }, + unlock = { + "Have at least {C:attention}#1#", + "{E:1,C:attention}#2#{} in", + "your deck" + } + }, + j_throwback = { + name = "Throwback", + text = { + "{X:mult,C:white} X#1# {} Mult for each", + "{C:attention}Blind{} skipped this run", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "Continue a saved run", + "from the main menu" + } + }, + j_hanging_chad = { + name = "Hanging Chad", + text = { + "Retrigger {C:attention}first{} played", + "card used in scoring" + }, + unlock = { + "Beat a Boss Blind", + "with a {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Rough Gem", + text = { + "Played cards with", + "{C:diamonds}Diamond{} suit earn", + "{C:money}$#1#{} when scored", + }, + unlock = { + "Have at least {E:1,C:attention}#1#", + "cards with {E:1,C:attention}#2#", + "suit in your deck" + } + }, + j_bloodstone = { + name = "Bloodstone", + text = { + "{C:green}#1# in #2#{} chance for", + "played cards with", + "{C:hearts}Heart{} suit to give", + "{X:mult,C:white} X#3# {} Mult when scored", + }, + unlock = { + "Have at least {E:1,C:attention}#1#", + "cards with {E:1,C:attention}#2#", + "suit in your deck" + } + }, + j_arrowhead = { + name = "Arrowhead", + text = { + "Played cards with", + "{C:spades}Spade{} suit give", + "{C:chips}+#1#{} Chips when scored", + }, + unlock = { + "Have at least {E:1,C:attention}#1#", + "cards with {E:1,C:attention}#2#", + "suit in your deck" + } + }, + j_onyx_agate = { + name = "Onyx Agate", + text = { + "Played cards with", + "{C:clubs}Club{} suit give", + "{C:mult}+#1#{} Mult when scored", + }, + unlock = { + "Have at least {E:1,C:attention}#1#", + "cards with {E:1,C:attention}#2#", + "suit in your deck" + } + }, + j_glass = { + name = "Glass Joker", + text = { + "Gains {X:mult,C:white} X#1# {} Mult", + "for every {C:attention}Glass Card", + "that is destroyed", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "Have at least {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} in", + "your deck" + } + }, + j_ring_master = { + name = "Showman", + text = { + "{C:attention}Joker{}, {C:tarot}Tarot{}, {C:planet}Planet{},", + "and {C:spectral}Spectral{} cards may", + "appear multiple times" + }, + unlock = { + "Reach Ante", + "level {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Flower Pot", + text = { + "{X:mult,C:white} X#1# {} Mult if played", + "hand has a scoring", + "{C:diamonds}Diamond{} card, {C:clubs}Club{} card,", + "{C:hearts}Heart{} card, and {C:spades}Spade{} card" + }, + unlock = { + "Reach Ante", + "level {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Blueprint", + text = { + "Copies ability of", + "{C:attention}Joker{} to the right" + }, + unlock = { + "Win a run" + } + }, + j_wee = { + name = "Wee Joker", + text = { + "This Joker gains", + "{C:chips}+#2#{} Chips when each", + "played {C:attention}2{} is scored", + "{C:inactive}(Currently {C:chips}+#1#{C:inactive} Chips)" + }, + unlock = { + "Win a run in {E:1,C:attention}#1#", + "or fewer rounds" + } + }, + j_merry_andy = { + name = "Merry Andy", + text = { + "{C:red}+#1#{} discards,", + "{C:red}#2#{} hand size" + }, + unlock = { + "Win a run in {E:1,C:attention}#1#", + "or fewer rounds" + } + }, + j_oops = { + name = "Oops! All 6s", + text = { + "Doubles all {C:attention}listed", + "{C:green,E:1,S:1.1}probabilities", + "{C:inactive}(ex: {C:green}1 in 3{C:inactive} -> {C:green}2 in 3{C:inactive})" + }, + unlock = { + "In one hand,", + "earn at least", + "{E:1,C:attention}#1#{} chips" + } + }, + j_idol = { + name = "The Idol", + text = { + "Each played {C:attention}#2#", + "of {V:1}#3#{} gives", + "{X:mult,C:white} X#1# {} Mult when scored", + "{s:0.8}Card changes every round" + }, + unlock = { + "In one hand,", + "earn at least", + "{E:1,C:attention}#1#{} chips" + } + }, + j_seeing_double = { + name = "Seeing Double", + text = { + "{X:mult,C:white} X#1# {} Mult if played", + "hand has a scoring", + "{C:clubs}Club{} card and a scoring", + "card of any other {C:attention}suit", + }, + unlock = { + "Play a hand", + "that contains", + "{E:1,C:attention}#1#" + } + }, + j_matador = { + name = "Matador", + text = { + "Earn {C:money}$#1#{} if played", + "hand triggers the", + "{C:attention}Boss Blind{} ability" + }, + unlock = { + "Defeat a Boss Blind", + "in {E:1,C:attention}1 hand{} without", + "using any discards" + } + }, + j_hit_the_road = { + name = "Hit the Road", + text = { + "Gains {X:mult,C:white} X#1# {} Mult", + "per discarded", + "{C:attention}Jack{} this round", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "Discard {E:1,C:attention}5", + "{E:1,C:attention}Jacks{} at the", + "same time" + } + }, + j_duo = { + name = "The Duo", + text = { + "{X:mult,C:white} X#1# {} Mult if played", + "hand contains", + "a {C:attention}#2#" + }, + unlock = { + "Win a run", + "without playing", + "a {E:1,C:attention}#1#" + } + }, + j_trio = { + name = "The Trio", + text = { + "{X:mult,C:white} X#1# {} Mult if played", + "hand contains", + "a {C:attention}#2#" + }, + unlock = { + "Win a run", + "without playing", + "a {E:1,C:attention}#1#" + } + }, + j_family = { + name = "The Family", + text = { + "{X:mult,C:white} X#1# {} Mult if played", + "hand contains", + "a {C:attention}#2#" + }, + unlock = { + "Win a run", + "without playing", + "a {E:1,C:attention}#1#" + } + }, + j_order = { + name = "The Order", + text = { + "{X:mult,C:white} X#1# {} Mult if played", + "hand contains", + "a {C:attention}#2#" + }, + unlock = { + "Win a run", + "without playing", + "a {E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "The Tribe", + text = { + "{X:mult,C:white} X#1# {} Mult if played", + "hand contains", + "a {C:attention}#2#" + }, + unlock = { + "Win a run", + "without playing", + "a {E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "Cavendish", + text = { + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2# in #3#{} chance this", + "card is destroyed", + "at end of round" + } + }, + j_card_sharp = { + name = "Card Sharp", + text = { + "{X:mult,C:white} X#1# {} Mult if played", + "{C:attention}poker hand{} has already", + "been played this round" + } + }, + j_red_card = { + name = "Red Card", + text = { + "Gains {C:red}+#1#{} Mult when any", + "{C:attention}Booster Pack{} is skipped", + "{C:inactive}(Currently {C:red}+#2#{C:inactive} Mult)" + } + }, + j_madness = { + name = "Madness", + text = { + "When {C:attention}Blind{} is selected,", + "gain {X:mult,C:white} X#1# {} Mult and", + "{C:attention}destroy{} a random Joker", + "{C:inactive}(Currently {X:mult,C:white} X#2# {} Mult)" + } + }, + j_square = { + name = "Square Joker", + text = { + "Gains {C:chips}+#2#{} Chips if", + "played hand has", + "exactly {C:attention}4{} cards", + "{C:inactive}(Currently {C:chips}#1#{} Chips)" + } + }, + j_seance = { + name = "Séance", + text = { + "If {C:attention}poker hand{} is a", + "{C:attention}#1#{}, create a", + "random {C:spectral}Spectral{} card", + "{C:inactive}(Must have room)" + } + }, + j_riff_raff = { + name = "Riff-Raff", + text = { + "When {C:attention}Blind{} is selected,", + "create {C:attention}#1# {C:blue}Common{C:attention} Jokers", + "{C:inactive}(Must have room)" + } + }, + j_vampire = { + name = "Vampire", + text = { + "Gains {X:mult,C:white} X#1# {} Mult per", + "{C:attention}Enhanced card{} played,", + "removes card {C:attention}Enhancement", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_shortcut = { + name = "Shortcut", + text = { + "Allows {C:attention}Straights{} to be", + "made with gaps of {C:attention}1 rank", + "{C:inactive}(ex: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Hologram", + text = { + "Gains {X:mult,C:white} X#1# {} Mult", + "per {C:attention}playing card{} added", + "to your deck", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_vagabond = { + name = "Vagabond", + text = { + "Create a {C:purple}Tarot{} card", + "if hand is played", + "with {C:money}$#1#{} or less", + } + }, + j_baron = { + name = "Baron", + text = { + "Each {C:attention}King{}", + "held in hand", + "gives {X:mult,C:white} X#1# {} Mult", + + } + }, + j_cloud_9 = { + name = "Cloud 9", + text = { + "Earn {C:money}$#1#{} for each", + "{C:attention}9{} in your {C:attention}full deck", + "at end of round", + "{C:inactive}(Currently {C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "Rocket", + text = { + "Earn {C:money}$#1#{} at end of", + "round. Gains {C:money}$#2#{} when", + "{C:attention}Boss Blind{} is defeated", + } + }, + j_obelisk = { + name = "Obelisk", + text = { + "{X:mult,C:white} X#1# {} Mult per", + "consecutive hand played", + "without playing your", + "most played {C:attention}poker hand", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_midas_mask = { + name = "Midas Mask", + text = { + "All {C:attention}face{} cards", + "become {C:attention}Gold{} cards", + "when played", + } + }, + j_luchador = { + name = "Luchador", + text = { + "Sell this card to", + "disable the current", + "{C:attention}Boss Blind{}", + } + }, + j_photograph = { + name = "Photograph", + text = { + "First played {C:attention}face", + "card gives {X:mult,C:white} X#1# {} Mult", + "when scored", + } + }, + j_gift = { + name = "Gift Card", + text = { + "Add {C:money}$#1#{} of {C:attention}sell value", + "to every {C:attention}Joker{} and", + "{C:attention}Consumable{} card at", + "end of round" + } + }, + j_turtle_bean = { + name = "Turtle Bean", + text = { + "{C:attention}+#1#{} hand size,", + "reduces by", + "{C:red}#2#{} every round" + } + }, + j_erosion = { + name = "Erosion", + text = { + "{C:red}+#1#{} Mult for each", + "card below {C:attention}#3#{}", + "in your full deck", + "{C:inactive}(Currently {C:red}+#2#{C:inactive} Mult)" + } + }, + j_reserved_parking = { + name = "Reserved Parking", + text = { + "Each {C:attention}face{} card", + "held in hand has", + "a {C:green}#2# in #3#{} chance", + "to give {C:money}$#1#{}", + + } + }, + j_mail = { + name = "Mail-In Rebate", + text = { + "Earn {C:money}$#1#{} for each", + "discarded {C:attention}#2#{}, rank", + "changes every round" + } + }, + j_to_the_moon = { + name = "To the Moon", + text = { + "Earn an extra {C:money}$#1#{} of", + "{C:attention}interest{} for every {C:money}$5{} you", + "have at end of round" + } + }, + j_hallucination = { + name = "Hallucination", + text = { + "{C:green}#1# in #2#{} chance to create", + "a {C:tarot}Tarot{} card when any", + "{C:attention}Booster Pack{} is opened", + "{C:inactive}(Must have room)" + } + }, + j_lucky_cat = { + name = "Lucky Cat", + text = { + "Gains {X:mult,C:white} X#1# {} Mult each", + "time a {C:attention}Lucky{} card", + "{C:green}successfully{} triggers", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_baseball = { + name = "Baseball Card", + text = { + "{C:green}Uncommon{} Jokers", + "each give {X:mult,C:white} X#1# {} Mult", + } + }, + j_bull = { + name = "Bull", + text = { + "{C:chips}+#1#{} Chips for each", + "{C:money}dollar{} you have", + "{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)" + } + }, + j_diet_cola = { + name = "Diet Cola", + text = { + "Sell this card to", + "create a free", + "{C:attention}#1#" + } + }, + j_trading = { + name = "Trading Card", + text = { + "If {C:attention}first discard{} of round", + "has only {C:attention}1{} card, destroy", + "it and earn {C:money}$#1#" + } + }, + j_flash = { + name = "Flash Card", + text = { + "{C:mult}+#1#{} Mult per", + "{C:attention}reroll{} in the shop", + "{C:inactive}(Currently {C:mult}+#2#{C:inactive} Mult)" + } + }, + j_popcorn= { + name = "Popcorn", + text = { + "{C:mult}+#1#{} Mult", + "{C:mult}-#2#{} Mult per", + "round played" + } + }, + j_ramen= { + name = "Ramen", + text = { + "{X:mult,C:white} X#1# {} Mult,", + "loses {X:mult,C:white} X#2# {} Mult", + "per {C:attention}card{} discarded", + } + }, + j_trousers= { + name = "Spare Trousers", + text = { + "Gains {C:mult}+#1#{} Mult if", + "played hand contains", + "a {C:attention}#2#", + "{C:inactive}(Currently {C:red}+#3#{C:inactive} Mult)" + } + }, + j_ancient= { + name = "Ancient Joker", + text = { + "Each played card with", + "{V:1}#2#{} suit gives", + "{X:mult,C:white} X#1# {} Mult when scored,", + "{s:0.8}suit changes at end of round" + } + }, + j_walkie_talkie = { + name = "Walkie Talkie", + text = { + "Each played {C:attention}10{} or {C:attention}4", + "gives {C:chips}+#1#{} Chips and", + "{C:mult}+#2#{} Mult when scored" + }, + }, + j_selzer= { + name = "Seltzer", + text = { + "Retrigger all", + "cards played for", + "the next {C:attention}#1#{} hands", + } + }, + j_castle = { + name = "Castle", + text = { + "This Joker gains {C:chips}+#1#{} Chips", + "per discarded {V:1}#2#{} card,", + "suit changes every round", + "{C:inactive}(Currently {C:chips}+#3#{C:inactive} Chips)" + }, + }, + j_smiley = { + name = "Smiley Face", + text = { + "Played {C:attention}face{} cards", + "give {C:mult}+#1#{} Mult", + "when scored" + } + }, + j_campfire = { + name = "Campfire", + text = { + "This Joker gains {X:mult,C:white}X#1#{} Mult", + "for each card {C:attention}sold{}, resets", + "when {C:attention}Boss Blind{} is defeated", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + + + j_stuntman = { + name = "Stuntman", + text = { + "{C:chips}+#1#{} Chips,", + "{C:attention}-#2#{} hand size" + }, + unlock = { + "In one hand,", + "earn at least", + "{E:1,C:attention}#1#{} chips" + } + }, + j_invisible = { + name = "Invisible Joker", + text = { + "After {C:attention}#1#{} rounds,", + "sell this card to", + "{C:attention}Duplicate{} a random Joker", + "{C:inactive}(Currently {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Win a run without", + "ever having more", + "than {E:1,C:attention}4 Jokers{}" + } + }, + j_brainstorm = { + name = "Brainstorm", + text = { + "Copies the ability", + "of leftmost {C:attention}Joker" + }, + unlock = { + "Discard a", + "{E:1,C:attention}Royal Flush" + } + }, + j_satellite = { + name = "Satellite", + text = { + "Earn {C:money}$#1#{} at end of", + "round per unique {C:planet}Planet", + "card used this run", + "{C:inactive}(Currently {C:money}$#2#{C:inactive})" + }, + unlock = { + "Have {E:1,C:money}$#1#", + "or more" + } + }, + j_shoot_the_moon = { + name = "Shoot the Moon", + text = { + "{C:mult}+#1#{} Mult for", + "each {C:attention}Queen{}", + "held in hand" + }, + unlock = { + "Play every {E:1,C:attention}Heart", + "in your deck in", + "a single round" + } + }, + j_drivers_license = { + name = "Driver's License", + text = { + "{X:mult,C:white} X#1# {} Mult if you have", + "at least {C:attention}16{} Enhanced", + "cards in your full deck", + "{C:inactive}(Currently {C:attention}#2#{C:inactive})" + }, + unlock = { + "Enhance {E:1,C:attention}#1#{} cards", + "in your deck" + } + }, + j_cartomancer = { + name = "Cartomancer", + text = { + "Create a {C:tarot}Tarot{} card", + "when {C:attention}Blind{} is selected", + "{C:inactive}(Must have room)" + }, + unlock = { + "Discover every", + "{E:1,C:tarot}Tarot{} card" + } + }, + j_astronomer = { + name = "Astronomer", + text = { + "All {C:planet}Planet{} cards and", + "{C:planet}Celestial Packs{} in", + "the shop are {C:attention}free" + }, + unlock = { + "Discover every", + "{E:1,C:planet}Planet{} card" + } + }, + j_burnt = { + name = "Burnt Joker", + text = { + "Upgrade the level of", + "the first {C:attention}discarded", + "poker hand each round", + }, + unlock = { + "Sell a total", + "of {E:1,C:attention}#1#{} cards", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Bootstraps", + text = { + "{C:mult}+#1#{} Mult for every", + "{C:money}$#2#{} you have" + }, + unlock = { + "Have at least {E:1,C:attention}#1#", + "{C:dark_edition}Polychrome{} Jokers" + } + }, + j_caino = { + name = "Canio", + text = { + "Gains {X:mult,C:white} X#1# {} Mult when", + "a {C:attention}face{} card", + "is destroyed", + "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "Triboulet", + text = { + "Played {C:attention}Kings{} and", + "{C:attention}Queens{} each give", + "{X:mult,C:white} X#1# {} Mult when scored" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "Yorick", + text = { + "{X:mult,C:white} X#1# {} Mult only after", + "using {C:attention}#2#{} discards", + "{C:inactive}(Discards left: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "Chicot", + text = { + "Disables effect of", + "every {C:attention}Boss Blind" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "Perkeo", + text = { + "Creates a {C:dark_edition}Negative{} copy of", + "{C:attention}1{} random {C:attention}consumable{}", + "card in your possession", + "at the end of the {C:attention}shop", + }, + unlock = { + "{E:1,s:1.3}?????" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Overstock", + text = { + "{C:attention}+1{} card slot", + "available in shop" + } + }, + v_clearance_sale = { + name = "Clearance Sale", + text = { + "All cards and packs in", + "shop are {C:attention}#1#%{} off" + } + }, + v_tarot_merchant = { + name = "Tarot Merchant", + text = { + "{C:tarot}Tarot{} cards appear", + "{C:attention}#1#X{} more frequently", + "in the shop" + } + }, + v_planet_merchant = { + name = "Planet Merchant", + text = { + "{C:planet}Planet{} cards appear", + "{C:attention}#1#X{} more frequently", + "in the shop" + } + }, + v_hone = { + name = "Hone", + text = { + "{C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, and", + "{C:dark_edition}Polychrome{} cards", + "appear {C:attention}#1#X{} more often" + } + }, + v_reroll_surplus = { + name = "Reroll Surplus", + text = { + "Rerolls cost", + "{C:money}$#1#{} less" + } + }, + v_crystal_ball = { + name = "Crystal Ball", + text = { + "{C:attention}+1{} consumable slot" + } + }, + v_telescope = { + name = "Telescope", + text = { + "{C:attention}Celestial Packs{} always", + "contain the {C:planet}Planet{}", + "card for your most", + "played {C:attention}poker hand" + } + }, + v_grabber = { + name = "Grabber", + text = { + "Permanently", + "gain {C:blue}+#1#{} hand", + "per round" + } + }, + v_wasteful = { + name = "Wasteful", + text = { + "Permanently", + "gain {C:red}+#1#{} discard", + "per round" + } + }, + v_seed_money = { + name = "Seed Money", + text = { + "Raise the cap on", + "interest earned", + "per round to {C:money}$#1#{}" + } + }, + v_blank = { + name = "Blank", + text = { + "{C:inactive}Does nothing?" + } + }, + v_magic_trick = { + name = "Magic Trick", + text = { + "{C:attention}Playing cards{} can", + "be purchased", + "from the {C:attention}shop" + } + }, + v_hieroglyph = { + name = "Hieroglyph", + text = { + "{C:attention}-#1#{} Ante,", + "{C:blue}-#1#{} hand", + "per round" + } + }, + v_directors_cut = { + name = "Director's Cut", + text = { + "Reroll Boss Blind", + "{C:attention}1{} time per Ante,", + "{C:money}$#1#{} per roll" + } + }, + v_paint_brush = { + name = "Paint Brush", + text = { + "{C:attention}+#1#{} hand size", + } + }, + v_overstock_plus = { + name = "Overstock Plus", + text = { + "{C:attention}+1{} card slot", + "available in shop" + }, + unlock = { + "Spend a total of", + "{C:money}$#1#{} at the shop", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "Liquidation", + text = { + "All cards and packs in", + "shop are {C:attention}#1#%{} off" + }, + unlock = { + "Redeem at least", + "{C:attention}#1#{C:voucher} Voucher{} cards", + "in one run" + } + }, + v_tarot_tycoon = { + name = "Tarot Tycoon", + text = { + "{C:tarot}Tarot{} cards appear", + "{C:attention}#1#X{} more frequently", + "in the shop" + }, + unlock = { + "Buy a total of", + "{C:attention}#1#{C:tarot} Tarot{} cards", + "from the shop", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Planet Tycoon", + text = { + "{C:planet}Planet{} cards appear", + "{C:attention}#1#X{} more frequently", + "in the shop" + }, + unlock = { + "Buy a total of", + "{C:attention}#1#{C:planet} Planet{} cards", + "from the shop", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Glow Up", + text = { + "{C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, and", + "{C:dark_edition}Polychrome{} cards", + "appear {C:attention}#1#X{} more often" + }, + unlock = { + "Have at least {C:attention}#1#", + "{C:attention}Joker{} cards with", + "{C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, or", + "{C:dark_edition}Polychrome{} edition" + } + }, + v_reroll_glut = { + name = "Reroll Glut", + text = { + "Rerolls cost", + "{C:money}$#1#{} less" + }, + unlock = { + "Reroll the shop a", + "total of {C:attention}#1#{} times", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Omen Globe", + text = { + "{C:spectral}Spectral{} cards may", + "appear in any of", + "the {C:attention}Arcana Packs" + }, + unlock = { + "Use a total of {C:attention}#1#", + "{C:tarot}Tarot{} cards from any", + "{C:tarot}Arcana Pack", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Observatory", + text = { + "{C:planet}Planet{} cards in your", + "{C:attention}consumable{} area give", + "{X:red,C:white} X#1# {} Mult for their", + "specified {C:attention}poker hand" + }, + unlock = { + "Use a total of {C:attention}#1#", + "{C:planet}Planet{} cards from any", + "{C:planet}Celestial Pack", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Nacho Tong", + text = { + "Permanently", + "gain {C:blue}+#1#{} hand", + "per round" + }, + unlock = { + "Play a total", + "of {C:attention}#1#{} cards", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Recyclomancy", + text = { + "Permanently", + "gain {C:red}+#1#{} discard", + "per round" + }, + unlock = { + "Discard a total", + "of {C:attention}#1#{} cards", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Money Tree", + text = { + "Raise the cap on", + "interest earned", + "per round to {C:money}$#1#{}" + }, + unlock = { + "Max out the interest", + "per round earnings for", + "{C:attention}#1#{} consecutive rounds", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Antimatter", + text = { + "{C:dark_edition}+1{} Joker Slot" + }, + unlock = { + "Redeem {C:voucher}Blank{}", + "{C:attention}#1#{} total times", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Illusion", + text = { + "{C:attention}Playing cards{} in shop", + "may have an {C:enhanced}Enhancement{},", + "{C:dark_edition}Edition{}, and/or a {C:attention}Seal{}" + }, + unlock = { + "Buy a total of", + "{C:attention}#1#{} playing cards", + "from the shop", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Petroglyph", + text = { + "{C:attention}-#1#{} Ante,", + "{C:red}-#1#{} discard", + "per round" + }, + unlock = { + "Reach Ante", + "level {E:1,C:attention}#1#" + } + }, + v_retcon = { + name = "Retcon", + text = { + "Reroll Boss Blind", + "{C:attention}unlimited{} times,", + "{C:money}$#1#{} per roll" + }, + unlock = { + "Discover", + "{C:attention}#1#{} Blinds" + } + }, + v_palette = { + name = "Palette", + text = { + "{C:attention}+#1#{} hand size", + }, + unlock = { + "Reduce hand size", + "down to {C:attention}#1#{} cards" + } + } + }, + Tarot = { + c_fool = { + name = "The Fool", + text = { + "Creates the last", + "{C:tarot}Tarot{} or {C:planet}Planet{} card", + "used during this run", + "{s:0.8,C:tarot}The Fool{s:0.8} excluded" + } + }, + c_magician = { + name = "The Magician", + text = { + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "The High Priestess", + text = { + "Creates up to {C:attention}#1#", + "random {C:planet}Planet{} cards", + "{C:inactive}(Must have room)" + } + }, + c_empress = { + name = "The Empress", + text = { + "Enhances {C:attention}#1#", + "selected cards to", + "{C:attention}#2#s" + } + }, + c_emperor = { + name = "The Emperor", + text = { + "Creates up to {C:attention}#1#", + "random {C:tarot}Tarot{} cards", + "{C:inactive}(Must have room)" + } + }, + c_heirophant = { + name = "The Hierophant", + text = { + "Enhances {C:attention}#1#", + "selected cards to", + "{C:attention}#2#s" + } + }, + c_lovers = { + name = "The Lovers", + text = { + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "The Chariot", + text = { + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#" + } + }, + c_justice = { + name = "Justice", + text = { + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "The Hermit", + text = { + "Doubles money", + "{C:inactive}(Max of {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "The Wheel of Fortune", + text = { + "{C:green}#1# in #2#{} chance to add", + "{C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, or", + "{C:dark_edition}Polychrome{} edition", + "to a random {C:attention}Joker" + } + }, + c_strength = { + name = "Strength", + text = { + "Increases rank of", + "up to {C:attention}#1#{} selected", + "cards by {C:attention}1" + } + }, + c_hanged_man = { + name = "The Hanged Man", + text = { + "Destroys up to", + "{C:attention}#1#{} selected cards" + } + }, + c_death = { + name = "Death", + text = { + "Select {C:attention}#1#{} cards,", + "convert the {C:attention}left{} card", + "into the {C:attention}right{} card", + "{C:inactive}(Drag to rearrange)" + } + }, + c_temperance = { + name = "Temperance", + text = { + "Gives the total sell", + "value of all current", + "Jokers {C:inactive}(Max of {C:money}$#1#{C:inactive})", + "{C:inactive}(Currently {C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "The Devil", + text = { + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#" + } + }, + c_tower = { + name = "The Tower", + text = { + "Enhances {C:attention}#1#{} selected", + "card into a", + "{C:attention}#2#" + } + }, + c_star = { + name = "The Star", + text = { + "Converts up to", + "{C:attention}#1#{} selected cards", + "to {V:1}#2#{}" + } + }, + c_moon = { + name = "The Moon", + text = { + "Converts up to", + "{C:attention}#1#{} selected cards", + "to {V:1}#2#{}" + } + }, + c_sun = { + name = "The Sun", + text = { + "Converts up to", + "{C:attention}#1#{} selected cards", + "to {V:1}#2#{}" + } + }, + c_judgement = { + name = "Judgement", + text = { + "Creates a random", + "{C:attention}Joker{} card", + "{C:inactive}(Must have room)" + } + }, + c_world = { + name = "The World", + text = { + "Converts up to", + "{C:attention}#1#{} selected cards", + "to {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Mercury", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_venus = { + name = "Venus", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_earth = { + name = "Earth", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_mars = { + name = "Mars", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_jupiter = { + name = "Jupiter", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_saturn = { + name = "Saturn", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_uranus = { + name = "Uranus", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_neptune = { + name = "Neptune", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_pluto = { + name = "Pluto", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_ceres = { + name = "Ceres", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_planet_x = { + name = "Planet X", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + c_eris = { + name = "Eris", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level up", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult and", + "{C:chips}+#4#{} chips" + } + }, + }, + Spectral = { + c_familiar = { + name = "Familiar", + text = { + "Destroy {C:attention}1{} random", + "card in your hand, add", + "{C:attention}#1#{} random {C:attention}Enhanced face", + "{C:attention}cards{} to your hand" + } + }, + c_grim = { + name = "Grim", + text = { + "Destroy {C:attention}1{} random", + "card in your hand,", + "add {C:attention}#1#{} random {C:attention}Enhanced", + "{C:attention}Aces{} to your hand" + } + }, + c_incantation = { + name = "Incantation", + text = { + "Destroy {C:attention}1{} random", + "card in your hand, add {C:attention}#1#", + "random {C:attention}Enhanced numbered", + "{C:attention}cards{} to your hand" + } + }, + c_talisman = { + name = "Talisman", + text = { + "Add a {C:attention}Gold Seal{}", + "to {C:attention}1{} selected", + "card in your hand" + } + }, + c_aura = { + name = "Aura", + text = { + "Add {C:dark_edition}Foil{}, {C:dark_edition}Holographic{},", + "or {C:dark_edition}Polychrome{} effect to", + "{C:attention}1{} selected card in hand" + } + }, + c_wraith = { + name = "Wraith", + text = { + "Creates a random", + "{C:red}Rare{C:attention} Joker{},", + "sets money to {C:money}$0" + } + }, + c_sigil = { + name = "Sigil", + text = { + "Converts all cards", + "in hand to a single", + "random {C:attention}suit" + } + }, + c_ouija = { + name = "Ouija", + text = { + "Converts all cards", + "in hand to a single", + "random {C:attention}rank", + "{C:red}-1{} hand size" + } + }, + c_ectoplasm = { + name = "Ectoplasm", + text = { + "Add {C:dark_edition}Negative{} to", + "a random {C:attention}Joker,", + "{C:red}-#1#{} hand size" + } + }, + c_immolate = { + name = "Immolate", + text = { + "Destroys {C:attention}#1#{} random", + "cards in hand,", + "gain {C:money}$#2#" + } + }, + c_ankh = { + name = "Ankh", + text = { + "Create a copy of a", + "random {C:attention}Joker{}, destroy", + "all other Jokers" + } + }, + c_deja_vu = { + name = "Deja Vu", + text = { + "Add a {C:red}Red Seal{}", + "to {C:attention}1{} selected", + "card in your hand" + } + }, + c_hex = { + name = "Hex", + text = { + "Add {C:dark_edition}Polychrome{} to a", + "random {C:attention}Joker{}, destroy", + "all other Jokers" + } + }, + c_trance = { + name = "Trance", + text = { + "Add a {C:blue}Blue Seal{}", + "to {C:attention}1{} selected", + "card in your hand" + } + }, + c_medium = { + name = "Medium", + text = { + "Add a {C:purple}Purple Seal{}", + "to {C:attention}1{} selected", + "card in your hand" + } + }, + c_cryptid = { + name = "Cryptid", + text = { + "Create {C:attention}#1#{} copies of", + "{C:attention}1{} selected card", + "in your hand" + } + }, + c_soul = { + name = "The Soul", + text = { + "Creates a", + "{C:legendary,E:1}Legendary{} Joker", + "{C:inactive}(Must have room)" + } + }, + c_black_hole = { + name = "Black Hole", + text = { + "Upgrade every", + "{C:legendary,E:1}poker hand", + "by {C:attention}1{} level" + } + } + }, + Edition = { + e_base = { + name = "Base", + text = { + "No extra effects" + } + }, + e_foil = { + name = "Foil", + text = { + "{C:chips}+#1#{} chips" + } + }, + e_holo = { + name = "Holographic", + text = { + "{C:mult}+#1#{} Mult" + } + }, + e_polychrome = { + name = "Polychrome", + text = { + "{X:mult,C:white} X#1# {} Mult" + } + }, + e_negative = { + name = "Negative", + text = { + "{C:dark_edition}+#1#{} Joker slot" + } + }, + e_negative_consumable = { + name = "Negative", + text = { + "{C:dark_edition}+#1#{} consumable slot" + } + } + }, + Enhanced = { + m_bonus = { + name = "Bonus Card", + text = {} + }, + m_mult = { + name = "Mult Card", + text = { + "{C:mult}+#1#{} Mult" + } + }, + m_wild = { + name = "Wild Card", + text = { + "Can be used", + "as any suit" + } + }, + m_glass = { + name = "Glass Card", + text = { + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2# in #3#{} chance to", + "destroy card" + } + }, + m_steel = { + name = "Steel Card", + text = { + "{X:mult,C:white} X#1# {} Mult", + "while this card", + "stays in hand" + } + }, + m_stone = { + name = "Stone Card", + text = { + "{C:chips}+#1#{} Chips", + "no rank or suit" + } + }, + m_gold = { + name = "Gold Card", + text = { + "{C:money}$#1#{} if this", + "card is held in hand", + "at end of round" + } + }, + m_lucky = { + name = "Lucky Card", + text = { + "{C:green}#1# in #3#{} chance", + "for {C:mult}+#2#{} Mult", + "{C:green}#1# in #5#{} chance", + "to win {C:money}$#4#" + } + } + }, + Stake = { + stake_white = { + name = "White Stake", + text = { + "Base Difficulty" + } + }, + stake_red = { + name = "Red Stake", + text = { + "{C:attention}Small Blind{} gives", + "no reward money", + "{s:0.8}Applies all previous Stakes" + } + }, + stake_green = { + name = "Green Stake", + text = { + "Required score scales", + "faster for each {C:attention}Ante", + "{s:0.8}Applies all previous Stakes" + } + }, + stake_blue = { + name = "Blue Stake", + text = { + "{C:red}-1{} Discard", + "{s:0.8}Applies all previous Stakes" + } + }, + stake_black = { + name = "Black Stake", + text = { + "Shop can have {C:attention}Eternal{} Jokers", + "{C:inactive,s:0.8}(Can't be sold or destroyed)", + "{s:0.8}Applies all previous Stakes" + } + }, + stake_purple = { + name = "Purple Stake", + text = { + "Required score scales", + "faster for each {C:attention}Ante", + "{s:0.8}Applies all previous Stakes" + } + }, + stake_orange = { + name = "Orange Stake", + text = { + "{C:attention}Booster Packs{} cost", + "{C:money}$1{} more per Ante", + "{s:0.8}Applies all previous Stakes" + } + }, + stake_gold = { + name = "Gold Stake", + text = { + "{C:red}-1{} hand size", + "{s:0.8}Applies all previous Stakes" + } + } + }, + Tag = { + tag_uncommon = { + name = "Uncommon Tag", + text = { + "Shop has an", + "{C:green}Uncommon Joker" + } + }, + tag_rare = { + name = "Rare Tag", + text = { + "Shop has a", + "{C:red}Rare Joker" + } + }, + tag_negative = { + name = "Negative Tag", + text = { + "Next base edition shop", + "Joker becomes {C:dark_edition}Negative" + } + }, + tag_foil = { + name = "Foil Tag", + text = { + "Next base edition shop", + "Joker becomes {C:dark_edition}Foil" + } + }, + tag_holo = { + name = "Holographic Tag", + text = { + "Next base edition shop", + "Joker becomes {C:dark_edition}Holographic" + } + }, + tag_polychrome = { + name = "Polychrome Tag", + text = { + "Next base edition shop", + "Joker becomes {C:dark_edition}Polychrome" + } + }, + tag_investment = { + name = "Investment Tag", + text = { + "After defeating", + "the Boss Blind,", + "gain {C:money}$#1#" + } + }, + tag_voucher = { + name = "Voucher Tag", + text = { + "Adds one {C:voucher}Voucher", + "to the next shop" + } + }, + tag_boss = { + name = "Boss Tag", + text = { + "Rerolls the", + "{C:attention}Boss Blind" + } + }, + tag_standard = { + name = "Standard Tag", + text = { + "Gives a free", + "{C:attention}Mega Standard Pack" + } + }, + tag_charm = { + name = "Charm Tag", + text = { + "Gives a free", + "{C:tarot}Mega Arcana Pack" + } + }, + tag_meteor = { + name = "Meteor Tag", + text = { + "Gives a free", + "{C:planet}Mega Celestial Pack" + } + }, + tag_buffoon = { + name = "Buffoon Tag", + text = { + "Gives a free", + "{C:attention}Mega Buffoon Pack" + } + }, + tag_handy = { + name = "Handy Tag", + text = { + "Gives {C:money}$#1#{} per played", + "{C:blue}hand{} this run", + "{C:inactive}(Will give {C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "Garbage Tag", + text = { + "Gives {C:money}$#1#{} per unused", + "{C:red}discard{} this run", + "{C:inactive}(Will give {C:money}$#2#{C:inactive})", + } + }, + tag_coupon = { + name = "Coupon Tag", + text = { + "Initial cards and", + "booster packs in next", + "shop are free" + } + }, + tag_double = { + name = "Double Tag", + text = { + "Gives a copy of the", + "next selected {C:attention}Tag{}", + "{s:0.8,C:attention}Double Tag{s:0.8} excluded" + } + }, + tag_juggle = { + name = "Juggle Tag", + text = { + "{C:attention}+#1#{} hand size", + "next round" + } + }, + tag_d_six = { + name = "D6 Tag", + text = { + "Rerolls in next shop", + "start at {C:money}$0" + } + }, + tag_top_up = { + name = "Top-up Tag", + text = { + "Create up to {C:attention}#1#", + "{C:blue}Common{} Jokers", + "{C:inactive}(Must have room)" + } + }, + tag_skip = { + name = "Speed Tag", + text = { + "Gives {C:money}$#1#{} per skipped", + "Blind this run", + "{C:inactive}(Will give {C:money}$#2#{C:inactive})" + } + }, + tag_orbital = { + name = "Orbital Tag", + text = { + "Upgrade {C:attention}#1#", + "by {C:attention}#2# levels" + } + }, + tag_economy = { + name = "Economy Tag", + text = { + "Doubles your money", + "{C:inactive}(Max of {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "Ethereal Tag", + text = { + "Gives a free", + "{C:spectral}Spectral Pack" + } + } + }, + Blind = { + bl_small = { + name = "Small Blind", + text = {} + }, + bl_big = { + name = "Big Blind", + text = {} + }, + bl_hook = { + name = "The Hook", + text = { + "Discards 2 random", + "cards per hand played" + } + }, + bl_wall = { + name = "The Wall", + text = { + "Extra large blind" + } + }, + bl_wheel = { + name = "The Wheel", + text = { + " in 7 cards get", + "drawn face down" + } + }, + bl_arm = { + name = "The Arm", + text = { + "Decrease level of", + "played poker hand" + } + }, + bl_psychic = { + name = "The Psychic", + text = { + "Must play 5 cards" + } + }, + bl_goad = { + name = "The Goad", + text = { + "All Spade cards", + "are debuffed" + } + }, + bl_water = { + name = "The Water", + text = { + "Start with", + "0 discards" + } + }, + bl_eye = { + name = "The Eye", + text = { + "No repeat hand", + "types this round" + } + }, + bl_mouth = { + name = "The Mouth", + text = { + "Play only 1 hand", + "type this round" + } + }, + bl_plant = { + name = "The Plant", + text = { + "All face cards", + "are debuffed" + } + }, + bl_needle = { + name = "The Needle", + text = { + "Play only 1 hand" + } + }, + bl_head = { + name = "The Head", + text = { + "All Heart cards", + "are debuffed" + } + }, + bl_tooth = { + name = "The Tooth", + text = { + "Lose $1 per", + "card played" + } + }, + bl_final_leaf = { + name = "Verdant Leaf", + text = { + "All cards debuffed", + "until 1 Joker sold" + } + }, + bl_final_vessel = { + name = "Violet Vessel", + text = { + "Very large blind" + } + }, + bl_ox = { + name = "The Ox", + text = { + "Playing a #1#", + "sets money to $0" + } + }, + bl_house = { + name = "The House", + text = { + "First hand is", + "drawn face down" + } + }, + bl_club = { + name = "The Club", + text = { + "All Club cards", + "are debuffed" + } + }, + bl_fish = { + name = "The Fish", + text = { + "Cards drawn face down", + "after each hand played" + } + }, + bl_window = { + name = "The Window", + text = { + "All Diamond cards", + "are debuffed" + } + }, + bl_manacle = { + name = "The Manacle", + text = { + "-1 Hand Size" + } + }, + bl_serpent = { + name = "The Serpent", + text = { + "After Play or Discard,", + "always draw 3 cards" + } + }, + bl_pillar = { + name = "The Pillar", + text = { + "Cards played previously", + "this Ante are debuffed" + } + }, + bl_flint = { + name = "The Flint", + text = { + "Base Chips and", + "Mult are halved" + } + }, + bl_mark = { + name = "The Mark", + text = { + "All face cards are", + "drawn face down" + } + }, + bl_final_acorn = { + name = "Amber Acorn", + text = { + "Flips and shuffles", + "all Joker cards" + } + }, + bl_final_heart = { + name = "Crimson Heart", + text = { + "One random Joker", + "disabled every hand" + } + }, + bl_final_bell = { + name = "Cerulean Bell", + text = { + "Forces 1 card to", + "always be selected" + } + } + }, + Back = { + b_red = { + name = "Red Deck", + text = { + "{C:red}+#1#{} discard", + "every round" + } + }, + b_blue = { + name = "Blue Deck", + text = { + "{C:blue}+#1#{} hand", + "every round" + } + }, + b_yellow = { + name = "Yellow Deck", + text = { + "Start with", + "extra {C:money}$#1#" + } + }, + b_green = { + name = "Green Deck", + text = { + "At end of each Round:", + "{C:money}$#1#{s:0.85} per remaining {C:blue}Hand", + "{C:money}$#2#{s:0.85} per remaining {C:red}Discard", + "Earn no {C:attention}Interest" + } + }, + b_black = { + name = "Black Deck", + text = { + "{C:attention}+#1#{} Joker slot", + "", + "{C:blue}-#2#{} hand", + "every round" + } + }, + b_magic = { + name = "Magic Deck", + text = { + "Start run with the", + "{C:tarot,T:v_crystal_ball}#1#{} voucher", + "and {C:attention}2{} copies", + "of {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Nebula Deck", + text = { + "Start run with the", + "{C:planet,T:v_telescope}#1#{} voucher", + "", + "{C:red}#2#{} consumable slot" + } + }, + b_ghost = { + name = "Ghost Deck", + text = { + "{C:spectral}Spectral{} cards may", + "appear in the shop,", + "start with a {C:spectral,T:c_hex}Hex{} card", + } + }, + b_abandoned = { + name = "Abandoned Deck", + text = { + "Start run with", + "no {C:attention}Face Cards", + "in your deck" + } + }, + b_checkered = { + name = "Checkered Deck", + text = { + "Start run with", + "{C:attention}26{C:spades} Spades{} and", + "{C:attention}26{C:hearts} Hearts{} in deck" + } + }, + b_zodiac = { + name = "Zodiac Deck", + text = { + "Start run with", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "and {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Painted Deck", + text = { + "{C:attention}+#1#{} hand size,", + "{C:red}#2#{} Joker slot" + } + }, + b_anaglyph = { + name = "Anaglyph Deck", + text = { + "After defeating each", + "{C:attention}Boss Blind{}, gain a", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "Plasma Deck", + text = { + "Balance {C:blue}Chips{} and", + "{C:red}Mult{} when calculating", + "score for played hand", + "{C:red}X#1#{} base Blind size" + } + }, + b_erratic = { + name = "Erratic Deck", + text = { + "All {C:attention}Ranks{} and", + "{C:attention}Suits{} in deck", + "are randomized" + } + }, + b_challenge = { + name = "Challenge Deck", + text = { + "" + } + } + }, + Other = { + gold_seal = { + name = "Gold Seal", + text = { + "Earn {C:money}$3{} when this", + "card is played", + "and scores" + } + }, + red_seal = { + name = "Red Seal", + text = { + "Retrigger this", + "card {C:attention}1{} time" + } + }, + blue_seal = { + name = "Blue Seal", + text = { + "Creates a {C:planet}Planet{} card", + "if this card is {C:attention}held{} in", + "hand at end of round" + } + }, + purple_seal = { + name = "Purple Seal", + text = { + "Creates a {C:tarot}Tarot{} card", + "when {C:attention}discarded", + "{C:inactive}(Must have room)" + } + }, + eternal = { + name = "Eternal", + text = { + "Can't be sold", + "or destroyed" + } + }, + white_sticker = { + name = "White Sticker", + text = { + "Used this Joker", + "to win on {C:attention}White", + "{C:attention}Stake{} difficulty" + } + }, + red_sticker = { + name = "Red Sticker", + text = { + "Used this Joker", + "to win on {C:attention}Red", + "{C:attention}Stake{} difficulty" + } + }, + green_sticker = { + name = "Green Sticker", + text = { + "Used this Joker", + "to win on {C:attention}Green", + "{C:attention}Stake{} difficulty" + } + }, + blue_sticker = { + name = "Blue Sticker", + text = { + "Used this Joker", + "to win on {C:attention}Blue", + "{C:attention}Stake{} difficulty" + } + }, + black_sticker = { + name = "Black Sticker", + text = { + "Used this Joker", + "to win on {C:attention}Black", + "{C:attention}Stake{} difficulty" + } + }, + purple_sticker = { + name = "Purple Sticker", + text = { + "Used this Joker", + "to win on {C:attention}Purple", + "{C:attention}Stake{} difficulty" + } + }, + orange_sticker = { + name = "Orange Sticker", + text = { + "Used this Joker", + "to win on {C:attention}Orange", + "{C:attention}Stake{} difficulty" + } + }, + gold_sticker = { + name = "Gold Sticker", + text = { + "Used this Joker", + "to win on {C:attention}Gold", + "{C:attention}Stake{} difficulty" + } + }, + playing_card = { + text = { + " {C:light_black}#1# of {V:1}#2# " + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} chips" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1#{} extra chips" + } + }, + remove_negative = { + name = "n", + text = { + "{C:inactive,s:0.9}(Removes {C:dark_edition,s:0.9}Negative{C:inactive,s:0.9} from copy)" + } + }, + locked = { + name = "Locked", + text = {} + }, + debuffed_default = { + name = "Debuffed", + text = { + "All abilities", + "are disabled" + } + }, + debuffed_playing_card = { + name = "Debuffed", + text = { + "Scores no chips", + "and all abilities", + "are disabled" + } + }, + demo_locked = { + name = "Locked", + text = { + "Not available", + "in this demo" + } + }, + challenge_locked = { + name = "Locked", + text = { + "Win a run with at least", + "#1# different decks to unlock", + "Challenge mode", + "{C:attention,s:2}#2#/#1#" + } + }, + demo_shop_locked = { + name = "Locked", + text = { + "Card from {C:attention}Jimbo's", + "personal collection,", + "available in the full", + "version of {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Locked", + text = { + "Work in", + "progress" + } + }, + deck_locked_win = { + name = "Locked", + text = { + "Win a run with", + "{C:attention}#1#{}", + "on any difficulty" + } + }, + deck_locked_discover = { + name = "Locked", + text = { + "Discover at least", + "{C:attention}#1#{} items from", + "your collection" + } + }, + deck_locked_stake = { + name = "Locked", + text = { + "Win a run with any", + "deck on at least", + "{V:1}#1#{} difficulty" + } + }, + joker_locked_legendary = { + name = "Locked", + text = { + "Find this Joker", + "from the {C:spectral}Soul{} card" + } + }, + undiscovered_joker = { + name = "Not Discovered", + text = { + "Purchase or use", + "this card in an", + "unseeded run to", + "learn what it does" + } + }, + undiscovered_tarot = { + name = "Not Discovered", + text = { + "Purchase or use", + "this card in an", + "unseeded run to", + "learn what it does" + } + }, + undiscovered_planet = { + name = "Not Discovered", + text = { + "Purchase or use", + "this card in an", + "unseeded run to", + "learn what it does" + } + }, + undiscovered_spectral = { + name = "Not Discovered", + text = { + "Purchase or use", + "this card in an", + "unseeded run to", + "learn what it does" + } + }, + undiscovered_voucher = { + name = "Not Discovered", + text = { + "Redeem this", + "voucher in an", + "unseeded run to", + "learn what it does" + } + }, + undiscovered_booster = { + name = "Not Discovered", + text = { + "Open this pack", + "in an unseeded run", + "to learn what it does" + } + }, + undiscovered_edition = { + name = "Not Discovered", + text = { + "Find this edition", + "in an unseeded run", + "to learn what it does" + } + }, + undiscovered_tag = { + name = "Not Discovered", + text = { + "Use this tag in", + "an unseeded run to", + "learn what it does" + } + }, + p_arcana_normal = { + name = "Arcana Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:tarot} Tarot{} cards to", + "be used immediately" + } + }, + p_arcana_jumbo = { + name = "Jumbo Arcana Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:tarot} Tarot{} cards to", + "be used immediately" + } + }, + p_arcana_mega = { + name = "Mega Arcana Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:tarot} Tarot{} cards to", + "be used immediately" + } + }, + p_celestial_normal = { + name = "Celestial Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:planet} Planet{} cards to", + "be used immediately" + } + }, + p_celestial_jumbo = { + name = "Jumbo Celestial Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:planet} Planet{} cards to", + "be used immediately" + } + }, + p_celestial_mega = { + name = "Mega Celestial Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:planet} Planet{} cards to", + "be used immediately" + } + }, + p_spectral_normal = { + name = "Spectral Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:spectral} Spectral{} cards to", + "be used immediately" + } + }, + p_spectral_jumbo = { + name = "Jumbo Spectral Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:spectral} Spectral{} cards to", + "be used immediately" + } + }, + p_spectral_mega = { + name = "Mega Spectral Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:spectral} Spectral{} cards to", + "be used immediately" + } + }, + p_standard_normal = { + name = "Standard Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:attention} Playing{} cards to", + "add to your deck" + } + }, + p_standard_jumbo = { + name = "Jumbo Standard Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:attention} Playing{} cards to", + "add to your deck" + } + }, + p_standard_mega = { + name = "Mega Standard Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:attention} Playing{} cards to", + "add to your deck" + } + }, + p_buffoon_normal = { + name = "Buffoon Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:joker} Joker{} cards" + } + }, + p_buffoon_jumbo = { + name = "Jumbo Buffoon Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:joker} Joker{} cards" + } + }, + p_buffoon_mega = { + name = "Mega Buffoon Pack", + text = { + "Choose {C:attention}#1#{} of up to", + "{C:attention}#2#{C:joker} Joker{} cards" + } + }, + pinned_left = { + name = "Pinned", + text = { + "This Joker stays", + "pinned to the", + "leftmost position" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Spade", + Hearts = "Heart", + Clubs = "Club", + Diamonds = "Diamond" + }, + suits_plural = { + Spades = "Spades", + Hearts = "Hearts", + Clubs = "Clubs", + Diamonds = "Diamonds" + }, + blind_states = { + Select = "Select", + Skipped = "Skipped", + Current = "Current", + Defeated = "Defeated", + Upcoming = "Upcoming", + Selected = "Selected" + }, + ranks = { + Ace = "Ace", + King = "King", + Queen = "Queen", + Jack = "Jack", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Best Hand", + furthest_round = "Highest Round", + furthest_ante = "Highest Ante", + most_money = "Most Money", + boss_streak = "Most Bosses in a Row", + collection = "Collection", + win_streak = "Best Win Streak", + current_streak = "", + poker_hand = "Most Played Hand" + }, + achievement_names = { + ante_up = "Ante Up!", + ante_upper = "Ante Upper!", + heads_up = "Heads Up", + low_stakes = "Low Stakes", + mid_stakes = "Mid Stakes", + high_stakes = "High Stakes", + card_player = "Card Player", + card_discarder = "Card Discarder", + nest_egg = "Nest Egg", + flushed = "Flushed", + speedrunner = "Speedrunner", + roi = "ROI", + shattered = "Shattered", + royale = "Royale", + retrograde = "Retrograde", + _10k = "10K", + _1000k = "1,000K", + _100000k = "100,000K", + tiny_hands = "Tiny Hands", + big_hands = "Big Hands", + you_get_what_you_get = "You Get What You Get", + rule_bender = "Rule Bender", + rule_breaker = "Rule Breaker", + legendary = "Legendary", + astronomy = "Astronomy", + cartomancy = "Cartomancy", + clairvoyance = "Clairvoyance", + extreme_couponer = "Extreme Couponer", + completionist = "Completionist", + completionist_plus = "Completionist+", + completionist_plus_plus = "Completionist++", + }, + achievement_descriptions = { + ante_up = "Reach Ante 4", + ante_upper = "Reach Ante 8", + heads_up = "Win a Run", + low_stakes = "Win a run on at least Red Stake difficulty", + mid_stakes = "Win a run on at least Black Stake difficulty", + high_stakes = "Win a run on at least Gold Stake difficulty", + card_player = "Play at least 2500 Cards", + card_discarder = "Discard at least 2500 Cards", + nest_egg = "Have $400 or more during a single run", + flushed = "Play a Flush with 5 Wild Cards", + speedrunner = "Win a run in 12 or fewer rounds", + roi = "Buy 5 Vouchers by Ante 4", + shattered = "Break 2 Glass Cards in a single hand", + royale = "Play a Royal Flush", + retrograde = "Get any poker hand to level 10", + _10k = "Score 10,000 Chips in a single hand", + _1000k = "Score 1,000,000 Chips in a single hand", + _100000k = "Score 100,000,000 Chips in a single hand", + tiny_hands = "Thin your deck down to 20 or fewer cards", + big_hands = "Have 80 or more cards in your deck", + you_get_what_you_get = "Win a run without rerolling the shop", + rule_bender = "Complete any challenge run", + rule_breaker = "Complete every challenge run", + legendary = "Discover a Legendary Joker", + astronomy = "Discover every Planet card", + cartomancy = "Discover every Tarot card", + clairvoyance = "Discover every Spectral card", + extreme_couponer = "Discover every Voucher", + completionist = "Discover 100% of your collection", + completionist_plus = "Win with every deck on Gold Stake difficulty", + completionist_plus_plus = "Earn a Gold Sticker on every Joker", + }, + challenge_names = { + c_omelette_1 = "The Omelette", + c_city_1 = "15 Minute City", + c_rich_1 = "Rich get Richer", + c_knife_1 = "On a Knife's Edge", + c_xray_1 = "X-ray Vision", + c_mad_world_1 = "Mad World", + c_luxury_1 = "Luxury Tax", + c_non_perishable_1 = "Non-Perishable", + c_medusa_1 = "Medusa", + c_double_nothing_1 = "Double or Nothing", + c_typecast_1 = "Typecast", + c_inflation_1 = "Inflation", + c_bram_poker_1 = "Bram Poker", + c_fragile_1 = "Fragile", + c_monolith_1 = "Monolith", + c_blast_off_1 = "Blast Off", + c_five_card_1 = "Five-Card Draw", + c_golden_needle_1 = "Golden Needle", + c_cruelty_1 = "Cruelty", + c_jokerless_1 = "Jokerless", + }, + poker_hands = { + ['Flush Five'] = "Flush Five", + ['Flush House'] = "Flush House", + ['Five of a Kind'] = "Five of a Kind", + ['Royal Flush'] = "Royal Flush", + ['Straight Flush'] = "Straight Flush", + ['Four of a Kind'] = "Four of a Kind", + ['Full House'] = "Full House", + ['Flush'] = "Flush", + ['Straight'] = "Straight", + ['Three of a Kind'] = "Three of a Kind", + ['Two Pair'] = "Two Pair", + ['Pair'] = "Pair", + ['High Card'] = "High Card" + }, + poker_hand_descriptions = { + ['Flush Five'] = { + "5 cards with the same rank and suit" + }, + ['Flush House'] = { + "A Three of a Kind and a Pair with", + "all cards sharing the same suit" + }, + ['Five of a Kind'] = { + "5 cards with the same rank" + }, + ['Royal Flush'] = { + "5 cards in a row (consecutive ranks) with", + "all cards sharing the same suit" + }, + ['Straight Flush'] = { + "5 cards in a row (consecutive ranks) with", + "all cards sharing the same suit" + }, + ['Four of a Kind'] = { + "4 cards with the same rank. They may", + "be played with 1 other unscored card" + }, + ['Full House'] = { + "A Three of a Kind and a Pair" + }, + ['Flush'] = { + "5 cards that share the same suit" + }, + ['Straight'] = { + "5 cards in a row (consecutive ranks)" + }, + ['Three of a Kind'] = { + "3 cards with the same rank. They may be", + "played with up to 2 other unscored cards" + }, + ['Two Pair'] = { + "2 pairs of cards with different ranks, may", + "be played with 1 other unscored card" + }, + ['Pair'] = { + "2 cards that share the same rank. They may", + "be played with up to 3 other unscored cards" + }, + ['High Card'] = { + "If the played hand is not any of the above", + "hands, only the highest ranked card scores" + } + }, + labels = { + common = "Common", + uncommon = "Uncommon", + rare = "Rare", + legendary = "Legendary", + tarot = "Tarot", + planet = "Planet", + pluto_planet = "Dwarf Planet", + voucher = "Voucher", + foil = "Foil", + holographic = "Holographic", + polychrome = "Polychrome", + negative = "Negative", + gold_seal = "Gold Seal", + blue_seal = "Blue Seal", + red_seal = "Red Seal", + purple_seal = "Purple Seal", + locked = "Locked", + eternal = "Eternal", + pinned_left = "Pinned", + }, + dictionary = { + b_sell = "SELL", + b_use = "USE", + b_select = "SELECT", + b_buy = "BUY", + b_redeem = "REDEEM", + b_open = "OPEN", + b_and_use = "& USE", + b_next_round_1 = "Next", + b_next_round_2 = "Round", + b_play_hand = "Play Hand", + b_discard = "Discard", + b_sort_hand = "Sort Hand", + b_run_info_1 = "Run", + b_run_info_2 = "Info", + b_options = "Options", + b_reroll_boss = "Reroll Boss", + b_skip_blind = "Skip Blind", + b_skip_reward = "Skip Reward", + b_skip = "Skip", + b_start_new_run = "New Run", + b_main_menu = "Main Menu", + b_collection = "Collection", + b_seed = "Seed", + b_copy_seed = "Copy Seed", + b_copy = "Copy", + b_credits = "Credits", + b_stats = "Stats", + b_settings = "Settings", + b_set_game = "Game", + b_set_video = "Video", + b_set_graphics = "Graphics", + b_set_audio = "Audio", + b_set_gamespeed = "Game Speed", + b_set_play_discard_pos = "Play/Discard Button Position", + b_set_screenshake = "Screenshake", + b_high_contrast_cards = "High Contrast Cards", + b_set_rumble = "Controller Rumble", + b_set_crash_reports = "Crash Reports", + b_set_monitor = "Display Monitor", + b_set_windowmode = "Window Mode", + b_set_apply = "Apply", + b_set_master_vol = "Master Volume", + b_set_music_vol = "Music Volume", + b_set_game_vol = "Game Volume", + b_set_shadows = "Shadows", + b_set_pixel_smoothing = "Pixel Art Smoothing", + b_set_CRT = "CRT", + b_set_CRT_bloom = "CRT Bloom", + b_stat_jokers = "Jokers", + b_stat_consumables = "Consumables", + b_stat_tarots = "Tarots", + b_stat_planets = "Planets", + b_stat_spectrals = "Spectrals", + b_stat_vouchers = "Vouchers", + b_next = "Next", + b_endless = "Endless Mode", + b_wishlist = "Wishlist on Steam", + b_playbalatro = "Visit playbalatro.com", + b_remaining = "Remaining", + b_full_deck = "Full Deck", + b_poker_hands = "Poker Hands", + b_blinds = "Blinds", + b_vouchers = "Vouchers", + b_stake = "Stake", + b_jokers = "Jokers", + b_tarot_cards = "Tarot Cards", + b_planet_cards = "Planet Cards", + b_spectral_cards = "Spectral Cards", + b_enhanced_cards = "Enhanced Cards", + b_editions = "Editions", + b_booster_packs = "Booster Packs", + b_tags = "Tags", + b_decks = "Decks", + b_seals = "Seals", + b_continue = "Continue", + b_back = "Back", + b_music = "Music", + b_sounds = "Sounds", + b_imagery = "Imagery", + b_new_run = "New Run", + b_challenges = "Challenges", + b_new_challenge = "Start New Challenge", + b_current_profile = "Current Profile", + b_load_profile = "Load Profile", + b_create_profile = "Create Profile", + b_delete_profile = "Delete Profile", + b_reset_profile = "Reset Profile", + b_rules = "Rules", + b_restrictions = "Restrictions", + b_deck = "Deck", + b_play_cap = "PLAY", + b_options_cap = "OPTIONS", + b_collection_cap = "COLLECTION", + b_quit_cap = "QUIT", + b_cash_out = "Cash Out", + b_unlock_all = "Unlock All", + k_unknown = "?????", + k_compatible = "compatible", + k_incompatible = "incompatible", + k_active = "active", + k_round = "Round", + k_ante = "Ante", + k_seed = "Seed", + k_reroll = "Reroll", + k_mult = "Mult", + k_rank = "Rank", + k_suit = "Suit", + k_stake = "Stake", + k_common = "Common", + k_uncommon = "Uncommon", + k_rare = "Rare", + k_legendary = "Legendary", + k_debuffed = "Debuffed", + k_locked = "Locked", + k_undisovered = "Undiscovered", + k_joker = "Joker", + k_voucher = "Voucher", + k_tarot = "Tarot", + k_planet = "Planet", + k_deck = "Deck", + k_dwarf_planet = "Dwarf Planet", + k_planet_q = "Planet?", + k_spectral = "Spectral", + k_booster = "Booster", + k_edition = "Edition", + k_hud_hands = "Hands", + k_hud_discards = "Discards", + k_lower_score = "score", + k_arcana_pack = "Arcana Pack", + k_celestial_pack = "Celestial Pack", + k_spectral_pack = "Spectral Pack", + k_standard_pack = "Standard Pack", + k_buffoon_pack = "Buffoon Pack", + k_enter_text = "Enter Text", + k_defeated_by = "Defeated By", + k_level_prefix = "lvl.", + k_also_applied = "Also applied", + k_base_cards = "Base Cards", + k_effective = "Effective", + k_aces = "Aces", + k_face_cards = "Face Cards", + k_numbered_cards = "Numbered Cards", + k_cap_consumables = "CONSUMABLES", + k_page = "Page", + k_ante_cap = "ANTE", + k_base_cap = "BASE", + k_jokers_cap = "JOKERS", + k_vouchers_cap = "VOUCHERS", + k_x_base = "X Base", + k_not_discovered = "Not Discovered", + k_unlocked_ex = "Unlocked!", + k_achievement = "Achievement", + k_trophy = "Trophy", + k_challenge_mode = "Challenge Mode", + k_daily_run = "Daily Run", + k_profile = "Profile", + k_wins = "Wins", + k_empty_caps = "EMPTY", + k_collection = "Collection", + k_progress = "Progress", + k_challenges = "Challenges", + k_joker_stickers = "Joker Stickers", + k_deck_stake_wins = "Deck Stake Wins", + k_stake_level = "Stake Level", + k_none = "None", + k_game_modifiers = "Game Modifiers", + k_custom_rules = "Custom Rules", + k_banned_cards = "Banned Cards", + k_banned_tags = "Banned Tags", + k_other = "Other", + k_money = "Money", + k_best_hand = "Best Hand", + k_seeded_run = "Seeded Run", + k_enter_seed = "Enter Seed", + k_enter_name = "Enter Name", + k_lvl = "lvl.", + k_skipped_cap = "SKIPPED", + k_no_reward = "No Reward", + k_reward = "Reward", + k_nope_ex = "Nope!", + k_not_allowed_ex = "Not Allowed!", + k_or = "or", + k_poker_hand = "poker hand", + k_gold = "Gold", + k_card_stats = "Card Stats", + k_balanced = "Balanced", + k_view = "View", + k_all_hands = "All Hands", + k_high_score_ex = "High Score!", + k_demo_version_ex = "Demo Version!", + k_playing_as = "Playing as", + k_choose = "Choose", + k_achievements_disabled = "Achievements Disabled", + k_trophies_disabled = "Trophies Disabled", + ph_improve_run = "Improve your run!", + ph_no_boss_active = "no boss active", + ph_sneak_peek = "Sneak Peek", + ph_deck_preview_stones = "Stones", + ph_deck_preview_effective = "Effective total due to Jokers, Blinds, and card enhancements", + ph_blind_score_at_least = "Score at least", + ph_blind_reward = "Reward: ", + ph_4_7_of_clubs = "four 7 of Clubs", + ph_up_ante_1 = "Up the Ante", + ph_up_ante_2 = "Raise all Blinds", + ph_up_ante_3 = "Refresh Blinds", + ph_select_challenge = "Select a Challenge", + ph_stat_joker = "Total completed rounds with this card", + ph_stat_consumable = "Number of times this card has been used", + ph_stat_voucher = "Number of times this Voucher has been redeemed", + ph_demo_thanks_1 = "Thanks for playing the", + ph_demo_thanks_2 = "BALATRO DEMO", + ph_game_over = "GAME OVER", + ph_you_win = "YOU WIN!", + ph_you_win_demo = "YOU WIN THE DEMO!", + ph_vouchers_redeemed = "Vouchers redeemed this run", + ph_no_vouchers = "No vouchers redeemed this run", + ph_defeat_this_blind_1 = "Defeat this blind", + ph_defeat_this_blind_2 = "to discover it", + ph_click_confirm = "Click again to confirm", + ph_choose_blind_1 = "Choose your", + ph_choose_blind_2 = "next Blind", + ph_mr_bones = "Saved by Mr. Bones", + ph_score_at_least = "Score at least", + ph_all_poker_hand = "All Poker Hands", + ph_1_level = "+1 Level", + ph_boss_disabled = "Boss Disabled!", + ph_most_played = "(most played hand)", + ph_defeat_the_boss = "Defeat the Boss Blind", + ph_score_furthest_ante = "Ante", + ph_score_furthest_round = "Round", + ph_score_hand = "Best Hand", + ph_score_poker_hand = "Most Played Hand", + ph_score_new_collection = "New Discoveries", + ph_score_cards_played = "Cards Played", + ph_score_cards_discarded = "Cards Discarded", + ph_score_times_rerolled = "Times Rerolled", + ph_score_cards_purchased = "Cards Purchased", + ph_unscored_hand = "Hand will not score", + ph_alert_debuff_confirm = "Press 'Play' again to confirm", + ml_demo_thanks_message = { + "Please consider wishlisting", + "Balatro on Steam and sign up for", + "the newsletter at playbalatro.com" + }, + ml_eternal = { + "Eternal", + "Can't be sold", + "or destroyed" + }, + ml_gold_seal_desc = { + "Gold Seal", + "returns to hand", + "when played" + }, + ml_crash_report_info = { + "Crash reports will be sent to the developer", + "to help reduce issues in the future. No", + "identifying or personal info will be sent." + }, + ml_play_discard_pos_opt = { + "Discard/Play", + "Play/Discard" + }, + ml_windowmode_opt = { + "Windowed", + "Fullscreen", + "Borderless" + }, + ml_vsync_opt = { + "VSync On", + "VSync Off" + }, + ml_shadow_opt = { + "On", + "Off" + }, + ml_smoothing_opt = { + "Off", + "On" + }, + ml_bloom_opt = { + "Off", + "On" + }, + ml_card_stats = { + "Card", + "Stats" + }, + ml_paste_seed = { + "Paste", + "Seed" + }, + ml_disabled_seed = { + "All Unlocks and", + "Discoveries disabled" + }, + ml_edition_seal_enhancement_explanation = { + "Playing cards may each have one", + "Enhancement, Edition, and Seal" + }, + ml_unlock_all_explanation = { + "WARNING! Unlocking the complete Collection", + "will disable achievements for this profile!" + }, + ml_unlock_all_trophies = { + "WARNING! Unlocking the complete Collection", + "will disable trophies for this profile!" + }, + ['$'] = "$", + k_redeemed_ex = "Redeemed!", + k_duplicated_ex = "Duplicated!", + k_no_room_ex = "No Room!", + k_no_space_ex = "No Space!", + k_no_other_jokers = "No other Jokers!", + k_plus_tarot = "+1 Tarot", + k_plus_stone = "+1 Stone", + k_plus_planet = "+1 Planet", + k_plus_spectral = "+1 Spectral", + k_plus_joker = "+1 Joker", + k_active_ex = "Active!", + k_level_up_ex = "Level Up!", + k_upgrade_ex = "Upgrade!", + k_again_ex = "Again!", + k_val_up = "Value Up!", + k_reset = "Reset", + k_extinct_ex = "Extinct!", + k_safe_ex = "Safe!", + k_saved_ex = "Saved!", + k_swapped_ex = "Swapped!", + k_copied_ex = "Copied!", + k_melted_ex = "Melted!", + k_eaten_ex = "Eaten!", + k_drank_ex = "Drank!", + k_eroded_ex = "Eroded!", + }, + v_dictionary = { + a_xmult = "X#1# Mult", + a_xmult_minus = "-X#1# Mult", + a_mult = "+#1# Mult", + a_mult_minus = "-#1# Mult", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# Hand Size", + a_handsize_minus = "-#1# Hand Size", + a_hands = "+#1# Hands", + a_sold_tally = "#1#/#2# Sold", + a_remaining = "#1# Remaining", + ante_x_voucher = "ANTE #1# VOUCHER", + loyalty_active = "Active!", + loyalty_inactive = "#1# remaining", + deck_preview_wheel_singular = "Numbers may be lower due to the #1# card drawn face down", + deck_preview_wheel_plural = "Numbers may be lower due to the #1# cards drawn face down", + challenges_completed = "Completed #1#/#2# Challenges", + unlocked = "#1#/#2# Unlocked", + completed = "#1#/#2# Completed", + interest = "#1# interest per $#2# (#3# max)", + remaining_hand_money = "Remaining Hands ($#1# each)", + remaining_discard_money = "Remaining Discards ($#1# each)", + ml_foil_desc = { + "Foil", + "+#1# Chips" + }, + ml_holo_desc = { + "Holographic", + "+#1# Mult" + }, + ml_polychrome_desc = { + "Polychrome", + "X#1# Mult" + }, + ml_negative_desc = { + "Negative", + "+#1# Joker Slot" + }, + ml_negative_consumable_desc = { + "Negative", + "+#1# consumable Slot" + } + }, + v_text = { + ch_m_dollars = { + "Start with {C:money}$#1#" + }, + ch_m_hands = { + "{C:blue}#1#{} hands per round" + }, + ch_m_discards = { + "{C:red}#1#{} discards per round" + }, + ch_m_reroll_cost = { + "{C:money}$#1#{} base reroll cost" + }, + ch_m_joker_slots = { + "{C:attention}#1#{} Joker Slots" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} Consumable Slots" + }, + ch_m_hand_size = { + "{C:attention}#1#{} hand size" + }, + ch_m_none = { + "{C:inactive}None" + }, + ch_c_no_reward = { + "All {C:attention}Blinds{} give no reward money" + }, + ch_c_no_reward_specific = { + "{C:attention}#1# Blinds{} give no reward money" + }, + ch_c_no_extra_hand_money = { + "Extra {C:blue}Hands{} no longer earn money" + }, + ch_c_no_interest = { + "Earn no {C:attention}Interest{} at end of round" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}Daily Challenge!" + }, + ch_c_set_seed = { + "1 attempt with set Seed: {C:inactive}{Hidden}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}Chips{} cannot exceed the current {C:money}$" + }, + ch_c_none = { + "{C:inactive}None" + }, + ch_c_no_shop_jokers = { + "Jokers no longer appear in the {C:attention}shop" + }, + ch_c_inflation = { + "Permanently raise prices by {C:money}$1{} on every purchase" + }, + ch_c_discard_cost = { + "Discards each cost {C:money}$#1#{}" + }, + ch_c_all_eternal = { + "All Jokers are {C:eternal}Eternal{}" + }, + ch_c_flipped_cards = { + "{C:green}1 in #1#{} cards are drawn face down" + }, + ch_c_debuff_played_cards = { + "All {C:attention}Played{} cards become {C:attention}debuffed{} after scoring" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Hold {C:red}-1{} cards in hand for every {C:money}$#1#{} you have" + }, + ch_c_set_eternal_ante = { + "When ante {C:attention}#1#{} boss is defeated, all Jokers become {C:attention}eternal" + }, + ch_c_set_joker_slots_ante = { + "When ante {C:attention}#1#{} boss is defeated, set Joker slots to {C:attention}0" + } + }, + quips = { + wq_1 = {"You Aced it!"}, + wq_2 = {"You dealt with","that pretty well!"}, + wq_3 = {"Looks like you","weren't bluffing!"}, + wq_4 = {"Too bad these","chips are all","virtual..."}, + wq_5 = {"Looks like I've","taught you well!"}, + wq_6 = {"You made some", "heads up plays!"}, + wq_7 = {"Good thing","I didn't bet", "against you!"}, + lq_1 = {"Maybe Go Fish", "is more our", "speed..."}, + lq_2 = {"We folded like", "a cheap suit!"}, + lq_3 = {"Time for us", "to shuffle off", "and try again!"}, + lq_4 = {"You know what", "they say, the", "house always wins!"}, + lq_5 = {"Looks like we", "found out who", "the real Joker is!"}, + lq_6 = {"Oh no, were you", "bluffing too?"}, + lq_7 = {"Looks like the","joke's on us!"}, + lq_8 = {"If I had hands","I would have", "covered my eyes!"}, + lq_9 = {"I'm literally", "a fool, what's", "your excuse?"}, + lq_10 = {"What a flop!"}, + dq_1 = {"Yikes! I hope you","have a few tricks","up your sleeve for","this final challenge!"} + }, + tutorial = { + sb_1 = { + "Hello there! My name is", + "{C:attention}Jimbo{}, I'm here to help", + "you learn how to play!" + }, + sb_2 = { + "Your goal is to earn", + "{C:blue}Chips{} to defeat", + "the enemy {C:attention}Blind" + }, + sb_3 = { + "This here is a {C:blue}Small Blind{},", + "you only need to score", + "{C:attention}300 Chips{} to beat it." + }, + sb_4 = { + "Select the {C:blue}Small Blind", + "to start the round!" + }, + bb_1 = { + "Selecting the {C:attention}Big Blind", + "will earn some cash" + }, + bb_2 = { + "Or choose to {C:attention}skip it", + "to get a {C:attention}Tag{}! Each", + "{C:attention}Tag{} has a unique effect" + }, + bb_3 = { + "But keep an eye on", + "the {C:attention}Boss Blind{}. It", + "has an ability you'll", + "need to plan around." + }, + bb_4 = { + "if you beat it, then the", + "{C:attention}Ante{} goes up and all", + "{C:attention}Blinds{} become harder" + }, + bb_5 = { + "Beat {C:attention}Ante{} #1# to win.", + "Now choose your path!" + }, + fh_1 = { + "You earn chips by", + "playing {C:attention}Poker hands" + }, + fh_2 = { + "Each {C:attention}Poker hand{} earns a", + "base amount of {C:blue}Chips", + "multiplied by some {C:red}Mult" + }, + fh_3 = { + "See your {C:attention}Poker hands", + "in the {C:attention}Run Info{} area,", + "along with other info", + "about your current run" + }, + fh_4 = { + "Cards also earn", + "you some {C:blue}Chips{},", + "hover over to see!" + }, + fh_5 = { + "Now select up to", + "{C:attention}5{} cards to play", + "and press {C:blue}'Play Hand'" + }, + fh_6 = { + "You can also {C:red}'Discard'{} up", + "to {C:attention}5{} selected cards", + "to try and make even", + "stronger hands. Try it!" + }, + fh_7 = { + "Careful! You only have a", + "limited number of {C:blue}Hands", + "and {C:red}Discards{} per round" + }, + fh_8 = { + "Earn {C:attention}300 Chips{} before", + "you run out of {C:blue}Hands", + "to win this round.", + "Good luck!" + }, + sh_1 = { + "When you get more cards,", + "remember you can rearrange", + "them. {C:attention}Jokers{} trigger in", + "order from left to right" + }, + sh_2 = { + "And make sure that you", + "{C:attention}USE{} your consumables!" + }, + sh_3 = { + "Select up to {C:attention}2{} cards", + "in your hand and press", + "{C:attention}'USE'{} on the {C:tarot}Tarot{} card", + "to enhance them!" + }, + s_1 = { + "Nicely done! Now that", + "you're {E:1}flush{} with {C:money}Cash{},", + "you can buy some new", + "cards from the {C:attention}Shop" + }, + s_2 = { + "Try buying this", + "handsome Devil" + }, + s_3 = { + "This is one of the {C:attention}#1#", + "{C:attention}Jokers{} you can add to", + "your run. Every {C:attention}Joker", + "does something different" + }, + s_4 = { + "This one adds {C:red}+4 Mult{} to", + "every hand you play!" + }, + s_5 = { + "Be picky, you can only", + "carry {C:attention}5 Joker{} cards", + "at a time" + }, + s_6 = { + "Now buy the other", + "card from the {C:attention}Shop" + }, + s_7 = { + "This {C:tarot}Tarot{} card is a", + "{C:attention}consumable{}. This one will", + "enhance your playing", + "cards! Hold on to it." + }, + s_8 = { + "You can carry up to", + "{C:attention}2 consumable{} cards", + "with you at a time" + }, + s_9 = { + "If you save up enough,", + "you can buy a {C:attention}Voucher{}.", + "{C:attention}Vouchers{} passively", + "upgrade your run!" + }, + s_10 = { + "{C:attention}Vouchers{} are restocked", + "after you defeat the", + "{C:attention}Boss Blind{}." + }, + s_11 = { + "And check out both of", + "the {C:booster}Booster Packs{} in", + "every shop. They're", + "full of goodies!" + }, + s_12 = { + "Let's move on to", + "the {C:attention}next round{}." + } + } + } +} diff --git a/localization/es_419.lua b/localization/es_419.lua new file mode 100644 index 0000000..b5c5166 --- /dev/null +++ b/localization/es_419.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Comodín", + text = { + "{C:red,s:1.1}+#1#{} multi" + } + }, + j_jolly = { + name = "Comodín alegre", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + } + }, + j_zany = { + name = "Comodín chiflado", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + } + }, + j_mad = { + name = "Comodín demente", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + } + }, + j_crazy = { + name = "Comodín loco", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + } + }, + j_droll = { + name = "Comodín gracioso", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + } + }, + j_half = { + name = "Medio comodín", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "{C:attention}#2#{} o menos cartas" + } + }, + j_fortune_teller = { + name = "Adivino", + text = { + "{C:red}+#1#{} multi por cada", + "carta de {C:purple}tarot{} usada", + "{C:inactive}(Actual {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Malabarista", + text = { + "{C:attention}+#1#{} tamaño de mano" + } + }, + j_drunkard = { + name = "Borracho", + text = { + "{C:red}+#1#{} descarte" + } + }, + j_stone = { + name = "Comodín de piedra", + text = { + "Este comodín gana {C:chips}+#1#{} fichas", + "por cada {C:attention}carta de piedra", + "en tu baraja completa", + "{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)" + } + }, + j_golden = { + name = "Comodín dorado", + text = { + "Gana {C:money}#1# ${}", + "al final de la ronda" + } + }, + j_stencil = { + name = "Plantilla de comodín", + text = { + "Multi {X:red,C:white} X#1# {} por cada", + "ranura de {C:attention}comodín{} vacía", + "Se incluye {s:0.8}plantilla de comodín", + "{C:inactive}(Actual {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Cuatro dedos", + text = { + "Los {C:attention}colores{}", + "y las {C:attention}escaleras{} pueden", + "hacerse con {C:attention}4{} cartas" + } + }, + j_mime = { + name = "Mimo", + text = { + "Reactiva todas", + "las habilidades de las cartas", + "{C:attention}en {C:attention}la mano{}" + } + }, + j_credit_card = { + name = "Tarjeta de crédito", + text = { + "Adquiere hasta", + "{C:red}-#1# ${} de deuda" + } + }, + j_greedy_joker = { + name = "Comodín codicioso", + text = { + "Las cartas jugadas", + "del palo {C:diamonds}#2#{} otorgan", + "multi {C:mult}+#1#{} cuando anotan" + } + }, + j_lusty_joker = { + name = "Comodín lujurioso", + text = { + "Las cartas jugadas", + "del palo {C:hearts}#2#{} otorgan", + "multi {C:mult}+#1#{} cuando anotan" + } + }, + j_wrathful_joker = { + name = "Comodín irascible", + text = { + "Las cartas jugadas", + "del palo {C:spades}#2#{} otorgan", + "multi {C:mult}+#1#{} cuando anotan" + } + }, + j_gluttenous_joker = { + name = "Comodín glotón", + text = { + "Las cartas jugadas", + "del palo {C:clubs}#2#{} otorgan", + "multi {C:mult}+#1#{} cuando anotan" + } + }, + j_ceremonial = { + name = "Daga ceremonial", + text = { + "Cuando se selecciona la {C:attention}ciega{},", + "destruye al comodín de la derecha", + "y agrega para siempre el {C:attention}doble", + "del valor de venta a este {C:red}multi", + "{C:inactive}(Actual {C:mult}+#1#{C:inactive} multi)" + } + }, + j_banner = { + name = "Estandarte", + text = { + "{C:chips}+#1#{} fichas", + "por cada", + "{C:attention}descarte restante" + } + }, + j_mystic_summit = { + name = "Cumbre mística", + text = { + "{C:mult}+#1#{} multi cuando hay", + "{C:attention}+#2#{} descartes", + "restantes" + } + }, + j_marble = { + name = "Comodín de mármol", + text = { + "Agrega una carta de {C:attention}piedra{}", + "a tu baraja cuando", + "se selecciona la {C:attention}ciega{}" + } + }, + j_loyalty_card = { + name = "Tarjeta de lealtad", + text = { + "{X:red,C:white} X#1# {} multi cada", + "{C:attention}#2#{} manos jugadas", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "Bola 8", + text = { + "Genera una carta de {C:planet}planeta{}", + "si la mano jugada contiene", + "{C:attenetion}#1#{} o más {C:attention}8{}", + "{C:inactive}(Debe haber espacio)" + } + }, + j_misprint = { + name = "Mala impresión", + text = { + "" + } + }, + j_dusk = { + name = "Atardecer", + text = { + "Reactiva las", + "cartas de puntos en la {C:attention}última", + "{C:attention}mano{} de la ronda" + } + }, + j_raised_fist = { + name = "Puño elevado", + text = { + "Suma el {C:attention}doble{} de categoría", + "de la carta {C:attention}más baja{}", + "de la mano al multi" + } + }, + j_chaos = { + name = "Caos el payaso", + text = { + "{C:attention}#1#{} {C:green}cambio gratuito", + "por tienda" + } + }, + j_fibonacci = { + name = "Fibonacci", + text = { + "Cada {C:attention}as{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} u {C:attention}8{} jugado", + "otorga multi {C:mult}+#1#{} cuando anota" + } + }, + j_steel_joker = { + name = "Comodín de acero", + text = { + "Este comodín gana multi {X:mult,C:white} X#1# {}", + "por cada {C:attention}carta de acero", + "en tu baraja completa", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_scary_face = { + name = "Cara aterradora", + text = { + "Las cartas de {C:attention}figuras{} jugadas", + "otorgan {C:chips}+#1#{} fichas", + "cuando anotan" + } + }, + j_abstract = { + name = "Comodín abstracto", + text = { + "{C:mult}+#1#{} multi por cada", + "carta de {C:attention}comodín{}", + "{C:inactive}(Actual: multi {C:red}+#2#{C:inactive})" + } + }, + j_delayed_grat = { + name = "Satisfacción demorada", + text = { + "Gana {C:money}#1# ${} por {C:attention}descarte{}", + "si no se usó ninguno", + "al final de la ronda" + } + }, + j_hack = { + name = "Comediante", + text = { + "Reactiva", + "cada {C:attention}2{}, {C:attention}3{},", + "{C:attention}4{} o {C:attention}5{} jugado" + } + }, + j_pareidolia = { + name = "Pareidolia", + text = { + "Todas las cartas", + "se consideran", + "de {C:attention}figuras{}" + } + }, + j_gros_michel = { + name = "Gros Michel", + text = { + "{C:mult}+#1#{} multi", + "{C:green}#2# en #3#{} probabilidades", + "de que la carta se destruya", + "al final de la ronda" + } + }, + j_even_steven = { + name = "El par", + text = { + "Las cartas jugadas", + "de categoría {C:attention}par{} otorgan", + "multi {C:mult}+#1#{} cuando anotan", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "El impar", + text = { + "Las cartas jugadas", + "de categoría {C:attention}impar{} otorgan", + "{C:chips}+#1#{} fichas cuando anotan", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Erudito", + text = { + "Los {C:attention}ases{} jugados", + "otorgan {C:chips}+#2#{} fichas", + "y multi {C:mult}+#1#{}", + "cuando anotan" + } + }, + j_business = { + name = "Tarjeta de presentación", + text = { + "Las cartas de {C:attention}figuras{} tienen", + "{C:green}#1# en #2#{} probabilidades", + "de otorgar {C:money}2 ${} cuando anotan" + } + }, + j_supernova = { + name = "Supernova", + text = { + "Suma a multi la cantidad", + "de veces que se jugó", + "la {C:attention}mano de póker{}" + } + }, + j_ride_the_bus = { + name = "Al autobús", + text = { + "{C:mult}+#1#{} multi por cada", + "mano consecutiva", + "que se juega sin usar", + "una carta de {C:attention}figura{}", + "{C:inactive}(Actual {C:mult}+#2#{C:inactive} multi)" + } + }, + j_space = { + name = "Comodín espacial", + text = { + "{C:green}#1# en #2#{} probabilidades de", + "mejorar el nivel", + "de la {C:attention}mano de póker{} jugada" + } + }, + j_egg = { + name = "Huevo", + text = { + "Gana {C:money}#1# ${}", + "del {C:attention}valor de venta{}", + "al final de la ronda" + } + }, + j_burglar = { + name = "Ladrón", + text = { + "Cuando se selecciona la {C:attention}ciega{},", + "gana {C:blue}+#1#{} manos y", + "{C:attention}pierde todos los descartes" + } + }, + j_blackboard = { + name = "Pizarrón", + text = { + "{X:red,C:white} X#1# {} multi si todas", + "las cartas que tienes en la mano", + "son {C:spades}#2#{} o {C:clubs}#3#{}" + } + }, + j_runner = { + name = "Corredor", + text = { + "Gana {C:chips}+#2#{} fichas", + "si la mano jugada", + "contiene una {C:attention}escalera{}", + "{C:inactive}(Actual {C:chips}+#1#{C:inactive} fichas)" + } + }, + j_ice_cream = { + name = "Helado", + text = { + "{C:chips}+#1#{} fichas", + "{C:chips}-#2#{} fichas por", + "cada mano jugada" + } + }, + j_dna = { + name = "ADN", + text = { + "Si la {C:attention}primera mano{} de la ronda", + "tiene solo {C:attention}1{} carta, se agrega", + "una copia permanente a la baraja", + "y se saca a la {C:attention}mano" + } + }, + j_splash = { + name = "Salpicadura", + text = { + "Cada {C:attention}carta jugada", + "cuenta para la puntuación" + } + }, + j_blue_joker = { + name = "Comodín azul", + text = { + "{C:chips}+#1#{} fichas por cada", + "carta restante en la {C:attention}baraja", + "{C:inactive}(Actual {C:chips}+#2#{C:inactive} fichas)" + } + }, + j_sixth_sense = { + name = "Sexto sentido", + text = { + "Si la {C:attention}primera mano{} de la ronda es", + "un solo {C:attention}6{}, lo destruye", + "y genera una carta {C:spectral}espectral{}", + "{C:inactive}(Debe haber espacio)" + } + }, + j_constellation = { + name = "Constelación", + text = { + "Gana {X:mult,C:white}X#1#{} multi", + "por carta de {C:planet}planeta{} usada", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)" + } + }, + j_hiker = { + name = "Excursionista", + text = { + "Todas las {C:attention}cartas{} jugadas", + "ganan para siempre", + "{C:chips}+#1#{} fichas cuando anotan" + } + }, + j_faceless = { + name = "Comodín sin cara", + text = { + "Gana {C:money}#1# ${} si {C:attention}#2#{}", + "o más {C:attention}cartas de figuras{}", + "se descartan", + "al mismo tiempo" + } + }, + j_green_joker = { + name = "Comodín verde", + text = { + "{C:mult}+#1#{} multi por mano jugada", + "{C:mult}-#2#{} multi por descarte", + "{C:inactive}(Actual {C:mult}+#3#{C:inactive} multi)" + } + }, + j_superposition = { + name = "Superposición", + text = { + "Genera una carta de {C:tarot}tarot{}", + "si la mano de póker contiene", + "un {C:attention}as{} y una {C:attention}escalera{}", + "{C:inactive}(Debe haber espacio)" + } + }, + j_todo_list = { + name = "Lista de pendientes", + text = { + "Gana {C:money}#1# ${} si la {C:attention}mano de póker{}", + "es un {C:attention}#2#{}.", + "La mano de póker cambia", + "en cada pago" + } + }, + j_ticket = { + name = "Boleto dorado", + text = { + "Las cartas de {C:attention}oro{} jugadas", + "ganan {C:money}#1#${} cuando anotan" + }, + unlock = { + "Juega una mano de 5 cartas", + "que contiene solo", + "cartas de {C:attention,E:1}oro{}" + } + }, + j_mr_bones = { + name = "Sr. Huesos", + text = { + "Evita la muerte", + "si las fichas obtenidas son", + "al menos un {C:attention}25 %", + "de lo requerido,", + "se {S:1.1,C:red,E:2}autodestruye{}" + }, + unlock = { + "Pierde {C:attention,E:1}#1#{} partidas", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Acróbata", + text = { + "{X:red,C:white} X#1# {} multi en la {C:attention}última", + "{C:attention}mano{} de la ronda" + }, + unlock = { + "Juega {C:attention,E:1}#1#{} manos", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "Tragedia y comedia", + text = { + "Reactiva todas las cartas", + "de {C:attention}figuras{} jugadas" + }, + unlock = { + "Juega un total de", + "{C:attention,E:1}#1#{} cartas de figuras", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "Aventurero", + text = { + "Agrega el valor de venta de todos", + "los {C:attention}comodines{} a la izquierda", + "de esta carta al multi", + "{C:inactive}(Actual {C:mult}+#1#{C:inactive} multi)" + }, + unlock = { + "Vende un total de", + "{C:attention,E:1}#1#{} cartas de comodín", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Trovador", + text = { + "{C:attention}+#1#{} tamaño de mano,", + "{C:red}-#2#{} manos por ronda" + }, + unlock = { + "Gana {C:attention,E:1}#1#{} rondas", + "consecutivas al jugar", + "1 sola mano" + } + }, + j_certificate = { + name = "Certificado", + text = { + "Cuando comienza la ronda,", + "agrega una {C:attention}carta{} de {C:attention}juego", + "aleatoria con 1 al azar", + "{C:attention}sello{} a tu mano" + }, + unlock = { + "Debes tener una carta", + "de oro", + "con un {C:attention,E:1}Sello de oro" + } + }, + j_smeared = { + name = "Comodín borroso", + text = { + "{C:hearts}Corazones{} y {C:diamonds}diamantes", + "cuentan como un mismo palo,", + "{C:spades}espadas{} y {C:clubs}tréboles", + "cuentan como un mismo palo," + }, + unlock = { + "Debes tener al menos {C:attention}#1#", + "{E:1,C:attention}#2#{} en", + "tu baraja" + } + }, + j_throwback = { + name = "Retro", + text = { + "Multi {X:mult,C:white}X#1#{} por cada", + "{C:attention}ciega{} omitida en esta partida", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)" + }, + unlock = { + "Continúa una partida guardada", + "del menú principal" + } + }, + j_hanging_chad = { + name = "Papel perforado", + text = { + "Reactiva la {C:attention}primera{}", + "carta usada en la puntuación" + }, + unlock = { + "Derrota a una ciega jefe", + "con 1 {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Gema en bruto", + text = { + "Las cartas jugadas", + "de {C:diamonds}diamantes{}", + "ganan {C:money}#1# ${} cuando anotan" + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja" + } + }, + j_bloodstone = { + name = "Heliotropo", + text = { + "{C:green}#1# in #2#{} probabilidades", + "de que las cartas jugadas", + "de {C:hearts}corazones{} otorguen", + "multi {X:mult,C:white} X#3# {} cuando anotan," + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja" + } + }, + j_arrowhead = { + name = "Punta de flecha", + text = { + "Las cartas jugadas", + "de {C:spades}picas{} otorgan", + "{C:chips}+#1#{} fichas cuando anotan" + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja" + } + }, + j_onyx_agate = { + name = "Ágata ónix", + text = { + "Las cartas jugadas", + "de {C:clubs}tréboles{} otorgan", + "multi {C:mult}+#1#{} cuando anotan" + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja" + } + }, + j_glass = { + name = "Comodín de vidrio", + text = { + "Gana {X:mult,C:white}X#1#{} multi", + "por cada {C:attention}carta de vidrio", + "que se destruya", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)" + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} en", + "tu baraja" + } + }, + j_ring_master = { + name = "Director de circo", + text = { + "Las cartas de {C:attention}comodines{}, {C:tarot}tarot{} y", + "{C:spectral}espectrales{} pueden", + "aparecer varias veces" + }, + unlock = { + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Florero", + text = { + "Multi {X:mult,C:white} X#1# {} si la mano", + "jugada tiene una carta", + "de {C:diamonds}diamantes{}, {C:clubs}tréboles{},", + "{C:hearts}corazones{} y {C:spades}espadas{} que anotan" + }, + unlock = { + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Plano", + text = { + "Copia la habilidad del", + "{C:attention}comodín{} de la derecha" + }, + unlock = { + "Gana una partida" + } + }, + j_wee = { + name = "Comodín pequeño", + text = { + "Este comodín gana", + "{C:chips}+#2#{} fichas cuando cada", + "{C:attention}2{} jugado anota", + "{C:inactive}(Actual {C:chips}+#1#{C:inactive} fichas)" + }, + unlock = { + "Gana una partida en {E:1,C:attention}#1#", + "rondas o menos" + } + }, + j_merry_andy = { + name = "Andy el alegre", + text = { + "{C:red}+#1#{} descartes,", + "{C:red}#2#{} tamaño de mano" + }, + unlock = { + "Gana una partida en {E:1,C:attention}#1#", + "rondas o menos" + } + }, + j_oops = { + name = "Solo seises", + text = { + "Duplica {C:attention}todas las", + "las {C:green,E:1,S:1.1}probabilidades", + "{C:inactive}(ejemplo: {C:green}1 de 3{C:inactive} -> {C:green}2 de 3{C:inactive})" + }, + unlock = { + "En una mano,", + "gana al menos", + "{E:1,C:attention}+#1#{} fichas" + } + }, + j_idol = { + name = "El ídolo", + text = { + "Cada {C:attention}#2# jugado", + "de {V:1}#3#{} otorga", + "multi {X:mult,C:white} X#1# {} cuando anota", + "{s:0.8}La carta cambia en cada ronda" + }, + unlock = { + "En una mano,", + "gana al menos", + "{E:1,C:attention}+#1#{} fichas" + } + }, + j_seeing_double = { + name = "Visión doble", + text = { + "Multi {X:mult,C:white} X#1# {} si la mano", + "jugada anota", + "Carta de {C:clubs}tréboles{} una carta", + "de puntuación de otro {C:attention}palo" + }, + unlock = { + "Juega una mano", + "que contenga", + "{E:1,C:attention}#1#" + } + }, + j_matador = { + name = "Matador", + text = { + "Gana {C:money}#1# ${} si la mano", + "jugada activa la", + "habilidad de {C:attention}ciega jefe{}" + }, + unlock = { + "Derrota a una ciega jefe", + "en {E:1,C:attention}1 mano{} sin usar", + "ningún descarte" + } + }, + j_hit_the_road = { + name = "Al camino", + text = { + "Gana multi {X:mult,C:white} X#1# {}", + "por carta descartada", + "de {C:attention}jota{} esta ronda", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)" + }, + unlock = { + "Descarta {E:1,C:attention}5", + "{E:1,C:attention}jotas{}", + "al mismo tiempo" + } + }, + j_duo = { + name = "El dúo", + text = { + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + }, + unlock = { + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#" + } + }, + j_trio = { + name = "El trío", + text = { + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + }, + unlock = { + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#" + } + }, + j_family = { + name = "La familia", + text = { + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + }, + unlock = { + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#" + } + }, + j_order = { + name = "La orden", + text = { + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + }, + unlock = { + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "La tribu", + text = { + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + }, + unlock = { + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "Cavendish", + text = { + "{X:mult,C:white} X#1# {} multi", + "{C:green}#2# en #3#{} probabilidades", + "de que la carta se destruya", + "al final de la ronda" + } + }, + j_card_sharp = { + name = "Carta filosa", + text = { + "{X:mult,C:white} X#1#{} multi si", + "se jugó la {C:attention}mano de póker{}", + "en esta ronda" + } + }, + j_red_card = { + name = "Carta roja", + text = { + "Gana multi {C:red}+#1#{} cuando se omite", + "cualquier {C:attention}paquete potenciador{}", + "{C:inactive}(Actual {C:red}+#2#{C:inactive} multi)" + } + }, + j_madness = { + name = "Locura", + text = { + "Cuando se selecciona la {C:attention}ciega{},", + "gana {X:mult,C:white} X#1# {} multi", + "y {C:attention}destruye{} un comodín al azar", + "{C:inactive}(Actual {X:mult,C:white} X#2#{} multi)" + } + }, + j_square = { + name = "Comodín cuadrado", + text = { + "Gana {C:chips}+#2#{} fichas", + "si la mano jugada tiene", + "{C:attention}4{} cartas", + "{C:inactive}(Actual {C:chips}#1#{} fichas)" + } + }, + j_seance = { + name = "Espiritismo", + text = { + "Si {C:attention}la mano de póker{} es una", + "{C:attention}#1#{}, genera una", + "carta {C:spectral}espectral{} al azar", + "{C:inactive}(Debe haber espacio)" + } + }, + j_riff_raff = { + name = "La chusma", + text = { + "Cuando se selecciona la {C:attention}ciega{},", + "crea {C:attention}#1# {C:attention} comodines {C:blue}comunes", + "{C:inactive}(Debe haber espacio)" + } + }, + j_stuntman = { + name = "Doble de riesgo", + text = { + "{C:chips}+#1#{} fichas,", + "{C:attention}-#2#{} tamaño de mano" + }, + unlock = { + "En una mano,", + "gana al menos", + "{E:1,C:attention}#1#{} fichas" + } + }, + j_invisible = { + name = "Comodín invisible", + text = { + "Después de {C:attention}#1#{} rondas,", + "vende esta carta para", + "{C:attention}duplicar{} un comodín aleatorio", + "{C:inactive}(actual {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Gana una partida sin", + "haber tenido más de", + "{E:1,C:attention}4 comodines{}" + } + }, + j_brainstorm = { + name = "Lluvia de ideas", + text = { + "Copia la habilidad del", + "{C:attention}comodín del extremo izquierdo" + }, + unlock = { + "Descarta una", + "{E:1,C:attention}Escalera real" + } + }, + j_satellite = { + name = "Satélite", + text = { + "Gana {C:money}#1# ${} al final de la ronda", + "por cada carta de {C:planet}planeta", + "única usada en esta partida", + "{C:inactive}(Actual {C:money}#2# ${C:inactive})" + }, + unlock = { + "Debes tener {E:1,C:money}#1# $", + "o más" + } + }, + j_shoot_the_moon = { + name = "Disparo a la luna", + text = { + "Multi {C:mult}+#1#{} por cada", + "{C:attention}reina de espadas", + "en tu mano" + }, + unlock = { + "Juega todos los {E:1,C:attention}corazones", + "en tu baraja en", + "una sola ronda" + } + }, + j_drivers_license = { + name = "Licencia de conducir", + text = { + "Multi {X:mult,C:white} X#1# {} si la baraja", + "tiene al menos {C:attention}16", + "cartas mejoradas", + "{C:inactive}(Actual {C:attention}#2#{C:inactive})" + }, + unlock = { + "Mejora {E:1,C:attention}#1#{} cartas", + "en tu baraja" + } + }, + j_cartomancer = { + name = "Cartomante", + text = { + "Genera una carta de {C:tarot}tarot{}", + "cuando se selecciona la {C:attention}ciega{},", + "{C:inactive}(Debe haber espacio)" + }, + unlock = { + "Descubre todas", + "las cartas de {E:1,C:tarot}tarot{}" + } + }, + j_astronomer = { + name = "Astrónomo", + text = { + "Todas las cartas de{C:planet}planeta{}", + "y los {C:planet}paquetes celestiales{} en", + "la tienda son {C:attention}gratis" + }, + unlock = { + "Descubre todas", + "las cartas de{E:1,C:planet}planeta{}" + } + }, + j_burnt = { + name = "Comodín quemado", + text = { + "Mejora el nivel", + "de la primera mano de póker", + "{C:attention}descartada en cada ronda" + }, + unlock = { + "Vende un total", + "de {E:1,C:attention}#1#{} cartas", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Botas", + text = { + "{C:mult}+#1#{} multi por cada", + "{C:money}#2# ${} que tengas" + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "comodines {C:dark_edition}polícromos{}" + } + }, + j_caino = { + name = "Canio", + text = { + "Gana multi {X:mult,C:white} X#1# {} cuando", + "una carta de {C:attention}figura{}", + "se destruye", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)" + }, + unlock = { + "{E:1,s:1.3}¿?" + } + }, + j_triboulet = { + name = "Triboulet", + text = { + "Los {C:attention}reyes{} y las", + "{C:attention}reinas{} jugados otorgan", + "multi {X:mult,C:white} X#1# {} cuando anotan," + }, + unlock = { + "{E:1,s:1.3}¿?" + } + }, + j_yorick = { + name = "Yorick", + text = { + "multi {X:mult,C:white} X#1# {} cada uno solo", + "después de usar {C:attention}#2#{} descartes", + "{C:inactive}(Descartes restantes: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}¿?" + } + }, + j_chicot = { + name = "Chicot", + text = { + "Inhabilita el efecto de", + "cada {C:attention}ciega jefe" + }, + unlock = { + "{E:1,s:1.3}¿?" + } + }, + j_perkeo = { + name = "Perkeo", + text = { + "Genera una copia {C:dark_edition}negativa{}", + "de {C:attention}1{} carta {C:attention}consumible{}", + "aleatoria que tengas", + "al final de la {C:attention}tienda" + }, + unlock = { + "{E:1,s:1.3}¿?" + } + }, + j_sly = { + name = "Comodín artero", + text = { + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#" + } + }, + j_wily = { + name = "Comodín taimado", + text = { + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#" + } + }, + j_clever = { + name = "Comodín astuto", + text = { + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#" + } + }, + j_devious = { + name = "Comodín ladino", + text = { + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#" + } + }, + j_crafty = { + name = "Comodín mañoso", + text = { + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#" + } + }, + j_vampire = { + name = "Vampiro", + text = { + "Gana multi {X:mult,C:white} X#1# {} por cada", + "{C:attention}carta mejorada{} jugada,", + "quita la {C:attention}mejora de carta", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_shortcut = { + name = "Atajo", + text = { + "Permite formar {C:attention}escaleras{}", + "con brechas de {C:attention}1 categoría", + "{C:inactive}(ej.: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Holograma", + text = { + "Gana multi {X:mult,C:white} X#1# {}", + "por cada {C:attention}carta de juego{}", + "agregada a la baraja", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_vagabond = { + name = "Vagabundo", + text = { + "Crea una carta de {C:purple}tarot{}", + "si se juega una mano", + "con {C:money}#1# ${} o menos" + } + }, + j_baron = { + name = "Barón", + text = { + "Cada {C:attention}rey{}", + "en tu mano", + "otorga multi {X:mult,C:white} X#1# {}" + } + }, + j_cloud_9 = { + name = "La 9º puerta", + text = { + "Gana {C:money}#1# ${} por cada", + "{C:attention}9{} en tu {C:attention}baraja completa", + "al final de la ronda", + "{C:inactive}(Actual {C:money}#2# ${}{C:inactive})" + } + }, + j_rocket = { + name = "Cohete", + text = { + "Gana {C:money}#1# ${} al final", + "de la ronda y {C:money}#2# ${}", + "cuando se derrota a la {C:attention}ciega jefe{}" + } + }, + j_obelisk = { + name = "Obelisco", + text = { + "Multi {X:mult,C:white} X#1# {} por cada", + "mano consecutiva jugada", + "sin jugar tu {C:attention}mano", + "de póker más jugada", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_midas_mask = { + name = "Máscara de Midas", + text = { + "Todas las cartas de {C:attention}figuras{}", + "se convierten en cartas de {C:attention}oro{}", + "cuando se juega" + } + }, + j_luchador = { + name = "Luchador", + text = { + "Vende esta carta", + "para desactivar", + "la {C:attention}ciega jefe{} actual" + } + }, + j_photograph = { + name = "Fotografía", + text = { + "La primera carta de {C:attention}figura", + "jugada otorga multi {X:mult,C:white} X#1# {}", + "cuando anota" + } + }, + j_gift = { + name = "Carta de regalo", + text = { + "Agrega {C:money}#1# ${} del {C:attention}valor de venta", + "a cada {C:attention}comodín{}", + "y cada carta {C:attention}consumible{} en", + "al final de la ronda" + } + }, + j_turtle_bean = { + name = "Frijol negro", + text = { + "{C:attention}+#1#{} tamaño de mano,", + "se reduce", + "en {C:red}#2#{} en cada ronda" + } + }, + j_erosion = { + name = "Erosión", + text = { + "Multi {C:red}+#1#{} por cada", + "carta debajo de {C:attention}#3#{}", + "en la baraja completa", + "{C:inactive}(Actual: multi {C:red}+#2#{C:inactive})" + } + }, + j_reserved_parking = { + name = "Estacionamiento reservado", + text = { + "Cada carta de {C:attention}figura{}", + "en tu mano tiene", + "{C:green}#2# en #3#{} probabilidades", + "que otorgue {C:money}#1# ${}" + } + }, + j_mail = { + name = "Reembolso por correo", + text = { + "Gana {C:money}#1# ${} por cada", + "{C:attention}#2#{} que descartes, la categoría", + "cambia en cada ronda" + } + }, + j_to_the_moon = { + name = "A la luna", + text = { + "Gana {C:money}#1# ${} extra", + "de {C:attention}interés{} por cada {C:money}5 ${}", + "que tengas al final de la ronda" + } + }, + j_hallucination = { + name = "Alucinación", + text = { + "{C:green}#1# en #2#{} probabilidades de crear", + "una carta de {C:tarot}tarot{} cuando se abre", + "cualquier {C:attention}paquete potenciador{}", + "{C:inactive}(Debe haber espacio)" + } + }, + j_lucky_cat = { + name = "Gato de la suerte", + text = { + "Gana multi {X:mult,C:white} X#1# {} cada", + "vez que una carta {C:attention}de la suerte{}", + "se activa {C:green}con éxito{}", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_baseball = { + name = "Carta de béisbol", + text = { + "Cada comodín {C:green}inusual{}", + "otorga multi {X:mult,C:white} X#1# {}" + } + }, + j_bull = { + name = "Toro", + text = { + "{C:chips}+#1#{} fichas por cada", + "{C:money}dólar{} que tengas", + "{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)" + } + }, + j_diet_cola = { + name = "Refresco dietético", + text = { + "Vende esta carta", + "para crear 1 {C:attention}#1#", + "gratis" + } + }, + j_trading = { + name = "Carta de colección", + text = { + "Si el {C:attention}primer descarte{} de la ronda", + "tiene solo {C:attention}1{} carta, destrúyela", + "y gana {C:money}#1# $" + } + }, + j_flash = { + name = "Carta sorpresa", + text = { + "Multi {C:mult}+#1#{} por cada", + "{C:attention}cambio{} en la tienda", + "{C:inactive}(Actual multi {C:mult}+#2# {C:inactive})" + } + }, + j_popcorn = { + name = "Palomitas de maíz", + text = { + "Multi {C:mult}+#1#{}", + "Multi {C:mult}-#2#{} por cada", + "ronda jugada" + } + }, + j_trousers = { + name = "Pantalones de repuesto", + text = { + "Gana multi {C:mult}+#1#{} si", + "la mano jugada contiene", + "1 {C:attention}#2#", + "{C:inactive}(Actual: multi {C:red}+#3#{C:inactive})" + } + }, + j_ancient = { + name = "Comodín antiguo", + text = { + "Cada carta jugada con el palo", + "{V:1}#2#{} otorga", + "multi {X:mult,C:white} X#1# {} cuando anota,", + "{s:0.8}el palo cambia al final de la ronda" + } + }, + j_ramen = { + name = "Ramen", + text = { + "Multi {X:mult,C:white} X#1# {},", + "pierde multi {X:mult,C:white} X#2# {}", + "por cada {C:attention}carta{} descartada" + } + }, + j_walkie_talkie = { + name = "Walkie-talkie", + text = { + "Cada {C:attention}10{} o {C:attention}4{}", + "jugado otorga {C:chips}+#1#{} fichas", + "y multi {C:mult}+#2#{} cuando anota" + } + }, + j_selzer = { + name = "Refresco", + text = { + "Reactiva todas", + "las cartas jugadas", + "por las próximas {C:attention}#1#{} manos" + } + }, + j_castle = { + name = "Castillo", + text = { + "Este comodín gana {C:chips}+#1#{} fichas", + "por carta {V:1}#2#{} descartada,", + "el palo cambia en cada ronda", + "{C:inactive}(Actual {C:chips}+#3#{C:inactive} fichas)" + } + }, + j_smiley = { + name = "Cara sonriente", + text = { + "Las cartas de {C:attention}figuras{} jugadas", + "otorgan multi {C:mult}+#1#{}", + "cuando anotan" + } + }, + j_campfire = { + name = "Fogata", + text = { + "Este comodín gana multi {X:mult,C:white}X#1#{}", + "por cada carta {C:attention}vendida{}, se restablece", + "cuando se derrota a la {C:attention}ciega jefe{}", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Excedente", + text = { + "{C:attention}+1{} ranura de carta", + "disponible en la tienda" + } + }, + v_clearance_sale = { + name = "Venta de saldos", + text = { + "Todas las cartas y paquetes", + "en la tienda a {C:attention}#1# %{} menos" + } + }, + v_tarot_merchant = { + name = "Mercader de tarot", + text = { + "Las cartas de {C:tarot}tarot{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda" + } + }, + v_planet_merchant = { + name = "Mercader de planetas", + text = { + "Las cartas de {C:planet}planeta{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda" + } + }, + v_hone = { + name = "Perfección", + text = { + "Las cartas {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} y", + "{C:dark_edition}polícromas{}", + "aparecen {C:attention}#1#X{} más veces" + } + }, + v_reroll_surplus = { + name = "Excedente de renovaciones", + text = { + "Las renovaciones cuestan", + "{C:money}#1# ${} menos" + } + }, + v_crystal_ball = { + name = "Bola de cristal", + text = { + "{C:attention}+1{} ranura de consumible" + } + }, + v_telescope = { + name = "Telescopio", + text = { + "Los {C:attention}paquetes celestiales{} siempre", + "contienen la carta de {C:planet}planeta{}", + "para tu {C:attention}mano de póker", + "más jugada" + } + }, + v_grabber = { + name = "Agarrador", + text = { + "Gana para siempre", + "{C:blue}+#1#{} mano(s)", + "por ronda" + } + }, + v_wasteful = { + name = "Desperdiciador", + text = { + "Gana para siempre", + "{C:red}+#1#{} descarte(s)", + "por ronda" + } + }, + v_seed_money = { + name = "Siembra dinero", + text = { + "Aumenta el límite", + "de los intereses ganados", + "por ronda a {C:money}#1# ${}" + } + }, + v_blank = { + name = "En blanco", + text = { + "{C:inactive}¿No hace nada?" + } + }, + v_magic_trick = { + name = "Truco de magia", + text = { + "Las {C:attention}cartas de juego{} pueden", + "comprarse", + "en la {C:attention}tienda" + } + }, + v_hieroglyph = { + name = "Jeroglífico", + text = { + "{C:attention}-#1#{} apuesta inicial", + "{C:blue}-#1#{} mano", + "por ronda", + "{C:attention}-#1#{} apuesta inicial" + } + }, + v_directors_cut = { + name = "Versión del director", + text = { + "Renueva la ciega jefe", + "{C:attention}1{} vez por apuesta inicial,", + "{C:money}#1# ${} por cambio" + } + }, + v_pattern = { + name = "Patrón", + text = { + "Genera tu carta", + "{C:attention}consumible{} más usada", + "{E:1,V:1}#1#", + "{C:inactive}(Debe haber espacio)" + } + }, + v_overstock_plus = { + name = "Excedente plus", + text = { + "{C:attention}+1{} ranura de carta", + "disponible en la tienda" + }, + unlock = { + "Gasta un total", + "de {C:money}#1# ${} en la tienda", + "{C:inactive}(#2# $)" + } + }, + v_liquidation = { + name = "Liquidación", + text = { + "Todas las cartas y paquetes", + "en la tienda a {C:attention}#1# %{} menos" + }, + unlock = { + "Canjea al menos", + "{C:attention}#1# cartas de{C:voucher} vale{}", + "en una partida" + } + }, + v_tarot_tycoon = { + name = "Magnate del tarot", + text = { + "Las cartas de {C:tarot}tarot{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda" + }, + unlock = { + "Compra un total", + "de {C:attention}#1# cartas de{C:tarot} tarot{}", + "en la tienda", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Magnate de planetas", + text = { + "Las cartas de {C:planet}planeta{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda" + }, + unlock = { + "Compra un total", + "{C:attention}#1# cartas de {C:planet}planeta{}", + "en la tienda", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Brillo", + text = { + "Las cartas {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} y", + "{C:dark_edition}polícromas{}", + "aparecen {C:attention}#1#X{} más veces" + }, + unlock = { + "Debes tener al menos {C:attention}#1#", + "cartas de {C:attention}comodín{}", + "que sean {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} o", + "{C:dark_edition}polícromas{}" + } + }, + v_reroll_glut = { + name = "Gula de renovaciones", + text = { + "Las renovaciones cuestan", + "{C:money}#1# ${} menos" + }, + unlock = { + "Renueva la tienda", + "un total de {C:attention}#1#{} veces", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Orbe profético", + text = { + "Las cartas {C:spectral}espectrales{} pueden", + "aparecer en cualquier", + "{C:attention}paquete arcano" + }, + unlock = { + "Usa un total de {C:attention}#1#", + "cartas de {C:tarot}tarot{} de cualquier", + "{C:tarot}paquete arcano", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Observatorio", + text = { + "Las cartas de {C:planet}planeta{} en", + "el área de {C:attention}consumibles{} otorgan", + "{X:red,C:white} X#1# {} multi para su", + "{C:attention}mano de póker específica" + }, + unlock = { + "Usa un total de {C:attention}#1#", + "cartas de {C:planet}planeta{} de cualquier", + "{C:planet}paquete celestial", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Pinza para nachos", + text = { + "Gana para siempre", + "{C:blue}+#1#{} mano(s)", + "por ronda" + }, + unlock = { + "Juega un total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Reciclomancia", + text = { + "Gana para siempre", + "{C:red}+#1#{} descarte(s)", + "por ronda" + }, + unlock = { + "Descarta un total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Árbol de dinero", + text = { + "Aumenta el límite", + "de los intereses ganados", + "por ronda a {C:money}#1# ${}" + }, + unlock = { + "Maximiza la ganancia", + "de interés por ronda durante", + "{C:attention}#1# rondas{} consecutivas", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Antimateria", + text = { + "{C:dark_edition}+1{} ranura de comodín" + }, + unlock = { + "Canjea {C:voucher}En blanco{}", + "un total de {C:attention}#1#{} veces", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Ilusión", + text = { + "Las {C:attention}cartas de juego{} en la tienda", + "pueden tener una {C:enhanced}mejora{},", + "{C:dark_edition}edición{} y/o un {C:attention}sello{}" + }, + unlock = { + "Compra un total", + "de {C:attention}#1#{} cartas de juego", + "en la tienda", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Petroglifo", + unlock = { + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{} apuesta inicial", + "{C:red}-#1#{} descarte", + "por ronda" + } + }, + v_retcon = { + name = "Retrocontinuidad", + text = { + "Renueva la ciega jefe", + "{C:attention}ilimitadas{} veces,", + "{C:money}#1# ${} por cambio" + }, + unlock = { + "Descubre", + "{C:attention}#1#{} ciegas" + } + }, + v_tesselation = { + name = "Teselado", + text = { + "Genera tu carta", + "de {C:attention}comodín{} más usada", + "{E:1,V:1}#1#", + "{C:inactive}(Debe haber espacio)" + }, + unlock = { + "Compra la edición {C:dark_edition}polícroma", + "de tu {C:attention}comodín", + "más usado", + "en la tienda" + } + }, + v_palette = { + name = "Paleta", + text = { + "Sujeta {C:attention}+#1#{} cartas", + "en tu mano", + "{C:attention}+#1#{} tamaño de mano" + }, + unlock = { + "Reduce el tamaño", + "de mano a {C:attention}#1#{} cartas" + } + }, + v_paint_brush = { + name = "Brocha", + text = { + "{C:attention}+#1#{} tamaño de mano" + } + } + }, + Tarot = { + c_fool = { + name = "El loco", + text = { + "Genera la última", + "carta de {C:tarot}tarot{} o de {C:planet}planeta{}", + "usada en esta partida", + "a excepción de {s:0.8,C:tarot}El loco{s:0.8}" + } + }, + c_magician = { + name = "El mago", + text = { + "Mejora {C:attention}#1#{} cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "La sacerdotisa", + text = { + "Genera hasta {C:attention}#1#", + "cartas de {C:planet}planeta{} al azar", + "{C:inactive}(Debe haber espacio)" + } + }, + c_empress = { + name = "La emperatriz", + text = { + "Mejora {C:attention}#1# cartas", + "seleccionadas a", + "{C:attention}#2#s" + } + }, + c_emperor = { + name = "El emperador", + text = { + "Genera hasta {C:attention}#1#", + "cartas de {C:tarot}tarot{} al azar", + "{C:inactive}(Debe haber espacio)" + } + }, + c_heirophant = { + name = "El hierofante", + text = { + "Mejora {C:attention}#1# cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_lovers = { + name = "Los enamorados", + text = { + "Mejora {C:attention}#1#{} cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "El carro", + text = { + "Mejora {C:attention}#1#{} cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_justice = { + name = "La justicia", + text = { + "Mejora {C:attention}#1#{} cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "El ermitaño", + text = { + "Duplica el dinero", + "{C:inactive}(Máx. de {C:money}#1# ${C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "La rueda de la fortuna", + text = { + "{C:green}#1# en #2#{} probabilidades de agregar", + "que sean {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} o", + "{C:dark_edition}polícromas{}", + "a un {C:attention}comodín al azar" + } + }, + c_strength = { + name = "La fuerza", + text = { + "Aumenta la categoría de", + "hasta {C:attention}#1#{} cartas", + "elegidas en {C:attention}1" + } + }, + c_hanged_man = { + name = "El colgado", + text = { + "Destruye hasta", + "{C:attention}#1#{} cartas seleccionadas" + } + }, + c_death = { + name = "La muerte", + text = { + "Selecciona {C:attention}#1#{} cartas,", + "convierte la carta {C:attention}izquierda{}", + "en la carta {C:attention}derecha{}", + "{C:inactive}(Arrastra para acomodar)" + } + }, + c_temperance = { + name = "La templanza", + text = { + "Otorga el valor total de venta", + "de todos los comodines", + "actuales {C:inactive}(Máx. de {C:money}#1# ${C:inactive})", + "{C:inactive}(Actual {C:money}#2# ${C:inactive})" + } + }, + c_devil = { + name = "El diablo", + text = { + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#" + } + }, + c_tower = { + name = "La torre", + text = { + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#" + } + }, + c_star = { + name = "La estrella", + text = { + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}" + } + }, + c_moon = { + name = "La luna", + text = { + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}" + } + }, + c_sun = { + name = "El sol", + text = { + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}" + } + }, + c_judgement = { + name = "El juicio", + text = { + "Genera una carta", + "de {C:attention}comodín{} al azar", + "{C:inactive}(Debe haber espacio)" + } + }, + c_world = { + name = "El mundo", + text = { + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Mercurio", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_venus = { + name = "Venus", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_earth = { + name = "Tierra", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_mars = { + name = "Marte", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_jupiter = { + name = "Júpiter", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_saturn = { + name = "Saturno", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_uranus = { + name = "Urano", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_neptune = { + name = "Neptuno", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_pluto = { + name = "Plutón", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_ceres = { + name = "Ceres", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_planet_x = { + name = "Planeta X", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_eris = { + name = "Eris", + text = { + "Aumento de nivel {S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){}", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "y {C:chips}+#4#{} fichas" + } + } + }, + Spectral = { + c_familiar = { + name = "Familiar", + text = { + "Destruye {C:attention}1{} carta", + "de tu mano al azar,", + "agrega {C:attention}#1#{} {C:attention}cartas {C:attention}de figura{} mejoradas", + "al azar a tu mano" + } + }, + c_grim = { + name = "Lúgubre", + text = { + "Destruye {C:attention}1{} carta", + "de tu mano al azar,", + "agrega {C:attention}#1#{} {C:attention}ases{} {C:attention}mejorados{}", + "a tu mano al azar" + } + }, + c_incantation = { + name = "Encantamiento", + text = { + "Destruye {C:attention}1{} carta", + "de tu mano al azar, agrega {C:attention}#1#", + "carta {C:attention}mejorada numerada", + "a tu mano al azar" + } + }, + c_talisman = { + name = "Talismán", + text = { + "Agrega un {C:attention}sello de oro{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar" + } + }, + c_aura = { + name = "Aura", + text = { + "Agrega efectos de {C:dark_edition}laminado{}, {C:dark_edition}holográfico{}", + "o {C:dark_edition}polícromo{} a", + "{C:attention}1{} carta seleccionada de tu mano" + } + }, + c_wraith = { + name = "Espectro", + text = { + "Genera una carta", + "de {C:attention}comodín{} {C:red}rara{} al azar,", + "deja el dinero en {C:money}0 $" + } + }, + c_sigil = { + name = "Sigilo", + text = { + "Convierte todas las cartas", + "de tu mano en un solo", + "{C:attention}palo al azar" + } + }, + c_ouija = { + name = "Ouija", + text = { + "Convierte todas las cartas", + "de tu mano en una sola", + "{C:attention}categoría al azar", + "{C:red}-1{} de tamaño de mano" + } + }, + c_ectoplasm = { + name = "Ectoplasma", + text = { + "Agrega {C:dark_edition}negativo{}", + "a un {C:attention}comodín al azar", + "{C:red}-1{} de tamaño de mano" + } + }, + c_immolate = { + name = "Inmolación", + text = { + "Destruye {C:attention}#1#{} cartas", + "de tu mano al azar,", + "gana {C:money}#2# $" + } + }, + c_soul = { + name = "El alma", + text = { + "Crea un", + "comodín {C:legendary,E:1}legendario{}", + "{C:inactive}(Debe haber espacio)" + } + }, + c_black_hole = { + name = "Agujero negro", + text = { + "Aumenta todas", + "las {C:legendary,E:1}manos de póker", + "{C:attention}1{} nivel" + } + }, + c_ankh = { + name = "Anj", + text = { + "Crea una copia de un", + "{C:attention}comodín{} aleatorio,", + "destruye los demás" + } + }, + c_deja_vu = { + name = "Déjà vu", + text = { + "Agrega un {C:red}sello rojo{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar" + } + }, + c_hex = { + name = "Maleficio", + text = { + "Agrega {C:dark_edition}policromía{} a un", + "{C:attention}comodín{} aleatorio,", + "destruye los demás" + } + }, + c_trance = { + name = "Trance", + text = { + "Agrega un {C:blue}sello azul{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar" + } + }, + c_medium = { + name = "Médium", + text = { + "Agrega un {C:purple}sello morado{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar" + } + }, + c_cryptid = { + name = "Críptido", + text = { + "Crea {C:attention}#1#{} copias de", + "{C:attention}1{} carta seleccionada", + "en tu mano" + } + } + }, + Edition = { + e_base = { + name = "Base", + text = { + "Sin efectos adicionales" + } + }, + e_foil = { + name = "Laminada", + text = { + "{C:chips}+#1#{} fichas" + } + }, + e_holo = { + name = "Holográfica", + text = { + "Multi {C:mult}+#1#{}" + } + }, + e_polychrome = { + name = "Polícroma", + text = { + "Multi {X:mult,C:white} X#1#{}" + } + }, + e_negative = { + name = "Negativa", + text = { + "{C:dark_edition}+#1#{} ranura de comodín" + } + }, + e_negative_consumable = { + name = "Negativa", + text = { + "{C:dark_edition}+#1#{} ranura de consumible" + } + } + }, + Enhanced = { + m_bonus = { + name = "Carta adicional", + text = {} + }, + m_mult = { + name = "Carta multi", + text = { + "{C:mult}+#1#{} multi" + } + }, + m_wild = { + name = "Carta versátil", + text = { + "Puede usarse", + "como cualquier palo" + } + }, + m_glass = { + name = "Carta de vidrio", + text = { + "{X:mult,C:white} X#1# {} multi", + "{C:green}#2# en #3#{} probabilidades", + "de destruir la carta" + } + }, + m_steel = { + name = "Carta de acero", + text = { + "Multi {X:mult,C:white}X#1#{}", + "mientras esta carta", + "esté en tu mano" + } + }, + m_stone = { + name = "Carta de piedra", + text = { + "{C:chips}+#1#{} fichas", + "sin categoría ni palo" + } + }, + m_gold = { + name = "Carta de oro", + text = { + "{C:money}#1# ${} si esta", + "carta está en tu mano", + "al final de la ronda" + } + }, + m_lucky = { + name = "Carta de la suerte", + text = { + "{C:green}#1# en #3#{} probabilidades", + "de {C:mult}+#2#{} multi", + "{C:green}#1# en #5#{} probabilidades", + "de ganar {C:money}#4# $" + } + } + }, + Stake = { + stake_white = { + name = "Pozo blanco", + text = { + "Dificultad básica" + } + }, + stake_red = { + name = "Pozo rojo", + text = { + "La {C:attention}ciega pequeña{} no otorga", + "ninguna recompensa monetaria", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_green = { + name = "Pozo verde", + text = { + "Escalas de puntos requeridas más rápidas", + "para cada {C:attention}apuesta inicial", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_blue = { + name = "Pozo azul", + text = { + "{C:red}-1{} descarte", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_black = { + name = "Pozo negro", + text = { + "La tienda puede tener comodines {C:attention}eternos{}", + "{C:inactive,s:0.8}{No se pueden vender ni destruir}", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_purple = { + name = "Pozo morado", + text = { + "Escalas de puntos requeridas más rápidas", + "para cada {C:attention}apuesta inicial", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_orange = { + name = "Pozo naranja", + text = { + "Los {C:attention}paquetes potenciadores{} cuestan", + "{C:money}1 ${} más por apuesta inicial", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_gold = { + name = "Pozo de oro", + text = { + "{C:red}-1{} tamaño de mano", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + } + }, + Tag = { + tag_uncommon = { + name = "Etiqueta inusual", + text = { + "La tienda tiene un", + "comodín {C:green}inusual" + } + }, + tag_rare = { + name = "Etiqueta rara", + text = { + "La tienda tiene un", + "comodín {C:red}raro" + } + }, + tag_negative = { + name = "Etiqueta negativa", + text = { + "La tienda tiene un", + "comodín {C:dark_edition}negativo" + } + }, + tag_foil = { + name = "Etiqueta laminada", + text = { + "La tienda tiene un", + "comodín {C:dark_edition}laminado" + } + }, + tag_holo = { + name = "Etiqueta holográfica", + text = { + "La tienda tiene un", + "comodín {C:dark_edition}holográfico" + } + }, + tag_polychrome = { + name = "Etiqueta polícroma", + text = { + "La tienda tiene un", + "comodín {C:dark_edition}polícromo" + } + }, + tag_investment = { + name = "Etiqueta de inversión", + text = { + "Después de derrotar", + "a la ciega jefe,", + "gana {C:money}#1# $" + } + }, + tag_voucher = { + name = "Etiqueta de vale", + text = { + "Agrega un {C:voucher}vale", + "en la siguiente tienda" + } + }, + tag_boss = { + name = "Etiqueta de jefe", + text = { + "Renueva", + "la {C:attention}ciega jefe" + } + }, + tag_standard = { + name = "Etiqueta estándar", + text = { + "Otorga gratis un", + "{C:attention}megapaquete estándar" + } + }, + tag_charm = { + name = "Etiqueta encantada", + text = { + "Otorga gratis un", + "{C:tarot}paquete arcano mega" + } + }, + tag_meteor = { + name = "Etiqueta de meteoro", + text = { + "Otorga gratis un", + "{C:planet}paquete celestial mega" + } + }, + tag_buffoon = { + name = "Etiqueta de bufón", + text = { + "Otorga gratis un", + "{C:attention}paquete de bufón" + } + }, + tag_handy = { + name = "Etiqueta manual", + text = { + "Otorga {C:money}#1# ${} por cada", + "{C:blue}mano{} jugada en esta partida", + "{C:inactive}(Otorgará {C:money}#2# ${C:inactive})" + } + }, + tag_garbage = { + name = "Etiqueta de basura", + text = { + "Otorga {C:money}#1# ${} por cada", + "{C:red}descarte{} sin usar en esta partida", + "{C:inactive}(Otorgará {C:money}#2# ${C:inactive})" + } + }, + tag_coupon = { + name = "Etiqueta de cupón", + text = { + "Las cartas iniciales", + "y los paquetes potenciadores", + "en la próxima tienda son gratis" + } + }, + tag_double = { + name = "Etiqueta doble", + text = { + "Otorga una copia de", + "la {C:attention}etiqueta{} siguiente seleccionada", + "{s:0.8}a excepción de {s:0.8,C:attention}Etiqueta doble" + } + }, + tag_juggle = { + name = "Etiqueta de malabar", + text = { + "{C:attention}+#1#{} tamaño de mano", + "en la ronda siguiente" + } + }, + tag_d_six = { + name = "Etiqueta D6", + text = { + "Las renovaciones en la tienda siguiente", + "comienzan en {C:money}0 $" + } + }, + tag_top_up = { + name = "Etiqueta de recarga", + text = { + "Genera hasta {C:attention}#1#", + "comodines {C:blue}comunes{}", + "{C:inactive}(Debe haber espacio)" + } + }, + tag_skip = { + name = "Etiqueta veloz", + text = { + "Otorga {C:money}#1# ${} por ciega", + "omitida en esta partida", + "{C:inactive}(Otorgará {C:money}#2# ${C:inactive})" + } + }, + tag_orbital = { + name = "Etiqueta orbital", + text = { + "Aumenta {C:attention}#1#", + "en {C:attention}#2# niveles" + } + }, + tag_economy = { + name = "Etiqueta de economía", + text = { + "Duplica el dinero", + "{C:inactive}(Máx. de {C:money}#1# ${C:inactive})" + } + }, + tag_ethereal = { + name = "Etiqueta etérea", + text = { + "Otorga gratis", + "un {C:planet}paquete espectral" + } + } + }, + Blind = { + bl_small = { + name = "Ciega pequeña", + text = {} + }, + bl_big = { + name = "Ciega grande", + text = {} + }, + bl_hook = { + name = "El garfio", + text = { + "Descarta 2 cartas al azar", + "por cada mano jugada" + } + }, + bl_wall = { + name = "El muro", + text = { + "Ciega extra grande" + } + }, + bl_wheel = { + name = "La rueda", + text = { + " en 7 cartas se saca", + "boca abajo" + } + }, + bl_arm = { + name = "El brazo", + text = { + "Disminuye el nivel", + "de la mano de póker jugada" + } + }, + bl_psychic = { + name = "El psíquico", + text = { + "Debes jugar 5 cartas" + } + }, + bl_goad = { + name = "La provocación", + text = { + "Todas las espadas", + "se debilitan" + } + }, + bl_water = { + name = "El agua", + text = { + "Comienza con", + "0 descartes" + } + }, + bl_eye = { + name = "El ojo", + text = { + "Los tipos de manos", + "no se repiten en esta ronda" + } + }, + bl_mouth = { + name = "La boca", + text = { + "Juega 1 solo tipo", + "de mano en esta ronda" + } + }, + bl_plant = { + name = "La planta", + text = { + "Todas las cartas de figuras", + "se debilitan" + } + }, + bl_needle = { + name = "La aguja", + text = { + "Juega 1 solo tipo de mano" + } + }, + bl_head = { + name = "La cabeza", + text = { + "Todos los corazones", + "se debilitan" + } + }, + bl_tooth = { + name = "El diente", + text = { + "Pierde 1 $", + "por carta jugada" + } + }, + bl_final_leaf = { + name = "Hoja verde", + text = { + "Todas las cartas se debilitan", + "hasta que se venda 1 comodín" + } + }, + bl_final_vessel = { + name = "Contenedor violeta", + text = { + "Ciega muy grande" + } + }, + bl_ox = { + name = "El buey", + text = { + "Si se juega 1 #1#,", + "deja el dinero en 0 $" + } + }, + bl_house = { + name = "La casa", + text = { + "La primera mano", + "se saca boca abajo" + } + }, + bl_club = { + name = "El garrote", + text = { + "Todos los tréboles", + "se debilitan" + } + }, + bl_fish = { + name = "El pez", + text = { + "Las cartas se sacan boca abajo", + "tras cada mano jugada" + } + }, + bl_window = { + name = "La ventana", + text = { + "Todos los diamantes", + "se debilitan" + } + }, + bl_manacle = { + name = "El grillete", + text = { + "-1 de tamaño de mano" + } + }, + bl_serpent = { + name = "La serpiente", + text = { + "Después de jugar o descartar,", + "siempre saca 3 cartas" + } + }, + bl_pillar = { + name = "El pilar", + text = { + "Las cartas que se jugaron antes", + "en esta apuesta inicial se debilitan" + } + }, + bl_flint = { + name = "El pedernal", + text = { + "Las fichas base y el multi", + "se dividen a la mitad" + } + }, + bl_mark = { + name = "La marca", + text = { + "Todas las cartas de figuras", + "boca abajo" + } + }, + bl_final_acorn = { + name = "Bellota ambarina", + text = { + "Voltea y mezcla", + "todos los comodines" + } + }, + bl_final_heart = { + name = "Corazón carmesí", + text = { + "Se inhabilita un comodín", + "al azar en cada mano" + } + }, + bl_final_bell = { + name = "Campana cerúlea", + text = { + "Fuerza 1 carta", + "a que se seleccione siempre" + } + } + }, + Back = { + b_red = { + name = "Baraja roja", + text = { + "{C:red}+#1#{} descarte", + "en cada ronda" + } + }, + b_blue = { + name = "Baraja azul", + text = { + "{C:blue}+#1#{} mano", + "en cada ronda" + } + }, + b_yellow = { + name = "Baraja amarilla", + text = { + "Comienza con", + "{C:money}#1# $ extra" + } + }, + b_green = { + name = "Baraja verde", + text = { + "Al final de cada ronda:", + "{C:money}#1# ${s:0.85} por {C:blue}mano restante", + "{C:money}#2# ${s:0.85} por {C:red}descarte restante", + "No ganas {C:attention}interés" + } + }, + b_black = { + name = "Baraja negra", + text = { + "{C:attention}+#1#{} ranura(s) de comodín", + "", + "{C:blue}-#2#{} mano", + "en cada ronda" + } + }, + b_magic = { + name = "Baraja mágica", + text = { + "Comienza la partida", + "con el vale {C:tarot,T:v_crystal_ball}#1#{}", + "y {C:attention}2{} copias", + "de {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Baraja nébula", + text = { + "Comienza la partida", + "con el vale {C:planet,T:v_telescope}#1#{}", + "", + "{C:red}#2#{} ranura de consumible" + } + }, + b_metal = { + name = "Baraja de metal", + text = { + "Comienza la partida con {C:attention}#1#", + "cartas mejoradas", + "a cartas de {C:attention}acero" + } + }, + b_abandoned = { + name = "Baraja abandonada", + text = { + "Comienza la partida sin", + "ninguna carta de {C:attention}figura", + "en tu baraja" + } + }, + b_checkered = { + name = "Baraja a cuadros", + text = { + "Comienza la partida con", + "{C:attention}26{C:spades} espadas{} y", + "{C:attention}26{C:hearts} corazones{} en la baraja" + } + }, + b_rocky = { + name = "Baraja rocosa", + text = { + "Comienza la partida con {C:attention}#1#", + "cartas de {C:attention}piedra extra" + } + }, + b_braided = { + name = "Baraja trenzada", + text = { + "La primera mano jugada", + "aumenta a {C:attention}nvl. 3" + } + }, + b_anaglyph = { + name = "Baraja anaglifo", + text = { + "Después de derrotar a cada", + "{C:attention}ciega jefe{}, gana 1", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "Baraja plasmática", + text = { + "Equilibra las {C:blue}fichas{} y", + "el {C:red}multi{} cuando calcula", + "los puntos de cada mano jugada", + "{C:red}X#1#{} tamaño base de la ciega" + } + }, + b_erratic = { + name = "Baraja errática", + text = { + "Todas las {C:attention}categorías{} y", + "los {C:attention}palos{} en la baraja", + "se aleatorizan" + } + }, + b_challenge = { + name = "Baraja desafío", + text = { + "" + } + }, + b_ghost = { + name = "Baraja fantasma", + text = { + "Las cartas {C:spectral}espectrales{} pueden", + "aparecer en la tienda,", + "comienza con una carta de {C:spectral,T:c_hex}maleficio{}" + } + }, + b_zodiac = { + name = "Baraja zodiacal", + text = { + "Comienza la partida con", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "y {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Baraja pintada", + text = { + "{C:attention}+#1#{} tamaño de mano", + "{C:red}#2#{} ranuras de comodín" + } + } + }, + Other = { + gold_seal = { + name = "Sello de oro", + text = { + "Gana {C:money}3 ${} cuando", + "se juega esta carta", + "y anota puntos" + } + }, + white_sticker = { + name = "Sticker blanco", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}blanco{}" + } + }, + red_sticker = { + name = "Sticker rojo", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}rojo{}" + } + }, + green_sticker = { + name = "Sticker verde", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}verde{}" + } + }, + blue_sticker = { + name = "Sticker azul", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}azul{}" + } + }, + black_sticker = { + name = "Sticker negro", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}negro{}" + } + }, + purple_sticker = { + name = "Sticker morado", + text = { + "Usaste este comodín", + "Para ganar en la dificultad {C:attention}Pozo", + "{C:attention}negro{}" + } + }, + orange_sticker = { + name = "Sticker naranja", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}naranja{}" + } + }, + gold_sticker = { + name = "Sticker de oro", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}de oro{}" + } + }, + playing_card = { + text = { + "{C:light_black}#1# de {V:1}#2#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} fichas" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1# fichas{} extra" + } + }, + locked = { + name = "Bloqueada", + text = {} + }, + debuffed_default = { + name = "Debilitada", + text = { + "Todas las habilidades", + "están inhabilitadas" + } + }, + debuffed_playing_card = { + name = "Debilitada", + text = { + "No gana ninguna ficha", + "y todas las habilidades", + "están inhabilitadas" + } + }, + demo_locked = { + name = "Bloqueada", + text = { + "No está disponible", + "en esta demo" + } + }, + demo_shop_locked = { + name = "Bloqueada", + text = { + "Carta de la colección personal", + "de {C:attention}Jimbo, ", + "disponible en la versión", + "completa de {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Bloqueada", + text = { + "Trabajo", + "en curso" + } + }, + deck_locked_win = { + name = "Bloqueada", + text = { + "Gana una partida", + "con {C:attention}#1#{}", + "en cualquier dificultad" + } + }, + deck_locked_discover = { + name = "Bloqueada", + text = { + "Descubre al menos", + "{C:attention}#1#{} objetos de", + "tu colección" + } + }, + deck_locked_stake = { + name = "Bloqueada", + text = { + "Gana una partida con cualquier", + "baraja en al menos", + "dificultad {V:1}#1#{}" + } + }, + joker_locked_legendary = { + name = "Bloqueada", + text = { + "Encuentra este comodín", + "en la carta {C:spectral}El alma{}" + } + }, + undiscovered_joker = { + name = "No se descubrió", + text = { + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_tarot = { + name = "No se descubrió", + text = { + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_planet = { + name = "No se descubrió", + text = { + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_spectral = { + name = "No se descubrió", + text = { + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_voucher = { + name = "No se descubrió", + text = { + "Canjea este vale", + "en una partida", + "sin códigos para saber", + "lo que hace" + } + }, + undiscovered_booster = { + name = "No se descubrió", + text = { + "Abre este paquete", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_edition = { + name = "No se descubrió", + text = { + "Encuentra esta edición", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_tag = { + name = "No se descubrió", + text = { + "Usa esta etiqueta", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + p_arcana_normal = { + name = "Paquete arcano", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{} para", + "usar de inmediato" + } + }, + p_arcana_jumbo = { + name = "Paquete arcano jumbo", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{}", + "para usar de inmediato" + } + }, + p_arcana_mega = { + name = "Paquete arcano mega", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{}", + "para usar de inmediato" + } + }, + p_celestial_normal = { + name = "Paquete celestial", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato" + } + }, + p_celestial_jumbo = { + name = "Paquete celestial jumbo", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato" + } + }, + p_celestial_mega = { + name = "Paquete celestial mega", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato" + } + }, + p_spectral_normal = { + name = "Paquete espectral", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato" + } + }, + p_spectral_jumbo = { + name = "Paquete espectral jumbo", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato" + } + }, + p_spectral_mega = { + name = "Paquete espectral mega", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato" + } + }, + p_standard_normal = { + name = "Paquete estándar", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja" + } + }, + p_standard_jumbo = { + name = "Paquete estándar jumbo", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja" + } + }, + p_standard_mega = { + name = "Paquete estándar mega", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja" + } + }, + p_buffoon_normal = { + name = "Paquete de bufón", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}" + } + }, + p_buffoon_jumbo = { + name = "Paquete de bufón jumbo", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}" + } + }, + p_buffoon_mega = { + name = "Paquete de bufón mega", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}" + } + }, + pinned_left = { + name = "Fijada", + text = { + "Este comodín se queda", + "fijado a la posición", + "del extremo izquierdo" + } + }, + red_seal = { + name = "Sello rojo", + text = { + "Reactiva esta", + "carta {C:attention}1{} vez" + } + }, + blue_seal = { + name = "Sello azul", + text = { + "Genera una carta de {C:planet}planeta{}", + "si {C:attention}tienes{} esta carta", + "en la mano al final de la ronda" + } + }, + purple_seal = { + name = "Sello morado", + text = { + "Crea una carta de {C:tarot}tarot{}", + "cuando {C:attention}se descarta", + "{C:inactive}(Debe haber espacio)" + } + }, + eternal = { + name = "Eterno", + text = { + "No se puede vender", + "ni destruir" + } + }, + challenge_locked = { + name = "Bloqueada", + text = { + "Gana una partida con al menos", + "#1# barajas diferentes para desbloquear", + "Modo desafío", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Pica", + Hearts = "Corazón", + Clubs = "Trébol", + Diamonds = "Diamante" + }, + suits_plural = { + Spades = "Picas", + Hearts = "Corazones", + Clubs = "Tréboles", + Diamonds = "Diamantes" + }, + blind_states = { + Select = "Seleccionar", + Skipped = "Omitida", + Current = "Actual", + Defeated = "Derrotada", + Upcoming = "Siguiente", + Selected = "Seleccionada" + }, + ranks = { + Ace = "As", + King = "Rey", + Queen = "Reina", + Jack = "Jota", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Mejor mano", + furthest_round = "Ronda más alta", + furthest_ante = "Apuesta inicial más alta", + most_money = "Más dinero", + boss_streak = "Más jefes seguidos", + collection = "Colección", + win_streak = "Mejor racha de victorias", + current_streak = "", + poker_hand = "Mano más jugada" + }, + poker_hands = { + ['Flush House'] = "Full de color", + ['Five of a Kind'] = "Quintilla", + ['Royal Flush'] = "Escalera real", + ['Straight Flush'] = "Escalera corrida", + ['Four of a Kind'] = "Póker", + ['Full House'] = "Full house", + ['Flush'] = "Color", + ['Straight'] = "Escalera", + ['Three of a Kind'] = "Tercia", + ['Two Pair'] = "Doble par", + ['Pair'] = "Par", + ['High Card'] = "Carta más alta", + ['Flush Five'] = "Cinco de color" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "Una tercia y par con", + "todas las cartas del mismo palo" + }, + ['Five of a Kind'] = { + "5 cartas de la misma categoría" + }, + ['Royal Flush'] = { + "5 cartas seguidas {valores consecutivos} con", + "todas las cartas del mismo palo" + }, + ['Straight Flush'] = { + "5 cartas seguidas {valores consecutivos} con", + "todas las cartas del mismo palo" + }, + ['Four of a Kind'] = { + "4 cartas de la misma categoría. Pueden", + "jugarse con 1 otra carta que no cuenta" + }, + ['Full House'] = { + "Una tercia y un par" + }, + ['Flush'] = { + "5 cartas del mismo palo" + }, + ['Straight'] = { + "5 cartas seguidas {valores consecutivos}" + }, + ['Three of a Kind'] = { + "3 cartas de la misma categoría. Pueden", + "jugarse con otras 2 cartas que no cuentan" + }, + ['Two Pair'] = { + "2 pares de cartas de categorías diferentes, pueden", + "jugarse con 1 otra carta que no cuenta" + }, + ['Pair'] = { + "2 cartas de la misma categoría. Pueden", + "jugarse con otras 3 cartas que no cuentan" + }, + ['High Card'] = { + "Si la mano jugada no es ninguna de las anteriores,", + "sólo cuenta la carta más alta" + }, + ['Flush Five'] = { + "5 cartas de la misma categoría y palo" + } + }, + labels = { + common = "Común", + uncommon = "Inusual", + rare = "Rara", + legendary = "Legendaria", + tarot = "Tarot", + planet = "Planeta", + pluto_planet = "Planeta enano", + voucher = "Vale", + foil = "Laminada", + holographic = "Holográfica", + polychrome = "Polícroma", + negative = "Negativa", + gold_seal = "Sello de oro", + locked = "Bloqueada", + blue_seal = "Sello azul", + red_seal = "Sello rojo", + purple_seal = "Sello morado", + eternal = "Eterno", + pinned_left = "Fijada" + }, + dictionary = { + b_sell = "VENDER", + b_use = "USAR", + b_select = "SELECCIONAR", + b_buy = "COMPRAR", + b_redeem = "CANJEAR", + b_open = "ABRIR", + b_and_use = "Y USAR", + b_next_round_1 = "Ronda", + b_next_round_2 = "siguiente", + b_play_hand = "Jugar mano", + b_discard = "Descartar", + b_sort_hand = "Ordenar mano", + b_run_info_1 = "Partida", + b_run_info_2 = "Info", + b_options = "Opciones", + b_reroll_boss = "Renovar jefe", + b_skip_blind = "Omitir ciega", + b_skip_reward = "Omitir ciega", + b_skip = "Omitir", + b_start_new_run = "Partida nueva", + b_main_menu = "Menú principal", + b_collection = "Colección", + b_seed = "Código", + b_copy_seed = "Copiar código", + b_credits = "Créditos", + b_stats = "Estadísticas", + b_settings = "Configuración", + b_set_game = "Juego", + b_set_video = "Video", + b_set_graphics = "Gráficos", + b_set_audio = "Audio", + b_set_gamespeed = "Velocidad del juego", + b_set_play_discard_pos = "Posición del botón jugar/descartar", + b_set_screenshake = "Temblor de pantalla", + b_set_crash_reports = "Informes de errores", + b_set_monitor = "Configuración de pantalla", + b_set_windowmode = "Modo ventana", + b_set_apply = "Aplicar", + b_set_master_vol = "Volumen principal", + b_set_music_vol = "Volumen música", + b_set_game_vol = "Volumen juego", + b_set_shadows = "Sombras", + b_set_pixel_smoothing = "Suavizado de pixeles", + b_set_CRT = "CRT", + b_set_CRT_bloom = "Dispersión CRT", + b_stat_jokers = "Comodines", + b_stat_consumables = "Consumibles", + b_stat_tarots = "Tarot", + b_stat_planets = "Planetas", + b_stat_spectrals = "Espectrales", + b_stat_vouchers = "Vales", + b_next = "Siguiente", + b_endless = "Modo infinito", + b_wishlist = "Lista de deseos en Steam", + b_playbalatro = "Visita playbalatro.com", + b_remaining = "Restantes", + b_full_deck = "Baraja completa", + b_poker_hands = "Manos de póker", + b_blinds = "Ciegas", + b_vouchers = "Vales", + b_stake = "Pozo", + b_jokers = "Comodines", + b_tarot_cards = "Cartas de tarot", + b_planet_cards = "Cartas de planeta", + b_spectral_cards = "Cartas espectrales", + b_enhanced_cards = "Cartas mejoradas", + b_editions = "Ediciones", + b_booster_packs = "Paquetes potenciadores", + b_tags = "Etiquetas", + b_decks = "Barajas", + b_continue = "Continuar", + b_back = "Atrás", + b_music = "Música", + b_sounds = "Sonidos", + b_imagery = "Imágenes", + b_new_run = "Partida nueva", + b_challenges = "Desafíos", + b_current_profile = "Perfil actual", + b_load_profile = "Cargar perfil", + b_create_profile = "Crear perfil", + b_delete_profile = "Eliminar perfil", + b_reset_profile = "Restablecer perfil", + b_rules = "Reglas", + b_restrictions = "Restricciones", + b_deck = "Baraja", + b_play_cap = "JUGAR", + b_options_cap = "OPCIONES", + b_collection_cap = "COLECCIÓN", + b_quit_cap = "SALIR", + b_cash_out = "Cobrar", + k_unknown = "¿?", + k_compatible = "compatible", + k_incompatible = "incompatible", + k_round = "Ronda", + k_ante = "Apuesta inicial", + k_seed = "Código", + k_reroll = "Cambiar", + k_mult = "Multi", + k_rank = "Categoría", + k_suit = "Palo", + k_stake = "Pozo", + k_common = "Común", + k_uncommon = "Inusual", + k_rare = "Rara", + k_legendary = "Legendaria", + k_debuffed = "Debilitada", + k_locked = "Bloqueada", + k_undisovered = "No se descubrió", + k_joker = "Comodín", + k_voucher = "Vale", + k_tarot = "Tarot", + k_planet = "Planeta", + k_dwarf_planet = "Planeta enano", + k_planet_q = "¿Planeta?", + k_spectral = "Espectral", + k_booster = "Potenciador", + k_edition = "Edición", + k_hud_hands = "Manos", + k_hud_discards = "Descartes", + k_lower_score = "puntuación", + k_arcana_pack = "Paquete arcano", + k_celestial_pack = "Paquete celestial", + k_spectral_pack = "Paquete espectral", + k_standard_pack = "Paquete estándar", + k_buffoon_pack = "Paquete de bufón", + k_enter_text = "Escribir texto", + k_defeated_by = "Derrotada por", + k_level_prefix = "Nvl.", + k_also_applied = "También se aplica", + k_base_cards = "Cartas base", + k_effective = "Total efectivo", + k_aces = "Ases", + k_face_cards = "Cartas de figuras", + k_numbered_cards = "Cartas numeradas", + k_cap_consumables = "CONSUMIBLES", + k_page = "Página", + k_ante_cap = "APUESTA INICIAL", + k_base_cap = "BASE", + k_jokers_cap = "COMODINES", + k_vouchers_cap = "VALES", + k_x_base = "Base X", + k_not_discovered = "No se descubrió", + k_unlocked_ex = "¡Se desbloqueó!", + k_challenge_mode = "Modo desafío", + k_daily_run = "Partida diaria", + k_profile = "Perfil", + k_wins = "Victorias", + k_empty_caps = "VACÍA", + k_collection = "Colección", + k_stake_level = "Nivel de pozo", + k_none = "Ninguno", + k_game_modifiers = "Modificadores de juego", + k_custom_rules = "Reglas personalizadas", + k_banned_cards = "Cartas prohibidas", + k_banned_tags = "Etiquetas prohibidas", + k_other = "Otros", + k_money = "Dinero", + k_best_hand = "Mejor mano", + k_seeded_run = "Partida con códigos", + k_enter_seed = "Escribir código", + k_lvl = "Nvl.", + k_skipped_cap = "SE OMITIÓ", + k_no_reward = "Sin recompensa", + k_reward = "Recompensa", + k_nope_ex = "¡No!", + k_or = "o", + k_balanced = "Equilibrado", + ph_improve_run = "¡Mejora tu partida!", + ph_sneak_peek = "Vistazo", + ph_deck_preview_stones = "Piedras", + ph_deck_preview_effective = "Total efectivo debido a comodines, ciegas y mejoras de cartas", + ph_blind_score_at_least = "Anota al menos", + ph_blind_reward = "Recompensa:", + ph_up_ante_1 = "Aumentar apuesta inicial", + ph_up_ante_2 = "Aumentar todas las ciegas", + ph_up_ante_3 = "Actualizar las ciegas", + ph_stat_joker = "Total de rondas completadas con esta carta", + ph_stat_consumable = "Cantidad de veces que se usó la carta", + ph_stat_voucher = "Cantidad de veces que se canjeó el vale", + ph_demo_thanks_1 = "Gracias por jugar la", + ph_demo_thanks_2 = "DEMO DE BALATRO", + ph_game_over = "FIN DE PARTIDA", + ph_vouchers_redeemed = "Vales canjeados en esta partida", + ph_no_vouchers = "No se canjearon vales en esta partida", + ph_defeat_this_blind_1 = "Derrota a esta ciega", + ph_defeat_this_blind_2 = "para descubrirla", + ph_click_confirm = "Haz clic de nuevo para confirmar", + ph_choose_blind_1 = "Elige tu", + ph_choose_blind_2 = "próxima ciega", + ph_mr_bones = "Te salvó el Sr. Huesos", + ph_score_at_least = "Anota al menos", + ph_all_poker_hand = "Todas las manos de póker", + ph_1_level = "+1 nivel", + ph_boss_disabled = "¡Jefe inhabilitado!", + ph_most_played = "(mano más jugada)", + ml_demo_thanks_message = { + "Considera la posibilidad de agregar Balatro", + "a tu lista de deseos en Steam y suscríbete", + "al boletín de noticias en playbalatro.com" + }, + ml_eternal = { + "Eterno", + "No se puede vender", + "ni destruir" + }, + ml_gold_seal_desc = { + "Sello de oro", + "regresa a tu mano", + "cuando se juega" + }, + ml_crash_report_info = { + "Los informes de errores se enviarán al desarrollador", + "para reducir los problemas en el futuro.", + "No se enviará información de identificación personal." + }, + ml_play_discard_pos_opt = { + "Descartar/jugar", + "Jugar/descartar" + }, + ml_windowmode_opt = { + "Modo ventana", + "Pantalla completa", + "Sin bordes" + }, + ml_vsync_opt = { + "Con VSync", + "Sin VSync" + }, + ml_shadow_opt = { + "Sí", + "No" + }, + ml_smoothing_opt = { + "No", + "Sí" + }, + ml_bloom_opt = { + "No", + "Sí" + }, + ml_card_stats = { + "Carta", + "Estadísticas" + }, + ml_paste_seed = { + "Pegar", + "código" + }, + ml_disabled_seed = { + "Todos los desbloqueos", + "y descubrimientos inhabilitados" + }, + ['$'] = "$", + k_redeemed_ex = "¡Se canjeó!", + k_duplicated_ex = "¡Se duplicó!", + k_no_room_ex = "¡No hay espacio!", + k_no_space_ex = "¡Sin espacio!", + k_no_other_jokers = "¡No hay más comodines!", + k_plus_tarot = "+1 Tarot", + k_plus_stone = "+1 Piedras", + k_plus_planet = "+1 Planeta", + k_plus_spectral = "+1 Espectral", + k_active_ex = "¡Se activó!", + k_level_up_ex = "¡Aumento de nivel!", + k_upgrade_ex = "¡Mejora!", + k_again_ex = "¡De nuevo!", + k_val_up = "¡Aumento de valor!", + k_reset = "Restablecer", + k_extinct_ex = "¡Se extinguió!", + k_safe_ex = "¡A salvo!", + k_saved_ex = "¡Te salvaste!", + k_swapped_ex = "¡Se cambió!", + k_copied_ex = "¡Se copió!", + k_melted_ex = "¡Se derritió!", + b_copy = "Copiar", + b_high_contrast_cards = "Cartas de alto contraste", + b_set_rumble = "Vibración del control", + b_seals = "Sellos", + b_new_challenge = "Iniciar desafío nuevo", + b_unlock_all = "Desbloquear todo", + k_active = "activa", + k_deck = "Baraja", + k_progress = "Progreso", + k_challenges = "Desafíos", + k_joker_stickers = "Stickers de comodín", + k_deck_stake_wins = "Victorias de pozo de baraja", + k_enter_name = "Escribir nombre", + k_gold = "Oro", + k_card_stats = "Estadísticas de cartas", + k_view = "Ver", + k_all_hands = "Todas las manos", + k_high_score_ex = "¡Récord!", + k_demo_version_ex = "¡Versión demo!", + k_playing_as = "Jugando como", + k_choose = "Elegir", + k_achievements_disabled = "Logros desactivados", + ph_no_boss_active = "no hay jefe activo", + ph_you_win = "¡GANASTE!", + ph_you_win_demo = "¡GANASTE EN LA DEMO!", + ph_defeat_the_boss = "Derrota a la ciega jefe", + ph_score_furthest_ante = "Apuesta inicial", + ph_score_furthest_round = "Ronda", + ph_score_hand = "Mejor mano", + ph_score_poker_hand = "Mano más jugada", + ph_score_new_collection = "Descubrimientos", + ph_score_cards_played = "Cartas jugadas", + ph_score_cards_discarded = "Cartas descartadas", + ph_score_times_rerolled = "Renovaciones", + ph_score_cards_purchased = "Cartas compradas", + ml_edition_seal_enhancement_explanation = { + "Las cartas de juego pueden tener 1", + "mejora, edición y sello cada una" + }, + ml_unlock_all_explanation = { + "¡ATENCIÓN! Si desbloqueas la colección completa,", + "se desactivarán los logros para este perfil" + }, + k_plus_joker = "+1 comodín", + k_eaten_ex = "¡Se devoró!", + k_eroded_ex = "¡Se erosionó!", + k_achievement = "Logro", + ph_unscored_hand = "La mano no anota puntos", + ph_alert_debuff_confirm = "Pulsa Jugar de nuevo para confirmar", + k_drank_ex = "¡Consumido!", + k_trophy = "Trofeo", + k_trophies_disabled = "Trofeos desactivados", + ml_unlock_all_trophies = { + "¡ATENCIÓN! Si desbloqueas la colección completa,", + "Se desactivarán los trofeos para este perfil" + }, + k_poker_hand = "mano de póker", + ph_4_7_of_clubs = "cuatro 7 de tréboles" + }, + v_dictionary = { + a_xmult = "X#1# multi", + a_mult = "+#1# множ.", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# de tamaño de mano", + a_hands = "+#1# Manos", + a_sold_tally = "#1#/#2# vendidas", + a_remaining = "#1# restantes", + ante_x_voucher = "VALE DE APUESTA INICIAL #1#", + loyalty_active = "¡Se activó!", + loyalty_inactive = "#1# restantes", + deck_preview_wheel_singular = "Las cantidades pueden ser inferiores debido a la carta #1# que se saca boca abajo", + deck_preview_wheel_plural = "Los números pueden ser inferiores debido a las cartas #1# que se sacan boca abajo", + challenges_completed = "Completaste #1#/#2# desafíos", + interest = "#1# de interés por cada #2# $ (#3# máx.)", + remaining_hand_money = "Manos restantes (#1# $ cada una)", + remaining_discard_money = "Descartes restantes (#1# $ cada uno)", + ml_foil_desc = { + "Laminada", + "+#1# fichas" + }, + ml_holo_desc = { + "Holográfica", + "+#1# multi" + }, + ml_polychrome_desc = { + "Polícroma", + "X#1# multi" + }, + ml_negative_desc = { + "Negativa", + "+#1# ranura de comodín" + }, + a_mult_minus = "Multi -#1#", + a_handsize_minus = "Tamaño de mano -#1#", + ml_negative_consumable_desc = { + "Negativa", + "+#1# ranura de consumibles" + }, + a_xmult_minus = "-X#1# multi", + unlocked = "Desbloqueaste #1#/#2#", + completed = "Completaste #1#/#2#" + }, + v_text = { + ch_m_dollars = { + "Empieza con {C:money}#1# $" + }, + ch_m_hands = { + "{C:blue}#1#{} manos por ronda" + }, + ch_m_discards = { + "{C:red}#1#{} descartes por ronda" + }, + ch_m_reroll_cost = { + "{C:money}#1# ${} costo base de cambio" + }, + ch_m_joker_slots = { + "{C:attention}#1# ranuras de {}comodín" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} ranuras de consumibles" + }, + ch_m_hand_size = { + "{C:attention}#1#{} tamaño de mano" + }, + ch_m_none = { + "{C:inactive}Ninguna" + }, + ch_c_no_reward = { + "Ninguna {C:attention}ciega{} otorga dinero de recompensa" + }, + ch_c_no_reward_specific = { + "Las ciegas {C:attention}#1#{} no otorgan dinero de recompensa" + }, + ch_c_no_extra_hand_money = { + "Las {C:blue}manos{} extra ya no ganan dinero" + }, + ch_c_no_interest = { + "No ganas {C:attention}interés{} al final de la ronda" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}¡Desafío diario!" + }, + ch_c_set_seed = { + "1 intento con código establecido: {C:inactive}{Oculto}" + }, + ch_c_chips_dollar_cap = { + "Las {C:blue}fichas{} no pueden superar {C:money}$" + }, + ch_c_none = { + "{C:inactive}Ninguna" + }, + ch_c_inflation = { + "Eleva los precios en {C:money}1 ${} para cada compra de forma permanente" + }, + ch_c_discard_cost = { + "Cada descarte cuesta {C:money}#1# ${}" + }, + ch_c_all_eternal = { + "Todos los comodines en la tienda son {C:eternal}eternos{}" + }, + ch_c_flipped_cards = { + "{C:green}1 en #1#{} cartas se sacan boca abajo" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Tienes {C:red}-1{} cartas en la mano por cada {C:money}#1# ${} que tengas" + }, + ch_c_no_shop_jokers = { + "Los comodines ya no pueden aparecer en la {C:attention}tienda" + }, + ch_c_debuff_played_cards = { + "Todas las cartas {C:attention}jugadas{} quedan {C:attention}debilitadas{} cuando anotan puntos" + }, + ch_c_set_eternal_ante = { + "Cuando derrotas al jefe de la apuesta inicial {C:attention}#1#{}, todos los comodines se vuelven {C:attention}eternos" + }, + ch_c_set_joker_slots_ante = { + "Cuando derrotas al jefe de la apuesta inicial {C:attention}#1#{}, todas las ranuras de comodín quedan en {C:attention}0" + } + }, + tutorial = { + sb_1 = { + "¡Hola! Me llamo", + "{C:attention}Jimbo{}, te enseñaré", + "a jugar." + }, + sb_2 = { + "Tu meta es ganar", + "{C:blue}fichas{} para derrotar", + "a la {C:attention}ciega enemiga" + }, + sb_3 = { + "Esta es una {C:blue}ciega pequeña{},", + "solo debes ganar", + "{C:attention}300 fichas{} para derrotarla." + }, + sb_4 = { + "Elige la {C:blue}ciega pequeña", + "para comenzar la ronda." + }, + bb_1 = { + "Cuando elijas la {C:attention}ciega grande,", + "ganarás un poco de dinero." + }, + bb_2 = { + "Puedes {C:attention}omitirla", + "para conseguir una {C:attention}etiqueta{}. Cada", + "{C:attention}etiqueta{} tiene un efecto único." + }, + bb_3 = { + "No dejes de vigilar", + "a la {C:attention}ciega jefe{}. Tiene", + "una habilidad para la cual", + "deberás prepararte." + }, + bb_4 = { + "Si la derrotas, aumenta", + "la {C:attention}apuesta inicial{} y todas", + "las{C:attention}ciegas{} se vuelven más difíciles." + }, + bb_5 = { + "Derrota a la {C:attention}apuesta inicial{} #1# para ganar.", + "¡Elige tu camino!" + }, + fh_1 = { + "Ganas fichas por jugar", + "{C:attention}manos de póker." + }, + fh_2 = { + "Cada {C:attention}mano de póker{} gana", + "una cantidad base de {C:blue}fichas", + "multiplicadas por algunos {C:red}multi." + }, + fh_3 = { + "Consulta tus {C:attention}manos de póker", + "en el área de {C:attention}info{}", + "junto con otros datos", + "sobre la partida actual." + }, + fh_4 = { + "Las cartas también ganan", + "algunas {C:blue}fichas{},", + "coloca el cursor sobre ellas para ver." + }, + fh_5 = { + "Ahora selecciona hasta", + "{C:attention}5{} cartas para jugar", + "y pulsa {C:blue}Jugar mano." + }, + fh_6 = { + "También puedes {C:red}Descartar{} hasta", + "{C:attention}5{} cartas seleccionadas", + "para tratar de conseguir", + "manos mejores. ¡Inténtalo!" + }, + fh_7 = { + "¡Cuidado! Solo tienes una", + "cantidad limitada de {C:blue}manos", + "y {C:red}descartes{} por ronda." + }, + fh_8 = { + "Gana {C:attention}300 fichas{} antes de", + "que se terminen las {C:blue}manos", + "para ganar esta ronda.", + "¡Buena suerte!" + }, + sh_1 = { + "Cuando consigas más cartas,", + "recuerda que puedes reordenarlas.", + "Los {C:attention}comodines{} se activan", + "de izquierda a derecha" + }, + sh_2 = { + "Asegúrate de", + "{C:attention}USAR{} los consumibles." + }, + sh_3 = { + "Selecciona hasta {C:attention}2{} cartas", + "de tu mano y pulsa", + "{C:attention}USAR{} en la carta de {C:tarot}tarot{}", + "para mejorarlas." + }, + s_1 = { + "¡Bien hecho! Ahora que tienes", + "{E:1}un poco{} de {C:money}dinero{},", + "puedes comprar cartas", + "nuevas en la {C:attention}tienda." + }, + s_2 = { + "Intenta comprar a este", + "pícaro apuesto." + }, + s_3 = { + "Este es uno de los {C:attention}#1#", + "{C:attention}comodines{} que puedes agregar", + "a tu partida. Cada {C:attention}comodín", + "hace algo diferente." + }, + s_4 = { + "Este agrega {C:red}+4 multi{}", + "a cada mano jugada." + }, + s_5 = { + "Elige bien, solo puedes", + "tener {C:attention}5 comodines{}", + "al mismo tiempo." + }, + s_6 = { + "Ahora compra la otra", + "carta en la {C:attention}tienda." + }, + s_7 = { + "Esta carta de {C:tarot}tarot{} es", + "{C:attention}consumible{}.", + "Sirve para mejorar tus cartas", + "de juego. Cuídala bien." + }, + s_8 = { + "Puedes tener hasta", + "{C:attention}2 consumibles{}", + "al mismo tiempo." + }, + s_9 = { + "Si ahorras lo suficiente,", + "puedes comprar un {C:attention}vale{}.", + "Los {C:attention}vales{} mejoran", + "la partida de forma pasiva." + }, + s_10 = { + "Los {C:attention}vales{} se reabastecen", + "después de que derrotas", + "a la {C:attention}ciega jefe{}." + }, + s_11 = { + "No dejes de dar un vistazo", + "a los {C:booster}paquetes potenciadores{}", + "en cada tienda. ¡Están", + "llenos de sorpresas!" + }, + s_12 = { + "Pasemos", + "a la {C:attention}ronda siguiente{}." + } + }, + achievement_names = { + ante_up = "¡Aumento de apuesta inicial!", + ante_upper = "¡Aumentador de apuesta inicial!", + heads_up = "Aviso", + low_stakes = "Apuestas bajas", + mid_stakes = "Apuestas medias", + high_stakes = "Apuestas altas", + card_player = "Jugador de cartas", + card_discarder = "Descartador de cartas", + nest_egg = "Ahorros", + flushed = "Colorado", + speedrunner = "Velocista", + roi = "Rendimiento de inversión", + shattered = "Destrozo", + royale = "Real", + retrograde = "Retrógrada", + _10k = "10K", + _1000k = "1000 K", + _100000k = "100 000 K", + tiny_hands = "Manitas", + big_hands = "Manotas", + you_get_what_you_get = "Te toca lo que te toca", + rule_bender = "Cambiar las reglas", + rule_breaker = "Romper las reglas", + legendary = "Legendario", + astronomy = "Astronomía", + cartomancy = "Cartomancia", + clairvoyance = "Clarividencia", + extreme_couponer = "Cupones extremos", + completionist = "Completista", + completionist_plus = "Completista+", + completionist_plus_plus = "Completista++" + }, + achievement_descriptions = { + ante_up = "Llega a la apuesta inicial 4", + ante_upper = "Llega a la apuesta inicial 8", + heads_up = "Gana una partida", + low_stakes = "Gana una partida en dificultad Pozo rojo como mínimo", + mid_stakes = "Gana una partida en dificultad Pozo negro como mínimo", + high_stakes = "Gana una partida en dificultad Pozo de oro como mínimo", + card_player = "Juega al menos 2500 cartas", + card_discarder = "Descarta al menos 2500 cartas", + nest_egg = "Consigue 400 $ o más en una sola partida", + flushed = "Juega un color con 5 cartas versátiles", + speedrunner = "Gana una partida en 12 rondas o menos", + roi = "Compra 5 vales para la apuesta inicial 4", + shattered = "Rompe 2 cartas de vidrio en una sola mano", + royale = "Juega una escalera real", + retrograde = "Lleva cualquier mano de póker a nivel 10", + _10k = "Consigue 10 000 fichas en una sola mano", + _1000k = "Consigue 1 000 000 de fichas en una sola mano", + _100000k = "Consigue 100 000 000 de fichas en una sola mano", + tiny_hands = "Quédate con 20 cartas o menos en la baraja", + big_hands = "Haz que tu baraja tenga 80 cartas o más", + you_get_what_you_get = "Gana una partida sin renovar la tienda", + rule_bender = "Completa cualquier desafío", + rule_breaker = "Completa todos los desafíos", + legendary = "Descubre un comodín legendario", + astronomy = "Descubre todas las cartas de planeta", + cartomancy = "Descubre todas las cartas de tarot", + clairvoyance = "Descubre todas las cartas espectrales", + extreme_couponer = "Descubre todos los vales", + completionist = "Descubre 100 % de tu colección", + completionist_plus = "Gana con todas las barajas en dificultad Pozo de oro", + completionist_plus_plus = "Gana un sticker de oro en cada comodín" + }, + quips = { + wq_1 = { + "¡Eres un as!" + }, + wq_2 = { + "¡Lidiaste muy bien", + "con eso!" + }, + wq_3 = { + "¡Parece que no era", + "un engaño!" + }, + wq_4 = { + "Qué lástima", + "que estas fichas", + "sean virtuales..." + }, + wq_5 = { + "¡Parece que", + "aprendiste bien!" + }, + wq_6 = { + "¡Hiciste jugadas", + "muy adelantadas!" + }, + wq_7 = { + "¡Qué bueno", + "que no aposté", + "contra ti!" + }, + lq_1 = { + "Quizá sea mejor", + "que juguemos", + "a la pesca..." + }, + lq_2 = { + "¡Perdimos", + "casi sin jugar!" + }, + lq_3 = { + "¡Llegó la hora", + "de barajar", + "y dar de nuevo!" + }, + lq_4 = { + "¡Sabes lo que dicen,", + "la casa", + "siempre gana!" + }, + lq_5 = { + "¡Parece que", + "alguien es", + "un chiste!" + }, + lq_6 = { + "¿Tú también", + "estabas mintiendo?" + }, + lq_7 = { + "¡Parece que", + "somos un chiste!" + }, + lq_8 = { + "Si tuviera manos,", + "me hubiera", + "tapado los ojos" + }, + lq_9 = { + "Soy un bufón", + "de verdad,", + "¿cuál es tu excusa?" + }, + lq_10 = { + "¡Qué desastre!" + }, + dq_1 = { + "¡Uy! Espero", + "que tengas", + "algún truco guardado", + "para el desafío final!" + } + }, + challenge_names = { + c_omelette_1 = "El omelet", + c_city_1 = "Ciudad de los 15 minutos", + c_rich_1 = "Los ricos se enriquecen", + c_knife_1 = "Al filo de la navaja", + c_xray_1 = "Visión de rayos X", + c_mad_world_1 = "Mundo loco", + c_luxury_1 = "Impuesto al lujo", + c_non_perishable_1 = "No perecedero", + c_medusa_1 = "Medusa", + c_double_nothing_1 = "Doble o nada", + c_typecast_1 = "Encasillado", + c_inflation_1 = "Inflación", + c_bram_poker_1 = "Bram Póker", + c_fragile_1 = "Frágil", + c_monolith_1 = "Monolito", + c_blast_off_1 = "Estallido", + c_five_card_1 = "Saca cinco cartas", + c_golden_needle_1 = "Aguja dorada", + c_cruelty_1 = "Crueldad", + c_jokerless_1 = "Sin comodines" + } + } +} \ No newline at end of file diff --git a/localization/es_ES.lua b/localization/es_ES.lua new file mode 100644 index 0000000..cb50c79 --- /dev/null +++ b/localization/es_ES.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Comodín", + text = { + "{C:red,s:1.1}+#1#{} multi" + } + }, + j_jolly = { + name = "Comodín contento", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + } + }, + j_zany = { + name = "Comodín chiflado", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + } + }, + j_mad = { + name = "Comodín demente", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + } + }, + j_crazy = { + name = "Comodín loco", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + } + }, + j_droll = { + name = "Comodín gracioso", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + } + }, + j_half = { + name = "Medio comodín", + text = { + "{C:red,s:1.1}+#1#{} multi", + "si la mano contiene", + "{C:attention}#2#{} o menos cartas" + } + }, + j_fortune_teller = { + name = "Adivino", + text = { + "{C:red}+#1#{} multi por cada", + "carta de {C:purple}tarot{} usada", + "{C:inactive}(Actual {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Malabarista", + text = { + "{C:attention}+#1#{} tamaño de mano" + } + }, + j_drunkard = { + name = "Borracho", + text = { + "{C:red}+#1#{} descartes" + } + }, + j_stone = { + name = "Comodín de piedra", + text = { + "Este comodín otorga {C:chips}+#1#{} fichas", + "por cada carta {C:attention}de piedra", + "en tu baraja completa", + "{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)" + } + }, + j_golden = { + name = "Comodín dorado", + text = { + "Gana {C:money}$#1#{}", + "al final de la ronda" + } + }, + j_stencil = { + name = "Plantilla de comodín", + text = { + "{X:red,C:white} X1 {} multi por cada", + "ranura de {C:attention}comodín{} vacía", + "{s:0.8}Plantilla de comodín incluida", + "{C:inactive}(Actual {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Cuatro dedos", + text = { + "Los {C:attention}colores{}", + "y las {C:attention}escaleras{} pueden", + "hacerse con {C:attention}4{} cartas" + } + }, + j_mime = { + name = "Mimo", + text = { + "Reactiva todas", + "las habilidades de las cartas", + "{C:attention}en {C:attention}la mano{}" + } + }, + j_credit_card = { + name = "Tarjeta de crédito", + text = { + "Adquiere hasta", + "{C:red}-$#1#{} de deuda" + } + }, + j_greedy_joker = { + name = "Comodín codicioso", + text = { + "{C:mult}+#1#{} multi por cada", + "carta jugada con el palo", + "de {C:diamonds}#2#{} cuando anota" + } + }, + j_lusty_joker = { + name = "Comodín lujurioso", + text = { + "{C:mult}+#1#{} multi por cada", + "carta jugada con el palo", + "de {C:hearts}#2#{} cuando anota" + } + }, + j_wrathful_joker = { + name = "Comodín irascible", + text = { + "{C:mult}+#1#{} multi por cada", + "carta jugada con el palo", + "de {C:spades}#2#{} cuando anota" + } + }, + j_gluttenous_joker = { + name = "Comodín glotón", + text = { + "{C:mult}+#1#{} multi por cada", + "carta jugada con el palo", + "de {C:clubs}#2#{} cuando anota" + } + }, + j_ceremonial = { + name = "Daga ceremonial", + text = { + "Cuando se selecciona la {C:attention}ciega{},", + "destruye al comodín de la derecha", + "y agrega para siempre el {C:attention}doble", + "de valor de venta a este {C:red}multi", + "{C:inactive}(Actual {C:mult}+#1#{C:inactive} multi)" + } + }, + j_banner = { + name = "Estandarte", + text = { + "{C:chips}+#1#{} fichas", + "por cada", + "{C:attention}descarte restante" + } + }, + j_mystic_summit = { + name = "Cumbre mística", + text = { + "{C:mult}+#1#{} multi cuando hay", + "{C:attention}+#2#{} descartes", + "restantes" + } + }, + j_marble = { + name = "Comodín de mármol", + text = { + "Agrega una carta de {C:attention}piedra{}", + "a tu baraja al", + "seleccionar la {C:attention}ciega{}" + } + }, + j_loyalty_card = { + name = "Tarjeta de fidelización", + text = { + "{X:red,C:white} X#1# {} multi cada", + "{C:attention}#2#{} manos jugadas", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "Bola 8", + text = { + "Genera una carta de {C:planet}planeta{}", + "si la mano jugada contiene", + "{C:attenetion}#1#{} o más {C:attention}8s{}", + "{C:inactive}(Debe haber espacio)" + } + }, + j_misprint = { + name = "Error de imprenta", + text = { + "" + } + }, + j_dusk = { + name = "Atardecer", + text = { + "Reactiva todas las", + "cartas de puntos en la {C:attention}última", + "{C:attention}mano{} de la ronda" + } + }, + j_raised_fist = { + name = "Puño en alto", + text = { + "Suma el {C:attention}doble{} de categoría", + "de la carta {C:attention}más baja{}", + "de la mano al multi" + } + }, + j_chaos = { + name = "Caos el payaso", + text = { + "{C:attention}#1#{} {C:green}cambios gratuitos", + "por tienda" + } + }, + j_fibonacci = { + name = "Fibonacci", + text = { + "{C:mult}+#1#{} multi por cada", + "{C:attention}as{}, {C:attention}2{}, {C:attention}3{}, {C:attention}5{}, u {C:attention}8{}", + "cuando anotan" + } + }, + j_steel_joker = { + name = "Comodín de acero", + text = { + "Este comodín otorga {X:mult,C:white} X#1# {} multi", + "por cada carta de {C:attention}acero", + "en tu baraja completa", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_scary_face = { + name = "Cara aterradora", + text = { + "Las cartas de {C:attention}figuras{}", + "otorgan {C:chips}+#1#{} fichas", + "cuando anotan" + } + }, + j_abstract = { + name = "Comodín abstracto", + text = { + "{C:mult}+#1#{} multi por cada", + "carta de {C:attention}comodín{}", + "{C:inactive}(Actual: multi {C:red}+#2#{C:inactive})" + } + }, + j_delayed_grat = { + name = "Satisfacción retrasada", + text = { + "Gana {C:money}$#1#{} por {C:attention}descarte{}", + "si no se usó ninguno", + "al final de la ronda" + } + }, + j_hack = { + name = "Comediante", + text = { + "Reactiva", + "todas las cartas", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} y {C:attention}5{} cuando se juegan" + } + }, + j_pareidolia = { + name = "Pareidolia", + text = { + "Todas las cartas", + "se consideran", + "de {C:attention}figuras{}" + } + }, + j_gros_michel = { + name = "Banano", + text = { + "{C:mult}+#1#{} multi", + "{C:green}#2# en #3#{} probabilidades", + "de que la carta se destruya", + "al final de la ronda" + } + }, + j_even_steven = { + name = "Pares", + text = { + "{C:mult}+#1#{} multi por cada", + "carta de categoría {C:attention}par{}", + "cuando anota", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "Nones", + text = { + "{C:chips}+#1#{} fichas por cada", + "carta de categoría {C:attention}impar{}", + "cuando anota", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Erudito", + text = { + "Cada {C:attention}as{} otorga", + "{C:chips}+#2#{} fichas", + "y {C:mult}+#1#{} multi", + "cuando anota" + } + }, + j_business = { + name = "Tarjeta de presentación", + text = { + "Las cartas de {C:attention}figuras{} tienen", + "{C:green}#1# en #2#{} probabilidades", + "de otorgar {C:money}$2{} cuando anotan" + } + }, + j_supernova = { + name = "Supernova", + text = { + "Suma a multi la cantidad", + "de veces que se jugó", + "la {C:attention}mano de póker{}" + } + }, + j_ride_the_bus = { + name = "Al autobús", + text = { + "{C:mult}+#1#{} multi por cada", + "mano consecutiva", + "que se juega sin usar", + "una carta de {C:attention}figura{}", + "{C:inactive}(Actual {C:mult}+#2#{C:inactive} multi)" + } + }, + j_space = { + name = "Comodín espacial", + text = { + "{C:green}#1# en #2#{} probabilidades de", + "aumento de nivel", + "de la {C:attention}mano de póker{} jugada" + } + }, + j_egg = { + name = "Huevo", + text = { + "Gana {C:money}$#1#{}", + "del {C:attention}valor de venta{}", + "al final de la ronda" + } + }, + j_burglar = { + name = "Ladrón", + text = { + "Cuando se selecciona la {C:attention}ciega{},", + "gana {C:blue}+#1#{} manos y", + "{C:attention}pierde todos los descartes" + } + }, + j_blackboard = { + name = "Pizarrón", + text = { + "{X:red,C:white} X#1# {} multi si todas", + "las cartas en tu mano", + "son {C:spades}#2#{} o {C:clubs}#3#{}" + } + }, + j_runner = { + name = "Corredor", + text = { + "{C:chips}+#2#{} fichas", + "si la mano jugada", + "contiene una {C:attention}escalera{}", + "{C:inactive}(Actual {C:chips}+#1#{C:inactive} fichas)" + } + }, + j_ice_cream = { + name = "Helado", + text = { + "{C:chips}+#1#{} fichas", + "{C:chips}-#2#{} fichas por", + "cada mano jugada" + } + }, + j_dna = { + name = "ADN", + text = { + "Si la {C:attention}primera mano{} de la ronda", + "tiene solo {C:attention}1{} carta, se agrega", + "una copia permanente a la baraja", + "y se saca a la {C:attention}mano" + } + }, + j_splash = { + name = "Salpicadura", + text = { + "Cada {C:attention}carta jugada", + "cuenta para la puntuación" + } + }, + j_blue_joker = { + name = "Comodín azul", + text = { + "{C:chips}+#1#{} fichas por cada", + "carta restante en la {C:attention}baraja", + "{C:inactive}(Actual {C:chips}+#2#{C:inactive} fichas)" + } + }, + j_sixth_sense = { + name = "Sexto sentido", + text = { + "Si la {C:attention}primera mano{} de la ronda es", + "un solo {C:attention}6{}, destrúyela y", + "genera una carta {C:spectral}espectral{}", + "{C:inactive}(Debe haber espacio)" + } + }, + j_constellation = { + name = "Constelación", + text = { + "Gana {X:mult,C:white}X#1#{} multi", + "por carta de {C:planet}planeta{} usada", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)" + } + }, + j_hiker = { + name = "Senderista", + text = { + "Cada {C:attention}carta{} jugada", + "otorga de forma permanente", + "{C:chips}+#1#{} fichas cuando anota" + } + }, + j_faceless = { + name = "Comodín sin cara", + text = { + "Gana {C:money}$#1#{} si {C:attention}#2#{}", + "o más {C:attention}cartas de figuras{}", + "se descartan", + "al mismo tiempo" + } + }, + j_green_joker = { + name = "Comodín verde", + text = { + "{C:mult}+#1#{} multi por mano jugada", + "{C:mult}-#2#{} multi por descarte", + "{C:inactive}(Actual {C:mult}+#3#{C:inactive} multi)" + } + }, + j_superposition = { + name = "Superposición", + text = { + "Si la mano de póker contiene", + "un {C:attention}as{} y una {C:attention}escalera{},", + "genera una carta de {C:tarot}tarot{}", + "{C:inactive}(Debe haber espacio)" + } + }, + j_todo_list = { + name = "Lista de tareas", + text = { + "Gana {C:money}$#1#{} si la {C:attention}mano de póker{}", + "es un {C:attention}#2#{}.", + "La mano de póker cambia", + "en cada pago" + } + }, + j_ticket = { + name = "Billete dorado", + text = { + "Las cartas de {C:attention}oro{} jugadas", + "ganan {C:money}#1#${} cuando anotan" + }, + unlock = { + "Juega una mano de 5 cartas", + "que contiene solo", + "cartas de {C:attention,E:1}oro{}" + } + }, + j_mr_bones = { + name = "Sr. Huesos", + text = { + "Evita la muerte", + "si las fichas obtenidas son", + "al menos un {C:attention}25 %", + "de lo requerido,", + "se {S:1.1,C:red,E:2}autodestruye{}" + }, + unlock = { + "Pierde {C:attention,E:1}#1#{} partidas", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Acróbata", + text = { + "{X:red,C:white} X#1# {} multi en la {C:attention}última", + "{C:attention}mano{} de la ronda" + }, + unlock = { + "Juega {C:attention,E:1}#1#{} manos", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "Tragicomedia", + text = { + "Reactiva todas", + "las cartas de {C:attention}figuras{} jugadas" + }, + unlock = { + "Juega un total de", + "{C:attention,E:1}#1#{} cartas de figuras", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "Aventurero", + text = { + "Agrega el valor de venta de", + "todos los {C:attention}comodines{} a la izquierda", + "de esta carta a multi", + "{C:inactive}(Actual {C:mult}+#1#{C:inactive} multi)" + }, + unlock = { + "Vende un total de", + "{C:attention,E:1}#1#{} cartas de comodín", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Trovador", + text = { + "Sujeta {C:attention}+#1#{} cartas en la mano,", + "{C:red}-#2#{} manos por ronda" + }, + unlock = { + "Gana {C:attention,E:1}#1#{} rondas", + "consecutivas al jugar", + "1 sola mano" + } + }, + j_certificate = { + name = "Certificado", + text = { + "Al comienzo de la ronda,", + "añade una {C:attention}carta{}", + "{C:attention}de juego{} al azar con", + "un {C:attention}sello{} al azar a tu mano" + }, + unlock = { + "Debes tener una carta", + "de oro", + "con un {C:attention,E:1}Sello de oro" + } + }, + j_smeared = { + name = "Comodín borroso", + text = { + "{C:hearts}corazones{} y {C:diamonds}diamantes", + "cuentan como un mismo palo,", + "{C:spades}picas{} y {C:clubs}tréboles", + "cuentan como un mismo palo," + }, + unlock = { + "Debes tener al menos {C:attention}#1#", + "{E:1,C:attention}#2#{} en", + "tu baraja" + } + }, + j_throwback = { + name = "Retro", + text = { + "Gana {X:mult,C:white} X#1# {} multi por cada", + "{C:attention}ciega{} omitida en esta partida", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)" + }, + unlock = { + "Continúa una partida guardada", + "del menú principal" + } + }, + j_hanging_chad = { + name = "Papel perforado", + text = { + "Reactiva la {C:attention}primera{}", + "carta usada en la puntuación" + }, + unlock = { + "Derrota a una ciega jefe", + "con 1 {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Gema en bruto", + text = { + "{C:money}$#1#{} por cada", + "carta jugada con el palo", + "de {C:diamonds}diamantes{} cuando anota" + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja" + } + }, + j_bloodstone = { + name = "Heliotropo", + text = { + "{C:green}#1# en #2#{} probabilidades de que", + "las cartas jugadas con el palo", + "de {C:hearts}corazones{} otorguen", + "multi {X:mult,C:white} X#3# {} cuando anotan," + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja" + } + }, + j_arrowhead = { + name = "Punta de flecha", + text = { + "{C:chips}+#1#{} fichas por cada", + "carta jugada con el palo", + "de {C:spades}picas{} cuando anota" + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja" + } + }, + j_onyx_agate = { + name = "Ágata ónix", + text = { + "{C:mult}+#1#{} multi por cada", + "carta jugada con el palo", + "de {C:clubs}tréboles{} cuando anota" + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "cartas con {E:1,C:attention}#2#", + "palos en tu baraja" + } + }, + j_glass = { + name = "Comodín de vidrio", + text = { + "Gana {X:mult,C:white}X#1#{} multi", + "por cada {C:attention}carta de vidrio", + "que se destruya", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)" + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} en", + "tu baraja" + } + }, + j_ring_master = { + name = "Jefe de pista", + text = { + "Las cartas de {C:attention}comodines{}, {C:tarot}tarot{}, {C:planet}planeta{}", + "y {C:spectral}espectrales{} pueden aparecen", + "varias veces" + }, + unlock = { + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Florero", + text = { + "Multi {X:mult,C:white} X#1# {} si la mano", + "jugada tiene una carta", + "de {C:diamonds}diamantes{}, {C:clubs}tréboles{},", + "{C:hearts}corazones{} y {C:spades}picas{} que anotan" + }, + unlock = { + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Plano", + text = { + "Copia la habilidad del", + "{C:attention}comodín{} de la derecha" + }, + unlock = { + "Gana una partida" + } + }, + j_wee = { + name = "Comodín pequeño", + text = { + "Este comodín otorga", + "{C:chips}+#2#{} fichas si", + "anota cada {C:attention}2{} que se juega", + "{C:inactive}(Actual {C:chips}+#1#{C:inactive} fichas)" + }, + unlock = { + "Gana una partida en {E:1,C:attention}#1#", + "rondas o menos" + } + }, + j_merry_andy = { + name = "Loco por el circo", + text = { + "{C:red}+#1#{} descartes,", + "Sujeta {C:red}#2#{} cartas en la mano" + }, + unlock = { + "Gana una partida en {E:1,C:attention}#1#", + "rondas o menos" + } + }, + j_oops = { + name = "Solo seises", + text = { + "Duplica la {C:attention}lista de", + "las {C:green,E:1,S:1.1}probabilidades", + "{C:inactive}(ejemplo: {C:green}1 de cada 3{C:inactive} -> {C:green}2 de cada 3{C:inactive})" + }, + unlock = { + "En una mano,", + "gana al menos", + "{E:1,C:attention}+#1#{} fichas" + } + }, + j_idol = { + name = "El ídolo", + text = { + "{X:mult,C:white} X#1# {} multi por cada", + "{C:attention}#2# de {V:1}#3#{}", + "cuando anota,", + "la {s:0.8}carta cambia en cada ronda" + }, + unlock = { + "En una mano,", + "gana al menos", + "{E:1,C:attention}+#1#{} fichas" + } + }, + j_seeing_double = { + name = "Visión doble", + text = { + "{X:mult,C:white} X#1# {} multi si", + "la mano jugada tiene", + "una carta de {C:clubs}tréboles{} y una carta", + "de cualquier otro {C:attention}palo que anota" + }, + unlock = { + "Juega una mano", + "que contenga", + "{E:1,C:attention}#1#" + } + }, + j_matador = { + name = "Torero", + text = { + "Gana {C:money}$#1#{} si la mano", + "jugada activa la", + "habilidad de {C:attention}ciega jefe{}" + }, + unlock = { + "Derrota a una ciega jefe", + "en {E:1,C:attention}1 mano{} sin usar", + "ningún descarte" + } + }, + j_hit_the_road = { + name = "Al camino", + text = { + "{X:mult,C:white} X#1# {} multi", + "por carta descartada", + "de {C:attention}jota{} esta ronda", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)" + }, + unlock = { + "Descarta {E:1,C:attention}5", + "{E:1,C:attention}jotas{}", + "al mismo tiempo" + } + }, + j_duo = { + name = "El dúo", + text = { + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + }, + unlock = { + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#" + } + }, + j_trio = { + name = "El trío", + text = { + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + }, + unlock = { + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#" + } + }, + j_family = { + name = "La familia", + text = { + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + }, + unlock = { + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#" + } + }, + j_order = { + name = "La orden", + text = { + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + }, + unlock = { + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "La tribu", + text = { + "{X:mult,C:white} X#1#{} multi", + "si la mano contiene", + "1 {C:attention}#2#" + }, + unlock = { + "Gana una partida", + "sin jugar", + "1 {E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "Cavendish", + text = { + "{X:mult,C:white} X#1# {} multi", + "{C:green}#2# en #3#{} probabilidades", + "de que la carta se destruya", + "al final de la ronda" + } + }, + j_card_sharp = { + name = "Fullero", + text = { + "{X:mult,C:white} X#1#{} multi si", + "se jugó la {C:attention}mano de póker{}", + "en esta ronda" + } + }, + j_red_card = { + name = "Tarjeta roja", + text = { + "Gana multi {C:red}+#1#{} cuando se omite", + "cualquier {C:attention}paquete potenciador{}", + "{C:inactive}(Actual {C:red}+#2#{C:inactive} multi)" + } + }, + j_madness = { + name = "Locura", + text = { + "Cuando se selecciona la {C:attention}ciega{},", + "gana {X:mult,C:white} X#1# {} multi", + "y {C:attention}destruye{} un comodín al azar", + "{C:inactive}(Actual {X:mult,C:white} X#2#{} multi)" + } + }, + j_square = { + name = "Comodín cuadriculado", + text = { + "{C:chips}+#2#{} fichas si", + "la mano jugada tiene", + "exactamente {C:attention}4{} cartas", + "{C:inactive}(Actual {C:chips}#1#{} fichas)" + } + }, + j_seance = { + name = "Espiritismo", + text = { + "Si {C:attention}la mano de póker{} es una", + "{C:attention}#1#{}, genera una", + "carta {C:spectral}espectral{} al azar", + "{C:inactive}(Debes tener espacio)" + } + }, + j_riff_raff = { + name = "Gentuza", + text = { + "Cuando se selecciona la {C:attention}ciega{},", + "crea {C:attention}#1# {C:attention} comodines {C:blue}comunes", + "{C:inactive}(Debes tener espacio)" + } + }, + j_stuntman = { + name = "Doble de riesgo", + text = { + "{C:chips}+#1#{} fichas,", + "{C:attention}-#2#{} tamaño de mano" + }, + unlock = { + "En una mano,", + "gana al menos", + "{E:1,C:attention}#1#{} fichas" + } + }, + j_invisible = { + name = "Comodín invisible", + text = { + "Después de {C:attention}#1#{} rondas,", + "vende esta carta para", + "{C:attention}duplicar{} un comodín aleatorio", + "{C:inactive}(actual {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Gana una partida sin", + "haber tenido más de", + "{E:1,C:attention}4 comodines{}" + } + }, + j_brainstorm = { + name = "Lluvia de ideas", + text = { + "Copia la habilidad del", + "{C:attention}comodín del extremo izquierdo" + }, + unlock = { + "Descarta una", + "{E:1,C:attention}Escalera real" + } + }, + j_satellite = { + name = "Satélite", + text = { + "Gana {C:money}$#1#{} al final de", + "la ronda por cada carta de {C:planet}planeta", + "única usada en esta partida", + "{C:inactive}(Actual {C:money}$#2#{C:inactive})" + }, + unlock = { + "Debes tener {E:1,C:money}$#1#", + "o más" + } + }, + j_shoot_the_moon = { + name = "Disparo a la luna", + text = { + "{C:mult}+#1#{} multi por", + "cada {C:attention}reina", + "en tu mano" + }, + unlock = { + "Juega todos los {E:1,C:attention}corazones", + "en tu baraja en", + "una sola ronda" + } + }, + j_drivers_license = { + name = "Permiso de conducir", + text = { + "{X:mult,C:white} X#1# {} multi si", + "tienes al menos {C:attention}16", + "cartas mejoradas", + "{C:inactive}(Actual {C:attention}#2#{C:inactive})" + }, + unlock = { + "Mejora {E:1,C:attention}#1#{} cartas", + "en tu baraja" + } + }, + j_cartomancer = { + name = "Cartomante", + text = { + "Genera una carta de {C:tarot}tarot{}", + "cuando se selecciona la {C:attention}ciega{},", + "{C:inactive}(Debe haber espacio)" + }, + unlock = { + "Descubre cada", + "carta de {E:1,C:tarot}tarot{}" + } + }, + j_astronomer = { + name = "Astrónomo", + text = { + "Todas las cartas de {C:planet}planeta{} y", + "{C:planet}paquetes celestiales{C:attention} en", + "la tienda son {C:attention}gratis" + }, + unlock = { + "Descubre todas", + "las cartas de{E:1,C:planet}planeta{}" + } + }, + j_burnt = { + name = "Comodín quemado", + text = { + "Aumenta el nivel de", + "la primera mano de póker {C:attention}descartada", + "en cada ronda" + }, + unlock = { + "Vende un total", + "de {E:1,C:attention}#1#{} cartas", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Botas", + text = { + "{C:mult}+#1#{} multi por cada", + "{C:money}$#2#{} que tengas" + }, + unlock = { + "Debes tener al menos {E:1,C:attention}#1#", + "comodines {C:dark_edition}polícromos{}" + } + }, + j_caino = { + name = "Canio", + text = { + "Gana {X:mult,C:white} X#1# {} multi", + "por cada carta", + "de {C:attention}figura{} que se destruya", + "{C:inactive}(Actual {X:mult,C:white} X#2# {C:inactive} multi)" + }, + unlock = { + "{E:1,s:1.3}¿?" + } + }, + j_triboulet = { + name = "Triboulet", + text = { + "Los {C:attention}reyes{} y las", + "{C:attention}reinas{} jugados otorgan", + "multi {X:mult,C:white} X#1# {} cuando anotan," + }, + unlock = { + "{E:1,s:1.3}¿?" + } + }, + j_yorick = { + name = "Yorick", + text = { + "{X:mult,C:white} X#1# {} multi solo", + "después de {C:attention}#2#{} descartes", + "{C:inactive}(Descartes restantes: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}¿?" + } + }, + j_chicot = { + name = "Chicot", + text = { + "Inhabilita el efecto de", + "cada {C:attention}ciega jefe" + }, + unlock = { + "{E:1,s:1.3}¿?" + } + }, + j_perkeo = { + name = "Perkeo", + text = { + "Genera una copia {C:dark_edition}negativa{} de", + "{C:attention}1{} carta {C:attention}consumible{} al azar", + "que tengas", + "al final de la {C:attention}tienda" + }, + unlock = { + "{E:1,s:1.3}¿?" + } + }, + j_sly = { + name = "Comodín artero", + text = { + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#" + } + }, + j_wily = { + name = "Comodín taimado", + text = { + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#" + } + }, + j_clever = { + name = "Comodín astuto", + text = { + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#" + } + }, + j_devious = { + name = "Comodín ladino", + text = { + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#" + } + }, + j_crafty = { + name = "Comodín mañoso", + text = { + "{C:chips}+#1#{} fichas", + "si la mano jugada contiene", + "1 {C:attention}#2#" + } + }, + j_vampire = { + name = "Vampiro", + text = { + "Gana multi {X:mult,C:white} X#1# {} por cada", + "{C:attention}carta mejorada{} jugada,", + "quita la {C:attention}mejora de carta", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_shortcut = { + name = "Atajo", + text = { + "Permite formar {C:attention}escaleras{}", + "con saltos de {C:attention}1 categoría", + "{C:inactive}(ej.: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Holograma", + text = { + "Gana multi {X:mult,C:white} X#1# {}", + "por cada {C:attention}carta de juego{}", + "agregada a la baraja", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_vagabond = { + name = "Vagabundo", + text = { + "Crea una carta de {C:purple}tarot{}", + "si se juega una mano", + "con {C:money}$#1#{} o menos" + } + }, + j_baron = { + name = "Barón", + text = { + "Cada {C:attention}rey{}", + "en tu mano", + "otorga multi {X:mult,C:white} X#1# {}" + } + }, + j_cloud_9 = { + name = "La 9º puerta", + text = { + "Gana {C:money}$#1#{} por cada", + "{C:attention}9{} en tu {C:attention}baraja completa", + "al final de la ronda", + "{C:inactive}(Actual {C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "Cohete", + text = { + "Gana {C:money}$#1#{} al final", + "de la ronda y {C:money}$#2#{} al", + "derrotar a la {C:attention}ciega jefe{}" + } + }, + j_obelisk = { + name = "Obelisco", + text = { + "Multi {X:mult,C:white} X#1# {} por cada", + "mano consecutiva jugada", + "sin jugar tu {C:attention}mano", + "de póker más jugada", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_midas_mask = { + name = "Máscara de Midas", + text = { + "Todas las cartas de {C:attention}figuras{}", + "se convierten en cartas de {C:attention}oro{}", + "cuando se juega" + } + }, + j_luchador = { + name = "Luchador", + text = { + "Vende esta carta", + "para desactivar", + "la {C:attention}ciega jefe{} actual" + } + }, + j_photograph = { + name = "Fotografía", + text = { + "{X:mult,C:white} X#1# {} multi para", + "la primera carta de {C:attention}figura{}", + "cuando anota" + } + }, + j_gift = { + name = "Carta de regalo", + text = { + "Agrega {C:money}$#1#{} del {C:attention}valor de venta", + "a cada {C:attention}comodín{} y", + "carta {C:attention}consumible{}", + "al final de la ronda" + } + }, + j_turtle_bean = { + name = "Habichuela negra", + text = { + "Sujeta {C:attention}+#1#{} cartas en la mano,", + "se reduce", + "en {C:red}#2#{} en cada ronda" + } + }, + j_erosion = { + name = "Erosión", + text = { + "Multi {C:red}+#1#{} por cada", + "carta debajo de {C:attention}#3#{}", + "en la baraja completa", + "{C:inactive}(Actual: multi {C:red}+#2#{C:inactive})" + } + }, + j_reserved_parking = { + name = "Estacionamiento reservado", + text = { + "Cada carta de {C:attention}figura{}", + "en tu mano tiene", + "una probabilidad de {C:green}#2# en #3#{}", + "de otorgar {C:money}$#1#{}" + } + }, + j_mail = { + name = "Reembolso por correo", + text = { + "Gana {C:money}$#1#{} por cada", + "{C:attention}#2#{} que descartes, la categoría", + "cambia en cada ronda" + } + }, + j_to_the_moon = { + name = "Hasta la luna", + text = { + "Gana {C:money}$#1#{} extra", + "de {C:attention}interés{} por cada {C:money}$5{}", + "que tengas al final de la ronda" + } + }, + j_hallucination = { + name = "Alucinación", + text = { + "{C:green}#1# en #2#{} probabilidades de crear", + "una carta de {C:tarot}tarot{} cuando se abre", + "cualquier {C:attention}paquete potenciador{}", + "{C:inactive}(Debe haber espacio)" + } + }, + j_lucky_cat = { + name = "Gato de la suerte", + text = { + "Gana multi {X:mult,C:white} X#1# {} cada", + "vez que una carta {C:attention}de la suerte{}", + "se activa {C:green}con éxito{}", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_baseball = { + name = "Carta de béisbol", + text = { + "Cada comodín {C:green}inusual{}", + "otorga multi {X:mult,C:white} X#1# {}" + } + }, + j_bull = { + name = "Toro", + text = { + "{C:chips}+#1#{} fichas por cada", + "{C:money}dólar{} que tengas", + "{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)" + } + }, + j_diet_cola = { + name = "Cola sin azucar", + text = { + "Vende esta carta", + "para crear 1 {C:attention}#1#", + "gratis" + } + }, + j_trading = { + name = "Carta de colección", + text = { + "Si el {C:attention}primer descarte{} de la ronda", + "tiene solo {C:attention}1{} carta, destrúyela", + "y gana {C:money}$#1#" + } + }, + j_flash = { + name = "Carta sorpresa", + text = { + "Multi {C:mult}+#1#{} por cada", + "{C:attention}cambio{} en la tienda", + "{C:inactive}(Actual multi {C:mult}+#2# {C:inactive})" + } + }, + j_popcorn = { + name = "Palomitas de maíz", + text = { + "Multi {C:mult}+#1#{}", + "Multi {C:mult}-#2#{} por cada", + "ronda jugada" + } + }, + j_trousers = { + name = "Pantalones de repuesto", + text = { + "Gana multi {C:mult}+#1#{} si", + "la mano jugada contiene", + "1 {C:attention}#2#", + "{C:inactive}(Actual: multi {C:red}+#3#{C:inactive})" + } + }, + j_ancient = { + name = "Comodín antiguo", + text = { + "Cada carta jugada con el palo", + "{V:1}#2#{} otorga", + "multi {X:mult,C:white} X#1# {} cuando anota,", + "{s:0.8}el palo cambia al final de la ronda" + } + }, + j_ramen = { + name = "Ramen", + text = { + "Multi {X:mult,C:white} X#1# {},", + "pierde multi {X:mult,C:white} X#2# {}", + "por cada {C:attention}carta{} descartada" + } + }, + j_walkie_talkie = { + name = "Walkie-talkie", + text = { + "Cada {C:attention}10{} o {C:attention}4{}", + "jugado otorga {C:chips}+#1#{} fichas", + "y multi {C:mult}+#2#{} cuando anota" + } + }, + j_selzer = { + name = "Agua con gas", + text = { + "Reactiva todas", + "las cartas jugadas", + "por las próximas {C:attention}#1#{} manos" + } + }, + j_castle = { + name = "Castillo", + text = { + "Este comodín gana {C:chips}+#1#{} fichas", + "por carta {V:1}#2#{} descartada,", + "el palo cambia en cada ronda", + "{C:inactive}(Actual {C:chips}+#3#{C:inactive} fichas)" + } + }, + j_smiley = { + name = "Cara sonriente", + text = { + "Las cartas de {C:attention}figuras{} jugadas", + "otorgan multi {C:mult}+#1#{}", + "cuando anotan" + } + }, + j_campfire = { + name = "Fogata", + text = { + "Este comodín gana multi {X:mult,C:white}X#1#{}", + "por cada carta {C:attention}vendida{}, se restablece", + "cuando se derrota a la {C:attention}ciega jefe{}", + "{C:inactive}(Actual multi {X:mult,C:white} X#2# {C:inactive})" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Excedente", + text = { + "{C:attention}+1{} ranura de carta", + "disponible en la tienda" + } + }, + v_clearance_sale = { + name = "Rebajas", + text = { + "Todas las cartas y paquetes", + "en la tienda a {C:attention}#1# %{} menos" + } + }, + v_tarot_merchant = { + name = "Mercader de tarot", + text = { + "Las cartas de {C:tarot}tarot{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda" + } + }, + v_planet_merchant = { + name = "Mercader de planetas", + text = { + "Las cartas de {C:planet}planeta{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda" + } + }, + v_hone = { + name = "Perfección", + text = { + "Las cartas {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} y", + "{C:dark_edition}polícromas{}", + "aparecen {C:attention}#1#X{} más veces" + } + }, + v_reroll_surplus = { + name = "Excedente de renovaciones", + text = { + "Las renovaciones cuestan", + "{C:money}$#1#{} menos" + } + }, + v_crystal_ball = { + name = "Bola de cristal", + text = { + "{C:attention}+1{} ranura de consumible" + } + }, + v_telescope = { + name = "Telescopio", + text = { + "Los {C:attention}paquetes celestiales{} siempre", + "contienen la carta de {C:planet}planeta{}", + "para tu {C:attention}mano de póker", + "más jugada" + } + }, + v_grabber = { + name = "Acaparador", + text = { + "Gana para siempre", + "{C:blue}+#1#{} mano(s)", + "por ronda" + } + }, + v_wasteful = { + name = "Derrochador", + text = { + "Gana para siempre", + "{C:red}+#1#{} descarte(s)", + "por ronda" + } + }, + v_seed_money = { + name = "Capital inicial", + text = { + "Aumenta el límite", + "de los intereses ganados", + "por ronda a {C:money}$#1#{}" + } + }, + v_blank = { + name = "En blanco", + text = { + "{C:inactive}¿No hace nada?" + } + }, + v_magic_trick = { + name = "Truco de magia", + text = { + "Las {C:attention}cartas de juego{} pueden", + "comprarse", + "en la {C:attention}tienda" + } + }, + v_hieroglyph = { + name = "Jeroglífico", + text = { + "{C:attention}-#1#{} apuesta inicial", + "Mano {C:blue}-#1#{}", + "por ronda", + "{C:attention}-#1#{} apuesta inicial" + } + }, + v_directors_cut = { + name = "Versión del director", + text = { + "Renueva la ciega jefe", + "{C:attention}1{} vez por apuesta inicial,", + "{C:money}$#1#{} por cambio" + } + }, + v_pattern = { + name = "Patrón", + text = { + "Genera tu carta", + "{C:attention}consumible{} más usada", + "{E:1,V:1}#1#", + "{C:inactive}(Debe haber espacio)" + } + }, + v_overstock_plus = { + name = "Excedente plus", + text = { + "{C:attention}+1{} ranura de carta", + "disponible en la tienda" + }, + unlock = { + "Gasta un total", + "de {C:money}$#1#{} en la tienda", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "Liquidación", + text = { + "Todas las cartas y paquetes", + "en la tienda a {C:attention}#1# %{} menos" + }, + unlock = { + "Canjea al menos", + "{C:attention}#1# cartas de{C:voucher} vale{}", + "en una partida" + } + }, + v_tarot_tycoon = { + name = "Magnate del tarot", + text = { + "Las cartas de {C:tarot}tarot{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda" + }, + unlock = { + "Compra un total", + "de {C:attention}#1# cartas de{C:tarot} tarot{}", + "en la tienda", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Magnate de planetas", + text = { + "Las cartas de {C:planet}planeta{} aparecen", + "{C:attention}#1# X{} veces más seguido", + "en la tienda" + }, + unlock = { + "Compra un total", + "{C:attention}#1# cartas de {C:planet}planeta{}", + "en la tienda", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Brillo", + text = { + "Las cartas {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} y", + "{C:dark_edition}polícromas{}", + "aparecen {C:attention}#1#X{} más veces" + }, + unlock = { + "Debes tener al menos {C:attention}#1#", + "cartas de {C:attention}comodín{}", + "que sean {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} o", + "{C:dark_edition}polícromas{}" + } + }, + v_reroll_glut = { + name = "Gula de renovaciones", + text = { + "Las renovaciones cuestan", + "{C:money}$#1#{} menos" + }, + unlock = { + "Renueva la tienda", + "un total de {C:attention}#1#{} veces", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Orbe profético", + text = { + "Las cartas {C:spectral}espectrales{} pueden", + "aparecer en cualquier", + "{C:attention}paquete arcano" + }, + unlock = { + "Usa un total de {C:attention}#1#", + "cartas de {C:tarot}tarot{} de cualquier", + "{C:tarot}paquete arcano", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Observatorio", + text = { + "Las cartas de {C:planet}planeta{} en", + "el área de {C:attention}consumibles{} otorgan", + "{X:red,C:white} X#1# {} multi para su", + "{C:attention}mano de póker específica" + }, + unlock = { + "Usa un total de {C:attention}#1#", + "cartas de {C:planet}planeta{} de cualquier", + "{C:planet}paquete celestial", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Pinza para nachos", + text = { + "Gana para siempre", + "{C:blue}+#1#{} mano(s)", + "por ronda" + }, + unlock = { + "Juega un total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Reciclomancia", + text = { + "Gana para siempre", + "{C:red}+#1#{} descarte(s)", + "por ronda" + }, + unlock = { + "Descarta un total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Árbol del dinero", + text = { + "Aumenta el límite", + "de los intereses ganados", + "por ronda a {C:money}$#1#{}" + }, + unlock = { + "Maximiza la ganancia", + "de interés por ronda durante", + "{C:attention}#1# rondas{} consecutivas", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Antimateria", + text = { + "{C:dark_edition}+1{} ranura de comodín" + }, + unlock = { + "Canjea {C:voucher}En blanco{}", + "un total de {C:attention}#1#{} veces", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Ilusión", + text = { + "Las {C:attention}cartas de juego{} en la tienda", + "puede que tengan una {C:enhanced}mejora{},", + "una {C:dark_edition}edición{}, y/o un {C:dark_edition}sello" + }, + unlock = { + "Compra un total", + "de {C:attention}#1#{} cartas de juego", + "en la tienda", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Petroglifo", + unlock = { + "Llega a la apuesta inicial", + "nivel {E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{} apuesta inicial", + "{C:red}-#1#{} descartes", + "por ronda" + } + }, + v_retcon = { + name = "Retrocontinuidad", + text = { + "Renueva la ciega jefe", + "de forma {C:attention}ilimitada{},", + "{C:money}$#1#{} por cambio" + }, + unlock = { + "Descubre", + "{C:attention}#1#{} ciegas" + } + }, + v_tesselation = { + name = "Teselado", + text = { + "Genera tu carta", + "de {C:attention}comodín{} más usada", + "{E:1,V:1}#1#", + "{C:inactive}(Debe haber espacio)" + }, + unlock = { + "Compra la edición {C:dark_edition}polícroma", + "de tu {C:attention}comodín", + "más usado", + "en la tienda" + } + }, + v_palette = { + name = "Paleta", + text = { + "Sujeta {C:attention}+#1#{} cartas", + "en tu mano", + "{C:attention}+#1#{} tamaño de mano" + }, + unlock = { + "Reduce el tamaño", + "de mano a {C:attention}#1#{} cartas" + } + }, + v_paint_brush = { + name = "Brocha", + text = { + "{C:attention}+#1#{} tamaño de mano" + } + } + }, + Tarot = { + c_fool = { + name = "El loco", + text = { + "Genera la última", + "carta de {C:tarot}tarot{} o de {C:planet}planeta{}", + "usada en esta partida", + "a excepción de {s:0.8,C:tarot}El loco{s:0.8}" + } + }, + c_magician = { + name = "El mago", + text = { + "Mejora {C:attention}#1#{} cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "La sacerdotisa", + text = { + "Genera hasta {C:attention}#1#", + "cartas de {C:planet}planeta{} al azar", + "{C:inactive}(Debe haber espacio)" + } + }, + c_empress = { + name = "La emperatriz", + text = { + "Mejora {C:attention}#1# cartas", + "seleccionadas a", + "{C:attention}#2#s" + } + }, + c_emperor = { + name = "El emperador", + text = { + "Genera hasta {C:attention}#1#", + "cartas de {C:tarot}tarot{} al azar", + "{C:inactive}(Debe haber espacio)" + } + }, + c_heirophant = { + name = "El hierofante", + text = { + "Mejora {C:attention}#1# cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_lovers = { + name = "Los enamorados", + text = { + "Mejora {C:attention}#1#{} cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "El carro", + text = { + "Mejora {C:attention}#1#{} cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_justice = { + name = "La justicia", + text = { + "Mejora {C:attention}#1#{} cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "El ermitaño", + text = { + "Duplica el dinero", + "{C:inactive}(Máx. de {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "La rueda de la fortuna", + text = { + "{C:green}#1# en #2#{} probabilidades de agregar", + "que sean {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} o", + "{C:dark_edition}polícromas{}", + "a un {C:attention}comodín al azar" + } + }, + c_strength = { + name = "La fuerza", + text = { + "Aumenta la categoría de", + "hasta {C:attention}#1#{} cartas", + "elegidas en {C:attention}1" + } + }, + c_hanged_man = { + name = "El colgado", + text = { + "Destruye hasta", + "{C:attention}#1#{} cartas seleccionadas" + } + }, + c_death = { + name = "La muerte", + text = { + "Selecciona {C:attention}#1#{} cartas,", + "convierte la carta {C:attention}izquierda{}", + "en la carta {C:attention}derecha{}", + "{C:inactive}(Arrastra para acomodar)" + } + }, + c_temperance = { + name = "La templanza", + text = { + "Otorga el valor total de venta", + "de todos los comodines", + "actuales {C:inactive}(Máx. de {C:money}#1# ${C:inactive})", + "{C:inactive}(Actual {C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "El diablo", + text = { + "Mejora {C:attention}#1#{} cartas", + "seleccionadas a", + "{C:attention}#2#" + } + }, + c_tower = { + name = "La torre", + text = { + "Mejora {C:attention}#1#{} carta", + "seleccionada a", + "{C:attention}#2#" + } + }, + c_star = { + name = "La estrella", + text = { + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}" + } + }, + c_moon = { + name = "La luna", + text = { + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}" + } + }, + c_sun = { + name = "El sol", + text = { + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}" + } + }, + c_judgement = { + name = "El juicio", + text = { + "Genera una carta", + "de {C:attention}comodín{} al azar", + "{C:inactive}(Debe haber espacio)" + } + }, + c_world = { + name = "El mundo", + text = { + "Convierte hasta", + "{C:attention}#1#{} cartas seleccionadas", + "en {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Mercurio", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_venus = { + name = "Venus", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_earth = { + name = "Tierra", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_mars = { + name = "Marte", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_jupiter = { + name = "Júpiter", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_saturn = { + name = "Saturno", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_uranus = { + name = "Urano", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_neptune = { + name = "Neptuno", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_pluto = { + name = "Plutón", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_ceres = { + name = "Ceres", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_planet_x = { + name = "Planeta X", + text = { + "{S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){} Aumento de nivel", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "{C:chips}+#4#{} fichas" + } + }, + c_eris = { + name = "Eris", + text = { + "Aumento de nivel {S:0.8}({S:0.8,V:1}nvl. #1#{S:0.8}){}", + "{C:attention}#2#", + "{C:mult}+#3#{} multi y", + "y {C:chips}+#4#{} fichas" + } + } + }, + Spectral = { + c_familiar = { + name = "Familiar", + text = { + "Destruye {C:attention}1{} carta", + "de tu mano, agrega", + "{C:attention}#1#{} {C:attention}cartas {C:attention}de figura mejoradas", + "al azar a tu mano" + } + }, + c_grim = { + name = "Lúgubre", + text = { + "Destruye {C:attention}1{} carta", + "de tu mano al azar,", + "{C:attention}#1#{} {C:attention}ases mejorados", + "a tu mano al azar" + } + }, + c_incantation = { + name = "Encantamiento", + text = { + "Destruye {C:attention}1{} carta", + "de tu mano al azar, agrega {C:attention}#1#", + "{C:attention}cartas{} {C:attention}numeradas mejoradas", + "a tu mano al azar" + } + }, + c_talisman = { + name = "Talismán", + text = { + "Agrega {C:attention}Sello de oro{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar" + } + }, + c_aura = { + name = "Aura", + text = { + "Agrega efectos de {C:dark_edition}laminado{}, {C:dark_edition}holográfico{}", + "o {C:dark_edition}polícromo{} a", + "{C:attention}1{} carta de tu mano seleccionada" + } + }, + c_wraith = { + name = "Espectro", + text = { + "Genera una carta", + "de {C:attention}comodín{} {C:red}rara{} al azar,", + "deja el dinero en {C:money}$0" + } + }, + c_sigil = { + name = "Sigilo", + text = { + "Convierte todas las cartas", + "de tu mano en un solo", + "{C:attention}palo al azar" + } + }, + c_ouija = { + name = "Ouija", + text = { + "Convierte todas las cartas", + "de tu mano en una sola", + "{C:attention}categoría al azar", + "{C:red}-1{} de tamaño de mano" + } + }, + c_ectoplasm = { + name = "Ectoplasma", + text = { + "Agrega {C:dark_edition}negativo{}", + "a un {C:attention}comodín al azar", + "{C:red}-1{} de tamaño de mano" + } + }, + c_immolate = { + name = "Inmolación", + text = { + "Destruye {C:attention}#1#{} cartas", + "de tu mano al azar,", + "gana {C:money}$#2#" + } + }, + c_soul = { + name = "El alma", + text = { + "Crea un", + "comodín {C:legendary,E:1}legendario{}", + "{C:inactive}(Debe haber espacio)" + } + }, + c_black_hole = { + name = "Agujero negro", + text = { + "Aumenta todas", + "las {C:legendary,E:1}manos de póker", + "{C:attention}1{} nivel" + } + }, + c_ankh = { + name = "Anj", + text = { + "Crea una copia de un", + "{C:attention}comodín{} aleatorio,", + "destruye los demás" + } + }, + c_deja_vu = { + name = "Déjà vu", + text = { + "Agrega un {C:red}sello rojo{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar" + } + }, + c_hex = { + name = "Maleficio", + text = { + "Agrega {C:dark_edition}policromía{} a un", + "{C:attention}comodín{} aleatorio,", + "destruye los demás" + } + }, + c_trance = { + name = "Trance", + text = { + "Agrega un {C:blue}sello azul{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar" + } + }, + c_medium = { + name = "Médium", + text = { + "Agrega un {C:purple}sello morado{}", + "a {C:attention}1{} carta seleccionada", + "de tu mano al azar" + } + }, + c_cryptid = { + name = "Críptido", + text = { + "Crea {C:attention}#1#{} copias de", + "{C:attention}1{} carta seleccionada", + "en tu mano" + } + } + }, + Edition = { + e_base = { + name = "Base", + text = { + "Sin efectos adicionales" + } + }, + e_foil = { + name = "Laminada", + text = { + "{C:chips}+#1#{} fichas" + } + }, + e_holo = { + name = "Holográfica", + text = { + "Multi {C:mult}+#1#{}" + } + }, + e_polychrome = { + name = "Polícroma", + text = { + "Multi {X:mult,C:white} X#1#{}" + } + }, + e_negative = { + name = "Negativa", + text = { + "{C:dark_edition}+#1#{} ranura de comodín" + } + }, + e_negative_consumable = { + name = "Negativa", + text = { + "{C:dark_edition}+#1#{} ranura de consumible" + } + } + }, + Enhanced = { + m_bonus = { + name = "Carta adicional", + text = {} + }, + m_mult = { + name = "Carta multi", + text = { + "{C:mult}+#1#{} multi" + } + }, + m_wild = { + name = "Carta versátil", + text = { + "Puede usarse", + "como cualquier palo" + } + }, + m_glass = { + name = "Carta de vidrio", + text = { + "{X:mult,C:white} X#1# {} multi", + "{C:green}#2# en #3#{} probabilidades", + "de destruir la carta" + } + }, + m_steel = { + name = "Carta de acero", + text = { + "{X:mult,C:white} X#1# {} multi", + "mientras esta carta", + "esté en tu mano" + } + }, + m_stone = { + name = "Carta de piedra", + text = { + "{C:chips}+#1#{} fichas", + "sin categoría ni palo" + } + }, + m_gold = { + name = "Carta de oro", + text = { + "{C:money}$#1#{} si esta", + "carta está en tu mano", + "al final de la ronda" + } + }, + m_lucky = { + name = "Carta de la suerte", + text = { + "{C:green}#1# en #3#{} probabilidades", + "de {C:mult}+#2#{} multi", + "{C:green}#1# en #5#{} probabilidades", + "de ganar {C:money}$#4#" + } + } + }, + Stake = { + stake_white = { + name = "Pozo blanco", + text = { + "Dificultad básica" + } + }, + stake_red = { + name = "Pozo rojo", + text = { + "La {C:attention}ciega pequeña{} no otorga", + "ninguna recompensa monetaria", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_green = { + name = "Pozo verde", + text = { + "Escalas de puntos requeridas más rápidas", + "para cada {C:attention}apuesta inicial", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_blue = { + name = "Pozo azul", + text = { + "{C:red}-1{} descarte", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_black = { + name = "Pozo negro", + text = { + "La tienda puede tener comodines {C:attention}eternos{}", + "{C:inactive,s:0.8}{No se pueden vender ni destruir}", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_purple = { + name = "Pozo morado", + text = { + "Escalas de puntos requeridas más rápidas", + "para cada {C:attention}apuesta inicial", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_orange = { + name = "Pozo naranja", + text = { + "Los {C:attention}paquetes potenciadores{} cuestan", + "{C:money}$1{} más por apuesta inicial", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + }, + stake_gold = { + name = "Pozo de oro", + text = { + "Sujeta {C:red}-1{} cartas en la mano", + "{s:0.8}Se aplica a todos los pozos anteriores" + } + } + }, + Tag = { + tag_uncommon = { + name = "Etiqueta inusual", + text = { + "La tienda tiene un", + "comodín {C:green}inusual" + } + }, + tag_rare = { + name = "Etiqueta rara", + text = { + "La tienda tiene un", + "comodín {C:red}raro" + } + }, + tag_negative = { + name = "Etiqueta negativa", + text = { + "La tienda tiene un", + "comodín {C:dark_edition}negativo" + } + }, + tag_foil = { + name = "Etiqueta laminada", + text = { + "La tienda tiene un", + "comodín {C:dark_edition}laminado" + } + }, + tag_holo = { + name = "Etiqueta holográfica", + text = { + "La tienda tiene un", + "comodín {C:dark_edition}holográfico" + } + }, + tag_polychrome = { + name = "Etiqueta polícroma", + text = { + "La tienda tiene un", + "comodín {C:dark_edition}polícromo" + } + }, + tag_investment = { + name = "Etiqueta de inversión", + text = { + "Después de derrotar", + "a la ciega jefe,", + "gana {C:money}$#1#" + } + }, + tag_voucher = { + name = "Etiqueta de vale", + text = { + "Agrega un {C:voucher}vale", + "en la siguiente tienda" + } + }, + tag_boss = { + name = "Etiqueta de jefe", + text = { + "Renueva", + "la {C:attention}ciega jefe" + } + }, + tag_standard = { + name = "Etiqueta estándar", + text = { + "Otorga gratis un", + "{C:attention}paquete estándar mega" + } + }, + tag_charm = { + name = "Etiqueta encantada", + text = { + "Otorga gratis un", + "{C:tarot}paquete arcano mega" + } + }, + tag_meteor = { + name = "Etiqueta de meteoro", + text = { + "Otorga gratis un", + "{C:planet}paquete celestial mega" + } + }, + tag_buffoon = { + name = "Etiqueta de bufón", + text = { + "Otorga gratis un", + "{C:attention}paquete de bufón" + } + }, + tag_handy = { + name = "Etiqueta manual", + text = { + "Otorga {C:money}$#1#{} por cada", + "{C:blue}mano{} en esta partida", + "{C:inactive}(Otorgará {C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "Etiqueta de basura", + text = { + "Otorga {C:money}$#1#{} por cada", + "{C:red}descarte{} sin usar en esta partida", + "{C:inactive}(Otorgará {C:money}$#2#{C:inactive})" + } + }, + tag_coupon = { + name = "Etiqueta de cupón", + text = { + "Las cartas iniciales", + "y los paquetes potenciadores", + "en la próxima tienda son gratis" + } + }, + tag_double = { + name = "Etiqueta doble", + text = { + "Otorga una copia de", + "la {C:attention}etiqueta{} siguiente seleccionada", + "{s:0.8}a excepción de {s:0.8,C:attention}Etiqueta doble" + } + }, + tag_juggle = { + name = "Etiqueta de malabar", + text = { + "Sujeta {C:attention}+#1#{} cartas en", + "la mano en la ronda siguiente" + } + }, + tag_d_six = { + name = "Etiqueta D6", + text = { + "Las renovaciones en la tienda siguiente", + "comienzan en {C:money}$0" + } + }, + tag_top_up = { + name = "Etiqueta de recarga", + text = { + "Genera hasta {C:attention}#1#", + "comodines {C:blue}comunes{}", + "{C:inactive}(Debe haber espacio)" + } + }, + tag_skip = { + name = "Etiqueta de velocidad", + text = { + "Otorga {C:money}$#1#{} por ciega", + "omitida en esta partida", + "{C:inactive}(Otorgará {C:money}$#2#{C:inactive})" + } + }, + tag_orbital = { + name = "Etiqueta orbital", + text = { + "Aumenta {C:attention}#1#", + "en {C:attention}#2# niveles" + } + }, + tag_economy = { + name = "Etiqueta de economía", + text = { + "Duplica el dinero", + "{C:inactive}(Máx. de {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "Etiqueta etérea", + text = { + "Otorga gratis", + "un {C:planet}paquete espectral" + } + } + }, + Blind = { + bl_small = { + name = "Ciega pequeña", + text = {} + }, + bl_big = { + name = "Ciega grande", + text = {} + }, + bl_hook = { + name = "El garfio", + text = { + "Descarta 2 cartas al azar", + "por cada mano jugada" + } + }, + bl_wall = { + name = "El muro", + text = { + "Ciega extra grande" + } + }, + bl_wheel = { + name = "La rueda", + text = { + " en 7 cartas se saca", + "boca abajo" + } + }, + bl_arm = { + name = "El brazo", + text = { + "Disminuye el nivel", + "de la mano de póker jugada" + } + }, + bl_psychic = { + name = "El psíquico", + text = { + "Debes jugar 5 cartas" + } + }, + bl_goad = { + name = "La provocación", + text = { + "Todas las picas", + "se debilitan" + } + }, + bl_water = { + name = "El agua", + text = { + "Comienza con", + "0 descartes" + } + }, + bl_eye = { + name = "El ojo", + text = { + "Los tipos de manos", + "no se repiten en esta ronda" + } + }, + bl_mouth = { + name = "La boca", + text = { + "Juega 1 solo tipo", + "de mano en esta ronda" + } + }, + bl_plant = { + name = "La planta", + text = { + "Todas las cartas de figuras", + "se debilitan" + } + }, + bl_needle = { + name = "La aguja", + text = { + "Juega 1 solo tipo de mano" + } + }, + bl_head = { + name = "La cabeza", + text = { + "Todos los corazones", + "se debilitan" + } + }, + bl_tooth = { + name = "El diente", + text = { + "Pierde $1", + "por carta jugada" + } + }, + bl_final_leaf = { + name = "Hoja verde", + text = { + "Todas las cartas se debilitan", + "hasta que se venda 1 comodín" + } + }, + bl_final_vessel = { + name = "Contenedor violeta", + text = { + "Ciega muy grande" + } + }, + bl_ox = { + name = "El buey", + text = { + "Si se juega 1 #1#,", + "deja el dinero en $0" + } + }, + bl_house = { + name = "La casa", + text = { + "La primera mano", + "se saca boca abajo" + } + }, + bl_club = { + name = "El garrote", + text = { + "Todos los tréboles", + "se debilitan" + } + }, + bl_fish = { + name = "El pez", + text = { + "Saca las cartas boca abajo", + "tras cada mano jugada" + } + }, + bl_window = { + name = "La ventana", + text = { + "Todos los diamantes", + "se debilitan" + } + }, + bl_manacle = { + name = "El grillete", + text = { + "-1 de tamaño de mano" + } + }, + bl_serpent = { + name = "La serpiente", + text = { + "Después de jugar o descartar,", + "siempre saca 3 cartas" + } + }, + bl_pillar = { + name = "El pilar", + text = { + "Las cartas que se jugaron antes", + "en esta apuesta inicial se debilitan" + } + }, + bl_flint = { + name = "El pedernal", + text = { + "Las fichas base y el multi", + "se dividen a la mitad" + } + }, + bl_mark = { + name = "La marca", + text = { + "Todas las cartas de figuras", + "boca abajo" + } + }, + bl_final_acorn = { + name = "Bellota ambarina", + text = { + "Voltea y mezcla", + "todos los comodines" + } + }, + bl_final_heart = { + name = "Corazón carmesí", + text = { + "Se inhabilita un comodín", + "al azar en cada mano" + } + }, + bl_final_bell = { + name = "Campana cerúlea", + text = { + "Fuerza 1 carta", + "a que se seleccione siempre" + } + } + }, + Back = { + b_red = { + name = "Baraja roja", + text = { + "{C:red}+#1#{} descarte", + "en cada ronda" + } + }, + b_blue = { + name = "Baraja azul", + text = { + "{C:blue}+#1#{} mano", + "en cada ronda" + } + }, + b_yellow = { + name = "Baraja amarilla", + text = { + "Comienza con", + "{C:money}$#1# extra" + } + }, + b_green = { + name = "Baraja verde", + text = { + "Al final de cada ronda:", + "{C:money}$#1#{s:0.85} por {C:blue}mano restante", + "{C:money}$#2#{s:0.85} por {C:red}descarte restante", + "No ganas {C:attention}interés" + } + }, + b_black = { + name = "Baraja negra", + text = { + "{C:attention}+#1#{} ranura(s) de comodín", + "", + "{C:blue}-#2#{} mano", + "en cada ronda" + } + }, + b_magic = { + name = "Baraja mágica", + text = { + "Comienza la partida", + "con el vale {C:tarot,T:v_crystal_ball}#1#{}", + "y {C:attention}2{} copias", + "de {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Baraja nébula", + text = { + "Comienza la partida", + "con el vale {C:planet,T:v_telescope}#1#{}", + "", + "{C:red}#2#{} ranura de consumible" + } + }, + b_metal = { + name = "Baraja de metal", + text = { + "Comienza la partida con {C:attention}#1#", + "cartas mejoradas", + "a cartas de {C:attention}acero" + } + }, + b_abandoned = { + name = "Baraja abandonada", + text = { + "Comienza la partida sin", + "ninguna carta de {C:attention}figura", + "en tu baraja" + } + }, + b_checkered = { + name = "Baraja cuadriculada", + text = { + "Comienza la partida con", + "{C:attention}26{C:spades} picas{} y", + "{C:attention}26{C:hearts} corazones{} en la baraja" + } + }, + b_rocky = { + name = "Baraja rocosa", + text = { + "Comienza la partida con {C:attention}#1#", + "cartas de {C:attention}piedra extra" + } + }, + b_braided = { + name = "Baraja trenzada", + text = { + "La primera mano jugada", + "aumenta a {C:attention}nvl. 3" + } + }, + b_anaglyph = { + name = "Baraja anaglifo", + text = { + "Después de derrotar a cada", + "{C:attention}ciega jefe{}, gana 1", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "Baraja plasmática", + text = { + "Equilibra las {C:blue}fichas{} y", + "el {C:red}multi{} cuando calcula", + "los puntos de cada mano jugada", + "{C:red}X#1#{} tamaño de ciegas base" + } + }, + b_erratic = { + name = "Baraja errática", + text = { + "Todas las {C:attention}categorías{} y", + "los {C:attention}palos{} en la baraja", + "se aleatorizan" + } + }, + b_challenge = { + name = "Baraja desafío", + text = { + "" + } + }, + b_ghost = { + name = "Baraja fantasma", + text = { + "Las cartas {C:spectral}espectrales{} pueden", + "aparecer en la tienda,", + "comienza con una carta {C:spectral,T:c_hex}maleficio{}" + } + }, + b_zodiac = { + name = "Baraja del zodiaco", + text = { + "Comienza la partida con", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "y {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Baraja pintada", + text = { + "{C:attention}+#1#{} tamaño de mano", + "{C:red}#2#{} ranura de comodín" + } + } + }, + Other = { + gold_seal = { + name = "Sello de oro", + text = { + "Gana {C:money}$3{} cuando", + "se juega esta carta", + "y anota" + } + }, + white_sticker = { + name = "Sticker blanco", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}blanco{}" + } + }, + red_sticker = { + name = "Sticker rojo", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}rojo{}" + } + }, + green_sticker = { + name = "Sticker verde", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}verde{}" + } + }, + blue_sticker = { + name = "Sticker azul", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}azul{}" + } + }, + black_sticker = { + name = "Sticker negro", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}negro{}" + } + }, + purple_sticker = { + name = "Sticker morado", + text = { + "Usaste este comodín", + "Para ganar en la dificultad {C:attention}Pozo", + "{C:attention}negro{}" + } + }, + orange_sticker = { + name = "Sticker naranja", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}naranja{}" + } + }, + gold_sticker = { + name = "Sticker de oro", + text = { + "Usaste este comodín", + "para ganar en la dificultad {C:attention}Pozo", + "{C:attention}de oro{}" + } + }, + playing_card = { + text = { + "{C:light_black}#1# de {V:1}#2#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} fichas" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1# fichas{} extra" + } + }, + locked = { + name = "Bloqueada", + text = {} + }, + debuffed_default = { + name = "Debilitada", + text = { + "Todas las habilidades", + "están inhabilitadas" + } + }, + debuffed_playing_card = { + name = "Debilitada", + text = { + "No gana ninguna ficha", + "y todas las habilidades", + "están inhabilitadas" + } + }, + demo_locked = { + name = "Bloqueada", + text = { + "No está disponible", + "en esta demo" + } + }, + demo_shop_locked = { + name = "Bloqueada", + text = { + "Carta de la colección personal", + "de {C:attention}Jimbo, ", + "disponible en la versión", + "completa de {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Bloqueada", + text = { + "Trabajo", + "en curso" + } + }, + deck_locked_win = { + name = "Bloqueada", + text = { + "Gana una partida", + "con {C:attention}#1#{}", + "en cualquier dificultad" + } + }, + deck_locked_discover = { + name = "Bloqueada", + text = { + "Descubre al menos", + "{C:attention}#1#{} objetos de", + "tu colección" + } + }, + deck_locked_stake = { + name = "Bloqueada", + text = { + "Gana una partida con cualquier", + "baraja en al menos", + "dificultad {V:1}#1#{}" + } + }, + joker_locked_legendary = { + name = "Bloqueada", + text = { + "Encuentra este comodín", + "en la carta {C:spectral}El alma{}" + } + }, + undiscovered_joker = { + name = "No se descubrió", + text = { + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_tarot = { + name = "No se descubrió", + text = { + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_planet = { + name = "No se descubrió", + text = { + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_spectral = { + name = "No se descubrió", + text = { + "Compra o usa", + "esta carta", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_voucher = { + name = "No se descubrió", + text = { + "Canjea este vale", + "en una partida", + "sin códigos para saber", + "lo que hace" + } + }, + undiscovered_booster = { + name = "No se descubrió", + text = { + "Abre este paquete", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_edition = { + name = "No se descubrió", + text = { + "Encuentra esta edición", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + undiscovered_tag = { + name = "No se descubrió", + text = { + "Usa esta etiqueta", + "en una partida sin códigos", + "para saber lo que hace" + } + }, + p_arcana_normal = { + name = "Paquete arcano", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{} para", + "usar de inmediato" + } + }, + p_arcana_jumbo = { + name = "Paquete arcano jumbo", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{}", + "para usar de inmediato" + } + }, + p_arcana_mega = { + name = "Paquete arcano mega", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:tarot}tarot{}", + "para usar de inmediato" + } + }, + p_celestial_normal = { + name = "Paquete celestial", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato" + } + }, + p_celestial_jumbo = { + name = "Paquete celestial jumbo", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato" + } + }, + p_celestial_mega = { + name = "Paquete celestial mega", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:planet}planeta{}", + "para usar de inmediato" + } + }, + p_spectral_normal = { + name = "Paquete espectral", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato" + } + }, + p_spectral_jumbo = { + name = "Paquete espectral jumbo", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato" + } + }, + p_spectral_mega = { + name = "Paquete espectral mega", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:spectral}espectrales{}", + "para usar de inmediato" + } + }, + p_standard_normal = { + name = "Paquete estándar", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja" + } + }, + p_standard_jumbo = { + name = "Paquete estándar jumbo", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja" + } + }, + p_standard_mega = { + name = "Paquete estándar mega", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas {C:attention}de juego{}", + "para agregar a tu baraja" + } + }, + p_buffoon_normal = { + name = "Paquete de bufón", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}" + } + }, + p_buffoon_jumbo = { + name = "Paquete de bufón jumbo", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}" + } + }, + p_buffoon_mega = { + name = "Paquete de bufón mega", + text = { + "Elige {C:attention}#1#{} de hasta", + "{C:attention}#2# cartas de {C:joker}comodín{}" + } + }, + pinned_left = { + name = "Fijada", + text = { + "Este comodín se queda", + "fijado a la posición", + "del extremo izquierdo" + } + }, + red_seal = { + name = "Sello rojo", + text = { + "Reactiva esta", + "carta {C:attention}1{} vez" + } + }, + blue_seal = { + name = "Sello azul", + text = { + "Genera una carta de {C:planet}planeta{}", + "si se {C:attention}sujeta{} en", + "la mano al final de la ronda" + } + }, + purple_seal = { + name = "Sello morado", + text = { + "Crea una carta de {C:tarot}tarot{}", + "cuando {C:attention}se descarta", + "{C:inactive}(Debe haber espacio)" + } + }, + eternal = { + name = "Eterno", + text = { + "No se puede vender", + "ni destruir" + } + }, + challenge_locked = { + name = "Bloqueada", + text = { + "Gana una partida con al menos", + "#1# barajas diferentes para desbloquear", + "Modo desafío", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Pica", + Hearts = "Corazón", + Clubs = "Trébol", + Diamonds = "Diamante" + }, + suits_plural = { + Spades = "Picas", + Hearts = "Corazones", + Clubs = "Tréboles", + Diamonds = "Diamantes" + }, + blind_states = { + Select = "Seleccionar", + Skipped = "Omitida", + Current = "Actual", + Defeated = "Derrotada", + Upcoming = "Siguiente", + Selected = "Seleccionada" + }, + ranks = { + Ace = "As", + King = "Rey", + Queen = "Reina", + Jack = "Jota", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Mejor mano", + furthest_round = "Ronda más alta", + furthest_ante = "Apuesta inicial más alta", + most_money = "Más dinero", + boss_streak = "Más jefes seguidos", + collection = "Colección", + win_streak = "Mejor racha de victorias", + current_streak = "", + poker_hand = "Mano más jugada" + }, + poker_hands = { + ['Flush House'] = "Full de color", + ['Five of a Kind'] = "Repóquer", + ['Royal Flush'] = "Escalera real", + ['Straight Flush'] = "Escalera de color", + ['Four of a Kind'] = "Póker", + ['Full House'] = "Full", + ['Flush'] = "Color", + ['Straight'] = "Escalera", + ['Three of a Kind'] = "Trío", + ['Two Pair'] = "Dobles parejas", + ['Pair'] = "Pareja", + ['High Card'] = "Carta más alta", + ['Flush Five'] = "Cinco de color" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "Una trío y una pareja con", + "todas las cartas del mismo palo" + }, + ['Five of a Kind'] = { + "5 cartas de la misma categoría" + }, + ['Royal Flush'] = { + "5 cartas seguidas {valores consecutivos} con", + "todas las cartas del mismo palo" + }, + ['Straight Flush'] = { + "5 cartas seguidas {valores consecutivos} con", + "todas las cartas del mismo palo" + }, + ['Four of a Kind'] = { + "4 cartas de la misma categoría. Pueden", + "jugarse con 1 otra carta que no cuenta" + }, + ['Full House'] = { + "Una trío y una pareja" + }, + ['Flush'] = { + "5 cartas del mismo palo" + }, + ['Straight'] = { + "5 cartas seguidas {valores consecutivos}" + }, + ['Three of a Kind'] = { + "3 cartas de la misma categoría. Pueden", + "jugarse con otras 2 cartas que no cuentan" + }, + ['Two Pair'] = { + "2 pares de cartas de categorías diferentes, pueden", + "jugarse con 1 otra carta que no cuenta" + }, + ['Pair'] = { + "2 cartas de la misma categoría. Pueden", + "jugarse con otras 3 cartas que no cuentan" + }, + ['High Card'] = { + "Si la mano jugada no es ninguna de las anteriores,", + "sólo cuenta la carta más alta" + }, + ['Flush Five'] = { + "5 cartas de la misma categoría y palo" + } + }, + labels = { + common = "Común", + uncommon = "Inusual", + rare = "Rara", + legendary = "Legendaria", + tarot = "Tarot", + planet = "Planeta", + pluto_planet = "Planeta enano", + voucher = "Vale", + foil = "Laminada", + holographic = "Holográfica", + polychrome = "Polícroma", + negative = "Negativa", + gold_seal = "Sello de oro", + locked = "Bloqueada", + blue_seal = "Sello azul", + red_seal = "Sello rojo", + purple_seal = "Sello morado", + eternal = "Eterno", + pinned_left = "Fijada" + }, + dictionary = { + b_sell = "VENDER", + b_use = "USAR", + b_select = "SELECCIONAR", + b_buy = "COMPRAR", + b_redeem = "CANJEAR", + b_open = "ABRIR", + b_and_use = "Y USAR", + b_next_round_1 = "Ronda", + b_next_round_2 = "siguiente", + b_play_hand = "Jugar mano", + b_discard = "Descartar", + b_sort_hand = "Ordenar mano", + b_run_info_1 = "Partida", + b_run_info_2 = "Info", + b_options = "Opciones", + b_reroll_boss = "Renovar jefe", + b_skip_blind = "Omitir ciega", + b_skip_reward = "Omitir ciega", + b_skip = "Omitir", + b_start_new_run = "Partida nueva", + b_main_menu = "Menú principal", + b_collection = "Colección", + b_seed = "Código", + b_copy_seed = "Copiar código", + b_credits = "Créditos", + b_stats = "Estadísticas", + b_settings = "Configuración", + b_set_game = "Juego", + b_set_video = "Video", + b_set_graphics = "Gráficos", + b_set_audio = "Audio", + b_set_gamespeed = "Velocidad del juego", + b_set_play_discard_pos = "Posición del botón jugar/descartar", + b_set_screenshake = "Temblor de pantalla", + b_set_crash_reports = "Informes de errores", + b_set_monitor = "Configuración de pantalla", + b_set_windowmode = "Modo ventana", + b_set_apply = "Aplicar", + b_set_master_vol = "Volumen principal", + b_set_music_vol = "Volumen música", + b_set_game_vol = "Volumen juego", + b_set_shadows = "Sombras", + b_set_pixel_smoothing = "Suavizado de pixeles", + b_set_CRT = "CRT", + b_set_CRT_bloom = "Dispersión CRT", + b_stat_jokers = "Comodines", + b_stat_consumables = "Consumibles", + b_stat_tarots = "Tarot", + b_stat_planets = "Planetas", + b_stat_spectrals = "Espectrales", + b_stat_vouchers = "Vales", + b_next = "Siguiente", + b_endless = "Modo infinito", + b_wishlist = "Lista de deseos en Steam", + b_playbalatro = "Visita playbalatro.com", + b_remaining = "Restantes", + b_full_deck = "Baraja completa", + b_poker_hands = "Manos de póker", + b_blinds = "Ciegas", + b_vouchers = "Vales", + b_stake = "Pozo", + b_jokers = "Comodines", + b_tarot_cards = "Cartas de tarot", + b_planet_cards = "Cartas de planeta", + b_spectral_cards = "Cartas espectrales", + b_enhanced_cards = "Cartas mejoradas", + b_editions = "Ediciones", + b_booster_packs = "Paquetes potenciadores", + b_tags = "Etiquetas", + b_decks = "Barajas", + b_continue = "Continuar", + b_back = "Atrás", + b_music = "Música", + b_sounds = "Sonidos", + b_imagery = "Imágenes", + b_new_run = "Partida nueva", + b_challenges = "Desafíos", + b_current_profile = "Perfil actual", + b_load_profile = "Cargar perfil", + b_create_profile = "Crear perfil", + b_delete_profile = "Eliminar perfil", + b_reset_profile = "Restablecer perfil", + b_rules = "Reglas", + b_restrictions = "Restricciones", + b_deck = "Baraja", + b_play_cap = "JUGAR", + b_options_cap = "OPCIONES", + b_collection_cap = "COLECCIÓN", + b_quit_cap = "SALIR", + b_cash_out = "Cobrar", + k_unknown = "¿?", + k_compatible = "compatible", + k_incompatible = "incompatible", + k_round = "Ronda", + k_ante = "Apuesta inicial", + k_seed = "Código", + k_reroll = "Cambiar", + k_mult = "Multi", + k_rank = "Categoría", + k_suit = "Palo", + k_stake = "Pozo", + k_common = "Común", + k_uncommon = "Inusual", + k_rare = "Rara", + k_legendary = "Legendaria", + k_debuffed = "Debilitada", + k_locked = "Bloqueada", + k_undisovered = "No se descubrió", + k_joker = "Comodín", + k_voucher = "Vale", + k_tarot = "Tarot", + k_planet = "Planeta", + k_dwarf_planet = "Planeta enano", + k_planet_q = "¿Planeta?", + k_spectral = "Espectral", + k_booster = "Potenciador", + k_edition = "Edición", + k_hud_hands = "Manos", + k_hud_discards = "Descartes", + k_lower_score = "puntuación", + k_arcana_pack = "Paquete arcano", + k_celestial_pack = "Paquete celestial", + k_spectral_pack = "Paquete espectral", + k_standard_pack = "Paquete estándar", + k_buffoon_pack = "Paquete de bufón", + k_enter_text = "Escribir texto", + k_defeated_by = "Derrotada por", + k_level_prefix = "Nvl.", + k_also_applied = "También se aplica", + k_base_cards = "Cartas base", + k_effective = "Total efectivo", + k_aces = "Ases", + k_face_cards = "Cartas de figuras", + k_numbered_cards = "Cartas numeradas", + k_cap_consumables = "CONSUMIBLES", + k_page = "Página", + k_ante_cap = "APUESTA INICIAL", + k_base_cap = "BASE", + k_jokers_cap = "COMODINES", + k_vouchers_cap = "VALES", + k_x_base = "Base X", + k_not_discovered = "No se descubrió", + k_unlocked_ex = "¡Desbloqueado!", + k_challenge_mode = "Modo desafío", + k_daily_run = "Partida diaria", + k_profile = "Perfil", + k_wins = "Victorias", + k_empty_caps = "VACÍA", + k_collection = "Colección", + k_stake_level = "Nivel de pozo", + k_none = "Ninguno", + k_game_modifiers = "Modificadores de juego", + k_custom_rules = "Reglas personalizadas", + k_banned_cards = "Cartas prohibidas", + k_banned_tags = "Etiquetas prohibidas", + k_other = "Otros", + k_money = "Dinero", + k_best_hand = "Mejor mano", + k_seeded_run = "Partida con códigos", + k_enter_seed = "Escribir código", + k_lvl = "Nvl.", + k_skipped_cap = "OMITIDA", + k_no_reward = "Sin recompensa", + k_reward = "Recompensa", + k_nope_ex = "¡No!", + k_or = "o", + k_balanced = "Equilibrado", + ph_improve_run = "¡Mejora tu partida!", + ph_sneak_peek = "Vistazo", + ph_deck_preview_stones = "Piedras", + ph_deck_preview_effective = "Total efectivo debido a comodines, ciegas y mejoras de cartas", + ph_blind_score_at_least = "Anota al menos", + ph_blind_reward = "Recompensa:", + ph_up_ante_1 = "Aumentar apuesta inicial", + ph_up_ante_2 = "Aumentar todas las ciegas", + ph_up_ante_3 = "Actualizar las ciegas", + ph_stat_joker = "Total de rondas completadas con esta carta", + ph_stat_consumable = "Cantidad de veces que se usó la carta", + ph_stat_voucher = "Cantidad de veces que se canjeó el vale", + ph_demo_thanks_1 = "Gracias por jugar la", + ph_demo_thanks_2 = "DEMO DE BALATRO", + ph_game_over = "FIN DE PARTIDA", + ph_vouchers_redeemed = "Vales canjeados en esta partida", + ph_no_vouchers = "No se canjearon vales en esta partida", + ph_defeat_this_blind_1 = "Derrota a esta ciega", + ph_defeat_this_blind_2 = "para descubrirla", + ph_click_confirm = "Haz clic de nuevo para confirmar", + ph_choose_blind_1 = "Elige tu", + ph_choose_blind_2 = "próxima ciega", + ph_mr_bones = "Te salvó el Sr. Huesos", + ph_score_at_least = "Anota al menos", + ph_all_poker_hand = "Todas las manos de póker", + ph_1_level = "+1 nivel", + ph_boss_disabled = "¡Jefe inhabilitado!", + ph_most_played = "(most played hand)", + ml_demo_thanks_message = { + "Considera la posibilidad de agregar Balatro", + "a tu lista de deseos en Steam y suscríbete", + "al boletín de noticias en playbalatro.com" + }, + ml_eternal = { + "Eterno", + "No se puede vender", + "ni destruir" + }, + ml_gold_seal_desc = { + "Sello de oro", + "regresa a tu mano", + "cuando se juega" + }, + ml_crash_report_info = { + "Los informes de errores se enviarán al desarrollador", + "para reducir los problemas en el futuro.", + "No se enviará información de identificación personal." + }, + ml_play_discard_pos_opt = { + "Descartar/jugar", + "Jugar/descartar" + }, + ml_windowmode_opt = { + "Modo ventana", + "Pantalla completa", + "Sin bordes" + }, + ml_vsync_opt = { + "Con VSync", + "Sin VSync" + }, + ml_shadow_opt = { + "Sí", + "No" + }, + ml_smoothing_opt = { + "No", + "Sí" + }, + ml_bloom_opt = { + "No", + "Sí" + }, + ml_card_stats = { + "Carta", + "Estadísticas" + }, + ml_paste_seed = { + "Pegar", + "código" + }, + ml_disabled_seed = { + "Todos los desbloqueos", + "y descubrimientos inhabilitados" + }, + ['$'] = "$", + k_redeemed_ex = "¡Canjeada!", + k_duplicated_ex = "¡Duplicada!", + k_no_room_ex = "¡No hay espacio!", + k_no_space_ex = "¡Sin espacio!", + k_no_other_jokers = "¡No hay más comodines!", + k_plus_tarot = "+1 Tarot", + k_plus_stone = "+1 Piedras", + k_plus_planet = "+1 Planeta", + k_plus_spectral = "+1 Espectral", + k_active_ex = "¡Activada!", + k_level_up_ex = "¡Aumento de nivel!", + k_upgrade_ex = "¡Mejora!", + k_again_ex = "¡Otra vez!", + k_val_up = "¡Aumento de valor!", + k_reset = "Restablecer", + k_extinct_ex = "¡Se extinguió!", + k_safe_ex = "¡A salvo!", + k_saved_ex = "¡Te salvaste!", + k_swapped_ex = "¡Se cambió!", + k_copied_ex = "¡Se copió!", + k_melted_ex = "¡Se derritió!", + b_copy = "Copiar", + b_high_contrast_cards = "Cartas de alto contraste", + b_set_rumble = "Vibración del control", + b_seals = "Sellos", + b_new_challenge = "Iniciar desafío nuevo", + b_unlock_all = "Desbloquear todo", + k_active = "activa", + k_deck = "Baraja", + k_progress = "Progreso", + k_challenges = "Desafíos", + k_joker_stickers = "Stickers de comodín", + k_deck_stake_wins = "Victorias de pozo de baraja", + k_enter_name = "Escribir nombre", + k_gold = "Oro", + k_card_stats = "Estadísticas de cartas", + k_view = "Ver", + k_all_hands = "Todas las manos", + k_high_score_ex = "¡Récord!", + k_demo_version_ex = "¡Versión demo!", + k_playing_as = "Jugando como", + k_choose = "Elegir", + k_achievements_disabled = "Logros desactivados", + ph_no_boss_active = "no hay jefe activo", + ph_you_win = "¡GANASTE!", + ph_you_win_demo = "¡GANASTE EN LA DEMO!", + ph_defeat_the_boss = "Derrota a la ciega jefe", + ph_score_furthest_ante = "Apuesta inicial", + ph_score_furthest_round = "Ronda", + ph_score_hand = "Mejor mano", + ph_score_poker_hand = "Mano más jugada", + ph_score_new_collection = "Descubrimientos", + ph_score_cards_played = "Cartas jugadas", + ph_score_cards_discarded = "Cartas descartadas", + ph_score_times_rerolled = "Renovaciones", + ph_score_cards_purchased = "Cartas compradas", + ml_edition_seal_enhancement_explanation = { + "Las cartas de juego pueden tener 1", + "mejora, edición y sello cada una" + }, + ml_unlock_all_explanation = { + "¡ATENCIÓN! Si desbloqueas la colección completa,", + "se desactivarán los logros para este perfil" + }, + k_plus_joker = "+1 comodín", + k_eaten_ex = "¡Se devoró!", + k_eroded_ex = "¡Se erosionó!", + k_achievement = "Logro", + ph_unscored_hand = "La mano no anotará", + ph_alert_debuff_confirm = "Vuelve a pulsar «Jugar» para confirmar", + k_drank_ex = "¡Consumido!", + k_trophy = "Trofeo", + k_trophies_disabled = "Trofeos deshabilitados", + ml_unlock_all_trophies = { + "¡ATENCIÓN! Si desbloqueas la colección completa,", + "¡se deshabilitarán todos los trofeos para este perfil!" + }, + k_poker_hand = "mano de póker", + ph_4_7_of_clubs = "cuatro 7 de tréboles" + }, + v_dictionary = { + a_xmult = "X#1# multi", + a_mult = "+#1# Multi.", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# de tamaño de mano", + a_hands = "+#1# Manos", + a_sold_tally = "#1#/#2# vendidas", + a_remaining = "#1# restantes", + ante_x_voucher = "VALE DE APUESTA INICIAL #1#", + loyalty_active = "¡Se activó!", + loyalty_inactive = "#1# restantes", + deck_preview_wheel_singular = "Las cantidades pueden ser inferiores debido a la carta #1# que se saca boca abajo", + deck_preview_wheel_plural = "Los números pueden ser inferiores debido a las cartas #1# que se sacan boca abajo", + challenges_completed = "Completaste #1#/#2# desafíos", + interest = "#1# de interés por cada $#2# (#3# máx.)", + remaining_hand_money = "Manos restantes ($#1# cada una)", + remaining_discard_money = "Descartes restantes ($#1# cada uno)", + ml_foil_desc = { + "Laminada", + "+#1# fichas" + }, + ml_holo_desc = { + "Holográfica", + "+#1# multi" + }, + ml_polychrome_desc = { + "Polícroma", + "X#1# multi" + }, + ml_negative_desc = { + "Negativa", + "+#1# ranura de comodín" + }, + a_mult_minus = "Multi -#1#", + a_handsize_minus = "Tamaño de mano -#1#", + ml_negative_consumable_desc = { + "Negativa", + "+#1# ranura de consumibles" + }, + a_xmult_minus = "-X#1# multi", + unlocked = "#1#/#2# desbloqueados", + completed = "#1#/#2# completados" + }, + v_text = { + ch_m_dollars = { + "Empieza con {C:money}$#1#" + }, + ch_m_hands = { + "{C:blue}#1#{} manos por ronda" + }, + ch_m_discards = { + "{C:red}#1#{} descartes por ronda" + }, + ch_m_reroll_cost = { + "{C:money}$#1#{} costo base de camboi" + }, + ch_m_joker_slots = { + "{C:attention}#1# ranuras de {}comodín" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} ranuras de consumibles" + }, + ch_m_hand_size = { + "Sujeta {C:attention}#1#{} cartas en la mano" + }, + ch_m_none = { + "{C:inactive}Ninguna" + }, + ch_c_no_reward = { + "Ninguna {C:attention}ciega{} otorga dinero de recompensa" + }, + ch_c_no_reward_specific = { + "Las ciegas {C:attention}#1#{} no otorgan dinero de recompensa" + }, + ch_c_no_extra_hand_money = { + "Las {C:blue}manos{} extra ya no ganan dinero" + }, + ch_c_no_interest = { + "No ganas {C:attention}interés{} al final de la ronda" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}¡Desafío diario!" + }, + ch_c_set_seed = { + "1 intento con código establecido: {C:inactive}{Hidden}" + }, + ch_c_chips_dollar_cap = { + "Las {C:blue}fichas{} no pueden superar {C:money}$" + }, + ch_c_none = { + "{C:inactive}Ninguna" + }, + ch_c_inflation = { + "Eleva los precios en {C:money}$1{} para cada compra de forma permanente" + }, + ch_c_discard_cost = { + "Cada descarte cuesta {C:money}$#1#{}" + }, + ch_c_all_eternal = { + "Todos los comodines en la tienda son {C:eternal}eternos{}" + }, + ch_c_flipped_cards = { + "{C:green}1 en #1#{} cartas se sacan boca abajo" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Tienes {C:red}-1{} cartas en la mano por cada {C:money}$#1#{} que tengas" + }, + ch_c_no_shop_jokers = { + "Los comodines ya no aparecen en la {C:attention}tienda" + }, + ch_c_debuff_played_cards = { + "Todas las cartas {C:attention}jugadas{} se {C:attention}debilitan{} tras anotar" + }, + ch_c_set_eternal_ante = { + "Al derrotar al jefe ante {C:attention}#1#{}, todos los comodines se vuelven {C:attention}eternos" + }, + ch_c_set_joker_slots_ante = { + "Al derrotar al jefe ante {C:attention}#1#{}, las ranuras de comodín pasan a {C:attention}0" + } + }, + tutorial = { + sb_1 = { + "¡Hola! Me llamo", + "{C:attention}Jimbo{}, te enseñaré", + "a jugar." + }, + sb_2 = { + "Tu meta es ganar", + "{C:blue}fichas{} para derrotar", + "a la {C:attention}ciega enemiga" + }, + sb_3 = { + "Esta es una {C:blue}ciega pequeña{},", + "solo debes ganar", + "{C:attention}300 fichas{} para derrotarla." + }, + sb_4 = { + "Elige la {C:blue}ciega pequeña", + "para comenzar la ronda." + }, + bb_1 = { + "Cuando elijas la {C:attention}ciega grande,", + "ganarás un poco de dinero." + }, + bb_2 = { + "Puedes {C:attention}omitirla", + "para conseguir una {C:attention}etiqueta{}. Cada", + "{C:attention}etiqueta{} tiene un efecto único." + }, + bb_3 = { + "No dejes de vigilar", + "a la {C:attention}ciega jefe{}. Tiene", + "una habilidad para la cual", + "deberás prepararte." + }, + bb_4 = { + "Si la derrotas, aumenta", + "la {C:attention}apuesta inicial{} y todas", + "las{C:attention}ciegas{} se vuelven más difíciles." + }, + bb_5 = { + "Derrota a la {C:attention}apuesta inicial{} #1# para ganar.", + "¡Elige tu camino!" + }, + fh_1 = { + "Ganas fichas por jugar", + "{C:attention}manos de póker." + }, + fh_2 = { + "Cada {C:attention}mano de póker{} gana", + "una cantidad base de {C:blue}fichas", + "multiplicadas por algunos {C:red}multi." + }, + fh_3 = { + "Consulta tus {C:attention}manos de póker", + "en el área de {C:attention}info{}", + "junto con otros datos", + "sobre la partida actual." + }, + fh_4 = { + "Las cartas también ganan", + "algunas {C:blue}fichas{},", + "coloca el cursor sobre ellas para ver." + }, + fh_5 = { + "Ahora selecciona hasta", + "{C:attention}5{} cartas para jugar", + "y pulsa {C:blue}«Jugar mano»." + }, + fh_6 = { + "También puedes {C:red}«Descartar»{} hasta", + "{C:attention}5{} cartas seleccionadas", + "para tratar de conseguir", + "manos mejores. ¡Inténtalo!" + }, + fh_7 = { + "¡Cuidado! Solo tienes una", + "cantidad limitada de {C:blue}manos", + "y {C:red}descartes{} por ronda." + }, + fh_8 = { + "Gana {C:attention}300 fichas{} antes de", + "que se terminen las {C:blue}manos", + "para ganar esta ronda.", + "¡Buena suerte!" + }, + sh_1 = { + "Cuando consigas más cartas,", + "recuerda que puedes reordenarlas.", + "Los {C:attention}comodines{} se activan", + "de izquierda a derecha" + }, + sh_2 = { + "Asegúrate de", + "{C:attention}USAR{} los consumibles." + }, + sh_3 = { + "Selecciona hasta {C:attention}2{} cartas", + "de tu mano y pulsa", + "{C:attention}«USAR»{} en la carta de {C:tarot}tarot{}", + "para mejorarlas." + }, + s_1 = { + "¡Bien hecho! Ahora que tienes", + "{E:1}un montonazo{} de {C:money}dinero{},", + "puedes comprar cartas", + "nuevas en la {C:attention}tienda." + }, + s_2 = { + "Intenta comprar a este", + "apuesto pícaro." + }, + s_3 = { + "Este es uno de los {C:attention}#1#", + "{C:attention}comodines{} que puedes agregar", + "a tu partida. Cada {C:attention}comodín", + "hace algo diferente." + }, + s_4 = { + "Este agrega {C:red}+4 multi{}", + "a cada mano jugada." + }, + s_5 = { + "Elige bien, solo puedes", + "tener {C:attention}5 comodines{}", + "al mismo tiempo." + }, + s_6 = { + "Ahora compra la otra", + "carta en la {C:attention}tienda." + }, + s_7 = { + "Esta carta de {C:tarot}tarot{} es", + "{C:attention}consumible{}.", + "Sirve para mejorar tus cartas", + "de juego. Cuídala bien." + }, + s_8 = { + "Puedes tener hasta", + "{C:attention}2 consumibles{}", + "al mismo tiempo." + }, + s_9 = { + "Si ahorras lo suficiente,", + "puedes comprar un {C:attention}vale{}.", + "Los {C:attention}vales{} mejoran", + "la partida de forma pasiva." + }, + s_10 = { + "Los {C:attention}vales{} se reabastecen", + "después de que derrotas", + "a la {C:attention}ciega jefe{}." + }, + s_11 = { + "No dejes de dar un vistazo", + "a los {C:booster}paquetes potenciadores{}", + "en cada tienda. ¡Están", + "llenos de sorpresas!" + }, + s_12 = { + "Pasemos", + "a la {C:attention}ronda siguiente{}." + } + }, + achievement_names = { + ante_up = "¡Aumento de apuesta inicial!", + ante_upper = "¡Aumentador de apuesta inicial!", + heads_up = "Aviso", + low_stakes = "Apuestas bajas", + mid_stakes = "Apuestas medias", + high_stakes = "Apuestas altas", + card_player = "Jugador de cartas", + card_discarder = "Descartador de cartas", + nest_egg = "Ahorros", + flushed = "Colorado", + speedrunner = "Velocista", + roi = "Rendimiento de inversión", + shattered = "Destrozo", + royale = "Real", + retrograde = "Retrógrada", + _10k = "10K", + _1000k = "1000 K", + _100000k = "100 000 K", + tiny_hands = "Manitas", + big_hands = "Manotas", + you_get_what_you_get = "Te toca lo que te toca", + rule_bender = "Cambiar las reglas", + rule_breaker = "Romper las reglas", + legendary = "Legendario", + astronomy = "Astronomía", + cartomancy = "Cartomancia", + clairvoyance = "Clarividencia", + extreme_couponer = "Cupones extremos", + completionist = "Completista", + completionist_plus = "Completista+", + completionist_plus_plus = "Completista++" + }, + achievement_descriptions = { + ante_up = "Llega a la apuesta inicial 4", + ante_upper = "Llega a la apuesta inicial 8", + heads_up = "Gana una partida", + low_stakes = "Gana una partida en dificultad Pozo rojo como mínimo", + mid_stakes = "Gana una partida en dificultad Pozo negro como mínimo", + high_stakes = "Gana una partida en dificultad Pozo de oro como mínimo", + card_player = "Juega al menos 2500 cartas", + card_discarder = "Descarta al menos 2500 cartas", + nest_egg = "Consigue $400 o más en una sola partida", + flushed = "Juega un color con 5 cartas versátiles", + speedrunner = "Gana una partida en 12 rondas o menos", + roi = "Compra 5 vales para la apuesta inicial 4", + shattered = "Rompe 2 cartas de vidrio en una sola mano", + royale = "Juega una escalera real", + retrograde = "Lleva cualquier mano de póker a nivel 10", + _10k = "Consigue 10 000 fichas en una sola mano", + _1000k = "Consigue 1 000 000 de fichas en una sola mano", + _100000k = "Consigue 100 000 000 de fichas en una sola mano", + tiny_hands = "Quédate con 20 cartas o menos en la baraja", + big_hands = "Haz que tu baraja tenga 80 cartas o más", + you_get_what_you_get = "Gana una partida sin renovar la tienda", + rule_bender = "Completa cualquier desafío", + rule_breaker = "Completa todos los desafíos", + legendary = "Descubre un comodín legendario", + astronomy = "Descubre todas las cartas de planeta", + cartomancy = "Descubre todas las cartas de tarot", + clairvoyance = "Descubre todas las cartas espectrales", + extreme_couponer = "Descubre todos los vales", + completionist = "Descubre 100 % de tu colección", + completionist_plus = "Gana con todas las barajas en dificultad Pozo de oro", + completionist_plus_plus = "Gana un sticker de oro en cada comodín" + }, + quips = { + wq_1 = { + "¡Eres un as!" + }, + wq_2 = { + "¡Lidiaste muy bien", + "con eso!" + }, + wq_3 = { + "¡Parece que no era", + "un engaño!" + }, + wq_4 = { + "Qué lástima", + "que estas fichas", + "sean virtuales..." + }, + wq_5 = { + "¡Parece que", + "aprendiste bien!" + }, + wq_6 = { + "¡Hiciste jugadas", + "muy adelantadas!" + }, + wq_7 = { + "¡Qué bueno", + "que no aposté", + "contra ti!" + }, + lq_1 = { + "Quizá sea mejor", + "que juguemos", + "a la pesca..." + }, + lq_2 = { + "¡Perdimos", + "casi sin jugar!" + }, + lq_3 = { + "¡Llegó la hora", + "de barajar", + "y empezar de nuevo!" + }, + lq_4 = { + "¡Sabes lo que dicen,", + "la casa", + "siempre gana!" + }, + lq_5 = { + "¡Parece que", + "alguien es", + "un chiste!" + }, + lq_6 = { + "¿Tú también", + "estabas mintiendo?" + }, + lq_7 = { + "¡Parece que", + "somos un chiste!" + }, + lq_8 = { + "Si tuviera manos,", + "me hubiera", + "tapado los ojos" + }, + lq_9 = { + "Soy un bufón", + "de verdad,", + "¿cuál es tu excusa?" + }, + lq_10 = { + "¡Qué desastre!" + }, + dq_1 = { + "¡Uy! Espero", + "que tengas", + "algún truco guardado", + "para el desafío final!" + } + }, + challenge_names = { + c_omelette_1 = "La tortilla", + c_city_1 = "Ciudad de 15 minutos", + c_rich_1 = "Asquerosamente rico", + c_knife_1 = "Al filo de la navaja", + c_xray_1 = "Visión de rayos X", + c_mad_world_1 = "Mundo loco", + c_luxury_1 = "Impuesto de lujo", + c_non_perishable_1 = "No perecedero", + c_medusa_1 = "Medusa", + c_double_nothing_1 = "Doble o nada", + c_typecast_1 = "Encasillado", + c_inflation_1 = "Inflación", + c_bram_poker_1 = "Bram Poker", + c_fragile_1 = "Frágil", + c_monolith_1 = "Monolito", + c_blast_off_1 = "Explosión", + c_five_card_1 = "Retirada de cinco cartas", + c_golden_needle_1 = "Aguja dorada", + c_cruelty_1 = "Crueldad", + c_jokerless_1 = "Sin comodines" + } + } +} \ No newline at end of file diff --git a/localization/fr.lua b/localization/fr.lua new file mode 100644 index 0000000..18fbce8 --- /dev/null +++ b/localization/fr.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Joker", + text = { + "Multi. {C:red,s:1.1}+#1#{}" + } + }, + j_jolly = { + name = "Joker joyeux", + text = { + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "une {C:attention}#2#" + } + }, + j_zany = { + name = "Joker blagueur", + text = { + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "un {C:attention}#2#" + } + }, + j_mad = { + name = "Joker fêlé", + text = { + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "un {C:attention}#2#" + } + }, + j_crazy = { + name = "Joker déjanté", + text = { + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "une {C:attention}#2#" + } + }, + j_droll = { + name = "Joker plaisantin", + text = { + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "une {C:attention}#2#" + } + }, + j_half = { + name = "Demi-joker", + text = { + "Multi. {C:red}+#1#{} si", + "la main jouée contient", + "{C:attention}#2#{} ou moins de cartes" + } + }, + j_fortune_teller = { + name = "Voyant", + text = { + "Multi. {C:red}+#1#{} par", + "carte de {C:purple}Tarot{} utilisée", + "{C:inactive}(Actuellement {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Jongleur", + text = { + "{C:attention}+#1#{} à la taille de la main" + } + }, + j_drunkard = { + name = "Ivrogne", + text = { + "{C:red}+#1#{} défausse" + } + }, + j_stone = { + name = "Joker de pierre", + text = { + "Ce Joker gagne {C:chips}+#1#{} Jetons", + "pour chaque {C:attention}carte Pierre", + "dans votre jeu complet", + "{C:inactive}(Actuellement {C:chips}+#2#{C:inactive} Jetons)" + } + }, + j_golden = { + name = "Joker d'or", + text = { + "Gagnez {C:money}#1# ${} à", + "la fin de la manche" + } + }, + j_stencil = { + name = "Pochoir de joker", + text = { + "Multi. {X:red,C:white}x#1#{} pour chaque", + "emplacement {C:attention}Joker{} vide", + "{s:0.8}Pochoir de Joker inclus", + "{C:inactive}(Actuellement {X:red,C:white} x#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Quatre doigts", + text = { + "Toutes les {C:attention}Couleurs{} et les", + "{C:attention}Quintes{} peuvent être", + "effectuées avec {C:attention}4{} cartes" + } + }, + j_mime = { + name = "Mime", + text = { + "Déclenchez à nouveau toutes", + "les capacités", + "des{C:attention} cartes {C:attention}en main{}" + } + }, + j_credit_card = { + name = "Carte de crédit", + text = { + "Vous pouvez accumuler", + "{C:red}-#1# ${} de dettes" + } + }, + j_greedy_joker = { + name = "Joker avide", + text = { + "Les cartes jouées avec", + "une couleur {C:diamonds}#2#{} octroient", + "{C:mult}+#1#{} au Multi. lorsqu'elles marquent des points" + } + }, + j_lusty_joker = { + name = "Joker lubrique", + text = { + "Les cartes jouées avec", + "une couleur {C:hearts}#2#{} octroient", + "{C:mult}+#1#{} au Multi. lorsqu'elles marquent des points" + } + }, + j_wrathful_joker = { + name = "Joker furieux", + text = { + "Les cartes jouées avec", + "une couleur {C:spades}#2#{} octroient", + "{C:mult}+#1#{} au Multi. lorsqu'elles marquent des points" + } + }, + j_gluttenous_joker = { + name = "Joker glouton", + text = { + "Les cartes jouées avec", + "une couleur {C:clubs}#2#{} octroient", + "{C:mult}+#1#{} au Multi. lorsqu'elles marquent des points" + } + }, + j_ceremonial = { + name = "Dague de cérémonie", + text = { + "Lorsque la {C:attention}Blinde{} est sélectionnée,", + "détruisez le Joker situé à droite", + "et ajoutent de manière permanente le {C:attention}double", + "de sa valeur de vente à ce {C:attention}Multi.", + "{C:inactive}(Actuellement Multi. {C:mult}+#1#{C:inactive})" + } + }, + j_banner = { + name = "Bannière", + text = { + "{C:chips}+#1#{} Jetons pour", + "chaque {C:attention}défausse", + "restante" + } + }, + j_mystic_summit = { + name = "Sommet mystique", + text = { + "Multi. {C:mult}+#1#{} lorsqu'il y a", + "{C:attention}#2#{} défausse", + "restante" + } + }, + j_marble = { + name = "Joker de marbre", + text = { + "Ajoute une carte {C:attention}Pierre{}", + "au jeu lorsque la", + "{C:attention}Blinde{} est sélectionnée" + } + }, + j_loyalty_card = { + name = "Carte de fidélité", + text = { + "Multi. {X:red,C:white}x#1#{} toutes les", + "{C:attention}#2#{} mains jouées", + "{C:inactive}#3#e" + } + }, + j_8_ball = { + name = "N° 8", + text = { + "Créez une carte {C:planet}Planète{}", + "si la main jouée contient", + "{C:attenetion}#1#{} {C:attention}8{} ou plus", + "{C:inactive}(Selon la place disponible)" + } + }, + j_misprint = { + name = "Erreur d'impression", + text = { + "" + } + }, + j_dusk = { + name = "Crépuscule", + text = { + "Déclenchez à nouveau toutes les", + "cartes marquantes dans la main", + "{C:attention}finale{C:attention}{} de la manche" + } + }, + j_raised_fist = { + name = "Poing levé", + text = { + "Ajoute le {C:attention}double{} de la valeur", + "de la carte {C:attention}la plus faible{}", + "en main au Multi." + } + }, + j_chaos = { + name = "Chaos le clown", + text = { + "{C:attention}#1#{} {C:green}Nouveau lancer gratuit", + "par magasin" + } + }, + j_fibonacci = { + name = "Fibonacci", + text = { + "Chaque {C:attention}As{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{}, ou {C:attention}8{} joué octroie", + "{C:mult}+#1#{} au Multi. lorsque ces cartes marquent des points" + } + }, + j_steel_joker = { + name = "Joker d'acier", + text = { + "Ce Joker gagne {X:mult,C:white} x#1# {} au Multi.", + "pour chaque carte {C:attention}Acier", + "dans votre jeu complet", + "{C:inactive}(Actuellement Multi. {X:mult,C:white} x#2# {C:inactive})" + } + }, + j_scary_face = { + name = "Figures d'effroi", + text = { + "Les cartes {C:attention}Figure{} jouées", + "octroient {C:chips}+#1#{} Jetons", + "en marquant des points" + } + }, + j_abstract = { + name = "Joker abstrait", + text = { + "Multi. {C:mult}+#1#{} pour", + "chaque carte {C:attention}Joker{}", + "{C:inactive}(Actuellement Multi. {C:red}+#2#{C:inactive})" + } + }, + j_delayed_grat = { + name = "Récompense différée", + text = { + "Gagnez {C:money}#1# ${} par {C:attention}défausse{} si", + "aucune défausse n'est utilisée", + "avant la fin de la manche" + } + }, + j_hack = { + name = "Imposteur", + text = { + "Déclenchez à nouveau", + "chaque", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} ou {C:attention}5{} joué" + } + }, + j_pareidolia = { + name = "Paréidolie", + text = { + "Toutes les cartes", + "sont considérées comme", + "des cartes {C:attention}Figure{}" + } + }, + j_gros_michel = { + name = "Gros Michel", + text = { + "Multi. {C:mult}+#1#{}", + "{C:green}#2# chance(s) sur #3#{} que cette", + "carte soit détruite", + "à la fin de la manche" + } + }, + j_even_steven = { + name = "Pair gagnant", + text = { + "Les cartes jouées", + "de valeur {C:attention}paire{} octroient", + "{C:mult}+#1#{} au Multi. lorsque ces cartes marquent des points", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "Impair pépère", + text = { + "Les cartes jouées", + "de valeur {C:attention}impaire{} octroient", + "{C:chips}+#1#{} Jetons lorsque ces cartes marquent des points", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Érudit", + text = { + "Les {C:attention}As{} joués", + "octroient {C:chips}+#2#{} Jetons", + "et {C:mult}+#1#{} au Multi.", + "en marquant des points" + } + }, + j_business = { + name = "Carte de visite", + text = { + "Les cartes {C:attention}Figure{} jouées ont", + "{C:green}#1# chance(s) sur #2#{}", + "d'octroyer {C:money}2 ${} en marquant des points" + } + }, + j_supernova = { + name = "Supernova", + text = { + "Ajoute le nombre de", + "fois qu'une {C:attention}main de poker{} a", + "été jouée au Multi." + } + }, + j_ride_the_bus = { + name = "Tour en bus", + text = { + "Multi. {C:mult}+#1#{} par", + "main consécutive", + "jouée sans", + "carte {C:attention}Figure{} marquante", + "{C:inactive}(Actuellement Multi. {C:mult}+#2#{C:inactive})" + } + }, + j_space = { + name = "Joker de l'espace", + text = { + "{C:green}#1# chance(s) sur #2#{}", + "d'augmenter le niveau", + "de la {C:attention}main de poker{} jouée" + } + }, + j_egg = { + name = "Œuf", + text = { + "Gagnez {C:money}#1# ${} de", + "la {C:attention}valeur de vente{} à", + "la fin de la manche" + } + }, + j_burglar = { + name = "Cambrioleur", + text = { + "Lorsque la {C:attention}Blinde{} est choisie,", + "gagnez {C:red}+#1#{} mains et", + "{C:attention}perdez toutes les défausses" + } + }, + j_blackboard = { + name = "Tableau noir", + text = { + "Multi. {X:red,C:white}x#1#{} si toutes", + "les cartes en main", + "sont de type {C:spades}#2#{} ou {C:clubs}#3#{}" + } + }, + j_runner = { + name = "Coureur", + text = { + "Octroie {C:chips}+#2#{} Jetons", + "si la main jouée", + "contient une {C:attention}Quinte{}", + "{C:inactive}(Actuellement {C:chips}+#1#{C:inactive} Jetons)" + } + }, + j_ice_cream = { + name = "Crème glacée", + text = { + "{C:chips}+#1#{} Jetons", + "{C:chips}-#2#{} Jetons pour", + "chaque main jouée" + } + }, + j_dna = { + name = "ADN", + text = { + "Si la {C:attention}première main{} de la manche", + "ne contient qu'{C:attention}une{} carte, ajoutez-en une", + "copie permanente au jeu", + "et placez-la dans la {C:attention}main" + } + }, + j_splash = { + name = "Plouf", + text = { + "Chaque {C:attention}carte jouée", + "compte dans l'attribution des points" + } + }, + j_blue_joker = { + name = "Joker bleu", + text = { + "{C:chips}+#1#{} Jetons pour chaque", + "carte restante dans le {C:attention}jeu", + "{C:inactive}(Actuellement {C:chips}+#2#{C:inactive} Jetons)" + } + }, + j_sixth_sense = { + name = "Sixième sens", + text = { + "Si la {C:attention}première main{} de la manche est", + "un {C:attention}6{} simple, détruisez-la et", + "créez une carte {C:spectral}Spectrale{}", + "{C:inactive}(Selon la place disponible)" + } + }, + j_constellation = { + name = "Constellation", + text = { + "Gagnez {X:mult,C:white} x#1# {} au Multi.", + "par carte {C:planet}Planète{} utilisée", + "{C:inactive}(Actuellement Multi. {X:mult,C:white}x#2#{C:inactive})" + } + }, + j_hiker = { + name = "Randonneur", + text = { + "Chaque {C:attention}carte{} jouée", + "gagne de façon permanente", + "{C:chips}+#1#{} Jetons en marquant des points" + } + }, + j_faceless = { + name = "Joker sans visage", + text = { + "Gagnez {C:money}#1# ${} si {C:attention}#2#{}", + "{C:attention}cartes Figure{} ou plus", + "sont défaussées", + "en même temps" + } + }, + j_green_joker = { + name = "Joker vert", + text = { + "Multi. {C:mult}+#1#{} par main jouée", + "Multi. {C:mult}-#2#{} par défausse", + "{C:inactive}(Actuellement Multi. {C:mult}+#3#{C:inactive})" + } + }, + j_superposition = { + name = "Superposition", + text = { + "Créez une carte {C:tarot}Tarot{} si", + "la main de poker contient un", + "{C:attention}As{} et une {C:attention}Quinte{}", + "{C:inactive}(Selon la place disponible)" + } + }, + j_todo_list = { + name = "Liste des tâches", + text = { + "Gagnez {C:money}#1# ${} si la {C:attention}main de poker{}", + "est de type {C:attention}#2#{},", + "cette main change", + "à chaque gain" + } + }, + j_ticket = { + name = "Ticket d'or", + text = { + "Les cartes {C:attention}Or{} jouées", + "octroient {C:money}#1# ${} en marquant des points" + }, + unlock = { + "Jouez une main à 5 cartes", + "qui ne contient que des", + "cartes {C:attention,E:1}Or{}" + } + }, + j_mr_bones = { + name = "Défaucheuse", + text = { + "Empêche la mort", + "si les Jetons marqués", + "constituent au minimum {C:attention}25 %", + "des Jetons nécessaires.", + "{S:1.1,C:red,E:2}S'autodétruit{}" + }, + unlock = { + "Perdez {C:attention,E:1}#1#{} parties", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Acrobate", + text = { + "Multi. {X:red,C:white}x#1#{} sur la main", + "{C:attention}finale{C:attention}{} de la manche" + }, + unlock = { + "Jouez {C:attention,E:1}#1#{} mains", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "Tragicomédie", + text = { + "Déclenchez à nouveau toutes les", + "cartes {C:attention}Figure{} jouées" + }, + unlock = { + "Jouez un total de", + "{C:attention,E:1}#1#{} cartes Figure", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "Cape et épée", + text = { + "Ajoute la valeur de vente de", + "tous les {C:attention}Jokers{} possédés à gauche", + "de cette carte au Multi.", + "{C:inactive}(Actuellement Multi. {C:mult}+#1#{C:inactive})" + }, + unlock = { + "Vendez un total de", + "{C:attention,E:1}#1#{} Cartes Joker", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Troubadour", + text = { + "{C:attention}+#1#{} à la taille de la main,", + "{C:red}-#2#{} main par manche" + }, + unlock = { + "Gagnez {C:attention,E:1}#1#{} manches", + "consécutives en ne jouant", + "qu'une seule main" + } + }, + j_certificate = { + name = "Certificat", + text = { + "Au début de la manche,", + "ajoutez une {C:attention}carte{} à {C:attention}jouer", + "aléatoire avec un", + "{C:attention}sceau{} aléatoire dans votre main" + }, + unlock = { + "Vous devez avoir une carte", + "à jouer Or", + "sur laquelle figure un {C:attention,E:1}Sceau d'or" + } + }, + j_smeared = { + name = "Joker barbouillé", + text = { + "Les {C:hearts}Cœurs{} et les {C:diamonds}Carreaux", + "comptent comme des cartes de même couleur,", + "et les {C:spades}Piques{} et {C:spades}Trèfles", + "comptent comme des cartes de même couleur" + }, + unlock = { + "Vous devez avoir au moins {C:attention}#1#", + "{E:1,C:attention}#2#{} au minimum dans", + "votre jeu" + } + }, + j_throwback = { + name = "Rappel", + text = { + "{X:mult,C:white} x#1# {} au Multi. pour chaque", + "{C:attention}Blinde{} passée dans cette partie", + "{C:inactive}(Actuellement Multi. {X:mult,C:white}x#2#{C:inactive})" + }, + unlock = { + "Reprenez une partie sauvegardée", + "depuis le menu principal" + } + }, + j_hanging_chad = { + name = "Carte de vote", + text = { + "Déclenchez à nouveau la {C:attention}première{}", + "carte utilisée pour marquer des points" + }, + unlock = { + "Battez une Boss Blinde", + "avec un {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Gemme brute", + text = { + "Les cartes jouées avec", + "Une couleur {C:diamonds}Carreau{} octroient", + "{C:money}#1# ${} en marquant des points" + }, + unlock = { + "Vous devez avoir au moins {E:1,C:attention}#1#", + "cartes de couleur {E:1,C:attention}#2#", + "dans votre jeu" + } + }, + j_bloodstone = { + name = "Pierre de sang", + text = { + "{C:green}#1# chance(s) sur #2#{} pour que", + "les cartes jouées avec", + "une couleur {C:hearts}Cœur{} octroient", + "{X:mult,C:white} x#3# {} au Multi. lorsqu'elles marquent des points" + }, + unlock = { + "Vous devez avoir au moins {E:1,C:attention}#1#", + "cartes de couleur {E:1,C:attention}#2#", + "dans votre jeu" + } + }, + j_arrowhead = { + name = "Pointe de flèche", + text = { + "Les cartes jouées avec", + "une couleur {C:spades}Pique{} octroient", + "{C:chips}+#1#{} Jetons en marquant des points" + }, + unlock = { + "Vous devez avoir au moins {E:1,C:attention}#1#", + "cartes de couleur {E:1,C:attention}#2#", + "dans votre jeu" + } + }, + j_onyx_agate = { + name = "Pierre Onyx", + text = { + "Les cartes jouées avec", + "une couleur {C:clubs}Trèfle{} octroient", + "{C:mult}+#1#{} au Multi. en marquant des points" + }, + unlock = { + "Vous devez avoir au moins {E:1,C:attention}#1#", + "cartes de couleur {E:1,C:attention}#2#", + "dans votre jeu" + } + }, + j_glass = { + name = "Joker de verre", + text = { + "Gagnez {X:mult,C:white} x#1# {} au Multi.", + "pour chaque {C:attention}carte Verre", + "détruite", + "{C:inactive}(Actuellement Multi. {X:mult,C:white}x#2#{C:inactive})" + }, + unlock = { + "Vous devez avoir au moins {E:1,C:attention}#1#", + "{E:1,C:attention}#2#{} au minimum dans", + "votre jeu" + } + }, + j_ring_master = { + name = "Maître du jeu", + text = { + "Les cartes {C:attention}Joker{}, {C:tarot}Tarot{}, {C:planet}Planète{}", + "et {C:spectral}Spectrales{} peuvent", + "apparaître plusieurs fois" + }, + unlock = { + "Atteignez la mise initiale", + "niveau {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Pot de fleurs", + text = { + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée", + "contient une carte {C:diamonds}Carreau{}, une carte {C:clubs}Trèfle{},", + "carte {C:hearts}Cœur{} et carte {C:spades}Pic{}" + }, + unlock = { + "Atteignez la mise initiale", + "niveau {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Modèle", + text = { + "Copie les capacités du", + "{C:attention}Joker{} sur la droite" + }, + unlock = { + "Gagnez une partie" + } + }, + j_wee = { + name = "P'tit joker", + text = { + "Ce Joker octroie", + "{C:chips}+#2#{} Jetons lorsque chaque", + "{C:attention}2{} joué marque des points", + "{C:inactive}(Actuellement {C:chips}+#1#{C:inactive} Jetons)" + }, + unlock = { + "Gagnez une partie en {E:1,C:attention}#1#", + "manches ou moins" + } + }, + j_merry_andy = { + name = "Andy le gentil", + text = { + "{C:red}+#1#{} défausses,", + "{C:red}#2#{} à la taille de la main" + }, + unlock = { + "Gagnez une partie en {E:1,C:attention}#1#", + "manches ou moins" + } + }, + j_oops = { + name = "Oups ! Que des 6", + text = { + "Double toutes les", + "{C:green,E:1,S:1.1}probabilités", + "{C:inactive}(ex. : {C:green}1 sur 3{C:inactive} -> {C:green}2 sur 3{C:inactive})" + }, + unlock = { + "Dans une main,", + "gagnez au moins", + "{E:1,C:attention}#1#{} Jetons" + } + }, + j_idol = { + name = "L'idole", + text = { + "Chaque {C:attention}#2#", + "de {V:1}#3#{} joué octroie", + "{X:mult,C:white} x#1# {} au Multi. en marquant des points", + "{s:0.8}La carte change à chaque manche" + }, + unlock = { + "Dans une main,", + "gagnez au moins", + "{E:1,C:attention}#1#{} Jetons" + } + }, + j_seeing_double = { + name = "Vision double", + text = { + "{X:mult,C:white} x#1# {} au Multi. si", + "la main jouée contient", + "une carte {C:clubs}Trèfle{} et une carte marquante", + "de n'importe quelle {C:attention}couleur" + }, + unlock = { + "Jouez une main", + "contenant", + "{E:1,C:attention}#1#" + } + }, + j_matador = { + name = "Matador", + text = { + "Gagnez {C:money}#1# ${} si la main jouée", + "déclenche la capacité", + "{C:attention}Boss Blinde{}" + }, + unlock = { + "Battez une Boss Blinde", + "en {E:1,C:attention}une main{} sans", + "utiliser aucune défausse" + } + }, + j_hit_the_road = { + name = "Prendre la route", + text = { + "Octroie {X:mult,C:white} x#1# {} au Multi.", + "par", + "{C:attention}Valet{} défaussé pendant cette manche", + "{C:inactive}(Actuellement Multi. {X:mult,C:white}x#2#{C:inactive})" + }, + unlock = { + "Défaussez {E:1,C:attention}5", + "{E:1,C:attention}Valets{} en", + "même temps" + } + }, + j_duo = { + name = "Le duo", + text = { + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée contient", + "une {C:attention}#2#" + }, + unlock = { + "Gagnez une partie", + "sans jouer", + "de {E:1,C:attention}#1#" + } + }, + j_trio = { + name = "Le trio", + text = { + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée contient", + "un {C:attention}#2#" + }, + unlock = { + "Gagnez une partie", + "sans jouer", + "de {E:1,C:attention}#1#" + } + }, + j_family = { + name = "La famille", + text = { + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée contient", + "un {C:attention}#2#" + }, + unlock = { + "Gagnez une partie", + "sans jouer", + "de {E:1,C:attention}#1#" + } + }, + j_order = { + name = "L'Ordre", + text = { + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée contient", + "une {C:attention}#2#" + }, + unlock = { + "Gagnez une partie", + "sans jouer", + "de {E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "La tribu", + text = { + "Multi. {X:mult,C:white}x#1#{} si", + "la main jouée contient", + "une {C:attention}#2#" + }, + unlock = { + "Gagnez une partie", + "sans jouer", + "de {E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "Cavendish", + text = { + "Multi. {X:mult,C:white}x#1#{}", + "{C:green}#2# chance(s) sur #3#{} que cette", + "carte soit détruite", + "à la fin de la manche" + } + }, + j_card_sharp = { + name = "Maître des cartes", + text = { + "Multi. {X:mult,C:white}x#1#{} si", + "la {C:attention}main de poker{} jouée a déjà", + "été jouée dans cette manche" + } + }, + j_red_card = { + name = "Carton rouge", + text = { + "Ajoute {C:red}+#1#{} au Multi. lorsque n'importe quel", + "{C:attention}Paquet Booster{} est passé", + "{C:inactive}(Actuellement Multi. {C:red}+#2#{C:inactive})" + } + }, + j_madness = { + name = "Folie", + text = { + "Lorsque la {C:attention}Blinde{} est sélectionnée,", + "gagnez {X:mult,C:white} x#1# {} au Multi. et", + "{C:attention}détruisez{} un Joker au hasard", + "{C:inactive}(Actuellement Multi. {X:mult,C:white}x#2#{})" + } + }, + j_square = { + name = "Joker carré", + text = { + "Octroie {C:chips}+#2#{} Jetons si", + "la main jouée contient", + "exactement {C:attention}4{} cartes", + "{C:inactive}(Actuellement {C:chips}#1#{} Jetons)" + } + }, + j_seance = { + name = "Séance", + text = { + "Si la {C:attention}main de poker{} est de type", + "{C:attention}#1#{}, créez", + "une carte {C:spectral}Spectrale{} aléatoire", + "{C:inactive}(Selon la place disponible)" + } + }, + j_riff_raff = { + name = "Racaille", + text = { + "Lorsque la {C:attention}Blinde{} est sélectionnée,", + "créez {C:money}#1# {C:blue}Joker Commun{C:attention}", + "{C:inactive}(Selon la place disponible)" + } + }, + j_stuntman = { + name = "Cascadeur", + text = { + "{C:chips}+#1#{} Jetons,", + "{C:attention}-#2#{} à la taille de la main" + }, + unlock = { + "Dans une main,", + "gagnez au moins", + "{E:1,C:attention}#1#{} Jetons" + } + }, + j_invisible = { + name = "Joker invisible", + text = { + "Après {C:attention}#1#{} manches,", + "vendez cette carte pour", + "{C:attention}Dupliquer{} un Joker aléatoire", + "{C:inactive}(Actuellement {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Gagnez une partie sans", + "jamais avoir plus", + "de {E:1,C:attention}4 Jokers{}" + } + }, + j_brainstorm = { + name = "Remue-méninges", + text = { + "Copie les capacités du", + "{C:attention}Joker{} le plus à gauche" + }, + unlock = { + "Défaussez une", + "{E:1,C:attention}Quinte flush royale" + } + }, + j_satellite = { + name = "Satellite", + text = { + "Gagnez {C:money}#1# ${} à la fin de la manche", + "pour chaque chaque carte {C:planet}Planète unique", + "utilisée dans cette partie", + "{C:inactive}(Actuellement {C:money}#2# ${C:inactive})" + }, + unlock = { + "Vous devez posséder {E:1,C:money}#1# $", + "ou plus" + } + }, + j_shoot_the_moon = { + name = "Objectif lune", + text = { + "Multi. {C:mult}+#1#{} pour chaque", + "{C:attention}Reine{}", + "dans votre main" + }, + unlock = { + "Jouez tous les {E:1,C:attention}Cœurs", + "de votre jeu en", + "une seule manche" + } + }, + j_drivers_license = { + name = "Permis de conduire", + text = { + "Multi. {X:mult,C:white}x#1#{} si vous", + "possédez au moins {C:attention}16", + "cartes améliorées", + "{C:inactive}(Actuellement {C:attention}#2#{C:inactive})" + }, + unlock = { + "Améliorez {E:1,C:attention}#1#{} cartes", + "dans votre jeu" + } + }, + j_cartomancer = { + name = "Cartomancien", + text = { + "Créez une carte {C:tarot}Tarot{}", + "lorsque la {C:attention}Blinde{} est sélectionnée", + "{C:inactive}(Selon la place disponible)" + }, + unlock = { + "Découvrez chaque", + "carte {E:1,C:tarot}Tarot{}" + } + }, + j_astronomer = { + name = "Astronome", + text = { + "Toutes les cartes {C:planet}Planète{} et les", + "{C:planet}Paquets Céleste{} dans", + "le magasin sont {C:attention}gratuits" + }, + unlock = { + "Découvrez toutes les", + "cartes {E:1,C:planet}Planète{}" + } + }, + j_burnt = { + name = "Joker calciné", + text = { + "Augmentez le niveau de", + "la première main de poker {C:attention}défaussée", + "à chaque manche" + }, + unlock = { + "Vendez un total", + "de {E:1,C:attention}#1#{} cartes", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Débrouillardise", + text = { + "Multi. {C:mult}+#1#{} pour chaque", + "{C:money}#2# ${} possédé" + }, + unlock = { + "Vous devez avoir au moins {E:1,C:attention}#1#", + "Jokers {C:dark_edition}Polychromes{}" + } + }, + j_caino = { + name = "Caino", + text = { + "Gagnez {X:mult,C:white} x#1# {} au Multi.", + "lorsqu'une carte {C:attention}Figure{}", + "est détruite", + "{C:inactive}(Actuellement Multi. {X:mult,C:white}x#2#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "Triboulet", + text = { + "Les {C:attention}Rois{} et les", + "{C:attention}Reines{} joués octroient chacun", + "{X:mult,C:white} x#1# {} au Multi. lorsqu'ils marquent des points" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "Yorick", + text = { + "Multi. {X:mult,C:white}x#1#{} seulement après", + "avoir utilisé {C:attention}#2#{} défausses", + "{C:inactive}(Défausses restantes : {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "Chicot", + text = { + "Annule l'effet de", + "chaque {C:attention}Boss Blinde" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "Perkeo", + text = { + "Crée une copie {C:dark_edition}Négative{}", + "d'{C:attention}1{} carte {C:attention}consommable{} aléatoire", + "en votre possession", + "à la fin du {C:attention}magasin" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "Joker rusé", + text = { + "{C:chips}+#1#{} Jetons si", + "la main jouée contient", + "une {C:attention}#2#" + } + }, + j_wily = { + name = "Joker habile", + text = { + "{C:chips}+#1#{} Jetons si", + "la main jouée contient", + "un {C:attention}#2#" + } + }, + j_clever = { + name = "Joker futé", + text = { + "{C:chips}+#1#{} Jetons si", + "la main jouée contient", + "un {C:attention}#2#" + } + }, + j_devious = { + name = "Joker sournois", + text = { + "{C:chips}+#1#{} Jetons si", + "la main jouée contient", + "une {C:attention}#2#" + } + }, + j_crafty = { + name = "Joker roublard", + text = { + "{C:chips}+#1#{} Jetons si", + "la main jouée contient", + "une {C:attention}#2#" + } + }, + j_vampire = { + name = "Vampire", + text = { + "Ajoute {X:mult,C:white} x#1# {} au Multi. par", + "{C:attention}Carte améliorée{} jouée,", + "supprime l'{C:attention}Amélioration{} de la carte", + "{C:inactive}(Actuellement Multi. {X:mult,C:white} x#2# {C:inactive})" + } + }, + j_shortcut = { + name = "Raccourci", + text = { + "Permet de créer des {C:attention}Quintes{}", + "avec des {C:attention}écarts de valeur de 1", + "{C:inactive}(ex. : {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Hologramme", + text = { + "Ajoute {X:mult,C:white} x#1# {} au Multi.", + "par {C:attention}carte à jouer{} ajoutée", + "à votre jeu", + "{C:inactive}(Actuellement Multi. {X:mult,C:white} x#2# {C:inactive})" + } + }, + j_vagabond = { + name = "Vagabond", + text = { + "Crée une carte de {C:purple}Tarot{}", + "si la main est jouée", + "avec {C:money}#1# ${} ou moins" + } + }, + j_baron = { + name = "Baron", + text = { + "Chaque {C:attention}Roi{}", + "que vous avez en main", + "ajoute {X:mult,C:white} x#1# {} au Multi." + } + }, + j_cloud_9 = { + name = "Neuvième ciel", + text = { + "Gagnez {C:money}#1# ${} pour chaque", + "{C:attention}9{} dans votre {C:attention}jeu complet", + "à la fin de la manche", + "{C:inactive}(Actuellement {C:money}#2# ${}{C:inactive})" + } + }, + j_rocket = { + name = "Fusée", + text = { + "Gagnez {C:money}#1# ${} à la fin de la", + "de la manche. Octroie {C:money}#2# ${} lorsque", + "la {C:attention}Boss Blinde{} est vaincue" + } + }, + j_obelisk = { + name = "Obélisque", + text = { + "Ajoute {X:mult,C:white} x#1# {} au Multi. par", + "main consécutive jouée", + "sans jouer votre", + "{C:attention}main de poker{} la plus jouée", + "{C:inactive}(Actuellement Multi. {X:mult,C:white} x#2# {C:inactive})" + } + }, + j_midas_mask = { + name = "Masque de Midas", + text = { + "Toutes les cartes {C:attention}Figure{}", + "deviennent des cartes {C:attention}Or{}", + "lorsqu'elles sont jouées" + } + }, + j_luchador = { + name = "Luchador", + text = { + "Vendez cette carte pour", + "désactiver la", + "{C:attention}Boss Blinde{} actuelle" + } + }, + j_photograph = { + name = "Photographe", + text = { + "La première carte {C:attention}Figure", + "octroie {X:mult,C:white} x#1# {} au Multi.", + "en marquant des points" + } + }, + j_gift = { + name = "Carte cadeau", + text = { + "Ajoutez {C:money}#1# ${} à la {C:attention}valeur de vente", + "de chaque carte {C:attention}Joker{} et", + "chaque carte {C:attention}Consommable{} à", + "la fin de la manche" + } + }, + j_turtle_bean = { + name = "Haricot noir", + text = { + "{C:attention}+#1#{} à la taille de la main,", + "mais ce nombre est réduit de", + "{C:red}#2#{} à chaque manche" + } + }, + j_erosion = { + name = "Érosion", + text = { + "Multi. {C:red}+#1#{} pour chaque", + "carte en dessous de {C:attention}#3#{}", + "dans votre jeu complet", + "{C:inactive}(Actuellement Multi. {C:red}+#2#{C:inactive})" + } + }, + j_reserved_parking = { + name = "Place réservée", + text = { + "Chaque carte {C:attention}Figure{}", + "en main a", + "{C:green}#2# chance(s) sur #3#{}", + "pour octroyer {C:money}#1# ${}" + } + }, + j_mail = { + name = "Remise par courrier", + text = { + "Gagnez {C:money}#1# ${} pour chaque", + "carte {C:attention}#2#{} défaussée, la valeur", + "change à chaque manche" + } + }, + j_to_the_moon = { + name = "Vers les étoiles", + text = { + "Gagnez {C:money}#1# ${} d'{C:attention}intérêt{}", + "supplémentaire par tranche de {C:money}5 ${}", + "possédée à la fin de la manche" + } + }, + j_hallucination = { + name = "Hallucination", + text = { + "{C:green}#1# chance sur #2#{} de créer", + "une carte de {C:tarot}Tarot{} lors de l'ouverture", + "de n'importe quel {C:attention}Paquet Booster{}", + "{C:inactive}(Selon la place disponible)" + } + }, + j_lucky_cat = { + name = "Porte-bonheur", + text = { + "Ajoute {X:mult,C:white} x#1# {} au Multi. chaque", + "fois qu'une carte {C:attention}Chance{}", + "est déclenchée {C:green}avec succès{}", + "{C:inactive}(Actuellement Multi. {X:mult,C:white} x#2# {C:inactive})" + } + }, + j_baseball = { + name = "Carte de baseball", + text = { + "Les Jokers {C:green}peu communs{}", + "ajoutent chacun {X:mult,C:white} x#1# {} au Multi." + } + }, + j_bull = { + name = "Bull run", + text = { + "{C:chips}+#1#{} Jetons pour chaque", + "{C:money}dollar{} possédé", + "{C:inactive}(Actuellement {C:chips}+#2#{C:inactive} Jetons)" + } + }, + j_diet_cola = { + name = "Cola zéro", + text = { + "Vendez cette carte pour", + "créer une", + "carte {C:attention}#1# gratuite" + } + }, + j_trading = { + name = "Carte à collectionner", + text = { + "Si la {C:attention}première défausse{} de la manche", + "ne contient qu'{C:attention}une{} carte, détruisez-la", + "et gagnez {C:money}#1# $" + } + }, + j_flash = { + name = "Carte mémoire", + text = { + "Ajoute {C:mult}+#1#{} au Multi. par", + "{C:attention}nouveau lancer{} dans le magasin", + "{C:inactive}(Actuellement Multi. {C:mult}+#2#{C:inactive})" + } + }, + j_popcorn = { + name = "Popcorn", + text = { + "{C:mult}+#1#{} au Multi.", + "{C:mult}-#2#{} au Multi. par", + "manche jouée" + } + }, + j_trousers = { + name = "Pantalon de rechange", + text = { + "Ajoute {C:mult}+#1#{} au Multi. si", + "la main jouée contient", + "{C:attention}#2#", + "{C:inactive}(Actuellement Multi. {C:red}+#3#{C:inactive})" + } + }, + j_ancient = { + name = "Joker antique", + text = { + "Chaque carte jouée avec", + "une couleur de {V:1}#2#{} octroie", + "{X:mult,C:white} x#1# {} au Multi. lorsqu'elle marque des points,", + "{s:0.8}la couleur change à la fin de la manche" + } + }, + j_ramen = { + name = "Ramen", + text = { + "Ajoute {X:mult,C:white} x#1# {} au Multi.", + "mais retire {X:mult,C:white} x#2# {} au Multi.", + "par {C:attention}carte{} défaussée" + } + }, + j_walkie_talkie = { + name = "Talkie-walkie", + text = { + "Chaque {C:attention}10{} ou {C:attention}4 joué", + "octroie {C:chips}+#1#{} Jetons et", + "{C:mult}+#2#{} au Multi. lorsqu'il marque des points" + } + }, + j_selzer = { + name = "Seltz", + text = { + "Déclenchez à nouveau toutes les", + "cartes jouées pour", + "les {C:attention}#1#{} prochaines mains" + } + }, + j_castle = { + name = "Château", + text = { + "Ce Joker octroie {C:chips}+#1#{} Jetons", + "par carte {V:1}#2#{} défaussée,", + "la couleur change à chaque manche", + "{C:inactive}(Actuellement {C:chips}+#3#{C:inactive} Jetons)" + } + }, + j_smiley = { + name = "Figures souriantes", + text = { + "Les cartes {C:attention}Figure{} jouées", + "octroient {C:mult}+#1#{} au Multi.", + "lorsqu'elles marquent des points" + } + }, + j_campfire = { + name = "Feu de camp", + text = { + "Ce Joker ajoute {X:mult,C:white}x#1#{} au Multi.", + "pour chaque carte {C:attention}vendue{}, mais ce multi. est réinitialisé", + "lorsque la {C:attention}Boss Blinde{} est vaincue", + "{C:inactive}(Actuellement Multi. {X:mult,C:white} x#2# {C:inactive})" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Excédent", + text = { + "{C:attention}+1{} emplacement de carte", + "disponible dans le magasin" + } + }, + v_clearance_sale = { + name = "Déstockage", + text = { + "Toutes les cartes et tous les paquets du", + "magasin sont vendus avec un rabais de {C:attention}#1# %{}" + } + }, + v_tarot_merchant = { + name = "Marchand de cartes de Tarot", + text = { + "Les cartes de {C:tarot}Tarot{} apparaissent", + "{C:attention}#1#X{} plus fréquemment", + "dans le magasin" + } + }, + v_planet_merchant = { + name = "Marchand de cartes Planète", + text = { + "Les cartes {C:planet}Planète{} apparaissent", + "{C:attention}#1#X{} plus fréquemment", + "dans le magasin" + } + }, + v_hone = { + name = "Aiguisage", + text = { + "Les cartes {C:dark_edition}Aluminium{}, {C:dark_edition}Holographiques{} et", + "{C:dark_edition}Polychromes{}", + "apparaissent {C:attention}#1#x{} plus souvent" + } + }, + v_reroll_surplus = { + name = "Lancers en pagaille", + text = { + "Les nouveaux lancers coûtent", + "{C:money}#1# ${} moins cher" + } + }, + v_crystal_ball = { + name = "Boule de cristal", + text = { + "{C:attention}+1{} emplacement de consommable" + } + }, + v_telescope = { + name = "Télescope", + text = { + "Les {C:attention}Paquets Célestes{} contiennent", + "toujours la carte {C:planet}Planète{}", + "pour votre", + "{C:attention}main de poker la plus jouée" + } + }, + v_grabber = { + name = "Grappin", + text = { + "Gagnez de manière permanente", + "{C:blue}+#1#{} main", + "par manche" + } + }, + v_wasteful = { + name = "Gaspillage", + text = { + "Gagnez de manière permanente", + "{C:red}+#1#{} défausse", + "par manche" + } + }, + v_seed_money = { + name = "Capital de départ", + text = { + "Augmentez le plafond des", + "intérêts perçus", + "par manche de {C:money}#1# ${}" + } + }, + v_blank = { + name = "À blanc", + text = { + "{C:inactive}Ne fait rien ?" + } + }, + v_magic_trick = { + name = "Tour de magie", + text = { + "Les {C:attention}Cartes à jouer{} peuvent", + "être achetées", + "dans le {C:attention}magasin" + } + }, + v_hieroglyph = { + name = "Hiéroglyphe", + text = { + "{C:attention}-#1#{} à la mise initiale", + "{C:blue}-#1#{} main", + "par manche", + "{C:attention}-#1#{} à la mise initiale" + } + }, + v_directors_cut = { + name = "Director's Cut", + text = { + "Relancez la Boss Blinde", + "{C:attention}1{} fois par mise initiale,", + "{C:money}#1# ${} par lancer" + } + }, + v_pattern = { + name = "Motif", + text = { + "Fait apparaître la carte", + "{C:attention}Consommable{} que vous utilisez le plus", + "{E:1,V:1}#1#", + "{C:inactive}(Selon la place disponible)" + } + }, + v_overstock_plus = { + name = "Excédent plus", + text = { + "{C:attention}+1{} emplacement de carte", + "disponible dans le magasin" + }, + unlock = { + "Dépensez un total de", + "{C:money}#1# ${} dans le magasin", + "{C:inactive}(#2# $)" + } + }, + v_liquidation = { + name = "Liquidation", + text = { + "Toutes les cartes et tous les paquets du", + "magasin sont vendus avec un rabais de {C:attention}#1# %{}" + }, + unlock = { + "Utilisez au moins", + "{C:attention}#1# cartes {C:voucher}Bon d'achat{}", + "en une partie" + } + }, + v_tarot_tycoon = { + name = "Magnat des cartes de Tarot", + text = { + "Les cartes de {C:tarot}Tarot{} apparaissent", + "{C:attention}#1#X{} plus fréquemment", + "dans le magasin" + }, + unlock = { + "Achetez un total de", + "{C:attention}#1# cartes de {C:tarot}Tarot{}", + "dans le magasin", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Magnat des cartes Planète", + text = { + "Les cartes {C:planet}Planète{} apparaissent", + "{C:attention}#1#X{} plus fréquemment", + "dans le magasin" + }, + unlock = { + "Achetez un total de", + "{C:attention}#1# cartes {C:planet}Planète{}", + "dans le magasin", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Bonne mine", + text = { + "Les cartes {C:dark_edition}Aluminium{}, {C:dark_edition}Holographiques{} et", + "{C:dark_edition}Polychromes{}", + "apparaissent {C:attention}#1#x{} plus souvent" + }, + unlock = { + "Vous devez avoir au moins {C:attention}#1#", + "cartes {C:attention}Joker{} en édition", + "{C:dark_edition}Aluminium{}, {C:dark_edition}Holographique{} ou", + "{C:dark_edition}Polychrome{}" + } + }, + v_reroll_glut = { + name = "Comme s'il en pleuvait", + text = { + "Les nouveaux lancers coûtent", + "{C:money}#1# ${} moins cher" + }, + unlock = { + "Effectuez un total de", + "{C:attention}#1#{} nouveaux lancers dans le magasin", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Globe de présage", + text = { + "Les cartes {C:spectral}Spectrales{} peuvent", + "apparaître dans n'importe quel", + "{C:attention}Paquet Arcana" + }, + unlock = { + "Utilisez un total de {C:attention}#1#", + "cartes de {C:tarot}Tarot{} dans n'importe quel", + "{C:tarot}Paquet Arcana", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Observatoire", + text = { + "Les cartes {C:planet}Planète{} de votre", + "zone {C:attention}Consommable{} octroient", + "{X:red,C:white}x#1#{} au multi. pour", + "leur {C:attention}main de poker spécifique" + }, + unlock = { + "Utilisez un total de {C:attention}#1#", + "cartes {C:planet}Planète{} dans n'importe quel", + "{C:planet}Paquet Céleste", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Tong Nacho", + text = { + "Gagnez de manière permanente", + "{C:blue}+#1#{} main", + "par manche" + }, + unlock = { + "Jouez un total", + "de {C:attention}#1#{} cartes", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Recyclomancie", + text = { + "Gagnez de manière permanente", + "{C:red}+#1#{} défausse", + "par manche" + }, + unlock = { + "Défaussez un total", + "de {C:attention}#1#{} cartes", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Arbre à monnaie", + text = { + "Augmentez le plafond des", + "intérêts perçus", + "par manche de {C:money}#1# ${}" + }, + unlock = { + "Maximisez les intérêts", + "perçus par manche pendant", + "{C:attention}#1#{} manches consécutives", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Antimatière", + text = { + "{C:dark_edition}+1{} emplacement de Joker" + }, + unlock = { + "Utilisez {C:voucher}À blanc{}", + "{C:attention}#1#{} fois au total", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Illusion", + text = { + "Les {C:attention}Cartes à jouer{} du magasin", + "peuvent être {C:enhanced}Améliorées{},", + "{C:dark_edition}Édition{} et/ou {C:dark_edition}Sceau{}" + }, + unlock = { + "Achetez un total de", + "{C:attention}#1#{} cartes à jouer", + "dans le magasin", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Pétroglyphe", + unlock = { + "Atteignez la mise initiale", + "niveau {E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{} à la mise initiale", + "{C:red}-#1#{} défausse", + "par manche" + } + }, + v_retcon = { + name = "Retcon", + text = { + "Relancez la Boss Blinde", + "un nombre {C:attention}illimité{} de fois,", + "{C:money}#1# ${} par nouveau lancer" + }, + unlock = { + "Découvrez", + "{C:attention}#1#{} Blindes" + } + }, + v_tesselation = { + name = "Tessellation", + text = { + "Fait apparaître la carte", + "{C:attention}Joker{} la plus utilisée", + "{E:1,V:1}#1#", + "{C:inactive}(Selon la place disponible)" + }, + unlock = { + "Achetez l'édition {C:dark_edition}Polychrome", + "de votre", + "carte {C:attention}Joker la plus utilisée", + "dans le magasin" + } + }, + v_palette = { + name = "Palette", + text = { + "Vous pouvez tenir {C:attention}+#1#{} carte", + "dans votre main", + "{C:attention}+#1#{} à la taille de la main" + }, + unlock = { + "Réduisez la taille de la main", + "jusqu'à {C:attention}#1#{} cartes" + } + }, + v_paint_brush = { + name = "Pinceau", + text = { + "{C:attention}+#1#{} à la taille de la main" + } + } + }, + Tarot = { + c_fool = { + name = "Le mat", + text = { + "Crée la", + "carte de {C:tarot}Tarot{} ou {C:planet}Planète{} utilisée en dernier", + "pendant cette partie,", + "En excluant {s:0.8,C:tarot}Le mat{s:0.8}" + } + }, + c_magician = { + name = "Le magicien", + text = { + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "La papesse", + text = { + "Crée jusqu'à {C:attention}#1#", + "cartes {C:planet}Planète{} aléatoires", + "{C:inactive}(Selon la place disponible)" + } + }, + c_empress = { + name = "L'impératrice", + text = { + "Améliore {C:attention}#1#", + "cartes sélectionnées en", + "{C:attention}#2#" + } + }, + c_emperor = { + name = "L'empereur", + text = { + "Crée jusqu'à {C:attention}#1#", + "cartes de {C:tarot}Tarot{} aléatoires", + "{C:inactive}(Selon la place disponible)" + } + }, + c_heirophant = { + name = "Le hiérophante", + text = { + "Améliore {C:attention}#1#", + "cartes sélectionnées en", + "{C:attention}#2#" + } + }, + c_lovers = { + name = "Les amoureux", + text = { + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "Le chariot", + text = { + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#" + } + }, + c_justice = { + name = "Justice", + text = { + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "L'ermite", + text = { + "Double l'argent", + "{C:inactive}({C:money}#1# ${C:inactive} au maximum)" + } + }, + c_wheel_of_fortune = { + name = "La roue de la fortune", + text = { + "{C:green}#1# chance(s) sur #2#{} d'ajouter une édition", + "{C:dark_edition}Aluminium{}, {C:dark_edition}Holographique{} ou", + "{C:dark_edition}Polychrome{}", + "à un {C:attention}Joker au hasard" + } + }, + c_strength = { + name = "La force", + text = { + "Augmente la valeur", + "d'un maximum de {C:attention}#1#{} cartes", + "sélectionnées de {C:attention}1" + } + }, + c_hanged_man = { + name = "Le pendu", + text = { + "Détruit un maximum de", + "{C:attention}#1#{} cartes sélectionnées" + } + }, + c_death = { + name = "La mort", + text = { + "Sélectionnez {C:attention}#1#{} cartes,", + "la carte de {C:attention}gauche{}", + "devient la carte de {C:attention}droite{}", + "{C:inactive}(Faites glisser les cartes pour les réorganiser)" + } + }, + c_temperance = { + name = "La tempérance", + text = { + "Octroie la valeur de vente", + "totale de tous les", + "Jokers actuels {C:inactive}({C:money}#1# ${C:inactive} au maximum)", + "{C:inactive}(Actuellement {C:money}#2# ${C:inactive})" + } + }, + c_devil = { + name = "Le diable", + text = { + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#" + } + }, + c_tower = { + name = "La maison Dieu", + text = { + "Améliore {C:attention}#1#{} carte", + "sélectionnée en", + "{C:attention}#2#" + } + }, + c_star = { + name = "L'étoile", + text = { + "Convertit jusqu'à", + "{C:attention}#1#{} cartes sélectionnées", + "pour les changer en {V:1}#2#{}" + } + }, + c_moon = { + name = "La lune", + text = { + "Convertit jusqu'à", + "{C:attention}#1#{} cartes sélectionnées", + "pour les changer en {V:1}#2#{}" + } + }, + c_sun = { + name = "Le soleil", + text = { + "Convertit jusqu'à", + "{C:attention}#1#{} cartes sélectionnées", + "pour les changer en {V:1}#2#{}" + } + }, + c_judgement = { + name = "Le jugement", + text = { + "Crée une carte", + "{C:attention}Joker{} aléatoire", + "{C:inactive}(Selon la place disponible)" + } + }, + c_world = { + name = "Le monde", + text = { + "Convertit jusqu'à", + "{C:attention}#1#{} cartes sélectionnées", + "pour les changer en {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Mercure", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_venus = { + name = "Vénus", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_earth = { + name = "Terre", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_mars = { + name = "Mars", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_jupiter = { + name = "Jupiter", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_saturn = { + name = "Saturne", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_uranus = { + name = "Uranus", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_neptune = { + name = "Neptune", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_pluto = { + name = "Pluton", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_ceres = { + name = "Cérès", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_planet_x = { + name = "Planète X", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + }, + c_eris = { + name = "Eris", + text = { + "{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Niveau supérieur", + "{C:attention}#2#", + "{C:mult}+#3#{} au Multi. et", + "{C:chips}+#4#{} Jetons" + } + } + }, + Spectral = { + c_familiar = { + name = "Familier", + text = { + "Détruisez {C:attention}1{} carte", + "aléatoire de votre main,", + "ajoutez {C:attention}#1#{} cartes {C:attention}Figure Améliorées{}", + "aléatoires à votre main" + } + }, + c_grim = { + name = "Grinçant", + text = { + "Détruisez {C:attention}1{} carte", + "aléatoire de votre main,", + "ajoutez {C:attention}#1#{}", + "aléatoires à votre main" + } + }, + c_incantation = { + name = "Incantation", + text = { + "Détruisez {C:attention}1{} carte", + "aléatoire de votre main, ajoutez {C:attention}#1#", + "{C:attention}cartes{} {C:attention}numérotées Améliorées", + "aléatoires à votre main" + } + }, + c_talisman = { + name = "Talisman", + text = { + "Ajoutez un {C:attention}Sceau d'or{}", + "à {C:attention}1{} carte", + "aléatoire de votre main" + } + }, + c_aura = { + name = "Aura", + text = { + "Ajoutez un effet {C:dark_edition}Aluminium{}, {C:dark_edition}Holographique{}", + "ou {C:dark_edition}Polychrome{} à", + "{C:attention}1{} carte choisie dans votre main" + } + }, + c_wraith = { + name = "Apparition", + text = { + "Crée une carte", + "Joker {C:red}Rare{C:attention}{},", + "fixe l'argent à {C:money}0 $" + } + }, + c_sigil = { + name = "Sceau", + text = { + "Convertit toutes les cartes", + "en main en une unique", + "{C:attention}Couleur{} aléatoire" + } + }, + c_ouija = { + name = "Ouija", + text = { + "Convertit toutes les cartes", + "en main en une unique", + "{C:attention}Valeur{} aléatoire", + "Taille de la main {C:red}-1{}" + } + }, + c_ectoplasm = { + name = "Ectoplasme", + text = { + "Ajoutez un {C:dark_edition}Négatif{} à", + "à un {C:attention}Joker{} aléatoire,", + "Taille de la main {C:red}-1{}" + } + }, + c_immolate = { + name = "Immolation", + text = { + "Détruit {C:attention}#1#{} cartes", + "aléatoires en main,", + "gagnez {C:money}#2# $" + } + }, + c_soul = { + name = "L'âme", + text = { + "Crée un", + "Joker {C:legendary,E:1}Légendaire{}", + "{C:inactive}(Selon la place disponible)" + } + }, + c_black_hole = { + name = "Trou noir", + text = { + "Augmentez chaque", + "{C:legendary,E:1}main de poker", + "d'{C:attention}1{} niveau" + } + }, + c_ankh = { + name = "Ankh", + text = { + "Créez une copie d'un", + "{C:attention}Joker{} aléatoire, détruisez", + "tous les autres Jokers" + } + }, + c_deja_vu = { + name = "Déjà vu", + text = { + "Ajoutez un {C:red}Sceau rouge{}", + "à {C:attention}1{} carte sélectionnée", + "dans votre main" + } + }, + c_hex = { + name = "Maléfice", + text = { + "Ajoutez {C:dark_edition}Polychrome{} à un", + "{C:attention}Joker{} aléatoire, détruisez", + "tous les autres Jokers" + } + }, + c_trance = { + name = "Trance", + text = { + "Ajoutez un {C:blue}Sceau bleu{}", + "à {C:attention}1{} carte sélectionnée", + "dans votre main" + } + }, + c_medium = { + name = "Médium", + text = { + "Ajoutez un {C:purple}Sceau violet{}", + "à {C:attention}1{} carte sélectionnée", + "dans votre main" + } + }, + c_cryptid = { + name = "Cryptide", + text = { + "Créez {C:attention}#1#{} copies", + "d'{C:attention}une{} carte sélectionnée", + "dans votre main" + } + } + }, + Edition = { + e_base = { + name = "Base", + text = { + "Aucun effet supplémentaire" + } + }, + e_foil = { + name = "Aluminium", + text = { + "{C:chips}+#1#{} Jetons" + } + }, + e_holo = { + name = "Holographique", + text = { + "{C:mult}+#1#{} au Multi." + } + }, + e_polychrome = { + name = "Polychrome", + text = { + "Ajoute {X:mult,C:white} x#1# {} au Multi." + } + }, + e_negative = { + name = "Négatif", + text = { + "{C:dark_edition}+#1#{} emplacement Joker" + } + }, + e_negative_consumable = { + name = "Négatif", + text = { + "{C:dark_edition}+#1#{} emplacement de consommable" + } + } + }, + Enhanced = { + m_bonus = { + name = "Carte bonus", + text = {} + }, + m_mult = { + name = "Carte Multi.", + text = { + "Multi. {C:mult}+#1#{}" + } + }, + m_wild = { + name = "Carte Libre", + text = { + "Peut être utilisée", + "comme n'importe quelle couleur" + } + }, + m_glass = { + name = "Carte Verre", + text = { + "Multi. {X:mult,C:white}x#1#{}", + "{C:green}#2# chance(s) sur #3#{} de", + "détruire la carte" + } + }, + m_steel = { + name = "Carte Acier", + text = { + "Multi. {X:mult,C:white} x#1# {}", + "tant que cette carte", + "reste en main" + } + }, + m_stone = { + name = "Carte Pierre", + text = { + "{C:chips}+#1#{} Jetons", + "sans valeur ni couleur" + } + }, + m_gold = { + name = "Carte Or", + text = { + "{C:money}#1# ${} si cette", + "carte est en main", + "à la fin de la manche" + } + }, + m_lucky = { + name = "Carte Chance", + text = { + "{C:green}#1# chance(s) sur #3#{}", + "d'obtenir {C:mult}+#2#{} au Multi.", + "{C:green}#1# chance(s) sur #5#{}", + "de gagner {C:money}#4# $" + } + } + }, + Stake = { + stake_white = { + name = "Mise blanche", + text = { + "Difficulté de base" + } + }, + stake_red = { + name = "Mise rouge", + text = { + "Une {C:attention}Petite Blinde{} n'octroie pas", + "de récompense en argent", + "{s:0.8}Applique toutes les mises précédentes" + } + }, + stake_green = { + name = "Mise verte", + text = { + "Le score requis augmente", + "plus rapidement pour chaque {C:attention}mise initiale", + "{s:0.8}Applique toutes les mises précédentes" + } + }, + stake_blue = { + name = "Mise bleue", + text = { + "{C:red}-1{} défausse", + "{s:0.8}Applique toutes les mises précédentes" + } + }, + stake_black = { + name = "Mise noire", + text = { + "Les magasins peuvent posséder des Jokers {C:attention}Éternels{}", + "{C:inactive,s:0.8}(Ne peut pas être vendu ou détruit)", + "{s:0.8}Applique toutes les mises précédentes" + } + }, + stake_purple = { + name = "Mise violette", + text = { + "Le score requis augmente", + "plus rapidement pour chaque {C:attention}mise initiale", + "{s:0.8}Applique toutes les mises précédentes" + } + }, + stake_orange = { + name = "Mise orange", + text = { + "Les {C:attention}Paquets Booster{} coûtent", + "{C:money}1 ${} de plus par mise initiale", + "{s:0.8}Applique toutes les mises précédentes" + } + }, + stake_gold = { + name = "Mise d'or", + text = { + "{C:attention}-1{} à la taille de la main", + "{s:0.8}Applique toutes les mises précédentes" + } + } + }, + Tag = { + tag_uncommon = { + name = "Étiquette peu commune", + text = { + "Le magasin possède un", + "{C:green}Joker peu commun" + } + }, + tag_rare = { + name = "Étiquette rare", + text = { + "Le magasin possède un", + "{C:red}Joker rare" + } + }, + tag_negative = { + name = "Étiquette négative", + text = { + "Le magasin possède un", + "{C:dark_edition}Joker négatif" + } + }, + tag_foil = { + name = "Étiquette d'aluminium", + text = { + "Le magasin possède un", + "{C:dark_edition}Joker d'aluminium" + } + }, + tag_holo = { + name = "Étiquette holographique", + text = { + "Le magasin possède un", + "{C:dark_edition}Joker holographique" + } + }, + tag_polychrome = { + name = "Étiquette polychrome", + text = { + "Le magasin possède un", + "{C:dark_edition}Joker polychrome" + } + }, + tag_investment = { + name = "Étiquette d'investissement", + text = { + "Après avoir battu", + "la Boss Blinde,", + "gagnez {C:money}#1# $" + } + }, + tag_voucher = { + name = "Étiquette de bon d'achat", + text = { + "Ajoute un {C:voucher}Bon d'achat", + "au prochain magasin" + } + }, + tag_boss = { + name = "Étiquette de boss", + text = { + "Effectue un nouveau lancer de la", + "{C:attention}Boss Blinde" + } + }, + tag_standard = { + name = "Étiquette standard", + text = { + "Octroie un", + "{C:attention}Paquet Méga-Standard" + } + }, + tag_charm = { + name = "Étiquette de charme", + text = { + "Octroie un", + "{C:tarot}Paquet Méga-Arcana" + } + }, + tag_meteor = { + name = "Étiquette de météore", + text = { + "Octroie un", + "{C:planet}Paquet Méga-Céleste" + } + }, + tag_buffoon = { + name = "Étiquette de bouffon", + text = { + "Octroie un", + "{C:attention}Paquet Bouffon" + } + }, + tag_handy = { + name = "Étiquette pratique", + text = { + "Octroie {C:money}#1# ${} par", + "{C:blue}main{} jouée dans cette partie", + "{C:inactive}(Octroiera {C:money}#2# ${C:inactive})" + } + }, + tag_garbage = { + name = "Étiquette moisie", + text = { + "Octroie {C:money}#1# ${} par", + "{C:red}défausse{} dans cette partie", + "{C:inactive}(Octroiera {C:money}#2# ${C:inactive})" + } + }, + tag_coupon = { + name = "Étiquette de coupon", + text = { + "Les cartes initiales et", + "les Paquets Booster du", + "prochain magasin sont gratuits" + } + }, + tag_double = { + name = "Étiquette double", + text = { + "Octroie une copie de la", + "prochaine {C:attention}Étiquette{} sélectionnée", + "{s:0.8}en excluant {s:0.8,C:attention}l'Étiquette double" + } + }, + tag_juggle = { + name = "Étiquette de jongleur", + text = { + "{C:attention}+#1#{} à la taille de la main", + "à la prochaine manche" + } + }, + tag_d_six = { + name = "Étiquette D6", + text = { + "Les nouveaux lancers du prochain magasin", + "commencent à {C:money}0 $" + } + }, + tag_top_up = { + name = "Étiquette d'appoint", + text = { + "Crée jusqu'à {C:attention}#1#", + "Jokers {C:blue}Communs{}", + "{C:inactive}(Selon la place disponible)" + } + }, + tag_skip = { + name = "Étiquette de rapidité", + text = { + "Gagnez {C:money}#1# ${} par blinde", + "passée lors de cette partie", + "{C:inactive}(Peut octroyer {C:money}#2# ${C:inactive})" + } + }, + tag_orbital = { + name = "Étiquette orbitale", + text = { + "Augmentez {C:attention}#1#", + "de {C:attention}#2# niveaux" + } + }, + tag_economy = { + name = "Étiquette économique", + text = { + "Double votre argent", + "{C:inactive}({C:money}#1# ${C:inactive} au maximum)" + } + }, + tag_ethereal = { + name = "Étiquette éthérée", + text = { + "Octroie un", + "{C:planet}Paquet Spectral" + } + } + }, + Blind = { + bl_small = { + name = "Petite Blinde", + text = {} + }, + bl_big = { + name = "Grosse Blinde", + text = {} + }, + bl_hook = { + name = "L'hameçon", + text = { + "Défaussez 2 cartes aléatoires", + "par main jouée" + } + }, + bl_wall = { + name = "Le mur", + text = { + "Super grosse Blinde" + } + }, + bl_wheel = { + name = "La roue", + text = { + " carte sur 7 est", + "tirée face cachée" + } + }, + bl_arm = { + name = "Le bras", + text = { + "Diminuez le niveau de", + "la main de poker jouée" + } + }, + bl_psychic = { + name = "Le médium", + text = { + "5 cartes doivent être jouées" + } + }, + bl_goad = { + name = "L'aiguillon", + text = { + "Toutes les cartes Pique", + "voient leurs bonus disparaître" + } + }, + bl_water = { + name = "L'eau", + text = { + "Commencez sans", + "aucune défausse" + } + }, + bl_eye = { + name = "L'œil", + text = { + "Pas de types de main", + "répétés cette manche-ci" + } + }, + bl_mouth = { + name = "La bouche", + text = { + "Ne jouez qu'un seul type", + "de main cette manche-ci" + } + }, + bl_plant = { + name = "La plante", + text = { + "Toutes les cartes Figure", + "voient leurs bonus disparaître" + } + }, + bl_needle = { + name = "L'aiguille", + text = { + "Ne jouez qu'une main" + } + }, + bl_head = { + name = "La tête", + text = { + "Toutes les cartes Cœur", + "voient leurs bonus disparaître" + } + }, + bl_tooth = { + name = "La dent", + text = { + "Perdez 1 $ par", + "carte jouée" + } + }, + bl_final_leaf = { + name = "Feuille verte", + text = { + "Toutes les cartes voient leurs bonus disparaître", + "jusqu'à ce qu'un Joker soit vendu" + } + }, + bl_final_vessel = { + name = "Vase violet", + text = { + "Très grosse Blinde" + } + }, + bl_ox = { + name = "Le bœuf", + text = { + "Jouer #1#", + "fixe l'argent à 0 $" + } + }, + bl_house = { + name = "La maison", + text = { + "La première main est", + "tirée face cachée" + } + }, + bl_club = { + name = "Le club", + text = { + "Toutes les cartes Trèfle", + "voient leurs bonus disparaître" + } + }, + bl_fish = { + name = "Le poisson", + text = { + "Les cartes sont tirées face cachée", + "après chaque main jouée" + } + }, + bl_window = { + name = "La fenêtre", + text = { + "Toutes les cartes Carreau", + "voient leurs bonus disparaître" + } + }, + bl_manacle = { + name = "Les menottes", + text = { + "Taille de la main -1" + } + }, + bl_serpent = { + name = "Le serpent", + text = { + "Après avoir joué ou défaussé,", + "tirez toujours 3 cartes" + } + }, + bl_pillar = { + name = "Le pilier", + text = { + "Les cartes jouées avant cette", + "mise initiale voient leurs bonus disparaître" + } + }, + bl_flint = { + name = "Le silex", + text = { + "Les Jetons de base et le", + "Multi. sont réduits de moitié" + } + }, + bl_mark = { + name = "La marque", + text = { + "Toutes les cartes Figure sont", + "tirées face cachée" + } + }, + bl_final_acorn = { + name = "Gland ambre", + text = { + "Retourne et mélange", + "toutes les cartes Joker" + } + }, + bl_final_heart = { + name = "Cœur écarlate", + text = { + "Un Joker aléatoire", + "annulé à chaque main" + } + }, + bl_final_bell = { + name = "Cloche céruléenne", + text = { + "Force la sélection", + "systématique d'une carte" + } + } + }, + Back = { + b_red = { + name = "Jeu rouge", + text = { + "{C:red}+#1#{} défausse", + "à chaque manche" + } + }, + b_blue = { + name = "Jeu bleu", + text = { + "{C:blue}+#1#{} main", + "à chaque manche" + } + }, + b_yellow = { + name = "Jeu jaune", + text = { + "Commencez avec", + "{C:money}#1# $ supplémentaires" + } + }, + b_green = { + name = "Jeu vert", + text = { + "À la fin de la manche :", + "{C:money}#1# ${s:0.85} par {C:blue}main restante", + "{C:money}#2# ${s:0.85} par {C:red}défausse restante", + "Vous ne percevez pas d'{C:attention}intérêts" + } + }, + b_black = { + name = "Jeu noir", + text = { + "{C:attention}+#1#{} emplacement Joker", + "", + "{C:blue}-#2#{} main", + "à chaque manche" + } + }, + b_magic = { + name = "Jeu magique", + text = { + "Commencez la partie avec le", + "bon d'achat {C:tarot,T:v_crystal_ball}#1#{}", + "et {C:attention}2{} copies", + "de {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Jeu nébuleux", + text = { + "Commencez la partie avec le", + "bon d'achat {C:planet}#1#{}", + "", + "{C:red}#2#{} emplacement de consommable" + } + }, + b_metal = { + name = "Jeu en métal", + text = { + "Commencez la partie avec {C:attention}#1#", + "cartes à jouer améliorées", + "en {C:attention}cartes Acier" + } + }, + b_abandoned = { + name = "Jeu abandonné", + text = { + "Commencez la partie", + "sans {C:attention}cartes Figure", + "dans votre jeu" + } + }, + b_checkered = { + name = "Jeu en damier", + text = { + "Commencez la partie avec", + "{C:attention}26 cartes de{C:spades} Pique{} et", + "{C:attention}26 cartes de{C:hearts} Cœur{} dans votre jeu" + } + }, + b_rocky = { + name = "Jeu rocheux", + text = { + "Commencez la partie avec {C:attention}#1#", + "{C:attention}cartes Pierre supplémentaires" + } + }, + b_braided = { + name = "Jeu tressé", + text = { + "La première main jouée", + "est augmentée au {C:attention}niv. 3" + } + }, + b_anaglyph = { + name = "Jeu anaglyphe", + text = { + "Après avoir battu chaque", + "{C:attention}Boss Blinde{}, gagnez", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "Jeu plasmique", + text = { + "Équilibrez les {C:blue}Jetons{} et le", + "{C:red}Multi.{} lors du calcul du", + "score de la main jouée", + "Taille de la Blinde de base {C:attention}x#1#{}" + } + }, + b_erratic = { + name = "Jeu erratique", + text = { + "Toutes les {C:attention}Valeurs{} et", + "les {C:attention}Couleurs{} du jeu", + "sont aléatoires" + } + }, + b_challenge = { + name = "Jeu du défi", + text = { + "" + } + }, + b_ghost = { + name = "Jeu fantôme", + text = { + "Les cartes {C:spectral}Spectrales{} peuvent", + "apparaître dans le magasin,", + "et commencez avec une carte {C:spectral,T:c_hex}Maléfice{}" + } + }, + b_zodiac = { + name = "Jeu Zodiac", + text = { + "Commencez la partie avec", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "et {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Jeu peint", + text = { + "{C:attention}+#1#{} à la taille de la main", + "{C:red}#2#{} emplacement Joker" + } + } + }, + Other = { + gold_seal = { + name = "Sceau d'or", + text = { + "Gagnez {C:money}3 ${} lorsque cette", + "carte est jouée", + "et marque" + } + }, + white_sticker = { + name = "Autocollant blanc", + text = { + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise {C:attention}blanche{}" + } + }, + red_sticker = { + name = "Autocollant rouge", + text = { + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}rouge{}" + } + }, + green_sticker = { + name = "Autocollant vert", + text = { + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}verte{}" + } + }, + blue_sticker = { + name = "Autocollant bleu", + text = { + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}bleue{}" + } + }, + black_sticker = { + name = "Autocollant noir", + text = { + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}noire{}" + } + }, + purple_sticker = { + name = "Autocollant violet", + text = { + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}violette{}" + } + }, + orange_sticker = { + name = "Autocollant orange", + text = { + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}orange{}" + } + }, + gold_sticker = { + name = "Autocollant d'or", + text = { + "Joker utilisé", + "pour gagner en difficulté", + "{C:attention}Mise{C:attention}d'or{}" + } + }, + playing_card = { + text = { + "{C:light_black}#1# de {V:1}#2#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} Jetons" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1#{} Jetons supplémentaires" + } + }, + locked = { + name = "Bloqué", + text = {} + }, + debuffed_default = { + name = "Affaibli", + text = { + "Toutes les capacités", + "sont désactivées" + } + }, + debuffed_playing_card = { + name = "Affaibli", + text = { + "N'octroie aucun jeton", + "et toutes les capacités", + "sont désactivées" + } + }, + demo_locked = { + name = "Bloqué", + text = { + "Non disponible", + "dans cette démo" + } + }, + demo_shop_locked = { + name = "Bloqué", + text = { + "Carte provenant de la collection personnelle de {C:attention}Jimbo", + "personnelle de {C:attention}Jimbo", + "disponible dans la version", + "complète de {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Bloqué", + text = { + "Projet", + "en cours" + } + }, + deck_locked_win = { + name = "Bloqué", + text = { + "Gagnez une partie avec", + "{C:attention}#1#{}", + "dans n'importe quelle difficulté" + } + }, + deck_locked_discover = { + name = "Bloqué", + text = { + "Découvrez au moins", + "{C:attention}#1#{} objets de", + "votre collection" + } + }, + deck_locked_stake = { + name = "Bloqué", + text = { + "Gagnez une partie avec n'importe quel", + "jeu de difficulté", + "{V:1}#1#{} au minimum" + } + }, + joker_locked_legendary = { + name = "Bloqué", + text = { + "Trouvez ce Joker", + "par la carte {C:spectral}Ame{}" + } + }, + undiscovered_joker = { + name = "Non découvert", + text = { + "Achetez ou utilisez", + "cette carte dans une partie", + "sans seed pour", + "connaître son effet" + } + }, + undiscovered_tarot = { + name = "Non découvert", + text = { + "Achetez ou utilisez", + "cette carte dans une partie", + "sans seed pour", + "connaître son effet" + } + }, + undiscovered_planet = { + name = "Non découvert", + text = { + "Achetez ou utilisez", + "cette carte dans une partie", + "sans seed pour", + "connaître son effet" + } + }, + undiscovered_spectral = { + name = "Non découvert", + text = { + "Achetez ou utilisez", + "cette carte dans une partie", + "sans seed pour", + "connaître son effet" + } + }, + undiscovered_voucher = { + name = "Non découvert", + text = { + "Échangez ce", + "bon d'achat dans une partie", + "sans seed pour", + "connaître son effet" + } + }, + undiscovered_booster = { + name = "Non découvert", + text = { + "Ouvrez ce paquet", + "dans une partie sans seed", + "pour connaître son effet" + } + }, + undiscovered_edition = { + name = "Non découvert", + text = { + "Trouvez cette édition", + "dans une partie sans seed pour", + "pour connaître son effet" + } + }, + undiscovered_tag = { + name = "Non découvert", + text = { + "Utilisez cette étiquette dans", + "une partie sans seed pour", + "connaître son effet" + } + }, + p_arcana_normal = { + name = "Paquet Arcana", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes de{C:tarot} Tarot{} à", + "utiliser immédiatement" + } + }, + p_arcana_jumbo = { + name = "Paquet Jumbo Arcana", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes de{C:tarot} Tarot{} à", + "utiliser immédiatement" + } + }, + p_arcana_mega = { + name = "Paquet Méga-Arcana", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes de{C:tarot} Tarot{} à", + "utiliser immédiatement" + } + }, + p_celestial_normal = { + name = "Paquet Céleste", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes {C:planet} Planète{} à", + "utiliser immédiatement" + } + }, + p_celestial_jumbo = { + name = "Paquet Jumbo Céleste", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes {C:planet} Planète{} à", + "utiliser immédiatement" + } + }, + p_celestial_mega = { + name = "Paquet Méga-Céleste", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes {C:planet} Planète{} à", + "utiliser immédiatement" + } + }, + p_spectral_normal = { + name = "Paquet Spectral", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes {C:spectral}Spectrales{} à", + "utiliser immédiatement" + } + }, + p_spectral_jumbo = { + name = "Paquet Jumbo Spectral", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes {C:spectral}Spectrales{} à", + "utiliser immédiatement" + } + }, + p_spectral_mega = { + name = "Paquet Méga-Spectral", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes {C:spectral}Spectrales{} à", + "utiliser immédiatement" + } + }, + p_standard_normal = { + name = "Paquet Standard", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes{C:attention} à jouer{} à", + "ajouter à votre jeu" + } + }, + p_standard_jumbo = { + name = "Paquet Jumbo Standard", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes{C:attention} à jouer{} à", + "ajouter à votre jeu" + } + }, + p_standard_mega = { + name = "Paquet Méga-Standard", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes{C:attention} à jouer{} à", + "ajouter à votre jeu" + } + }, + p_buffoon_normal = { + name = "Paquet Bouffon", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes {C:joker}Joker{}" + } + }, + p_buffoon_jumbo = { + name = "Paquet Jumbo Bouffon", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes {C:joker}Joker{}" + } + }, + p_buffoon_mega = { + name = "Paquet Méga-Bouffon", + text = { + "Choisissez de {C:attention}#1#{} à", + "{C:attention}#2# cartes {C:joker}Joker{}" + } + }, + pinned_left = { + name = "Épinglé", + text = { + "Ce Joker reste", + "épinglé à la", + "position la plus à gauche" + } + }, + red_seal = { + name = "Sceau rouge", + text = { + "Déclenchez à nouveau cette", + "carte {C:attention}1{} fois" + } + }, + blue_seal = { + name = "Sceau bleu", + text = { + "Crée une carte {C:planet}Planète{}", + "si cette carte est {C:attention}tenue{} en", + "main à la fin de la manche" + } + }, + purple_seal = { + name = "Sceau violet", + text = { + "Crée une carte de {C:tarot}Tarot{}", + "lorsque cette carte est {C:attention}défaussée", + "{C:inactive}(Selon la place disponible)" + } + }, + eternal = { + name = "Éternel", + text = { + "Ne peut être vendu", + "ni détruit" + } + }, + challenge_locked = { + name = "(Verrouillé)", + text = { + "Gagnez une partie avec au moins", + "#1# jeux différents pour débloquer le", + "Mode Défi", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Pique", + Hearts = "Cœur", + Clubs = "Trèfle", + Diamonds = "Carreau" + }, + suits_plural = { + Spades = "Piques", + Hearts = "Cœurs", + Clubs = "Trèfles", + Diamonds = "Carreaux" + }, + blind_states = { + Select = "Sélectionner", + Skipped = "Passé", + Current = "Actuel", + Defeated = "Battu", + Upcoming = "À venir", + Selected = "Sélectionné" + }, + ranks = { + Ace = "As", + King = "Roi", + Queen = "Reine", + Jack = "Valet", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Meilleure main", + furthest_round = "Plus grosse manche", + furthest_ante = "Plus grosse mise initiale", + most_money = "Le plus d'argent", + boss_streak = "Le plus de Boss d'affilée", + collection = "Collection", + win_streak = "Meilleure série de victoires", + current_streak = "", + poker_hand = "Main la plus jouée" + }, + poker_hands = { + ['Flush House'] = "Flush House", + ['Five of a Kind'] = "Cinq cartes identiques", + ['Royal Flush'] = "Quinte flush royale", + ['Straight Flush'] = "Quinte flush", + ['Four of a Kind'] = "Carré", + ['Full House'] = "Full House", + ['Flush'] = "Couleur", + ['Straight'] = "Suite", + ['Three of a Kind'] = "Brelan", + ['Two Pair'] = "Deux paires", + ['Pair'] = "Paire", + ['High Card'] = "Carte Haute", + ['Flush Five'] = "Flush Five" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "Un brelan et une paire", + "avec des cartes de même couleur" + }, + ['Five of a Kind'] = { + "5 cartes de même valeur" + }, + ['Royal Flush'] = { + "5 cartes à la suite {valeurs consécutifs} avec", + "partageant la même couleur" + }, + ['Straight Flush'] = { + "5 cartes à la suite {valeurs consécutifs} avec", + "partageant la même couleur" + }, + ['Four of a Kind'] = { + "4 cartes de même valeur. Elles peuvent", + "être jouées avec une autre carte non marquée" + }, + ['Full House'] = { + "Un brelan et une paire" + }, + ['Flush'] = { + "5 cartes de même couleur" + }, + ['Straight'] = { + "5 cartes dont les valeurs se suivent" + }, + ['Three of a Kind'] = { + "3 cartes de même valeur. Elles peuvent", + "être jouées avec deux autres cartes non marquées" + }, + ['Two Pair'] = { + "2 paires de cartes de valeurs différentes. Elles peuvent", + "être jouées avec une autre carte non marquée" + }, + ['Pair'] = { + "2 cartes de même valeur. Elles peuvent", + "être jouées avec trois autres cartes non marquées" + }, + ['High Card'] = { + "Si la main jouée n'est pas l'une des mains ci-dessus,", + "seule la carte à la valeur la plus élevée est prise en compte" + }, + ['Flush Five'] = { + "5 cartes de même valeur et de même couleur" + } + }, + labels = { + common = "Commun", + uncommon = "Peu commun", + rare = "Rare", + legendary = "Légendaire", + tarot = "Tarot", + planet = "Planète", + pluto_planet = "Planète naine", + voucher = "Bon d'achat", + foil = "Aluminium", + holographic = "Holographique", + polychrome = "Polychrome", + negative = "Négatif", + gold_seal = "Sceau d'or", + locked = "Bloqué", + blue_seal = "Sceau bleu", + red_seal = "Sceau rouge", + purple_seal = "Sceau violet", + eternal = "Éternel", + pinned_left = "Épinglé" + }, + dictionary = { + b_sell = "VENDRE", + b_use = "UTILISER", + b_select = "SÉLECTIONNER", + b_buy = "ACHETER", + b_redeem = "ÉCHANGER", + b_open = "OUVRIR", + b_and_use = "ET UTILISER", + b_next_round_1 = "Manche", + b_next_round_2 = "Suivante", + b_play_hand = "Jouer la main", + b_discard = "Défausser", + b_sort_hand = "Trier la main", + b_run_info_1 = "Partie", + b_run_info_2 = "Infos", + b_options = "Options", + b_reroll_boss = "Nouveau lancer de Boss", + b_skip_blind = "Passer la Blinde", + b_skip_reward = "Passer la Récompense", + b_skip = "Passer", + b_start_new_run = "Nouvelle partie", + b_main_menu = "Menu principal", + b_collection = "Collection", + b_seed = "Seed", + b_copy_seed = "Copier la seed", + b_credits = "Crédits", + b_stats = "Stats", + b_settings = "Paramètres", + b_set_game = "Jeu", + b_set_video = "Vidéo", + b_set_graphics = "Graphismes", + b_set_audio = "Audio", + b_set_gamespeed = "Vitesse du jeu", + b_set_play_discard_pos = "Position du bouton Jouer/Défausser", + b_set_screenshake = "Tremblement de l'écran", + b_set_crash_reports = "Rapports de plantage", + b_set_monitor = "Écran d'affichage", + b_set_windowmode = "Mode Fenêtré", + b_set_apply = "Appliquer", + b_set_master_vol = "Volume principal", + b_set_music_vol = "Volume de la musique", + b_set_game_vol = "Volume du jeu", + b_set_shadows = "Ombres", + b_set_pixel_smoothing = "Lissage du Pixel Art", + b_set_CRT = "CRT", + b_set_CRT_bloom = "Flou CRT", + b_stat_jokers = "Jokers", + b_stat_consumables = "Consommables", + b_stat_tarots = "Tarots", + b_stat_planets = "Planètes", + b_stat_spectrals = "Spectrales", + b_stat_vouchers = "Bons d'achat", + b_next = "Suivant", + b_endless = "Mode Interminable", + b_wishlist = "Mettre dans la liste de souhaits Steam", + b_playbalatro = "Visiter playbalatro.com", + b_remaining = "Restant", + b_full_deck = "Jeu complet", + b_poker_hands = "Mains de poker", + b_blinds = "Blindes", + b_vouchers = "Bons d'achat", + b_stake = "Mise", + b_jokers = "Jokers", + b_tarot_cards = "Cartes de Tarot", + b_planet_cards = "Cartes Planète", + b_spectral_cards = "Cartes Spectrales", + b_enhanced_cards = "Cartes améliorées", + b_editions = "Éditions", + b_booster_packs = "Paquets Booster", + b_tags = "Étiquettes", + b_decks = "Jeux", + b_continue = "Continuer", + b_back = "Retour", + b_music = "Musique", + b_sounds = "Sons", + b_imagery = "Imagerie", + b_new_run = "Nouvelle partie", + b_challenges = "Défis", + b_current_profile = "Profil actuel", + b_load_profile = "Charger un profil", + b_create_profile = "Créer un profil", + b_delete_profile = "Supprimer un profil", + b_reset_profile = "Réinitialiser un profil", + b_rules = "Règles", + b_restrictions = "Restrictions", + b_deck = "Jeu", + b_play_cap = "JOUER", + b_options_cap = "OPTIONS", + b_collection_cap = "COLLECTION", + b_quit_cap = "QUITTER", + b_cash_out = "Convertir", + k_unknown = "?????", + k_compatible = "compatible", + k_incompatible = "incompatible", + k_round = "Manche", + k_ante = "Mise initiale", + k_seed = "La seed", + k_reroll = "Nouveau lancer", + k_mult = "Multi.", + k_rank = "Valeur", + k_suit = "Couleur", + k_stake = "Mise", + k_common = "Commun", + k_uncommon = "Peu commun", + k_rare = "Rare", + k_legendary = "Légendaire", + k_debuffed = "Affaibli", + k_locked = "Bloqué", + k_undisovered = "Non découvert", + k_joker = "Joker", + k_voucher = "Bon d'achat", + k_tarot = "Tarot", + k_planet = "Planète", + k_dwarf_planet = "Planète naine", + k_planet_q = "Planète ?", + k_spectral = "Spectral", + k_booster = "Booster", + k_edition = "Édition", + k_hud_hands = "Mains", + k_hud_discards = "Défausses", + k_lower_score = "score", + k_arcana_pack = "Paquet Arcana", + k_celestial_pack = "Paquet Céleste", + k_spectral_pack = "Paquet Spectral", + k_standard_pack = "Paquet Standard", + k_buffoon_pack = "Paquet Bouffon", + k_enter_text = "Saisir le texte", + k_defeated_by = "Battu par", + k_level_prefix = "niv.", + k_also_applied = "A également appliqué", + k_base_cards = "Cartes de base", + k_effective = "Efficace", + k_aces = "As", + k_face_cards = "Cartes Figure", + k_numbered_cards = "Cartes numérotées", + k_cap_consumables = "CONSOMMABLES", + k_page = "Page", + k_ante_cap = "MISE INITIALE", + k_base_cap = "BASE", + k_jokers_cap = "JOKERS", + k_vouchers_cap = "BONS D'ACHAT", + k_x_base = "X la base", + k_not_discovered = "Non découvert", + k_unlocked_ex = "Débloqué !", + k_challenge_mode = "Mode Défi", + k_daily_run = "Partie quotidienne", + k_profile = "Profil", + k_wins = "Victoires", + k_empty_caps = "VIDE", + k_collection = "Collection", + k_stake_level = "Niveau de mise", + k_none = "Aucun", + k_game_modifiers = "Modificateurs de jeu", + k_custom_rules = "Règles personnalisées", + k_banned_cards = "Cartes bannies", + k_banned_tags = "Étiquettes bannies", + k_other = "Autre", + k_money = "Argent", + k_best_hand = "Meilleure main", + k_seeded_run = "Partie avec seed", + k_enter_seed = "Entrer la seed", + k_lvl = "niv.", + k_skipped_cap = "PASSÉ", + k_no_reward = "Pas de récompense", + k_reward = "Récompense", + k_nope_ex = "Non !", + k_or = "ou", + k_balanced = "Équilibré", + ph_improve_run = "Améliorez votre partie !", + ph_sneak_peek = "Coup d'œil furtif", + ph_deck_preview_stones = "Pierres", + ph_deck_preview_effective = "Total effectif grâce aux Jokers, aux Blindes et aux améliorations de cartes", + ph_blind_score_at_least = "Faire un score d'au moins", + ph_blind_reward = "Récompense : ", + ph_up_ante_1 = "Atteindre la mise initiale", + ph_up_ante_2 = "Augmenter toutes les Blindes", + ph_up_ante_3 = "Actualiser les Blindes", + ph_stat_joker = "Nombre total de manches effectuées avec cette carte", + ph_stat_consumable = "Nombre de fois où cette carte a été utilisée", + ph_stat_voucher = "Nombre de fois où ce bon d'achat a été utilisé", + ph_demo_thanks_1 = "Merci d'avoir joué à la", + ph_demo_thanks_2 = "DÉMO DE BALATRO", + ph_game_over = "PARTIE TERMINÉE", + ph_vouchers_redeemed = "Bons utilisés pendant cette partie", + ph_no_vouchers = "Pas de bons utilisés pendant cette partie", + ph_defeat_this_blind_1 = "Battez cette Blinde", + ph_defeat_this_blind_2 = "pour la découvrir", + ph_click_confirm = "Cliquez à nouveau pour confirmer", + ph_choose_blind_1 = "Choisissez votre", + ph_choose_blind_2 = "prochaine Blinde", + ph_mr_bones = "Sauvé par M. Bones", + ph_score_at_least = "Faire un score d'au moins", + ph_all_poker_hand = "Toutes les mains de poker", + ph_1_level = "+1 Niveau", + ph_boss_disabled = "Bosse désactivé !", + ph_most_played = "(main la plus jouée)", + ml_demo_thanks_message = { + "Pensez à ajouter Balatro", + "à votre liste de souhaits sur Steam et à vous inscrire", + "à la newsletter sur playbalatro.com" + }, + ml_eternal = { + "Eternel", + "Ne peut être vendu", + "ni détruit" + }, + ml_gold_seal_desc = { + "Le sceau d'or", + "retourne en main", + "s'il est joué" + }, + ml_crash_report_info = { + "Les rapports de plantage seront envoyés aux développeurs", + "afin de limiter les problèmes à l'avenir.", + "Aucune information personnelle ou d'identification ne sera envoyée." + }, + ml_play_discard_pos_opt = { + "Défausser/Jouer", + "Jouer/Défausser" + }, + ml_windowmode_opt = { + "Fenêtré", + "Plein écran", + "Sans bordures" + }, + ml_vsync_opt = { + "Synchro V. Activée", + "Synchro V. Désact." + }, + ml_shadow_opt = { + "Activées", + "Désactivées" + }, + ml_smoothing_opt = { + "Désactivé", + "Activé" + }, + ml_bloom_opt = { + "Désactivé", + "Activé" + }, + ml_card_stats = { + "Carte", + "Stats" + }, + ml_paste_seed = { + "Coller", + "La seed" + }, + ml_disabled_seed = { + "Tous les déblocages et les", + "découvertes désactivés" + }, + ['$'] = "$", + k_redeemed_ex = "Échangé !", + k_duplicated_ex = "Dupliqué !", + k_no_room_ex = "Pas de place !", + k_no_space_ex = "Pas de place !", + k_no_other_jokers = "Pas d'autres Jokers !", + k_plus_tarot = "+1 Tarot", + k_plus_stone = "+1 Pierres", + k_plus_planet = "+1 Planète", + k_plus_spectral = "+1 Spectral", + k_active_ex = "Actif !", + k_level_up_ex = "Niveau supérieur !", + k_upgrade_ex = "Améliorer !", + k_again_ex = "Encore !", + k_val_up = "Valeur supérieure !", + k_reset = "Réinitialiser", + k_extinct_ex = "Détruit !", + k_safe_ex = "Sûr !", + k_saved_ex = "Sauvegardé !", + k_swapped_ex = "Échangé !", + k_copied_ex = "Copié !", + k_melted_ex = "Fondu !", + b_copy = "Copie", + b_high_contrast_cards = "Cartes à haut contraste", + b_set_rumble = "Vibrations de la manette", + b_seals = "Sceaux", + b_new_challenge = "Commencer un nouveau Défi", + b_unlock_all = "Tout débloquer", + k_active = "actif", + k_deck = "Jeu", + k_progress = "Progression", + k_challenges = "Défis", + k_joker_stickers = "Autocollants Joker", + k_deck_stake_wins = "Victoires de mise de jeu", + k_enter_name = "Saisissez votre nom", + k_gold = "Or", + k_card_stats = "Stats des cartes", + k_view = "Afficher", + k_all_hands = "Toutes les mains", + k_high_score_ex = "Meilleur score !", + k_demo_version_ex = "Version de démonstration !", + k_playing_as = "Joue en tant que", + k_choose = "Choisir", + k_achievements_disabled = "Succès désactivés", + ph_no_boss_active = "aucun boss actif", + ph_you_win = "VOUS AVEZ GAGNÉ !", + ph_you_win_demo = "VOUS AVEZ TERMINÉ LA DÉMO !", + ph_defeat_the_boss = "Battez la Boss Blinde", + ph_score_furthest_ante = "Mise initiale", + ph_score_furthest_round = "Manche", + ph_score_hand = "Meilleure main", + ph_score_poker_hand = "Main la plus jouée", + ph_score_new_collection = "Nouvelles découvertes", + ph_score_cards_played = "Cartes jouées", + ph_score_cards_discarded = "Cartes défaussées", + ph_score_times_rerolled = "Nombre de nouveaux lancers", + ph_score_cards_purchased = "Cartes achetées", + ml_edition_seal_enhancement_explanation = { + "Les cartes à jouer peuvent toutes recevoir une", + "Amélioration, une Édition et un Sceau" + }, + ml_unlock_all_explanation = { + "ATTENTION ! Si vous débloquez la collection complète,", + "tous les succès seront désactivés sur ce profil !" + }, + k_plus_joker = "+1 Joker", + k_eaten_ex = "Mangé !", + k_eroded_ex = "Érodé !", + k_achievement = "Succès", + ph_unscored_hand = "La main ne marquera pas de points", + ph_alert_debuff_confirm = "Appuyez à nouveau sur « Jouer » pour confirmer", + k_drank_ex = "Belle descente !", + k_trophy = "Trophée", + k_trophies_disabled = "Trophées désactivés", + ml_unlock_all_trophies = { + "ATTENTION ! Si vous débloquez la collection complète,", + "désactivera les trophées sur ce profil !" + }, + k_poker_hand = "main de poker", + ph_4_7_of_clubs = "quatre 7 de trèfles" + }, + v_dictionary = { + a_xmult = "Multi. x#1#", + a_mult = "+#1# Multi", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# Taille de la main", + a_hands = "+#1# Mains", + a_sold_tally = "#1#/#2# Vendu", + a_remaining = "#1# Restant", + ante_x_voucher = "MISE INITIALE #1# BON D'ACHAT", + loyalty_active = "Actif !", + loyalty_inactive = "#1# restant", + deck_preview_wheel_singular = "Les nombres peuvent être inférieurs en raison de la carte #1# tirée face cachée", + deck_preview_wheel_plural = "Les nombres peuvent être inférieurs en raison des cartes #1# tirées faces cachées", + challenges_completed = "#1#/#2# Défis terminés", + interest = "#1# d'intérêt tous les #2# $ (#3# max.)", + remaining_hand_money = "Mains restantes (#1# $ chacune)", + remaining_discard_money = "Défausses restantes (#1# $ chacune)", + ml_foil_desc = { + "Aluminium", + "+#1# Chips" + }, + ml_holo_desc = { + "Holographique", + "+#1# Multi." + }, + ml_polychrome_desc = { + "Polychrome", + "Multi. x#1#" + }, + ml_negative_desc = { + "Négatif", + "+#1# Emplacement Joker" + }, + a_mult_minus = "Multi. -#1#", + a_handsize_minus = "Taille de la main -#1#", + ml_negative_consumable_desc = { + "Négatif", + "+#1# emplacement de consommable" + }, + a_xmult_minus = "-Multi. x#1#", + unlocked = "#1#/#2# débloqués", + completed = "#1#/#2# complétés" + }, + v_text = { + ch_m_dollars = { + "Commencez avec {C:money}#1# $" + }, + ch_m_hands = { + "{C:blue}#1#{} mains par manche" + }, + ch_m_discards = { + "{C:red}#1#{} défausses par manche" + }, + ch_m_reroll_cost = { + "Coût de base de nouveau lancer égal à {C:money}#1# ${}" + }, + ch_m_joker_slots = { + "{C:attention}#1#{} emplacements Joker" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} Emplacements Consommable" + }, + ch_m_hand_size = { + "Taille de la main : {C:attention}#1#{}" + }, + ch_m_none = { + "{C:inactive}Aucun" + }, + ch_c_no_reward = { + "Toutes les {C:attention}Blindes{} ne donnent pas d'argent en récompense" + }, + ch_c_no_reward_specific = { + "Les {C:attention}#1#Blindes{} ne donnent pas d'argent en récompense" + }, + ch_c_no_extra_hand_money = { + "Les {C:blue}Mains{} supplémentaires ne rapportent plus d'argent" + }, + ch_c_no_interest = { + "Vous ne percevez pas d'{C:attention}intérêts{} à la fin de la manche" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}Défi du jour !" + }, + ch_c_set_seed = { + "1 tentative avec la seed défini : {C:inactive}{Hidden}" + }, + ch_c_chips_dollar_cap = { + "Les {C:blue}Jetons{} ne peuvent pas dépasser le montant actuel de {C:money}$" + }, + ch_c_none = { + "{C:inactive}Aucun" + }, + ch_c_inflation = { + "Augmente de manière permanente les prix de {C:money}1 ${} à chaque achat" + }, + ch_c_discard_cost = { + "Chaque défausse coûte {C:money}#1# ${}" + }, + ch_c_all_eternal = { + "Tous les Jokers du magasin sont {C:eternal}Éternels{}" + }, + ch_c_flipped_cards = { + "{C:green}1 carte sur #1#{} est tirée face cachée" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Vous pouvez tenir {C:red}-1{} cartes en main par tranche de {C:money}#1# ${} en votre possession" + }, + ch_c_no_shop_jokers = { + "Les Jokers n'apparaissent plus dans le {C:attention}magasin" + }, + ch_c_debuff_played_cards = { + "Toutes les cartes {C:attention}jouées{} deviennent {C:attention}Affaiblies{} après avoir marqué des points" + }, + ch_c_set_eternal_ante = { + "Lorsque le boss de la mise initiale {C:attention}#1#{} est vaincu, tous les Jokers deviennent {C:attention}éternels" + }, + ch_c_set_joker_slots_ante = { + "Lorsque le boss de la mise initiale {C:attention}#1#{} est vaincu, les emplacements Joker passent à {C:attention}0" + } + }, + tutorial = { + sb_1 = { + "Bien le bonjour ! Je m'appelle", + "{C:attention}Jimbo{}, et je suis là pour vous", + "apprendre à jouer !" + }, + sb_2 = { + "L'objectif est de gagner des", + "{C:blue}Jetons{} pour vaincre", + "la {C:attention}Blinde ennemie" + }, + sb_3 = { + "Ceci est une {C:blue}Petite Blinde{},", + "qui ne requerra qu'un score de", + "{C:attention}300 Jetons{} pour la battre." + }, + sb_4 = { + "Sélectionnez la {C:blue}Petite Blinde", + "pour commencer la manche !" + }, + bb_1 = { + "La {C:attention}Grosse Blinde", + "vous rapportera de l'argent" + }, + bb_2 = { + "Mais vous pouvez choisir de {C:attention}la passer", + "pour obtenir une {C:attention}Étiquette{} ! Chaque", + "{C:attention}Étiquette{} possède un effet unique" + }, + bb_3 = { + "Néanmoins, vous devez garder un œil", + "sur la {C:attention}Boss Blinde{}. Elle", + "a une capacité dont il", + "vous faudra tenir compte." + }, + bb_4 = { + "Si vous la battez, la", + "{C:attention}Mise initiale{} augmente et toutes les", + "{C:attention}Blindes{} deviennent plus difficiles" + }, + bb_5 = { + "Battez la {C:attention}Mise initiale{} #1# pour gagner.", + "Choisissez votre voie !" + }, + fh_1 = { + "Vous gagnez des Jetons en", + "jouant des {C:attention}mains de Poker" + }, + fh_2 = { + "Chaque {C:attention}main de Poker{} rapporte un", + "montant de base de {C:blue}Jetons", + "multiplié par le {C:red}Multi." + }, + fh_3 = { + "Regardez vos {C:attention}mains de Poker", + "dans la zone {C:attention}Infos sur la partie{},", + "ainsi que d'autres informations", + "sur votre partie en cours" + }, + fh_4 = { + "Les cartes vous rapportent", + "également des {C:blue}Jetons{},", + "passez votre souris dessus pour savoir combien !" + }, + fh_5 = { + "À présent, choisissez jusqu'à", + "{C:attention}5{} cartes à jouer", + "et appuyez sur {C:blue}Jouer la main" + }, + fh_6 = { + "Vous pouvez également {C:red}Défausser{} jusqu'à", + "{C:attention}5{} cartes sélectionnées", + "pour essayer de créer des", + "mains encore plus fortes. Essayez !" + }, + fh_7 = { + "Attention ! Vous ne disposez que d'un", + "nombre limité de {C:blue}Mains", + "et de {C:red}Défausses{} par manche" + }, + fh_8 = { + "Gagnez {C:attention}300 Jetons{} avant", + "de manquer de {C:blue}Mains", + "pour remporter cette manche.", + "Bonne chance !" + }, + sh_1 = { + "Quand vous obtiendrez d'autres cartes,", + "pensez à les réorganiser.", + "Les{C:attention} Jokers{} se déclenchent", + "de gauche à droite" + }, + sh_2 = { + "Ah, et n'oubliez pas", + "d'{C:attention}UTILISER{} vos consommables !" + }, + sh_3 = { + "Sélectionnez jusqu'à {C:attention}2{} cartes", + "dans votre main et appuyez sur", + "{C:attention}UTILISER{} sur la carte {C:tarot}Tarot{}", + "pour les améliorer !" + }, + s_1 = { + "Beau travail ! Maintenant", + "que vous {E:1}nagez{} dans l'{C:money}or{},", + "vous pouvez acheter de nouvelles", + "cartes dans le {C:attention}Magasin" + }, + s_2 = { + "Essayez d'acheter cette", + "jolie carte de diable" + }, + s_3 = { + "C'est l'un des {C:attention}#1#", + "{C:attention}Jokers{} que vous pouvez ajouter à", + "votre partie. Chaque {C:attention}Joker", + "a un effet différent" + }, + s_4 = { + "Celui-ci ajoute un {C:red}Multi. +4{} à", + "chaque main que vous jouez !" + }, + s_5 = { + "Soyez sélectif, car vous ne pourrez", + "transporter que {C:attention}5 cartes Joker{}", + "à la fois" + }, + s_6 = { + "À présent, achetez cette autre", + "carte dans le {C:attention}Magasin" + }, + s_7 = { + "Cette carte de {C:tarot}Tarot{} est un", + "{C:attention}Consommable{}. Celle-là", + "améliore vos cartes", + "à jouer ! Gardez-la précieusement." + }, + s_8 = { + "Vous pouvez transporter jusqu'à", + "{C:attention}2 cartes Consommable{}", + "à la fois" + }, + s_9 = { + "Si vous économisez assez,", + "vous pouvez acheter un {C:attention}Bon d'achat{}.", + "Les {C:attention}Bons d'achat{} améliorent", + "votre partie de manière passive !" + }, + s_10 = { + "Les {C:attention}Bons d'achat{} sont réapprovisionnés", + "lorsque vous battez la", + "{C:attention}Boss Blinde{}." + }, + s_11 = { + "Pensez à regarder les deux", + "{C:booster}Paquets Booster{} dans", + "chaque magasin. Ils", + "renferment de belles surprises !" + }, + s_12 = { + "Passons maintenant à", + "la {C:attention}manche suivante{}." + } + }, + achievement_names = { + ante_up = "Mise initiale augmentée !", + ante_upper = "Mise initiale encore augmentée !", + heads_up = "Tête-à-tête", + low_stakes = "Mises faibles", + mid_stakes = "Mises moyennes", + high_stakes = "Mises élevées", + card_player = "Joueur de cartes", + card_discarder = "Défausseur de cartes", + nest_egg = "Bas de laine", + flushed = "Coloré", + speedrunner = "Speedrunner", + roi = "Investisseur", + shattered = "En miettes", + royale = "Royal", + retrograde = "Rétrograde", + _10k = "10 000", + _1000k = "1 000 000", + _100000k = "100 000 000", + tiny_hands = "Petites mains", + big_hands = "Grandes mains", + you_get_what_you_get = "À prendre ou à laisser", + rule_bender = "Transgresseur", + rule_breaker = "Briseur de règles", + legendary = "Légendaire", + astronomy = "Astronomie", + cartomancy = "Cartomancie", + clairvoyance = "Clairvoyance", + extreme_couponer = "Chasseur de coupons", + completionist = "Jusqu'au-boutiste", + completionist_plus = "Jusqu'au-boutiste+", + completionist_plus_plus = "Jusqu'au-boutiste++" + }, + achievement_descriptions = { + ante_up = "Atteignez la mise initiale 4", + ante_upper = "Atteignez la mise initiale 8", + heads_up = "Gagnez une partie", + low_stakes = "Gagnez une partie en difficulté Mise rouge au minimum", + mid_stakes = "Gagnez une partie en difficulté Mise noire au minimum", + high_stakes = "Gagnez une partie en difficulté Mise d'or au minimum", + card_player = "Jouez au moins 2 500 cartes", + card_discarder = "Défaussez au moins 2 500 cartes", + nest_egg = "Vous devez accumuler 400 $ ou plus en une seule partie", + flushed = "Jouez une couleur avec 5 cartes Libres", + speedrunner = "Gagnez une partie en 12 manches ou moins", + roi = "Achetez 5 bons d'achat avant la mise initiale 4", + shattered = "Cassez 2 cartes de verre en une seule main", + royale = "Jouez une Quinte flush royale", + retrograde = "Faites passer une main de poker au niveau 10", + _10k = "Gagnez 10 000 Jetons en une seule main", + _1000k = "Gagnez 1 000 000 de Jetons en une seule main", + _100000k = "Gagnez 100 000 000 de Jetons en une seule main", + tiny_hands = "Réduisez votre jeu à 20 cartes ou moins", + big_hands = "Vous devez avoir 80 cartes ou plus dans votre jeu", + you_get_what_you_get = "Gagnez une partie sans effectuer aucun nouveau lancer dans le magasin", + rule_bender = "Terminez n'importe quelle partie de Défi", + rule_breaker = "Terminez toutes les parties de Défi", + legendary = "Découvrez un Joker Légendaire", + astronomy = "Découvrez toutes les cartes Planète", + cartomancy = "Découvrez toutes les cartes de Tarot", + clairvoyance = "Découvrez toutes les cartes Spectrales", + extreme_couponer = "Découvrez tous les bons d'achat", + completionist = "Découvrez 100 % de votre collection", + completionist_plus = "Gagnez avec tous les jeux en difficulté Mise d'or", + completionist_plus_plus = "Gagnez un Autocollant d'or sur chaque Joker" + }, + quips = { + wq_1 = { + "Vous êtes un As !" + }, + wq_2 = { + "Vous avez bien géré", + "la situation !" + }, + wq_3 = { + "Vous ne bluffiez pas,", + "apparemment !" + }, + wq_4 = { + "Dommage que tous ces", + "jetons soient", + "virtuels..." + }, + wq_5 = { + "Mes enseignements ont", + "porté leurs fruits !" + }, + wq_6 = { + "Vous avez pris", + "de judicieuses décisions !" + }, + wq_7 = { + "Heureusement", + "que je n'ai pas misé", + "contre vous !" + }, + lq_1 = { + "On ferait peut-être", + "mieux de jouer à", + "la pêche..." + }, + lq_2 = { + "On se couche", + "comme des dégonflés !" + }, + lq_3 = { + "Il va falloir", + "reprendre nos esprits", + "avant de reprendre la main !" + }, + lq_4 = { + "Vous savez ce qu'on dit,", + "à la fin, c'est toujours", + "le casino qui gagne !" + }, + lq_5 = { + "Eh bien, je crois que", + "le vrai Joker,", + "c'est vous !" + }, + lq_6 = { + "Oh non, vous bluffiez", + "aussi ?" + }, + lq_7 = { + "On n'a pas l'air", + "fins !" + }, + lq_8 = { + "Si j'avais des mains,", + "je me serais couvert", + "les yeux !" + }, + lq_9 = { + "Je suis un bouffon,", + "au sens propre, et vous,", + "quelle est votre excuse ?" + }, + lq_10 = { + "Quel flop !" + }, + dq_1 = { + "Aïe ! J'espère que vous", + "avez caché quelques cartes", + "dans votre manche pour", + "relever ce dernier défi !" + } + }, + challenge_names = { + c_omelette_1 = "L'Omelette", + c_city_1 = "Ville du quart d'heure", + c_rich_1 = "Enrichir les riches", + c_knife_1 = "Sur le fil du rasoir", + c_xray_1 = "Vision aux rayons X", + c_mad_world_1 = "Monde de fous", + c_luxury_1 = "Taxe de luxe", + c_non_perishable_1 = "Non périssable", + c_medusa_1 = "Méduse", + c_double_nothing_1 = "Quitte ou double", + c_typecast_1 = "Typecasting", + c_inflation_1 = "Inflation", + c_bram_poker_1 = "Bram Poker", + c_fragile_1 = "Fragile", + c_monolith_1 = "Monolithe", + c_blast_off_1 = "Mise à feu", + c_five_card_1 = "Tirage à cinq cartes", + c_golden_needle_1 = "Aiguille d'or", + c_cruelty_1 = "Cruauté", + c_jokerless_1 = "Sans blague" + } + } +} \ No newline at end of file diff --git a/localization/id.lua b/localization/id.lua new file mode 100644 index 0000000..b4e6331 --- /dev/null +++ b/localization/id.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Joker", + text = { + "{C:red,s:1.1}+#1#{} Mult" + } + }, + j_jolly = { + name = "Jolly Joker", + text = { + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + } + }, + j_zany = { + name = "Zany Joker", + text = { + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + } + }, + j_mad = { + name = "Mad Joker", + text = { + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + } + }, + j_crazy = { + name = "Crazy Joker", + text = { + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + } + }, + j_droll = { + name = "Droll Joker", + text = { + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + } + }, + j_half = { + name = "Half Joker", + text = { + "{C:red}+#1#{} Mult jika hand", + "yang dimainkan berisi", + "{C:attention}#2#{} atau kartu lebih sedikit" + } + }, + j_fortune_teller = { + name = "Fortune Teller", + text = { + "{C:red}+#1#{} Mult per", + "kartu {C:purple}Tarot{} dipakai", + "{C:inactive}(Saat ini {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Juggler", + text = { + "{C:attention}+#1#{} ukuran hand" + } + }, + j_drunkard = { + name = "Drunkard", + text = { + "{C:red}+#1#{} discard" + } + }, + j_stone = { + name = "Stone Joker", + text = { + "Joker ini memperoleh {C:chips}+#1#{} Chip", + "untuk setiap {C:attention}Stone Card", + "di deck lengkap Anda", + "{C:inactive}(Saat ini {C:chips}+#2#{C:inactive} Chip)" + } + }, + j_golden = { + name = "Golden Joker", + text = { + "Dapatkan {C:money}$#1#{} di", + "akhir babak" + } + }, + j_stencil = { + name = "Joker Stencil", + text = { + "{X:red,C:white} X1 {} Mult untuk setiap", + "slot {C:attention}Joker{} yang kosong", + "{s:0.8}termasuk Joker Stencil", + "{C:inactive}(Saat ini {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Four Fingers", + text = { + "Semua {C:attention}Flush{} dan", + "{C:attention}Straight{} bisa", + "dilakukan dengan {C:attention}4{} kartu" + } + }, + j_mime = { + name = "Mime", + text = { + "Picu lagi semua", + "kartu yang {C:attention}disimpan dalam", + "kemampuan {C:attention}hand{}" + } + }, + j_credit_card = { + name = "Credit Card", + text = { + "Tingkatkan ke", + "{C:red}-$#1#{} berutang" + } + }, + j_greedy_joker = { + name = "Greedy Joker", + text = { + "Kartu yang dimainkan dengan", + "{C:diamonds}#2#{} rupa memberikan", + "{C:mult}+#1#{} Mult saat menang" + } + }, + j_lusty_joker = { + name = "Lusty Joker", + text = { + "Kartu yang dimainkan dengan", + "{C:hearts}#2#{} rupa memberikan", + "{C:mult}+#1#{} Mult saat menang" + } + }, + j_wrathful_joker = { + name = "Wrathful Joker", + text = { + "Kartu yang dimainkan dengan", + "{C:spades}#2#{} rupa memberikan", + "{C:mult}+#1#{} Mult saat menang" + } + }, + j_gluttenous_joker = { + name = "Gluttonous Joker", + text = { + "Kartu yang dimainkan dengan", + "{C:clubs}#2#{} rupa memberikan", + "{C:mult}+#1#{} Mult saat menang" + } + }, + j_ceremonial = { + name = "Ceremonial Dagger", + text = { + "Ketika {C:attention}Blind{} dipilih,", + "menghancurkan Joker ke sebelah kanan", + "dan secara permanen {C:attention}menggandakan", + "nilai jualnya ke Mult {C:red}ini", + "{C:inactive}(Saat ini {C:mult}+#1#{C:inactive} Mult)" + } + }, + j_banner = { + name = "Banner", + text = { + "{C:chips}+#1#{} Chip untuk", + "setiap sisa", + "{C:attention}discard" + } + }, + j_mystic_summit = { + name = "Mystic Summit", + text = { + "{C:mult}+#1#{} Mult ketika", + "{C:attention}#2#{} discard", + "sisa" + } + }, + j_marble = { + name = "Marble Joker", + text = { + "Menambah satu kartu {C:attention}Stone{}", + "ke deck saat", + "{C:attention}Blind{} dipilih" + } + }, + j_loyalty_card = { + name = "Loyalty Card", + text = { + "{X:red,C:white} X#1# {} Mult setiap", + "{C:attention}#2#{} hand yang dimainkan", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "8 Ball", + text = { + "Memunculkan sebuah kartu {C:planet}Planet{}", + "jika hand yang dimainkan berisi", + "{C:attenetion}#1#{} atau lebih {C:attention}8s{}", + "{C:inactive}(Harus memiliki tempat)" + } + }, + j_misprint = { + name = "Misprint", + text = { + "" + } + }, + j_dusk = { + name = "Dusk", + text = { + "Picu lagi semua kartu", + "kartu di {C:attention}final", + "{C:attention}hand{} dari babak" + } + }, + j_raised_fist = { + name = "Raised Fist", + text = { + "Menambah {C:attention}dobel{} peringkat", + "kartu {C:attention}terendah{} yang dipegang", + "di tangan untuk Mult" + } + }, + j_chaos = { + name = "Chaos the Clown", + text = { + "{C:attention}#1#{} Reroll {C:green}gratis", + "per toko" + } + }, + j_fibonacci = { + name = "Fibonacci", + text = { + "Setiap {C:attention}As{} yang dimainkan,", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{}, atau {C:attention}8{} memberikan", + "{C:mult}+#1#{} Mult saat menang" + } + }, + j_steel_joker = { + name = "Steel Joker", + text = { + "Joker ini memperoleh {X:mult,C:white} X#1# {} Mult", + "untuk setiap {C:attention}Steel Card", + "di deck lengkap Anda", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_scary_face = { + name = "Scary Face", + text = { + "Face {C:attention}card{} yang dimainkan", + "memberikan {C:chips}+#1#{} Chip", + "saat menang" + } + }, + j_abstract = { + name = "Abstract Joker", + text = { + "{C:mult}+#1#{} Mult untuk", + "setiap kartu {C:attention}Joker{}", + "{C:inactive}(Saat ini {C:red}+#2#{C:inactive} Mult)" + } + }, + j_delayed_grat = { + name = "Delayed Gratification", + text = { + "Dapatkan {C:money}$#1#{} per {C:attention}discard{} jika", + "tidak ada discard yang dipakai", + "pada akhir babak" + } + }, + j_hack = { + name = "Impostor", + text = { + "Picu lagi", + "setiap dimainkan", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{}, atau {C:attention}5{}" + } + }, + j_pareidolia = { + name = "Pareidolia", + text = { + "Semua kartu", + "dianggap", + "{C:attention}Kartu{} Wajah" + } + }, + j_gros_michel = { + name = "Gros Michel", + text = { + "{C:mult}+#1#{} Mult", + "{C:green}#2# dalam #3#{} peluang kartu", + "ini dihancurkan", + "di akhir babak" + } + }, + j_even_steven = { + name = "Even Steven", + text = { + "Kartu yang dimainkan dengan", + "peringkat {C:attention}genap{} memberikan", + "{C:mult}+#1#{} Mult saat menang", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "Odd Todd", + text = { + "Kartu yang dimainkan dengan", + "peringkat {C:attention}ganjil{} memberikan", + "{C:chips}+#1#{} Chip saat menang", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Scholar", + text = { + "Setiap {C:attention}As{} yang dimainkan", + "memberi {C:chips}+#2#{} Chip", + "and {C:mult}+#1#{} Mult", + "saat menang" + } + }, + j_business = { + name = "Business Card", + text = { + "Face {C:attention}card{} yang dimainkan memiliki", + "sebuah {C:green}#1# dalam #2#{} peluang untuk", + "memberikan {C:money}$2{} saat menang" + } + }, + j_supernova = { + name = "Supernova", + text = { + "Menambah berkali-", + "kali {C:attention}poker hand{} yang", + "telah dimainkan untuk Mult" + } + }, + j_ride_the_bus = { + name = "Ride the Bus", + text = { + "{C:mult}+#1#{} Mult per", + "hand berturut-turut", + "yang dimainkan tanpa sebuah", + "kemenangan {C:attention}kartu{} wajah", + "{C:inactive}(Saat ini {C:mult}+#2#{C:inactive} Mult)" + } + }, + j_space = { + name = "Space Joker", + text = { + "{C:green}#1# dalam #2#{} peluang untuk", + "upgrade level dari", + "{C:attention}poker hand{} yang dimainkan" + } + }, + j_egg = { + name = "Egg", + text = { + "Memperoleh {C:money}$#1#{} dari", + "{C:attention}nilai jual{} di", + "akhir babak" + } + }, + j_burglar = { + name = "Burglar", + text = { + "Ketika {C:attention}Blind{} dipilih,", + "memperoleh {C:blue}+#1#{} Hand dan", + "{C:attention}kehilangan semua discard" + } + }, + j_blackboard = { + name = "Blackboard", + text = { + "{X:red,C:white} X#1# {} Mult jika semua", + "kartu yang ada di tangan", + "adalah {C:spades}#2#{} atau {C:clubs}#3#{}" + } + }, + j_runner = { + name = "Runner", + text = { + "Memperoleh {C:chips}+#2#{} Chip", + "jika hand yang dimainkan", + "berisi sebuah {C:attention}Straight{}", + "{C:inactive}(Saat ini {C:chips}+#1#{C:inactive} Chip)" + } + }, + j_ice_cream = { + name = "Ice Cream", + text = { + "{C:chips}+#1#{} Chip", + "{C:chips}-#2#{} Chip untuk", + "setiap hand yang dimainkan" + } + }, + j_dna = { + name = "DNA", + text = { + "Jika {C:attention}hand pertama{} dari babak", + "hanya memiliki {C:attention}1{} kartu, tambahkan", + "salinan permanen ke deck", + "dan ambil ke {C:attention}hand" + } + }, + j_splash = { + name = "Splash", + text = { + "Setiap {C:attention}kartu yang dimainkan", + "dihitung dalam kemenangan" + } + }, + j_blue_joker = { + name = "Blue Joker", + text = { + "{C:chips}+#1#{} Chip untuk setiap", + "kartu yang tersisa di {C:attention}deck", + "{C:inactive}(Saat ini {C:chips}+#2#{C:inactive} Chip)" + } + }, + j_sixth_sense = { + name = "Sixth Sense", + text = { + "Jika {C:attention}hand pertama{} dari babak ini adalah", + "sebuah {C:attention}6{}, menghancurkannya dan", + "memunculkan sebuah kartu {C:spectral}Spectral{}", + "{C:inactive}(Harus memiliki tempat)" + } + }, + j_constellation = { + name = "Constellation", + text = { + "Memperoleh {X:mult,C:white} X#1# {} Mult", + "per kartu {C:planet}Planet{} yang dipakai", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_hiker = { + name = "Hiker", + text = { + "Setiap {C:attention}card{} yang dimainkan", + "secara permanen memperoleh", + "{C:chips}+#1#{} Chip saat menang" + } + }, + j_faceless = { + name = "Faceless Joker", + text = { + "Dapatkan {C:money}$#1#{} jika {C:attention}#2#{} atau", + "lebih banyak {C:attention}kartu wajah{}", + "yang dibuang", + "pada saat bersamaan" + } + }, + j_green_joker = { + name = "Green Joker", + text = { + "{C:mult}+#1#{} Mult per hand yang dimainkan", + "{C:mult}-#2#{} Mult per discard", + "{C:inactive}(Saat ini {C:mult}+#3#{C:inactive} Mult)" + } + }, + j_superposition = { + name = "Superposition", + text = { + "Memunculkan sebuah kartu {C:tarot}Tarot{} jika", + "poker hand berisi sebuah", + "{C:attention}As{} dan sebuah {C:attention}Straight{}", + "{C:inactive}(Harus memiliki tempat)" + } + }, + j_todo_list = { + name = "To Do List", + text = { + "Dapatkan {C:money}$#1#{} jika {C:attention}poker hand{}", + "adalah sebuah {C:attention}#2#{},", + "poker hand berubah", + "di setiap bayaran" + } + }, + j_ticket = { + name = "Golden Ticket", + text = { + "Kartu {C:attention}Gold{} yang dimainkan", + "mendapatkan {C:money}$#1#{} saat menang" + }, + unlock = { + "Ketika 5 kartu hand", + "yang hanya memiliki", + "kartu {C:attention,E:1}Gold{}" + } + }, + j_mr_bones = { + name = "Mr. Bones", + text = { + "Prevents Death", + "jika chip yang didapat", + "paling sedikit {C:attention}25%", + "dari chip yang diperlukan", + "{S:1.1,C:red,E:2}penghancuran diri{}" + }, + unlock = { + "Kalah {C:attention,E:1}#1#{} giliran", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Acrobat", + text = { + "{X:red,C:white} X#1# {} Mult di {C:attention}final", + "{C:attention}hand{} dari babak" + }, + unlock = { + "Mainkan {C:attention,E:1}#1#{} hand", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "Sock and Buskin", + text = { + "Picu lagi semua", + "face {C:attention}card{} yang dimainkan" + }, + unlock = { + "Mainkan total", + "{C:attention,E:1}#1#{} kartu wajah", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "Swashbuckler", + text = { + "Menambah nilai jual dari", + "semua sisa {C:attention}Joker{} yang dimilikinya", + "dari kartu ini untuk Mult", + "{C:inactive}(Saat ini {C:mult}+#1#{C:inactive} Mult)" + }, + unlock = { + "Jual hingga total", + "Kartu {C:attention,E:1}#1#{} Joker", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Troubadour", + text = { + "{C:attention}+#1#{} ukuran hand,", + "{C:red}-#2#{} hand per babak" + }, + unlock = { + "Menangi {C:attention,E:1}#1#{} babak", + "berturut-turut dengan memainkan", + "1 hand saja" + } + }, + j_certificate = { + name = "Certificate", + text = { + "Saat babak dimulai,", + "tambahkan sebuah {C:attention}acak memainkan", + "{C:attention}kartu{} dengan acak", + "{C:attention}seal{} ke tangan Anda" + }, + unlock = { + "Have a Gold", + "memainkan kartu dengan", + "sebuah {C:attention,E:1}Gold Seal" + } + }, + j_smeared = { + name = "Smeared Joker", + text = { + "{C:hearts}Hati{} dan {C:diamonds}Wajik", + "dianggap sebagai rupa yang sama,", + "{C:spades}Sekop{} dan {C:clubs}Keriting", + "dianggap sebagai rupa yang sama" + }, + unlock = { + "Miliki setidaknya {C:attention}#1#", + "{E:1,C:attention}#2#{} di", + "ke deck Anda di" + } + }, + j_throwback = { + name = "Throwback", + text = { + "{X:mult,C:white} X#1# {} Mult untuk setiap", + "{C:attention}Blind{} yang dilewati pada giliran ini", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "Lanjutkan giliran yang tersimpan", + "dari menu utama" + } + }, + j_hanging_chad = { + name = "Hanging Chad", + text = { + "Picu lagi {C:attention}yang pertama{} dimainkan", + "pertama yang dipakai dalam kemenangan" + }, + unlock = { + "Kalahkan satu Boss Blind", + "dengan sebuah {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Rough Gem", + text = { + "Kartu yang dimainkan dengan", + "rupa {C:diamonds}Wajik{} mendapatkan", + "{C:money}$#1#{} saat menang" + }, + unlock = { + "Miliki setidaknya {E:1,C:attention}#1#", + "kartu dengan {E:1,C:attention}#2#", + "rupa di deck Anda" + } + }, + j_bloodstone = { + name = "Bloodstone", + text = { + "{C:mult}+#1# dalam #2#{} peluang untuk", + "kartu yang dimainkan dengan", + "rupa {C:hearts}Hati{} memberikan", + "{X:mult,C:white} X#3# {} Mult saat menang," + }, + unlock = { + "Miliki setidaknya {E:1,C:attention}#1#", + "kartu dengan {E:1,C:attention}#2#", + "rupa di deck Anda" + } + }, + j_arrowhead = { + name = "Arrowhead", + text = { + "Kartu yang dimainkan dengan", + "rupa {C:spades}Sekop{} memberikan", + "{C:chips}+#1#{} Chip saat menang" + }, + unlock = { + "Miliki setidaknya {E:1,C:attention}#1#", + "kartu dengan {E:1,C:attention}#2#", + "rupa di deck Anda" + } + }, + j_onyx_agate = { + name = "Onyx Agate", + text = { + "Kartu yang dimainkan dengan", + "rupa {C:clubs}Club{} memberikan", + "{C:mult}+#1#{} Mult saat menang" + }, + unlock = { + "Miliki setidaknya {E:1,C:attention}#1#", + "kartu dengan {E:1,C:attention}#2#", + "rupa di deck Anda" + } + }, + j_glass = { + name = "Glass Joker", + text = { + "Memperoleh {X:mult,C:white} X#1# {} Mult", + "untuk setiap {C:attention}Glass Card", + "yang dihancurkan", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "Miliki setidaknya {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} di", + "deck Anda" + } + }, + j_ring_master = { + name = "Ring Master", + text = { + "kartu {C:attention}Joker{}, {C:tarot}Tarot{}, {C:planet}Planet{}", + "dan {C:spectral}Spectral{} dapat", + "muncul berkali-kali" + }, + unlock = { + "Reach Ante", + "level {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Flower Pot", + text = { + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan memiliki sebuah kemenangan", + "kartu {C:diamonds}Wajik{}, kartu {C:clubs}Keriting{},", + "kartu{C:hearts}Hati{}, dan kartu {C:spades}Sekop{}" + }, + unlock = { + "Reach Ante", + "level {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Blueprint", + text = { + "Salin kemampuan dari", + "{C:attention}Joker{} ke sebelah kanan" + }, + unlock = { + "Menangi giliran" + } + }, + j_wee = { + name = "Wee Joker", + text = { + "Joker ini memperoleh", + "{C:chips}+#2#{} Chip ketika setiap", + "{C:attention}2{} yang dimainkan menang", + "{C:inactive}(Saat ini {C:chips}+#1#{C:inactive} Chip)" + }, + unlock = { + "Menangi giliran dalam {E:1,C:attention}#1#", + "atau lebih sedikit babak" + } + }, + j_merry_andy = { + name = "Merry Andy", + text = { + "{C:red}+#1#{} discard,", + "{C:red}#2#{} ukuran hand" + }, + unlock = { + "Menangi giliran dalam {E:1,C:attention}#1#", + "atau lebih sedikit babak" + } + }, + j_oops = { + name = "Oops! All 6s", + text = { + "Menggandakan semua {C:attention}yang terdaftar", + "{C:green,E:1,S:1.1}probabilitas", + "{C:inactive}(mis.: {C:green}1 in 3{C:inactive} -> {C:green}2 in 3{C:inactive})" + }, + unlock = { + "Dalam satu hand,", + "mendapat setidaknya", + "{E:1,C:attention}#1#{} chip" + } + }, + j_idol = { + name = "The Idol", + text = { + "Setiap {C:attention}#2# yang dimainkan", + "dari {V:1}#3#{} memberikan", + "{X:mult,C:white} X#1# {} Mult saat menang", + "{s:0.8}Kartu berubah setiap babak" + }, + unlock = { + "Dalam satu hand,", + "mendapat setidaknya", + "{E:1,C:attention}#1#{} chip" + } + }, + j_seeing_double = { + name = "Seeing Double", + text = { + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan memiliki sebuah kemenangan", + "kartu{C:clubs}Keriting{} dan kartu", + "yang menang dari rupa {C:attention}lainnya" + }, + unlock = { + "Mainkan sebuah hand", + "yang memiliki", + "{E:1,C:attention}#1#" + } + }, + j_matador = { + name = "Matador", + text = { + "Dapatkan {C:money}$#1#{} jika memainkan", + "hand memicu", + "kemampuan {C:attention}Boss Blind{}" + }, + unlock = { + "Kalahkan satu Boss Blind", + "dalam {E:1,C:attention}1 hand{} tanpa", + "memakai discard apa pun" + } + }, + j_hit_the_road = { + name = "Hit the Road", + text = { + "Memperoleh {X:mult,C:white} X#1# {} Mult", + "per yang dibuang", + "{C:attention}Jack{} babak ini", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "Buang {E:1,C:attention}5", + "{E:1,C:attention}Jack{} pada", + "saat bersamaan" + } + }, + j_duo = { + name = "The Idol", + text = { + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + }, + unlock = { + "Menangi giliran", + "tanpa memainkan", + "sebuah {E:1,C:attention}#1#" + } + }, + j_trio = { + name = "The Trio", + text = { + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + }, + unlock = { + "Menangi giliran", + "tanpa memainkan", + "sebuah {E:1,C:attention}#1#" + } + }, + j_family = { + name = "The Family", + text = { + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + }, + unlock = { + "Menangi giliran", + "tanpa memainkan", + "sebuah {E:1,C:attention}#1#" + } + }, + j_order = { + name = "The Order", + text = { + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + }, + unlock = { + "Menangi giliran", + "tanpa memainkan", + "sebuah {E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "The Tribe", + text = { + "{X:mult,C:white} X#1# {} Mult jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + }, + unlock = { + "Menangi giliran", + "tanpa memainkan", + "sebuah {E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "Cavendish", + text = { + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2# dalam #3#{} peluang kartu", + "ini dihancurkan", + "di akhir babak" + } + }, + j_card_sharp = { + name = "Card Sharp", + text = { + "{X:mult,C:white} X#1# {} Mult jika", + "{C:attention}poker hand{} yang telah", + "dimainkan pada babak ini" + } + }, + j_red_card = { + name = "Red Card", + text = { + "Dapatkan {C:red}+#1#{} Mult ketika", + "{C:attention}Booster Pack{} dilewati", + "{C:inactive}(Saat ini {C:red}+#2#{C:inactive} Mult)" + } + }, + j_madness = { + name = "Madness", + text = { + "Ketika {C:attention}Blind{} dipilih,", + "memperoleh {X:mult,C:white} X#1# {} Mult dan", + "{C:attention}menghancurkan{} sebuah Joker secara acak", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {} Mult)" + } + }, + j_square = { + name = "Square Joker", + text = { + "Memperoleh {C:chips}+#2#{} Chip jika", + "hand yang dimainkan memiliki", + "tepat {C:attention}4{} kartu", + "{C:inactive}(Saat ini {C:chips}#1#{} Chip)" + } + }, + j_seance = { + name = "Séance", + text = { + "Jika {C:attention}poker hand{} adalah sebuah", + "{C:attention}#1#{}, memunculkan sebuah", + "kartu {C:spectral}Spectral{} secara acak", + "{C:inactive}(Harus memiliki tempat)" + } + }, + j_riff_raff = { + name = "Riff-raff", + text = { + "Ketika {C:attention}Blind{} dipilih,", + "memunculkan {C:attention}#1# {C:blue}Common{C:attention} Joker", + "{C:inactive}(Harus memiliki tempat)" + } + }, + j_stuntman = { + name = "Stuntman", + text = { + "{C:chips}+#1#{} Chip,", + "{C:attention}-#2#{} ukuran hand" + }, + unlock = { + "Dalam satu hand,", + "dapatkan setidaknya", + "{E:1,C:attention}#1#{} chip" + } + }, + j_invisible = { + name = "Invisible Joker", + text = { + "Setelah {C:attention}#1#{} babak,", + "jual kartu ini untuk", + "{C:attention}Duplicate{} Joker secara acak", + "{C:inactive}(Currently {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Menangi giliran tanpa", + "pernah memiliki lebih", + "dari {E:1,C:attention}4 Joker{}" + } + }, + j_brainstorm = { + name = "Brainstorm", + text = { + "Menyalin kemampuan", + "dari {C:attention}Joker paling kiri" + }, + unlock = { + "Buang sebuah", + "{E:1,C:attention}Royal Flush" + } + }, + j_satellite = { + name = "Satellite", + text = { + "Dapatkan {C:money}$#1#{} di akhir", + "babak per {C:planet}Planet unik", + "kartu yang dipakai pada giliran ini", + "{C:inactive}(Saat ini {C:money}$#2#{C:inactive})" + }, + unlock = { + "Miliki {E:1,C:money}$#1#", + "atau lebih" + } + }, + j_shoot_the_moon = { + name = "Shoot the Moon", + text = { + "{C:mult}+#1#{} Mult untuk", + "setiap {C:attention}Queen{}", + "yang ada di tangan" + }, + unlock = { + "Mainkan setiap {E:1,C:attention}Hati", + "di deck Anda dalam", + "satu babak" + } + }, + j_drivers_license = { + name = "Driver's License", + text = { + "{X:mult,C:white} X#1# {} Mult jika Anda", + "memiliki setidaknya {C:attention}16", + "kartu enhanced", + "{C:inactive}(Saat ini {C:attention}#2#{C:inactive})" + }, + unlock = { + "Tingkatkan {E:1,C:attention}#1#{} kartu", + "di deck Anda" + } + }, + j_cartomancer = { + name = "Cartomancer", + text = { + "Memunculkan sebuah kartu {C:tarot}Tarot{}", + "ketika {C:attention}Blind{} dipilih", + "{C:inactive}(Harus memiliki tempat)" + }, + unlock = { + "Temukan setiap", + "kartu {E:1,C:tarot}Tarot{}" + } + }, + j_astronomer = { + name = "Astronomer", + text = { + "Semua kartu {C:planet}Planet{} dan", + "{C:planet}Celestial Packs{} dalam", + "toko itu {C:attention}gratis" + }, + unlock = { + "Temukan setiap", + "kartu{E:1,C:planet}Planet{}" + } + }, + j_burnt = { + name = "Burnt Joker", + text = { + "Upgrade level dari", + "poker hand pertama {C:attention}yang dibuang", + "setiap babak" + }, + unlock = { + "Jual hingga total", + "dari {E:1,C:attention}#1#{} kartu", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Bootstraps", + text = { + "{C:mult}+#1#{} Mult untuk setiap", + "{C:money}$#2#{} yang Anda miliki" + }, + unlock = { + "Miliki setidaknya {E:1,C:attention}#1#", + "Joker{C:dark_edition}Polychrome{}" + } + }, + j_caino = { + name = "Canio", + text = { + "Memperoleh {X:mult,C:white} X#1# {} Mult saat", + "sebuah {C:attention}face{} card", + "dihancurkan", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "Triboulet", + text = { + "{C:attention}King{} dan", + "{C:attention}Queen{} yang dimainkan memberi", + "{X:mult,C:white} X#1# {} Mult saat menang," + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "Yorick", + text = { + "{X:mult,C:white} X#1# {} Mult hanya setelah", + "menggunakan {C:attention}#2#{} discard", + "{C:inactive}(Sisa discard: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "Chicot", + text = { + "Nonaktifkan efek dari", + "setiap {C:attention}Boss Blind" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "Perkeo", + text = { + "Memunculkan sebuah salinan {C:dark_edition}Negatif{} dari", + "{C:attention}1{} kartu {C:attention}habis pakai{} secara acak", + "yang Anda miliki", + "di akhir dari {C:attention}toko" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "Sly Joker", + text = { + "{C:chips}+#1#{} Chip jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + } + }, + j_wily = { + name = "Wily Joker", + text = { + "{C:chips}+#1#{} Chip jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + } + }, + j_clever = { + name = "Clever Joker", + text = { + "{C:chips}+#1#{} Chip jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + } + }, + j_devious = { + name = "Devious Joker", + text = { + "{C:chips}+#1#{} Chip jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + } + }, + j_crafty = { + name = "Crafty Joker", + text = { + "{C:chips}+#1#{} Chip jika hand", + "yang dimainkan berisi", + "sebuah {C:attention}#2#" + } + }, + j_vampire = { + name = "Vampire", + text = { + "Memperoleh {X:mult,C:white} X#1# {} Mult setiap", + "{C:attention}Kartu Enhanced{} yang dimainkan,", + "menghapus Enhancement {C:attention}kartu", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_shortcut = { + name = "Shortcut", + text = { + "Membuat {C:attention}Straights{} bisa", + "dilakukan dengan jarak {C:attention}1 peringkat", + "{C:inactive}(mis: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Hologram", + text = { + "Memperoleh {X:mult,C:white} X#1# {} Mult", + "setiap {C:attention}kartu permainan{} yang ditambahkan", + "ke deck Anda", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_vagabond = { + name = "Vagabond", + text = { + "Buat sebuah kartu {C:purple}Tarot{}", + "jika hand dimainkan", + "dengan {C:money}$#1#{} atau kurang" + } + }, + j_baron = { + name = "Baron", + text = { + "Setiap {C:attention}King{}", + "yang ada di tangan", + "memberi {X:mult,C:white} X#1# {} Mult" + } + }, + j_cloud_9 = { + name = "Cloud 9", + text = { + "Dapatkan {C:money}$#1#{} untuk setiap", + "{C:attention}9{} di deck {C:attention}lengkap Anda", + "di akhir babak", + "{C:inactive}(Saat ini {C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "Rocket", + text = { + "Dapatkan {C:money}$#1#{} di akhir", + "babak. Memperoleh {C:money}$#2#{} saat", + "{C:attention}Boss Blind{} dikalahkan" + } + }, + j_obelisk = { + name = "Obelisk", + text = { + "{X:mult,C:white} X#1# {} Mult setiap", + "hand yang dimainkan berturut-turut", + "tanpa memainkan", + "poker hand {C:attention}yang paling banyak dimainkan", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_midas_mask = { + name = "Midas Mask", + text = { + "Semua {C:attention}kartu{} wajah", + "menjadi {C:attention}Gold{} card", + "saat dimainkan" + } + }, + j_luchador = { + name = "Luchador", + text = { + "Jual kartu ini untuk", + "menonaktifkan", + "{C:attention}Boss Blind{} saat ini" + } + }, + j_photograph = { + name = "Photograph", + text = { + "Face card {C:attention}pertama", + "yang dimainkan memberi {X:mult,C:white} X#1# {} Mult", + "saat menang" + } + }, + j_gift = { + name = "Gift Card", + text = { + "Menambah {C:money}$#1#{} dari {C:attention}nilai jual", + "ke setiap kartu {C:attention}Joker{} dan", + "{C:attention}Habis Pakai{} di", + "akhir babak" + } + }, + j_turtle_bean = { + name = "Turtle Bean", + text = { + "{C:attention}+#1#{} ukuran hand,", + "berkurang sebanyak", + "{C:red}#2#{} setiap babak" + } + }, + j_erosion = { + name = "Erosion", + text = { + "{C:red}+#1#{} Mult untuk setiap", + "kartu di bawah {C:attention}#3#{}", + "di deck lengkap Anda", + "{C:inactive}(Saat ini {C:red}+#2#{C:inactive} Mult)" + } + }, + j_reserved_parking = { + name = "Reserved Parking", + text = { + "Setiap {C:attention}kartu{} wajah", + "yang ada di tangan memiliki", + "sebuah peluang {C:green}#2# dalam #3#{}", + "memberi {C:money}$#1#{}" + } + }, + j_mail = { + name = "Mail-In Rebate", + text = { + "Dapatkan {C:money}$#1#{} untuk setiap", + "{C:attention}#2#{} yang dibuang, peringkat", + "berubah setiap babak" + } + }, + j_to_the_moon = { + name = "To the Moon", + text = { + "Dapatkan ekstra {C:money}$#1#{} dari", + "{C:attention}keuntungan{} untuk setiap {C:money}$5{} yang Anda", + "miliki di akhir babak" + } + }, + j_hallucination = { + name = "Hallucination", + text = { + "{C:green}#1# dalam #2#{} peluang untuk membuat", + "sebuah kartu {C:tarot}Tarot{} ketika", + "{C:attention}Booster Pack{} dibuka", + "{C:inactive}(Harus memiliki tempat)" + } + }, + j_lucky_cat = { + name = "Lucky Card", + text = { + "Memperoleh {X:mult,C:white} X#1# {} Mult setiap", + "kali sebuah kartu {C:attention}Lucky{}", + "{C:green}berhasil{} memicu", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + } + }, + j_baseball = { + name = "Baseball Card", + text = { + "Setiap {C:green}Uncommon{} Joker", + "memberikan {X:mult,C:white} X#1# {} Mult" + } + }, + j_bull = { + name = "Bull", + text = { + "{C:chips}+#1#{} Chip untuk setiap", + "{C:money}dolar{} yang Anda miliki", + "{C:inactive}(Saat ini {C:chips}+#2#{C:inactive} Chip)" + } + }, + j_diet_cola = { + name = "Diet Cola", + text = { + "Jual kartu ini untuk", + "membuat sebuah", + "{C:attention}#1# gratis" + } + }, + j_trading = { + name = "Trading Card", + text = { + "Jika {C:attention}discard pertama{} dari babak", + "hanya memiliki {C:attention}1{} kartu, hancurkanlah", + "dan dapatkan {C:money}$#1#" + } + }, + j_flash = { + name = "Flash Card", + text = { + "{C:mult}+#1#{} Mult setiap", + "{C:attention}memutar ulang{} di toko", + "{C:inactive}(Saat ini {C:mult}+#2#{C:inactive} Mult)" + } + }, + j_popcorn = { + name = "Popcorn", + text = { + "{C:mult}+#1#{} Mult", + "{C:mult}-#2#{} Mult setiap", + "babak yang dimainkan" + } + }, + j_trousers = { + name = "Spare Trousers", + text = { + "Memperoleh {C:mult}+#1#{} Mult jika", + "hand yang dimainkan berisi", + "sebuah {C:attention}#2#", + "{C:inactive}(Saat ini {C:red}+#3#{C:inactive} Mult)" + } + }, + j_ancient = { + name = "Ancient Joker", + text = { + "Setiap kartu yang dimainkan dengan", + "{V:1}#2#{} rupa memberikan", + "{X:mult,C:white} X#1# {} Mult saat menang,", + "{s:0.8}rupa berubah di akhir babak" + } + }, + j_ramen = { + name = "Ramen", + text = { + "{X:mult,C:white} X#1# {} Mult,", + "kehilangan {X:mult,C:white} X#2# {} Mult", + "setiap {C:attention}kartu{} yang dibuang" + } + }, + j_walkie_talkie = { + name = "Walkie Talkie", + text = { + "Setiap {C:attention}10{} atau {C:attention}4 yang dimainkan", + "memberi {C:chips}+#1#{} Chip dan", + "{C:mult}+#2#{} Mult saat menang" + } + }, + j_selzer = { + name = "Seltzer", + text = { + "Memicu lagi semua", + "kartu yang dimainkan untuk", + "hand {C:attention}#1#{} berikutnya" + } + }, + j_castle = { + name = "Castle", + text = { + "Joker ini memperoleh {C:chips}+#1#{} Chip", + "setiap kartu {V:1}#2#{} yang dibuang,", + "rupa berubah setiap babak", + "{C:inactive}(Saat ini {C:chips}+#3#{C:inactive} Chip)" + } + }, + j_smiley = { + name = "Smiley Face", + text = { + "Kartu {C:attention}wajah{} yang dimainkan", + "memberi {C:mult}+#1#{} Mult", + "saat menang" + } + }, + j_campfire = { + name = "Campfire", + text = { + "Joker ini memperoleh {X:mult,C:white}X#1#{} Mult", + "untuk setiap kartu {C:attention}yang dijual{}, mengatur ulang", + "ketika {C:attention}Boss Blind{} dikalahkan", + "{C:inactive}(Saat ini {X:mult,C:white} X#2# {C:inactive} Mult)" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Overstock", + text = { + "{C:attention}+1{} slot kartu", + "tersedia di toko" + } + }, + v_clearance_sale = { + name = "Clearance Sale", + text = { + "Semua kartu dan paket di", + "toko itu diskon {C:attention}#1#%{}" + } + }, + v_tarot_merchant = { + name = "Tarot Merchant", + text = { + "Kartu {C:tarot}Tarot{} muncul", + "{C:attention}#1#X{} lebih sering", + "di toko" + } + }, + v_planet_merchant = { + name = "Planet Merchant", + text = { + "Kartu {C:planet}Planet{} muncul", + "{C:attention}#1#X{} lebih sering", + "di toko" + } + }, + v_hone = { + name = "Hone", + text = { + "Kartu {C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, dan", + "{C:dark_edition}Polychrome{}", + "muncul {C:attention}#1#X{} lebih sering" + } + }, + v_reroll_surplus = { + name = "Reroll Surplus", + text = { + "Biaya reroll", + "kurang dari {C:money}$#1#{}" + } + }, + v_crystal_ball = { + name = "Crystal Ball", + text = { + "{C:attention}+1{} slot habis pakai" + } + }, + v_telescope = { + name = "Telescope", + text = { + "{C:attention}Celestial Pack{} selalu", + "berisi kartu {C:planet}Planet{}", + "untuk", + "poker hand {C:attention}yang paling banyak dimainkan" + } + }, + v_grabber = { + name = "Grabber", + text = { + "Secara permanen", + "memperoleh {C:blue}+#1#{} hand", + "per babak" + } + }, + v_wasteful = { + name = "Wasteful", + text = { + "Secara permanen", + "memperoleh {C:red}+#1#{} discard", + "per babak" + } + }, + v_seed_money = { + name = "Seed Money", + text = { + "Naikkan taruhan sesuai", + "keuntungan yang didapatkan", + "per babak hingga {C:money}$#1#{}" + } + }, + v_blank = { + name = "Blank", + text = { + "{C:inactive}Tidak apa-apa?" + } + }, + v_magic_trick = { + name = "Magic Trick", + text = { + "{C:attention}Kartu permainan{} bisa", + "dibeli", + "dari {C:attention}toko" + } + }, + v_hieroglyph = { + name = "Hieroglyph", + text = { + "{C:attention}-#1#{} Ante", + "{C:blue}-#1#{} hand", + "per babak", + "{C:attention}-#1#{} Ante" + } + }, + v_directors_cut = { + name = "Director's Cut", + text = { + "Reroll Boss Blind", + "{C:attention}1{} kali per Ante,", + "{C:money}$#1#{} per roll" + } + }, + v_pattern = { + name = "Pattern", + text = { + "Munculkan kartu", + "{C:attention}Habis pakai{} yang paling sering dipakai setiap saat", + "{E:1,V:1}#1#", + "{C:inactive}(Harus memiliki tempat)" + } + }, + v_overstock_plus = { + name = "Overstock Plus", + text = { + "{C:attention}+1{} slot kartu", + "tersedia di toko" + }, + unlock = { + "Belanjakan total", + "{C:money}$#1#{} di toko", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "Liquidation", + text = { + "Semua kartu dan paket di", + "toko itu diskon {C:attention}#1#%{}" + }, + unlock = { + "Tukarkan setidaknya", + "kartu {C:attention}#1#{C:voucher} Voucher{}", + "dalam satu giliran" + } + }, + v_tarot_tycoon = { + name = "Tarot Tycoon", + text = { + "Kartu {C:tarot}Tarot{} muncul", + "{C:attention}#1#X{} lebih sering", + "di toko" + }, + unlock = { + "Beli total", + "kartu {C:attention}#1#{C:tarot} Tarot{}", + "dari toko", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Planet Tycoon", + text = { + "Kartu {C:planet}Planet{} muncul", + "{C:attention}#1#X{} lebih sering", + "di toko" + }, + unlock = { + "Beli total", + "kartu{C:attention}#1#{C:planet} Planet{}", + "dari toko", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Glow Up", + text = { + "Kartu {C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, dan", + "{C:dark_edition}Polychrome{}", + "muncul {C:attention}#1#X{} lebih sering" + }, + unlock = { + "Miliki setidaknya {C:attention}#1#", + "kartu{C:attention}Joker{} dengan", + "edisi {C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, dan", + "{C:dark_edition}Polychrome{}" + } + }, + v_reroll_glut = { + name = "Reroll Glut", + text = { + "Biaya reroll", + "kurang dari {C:money}$#1#{}" + }, + unlock = { + "Reroll toko", + "total {C:attention}#1#{} kali", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Omen Globe", + text = { + "Kartu {C:spectral}Spectral{} bisa juga", + "muncul dalam", + "{C:attention}Arcana Pack apa pun" + }, + unlock = { + "Pakai total {C:attention}#1#", + "kartu {C:tarot}Tarot{} dari", + "{C:tarot}Arcana Pack apa pun", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Observatory", + text = { + "kartu {C:planet}Planet{} di", + "area{C:attention}habis pakai{} Anda memberikan", + "{X:red,C:white} X#1# {} Mult untuk", + "{C:attention}poker hand tertentu" + }, + unlock = { + "Pakai total {C:attention}#1#", + "kartu {C:planet}Planet{} dari", + "{C:planet}Celestial Pack apa pun", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Nacho Tong", + text = { + "Secara permanen", + "memperoleh {C:blue}+#1#{} hand", + "per babak" + }, + unlock = { + "Mainkan total", + "dari {C:attention}#1#{} kartu", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Recyclomancy", + text = { + "Secara permanen", + "memperoleh {C:red}+#1#{} discard", + "per babak" + }, + unlock = { + "Buang total", + "dari {C:attention}#1#{} kartu", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Money Tree", + text = { + "Naikkan taruhan sesuai", + "keuntungan yang didapatkan", + "per babak hingga {C:money}$#1#{}" + }, + unlock = { + "Maksimalkan keuntungan", + "pendapatan per babak selama", + "{C:attention}#1#{} babak berturut-turut", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Antimatter", + text = { + "{C:dark_edition}+1{} Joker Slot" + }, + unlock = { + "Tukarkan {C:voucher}Blank{}", + "total {C:attention}#1#{} kali", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Illusion", + text = { + "{C:attention}Kartu permainan{} di toko", + "mungkin memiliki sebuah {C:enhanced}Enhancement{},", + "{C:dark_edition}Edition{}, dan/atau sebuah {C:attention}Seal{}" + }, + unlock = { + "Beli total", + "{C:attention}#1#{} kartu permainan", + "dari toko", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Petroglyph", + unlock = { + "Reach Ante", + "level {E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{} Ante", + "{C:red}-#1#{} discard", + "per babak" + } + }, + v_retcon = { + name = "Retcon", + text = { + "Reroll Boss Blind", + "{C:attention}tanpa batas{} waktu,", + "{C:money}$#1#{} per roll" + }, + unlock = { + "Discover", + "{C:attention}#1#{} Blind" + } + }, + v_tesselation = { + name = "Tessellation", + text = { + "Munculkan kartu", + "{C:attention}Joker{} yang paling sering dipakai", + "{E:1,V:1}#1#", + "{C:inactive}(Harus memiliki tempat)" + }, + unlock = { + "Beli edisi {C:dark_edition}Polychrome", + "dari", + "{C:attention}Joker yang paling sering dipakai", + "dari toko" + } + }, + v_palette = { + name = "Palette", + text = { + "Simpan {C:attention}+#1#{} kartu", + "di tangan Anda", + "{C:attention}+#1#{} ukuran hand" + }, + unlock = { + "Kurangi ukuran hand", + "hingga {C:attention}#1#{} kartu" + } + }, + v_paint_brush = { + name = "Kuas Cat", + text = { + "{C:attention}+#1#{} ukuran hand" + } + } + }, + Tarot = { + c_fool = { + name = "The Fool", + text = { + "Memunculkan", + "kartu {C:tarot}Tarot{} atau {C:planet} Planet{}", + "dipakai pada giliran ini", + "{s:0.8,C:tarot}The Fool{s:0.8} tidak termasuk" + } + }, + c_magician = { + name = "The Magician", + text = { + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "The High Priestess", + text = { + "Memunculkan hingga {C:attention}#1#", + "kartu {C:planet}Planet{} secara acak", + "{C:inactive}(Harus memiliki tempat)" + } + }, + c_empress = { + name = "The Empress", + text = { + "Meningkatkan {C:attention}#1#", + "kartu pilihan hingga", + "{C:attention}#2#s" + } + }, + c_emperor = { + name = "The Emperor", + text = { + "Memunculkan hingga {C:attention}#1#", + "kartu {C:tarot}Tarot{} secara acak", + "{C:inactive}(Harus memiliki tempat)" + } + }, + c_heirophant = { + name = "The Hierophant", + text = { + "Meningkatkan {C:attention}#1#", + "kartu pilihan hingga", + "{C:attention}#2#s" + } + }, + c_lovers = { + name = "The Lovers", + text = { + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "The Chariot", + text = { + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#" + } + }, + c_justice = { + name = "Justice", + text = { + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "The Hermit", + text = { + "Menggandakan uang", + "{C:inactive}(Maks {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "The Wheel of Fortune", + text = { + "{C:green}#1# dalam #2#{} peluang untuk menambah", + "edisi {C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, dan", + "{C:dark_edition}Polychrome{}", + "menghancurkan sebuah {C:attention}Joker secara acak" + } + }, + c_strength = { + name = "Strength", + text = { + "Menaikkan peringkat", + "hingga {C:attention}#1#{} kartu", + "pilihan sebanyak {C:attention}1" + } + }, + c_hanged_man = { + name = "The Hanged Man", + text = { + "Menghancurkan hingga", + "{C:attention}#1#{} kartu pilihan" + } + }, + c_death = { + name = "Death", + text = { + "Pilih {C:attention}#1#{} kartu,", + "mengubah kartu {C:attention}kiri{}", + "menjadi kartu {C:attention}kanan{}", + "{C:inactive}(Seret untuk mengatur kembali)" + } + }, + c_temperance = { + name = "Temperance", + text = { + "Memberikan total nilai", + "jual semua", + "Joker saat ini {C:inactive}(Maks {C:money}$#1#{C:inactive})", + "{C:inactive}(Saat ini {C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "The Devil", + text = { + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#" + } + }, + c_tower = { + name = "The Tower", + text = { + "Meningkatkan {C:attention}#1#{} kartu", + "pilihan ke dalam", + "{C:attention}#2#" + } + }, + c_star = { + name = "The Star", + text = { + "Mengubah hingga", + "{C:attention}#1#{} kartu pilihan", + "menjadi {V:1}#2#{}" + } + }, + c_moon = { + name = "The Moon", + text = { + "Mengubah hingga", + "{C:attention}#1#{} kartu pilihan", + "menjadi {V:1}#2#{}" + } + }, + c_sun = { + name = "The Sun", + text = { + "Mengubah hingga", + "{C:attention}#1#{} kartu pilihan", + "menjadi {V:1}#2#{}" + } + }, + c_judgement = { + name = "Judgement", + text = { + "Memunculkan secara acak", + "kartu {C:attention}Joker{}", + "{C:inactive}(Harus memiliki tempat)" + } + }, + c_world = { + name = "The World", + text = { + "Mengubah hingga", + "{C:attention}#1#{} kartu pilihan", + "menjadi {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Mercury", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_venus = { + name = "Venus", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_earth = { + name = "Earth", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_mars = { + name = "Mars", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_jupiter = { + name = "Jupiter", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_saturn = { + name = "Saturn", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_uranus = { + name = "Uranus", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_neptune = { + name = "Neptune", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_pluto = { + name = "Pluto", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_ceres = { + name = "Ceres", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_planet_x = { + name = "Planet X", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + }, + c_eris = { + name = "Eris", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Menaikkan level", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult dan", + "{C:chips}+#4#{} chip" + } + } + }, + Spectral = { + c_familiar = { + name = "Familiar", + text = { + "Hancurkan {C:attention}1{} kartu", + "secara acak di tangan Anda, menambah", + "{C:attention}#1#{} secara acak {C:attention}Enhanced face", + "{C:attention}kartu{} ke tangan Anda" + } + }, + c_grim = { + name = "Grim", + text = { + "Hancurkan {C:attention}1{} kartu", + "secara acak di tangan Anda,", + "menambah {C:attention}#1#{} secara acak {C:attention}As", + "{C:attention}As{} ke tangan Anda" + } + }, + c_incantation = { + name = "Incantation", + text = { + "Hancurkan {C:attention}1{} kartu", + "secara acak di tangan Anda, menambah {C:attention}#1#", + "secara acak {C:attention}kartu bernomor", + "{C:attention}bernomor{} ke tangan Anda" + } + }, + c_talisman = { + name = "Talisman", + text = { + "Tambahkan sebuah {C:attention}Gold Seal{}", + "ke {C:attention}1{} kartu", + "secara acak di tangan Anda" + } + }, + c_aura = { + name = "Aura", + text = { + "Tambahkan efek {C:dark_edition}Foil{}, {C:dark_edition}Holographic{},", + "atau {C:dark_edition}Polychrome{} ke", + "{C:attention}1{} kartu pilihan di tangan" + } + }, + c_wraith = { + name = "Wraith", + text = { + "Memunculkan secara acak", + "{C:red}Rare{C:attention} Joker{},", + "membuat uang hingga {C:money}$0" + } + }, + c_sigil = { + name = "Sigil", + text = { + "Mengubah semua kartu", + "di tangan menjadi sebuah", + "rupa {C:attention}secara acak" + } + }, + c_ouija = { + name = "Ouija", + text = { + "Mengubah semua kartu", + "di tangan menjadi sebuah", + "peringkat {C:attention}secara acak", + "{C:red}-1{} ukuran hand" + } + }, + c_ectoplasm = { + name = "Ectoplasm", + text = { + "Menambah {C:dark_edition}Negatif{} ke", + "{C:attention}Joker secara acak,", + "{C:red}-1{} ukuran hand" + } + }, + c_immolate = { + name = "Immolate", + text = { + "Menghancurkan {C:attention}#1#{} kartu", + "secara acak di tangan,", + "dapatkan {C:money}$#2#" + } + }, + c_soul = { + name = "The Soul", + text = { + "Membuat sebuah", + "{C:legendary,E:1}Legendary{} Joker", + "{C:inactive}(Harus memiliki tempat)" + } + }, + c_black_hole = { + name = "Black Hole", + text = { + "Upgrade setiap", + "{C:legendary,E:1}poker hand", + "sebanyak {C:attention}1{} level" + } + }, + c_ankh = { + name = "Ankh", + text = { + "Buat sebuah salinan", + "acak {C:attention}Joker{}, hancurkan", + "seluruh Joker lainnya" + } + }, + c_deja_vu = { + name = "Deja Vu", + text = { + "Tambahkan sebuah {C:red}Red Seal{}", + "hingga {C:attention}1{} kartu", + "pilihan di tangan Anda" + } + }, + c_hex = { + name = "Hex", + text = { + "Tambahkan {C:dark_edition}Polychrome{} ke sebuah", + "acak {C:attention}Joker{}, hancurkan", + "seluruh Joker lainnya" + } + }, + c_trance = { + name = "Trance", + text = { + "Tambahkan sebuah {C:blue}Blue Seal{}", + "ke {C:attention}1{} kartu", + "pilihan di tangan Anda" + } + }, + c_medium = { + name = "Medium", + text = { + "Tambahkan sebuah {C:purple}Purple Seal{}", + "ke {C:attention}1{} kartu", + "pilihan di tangan Anda" + } + }, + c_cryptid = { + name = "Cryptid", + text = { + "Buat {C:attention}#1#{} salinan", + "{C:attention}1{} kartu pilihan", + "di tangan Anda" + } + } + }, + Edition = { + e_base = { + name = "Base", + text = { + "Tanpa efek tambahan" + } + }, + e_foil = { + name = "Foil", + text = { + "{C:chips}+#1#{} chip" + } + }, + e_holo = { + name = "Holographic", + text = { + "{C:mult}+#1#{} Mult" + } + }, + e_polychrome = { + name = "Polychrome", + text = { + "{X:mult,C:white} X#1# {} Mult" + } + }, + e_negative = { + name = "Negatif", + text = { + "{C:dark_edition}+#1#{} slot Joker" + } + }, + e_negative_consumable = { + name = "Negatif", + text = { + "{C:dark_edition}+#1#{} slot habis pakai" + } + } + }, + Enhanced = { + m_bonus = { + name = "Bonus Card", + text = {} + }, + m_mult = { + name = "Mult Card", + text = { + "{C:mult}+#1#{} Mult" + } + }, + m_wild = { + name = "Wild Card", + text = { + "Bisa dipakai", + "sebagai rupa apa pun" + } + }, + m_glass = { + name = "Glass Card", + text = { + "{X:mult,C:white} X#1# {} Mult", + "{C:green}#2# dalam #3#{} peluang untuk", + "menghancurkan kartu" + } + }, + m_steel = { + name = "Steel Card", + text = { + "{X:mult,C:white} X#1# {} Mult", + "sedangkan kartu ini", + "tetap di tangan" + } + }, + m_stone = { + name = "Stone Card", + text = { + "{C:chips}+#1#{} Chip", + "tanpa peringkat atau rupa" + } + }, + m_gold = { + name = "Gold Card", + text = { + "{C:money}$#1#{} jika ini", + "ini ada di tangan", + "di akhir babak" + } + }, + m_lucky = { + name = "Lucky Card", + text = { + "{C:green}#1# dalam #3#{} peluang", + "untuk {C:mult}+#2#{} Mult", + "{C:green}#1# dalam #5#{} peluang", + "untuk memenangi {C:money}$#4#" + } + } + }, + Stake = { + stake_white = { + name = "White Stake", + text = { + "Base Difficulty" + } + }, + stake_red = { + name = "Red Stake", + text = { + "{C:attention}Small Blind{} memberikan", + "tanpa hadiah uang", + "{s:0.8}Memakai semua Stake sebelumnya" + } + }, + stake_green = { + name = "Green Stake", + text = { + "Memerlukan skala menang", + "yang lebih cepat untuk setiap {C:attention}Ante", + "{s:0.8}Memakai semua Stake sebelumnya" + } + }, + stake_blue = { + name = "Blue Stake", + text = { + "{C:red}-1{} Discard", + "{s:0.8}Memakai semua Stake sebelumnya" + } + }, + stake_black = { + name = "Black Stake", + text = { + "Toko dapat memiliki {C:attention}Eternal{} Joker", + "{C:inactive,s:0.8}{Tidak bisa dijual atau dihancurkan}", + "{s:0.8}Memakai semua Stake sebelumnya" + } + }, + stake_purple = { + name = "Purple Stake", + text = { + "Memerlukan skala menang", + "yang lebih cepat untuk setiap {C:attention}Ante", + "{s:0.8}Memakai semua Stake sebelumnya" + } + }, + stake_orange = { + name = "Orange Stake", + text = { + "{C:attention}Booster Pack{} harganya", + "{C:money}$1{} lebih per Ante", + "{s:0.8}Memakai semua Stake sebelumnya" + } + }, + stake_gold = { + name = "Gold Stake", + text = { + "{C:red}-1{} ukuran hand", + "{s:0.8}Memakai semua Stake sebelumnya" + } + } + }, + Tag = { + tag_uncommon = { + name = "Uncommon Tag", + text = { + "Toko memiliki sebuah", + "{C:green}Uncommon Joker" + } + }, + tag_rare = { + name = "Rare Tag", + text = { + "Toko memiliki sebuah", + "{C:red}Rare Joker" + } + }, + tag_negative = { + name = "Tag Negatif", + text = { + "Toko memiliki sebuah", + "{C:dark_edition}Negatif Joker" + } + }, + tag_foil = { + name = "Foil Tag", + text = { + "Toko memiliki sebuah", + "{C:dark_edition}Foil Joker" + } + }, + tag_holo = { + name = "Holographic Tag", + text = { + "Toko memiliki sebuah", + "{C:dark_edition}Holographic Joker" + } + }, + tag_polychrome = { + name = "Polychrome Tag", + text = { + "Toko memiliki sebuah", + "{C:dark_edition}Polychrome Joker" + } + }, + tag_investment = { + name = "Investment Tag", + text = { + "Setelah mengalahkan", + "si Boss Blind,", + "dapatkan {C:money}$#1#" + } + }, + tag_voucher = { + name = "Voucher Tag", + text = { + "Menambah satu {C:voucher}Voucher", + "ke babak berikutnya" + } + }, + tag_boss = { + name = "Boss Tag", + text = { + "Reroll", + "{C:attention}Boss Blind" + } + }, + tag_standard = { + name = "Standard Tag", + text = { + "Memberikan gratis", + "{C:attention}Mega Standard Pack" + } + }, + tag_charm = { + name = "Charm Tag", + text = { + "Memberikan gratis", + "{C:tarot}Mega Arcana Pack" + } + }, + tag_meteor = { + name = "Meteor Tag", + text = { + "Memberikan gratis", + "{C:planet}Mega Celestial Pack" + } + }, + tag_buffoon = { + name = "Buffoon Tag", + text = { + "Memberikan gratis", + "{C:attention}Buffoon Pack" + } + }, + tag_handy = { + name = "Handy Tag", + text = { + "Memberikan {C:money}$#1#{} per hand", + "{C:blue}yang dimainkan{} pada giliran ini", + "{C:inactive}(Akan memberi {C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "Garbage Tag", + text = { + "Memberikan {C:money}$#1#{} per discard", + "{C:red}yang tidak dipakai{} pada giliran ini", + "{C:inactive}(Akan memberi {C:money}$#2#{C:inactive})" + } + }, + tag_coupon = { + name = "Coupon Tag", + text = { + "Kartu perdana dan", + "paket booster di toko", + "toko itu gratis" + } + }, + tag_double = { + name = "Double Tag", + text = { + "Memberikan sebuah salinan", + "{C:attention}Tag{} pilihan berikutnya", + "{s:0.8}tidak termasuk {s:0.8,C:attention}Double Tag" + } + }, + tag_juggle = { + name = "Juggle Tag", + text = { + "{C:attention}+#1#{} ukuran hand", + "babak berikutnya" + } + }, + tag_d_six = { + name = "D6 Tag", + text = { + "Reroll di babak berikutnya", + "mulai dari {C:money}$0" + } + }, + tag_top_up = { + name = "Top-up Tag", + text = { + "Memunculkan hingga {C:attention}#1#", + "{C:blue}Common{} Joker", + "{C:inactive}(Harus memiliki tempat)" + } + }, + tag_skip = { + name = "Speed Tag", + text = { + "Memberikan {C:money}$#1#{} per", + "Blind yang dilewati pada giliran ini", + "{C:inactive}(Akan memberi {C:money}$#2#{C:inactive})" + } + }, + tag_orbital = { + name = "Orbital Tag", + text = { + "Upgrade {C:attention}#1#", + "sebanyak {C:attention}#2# level" + } + }, + tag_economy = { + name = "Economy Tag", + text = { + "Menggandakan uang Anda", + "{C:inactive}(Maks {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "Ethereal Tag", + text = { + "Memberikan gratis", + "{C:planet}Spectral Pack" + } + } + }, + Blind = { + bl_small = { + name = "Small Blind", + text = {} + }, + bl_big = { + name = "Big Blind", + text = {} + }, + bl_hook = { + name = "The Hook", + text = { + "Membuang 2 kartu secara", + "acak per hand yang dimainkan" + } + }, + bl_wall = { + name = "The Wall", + text = { + "Blind ekstra besar" + } + }, + bl_wheel = { + name = "The Wheel", + text = { + " dalam 7 kartu menarik", + "ditarik menghadap ke bawah" + } + }, + bl_arm = { + name = "The Arm", + text = { + "Turunkan level", + "poker hand yang dimainkan" + } + }, + bl_psychic = { + name = "The Psychic", + text = { + "Harus memainkan 5 kartu" + } + }, + bl_goad = { + name = "The Goad", + text = { + "Semua kartu Sekop", + "di-debuff" + } + }, + bl_water = { + name = "The Water", + text = { + "Mulai dengan", + "0 discard" + } + }, + bl_eye = { + name = "The Eye", + text = { + "Tidak ada jenis", + "repeat hand pada babak ini" + } + }, + bl_mouth = { + name = "The Mouth", + text = { + "Mainkan 1 jenis hand", + "saja pada babak ini" + } + }, + bl_plant = { + name = "The Plant", + text = { + "Semua kartu wajah", + "di-debuff" + } + }, + bl_needle = { + name = "The Needle", + text = { + "Mainkan 1 hand saja" + } + }, + bl_head = { + name = "The Head", + text = { + "Semua kartu Hati", + "di-debuff" + } + }, + bl_tooth = { + name = "The Tooth", + text = { + "Kehilangan $1 per", + "kartu yang dimainkan" + } + }, + bl_final_leaf = { + name = "Verdant Leaf", + text = { + "Semua kartu di-debuff", + "hingga 1 Joker dijual" + } + }, + bl_final_vessel = { + name = "Violet Vessel", + text = { + "Blind sangat besar" + } + }, + bl_ox = { + name = "The Ox", + text = { + "Memainkan sebuah #1#", + "membuat uang hingga $0" + } + }, + bl_house = { + name = "The House", + text = { + "Hand pertama adalah", + "ditarik menghadap ke bawah" + } + }, + bl_club = { + name = "The Club", + text = { + "Semua kartu Keriting", + "di-debuff" + } + }, + bl_fish = { + name = "The Fish", + text = { + "Kartu yang ditarik menghadap ke bawah", + "setelah setiap hand dimainkan" + } + }, + bl_window = { + name = "The Window", + text = { + "Semua kartu Hati", + "di-debuff" + } + }, + bl_manacle = { + name = "The Manacle", + text = { + "-1 Ukuran Hand" + } + }, + bl_serpent = { + name = "The Serpent", + text = { + "Setelah Bermain atau Membuang,", + "harus menarik 3 kartu" + } + }, + bl_pillar = { + name = "The Pillar", + text = { + "Kartu yang dimainkan sebelumnya", + "sebelum Ante ini di-debuff" + } + }, + bl_flint = { + name = "The Flint", + text = { + "Base Chip dan", + "Mult dibagi dua" + } + }, + bl_mark = { + name = "The Mark", + text = { + "Semua kartu wajah", + "ditarik menghadap ke bawah" + } + }, + bl_final_acorn = { + name = "Amber Acorn", + text = { + "Balik dan kocok", + "semua kartu Joker" + } + }, + bl_final_heart = { + name = "Crimson Heart", + text = { + "Sebuah Joker secara acak", + "dinonaktifkan setiap hand" + } + }, + bl_final_bell = { + name = "Cerulean Bell", + text = { + "Memaksakan 1 kartu pada", + "kartu yang selalu dipilih" + } + } + }, + Back = { + b_red = { + name = "Red Deck", + text = { + "{C:red}+#1#{} discard", + "setiap babak" + } + }, + b_blue = { + name = "Blue Deck", + text = { + "{C:blue}+#1#{} hand", + "setiap babak" + } + }, + b_yellow = { + name = "Yellow Deck", + text = { + "Mulai dengan", + "ekstra {C:money}$#1#" + } + }, + b_green = { + name = "Green Deck", + text = { + "Di akhir setiap Babak:", + "{C:money}$#1#{s:0.85} per sisa {C:blue}Hand", + "{C:money}$#2#{s:0.85} per sisa {C:red}Discard", + "Tidak mendapat {C:attention}Keuntungan" + } + }, + b_black = { + name = "Black Deck", + text = { + "{C:attention}+#1#{} slot Joker", + "", + "{C:blue}-#2#{} hand", + "setiap babak" + } + }, + b_magic = { + name = "Magic Deck", + text = { + "Mulai giliran dengan", + "{C:tarot,T:v_crystal_ball}#1#{} voucher", + "dan {C:attention}2{} salinan", + "dari {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Nebula Deck", + text = { + "Mulai giliran dengan", + "{C:planet,T:v_telescope}#1#{} voucher", + "", + "{C:red}#2#{} slot habis pakai" + } + }, + b_metal = { + name = "Metal Deck", + text = { + "Mulai giliran dengan {C:attention}#1#", + "kartu permainan ditingkatkan", + "menjadi {C:attention}Steel Card" + } + }, + b_abandoned = { + name = "Abandoned Deck", + text = { + "Mulai giliran dengan", + "tidak ada {C:attention}Kartu Wajah", + "di deck Anda" + } + }, + b_checkered = { + name = "Checkered Deck", + text = { + "Mulai giliran dengan", + "{C:attention}26{C:spades} Sekop{} dan", + "{C:attention}26{C:hearts} Hati{} di deck" + } + }, + b_rocky = { + name = "Rocky Deck", + text = { + "Mulai giliran dengan {C:attention}#1#", + "ekstra {C:attention}Stone Cards" + } + }, + b_braided = { + name = "Braided Deck", + text = { + "Hand pertama yang dimainkan", + "di-upgrade hingga {C:attention}lvl. 3" + } + }, + b_anaglyph = { + name = "Anaglyph Deck", + text = { + "Setelah mengalahkan setiap", + "{C:attention}Boss Blind{}, memperoleh sebuah", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "Plasma Deck", + text = { + "Saldo {C:blue}Chip{} dan", + "{C:red}Mult{} saat menghitung", + "skor untuk hand yang dimainkan", + "{C:red}X#1#{} ukuran Blind base" + } + }, + b_erratic = { + name = "Erratic Deck", + text = { + "Semua {C:attention}Peringkat{} dan", + "{C:attention}Rupa{} di deck", + "diacak" + } + }, + b_challenge = { + name = "Challenge Deck", + text = { + "" + } + }, + b_ghost = { + name = "Ghost Deck", + text = { + "Kartu {C:spectral}Spectral{} bisa juga", + "muncul di toko,", + "mulai dengan kartu {C:spectral,T:c_hex}Hex{}" + } + }, + b_zodiac = { + name = "Zodiac Deck", + text = { + "Mulai giliran dengan", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "dan {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Painted Deck", + text = { + "{C:attention}+#1#{} ukuran hand", + "{C:red}#2#{} slot Joker" + } + } + }, + Other = { + gold_seal = { + name = "Gold Seal", + text = { + "Dapatkan {C:money}$3{} saat kartu", + "ini dimainkan", + "dan menang" + } + }, + white_sticker = { + name = "White Sticker", + text = { + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}White", + "{C:attention}Stake{}" + } + }, + red_sticker = { + name = "Red Sticker", + text = { + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Red", + "{C:attention}Stake{}" + } + }, + green_sticker = { + name = "Green Sticker", + text = { + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Green", + "{C:attention}Stake{}" + } + }, + blue_sticker = { + name = "Blue Sticker", + text = { + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Blue", + "{C:attention}Stake{}" + } + }, + black_sticker = { + name = "Black Sticker", + text = { + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Black", + "{C:attention}Stake{}" + } + }, + purple_sticker = { + name = "Purple Sticker", + text = { + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Purple", + "{C:attention}Stake{}" + } + }, + orange_sticker = { + name = "Orange Sticker", + text = { + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Orange", + "{C:attention}Stake{}" + } + }, + gold_sticker = { + name = "Gold Sticker", + text = { + "Dipakai Joker ini", + "untuk menang di kesulitan {C:attention}Gold", + "{C:attention}Stake{}" + } + }, + playing_card = { + text = { + "{C:light_black}#1# dari {V:1}#2#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} chip" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1#{} chip ekstra" + } + }, + locked = { + name = "Dikunci", + text = {} + }, + debuffed_default = { + name = "Di-debuff", + text = { + "Semua kemampuan", + "dinonaktifkan" + } + }, + debuffed_playing_card = { + name = "Di-debuff", + text = { + "Tidak mendapat chip", + "dan semua kemampuan", + "dinonaktifkan" + } + }, + demo_locked = { + name = "Dikunci", + text = { + "Tidak tersedia", + "dalam demo ini" + } + }, + demo_shop_locked = { + name = "Dikunci", + text = { + "Kartu dari {C:attention}koleksi", + "pribadi Jimbo,", + "tersedia di versi", + "lengkapnya {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Dikunci", + text = { + "Pekerjaan sedang", + "berlangsung" + } + }, + deck_locked_win = { + name = "Dikunci", + text = { + "Menangi giliran dengan", + "{C:attention}#1#{}", + "pada kesulitan apa pun" + } + }, + deck_locked_discover = { + name = "Dikunci", + text = { + "Temukan setidaknya", + "{C:attention}#1#{} item dari", + "koleksi Anda" + } + }, + deck_locked_stake = { + name = "Dikunci", + text = { + "Menangi giliran dengan", + "deck apa pun setidaknya pada", + "kesulitan {V:1}#1#{}" + } + }, + joker_locked_legendary = { + name = "Dikunci", + text = { + "Temukan Joker ini", + "dari kartu {C:spectral}Soul{}" + } + }, + undiscovered_joker = { + name = "Tidak Ditemukan", + text = { + "Beli atau pakai", + "kartu ini dalam sebuah", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya" + } + }, + undiscovered_tarot = { + name = "Tidak Ditemukan", + text = { + "Beli atau pakai", + "kartu ini dalam sebuah", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya" + } + }, + undiscovered_planet = { + name = "Tidak Ditemukan", + text = { + "Beli atau pakai", + "kartu ini dalam sebuah", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya" + } + }, + undiscovered_spectral = { + name = "Tidak Ditemukan", + text = { + "Beli atau pakai", + "kartu ini dalam sebuah", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya" + } + }, + undiscovered_voucher = { + name = "Tidak Ditemukan", + text = { + "Tukarkan voucher", + "ini dalam sebuah", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya" + } + }, + undiscovered_booster = { + name = "Tidak Ditemukan", + text = { + "Buka paket ini", + "saat giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya" + } + }, + undiscovered_edition = { + name = "Tidak Ditemukan", + text = { + "Temukan edisi ini", + "saat giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya" + } + }, + undiscovered_tag = { + name = "Tidak Ditemukan", + text = { + "Pakai tag ini saat", + "giliran yang tidak diunggulkan untuk", + "mempelajari apa fungsinya" + } + }, + p_arcana_normal = { + name = "Arcana Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:tarot} kartu{} Tarot untuk", + "segera dipakai" + } + }, + p_arcana_jumbo = { + name = "Jumbo Arcana Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:tarot} kartu{} Tarot untuk", + "segera dipakai" + } + }, + p_arcana_mega = { + name = "Mega Arcana Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:tarot} kartu{} Tarot untuk", + "segera dipakai" + } + }, + p_celestial_normal = { + name = "Celestial Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:planet} kartu{} Planet untuk", + "segera dipakai" + } + }, + p_celestial_jumbo = { + name = "Jumbo Celestial Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:planet} kartu{} Planet untuk", + "segera dipakai" + } + }, + p_celestial_mega = { + name = "Mega Celestial Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:planet} kartu{} Planet untuk", + "segera dipakai" + } + }, + p_spectral_normal = { + name = "Spectral Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:spectral} kartu{} Spectral untuk", + "segera dipakai" + } + }, + p_spectral_jumbo = { + name = "Jumbo Spectral Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:spectral} kartu{} Spectral untuk", + "segera dipakai" + } + }, + p_spectral_mega = { + name = "Mega Spectral Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:spectral} kartu{} Spectral untuk", + "segera dipakai" + } + }, + p_standard_normal = { + name = "Standard Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:attention} kartu{} Permainan untuk", + "ditambahkan ke deck Anda" + } + }, + p_standard_jumbo = { + name = "Jumbo Standard Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:attention} kartu{} Permainan untuk", + "ditambahkan ke deck Anda" + } + }, + p_standard_mega = { + name = "Mega Standard Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:attention} kartu{} Permainan untuk", + "ditambahkan ke deck Anda" + } + }, + p_buffoon_normal = { + name = "Buffoon Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:joker} kartu{} Joker" + } + }, + p_buffoon_jumbo = { + name = "Jumbo Buffoon Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:joker} kartu{} Joker" + } + }, + p_buffoon_mega = { + name = "Mega Buffoon Pack", + text = { + "Pilih {C:attention}#1#{} hingga", + "{C:attention}#2#{C:joker} kartu{} Joker" + } + }, + pinned_left = { + name = "Disematkan", + text = { + "Joker ini tetap", + "disematkan ke", + "posisi paling kiri" + } + }, + red_seal = { + name = "Red Seal", + text = { + "Picu lagi kartu", + "ini {C:attention}1{} kali" + } + }, + blue_seal = { + name = "Blue Seal", + text = { + "Memunculkan sebuah kartu {C:planet}Planet{}", + "jika kartu ini {C:attention}dipegang{} dalam", + "hand di akhir babak" + } + }, + purple_seal = { + name = "Purple Seal", + text = { + "Membuat sebuah kartu {C:tarot}Tarot{}", + "ketika {C:attention}dibuang", + "{C:inactive}(Harus memiliki tempat)" + } + }, + eternal = { + name = "Eternal", + text = { + "Tidak bisa dijual", + "atau dihancurkan" + } + }, + challenge_locked = { + name = "Dikunci", + text = { + "Menangi giliran dengan setidaknya", + "#1# deck lain untuk membuka", + "Mode tantangan", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Sekop", + Hearts = "Hati", + Clubs = "Keriting", + Diamonds = "Wajik" + }, + suits_plural = { + Spades = "Sekop", + Hearts = "Hati", + Clubs = "Keriting", + Diamonds = "Wajik" + }, + blind_states = { + Select = "Pilih", + Skipped = "Dilewati", + Current = "Saat ini", + Defeated = "Dikalahkan", + Upcoming = "Mendatang", + Selected = "Pilihan" + }, + ranks = { + Ace = "As", + King = "King", + Queen = "Queen", + Jack = "Jack", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Best Hand", + furthest_round = "Highest Round", + furthest_ante = "Highest Ante", + most_money = "Most Money", + boss_streak = "Most Bosses dalam sebuah Row", + collection = "Koleksi", + win_streak = "Best Win Streak", + current_streak = "", + poker_hand = "Most Played Hand" + }, + poker_hands = { + ['Flush House'] = "Flush House", + ['Five of a Kind'] = "Five of a Kind", + ['Royal Flush'] = "Royal Flush", + ['Straight Flush'] = "Straight Flush", + ['Four of a Kind'] = "Four of a Kind", + ['Full House'] = "Full House", + ['Flush'] = "Flush", + ['Straight'] = "Straight", + ['Three of a Kind'] = "Three of a Kind", + ['Two Pair'] = "Two Pair", + ['Pair'] = "Pair", + ['High Card'] = "High Card", + ['Flush Five'] = "Flush Five" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "Sebuah Three of a Kind dan sebuah Pair dengan", + "semua kartu memiliki rupa yang sama" + }, + ['Five of a Kind'] = { + "5 kartu dengan peringkat yang sama" + }, + ['Royal Flush'] = { + "5 kartu berturut-turut {peringkat berurutan} dengan", + "semua kartu memiliki rupa yang sama" + }, + ['Straight Flush'] = { + "5 kartu berturut-turut {peringkat berurutan} dengan", + "semua kartu memiliki rupa yang sama" + }, + ['Four of a Kind'] = { + "4 kartu dengan peringkat yang sama. Keempatnya mungkin", + "dimainkan dengan 1 kartu tanpa kemenangan lainnya" + }, + ['Full House'] = { + "Sebuah Three of a Kind dan sebuah Pair dengan" + }, + ['Flush'] = { + "5 kartu yang memiliki rupa yang sama" + }, + ['Straight'] = { + "5 kartu berturut-turut {peringkat berurutan}" + }, + ['Three of a Kind'] = { + "3 kartu dengan peringkat yang sama. Ketiganya mungkin", + "dimainkan dengan 2 kartu tanpa kemenangan lainnya" + }, + ['Two Pair'] = { + "2 pasang kartu dengan peringkat berbeda, mungkin", + "dimainkan dengan 1 kartu tanpa kemenangan lainnya" + }, + ['Pair'] = { + "2 kartu yang memiliki peringkat yang sama. Keduanya mungkin", + "dimainkan dengan hingga 3 kartu tanpa kemenangan lainnya" + }, + ['High Card'] = { + "Jika hand yang dimainkan bukan salah satu hand", + "yang di atas, hanya kartu berperingkat tertinggi yang menang" + }, + ['Flush Five'] = { + "5 kartu dengan peringkat dan rupa yang sama" + } + }, + labels = { + common = "Common", + uncommon = "Uncommon", + rare = "Rare", + legendary = "Legendary", + tarot = "Tarot", + planet = "Planet", + pluto_planet = "Dwarf Planet", + voucher = "Voucher", + foil = "Foil", + holographic = "Holographic", + polychrome = "Polychrome", + negative = "Negatif", + gold_seal = "Gold Seal", + locked = "Dikunci", + blue_seal = "Blue Seal", + red_seal = "Red Seal", + purple_seal = "Purple Seal", + eternal = "Eternal", + pinned_left = "Disematkan" + }, + dictionary = { + b_sell = "JUAL", + b_use = "PAKAI", + b_select = "PILIH", + b_buy = "BELI", + b_redeem = "TUKAR", + b_open = "BUKA", + b_and_use = "& PAKAI", + b_next_round_1 = "Berikutnya", + b_next_round_2 = "Babak", + b_play_hand = "Mainkan Hand", + b_discard = "Buang", + b_sort_hand = "Sortir Hand", + b_run_info_1 = "Giliran", + b_run_info_2 = "Info", + b_options = "Opsi", + b_reroll_boss = "Reroll Boss", + b_skip_blind = "Lewati Blind", + b_skip_reward = "Lewati Hadiah", + b_skip = "Lewati", + b_start_new_run = "Giliran Baru", + b_main_menu = "Menu Utama", + b_collection = "Koleksi", + b_seed = "Unggul", + b_copy_seed = "Salin Unggul", + b_credits = "Kredit", + b_stats = "Stat", + b_settings = "Pengaturan", + b_set_game = "Game", + b_set_video = "Video", + b_set_graphics = "Grafik", + b_set_audio = "Audio", + b_set_gamespeed = "Kecepatan Game", + b_set_play_discard_pos = "Putar/Buang Posisi Tombol", + b_set_screenshake = "Goyangan layar", + b_set_crash_reports = "Laporan Crash", + b_set_monitor = "Monitor Tampilan", + b_set_windowmode = "Mode Jendela", + b_set_apply = "Terapkan", + b_set_master_vol = "Volume Utama", + b_set_music_vol = "Volume Musik", + b_set_game_vol = "Volume Game", + b_set_shadows = "Bayangan", + b_set_pixel_smoothing = "Penghalusan Seni Piksel", + b_set_CRT = "CRT", + b_set_CRT_bloom = "CRT Bloom", + b_stat_jokers = "Joker", + b_stat_consumables = "Habis Pakai", + b_stat_tarots = "Tarot", + b_stat_planets = "Planet", + b_stat_spectrals = "Spectral", + b_stat_vouchers = "Voucher", + b_next = "Berikutnya", + b_endless = "Mode Tanpa Henti", + b_wishlist = "Wishlist di Steam", + b_playbalatro = "Kunjungi playbalatro.com", + b_remaining = "Sisa", + b_full_deck = "Deck Lengkap", + b_poker_hands = "Poker Hand", + b_blinds = "Blind", + b_vouchers = "Voucher", + b_stake = "Stake", + b_jokers = "Joker", + b_tarot_cards = "Kartu Tarot", + b_planet_cards = "Kartu Planet", + b_spectral_cards = "Kartu Spectral", + b_enhanced_cards = "Kartu Enhanced", + b_editions = "Edisi", + b_booster_packs = "Booster Pack", + b_tags = "Tag", + b_decks = "Decks", + b_continue = "Lanjutkan", + b_back = "Kembali", + b_music = "Musik", + b_sounds = "Suara", + b_imagery = "Citra", + b_new_run = "Giliran Baru", + b_challenges = "Tantangan", + b_current_profile = "Profil Saat Ini", + b_load_profile = "Muat Profil", + b_create_profile = "Buat Profil", + b_delete_profile = "Hapus Profil", + b_reset_profile = "Reset Profil", + b_rules = "Aturan", + b_restrictions = "Larangan", + b_deck = "Deck", + b_play_cap = "MAINKAN", + b_options_cap = "OPSI", + b_collection_cap = "KOLEKSI", + b_quit_cap = "KELUAR", + b_cash_out = "Ambil Taruhan", + k_unknown = "?????", + k_compatible = "kompatibel", + k_incompatible = "tidak kompatibel", + k_round = "Babak", + k_ante = "Ante", + k_seed = "Unggul", + k_reroll = "Reroll", + k_mult = "Mult", + k_rank = "Peringkat", + k_suit = "Rupa", + k_stake = "Stake", + k_common = "Common", + k_uncommon = "Uncommon", + k_rare = "Rare", + k_legendary = "Legendary", + k_debuffed = "Di-debuff", + k_locked = "Dikunci", + k_undisovered = "Tidak ditemukan", + k_joker = "Joker", + k_voucher = "Voucher", + k_tarot = "Tarot", + k_planet = "Planet", + k_dwarf_planet = "Dwarf Planet", + k_planet_q = "Planet?", + k_spectral = "Spectral", + k_booster = "Booster", + k_edition = "Edisi", + k_hud_hands = "Hand", + k_hud_discards = "Discard", + k_lower_score = "menang", + k_arcana_pack = "Arcana Pack", + k_celestial_pack = "Celestial Pack", + k_spectral_pack = "Spectral Pack", + k_standard_pack = "Standard Pack", + k_buffoon_pack = "Buffoon Pack", + k_enter_text = "Masukkan Teks", + k_defeated_by = "Dikalahkan Oleh", + k_level_prefix = "lvl.", + k_also_applied = "Juga berlaku", + k_base_cards = "Base Card", + k_effective = "Efektif", + k_aces = "As", + k_face_cards = "Kartu Wajah", + k_numbered_cards = "Kartu Bernomor", + k_cap_consumables = "HABIS PAKAI", + k_page = "Halaman", + k_ante_cap = "ANTE", + k_base_cap = "BASE", + k_jokers_cap = "JOKER", + k_vouchers_cap = "VOUCHER", + k_x_base = "X Base", + k_not_discovered = "Tidak Ditemukan", + k_unlocked_ex = "Terbuka!", + k_challenge_mode = "Mode Tantangan", + k_daily_run = "Giliran Harian", + k_profile = "Profil", + k_wins = "Menang", + k_empty_caps = "KOSONG", + k_collection = "Koleksi", + k_stake_level = "Level Stake", + k_none = "Tidak Ada", + k_game_modifiers = "Pengubah Game", + k_custom_rules = "Aturan Kustom", + k_banned_cards = "Kartu Terlarang", + k_banned_tags = "Tag Terlarang", + k_other = "Lainnya", + k_money = "Uang", + k_best_hand = "Best Hand", + k_seeded_run = "Giliran yang Diunggulkan", + k_enter_seed = "Masukkan Unggulan", + k_lvl = "lvl.", + k_skipped_cap = "DILEWATI", + k_no_reward = "Tidak ada Hadiah", + k_reward = "Hadiah", + k_nope_ex = "Tidak!", + k_or = "atau", + k_balanced = "Seimbang", + ph_improve_run = "Perbaiki giliran Anda!", + ph_sneak_peek = "Intip Sekilas", + ph_deck_preview_stones = "Stone", + ph_deck_preview_effective = "Total efektif karena Joker, Blind, dan peningkatan kartu", + ph_blind_score_at_least = "Setidaknya menang", + ph_blind_reward = "Hadiah:", + ph_up_ante_1 = "Naikkan Ante", + ph_up_ante_2 = "Naikkan semua Blind", + ph_up_ante_3 = "Refresh Blind", + ph_stat_joker = "Total babak yang diselesaikan dengan kartu ini", + ph_stat_consumable = "Berapa kali kartu ini telah dipakai", + ph_stat_voucher = "Berapa kali Voucher ini telah ditukarkan", + ph_demo_thanks_1 = "Terima kasih sudah memutar", + ph_demo_thanks_2 = "DEMO BALATRO", + ph_game_over = "GAME OVER", + ph_vouchers_redeemed = "Voucher yang ditukarkan pada giliran ini", + ph_no_vouchers = "Tidak ada voucher yang ditukarkan pada giliran ini", + ph_defeat_this_blind_1 = "Kalahkan blind ini", + ph_defeat_this_blind_2 = "untuk menemukannya", + ph_click_confirm = "Klik lagi untuk mengonfirmasi", + ph_choose_blind_1 = "Pilih Blind", + ph_choose_blind_2 = "Anda berikutnya", + ph_mr_bones = "Diselamatkan oleh Mr. Bones", + ph_score_at_least = "Setidaknya menang", + ph_all_poker_hand = "Semua Poker Hand", + ph_1_level = "+1 Tingkat", + ph_boss_disabled = "Boss Dinonaktifkan!", + ph_most_played = "(poker hand yang paling banyak dimainkan)", + ml_demo_thanks_message = { + "Harap pertimbangkan wishlist", + "Balatro di Steam dan mendaftar agar", + "menerima buletin di playbalatro.com" + }, + ml_eternal = { + "Eternal", + "Tidak bisa dijual", + "atau dihancurkan" + }, + ml_gold_seal_desc = { + "Gold Seal", + "kembali ke hand", + "saat dimainkan" + }, + ml_crash_report_info = { + "Laporan crash akan dikirim ke pengembang", + "agar kelak mengurangi masalah. Tidak ada", + "identifikasi atau info pribadi yang akan dikirim." + }, + ml_play_discard_pos_opt = { + "Buang/Putar", + "Putar/Buang" + }, + ml_windowmode_opt = { + "Berjendela", + "Layar Penuh", + "Tanpa Batas" + }, + ml_vsync_opt = { + "VSync Nyala", + "VSync Mati" + }, + ml_shadow_opt = { + "Nyala", + "Mati" + }, + ml_smoothing_opt = { + "Mati", + "Nyala" + }, + ml_bloom_opt = { + "Mati", + "Nyala" + }, + ml_card_stats = { + "Kartu", + "Stat" + }, + ml_paste_seed = { + "Tempel", + "Unggul" + }, + ml_disabled_seed = { + "Semua Terbuka dan", + "Penemuan dinonaktifkan" + }, + ['$'] = "$", + k_redeemed_ex = "Ditukarkan!", + k_duplicated_ex = "Diduplikasi!", + k_no_room_ex = "Tak Ada Tempat!", + k_no_space_ex = "Tak Ada Ruang!", + k_no_other_jokers = "Tak boleh Joker lagi!", + k_plus_tarot = "+1 Tarot", + k_plus_stone = "+1 Stone", + k_plus_planet = "+1 Planet", + k_plus_spectral = "+1 Spectral", + k_active_ex = "Aktif!", + k_level_up_ex = "Level Naik!", + k_upgrade_ex = "Upgrade!", + k_again_ex = "Lagi!", + k_val_up = "Nilai Naik!", + k_reset = "Reset", + k_extinct_ex = "Punah!", + k_safe_ex = "Aman!", + k_saved_ex = "Disimpan!", + k_swapped_ex = "Ditukar!", + k_copied_ex = "Disalin!", + k_melted_ex = "Meleleh!", + b_copy = "Salin", + b_high_contrast_cards = "Kartu High Contrast", + b_set_rumble = "Controller Rumble", + b_seals = "Seal", + b_new_challenge = "Mulai Tantangan Baru", + b_unlock_all = "Buka Semua", + k_active = "aktif", + k_deck = "Deck", + k_progress = "Progres", + k_challenges = "Tantangan", + k_joker_stickers = "Stiker Joker", + k_deck_stake_wins = "Taruhan Deck Menang", + k_enter_name = "Masukkan Nama", + k_gold = "Gold", + k_card_stats = "Stat Kartu", + k_view = "Tampilan", + k_all_hands = "Semua Hand", + k_high_score_ex = "Menang Besar!", + k_demo_version_ex = "Versi Demo!", + k_playing_as = "Bermain sebagai", + k_choose = "Memilih", + k_achievements_disabled = "Prestasi Dinonaktifkan", + ph_no_boss_active = "tak ada bos aktif", + ph_you_win = "ANDA MENANG!", + ph_you_win_demo = "ANDA MENANG DEMO!", + ph_defeat_the_boss = "Kalahkan Boss Blind", + ph_score_furthest_ante = "Ante", + ph_score_furthest_round = "Babak", + ph_score_hand = "Hand Terbaik", + ph_score_poker_hand = "Hand yang Paling Sering Dimainkan", + ph_score_new_collection = "Penemuan Baru", + ph_score_cards_played = "Kartu yang Dimainkan", + ph_score_cards_discarded = "Kartu yang Dibuang", + ph_score_times_rerolled = "Waktu Diputar Ulang", + ph_score_cards_purchased = "Kartu yang Dibeli", + ml_edition_seal_enhancement_explanation = { + "Mungkin setiap kartu yang dimainkan punya satu", + "Enhancement, Edisi, dan Seal" + }, + ml_unlock_all_explanation = { + "PERINGATAN! Membuka Koleksi lengkap", + "akan menonaktifkan prestasi untuk profil ini!" + }, + k_plus_joker = "+1 Joker", + k_eaten_ex = "Dimakan!", + k_eroded_ex = "Terkikis!", + k_achievement = "Prestasi", + ph_unscored_hand = "Hand tidak akan menang", + ph_alert_debuff_confirm = "Tekan 'Mainkan' lagi untuk mengonfirmasi", + k_drank_ex = "Mabuk!", + k_trophy = "Trofi", + k_trophies_disabled = "Trofi Dinonaktifkan", + ml_unlock_all_trophies = { + "PERINGATAN! Membuka Koleksi lengkap", + "akan menonaktifkan trofi untuk profil ini!" + }, + k_poker_hand = "poker hand", + ph_4_7_of_clubs = "empat 7 dari Keriting" + }, + v_dictionary = { + a_xmult = " X#1# Mult", + a_mult = "+#1# Mult", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# ukuran hand", + a_hands = "+#1# Hand", + a_sold_tally = "Terjual #1#/#2#", + a_remaining = "Tersisa #1#", + ante_x_voucher = "VOUCHER #1# ANTE", + loyalty_active = "Aktif!", + loyalty_inactive = "tersisa #1#", + deck_preview_wheel_singular = "Jumlahnya mungkin lebih rendah karena #1# kartu yang ditarik menghadap ke bawah", + deck_preview_wheel_plural = "Jumlahnya mungkin lebih rendah karena #1# kartu yang ditarik menghadap ke bawah", + challenges_completed = "Tantangan #1#/#2# Selesai", + interest = "#1# keuntungan setiap $#2# (#3# maks)", + remaining_hand_money = "Sisa Hands (masing-masing#1# $)", + remaining_discard_money = "Sisa Discard (masing-masing#1# $)", + ml_foil_desc = { + "Foil", + "+#1# Chip" + }, + ml_holo_desc = { + "Holographic", + "+#1# Mult" + }, + ml_polychrome_desc = { + "Polychrome", + " X#1# Mult" + }, + ml_negative_desc = { + "Negatif", + "+#1# slot Joker" + }, + a_mult_minus = "-#1# Mult", + a_handsize_minus = "-#1# Ukuran Hand", + ml_negative_consumable_desc = { + "Negatif", + "+#1# Slot habis pakai" + }, + a_xmult_minus = "-X#1# Mult", + unlocked = "#1#/#2# Terbuka", + completed = "#1#/#2# Lengkap" + }, + v_text = { + ch_m_dollars = { + "Mulai dengan {C:money}$#1#" + }, + ch_m_hands = { + "{C:blue}#1#{} hand per babak" + }, + ch_m_discards = { + "{C:red}#1#{} discard per babak" + }, + ch_m_reroll_cost = { + "{C:money}$#1#{} biaya reroll dasar" + }, + ch_m_joker_slots = { + "{C:attention}#1#{} Joker Slot" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} Slot Habis Pakai" + }, + ch_m_hand_size = { + "{C:attention}#1#{} ukuran hand" + }, + ch_m_none = { + "{C:inactive}Tidak ada" + }, + ch_c_no_reward = { + "Semua {C:attention}Blind{} tidak memberikan hadiah uang" + }, + ch_c_no_reward_specific = { + "{C:attention}#1# Blind{} tidak memberikan hadiah uang" + }, + ch_c_no_extra_hand_money = { + "Ekstra {C:blue}Hand{} tidak lagi mendapat uang" + }, + ch_c_no_interest = { + "Tidak mendapat {C:attention}Keuntungan{} di akhir babak" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}Tantangan Harian!" + }, + ch_c_set_seed = { + "1 upaya dengan set Seed: {C:inactive}{Hidden}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}Chip{} tidak dapat melebihi {C:money}$ saat ini" + }, + ch_c_none = { + "{C:inactive}Tidak ada" + }, + ch_c_inflation = { + "Naikkan harga secara permanen sebesar {C:money}$1{} di setiap pembelian" + }, + ch_c_discard_cost = { + "Buang setiap harga {C:money}$#1#{}" + }, + ch_c_all_eternal = { + "Semua Joker toko adalah {C:eternal}Eternal{}" + }, + ch_c_flipped_cards = { + "{C:green}1 di #1#{} kartu ditarik menghadap ke bawah" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Pegang {C:red}-1{} kartu di tangan untuk setiap {C:money}$#1#{} yang Anda miliki" + }, + ch_c_no_shop_jokers = { + "Joker tidak lagi muncul di {C:attention}toko" + }, + ch_c_debuff_played_cards = { + "Semua kartu yang {C:attention}Dimainkan{} terkena {C:attention}debuff{} setelah menang" + }, + ch_c_set_eternal_ante = { + "Saat ante {C:attention}#1#{} bos dikalahkan, semua Joker menjadi {C:attention}eternal" + }, + ch_c_set_joker_slots_ante = { + "Saat ante {C:attention}#1#{} bos dikalahkan, setel slot Joker menjadi {C:attention}0" + } + }, + tutorial = { + sb_1 = { + "Halo! Namaku", + "{C:attention}Jimbo{}, aku siap membantu", + "Anda mempelajari cara bermain!" + }, + sb_2 = { + "Tujuan Anda adalah mendapatkan", + "{C:blue}Chip{} untuk mengalahkan", + "musuh {C:attention}Blind" + }, + sb_3 = { + "Di sini ada sebuah {C:blue}Small Blind{},", + "Anda hanya perlu mendapat", + "{C:attention}300 Chip{} untuk mengalahkannya." + }, + sb_4 = { + "Pilih {C:blue}Small Blind", + "untuk memulai babak!" + }, + bb_1 = { + "Memilih {C:attention}Big Blind", + "akan mendapat sejumlah uang tunai" + }, + bb_2 = { + "Atau memilih untuk {C:attention}melewatinya", + "agar mendapat sebuah {C:attention}Tag{}! Setiap", + "{C:attention}Tag{} memiliki efek unik" + }, + bb_3 = { + "Namun perhatikan", + "si {C:attention}Boss Blind{}. Ia", + "punya kemampuan yang akan", + "diperlukan untuk membuat rencana." + }, + bb_4 = { + "Jika Anda mengalahkannya,", + "{C:attention}Ante{} naik dan semua", + "{C:attention}Blind{} menjadi lebih sulit" + }, + bb_5 = { + "Kalahkan {C:attention}Ante{} #1# agar menang.", + "Sekarang pilih jalur Anda!" + }, + fh_1 = { + "Anda mendapat chip dengan", + "memainkan {C:attention}Poker hand" + }, + fh_2 = { + "Setiap {C:attention}Poker hand{} mendapatkan", + "sejumlah dasar {C:blue}Chip", + "diperbanyak oleh sejumlah {C:red}Mult" + }, + fh_3 = { + "Lihat {C:attention}Poker hand Anda", + "di area {C:attention}Info Giliran{},", + "bersama dengan info lainnya", + "tentang giliran Anda saat ini" + }, + fh_4 = { + "Beberapa kartu juga memberi Anda", + "sejumlah {C:blue}Chip{},", + "arahkan kursor ke atas untuk melihatnya!" + }, + fh_5 = { + "Sekarang pilih hingga", + "{C:attention}5{} kartu untuk dimainkan", + "dan tekan {C:blue}'Mainkan Hand'" + }, + fh_6 = { + "Anda juga dapat {C:red}'Membuang'{} hingga", + "{C:attention}5{} kartu pilihan", + "untuk mencoba dan memperkuat", + "hand lagi. Cobalah!" + }, + fh_7 = { + "Awas! Anda cuma punya", + "sejumlah terbatas {C:blue}Hand", + "dan {C:red}Discard{} per babak" + }, + fh_8 = { + "Dapatkan {C:attention}300 Chip{} sebelum", + "Anda kehabisan {C:blue}Hand", + "untuk memenangi babak ini.", + "Semoga berhasil!" + }, + sh_1 = { + "Saat Anda mendapatkan lebih banyak kartu,", + "jangan lupa kalau Anda bisa mengaturnya kembali.", + "{C:attention}Joker{} memicu secara", + "berurutan dari kiri ke kanan" + }, + sh_2 = { + "Dan memastikan bahwa Anda", + "{C:attention}MEMAKAI{} habis pakai Anda!" + }, + sh_3 = { + "Pilih hingga {C:attention}2{} kartu", + "di tangan Anda dan tekan", + "{C:attention}'GUNAKAN'{} di kartu {C:tarot}Tarot{}", + "untuk meningkatkannya!" + }, + s_1 = { + "Bagus sekali! Sekarang", + "Anda {E:1}melimpah{} dengan {C:money}Uang Tunai{},", + "Anda bisa membeli beberapa kartu", + "baru dari {C:attention}Toko" + }, + s_2 = { + "Cobalah membeli", + "Iblis ganteng ini" + }, + s_3 = { + "Ini merupakan salah satu {C:attention}#1#", + "{C:attention}Joker{} yang bisa ditambahkan ke", + "giliran Anda. Setiap {C:attention}Joker", + "membuat sesuatu yang berbeda" + }, + s_4 = { + "Yang satu ini menambahkan {C:red}+4 Mult{} ke", + "setiap hand yang Anda mainkan!" + }, + s_5 = { + "Jadilah pemilih, Anda cuma dapat", + "membawa {C:attention}5 kartu{} Joker", + "pada saat bersamaan" + }, + s_6 = { + "Sekarang belilah kartu", + "lainnya dari {C:attention}Toko" + }, + s_7 = { + "Kartu {C:tarot}Tarot{} ini merupakan suatu", + "{C:attention}habis pakai{}. Yang satu ini akan", + "meningkatkan permainan kartu", + "Anda! Pertahankanlah." + }, + s_8 = { + "Sekarang pilihlah hingga", + "{C:attention}2 kartu{} habis pakai", + "pada suatu saat" + }, + s_9 = { + "Jika Anda cukup banyak menyimpan,", + "Anda bisa membeli sebuah {C:attention}Voucher{}.", + "{C:attention}Voucher{} secara pasif", + "meng-upgrade giliran Anda!" + }, + s_10 = { + "Stok {C:attention}Voucher{} diisi kembali", + "setelah Anda mengalahkan", + "{C:attention}Boss Blind{}." + }, + s_11 = { + "Dan periksalah", + "{C:booster}Booster Packs{} di", + "setiap toko. Paketnya", + "penuh pernak-pernik!" + }, + s_12 = { + "Marilah kita maju ke", + "{C:attention}babak berikutnya{}." + } + }, + achievement_names = { + ante_up = "Ante Naik!", + ante_upper = "Ante Naik Lagi!", + heads_up = "Duel", + low_stakes = "Taruhan Kecil", + mid_stakes = "Taruhan Sedang", + high_stakes = "Taruhan Besar", + card_player = "Pemain Kartu", + card_discarder = "Pembuang Kartu", + nest_egg = "Nest Egg", + flushed = "Flush", + speedrunner = "Speedrunner", + roi = "ROI", + shattered = "Shattered", + royale = "Royale", + retrograde = "Retrograde", + _10k = "10K", + _1000k = "1.000K", + _100000k = "100.000K", + tiny_hands = "Hand Kecil", + big_hands = "Hand Besar", + you_get_what_you_get = "Anda Mendapat Apa yang Didapat", + rule_bender = "Rule Bender", + rule_breaker = "Rule Breaker", + legendary = "Legendaris", + astronomy = "Astronomi", + cartomancy = "Ramalan Kartu", + clairvoyance = "Kewaskitaan", + extreme_couponer = "Pemilik Kupon Ekstrem", + completionist = "Completionist", + completionist_plus = "Completionist+", + completionist_plus_plus = "Completionist++" + }, + achievement_descriptions = { + ante_up = "Raih Ante 4", + ante_upper = "Raih Ante 8", + heads_up = "Menangi Giliran", + low_stakes = "Menangi giliran setidaknya kesulitan Red Stake", + mid_stakes = "Menangi giliran setidaknya kesulitan Black Stake", + high_stakes = "Menangi giliran setidaknya kesulitan Gold Stake", + card_player = "Memainkan setidaknya 2500 Kartu", + card_discarder = "Buang setidaknya 2500 Kartu", + nest_egg = "Miliki $400 atau lebih selama sekali giliran", + flushed = "Mainkan Flush dengan 5 Wild Card", + speedrunner = "Menangi giliran dalam 12 babak atau kurang", + roi = "Beli 5 Voucer dengan Ante 4", + shattered = "Pecahkan 2 Glass Card dengan sekali hand", + royale = "Mainkan Royal Flush", + retrograde = "Dapatkan poker hand apa pun hingga level 10", + _10k = "Menangi 10.000 Chip dengan sekali hand", + _1000k = "Menangi 1.000.000 Chip dengan sekali hand", + _100000k = "Menangi 100.000.000 Chip dengan sekali hand", + tiny_hands = "Kurangi deck Anda hingga 20 kartu atau kurang", + big_hands = "Miliki 80 kartu atau lebih di deck Anda", + you_get_what_you_get = "Menangi giliran tanpa memutar ulang toko", + rule_bender = "Selesaikan giliran tantangan apa pun", + rule_breaker = "Selesaikan setiap giliran tantangan", + legendary = "Temukan Legendary Joker", + astronomy = "Temukan setiap kartu Planet", + cartomancy = "Temukan setiap kartu Tarot", + clairvoyance = "Temukan setiap kartu Spectral", + extreme_couponer = "Temukan setiap Voucer", + completionist = "Temukan 100% dari koleksi Anda", + completionist_plus = "Menangi dengan setiap deck di kesulitan Gold Stake", + completionist_plus_plus = "Dapatkan Stiker Gold di setiap Joker" + }, + quips = { + wq_1 = { + "Anda berhasil!" + }, + wq_2 = { + "Anda menghadapinya", + "dengan cukup baik!" + }, + wq_3 = { + "Sepertinya Anda", + "tidak menggertak!" + }, + wq_4 = { + "Sayangnya semua", + "chip ini", + "virtual..." + }, + wq_5 = { + "Sepertinya aku telah", + "mengajarimu dengan baik!" + }, + wq_6 = { + "Anda membuat", + "permainan duel!" + }, + wq_7 = { + "Untungnya", + "aku tak bertaruh", + "melawanmu!" + }, + lq_1 = { + "Mungkin Go Fish", + "itu menambah", + "kecepatan kita..." + }, + lq_2 = { + "Kita dilipat seperti", + "jas murahan!" + }, + lq_3 = { + "Saatnya kita", + "menghindar", + "dan mencoba lagi!" + }, + lq_4 = { + "Engkau tahu apa", + "kata mereka,", + "house selalu menang!" + }, + lq_5 = { + "Sepertinya kita", + "tahu siapa", + "sebenarnya Joker itu!" + }, + lq_6 = { + "Oh tidak, Anda", + "juga menggertak?" + }, + lq_7 = { + "Sepertinya kita", + "menjadi lawakan!" + }, + lq_8 = { + "Andai punya tangan,", + "aku pasti akan", + "menutup mataku!" + }, + lq_9 = { + "Aku memang", + "bodoh, apa", + "alasanmu?" + }, + lq_10 = { + "Gagal total!" + }, + dq_1 = { + "Astaga! Kuharap kau", + "punya trik-trik", + "rahasia untuk", + "tantangan final ini!" + } + }, + challenge_names = { + c_omelette_1 = "Dadar", + c_city_1 = "Kota 15 Menit", + c_rich_1 = "Kaya makin Kaya", + c_knife_1 = "Di Mata Pisau", + c_xray_1 = "Penglihatan sinar-X", + c_mad_world_1 = "Dunia Gila", + c_luxury_1 = "Pajak Barang Mewah", + c_non_perishable_1 = "Tidak Mudah Rusak", + c_medusa_1 = "Medusa", + c_double_nothing_1 = "Dobel atau Tidak", + c_typecast_1 = "Typecast", + c_inflation_1 = "Inflasi", + c_bram_poker_1 = "Bram Poker", + c_fragile_1 = "Rapuh", + c_monolith_1 = "Monolit", + c_blast_off_1 = "Meluncur", + c_five_card_1 = "Tarik Lima Kartu", + c_golden_needle_1 = "Jarum Emas", + c_cruelty_1 = "Kekejaman", + c_jokerless_1 = "Tanpa Joker" + } + } +} \ No newline at end of file diff --git a/localization/it.lua b/localization/it.lua new file mode 100644 index 0000000..bf935bf --- /dev/null +++ b/localization/it.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Jolly", + text = { + "{C:red,s:1.1}+#1#{} Molt" + } + }, + j_jolly = { + name = "Jolly allegro", + text = { + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "1 {C:attention}#2#" + } + }, + j_zany = { + name = "Jolly buffo", + text = { + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "1 {C:attention}#2#" + } + }, + j_mad = { + name = "Jolly furioso", + text = { + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "1 {C:attention}#2#" + } + }, + j_crazy = { + name = "Jolly folle", + text = { + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "1 {C:attention}#2#" + } + }, + j_droll = { + name = "Jolly divertente", + text = { + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "1 {C:attention}#2#" + } + }, + j_half = { + name = "Mezzo Jolly", + text = { + "{C:red}+#1#{} Molt se la mano", + "giocata include", + "{C:attention}#2#{} o meno carte" + } + }, + j_fortune_teller = { + name = "Chiromante", + text = { + "{C:red}+#1#{} Molt per", + "{C:purple}Tarocco{} usato", + "{C:inactive}(Attualmente {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Giocoliere", + text = { + "{C:attention}+#1#{} carte della mano" + } + }, + j_drunkard = { + name = "Beone", + text = { + "{C:red}+#1#{} scarto" + } + }, + j_stone = { + name = "Jolly di pietra", + text = { + "Questo Jolly guadagna {C:chips}+#1#{} fiche", + "per ogni {C:attention}carta di pietra", + "nel tuo mazzo completo", + "{C:inactive}(Attualmente {C:chips}+#2#{C:inactive} fiche)" + } + }, + j_golden = { + name = "Jolly dorato", + text = { + "Guadagni {C:money}$#1#{} a", + "fine del round" + } + }, + j_stencil = { + name = "Forma di Jolly", + text = { + "{X:red,C:white} X1 {} Molt per ogni", + "slot {C:attention}Jolly{} vuoto", + "{s:0.8}Forma di Jolly inclusa", + "{C:inactive}(Attualmente {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Quattro dita", + text = { + "Puoi fare {C:attention}Colori{} e", + "{C:attention}Scale{} anche", + "con {C:attention}4{} carte" + } + }, + j_mime = { + name = "Mimo", + text = { + "Riattiva tutte", + "le abilità delle carte", + "{C:attention}tenute in mano{}" + } + }, + j_credit_card = { + name = "Carta di credito", + text = { + "Il debito", + "arriva a {C:red}-$#1#{}" + } + }, + j_greedy_joker = { + name = "Jolly avido", + text = { + "Le carte giocate con", + "seme {C:diamonds}#2#{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti" + } + }, + j_lusty_joker = { + name = "Jolly lussurioso", + text = { + "Le carte giocate con", + "seme {C:hearts}#2#{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti" + } + }, + j_wrathful_joker = { + name = "Jolly iroso", + text = { + "Le carte giocate con", + "seme {C:spades}#2#{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti" + } + }, + j_gluttenous_joker = { + name = "Jolly vorace", + text = { + "Le carte giocate con", + "seme {C:clubs}#2#{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti" + } + }, + j_ceremonial = { + name = "Pugnale cerimoniale", + text = { + "Quando selezioni un {C:attention}buio{},", + "distruggi il Jolly a destra", + "e aggiungi permanentemente il {C:attention}doppio", + "del suo valore di vendita a {C:red}Molt", + "{C:inactive}(Attualmente {C:mult}+#1#{C:inactive} Molt)" + } + }, + j_banner = { + name = "Stendardo", + text = { + "{C:chips}+#1#{} fiche", + "per ogni", + "{C:attention}scarto{} rimasto" + } + }, + j_mystic_summit = { + name = "Cima mistica", + text = { + "{C:mult}+#1#{} Molt", + "con {C:attention}#2#{} scarti", + "rimasti" + } + }, + j_marble = { + name = "Jolly di marmo", + text = { + "Aggiunge una carta di {C:attention}pietra{}", + "al mazzo quando", + "selezioni un {C:attention}buio{}" + } + }, + j_loyalty_card = { + name = "Carta fedeltà", + text = { + "{X:red,C:white} X#1# {} Molt per ogni", + "{C:attention}#2#{} mani giocate", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "Palla 8", + text = { + "Crea una carta {C:planet}Pianeta{}", + "se la mano giocata include", + "{C:attenetion}#1#{} o più {C:attention}8{}", + "{C:inactive}(Serve spazio)" + } + }, + j_misprint = { + name = "Errore di stampa", + text = { + "" + } + }, + j_dusk = { + name = "Crepuscolo", + text = { + "Riattiva tutte le carte", + "giocate nella {C:attention}mano", + "{C:attention}finale{} del round" + } + }, + j_raised_fist = { + name = "Pugno alzato", + text = { + "Aggiunge il {C:attention}doppio{} del valore", + "della carta {C:attention}più bassa{}", + "in mano a Molt" + } + }, + j_chaos = { + name = "Caos il clown", + text = { + "{C:attention}#1#{} {C:green}cambio{} gratis", + "per negozio" + } + }, + j_fibonacci = { + name = "Fibonacci", + text = { + "Ogni {C:attention}Asso{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} o {C:attention}8{} giocato dà", + "{C:mult}+#1#{} Molt quando assegna punti" + } + }, + j_steel_joker = { + name = "Jolly di acciaio", + text = { + "Questo Jolly guadagna {X:mult,C:white} X#1# {} Molt", + "per ogni {C:attention}carta di acciaio", + "nel tuo mazzo completo", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + } + }, + j_scary_face = { + name = "Volto pauroso", + text = { + "Le {C:attention}figure{} giocate", + "danno {C:chips}+#1#{} fiche", + "quando assegnano punti" + } + }, + j_abstract = { + name = "Jolly astratto", + text = { + "{C:mult}+#1#{} Molt per", + "ogni {C:attention}Jolly{}", + "{C:inactive}(Attualmente {C:red}+#2#{C:inactive} Molt)" + } + }, + j_delayed_grat = { + name = "Gratificazione ritardata", + text = { + "Guadagni {C:money}$#1#{} per {C:attention}scarto{} se", + "non ne usi nessuno", + "entro la fine del round" + } + }, + j_hack = { + name = "Impostore", + text = { + "Riattiva", + "tutti i", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} o {C:attention}5{} giocati" + } + }, + j_pareidolia = { + name = "Pareidolia", + text = { + "Tutte le carte", + "sono considerate", + "{C:attention}figure{}" + } + }, + j_gros_michel = { + name = "Gros Michel", + text = { + "{C:mult}+#1#{} Molt", + "{C:green}#2# probabilità su #3#{} che", + "questa carta venga distrutta", + "alla fine del round" + } + }, + j_even_steven = { + name = "Numeri pari", + text = { + "Le carte giocate con", + "valore {C:attention}pari{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "Numeri dispari", + text = { + "Le carte giocate con", + "valore {C:attention}dispari{} danno", + "{C:chips}+#1#{} fiche quando assegnano punti", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Studioso", + text = { + "Gli {C:attention}Assi{} giocati", + "danno {C:chips}+#2#{} fiche", + "e {C:mult}+#1#{} Molt", + "quando assegnano punti" + } + }, + j_business = { + name = "Biglietto da visita", + text = { + "Le {C:attention}figure{} giocate hanno", + "{C:green}#1# probabilità su #2#{} di", + "dare {C:money}$2{} quando assegnano punti" + } + }, + j_supernova = { + name = "Supernova", + text = { + "Aggiunge il numero di", + "volte che la {C:attention}mano di poker{} è", + "stata giocata a Molt" + } + }, + j_ride_the_bus = { + name = "Giro sull'autobus", + text = { + "{C:mult}+#1#{} Molt per", + "ogni mano consecutiva", + "giocata senza usare", + "una {C:attention}figura{}", + "{C:inactive}(Attualmente {C:mult}+#2#{C:inactive} Molt)" + } + }, + j_space = { + name = "Jolly spaziale", + text = { + "{C:green}#1# probabilità su #2#{} di", + "migliorare il livello della", + "{C:attention}mano di poker{} giocata" + } + }, + j_egg = { + name = "Uovo", + text = { + "Guadagna {C:money}$#1#{} come", + "{C:attention}valore di vendita{} alla", + "fine del round" + } + }, + j_burglar = { + name = "Ladro", + text = { + "Quando selezioni un {C:attention}buio{},", + "guadagni {C:blue}+#1#{} mani e", + "{C:attention}perdi tutti gli scarti" + } + }, + j_blackboard = { + name = "Lavagna", + text = { + "{X:red,C:white} X#1# {} Molt se tutte", + "carte tenute in mano", + "sono di {C:spades}#2#{} o {C:clubs}#3#{}" + } + }, + j_runner = { + name = "Corridore", + text = { + "Guadagna {C:chips}+#2#{} fiche", + "se la mano giocata", + "include una {C:attention}Scala{}", + "{C:inactive}(Attualmente {C:chips}+#1#{C:inactive} fiche)" + } + }, + j_ice_cream = { + name = "Gelato", + text = { + "{C:chips}+#1#{} fiche", + "{C:chips}-#2#{} fiche per", + "ogni mano giocata" + } + }, + j_dna = { + name = "DNA", + text = { + "Se la {C:attention}prima mano{} del round", + "ha solo {C:attention}1{} carta, aggiungine una", + "copia permanente al mazzo", + "e pescala in {C:attention}mano" + } + }, + j_splash = { + name = "Schizzo", + text = { + "Ogni {C:attention}carta giocata", + "assegna punti" + } + }, + j_blue_joker = { + name = "Jolly blu", + text = { + "{C:chips}+#1#{} fiche per ogni", + "carta rimasta nel {C:attention}mazzo", + "{C:inactive}(Attualmente {C:chips}+#2#{C:inactive} fiche)" + } + }, + j_sixth_sense = { + name = "Sesto senso", + text = { + "Se la {C:attention}prima mano{} del round è", + "un singolo {C:attention}6{}, distruggilo e", + "crea una carta {C:spectral}Spettrale{}", + "{C:inactive}(Serve spazio)" + } + }, + j_constellation = { + name = "Costellazione", + text = { + "Guadagna {X:mult,C:white} X#1# {} Molt", + "per ogni carta {C:planet}Pianeta{} usata", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + } + }, + j_hiker = { + name = "Escursionista", + text = { + "Ogni {C:attention}carta{} giocata", + "guadagna permanentemente", + "{C:chips}+#1#{} fiche quando assegna punti" + } + }, + j_faceless = { + name = "Jolly senza volto", + text = { + "Guadagni {C:money}$#1#{} se {C:attention}#2#{} o", + "più {C:attention}figure{}", + "sono scartate", + "allo stesso tempo" + } + }, + j_green_joker = { + name = "Jolly verde", + text = { + "{C:mult}+#1#{} Molt per mano giocata", + "{C:mult}-#2#{} Molt per scarto", + "{C:inactive}(Attualmente {C:mult}+#3#{C:inactive} Molt)" + } + }, + j_superposition = { + name = "Sovrapposizione", + text = { + "Crea un {C:tarot}Tarocco{} se", + "la mano di poker include un", + "{C:attention}Asso{} e una {C:attention}Scala{}", + "{C:inactive}(Serve spazio)" + } + }, + j_todo_list = { + name = "Lista del da farsi", + text = { + "Guadagni {C:money}$#1#{} se la {C:attention}mano di poker{}", + "è 1 {C:attention}#2#{}.", + "La mano di poker cambia", + "dopo ogni pagamento" + } + }, + j_ticket = { + name = "Biglietto dorato", + text = { + "Le carte {C:attention}dorate{} giocate", + "guadagnano {C:money}$#1#{} quando assegnano punti" + }, + unlock = { + "Gioca una mano da 5 carte", + "che include solo", + "carte {C:attention,E:1}dorate{}" + } + }, + j_mr_bones = { + name = "Signor Scheletro", + text = { + "Previene la morte", + "se le fiche vinte", + "sono almeno il {C:attention}25%", + "delle fiche richieste", + "{S:1.1,C:red,E:2}si autodistrugge{}" + }, + unlock = { + "Perdi {C:attention,E:1}#1#{} sessioni", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Acrobata", + text = { + "{X:red,C:white} X#1# {} Molt nella {C:attention}mano", + "{C:attention}finale{} del round" + }, + unlock = { + "Gioca {C:attention,E:1}#1#{} mani", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "Maschere tragicomiche", + text = { + "Riattiva tutte", + "le {C:attention}figure{} giocate" + }, + unlock = { + "Gioca un totale di", + "{C:attention,E:1}#1#{} figure", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "Moschettiere", + text = { + "Aggiunge il valore di vendita di", + "di tutti i {C:attention}Jolly{} rimasti", + "di questa carta a Molt", + "{C:inactive}(Attualmente {C:mult}+#1#{C:inactive} Molt)" + }, + unlock = { + "Vendi un totale di", + "{C:attention,E:1}#1#{} Jolly", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Trovatore", + text = { + "{C:attention}+#1#{} carte della mano,", + "{C:red}-#2#{} mani per round" + }, + unlock = { + "Vinci {C:attention,E:1}#1#{} round", + "consecutivi giocando", + "solo 1 mano" + } + }, + j_certificate = { + name = "Certificato", + text = { + "All'inizio del round,", + "aggiungi una {C:attention}carta", + "{C:attention}giocata{} casuale con un", + "{C:attention}Sigillo{} casuale alla tua mano" + }, + unlock = { + "Devi avere una carta", + "da gioco dorata con", + "un {C:attention,E:1}Sigillo d'oro" + } + }, + j_smeared = { + name = "Jolly sbavato", + text = { + "{C:hearts}Cuori{} e {C:diamonds}Quadri", + "contano come lo stesso seme,", + "{C:spades}Picche{} e {C:clubs}Fiori", + "contano come lo stesso seme" + }, + unlock = { + "Devi avere almeno {C:attention}#1#", + "{E:1,C:attention}#2#{} nel", + "tuo mazzo" + } + }, + j_throwback = { + name = "Tuffo nel passato", + text = { + "{X:mult,C:white} X#1# {} Molt per ogni", + "{C:attention}buio{} saltato in questa sessione", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + }, + unlock = { + "Continua una sessione salvata", + "dal menu principale" + } + }, + j_hanging_chad = { + name = "Scheda non valida", + text = { + "Riattiva la {C:attention}prima{} carta", + "giocata usata per segnare punti" + }, + unlock = { + "Batti un buio boss", + "con 1 {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Pietra grezza", + text = { + "Le carte giocate con", + "seme {C:diamonds}Quadri{} guadagnano", + "{C:money}$#1#{} quando assegnano punti" + }, + unlock = { + "Devi avere almeno {E:1,C:attention}#1#", + "carte di {E:1,C:attention}#2#", + "nel tuo mazzo" + } + }, + j_bloodstone = { + name = "Diaspro sanguigno", + text = { + "{C:green}#1# probabilità su #2#{} che", + "le carte giocate con", + "seme {C:hearts}Cuori{} diano", + "{X:mult,C:white} X#3# {} Molt quando assegna punti," + }, + unlock = { + "Devi avere almeno {E:1,C:attention}#1#", + "carte di {E:1,C:attention}#2#", + "nel tuo mazzo" + } + }, + j_arrowhead = { + name = "Punta di freccia", + text = { + "Le carte giocate con", + "seme {C:spades}Picche{} danno", + "{C:chips}+#1#{} fiche quando assegna punti" + }, + unlock = { + "Devi avere almeno {E:1,C:attention}#1#", + "carte di {E:1,C:attention}#2#", + "nel tuo mazzo" + } + }, + j_onyx_agate = { + name = "Agata onice", + text = { + "Le carte giocate con", + "seme {C:clubs}Fiori{} danno", + "{C:mult}+#1#{} Molt quando assegnano punti" + }, + unlock = { + "Devi avere almeno {E:1,C:attention}#1#", + "carte di {E:1,C:attention}#2#", + "nel tuo mazzo" + } + }, + j_glass = { + name = "Jolly di vetro", + text = { + "Guadagna {X:mult,C:white} X#1# {} Molt", + "per ogni {C:attention}carta di vetro", + "che viene distrutta", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + }, + unlock = { + "Devi avere almeno {E:1,C:attention}#1#", + "{E:1,C:attention}#2#{} nel", + "tuo mazzo" + } + }, + j_ring_master = { + name = "Direttore di circo", + text = { + "{C:attention}Jolly{}, {C:tarot}Tarocchi{}, carte {C:planet}Pianeta{}", + "e {C:spectral}Spettrali{} possono", + "apparire più volte" + }, + unlock = { + "Raggiungi il liv.", + "ante {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Vaso di fiori", + text = { + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata ha una carta di", + "{C:diamonds}Quadri{}, una di {C:clubs}Fiori{},", + "una di {C:hearts}Cuori{} e una di {C:spades}Picche{} da punti" + }, + unlock = { + "Raggiungi il liv.", + "ante {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Cianografia", + text = { + "Copia le abilità", + "del {C:attention}Jolly{} a destra" + }, + unlock = { + "Vinci una sessione" + } + }, + j_wee = { + name = "Jolly piccolo", + text = { + "Questo Jolly guadagna", + "{C:chips}+#2#{} fiche quando ogni", + "{C:attention}2{} giocato assegna punti", + "{C:inactive}(Attualmente {C:chips}+#1#{C:inactive} fiche)" + }, + unlock = { + "Vinci una sessione in {E:1,C:attention}#1#", + "o meno round" + } + }, + j_merry_andy = { + name = "Risparmio di scarti", + text = { + "{C:red}+#1#{} scarti,", + "{C:red}#2#{} carta della mano" + }, + unlock = { + "Vinci una sessione in {E:1,C:attention}#1#", + "o meno round" + } + }, + j_oops = { + name = "Ops! Tutti 6", + text = { + "Raddoppia tutte le {C:attention}probabilità", + "{C:green,E:1,S:1.1}elencate", + "{C:inactive}(es.: {C:green}1 su 3{C:inactive} -> {C:green}2 su 3{C:inactive})" + }, + unlock = { + "In una mano,", + "guadagna almeno", + "{E:1,C:attention}#1#{} fiche" + } + }, + j_idol = { + name = "L'idolo", + text = { + "Ogni {C:attention}#2#", + "di {V:1}#3#{} che giochi dà", + "{X:mult,C:white} X#1# {} Molt quando assegna punti", + "{s:0.8}La carta è diversa in ogni round" + }, + unlock = { + "In una mano,", + "guadagna almeno", + "{E:1,C:attention}#1#{} fiche" + } + }, + j_seeing_double = { + name = "Visione doppia", + text = { + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata ha una carta di", + "{C:clubs}Picche{} da punti e una carta", + "di qualsiasi altro {C:attention}seme{} da punti" + }, + unlock = { + "Gioca una mano", + "che include", + "{E:1,C:attention}#1#" + } + }, + j_matador = { + name = "Torero", + text = { + "Guadagni {C:money}$#1#{} se la mano", + "giocata attiva", + "l'abilità del {C:attention}buio boss{}." + }, + unlock = { + "Sconfiggi un buio boss", + "in {E:1,C:attention}1 mano{} senza", + "scartare carte" + } + }, + j_hit_the_road = { + name = "In viaggio", + text = { + "Guadagna {X:mult,C:white} X#1# {} Molt", + "per ogni {C:attention}Fante{}", + "scartato in questo round", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + }, + unlock = { + "Scarta {E:1,C:attention}5", + "{E:1,C:attention}Fanti{} allo", + "stesso tempo" + } + }, + j_duo = { + name = "Il duo", + text = { + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata include", + "1 {C:attention}#2#" + }, + unlock = { + "Vinci una sessione", + "senza giocare neanche", + "1 {E:1,C:attention}#1#" + } + }, + j_trio = { + name = "Il trio", + text = { + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata include", + "1 {C:attention}#2#" + }, + unlock = { + "Vinci una sessione", + "senza giocare neanche", + "1 {E:1,C:attention}#1#" + } + }, + j_family = { + name = "La famiglia", + text = { + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata include", + "1 {C:attention}#2#" + }, + unlock = { + "Vinci una sessione", + "senza giocare neanche", + "1 {E:1,C:attention}#1#" + } + }, + j_order = { + name = "L'ordine", + text = { + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata include", + "1 {C:attention}#2#" + }, + unlock = { + "Vinci una sessione", + "senza giocare neanche", + "1 {E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "La tribù", + text = { + "{X:mult,C:white} X#1# {} Molt se la mano", + "giocata include", + "1 {C:attention}#2#" + }, + unlock = { + "Vinci una sessione", + "senza giocare neanche", + "1 {E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "Cavendish", + text = { + "{X:mult,C:white} X#1# {} Molt", + "{C:green}#2# probabilità su #3#{} che", + "questa carta venga distrutta", + "alla fine del round" + } + }, + j_card_sharp = { + name = "Baro", + text = { + "{X:mult,C:white} X#1# {} Molt se la {C:attention}mano", + "{C:attention}di poker{} è già stata", + "giocata in questo round" + } + }, + j_red_card = { + name = "Carta rossa", + text = { + "Guadagna {C:red}+#1#{} Molt quando salti una", + "{C:attention}busta di espansione{}", + "{C:inactive}(Attualmente {C:red}+#2#{C:inactive} Molt)" + } + }, + j_madness = { + name = "Follia", + text = { + "Quando selezioni un {C:attention}buio{},", + "guadagni {X:mult,C:white} X#1# {} Molt e", + "{C:attention}distruggi{} un Jolly casuale", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {} Molt)" + } + }, + j_square = { + name = "Jolly squadrato", + text = { + "Guadagna {C:chips}+#2#{} fiche se", + "la mano giocata ha", + "esattamente {C:attention}4{} carte", + "{C:inactive}(Attualmente {C:chips}#1#{} fiche)" + } + }, + j_seance = { + name = "Seduta spiritica", + text = { + "Se una {C:attention}mano di poker{} è 1", + "{C:attention}#1#{}, crea una", + "carta {C:spectral}Spettrale{} casuale", + "{C:inactive}(Serve spazio)" + } + }, + j_riff_raff = { + name = "Marmaglia", + text = { + "Quando selezioni un {C:attention}buio{},", + "crea {C:attention}$#1# Jolly {C:blue}comuni", + "{C:inactive}(Serve spazio)" + } + }, + j_stuntman = { + name = "Stuntman", + text = { + "{C:chips}+#1#{} fiche,", + "{C:attention}-#2#{} carte della mano" + }, + unlock = { + "In una mano,", + "guadagna almeno", + "{E:1,C:attention}#1#{} fiche" + } + }, + j_invisible = { + name = "Jolly invisibile", + text = { + "Dopo {C:attention}#1#{} round,", + "vendi questa carta per", + "{C:attention}duplicare{} un Jolly casuale", + "{C:inactive}(Attualmente {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Vinci una sessione", + "senza avere più", + "di {E:1,C:attention}4 Jolly{}" + } + }, + j_brainstorm = { + name = "Raccolta di idee", + text = { + "Copia l'abilità", + "del {C:attention}Jolly{} più a sinistra" + }, + unlock = { + "Scarta una", + "{E:1,C:attention}Scala reale massima" + } + }, + j_satellite = { + name = "Satellite", + text = { + "Guadagni {C:money}$#1#{} alla fine del", + "round per ogni carta {C:planet}Pianeta{} unica", + "usata in questa sessione", + "{C:inactive}(Attualmente {C:money}$#2#{C:inactive})" + }, + unlock = { + "Devi avere {E:1,C:money}$#1#", + "o più" + } + }, + j_shoot_the_moon = { + name = "Cappotto", + text = { + "{C:mult}+#1#{} Molt per", + "ogni {C:attention}Regina{}", + "tenuta in mano" + }, + unlock = { + "Gioca ogni {E:1,C:attention}Cuore", + "nel tuo mazzo in", + "un singolo round" + } + }, + j_drivers_license = { + name = "Patente di guida", + text = { + "{X:mult,C:white} X#1# {} Molt se", + "hai almeno {C:attention}16", + "carte potenziate", + "{C:inactive}(Attualmente {C:attention}#2#{C:inactive})" + }, + unlock = { + "Potenzia {E:1,C:attention}#1#{} carte", + "nel tuo mazzo" + } + }, + j_cartomancer = { + name = "Cartomante", + text = { + "Crea un {C:tarot}Tarocco{}", + "quando selezioni un {C:attention}buio{}", + "{C:inactive}(Serve spazio)" + }, + unlock = { + "Scopri ogni", + "{E:1,C:tarot}Tarocco{}" + } + }, + j_astronomer = { + name = "Astronomo", + text = { + "Tutte le carte {C:planet}Pianeta{} e", + "{C:planet}buste celestiali{} nel", + "Negozio sono {C:attention}gratis" + }, + unlock = { + "Scopri ogni", + "carta {E:1,C:planet}Pianeta{}" + } + }, + j_burnt = { + name = "Jolly bruciato", + text = { + "Migliora il livello della prima", + "mano di poker {C:attention}scartata", + "in ogni round" + }, + unlock = { + "Vendi un totale", + "di {E:1,C:attention}#1#{} carte", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Scarpe ai piedi", + text = { + "{C:mult}+#1#{} Molt per ogni", + "{C:money}$#2#{} che hai" + }, + unlock = { + "Devi avere almeno {E:1,C:attention}#1#", + "Jolly {C:dark_edition}policromi{}" + } + }, + j_caino = { + name = "Canio", + text = { + "Guadagna {X:mult,C:white} X#1# {} Molt quando", + "una {C:attention}figura{}", + "viene distrutta", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "Triboulet", + text = { + "Ogni {C:attention}Re{} e", + "{C:attention}Regina{} che giochi dà", + "{X:mult,C:white} X#1# {} Molt quando assegna punti," + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "Yorick", + text = { + "{X:mult,C:white} X#1# {} Molt solo", + "dopo {C:attention}#2#{} scarti", + "{C:inactive}(Scarti rimasti: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "Chicot", + text = { + "Disattiva l'effetto di", + "ogni {C:attention}buio boss" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "Perkeo", + text = { + "Crea una copia {C:dark_edition}negativa{} di", + "{C:attention}1{} carta {C:attention}consumabile{}", + "casuale in tuo possesso", + "alla fine del {C:attention}negozio" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "Jolly subdolo", + text = { + "{C:chips}+#1#{} fiche se la mano", + "giocata include", + "1 {C:attention}#2#" + } + }, + j_wily = { + name = "Jolly astuto", + text = { + "{C:chips}+#1#{} fiche se la mano", + "giocata include", + "1 {C:attention}#2#" + } + }, + j_clever = { + name = "Jolly intelligente", + text = { + "{C:chips}+#1#{} fiche se la mano", + "giocata include", + "1 {C:attention}#2#" + } + }, + j_devious = { + name = "Jolly infido", + text = { + "{C:chips}+#1#{} fiche se la mano", + "giocata include", + "1 {C:attention}#2#" + } + }, + j_crafty = { + name = "Jolly furbo", + text = { + "{C:chips}+#1#{} fiche se la mano", + "giocata include", + "1 {C:attention}#2#" + } + }, + j_vampire = { + name = "Vampiro", + text = { + "Guadagna {X:mult,C:white} X#1# {} Molt per", + "ogni {C:attention}carta potenziata{} giocata,", + "rimuove {C:attention}potenziamento{} carta", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + } + }, + j_shortcut = { + name = "Scorciatoia", + text = { + "Permette di creare {C:attention}Scale{}", + "saltando {C:attention}1 valore{}", + "{C:inactive}(es.: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Ologramma", + text = { + "Guadagna {X:mult,C:white} X#1# {} Molt", + "per ogni {C:attention}carta da gioco{}", + "aggiunta al mazzo", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + } + }, + j_vagabond = { + name = "Vagabondo", + text = { + "Crea un {C:purple}Tarocco{}", + "se giochi la mano", + "con {C:money}$#1#{} o meno" + } + }, + j_baron = { + name = "Barone", + text = { + "Ogni {C:attention}Re{}", + "tenuto in mano", + "dà {X:mult,C:white} X#1# {} Molt" + } + }, + j_cloud_9 = { + name = "Nove nuvoloso", + text = { + "Guadagni {C:money}$#1#{} per ogni", + "{C:attention}9{} nel tuo {C:attention}mazzo completo", + "alla fine del round", + "{C:inactive}(Attualmente {C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "Razzo", + text = { + "Guadagni {C:money}$#1#{} alla fine del", + "del round. Guadagna {C:money}$#2#{} quando", + "sconfiggi il {C:attention}buio boss{}" + } + }, + j_obelisk = { + name = "Obelisco", + text = { + "{X:mult,C:white} X#1# {} Molt per", + "ogni mano consecutiva giocata", + "senza giocare la tua", + "{C:attention}mano di poker{} più giocata", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + } + }, + j_midas_mask = { + name = "Maschera di Mida", + text = { + "Tutte le {C:attention}figure{}", + "diventano carte {C:attention}dorate{}", + "quando sono giocate" + } + }, + j_luchador = { + name = "Luchador", + text = { + "Vendi questa carta per", + "disattivare l'attuale", + "{C:attention}buio boss{}" + } + }, + j_photograph = { + name = "Fotografia", + text = { + "La prima {C:attention}figura", + "giocata dà {X:mult,C:white} X#1# {} Molt", + "quando assegna punti" + } + }, + j_gift = { + name = "Carta regalo", + text = { + "Aggiungi {C:money}$#1#{} di {C:attention}valore di vendita", + "a ogni {C:attention}Jolly{} e", + "carta {C:attention}consumabile{} alla", + "fine del round" + } + }, + j_turtle_bean = { + name = "Fagiolo nero", + text = { + "{C:attention}+#1#{} carte della mano,", + "si riducono di", + "{C:red}#2#{} in ogni round" + } + }, + j_erosion = { + name = "Erosione", + text = { + "{C:red}+#1#{} Molt per ogni", + "carta sotto {C:attention}#3#{}", + "nel tuo mazzo completo", + "{C:inactive}(Attualmente {C:red}+#2#{C:inactive} Molt)" + } + }, + j_reserved_parking = { + name = "Parcheggio riservato", + text = { + "Ogni {C:attention}figura{}", + "tenuta in mano ha", + "{C:green}#2# probabilità su #3#{}", + "di dare {C:money}$#1#{}" + } + }, + j_mail = { + name = "Offerta per posta", + text = { + "Guadagni {C:money}$#1#{} per ogni", + "{C:attention}#2#{} che scarti, il valore", + "è diverso in ogni round" + } + }, + j_to_the_moon = { + name = "Crescita notevole", + text = { + "Guadagni {C:money}$#1#{} in più di", + "{C:attention}interessi{} per ogni {C:money}$5{} che", + "hai alla fine del round" + } + }, + j_hallucination = { + name = "Allucinazione", + text = { + "{C:green}#1# probabilità su #2#{} di creare", + "un {C:tarot}Tarocco{} quando apri una", + "{C:attention}busta di espansione{} qualsiasi", + "{C:inactive}(Serve spazio)" + } + }, + j_lucky_cat = { + name = "Gatto della fortuna", + text = { + "Guadagna {X:mult,C:white} X#1# {} Molt ogni", + "volta che una carta {C:attention}fortunata{}", + "si attiva {C:green}con successo{}", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + } + }, + j_baseball = { + name = "Carta da baseball", + text = { + "I Jolly {C:green}non comuni{}", + "danno {X:mult,C:white} X#1# {} Molt ciascuno" + } + }, + j_bull = { + name = "Toro", + text = { + "{C:chips}+#1#{} fiche per ogni", + "{C:money}dollaro{} che hai", + "{C:inactive}(Attualmente {C:chips}+#2#{C:inactive} fiche)" + } + }, + j_diet_cola = { + name = "Senza zuccheri", + text = { + "Vendi questa carta per", + "creare 1", + "{C:attention}#1#{} gratis" + } + }, + j_trading = { + name = "Carta collezionabile", + text = { + "Se il {C:attention}primo scarto{} del round", + "ha solo {C:attention}1{} carta, distruggila", + "e guadagna {C:money}$#1#" + } + }, + j_flash = { + name = "Carta alfabeto", + text = { + "{C:mult}+#1#{} Molt per ogni", + "{C:attention}cambio{} nel negozio", + "{C:inactive}(Attualmente {C:mult}+#2#{C:inactive} Molt)" + } + }, + j_popcorn = { + name = "Popcorn", + text = { + "{C:mult}+#1#{} Molt", + "{C:mult}-#2#{} Molt per ogni", + "round giocato" + } + }, + j_trousers = { + name = "Ricambio", + text = { + "Guadagna {C:mult}+#1#{} Molt se", + "la mano giocata include", + "1 {C:attention}#2#", + "{C:inactive}(Attualmente {C:red}+#3#{C:inactive} Molt)" + } + }, + j_ancient = { + name = "Jolly antico", + text = { + "Ogni carta giocata con", + "seme {V:1}#2#{} dà", + "{X:mult,C:white} X#1# {} Molt quando assegna punti,", + "{s:0.8}il seme cambia alla fine del round" + } + }, + j_ramen = { + name = "Ramen", + text = { + "{X:mult,C:white} X#1# {} Molt,", + "perde {X:mult,C:white} X#2# {} Molt", + "per ogni {C:attention}carta{} scartata" + } + }, + j_walkie_talkie = { + name = "Walkie-talkie", + text = { + "Ogni {C:attention}10{} o {C:attention}4{} giocati", + "danno {C:chips}+#1#{} fiche e", + "{C:mult}+#2#{} Molt quando assegnano punti" + } + }, + j_selzer = { + name = "Seltz", + text = { + "Riattiva tutte", + "le carte giocate", + "per le prossime {C:attention}#1#{} mani" + } + }, + j_castle = { + name = "Castello", + text = { + "Questo Jolly guadagna {C:chips}+#1#{} fiche", + "per ogni {V:1}#2#{} che scarti,", + "il seme è diverso in ogni round", + "{C:inactive}(Attualmente {C:chips}+#3#{C:inactive} fiche)" + } + }, + j_smiley = { + name = "Volto sorridente", + text = { + "Le {C:attention}figure{} giocate", + "danno {C:mult}+#1#{} Molt", + "quando assegnano punti" + } + }, + j_campfire = { + name = "Falò", + text = { + "Questo Jolly guadagna {X:mult,C:white}X#1#{} Molt", + "per ogni carta {C:attention}venduta{}, si ripristina", + "quando sconfiggi il {C:attention}buio boss{}", + "{C:inactive}(Attualmente {X:mult,C:white} X#2# {C:inactive} Molt)" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Più merce", + text = { + "{C:attention}+1{} slot carte", + "disponibile nel negozio" + } + }, + v_clearance_sale = { + name = "Svendita", + text = { + "Tutte le carte e le buste nel", + "negozio sono scontate del {C:attention}#1#%{}" + } + }, + v_tarot_merchant = { + name = "Mercante di Tarocchi", + text = { + "I {C:tarot}Tarocchi{} appaiono", + "{C:attention}#1#X{} più frequentemente", + "nel negozio" + } + }, + v_planet_merchant = { + name = "Mercante di Pianeti", + text = { + "Le carte {C:planet}Pianeta{} appaiono", + "{C:attention}#1#X{} più frequentemente", + "nel negozio" + } + }, + v_hone = { + name = "Affinatura", + text = { + "Le carte {C:dark_edition}foil{}, {C:dark_edition}olografiche{} e", + "{C:dark_edition}policrome{} appaiono", + "{C:attention}#1#X{} più spesso" + } + }, + v_reroll_surplus = { + name = "Cambi in surplus", + text = { + "I cambi costano", + "{C:money}$#1#{} in meno" + } + }, + v_crystal_ball = { + name = "Sfera di cristallo", + text = { + "{C:attention}+1{} slot consumabili" + } + }, + v_telescope = { + name = "Telescopio", + text = { + "Le {C:attention}buste celestiali{} hanno", + "sempre la carta {C:planet}Pianeta{}", + "relativa alla tua", + "{C:attention}mano di poker{} più giocata" + } + }, + v_grabber = { + name = "Manesco", + text = { + "Guadagni", + "permanentemente {C:blue}+#1#{} mano", + "per round" + } + }, + v_wasteful = { + name = "Spreco", + text = { + "Guadagni", + "permanentemente {C:red}+#1#{} scarto", + "per round" + } + }, + v_seed_money = { + name = "Seme del successo", + text = { + "Il limite massimo di", + "interessi guadagnati", + "per round sale a {C:money}$#1#{}" + } + }, + v_blank = { + name = "Vuoto", + text = { + "{C:inactive}Non fa nulla?" + } + }, + v_magic_trick = { + name = "Trucco di magia", + text = { + "Le {C:attention}carte da gioco{} possono", + "essere acquistate", + "dal {C:attention}negozio" + } + }, + v_hieroglyph = { + name = "Geroglifico", + text = { + "{C:attention}-#1#{} ante", + "{C:blue}-#1#{} mano", + "per round", + "{C:attention}-#1#{} ante" + } + }, + v_directors_cut = { + name = "Versione del regista", + text = { + "Puoi cambiare il buio boss", + "{C:attention}1{} volta per ante,", + "{C:money}$#1#{} per cambio" + } + }, + v_pattern = { + name = "Schema", + text = { + "Genera la tua carta", + "{C:attention}consumabile{} più usata", + "{E:1,V:1}#1#", + "{C:inactive}(Serve spazio)" + } + }, + v_overstock_plus = { + name = "Troppa merce", + text = { + "{C:attention}+1{} slot carte", + "disponibile nel negozio" + }, + unlock = { + "Spendi un totale di", + "{C:money}$#1#{} al negozio", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "Liquidazione", + text = { + "Tutte le carte e le buste nel", + "negozio sono scontate del {C:attention}#1#%{}" + }, + unlock = { + "Riscatta almeno", + "{C:attention}#1#{C:voucher} Buoni{}", + "in una sessione" + } + }, + v_tarot_tycoon = { + name = "Magnate di Tarocchi", + text = { + "I {C:tarot}Tarocchi{} appaiono", + "{C:attention}#1#X{} più frequentemente", + "nel negozio" + }, + unlock = { + "Compra un totale di", + "{C:attention}#1#{C:tarot} Tarocchi{}", + "dal negozio", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Magnate di Pianeti", + text = { + "Le carte {C:planet}Pianeta{} appaiono", + "{C:attention}#1#X{} più frequentemente", + "nel negozio" + }, + unlock = { + "Compra un totale di", + "{C:attention}#1#{} carte {C:planet}Pianeta{}", + "dal negozio", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Perfezionamento", + text = { + "Le carte {C:dark_edition}foil{}, {C:dark_edition}olografiche{} e", + "{C:dark_edition}policrome{} appaiono", + "{C:attention}#1#X{} più spesso" + }, + unlock = { + "Devi avere almeno {C:attention}#1#", + "{C:attention}Jolly{} di", + "edizione {C:dark_edition}foil{}, {C:dark_edition}olografica{} o", + "{C:dark_edition}policroma{}" + } + }, + v_reroll_glut = { + name = "Eccesso di cambi", + text = { + "I cambi costano", + "{C:money}$#1#{} in meno" + }, + unlock = { + "Cambia il negozio", + "un totale di {C:attention}#1#{} volte", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Sfera presagente", + text = { + "Le carte {C:spectral}Spettrali{} possono", + "apparire in qualsiasi", + "{C:attention}busta arcana" + }, + unlock = { + "Usa un totale di {C:attention}#1#", + "{C:tarot}Tarocchi{} di qualsiasi", + "{C:tarot}busta arcana", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Osservatorio", + text = { + "Le carte {C:planet}Pianeta{} nella tua", + "area dei {C:attention}consumabili{} danno", + "{X:red,C:white} X#1# {} Molt per la loro", + "specifica {C:attention}mano di poker" + }, + unlock = { + "Usa un totale di {C:attention}#1#", + "carte {C:planet}Pianeta{} di qualsiasi", + "{C:planet}busta celestiale", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Mano sui nachos", + text = { + "Guadagni", + "permanentemente {C:blue}+#1#{} mano", + "per round" + }, + unlock = { + "Gioca un totale", + "di {C:attention}#1#{} carte", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Reciclomanzia", + text = { + "Guadagni", + "permanentemente {C:red}+#1#{} scarto", + "per round" + }, + unlock = { + "Scarta un totale", + "di {C:attention}#1#{} carte", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Albero di soldi", + text = { + "Il limite massimo di", + "interessi guadagnati", + "per round sale a {C:money}$#1#{}" + }, + unlock = { + "Massimizzi gli interessi", + "guadagnati per round per", + "{C:attention}#1#{} round consecutivi", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Antimateria", + text = { + "{C:dark_edition}+1{} slot Jolly" + }, + unlock = { + "Riscatta {C:voucher}Vuoto{}", + "{C:attention}#1#{} volte in totale", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Illusione", + text = { + "Le {C:attention}carte da gioco{} nel negozio", + "possono avere un {C:enhanced}potenziamento{},", + "un'{C:dark_edition}edizione{} e/o un {C:attention}Sigillo{}" + }, + unlock = { + "Compra un totale di", + "{C:attention}#1#{} carte da gioco", + "dal negozio", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Petroglifo", + unlock = { + "Raggiungi il liv.", + "ante {E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{} ante", + "{C:red}-#1#{} scarto", + "per round" + } + }, + v_retcon = { + name = "Retcon", + text = { + "Puoi cambiare il buio boss", + "un {C:attention}numero illimitato{} di volte,", + "{C:money}$#1#{} per cambio" + }, + unlock = { + "Scopri", + "{C:attention}#1#{} bui" + } + }, + v_tesselation = { + name = "Tassellatura", + text = { + "Genera il tuo", + "{C:attention}Jolly{} più usato", + "{E:1,V:1}#1#", + "{C:inactive}(Serve spazio)" + }, + unlock = { + "Compra l'edizione", + "{C:dark_edition}policroma{} del tuo", + "{C:attention}Jolly{} più usato", + "dal negozio" + } + }, + v_palette = { + name = "Tavolozza", + text = { + " {C:attention}+#1#{}", + "limite di carte in mano", + "{C:attention}+#1#{} carte della mano" + }, + unlock = { + "Riduci le carte della mano", + "a {C:attention}#1#{} carte" + } + }, + v_paint_brush = { + name = "Pennello", + text = { + "{C:attention}+#1#{} carte della mano" + } + } + }, + Tarot = { + c_fool = { + name = "Il matto", + text = { + "Crea l'ultima", + "carta {C:planet}Pianeta{} o {C:tarot}Tarocco{}", + "che hai usato in questa sessione", + "Escluso {s:0.8,C:tarot}Il matto{s:0.8}" + } + }, + c_magician = { + name = "Il bagatto", + text = { + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "La papessa", + text = { + "Crea fino a {C:attention}#1#", + "carte {C:planet}Pianeta{} casuali", + "{C:inactive}(Serve spazio)" + } + }, + c_empress = { + name = "L'imperatrice", + text = { + "Potenzia {C:attention}#1#", + "carte selezionate a", + "{C:attention}#2#" + } + }, + c_emperor = { + name = "L'imperatore", + text = { + "Crea fino a {C:attention}#1#", + "{C:tarot}Tarocchi{} casuali", + "{C:inactive}(Serve spazio)" + } + }, + c_heirophant = { + name = "Il papa", + text = { + "Potenzia {C:attention}#1#", + "carte selezionate a", + "{C:attention}#2#" + } + }, + c_lovers = { + name = "Gli amanti", + text = { + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "Il carro", + text = { + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#" + } + }, + c_justice = { + name = "La giustizia", + text = { + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "L'eremita", + text = { + "Raddoppia i soldi", + "{C:inactive}(Massimo {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "La ruota della fortuna", + text = { + "{C:green}#1# probabilità su #2#{} di applicare", + "un'edizione {C:dark_edition}foil{}, {C:dark_edition}olografica{} o", + "{C:dark_edition}policroma{}", + "a un {C:attention}Jolly{} casuale" + } + }, + c_strength = { + name = "La forza", + text = { + "Aumenta il valore di", + "un massimo di {C:attention}#1#{} carte", + "selezionate di {C:attention}1" + } + }, + c_hanged_man = { + name = "L'appeso", + text = { + "Distrugge fino a", + "{C:attention}#1#{} carte selezionate" + } + }, + c_death = { + name = "La morte", + text = { + "Seleziona {C:attention}#1#{} carte,", + "converti la carta {C:attention}sinistra{}", + "nella carta {C:attention}destra{}", + "{C:inactive}(Trascina per riordinare)" + } + }, + c_temperance = { + name = "La temperanza", + text = { + "Assegna il valore di vendita", + "totale di tutti i Jolly", + "attuali {C:inactive}(Massimo {C:money}$#1#{C:inactive})", + "{C:inactive}(Attualmente {C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "Il diavolo", + text = { + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#" + } + }, + c_tower = { + name = "La torre", + text = { + "Potenzia {C:attention}#1#{} carta", + "selezionata a", + "{C:attention}#2#" + } + }, + c_star = { + name = "La stella", + text = { + "Converte fino a", + "{C:attention}#1#{} carte selezionate", + "in {V:1}#2#{}" + } + }, + c_moon = { + name = "La luna", + text = { + "Converte fino a", + "{C:attention}#1#{} carte selezionate", + "in {V:1}#2#{}" + } + }, + c_sun = { + name = "Il sole", + text = { + "Converte fino a", + "{C:attention}#1#{} carte selezionate", + "in {V:1}#2#{}" + } + }, + c_judgement = { + name = "Il giudizio", + text = { + "Crea un", + "{C:attention}Jolly{} casuale", + "{C:inactive}(Serve spazio)" + } + }, + c_world = { + name = "Il mondo", + text = { + "Converte fino a", + "{C:attention}#1#{} carte selezionate", + "in {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Mercurio", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_venus = { + name = "Venere", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_earth = { + name = "Terra", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_mars = { + name = "Marte", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_jupiter = { + name = "Giove", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_saturn = { + name = "Saturno", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_uranus = { + name = "Urano", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_neptune = { + name = "Nettuno", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_pluto = { + name = "Plutone", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_ceres = { + name = "Cerere", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_planet_x = { + name = "Pianeta X", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + }, + c_eris = { + name = "Eris", + text = { + "{S:0.8}({S:0.8,V:1}liv.#1#{S:0.8}){} Aumenta di livello", + "{C:attention}#2#", + "{C:mult}+#3#{} Molt e", + "{C:chips}+#4#{} fiche" + } + } + }, + Spectral = { + c_familiar = { + name = "Famiglio", + text = { + "Distruggi {C:attention}1{} carta", + "casuale nella tua mano, aggiungi", + "{C:attention}#1# figure potenziate{}", + "casuali alla tua mano" + } + }, + c_grim = { + name = "Tenebre", + text = { + "Distruggi {C:attention}1{} carta", + "casuale nella tua mano,", + "aggiungi {C:attention}#1# Assi potenziati{}", + "casuali alla tua mano" + } + }, + c_incantation = { + name = "Incantesimo", + text = { + "Distruggi {C:attention}1{} carta", + "casuale nella tua mano, aggiungi {C:attention}#1#", + "{C:attention}carte numerate potenziate", + "casuali alla tua mano" + } + }, + c_talisman = { + name = "Talismano", + text = { + "Applica un {C:attention}Sigillo d'oro{}", + "a {C:attention}1{} carta", + "selezionata nella tua mano" + } + }, + c_aura = { + name = "Aura", + text = { + "Applica un effetto {C:dark_edition}foil{},", + "{C:dark_edition}olografico{} o {C:dark_edition}policromo{} a", + "{C:attention}1{} carta selezionata in mano" + } + }, + c_wraith = { + name = "Fantasma", + text = { + "Crea un", + "{C:attention}Jolly {C:red}raro{} casuale,", + "porta i soldi a {C:money}$0" + } + }, + c_sigil = { + name = "Sigillo", + text = { + "Converte tutte le carte", + "in mano in un singolo", + "{C:attention}seme casuale" + } + }, + c_ouija = { + name = "Ouija", + text = { + "Converte tutte le carte", + "in mano in un singolo", + "{C:attention}valore casuale", + "{C:red}-1{} carta della mano" + } + }, + c_ectoplasm = { + name = "Ectoplasma", + text = { + "Applica {C:dark_edition}negativo{} a", + "un {C:attention}Jolly casuale", + "{C:red}-1{} carta della mano" + } + }, + c_immolate = { + name = "Immolazione", + text = { + "Distrugge {C:attention}#1#{} carte", + "casuali in mano,", + "guadagni {C:money}$#2#" + } + }, + c_soul = { + name = "Anima", + text = { + "Crea un", + "Jolly {C:legendary,E:1}leggendario{}", + "{C:inactive}(Serve spazio)" + } + }, + c_black_hole = { + name = "Buco nero", + text = { + "Migliora ogni", + "{C:legendary,E:1}mano di poker", + "di {C:attention}1{} livello" + } + }, + c_ankh = { + name = "Ankh", + text = { + "Crea una copia di un", + "{C:attention}Jolly{} casuale, distruggi", + "tutti gli altri Jolly" + } + }, + c_deja_vu = { + name = "Déjà vu", + text = { + "Aggiungi un {C:red}Sigillo rosso{}", + "a {C:attention}1{} carta", + "selezionata nella tua mano" + } + }, + c_hex = { + name = "Maledizione", + text = { + "Aggiungi {C:dark_edition}policromo{} a un", + "{C:attention}Jolly{} casuale, distruggi", + "tutti gli altri Jolly" + } + }, + c_trance = { + name = "Trance", + text = { + "Aggiungi un {C:blue}Sigillo blu{}", + "a {C:attention}1{} carta", + "selezionata nella tua mano" + } + }, + c_medium = { + name = "Medium", + text = { + "Aggiungi un {C:purple}Sigillo viola{}", + "a {C:attention}1{} carta", + "selezionata nella tua mano" + } + }, + c_cryptid = { + name = "Criptide", + text = { + "Crea {C:attention}#1#{} copie di", + "{C:attention}1{} carta selezionata", + "nella tua mano" + } + } + }, + Edition = { + e_base = { + name = "Base", + text = { + "Nessun effetto extra" + } + }, + e_foil = { + name = "Foil", + text = { + "{C:chips}+#1#{} fiche" + } + }, + e_holo = { + name = "Olografica", + text = { + "{C:mult}+#1#{} Molt" + } + }, + e_polychrome = { + name = "Policroma", + text = { + "{X:mult,C:white} X#1# {} Molt" + } + }, + e_negative = { + name = "Negativa", + text = { + "{C:dark_edition}+#1#{} slot Jolly" + } + }, + e_negative_consumable = { + name = "Negativa", + text = { + "{C:dark_edition}+#1#{} slot consumabili" + } + } + }, + Enhanced = { + m_bonus = { + name = "Carta bonus", + text = {} + }, + m_mult = { + name = "Carta Molt", + text = { + "{C:mult}+#1#{} Molt" + } + }, + m_wild = { + name = "Carta multiuso", + text = { + "Può essere usata", + "al posto di ogni seme" + } + }, + m_glass = { + name = "Carta di vetro", + text = { + "{X:mult,C:white} X#1# {} Molt", + "{C:green}#2# probabilità su #3#{} di", + "distruggere la carta" + } + }, + m_steel = { + name = "Carta di acciaio", + text = { + "{X:mult,C:white} X#1# {} Molt", + "mentre questa carta", + "rimane in mano" + } + }, + m_stone = { + name = "Carta di pietra", + text = { + "{C:chips}+#1#{} fiche", + "nessun valore o seme" + } + }, + m_gold = { + name = "Carta dorata", + text = { + "{C:money}$#1#{} se hai", + "in mano questa carta", + "alla fine del round" + } + }, + m_lucky = { + name = "Carta fortunata", + text = { + "{C:green}#1# probabilità su #3#{}", + "di {C:mult}+#2#{} Molt", + "{C:green}#1# probabilità su #5#{}", + "di vincere {C:money}$#4#" + } + } + }, + Stake = { + stake_white = { + name = "Puntata bianca", + text = { + "Difficoltà base" + } + }, + stake_red = { + name = "Puntata rossa", + text = { + "Il {C:attention}piccolo buio{} non dà", + "soldi come ricompensa", + "{s:0.8}Applica tutte le puntate precedenti" + } + }, + stake_green = { + name = "Puntata verde", + text = { + "Maggior incremento dei punti", + "richiesti per ciascun {C:attention}ante", + "{s:0.8}Applica tutte le puntate precedenti" + } + }, + stake_blue = { + name = "Puntata blu", + text = { + "{C:red}-1{} scarto", + "{s:0.8}Applica tutte le puntate precedenti" + } + }, + stake_black = { + name = "Puntata nera", + text = { + "Il negozio può avere Jolly {C:attention}eterni{}", + "{C:inactive,s:0.8}{Invendibili o indistruttibili}", + "{s:0.8}Applica tutte le puntate precedenti" + } + }, + stake_purple = { + name = "Puntata viola", + text = { + "Maggior incremento dei punti", + "richiesti per ciascun {C:attention}ante", + "{s:0.8}Applica tutte le puntate precedenti" + } + }, + stake_orange = { + name = "Puntata arancione", + text = { + "Le {C:attention}buste di espansione{} costano", + "{C:money}$1{} in più per ante", + "{s:0.8}Applica tutte le puntate precedenti" + } + }, + stake_gold = { + name = "Puntata dorata", + text = { + "{C:red}-1{} carta della mano", + "{s:0.8}Applica tutte le puntate precedenti" + } + } + }, + Tag = { + tag_uncommon = { + name = "Patto non comune", + text = { + "Il negozio ha un", + "{C:green}Jolly non comune" + } + }, + tag_rare = { + name = "Patto raro", + text = { + "Il negozio ha un", + "{C:red}Jolly raro" + } + }, + tag_negative = { + name = "Patto negativo", + text = { + "Il negozio ha un", + "{C:dark_edition}Jolly negativo" + } + }, + tag_foil = { + name = "Patto foil", + text = { + "Il negozio ha un", + "{C:dark_edition}Jolly foil" + } + }, + tag_holo = { + name = "Patto olografico", + text = { + "Il negozio ha un", + "{C:dark_edition}Jolly olografico" + } + }, + tag_polychrome = { + name = "Patto policromo", + text = { + "Il negozio ha un", + "{C:dark_edition}Jolly policromo" + } + }, + tag_investment = { + name = "Patto investimento", + text = { + "Dopo aver sconfitto", + "il buio boss,", + "guadagni {C:money}$#1#" + } + }, + tag_voucher = { + name = "Patto Buoni", + text = { + "Aggiunge un {C:voucher}Buono", + "al prossimo negozio" + } + }, + tag_boss = { + name = "Patto boss", + text = { + "Cambia il", + "{C:attention}buio boss" + } + }, + tag_standard = { + name = "Patto standard", + text = { + "Dà gratuitamente una", + "{C:attention}busta standard mega" + } + }, + tag_charm = { + name = "Patto magico", + text = { + "Dà gratuitamente una", + "{C:tarot}busta arcana mega" + } + }, + tag_meteor = { + name = "Patto meteora", + text = { + "Dà gratuitamente una", + "{C:planet}busta celestiale mega" + } + }, + tag_buffoon = { + name = "Patto buffone", + text = { + "Dà gratuitamente una", + "{C:attention}busta buffone" + } + }, + tag_handy = { + name = "Patto alla mano", + text = { + "Dà {C:money}$#1#{} per", + "{C:blue}mano{} giocata in questa sessione", + "{C:inactive}(Darà {C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "Patto spazzatura", + text = { + "Dà {C:money}$#1#{} per", + "{C:red}scarto{} non usato in questa sessione", + "{C:inactive}(Darà {C:money}$#2#{C:inactive})" + } + }, + tag_coupon = { + name = "Patto coupon", + text = { + "Le carte e buste di", + "espansione iniziali nel prossimo", + "negozio sono gratis" + } + }, + tag_double = { + name = "Patto doppio", + text = { + "Assegna una copia del", + "prossimo {C:attention}patto{} scelto", + "{s:0.8}Escluso il {s:0.8,C:attention}patto doppio" + } + }, + tag_juggle = { + name = "Patto giocoliere", + text = { + "{C:attention}+#1#{} carte della mano", + "nel prossimo round" + } + }, + tag_d_six = { + name = "Patto fortunato", + text = { + "Il prezzo iniziale dei cambi", + "nel prossimo negozio è {C:money}$0" + } + }, + tag_top_up = { + name = "Patto ricarica", + text = { + "Crea fino a {C:attention}#1#", + "Jolly {C:blue}comuni{}", + "{C:inactive}(Serve spazio)" + } + }, + tag_skip = { + name = "Patto veloce", + text = { + "Dà {C:money}$#1#{} per ogni buio", + "saltato in questa sessione", + "{C:inactive}(Assegnerà {C:money}$#2#{C:inactive})" + } + }, + tag_orbital = { + name = "Patto orbitale", + text = { + "Migliora {C:attention}#1#", + "di {C:attention}#2# livelli" + } + }, + tag_economy = { + name = "Patto economia", + text = { + "Raddoppia i tuoi soldi", + "{C:inactive}(Massimo {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "Patto etereo", + text = { + "Dà gratuitamente una", + "{C:planet}busta spettrale" + } + } + }, + Blind = { + bl_small = { + name = "Piccolo buio", + text = {} + }, + bl_big = { + name = "Grande buio", + text = {} + }, + bl_hook = { + name = "L'uncino", + text = { + "Scarta 2 carte", + "casuali per mano giocata" + } + }, + bl_wall = { + name = "Il muro", + text = { + "Buio super grande" + } + }, + bl_wheel = { + name = "La ruota", + text = { + " su 7 carte vengono", + "pescate a faccia in giù" + } + }, + bl_arm = { + name = "Il braccio", + text = { + "Riduce il livello della", + "mano di poker giocata" + } + }, + bl_psychic = { + name = "Il medium", + text = { + "Devi giocare 5 carte" + } + }, + bl_goad = { + name = "Il pungolo", + text = { + "Tutte le carte di Picche", + "sono penalizzate" + } + }, + bl_water = { + name = "L'acqua", + text = { + "Inizi con", + "0 scarti" + } + }, + bl_eye = { + name = "L'occhio", + text = { + "Niente tipi di mani", + "ripetuti in questo round" + } + }, + bl_mouth = { + name = "La bocca", + text = { + "Giochi solo 1 tipo di", + "mano in questo round" + } + }, + bl_plant = { + name = "La pianta", + text = { + "Tutte le figure", + "sono penalizzate" + } + }, + bl_needle = { + name = "L'ago", + text = { + "Giochi solo 1 mano" + } + }, + bl_head = { + name = "La testa", + text = { + "Tutte le carte di Cuori", + "sono penalizzate" + } + }, + bl_tooth = { + name = "Il dente", + text = { + "Prendi $1 per", + "carta giocata" + } + }, + bl_final_leaf = { + name = "Foglia verde", + text = { + "Le carte sono penalizzate", + "finché non vendi 1 Jolly" + } + }, + bl_final_vessel = { + name = "Contenitore violetto", + text = { + "Buio molto grande" + } + }, + bl_ox = { + name = "Il bue", + text = { + "Giocare 1 #1#", + "porta i soldi a $0" + } + }, + bl_house = { + name = "La casa", + text = { + "La prima mano viene", + "pescata a faccia in giù" + } + }, + bl_club = { + name = "Il fiore", + text = { + "Tutte le carte di Fiori", + "sono penalizzate" + } + }, + bl_fish = { + name = "Il pesce", + text = { + "Carte pescate a faccia in giù", + "dopo ogni mano giocata" + } + }, + bl_window = { + name = "La finestra", + text = { + "Tutte le carte di Quadri", + "sono penalizzate" + } + }, + bl_manacle = { + name = "La manetta", + text = { + "-1 carta della mano" + } + }, + bl_serpent = { + name = "Il serpente", + text = { + "Dopo Gioca o Scarta,", + "peschi sempre 3 carte" + } + }, + bl_pillar = { + name = "Il pilastro", + text = { + "Le carte giocate precedentemente", + "in questo ante sono penalizzate" + } + }, + bl_flint = { + name = "La selce", + text = { + "Fiche e Molt di base", + "sono dimezzati" + } + }, + bl_mark = { + name = "Il marchio", + text = { + "Tutte le figure vengono", + "pescate a faccia in giù" + } + }, + bl_final_acorn = { + name = "Ghianda d'ambra", + text = { + "Gira e mischia", + "tutti i Jolly" + } + }, + bl_final_heart = { + name = "Cuore cremisi", + text = { + "Disattiva un Jolly", + "casuale in ogni mano" + } + }, + bl_final_bell = { + name = "Campana cerulea", + text = { + "Ti costringe a selezionare", + "sempre una 1 carta" + } + } + }, + Back = { + b_red = { + name = "Mazzo rosso", + text = { + "{C:red}+#1#{} scarto", + "in ogni round" + } + }, + b_blue = { + name = "Mazzo blu", + text = { + "{C:blue}+#1#{} mano", + "in ogni round" + } + }, + b_yellow = { + name = "Mazzo giallo", + text = { + "Inizi con", + "{C:money}$#1# in più" + } + }, + b_green = { + name = "Mazzo verde", + text = { + "Alla fine di ogni round:", + "{C:money}$#1#{s:0.85} per ogni {C:blue}mano{} rimasta", + "{C:money}$#2#{s:0.85} per ogni {C:red}scarto{} rimasto", + "Non guadagni {C:attention}interessi" + } + }, + b_black = { + name = "Mazzo nero", + text = { + "{C:attention}+#1#{} slot Jolly", + "", + "{C:blue}-#2#{} mani", + "in ogni round" + } + }, + b_magic = { + name = "Mazzo magico", + text = { + "Inizia la sessione con il", + "{C:tarot,T:v_crystal_ball}#1#{} Buono", + "e {C:attention}2{} copie", + "di {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Mazzo nebulosa", + text = { + "Inizia la sessione con il", + "{C:planet,T:v_telescope}#1#{} Buono", + "", + "{C:red}#2#{} slot consumabili" + } + }, + b_metal = { + name = "Mazzo metallico", + text = { + "Inizia la sessione con {C:attention}#1#", + "carte da gioco potenziate", + "a {C:attention}carte di acciaio" + } + }, + b_abandoned = { + name = "Mazzo abbandonato", + text = { + "Inizia la sessione", + "senza {C:attention}figure", + "nel tuo mazzo" + } + }, + b_checkered = { + name = "Mazzo a quadretti", + text = { + "Inizia la sessione con", + "{C:attention}26{C:spades} Picche{} e", + "{C:attention}26{C:hearts} Cuori{} nel mazzo" + } + }, + b_rocky = { + name = "Mazzo roccioso", + text = { + "Inizia la sessione con {C:attention}#1#", + "{C:attention}carte di pietra{} in più" + } + }, + b_braided = { + name = "Mazzo intrecciato", + text = { + "La prima mano giocata è", + "migliorata al {C:attention}liv. 3" + } + }, + b_anaglyph = { + name = "Mazzo anaglifo", + text = { + "Dopo aver sconfitto ogni", + "{C:attention}buio boss{}, guadagni 1", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "Mazzo plasma", + text = { + "Bilancia {C:blue}fiche{} e", + "{C:red}Molt{} durante il calcolo", + "dei punti della mano giocata", + "{C:red}X#1#{} importo buio base" + } + }, + b_erratic = { + name = "Mazzo irregolare", + text = { + "Tutti i {C:attention}valori{} e", + "{C:attention}semi{} nel mazzo", + "sono casuali" + } + }, + b_challenge = { + name = "Mazzo sfida", + text = { + "" + } + }, + b_ghost = { + name = "Mazzo fantasma", + text = { + "Le carte {C:spectral}Spettrali{} possono", + "apparire nel negozio,", + "inizi con una carta {C:spectral,T:c_hex}Maledizione{}" + } + }, + b_zodiac = { + name = "Mazzo zodiacale", + text = { + "Inizia la sessione con", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "e {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Mazzo dipinto", + text = { + "{C:attention}+#1#{} carte della mano", + "{C:red}#2#{} slot Jolly" + } + } + }, + Other = { + gold_seal = { + name = "Sigillo d'oro", + text = { + "Guadagni {C:money}$3{} quando questa", + "carta è giocata", + "e assegna punti" + } + }, + white_sticker = { + name = "Adesivo bianco", + text = { + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata bianca{}" + } + }, + red_sticker = { + name = "Adesivo rosso", + text = { + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata rossa{}" + } + }, + green_sticker = { + name = "Adesivo verde", + text = { + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata rossa{}" + } + }, + blue_sticker = { + name = "Adesivo blu", + text = { + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata blu{}" + } + }, + black_sticker = { + name = "Adesivo nero", + text = { + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata nera{}" + } + }, + purple_sticker = { + name = "Adesivo viola", + text = { + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata viola{}" + } + }, + orange_sticker = { + name = "Adesivo arancione", + text = { + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata arancione{}" + } + }, + gold_sticker = { + name = "Adesivo dorato", + text = { + "Hai usato questo Jolly", + "per vincere in difficoltà", + "{C:attention}Puntata dorata{}" + } + }, + playing_card = { + text = { + "{C:light_black}#1# di {V:1}#2#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} fiche" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1#{} fiche in più" + } + }, + locked = { + name = "Bloccata", + text = {} + }, + debuffed_default = { + name = "Penalizzata", + text = { + "Tutte le abilità", + "sono disattivate" + } + }, + debuffed_playing_card = { + name = "Penalizzata", + text = { + "Non assegna fiche", + "e tutte le abilità", + "sono disattivate" + } + }, + demo_locked = { + name = "Bloccato", + text = { + "Non disponibile", + "in questa demo" + } + }, + demo_shop_locked = { + name = "Bloccata", + text = { + "Carta della collezione", + "personale di {C:attention}Jimbo{},", + "disponibile nella versione", + "completa di {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Bloccato", + text = { + "Sviluppo", + "in corso" + } + }, + deck_locked_win = { + name = "Bloccato", + text = { + "Vinci una sessione con", + "{C:attention}#1#{}", + "in qualsiasi difficoltà" + } + }, + deck_locked_discover = { + name = "Bloccato", + text = { + "Scopri almeno", + "{C:attention}#1#{} oggetti della", + "tua collezione" + } + }, + deck_locked_stake = { + name = "Bloccato", + text = { + "Vinci una sessione con", + "qualsiasi mazzo almeno", + "in difficoltà {V:1}#1#{}" + } + }, + joker_locked_legendary = { + name = "Bloccato", + text = { + "Trova questo Jolly", + "con la carta {C:spectral}Anima{}" + } + }, + undiscovered_joker = { + name = "Non scoperto", + text = { + "Compra o usa", + "questa carta in una", + "sessione con seed casuale", + "per scoprire cosa fa" + } + }, + undiscovered_tarot = { + name = "Non scoperto", + text = { + "Compra o usa", + "questa carta in una", + "sessione con seed casuale", + "per scoprire cosa fa" + } + }, + undiscovered_planet = { + name = "Non scoperto", + text = { + "Compra o usa", + "questa carta in una", + "sessione con seed casuale", + "per scoprire cosa fa" + } + }, + undiscovered_spectral = { + name = "Non scoperto", + text = { + "Compra o usa", + "questa carta in una", + "sessione con seed casuale", + "per scoprire cosa fa" + } + }, + undiscovered_voucher = { + name = "Non scoperto", + text = { + "Riscatta questo", + "buono in una", + "sessione con seed casuale", + "per scoprire cosa fa" + } + }, + undiscovered_booster = { + name = "Non scoperta", + text = { + "Apri questa busta in una", + "sessione con seed casuale", + "per scoprire cosa fa" + } + }, + undiscovered_edition = { + name = "Non scoperta", + text = { + "Trova questa edizione in una", + "sessione con seed casuale", + "per scoprire cosa fa" + } + }, + undiscovered_tag = { + name = "Non scoperto", + text = { + "Usa questo patto in una", + "sessione con seed casuale", + "per scoprire cosa fa" + } + }, + p_arcana_normal = { + name = "Busta arcana", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:tarot} Tarocchi{} da", + "usare immediatamente" + } + }, + p_arcana_jumbo = { + name = "Busta arcana jumbo", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:tarot} Tarocchi{} da", + "usare immediatamente" + } + }, + p_arcana_mega = { + name = "Busta arcana mega", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:tarot} Tarocchi{} da", + "usare immediatamente" + } + }, + p_celestial_normal = { + name = "Busta celestiale", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:planet}Pianeta{} da", + "usare immediatamente" + } + }, + p_celestial_jumbo = { + name = "Busta celestiale jumbo", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:planet}Pianeta{} da", + "usare immediatamente" + } + }, + p_celestial_mega = { + name = "Busta celestiale mega", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:planet}Pianeta{} da", + "usare immediatamente" + } + }, + p_spectral_normal = { + name = "Busta spettrale", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:spectral}Spettrali{} da", + "usare immediatamente" + } + }, + p_spectral_jumbo = { + name = "Busta spettrale jumbo", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:spectral}Spettrali{} da", + "usare immediatamente" + } + }, + p_spectral_mega = { + name = "Busta spettrale mega", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte {C:spectral}Spettrali{} da", + "usare immediatamente" + } + }, + p_standard_normal = { + name = "Busta standard", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte da {C:attention}gioco{} da", + "aggiungere al tuo mazzo" + } + }, + p_standard_jumbo = { + name = "Busta standard jumbo", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte da {C:attention}gioco{} da", + "aggiungere al tuo mazzo" + } + }, + p_standard_mega = { + name = "Busta standard mega", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{} carte da {C:attention}gioco{} da", + "aggiungere al tuo mazzo" + } + }, + p_buffoon_normal = { + name = "Busta buffone", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:joker} Jolly{}" + } + }, + p_buffoon_jumbo = { + name = "Busta buffone jumbo", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:joker} Jolly{}" + } + }, + p_buffoon_mega = { + name = "Busta buffone mega", + text = { + "Scegli {C:attention}#1#{} tra massimo", + "{C:attention}#2#{C:joker} Jolly{}" + } + }, + pinned_left = { + name = "Fissato", + text = { + "Questo Jolly", + "è fissato nella", + "posizione più a sinistra" + } + }, + red_seal = { + name = "Sigillo rosso", + text = { + "Riattiva questa", + "carta {C:attention}1{} volta" + } + }, + blue_seal = { + name = "Sigillo blu", + text = { + "Crea una carta {C:planet}Pianeta{}", + "se questa carta è {C:attention}tenuta{} in", + "mano alla fine del round" + } + }, + purple_seal = { + name = "Sigillo viola", + text = { + "Crea un {C:tarot}Tarocco{}", + "quando è {C:attention}scartata", + "{C:inactive}(Serve spazio)" + } + }, + eternal = { + name = "Eterna", + text = { + "Invendibile", + "o indistruttibile" + } + }, + challenge_locked = { + name = "Bloccato", + text = { + "Vinci una sessione con almeno", + "#1# mazzi diversi per sbloccare", + "Modalità sfida", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Picca", + Hearts = "Cuore", + Clubs = "Fiore", + Diamonds = "Quadro" + }, + suits_plural = { + Spades = "Picche", + Hearts = "Cuori", + Clubs = "Fiori", + Diamonds = "Quadri" + }, + blind_states = { + Select = "Seleziona", + Skipped = "Saltato", + Current = "Attuale", + Defeated = "Sconfitto", + Upcoming = "Imminente", + Selected = "Selezionato" + }, + ranks = { + Ace = "Asso", + King = "Re", + Queen = "Regina", + Jack = "Fante", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Mano migliore", + furthest_round = "Round più alto", + furthest_ante = "Ante più alto", + most_money = "Record di soldi", + boss_streak = "Record di boss di fila", + collection = "Collezione", + win_streak = "Serie di vittorie migliore", + current_streak = "", + poker_hand = "Mano più giocata" + }, + poker_hands = { + ['Flush House'] = "Full colore", + ['Five of a Kind'] = "Pokerissimo", + ['Royal Flush'] = "Scala reale massima", + ['Straight Flush'] = "Scala reale", + ['Four of a Kind'] = "Poker", + ['Full House'] = "Full", + ['Flush'] = "Colore", + ['Straight'] = "Scala", + ['Three of a Kind'] = "Tris", + ['Two Pair'] = "Doppia coppia", + ['Pair'] = "Coppia", + ['High Card'] = "Carta più alta", + ['Flush Five'] = "Colore perfetto" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "Un Tris e una Coppia", + "con carte dello stesso seme" + }, + ['Five of a Kind'] = { + "5 carte dello stesso valore" + }, + ['Royal Flush'] = { + "5 carte in sequenza {valori consecutivi}", + "che hanno lo stesso seme" + }, + ['Straight Flush'] = { + "5 carte in sequenza {valori consecutivi}", + "che hanno lo stesso seme" + }, + ['Four of a Kind'] = { + "4 carte dello stesso valore. Giocabili", + "con 1 carta che non dà punti" + }, + ['Full House'] = { + "Un Tris e una Coppia" + }, + ['Flush'] = { + "5 carte dello stesso seme" + }, + ['Straight'] = { + "5 carte in sequenza {valori consecutivi}" + }, + ['Three of a Kind'] = { + "3 carte dello stesso valore. Giocabili", + "con un massimo di 2 carte che non danno punti" + }, + ['Two Pair'] = { + "2 coppie di carte con valori diversi,", + "giocabili con 1 carta che non dà punti" + }, + ['Pair'] = { + "2 carte dello stesso valore. Giocabili", + "con un massimo di 3 carte che non danno punti" + }, + ['High Card'] = { + "Se la mano giocata non è nessuna delle mani qui sopra,", + "solo la carta dal valore più alto assegna punti" + }, + ['Flush Five'] = { + "5 carte dello stesso valore e seme" + } + }, + labels = { + common = "Comune", + uncommon = "Non comune", + rare = "Raro", + legendary = "Leggendario", + tarot = "Tarocco", + planet = "Pianeta", + pluto_planet = "Pianeta nano", + voucher = "Buono", + foil = "Foil", + holographic = "Olografica", + polychrome = "Policroma", + negative = "Negativa", + gold_seal = "Sigillo d'oro", + locked = "Bloccato", + blue_seal = "Sigillo blu", + red_seal = "Sigillo rosso", + purple_seal = "Sigillo viola", + eternal = "Eterna", + pinned_left = "Fissato" + }, + dictionary = { + b_sell = "VENDI", + b_use = "USA", + b_select = "SELEZIONA", + b_buy = "COMPRA", + b_redeem = "RISCATTA", + b_open = "APRI", + b_and_use = "E USA", + b_next_round_1 = "Prossimo", + b_next_round_2 = "Round", + b_play_hand = "Gioca mano", + b_discard = "Scarta", + b_sort_hand = "Ordina mano", + b_run_info_1 = "Sessione", + b_run_info_2 = "Dati", + b_options = "Opzioni", + b_reroll_boss = "Cambia boss", + b_skip_blind = "Salta buio", + b_skip_reward = "Salta ricompensa", + b_skip = "Salta", + b_start_new_run = "Nuova sessione", + b_main_menu = "Menu principale", + b_collection = "Collezione", + b_seed = "Seed", + b_copy_seed = "Copia seed", + b_credits = "Riconoscimenti", + b_stats = "Statistiche", + b_settings = "Impostazioni", + b_set_game = "Gioco", + b_set_video = "Video", + b_set_graphics = "Grafica", + b_set_audio = "Audio", + b_set_gamespeed = "Velocità di gioco", + b_set_play_discard_pos = "Posizione pulsanti Gioca/Scarta", + b_set_screenshake = "Vibrazione schermo", + b_set_crash_reports = "Segnalazioni arresti anomali", + b_set_monitor = "Monitor di visualizzazione", + b_set_windowmode = "Modalità finestra", + b_set_apply = "Applica", + b_set_master_vol = "Volume principale", + b_set_music_vol = "Volume musica", + b_set_game_vol = "Volume gioco", + b_set_shadows = "Ombre", + b_set_pixel_smoothing = "Lisciamento pixel art", + b_set_CRT = "Effetto CRT", + b_set_CRT_bloom = "Effetto CRT luminoso", + b_stat_jokers = "Jolly", + b_stat_consumables = "Consumabili", + b_stat_tarots = "Tarocchi", + b_stat_planets = "Pianeti", + b_stat_spectrals = "Spettrali", + b_stat_vouchers = "Buoni", + b_next = "Prossimo", + b_endless = "Modalità infinita", + b_wishlist = "Aggiungilo alla lista dei desideri su Steam", + b_playbalatro = "Visita playbalatro.com", + b_remaining = "Rimanenti", + b_full_deck = "Mazzo pieno", + b_poker_hands = "Mani di poker", + b_blinds = "Bui", + b_vouchers = "Buoni", + b_stake = "Puntata", + b_jokers = "Jolly", + b_tarot_cards = "Tarocchi", + b_planet_cards = "Carte Pianeta", + b_spectral_cards = "Carte Spettrali", + b_enhanced_cards = "Carte potenziate", + b_editions = "Edizioni", + b_booster_packs = "Buste di espansione", + b_tags = "Patti", + b_decks = "Mazzi", + b_continue = "Continua", + b_back = "Indietro", + b_music = "Musica", + b_sounds = "Suoni", + b_imagery = "Immagini", + b_new_run = "Nuova sessione", + b_challenges = "Sfide", + b_current_profile = "Profilo attuale", + b_load_profile = "Carica profilo", + b_create_profile = "Crea profilo", + b_delete_profile = "Elimina profilo", + b_reset_profile = "Ripristina profilo", + b_rules = "Regole", + b_restrictions = "Limitazioni", + b_deck = "Mazzo", + b_play_cap = "GIOCA", + b_options_cap = "OPZIONI", + b_collection_cap = "COLLEZIONE", + b_quit_cap = "ESCI", + b_cash_out = "Incassa", + k_unknown = "?????", + k_compatible = "compatibile", + k_incompatible = "incompatibile", + k_round = "Round", + k_ante = "Ante", + k_seed = "Seed", + k_reroll = "Cambio", + k_mult = "Molt", + k_rank = "Valore", + k_suit = "Seme", + k_stake = "Puntata", + k_common = "Comune", + k_uncommon = "Non comune", + k_rare = "Raro", + k_legendary = "Leggendario", + k_debuffed = "Penalizzato", + k_locked = "Bloccato", + k_undisovered = "Sconosciuto", + k_joker = "Jolly", + k_voucher = "Buono", + k_tarot = "Tarocco", + k_planet = "Pianeta", + k_dwarf_planet = "Pianeta nano", + k_planet_q = "Pianeta?", + k_spectral = "Spettrale", + k_booster = "Espansione", + k_edition = "Edizione", + k_hud_hands = "Mani", + k_hud_discards = "Scarti", + k_lower_score = "punti", + k_arcana_pack = "Busta arcana", + k_celestial_pack = "Busta celestiale", + k_spectral_pack = "Busta spettrale", + k_standard_pack = "Busta standard", + k_buffoon_pack = "Busta buffone", + k_enter_text = "Inserisci testo", + k_defeated_by = "Sconfitto da", + k_level_prefix = "liv.", + k_also_applied = "Si applica anche", + k_base_cards = "Carte base", + k_effective = "Efficace", + k_aces = "Assi", + k_face_cards = "Figure", + k_numbered_cards = "Carte numerate", + k_cap_consumables = "CONSUMABILI", + k_page = "Pagina", + k_ante_cap = "ANTE", + k_base_cap = "BASE", + k_jokers_cap = "JOLLY", + k_vouchers_cap = "BUONI", + k_x_base = "X base", + k_not_discovered = "Non scoperto", + k_unlocked_ex = "Sbloccato!", + k_challenge_mode = "Modalità sfida", + k_daily_run = "Sessione giornaliera", + k_profile = "Profilo", + k_wins = "Vittorie", + k_empty_caps = "VUOTO", + k_collection = "Collezione", + k_stake_level = "Livello puntata", + k_none = "Nessuno", + k_game_modifiers = "Modificatori gioco", + k_custom_rules = "Regole personalizzate", + k_banned_cards = "Carte proibite", + k_banned_tags = "Patti proibiti", + k_other = "Altro", + k_money = "Soldi", + k_best_hand = "Mano migliore", + k_seeded_run = "Sessione con seed scelto", + k_enter_seed = "Inserisci seed", + k_lvl = "liv.", + k_skipped_cap = "SALTATO", + k_no_reward = "Nessuna ricompensa", + k_reward = "Ricompensa", + k_nope_ex = "No!", + k_or = "o", + k_balanced = "Bilanciato", + ph_improve_run = "Migliora la tua sessione!", + ph_sneak_peek = "Anteprima", + ph_deck_preview_stones = "Pietre", + ph_deck_preview_effective = "Totale effettivo grazie a Jolly, bui e potenziamenti delle carte", + ph_blind_score_at_least = "Ottieni almeno", + ph_blind_reward = "Ricompensa:", + ph_up_ante_1 = "Aumenta l'ante", + ph_up_ante_2 = "Incrementa tutti i bui", + ph_up_ante_3 = "Aggiorna bui", + ph_stat_joker = "Round completati totali con questa carta", + ph_stat_consumable = "Numero di volte che questa carta è stata usata", + ph_stat_voucher = "Numero di volte che questo buono è stato riscattato", + ph_demo_thanks_1 = "Grazie aver giocato alla", + ph_demo_thanks_2 = "DEMO DI BALATRO", + ph_game_over = "GAME OVER", + ph_vouchers_redeemed = "Buoni riscattati in questa sessione", + ph_no_vouchers = "Nessun buono riscattato in questa sessione", + ph_defeat_this_blind_1 = "Sconfiggi questo buio", + ph_defeat_this_blind_2 = "per scoprirlo", + ph_click_confirm = "Fai clic di nuovo per confermare", + ph_choose_blind_1 = "Scegli il tuo", + ph_choose_blind_2 = "prossimo buio", + ph_mr_bones = "Salvataggio del Signor Scheletro", + ph_score_at_least = "Ottieni almeno", + ph_all_poker_hand = "Tutte le mani di poker", + ph_1_level = "+1 livello", + ph_boss_disabled = "Boss disattivato!", + ph_most_played = "(mano più giocata)", + ml_demo_thanks_message = { + "Valuta l'opzione di aggiungere Balatro", + "alla tua lista dei desideri su Steam e di iscriverti", + "alla newsletter su playbalatro.com" + }, + ml_eternal = { + "Eterna", + "Invendibile", + "o indistruttibile" + }, + ml_gold_seal_desc = { + "Sigillo d'oro", + "torna in mano", + "quando è giocato" + }, + ml_crash_report_info = { + "Le segnalazioni degli arresti anomali verranno inviate allo sviluppatore", + "per ridurre i problemi in futuro. Non verranno inviate", + "informazioni identificanti o personali." + }, + ml_play_discard_pos_opt = { + "Scarta/Gioca", + "Gioca/Scarta" + }, + ml_windowmode_opt = { + "Finestra", + "Schermo intero", + "Senza bordi" + }, + ml_vsync_opt = { + "V-Sync sì", + "V-Sync no" + }, + ml_shadow_opt = { + "Sì", + "No" + }, + ml_smoothing_opt = { + "No", + "Sì" + }, + ml_bloom_opt = { + "No", + "Sì" + }, + ml_card_stats = { + "Carta", + "Statistiche" + }, + ml_paste_seed = { + "Incolla", + "Seed" + }, + ml_disabled_seed = { + "Sblocchi e", + "scoperte disattivati" + }, + ['$'] = "$", + k_redeemed_ex = "Riscatto!", + k_duplicated_ex = "Duplicazione!", + k_no_room_ex = "Niente spazio!", + k_no_space_ex = "Niente spazio!", + k_no_other_jokers = "Nessun altro Jolly!", + k_plus_tarot = "+1 Tarocco", + k_plus_stone = "+1 Pietre", + k_plus_planet = "+1 Pianeta", + k_plus_spectral = "+1 Spettrale", + k_active_ex = "Attivazione!", + k_level_up_ex = "Aumento di livello!", + k_upgrade_ex = "Miglioramento!", + k_again_ex = "Di nuovo!", + k_val_up = "Aumento di valore!", + k_reset = "Ripristino", + k_extinct_ex = "Disattivazione!", + k_safe_ex = "Al sicuro!", + k_saved_ex = "Salvataggio!", + k_swapped_ex = "Scambio!", + k_copied_ex = "Copia!", + k_melted_ex = "Scioglimento!", + b_copy = "Copia", + b_high_contrast_cards = "Carta ad alto contrasto", + b_set_rumble = "Vibrazione controller", + b_seals = "Sigilli", + b_new_challenge = "Inizia nuova sfida", + b_unlock_all = "Sblocca tutto", + k_active = "attivo", + k_deck = "Mazzo", + k_progress = "Progressi", + k_challenges = "Sfide", + k_joker_stickers = "Adesivi Jolly", + k_deck_stake_wins = "Vittorie puntata mazzo", + k_enter_name = "Inserisci nome", + k_gold = "Dorata", + k_card_stats = "Statistiche carte", + k_view = "Vedi", + k_all_hands = "Tutte le mani", + k_high_score_ex = "Miglior punteggio!", + k_demo_version_ex = "Versione demo!", + k_playing_as = "Nome giocatore:", + k_choose = "Scegli", + k_achievements_disabled = "Obiettivi disattivati", + ph_no_boss_active = "nessun boss attivo", + ph_you_win = "VITTORIA!", + ph_you_win_demo = "VITTORIA NELLA DEMO!", + ph_defeat_the_boss = "Sconfiggi il buio boss", + ph_score_furthest_ante = "Ante", + ph_score_furthest_round = "Round", + ph_score_hand = "Mano migliore", + ph_score_poker_hand = "Mano più giocata", + ph_score_new_collection = "Nuove scoperte", + ph_score_cards_played = "Carte giocate", + ph_score_cards_discarded = "Carte scartate", + ph_score_times_rerolled = "Numero di cambi", + ph_score_cards_purchased = "Carte acquistate", + ml_edition_seal_enhancement_explanation = { + "Ogni carta da gioco può avere", + "un potenziamento, un'edizione e un Sigillo" + }, + ml_unlock_all_explanation = { + "ATTENZIONE! Sbloccare la collezione completa", + "disattiverà gli obiettivi per questo profilo!" + }, + k_plus_joker = "+1 Jolly", + k_eaten_ex = "Consumazione!", + k_eroded_ex = "Erosione!", + k_achievement = "Obiettivo", + ph_unscored_hand = "La mano non segnerà punti", + ph_alert_debuff_confirm = "Premi \"Gioca\" di nuovo per confermare", + k_drank_ex = "Bevuta!", + k_trophy = "Trofeo", + k_trophies_disabled = "Trofei disattivati", + ml_unlock_all_trophies = { + "ATTENZIONE! Sbloccare la collezione completa", + "disattiverà i trofei per questo profilo!" + }, + k_poker_hand = "mano di poker", + ph_4_7_of_clubs = "quattro 7 di Fiori" + }, + v_dictionary = { + a_xmult = " X#1# Molt", + a_mult = "+#1# Mult", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# carta della mano", + a_hands = "+#1# Mani", + a_sold_tally = "#1#/#2# vendute", + a_remaining = "#1# rimanenti", + ante_x_voucher = "BUONO ANTE #1#", + loyalty_active = "Attivazione!", + loyalty_inactive = "#1# rimanenti", + deck_preview_wheel_singular = "I numeri potrebbero essere inferiori a causa di #1# carta pescata a faccia in giù", + deck_preview_wheel_plural = "I numeri potrebbero essere inferiori a causa di #1# carte pescate a faccia in giù", + challenges_completed = "#1#/#2# sfide completate", + interest = "$#1# di interessi per ogni $#2# (massimo $#3#)", + remaining_hand_money = "Mani rimaste ($#1# ciascuna)", + remaining_discard_money = "Scarti rimasti ($#1# ciascuno)", + ml_foil_desc = { + "Foil", + "+#1# Chips" + }, + ml_holo_desc = { + "Olografica", + "+#1# Molt" + }, + ml_polychrome_desc = { + "Policroma", + " X#1# Molt" + }, + ml_negative_desc = { + "Negativa", + "+#1# slot Jolly" + }, + a_mult_minus = "-#1# Molt", + a_handsize_minus = "-#1# di carte della mano", + ml_negative_consumable_desc = { + "Negativa", + "+#1# slot consumabili" + }, + a_xmult_minus = "-X#1# Molt", + unlocked = "Sbloccato: #1#/#2#", + completed = "Completato: #1#/#2#" + }, + v_text = { + ch_m_dollars = { + "Inizi con {C:money}$#1#" + }, + ch_m_hands = { + "{C:blue}#1#{} mani per round" + }, + ch_m_discards = { + "{C:red}#1#{} scarti per round" + }, + ch_m_reroll_cost = { + "Costo base dei cambi: {C:money}$#1#{}" + }, + ch_m_joker_slots = { + "{C:attention}#1#{} slot Jolly" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} slot consumabili" + }, + ch_m_hand_size = { + "{C:attention}#1#{} carte della mano" + }, + ch_m_none = { + "{C:inactive}Nessuno" + }, + ch_c_no_reward = { + "Tutti i {C:attention}bui{} non danno soldi come ricompensa" + }, + ch_c_no_reward_specific = { + "{C:attention}#1# bui{} non danno soldi come ricompensa" + }, + ch_c_no_extra_hand_money = { + "Le {C:blue}mani{} in più non fanno guadagnare soldi" + }, + ch_c_no_interest = { + "Non guadagni {C:attention}interessi{} alla fine del round" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}Sfida giornaliera!" + }, + ch_c_set_seed = { + "1 tentativo con seed impostato: {C:inactive}{Hidden}" + }, + ch_c_chips_dollar_cap = { + "Le {C:blue}fiche{} non possono superare i {C:money}${} attuali" + }, + ch_c_none = { + "{C:inactive}Nessuno" + }, + ch_c_inflation = { + "Incrementa permanentemente i prezzi di {C:money}$1{} per ogni acquisto" + }, + ch_c_discard_cost = { + "Gli scarti costano {C:money}$#1#{} ciascuno" + }, + ch_c_all_eternal = { + "Tutti i Jolly del negozio sono {C:eternal}eterni{}" + }, + ch_c_flipped_cards = { + "{C:green}1 carta su #1#{} viene pescata a faccia in giù" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Tieni {C:red}-1{} carta in mano per ogni {C:money}$#1#{} che hai" + }, + ch_c_no_shop_jokers = { + "I Jolly non appaiono più nel {C:attention}negozio" + }, + ch_c_debuff_played_cards = { + "Tutte le carte {C:attention}giocate{} vengono {C:attention}penalizzate{} dopo aver assegnato punti" + }, + ch_c_set_eternal_ante = { + "Quando il boss dell'ante {C:attention}#1#{} viene sconfitto, tutti i Jolly diventano {C:attention}eterni" + }, + ch_c_set_joker_slots_ante = { + "Quando il boss dell'ante {C:attention}#1#{} viene sconfitto, gli slot Jolly vengono portati a {C:attention}0" + } + }, + tutorial = { + sb_1 = { + "Ehilà! Mi chiamo", + "{C:attention}Jimbo{}, sono qui per", + "insegnarti come si gioca!" + }, + sb_2 = { + "L'obiettivo è guadagnare", + "{C:blue}fiche{} per battere", + "il {C:attention}buio{} nemico" + }, + sb_3 = { + "Questo è un {C:blue}piccolo buio{},", + "devi ottenere solo", + "{C:attention}300 fiche{} per batterlo." + }, + sb_4 = { + "Seleziona il {C:blue}piccolo buio", + "per iniziare il round!" + }, + bb_1 = { + "Se selezioni il {C:attention}grande buio", + "guadagnerai dei soldi" + }, + bb_2 = { + "Oppure scegli di {C:attention}saltarlo", + "per ricevere un {C:attention}patto{}!", + "Ogni {C:attention}patto{} ha un effetto unico" + }, + bb_3 = { + "Ma tieni d'occhio", + "il {C:attention}buio boss{}.", + "Ha un'abilità che dovrai", + "tenere in considerazione." + }, + bb_4 = { + "Se lo batti,", + "l'{C:attention}ante{} aumenta e tutti i", + "{C:attention}bui{} diventano più difficili" + }, + bb_5 = { + "Batti l'{C:attention}ante{} #1# per vincere.", + "Ora scegli la tua strada!" + }, + fh_1 = { + "Guadagni fiche", + "giocando {C:attention}mani di poker" + }, + fh_2 = { + "Con ogni {C:attention}mano di poker{} guadagni", + "una quantità base di {C:blue}fiche", + "moltiplicata per un certo {C:red}Molt" + }, + fh_3 = { + "Trovi le tue {C:attention}mani di poker", + "nell'area {C:attention}Dati sessione{},", + "insieme ad altri dati", + "sulla sessione attuale" + }, + fh_4 = { + "Anche con le carte", + "guadagni {C:blue}fiche{},", + "passaci sopra il cursore!" + }, + fh_5 = { + "Ora seleziona fino a", + "{C:attention}5{} carte da giocare", + "e premi {C:blue}'Gioca mano'" + }, + fh_6 = { + "Puoi anche {C:red}'scartare'{} fino", + "a {C:attention}5{} carte selezionate", + "per provare a creare", + "mani più forti. Provaci!" + }, + fh_7 = { + "Attenzione! Hai a disposizione", + "un numero limitato di {C:blue}mani", + "e {C:red}scarti{} per round" + }, + fh_8 = { + "Guadagna {C:attention}300 fiche{} prima", + "di rimanere senza {C:blue}mani", + "per vincere il round.", + "Buona fortuna!" + }, + sh_1 = { + "Quando ottieni più carte,", + "ricorda che puoi riordinarle.", + "I {C:attention}Jolly{} si attivano", + "da sinistra a destra" + }, + sh_2 = { + "E assicurati di", + "{C:attention}USARE{} i consumabili!" + }, + sh_3 = { + "Seleziona fino a {C:attention}2{} carte", + "nella tua mano e premi", + "{C:attention}'USA'{} sul {C:tarot}Tarocco{}", + "per potenziarle!" + }, + s_1 = { + "Ottimo lavoro! Ora che", + "hai le {E:1}mani{} piene di {C:money}soldi{},", + "puoi comprare delle nuove", + "carte dal {C:attention}negozio" + }, + s_2 = { + "Compra questo", + "bel diavoletto" + }, + s_3 = { + "Questo è uno dei {C:attention}#1#", + "{C:attention}Jolly{} che puoi aggiungere", + "alla tua sessione. Ogni {C:attention}Jolly", + "fa qualcosa di diverso" + }, + s_4 = { + "Questo aggiunge {C:red}+4 Molt{} a", + "ogni mano che giochi!" + }, + s_5 = { + "Scegli bene, puoi avere", + "solo {C:attention}5 Jolly{} con te", + "alla volta" + }, + s_6 = { + "Ora compra l'altra", + "carta dal {C:attention}negozio" + }, + s_7 = { + "Questo {C:tarot}Tarocco{} è una", + "{C:attention}carta consumabile{}.", + "Potenzierà le tue", + "carte! Non perderlo." + }, + s_8 = { + "Puoi avere fino a", + "{C:attention}2 carte consumabili{}", + "con te alla volta" + }, + s_9 = { + "Se risparmi abbastanza,", + "puoi comprare un {C:attention}Buono{}.", + "I {C:attention}Buoni{} migliorano", + "passivamente la sessione!" + }, + s_10 = { + "I {C:attention}Buoni{} vengono riassortiti", + "dopo che sconfiggi il", + "{C:attention}buio boss{}." + }, + s_11 = { + "E dai un'occhiata a entrambe", + "le {C:booster}buste di espansione{} in", + "ciascun negozio. Sono", + "piene di carte utili!" + }, + s_12 = { + "Passiamo", + "al {C:attention}prossimo round{}." + } + }, + achievement_names = { + ante_up = "Aumento di ante!", + ante_upper = "Grande aumento di ante!", + heads_up = "Testa a testa", + low_stakes = "Puntata bassa", + mid_stakes = "Puntata media", + high_stakes = "Puntata alta", + card_player = "Tante giocate", + card_discarder = "Tanti scarti", + nest_egg = "Gruzzolo", + flushed = "Colore multiuso", + speedrunner = "Velocista", + roi = "ROI", + shattered = "A pezzi", + royale = "Reale", + retrograde = "Retrocessione", + _10k = "Diecimila", + _1000k = "Un milione", + _100000k = "Cento milioni", + tiny_hands = "Mani piccole", + big_hands = "Mani grandi", + you_get_what_you_get = "Accetta ciò che hai", + rule_bender = "Regole aggirate", + rule_breaker = "Regole infrante", + legendary = "Leggenda", + astronomy = "Astronomia", + cartomancy = "Cartomanzia", + clairvoyance = "Chiaroveggenza", + extreme_couponer = "Fan dei coupon", + completionist = "Perfezionista", + completionist_plus = "Perfezionista+", + completionist_plus_plus = "Perfezionista++" + }, + achievement_descriptions = { + ante_up = "Raggiungi l'ante 4", + ante_upper = "Raggiungi l'ante 8", + heads_up = "Vinci una sessione", + low_stakes = "Vinci una sessione almeno in difficoltà Puntata rossa", + mid_stakes = "Vinci una sessione almeno in difficoltà Puntata nera", + high_stakes = "Vinci una sessione almeno in difficoltà Puntata dorata", + card_player = "Gioca almeno 2.500 carte", + card_discarder = "Scarta almeno 2.500 carte", + nest_egg = "Accumula almeno $400 durante una singola sessione", + flushed = "Gioca un Colore con 5 carte multiuso", + speedrunner = "Vinci una sessione in massimo 12 round", + roi = "Compra 5 Buoni prima dell'ante 4", + shattered = "Rompi 2 carte di vetro in una singola mano", + royale = "Gioca una Scala reale massima", + retrograde = "Porta una mano di poker qualsiasi al livello 10", + _10k = "Ottieni 10.000 fiche in una singola mano", + _1000k = "Ottieni 1.000.000 fiche in una singola mano", + _100000k = "Ottieni 100.000.000 fiche in una singola mano", + tiny_hands = "Riduci il tuo mazzo a massimo 20 carte", + big_hands = "Tieni almeno 80 carte nel tuo mazzo", + you_get_what_you_get = "Vinci una sessione senza cambiare il negozio", + rule_bender = "Completa una sessione sfida qualsiasi", + rule_breaker = "Completa ogni sessione sfida", + legendary = "Scopri un Jolly leggendario", + astronomy = "Scopri ogni carta Pianeta", + cartomancy = "Scopri ogni Tarocco", + clairvoyance = "Scopri ogni carta Spettrale", + extreme_couponer = "Scopri ogni Buono", + completionist = "Scopri il 100% della tua collezione", + completionist_plus = "Vinci con ogni mazzo in difficoltà Puntata dorata", + completionist_plus_plus = "Guadagna un Adesivo dorato su ogni Jolly" + }, + quips = { + wq_1 = { + "Sei un asso!" + }, + wq_2 = { + "Te la sei cavata", + "piuttosto bene!" + }, + wq_3 = { + "Pare che il tuo", + "non fosse un bluff!" + }, + wq_4 = { + "Peccato che queste", + "fiche sono tutte", + "virtuali..." + }, + wq_5 = { + "Sembra che ti", + "ho insegnato bene!" + }, + wq_6 = { + "Sei abile", + "nel testa a testa!" + }, + wq_7 = { + "Menomale che", + "non ho scommesso", + "contro di te!" + }, + lq_1 = { + "Forse è meglio", + "se giochiamo a", + "rubamazzetto..." + }, + lq_2 = { + "Non abbiamo", + "lasciato il segno!" + }, + lq_3 = { + "È il momento di", + "rinunciare al piatto", + "e riprovare!" + }, + lq_4 = { + "Sai come", + "si dice: il banco", + "vince sempre!" + }, + lq_5 = { + "Abbiamo scoperto", + "chi è il vero", + "prodigio del poker!" + }, + lq_6 = { + "Oh no,", + "stavi bluffando?" + }, + lq_7 = { + "Siamo rimasti", + "a mani vuote!" + }, + lq_8 = { + "Se avessi le mani,", + "avrei coperto", + "i miei occhi!" + }, + lq_9 = { + "Io sono solo", + "un buffone, tu", + "che scusa hai?" + }, + lq_10 = { + "Che fiasco!" + }, + dq_1 = { + "Accidenti! Spero", + "che tu abbia qualche", + "asso nella manica per", + "questa sfida finale!" + } + }, + challenge_names = { + c_omelette_1 = "La frittata", + c_city_1 = "Città di 15 minuti", + c_rich_1 = "Ricchi sempre più ricchi", + c_knife_1 = "Sul filo del rasoio", + c_xray_1 = "Visione a raggi X", + c_mad_world_1 = "Mondo folle", + c_luxury_1 = "Tassa sul lusso", + c_non_perishable_1 = "Non deperibile", + c_medusa_1 = "Medusa", + c_double_nothing_1 = "Lascia o raddoppia", + c_typecast_1 = "Caratterista", + c_inflation_1 = "Inflazione", + c_bram_poker_1 = "Bram Poker", + c_fragile_1 = "Fragile", + c_monolith_1 = "Monolite", + c_blast_off_1 = "Lancio", + c_five_card_1 = "Poker tradizionale", + c_golden_needle_1 = "Ago dorato", + c_cruelty_1 = "Crudeltà", + c_jokerless_1 = "Senza Jolly" + } + } +} \ No newline at end of file diff --git a/localization/ja.lua b/localization/ja.lua new file mode 100644 index 0000000..963aa1f --- /dev/null +++ b/localization/ja.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "ジョーカー", + text = { + "倍率 {C:red,s:1.1}+#1#{}" + } + }, + j_jolly = { + name = "ジョリージョーカー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:red}+#1#{}" + } + }, + j_zany = { + name = "ザニージョーカー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:red}+#1#{}" + } + }, + j_mad = { + name = "マッドジョーカー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:red}+#1#{}" + } + }, + j_crazy = { + name = "クレイジージョーカー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:red}+#1#{}" + } + }, + j_droll = { + name = "ドロールジョーカー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:red}+#1#{}" + } + }, + j_half = { + name = "ハーフジョーカー", + text = { + "プレイした手札が {C:attention}#2#{} を含むか", + "カードの枚数が少ない場合", + "倍率 {C:red}+#1#{}" + } + }, + j_fortune_teller = { + name = "占い師", + text = { + "使用された {C:purple}タロット{} カード1枚につき", + "倍率 {C:red}+#1#{}", + "{C:inactive}(現在 {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "ジャグラー", + text = { + "ハンドサイズ {C:attention}+#1#{}" + } + }, + j_drunkard = { + name = "大酒飲み", + text = { + "ディスカード {C:red}+#1#{}" + } + }, + j_stone = { + name = "ストーンジョーカー", + text = { + "このジョーカーは、フルデッキ内の", + "{C:attention}ストーンカード{} 1枚につき", + "チップを {C:chips}+#1#{} 与える", + "{C:inactive}(現在 チップ {C:chips}+#2#{C:inactive})" + } + }, + j_golden = { + name = "ゴールデンジョーカー", + text = { + "ラウンド終了時に", + "{C:money}$#1#{} を得る" + } + }, + j_stencil = { + name = "ジョーカーステンシル", + text = { + "{C:attention}ジョーカー{} の空きスロット1つにつき", + "倍率 {X:red,C:white}X1{}", + "{s:0.8}ジョーカーステンシルを含む", + "{C:inactive}(現在{X:red,C:white}X#1#{C:inactive} )" + } + }, + j_four_fingers = { + name = "フォーフィンガー", + text = { + "すべての {C:attention}フラッシュ{} と", + "{C:attention}ストレート{} を", + "{C:attention}4{} 枚のカードで作ることができる" + } + }, + j_mime = { + name = "マイム", + text = { + "{C:attention}持っている{}", + "すべてのカードの能力を", + "再発動させる" + } + }, + j_credit_card = { + name = "クレジットカード", + text = { + "負債額が", + "{C:red}-$#1#{} まで増える" + } + }, + j_greedy_joker = { + name = "グリーディージョーカー", + text = { + "プレイされた {C:diamonds}#2#{} スーツの", + "カードがスコアされた時", + "倍率 {C:mult}+#1#{}" + } + }, + j_lusty_joker = { + name = "ラスティジョーカー", + text = { + "プレイされた {C:hearts}#2#{} スーツの", + "カードがスコアされた時", + "倍率 {C:mult}+#1#{}" + } + }, + j_wrathful_joker = { + name = "ラスフルジョーカー", + text = { + "プレイされた {C:spades}#2#{} スーツの", + "カードがスコアされた時", + "倍率 {C:mult}+#1#{}" + } + }, + j_gluttenous_joker = { + name = "グラトナスジョーカー", + text = { + "プレイされた {C:clubs}#2#{} スーツの", + "カードがスコアされた時 ", + "倍率 {C:mult}+#1#{}" + } + }, + j_ceremonial = { + name = "儀式の短剣", + text = { + "{C:attention}ブラインド{} が選択された時", + "右のジョーカーを破壊し", + "永久的にそのセルバリューの2倍の値を", + "この {C:red}倍率{} に加える", + "{C:inactive}(現在 倍率 {C:mult}+#1#{C:inactive})" + } + }, + j_banner = { + name = "バナー", + text = { + "残りの {C:attention}ディスカード{}", + "1枚につき", + "チップ {C:chips}+#1#{}" + } + }, + j_mystic_summit = { + name = "ミスティックサミット", + text = { + "{C:attention}#2#{} ディスカード", + "が残っている時", + "倍率 {C:mult}+#1#{}" + } + }, + j_marble = { + name = "マーブルジョーカー", + text = { + "{C:attention}ブラインド{} が選択された時", + "デッキに", + "{C:attention}ストーン{} カードを1枚加える" + } + }, + j_loyalty_card = { + name = "ロイヤルティカード", + text = { + "{C:attention}#2#{} ハンドがプレイされるたびに", + "倍率 {X:red,C:white}X#1#{}", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "8ボール", + text = { + "プレイしたハンドに", + "{C:attention}8{} が{C:attenetion}#1#{} 枚以上ある場合", + "{C:planet}惑星{} カードを1枚作る", + "{C:inactive}(空きが必要)" + } + }, + j_misprint = { + name = "ミスプリント", + text = { + "" + } + }, + j_dusk = { + name = "ダスク", + text = { + "ラウンドの {C:attention}最終ハンド{} で", + "すべてのプレイしたカードを", + "再発動する" + } + }, + j_raised_fist = { + name = "レイズドフィスト", + text = { + "手札の {C:attention}一番低い{}", + "ランクのカードの", + "{C:attention}2倍{} を倍率に加える" + } + }, + j_chaos = { + name = "カオス・ザ・クラウン", + text = { + "ショップに行くたびに", + "{C:attention}#1#{} 回無料で {C:green}リロール{} できる" + } + }, + j_fibonacci = { + name = "フィボナッチ", + text = { + "{C:attention}エース{}、 {C:attention}2{}、 {C:attention}3{}、 {C:attention}5{}、 {C:attention}8{} の", + "いずれかがプレイされ、スコアされると", + "倍率 {C:mult}+#1#{}" + } + }, + j_steel_joker = { + name = "スチールジョーカー", + text = { + "このジョーカーは、フルデッキ内の", + "{C:attention}スチール{} カード1枚につき", + "倍率 {X:mult,C:white}X#1#{} を与える", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + } + }, + j_scary_face = { + name = "スケアリーフェイス", + text = { + "プレイされた {C:attention}フェイス{} カードがスコアされた時", + "スコアされた時", + "チップを {C:chips}+#1#{} 与える" + } + }, + j_abstract = { + name = "アブストラクトジョーカー", + text = { + "{C:attention}ジョーカー{} カード1枚につき", + "倍率 {C:mult}+#1#{}", + "{C:inactive}(現在 倍率 {C:red}+#2#{C:inactive})" + } + }, + j_delayed_grat = { + name = "遅れた満足感", + text = { + "ラウンド終了までに", + "ディスカードが使われなかった場合", + "{C:attention}ディスカード{} するごとに {C:money}$#1#{} を得る" + } + }, + j_hack = { + name = "詐欺師", + text = { + "{C:attention}2{}、 {C:attention}3{}、 {C:attention}4{}、 {C:attention}5{} のカードが", + "プレイされるごとに", + "再発動する" + } + }, + j_pareidolia = { + name = "パレイドリア", + text = { + "すべてのカードが", + "{C:attention}フェイス{} カードと", + "みなされる" + } + }, + j_gros_michel = { + name = "グロスミッチェル", + text = { + "倍率 {C:mult}+#1#{}", + "このカードはラウンド終了時に", + "{C:green}#3#分の#2#{} の確率で", + "破壊される" + } + }, + j_even_steven = { + name = "イーブンスティーブン", + text = { + "プレイされた {C:attention}偶数{} ランクの", + "カードがスコアされた時", + "倍率 {C:mult}+#1#{}", + "{C:inactive}(10、8、6、4、2)" + } + }, + j_odd_todd = { + name = "オッドトッド", + text = { + "プレイされた {C:attention}奇数{} ランクの", + "カードがスコアされた時", + "チップ {C:chips}+#1#{}", + "{C:inactive}(A、9、7、5、3)" + } + }, + j_scholar = { + name = "学者", + text = { + "プレイされた {C:attention}エース{} がスコアされた時", + "チップ {C:chips}+#2#{} と", + "倍率 {C:mult}+#1#{} を", + "与える" + } + }, + j_business = { + name = "ビジネスカード", + text = { + "プレイされた {C:attention}フェイス{} カードがスコアされた時", + "{C:green}#2#分の#1#{} の確率で", + "{C:money}$2{} を与える" + } + }, + j_supernova = { + name = "超新星", + text = { + "{C:attention}ポーカーハンド{} の", + "プレイ回数を", + "倍率に加える" + } + }, + j_ride_the_bus = { + name = "ライド・ザ・バス", + text = { + "スコアされる {C:attention}フェイス{}", + "カードがないハンドが", + "連続でプレイされるたびに", + "倍率 {C:mult}+#1#{}", + "{C:inactive}(現在 倍率 {C:mult}+#2#{C:inactive})" + } + }, + j_space = { + name = "スペースジョーカー", + text = { + "{C:green}#2#分の#1#{} の確率で", + "プレイした {C:attention}ポーカーハンド{} の", + "レベルがアップグレードする" + } + }, + j_egg = { + name = "エッグ", + text = { + "ラウンド終了時に", + "{C:attention}セルバリュー{} を", + "{C:money}$#1#{} を得る" + } + }, + j_burglar = { + name = "強盗", + text = { + "{C:attention}ブラインド{} が選択された時", + "ハンドを {C:blue}+#1#{} 得て", + "{C:attention}すべてのディスカードを失う" + } + }, + j_blackboard = { + name = "黒板", + text = { + "手札にあるすべてのカードが", + "{C:spades}#2#{} または {C:clubs}#3#{} の場合", + "倍率 {X:red,C:white}X#1#{}" + } + }, + j_runner = { + name = "ランナー", + text = { + "プレイしたハンドに", + "{C:attention}ストレート{} が含まれる場合", + "チップ {C:chips}+#2#{}", + "{C:inactive}(現在 {C:chips}+#1#{C:inactive} チップ)" + } + }, + j_ice_cream = { + name = "アイスクリーム", + text = { + "チップ {C:chips}+#1#{}", + "手札がプレイされるたびに", + "チップ {C:chips}-#2#{}" + } + }, + j_dna = { + name = "DNA", + text = { + "ラウンドの {C:attention}ファーストハンド{} のカードが", + "{C:attention}1{} 枚しかない場合", + "永久的なコピーを1枚デッキに加えて", + "ドローしてから {C:attention}手札{} に加える" + } + }, + j_splash = { + name = "スプラッシュ", + text = { + "すべての {C:attention}プレイされたカード{} が", + "スコアにカウントされる" + } + }, + j_blue_joker = { + name = "ブルージョーカー", + text = { + "{C:attention}デッキ{} の残りのカード1枚につき", + "チップ {C:chips}+#1#{}", + "{C:inactive}(現在 チップ {C:chips}+#2#{C:inactive})" + } + }, + j_sixth_sense = { + name = "シックスセンス", + text = { + "ラウンドの {C:attention}ファーストハンド{} で", + "{C:attention}6{} のカード1枚を使用した時", + "それを破壊し、{C:spectral}スペクトル{} カードを1枚作る", + "{C:inactive}(空きが必要)" + } + }, + j_constellation = { + name = "星座", + text = { + "使用された {C:planet}惑星{} カード1枚につき", + "倍率 {X:mult,C:white}X#1#{} を得る", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + } + }, + j_hiker = { + name = "ハイカー", + text = { + "プレイされた {C:attention}カード{} が", + "スコアされた時、永久的に", + "チップ {C:chips}+#1#{} を与える" + } + }, + j_faceless = { + name = "フェイスレスジョーカー", + text = { + "{C:attention}#2#{} 枚以上の", + "{C:attention}フェイスカード{} が", + "同時にディスカードされた場合", + "{C:money}$#1#{} を得る" + } + }, + j_green_joker = { + name = "グリーンジョーカー", + text = { + "プレイされたハンドごとに倍率 {C:mult}+#1#{}", + "ディスカードするごとに倍率 {C:mult}-#2#{}", + "{C:inactive}(現在 倍率 {C:mult}+#3#{C:inactive})" + } + }, + j_superposition = { + name = "スーパーポジション", + text = { + "ポーカーハンドに", + "{C:attention}エース{} と {C:attention}ストレート{} を含む場合", + "{C:tarot}タロット{} カードを1枚作る", + "{C:inactive}(空きが必要)" + } + }, + j_todo_list = { + name = "ToDoリスト", + text = { + "{C:attention}ポーカーハンド {} が {C:attention}$#1# {} だった場合", + "{C:money}$#1#{} を得る。", + "ポーカーハンドは", + "払い戻しのたびに変わる" + } + }, + j_ticket = { + name = "ゴールデンチケット", + text = { + "プレイされた {C:attention}ゴールドカード{} がスコアされた時", + "{C:money}$#1#{} を得る" + }, + unlock = { + "{C:attention,E:1}ゴールド{} カード", + "だけを含む", + "5のカードのハンドをプレイする" + } + }, + j_mr_bones = { + name = "ミスターボーンズ", + text = { + "スコアされたチップが", + "必要なチップの", + "{C:attention}25%{} 以上だった場合", + "死を防ぎ", + "{S:1.1,C:red,E:2}自らを破壊する{}" + }, + unlock = { + "{C:attention,E:1}#1#{} ランで負ける", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "アクロバット", + text = { + "ラウンドの {C:attention}最終ハンド{} の", + "倍率 {X:red,C:white}X#1#{}" + }, + unlock = { + "{C:attention,E:1}#1#{} のハンドをプレイする", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "ソックスとバスキン", + text = { + "すべてのプレイされた{C:attention}フェイス{} カードが", + "再発動する" + }, + unlock = { + "合計 {C:attention,E:1}#1#{} 枚の", + "フェイスカードをプレイする", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "スワッシュバックラー", + text = { + "このカードの左にある", + "すべての所持している{C:attention}ジョーカー{} のセルバリューを", + "倍率に追加する", + "{C:inactive}(現在 倍率 {C:mult}+#1#{C:inactive})" + }, + unlock = { + "合計 {C:attention,E:1}#1#{} 枚の", + "ジョーカーカードを売る", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "トルバドゥール", + text = { + "ハンドサイズ {C:attention}+#1#{}", + "ラウンドごとにハンド {C:red}-#2#{}" + }, + unlock = { + "1ハンドだけで", + "連続 {C:attention,E:1}#1#{} ラウンド", + "勝利する" + } + }, + j_certificate = { + name = "証明書", + text = { + "ラウンド開始時に", + "ランダムな {C:attention}シール{} のついた", + "ランダムな{C:attention}トランプカード{} を", + "1枚手札に加える" + }, + unlock = { + "{C:attention,E:1}ゴールドシール{} の", + "ゴールドトランプを持つ", + " " + } + }, + j_smeared = { + name = "スメアードジョーカー", + text = { + "{C:hearts}ハート{} と {C:diamonds}ダイヤ{} が", + "同じスーツとみなされ", + "{C:spades}スペード{} と{C:clubs}クラブ{} が", + "同じスーツとみなさる" + }, + unlock = { + "デッキに", + "{C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} を持つ" + } + }, + j_throwback = { + name = "スローバック", + text = { + "このランで {C:attention}ブラインド{} をスキップするごとに", + "倍率 {X:mult,C:white}X#1#{} を得る", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + }, + unlock = { + "メインメニューから", + "保存したランを続ける" + } + }, + j_hanging_chad = { + name = "ハンギングチャド", + text = { + "スコアリングに使用された", + "{C:attention}最初の{} カードを再発動する" + }, + unlock = { + "{E:1,C:attention}#1#{} で", + "ボスブラインドを倒す" + } + }, + j_rough_gem = { + name = "ラフジェム", + text = { + "{C:diamonds}ダイヤ{} スーツでプレイされた", + "カードがスコアされた時", + "{C:money}$#1#{}" + }, + unlock = { + "デッキに", + "{E:1,C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} スーツを持つ" + } + }, + j_bloodstone = { + name = "ブラッドストーン", + text = { + "{C:green}#2#分の#1#{} の確率で", + "{C:hearts}ハート{} スーツのカードがプレイされると", + "倍率 {C:mult}+#1#{} を与える", + "倍率 {X:mult,C:white}X#3#{}" + }, + unlock = { + "デッキに", + "{E:1,C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} スーツを持つ" + } + }, + j_arrowhead = { + name = "アローヘッド", + text = { + "プレイされた {C:spades}スペード{} スーツのカードが", + "スコアされた時", + "チップ {C:chips}+#1#{}" + }, + unlock = { + "デッキに", + "{E:1,C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} スーツを持つ" + } + }, + j_onyx_agate = { + name = "オニキスアゲート", + text = { + "プレイされた {C:clubs}クラブ{} スーツのカードが", + "スコアされた時", + "倍率 {C:mult}+#1#{} " + }, + unlock = { + "デッキに", + "{E:1,C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} スーツを持つ" + } + }, + j_glass = { + name = "グラスジョーカー", + text = { + "{C:attention}グラスカード{} が", + "破壊されるたびに", + "倍率 {X:mult,C:white}X#1#{} を得る", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + }, + unlock = { + "デッキに", + "{E:1,C:attention}#1#{} 枚以上の", + "{E:1,C:attention}#2#{} を持つ" + } + }, + j_ring_master = { + name = "リングマスター", + text = { + "{C:attention}ジョーカー{} 、{C:tarot}タロット{} 、{C:planet}惑星{} 、", + "{C:spectral}スペクトル{} カードが", + "複数回出現する" + }, + unlock = { + "アンティのレベルが", + "{E:1,C:attention}#1#{} に到達する" + } + }, + j_flower_pot = { + name = "フラワーポット", + text = { + "プレイしたハンドに", + "{C:diamonds}ダイヤ{} 、{C:clubs}クラブ{} 、", + "{C:hearts}ハート{} 、{C:spades}スペード{} の", + "スコアリングカードがあると倍率{X:mult,C:white}X#1#{}" + }, + unlock = { + "アンティのレベルが", + "{E:1,C:attention}#1#{} に到達する" + } + }, + j_blueprint = { + name = "ブループリント", + text = { + "右の {C:attention}ジョーカー{} の能力を", + "コピーする" + }, + unlock = { + "ランに勝利する" + } + }, + j_wee = { + name = "ウィージョーカー", + text = { + "このジョーカーは", + "プレイした {C:attention}2{} のカードがスコアされるごとに", + "チップを{C:chips}+#2#{} 得る", + "{C:inactive}(現在{C:chips}+#1#{C:inactive} チップ)" + }, + unlock = { + "{E:1,C:attention}#1# ラウンド以内に", + "ランに勝利する" + } + }, + j_merry_andy = { + name = "メリーアンディ", + text = { + "次のラウンドで", + "ディスカード {C:red}+#1#{}" + }, + unlock = { + "{E:1,C:attention}#1# ラウンド以内に", + "ランに勝利する" + } + }, + j_oops = { + name = "すべてが6!", + text = { + "すべての {C:green,E:1,S:1.1}確率{} を", + "2倍にする", + "{C:inactive}(例:{C:green}3分の1{C:inactive} → {C:green}3分の2{C:inactive})" + }, + unlock = { + "1つのハンドで", + "チップを {E:1,C:attention}#1#{} 以上獲得する", + " " + } + }, + j_idol = { + name = "アイドル", + text = { + "プレイされた{V:1}#3#{} の{C:attention}#2#{} が", + "スコアされるごとに", + "倍率 {X:mult,C:white}X#1#{}", + "{s:0.8}カードはラウンドごとに変わる" + }, + unlock = { + "1つのハンドで", + "チップを {E:1,C:attention}#1#{} 以上獲得する", + " " + } + }, + j_seeing_double = { + name = "シーイングダブル", + text = { + "プレイしたハンドに", + "{C:clubs}クラブ{} のスコアリングカード1枚と", + "その他の{C:attention}スーツ{} の", + "スコアリングカード1枚があると倍率 {X:mult,C:white} X#1#{} " + }, + unlock = { + "{E:1,C:attention}#1#{} を含む", + "ハンドをプレイする", + " " + } + }, + j_matador = { + name = "マタドール", + text = { + "プレイしたハンドが", + "{C:attention}ボスブラインド{} の能力を発動した場合", + "{C:money}$#1#{} を得る" + }, + unlock = { + "ディスカードを使わずに", + "{E:1,C:attention}1ハンド{} で", + "ボスブラインドを倒す" + } + }, + j_hit_the_road = { + name = "ヒット・ザ・ロード", + text = { + "このラウンドでディスカードされた", + "{C:attention}ジャック{} 1枚につき", + "倍率 {X:mult,C:white}X#1#{} を得る", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + }, + unlock = { + "同時に", + "{E:1,C:attention}ジャック{} を", + "{E:1,C:attention}5{} 枚ディスカードする" + } + }, + j_duo = { + name = "デュオ", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {X:mult,C:white}X#1#{}" + }, + unlock = { + "{E:1,C:attention}#1#{} をプレイせずに", + "ランに勝利する", + "カードを売る" + } + }, + j_trio = { + name = "トリオ", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {X:mult,C:white}X#1#{}" + }, + unlock = { + "{E:1,C:attention}#1#{} をプレイせずに", + "ランに勝利する", + " " + } + }, + j_family = { + name = "ファミリー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {X:mult,C:white}X#1#{}" + }, + unlock = { + "{E:1,C:attention}#1#{} をプレイせずに", + "ランに勝利する", + " " + } + }, + j_order = { + name = "オーダー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {X:mult,C:white}X#1#{}" + }, + unlock = { + "{E:1,C:attention}#1#{} をプレイせずに", + "ランに勝利する", + " " + } + }, + j_tribe = { + name = "トライブ", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {X:mult,C:white}X#1#{}" + }, + unlock = { + "{E:1,C:attention}#1#{} をプレイせずに", + "ランに勝利する", + " " + } + }, + j_cavendish = { + name = "カベンディッシュ", + text = { + "倍率 {X:mult,C:white}X#1#{}", + "このカードはラウンド終了時に", + "{C:green}#3#分の#2#{} の確率で", + "破壊される" + } + }, + j_card_sharp = { + name = "カードシャープ", + text = { + "プレイした {C:attention}ポーカーハンド{} が", + "すでにこのラウンドでプレイされていた場合", + "倍率 {X:mult,C:white}X#1#{}" + } + }, + j_red_card = { + name = "レッドカード", + text = { + "{C:attention}ブースターパック{} がスキップされた時", + "倍率 {C:red}+#1#{} を得る", + "{C:inactive}(現在 倍率 {C:red}+#2#{C:inactive})" + } + }, + j_madness = { + name = "マッドネス", + text = { + "{C:attention}ブラインド{} が選択された時", + "倍率 {X:mult,C:white}X#1#{} を得て", + "ランダムなジョーカーを {C:attention}破壊{} する", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{})" + } + }, + j_square = { + name = "スクエアジョーカー", + text = { + "プレイされたハンドに", + "{C:attention}4{} のカードが含まれる場合", + "チップを {C:chips}+#2#{} 得る", + "{C:inactive}(現在 {C:chips}#1#{} チップ)" + } + }, + j_seance = { + name = "降霊術", + text = { + "{C:attention}ポーカーハンド{} が {C:attention}#1#{} だった場合", + "ランダムな {C:spectral}スペクトル{} カードを", + "1枚作る", + "{C:inactive} 空きが必要)" + } + }, + j_riff_raff = { + name = "リフ・ラフ", + text = { + "{C:attention}ブラインド{} が選択された時", + "{C:attention}#1#{} {C:blue}コモン{} {C:attention}ジョーカー{} を作る", + "{C:inactive}(空きが必要)" + } + }, + j_stuntman = { + name = "スタントマン", + text = { + "チップ {C:chips}+#1#{}", + "ハンドサイズ {C:attention}-#2#{}" + }, + unlock = { + "1つのハンドで", + "チップを {E:1,C:attention}#1#{} 以上", + "獲得する" + } + }, + j_invisible = { + name = "インビジブルジョーカー", + text = { + "{C:attention}#1#{} ラウンド後", + "このカードを売ると", + "ランダムなジョーカーを {C:attention}複製{} する", + "{C:inactive}(現在 {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "{E:1,C:attention}ジョーカーを4枚{} よりも", + "多く持たずにランに勝利する", + " " + } + }, + j_brainstorm = { + name = "ブレインストーム", + text = { + "一番左の {C:attention}ジョーカー{} の", + "能力をコピーする" + }, + unlock = { + "{E:1,C:attention}ロイヤルフラッシュ{} を", + "ディスカードする" + } + }, + j_satellite = { + name = "サテライト", + text = { + "ラウンド終了時に", + "このランで使われた唯一の {C:planet}惑星{} カード1枚ごとに", + "{C:money}$#1#{} を得る", + "{C:inactive}(現在 {C:money}$#2#{C:inactive})" + }, + unlock = { + "{E:1,C:money}$#1# 以上持つ", + " " + } + }, + j_shoot_the_moon = { + name = "シュート・ザ・ムーン", + text = { + "手札の{C:attention}クイーン{} ", + "1枚につき", + "倍率{C:mult}+#1#{}" + }, + unlock = { + "1ラウンドでデッキ内の", + "すべての {E:1,C:attention}ハート{} を", + "プレイする" + } + }, + j_drivers_license = { + name = "運転免許証", + text = { + "強化されたカードが", + "{C:attention}16{} 枚以上ある場合", + "倍率 {X:mult,C:white}X#1#{}", + "{C:inactive}(現在 {C:attention}#2#{C:inactive})" + }, + unlock = { + "デッキ内の {E:1,C:attention}#1#{} 枚のカードを", + "強化する" + } + }, + j_cartomancer = { + name = "カード占い", + text = { + "{C:attention}ブラインド{} が選択された時", + "{C:tarot}タロット{} カードを1枚作る", + "{C:inactive}(空きが必要)" + }, + unlock = { + "すべての{E:1,C:tarot}タロット{} カードを", + "発見する" + } + }, + j_astronomer = { + name = "天文学者", + text = { + "ショップの {C:planet}惑星{} カードと", + "{C:planet}天体パック{} ", + "がすべて {C:attention}無料{} になる" + }, + unlock = { + "すべての {E:1,C:planet}惑星{} カードを", + "発見する" + } + }, + j_burnt = { + name = "バーントジョーカー", + text = { + "各ラウンドで", + "最初に{C:attention}ディスカード{} されたポーカーハンドの", + "レベルをアップグレードする" + }, + unlock = { + "合計 {E:1,C:attention}#1#{} 枚の", + "カードを売る", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "ブートストラップ", + text = { + "{C:money}$#2#{} 持つたびに", + "倍率 {C:mult}+#1#{}" + }, + unlock = { + "{E:1,C:attention}#1#{} 枚以上の", + "{C:dark_edition}ポリクローム{} ジョーカーを持つ" + } + }, + j_caino = { + name = "カイーノ", + text = { + "{C:attention}フェイス{} カードが1枚", + "破壊されると", + "倍率 {X:mult,C:white}X#1#{} を得る", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "トリブレ", + text = { + "プレイされた {C:attention}キング{} と {C:attention}クイーン{} が", + "それぞれスコアされた時", + "倍率 {X:mult,C:white}X#1#{}" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "ヨリック", + text = { + "{C:attention}#2#{} 回ディスカードを使った場合のみ", + "倍率 {X:mult,C:white}X#1#{}", + "{C:inactive}(ディスカードの残り: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "チコット", + text = { + "すべての {C:attention}ボスブラインド{} の", + "効果を無効にする" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "ペルケオ", + text = { + "{C:attention}ショップ{} 終了時に所持している", + "ランダムな {C:tarot}消耗{} カード{C:attention}1{} 枚を", + "{C:dark_edition}ネガティブ{} にした", + "コピーを作る" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "スライジョーカー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "チップ {C:chips}+#1#{}" + } + }, + j_wily = { + name = "ウィリージョーカー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "チップ {C:chips}+#1#{}" + } + }, + j_clever = { + name = "クレバージョーカー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "チップ {C:chips}+#1#{}" + } + }, + j_devious = { + name = "ディヴィアスジョーカー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "チップ {C:chips}+#1#{}" + } + }, + j_crafty = { + name = "クラフティジョーカー", + text = { + "プレイしたハンドが", + "{C:attention}#2#{} を含む場合", + "チップ {C:chips}+#1#{}" + } + }, + j_vampire = { + name = "ヴァンパイア", + text = { + "{C:attention}強化されたカード{} が使われるたびに", + "倍率 {X:mult,C:white}X#1#{} を得る", + "カードの {C:attention}強化{} は解除される", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + } + }, + j_shortcut = { + name = "ショートカット", + text = { + "{C:attention}1ランク{} の開きがあっても", + "{C:attention}ストレート{} を作ることができる", + "{C:inactive}(例: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "ホログラム", + text = { + "デッキに {C:attention}カード{} が", + "追加されるたびに", + "倍率 {X:mult,C:white}X#1#{} を得る", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + } + }, + j_vagabond = { + name = "バガボンド", + text = { + "{C:money}$#1#{} 以下の", + "ハンドがプレイされた場合", + "{C:purple}タロット{} カードを作る" + } + }, + j_baron = { + name = "バロン", + text = { + "手札にある {C:attention}キング{} 1枚につき", + "倍率 {X:mult,C:white}X#1#{} を", + "与える" + } + }, + j_cloud_9 = { + name = "クラウド9", + text = { + "ラウンド終了時に", + "{C:attention}フルデッキ{} にある{C:attention} 9{} 1枚につき", + "{C:money}$#1#{} を得る", + "{C:inactive}(現在{C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "ロケット", + text = { + "ラウンド終了時に {C:money}$#1#{} を得る", + "{C:attention}ボスブラインド{} を倒すと", + "{C:money}$#2#{} を得る" + } + }, + j_obelisk = { + name = "オベリスク", + text = { + "最も多くプレイした ", + "{C:attention}ポーカーハンド{} をプレイしないまま", + "連続でハンドがプレイされるたびに", + "倍率 {X:mult,C:white}X#1#{}", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + } + }, + j_midas_mask = { + name = "ミダスマスク", + text = { + "プレイされた時", + "すべての {C:attention}フェイス{} カードが", + "{C:attention}ゴールド{} カードになる " + } + }, + j_luchador = { + name = "ルチャドール", + text = { + "このカードを売ると", + "現在の {C:attention}ボスブラインド{} を", + "無効にする" + } + }, + j_photograph = { + name = "フォトグラフ", + text = { + "最初にプレイされた{C:attention}フェイス{} カードが", + "スコアされた時", + "倍率 {X:mult,C:white}X#1#{}" + } + }, + j_gift = { + name = "ギフトカード", + text = { + "ラウンド終了時に", + "すべての {C:attention}ジョーカー{} と {C:attention}消耗{} カードの", + "{C:attention}セルバリュー{} に", + "{C:money}$#1#{} を加える" + } + }, + j_turtle_bean = { + name = "タートルビーン", + text = { + "ハンドサイズ {C:attention}+#1#{}", + "ラウンドごとに", + "{C:red}#2#{} 枚ずつ減らす" + } + }, + j_erosion = { + name = "イロージョン", + text = { + "フルデッキの {C:attention}#3#{} 枚を下回る", + "カード1枚につき", + "倍率 {C:red}+#1#{}", + "{C:inactive}(現在 倍率 {C:red}+#2#{C:inactive})" + } + }, + j_reserved_parking = { + name = "リザーブドパーキング", + text = { + "手札にある", + "{C:attention}フェイス{} カード1枚につき", + "{C:green}#3#分の#2#{} の確率で", + "{C:money}$#1#{}を与える" + } + }, + j_mail = { + name = "メールによる払い戻し", + text = { + "{C:attention}#2#{} がディスカードされるたびに", + "{C:money}$#1#{} を得る", + "ランクはラウンドごとに変わる" + } + }, + j_to_the_moon = { + name = "トゥ・ザ・ムーン", + text = { + "ラウンド終了時の", + "所持金 {C:money}$5{} ごとに", + "追加の {C:attention}利息{} を{C:money}$#1#{} 得る" + } + }, + j_hallucination = { + name = "ハルシネーション", + text = { + "{C:attention}ブースターパック{} を開封するたびに", + "{C:green}#2# 分の #1#{} の確率で", + "{C:tarot}タロット{} カードを作る", + "{C:inactive}(空きが必要)" + } + }, + j_lucky_cat = { + name = "ラッキーキャット", + text = { + "{C:attention}ラッキー{} カードの発動が成功するたびに", + "倍率 {X:mult,C:white}X#1#{} を得る", + " ", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + } + }, + j_baseball = { + name = "ベースボールカード", + text = { + "それぞれの {C:green}アンコモン{} ジョーカーが", + "倍率 {X:mult,C:white}X#1#{} を与える" + } + }, + j_bull = { + name = "ブル", + text = { + "所持金 {C:money}1ドル{} につき", + "チップ {C:chips}+#1#{}", + "{C:inactive}(現在 チップ {C:chips}+#2#{C:inactive})" + } + }, + j_diet_cola = { + name = "ダイエットコーラ", + text = { + "このカードを売ると", + "無料の {C:attention}#1#{} を", + "作る" + } + }, + j_trading = { + name = "トレーディングカード", + text = { + "ラウンドの {C:attention}最初のディスカード{} が", + "{C:attention}1{} 枚だった場合", + "それを破壊して {C:money}$#1#{} を得る" + } + }, + j_flash = { + name = "フラッシュカード", + text = { + "ショップで {C:attention}リロール{} するたびに", + "倍率 {C:mult}+#1#{}", + "{C:inactive}(現在 倍率 {C:mult}+#2#{C:inactive})" + } + }, + j_popcorn = { + name = "ポップコーン", + text = { + "倍率 {C:mult}+#1#{}", + "プレイされたラウンドごとに", + "倍率 {C:mult}-#2#{}" + } + }, + j_trousers = { + name = "スペアトラウザー", + text = { + "プレイされたハンドが", + "{C:attention}#2#{} を含む場合", + "倍率 {C:mult}+#1#{}", + "{C:inactive}(現在 倍率 {C:red}+#3#{C:inactive})" + } + }, + j_ancient = { + name = "エンシェントジョーカー", + text = { + "スコアされた時", + "{V:1}#2#{} スーツでプレイされたカードごとに", + "倍率 {X:mult,C:white}X#1#{}", + "{s:0.8} スーツはラウンド終了時に変わる" + } + }, + j_ramen = { + name = "ラーメン", + text = { + "倍率 {X:mult,C:white}X#1#{}", + "ディスカードされた {C:attention}カード{} 1枚につき", + "倍率 {X:mult,C:white}X#2#{} を失う" + } + }, + j_walkie_talkie = { + name = "ウォーキートーキー", + text = { + "スコアされた時", + "プレイされた {C:attention}10{} または {C:attention}4{} ごとに", + "チップ {C:chips}+#1#{} を与え、倍率 {C:mult}+#2#{}" + } + }, + j_selzer = { + name = "セルツァー", + text = { + "次の {C:attention}#1#{} ハンドに", + "プレイされたすべてのカードを", + "再発動する" + } + }, + j_castle = { + name = "キャッスル", + text = { + "このジョーカーは、カードを {V:1}#2#{} 枚ディスカードするたびに", + "チップ {C:chips}+#1#{} を得る", + "スーツはラウンドごとに変わる", + "{C:inactive}(現在 チップ {C:chips}+#3#{C:inactive})" + } + }, + j_smiley = { + name = "スマイリーフェイス", + text = { + "スコアされた時", + "プレイされた {C:attention}フェイス{} カードが", + "倍率 {C:mult}+#1#{} を与える" + } + }, + j_campfire = { + name = "キャンプファイヤー", + text = { + "このジョーカーは、カードが1枚 {C:attention}売れる{} たびに", + "倍率 {X:mult,C:white}X#1#{} を得る", + "{C:attention}ボスブラインド{} を倒すとリセットされる", + "{C:inactive}(現在 倍率 {X:mult,C:white}X#2#{C:inactive})" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "オーバーストック", + text = { + "カードスロット {C:attention}+1{} が", + "ショップで購入できる" + } + }, + v_clearance_sale = { + name = "クリアランスセール", + text = { + "すべてのカードとパックが", + "ショップで {C:attention}#1#%{} オフ" + } + }, + v_tarot_merchant = { + name = "タロット商人", + text = { + "ショップでの", + "{C:tarot}タロット{} カードの", + "出現確率 {C:attention}#1#X{}" + } + }, + v_planet_merchant = { + name = "惑星商人", + text = { + "ショップでの", + "{C:planet}惑星{} カードの", + "出現確率 {C:attention}#1#X{}" + } + }, + v_hone = { + name = "ホーン", + text = { + "{C:dark_edition}フォイル{}、{C:dark_edition}ホログラム{}", + "{C:dark_edition}ポリクローム{} カードの", + "出現確率 {C:attention}#1#X{}" + } + }, + v_reroll_surplus = { + name = "リロールサープラス", + text = { + "リロールのコストが", + "{C:money}$#1#{} 減少する" + } + }, + v_crystal_ball = { + name = "水晶玉", + text = { + "消耗スロット {C:attention}+1{}" + } + }, + v_telescope = { + name = "望遠鏡", + text = { + "最もプレイされた {C:attention}ポーカーハンド{} の", + "{C:planet}惑星{} カードが", + "{C:attention}天体パック{} に", + "常に含まれる" + } + }, + v_grabber = { + name = "グラバー", + text = { + "ラウンドごとに", + "永久的に", + "ハンド {C:blue}+#1#{} を得る" + } + }, + v_wasteful = { + name = "浪費", + text = { + "ラウンドごとに", + "永久的に", + "ディスカード {C:blue}+#1#{} を得る" + } + }, + v_seed_money = { + name = "シードマネー", + text = { + "ラウンドごとに得られる", + "利息の上限を", + "{C:money}$#1#{} に引き上げる" + } + }, + v_blank = { + name = "ブランク", + text = { + "{C:inactive}何もしない?" + } + }, + v_magic_trick = { + name = "マジックトリック", + text = { + "{C:attention}トランプ{} を", + "{C:attention}ショップ{} で", + "購入できる" + } + }, + v_hieroglyph = { + name = "ヒエログリフ", + text = { + "アンティ {C:attention}-#1#{}", + "アンティ{C:attention}-#1#{}", + "ハンド{C:blue}-#1#{}", + "ラウンドごとに" + } + }, + v_directors_cut = { + name = "ディレクターズカット", + text = { + "ボスブラインドをアンティごとに", + "{C:attention}1{} 回リロールする", + "1ロールあたり {C:money}$#1#{}" + } + }, + v_pattern = { + name = "パターン", + text = { + "最もよく使用される", + "{C:attention}消耗{} カードを出現させる", + "{E:1,V:1}#1#", + "{C:inactive}(空きが必要)" + } + }, + v_overstock_plus = { + name = "オーバーストックプラス", + text = { + "カードスロット {C:attention}+1{} が", + "ショップで購入できる" + }, + unlock = { + "ショップで", + "合計 {C:money}$#1#{} 使う", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "清算", + text = { + "すべてのカードとパックが", + "ショップで {C:attention}#1#%{} オフ" + }, + unlock = { + "1回のランで", + "{C:attention}#1#{} 枚の {C:voucher}バウチャー{} カードを", + "引き換える" + } + }, + v_tarot_tycoon = { + name = "タロットタイクーン", + text = { + "ショップでの", + "{C:tarot}タロット{} カードの", + "出現確率 {C:attention}#1#X{}" + }, + unlock = { + "ショップで", + "合計 {C:attention}#1#{} 枚の {C:tarot}タロット{} カードを", + "購入する", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "惑星タイクーン", + text = { + "ショップでの", + "{C:planet}惑星{} カードの", + "出現確率 {C:attention}#1#X{}" + }, + unlock = { + "ショップで", + "{C:attention}#1#{} 枚の {C:planet}惑星{} カードを", + "購入する", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "グローアップ", + text = { + "{C:dark_edition}フォイル{}、{C:dark_edition}ホログラム{}", + "{C:dark_edition}ポリクローム{} カードの", + "出現確率 {C:attention}#1#X{}" + }, + unlock = { + "{C:dark_edition}フォイル{}、 {C:dark_edition}ホログラム{}", + "{C:dark_edition}ポリクローム{} エディションの", + "いずれかの {C:attention}ジョーカー{} カードを", + "{C:attention}#1#{} 枚以上持つ" + } + }, + v_reroll_glut = { + name = "リロールグラト", + text = { + "リロールのコストが", + "{C:money}$#1#{} 減少する" + }, + unlock = { + "ショップを", + "合計 {C:attention}#1#{} 回リロールする", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "オーメングローブ", + text = { + "{C:spectral}スペクトル{} カードが", + "いずれかの {C:attention}アルカナパック{} に", + "含まれている可能性がある" + }, + unlock = { + "いずれかの{C:tarot}アルカナパック{} から", + "合計 {C:attention}#1#{} 枚の", + "{C:tarot}タロット{} カードを使用する", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "天文台", + text = { + "{C:attention}消耗{} エリアの", + "{C:planet}惑星{} カードが", + "特定のポーカーハンドに", + "倍率 {X:red,C:white}X#1#{} を与える" + }, + unlock = { + "いずれかの{C:planet}天体パック{} から", + "合計 {C:attention}#1#{} 枚の", + "{C:planet}惑星{} カードを使用する", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "ナチョトング", + text = { + "ラウンドごとに", + "永久的に", + "ハンド {C:blue}+#1#{} を得る" + }, + unlock = { + "合計 {C:attention}#1#{} 枚の", + "カードをプレイする", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "リサイクロマンシー", + text = { + "ラウンドごとに", + "永久的に", + "ディスカード {C:blue}+#1#{} を得る" + }, + unlock = { + "合計 {C:attention}#1#{} 枚の", + "カードをディスカードする", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "マネーツリー", + text = { + "ラウンドごとに得られる", + "利息の上限を", + "{C:money}$#1#{} に引き上げる" + }, + unlock = { + "{C:attention}#1#{} ラウンド連続で", + "ラウンド利益の利息を", + "最大にする", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "反物質", + text = { + "ジョーカースロット {C:dark_edition}+1{}" + }, + unlock = { + "{C:voucher}ブランク{} を", + "合計 {C:attention}#1#{} 回引き換える", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "イリュージョン", + text = { + "ショップの {C:attention}トランプ{} が", + "{C:enhanced}強化{} 、 {C:dark_edition}エディション{}、および/または{C:attention}シール{}の", + "いずれかになる可能性がある" + }, + unlock = { + "ショップで", + "合計 {C:attention}#1#{} 枚のトランプを", + "購入する", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "ペトログリフ", + unlock = { + "アンティ {C:attention}-#1#{}", + "{E:1,C:attention}#1#{} に到達する" + }, + text = { + "アンティ {C:attention}-#1#{}", + "アンティ{C:attention}-#1#{}", + "ディスカード{C:red}-#1#{} " + } + }, + v_retcon = { + name = "リトコン", + text = { + "ボスブラインドを", + "回数 {C:attention}無制限{} でリロールする", + "リロール1回につき{C:money}$#1#{}" + }, + unlock = { + "{C:attention}#1#{} のブラインドを", + "発見する" + } + }, + v_tesselation = { + name = "テッセレーション", + text = { + "最もよく使用される", + "{C:attention}ジョーカー{} カードを出現させる", + "{E:1,V:1}#1#", + "{C:inactive}(空きが必要)" + }, + unlock = { + "最もよく使用する", + "{C:attention}ジョーカー{} の", + "{C:dark_edition}ポリクローム{} エディションを", + "ショップで購入する" + } + }, + v_palette = { + name = "パレット", + text = { + "ハンドにカードを", + "{C:attention}+#1#{} 枚持てる", + "ハンドサイズ {C:attention}+#1#{}" + }, + unlock = { + "ハンドサイズを", + "{C:attention}#1#{} 枚まで減らす" + } + }, + v_paint_brush = { + name = "ペイント ブラシ", + text = { + "ハンドサイズ {C:attention}+#1#{}" + } + } + }, + Tarot = { + c_fool = { + name = "愚者", + text = { + "このランで使用された", + "最後の {C:tarot}タロット{} または {C:planet}惑星{} カードを", + "作る", + "ただし {s:0.8,C:tarot}愚者{s:0.8} は除く" + } + }, + c_magician = { + name = "魔術師", + text = { + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する" + } + }, + c_high_priestess = { + name = "女教皇", + text = { + "ランダムな {C:planet}惑星{} カードを", + "最大 {C:attention}#1#{} 枚まで作る", + "{C:inactive}(空きが必要)" + } + }, + c_empress = { + name = "女帝", + text = { + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する" + } + }, + c_emperor = { + name = "皇帝", + text = { + "ランダムな {C:tarot}タロット{} カードを", + "最大 {C:attention}#1#{} 枚まで作る", + "{C:inactive}(空きが必要)" + } + }, + c_heirophant = { + name = "教皇", + text = { + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する" + } + }, + c_lovers = { + name = "恋人", + text = { + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する" + } + }, + c_chariot = { + name = "戦車", + text = { + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する" + } + }, + c_justice = { + name = "正義", + text = { + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する" + } + }, + c_hermit = { + name = "隠者", + text = { + "資金を2倍にする", + "{C:inactive}(最高 {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "運命の輪", + text = { + "{C:green}#2#分の#1#{} の確率で", + "ランダムな {C:attention}ジョーカー{} に", + "{C:dark_edition}フォイル{}、 {C:dark_edition}ホログラム{}", + "{C:dark_edition}ポリクローム{} エディションのいずれかを加える" + } + }, + c_strength = { + name = "強さ", + text = { + "最大 {C:attention}#1#{} 枚の", + "選択されたカードのランクを", + "{C:attention}1{} 上げる" + } + }, + c_hanged_man = { + name = "吊された男", + text = { + "{C:attention}#1#{} 枚までの", + "選択されたカードを破壊する" + } + }, + c_death = { + name = "死神", + text = { + "{C:attention}#1#{} 枚のカードを選択し", + "{C:attention}左{} のカードを", + "{C:attention}右{} のカードに変換する", + "{C:inactive}(ドラッグして並べ替え)" + } + }, + c_temperance = { + name = "節制", + text = { + "現在のすべてのジョーカーの", + "セルバリューの合計を与える", + "{C:inactive}(最高 {C:money}$#1#{C:inactive})", + "{C:inactive}(現在 {C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "悪魔", + text = { + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する" + } + }, + c_tower = { + name = "塔", + text = { + "選択した {C:attention}#1#{} 枚のカードを", + "{C:attention}#2#{} に", + "強化する" + } + }, + c_star = { + name = "星", + text = { + "{C:attention}#1#{} 枚までの", + "選択されたカードを", + "{V:1}#2#{} に変換する" + } + }, + c_moon = { + name = "月", + text = { + "{C:attention}#1#{} 枚までの", + "選択されたカードを", + "{V:1}#2#{} に変換する" + } + }, + c_sun = { + name = "太陽", + text = { + "{C:attention}#1#{} 枚までの", + "選択されたカードを", + "{V:1}#2#{} に変換する" + } + }, + c_judgement = { + name = "審判", + text = { + "ランダムな {C:attention}ジョーカー{} カードを", + "作る", + "{C:inactive}(空きが必要)" + } + }, + c_world = { + name = "世界", + text = { + "{C:attention}#1#{} 枚までの", + "選択されたカードを", + "{V:1}#2#{} に変換する" + } + } + }, + Planet = { + c_mercury = { + name = "水星", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_venus = { + name = "金星", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_earth = { + name = "地球", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_mars = { + name = "火星", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_jupiter = { + name = "木星", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_saturn = { + name = "土星", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_uranus = { + name = "天王星", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_neptune = { + name = "海王星", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_pluto = { + name = "冥王星", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_ceres = { + name = "セレス", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_planet_x = { + name = "プラネットX", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + }, + c_eris = { + name = "エリス", + text = { + "{S:0.8}({S:0.8,V:1}レベル#1#{S:0.8}){} レベルアップ", + "{C:attention}#2#{} ", + "倍率 {C:mult}+#3#{} および", + "チップ {C:chips}+#4#{}" + } + } + }, + Spectral = { + c_familiar = { + name = "ファミリア", + text = { + "ランダムな手札を {C:attention}1{} 枚", + "破壊して", + "ランダムな {C:attention}強化されたフェイスカード{} を{C:attention}#1#{} 枚", + "手札に加える" + } + }, + c_grim = { + name = "グリム", + text = { + "ランダムな手札を {C:attention}1{} 枚", + "破壊して", + "ランダムな {C:attention}強化されたエース{} を{C:attention}#1#{} 枚", + "手札に加える" + } + }, + c_incantation = { + name = "呪文", + text = { + "ランダムな手札を {C:attention}1{} 枚", + "破壊して", + "ランダムな {C:attention}強化されたナンバーカード{} を{C:attention}#1#{} 枚", + "手札に加える" + } + }, + c_talisman = { + name = "タリスマン", + text = { + "手札から選んだ", + "カード {C:attention}1{} 枚に", + "{C:attention}ゴールドシール{} を加える" + } + }, + c_aura = { + name = "オーラ", + text = { + "手札 にある選択したカード{C:attention}1{} 枚に", + "{C:dark_edition}フォイル{}、{C:dark_edition}ホログラム{}、{C:dark_edition}ポリクローム{} の", + "いずれかの効果を加える" + } + }, + c_wraith = { + name = "レイス", + text = { + "ランダムな {C:red}レア{C:attention}ジョーカー{} を", + "作り", + "資金を {C:money}$0{} にする" + } + }, + c_sigil = { + name = "紋章", + text = { + "手札のすべてのカードを", + "ランダムな1つの {C:attention}スーツ{} に", + "変換する" + } + }, + c_ouija = { + name = "ウイジャ", + text = { + "手札のすべてのカードを", + "ランダムな1つの {C:attention}ランク{} に", + "変換する", + "ハンドサイズ {C:red}-1{}" + } + }, + c_ectoplasm = { + name = "エクトプラズム", + text = { + "ランダムな {C:attention}ジョーカー{} に", + "{C:dark_edition}ネガティブ{} を加える", + "ハンドサイズ {C:red}-1{}" + } + }, + c_immolate = { + name = "生贄", + text = { + "ランダムな手札を {C:attention}#1#{} 枚", + "破壊して", + "{C:money}$#2#{} 得る" + } + }, + c_soul = { + name = "魂", + text = { + "{C:legendary,E:1}レジェンド{} ジョーカーを", + "作る", + "{C:inactive}(空きが必要)" + } + }, + c_black_hole = { + name = "ブラックホール", + text = { + "すべての {C:legendary,E:1}ポーカーハンド{} を", + "{C:attention}1{} レベル", + "アップグレードする" + } + }, + c_ankh = { + name = "アンク", + text = { + "ランダムな {C:attention}ジョーカー{} の", + "コピーを作る", + "他のすべてのジョーカーを破壊する" + } + }, + c_deja_vu = { + name = "デジャヴ", + text = { + "手札から選んだ", + "カード {C:attention}1{} 枚に", + "{C:red}レッドシール{} を加える" + } + }, + c_hex = { + name = "ヘックス", + text = { + "ランダムな {C:attention}ジョーカー{} に", + "{C:dark_edition}ポリクローム{} を加える", + "他のすべてのジョーカーを破壊する" + } + }, + c_trance = { + name = "トランス", + text = { + "手札から選んだ", + "カード {C:attention}1{} 枚に", + "{C:blue}ブルーシール{} を加える" + } + }, + c_medium = { + name = "ミディアム", + text = { + "手札から選んだ", + "カード {C:attention}1{} 枚に", + "{C:purple}パープルシール{} を加える" + } + }, + c_cryptid = { + name = "クリプティッド", + text = { + "手札から選んだ", + "カード {C:attention}1{} 枚の", + "コピーを {C:attention}#1#{} 枚作る" + } + } + }, + Edition = { + e_base = { + name = "ベース", + text = { + "追加効果なし" + } + }, + e_foil = { + name = "フォイル", + text = { + "チップ {C:chips}+#1#{}" + } + }, + e_holo = { + name = "ホログラム", + text = { + "倍率 {C:mult}+#1#{}" + } + }, + e_polychrome = { + name = "ポリクローム", + text = { + "倍率 {X:mult,C:white}X#1#{}" + } + }, + e_negative = { + name = "ネガティブ", + text = { + "ジョーカースロット {C:dark_edition}+#1#{}" + } + }, + e_negative_consumable = { + name = "ネガティブ", + text = { + "消耗スロット {C:dark_edition}+#1#{}" + } + } + }, + Enhanced = { + m_bonus = { + name = "ボーナスカード", + text = {} + }, + m_mult = { + name = "倍率カード", + text = { + "倍率 {C:mult}+#1#{}" + } + }, + m_wild = { + name = "ワイルドカード", + text = { + "どのスーツとしても", + "使用できる" + } + }, + m_glass = { + name = "グラスカード", + text = { + "{C:green}#3#分の#2#{} の確率で", + "カードを破壊する", + "倍率 {X:mult,C:white} X#1#{}" + } + }, + m_steel = { + name = "スチールカード", + text = { + "このカードが", + "手札にある間", + "倍率 {X:mult,C:white} X#1# {}" + } + }, + m_stone = { + name = "ストーンカード", + text = { + "チップ {C:chips}+#1#{}", + "ランクおよびスーツはない" + } + }, + m_gold = { + name = "ゴールドカード", + text = { + "ラウンド終了時に", + "このカードが手札にある場合", + "{C:money}$#1#{}" + } + }, + m_lucky = { + name = "ラッキーカード", + text = { + "{C:green}#3#分の#1#{} の確率で", + "倍率 {C:mult}+#2#{}", + "{C:green}#5#分の#1#{} の確率で", + "{C:money}$#4#{} 得る" + } + } + }, + Stake = { + stake_white = { + name = "ホワイトステーク", + text = { + "ベース難易度" + } + }, + stake_red = { + name = "レッドステーク", + text = { + "{C:attention}スモールブラインド{} が", + "報奨金を与えない", + "{s:0.8}以前のすべてのステークに適用" + } + }, + stake_green = { + name = "グリーンステーク", + text = { + "各 {C:attention}アンティ{} に必要な", + "スコアスケールが速くなる", + "{s:0.8}以前のすべてのステークに適用" + } + }, + stake_blue = { + name = "ブルーステーク", + text = { + "ディスカード {C:red}-1{}", + "{s:0.8}以前のすべてのステークに適用" + } + }, + stake_black = { + name = "ブラックステーク", + text = { + "ショップに {C:attention}エターナル{} ジョーカーが出現可", + "{C:inactive,s:0.8}{売却や破壊はできない}", + "{s:0.8}以前のすべてのステークに適用" + } + }, + stake_purple = { + name = "パープルステーク", + text = { + "各 {C:attention}アンティ{} に必要な", + "スコアスケールが速くなる", + "{s:0.8}以前のすべてのステークに適用" + } + }, + stake_orange = { + name = "オレンジステーク", + text = { + "{C:attention}ブースターパック{} が", + "各アンティごとに {C:money}$1{} 高くなる", + "{s:0.8}以前のすべてのステークに適用" + } + }, + stake_gold = { + name = "ゴールドステーク", + text = { + "ハンドサイズ{C:red}-1{}", + "{s:0.8}以前のすべてのステークに適用" + } + } + }, + Tag = { + tag_uncommon = { + name = "アンコモンタグ", + text = { + "ショップが", + "{C:green}アンコモンジョーカー{} を持つ" + } + }, + tag_rare = { + name = "レアタグ", + text = { + "ショップが", + "{C:red}レアジョーカー{} を持つ" + } + }, + tag_negative = { + name = "ネガティブタグ", + text = { + "ショップが", + "{C:dark_edition}ネガティブジョーカー{} を持つ" + } + }, + tag_foil = { + name = "フォイルタグ", + text = { + "ショップが", + "{C:dark_edition}フォイルジョーカー{} を持つ" + } + }, + tag_holo = { + name = "ホログラムタグ", + text = { + "ショップが", + "{C:dark_edition}ホログラムジョーカー{} を持つ" + } + }, + tag_polychrome = { + name = "ポリクロームタグ", + text = { + "ショップが", + "{C:dark_edition}ポリクロームジョーカー{} を持つ" + } + }, + tag_investment = { + name = "投資タグ", + text = { + "ボスブラインドを倒すと", + "{C:money}$#1#{} 得る", + " " + } + }, + tag_voucher = { + name = "バウチャータグ", + text = { + "次のショップに", + "{C:voucher}バウチャー{} を1つ加える" + } + }, + tag_boss = { + name = "ボスタグ", + text = { + "{C:attention}ボスブラインド{} を", + "リロールする" + } + }, + tag_standard = { + name = "スタンダードタグ", + text = { + "無料の", + "{C:attention}メガスタンダードパック{} を与える" + } + }, + tag_charm = { + name = "チャームタグ", + text = { + "無料の", + "{C:tarot}メガアルカナパック{} を与える" + } + }, + tag_meteor = { + name = "メテオタグ", + text = { + "無料の", + "{C:planet}メガ天体パック{} を与える" + } + }, + tag_buffoon = { + name = "道化師タグ", + text = { + "無料の", + "{C:attention}道化師パック{} を与える" + } + }, + tag_handy = { + name = "ハンディタグ", + text = { + "このランで{C:blue}ハンド{} をプレイするごとに", + "{C:money}$#1#{} を与える", + "{C:inactive}(最高{C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "ガーベジタグ", + text = { + "このターンで使わなかった{C:red}ディスカード{} につき", + "{C:money}$#1#{} を与える", + "{C:inactive}(最高{C:money}$#2#{C:inactive})" + } + }, + tag_coupon = { + name = "クーポンタグ", + text = { + "次のショップで", + "イニシャルカードとブースターパックが", + "無料になる" + } + }, + tag_double = { + name = "ダブルタグ", + text = { + "次に選択した {C:attention}タグ{} の", + "コピーを与える", + "{s:0.8}ただし {s:0.8,C:attention}ダブルタグ{s:0.8} は除く" + } + }, + tag_juggle = { + name = "ジャグルタグ", + text = { + "次のラウンドで", + "ハンドサイズ{C:attention}+#1#{}" + } + }, + tag_d_six = { + name = "D6タグ", + text = { + "次のショップのリロールが", + "{C:money}$0{} からスタートする" + } + }, + tag_top_up = { + name = "トップアップタグ", + text = { + "{C:blue}コモン{} ジョーカーを", + "最大{C:attention}#1#{} まで作る", + "{C:inactive}(空きが必要)" + } + }, + tag_skip = { + name = "スピードタグ", + text = { + "このランでスキップされた", + "ブラインドごとに {C:money}$#1#{} 与える", + "{C:inactive}(最高 {C:money}$#2#{C:inactive})" + } + }, + tag_orbital = { + name = "オービタルタグ", + text = { + "{C:attention}#1#{} を", + "{C:attention}#2# レベル{} アップグレードする" + } + }, + tag_economy = { + name = "エコノミータグ", + text = { + "資金を2倍にする", + "{C:inactive}(最高 {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "エーテルタグ", + text = { + "無料の {C:planet}スペクトルパック{} を", + "与える" + } + } + }, + Blind = { + bl_small = { + name = "スモールブラインド", + text = {} + }, + bl_big = { + name = "ビッグブラインド", + text = {} + }, + bl_hook = { + name = "フック", + text = { + "ハンドがプレイされるたびに", + "ランダムなカードを2枚捨てる" + } + }, + bl_wall = { + name = "壁", + text = { + "エクストララージブラインド" + } + }, + bl_wheel = { + name = "ホイール", + text = { + "/7枚のカードが", + "裏向きでドローされる" + } + }, + bl_arm = { + name = "腕", + text = { + "プレイされたポーカーハンドの", + "レベルを下げる" + } + }, + bl_psychic = { + name = "サイキック", + text = { + "5枚のカードをプレイしなければならない" + } + }, + bl_goad = { + name = "ゴアド", + text = { + "すべてのスペードカードに", + "デバフがかかる" + } + }, + bl_water = { + name = "水", + text = { + "0ディスカードで", + "スタートする" + } + }, + bl_eye = { + name = "目", + text = { + "このラウンドでは", + "ハンドタイプをリピートできない" + } + }, + bl_mouth = { + name = "口", + text = { + "このラウンドでは", + "1タイプのハンドだけをプレイする" + } + }, + bl_plant = { + name = "プラント", + text = { + "すべてのフェイスカードに", + "デバフがかかる" + } + }, + bl_needle = { + name = "ニードル", + text = { + "1ハンドだけをプレイする" + } + }, + bl_head = { + name = "頭", + text = { + "すべてのハートカードに", + "デバフがかかる" + } + }, + bl_tooth = { + name = "歯", + text = { + "カードがプレイされるたびに", + "$1失う" + } + }, + bl_final_leaf = { + name = "青々とした葉", + text = { + "1枚のジョーカーが売られるまで", + "すべてのカードにデバフがかかる" + } + }, + bl_final_vessel = { + name = "バイオレットベッセル", + text = { + "ベリーラージブラインド" + } + }, + bl_ox = { + name = "雄牛", + text = { + "#1# をプレイすると", + "資金が$0になる" + } + }, + bl_house = { + name = "家", + text = { + "最初のハンドは", + "裏向きでドローされる" + } + }, + bl_club = { + name = "クラブ", + text = { + "すべてのクラブカードに", + "デバフがかかる" + } + }, + bl_fish = { + name = "魚", + text = { + "各ハンドをプレイ後に", + "カードが裏向きでドローされる" + } + }, + bl_window = { + name = "窓", + text = { + "すべてのダイヤカードに", + "デバフがかかる" + } + }, + bl_manacle = { + name = "手枷", + text = { + "ハンドサイズ -1" + } + }, + bl_serpent = { + name = "サーペント", + text = { + "プレイまたはディスカードの後", + "カードを3枚ドローする" + } + }, + bl_pillar = { + name = "柱", + text = { + "このアンティの前にプレイされたカードに", + "デバフがかかる" + } + }, + bl_flint = { + name = "フリント", + text = { + "ベースチップと倍率が", + "半分になる" + } + }, + bl_mark = { + name = "マーク", + text = { + "すべてのフェイスカードが", + "裏向きでドローされる" + } + }, + bl_final_acorn = { + name = "琥珀色のドングリ", + text = { + "すべてのジョーカーカードを", + "裏返してシャッフルする" + } + }, + bl_final_heart = { + name = "クリムゾンハート", + text = { + "すべてのハンドで", + "1枚のランダムなジョーカーが無効にされる" + } + }, + bl_final_bell = { + name = "セルリアンベル", + text = { + "常に1枚のカードが", + "強制的に選択される" + } + } + }, + Back = { + b_red = { + name = "レッドデッキ", + text = { + "すべてのラウンドで", + "ディスカード {C:red}+#1#{}" + } + }, + b_blue = { + name = "ブルーデッキ", + text = { + "すべてのラウンドで", + "ハンド {C:blue}+#1#{}" + } + }, + b_yellow = { + name = "イエローデッキ", + text = { + "{C:money}$#1#{} を追加して", + "スタートする" + } + }, + b_green = { + name = "グリーンデッキ", + text = { + "各ラウンドの終了時に", + "{s:0.85}残りの {C:blue}ハンド{} ごとに {C:money}$#1#{}", + "{s:0.85}残りの {C:red}ディスカード{} ごとに {C:money}$#1#{}", + "{C:attention}利息{} は得ない" + } + }, + b_black = { + name = "ブラックデッキ", + text = { + "すべてのラウンドで", + "", + "ジョーカースロット {C:attention}+#1#{}", + "ハンド {C:blue}-#2#{}" + } + }, + b_magic = { + name = "マジックデッキ", + text = { + "{C:tarot,T:v_crystal_ball}#1#{} のバウチャーと", + "{C:tarot,T:c_fool}#2#{} の", + "{C:attention}2{} つのコピーで", + "ランをスタートする" + } + }, + b_nebula = { + name = "ネビュラデッキ", + text = { + "{C:planet,T:v_telescope}#1#{} のバウチャーと", + "消耗スロットで", + "", + "ランをスタートする" + } + }, + b_metal = { + name = "メタルデッキ", + text = { + "{C:attention}#1#{} 枚のトランプが", + "{C:attention}スチールカード{} に強化された状態で", + "ランをスタートする" + } + }, + b_abandoned = { + name = "アバンダンドデッキ", + text = { + "デッキに", + "{C:attention}フェイスカード{} がない状態で", + "ランをスタートする" + } + }, + b_checkered = { + name = "チェッカードデッキ", + text = { + "デッキに {C:attention}26{} 枚の {C:spades}スペード{} と", + "{C:attention}26{} 枚の {C:hearts}ハート{} がある状態で", + "ランをスタートする" + } + }, + b_rocky = { + name = "ロッキーデッキ", + text = { + "{C:attention}#1#{} 枚の", + "{C:attention}ストーンカード{} を追加してランをスタートする" + } + }, + b_braided = { + name = "ブレイデッドデッキ", + text = { + "最初にプレイされたハンドが", + "{C:attention}レベル3{} にアップグレードされる" + } + }, + b_anaglyph = { + name = "アナグリフデッキ", + text = { + "{C:attention}ボスブラインド{} を倒すたびに", + "{C:attention,T:tag_double}#1#{} を", + "得る" + } + }, + b_plasma = { + name = "プラズマデッキ", + text = { + "プレイされたハンドのスコアを", + "計算する時に", + "{C:blue}チップ{} と {C:red}倍率{} のバランスをとる", + "ブラインドの基本サイズ {C:red}X#1#{}" + } + }, + b_erratic = { + name = "エラティックデッキ", + text = { + "デッキのすべての ", + "{C:attention}ランク{} と {C:attention}スーツ{} が", + "ランダムになる" + } + }, + b_challenge = { + name = "チャレンジデッキ", + text = { + "" + } + }, + b_ghost = { + name = "ゴーストデッキ", + text = { + "{C:spectral}スペクトル{} カードが", + "ショップに出現し", + "{C:spectral,T:c_hex}ヘックス{} カードで始まる" + } + }, + b_zodiac = { + name = "ゾディアックデッキ", + text = { + "{C:tarot,T:v_tarot_merchant}#1#{}、", + "{C:planet,T:v_planet_merchant}#2#{}、", + "{C:attention,T:v_overstock_norm}#3#{}で", + "ランをスタートする" + } + }, + b_painted = { + name = "ペインテッドデッキ", + text = { + "ハンドサイズ {C:attention}+#1#{}", + "ジョーカースロット {C:red}#2#{}" + } + } + }, + Other = { + gold_seal = { + name = "ゴールドシール", + text = { + "このカードがプレイされた時", + "{C:money}$3{} を得て", + "スコアする" + } + }, + white_sticker = { + name = "ホワイトステッカー", + text = { + "{C:attention}ホワイトステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した" + } + }, + red_sticker = { + name = "レッドステッカー", + text = { + "{C:attention}レッドステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した" + } + }, + green_sticker = { + name = "グリーンステッカー", + text = { + "{C:attention}グリーンステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した" + } + }, + blue_sticker = { + name = "ブルーステッカー", + text = { + "{C:attention}ブルーステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した" + } + }, + black_sticker = { + name = "ブラックステッカー", + text = { + "{C:attention}ブラックステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した" + } + }, + purple_sticker = { + name = "パープルステッカー", + text = { + "{C:attention}パープルステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した" + } + }, + orange_sticker = { + name = "オレンジステッカー", + text = { + "{C:attention}オレンジステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した" + } + }, + gold_sticker = { + name = "ゴールドステッカー", + text = { + "{C:attention}ゴールドステーク{} の難易度で", + "このジョーカーを使用して", + "勝利した" + } + }, + playing_card = { + text = { + "{V:1}#2# の {C:light_black}#1#{}" + } + }, + card_chips = { + text = { + "チップ {C:chips}+#1#{}" + } + }, + card_extra_chips = { + text = { + "追加チップ {C:chips}+#1#{}" + } + }, + locked = { + name = "ロック中", + text = {} + }, + debuffed_default = { + name = "デバフ状態", + text = { + "すべての能力は", + "無効です" + } + }, + debuffed_playing_card = { + name = "デバフ状態", + text = { + "チップはスコアされず", + "すべての能力は", + "無効です" + } + }, + demo_locked = { + name = "ロック中", + text = { + "この体験版では", + "利用できません" + } + }, + demo_shop_locked = { + name = "ロック中", + text = { + "{C:attention}Jimbo{} のパーソナルコレクションの", + "カードは", + "{E:1,C:red}Balatro{} の製品版で", + "利用できます" + } + }, + wip_locked = { + name = "ロック中", + text = { + "現在", + "開発中です" + } + }, + deck_locked_win = { + name = "ロック中", + text = { + "いずれかの難易度で", + "{C:attention}#1#{} で", + "ランに勝利する" + } + }, + deck_locked_discover = { + name = "ロック中", + text = { + "自分のコレクションから", + "{C:attention}#1#{} 以上のアイテムを", + "発見する" + } + }, + deck_locked_stake = { + name = "ロック中", + text = { + "いずれかのデッキで", + "{V:1}#1#{} 以上の難易度で", + "ランに勝利する" + } + }, + joker_locked_legendary = { + name = "ロック中", + text = { + "{C:spectral}ソウル{} カードから", + "このジョーカーを見つける" + } + }, + undiscovered_joker = { + name = "未発見", + text = { + "このカードを購入するか", + "シードされていないランで使用すると", + "効果を知ることができる", + " " + } + }, + undiscovered_tarot = { + name = "未発見", + text = { + "このカードを購入するか", + "シードされていないランで使用すると", + "効果を知ることができる", + " " + } + }, + undiscovered_planet = { + name = "未発見", + text = { + "このカードを購入するか", + "シードされていないランで使用すると", + "効果を知ることができる", + " " + } + }, + undiscovered_spectral = { + name = "未発見", + text = { + "このカードを購入するか", + "シードされていないランで使用すると", + "効果を知ることができる", + " " + } + }, + undiscovered_voucher = { + name = "未発見", + text = { + "このバウチャーを", + "シードされていないランで", + "引き換えると", + "効果を知ることができる" + } + }, + undiscovered_booster = { + name = "未発見", + text = { + "シードされていないランで", + "このパックを開封すると", + "効果を知ることができる" + } + }, + undiscovered_edition = { + name = "未発見", + text = { + "シードされていないランで", + "このエディションを見つけると", + "効果を知ることができる" + } + }, + undiscovered_tag = { + name = "未発見", + text = { + "シードされていないランで", + "このタグを使用すると", + "効果を知ることができる" + } + }, + p_arcana_normal = { + name = "アルカナパック", + text = { + "{C:attention}#2#{} 枚までの {C:tarot}タロット{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する" + } + }, + p_arcana_jumbo = { + name = "ジャンボアルカナパック", + text = { + "{C:attention}#2#{} 枚までの {C:tarot}タロット{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する" + } + }, + p_arcana_mega = { + name = "メガアルカナパック", + text = { + "{C:attention}#2#{} 枚までの {C:tarot}タロット{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する" + } + }, + p_celestial_normal = { + name = "天体パック", + text = { + "{C:attention}#2#{} 枚までの {C:planet}惑星{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する" + } + }, + p_celestial_jumbo = { + name = "ジャンボ天体パック", + text = { + "{C:attention}#2#{} 枚までの {C:planet}惑星{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する" + } + }, + p_celestial_mega = { + name = "メガ天体パック", + text = { + "{C:attention}#2#{} 枚までの {C:planet}惑星{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する" + } + }, + p_spectral_normal = { + name = "スペクトルパック", + text = { + "{C:attention}#2#{} 枚までの {C:spectral}スペクトル{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する" + } + }, + p_spectral_jumbo = { + name = "ジャンボスペクトルパック", + text = { + "{C:attention}#2#{} 枚までの {C:spectral}スペクトル{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する" + } + }, + p_spectral_mega = { + name = "メガスペクトルパック", + text = { + "{C:attention}#2#{} 枚までの {C:spectral}スペクトル{} カードから", + "{C:attention}#1#{} 枚を選んで", + "すぐに使用する" + } + }, + p_standard_normal = { + name = "スタンダードパック", + text = { + "{C:attention}#2#{} 枚までの {C:attention}トランプ{} から", + "{C:attention}#1#{} 枚を選んで", + "デッキに加える" + } + }, + p_standard_jumbo = { + name = "ジャンボスタンダードパック", + text = { + "{C:attention}#2#{} 枚までの {C:attention}トランプ{} から", + "{C:attention}#1#{} 枚を選んで", + "デッキに加える" + } + }, + p_standard_mega = { + name = "メガスタンダードパック", + text = { + "{C:attention}#2#{} 枚までの {C:attention}トランプ{} から", + "{C:attention}#1#{} 枚を選んで", + "デッキに加える" + } + }, + p_buffoon_normal = { + name = "道化師パック", + text = { + "{C:attention}#2#{} 枚までの {C:joker}ジョーカー{} カードから", + "{C:attention}#1#{} 枚を選ぶ" + } + }, + p_buffoon_jumbo = { + name = "ジャンボ道化師パック", + text = { + "{C:attention}#2#{} 枚までの {C:joker}ジョーカー{} カードから", + "{C:attention}#1#{} 枚を選ぶ" + } + }, + p_buffoon_mega = { + name = "メガ道化師パック", + text = { + "{C:attention}#2#{} 枚までの {C:joker}ジョーカー{} カードから", + "{C:attention}#1#{} 枚を選ぶ" + } + }, + pinned_left = { + name = "ピン留め", + text = { + "このジョーカーは", + "一番左のポジションに", + "固定される" + } + }, + red_seal = { + name = "レッドシール", + text = { + "このカードを {C:attention}1{} 回", + "再発動する" + } + }, + blue_seal = { + name = "ブルーシール", + text = { + "ラウンドの最後にこのカードが", + "ハンドに{C:attention} ある{} 場合", + "{C:planet}惑星{} カードを作る" + } + }, + purple_seal = { + name = "パープルシール", + text = { + "{C:attention}ディスカード{} された時", + "{C:tarot}タロット{} カードを作る", + "{C:inactive}(空きが必要)" + } + }, + eternal = { + name = "エターナル", + text = { + "売ることも", + "壊すこともできない" + } + }, + challenge_locked = { + name = "ロック中", + text = { + "チャレンジモードをアンロックするには", + "#1#種類以上の異なるデッキで", + "ランに勝利する", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "スペード", + Hearts = "ハート", + Clubs = "クラブ", + Diamonds = "ダイヤ" + }, + suits_plural = { + Spades = "スペード", + Hearts = "ハート", + Clubs = "クラブ", + Diamonds = "ダイヤ" + }, + blind_states = { + Select = "選択", + Skipped = "スキップ", + Current = "現在", + Defeated = "敗北", + Upcoming = "今後", + Selected = "選択中" + }, + ranks = { + Ace = "エース", + King = "キング", + Queen = "クイーン", + Jack = "ジャック", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "ベストハンド", + furthest_round = "最高ラウンド", + furthest_ante = "最高アンティ", + most_money = "最多マネー", + boss_streak = "連続最多ボス", + collection = "コレクション", + win_streak = "連勝記録", + current_streak = "", + poker_hand = "最もプレイされたハンド" + }, + poker_hands = { + ['Flush House'] = "フラッシュハウス", + ['Five of a Kind'] = "ファイブカード", + ['Royal Flush'] = "ロイヤルフラッシュ", + ['Straight Flush'] = "ストレートフラッシュ", + ['Four of a Kind'] = "フォーカード", + ['Full House'] = "フルハウス", + ['Flush'] = "フラッシュ", + ['Straight'] = "ストレート", + ['Three of a Kind'] = "スリーカード", + ['Two Pair'] = "ツーペア", + ['Pair'] = "ワンペア", + ['High Card'] = "ハイカード", + ['Flush Five'] = "フラッシュファイブ" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "すべてのカードが同じスーツの", + "スリーカードとワンペア" + }, + ['Five of a Kind'] = { + "同じランクのカード5枚" + }, + ['Royal Flush'] = { + "すべてが同じスーツの", + "ランクが連続したカード5枚" + }, + ['Straight Flush'] = { + "すべてが同じスーツの", + "ランクが連続したカード5枚" + }, + ['Four of a Kind'] = { + "同じランクのカード4枚", + "スコアされないカードが1枚あってもよい" + }, + ['Full House'] = { + "スリーカードとワンペア" + }, + ['Flush'] = { + "同じスーツのカード5枚" + }, + ['Straight'] = { + "ランクが連続したカード5枚" + }, + ['Three of a Kind'] = { + "同じランクのカード3枚", + "スコアされないカードが2枚あってもよい" + }, + ['Two Pair'] = { + "異なるランクのカード2組", + "スコアされないカードが1枚あってもよい" + }, + ['Pair'] = { + "同じランクのカード2枚", + "スコアされないカードが3枚あってもよい" + }, + ['High Card'] = { + "プレイされたハンドが上記のハンドではない場合", + "最もランクの高いカードだけがスコアされる" + }, + ['Flush Five'] = { + "同じランクとスーツのカード5枚" + } + }, + labels = { + common = "コモン", + uncommon = "アンコモン", + rare = "レア", + legendary = "レジェンド", + tarot = "タロット", + planet = "惑星", + pluto_planet = "小惑星", + voucher = "バウチャー", + foil = "フォイル", + holographic = "ホログラム", + polychrome = "ポリクローム", + negative = "ネガティブ", + gold_seal = "ゴールドシール", + locked = "ロック中", + blue_seal = "ブルーシール", + red_seal = "レッドシール", + purple_seal = "パープルシール", + eternal = "エターナル", + pinned_left = "ピン留め" + }, + dictionary = { + b_sell = "売却", + b_use = "使用", + b_select = "選択", + b_buy = "購入", + b_redeem = "引き換え", + b_open = "開封", + b_and_use = "& 使用", + b_next_round_1 = "次の", + b_next_round_2 = "ラウンド", + b_play_hand = "ハンドをプレイ", + b_discard = "ディスカード", + b_sort_hand = "ハンドをソート", + b_run_info_1 = "ラン", + b_run_info_2 = "情報", + b_options = "オプション", + b_reroll_boss = "ボスをリロール", + b_skip_blind = "ブラインドをスキップ", + b_skip_reward = "報酬をスキップ", + b_skip = "スキップ", + b_start_new_run = "新しいラン", + b_main_menu = "メインメニュー", + b_collection = "コレクション", + b_seed = "シード", + b_copy_seed = "シードをコピー", + b_credits = "クレジット", + b_stats = "統計", + b_settings = "設定", + b_set_game = "ゲーム", + b_set_video = "画面表示", + b_set_graphics = "グラフィック", + b_set_audio = "オーディオ", + b_set_gamespeed = "ゲームスピード", + b_set_play_discard_pos = "プレイ/ディスカード ボタンの位置", + b_set_screenshake = "画面の揺れ", + b_set_crash_reports = "クラッシュレポート", + b_set_monitor = "ディスプレイモニター", + b_set_windowmode = "ウィンドウモード", + b_set_apply = "適用", + b_set_master_vol = "マスター音量", + b_set_music_vol = "ミュージック音量", + b_set_game_vol = "ゲーム音量", + b_set_shadows = "影", + b_set_pixel_smoothing = "ピクセルアートのスムージング", + b_set_CRT = "CRT", + b_set_CRT_bloom = "CRTブルーム", + b_stat_jokers = "ジョーカー", + b_stat_consumables = "消耗", + b_stat_tarots = "タロット", + b_stat_planets = "惑星", + b_stat_spectrals = "スペクトル", + b_stat_vouchers = "バウチャー", + b_next = "次", + b_endless = "エンドレスモード", + b_wishlist = "Steamのウィッシュリストに登録", + b_playbalatro = "playbalatro.comに移動する", + b_remaining = "残り", + b_full_deck = "フルデッキ", + b_poker_hands = "ポーカーハンド", + b_blinds = "ブラインド", + b_vouchers = "バウチャー", + b_stake = "ステーク", + b_jokers = "ジョーカー", + b_tarot_cards = "タロットカード", + b_planet_cards = "惑星カード", + b_spectral_cards = "スペクトルカード", + b_enhanced_cards = "強化されたカード", + b_editions = "エディション", + b_booster_packs = "ブースターパック", + b_tags = "タグ", + b_decks = "デッキ", + b_continue = "続ける", + b_back = "戻る", + b_music = "ミュージック", + b_sounds = "サウンド", + b_imagery = "画像", + b_new_run = "新しいラン", + b_challenges = "チャレンジ", + b_current_profile = "現在のプロフィール", + b_load_profile = "プロフィールをロード", + b_create_profile = "プロフィールを作成", + b_delete_profile = "プロフィールを削除", + b_reset_profile = "プロフィールをリセット", + b_rules = "ルール", + b_restrictions = "制限事項", + b_deck = "デッキ", + b_play_cap = "プレイ", + b_options_cap = "オプション", + b_collection_cap = "コレクション", + b_quit_cap = "終了", + b_cash_out = "清算", + k_unknown = "?????", + k_compatible = "適合", + k_incompatible = "不適合", + k_round = "ラウンド", + k_ante = "アンティ", + k_seed = "シード", + k_reroll = "リロール", + k_mult = "倍率", + k_rank = "ランク", + k_suit = "スーツ", + k_stake = "ステーク", + k_common = "コモン", + k_uncommon = "アンコモン", + k_rare = "レア", + k_legendary = "レジェンド", + k_debuffed = "デバフ状態", + k_locked = "ロック中", + k_undisovered = "未発見", + k_joker = "ジョーカー", + k_voucher = "バウチャー", + k_tarot = "タロット", + k_planet = "惑星", + k_dwarf_planet = "小惑星", + k_planet_q = "惑星?", + k_spectral = "スペクトル", + k_booster = "ブースター", + k_edition = "エディション", + k_hud_hands = "ハンド", + k_hud_discards = "ディスカード", + k_lower_score = "スコア", + k_arcana_pack = "アルカナパック", + k_celestial_pack = "天体パック", + k_spectral_pack = "スペクトルパック", + k_standard_pack = "スタンダードパック", + k_buffoon_pack = "道化師パック", + k_enter_text = "テキストを入力", + k_defeated_by = "敗北:", + k_level_prefix = "レベル", + k_also_applied = "適用中", + k_base_cards = "ベースカード", + k_effective = "効果", + k_aces = "エース", + k_face_cards = "フェイスカード", + k_numbered_cards = "ナンバーカード", + k_cap_consumables = "消耗", + k_page = "ページ", + k_ante_cap = "アンティ", + k_base_cap = "ベース", + k_jokers_cap = "ジョーカー", + k_vouchers_cap = "バウチャー", + k_x_base = "X ベース", + k_not_discovered = "未発見", + k_unlocked_ex = "アンロック!", + k_challenge_mode = "チャレンジモード", + k_daily_run = "デイリーラン", + k_profile = "プロフィール", + k_wins = "勝利", + k_empty_caps = "なし", + k_collection = "コレクション", + k_stake_level = "ステークレベル", + k_none = "なし", + k_game_modifiers = "ゲーム編集", + k_custom_rules = "カスタムルール", + k_banned_cards = "使用禁止カード", + k_banned_tags = "使用禁止タグ", + k_other = "その他", + k_money = "資金", + k_best_hand = "ベストハンド", + k_seeded_run = "シードされたラン", + k_enter_seed = "シードを入力", + k_lvl = "レベル", + k_skipped_cap = "スキップ", + k_no_reward = "報酬なし", + k_reward = "報酬", + k_nope_ex = "いいえ!", + k_or = "または", + k_balanced = "バランス", + ph_improve_run = "ランを改善しよう!", + ph_sneak_peek = "プレビュー", + ph_deck_preview_stones = "ストーン", + ph_deck_preview_effective = "ジョーカー、ブラインド、カード強化による実質合計", + ph_blind_score_at_least = "最低スコア", + ph_blind_reward = "報酬:", + ph_up_ante_1 = "アンティを上げる", + ph_up_ante_2 = "すべてのブラインドをレイズ", + ph_up_ante_3 = "ブラインドを更新", + ph_stat_joker = "そのカードで完了した合計ラウンド数", + ph_stat_consumable = "そのカードの使用回数", + ph_stat_voucher = "そのバウチャーが引き換えられた回数", + ph_demo_thanks_1 = "プレイして頂きありがとうございます", + ph_demo_thanks_2 = "BALATRO 体験版", + ph_game_over = "ゲームオーバー", + ph_vouchers_redeemed = "このランで引き換えられたバウチャーの数", + ph_no_vouchers = "このランで引き換えられたバウチャーなし", + ph_defeat_this_blind_1 = "それを見つけるために", + ph_defeat_this_blind_2 = "このブラインドを倒す", + ph_click_confirm = "もう一度クリックして確認", + ph_choose_blind_1 = "あなたの次のブラインドを", + ph_choose_blind_2 = "選択してください", + ph_mr_bones = "ミスターボーンズで死を回避", + ph_score_at_least = "最低スコア", + ph_all_poker_hand = "すべてのポーカーハンド", + ph_1_level = "+1レベル", + ph_boss_disabled = "ボスは無効!", + ph_most_played = "(最もプレイされたハンド)", + ml_demo_thanks_message = { + "BalatroをSteamのウィッシュリストに登録し", + "playbalatro.comにサインアップして", + "ニュースレターに登録してください" + }, + ml_eternal = { + "エターナル", + "売ることも", + "壊すこともできない" + }, + ml_gold_seal_desc = { + "ゴールドシール", + "プレイされた時", + "手札に戻す" + }, + ml_crash_report_info = { + "クラッシュレポートは開発者に送信され", + "今後の問題解決に役立てられます", + "識別情報や個人情報は送信されません" + }, + ml_play_discard_pos_opt = { + "ディスカード/プレイ", + "プレイ/ディスカード" + }, + ml_windowmode_opt = { + "ウィンドウ", + "フルスクリーン", + "ボーダーレス" + }, + ml_vsync_opt = { + "垂直同期オン", + "垂直同期オフ" + }, + ml_shadow_opt = { + "オン", + "オフ" + }, + ml_smoothing_opt = { + "オフ", + "オン" + }, + ml_bloom_opt = { + "オフ", + "オン" + }, + ml_card_stats = { + "カード", + "統計" + }, + ml_paste_seed = { + "貼り付け", + "シード" + }, + ml_disabled_seed = { + "すべてのアンロックと", + "発見が無効化" + }, + ['$'] = "$", + k_redeemed_ex = "引き換え!", + k_duplicated_ex = "重複!", + k_no_room_ex = "空きなし!", + k_no_space_ex = "スペースなし!", + k_no_other_jokers = "他のジョーカーなし!", + k_plus_tarot = "+1 タロット", + k_plus_stone = "+1 ストーン", + k_plus_planet = "+1 惑星", + k_plus_spectral = "+1 スペクトル", + k_active_ex = "アクティブ!", + k_level_up_ex = "レベルアップ!", + k_upgrade_ex = "アップグレード!", + k_again_ex = "再び!", + k_val_up = "バリューアップ!", + k_reset = "リセット", + k_extinct_ex = "全滅!", + k_safe_ex = "セーフ!", + k_saved_ex = "セーブ!", + k_swapped_ex = "スワップ!", + k_copied_ex = "コピー!", + k_melted_ex = "メルト!", + b_copy = "コピー", + b_high_contrast_cards = "ハイコントラストカード", + b_set_rumble = "コントローラーの振動", + b_seals = "シール", + b_new_challenge = "新しいチャレンジをスタート", + b_unlock_all = "すべてをアンロック", + k_active = "アクティブ", + k_deck = "デッキ", + k_progress = "進行状況", + k_challenges = "チャレンジ", + k_joker_stickers = "ジョーカーステッカー", + k_deck_stake_wins = "デッキステーク勝利数", + k_enter_name = "名前を入力", + k_gold = "ゴールド", + k_card_stats = "カード統計", + k_view = "表示", + k_all_hands = "すべてのハンド", + k_high_score_ex = "ハイスコア!", + k_demo_version_ex = "体験版!", + k_playing_as = "プレイヤー", + k_choose = "選択", + k_achievements_disabled = "実績が無効化", + ph_no_boss_active = "アクティブなボスなし", + ph_you_win = "勝利!", + ph_you_win_demo = "体験版に勝利!", + ph_defeat_the_boss = "ボスブラインドを倒す", + ph_score_furthest_ante = "アンティ", + ph_score_furthest_round = "ラウンド", + ph_score_hand = "ベストハンド", + ph_score_poker_hand = "最もプレイされたハンド", + ph_score_new_collection = "新発見", + ph_score_cards_played = "プレイしたカードの枚数", + ph_score_cards_discarded = "ディスカードしたカードの枚数", + ph_score_times_rerolled = "リロールした回数", + ph_score_cards_purchased = "購入したカードの枚数", + ml_edition_seal_enhancement_explanation = { + "カードはそれぞれ、強化、エディション、", + "シールを1つずつ持つことができます" + }, + ml_unlock_all_explanation = { + "警告! コンプリートコレクションをアンロックすると", + "このプロフィールの実績が無効になります!" + }, + k_plus_joker = "+1 ジョーカー", + k_eaten_ex = "食べられた!", + k_eroded_ex = "横取りされた!", + k_achievement = "実績", + ph_unscored_hand = "ハンドがスコアされない", + ph_alert_debuff_confirm = "もう一度「プレイ」を押して確認", + k_drank_ex = "ドランク!", + k_trophy = "トロフィー", + k_trophies_disabled = "トロフィーの無効化", + ml_unlock_all_trophies = { + "警告! コンプリートコレクションをアンロックすると", + "このプロフィールのトロフィーが無効になります!" + }, + k_poker_hand = "ポーカーハンド", + ph_4_7_of_clubs = "4x クラブの7" + }, + v_dictionary = { + a_xmult = "倍率 X#1#", + a_mult = "倍率 +#1#", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# ハンドサイズ", + a_hands = "+#1# ハンド", + a_sold_tally = "#1#/#2# 売却済", + a_remaining = "残り #1#", + ante_x_voucher = "アンティ #1# のバウチャー", + loyalty_active = "アクティブ!", + loyalty_inactive = "残り #1#", + deck_preview_wheel_singular = "#1# 枚が裏向きでドローされたため、数字が小さくなる可能性があります", + deck_preview_wheel_plural = "#1# 枚が裏向きでドローされたため、数字が小さくなる可能性があります", + challenges_completed = "チャレンジ完了 #1#/#2#", + interest = "$#2# につき利息 #1# (最大 #3#)", + remaining_hand_money = "残りのハンド(各$#1# )", + remaining_discard_money = "残りのディスカード(各$#1# )", + ml_foil_desc = { + "フォイル", + "+#1# チップ" + }, + ml_holo_desc = { + "ホログラム", + "+#1# 倍率" + }, + ml_polychrome_desc = { + "ポリクローム", + "倍率 X#1#" + }, + ml_negative_desc = { + "ネガティブ", + "すべてのラウンドで" + }, + a_mult_minus = "倍率 -#1#", + a_handsize_minus = "ハンドサイズ -#1#", + ml_negative_consumable_desc = { + "ネガティブ", + "+#1# 消耗スロット" + }, + a_xmult_minus = "倍率 -X#1#", + unlocked = "アンロック済#1#/#2#", + completed = "完了#1#/#2#" + }, + v_text = { + ch_m_dollars = { + "{C:money}$#1#{} でスタート" + }, + ch_m_hands = { + "ラウンドごとにハンド {C:blue}#1#{}" + }, + ch_m_discards = { + "ラウンドごとにディスカード {C:red}#1#{}" + }, + ch_m_reroll_cost = { + "リロールの基本コスト {C:money}$#1#{}" + }, + ch_m_joker_slots = { + "ジョーカースロット {C:attention}#1#{}" + }, + ch_m_consumable_slots = { + "消耗スロット {C:attention}#1#{}" + }, + ch_m_hand_size = { + "ハンドサイズ{C:attention}#1#{}" + }, + ch_m_none = { + "{C:inactive}なし" + }, + ch_c_no_reward = { + "すべての {C:attention}ブラインド{} が報奨金を与えない" + }, + ch_c_no_reward_specific = { + "{C:attention}#1#のブラインド{} が報奨金を与えない" + }, + ch_c_no_extra_hand_money = { + "追加の {C:blue}ハンド{} では資金が得られない" + }, + ch_c_no_interest = { + "ラウンド終了時に {C:attention}利息{} を得ない" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}デイリーチャレンジ!" + }, + ch_c_set_seed = { + "シードを設定して1回試行: {C:inactive}{非表示}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}チップ{} が現在の {C:money}${} を超えることはできない" + }, + ch_c_none = { + "{C:inactive}なし" + }, + ch_c_inflation = { + "永久的に、購入するたびに{C:money}$1{} 値上がりする" + }, + ch_c_discard_cost = { + "ディスカードのたびに {C:money}$#1#{} の費用がかかる" + }, + ch_c_all_eternal = { + "すべてのショップのジョーカーが {C:eternal}エターナル{}" + }, + ch_c_flipped_cards = { + "{C:green}#1#枚につき1枚{} は裏向きでドローされる" + }, + ch_c_minus_hand_size_per_X_dollar = { + "所持金 {C:money}$#1#{} ごとにハンド {C:red}-1{} 枚" + }, + ch_c_no_shop_jokers = { + "ジョーカーが今後{C:attention}ショップ{} に出現しない" + }, + ch_c_debuff_played_cards = { + "{C:attention}プレイした{} すべてのカードに、スコア後{C:attention}デバフ{} がかかる" + }, + ch_c_set_eternal_ante = { + "アンティが{C:attention}#1#{} の時にボスを倒すと、すべてのジョーカーが{C:attention}エターナルになる{}" + }, + ch_c_set_joker_slots_ante = { + "アンティが{C:attention}#1#{} の時にボスを倒すと、ジョーカーのスロットが{C:attention}0{} になる" + } + }, + tutorial = { + sb_1 = { + "やあ! 私は {C:attention}Jimbo{}", + "きみにこのゲームのプレイ方法を", + "説明しよう!" + }, + sb_2 = { + "きみの目標は", + "{C:blue}チップ{} を獲得して", + "敵の {C:attention}ブラインド{} を倒すことだ。" + }, + sb_3 = { + "これは {C:blue}スモールブラインド{}。", + "{C:attention}300 チップ{} 獲得すれば", + "倒すことができる。" + }, + sb_4 = { + "{C:blue}スモールブラインド{} を選択して", + "ラウンドをスタートしよう!" + }, + bb_1 = { + "{C:attention}ビッグブラインド{} を選択すると", + "キャッシュをいくらか獲得できる。" + }, + bb_2 = { + "もしくは {C:attention}スキップ{} を選択して", + "{C:attention}タグ{} を取得することもできるんだ!", + "{C:attention}タグ{} はそれぞれ特殊効果を持っている。" + }, + bb_3 = { + "しかし {C:attention}ボスブラインド{} には", + "気をつけよう。", + "ボスブラインドの能力に対抗するには", + "戦略が必要になる。" + }, + bb_4 = { + "ボスブラインドを倒すと", + "{C:attention}アンティ{} が上がり", + "すべての {C:attention}ブラインド{} が難しくなる。" + }, + bb_5 = { + "{C:attention}アンティ{} #1# を破って勝利しよう。", + "さあ 自分の道を選ぼう!" + }, + fh_1 = { + "{C:attention}ポーカーハンド{} をプレイして", + "チップを獲得しよう。" + }, + fh_2 = { + "それぞれの {C:attention}ポーカーハンド{} は", + "{C:blue}チップ{} の基本値に", + "{C:red}倍率{} をかけた額を獲得する。" + }, + fh_3 = { + "{C:attention}ラン情報{} エリアで", + "{C:attention}ポーカーハンド{} を確認しよう。", + "現在のランに関する", + "その他の情報もある。" + }, + fh_4 = { + "カードでも {C:blue}チップ{} を", + "獲得することができる。", + "カーソルを合わせて確認しよう!" + }, + fh_5 = { + "プレイするカードを", + "{C:attention}5{} 枚まで選んで", + "{C:blue}「プレイハンド」{} を押そう。" + }, + fh_6 = { + "選択したカードを{C:attention}5{}枚まで", + "{C:red}「ディスカード」{} することもできる。", + "さらに強いハンドを作れるかもしれない。", + "やってみよう!" + }, + fh_7 = { + "ラウンドごとに使用できる {C:blue}ハンド{} と", + "{C:red}ディスカード{} の回数には", + "限りがあるから注意しよう!" + }, + fh_8 = { + "{C:blue}ハンド{} がなくなる前に", + "{C:attention}300チップ{} 獲得して", + "このラウンドに勝利しよう。", + "応援しているよ!" + }, + sh_1 = { + "カードが増えた時には", + "それらを並べ替えることができる。", + "{C:attention}ジョーカー{} は左から右の順に", + "発動する。" + }, + sh_2 = { + "そして消耗カードは", + "必ず {C:attention}使用{} するんだ!" + }, + sh_3 = { + "手札を {C:attention}2{} 枚まで選んだら", + "{C:tarot}タロット{} カードの", + "{C:attention}「使用」{} を押して", + "それらを強化しよう!" + }, + s_1 = { + "うまくいったね!さあ 次は", + "{C:money}キャッシュ{} が{E:1}たまった{} から", + "{C:attention}ショップ{} で新しいカードを", + "購入しよう。" + }, + s_2 = { + "このハンサムな", + "悪魔を買ってみよう。" + }, + s_3 = { + "これはきみのランに加えることができる", + "{C:attention}#1#{} 種類の {C:attention}ジョーカー{} のうちの1つだ。", + "それぞれの {C:attention}ジョーカー{} は", + "異なる効果を持っている。" + }, + s_4 = { + "これはきみがプレイするハンドに", + "{C:red}倍率 +4{} を加えるぞ!" + }, + s_5 = { + "{C:attention}ジョーカー{} は 同時に {C:attention}5{} 枚しか", + "持つことができないから", + "注意しよう。" + }, + s_6 = { + "{C:attention}ショップ{} でもう1枚", + "カードを購入しよう。" + }, + s_7 = { + "この {C:tarot}タロット{} カードは", + "{C:attention}消耗{} カードだ。", + "きみのトランプを強化してくれるから", + "持っておこう。" + }, + s_8 = { + "{C:attention}消耗{} カードは", + "同時に {C:attention}2{} 枚", + "持つことができる。" + }, + s_9 = { + "十分な資金があれば", + "{C:attention}バウチャー{} を買うことができる。", + "{C:attention}バウチャー{} を使用すると", + "ランをアップグレードできるんだ!" + }, + s_10 = { + "{C:attention}バウチャー{} は", + "{C:attention}ボスブラインド{} を倒すと", + "再び補充される。" + }, + s_11 = { + "各ショップにある {C:booster}ブースターパック{} も", + "チェックしておこう。", + "{C:booster}ブースターパック{} には", + "いろいろなグッズが入っているんだ!" + }, + s_12 = { + "準備ができたら", + "{C:attention}次のラウンド{} に進もう。" + } + }, + achievement_names = { + ante_up = "アンティアップ!", + ante_upper = "アンティアッパー!", + heads_up = "ヘッドアップ", + low_stakes = "ローステーク", + mid_stakes = "ミッドステーク", + high_stakes = "ハイステーク", + card_player = "カードプレイヤー", + card_discarder = "カードディスカーダー", + nest_egg = "ネストエッグ", + flushed = "フラッシュ", + speedrunner = "スピードランナー", + roi = "ROI", + shattered = "シャッター", + royale = "ロワイヤル", + retrograde = "レトログレード", + _10k = "10K", + _1000k = "1,000K", + _100000k = "100,000K", + tiny_hands = "タイニーハンド", + big_hands = "ビッグハンド", + you_get_what_you_get = "得られるものを得よ", + rule_bender = "ルールベンダー", + rule_breaker = "ルールブレイカー", + legendary = "レジェンド", + astronomy = "天文学", + cartomancy = "カード占い", + clairvoyance = "透視能力", + extreme_couponer = "エクストリームクーポナー", + completionist = "完全主義者", + completionist_plus = "完全主義者+", + completionist_plus_plus = "完全主義者++" + }, + achievement_descriptions = { + ante_up = "アンティ4に到達する", + ante_upper = "アンティ8に到達する", + heads_up = "ランに勝利する", + low_stakes = "レッドステーク以上の難易度でランに勝利する", + mid_stakes = "ブラックステーク以上の難易度でランに勝利する", + high_stakes = "ゴールドステーク以上の難易度でランに勝利する", + card_player = "2500枚以上のカードをプレイする", + card_discarder = "2500枚以上のカードをディスカードする", + nest_egg = "1回のランで$400以上獲得する ", + flushed = "ワイルドカード5枚でフラッシュをプレイする", + speedrunner = "12ラウンド以内にランに勝利する", + roi = "アンティ4でバウチャーを5購入する", + shattered = "1回のハンドで2枚のグラスカードを割る", + royale = "ロイヤルフラッシュをプレイする", + retrograde = "いずれかのポーカーハンドをレベル10にする", + _10k = "1回のハンドでチップ10,000をスコアする", + _1000k = "1回のハンドでチップ1,000,000をスコアする", + _100000k = "1回のハンドでチップ100,000,000をスコアする", + tiny_hands = "デッキを20枚以下にする", + big_hands = "デッキを80枚以上にする", + you_get_what_you_get = "ショップをリロールせずにランに勝利する", + rule_bender = "いずれかのチャレンジランを完了する", + rule_breaker = "すべてのチャレンジランを完了する", + legendary = "レジェンドジョーカーを発見する", + astronomy = "すべての惑星カードを発見する", + cartomancy = "すべてのタロットカードを発見する", + clairvoyance = "すべてのスペクトルカードを発見する", + extreme_couponer = "すべてのバウチャーを発見する", + completionist = "コレクションを100%にする", + completionist_plus = "ゴールドステークの難易度ですべてのデッキで勝利する", + completionist_plus_plus = "すべてのジョーカーでゴールドステッカーを獲得する" + }, + quips = { + wq_1 = { + "カンペキだ!" + }, + wq_2 = { + "うまく対応したね!", + " " + }, + wq_3 = { + "どうやらブラフじゃ", + "なかったようだね!" + }, + wq_4 = { + "残念だけど", + "このチップはすべて", + "バーチャルなんだ…" + }, + wq_5 = { + "私が教えたことを", + "しっかり覚えているね!" + }, + wq_6 = { + "すばらしいプレイが", + "いくつもあったよ!" + }, + wq_7 = { + "きみに賭けなくて", + "よかったよ!", + " " + }, + lq_1 = { + "もっと簡単なカードゲームの方が", + "私たちのスピードには", + "合っているのかもしれない…" + }, + lq_2 = { + "楽な相手だ!", + " " + }, + lq_3 = { + "いったん引いて", + "再挑戦しよう!", + " " + }, + lq_4 = { + "ギャンブルでは", + "そう簡単には", + "勝てないんだ!" + }, + lq_5 = { + "どうやら本物の", + "ジョーカーが誰なのか", + "わかったぞ!" + }, + lq_6 = { + "おっと、きみも", + "ブラフだったのか?" + }, + lq_7 = { + "どうやら冗談は", + "通じないらしい!" + }, + lq_8 = { + "もし私に手があったら", + "目を覆うところだったよ!", + " " + }, + lq_9 = { + "私は文字通りの", + "愚か者なんだ", + "そうだろう?" + }, + lq_10 = { + "大失敗だ!" + }, + dq_1 = { + "マズイぞ! この", + "ファイナルチャレンジ", + "のために何か対策を", + "打たなければ!" + } + }, + challenge_names = { + c_omelette_1 = "オムレツ", + c_city_1 = "15分都市", + c_rich_1 = "大富豪", + c_knife_1 = "紙一重", + c_xray_1 = "透視能力", + c_mad_world_1 = "狂気の世界", + c_luxury_1 = "ぜいたく税", + c_non_perishable_1 = "保存食", + c_medusa_1 = "メデューサ", + c_double_nothing_1 = "一か八か", + c_typecast_1 = "はまり役", + c_inflation_1 = "インフレ", + c_bram_poker_1 = "ブラムポーカー", + c_fragile_1 = "フラジャイル", + c_monolith_1 = "一枚岩", + c_blast_off_1 = "吹き飛ばし", + c_five_card_1 = "ファイブカードドロー", + c_golden_needle_1 = "ゴールデンニードル", + c_cruelty_1 = "残虐", + c_jokerless_1 = "ジョーカーなし" + } + } +} \ No newline at end of file diff --git a/localization/ko.lua b/localization/ko.lua new file mode 100644 index 0000000..0c52de9 --- /dev/null +++ b/localization/ko.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "조커", + text = { + "{C:red,s:1.1}+#1#{} 배수" + } + }, + j_jolly = { + name = "쾌활한 조커", + text = { + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "{C:red}+#1#{} 배수" + } + }, + j_zany = { + name = "엉뚱한 조커", + text = { + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "{C:red}+#1#{} 배수" + } + }, + j_mad = { + name = "미친 조커", + text = { + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "{C:red}+#1#{} 배수" + } + }, + j_crazy = { + name = "정신 나간 조커", + text = { + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "{C:red}+#1#{} 배수" + } + }, + j_droll = { + name = "괴짜 조커", + text = { + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "{C:red}+#1#{} 배수" + } + }, + j_half = { + name = "반쪽 조커", + text = { + "플레이한 핸드에", + "카드가 {C:attention}#2#{} 장 이하면", + "{C:red}+#1#{} 배수" + } + }, + j_fortune_teller = { + name = "점쟁이", + text = { + "사용한 {C:purple}타로{} 카드당", + "{C:red}+#1#{} 배수", + "{C:inactive}(현재 {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "저글러", + text = { + "{C:attention}+#1#{} 핸드 크기" + } + }, + j_drunkard = { + name = "술고래", + text = { + "{C:red}+#1#{} 버리기" + } + }, + j_stone = { + name = "스톤 조커", + text = { + "풀 덱에{C:attention}스톤{} 카드가 있을 때마다", + "이 조커는", + "{C:chips}+#1#{} 개의 칩을 획득합니다", + "{C:inactive}(현재 {C:chips}+#2#{C:inactive}개의 칩)" + } + }, + j_golden = { + name = "골든 조커", + text = { + "라운드 종료 시", + "{C:money}$#1#{} 를 획득합니다" + } + }, + j_stencil = { + name = "조커 스텐실", + text = { + "{s:0.8}조커 스텐실이 포함된", + "빈 {C:attention}조커{} 슬롯마다", + "{X:red,C:white} X1 {} 배수", + "{C:inactive}(현재 {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "네 개의 손가락", + text = { + "모든 {C:attention}플러시{} 와", + "{C:attention}스트레이트{} 를", + "{C:attention}4{} 장의 카드로 만듭니다" + } + }, + j_mime = { + name = "마임", + text = { + "{C:attention}핸드에", + "{C:attention}있는{} 모든 카드 능력을", + "다시 트리거합니다" + } + }, + j_credit_card = { + name = "신용 카드", + text = { + "부채를", + "최대 {C:red}-$#1#{} 합니다" + } + }, + j_greedy_joker = { + name = "탐욕스러운 조커", + text = { + "{C:diamonds}#2#{} 수트와 함께", + "카드를 플레이할 때마다", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다" + } + }, + j_lusty_joker = { + name = "건장한 조커", + text = { + "{C:hearts}#2#{} 수트와 함께", + "카드를 플레이할 때마다", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다" + } + }, + j_wrathful_joker = { + name = "격노한 조커", + text = { + "{C:spades}#2#{} 수트와 함께", + "카드를 플레이할 때마다", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다" + } + }, + j_gluttenous_joker = { + name = "게걸스러운 조커", + text = { + "{C:clubs}#2#{} 수트와 함께", + "카드를 플레이할 때마다", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다" + } + }, + j_ceremonial = { + name = "의식용 단검", + text = { + "{C:attention}블라인드{}가 선택되면,", + "오른쪽의 조커를 파괴하고", + "이 {C:red} 배수{}에 그 판매 가치를", + " {C:attention}두 배{}로 영구적으로 추가합니다", + "{C:inactive}(현재 {C:mult}+#1#{C:inactive} 배수)" + } + }, + j_banner = { + name = "현수막", + text = { + "남은", + "{C:attention}버리기{} 마다", + "{C:chips}+#1#{} 개의 칩" + } + }, + j_mystic_summit = { + name = "신비의 정점", + text = { + "남은 버리기가", + "{C:attention}#2#{} 번일 때", + "{C:mult}+#1#{} 배수" + } + }, + j_marble = { + name = "마블 조커", + text = { + "{C:attention}블라인드{}가 선택되면", + "덱에", + "{C:attention}스톤{} 카드를 1장 추가합니다" + } + }, + j_loyalty_card = { + name = "로열티 카드", + text = { + "{C:attention}#2#{} 번의 핸드를 플레이할 때마다", + "{X:red,C:white} X#1# {} 배수", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "8볼", + text = { + "플레이한 핸드에", + "{C:attention}8{}이 {C:attenetion}#1#{} 장 이상 있으면 ", + "{C:planet}행성{} 카드 한 장이 생성됩니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + j_misprint = { + name = "오탈자", + text = { + "" + } + }, + j_dusk = { + name = "땅거미", + text = { + "라운드의 {C:attention}최종 핸드{} 에서", + "플레이한 모든 카드를", + "다시 트리거합니다" + } + }, + j_raised_fist = { + name = "들어 올린 주먹", + text = { + "핸드에 보유한 {C:attention}가장 낮은{} 카드의", + "랭크에 {C:attention}두 배{} 를", + "배수에 추가합니다" + } + }, + j_chaos = { + name = "혼돈의 광대", + text = { + "상점당", + "{C:green}#1#{} 무료 {C:green}리롤" + } + }, + j_fibonacci = { + name = "피보나치", + text = { + "득점할 때", + "{C:attention}에이스{}, {C:attention}2{}, {C:attention}3{}, {C:attention}5{} 또는 {C:attention}8{} 마다", + "{C:mult}+#1#{} 배수를 제공합니다" + } + }, + j_steel_joker = { + name = "스틸 조커", + text = { + "{C:attention}스틸{} 카드가", + "풀 덱에 있을 때마다", + "이 조커는 {X:mult,C:white} X#1# {} 배수를 확득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + } + }, + j_scary_face = { + name = "무서운 얼굴", + text = { + "득점할 때", + "{C:attention}그림{} 카드가", + "{C:chips}+#1#{} 개의 칩을 제공합니다" + } + }, + j_abstract = { + name = "추상화 조커", + text = { + "{C:attention}조커{} 카드마다", + "{C:mult}+#1#{} 배수", + "{C:inactive}(현재 {C:red}+#2#{C:inactive} 배수)" + } + }, + j_delayed_grat = { + name = "늦춰진 희열", + text = { + "라운드가 끝날 때까지", + "버리기를 사용하지 않으면", + "{C:attention}버리기{}당 {C:money}$#1#{}를 획득합니다" + } + }, + j_hack = { + name = "사기꾼", + text = { + "플레이할 때마다", + "{C:attention}2{}, {C:attention}3{},", + "{C:attention}4{} 또는 {C:attention}5{} 카드를 다시 트리거합니다" + } + }, + j_pareidolia = { + name = "환각", + text = { + "모든 카드가", + "{C:attention}그림{} 카드로", + "취급됩니다" + } + }, + j_gros_michel = { + name = "그로 미셸", + text = { + "{C:mult}+#1#{} 배수", + "라운드가 끝날 때", + "{C:green}#2# / #3#{} 의 확률로", + "이 카드가 파괴됩니다" + } + }, + j_even_steven = { + name = "이븐 스티븐", + text = { + "{C:attention}짝수{} 랭크로", + "플레이한 카드는", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "오드 토드", + text = { + "{C:attention}홀수{} 랭크로", + "플레이한 카드는", + "득점 시 {C:chips}+#1#{} 개의 칩을 제공합니다", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "학자", + text = { + "플레이할 때", + "각 에이스가", + "득점 시 추가 {C:mult}+#1#{} 배수 및", + "{C:chips}+#2#{}개의 칩을 제공합니다" + } + }, + j_business = { + name = "명함", + text = { + "플레이할 때", + "{C:attention}그림{} 카드가", + "득점 시 {C:money}$2{}를 제공합니다" + } + }, + j_supernova = { + name = "초신성", + text = { + "{C:attention}포커 핸드{} 가 플레이된", + "횟수를 배수에", + "추가합니다" + } + }, + j_ride_the_bus = { + name = "버스 탑승", + text = { + "{C:attention}그림{} 카드 득점 없이", + "플레이한", + "연속 핸드마다", + "{C:mult}+#1#{} 배수", + "{C:inactive}(현재 {C:mult}+#2#{C:inactive} 배수)" + } + }, + j_space = { + name = "스페이스 조커", + text = { + "{C:green}#1# / #2#{} 의 확률로", + "플레이한 {C:attention}포커 핸드{} 레벨을", + "업그레이드합니다" + } + }, + j_egg = { + name = "알", + text = { + "라운드 종료 시", + "{C:money}$#1#{} 의", + "{C:attention}판매 가치{} 를 획득합니다" + } + }, + j_burglar = { + name = "절도범", + text = { + "{C:attention}블라인드{} 를 선택하면,", + "{C:blue}+#1#{} 핸드를 얻고", + "{C:attention}버리기를 모두 잃습니다" + } + }, + j_blackboard = { + name = "칠판", + text = { + "핸드에 있는 모든 카드가", + "{C:spades}#2#{} 또는 {C:clubs}#3#{} 인 경우", + "{X:red,C:white} X#1# {} 배수" + } + }, + j_runner = { + name = "주자", + text = { + "플레이한 핸드에", + "{C:attention}스트레이트{}가 있으면", + "{C:chips}+#2#{}개의 칩을 획득합니다", + "{C:inactive}(현재 {C:chips}+#1#{C:inactive}개의 칩)" + } + }, + j_ice_cream = { + name = "아이스크림", + text = { + "{C:chips}+#1#{} 개의 칩", + "핸드를 플레이할 때마다", + "{C:chips}-#2#{} 개의 칩" + } + }, + j_dna = { + name = "DNA", + text = { + "라운드의 {C:attention}첫 핸드{} 에", + "{C:attention}1{} 장의 카드만 있으면,", + "덱에 복사 카드를 영구적으로 추가하고", + "{C:attention}핸드{}로 뽑습니다" + } + }, + j_splash = { + name = "첨벙", + text = { + "{C:attention}플레이한 카드{} 가 모두", + "득점에 계산됩니다" + } + }, + j_blue_joker = { + name = "블루 조커", + text = { + "{C:attention}덱{} 에 남은 각 카드마다", + "{C:chips}+#1#{} 개의 칩", + "{C:inactive}(현재 {C:chips}+#2#{C:inactive} 개의 칩)" + } + }, + j_sixth_sense = { + name = "육감", + text = { + "라운드의 {C:attention}첫 번째{} 카드가", + "싱글 {C:attention}6{}이면, 그걸 파괴하고", + "{C:spectral}유령{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + j_constellation = { + name = "별자리", + text = { + "사용한 {C:planet}행성{} 카드당", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + } + }, + j_hiker = { + name = "도보 여행자", + text = { + "{C:attention}카드{}를 플레이할 때마다", + "득점 시 영구적으로", + "{C:chips}+#1#{} 개의 칩을 획득합니다" + } + }, + j_faceless = { + name = "얼굴 없는 조커", + text = { + "{C:attention}#2#{} 장 이상의", + "{C:attention}그림 카드{} 를 동시에", + "버리면", + "{C:money}$#1#{} 를 획득합니다" + } + }, + j_green_joker = { + name = "그린 조커", + text = { + "플레이한 핸드당 {C:mult}+#1#{} 배수", + "버리기당 {C:mult}-#2#{} 배수", + "{C:inactive}(현재 {C:mult}+#3#{C:inactive} 배수)" + } + }, + j_superposition = { + name = "중첩", + text = { + "포커 핸드에", + "{C:attention}에이스{} 및 {C:attention}스트레이트{}가 있으면,", + "{C:tarot}타로{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + j_todo_list = { + name = "할 일 목록", + text = { + "{C:attention}포커 핸드{} 가 {C:attention}#2#{} 인 경우", + "{C:money}$#1#{} 를 획득하며,", + "포커 핸드는 돈을 획득할 때마다", + "매번 변경됩니다" + } + }, + j_ticket = { + name = "골든 티켓", + text = { + "{C:attention}골드{} 카드를 플레이할 때마다", + "득점 시 {C:money}$#1#{} 를 획득합니다" + }, + unlock = { + "{C:attention,E:1}골드{} 카드만 포함된", + "5장 카드의 핸드로", + "플레이합니다" + } + }, + j_mr_bones = { + name = "미스터 본즈", + text = { + "획득한 칩이", + "필요한 칩의", + "{C:attention}25%{} 이상인 경우", + "죽음을 막습니다", + "{S:1.1,C:red,E:2}자멸{}" + }, + unlock = { + "{C:attention,E:1}#1#{} 런을 패배합니다", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "곡예사", + text = { + "라운드의 {C:attention}최종 핸드{} 에서", + "{X:red,C:white} X#1# {} 배수" + }, + unlock = { + "핸드를 {C:attention,E:1}#1#{} 번 플레이합니다", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "희극과 비극", + text = { + "플레이한 모든 {C:attention}그림", + "카드를 다시 트리거합니다" + }, + unlock = { + "총 {C:attention,E:1}#1#{} 장의 그림 카드를", + "플레이합니다", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "깡패", + text = { + "이 카드에 남은 보유한 모든 {C:attention}조커{}의", + "판매 가치에 {C:attention}두 배{}를", + "배수에 추가합니다", + "{C:inactive}(현재 {C:mult}+#1#{C:inactive} 배수)" + }, + unlock = { + "총 {C:attention,E:1}#1#{} 장의 조커 카드를", + "판매합니다", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "음유시인", + text = { + "{C:attention}+#1#{} 핸드 크기,", + "라운드당 {C:red}-#2# {} 핸드" + }, + unlock = { + "단 한 번의 핸드만", + "플레이하여", + "연속으로 {C:attention,E:1}#1#{} 회의 라운드를 승리합니다" + } + }, + j_certificate = { + name = "증명서", + text = { + "라운드가 시작할 때,", + "무작위로 무작위의 {C:attention}플레잉", + "{C:attention}카드{}를 추가합니다", + "{C:attention}봉인{}을 추가합니다" + }, + unlock = { + "{C:attention,E:1}금 봉인{} 이 있는", + "골드 플레잉 카드를", + "보유합니다" + } + }, + j_smeared = { + name = "얼룩진 조커", + text = { + "{C:diamonds}하트{} 와 {C:diamonds}다이아몬드{} 가", + "같은 수트로 취급되며,", + "{C:spades}스페이드{} 와 {C:spades}클럽{} 이", + "같은 수트로 취급됩니다" + }, + unlock = { + "덱에 최소 {C:attention}#1#{} 장의", + "{E:1,C:attention}#2#{} 을(를)", + "보유합니다" + } + }, + j_throwback = { + name = "회귀", + text = { + "이 런을 건너뛴 {C:planet}블라인드{} 당", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + }, + unlock = { + "메인 메뉴에서", + "저장된 런으로 계속합니다" + } + }, + j_hanging_chad = { + name = "종이 구멍", + text = { + "득점에 사용된 {C:attention}첫 번째{} 플레이한", + "카드를 다시 트리거합니다" + }, + unlock = { + "{E:1,C:attention}#1#{} (으)로", + "보스 블라인드를 물리칩니다" + } + }, + j_rough_gem = { + name = "원석", + text = { + "{C:diamonds}다이아몬드{} 수트의", + "카드를 플레이할 때마다", + "득점 시 {C:money}$#1#{}를 획득합니다" + }, + unlock = { + "덱에서", + "{E:1,C:attention}#2#{} 수트의", + "카드를 최소 {E:1,C:attention}#1#{} 장 보유합니다" + } + }, + j_bloodstone = { + name = "혈석", + text = { + "{C:hearts}하트{} 수트의", + "카드를 플레이할 때마다", + "{C:green}#1#/#2#{} 확률", + "{X:mult,C:white} X#3# {} 배수를 제공하며," + }, + unlock = { + "덱에서", + "{E:1,C:attention}#2#{} 수트의", + "카드를 최소 {E:1,C:attention}#1#{} 장 보유합니다" + } + }, + j_arrowhead = { + name = "화살촉", + text = { + "{C:spades}스페이드{} 수트의", + "카드를 플레이할 때마다", + "득점 시 {C:chips}+#1#{} 개의 칩" + }, + unlock = { + "덱에서", + "{E:1,C:attention}#2#{} 수트의", + "카드를 최소 {E:1,C:attention}#1#{} 장 보유합니다" + } + }, + j_onyx_agate = { + name = "오닉스 아게이트", + text = { + "{C:clubs}클럽{} 수트의", + "카드를 플레이할 때마다", + "득점 시 {C:mult}+#1#{} 배수를 제공합니다" + }, + unlock = { + "덱에서", + "{E:1,C:attention}#2#{} 수트의", + "카드를 최소 {E:1,C:attention}#1#{} 장 보유합니다" + } + }, + j_glass = { + name = "글래스 조커", + text = { + "파괴되는 모든", + "{C:attention}글래스 카드{} 마다", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + }, + unlock = { + "덱에 최소", + "{E:1,C:attention}#1#{} 장의", + "{E:1,C:attention}#2#{} 을(를) 보유합니다" + } + }, + j_ring_master = { + name = "링 마스터", + text = { + "{C:attention}조커{}, {C:tarot}타로{}, {C:planet}행성{}", + "그리고 {C:spectral}유령{} 카드가", + "여러 번 나타납니다" + }, + unlock = { + "앤티", + "레벨 {E:1,C:attention}#1#{} 을(를) 달성합니다" + } + }, + j_flower_pot = { + name = "화분", + text = { + "플레이한 핸드에", + "득점하는 {C:diamonds}다이아몬드{} 카드, {C:clubs}클럽{} 카드가 있으면", + "{X:mult,C:white} X#1# {} 배수", + "{C:hearts}하트{} 카드, {C:spades}스페이드{} 카드" + }, + unlock = { + "앤티", + "레벨 {E:1,C:attention}#1#{} 을(를) 달성합니다" + } + }, + j_blueprint = { + name = "청사진", + text = { + "오른쪽 {C:attention}조커{} 의", + "능력을 복사합니다" + }, + unlock = { + "런을 승리합니다" + } + }, + j_wee = { + name = "아주 작은 조커", + text = { + "플레이할 때마다 {C:attention}2{}를 득점하면", + "조커는", + "{C:chips}+#2#{}개의 칩을 획득합니다", + "{C:inactive}(현재 {C:chips}+#1#{C:inactive}개의 칩)" + }, + unlock = { + "{E:1,C:attention}#1#{} 회 이하의 라운드 안에", + "런을 승리합니다" + } + }, + j_merry_andy = { + name = "즐거운 앤디", + text = { + "{C:red}+#1#{} 버리기,", + "{C:red}#2#{} 핸드 크기" + }, + unlock = { + "{E:1,C:attention}#1#{} 회 이하의 라운드 안에", + "런을 승리합니다" + } + }, + j_oops = { + name = "이런, 모두 6이야!", + text = { + "모든 {C:attention}나열된", + "{C:green,E:1,S:1.1}가능성{} 을", + "{C:inactive}(예: {C:green}1/3{C:inactive} -> {C:green}2/3{C:inactive})" + }, + unlock = { + "두 배로 만듭니다.", + "최소", + "{E:1,C:attention}#1#{} 개의 칩을 획득합니다" + } + }, + j_idol = { + name = "우상", + text = { + "{V:1}#3#{}의 {C:attention}#2#{} 카드를 플레이할 때마다", + "득점시", + "{X:mult,C:white} X#1# {} 배수를 제공합니다", + "카드가 매 라운드 변경됩니다" + }, + unlock = { + "한 번의 핸드에서", + "최소", + "{E:1,C:attention}#1#{} 개의 칩을 획득합니다" + } + }, + j_seeing_double = { + name = "둘로 보기", + text = { + "플레이한 핸드가 득점하면", + "{X:mult,C:white} X#1# {} 배수", + "{C:clubs}클럽{} 카드 및", + "기타{C:attention} 수트의 득점 카드" + }, + unlock = { + "{E:1,C:attention}#1# 을(를) 포함한", + "핸드를", + "플레이합니다" + } + }, + j_matador = { + name = "투우사", + text = { + "플레이한 핸드가", + "{C:attention}보스 블라인드{} 능력을 트리거하면 ", + "{C:money}$#1#{} 를 획득합니다" + }, + unlock = { + "버리기를 사용하지 않고", + "{E:1,C:attention}한 번의 핸드{} 에서", + "보스 블라인드를 처치합니다" + } + }, + j_hit_the_road = { + name = "여행 출발", + text = { + "이번 라운드에서", + "{C:attention}잭{} 을 버릴 때마다", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + }, + unlock = { + "동시에", + "{E:1,C:attention}잭 5{} 장을", + "버립니다" + } + }, + j_duo = { + name = "듀오", + text = { + "플레이한 핸드가", + "{C:attention}#2#{} 을(를) 포함 시", + "{X:mult,C:white} X#1# {} 배수" + }, + unlock = { + "{E:1,C:attention}#1#{} 을(를)", + "플레이하지 않고", + "런을 승리합니다" + } + }, + j_trio = { + name = "트리오", + text = { + "플레이한 핸드가", + "{C:attention}#2#{} 을(를) 포함 시", + "{X:mult,C:white} X#1# {} 배수" + }, + unlock = { + "{E:1,C:attention}#1#{} 을(를)", + "플레이하지 않고", + "런을 승리합니다" + } + }, + j_family = { + name = "가족", + text = { + "플레이한 핸드가", + "{C:attention}#2#{} 을(를) 포함 시", + "{X:mult,C:white} X#1# {} 배수" + }, + unlock = { + "{E:1,C:attention}#1#{} 을(를)", + "플레이하지 않고", + "런을 승리합니다" + } + }, + j_order = { + name = "명령", + text = { + "플레이한 핸드가", + "{C:attention}#2#{} 을(를) 포함 시", + "{X:mult,C:white} X#1# {} 배수" + }, + unlock = { + "{E:1,C:attention}#1#{} 을(를)", + "플레이하지 않고", + "런을 승리합니다" + } + }, + j_tribe = { + name = "패거리", + text = { + "플레이한 핸드가", + "{C:attention}#2#{} 을(를) 포함 시", + "{C:red}+#1#{} 배수" + }, + unlock = { + "{E:1,C:attention}#1#{} 을(를)", + "플레이하지 않고", + "런을 승리합니다" + } + }, + j_cavendish = { + name = "캐번디시", + text = { + "{X:mult,C:white} X#1# {} 배수", + "라운드가 끝날 때", + "{C:green}#2# / #3#{} 의 확률로", + "이 카드가 파괴됩니다" + } + }, + j_card_sharp = { + name = "야바위꾼", + text = { + "이 라운드에서 이미 플레이된", + "{C:attention}포커 핸드{} 를 플레이할 시", + "{X:mult,C:white} X#1# {} 배수" + } + }, + j_red_card = { + name = "레드카드", + text = { + "{C:attention}부스터 팩{} 을 건너뛰면", + "{C:red}+#1#{} 배수를 획득합니다", + "{C:inactive}(현재 {C:red}+#2#{C:inactive} 배수)" + } + }, + j_madness = { + name = "광기", + text = { + "{C:attention}블라인드{} 를 선택할 때,", + "{X:mult,C:white} X#1# {} 배수를 획득하고", + "무작위 조커 한 장을 {C:attention}파괴합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {} 배수)" + } + }, + j_square = { + name = "정사각형 조커", + text = { + "정확히 {C:attention}4{}장의 카드가 있는", + "핸드를 플레이할 때마다", + "{C:chips}+#2#{} 개의 칩을 획득합니다", + "{C:inactive}(현재 {C:chips}#1#{}개의 칩)" + } + }, + j_seance = { + name = "교령회", + text = { + "{C:attention}포커 핸드{} 가", + "{C:attention}#1#{} 인 경우,", + "무작위 {C:spectral}유령{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + j_riff_raff = { + name = "쓰레기", + text = { + "{C:attention}블라인드{}가 선택되 때,", + "{C:attention}#1#장의 {C:blue}일반{} 조커를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + j_stuntman = { + name = "스턴트맨", + text = { + "{C:chips}+#1#{}개의 칩,", + "{C:attention}-#2#{} 핸드 크기" + }, + unlock = { + "한 번의 핸드에서", + "최소 {E:1,C:attention}#1#{}개의 칩을", + "획득합니다" + } + }, + j_invisible = { + name = "투명 조커", + text = { + "{C:attention}#1#{}번의 라운드 후,", + "이 카드를 팔아서", + "무작위 조커를 {C:attention}중복합니다{}", + "{C:inactive}(현재 {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "보유한 {E:1,C:attention}조커 수가 4장{}을", + "넘지 않아도", + "런을 승리합니다" + } + }, + j_brainstorm = { + name = "브레인스토밍", + text = { + "가장 왼쪽 {C:attention}조커{}의 능력을", + "복사합니다" + }, + unlock = { + "{E:1,C:attention}로열 플러시{}를", + "버립니다" + } + }, + j_satellite = { + name = "인공위성", + text = { + "이번 런에서 사용된", + "모든 고유 {C:planet}행성{} 카드에 대해", + "라운드가 끝나면 {C:money}$#1#{} 를 획득합니다", + "{C:inactive}(현재 {C:money}$#2#{C:inactive})" + }, + unlock = { + "{E:1,C:money}$#1# 이상", + "보유합니다" + } + }, + j_shoot_the_moon = { + name = "야반도주", + text = { + "핸드에 있는", + "{C:attention}퀸{}마다", + "{C:mult}+#1#{} 배수" + }, + unlock = { + "단일 라운드에서", + "덱에 있는", + "모든 {E:1,C:attention}하트{} 를 플레이합니다" + } + }, + j_drivers_license = { + name = "운전면허증", + text = { + "덱에 최소 {C:attention}16", + "장의 강화된 카드를 보유한 경우", + "{X:mult,C:white} X#1# {} 배수", + "{C:inactive}(현재 {C:attention}#2#{C:inactive})" + }, + unlock = { + "덱에서 {E:1,C:attention}#1#{} 장의 카드를", + "강화합니다" + } + }, + j_cartomancer = { + name = "카토맨서", + text = { + "{C:attention}블라인드{} 를 선택할 때", + "{C:tarot}타로{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + }, + unlock = { + "{C:tarot}타로{} 카드를", + "발견합니다" + } + }, + j_astronomer = { + name = "천문학자", + text = { + "모든 {C:planet}행성{} 카드와", + "{C:planet}천체 팩{}", + "{C:attention}무료{} 입니다" + }, + unlock = { + "모든 {E:1,C:planet}행성{} 카드를", + "발견합니다" + } + }, + j_burnt = { + name = "타버린 조커", + text = { + "라운드마다 첫 번째", + "{C:attention}버린{} 포커 핸드의", + "레벨을 업그레이드합니다" + }, + unlock = { + "총 {E:1,C:attention}#1#{} 장의 카드를", + "판매합니다", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "자력", + text = { + "보유한 각 {C:money}$#2#{} 마다", + "{C:mult}+#1#{} 배수" + }, + unlock = { + "최소 {E:1,C:attention}#1#{} 장의", + "{C:dark_edition}폴리크롬{} 조커를 보유합니다" + } + }, + j_caino = { + name = "카니오", + text = { + "파괴되는", + "{C:attention}그림{} 카드에 대하여", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "트리불레", + text = { + "플레이한 {C:attention}킹{}과", + "{C:attention}퀸{}이 각각 제공합니다", + "{X:mult,C:white} X#1# {} 배수를 제공하며," + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "요릭", + text = { + "{C:attention}#2#{} 번의 버리기 사용 후에만", + "{X:mult,C:white} X#1# {} 배수", + "{C:inactive}(남은 버리기: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "치코", + text = { + "모든 {C:attention}보스 블라인드{} 의", + "효과를 비활성화합니다" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "페르케오", + text = { + "{C:attention}상점{}에서 끝날 때", + "소유한", + "{C:attention}1{}장의 무작위 {C:attentin}소모품{} 카드의", + "{C:dark_edition}네거티브{}를 생성합니다" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "교활한 조커", + text = { + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "칩 {C:chips}+#1#{}개" + } + }, + j_wily = { + name = "악랄한 조커", + text = { + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "칩 {C:chips}+#1#{}개" + } + }, + j_clever = { + name = "영리한 조커", + text = { + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "칩 {C:chips}+#1#{}개" + } + }, + j_devious = { + name = "기만적인 조커", + text = { + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "칩 {C:chips}+#1#{}개" + } + }, + j_crafty = { + name = "간교한 조커", + text = { + "플레이한 핸드에", + "{C:attention}#2#{} 포함 시", + "칩 {C:chips}+#1#{}개" + } + }, + j_vampire = { + name = "뱀파이어", + text = { + "플레이한 {C:attention}강화 카드{}당", + "{X:mult,C:white} X#1# {} 배수를 획득하고,", + "카드 {C:attention}강화{}를 제거합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + } + }, + j_shortcut = { + name = "지름길", + text = { + "{C:attention}스트레이트{}를", + "{C:attention}1 랭크{}의 차이로 만듭니다", + "{C:inactive}(예: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "홀로그램", + text = { + "덱에 추가된", + "{C:attention}플레잉 카드{}당", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + } + }, + j_vagabond = { + name = "방랑자", + text = { + "핸드가 {C:money}$#1#{} 미만으로", + "플레이되면", + "{C:purple}타로{} 카드를 생성합니다" + } + }, + j_baron = { + name = "남작", + text = { + "핸드에 있는", + "{C:attention}킹{}마다", + "{X:mult,C:white} X#1# {} 배수를 제공합니다" + } + }, + j_cloud_9 = { + name = "클라우드 9", + text = { + "라운드가 끝날 때 {C:attention}풀 덱{}의", + "{C:attention}9{}마다", + "{C:money}$#1#{}를 획득합니다", + "{C:inactive}(현재 {C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "로켓", + text = { + "라운드가 끝날 때 {C:money}$#1#{}를", + "획득합니다. {C:attention}보스 블라인드{}가 패하면", + "{C:money}$#2#{}를 획득합니다" + } + }, + j_obelisk = { + name = "오벨리스크", + text = { + "가장 많이 플레이한 {C:attention}포커 카드{}를", + "사용하지 않고", + "플레이한 연속 핸드마다", + "{X:mult,C:white} X#1# {} 배수", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + } + }, + j_midas_mask = { + name = "미다스 가면", + text = { + "플레이할 때", + "모든 {C:attention}페이스{} 카드가", + "{C:attention}골드{} 카드로 됩니다" + } + }, + j_luchador = { + name = "루차도르", + text = { + "이 카드를 팔아서", + "현재 {C:attention}보스 블라인드{}를", + "비활성화합니다" + } + }, + j_photograph = { + name = "사진", + text = { + "득점에 사용된", + "첫 번째 플레이한 {C:attention}페이스{} 카드에", + "{X:mult,C:white} X#1# {} 배수" + } + }, + j_gift = { + name = "기프트 카드", + text = { + "모든 {C:attention}조커{} 및", + "{C:attention}소모품{} 카드에", + "{C:money}$#1#{}의 {C:attention}판매 가치{}를 추가합니다", + " " + } + }, + j_turtle_bean = { + name = "거북 콩", + text = { + "{C:attention}+#1#{} 핸드 크기,", + "{C:red}#2#{} 라운드마다", + "감소합니다" + } + }, + j_erosion = { + name = "침식", + text = { + "풀 덱에서 {C:attention}#3#{} 미만의", + "카드마다", + "{C:red}+#1#{} 배수", + "{C:inactive}(현재 {C:red}+#2#{C:inactive} 배수)" + } + }, + j_reserved_parking = { + name = "지정 주차 공간", + text = { + "핸드에 보유한", + "{C:attention}그림{} 카드마다", + "{C:green}#2#/#3#{} 확률을 보유합니다", + "{C:money}$#1#{}을(를) 제공합니다" + } + }, + j_mail = { + name = "편지", + text = { + "{C:attention}#2#{}을(를) 버릴 때마다", + "{C:money}$#1#{}를 획득하며,", + "랭크가 매 라운드 변경됩니다" + } + }, + j_to_the_moon = { + name = "달을 향해", + text = { + "라운드가 끝날 때", + "보유한 {C:money}$5{}마다 추가 {C:money}$#1#{}의", + "{C:attention}이자{}를 획득합니다" + } + }, + j_hallucination = { + name = "환각", + text = { + "{C:attention}부스터 팩{}을 열 때마다", + "{C:tarot}타로{} 카드를 생성할", + "{C:green}#1#/#2#{}의 확률", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + j_lucky_cat = { + name = "행운의 고양이", + text = { + "{C:attention}럭키{} 카드를", + "{C:green}성공적으로{} 트리거할 때마다", + "{X:mult,C:white} X#1# {} 배수를 획득합니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + } + }, + j_baseball = { + name = "야구 카드", + text = { + "{C:green}희귀{} 조커마다", + "{X:mult,C:white} X#1# {} 배수를 제공합니다" + } + }, + j_bull = { + name = "황소", + text = { + "{C:money}달러{}를 보유할 때마다", + "{C:chips}+#1#{}개의 칩", + "{C:inactive}(현재 {C:chips}+#2#{C:inactive}개의 칩)" + } + }, + j_diet_cola = { + name = "다이어트 콜라", + text = { + "이 카드를 팔아서", + "무료 {C:attention}#1#", + "생성" + } + }, + j_trading = { + name = "트레이딩 카드", + text = { + "라운드의 {C:attention}첫 번째 버리기{}에", + "{C:attention}1{} 카드만 있으면, 그건 파괴하고", + "{C:money}$#1#{}를 획득합니다" + } + }, + j_flash = { + name = "플래시 카드", + text = { + "상점에서 {C:attention}리롤{}할 때마다", + "{C:mult}+#1#{} 배수", + "{C:inactive}(현재 {C:mult}+#2#{C:inactive} 배수)" + } + }, + j_popcorn = { + name = "팝콘", + text = { + "{C:mult}+#1#{} 배수", + "라운드를 플레이할 때마다", + "{C:mult}-#2#{} 배수" + } + }, + j_trousers = { + name = "여벌 바지", + text = { + "플레이한 핸드에", + "{C:attention}#2#{}이(가) 있으면", + "{C:mult}+#1#{} 배수를 획득합니다", + "{C:inactive}(현재 {C:red}+#3#{C:inactive} 배수)" + } + }, + j_ancient = { + name = "고대 조커", + text = { + "{V:1}#2#{} 수트의 카드를", + "플레이할 때마다 득점 시", + "{X:mult,C:white} X#1# {} 배수를 제공하며,", + "{s:0.8}라운드 종료 시 수트가 변경됩니다" + } + }, + j_ramen = { + name = "라면", + text = { + "{X:mult,C:white} X#1# {} 배수,", + "{C:attention}카드{}를 버릴 때마다", + "{X:mult,C:white} X#2# {} 배수를 잃습니다" + } + }, + j_walkie_talkie = { + name = "워키토키", + text = { + "{C:attention}10{} 또는 {C:attention}4{}를 플레이할 때마다", + "득점 시 {C:chips}+#1#{}개의 칩과", + "{C:mult}+#2#{} 배수를 제공합니다" + } + }, + j_selzer = { + name = "탄산수", + text = { + "다음 {C:attention}#1#{}번의 핸드에서", + "플레이한 모든 카드를", + "다시 트리거합니다" + } + }, + j_castle = { + name = "성", + text = { + "이 조커는 {V:1}#2#{} 카드를 버릴 때마다", + "{C:chips}+#1#{}개의 칩을 획득하며,", + "수트가 매 라운드 변경됩니다", + "{C:inactive}(현재 {C:chips}+#3#{C:inactive}개의 칩)" + } + }, + j_smiley = { + name = "웃는 얼굴", + text = { + "득점하면", + "플레이한 {C:attention}페이스{} 카드가", + "{C:mult}+#1#{} 배수를 제공합니다" + } + }, + j_campfire = { + name = "캠프파이어", + text = { + "이 조커는 카드가 {C:attention}팔릴{} 때마다", + "{X:mult,C:white}X#1#{} 배수를 획득하며,", + "{C:attention}보스 블라인드{}가 패배하면 초기화됩니다", + "{C:inactive}(현재 {X:mult,C:white} X#2# {C:inactive} 배수)" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "과잉", + text = { + "상점에서 {C:attention}+1{} 개의 카드 슬롯이", + "가능합니다" + } + }, + v_clearance_sale = { + name = "대방출 세일", + text = { + "상점의 모든 카드와 팩이", + "{C:attention}#1#%{} 할인됩니다" + } + }, + v_tarot_merchant = { + name = "타로 상인", + text = { + "{C:tarot}타로{} 카드가", + "상점에서 {C:attention}#1#X{} 만큼", + "더 자주 나타납니다" + } + }, + v_planet_merchant = { + name = "행성 상인", + text = { + "{C:planet}행성{} 카드가", + "상점에서 {C:attention}#1#X{} 만큼", + "더 자주 나타납니다" + } + }, + v_hone = { + name = "연마", + text = { + "{C:dark_edition}포일{}, {C:dark_edition}홀로그래픽{}, 그리고", + "{C:dark_edition}폴리크롬{} 카드가", + "{C:attention}#1#X{} 만큼 더 자주 나타납니다" + } + }, + v_reroll_surplus = { + name = "잉여 리롤", + text = { + "리롤 비용이", + "{C:money}$#1#{} 감소합니다" + } + }, + v_crystal_ball = { + name = "수정 구슬", + text = { + "{C:attention}+1{} 소모품 슬롯" + } + }, + v_telescope = { + name = "망원경", + text = { + "{C:attention}천체 팩{} 이", + "가장 많이 플레이한", + "{C:attention}포커 핸드{} 의", + "{C:planet}행성{} 카드를 항상 보유합니다" + } + }, + v_grabber = { + name = "강탈자", + text = { + "라운드당", + "{C:blue}+#1#{} 핸드를", + "영구적으로 획득합니다" + } + }, + v_wasteful = { + name = "낭비", + text = { + "라운드당", + "{C:red}+#1#{} 버리기를", + "영구적으로 획득합니다" + } + }, + v_seed_money = { + name = "시드 머니", + text = { + "라운드당", + "획득하는 이자의 한도가", + "{C:money}$#1#{} 로 증가합니다" + } + }, + v_blank = { + name = "여백", + text = { + "{C:inactive}아무것도 안 하나요?" + } + }, + v_magic_trick = { + name = "마법 속임수", + text = { + "{C:attention}상점{} 에서", + "{C:attention}플레잉 카드{} 를", + "구매할 수 있습니다" + } + }, + v_hieroglyph = { + name = "상형문자", + text = { + "{C:attention}-#1#{} 앤티", + "{C:blue}-#1#{} 핸드", + "영구적으로 획득합니다", + "{C:attention}-#1#{} 앤티" + } + }, + v_directors_cut = { + name = "디렉터스 컷", + text = { + "앤티당 보스 블라인드를", + "{C:attention}1{} 회 리롤합니다", + "롤당 {C:money}$#1#{}" + } + }, + v_pattern = { + name = "패턴", + text = { + "가장 많이 사용한", + "{C:attention}소모품{} 카드를 스폰합니다", + "{E:1,V:1}#1#", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + v_overstock_plus = { + name = "과잉 재고", + text = { + "상점에서 {C:attention}+1{} 개의 카드 슬롯이", + "가능합니다" + }, + unlock = { + "상점에서 총 {C:money}$#1#{} 를", + "지출합니다", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "청산", + text = { + "상점의 모든 카드와 팩이", + "{C:attention}#1#%{} 할인됩니다" + }, + unlock = { + "한 번의 런에서", + "최소 {C:attention}#1#{} 장의 {C:voucher}바우처{} 카드를", + "교환합니다" + } + }, + v_tarot_tycoon = { + name = "타로 거물", + text = { + "{C:tarot}행성{} 카드가", + "상점에서 {C:attention}#1#X{} 만큼", + "더 자주 나타납니다" + }, + unlock = { + "상점에서", + "총 {C:attention}#1#{} 장의 {C:tarot}타로{} 카드를", + "구매합니다", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "행성 거물", + text = { + "{C:planet}행성{} 카드가", + "상점에서 {C:attention}#1#X{} 만큼", + "더 자주 나타납니다" + }, + unlock = { + "상점에서", + "총 {C:attention}#1#{} 장의 {C:tarot}행성{} 카드를", + "구매합니다", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "글로우업", + text = { + "{C:dark_edition}포일{}, {C:dark_edition}홀로그래픽{}, 그리고", + "{C:dark_edition}폴리크롬{} 카드가", + "{C:attention}#1#X{} 만큼 더 자주 나타납니다" + }, + unlock = { + "최소 {C:attention}#1#{} 장의", + "{C:attention}조커{} 카드를", + "{C:dark_edition}포일{}, {C:dark_edition}홀로그래픽{}, 또는", + "{C:dark_edition}폴리크롬{} 에디션으로 보유합니다" + } + }, + v_reroll_glut = { + name = "리롤 과잉", + text = { + "리롤 비용이", + "{C:money}$#1#{} 감소합니다" + }, + unlock = { + "총 {C:attention}#1#{} 번", + "상점을 리롤합니다", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "징조의 구", + text = { + "{C:spectral}유령{} 카드가", + "{C:attention}아르카나 팩{} 에서", + "나타날 수 있습니다" + }, + unlock = { + "{C:attention}아르카나 팩{} 에서", + "총 {C:attention}#1#{} 장의 {C:tarot}타로{} 카드를", + "사용합니다", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "관측소", + text = { + "{C:attention}소모품{} 지역의", + "{C:planet}행성{} 카드가", + "지정된 {C:attention}포커 핸드{} 에", + "{X:red,C:white} X#1# {} 배수를 제공합니다" + }, + unlock = { + "{C:planet}천체 팩{} 에서", + "총 {C:attention}#1#{} 장의 {C:planet}행성{} 카드를", + "사용합니다", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "나초 통", + text = { + "라운드당", + "{C:blue}+#1#{} 핸드를", + "영구적으로 획득합니다" + }, + unlock = { + "총 {C:attention}#1#{} 장의 카드를", + "플레이합니다", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "리사이클로맨시", + text = { + "라운드당", + "{C:red}+#1#{} 버리기를", + "영구적으로 획득합니다" + }, + unlock = { + "총 {C:attention}#1#{} 장의 카드를", + "버립니다", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "돈나무", + text = { + "라운드당", + "획득하는 이자의 한도가", + "{C:money}$#1#{} 로 증가합니다" + }, + unlock = { + "{C:attention}#1#{} 회의 연속 라운드 동안", + "라운드 획득액당 이자를", + "최대로 받습니다", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "반물질", + text = { + "{C:dark_edition}+1{} 개의 조커 슬롯" + }, + unlock = { + "{C:voucher}블랭크{} 를", + "총 {C:attention}#1#{} 회 교환합니다", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "환상", + text = { + "상점 내 {C:attention}플레잉 카드{}에", + "{C:enhanced}강화{}, {C:dark_edition}에디션{},", + "및/또는 {C:attention}봉인{}이 있을 수 있습니다" + }, + unlock = { + "상점에서", + "총 {C:attention}#1#{} 장의 플레잉 카드를", + "구매합니다", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "암각화", + unlock = { + "앤티 레벨", + "{E:1,C:attention}#1#{} 에 도달합니다" + }, + text = { + "{C:attention}-#1#{} 앤티", + "{C:red}-#1#{} 버리기", + "영구적으로 획득합니다" + } + }, + v_retcon = { + name = "레트콘", + text = { + "앤티당 보스 블라인드를", + "{C:attention}무제한{},", + "리롤당 {C:money}$#1#{}" + }, + unlock = { + "{C:attention}#1#{} 블라인드를", + "발견합니다" + } + }, + v_tesselation = { + name = "테셀레이션", + text = { + "가장 많이 사용한 {C:attention}조커{} 카드를", + "스폰합니다", + "{E:1,V:1}#1#", + "{C:inactive}(공간이 있어야 합니다)" + }, + unlock = { + "가장 많이 사용한", + "{C:attention}조커{} 의", + "{C:dark_edition}폴리크롬{} 에디션을", + "상점에서 구매합니다" + } + }, + v_palette = { + name = "팔레트", + text = { + "핸드에 {C:attention}+#1#{}장의", + "카드를 보유합니다", + "{C:attention}+#1#{} 핸드 크기" + }, + unlock = { + "핸드 크기를", + "카드 {C:attention}#1#{}장으로 줄입니다" + } + }, + v_paint_brush = { + name = "페인트 붓", + text = { + "{C:attention}+#1#{} 핸드 크기" + } + } + }, + Tarot = { + c_fool = { + name = "바보", + text = { + "이번 런 동안 사용한", + "마지막 {C:tarot}타로{} 또는", + "{C:planet}행성{} 카드를 생성합니다", + "{s:0.8,C:tarot}바보{s:0.8} 제외" + } + }, + c_magician = { + name = "마법사", + text = { + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다" + } + }, + c_high_priestess = { + name = "고위 여사제", + text = { + "최대 {C:attention}#1#{}장의", + "무작위 {C:planet}행성{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + c_empress = { + name = "여제", + text = { + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다" + } + }, + c_emperor = { + name = "황제", + text = { + "최대 {C:attention}#1#{}장의", + "무작위 {C:tarot}타로{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + c_heirophant = { + name = "교황", + text = { + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다" + } + }, + c_lovers = { + name = "연인", + text = { + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다" + } + }, + c_chariot = { + name = "전차", + text = { + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다" + } + }, + c_justice = { + name = "정의", + text = { + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다" + } + }, + c_hermit = { + name = "은둔자", + text = { + "돈을 두 배로 만듭니다", + "{C:inactive}(최대 {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "운명의 수레바퀴", + text = { + "{C:green}#1# / #2#{} 의 확률로", + "{C:dark_edition}포일{}, {C:dark_edition}홀로그래픽{}, 또는", + "{C:dark_edition}폴리크롬{} 에디션을", + "무작위 {C:attention}조커{} 에 추가합니다" + } + }, + c_strength = { + name = "힘", + text = { + "선택한 {C:attention}#1#{} 장의", + "카드 랭크가 {C:attention}1{} 만큼", + "상승합니다" + } + }, + c_hanged_man = { + name = "매달린 남자", + text = { + "최대 {C:attention}#1#{} 장의", + "선택한 카드를 파괴합니다" + } + }, + c_death = { + name = "죽음", + text = { + "{C:attention}#1#{} 장의 카드를 선택하여,", + "{C:attention}왼쪽{} 카드를", + "{C:attention}오른쪽{} 카드로 전환합니다", + "{C:inactive}(드래그하여 재배열)" + } + }, + c_temperance = { + name = "절제", + text = { + "현재 모든 조커의", + "총 판매 가치를 제공합니다", + "{C:inactive}(최대 {C:money}$#1#{C:inactive})", + "{C:inactive}(현재 {C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "악마", + text = { + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다" + } + }, + c_tower = { + name = "탑", + text = { + "{C:attention}#1#{} 장의 선택한 카드를", + "{C:attention}#2#{} (으)로", + "강화합니다" + } + }, + c_star = { + name = "별", + text = { + "최대 {C:attention}#1#{} 장의 선택한 카드를", + "{V:1}#2#{} (으)로", + "전환합니다" + } + }, + c_moon = { + name = "달", + text = { + "최대 {C:attention}#1#{} 장의 선택한 카드를", + "{V:1}#2#{} (으)로", + "전환합니다" + } + }, + c_sun = { + name = "태양", + text = { + "최대 {C:attention}#1#{} 장의 선택한 카드를", + "{V:1}#2#{} (으)로", + "전환합니다" + } + }, + c_judgement = { + name = "심판", + text = { + "무작위 {C:attention}조커{} 카드를", + "생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + c_world = { + name = "세계", + text = { + "최대 {C:attention}#1#{} 장의 선택한 카드를", + "{V:1}#2#{} (으)로", + "전환합니다" + } + } + }, + Planet = { + c_mercury = { + name = "수성", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_venus = { + name = "금성", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_earth = { + name = "지구", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_mars = { + name = "화성", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_jupiter = { + name = "목성", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_saturn = { + name = "토성", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_uranus = { + name = "천왕성", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_neptune = { + name = "해왕성", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_pluto = { + name = "명왕성", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_ceres = { + name = "세레스", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_planet_x = { + name = "플래닛 X", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} {C:attention}#2#{} 을(를)", + "레벨업합니다", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{} 개의 칩" + } + }, + c_eris = { + name = "에리스", + text = { + "{S:0.8}({S:0.8,V:1}Lv.#1#{S:0.8}){} 레벨 업", + "{C:attention}#2#", + "{C:mult}+#3#{} 배수 및", + "{C:chips}+#4#{}개의 칩" + } + } + }, + Spectral = { + c_familiar = { + name = "익숙함", + text = { + "핸드에 있는 {C:attention}1{} 장의", + "무작위 카드를 파괴하고,", + "핸드에 {C:attention}#1#{} 장의 무작위 {C:attention}강화 그림", + "{C:attention}카드{} 를 추가합니다" + } + }, + c_grim = { + name = "암울함", + text = { + "핸드에 있는 {C:attention}1{} 장의", + "무작위 카드를 파괴하고,", + "핸드에 {C:attention}#1#{} 장의 무작위 {C:attention}강화", + "{C:attention}에이스{} 를 추가합니다" + } + }, + c_incantation = { + name = "주문", + text = { + "핸드에 있는 {C:attention}1{} 장의", + "무작위 카드를 파괴하고,", + "핸드에 {C:attention}#1#{} 장의 무작위 {C:attention}강화 숫자", + "{C:attention}카드{} 를 추가합니다" + } + }, + c_talisman = { + name = "부적", + text = { + "핸드에 있는", + "{C:attention}1{} 장의 선택된 카드에", + "{C:attention}금 봉인{} 을 추가합니다" + } + }, + c_aura = { + name = "아우라", + text = { + "{C:dark_edition}포일{}, {C:dark_edition}홀로그래픽{},", + "또는 {C:dark_edition}폴리크롬{} 효과를", + "핸드에 있는 {C:attention}1{} 장의 선택된 카드에 추가합니다" + } + }, + c_wraith = { + name = "망령", + text = { + "무작위 {C:red}레어{C:attention} 조커{} 를", + "생성하고,", + "돈이 {C:money}$0{} 가 됩니다" + } + }, + c_sigil = { + name = "인장", + text = { + "핸드에 있는 모든 카드를", + "단일의 무작위", + "{C:attention}수트{} 로 전환합니다" + } + }, + c_ouija = { + name = "점판", + text = { + "핸드에 있는 모든 카드를", + "단일의 무작위", + "{C:attention}랭크{} 로 전환합니다", + "{C:red}-1{} 핸드 크기" + } + }, + c_ectoplasm = { + name = "심령체", + text = { + "무작위 {C:attention}조커{} 에", + "{C:dark_edition}네거티브{} 를 추가합니다", + "{C:red}-1{} 핸드 크기" + } + }, + c_immolate = { + name = "불멸", + text = { + "핸드에 있는 {C:attention}#1#{} 장의", + "무작위 카드를 파괴하고,", + "{C:money}$#2#{} 를 획득합니다" + } + }, + c_soul = { + name = "영혼", + text = { + "{C:legendary,E:1}레전더리{} 조커를", + "생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + c_black_hole = { + name = "블랙홀", + text = { + "모든 {C:legendary,E:1}포커 핸드{} 를", + "{C:attention}1{} 레벨만큼", + "업그레이드합니다" + } + }, + c_ankh = { + name = "앵크", + text = { + "무작위 {C:attention}조커{}를", + "생성하고, 다른 모든 조커를", + "파괴합니다" + } + }, + c_deja_vu = { + name = "데자뷔", + text = { + "{C:red}레드 봉인{}을", + "핸드에서 선택한 {C:attention}1{}장의", + "카드에 추가합니다" + } + }, + c_hex = { + name = "헥스", + text = { + "무작위 {C:attention}조커{}에 {C:dark_edition}폴리크롬{}을", + "생성하고, 다른 모든 조커를", + "파괴합니다" + } + }, + c_trance = { + name = "트랜스", + text = { + "{C:blue}블루 봉인{}을", + "핸드에서 선택한 {C:attention}1{}장의", + "카드에 추가합니다" + } + }, + c_medium = { + name = "미디엄", + text = { + "{C:purple}퍼플 봉인{}을", + "핸드에서 선택한 {C:attention}1{}장의", + "카드에 추가합니다" + } + }, + c_cryptid = { + name = "크립티드", + text = { + "핸드에서 선택한 {C:attention}1{}장의", + "카드를 {C:attention}#1#{}장으로", + "카드를 보유합니다" + } + } + }, + Edition = { + e_base = { + name = "기본", + text = { + "추가 효과 없음" + } + }, + e_foil = { + name = "포일", + text = { + "{C:chips}+#1#{}개의 칩" + } + }, + e_holo = { + name = "홀로그래픽", + text = { + "{C:mult}+#1#{} 배수" + } + }, + e_polychrome = { + name = "폴리크롬", + text = { + "{X:mult,C:white} X#1# {} 배수" + } + }, + e_negative = { + name = "네거티브", + text = { + "{C:dark_edition}+#1#{}개의 조커 슬롯" + } + }, + e_negative_consumable = { + name = "네거티브", + text = { + "{C:dark_edition}+#1#{}개의 소모품 슬롯" + } + } + }, + Enhanced = { + m_bonus = { + name = "보너스 카드", + text = {} + }, + m_mult = { + name = "배수 카드", + text = { + "{C:mult}+#1#{} 배수" + } + }, + m_wild = { + name = "와일드 카드", + text = { + "아무 수트에", + "사용할 수 있습니다" + } + }, + m_glass = { + name = "글래스 카드", + text = { + "{X:mult,C:white} X#1# {} 배수", + "{C:green}#2# / #3#{} 의 확률로", + "카드를 파괴합니다" + } + }, + m_steel = { + name = "스틸 카드", + text = { + "핸드에", + "이 카드가 있는 동안", + "{X:mult,C:white} X#1# {} 배수" + } + }, + m_stone = { + name = "스톤 카드", + text = { + "{C:chips}+#1#{} 개의 칩", + "랭크 또는 수트 없음" + } + }, + m_gold = { + name = "골드 카드", + text = { + "라운드가 끝날 때", + "핸드에 이 카드가 있으면", + "{C:money}$#1#{}" + } + }, + m_lucky = { + name = "럭키 카드", + text = { + "{C:green}#1# / #3#{} 의 확률로", + "{C:mult}+#2#{} 배수", + "{C:green}#1# / #3#{} 의 확률로", + "{C:money}$#4# 획득" + } + } + }, + Stake = { + stake_white = { + name = "화이트 스테이크", + text = { + "기본 난이도" + } + }, + stake_red = { + name = "레드 스테이크", + text = { + "{C:attention}스몰 블라인드{} 가", + "보상 돈을 제공하지 않습니다", + "{s:0.8}이전 스테이크를 모두 적용합니다" + } + }, + stake_green = { + name = "그린 스테이크", + text = { + "각 {C:attention}앤티{} 에", + "필요한 점수가 더 빠르게 증가합니다", + "{s:0.8}이전 스테이크를 모두 적용합니다" + } + }, + stake_blue = { + name = "블루 스테이크", + text = { + "{C:red}-1{} 버리기", + "{s:0.8}이전 스테이크를 모두 적용합니다" + } + }, + stake_black = { + name = "블랙 스테이크", + text = { + "상점에 {C:attention}이터널{} 조커가 있습니다.", + "{C:inactive,s:0.8}{판매하거나 파괴할 수 없습니다}", + "{s:0.8}이전 스테이크를 모두 적용합니다" + } + }, + stake_purple = { + name = "퍼플 스테이크", + text = { + "각 {C:attention}앤티{} 에", + "필요한 점수가 더 빠르게 증가합니다", + "{s:0.8}이전 스테이크를 모두 적용합니다" + } + }, + stake_orange = { + name = "오렌지 스테이크", + text = { + "앤티당 {C:attention}부스터 팩{} 비용이", + "{C:money}$1{} 추가됩니다", + "{s:0.8}이전 스테이크를 모두 적용합니다" + } + }, + stake_gold = { + name = "골드 스테이크", + text = { + "{C:red}-1{} 핸드 크기", + "{s:0.8}이전 스테이크를 모두 적용합니다" + } + } + }, + Tag = { + tag_uncommon = { + name = "희귀 태그", + text = { + "상점에", + "{C:green}희귀 조커{} 가 있습니다" + } + }, + tag_rare = { + name = "레어 태그", + text = { + "상점에", + "{C:red}레어 조커{} 가 있습니다" + } + }, + tag_negative = { + name = "네거티브 태그", + text = { + "상점에", + "{C:dark_edition}네거티브 조커{} 가 있습니다" + } + }, + tag_foil = { + name = "포일 태그", + text = { + "상점에", + "{C:dark_edition}포일 조커{} 가 있습니다" + } + }, + tag_holo = { + name = "홀로그래픽 태그", + text = { + "상점에", + "{C:dark_edition}홀로그래픽 조커{} 가 있습니다" + } + }, + tag_polychrome = { + name = "폴리크롬 태그", + text = { + "상점에", + "{C:dark_edition}폴리크롬 조커{} 가 있습니다" + } + }, + tag_investment = { + name = "투자 태그", + text = { + "보스 블라인드를", + "처치한 후,", + "{C:money}$#1#{} 를 획득합니다" + } + }, + tag_voucher = { + name = "바우처 태그", + text = { + "다음 상점에", + "{C:voucher}바우처{} 하나를 추가합니다" + } + }, + tag_boss = { + name = "보스 태그", + text = { + "{C:attention}보스 블라인드{} 를", + "리롤합니다" + } + }, + tag_standard = { + name = "표준 태그", + text = { + "무료 {C:attention}메가 표준 팩{} 을", + "제공합니다" + } + }, + tag_charm = { + name = "부적 태그", + text = { + "무료 {C:tarot}메가 아르카나 팩{} 을", + "제공합니다" + } + }, + tag_meteor = { + name = "유성 태그", + text = { + "무료 {C:attention}메가 천체 팩{} 을", + "제공합니다" + } + }, + tag_buffoon = { + name = "어릿광대 태그", + text = { + "무료 {C:attention}어릿광대 팩{} 을", + "제공합니다" + } + }, + tag_handy = { + name = "유용한 태그", + text = { + "이번 런에서 플레이한 {C:blue}핸드{}당", + "{C:money}$#1#{}를 제공합니다", + "{C:inactive}({C:money}$#2#{C:inactive} 제공)" + } + }, + tag_garbage = { + name = "쓰레기 태그", + text = { + "이번 런에서 사용하지 않은 {C:red}버리기{}당", + "{C:money}$#1#{}를 제공합니다", + "{C:inactive}({C:money}$#2#{C:inactive} 제공)" + } + }, + tag_coupon = { + name = "쿠폰 태그", + text = { + "다음 상점의", + "초기 카드 및", + "부스터 팩이 무료입니다" + } + }, + tag_double = { + name = "더블 태그", + text = { + "다음에 선택한 {C:attention}태그{} 의", + "복사본을 제공합니다", + "{s:0.8,C:attention}더블 태그{s:0.8} 제외" + } + }, + tag_juggle = { + name = "저글러 태그", + text = { + "다음 라운드의", + "{C:attention}+#1#{} 핸드 크기" + } + }, + tag_d_six = { + name = "D6 태그", + text = { + "다음 상점에서 리롤이", + "{C:money}$0{} 로 시작됩니다" + } + }, + tag_top_up = { + name = "보충 태그", + text = { + "최대 {C:attention}#1#{} 장의", + "{C:blue}일반{} 조커를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + tag_skip = { + name = "속도 태그", + text = { + "이번 런에서 건너뛴 블라인드마다", + "{C:money}$#1#{} 를 제공합니다", + "{C:inactive}({C:money}$#2# 를 제공합니다{C:inactive})" + } + }, + tag_orbital = { + name = "궤도 태그", + text = { + "{C:attention}#1#{} 을(를)", + "{C:attention}#2# 레벨{} 만큼 업그레이드합니다" + } + }, + tag_economy = { + name = "경제 태그", + text = { + "돈을 두 배로 만듭니다", + "{C:inactive}(최대 {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "천상의 태그", + text = { + "무료 {C:attention}천체 팩{} 을", + "제공합니다" + } + } + }, + Blind = { + bl_small = { + name = "스몰 블라인드", + text = {} + }, + bl_big = { + name = "빅 블라인드", + text = {} + }, + bl_hook = { + name = "훅", + text = { + "핸드를 플레이할 때마다", + "2장의 무작위 카드를 버립니다" + } + }, + bl_wall = { + name = "벽", + text = { + "특대형 블라인드" + } + }, + bl_wheel = { + name = "바퀴", + text = { + " / 7 의 확률로 카드가", + "뒤집혀서 나옵니다" + } + }, + bl_arm = { + name = "팔", + text = { + "플레이한 포커 핸드의", + "레벨이 낮아집니다" + } + }, + bl_psychic = { + name = "심령술사", + text = { + "반드시 카드 5장을 플레이해야 합니다" + } + }, + bl_goad = { + name = "자극", + text = { + "모든 스페이드 카드가", + "디버프됩니다" + } + }, + bl_water = { + name = "물", + text = { + "0번의 버리기로", + "시작합니다" + } + }, + bl_eye = { + name = "눈", + text = { + "이 라운드에서는", + "핸드 유형의 반복이 불가능합니다" + } + }, + bl_mouth = { + name = "입", + text = { + "이 라운드에서는 오직", + "1개 유형의 핸드로 플레이합니다" + } + }, + bl_plant = { + name = "행성", + text = { + "모든 그림 카드가", + "디버프됩니다" + } + }, + bl_needle = { + name = "바늘", + text = { + "오직 한 번의 핸드로 플레이합니다" + } + }, + bl_head = { + name = "머리", + text = { + "모든 하트 카드가", + "디버프됩니다" + } + }, + bl_tooth = { + name = "이빨", + text = { + "플레이한 카드당", + "$1를 잃습니다" + } + }, + bl_final_leaf = { + name = "파릇파릇한 잎", + text = { + "1장의 조커가 팔릴 때까지", + "모든 카드가 디버프됩니다" + } + }, + bl_final_vessel = { + name = "바이올렛 선박", + text = { + "대형 블라인드" + } + }, + bl_ox = { + name = "황소", + text = { + "#1# 을(를) 플레이하면", + "돈이 $0가 됩니다" + } + }, + bl_house = { + name = "집", + text = { + "첫 핸드가", + "뒤집혀서 나옵니다" + } + }, + bl_club = { + name = "클럽", + text = { + "모든 클럽 카드가", + "디버프됩니다" + } + }, + bl_fish = { + name = "물고기", + text = { + "각 핸드의 플레이 후", + "카드가 뒤집혀서 뽑힙니다" + } + }, + bl_window = { + name = "창문", + text = { + "모든 다이아몬드 카드가", + "디버프됩니다" + } + }, + bl_manacle = { + name = "수갑", + text = { + "-1 핸드 크기" + } + }, + bl_serpent = { + name = "뱀", + text = { + "플레이 또는 버리기 후,", + "항상 카드 3장을 뽑습니다" + } + }, + bl_pillar = { + name = "기둥", + text = { + "이전에 이 앤티를 플레이한", + "카드가 디버프됩니다" + } + }, + bl_flint = { + name = "부싯돌", + text = { + "기본 칩과 배수가", + "절반이 됩니다" + } + }, + bl_mark = { + name = "가면", + text = { + "모든 그림 카드가", + "뒤집혀서 나옵니다" + } + }, + bl_final_acorn = { + name = "호박 도토리", + text = { + "모든 조커 카드를", + "플립 및 셔플합니다" + } + }, + bl_final_heart = { + name = "진홍색 하트", + text = { + "모든 핸드에서 조커 한 장이", + "무작위로 비활성화됩니다" + } + }, + bl_final_bell = { + name = "짙은 청색 벨", + text = { + "항상 카드 1장이", + "강제 선택됩니다" + } + } + }, + Back = { + b_red = { + name = "레드 덱", + text = { + "라운드마다", + "{C:red}+#1#{} 버리기" + } + }, + b_blue = { + name = "블루 덱", + text = { + "라운드마다", + "{C:red}+#1#{} 핸드" + } + }, + b_yellow = { + name = "옐로우 덱", + text = { + "추가 {C:money}$#1#{} 로", + "시작합니다" + } + }, + b_green = { + name = "그린 덱", + text = { + "각 라운드 종료 시:", + "{s:0.85}남은 {C:blue}핸드{} 당 {C:money}$#1#", + "{s:0.85}남은 {C:red}버리기{} 당 {C:money}$#2#", + "{C:attention}이자{} 가 없습니다" + } + }, + b_black = { + name = "블랙 덱", + text = { + "매 라운드", + "", + "{C:attention}+#1#{} 개의 조커 슬롯", + "{C:blue}-#2#{} 핸드" + } + }, + b_magic = { + name = "매직 덱", + text = { + "{C:tarot,T:v_crystal_ball}#1#{} 바우처", + "및 {C:tarot,T:c_fool}#2#", + "복사본 {C:attention}2{} 장으로", + "런을 시작합니다" + } + }, + b_nebula = { + name = "네뷸라 덱", + text = { + "{C:planet,T:v_telescope}#1#{} 바우처 및", + "{C:red}#2#{} 개의 소모품 슬롯으로", + "", + "런을 시작합니다" + } + }, + b_metal = { + name = "메탈 덱", + text = { + "{C:attention}스틸 카드{} 로", + "강화된 {C:attention}#1#{} 장의", + "플레잉 카드로 런을 시작합니다" + } + }, + b_abandoned = { + name = "버려진 덱", + text = { + "덱에", + "{C:attention}그림 카드{} 없이", + "런을 시작합니다" + } + }, + b_checkered = { + name = "체크무늬 덱", + text = { + "덱에 {C:attention}26{} 장의 {C:spades} 스페이드{} 및", + "{C:attention}26{} 장의 {C:hearts} 하트{} 를 갖고", + "런을 시작합니다" + } + }, + b_rocky = { + name = "로키 덱", + text = { + "추가 {C:attention}스톤 카드", + "{C:attention}#1#{} 장으로 런을 시작합니다" + } + }, + b_braided = { + name = "땋은 덱", + text = { + "첫 번째로 플레이하는 핸드를", + "{C:attention}Lv.3{} 으로 업그레이드합니다" + } + }, + b_anaglyph = { + name = "입체 사진 덱", + text = { + "각 {C:attention}보스 블라인드{} 를", + "물리친 후,", + "{C:attention,T:tag_double}#1#{}을(를) 획득합니다" + } + }, + b_plasma = { + name = "플라스마 덱", + text = { + "플레이한 핸드의", + "점수를 계산할 때 {C:blue}칩{} 과 {C:red}배수{} 의", + "균형을 맞춥니다", + "{C:red}X#1#{} 기본 블라인드 크기" + } + }, + b_erratic = { + name = "불규칙한 덱", + text = { + "덱의 모든 {C:attention}랭크{} 및", + "{C:attention}수트{} 가", + "무작위로 지정됩니다" + } + }, + b_challenge = { + name = "챌린지 덱", + text = { + "" + } + }, + b_ghost = { + name = "고스트 덱", + text = { + "{C:spectral}유령{} 카드가", + "상점에서 나타납니다", + "{C:spectral,T:c_hex}헥스{} 카드로 시작합니다" + } + }, + b_zodiac = { + name = "황도대 덱", + text = { + "덱에 {C:attention}26{} 장의 {C:spades} 스페이드{} 및", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "및 {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "칠한 덱", + text = { + "{C:attention}+#1#{} 핸드 크기", + "{C:red}#2#{} 조커 슬롯" + } + } + }, + Other = { + gold_seal = { + name = "골드 봉인", + text = { + "이 카드를 플레이하면", + "{C:money}$3{}를 획득합니다", + "및 점수" + } + }, + white_sticker = { + name = "화이트 스티커", + text = { + "이 조커를 사용하여", + "{C:attention}화이트 스테이크", + "난이도에서 승리함" + } + }, + red_sticker = { + name = "레드 스티커", + text = { + "이 조커를 사용하여", + "{C:attention}레드 스테이크", + "난이도에서 승리함" + } + }, + green_sticker = { + name = "그린 스티커", + text = { + "이 조커를 사용하여", + "{C:attention}그린 스테이크", + "난이도에서 승리함" + } + }, + blue_sticker = { + name = "블루 스티커", + text = { + "이 조커를 사용하여", + "{C:attention}블루 스테이크", + "난이도에서 승리함" + } + }, + black_sticker = { + name = "블랙 스티커", + text = { + "이 조커를 사용하여", + "{C:attention}블랙 스테이크", + "난이도에서 승리함" + } + }, + purple_sticker = { + name = "퍼플 스티커", + text = { + "이 조커를 사용하여", + "{C:attention}퍼플 스테이크", + "난이도에서 승리함" + } + }, + orange_sticker = { + name = "오렌지 스티커", + text = { + "이 조커를 사용하여", + "{C:attention}오렌지 스테이크", + "난이도에서 승리함" + } + }, + gold_sticker = { + name = "골드 스티커", + text = { + "이 조커를 사용하여", + "{C:attention}골드 스테이크", + "난이도에서 승리함" + } + }, + playing_card = { + text = { + "{V:1}#2# 의 {C:light_black}#1#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} 개의 칩" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1#{} 개의 추가 칩" + } + }, + locked = { + name = "잠김", + text = {} + }, + debuffed_default = { + name = "디버프됨", + text = { + "모든 능력이", + "비활성화됨" + } + }, + debuffed_playing_card = { + name = "디버프됨", + text = { + "칩 획득 불가 및", + "모든 능력이", + "비활성화됨" + } + }, + demo_locked = { + name = "잠김", + text = { + "이 체험판에서는", + "사용할 수 없습니다" + } + }, + demo_shop_locked = { + name = "잠김", + text = { + "{C:attention}짐보{} 의 개인 컬렉션", + "카드로서,", + "{E:1,C:red}Balatro", + "정식 버전에서 사용할 수 있습니다" + } + }, + wip_locked = { + name = "잠김", + text = { + "작업", + "진행 중" + } + }, + deck_locked_win = { + name = "잠김", + text = { + "아무 난이도에서", + "{C:attention}#1#{} (으)로", + "런을 승리합니다" + } + }, + deck_locked_discover = { + name = "잠김", + text = { + "컬렉션에서", + "최소 {C:attention}#1#{} 개의 아이템을", + "발견합니다" + } + }, + deck_locked_stake = { + name = "잠김", + text = { + "최소 {V:1}#1#{} 난이도에서", + "아무 덱으로", + "런을 승리합니다" + } + }, + joker_locked_legendary = { + name = "잠김", + text = { + "{C:spectral}영혼{} 카드에서", + "이 조커를 찾습니다" + } + }, + undiscovered_joker = { + name = "발견되지 않음", + text = { + "시드되지 않은 런에서", + "이 카드를 구매하거나", + "사용하여", + "기능을 알아보세요" + } + }, + undiscovered_tarot = { + name = "발견되지 않음", + text = { + "시드되지 않은 런에서", + "이 카드를 구매하거나", + "사용하여", + "기능을 알아보세요" + } + }, + undiscovered_planet = { + name = "발견되지 않음", + text = { + "시드되지 않은 런에서", + "이 카드를 구매하거나", + "사용하여", + "기능을 알아보세요" + } + }, + undiscovered_spectral = { + name = "발견되지 않음", + text = { + "시드되지 않은 런에서", + "이 카드를 구매하거나", + "사용하여", + "기능을 알아보세요" + } + }, + undiscovered_voucher = { + name = "발견되지 않음", + text = { + "시드되지 않은 런에서", + "이 바우처를", + "교환하여", + "기능을 알아보세요" + } + }, + undiscovered_booster = { + name = "발견되지 않음", + text = { + "시드되지 않은 런에서", + "이 팩을 열어", + "기능을 알아보세요" + } + }, + undiscovered_edition = { + name = "발견되지 않음", + text = { + "시드되지 않은 런에서", + "이 에디션을 찾아", + "기능을 알아보세요" + } + }, + undiscovered_tag = { + name = "발견되지 않음", + text = { + "시드되지 않은 런에서", + "이 태그를 사용해", + "기능을 알아보세요" + } + }, + p_arcana_normal = { + name = "아르카나 팩", + text = { + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:tarot}타로{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_arcana_jumbo = { + name = "점보 아르카나 팩", + text = { + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:tarot}타로{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_arcana_mega = { + name = "메가 아르카나 팩", + text = { + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:tarot}타로{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_celestial_normal = { + name = "천체 팩", + text = { + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:planet}행성{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_celestial_jumbo = { + name = "점보 천체 팩", + text = { + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:planet}행성{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_celestial_mega = { + name = "메가 천체 팩", + text = { + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:planet}행성{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_spectral_normal = { + name = "유령 팩", + text = { + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:spectral}유령{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_spectral_jumbo = { + name = "점보 유령 팩", + text = { + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:spectral}유령{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_spectral_mega = { + name = "메가 유령 팩", + text = { + "즉시 사용할 최대", + "{C:attention}#2#{} 장의 {C:spectral}유령{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_standard_normal = { + name = "표준 팩", + text = { + "덱에 추가할 최대", + "{C:attention}#2#{} 장의 {C:attention}플레잉{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_standard_jumbo = { + name = "점보 표준 팩", + text = { + "덱에 추가할 최대", + "{C:attention}#2#{} 장의 {C:attention}플레잉{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_standard_mega = { + name = "메가 표준 카드", + text = { + "덱에 추가할 최대", + "{C:attention}#2#{} 장의 {C:attention}플레잉{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_buffoon_normal = { + name = "어릿광대 팩", + text = { + "최대 {C:attention}#2#{} 장의 {C:joker}조커{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_buffoon_jumbo = { + name = "점보 어릿광대 팩", + text = { + "최대 {C:attention}#2#{} 장의 {C:joker}조커{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + p_buffoon_mega = { + name = "메가 어릿광대 팩", + text = { + "최대 {C:attention}#2#{} 장의 {C:joker}조커{} 카드 중", + "{C:attention}#1#{} 장을 선택합니다" + } + }, + pinned_left = { + name = "고정", + text = { + "이 조커는", + "가장 왼쪽에", + "고정됩니다" + } + }, + red_seal = { + name = "레드 봉인", + text = { + "이 카드를 {C:attention}1{}번", + "다시 트리거합니다" + } + }, + blue_seal = { + name = "블루 봉인", + text = { + "이 카드를 {C:attention}보유하면{}", + "{C:planet}행성{} 카드를 생성합니다", + "라운드 종료 시 핸드" + } + }, + purple_seal = { + name = "퍼플 봉인", + text = { + "{C:attention}버리면", + "{C:tarot}타로{} 카드를 생성합니다", + "{C:inactive}(공간이 있어야 합니다)" + } + }, + eternal = { + name = "이터널", + text = { + "판매하거나", + "파괴할 수 없습니다" + } + }, + challenge_locked = { + name = "잠김", + text = { + "챌린지 모드를 해제하려면", + "최소 #1#개의 다른 덱으로", + "런을 승리합니다", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "스페이드", + Hearts = "하트", + Clubs = "클럽", + Diamonds = "다이아몬드" + }, + suits_plural = { + Spades = "스페이드", + Hearts = "하트", + Clubs = "클럽", + Diamonds = "다이아몬드" + }, + blind_states = { + Select = "선택", + Skipped = "건너뜀", + Current = "현재", + Defeated = "패배함", + Upcoming = "예정", + Selected = "선택함" + }, + ranks = { + Ace = "에이스", + King = "킹", + Queen = "퀸", + Jack = "잭", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "베스트 핸드", + furthest_round = "최고 라운드", + furthest_ante = "최고 앤티", + most_money = "최고 금액", + boss_streak = "최다 연속 보스", + collection = "컬렉션", + win_streak = "최다 연승", + current_streak = "", + poker_hand = "가장 많이 플레이한 핸드" + }, + poker_hands = { + ['Flush House'] = "플러시 하우스", + ['Five of a Kind'] = "파이브 카드", + ['Royal Flush'] = "로열 플러시", + ['Straight Flush'] = "스트레이트 플러시", + ['Four of a Kind'] = "포 카드", + ['Full House'] = "풀하우스", + ['Flush'] = "플러시", + ['Straight'] = "스트레이트", + ['Three of a Kind'] = "트리플", + ['Two Pair'] = "투 페어", + ['Pair'] = "페어", + ['High Card'] = "하이 카드", + ['Flush Five'] = "플러시 파이브" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "모든 카드가 같은 수트를 공유하는", + "트리플 및 페어" + }, + ['Five of a Kind'] = { + "같은 랭크의 카드 5장" + }, + ['Royal Flush'] = { + "모든 카드가 같은 수트를 공유하는", + "연속 5장의 카드 {연속 랭크}" + }, + ['Straight Flush'] = { + "모든 카드가 같은 수트를 공유하는", + "연속 5장의 카드 {연속 랭크}" + }, + ['Four of a Kind'] = { + "같은 랭크의 카드 4장. 득점하지 않는", + "나머지 1장의 카드와 플레이할 수 있습니다" + }, + ['Full House'] = { + "트리플 및 페어" + }, + ['Flush'] = { + "같은 수트를 공유하는 5장의 카드" + }, + ['Straight'] = { + "연속 5장의 카드 {연속 랭크}" + }, + ['Three of a Kind'] = { + "같은 랭크의 카드 3장.", + "나머지 2장의 카드와 플레이할 수 있습니다" + }, + ['Two Pair'] = { + "서로 다른 랭크의 카드 2쌍.", + "나머지 1장의 카드와 플레이할 수 있습니다" + }, + ['Pair'] = { + "같은 랭크를 공유하는 카드 2장. 득점하지 않는", + "나머지 3장의 카드와 플레이할 수 있습니다" + }, + ['High Card'] = { + "플레이한 핸드가 위의 핸드에 해당하지", + "않으면, 가장 높은 랭크의 카드만 득점합니다" + }, + ['Flush Five'] = { + "같은 랭크 및 수트의 카드 5장" + } + }, + labels = { + common = "일반", + uncommon = "희귀", + rare = "레어", + legendary = "레전더리", + tarot = "타로", + planet = "행성", + pluto_planet = "왜소행성", + voucher = "바우처", + foil = "포일", + holographic = "홀로그래픽", + polychrome = "폴리크롬", + negative = "네거티브", + gold_seal = "골드 봉인", + locked = "잠김", + blue_seal = "블루 봉인", + red_seal = "레드 봉인", + purple_seal = "퍼플 봉인", + eternal = "이터널", + pinned_left = "고정" + }, + dictionary = { + b_sell = "판매", + b_use = "사용", + b_select = "선택", + b_buy = "구매", + b_redeem = "교환", + b_open = "열기", + b_and_use = "및 사용", + b_next_round_1 = "다음", + b_next_round_2 = "라운드", + b_play_hand = "핸드 플레이", + b_discard = "버리기", + b_sort_hand = "핸드 정렬", + b_run_info_1 = "런", + b_run_info_2 = "정보", + b_options = "옵션", + b_reroll_boss = "보스 리롤", + b_skip_blind = "블라인드 건너뛰기", + b_skip_reward = "보상 건너뛰기", + b_skip = "건너뛰기", + b_start_new_run = "새로운 런", + b_main_menu = "메인 메뉴", + b_collection = "컬렉션", + b_seed = "시드", + b_copy_seed = "시드 복사", + b_credits = "크레딧", + b_stats = "통계", + b_settings = "설정", + b_set_game = "게임", + b_set_video = "비디오", + b_set_graphics = "그래픽", + b_set_audio = "오디오", + b_set_gamespeed = "게임 속도", + b_set_play_discard_pos = "플레이/버리기 버튼 위치", + b_set_screenshake = "화면 흔들기", + b_set_crash_reports = "충돌 보고서", + b_set_monitor = "모니터 디스플레이", + b_set_windowmode = "창 모드", + b_set_apply = "적용", + b_set_master_vol = "마스터 볼륨", + b_set_music_vol = "음악 볼륨", + b_set_game_vol = "게임 볼륨", + b_set_shadows = "그림자", + b_set_pixel_smoothing = "픽셀 아트 다듬기", + b_set_CRT = "CRT", + b_set_CRT_bloom = "CRT 블룸", + b_stat_jokers = "조커", + b_stat_consumables = "소모품", + b_stat_tarots = "타로", + b_stat_planets = "행성", + b_stat_spectrals = "유령", + b_stat_vouchers = "바우처", + b_next = "다음", + b_endless = "무한 모드", + b_wishlist = "Steam의 찜 목록", + b_playbalatro = "playbalatro.com 방문", + b_remaining = "남음", + b_full_deck = "풀 덱", + b_poker_hands = "포커 핸드", + b_blinds = "블라인드", + b_vouchers = "바우처", + b_stake = "스테이크", + b_jokers = "조커", + b_tarot_cards = "타로 카드", + b_planet_cards = "행성 카드", + b_spectral_cards = "유령 카드", + b_enhanced_cards = "강화된 카드", + b_editions = "에디션", + b_booster_packs = "부스터 팩", + b_tags = "태그", + b_decks = "덱", + b_continue = "계속하기", + b_back = "뒤로", + b_music = "음악", + b_sounds = "사운드", + b_imagery = "이미지", + b_new_run = "새로운 런", + b_challenges = "챌린지", + b_current_profile = "현재 프로필", + b_load_profile = "프로필 불러오기", + b_create_profile = "프로필 생성", + b_delete_profile = "프로필 삭제", + b_reset_profile = "프로필 초기화", + b_rules = "규칙", + b_restrictions = "제한", + b_deck = "덱", + b_play_cap = "플레이", + b_options_cap = "옵션", + b_collection_cap = "컬렉션", + b_quit_cap = "나가기", + b_cash_out = "캐시 아웃", + k_unknown = "?????", + k_compatible = "호환 가능", + k_incompatible = "호환 불가능", + k_round = "라운드", + k_ante = "앤티", + k_seed = "시드", + k_reroll = "리롤", + k_mult = "배수", + k_rank = "랭크", + k_suit = "수트", + k_stake = "스테이크", + k_common = "일반", + k_uncommon = "희귀", + k_rare = "레어", + k_legendary = "레전더리", + k_debuffed = "디버프됨", + k_locked = "잠김", + k_undisovered = "발견되지 않음", + k_joker = "조커", + k_voucher = "바우처", + k_tarot = "타로", + k_planet = "행성", + k_dwarf_planet = "왜소행성", + k_planet_q = "행성?", + k_spectral = "유령", + k_booster = "부스터", + k_edition = "에디션", + k_hud_hands = "핸드", + k_hud_discards = "버리기", + k_lower_score = "점수", + k_arcana_pack = "아라카나 팩", + k_celestial_pack = "천체 팩", + k_spectral_pack = "유령 팩", + k_standard_pack = "표준 팩", + k_buffoon_pack = "어릿광대 팩", + k_enter_text = "텍스트 입력", + k_defeated_by = "패배한 대상:", + k_level_prefix = "Lv.", + k_also_applied = "추가 적용", + k_base_cards = "기본 카드", + k_effective = "유효", + k_aces = "에이스", + k_face_cards = "그림 카드", + k_numbered_cards = "숫자 카드", + k_cap_consumables = "소모품", + k_page = "페이지", + k_ante_cap = "앤티", + k_base_cap = "기본", + k_jokers_cap = "조커", + k_vouchers_cap = "바우처", + k_x_base = "X 기본", + k_not_discovered = "발견되지 않음", + k_unlocked_ex = "해제됨!", + k_challenge_mode = "챌린지 모드", + k_daily_run = "일일 런", + k_profile = "프로필", + k_wins = "승리", + k_empty_caps = "비어 있음", + k_collection = "컬렉션", + k_stake_level = "스테이크 레벨", + k_none = "없음", + k_game_modifiers = "게임 사용자 정의", + k_custom_rules = "규칙 사용자 지정", + k_banned_cards = "금지된 카드", + k_banned_tags = "금지된 태그", + k_other = "기타", + k_money = "돈", + k_best_hand = "베스트 핸드", + k_seeded_run = "시드된 런", + k_enter_seed = "시드 입력", + k_lvl = "Lv.", + k_skipped_cap = "건너뜀", + k_no_reward = "보상 없음", + k_reward = "보상", + k_nope_ex = "아니요!", + k_or = "또는", + k_balanced = "균형됨", + ph_improve_run = "런을 업그레이드하세요!", + ph_sneak_peek = "미리 보기", + ph_deck_preview_stones = "스톤", + ph_deck_preview_effective = "조커, 블라인드 및 카드 강화에 따른 유효 합계", + ph_blind_score_at_least = "최소 득점:", + ph_blind_reward = "보상:", + ph_up_ante_1 = "앤티 상향", + ph_up_ante_2 = "모든 블라인드 향상", + ph_up_ante_3 = "블라인드 새로고침", + ph_stat_joker = "이 카드로 완료한 라운드 합계", + ph_stat_consumable = "이 카드를 사용한 횟수", + ph_stat_voucher = "이 바우처를 교환한 횟수", + ph_demo_thanks_1 = "BALATRO 체험판을", + ph_demo_thanks_2 = "플레이해 주셔서 감사합니다", + ph_game_over = "게임 오버", + ph_vouchers_redeemed = "이번 런에서 교환한 바우처", + ph_no_vouchers = "이번 런에서 교환한 바우처 없음", + ph_defeat_this_blind_1 = "이 블라인드를 처치해서", + ph_defeat_this_blind_2 = "발견합니다", + ph_click_confirm = "다시 클릭해서 확인하세요", + ph_choose_blind_1 = "다음 블라인드를", + ph_choose_blind_2 = "선택하세요", + ph_mr_bones = "미스터 본즈에 의해 생존", + ph_score_at_least = "최소 득점:", + ph_all_poker_hand = "모든 포커 핸드", + ph_1_level = "+1 레벨", + ph_boss_disabled = "보스 비활성화!", + ph_most_played = "(가장 많이 플레이한 핸드)", + ml_demo_thanks_message = { + "Steam에서 Balatro를 ", + "찜 목록에 담고 playbalatro.com에서", + "뉴스레터를 구독하세요" + }, + ml_eternal = { + "이터널은", + "판매하거나", + "파괴할 수 없습니다" + }, + ml_gold_seal_desc = { + "금 봉인은", + "플레이하면", + "핸드로 돌아옵니다" + }, + ml_crash_report_info = { + "충돌 보고서는 개발자에게 전달되어", + "향후 문제를 줄이는 데 도움이 됩니다.", + "신원 또는 개인 정보는 포함되지 않습니다." + }, + ml_play_discard_pos_opt = { + "버리기/플레이", + "플레이/버리기" + }, + ml_windowmode_opt = { + "창 모드", + "전체 화면", + "꽉 찬 화면" + }, + ml_vsync_opt = { + "VSync 켜짐", + "VSync 꺼짐" + }, + ml_shadow_opt = { + "켜짐", + "꺼짐" + }, + ml_smoothing_opt = { + "꺼짐", + "켜짐" + }, + ml_bloom_opt = { + "꺼짐", + "켜짐" + }, + ml_card_stats = { + "카드", + "통계" + }, + ml_paste_seed = { + "붙이기", + "시드" + }, + ml_disabled_seed = { + "모든 해제 및", + "발견이 비활성화됨" + }, + ['$'] = "$", + k_redeemed_ex = "교환됨!", + k_duplicated_ex = "복제됨!", + k_no_room_ex = "공간 없음!", + k_no_space_ex = "자리 부족!", + k_no_other_jokers = "다른 조커 불가!", + k_plus_tarot = "+1 타로", + k_plus_stone = "+1 스톤", + k_plus_planet = "+1 행성", + k_plus_spectral = "+1 유령", + k_active_ex = "활성화!", + k_level_up_ex = "레벨 업!", + k_upgrade_ex = "업그레이드!", + k_again_ex = "다시!", + k_val_up = "가치 향상!", + k_reset = "초기화", + k_extinct_ex = "소멸!", + k_safe_ex = "안전!", + k_saved_ex = "생존!", + k_swapped_ex = "교체됨!", + k_copied_ex = "복사됨!", + k_melted_ex = "녹음!", + b_copy = "복사", + b_high_contrast_cards = "고대비 카드", + b_set_rumble = "컨트롤러 진동", + b_seals = "봉인", + b_new_challenge = "새로운 챌린지 시작", + b_unlock_all = "모두 잠금 해제", + k_active = "활성화", + k_deck = "덱", + k_progress = "진행 내용", + k_challenges = "챌린지", + k_joker_stickers = "조커 스티커", + k_deck_stake_wins = "덱 스테이크 승리", + k_enter_name = "이름 입력", + k_gold = "골드", + k_card_stats = "카드 통계", + k_view = "보기", + k_all_hands = "모든 핸드", + k_high_score_ex = "높은 점수!", + k_demo_version_ex = "체험판 버전!", + k_playing_as = "플레이 이름:", + k_choose = "선택", + k_achievements_disabled = "도전과제 비활성화됨", + ph_no_boss_active = "활성화된 보스 없음", + ph_you_win = "승리!", + ph_you_win_demo = "체험판에서 승리했습니다!", + ph_defeat_the_boss = "보스 블라인드 처치", + ph_score_furthest_ante = "앤티", + ph_score_furthest_round = "라운드", + ph_score_hand = "베스트 핸드", + ph_score_poker_hand = "가장 많이 플레이한 핸드", + ph_score_new_collection = "새로운 발견", + ph_score_cards_played = "플레이한 카드", + ph_score_cards_discarded = "버린 카드", + ph_score_times_rerolled = "리롤한 시간", + ph_score_cards_purchased = "구매한 카드", + ml_edition_seal_enhancement_explanation = { + "플레잉 카드는 강화, 에디션, 봉인을", + "하나씩 가질 수도 있습니다" + }, + ml_unlock_all_explanation = { + "경고! 완전한 컬렉션을 잠금 해제하면", + "이 프로필의 도전과제가 비활성화됩니다!" + }, + k_plus_joker = "+1 조커", + k_eaten_ex = "먹힘!", + k_eroded_ex = "무너짐!", + k_achievement = "도전과제", + ph_unscored_hand = "핸드가 득점하지 않습니다", + ph_alert_debuff_confirm = "'플레이'를 다시 눌러서 확인하세요", + k_drank_ex = "소모함!", + k_trophy = "트로피", + k_trophies_disabled = "트로피 비활성화됨", + ml_unlock_all_trophies = { + "경고! 완전한 컬렉션을 잠금 해제하면", + "이 프로필의 트로피가 비활성화됩니다!" + }, + k_poker_hand = "포커 핸드", + ph_4_7_of_clubs = "클럽 4개 7개" + }, + v_dictionary = { + a_xmult = "X#1# 배수", + a_mult = "+#1# 배수", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# 핸드 크기", + a_hands = "+#1# 핸드", + a_sold_tally = "#1#/#2# 판매", + a_remaining = "#1# 남음", + ante_x_voucher = "앤티 #1# 바우처", + loyalty_active = "활성화!", + loyalty_inactive = "#1# 남음", + deck_preview_wheel_singular = "#1# 카드가 뒤집혀서 나오기 때문에 숫자가 더 낮을 수도 있습니다", + deck_preview_wheel_plural = "#1# 카드가 뒤집혀서 나오기 때문에 숫자가 더 낮을 수도 있습니다", + challenges_completed = "완료한 #1#/#2# 챌린지", + interest = "$#2#당 이자 #1# (최대 #3#)", + remaining_hand_money = "남은 핸드 (각 $#1#)", + remaining_discard_money = "남은 버리기 (각 $#1#)", + ml_foil_desc = { + "포일", + "+#1# 개의 칩" + }, + ml_holo_desc = { + "홀로그래픽", + "+#1# 배수" + }, + ml_polychrome_desc = { + "폴리크롬", + "X#1# 배수" + }, + ml_negative_desc = { + "네거티브", + "매 라운드" + }, + a_mult_minus = "-#1# 배수", + a_handsize_minus = "-#1# 핸드 크기", + ml_negative_consumable_desc = { + "네거티브", + "+#1# 소모품 슬롯" + }, + a_xmult_minus = "-X#1# 배수", + unlocked = "#1#/#2# 해제됨", + completed = "#1#/#2# 완료됨" + }, + v_text = { + ch_m_dollars = { + "{C:money}$#1#{} 로 시작합니다" + }, + ch_m_hands = { + "라운드당 {C:blue}#1#{} 번의 핸드" + }, + ch_m_discards = { + "라운드당 {C:red}#1#{} 번의 버리기" + }, + ch_m_reroll_cost = { + "{C:money}$#1#{} 의 기본 리롤 비용" + }, + ch_m_joker_slots = { + "{C:attention}#1#{} 개의 조커 슬롯" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} 개의 소모품 슬롯" + }, + ch_m_hand_size = { + "{C:attention}#1#{} 핸드 크기" + }, + ch_m_none = { + "{C:inactive}없음" + }, + ch_c_no_reward = { + "모든 {C:attention}블라인드{} 가 보상 돈을 제공하지 않습니다" + }, + ch_c_no_reward_specific = { + "{C:attention}#1# 블라인드{} 가 보상 돈을 제공하지 않습니다" + }, + ch_c_no_extra_hand_money = { + "추가 {C:blue}핸드{} 가 더 이상 돈을 획득하지 않습니다" + }, + ch_c_no_interest = { + "라운드 종료 시 {C:attention}이자{} 를 획득하지 않습니다" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}일일 챌린지!" + }, + ch_c_set_seed = { + "설정된 시드로 1회 시도: {C:inactive}{숨김}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}칩{} 은 현재 {C:money}${} 를 초과할 수 없습니다" + }, + ch_c_none = { + "{C:inactive} 없음" + }, + ch_c_inflation = { + "구매할 때마다 가격을 {C:money}$1{}씩 영구적으로 인상합니다" + }, + ch_c_discard_cost = { + "각 버리기 비용은 {C:money}$#1#{}입니다" + }, + ch_c_all_eternal = { + "모든 상점 조커는 {C:eternal}이터널{}입니다" + }, + ch_c_flipped_cards = { + "{C:green}1/#1#{}장의 카드가 뒤집혀서 나옵니다" + }, + ch_c_minus_hand_size_per_X_dollar = { + "{C:money}$#1#{}를 보유할 때마다 핸드에서 카드 {C:red}-1{}장을 보유합니다" + }, + ch_c_no_shop_jokers = { + "조커가 {C:attention}상점에서 더 이상 나타나지 않습니다" + }, + ch_c_debuff_played_cards = { + "모든 {C:attention}플레이한{} 카드가 득점 후 {C:attention}디버프됩니다{}" + }, + ch_c_set_eternal_ante = { + "앤티 {C:attention}#1#{} 보스가 패배하면, 모든 조커는 {C:attention}이터널이 됩니다" + }, + ch_c_set_joker_slots_ante = { + "앤티 {C:attention}#1#{} 보스가 패배하면, 조커 슬롯은 {C:attention}0으로 설정됩니다" + } + }, + tutorial = { + sb_1 = { + "안녕하세요! 게임 플레이", + "방법을 익히도록 도움을 드릴", + "{C:attention}짐보{}라고 합니다!" + }, + sb_2 = { + "여러분의 목표는", + "{C:blue}칩{} 을 획득해서", + "적 {C:attention}블라인드{}를 물리치는 겁니다" + }, + sb_3 = { + "이건 {C:blue}스몰 블라인드{}로,", + "물리치려면 {C:attention}칩 300개{} 만", + "획득하면 됩니다." + }, + sb_4 = { + "{C:blue}스몰 블라인드{} 를 선택해서", + "라운드를 시작하세요!" + }, + bb_1 = { + "{C:attention}빅 블라인드{} 를 선택해서", + "더 많은 현금을 획득할 수 있어요" + }, + bb_2 = { + "또는 {C:attention}건너뛰기{} 를 선택해서", + "{C:attention}태그{} 를 받을 수 있죠! 각", + "{C:attention}태그{} 에는 고유한 효과가 있습니다" + }, + bb_3 = { + "하지만 {C:attention}보스 블라인드{} 를", + "주시하세요. 특정한 능력을", + "보유하고 있기 때문에", + "보다 계획적으로 플레이해야 합니다." + }, + bb_4 = { + "이기게 되면,", + "{C:attention}앤티{} 가 상승하며", + "모든 {C:attention}블라인드{} 가 어려워집니다" + }, + bb_5 = { + "{C:attention}앤티{} #1# 을(를) 이겨 승리하세요.", + "이제 원하는 경로를 선택하세요!" + }, + fh_1 = { + "{C:attention}포커 핸드{} 를 플레이하면", + "칩을 획득합니다" + }, + fh_2 = { + "각 {C:attention}포커 핸드{} 는", + "{C:red}배수{} 를 곱한", + "기본 수량의 {C:blue}칩{} 을 획득합니다" + }, + fh_3 = { + "{C:attention}런 정보{} 영역에서", + "{C:attention}포커 핸드{} 와 함께", + "현재 런에 대한", + "다른 정보도 확인해 보세요" + }, + fh_4 = { + "또한 카드를 통해", + "{C:blue}칩{} 을 획득할 수 있으니", + "카드를 하나씩 확인해 보세요!" + }, + fh_5 = { + "이제 최대 {C:attention}5{} 장의", + "플레이할 카드를 선택한 후", + "{C:blue}'핸드 플레이'{}를 누르세요" + }, + fh_6 = { + "또한 더 강한 핸드를 만들기 위해", + "최대 {C:attention}5{} 장의 카드를 선택해", + "{C:red}'버리기'{} 를 할 수도 있습니다.", + "한번 해보세요!" + }, + fh_7 = { + "조심하세요! 라운드당", + "{C:blue}핸드{} 및 {C:red}버리기{} 의 수는", + "한정되어 있습니다." + }, + fh_8 = { + "이 라운드에서 승리하려면", + "{C:blue}핸드{} 가 떨어지기 전에", + "{C:attention}300개의 칩{} 을 획득해야 합니다.", + "행운을 빌어요!" + }, + sh_1 = { + "카드를 더 얻으면,", + "재배열할 수 있습니다", + "왼쪽에서 오른쪽으로 차례대로", + "{C:attention}조커{} 가 트리거됩니다" + }, + sh_2 = { + "또한, 잊지 말고", + "소모품을 {C:attention}사용{} 하세요!" + }, + sh_3 = { + "핸드에서 최대 {C:attention}2{} 장의 카드를", + "선택하고 해당 {C:tarot}타로{} 카드에서", + "{C:attention}'사용'{}을 눌러", + "강화하세요!" + }, + s_1 = { + "잘했어요! 이제", + "{C:money}현금{}이 {E:1}두둑{}하니까,", + "{C:attention}상점{} 에서 새 카드를", + "구매해 보세요" + }, + s_2 = { + "이 잘생긴 악마를", + "구매해 보세요" + }, + s_3 = { + "이것은 런에 추가할 수 있는", + "{C:attention}#1#{} 장의 {C:attention}조커{} 중 하나입니다.", + "모든 {C:attention}조커{} 는", + "각기 다른 기능을 합니다" + }, + s_4 = { + "이것은 플레이하는 모든 핸드에", + "{C:red}+4 배수{} 를 추가합니다!" + }, + s_5 = { + "한 번에 오직 {C:attention}5장의 조커{} 카드만", + "소지할 수 있으니", + "신중하게 선택하세요" + }, + s_6 = { + "이제 {C:attention}상점{} 에서", + "다른 카드를 구매해 보세요" + }, + s_7 = { + "이 {C:tarot}타로{} 카드는", + "{C:attention}소모품{} 입니다. 이것은", + "플레잉 카드를 강화합니다!", + "유용하니 넣어두세요." + }, + s_8 = { + "한 번에 최대", + "{C:attention}2장의 소모품{} 카드를", + "소지할 수 있습니다" + }, + s_9 = { + "돈을 충분히 모으면,", + "{C:attention}바우처{} 를 구매할 수 있습니다.", + "{C:attention}바우처{} 는 패시브로", + "런을 업그레이드합니다!" + }, + s_10 = { + "{C:attention}바우처{} 는", + "{C:attention}보스 블라인드{} 를 처치해야", + "다시 채워집니다." + }, + s_11 = { + "또한, 상점마다", + "{C:booster}부스터 팩{} 두 개를", + "확인하세요. 좋은 걸로", + "가득 차 있습니다!" + }, + s_12 = { + "{C:attention}다음 라운드{}로", + "넘어갑시다." + } + }, + achievement_names = { + ante_up = "앤티 상승!", + ante_upper = "앤티 더 상승!", + heads_up = "알림", + low_stakes = "낮은 스테이크", + mid_stakes = "중간 스테이크", + high_stakes = "높은 스테이크", + card_player = "카드 플레이어", + card_discarder = "카드 버리는 자", + nest_egg = "비상금", + flushed = "플러시 홍조", + speedrunner = "스피드 러너", + roi = "ROI", + shattered = "산산조각", + royale = "로열", + retrograde = "역행", + _10k = "10,000", + _1000k = "10,000,000", + _100000k = "100,000,000", + tiny_hands = "작은 손", + big_hands = "큰 손", + you_get_what_you_get = "얻을 것 얻기", + rule_bender = "규칙 남용자", + rule_breaker = "규칙 파괴자", + legendary = "전설", + astronomy = "천문학", + cartomancy = "카드점", + clairvoyance = "신통력", + extreme_couponer = "극한의 쿠폰 모으는 자", + completionist = "완벽주의자", + completionist_plus = "완벽주의자+", + completionist_plus_plus = "완벽주의자++" + }, + achievement_descriptions = { + ante_up = "앤티 4 도달", + ante_upper = "앤티 8 도달", + heads_up = "런 승리", + low_stakes = "레드 스테이크 난이도 이상에서 런 승리", + mid_stakes = "블루 스테이크 난이도 이상에서 런 승리", + high_stakes = "골드 스테이크 난이도 이상에서 런 승리", + card_player = "카드 2,500장 이상 플레이", + card_discarder = "카드 2,500장 이상 버리기", + nest_egg = "단일 런에서 $400 이상 보유", + flushed = "5장의 와일드 카드로 플러시 플레이", + speedrunner = "12회 이하의 라운드에서 런 승리", + roi = "앤티 4로 바우처 5개 구매", + shattered = "단일 핸드에서 글래스 카드 2장 깨기", + royale = "로열 플러시 플레이", + retrograde = "어떤 포커 핸드든 레벨 10으로 만들기", + _10k = "단일 핸드에서 칩 10,000개 획득", + _1000k = "단일 핸드에서 칩 1,000,000개 획득", + _100000k = "단일 핸드에서 칩 100,000,000개 획득", + tiny_hands = "덱을 카드 20장 이하로 줄이기", + big_hands = "덱에 카드 80장 이상 보유", + you_get_what_you_get = "상점을 리롤하지 않고 런에서 승리", + rule_bender = "어떤 챌린지 런이든 완료", + rule_breaker = "모든 챌린지 런 완료", + legendary = "전설 조커 한 장 발견", + astronomy = "행성 카드 모두 발견", + cartomancy = "타로 카드 모두 발견", + clairvoyance = "유령 카드 모두 발견", + extreme_couponer = "바우처 모두 발견", + completionist = "컬렉션 100% 발견", + completionist_plus = "골드 스테이크 난이도에서 모든 덱으로 승리", + completionist_plus_plus = "모든 조커에 골드 스티커 획득" + }, + quips = { + wq_1 = { + "멋지게 해냈네요!" + }, + wq_2 = { + "아주 잘", + "처리하셨습니다!" + }, + wq_3 = { + "허세가 아니었던", + "것 같군요!" + }, + wq_4 = { + "이 칩이 모두", + "가상이라니", + "안타깝네요..." + }, + wq_5 = { + "제가 잘 가르친 것", + "같군요!" + }, + wq_6 = { + "앞을 내다보는", + "플레이를 했군요!" + }, + wq_7 = { + "당신에 맞서서", + "베팅을 안 해서", + "다행이군요!" + }, + lq_1 = { + "낚시를 가는 게", + "더 빠를지도", + "모르겠네요..." + }, + lq_2 = { + "우리는 싸구려 수트처럼", + "접었네요!" + }, + lq_3 = { + "우리가 셔플을 해서", + "다시 시도할", + "차례네요!" + }, + lq_4 = { + "그들이 뭐라고", + "했는지 아세요, 하우스가", + "항상 이긴대요!" + }, + lq_5 = { + "누가 진짜", + "조커인지", + "알아낸 것 같네요!" + }, + lq_6 = { + "이런, 당신도", + "허세 부린 건가요?" + }, + lq_7 = { + "우리한테 장난을", + "치는 것 같네요!" + }, + lq_8 = { + "저한테 손이 있었다면", + "제 눈을", + "가렸을 거예요!" + }, + lq_9 = { + "전 말 그대로", + "바보예요, 당신", + "핑계는 뭔가요?" + }, + lq_10 = { + "완전히 실패네요!" + }, + dq_1 = { + "이런! 이 마지막", + "챌린지를 대비해", + "몇 가지 속임수를", + "숨겨 왔길 바라요!" + } + }, + challenge_names = { + c_omelette_1 = "오믈렛", + c_city_1 = "15분 도시", + c_rich_1 = "부자가 더 부자로", + c_knife_1 = "칼끝에서", + c_xray_1 = "엑스레이 시야", + c_mad_world_1 = "미친 세계", + c_luxury_1 = "특별 소비세", + c_non_perishable_1 = "비부패", + c_medusa_1 = "메두사", + c_double_nothing_1 = "두 배 또는 꽝", + c_typecast_1 = "정형화", + c_inflation_1 = "인플레이션", + c_bram_poker_1 = "브램 포커", + c_fragile_1 = "연약함", + c_monolith_1 = "모노리스", + c_blast_off_1 = "발사", + c_five_card_1 = "카드 5장 뽑기", + c_golden_needle_1 = "골든 바늘", + c_cruelty_1 = "잔인함", + c_jokerless_1 = "조커 없음" + } + } +} \ No newline at end of file diff --git a/localization/nl.lua b/localization/nl.lua new file mode 100644 index 0000000..91025c7 --- /dev/null +++ b/localization/nl.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Joker", + text = { + "{C:red,s:1.1}+#1#{} Multi" + } + }, + j_jolly = { + name = "Vrolijke Joker", + text = { + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat" + } + }, + j_zany = { + name = "Knotsgekke Joker", + text = { + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat" + } + }, + j_mad = { + name = "Maffe Joker", + text = { + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat" + } + }, + j_crazy = { + name = "Gekke Joker", + text = { + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat" + } + }, + j_droll = { + name = "Grappige Joker", + text = { + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat" + } + }, + j_half = { + name = "Halve Joker", + text = { + "{C:red}+#1#{} Multi als gespeelde", + "hand", + "{C:attention}#2#{} of minder kaarten bevat" + } + }, + j_fortune_teller = { + name = "Waarzegger", + text = { + "{C:red}+#1#{} Multi per", + "gebruikte {C:purple}Tarot{}-kaart", + "{C:inactive}(Nu {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Jongleur", + text = { + "{C:attention}+#1#{} handomvang" + } + }, + j_drunkard = { + name = "Dronkaard", + text = { + "{C:red}+#1#{} weggooimogelijkheid" + } + }, + j_stone = { + name = "Stenen Joker", + text = { + "Deze Joker levert {C:attention}+#1#{} fiches op", + "voor elke {C:attention}steenkaart", + "in je volledige kaartspel", + "{C:inactive}(Nu {C:chips}+#2#{C:inactive} fiches)" + } + }, + j_golden = { + name = "Gouden Joker", + text = { + "Verdien {C:money}$#1#{} aan", + "einde van ronde" + } + }, + j_stencil = { + name = "Jokerstencil", + text = { + "{X:red,C:white} X1 {} Multi voor elk", + "lege {C:attention}Joker{}-vak", + "inclusief het {s:0.8}Jokerstencil", + "{C:inactive}(Nu {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Vier vingers", + text = { + "Alle {C:attention}Flushes{} en", + "{C:attention}Straights{} kunnen gemaakt", + "worden met {C:attention}4{} kaarten" + } + }, + j_mime = { + name = "Pantomime", + text = { + "Reactiveer alle", + "kaarten {C:attention}vastgehouden in", + "{C:attention}hand{}-vaardigheden" + } + }, + j_credit_card = { + name = "Creditcard", + text = { + "Behaal een schuld van", + "{C:red}-$#1#{}" + } + }, + j_greedy_joker = { + name = "Hebberige Joker", + text = { + "Gespeelde kaarten met", + "de kleur {C:diamonds}#2#{} geven", + "{C:mult}+#1#{} Multi bij scoren" + } + }, + j_lusty_joker = { + name = "Lustige Joker", + text = { + "Gespeelde kaarten met", + "de kleur {C:hearts}#2#{} geven", + "{C:mult}+#1#{} Multi bij scoren" + } + }, + j_wrathful_joker = { + name = "Wraakzuchtige Joker", + text = { + "Gespeelde kaarten met", + "de kleur {C:spades}#2#{} geven", + "{C:mult}+#1#{} Multi bij scoren" + } + }, + j_gluttenous_joker = { + name = "Gulzige Joker", + text = { + "Gespeelde kaarten met", + "de kleur {C:clubs}#2#{} geven", + "{C:mult}+#1#{} Multi bij scoren" + } + }, + j_ceremonial = { + name = "Ceremoniële dolk", + text = { + "Als {C:attention}blind{} is geselecteerd,", + "vernietig je de Joker aan de rechterkant", + "en voeg je zijn {C:attention}dubbele", + "verkoopwaarde permanent toe aan deze {C:attention}Multi", + "{C:inactive}(Nu {C:mult}+#1#{C:inactive} Multi)" + } + }, + j_banner = { + name = "Banner", + text = { + "{C:chips}+#1#{} fiches voor", + "elke overgebleven", + "{C:attention}weggooimogelijkheid" + } + }, + j_mystic_summit = { + name = "Mystieke piek", + text = { + "{C:mult}+#1#{} Multi als er", + "{C:attention}#2#{} weggooimogelijkheden", + "resteren" + } + }, + j_marble = { + name = "Marmeren Joker", + text = { + "Voegt een {C:attention}steen{}-kaart toe", + "aan je kaartspel als", + "als {C:attention}blind{} is geselecteerd" + } + }, + j_loyalty_card = { + name = "Trouwheidskaart", + text = { + "{X:red,C:white} X#1# {} Multi per", + "{C:attention}#2#{} gespeelde handen", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "8-bal", + text = { + "Maak een {C:purple}planeet{}-kaart", + "als gespeelde hand {C:attenetion}#1#{}", + "of meer {C:attenetion}8'en{} bevat", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + j_misprint = { + name = "Drukfout", + text = { + "" + } + }, + j_dusk = { + name = "Schemering", + text = { + "Reactiveer alle gespeelde", + "kaarten in {C:attention}laatste", + "{C:attention}hand{} van de ronde" + } + }, + j_raised_fist = { + name = "Geheven vuist", + text = { + "Voegt de {C:attention}dubbele{} rang toe", + "van de {C:attention}laagste{} vastgehouden kaart", + "in de hand naar Multi" + } + }, + j_chaos = { + name = "Chaos de Clown", + text = { + "{C:green}#1#{} gratis keer {C:attention}opnieuw", + "gooien per winkel" + } + }, + j_fibonacci = { + name = "Fibonacci", + text = { + "Elke gespeelde {C:attention}aas{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} of {C:attention}8{}", + "geven {C:mult}+#1#{} Multi bij scoren" + } + }, + j_steel_joker = { + name = "Stalen Joker", + text = { + "Deze Joker levert {X:mult,C:white}X#1#{} Multi op", + "voor elke {C:attention}staalkaart", + "in je volledige kaartspel", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_scary_face = { + name = "Eng gezicht", + text = { + "Gespeelde {C:attention}plaatjes{}", + "geven {C:chips}+#1#{} fiches", + "bij scoren" + } + }, + j_abstract = { + name = "Abstracte Joker", + text = { + "{C:mult}+#1#{} Multi voor", + "elke {C:attention}Joker{}-kaart", + "{C:inactive}(Nu {C:red}+#2#{C:inactive} Multi)" + } + }, + j_delayed_grat = { + name = "Uitgestelde voldoening", + text = { + "Verdien {C:money}$#1#{} per {C:attention}weggooimogelijkheid{} als", + "er geen kaarten zijn weggegooid", + "aan het einde van de ronde" + } + }, + j_hack = { + name = "Bedrieger", + text = { + "Reactiveer", + "elke gespeelde", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} of {C:attention}5{}" + } + }, + j_pareidolia = { + name = "Pareidolie", + text = { + "Alle kaarten worden", + "beschouwd als", + "{C:attention}plaatjes{}" + } + }, + j_gros_michel = { + name = "Gros Michel", + text = { + "{C:mult}+#1#{} Multi", + "Kans van {C:green}#2# op #3#{} dat deze", + "kaart wordt vernietigd", + "aan het einde van ronde" + } + }, + j_even_steven = { + name = "Gelijke Pijke", + text = { + "Gespeelde kaarten met", + "een {C:attention}gelijke{} rang geven", + "{C:mult}+#1#{} Multi bij scoren", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "Oneven Steven", + text = { + "Gespeelde kaarten met", + "een {C:attention}oneven{} rang geven", + "{C:chips}+#1#{} fiches bij scoren", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Geleerde", + text = { + "Gespeelde {C:attention}azen{}", + "geven {C:chips}+#2#{} fiches", + "en {C:mult}+#1#{} Multi", + "bij scoren" + } + }, + j_business = { + name = "Visitekaartje", + text = { + "Gespeelde {C:attention}Plaatjes{} hebben", + "kans van {C:green}#1# op #2#{} om", + "geven {C:money}$ 2{} bij scoren" + } + }, + j_supernova = { + name = "Supernova", + text = { + "Voegt het aantal keer dat", + "er een {C:attention}pokerhand{} is gespeeld", + "toe aan Multi" + } + }, + j_ride_the_bus = { + name = "Met de bus mee", + text = { + "{C:mult}+#1#{} Multi per", + "opeenvolgende hand", + "die gespeeld wordt zonder", + "een {C:attention}plaatje{} te scoren", + "{C:inactive}(Nu {C:mult}+#2#{C:inactive} Multi)" + } + }, + j_space = { + name = "Ruimtejoker", + text = { + "Kans van {C:green}#1# op #2#{} om", + "level van", + "gespeelde {C:attention}pokerhand{} te upgraden" + } + }, + j_egg = { + name = "Ei", + text = { + "Verdient {C:money}$#1#{} van de", + "{C:attention}verkoopwaarde{} aan het", + "einde van ronde" + } + }, + j_burglar = { + name = "Inbreker", + text = { + "Als {C:attention}blind{} is gekozen,", + "verdien je {C:red}+#1#{} handen en", + "{C:attention}verlies je alle weggooimogelijkheden" + } + }, + j_blackboard = { + name = "Krijtbord", + text = { + "{X:red,C:white} X#1# {} Multi als alle", + "niet-gespeelde kaarten in de hand", + "{C:spades}#2#{} of {C:clubs}#3#{} zijn" + } + }, + j_runner = { + name = "Hardloper", + text = { + "Levert {C:chips}+#2#{} fiches op", + "als gespeelde hand", + "een {C:chips}Straight{} bevat", + "{C:inactive}(Nu {C:chips}+#1#{C:inactive} fiches)" + } + }, + j_ice_cream = { + name = "IJsco", + text = { + "{C:chips}+#1#{} fiches", + "{C:chips}-#2#{} fiches voor", + "elke gespeelde hand" + } + }, + j_dna = { + name = "DNA", + text = { + "Als {C:attention}eerste hand{} van de ronde", + "maar {C:attention}1{} kaart heeft, voeg", + "je een permanente kopie toe aan het kaartspel", + "en trek je deze naar de {C:attention}hand" + } + }, + j_splash = { + name = "Plons", + text = { + "Elke {C:attention}gespeelde kaart", + "telt mee bij de score" + } + }, + j_blue_joker = { + name = "Blauwe Joker", + text = { + "{C:chips}+#1#{} fiches voor elke", + "overgebleven kaart in het {C:attention}kaartspel", + "{C:inactive}(Nu {C:chips}+#2#{C:inactive} fiches)" + } + }, + j_sixth_sense = { + name = "Zesde zintuig", + text = { + "Als {C:attention}eerste hand{} van ronde", + "een enkele {C:attention}6{} is, wordt deze vernietigd", + "en wordt een {C:spectral}spectrale{} kaart gecreëerd", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + j_constellation = { + name = "Sterrenbeeld", + text = { + "Krijgt {X:mult,C:white} X#1# {} Multi", + "per gebruikte {C:planet}planeet{}-kaart", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_hiker = { + name = "Lifter", + text = { + "Elke gespeelde {C:attention}kaart{}", + "krijgt permanent", + "{C:chips}+#1#{} fiches bij scoren" + } + }, + j_faceless = { + name = "Joker zonder gezicht", + text = { + "Verdien {C:money}$#1#{} als {C:attention}#2#{} of", + "meer {C:attention}plaatjes{}", + "tegelijkertijd worden", + "weggegooid" + } + }, + j_green_joker = { + name = "Groene Joker", + text = { + "{C:mult}+#1#{} Multi per gespeelde hand", + "{C:mult}+#2#{} Multi per weggegooide kaart", + "{C:inactive}(Nu {C:mult}+#3#{C:inactive} Multi)" + } + }, + j_superposition = { + name = "Superpositie", + text = { + "Maak een {C:tarot}tarot-{}kaart als", + "pokerhand een", + "{C:attention}aas{} en een {C:attention}straight{} bevat", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + j_todo_list = { + name = "Takenlijst", + text = { + "Verdien {C:money}$#1#{} als {C:attention}pokerhand{}", + "een {C:attention}#2#{} is,", + "pokerhand verandert", + "bij elke uitbetaling" + } + }, + j_ticket = { + name = "Gouden kaartje", + text = { + "Gespeelde {C:attention}gouden{} kaarten", + "leveren {C:money}$#1#{} op bij scoren" + }, + unlock = { + "Speel een hand met 5 kaarten", + "met alleen maar", + "{C:attention,E:1}gouden{} kaarten" + } + }, + j_mr_bones = { + name = "Meneer Botjes", + text = { + "Voorkomt dood", + "als gescoorde fiches", + "ten minste {C:attention}25% bedragen", + "van de vereiste fiches", + "{S:1.1,C:red,E:2}vernietigt zichzelf{}" + }, + unlock = { + "Verlies {C:attention,E:1}#1#{} spelletjes", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Acrobaat", + text = { + "{X:red,C:white} X#1# {} Multi bij {C:attention}laatste", + "{C:attention}hand{} van de ronde" + }, + unlock = { + "Speel {C:attention,E:1}#1#{} handen", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "Komedie en tragedie", + text = { + "Reactiveer alle", + "gespeelde {C:attention}plaatjes{}" + }, + unlock = { + "Speel in totaal", + "{C:attention,E:1}#1#{} plaatjes", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "Vrijbuiter", + text = { + "De verkoopwaarde van alle", + "{C:attention}Jokers{} in bezit, links van", + "deze kaart, wordt aan Multi toegevoegd", + "{C:inactive}(Nu {C:mult}+#1#{C:inactive} Multi)" + }, + unlock = { + "Verkoop in totaal", + "{C:attention,E:1}#1#{} Jokerkaarten", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Troubadour", + text = { + "{C:attention}+#1#{} handomvang,", + "{C:red}-#2#{} handen per ronde" + }, + unlock = { + "Win {C:attention,E:1}#1#{} opeenvolgende", + "rondes door slechts", + "1 hand te spelen" + } + }, + j_certificate = { + name = "Certificaat", + text = { + "Als ronde begint,", + "wordt een willekeurige {C:attention}speelkaart{}", + "{C:attention}{} toegevoegd met een willekeurige", + "{C:attention}zegel{} aan je hand toe" + }, + unlock = { + "Heb een gouden", + "speelkaart met", + "een {C:attention,E:1}gouden zegel" + } + }, + j_smeared = { + name = "Besmeurde Joker", + text = { + "{C:diamonds}Harten{} en {C:diamonds}ruiten", + "tellen als dezelfde kleur,", + "{C:spades}schoppen{} en {C:spades}klaveren", + "tellen als dezelfde kleur" + }, + unlock = { + "Heb ten minste {C:attention}#1#", + "{E:1,C:attention}#2#{} in", + "je kaartspel" + } + }, + j_throwback = { + name = "Retro", + text = { + "{X:mult,C:white} X#1# {} Multi voor elke", + "overgeslagen {C:attention}blind{} in dit spel", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + }, + unlock = { + "Doorgaan met een opgeslagen spel", + "uit het hoofdmenu" + } + }, + j_hanging_chad = { + name = "Ongeldige stem", + text = { + "Reactiveer de {C:attention}eerst{} gespeelde", + "gebruikte kaart bij het scoren" + }, + unlock = { + "Versla een blind van een baas", + "met een {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Ruwe diamant", + text = { + "Gespeelde kaarten met", + "de kleur {C:diamonds}ruiten{} levert", + "{C:money}$#1#{} op bij scoren" + }, + unlock = { + "Heb ten minste {E:1,C:attention}#1#", + "kaarten met de kleur {E:1,C:attention}#2#", + "in je kaartspel" + } + }, + j_bloodstone = { + name = "Bloedsteen", + text = { + "Kans van {C:mult}#1# op #2#{} voor", + "gespeelde kaarten met", + "de kleur {C:hearts}harten{} geven", + "{X:mult,C:white} X#3# {} Multi bij scoren," + }, + unlock = { + "Heb ten minste {E:1,C:attention}#1#", + "kaarten met de kleur {E:1,C:attention}#2#", + "in je kaartspel" + } + }, + j_arrowhead = { + name = "Pijlpunt", + text = { + "Gespeelde kaarten met", + "de kleur {C:spades}schoppen{} geven", + "{C:chips}+#1#{} fiches bij scoren" + }, + unlock = { + "Heb ten minste {E:1,C:attention}#1#", + "kaarten met de kleur {E:1,C:attention}#2#", + "in je kaartspel" + } + }, + j_onyx_agate = { + name = "Onyx-agaat", + text = { + "Gespeelde kaarten met", + "de kleur {C:clubs}klaveren{} geven", + "{C:mult}+#1#{} Multi bij scoren" + }, + unlock = { + "Heb ten minste {E:1,C:attention}#1#", + "kaarten met de kleur {E:1,C:attention}#2#", + "in je kaartspel" + } + }, + j_glass = { + name = "Glazen Joker", + text = { + "Verdient {X:mult,C:white} X#1# {} Multi", + "voor elke {C:attention}glazen kaart", + "die wordt vernietigd", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + }, + unlock = { + "Heb ten minste {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} in", + "je kaartspel" + } + }, + j_ring_master = { + name = "Ringmeester", + text = { + "{C:attention}Jokers{}, {C:tarot}tarot{}-, {C:planet}planeet{}-kaarten", + "en {C:spectral}spectrale{} kaarten", + "verschijnen meerdere keren" + }, + unlock = { + "Bereik ante", + "level {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Bloempot", + text = { + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand een scorende", + "{C:diamonds}ruiten{}, {C:clubs}klaveren{},", + "{C:hearts}harten{}-kaart en {C:spades}schoppen{}-kaart" + }, + unlock = { + "Bereik ante", + "level {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Bouwtekening", + text = { + "Kopieert vaardigheid van", + "{C:attention}Joker{} aan de rechterkant" + }, + unlock = { + "Win een spel" + } + }, + j_wee = { + name = "Mini-joker", + text = { + "Deze Joker levert", + "{C:chips}+#2#{} fiches op per", + "gespeelde {C:chips}2{} die heeft gescoord", + "{C:inactive}(Nu {C:chips}+#1#{C:inactive} fiches)" + }, + unlock = { + "Win een spel in maximaal {E:1,C:attention}#1#", + "rondes" + } + }, + j_merry_andy = { + name = "Vrolijke Andy", + text = { + "{C:red}+#1#{} weggooimogelijkheden,", + "{C:red}#2#{} handomvang" + }, + unlock = { + "Win een spel in maximaal {E:1,C:attention}#1#", + "rondes" + } + }, + j_oops = { + name = "Oeps! Allemaal 6'en", + text = { + "Verdubbelt alle {C:attention}vermelde", + "{C:green,E:1,S:1.1}mogelijkheden", + "{C:inactive}(bijv.: {C:green}1 op 3{C:inactive} -> {C:green}2 op 3{C:inactive})" + }, + unlock = { + "Verdien in één hand", + "ten minste", + "{E:1,C:attention}#1#{} fiches" + } + }, + j_idol = { + name = "Het idool", + text = { + "Elke gespeelde {C:attention}#2#", + "van {V:1}#3#{} geeft", + "{X:mult,C:white} X#1# {} Multi bij scoren", + "{s:0.8}Kaart verandert elke ronde" + }, + unlock = { + "Verdien in één hand", + "ten minste", + "{E:1,C:attention}#1#{} fiches" + } + }, + j_seeing_double = { + name = "Dubbel zien", + text = { + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand een scorende", + "{C:clubs}klaveren{}-kaart en een scorende", + "kaart van een andere {C:attention}kleur" + }, + unlock = { + "Speel een hand", + "met", + "{E:1,C:attention}#1#" + } + }, + j_matador = { + name = "Matador", + text = { + "Verdien {C:money}$#1#{} als gespeelde", + "hand de", + "{C:attention}blind van een baas{}-vaardigheid activeert" + }, + unlock = { + "Versla een blind van een baas", + "in {E:1,C:attention}1 hand{} zonder", + "kaarten weg te gooien" + } + }, + j_hit_the_road = { + name = "De boer op", + text = { + "Levert {X:mult,C:white} X#1# {} Multi op", + "per weggegooide", + "{C:attention}boer{} deze ronde", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + }, + unlock = { + "Gooi {E:1,C:attention}5", + "{E:1,C:attention}boeren{} tegelijkertijd", + "weg" + } + }, + j_duo = { + name = "Het duo", + text = { + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat" + }, + unlock = { + "Win een spel", + "zonder een", + "{E:1,C:attention}#1# te spelen" + } + }, + j_trio = { + name = "Het trio", + text = { + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat" + }, + unlock = { + "Win een spel", + "zonder een", + "{E:1,C:attention}#1# te spelen" + } + }, + j_family = { + name = "De familie", + text = { + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat" + }, + unlock = { + "Win een spel", + "zonder een", + "{E:1,C:attention}#1# te spelen" + } + }, + j_order = { + name = "De orde", + text = { + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat" + }, + unlock = { + "Win een spel", + "zonder een", + "{E:1,C:attention}#1# te spelen" + } + }, + j_tribe = { + name = "De stam", + text = { + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "hand", + "een {C:attention}#2# bevat" + }, + unlock = { + "Win een spel", + "zonder een", + "{E:1,C:attention}#1# te spelen" + } + }, + j_cavendish = { + name = "Aanmatigend", + text = { + "{X:mult,C:white} X#1# {} Multi", + "kans van {C:green}#2# op #3#{} dat deze", + "kaart wordt vernietigd", + "aan het einde van ronde" + } + }, + j_card_sharp = { + name = "Kaartscherp", + text = { + "{X:mult,C:white} X#1# {} Multi als gespeelde", + "{C:attention}pokerhand{} deze ronde al", + "gespeeld is" + } + }, + j_red_card = { + name = "Rode kaart", + text = { + "Verdient {C:red}+#1#{} Multi als er een", + "{C:attention}Boosterpakket{} is overgeslagen", + "{C:inactive}(Nu {C:red}+#2#{C:inactive} Multi)" + } + }, + j_madness = { + name = "Krankzinnigheid", + text = { + "Als {C:attention}blind{} is geselecteerd,", + "verdien je {X:mult,C:white} X #1# {} Multi en", + "{C:attention}vernietig{} je een willekeurige Joker", + "{C:inactive}(Nu {X:mult,C:white} X#2# {} Multi)" + } + }, + j_square = { + name = "Vierkante Joker", + text = { + "Levert {C:chips}+#2#{} fiches op als", + "gespeelde hand", + "precies {C:chips}4{} kaarten heeft", + "{C:inactive}(Nu {C:chips}#1#{} fiches)" + } + }, + j_seance = { + name = "Seance", + text = { + "Als een {C:attention}pokerhand{} een", + "{C:attention}#1#{}, maak een", + "een willekeurige {C:spectral}spectrale{} kaart", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + j_riff_raff = { + name = "Gespuis", + text = { + "Als {C:attention}blind{} is geselecteerd,", + "maak {C:attention}#1# {C:blue}gewone{C:attention} Joker", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + j_stuntman = { + name = "Stuntman", + text = { + "{C:chips}+#1#{} fiches,", + "{C:attention}-#2#{} handomvang" + }, + unlock = { + "Verdien in één hand", + "ten minste", + "{E:1,C:attention}#1#{} fiches" + } + }, + j_invisible = { + name = "Onzichtbare Joker", + text = { + "Verkoop deze kaart na {C:attention}#1#{}", + "rondes om", + "een willekeurige Joker te {C:attention}verdubbelen{}", + "{C:inactive}(Nu {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Win een spel zonder", + "ooit meer dan", + "{E:1,C:attention}4 Jokers{} te hebben" + } + }, + j_brainstorm = { + name = "Brainstormen", + text = { + "Kopieert de vaardigheid", + "van de meest linkse {C:attention}Joker" + }, + unlock = { + "Gooi een", + "{E:1,C:attention}Royal Flush weg" + } + }, + j_satellite = { + name = "Satelliet", + text = { + "Verdien {C:money}$#1#{} aan het einde", + "van ronde per unieke {C:planet}planeet-", + "kaart die je dit spel gebruikt", + "{C:inactive}(Nu {C:money}$#2#{C:inactive})" + }, + unlock = { + "Heb {E:1,C:money}$#1#", + "of meer" + } + }, + j_shoot_the_moon = { + name = "Bereik de maan", + text = { + "{C:mult}+#1#{} Multi voor elke", + "{C:attention}vrouw{}", + "die je in je hand hebt" + }, + unlock = { + "Speel elke {E:1,C:attention}hartenkaart", + "in je kaartspel in", + "één ronde" + } + }, + j_drivers_license = { + name = "Rijbewijs", + text = { + "{X:mult,C:white} X#1# {} Multi als je", + "ten minste {C:attention}16", + "verbeterde kaarten heeft", + "{C:inactive}(Nu {C:attention}#2#{C:inactive})" + }, + unlock = { + "Verbeter {E:1,C:attention}#1#{} kaarten", + "in je kaartspel" + } + }, + j_cartomancer = { + name = "Kaartenmagiër", + text = { + "Maak een {C:tarot}tarot{}-kaart", + "als {C:attention}blind{} is geselecteerd,", + "{C:inactive}(Moet ruimte voor zijn)" + }, + unlock = { + "Ontdek elke", + "{E:1,C:tarot}tarot{}-kaart" + } + }, + j_astronomer = { + name = "Astronoom", + text = { + "Alle {C:planet}planeet{}-kaarten en", + "{C:planet}Hemelse pakketten{} in", + "de winkel zijn {C:attention}gratis" + }, + unlock = { + "Ontdek elke", + "{E:1,C:planet}planeet{}-kaart" + } + }, + j_burnt = { + name = "Verbrande Joker", + text = { + "Upgrade het level van", + "de eerste {C:attention}weggegooide", + "pokerhand per ronde" + }, + unlock = { + "Verkoop in totaal", + "{E:1,C:attention}#1#{} kaarten", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Bijbenen", + text = { + "{C:mult}+#1#{} Multi voor elke", + "{C:money}$#2#{} die je hebt" + }, + unlock = { + "Heb ten minste {E:1,C:attention}#1#", + "{C:dark_edition}polychrome{} Jokers" + } + }, + j_caino = { + name = "Canio", + text = { + "Levert {X:mult,C:white} X#1# {} Multi op", + "voor elk {C:attention}plaatje{}", + "dat wordt vernietigd", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "Triboulet", + text = { + "Gespeelde {C:attention}heren{} en", + "{C:attention}vrouwen{} geven elk", + "{X:mult,C:white} X#1# {} Multi bij scoren," + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "Yorick", + text = { + "{X:mult,C:white} X#1# {} Multi alleen", + "na {C:attention}#2#{} weggooide kaarten", + "{C:inactive}(Resterende weggooimogelijkheden: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "Chicot", + text = { + "Schakelt effect van", + "elke {C:attention}blind van een baas uit" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "Perkeo", + text = { + "Maak een {C:dark_edition}negatieve{} kopie van", + "{C:attention}1{} willekeurige {C:attention}verbruiks{}-", + "kaart in je bezit", + "aan het eind van de {C:attention}winkel" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "Sluwe Joker", + text = { + "{C:chips}+#1#{} fiches als gespeelde", + "hand", + "een {C:attention}#2# bevat" + } + }, + j_wily = { + name = "Gehaaide Joker", + text = { + "{C:chips}+#1#{} fiches als gespeelde", + "hand", + "een {C:attention}#2# bevat" + } + }, + j_clever = { + name = "Slimme Joker", + text = { + "{C:chips}+#1#{} fiches als gespeelde", + "hand", + "een {C:attention}#2# bevat" + } + }, + j_devious = { + name = "Vileine Joker", + text = { + "{C:chips}+#1#{} fiches als gespeelde", + "hand", + "een {C:attention}#2# bevat" + } + }, + j_crafty = { + name = "Listige Joker", + text = { + "{C:chips}+#1#{} fiches als gespeelde", + "hand", + "een {C:attention}#2# bevat" + } + }, + j_vampire = { + name = "Vampier", + text = { + "Verdient {X:mult,C:white} X#1# {} Multi per", + "gespeelde {C:attention}verbeterde kaart{},", + "verwijdert {C:attention}verbetering{C:inactive} van de kaart", + "(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_shortcut = { + name = "Kortere route", + text = { + "Je mag {C:attention}Straights{} maken waarbij", + "je {C:attention}1 rang{C:inactive} overslaat", + "(bijv.: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Hologram", + text = { + "Verdient {X:mult,C:white} X#1# {} Multi", + "per toegevoegde {C:attention}speelkaart{}", + "aan je kaartspel", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_vagabond = { + name = "Vagebond", + text = { + "Maak een {C:purple}tarot-{}kaart", + "als een hand wordt gespeeld", + "met maximaal {C:money}$#1#{}" + } + }, + j_baron = { + name = "Baron", + text = { + "Elke {C:attention}heer{}", + "die je in je hand hebt", + "levert {X:mult,C:white} X#1# {} Multi op" + } + }, + j_cloud_9 = { + name = "Op wolkjes", + text = { + "Verdient {C:money}$#1#{} voor elke", + "{C:attention}9{} in je {C:attention}volledige kaartspel", + "aan het einde van ronde", + "{C:inactive}(Nu {C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "Raket", + text = { + "Verdien {C:money}$#1#{} aan het einde", + "van de ronde. Verdient {C:money}$#2#{} als", + "{C:attention}Blind van een baas{} is uitgeschakeld" + } + }, + j_obelisk = { + name = "Obelisk", + text = { + "{X:mult,C:white} X#1# {} Multi per", + "opeenvolgende gespeelde hand", + "zonder je meest gespeelde", + "{C:attention}pokerhand te spelen", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_midas_mask = { + name = "Midasmasker", + text = { + "Alle {C:attention}plaatjes{}", + "worden {C:attention}gouden{} kaarten", + "als deze worden gespeeld" + } + }, + j_luchador = { + name = "Luchador", + text = { + "Verkoop deze kaart", + "om de huidige", + "{C:attention}Blind van een baas{} uit te schakelen" + } + }, + j_photograph = { + name = "Foto", + text = { + "Eerste gespeelde {C:attention}plaatje", + "levert {X:mult,C:white} X#1# {} Multi op", + "bij scoren" + } + }, + j_gift = { + name = "Cadeaukaart", + text = { + "Voegt {C:money}$#1#{} {C:attention}verkoopwaarde toe", + "aan elke {C:attention}Joker{} en", + "{C:attention}verbruiks{}-kaart bij", + "einde van ronde" + } + }, + j_turtle_bean = { + name = "Zwarte boon", + text = { + "{C:attention}+#1#{} handomvang,", + "vermindert met", + "{C:red}#2#{} per ronde" + } + }, + j_erosion = { + name = "Erosie", + text = { + "{C:red}+#1#{} Multi voor elke", + "kaart onder {C:attention}#3#{}", + "in je volledige kaartspel", + "{C:inactive}(Nu {C:red}+#2#{C:inactive} Multi)" + } + }, + j_reserved_parking = { + name = "Gereserveerde parkeerplaats", + text = { + "Elk {C:attention}plaatje{}", + "dat je in je hand hebt", + "een kans van {C:green}#2# op #3#{}", + "om {C:money}$#1#{} op te leveren" + } + }, + j_mail = { + name = "Cashback", + text = { + "Verdien {C:money}$#1#{} voor elke", + "weggegooide {C:attention}#2#{}, de rang", + "verandert elke ronde" + } + }, + j_to_the_moon = { + name = "Naar de maan", + text = { + "Verdien {C:money}$#1#{} extra", + "{C:attention}rente{} voor elke {C:money}$ 5{} die je", + "hebt aan het einde van ronde" + } + }, + j_hallucination = { + name = "Hallucinatie", + text = { + "Kans van {C:green}#1# op #2#{} om een", + "{C:tarot}tarot{}-kaart te creëren als er een", + "{C:attention}Boosterpakket{} is geopend", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + j_lucky_cat = { + name = "Boffende kat", + text = { + "Verdient {X:mult,C:white} X#1# {} Multi per", + "keer dat een {C:attention}bofkaart{}", + "erin {C:green}slaagt{} om te activeren", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_baseball = { + name = "Honkbalkaart", + text = { + "{C:green}Ongewone{} Jokers", + "geven elk {X:mult,C:white} X#1# {} Multi" + } + }, + j_bull = { + name = "Stier", + text = { + "{C:chips}+#1#{} fiches per", + "{C:money}dollar{} die je hebt", + "{C:inactive}(Nu {C:chips}+#2#{C:inactive} fiches)" + } + }, + j_diet_cola = { + name = "Cola light", + text = { + "Verkoop deze kaart om", + "een gratis", + "{C:attention}#1# te maken" + } + }, + j_trading = { + name = "Ruilkaart", + text = { + "Als {C:attention}eerste weggooimogelijkheid{} van de ronde", + "maar {C:attention}1{} kaart heeft, vernietig", + "deze dan en verdien {C:money}$#1#" + } + }, + j_flash = { + name = "Flash-kaart", + text = { + "{C:mult}+#1#{} Multi per", + "{C:attention}opnieuw gooien{} in de winkel", + "{C:inactive}(Nu {C:mult}+#2#{C:inactive} Multi)" + } + }, + j_popcorn = { + name = "Popcorn", + text = { + "{C:mult}+#1#{} Multi", + "{C:mult}-#2#{} Multi per", + "gespeelde ronde" + } + }, + j_trousers = { + name = "Reservebroek", + text = { + "Verdient {C:mult}+#1#{} Multi als", + "gespeelde hand", + "een {C:attention}#2# bevat", + "{C:inactive}(Nu {C:red}+#3#{C:inactive} Multi)" + } + }, + j_ancient = { + name = "Oeroude Joker", + text = { + "Elke gespeelde kaart met", + "de kleur {V:1}#2#{} geeft", + "{X:mult,C:white} X#1# {} Multi bij scoren,", + "{s:0.8}kleur verandert aan einde van ronde" + } + }, + j_ramen = { + name = "Noedels", + text = { + "{X:mult,C:white} X#1# {} Multi,", + "verliest {X:mult,C:white} X#2# {} Multi", + "per weggegooide {C:attention}kaart{}" + } + }, + j_walkie_talkie = { + name = "Walkietalkie", + text = { + "Elke gespeelde {C:attention}10{} of {C:attention}4", + "geeft {C:chips}+#1#{} fiches en", + "{C:mult}+#2#{} Multi bij scoren" + } + }, + j_selzer = { + name = "Seltzer", + text = { + "Reactiveer alle", + "gespeelde kaarten gedurende", + "de volgende {C:attention}#1#{} handen" + } + }, + j_castle = { + name = "Kasteel", + text = { + "Deze Joker verdient {C:chips}+#1#{} fiches", + "per weggegooide {V:1}#2#{} kaart,", + "de kleur verandert elke ronde", + "{C:inactive}(Nu {C:chips}+#3#{C:inactive} fiches)" + } + }, + j_smiley = { + name = "Smiley", + text = { + "Gespeelde {C:attention}plaatjes{}", + "geven {C:mult}+#1#{} Multi", + "bij scoren" + } + }, + j_campfire = { + name = "Kampvuur", + text = { + "Deze Joker verdient {X:mult,C:white}X#1#{} Multi", + "per {C:attention}verkochte{} kaart, reset", + "als {C:attention}blind van een baas{} is verslagen", + "{C:inactive}(Nu {X:mult,C:white} X#2# {C:inactive} Multi)" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Te grote voorraad", + text = { + "{C:attention}+1{} kaartvak", + "beschikbaar in winkel" + } + }, + v_clearance_sale = { + name = "Uitverkoop", + text = { + "Alle kaarten en pakketten in", + "de winkel hebben {C:attention}#1#%{} korting" + } + }, + v_tarot_merchant = { + name = "Tarotverkoper", + text = { + "{C:tarot}Tarot{}-kaarten verschijnen", + "{C:attention}#1# X{} vaker", + "in de winkel" + } + }, + v_planet_merchant = { + name = "Planeetverkoper", + text = { + "{C:planet}Planeet{}-kaarten verschijnen", + "{C:attention}#1# X{} vaker", + "in de winkel" + } + }, + v_hone = { + name = "Aanscherpen", + text = { + "{C:dark_edition}Folie{}, {C:dark_edition}holografische{} en", + "{C:dark_edition}polychrome{} kaarten", + "verschijnen {C:attention}#1# X{} vaker" + } + }, + v_reroll_surplus = { + name = "Overvloedig opnieuw gooien", + text = { + "Opnieuw gooien kost", + "{C:money}$#1#{} minder" + } + }, + v_crystal_ball = { + name = "Kristallen bol", + text = { + "{C:attention}+1{} verbruiksvak" + } + }, + v_telescope = { + name = "Telescoop", + text = { + "{C:attention}Hemelse pakketten{} bevatten", + "altijd de {C:planet}planeet{}-kaart", + "voor je meest gespeelde", + "{C:attention}pokerhand" + } + }, + v_grabber = { + name = "Grijper", + text = { + "Verdien", + "permanent {C:blue}+#1#{} hand", + "per ronde" + } + }, + v_wasteful = { + name = "Verspillend", + text = { + "Verdien", + "permanent {C:red}+#1#{} weggooimogelijkheid", + "per ronde" + } + }, + v_seed_money = { + name = "Startkapitaal", + text = { + "Verhoog de max. grens", + "op verdiende rente", + "per ronde naar {C:money}$#1#{}" + } + }, + v_blank = { + name = "Blanco", + text = { + "{C:inactive}Doet niets?" + } + }, + v_magic_trick = { + name = "Goocheltruc", + text = { + "{C:attention}Speelkaarten{} kunnen", + "gekocht worden", + "in de {C:attention}winkel" + } + }, + v_hieroglyph = { + name = "Hiëroglief", + text = { + "{C:attention}-#1#{} ante", + "{C:blue}-#1#{} hand", + "per ronde", + "{C:attention}-#1#{} ante" + } + }, + v_directors_cut = { + name = "Director's Cut", + text = { + "Gooi blind van een baas", + "{C:attention}1{} keer per ante opnieuw,", + "{C:money}$#1#{} per gooi" + } + }, + v_pattern = { + name = "Patroon", + text = { + "Laat je meest gebruikte", + "{C:attention}verbruiks{}-kaart opnieuw verschijnen", + "{E:1,V:1}#1#", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + v_overstock_plus = { + name = "Te grote voorraad Plus", + text = { + "{C:attention}+1{} kaartvak", + "beschikbaar in winkel" + }, + unlock = { + "Geef in totaal", + "{C:money}$#1#{} uit in de winkel", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "Liquidatie", + text = { + "Alle kaarten en pakketten in", + "de winkel hebben {C:attention}#1#%{} korting" + }, + unlock = { + "Verzilver ten minste", + "{C:attention}#1#{C:voucher} voucher{}-kaarten", + "in één spel" + } + }, + v_tarot_tycoon = { + name = "Tarottycoon", + text = { + "{C:tarot}Tarot{}-kaarten verschijnen", + "{C:attention}#1# X{} vaker", + "in de winkel" + }, + unlock = { + "Koop in totaal", + "{C:attention}#1#{C:tarot} tarot{}-kaarten", + "in de winkel", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Planeettycoon", + text = { + "{C:planet}Planeet{}-kaarten verschijnen", + "{C:attention}#1# X{} vaker", + "in de winkel" + }, + unlock = { + "Koop in totaal", + "{C:attention}#1#{C:planet} planeet{}-kaarten", + "in de winkel", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Opbloeien", + text = { + "{C:dark_edition}Folie{}, {C:dark_edition}holografische{} en", + "{C:dark_edition}polychrome{} kaarten", + "verschijnen {C:attention}#1# X{} vaker" + }, + unlock = { + "Heb ten minste {C:attention}#1#", + "{C:attention}Joker{}-kaarten met", + "{C:dark_edition}folie{}, {C:dark_edition}holografische{} of", + "{C:dark_edition}polychrome{} editie" + } + }, + v_reroll_glut = { + name = "Gulzig opnieuw gooien", + text = { + "Opnieuw gooien kost", + "{C:money}$#1#{} minder" + }, + unlock = { + "Gooi de winkel in totaal", + "{C:attention}#1#{} keer opnieuw", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Voortekenglobe", + text = { + "{C:spectral}Spectrale{} kaarten kunnen", + "verschijnen in elk van de", + "{C:attention}Arcanapakketten" + }, + unlock = { + "Gebruik in totaal {C:attention}#1#", + "{C:tarot}tarot{}-kaarten uit een", + "{C:tarot}Arcanapakket", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Observatorium", + text = { + "{C:planet}Planeet{}-kaarten in je", + "{C:attention}verbruiks{}-vakken geven", + "{X:red,C:white} X#1# {} Multi voor hun", + "opgegeven {C:attention}pokerhand" + }, + unlock = { + "Gebruik in totaal {C:attention}#1#", + "{C:planet}planeet{}-kaarten uit een", + "{C:planet}Hemels pakket", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Nacho Tong", + text = { + "Verdien", + "permanent {C:blue}+#1#{} hand", + "per ronde" + }, + unlock = { + "Speel in totaal", + "{C:attention}#1#{} kaarten", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Recyclomantie", + text = { + "Verdien", + "permanent {C:red}+#1#{} weggooimogelijkheid", + "per ronde" + }, + unlock = { + "Gooi in totaal", + "{C:attention}#1#{} kaarten weg", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Geldboompje", + text = { + "Verhoog de max. grens", + "op verdiende rente", + "per ronde naar {C:money}$#1#{}" + }, + unlock = { + "Maximaliseer de rente", + "per verdiensten per ronde gedurende", + "{C:attention}#1#{} opeenvolgende rondes", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Antimaterie", + text = { + "{C:dark_edition}+1{} Jokervak" + }, + unlock = { + "Verzilver {C:voucher}blanco{}", + "{C:attention}#1#{} in totaal", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Illusie", + text = { + "{C:attention}Speelkaarten{} in de winkel", + "kunnen {C:enhanced}verbeterd{},", + "{C:dark_edition}editie{} en/of {C:attention}zegel{} hebben" + }, + unlock = { + "Koop in totaal", + "{C:attention}#1#{} speelkaarten", + "in de winkel", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Rotstekening", + unlock = { + "Bereik ante", + "level {E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{} ante", + "{C:red}-#1#{} weggooimogelijkheid", + "per ronde" + } + }, + v_retcon = { + name = "Teruggedraaid", + text = { + "Gooi blind van een baas", + "{C:attention}onbeperkt{} aantal keer,", + "{C:money}$#1#{} per gooi" + }, + unlock = { + "Ontdek", + "{C:attention}#1#{} blinds" + } + }, + v_tesselation = { + name = "Betegeling", + text = { + "Laat je meest gebruikte", + "{C:attention}Joker{}-kaart verschijnen", + "{E:1,V:1}#1#", + "{C:inactive}(Moet ruimte voor zijn)" + }, + unlock = { + "Koop de {C:dark_edition}polychrome", + "editie van je", + "meest gebruikte {C:attention}Joker", + "in de winkel" + } + }, + v_palette = { + name = "Palet", + text = { + "Houd {C:attention}+#1#{} kaarten", + "in je hand", + "{C:attention}+#1#{} handomvang" + }, + unlock = { + "Beperk handomvang", + "tot {C:attention}#1#{} kaarten" + } + }, + v_paint_brush = { + name = "Penseel", + text = { + "{C:attention}+#1#{} handomvang" + } + } + }, + Tarot = { + c_fool = { + name = "De dwaas", + text = { + "Maakt de laatste", + "{C:tarot}tarot{}- of {C:planet}planeet{}-kaart", + "verschijnen die in dit spel is gebruikt", + "met uitzondering van {s:0.8,C:tarot}de dwaas{s:0.8}" + } + }, + c_magician = { + name = "De magiër", + text = { + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "De hogepriesteres", + text = { + "Maakt tot {C:attention}#1#", + "willekeurige {C:planet}planeet{}-kaarten verschijnen", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + c_empress = { + name = "De keizerin", + text = { + "Verbetert {C:attention}#1#", + "geselecteerde kaarten naar", + "{C:attention}#2#'en" + } + }, + c_emperor = { + name = "De keizer", + text = { + "Maakt tot {C:attention}#1#", + "willekeurige {C:tarot}tarot{}-kaarten verschijnen", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + c_heirophant = { + name = "De hiërofant", + text = { + "Verbetert {C:attention}#1#", + "geselecteerde kaarten naar", + "{C:attention}#2#'en" + } + }, + c_lovers = { + name = "De geliefden", + text = { + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "De zegewagen", + text = { + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#" + } + }, + c_justice = { + name = "Gerechtigheid", + text = { + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "De kluizenaar", + text = { + "Verdubbelt geld", + "{C:inactive}(max. {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "Het rad van fortuin", + text = { + "Een kans van {C:green}#1# op #2#{} om", + "{C:dark_edition}folie{}, {C:dark_edition}holografische{} of", + "{C:dark_edition}polychrome{} editie toe te voegen", + "aan een willekeurige {C:attention}Joker" + } + }, + c_strength = { + name = "Kracht", + text = { + "Verhoogt rang van", + "maximaal {C:attention}#1#{} geselecteerde", + "kaarten met {C:attention}1" + } + }, + c_hanged_man = { + name = "De gehangene", + text = { + "Vernietigt maximaal", + "{C:attention}#1#{} geselecteerde kaarten" + } + }, + c_death = { + name = "De dood", + text = { + "Selecteer {C:attention}#1#{} kaarten,", + "verander de {C:attention}linker{} kaart", + "in de {C:attention}rechter{} kaart", + "{C:inactive}(Sleep om te herordenen)" + } + }, + c_temperance = { + name = "Gematigdheid", + text = { + "Geeft de totale verkoopwaarde", + "van alle huidige", + "Jokers {C:inactive}(max. {C:money}$#1#{C:inactive})", + "{C:inactive}(Nu {C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "De duivel", + text = { + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#" + } + }, + c_tower = { + name = "De toren", + text = { + "Verbetert {C:attention}#1#{} geselecteerde", + "kaart naar een", + "{C:attention}#2#" + } + }, + c_star = { + name = "De ster", + text = { + "Verandert maximaal", + "{C:attention}#1#{} geselecteerde kaarten", + "naar {V:1}#2#{}" + } + }, + c_moon = { + name = "De maan", + text = { + "Verandert maximaal", + "{C:attention}#1#{} geselecteerde kaarten", + "naar {V:1}#2#{}" + } + }, + c_sun = { + name = "De zon", + text = { + "Verandert maximaal", + "{C:attention}#1#{} geselecteerde kaarten", + "naar {V:1}#2#{}" + } + }, + c_judgement = { + name = "Het oordeel", + text = { + "Maakt een willekeurige", + "{C:attention}Joker{}-kaart verschijnen", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + c_world = { + name = "De wereld", + text = { + "Verandert maximaal", + "{C:attention}#1#{} geselecteerde kaarten", + "naar {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Mercurius", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_venus = { + name = "Venus", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_earth = { + name = "Aarde", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_mars = { + name = "Mars", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_jupiter = { + name = "Jupiter", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_saturn = { + name = "Saturnus", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_uranus = { + name = "Uranus", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_neptune = { + name = "Neptunus", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_pluto = { + name = "Pluto", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_ceres = { + name = "Ceres", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_planet_x = { + name = "Planeet X", + text = { + "{S:0.8}({S:0.8,V:1}level#1#{S:0.8}){} Level omhoog:", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + }, + c_eris = { + name = "Eris", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Level omhoog", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi en", + "{C:chips}+#4#{} fiches" + } + } + }, + Spectral = { + c_familiar = { + name = "Gezel", + text = { + "Vernietig {C:attention}1{} willekeurige", + "kaart in je hand, voegt", + "{C:attention}#1#{} willekeurige {C:attention}verbeterde plaatjes{} toe", + "{C:attention}{} aan je hand toe" + } + }, + c_grim = { + name = "Akelig", + text = { + "Vernietig {C:attention}1{} willekeurige", + "kaart in je hand,", + "voeg {C:attention}#1#{} willekeurige {C:attention}verbeterde", + "{C:attention}azen{} aan je hand toe" + } + }, + c_incantation = { + name = "Betovering", + text = { + "Vernietig {C:attention}1{} willekeurige", + "kaart in je hand, voeg {C:attention}#1#", + "willekeurige {C:attention}verbeterde kaart toe met een getal", + "{C:attention}met een cijfer{} aan je hand toe" + } + }, + c_talisman = { + name = "Talisman", + text = { + "Voeg {C:attention}gouden zegel{}", + "toe aan {C:attention}1{} geselecteerde", + "kaart in je hand" + } + }, + c_aura = { + name = "Aura", + text = { + "Voeg {C:dark_edition}folie{}, {C:dark_edition}holografisch{}", + "of {C:dark_edition}polychroom{} effect toe aan", + "{C:attention}1{} geselecteerde kaart in je hand" + } + }, + c_wraith = { + name = "Schim", + text = { + "Maakt een willekeurige", + "{C:red}zeldzame{C:attention} Joker{} verschijnen,", + "zet geld terug op {C:money}$ 0" + } + }, + c_sigil = { + name = "Teken", + text = { + "Verandert alle kaarten", + "in de hand in een enkele", + "willekeurige {C:attention}kleur" + } + }, + c_ouija = { + name = "Ouija", + text = { + "Verandert alle kaarten", + "in de hand in een enkele", + "willekeurige {C:attention}rang", + "{C:red}-1{} handomvang" + } + }, + c_ectoplasm = { + name = "Ectoplasma", + text = { + "Voeg {C:dark_edition}negatief{} toe aan", + "een willekeurige {C:attention}Joker,", + "{C:red}-1{} handomvang" + } + }, + c_immolate = { + name = "In vlammen opgaan", + text = { + "Vernietigt {C:attention}#1#{} willekeurige", + "kaarten in de hand,", + "levert {C:money}$#2# op" + } + }, + c_soul = { + name = "De ziel", + text = { + "Creëert een", + "{C:legendary,E:1}mythische{} Joker", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + c_black_hole = { + name = "Zwart gat", + text = { + "Upgrade elke", + "{C:legendary,E:1}pokerhand", + "met {C:attention}1{} level" + } + }, + c_ankh = { + name = "Ankh", + text = { + "Maak een kopie van een", + "willekeurige {C:attention}Joker{}, vernietig", + "alle andere Jokers" + } + }, + c_deja_vu = { + name = "Déjà vu", + text = { + "Voeg een {C:red}rood zegel{} toe", + "aan {C:attention}1{} geselecteerde", + "kaart in je hand" + } + }, + c_hex = { + name = "Hex", + text = { + "Voeg een {C:dark_edition}polychroom{} toe aan", + "willekeurige {C:attention}Joker{}, vernietig", + "alle andere Jokers" + } + }, + c_trance = { + name = "Trance", + text = { + "Voeg een {C:blue}blauw zegel{} toe", + "aan {C:attention}1{} geselecteerde", + "kaart in je hand" + } + }, + c_medium = { + name = "Medium", + text = { + "Voeg een {C:purple}paars zegel{} toe", + "aan {C:attention}1{} geselecteerde", + "kaart in je hand" + } + }, + c_cryptid = { + name = "Cryptide", + text = { + "Maak {C:attention}#1#{} kopieën van", + "{C:attention}1{} geselecteerde kaart", + "in je hand" + } + } + }, + Edition = { + e_base = { + name = "Basis", + text = { + "Geen extra effecten" + } + }, + e_foil = { + name = "Folie", + text = { + "{C:chips}+#1#{} fiches" + } + }, + e_holo = { + name = "Holografisch", + text = { + "{C:mult}+#1#{} Multi" + } + }, + e_polychrome = { + name = "Polychroom", + text = { + "{X:mult,C:white} X#1# {} Multi" + } + }, + e_negative = { + name = "Negatief", + text = { + "{C:dark_edition}+#1#{} Jokervak" + } + }, + e_negative_consumable = { + name = "Negatief", + text = { + "{C:dark_edition}+#1#{} verbruiksvak" + } + } + }, + Enhanced = { + m_bonus = { + name = "Bonuskaart", + text = {} + }, + m_mult = { + name = "Multikaart", + text = { + "{C:mult}+#1#{} Multi" + } + }, + m_wild = { + name = "Wildkaart", + text = { + "Kan gebruikt worden", + "als elke kleur" + } + }, + m_glass = { + name = "Glazen kaart", + text = { + "{X:mult,C:white} X#1# {} Multi", + "Kans van {C:green}#2# op #3#{} om", + "kaart te vernietigen" + } + }, + m_steel = { + name = "Staalkaart", + text = { + "{X:mult,C:white} X#1# {} Multi", + "als deze kaart", + "in de hand blijft" + } + }, + m_stone = { + name = "Steenkaart", + text = { + "{C:chips}+#1#{} fiches", + "geen rang of kleur" + } + }, + m_gold = { + name = "Gouden kaart", + text = { + "{C:money}$#1#{} als deze", + "kaart in de hand ligt", + "aan het einde van ronde" + } + }, + m_lucky = { + name = "Bofkaart", + text = { + "Een kans van {C:green}#1# op #3#{}", + "op {C:mult}+#2#{} Multi", + "Een kans van {C:green}#1# op #5#{}", + "om {C:money}$#4#{} te winnen" + } + } + }, + Stake = { + stake_white = { + name = "Witte inzet", + text = { + "Basismoeilijkheid" + } + }, + stake_red = { + name = "Rode inzet", + text = { + "{C:attention}small blind{} levert", + "geen beloningsgeld op", + "{s:0.8}Past alle eerdere inzetten toe" + } + }, + stake_green = { + name = "Groene inzet", + text = { + "Vereiste score schaalt sneller op", + "voor elke {C:attention}ante", + "{s:0.8}Past alle eerdere inzetten toe" + } + }, + stake_blue = { + name = "Blauwe inzet", + text = { + "{C:red}-1{} weggooimogelijkheid", + "{s:0.8}Past alle eerdere inzetten toe" + } + }, + stake_black = { + name = "Zwarte inzet", + text = { + "Winkel kan {C:attention}eeuwige{} Jokers hebben", + "{C:inactive,s:0.8}(Kan niet worden verkocht of vernietigd)", + "{s:0.8}Past alle eerdere inzetten toe" + } + }, + stake_purple = { + name = "Paarse inzet", + text = { + "Vereiste score schaalt sneller op", + "voor elke {C:attention}ante", + "{s:0.8}Past alle eerdere inzetten toe" + } + }, + stake_orange = { + name = "Oranje inzet", + text = { + "{C:attention}Boosterpakketten{} kosten", + "{C:money}$ 1{} meer per ante", + "{s:0.8}Past alle eerdere inzetten toe" + } + }, + stake_gold = { + name = "Gouden inzet", + text = { + "{C:attention}-1{} handomvang", + "{s:0.8}Past alle eerdere inzetten toe" + } + } + }, + Tag = { + tag_uncommon = { + name = "Ongewone tag", + text = { + "Winkel heeft een", + "{C:green}ongewone Joker" + } + }, + tag_rare = { + name = "Zeldzame tag", + text = { + "Winkel heeft een", + "{C:red}zeldzame Joker" + } + }, + tag_negative = { + name = "Negatieve tag", + text = { + "Winkel heeft een", + "{C:dark_edition}negatieve Joker" + } + }, + tag_foil = { + name = "Folie tag", + text = { + "Winkel heeft een", + "{C:dark_edition}folie Joker" + } + }, + tag_holo = { + name = "Holografische tag", + text = { + "Winkel heeft een", + "{C:dark_edition}holografische Joker" + } + }, + tag_polychrome = { + name = "Polychrome tag", + text = { + "Winkel heeft een", + "{C:dark_edition}polychrome Joker" + } + }, + tag_investment = { + name = "Investeringstag", + text = { + "Na het verslaan van", + "de blind van een baas,", + "verdien je {C:money}$#1#" + } + }, + tag_voucher = { + name = "Vouchertag", + text = { + "Voeg één {C:voucher}voucher", + "aan de volgende winkel toe" + } + }, + tag_boss = { + name = "Baastag", + text = { + "Gooit de", + "{C:attention}blind van een baas opnieuw" + } + }, + tag_standard = { + name = "Standaardtag", + text = { + "Levert een gratis", + "{C:attention}Mega standaard pakket op" + } + }, + tag_charm = { + name = "Toverspreuktag", + text = { + "Levert een gratis", + "{C:tarot}Mega Arcanapakket op" + } + }, + tag_meteor = { + name = "Meteoortag", + text = { + "Levert een gratis", + "{C:planet}Mega Hemels pakket op" + } + }, + tag_buffoon = { + name = "Lolbroektag", + text = { + "Levert een gratis", + "{C:attention}Lolbroekenpakket op" + } + }, + tag_handy = { + name = "Handige tag", + text = { + "Levert {C:money}$#1#{} op per gespeelde", + "{C:blue}hand{} dit spel", + "{C:inactive}(Levert {C:money}$#2#{C:inactive} op)" + } + }, + tag_garbage = { + name = "Afvaltag", + text = { + "Levert {C:money}$#1#{} op per ongebruikte", + "{C:red}weggooimogelijkheid{} dit spel", + "{C:inactive}(Levert {C:money}$#2#{C:inactive} op)" + } + }, + tag_coupon = { + name = "Coupontag", + text = { + "Initiële kaarten en", + "boosterpakketten in volgende", + "winkel zijn gratis" + } + }, + tag_double = { + name = "Dubbeltag", + text = { + "Levert een kopie van de", + "volgende geselecteerde {C:attention}tag{} op", + "{s:0.8}Maar geen {s:0.8,C:attention}Dubbeltag" + } + }, + tag_juggle = { + name = "Jongleertag", + text = { + "{C:attention}+#1#{} handomvang", + "in de volgende ronde" + } + }, + tag_d_six = { + name = "D6-tag", + text = { + "Opnieuw gooien in de volgende winkel", + "begint met {C:money}$ 0" + } + }, + tag_top_up = { + name = "Bijvultag", + text = { + "Maakt tot {C:attention}#1#", + "{C:blue}gewone{} Jokers verschijnen", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + tag_skip = { + name = "Snelheidstag", + text = { + "Levert {C:money}$#1#{} op per overgeslagen", + "blind in dit spel", + "{C:inactive}(Levert {C:money}$#2#{C:inactive} op)" + } + }, + tag_orbital = { + name = "Orbitale tag", + text = { + "Upgrade {C:attention}#1#", + "met {C:attention}#2# levels" + } + }, + tag_economy = { + name = "Economische tag", + text = { + "Verdubbelt je geld", + "{C:inactive}(max. {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "Etherische tag", + text = { + "Levert een gratis", + "{C:planet}Spectraal pakket{} op" + } + } + }, + Blind = { + bl_small = { + name = "Small blind", + text = {} + }, + bl_big = { + name = "Big blind", + text = {} + }, + bl_hook = { + name = "De haak", + text = { + "Gooit 2 willekeurige", + "kaarten per gespeelde hand" + } + }, + bl_wall = { + name = "De muur", + text = { + "Extra grote blind" + } + }, + bl_wheel = { + name = "Het rad", + text = { + " op 7 kaarten worden", + "met de afbeelding naar beneden getrokken" + } + }, + bl_arm = { + name = "Het wapen", + text = { + "Verlaag level van", + "gespeelde pokerhand" + } + }, + bl_psychic = { + name = "De helderziende", + text = { + "Moet 5 kaarten spelen" + } + }, + bl_goad = { + name = "De aansporing", + text = { + "Alle schoppenkaarten", + "verliezen hun buff" + } + }, + bl_water = { + name = "Het water", + text = { + "Begin met", + "0 weggooimogelijkheden" + } + }, + bl_eye = { + name = "Het oog", + text = { + "Deze ronde geen", + "herhaalde handtypes" + } + }, + bl_mouth = { + name = "De mond", + text = { + "Speel deze ronde", + "maar 1 handtype" + } + }, + bl_plant = { + name = "De plant", + text = { + "Alle plaatjes", + "verliezen hun buff" + } + }, + bl_needle = { + name = "De naald", + text = { + "Speel maar 1 hand" + } + }, + bl_head = { + name = "Het hoofd", + text = { + "Alle hartenkaarten", + "verliezen hun buff" + } + }, + bl_tooth = { + name = "De tand", + text = { + "Verlies $ 1 per", + "gespeelde kaart" + } + }, + bl_final_leaf = { + name = "Groen blaadje", + text = { + "Alle kaarten verliezen hun buff", + "tot er 1 Joker is verkocht" + } + }, + bl_final_vessel = { + name = "Violet vat", + text = { + "Zeer grote blind" + } + }, + bl_ox = { + name = "De os", + text = { + "Als je een #1# speelt,", + "gaat geld terug naar $ 0" + } + }, + bl_house = { + name = "Het huis", + text = { + "Eerste hand wordt", + "met de afbeelding naar beneden getrokken" + } + }, + bl_club = { + name = "De klaver", + text = { + "Alle klaverenkaarten", + "verliezen hun buff" + } + }, + bl_fish = { + name = "De vis", + text = { + "Met de afbeelding naar beneden getrokken", + "na elke gespeelde hand" + } + }, + bl_window = { + name = "Het raam", + text = { + "Alle ruitenkaarten", + "verliezen hun buff" + } + }, + bl_manacle = { + name = "Boeien", + text = { + "-1 handomvang" + } + }, + bl_serpent = { + name = "Het serpent", + text = { + "Na spelen of weggooien,", + "trek je altijd 3 kaarten" + } + }, + bl_pillar = { + name = "De pilaar", + text = { + "Eerder gespeelde kaarten", + "bij deze ante verliezen hun buff" + } + }, + bl_flint = { + name = "De vuursteen", + text = { + "Basisfiches en", + "Multi worden gehalveerd" + } + }, + bl_mark = { + name = "Het teken", + text = { + "Alle plaatjes worden getrokken", + "met de afbeelding naar beneden" + } + }, + bl_final_acorn = { + name = "Amberkleurige eikel", + text = { + "Draait alle Jokerkaarten om", + "en schudt ze" + } + }, + bl_final_heart = { + name = "Karmozijnrood hart", + text = { + "Een willekeurige Joker is", + "per hand uitgeschakeld" + } + }, + bl_final_bell = { + name = "Azuurblauwe bel", + text = { + "Forceert 1 kaart om", + "altijd geselecteerd te zijn" + } + } + }, + Back = { + b_red = { + name = "Rood kaartspel", + text = { + "{C:red}+#1#{} weggooimogelijkheid", + "elke ronde" + } + }, + b_blue = { + name = "Blauw kaartspel", + text = { + "{C:blue}+#1#{} hand", + "elke ronde" + } + }, + b_yellow = { + name = "Geel kaartspel", + text = { + "Begin met", + "extra {C:money}$#1#" + } + }, + b_green = { + name = "Groen kaartspel", + text = { + "Aan het einde van elke ronde:", + "{C:money}$#1#{s:0.85} per overgebleven {C:blue}hand", + "{C:money}$#2#{s:0.85} per overgebleven {C:red}weggooimogelijkheid", + "Verdien geen {C:attention}rente" + } + }, + b_black = { + name = "Zwart kaartspel", + text = { + "{C:attention}+#1#{} Jokervak", + "", + "{C:blue}-#2#{} hand", + "elke ronde" + } + }, + b_magic = { + name = "Magisch kaartspel", + text = { + "Begin het spel met de", + "{C:tarot,T:v_crystal_ball}#1#{} voucher", + "en {C:attention}2{} kopieën", + "van {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Nevelkaartspel", + text = { + "Begin het spel met de", + "{C:planet,T:v_telescope}#1#{} voucher", + "", + "{C:red}#2#{} verbruiksvak" + } + }, + b_metal = { + name = "Metalen kaartspel", + text = { + "Begin het spel met {C:attention}#1#", + "speelkaarten die verbeterd zijn", + "naar {C:attention}staalkaarten" + } + }, + b_abandoned = { + name = "Verlaten kaartspel", + text = { + "Begin het spel", + "zonder {C:attention}plaatjes", + "in je kaartspel" + } + }, + b_checkered = { + name = "Geruit kaartspel", + text = { + "Begin het spel met", + "{C:attention}26{C:spades} schoppen{} en", + "{C:attention}26{C:hearts} harten{} in het kaartspel" + } + }, + b_rocky = { + name = "Rotsachtig kaartspel", + text = { + "Begin het spel met {C:attention}#1#", + "extra {C:attention}steenkaarten" + } + }, + b_braided = { + name = "Gevlochten kaartspel", + text = { + "Eerst gespeelde hand", + "is geüpgraded naar {C:attention}level 3" + } + }, + b_anaglyph = { + name = "Anaglyph-kaartspel", + text = { + "Na het verslaan van elke", + "{C:attention}blind van een baas{} verdien je een", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "Plasmakaartspel", + text = { + "Breng {C:blue}fiches{} en", + "{C:red}Multi{} in evenwicht bij", + "berekening van score voor gespeelde hand", + "{C:red}X#1#{} basisomvang blind" + } + }, + b_erratic = { + name = "Onzeker kaartspel", + text = { + "Alle {C:attention}rangen{} en", + "{C:attention}kleuren{} in het kaartspel", + "zijn willekeurig" + } + }, + b_challenge = { + name = "Uitdagingskaartspel", + text = { + "" + } + }, + b_ghost = { + name = "Spokenkaartspel", + text = { + "{C:spectral}Spectrale{} kaarten kunnen", + "verschijnt in de winkel,", + "begin met een {C:spectral,T:c_hex}Hex{}-kaart" + } + }, + b_zodiac = { + name = "Dierenriemkaartspel", + text = { + "Begin het spel met", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "en {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Geschilderd kaartspel", + text = { + "{C:attention}+#1#{} handomvang", + "{C:red}#2#{} Jokervak" + } + } + }, + Other = { + gold_seal = { + name = "Gouden zegel", + text = { + "Verdien {C:money}$ 3{} als deze", + "kaart wordt gespeeld", + "en scoort" + } + }, + white_sticker = { + name = "Witte sticker", + text = { + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}witte", + "{C:attention}inzet{} te winnen" + } + }, + red_sticker = { + name = "Rode sticker", + text = { + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}rode", + "{C:attention}inzet{} te winnen" + } + }, + green_sticker = { + name = "Groene sticker", + text = { + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}groene", + "{C:attention}inzet{} te winnen" + } + }, + blue_sticker = { + name = "Blauwe sticker", + text = { + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}blauwe", + "{C:attention}inzet{} te winnen" + } + }, + black_sticker = { + name = "Zwarte sticker", + text = { + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}zwarte", + "{C:attention}inzet{} te winnen" + } + }, + purple_sticker = { + name = "Paarse sticker", + text = { + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}paarse", + "{C:attention}inzet{} te winnen" + } + }, + orange_sticker = { + name = "Oranje sticker", + text = { + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}oranje", + "{C:attention}inzet{} te winnen" + } + }, + gold_sticker = { + name = "Gouden sticker", + text = { + "Heeft deze Joker gebruikt", + "om moeilijkheidsgraad {C:attention}gouden", + "{C:attention}inzet{} te winnen" + } + }, + playing_card = { + text = { + "{C:light_black}#1# van {V:1}#2#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} fiches" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1#{} extra fiches" + } + }, + locked = { + name = "Vergrendeld", + text = {} + }, + debuffed_default = { + name = "Zonder extra", + text = { + "Alle vaardigheden", + "zijn uitgeschakeld" + } + }, + debuffed_playing_card = { + name = "Zonder extra", + text = { + "Levert geen fiches op", + "en alle vaardigheden", + "zijn uitgeschakeld" + } + }, + demo_locked = { + name = "Vergrendeld", + text = { + "Niet beschikbaar", + "in deze demo" + } + }, + demo_shop_locked = { + name = "Vergrendeld", + text = { + "Kaart van {C:attention}Jimbo's", + "persoonlijke verzameling,", + "beschikbaar in de volledige", + "versie van {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Vergrendeld", + text = { + "Werk in", + "uitvoering" + } + }, + deck_locked_win = { + name = "Vergrendeld", + text = { + "Win een spel met", + "{C:attention}#1#{}", + "op welke moeilijkheidsgraad dan ook" + } + }, + deck_locked_discover = { + name = "Vergrendeld", + text = { + "Ontdek ten minste", + "{C:attention}#1#{} items uit", + "je verzameling" + } + }, + deck_locked_stake = { + name = "Vergrendeld", + text = { + "Win een spel met een", + "kaartspel op een moeilijkheidsgraad", + "van ten minste {V:1}#1#{}" + } + }, + joker_locked_legendary = { + name = "Vergrendeld", + text = { + "Vind deze Joker", + "uit de {C:spectral}ziel{}-kaart" + } + }, + undiscovered_joker = { + name = "Niet ontdekt", + text = { + "Koop of gebruik", + "deze kaart in een", + "spel zonder seed om", + "te leren wat hij doet" + } + }, + undiscovered_tarot = { + name = "Niet ontdekt", + text = { + "Koop of gebruik", + "deze kaart in een", + "spel zonder seed om", + "te leren wat hij doet" + } + }, + undiscovered_planet = { + name = "Niet ontdekt", + text = { + "Koop of gebruik", + "deze kaart in een", + "spel zonder seed om", + "te leren wat hij doet" + } + }, + undiscovered_spectral = { + name = "Niet ontdekt", + text = { + "Koop of gebruik", + "deze kaart in een", + "spel zonder seed om", + "te leren wat hij doet" + } + }, + undiscovered_voucher = { + name = "Niet ontdekt", + text = { + "Verzilver deze", + "voucher in een", + "spel zonder seed om", + "te leren wat hij doet" + } + }, + undiscovered_booster = { + name = "Niet ontdekt", + text = { + "Open dit pakket", + "in een spel zonder seed", + "om te leren wat hij doet" + } + }, + undiscovered_edition = { + name = "Niet ontdekt", + text = { + "Vind deze editie", + "in een spel zonder seed", + "om te leren wat hij doet" + } + }, + undiscovered_tag = { + name = "Niet ontdekt", + text = { + "Gebruik deze tag in", + "een spel zonder seed om", + "te leren wat hij doet" + } + }, + p_arcana_normal = { + name = "Arcanapakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:tarot} tarot{}-kaarten om", + "direct te gebruiken" + } + }, + p_arcana_jumbo = { + name = "Jumbo Arcanapakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:tarot} tarot{}-kaarten om", + "direct te gebruiken" + } + }, + p_arcana_mega = { + name = "Mega Arcanapakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:tarot} tarot{}-kaarten om", + "direct te gebruiken" + } + }, + p_celestial_normal = { + name = "Hemels pakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:planet} planeet{}-kaarten om", + "direct te gebruiken" + } + }, + p_celestial_jumbo = { + name = "Jumbo Hemels pakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:planet} planeet{}-kaarten om", + "direct te gebruiken" + } + }, + p_celestial_mega = { + name = "Mega Hemels pakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:planet} planeet{}-kaarten om", + "direct te gebruiken" + } + }, + p_spectral_normal = { + name = "Spectraal pakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:spectral} spectrale{} kaarten om", + "direct te gebruiken" + } + }, + p_spectral_jumbo = { + name = "Jumbo Spectraal pakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:spectral} spectrale{} kaarten om", + "direct te gebruiken" + } + }, + p_spectral_mega = { + name = "Mega Spectraal pakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:spectral} spectrale{} kaarten om", + "direct te gebruiken" + } + }, + p_standard_normal = { + name = "Standaardpakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:attention} speel{}-kaarten", + "om aan je kaartspel toe te voegen" + } + }, + p_standard_jumbo = { + name = "Jumbo Standaardpakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:attention} speel{}-kaarten", + "om aan je kaartspel toe te voegen" + } + }, + p_standard_mega = { + name = "Mega Standaardpakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:attention} speel{}-kaarten", + "om aan je kaartspel toe te voegen" + } + }, + p_buffoon_normal = { + name = "Lolbroekenpakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:joker} Joker{}-kaarten" + } + }, + p_buffoon_jumbo = { + name = "Jumbo Lolbroekenpakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:joker} Joker{}-kaarten" + } + }, + p_buffoon_mega = { + name = "Mega Lolbroekenpakket", + text = { + "Kies {C:attention}#1#{} van maximaal", + "{C:attention}#2#{C:joker} Joker{}-kaarten" + } + }, + pinned_left = { + name = "Vastgepind", + text = { + "Deze Joker blijft", + "vastgepind aan de", + "meest linkse positie" + } + }, + red_seal = { + name = "Rood zegel", + text = { + "Reactiveer deze", + "kaart {C:attention}1{} keer" + } + }, + blue_seal = { + name = "Blauw zegel", + text = { + "Maakt een {C:planet}planeet{}-kaart", + "als deze kaart wordt {C:attention}vastgehouden{} in", + "hand aan het einde van ronde" + } + }, + purple_seal = { + name = "Paars zegel", + text = { + "Maakt een {C:tarot}tarot-{}kaart", + "als deze wordt {C:attention}weggegooid", + "{C:inactive}(Moet ruimte voor zijn)" + } + }, + eternal = { + name = "Eeuwig", + text = { + "Kan niet verkocht", + "of vernietigd worden" + } + }, + challenge_locked = { + name = "Vergrendeld", + text = { + "Win een spel met ten minste", + "#1# verschillende kaartspellen om", + "uitdagingsmodus vrij te spelen", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Schoppen", + Hearts = "Harten", + Clubs = "Klaveren", + Diamonds = "Ruiten" + }, + suits_plural = { + Spades = "Schoppen", + Hearts = "Harten", + Clubs = "Klaveren", + Diamonds = "Ruiten" + }, + blind_states = { + Select = "Selecteren", + Skipped = "Overgeslagen", + Current = "Huidig", + Defeated = "Verslagen", + Upcoming = "Binnenkort", + Selected = "Geselecteerd" + }, + ranks = { + Ace = "Aas", + King = "Heer", + Queen = "Vrouw", + Jack = "Boer", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Beste hand", + furthest_round = "Hoogste ronde", + furthest_ante = "Hoogste ante", + most_money = "Meeste geld", + boss_streak = "Meeste bazen op rij", + collection = "Verzameling", + win_streak = "Beste winreeks", + current_streak = "", + poker_hand = "Meest gespeelde hand" + }, + poker_hands = { + ['Flush House'] = "Flush House", + ['Five of a Kind'] = "Five of a Kind", + ['Royal Flush'] = "Royal Flush", + ['Straight Flush'] = "Straight Flush", + ['Four of a Kind'] = "Four of a Kind", + ['Full House'] = "Full House", + ['Flush'] = "Flush", + ['Straight'] = "Straight", + ['Three of a Kind'] = "Three of a Kind", + ['Two Pair'] = "Two Pair", + ['Pair'] = "Pair", + ['High Card'] = "High Card", + ['Flush Five'] = "5 flushes" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "Een Three of a Kind en een Pair waarbij", + "alle kaarten dezelfde kleur hebben" + }, + ['Five of a Kind'] = { + "5 kaarten met dezelfde rang" + }, + ['Royal Flush'] = { + "5 kaarten op rij {opeenvolgende rangen} waarbij", + "alle kaarten dezelfde kleur hebben" + }, + ['Straight Flush'] = { + "5 kaarten op rij {opeenvolgende rangen} waarbij", + "alle kaarten dezelfde kleur hebben" + }, + ['Four of a Kind'] = { + "4 kaarten met dezelfde rang. Ze mogen", + "worden gespeeld met 1 andere kaart die geen score heeft" + }, + ['Full House'] = { + "Een Three of a Kind en een Pair" + }, + ['Flush'] = { + "5 kaarten die dezelfde kleur hebben" + }, + ['Straight'] = { + "5 kaarten op rij {opeenvolgende rangen}" + }, + ['Three of a Kind'] = { + "3 kaarten met dezelfde rang. Ze mogen", + "gespeeld worden met 2 andere kaarten die geen score hebben" + }, + ['Two Pair'] = { + "2 kaartparen met verschillende rangen, mogen", + "worden gespeeld met 1 andere kaart die geen score heeft" + }, + ['Pair'] = { + "2 kaarten met dezelfde rang. Ze mogen", + "gespeeld worden met 3 andere kaarten die geen score hebben" + }, + ['High Card'] = { + "Als de gespeelde hand anders is dan bovenstaande,", + "scoort alleen de kaart met de hoogste rang" + }, + ['Flush Five'] = { + "5 kaarten met dezelfde rang en kleur" + } + }, + labels = { + common = "Gewoon", + uncommon = "Ongewoon", + rare = "Zeldzaam", + legendary = "Mythisch", + tarot = "Tarot", + planet = "Planeet", + pluto_planet = "Dwergplaneet", + voucher = "Voucher", + foil = "Folie", + holographic = "Holografisch", + polychrome = "Polychroom", + negative = "Negatief", + gold_seal = "Gouden zegel", + locked = "Vergrendeld", + blue_seal = "Blauw zegel", + red_seal = "Rood zegel", + purple_seal = "Paars zegel", + eternal = "Eeuwig", + pinned_left = "Vastgepind" + }, + dictionary = { + b_sell = "VERKOPEN", + b_use = "GEBRUIKEN", + b_select = "SELECTEREN", + b_buy = "KOPEN", + b_redeem = "VERZILVEREN", + b_open = "OPENEN", + b_and_use = "& GEBRUIKEN", + b_next_round_1 = "Volgende", + b_next_round_2 = "Ronde", + b_play_hand = "Hand spelen", + b_discard = "Weggooien", + b_sort_hand = "Hand ordenen", + b_run_info_1 = "Spel", + b_run_info_2 = "Info", + b_options = "Opties", + b_reroll_boss = "Baas opnieuw gooien", + b_skip_blind = "Blind overslaan", + b_skip_reward = "Beloning overslaan", + b_skip = "Overslaan", + b_start_new_run = "Nieuw spel", + b_main_menu = "Hoofdmenu", + b_collection = "Verzameling", + b_seed = "Seed", + b_copy_seed = "Seed kopiëren", + b_credits = "Credits", + b_stats = "Statistieken", + b_settings = "Instellingen", + b_set_game = "Spel", + b_set_video = "Video", + b_set_graphics = "Graphics", + b_set_audio = "Audio", + b_set_gamespeed = "Spelsnelheid", + b_set_play_discard_pos = "Positie speel-/weggooiknop", + b_set_screenshake = "Scherm schudden", + b_set_crash_reports = "Crashmeldingen", + b_set_monitor = "Monitor weergeven", + b_set_windowmode = "Venstermodus", + b_set_apply = "Toepassen", + b_set_master_vol = "Hoofdvolume", + b_set_music_vol = "Muziekvolume", + b_set_game_vol = "Spelvolume", + b_set_shadows = "Schaduwen", + b_set_pixel_smoothing = "Vloeiende pixel-art", + b_set_CRT = "CRT", + b_set_CRT_bloom = "CRT-bloom", + b_stat_jokers = "Jokers", + b_stat_consumables = "Verbruiksartikelen", + b_stat_tarots = "Tarots", + b_stat_planets = "Planeten", + b_stat_spectrals = "Spectrale kaarten", + b_stat_vouchers = "Vouchers", + b_next = "Volgende", + b_endless = "Eindeloze modus", + b_wishlist = "Verlanglijst op Steam", + b_playbalatro = "Ga naar playbalatro.com", + b_remaining = "Resterend", + b_full_deck = "Volledig kaartspel", + b_poker_hands = "Pokerhanden", + b_blinds = "Blinds", + b_vouchers = "Vouchers", + b_stake = "Inzet", + b_jokers = "Jokers", + b_tarot_cards = "Tarotkaarten", + b_planet_cards = "Planeetkaarten", + b_spectral_cards = "Spectrale kaarten", + b_enhanced_cards = "Verbeterde kaarten", + b_editions = "Edities", + b_booster_packs = "Boosterpakketten", + b_tags = "Tags", + b_decks = "Kaartspellen", + b_continue = "Doorgaan", + b_back = "Terug", + b_music = "Muziek", + b_sounds = "Geluid", + b_imagery = "Afbeeldingen", + b_new_run = "Nieuw spel", + b_challenges = "Uitdagingen", + b_current_profile = "Huidig profiel", + b_load_profile = "Profiel laden", + b_create_profile = "Profiel aanmaken", + b_delete_profile = "Profiel verwijderen", + b_reset_profile = "Profiel resetten", + b_rules = "Regels", + b_restrictions = "Beperkingen", + b_deck = "Kaartspel", + b_play_cap = "SPELEN", + b_options_cap = "OPTIES", + b_collection_cap = "VERZAMELING", + b_quit_cap = "SLUITEN", + b_cash_out = "Uitbetalen", + k_unknown = "?????", + k_compatible = "compatibel", + k_incompatible = "incompatibel", + k_round = "Ronde", + k_ante = "Ante", + k_seed = "Seed", + k_reroll = "Opnieuw gooien", + k_mult = "Multi", + k_rank = "Rang", + k_suit = "Kleur", + k_stake = "Inzet", + k_common = "Gewoon", + k_uncommon = "Ongewoon", + k_rare = "Zeldzaam", + k_legendary = "Mythisch", + k_debuffed = "Zonder extra", + k_locked = "Vergrendeld", + k_undisovered = "Niet ontdekt", + k_joker = "Joker", + k_voucher = "Voucher", + k_tarot = "Tarot", + k_planet = "Planeet", + k_dwarf_planet = "Dwergplaneet", + k_planet_q = "Planeet?", + k_spectral = "Spectraal", + k_booster = "Booster", + k_edition = "Editie", + k_hud_hands = "Handen", + k_hud_discards = "Weggooimogelijkheden", + k_lower_score = "score", + k_arcana_pack = "Arcanapakket", + k_celestial_pack = "Hemels pakket", + k_spectral_pack = "Spectraal pakket", + k_standard_pack = "Standaardpakket", + k_buffoon_pack = "Lolbroekenpakket", + k_enter_text = "Voer tekst in", + k_defeated_by = "Verslagen door", + k_level_prefix = "level", + k_also_applied = "Ook toegepast", + k_base_cards = "Basiskaarten", + k_effective = "Effectief", + k_aces = "Azen", + k_face_cards = "Plaatjes", + k_numbered_cards = "Kaarten met getallen", + k_cap_consumables = "VERBRUIKSARTIKELEN", + k_page = "Pagina", + k_ante_cap = "ANTE", + k_base_cap = "BASIS", + k_jokers_cap = "JOKERS", + k_vouchers_cap = "VOUCHERS", + k_x_base = "X-basis", + k_not_discovered = "Niet ontdekt", + k_unlocked_ex = "Vrijgespeeld!", + k_challenge_mode = "Uitdagingsmodus", + k_daily_run = "Dagelijks spel", + k_profile = "Profiel", + k_wins = "Gewonnen", + k_empty_caps = "LEEG", + k_collection = "Verzameling", + k_stake_level = "Inzetniveau", + k_none = "Geen", + k_game_modifiers = "Spelaanpassingen", + k_custom_rules = "Aangepaste regels", + k_banned_cards = "Verbannen kaarten", + k_banned_tags = "Verbannen tags", + k_other = "Overig", + k_money = "Geld", + k_best_hand = "Beste hand", + k_seeded_run = "Spel met seed", + k_enter_seed = "Seed invoeren", + k_lvl = "level", + k_skipped_cap = "OVERGESLAGEN", + k_no_reward = "Geen beloning", + k_reward = "Beloning", + k_nope_ex = "Echt niet!", + k_or = "of", + k_balanced = "Gebalanceerd", + ph_improve_run = "Verbeter je spel!", + ph_sneak_peek = "Voorproefje", + ph_deck_preview_stones = "Stenen", + ph_deck_preview_effective = "Effectief totaal vanwege Jokers, blinds en kaartverbeteringen", + ph_blind_score_at_least = "Scoor ten minste", + ph_blind_reward = "Beloning:", + ph_up_ante_1 = "Verhoog de ante", + ph_up_ante_2 = "Verhoog alle blinds", + ph_up_ante_3 = "Vernieuw blinds", + ph_stat_joker = "Totaal voltooide rondes met deze kaart", + ph_stat_consumable = "Aantal keer dat deze kaart is gebruikt", + ph_stat_voucher = "Aantal keer dat deze voucher is verzilverd", + ph_demo_thanks_1 = "Bedankt voor het spelen van de", + ph_demo_thanks_2 = "BALATRO-DEMO", + ph_game_over = "SPEL VOORBIJ", + ph_vouchers_redeemed = "Vouchers verzilverd in dit spel", + ph_no_vouchers = "Geen vouchers verzilverd in dit spel", + ph_defeat_this_blind_1 = "Versla deze blind", + ph_defeat_this_blind_2 = "om het te ontdekken", + ph_click_confirm = "Klik opnieuw om te bevestigen", + ph_choose_blind_1 = "Kies je", + ph_choose_blind_2 = "volgende blind", + ph_mr_bones = "Gespaard door Meneer Botjes", + ph_score_at_least = "Scoor ten minste", + ph_all_poker_hand = "Alle pokerhanden", + ph_1_level = "+1 Niveau", + ph_boss_disabled = "Baas uitgeschakeld!", + ph_most_played = "(meest gespeelde hand)", + ml_demo_thanks_message = { + "Overweeg om Balatro op je verlanglijst", + "op Steam te zetten en je aan te melden", + "voor de nieuwsbrief op playbalatro.com" + }, + ml_eternal = { + "Eeuwig", + "Kan niet verkocht", + "of vernietigd worden" + }, + ml_gold_seal_desc = { + "Gouden zegel", + "keert terug naar de hand", + "als deze wordt gespeeld" + }, + ml_crash_report_info = { + "Crashmeldingen worden naar de ontwikkelaar gestuurd", + "om toekomstige problemen te voorkomen.", + "Er worden geen identificerende of persoonlijke gegevens verstuurd." + }, + ml_play_discard_pos_opt = { + "Weggooien/spelen", + "Spelen/weggooien" + }, + ml_windowmode_opt = { + "In een venster", + "Volledig scherm", + "Zonder randen" + }, + ml_vsync_opt = { + "VSync aan", + "VSync uit" + }, + ml_shadow_opt = { + "Aan", + "Uit" + }, + ml_smoothing_opt = { + "Uit", + "Aan" + }, + ml_bloom_opt = { + "Uit", + "Aan" + }, + ml_card_stats = { + "Kaart", + "Statistieken" + }, + ml_paste_seed = { + "Plakken", + "Seed" + }, + ml_disabled_seed = { + "Alle ontgrendelingen en", + "Ontdekkingen uitgeschakeld" + }, + ['$'] = "$", + k_redeemed_ex = "Verzilverd!", + k_duplicated_ex = "Verdubbeld!", + k_no_room_ex = "Geen ruimte!", + k_no_space_ex = "Geen ruimte!", + k_no_other_jokers = "Geen andere Jokers!", + k_plus_tarot = "+1 Tarot", + k_plus_stone = "+1 Stenen", + k_plus_planet = "+1 Planeet", + k_plus_spectral = "+1 Spectraal", + k_active_ex = "Actief!", + k_level_up_ex = "Level omhoog!", + k_upgrade_ex = "Upgrade!", + k_again_ex = "Opnieuw!", + k_val_up = "Waarde omhoog!", + k_reset = "Resetten", + k_extinct_ex = "Uitgestorven!", + k_safe_ex = "Veilig!", + k_saved_ex = "Gered!", + k_swapped_ex = "Geruild!", + k_copied_ex = "Gekopieerd!", + k_melted_ex = "Gesmolten!", + b_copy = "Kopiëren", + b_high_contrast_cards = "Kaarten met hoog contrast", + b_set_rumble = "Trilling van controller", + b_seals = "Zegels", + b_new_challenge = "Nieuwe uitdaging starten", + b_unlock_all = "Alles vrijspelen", + k_active = "actief", + k_deck = "Kaartspel", + k_progress = "Voortgang", + k_challenges = "Uitdagingen", + k_joker_stickers = "Jokerstickers", + k_deck_stake_wins = "Kaartspel inzet gewonnen", + k_enter_name = "Naam invoeren", + k_gold = "Goud", + k_card_stats = "Kaartstatistieken", + k_view = "Weergave", + k_all_hands = "Alle handen", + k_high_score_ex = "Highscore!", + k_demo_version_ex = "Demoversie!", + k_playing_as = "Speelt als", + k_choose = "Kiezen", + k_achievements_disabled = "Prestaties uitgeschakeld", + ph_no_boss_active = "geen baas actief", + ph_you_win = "JIJ WINT!", + ph_you_win_demo = "JIJ WINT DE DEMO!", + ph_defeat_the_boss = "Versla de blind van een baas", + ph_score_furthest_ante = "Ante", + ph_score_furthest_round = "Ronde", + ph_score_hand = "Beste hand", + ph_score_poker_hand = "Meest gespeelde hand", + ph_score_new_collection = "Nieuwe ontdekkingen", + ph_score_cards_played = "Gespeelde kaarten", + ph_score_cards_discarded = "Weggegooide kaarten", + ph_score_times_rerolled = "Keer opnieuw gegooid", + ph_score_cards_purchased = "Gekochte kaarten", + ml_edition_seal_enhancement_explanation = { + "Speelkaarten kunnen elk een", + "verbetering, editie en zegel hebben" + }, + ml_unlock_all_explanation = { + "PAS OP! Als je de complete verzameling ontgrendelt,", + "worden prestaties voor dit profiel uitgeschakeld!" + }, + k_plus_joker = "+1 Joker", + k_eaten_ex = "Opgegeten!", + k_eroded_ex = "Geërodeerd!", + k_achievement = "Prestatie", + ph_unscored_hand = "Hand geeft geen score", + ph_alert_debuff_confirm = "Druk opnieuw op 'Spelen' om te bevestigen", + k_drank_ex = "Opgedronken!", + k_trophy = "Prijs", + k_trophies_disabled = "Prijzen uitgeschakeld", + ml_unlock_all_trophies = { + "PAS OP! Als je de complete verzameling ontgrendelt,", + "schakelt prijzen voor dit profiel uit!" + }, + k_poker_hand = "pokerhand", + ph_4_7_of_clubs = "vier 7 van Klaveren" + }, + v_dictionary = { + a_xmult = "X#1# Multi", + a_mult = "+#1# Multi", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# handomvang", + a_hands = "+#1# Handen", + a_sold_tally = "#1#/#2# verkocht", + a_remaining = "#1# resterend", + ante_x_voucher = "ANTE #1# VOUCHER", + loyalty_active = "Actief!", + loyalty_inactive = "#1# resterend", + deck_preview_wheel_singular = "Getallen kunnen lager zijn vanwege #1# kaart die met de afbeelding naar beneden is getrokken", + deck_preview_wheel_plural = "Getallen kunnen lager zijn vanwege #1# kaarten die met de afbeelding naar beneden is getrokken", + challenges_completed = "#1#/#2# uitdagingen voltooid", + interest = "#1# rente per $#2# (#3# max)", + remaining_hand_money = "Resterende handen ($#1# elk)", + remaining_discard_money = "Resterende weggooimogelijkheden ($#1# per stuk)", + ml_foil_desc = { + "Folie", + "+#1# fiches" + }, + ml_holo_desc = { + "Holografisch", + "+#1# Multi" + }, + ml_polychrome_desc = { + "Polychroom", + "X#1# Multi" + }, + ml_negative_desc = { + "Negatief", + "+#1# Jokervak" + }, + a_mult_minus = "-#1# Multi", + a_handsize_minus = "-#1# handomvang", + ml_negative_consumable_desc = { + "Negatief", + "+#1# verbruiksvak" + }, + a_xmult_minus = "-X#1# Multi", + unlocked = "#1#/#2# vrijgespeeld", + completed = "#1#/#2# voltooid" + }, + v_text = { + ch_m_dollars = { + "Begin met {C:money}$#1#" + }, + ch_m_hands = { + "{C:blue}#1#{} handen per ronde" + }, + ch_m_discards = { + "{C:red}#1#{} weggooimogelijkheden per ronde" + }, + ch_m_reroll_cost = { + "{C:money}$#1#{} basiskosten van opnieuw gooien" + }, + ch_m_joker_slots = { + "{C:attention}#1#{} Jokervakken" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} verbruiksvakken" + }, + ch_m_hand_size = { + "{C:attention}#1#{} handomvang" + }, + ch_m_none = { + "{C:inactive}Geen" + }, + ch_c_no_reward = { + "{C:attention}Blinds{} leveren geen beloningsgeld op" + }, + ch_c_no_reward_specific = { + "{C:attention}#1# blinds{} leveren geen beloningsgeld op" + }, + ch_c_no_extra_hand_money = { + "Extra {C:blue}handen{} leveren geen geld meer op" + }, + ch_c_no_interest = { + "Verdien geen {C:attention}rente{} aan het einde van ronde" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}Dagelijkse uitdaging!" + }, + ch_c_set_seed = { + "1 poging met ingestelde seed: {C:inactive}{Hidden}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}Fiches{} kunnen niet hoger zijn dan het huidige {C:money}$" + }, + ch_c_none = { + "{C:inactive}Geen" + }, + ch_c_inflation = { + "Verhoog prijzen permanent met {C:money}$ 1{} bij elke aankoop" + }, + ch_c_discard_cost = { + "Weggooimogelijkheden kosten elk {C:money}$#1#{}" + }, + ch_c_all_eternal = { + "Alle winkeljokers zijn {C:eternal}eeuwig{}" + }, + ch_c_flipped_cards = { + "{C:green}1 op de #1#{} kaarten worden met de afbeelding naar beneden getrokken" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Houd {C:red}-1{} kaarten in de hand voor elke {C:money}$#1#{} die je hebt" + }, + ch_c_no_shop_jokers = { + "Jokers verschijnen niet meer in de {C:attention}winkel" + }, + ch_c_debuff_played_cards = { + "Van alle {C:attention}gespeelde{} kaarten verdwijnen de {C:attention}extra's{} na het scoren" + }, + ch_c_set_eternal_ante = { + "Als ante {C:attention}#1#{} baas is verslagen, worden alle jokers {C:attention}eeuwig" + }, + ch_c_set_joker_slots_ante = { + "Als ante {C:attention}#1#{} baas is verslagen, gaan alle jokervakken terug naar {C:attention}0" + } + }, + tutorial = { + sb_1 = { + "Hallo! Mijn naam is", + "{C:attention}Jimbo{}, ik help je graag", + "om dit spel onder de knie te krijgen!" + }, + sb_2 = { + "Jouw doel is om", + "{C:blue}fiches{} te verdienen om", + "de {C:attention}blind van de vijand te verslaan" + }, + sb_3 = { + "Dit is een {C:blue}small blind{},", + "je hoeft maar", + "{C:attention}300 fiches{} te halen om deze te verslaan." + }, + sb_4 = { + "Selecteer de {C:blue}small blind", + "om de ronde te starten!" + }, + bb_1 = { + "Als je de {C:attention}big blind", + "selecteert, verdien je wat geld" + }, + bb_2 = { + "Of kies {C:attention}overslaan", + "voor een {C:attention}tag{}! Elke", + "{C:attention}tag{} heeft een uniek effect" + }, + bb_3 = { + "Maar let op", + "de {C:attention}blind van een baas{}. Hij", + "heeft een kracht waar je", + "omheen moet plannen." + }, + bb_4 = { + "Als je hem verslaat, gaat de", + "{C:attention}ante{} omhoog en worden", + "alle {C:attention}blinds{} moeilijker" + }, + bb_5 = { + "Versla {C:attention}ante{} #1# om te winnen.", + "Kies nu je pad!" + }, + fh_1 = { + "Je verdient fiches door", + "{C:attention}pokerhanden te spelen" + }, + fh_2 = { + "Elke {C:attention}pokerhand{} levert een", + "basisaantal {C:blue}fiches", + "op dat vermenigvuldigd wordt met een {C:red}Multi" + }, + fh_3 = { + "Bekijk je {C:attention}pokerhanden", + "in het {C:attention}spelinfo{}-gebied,", + "net als andere informatie", + "over je huidige spel" + }, + fh_4 = { + "Kaarten leveren je ook", + "wat {C:blue}fiches{} op,", + "beweeg er maar eens overheen!" + }, + fh_5 = { + "Selecteer nu maximaal", + "{C:attention}5{} kaarten om te spelen", + "en druk op {C:blue}Hand spelen" + }, + fh_6 = { + "Je kunt ook {C:red}Weggooien{} tot", + "maximaal {C:attention}5{} geselecteerde kaarten", + "om een nog sterkere hand", + "te krijgen. Probeer maar!" + }, + fh_7 = { + "Voorzichtig! Je hebt maar een", + "beperkt aantal {C:blue}handen", + "en {C:red}weggooimogelijkheden{} per ronde" + }, + fh_8 = { + "Verdien {C:attention}300 fiches{} voor", + "je geen {C:blue}handen meer hebt", + "om deze ronde te winnen.", + "Succes!" + }, + sh_1 = { + "Als je meer kaarten krijgt,", + "denk er dan aan dat je ze kunt", + "herschikken. {C:attention}Jokers{} activeren", + "van links naar rechts" + }, + sh_2 = { + "En zorg ervoor dat je", + "je verbruiksartikelen {C:attention}GEBRUIKT{}!" + }, + sh_3 = { + "Selecteer maximaal {C:attention}2{} kaarten", + "in je hand en druk op", + "{C:attention}gebruiken{} op de {C:tarot}tarot{}-kaart", + "om ze te verbeteren!" + }, + s_1 = { + "Goed gedaan! Nu je", + "met {C:money}geld{} {E:1}overspoeld{} wordt,", + "kun je wat nieuwe", + "kaarten uit de {C:attention}winkel kopen" + }, + s_2 = { + "Probeer deze knappe", + "duivel maar eens te kopen" + }, + s_3 = { + "Dit is een van de {C:attention}#1#", + "{C:attention}Jokers{} die je aan je spel kunt", + "toevoegen. Elke {C:attention}Joker", + "heeft ander effect" + }, + s_4 = { + "Deze voegt {C:red}+4 Multi{} toe aan", + "elke hand die je speelt!" + }, + s_5 = { + "Wees kieskeurig, je mag maar", + "{C:attention}5 Joker{}-kaarten tegelijk", + "hebben" + }, + s_6 = { + "Koop nu de andere", + "kaart uit de {C:attention}winkel" + }, + s_7 = { + "Deze {C:tarot}tarot{}-kaart is een", + "{C:attention}verbruiksartikel{}. Deze", + "verbetert je speelkaarten!", + "Houd deze vast." + }, + s_8 = { + "Je kunt maximaal", + "{C:attention}2 verbruiks{}-kaarten tegelijk", + "hebben" + }, + s_9 = { + "Als je genoeg hebt gespaard,", + "kun je een {C:attention}voucher{} kopen.", + "{C:attention}Vouchers{} upgraden", + "je spel vanzelf!" + }, + s_10 = { + "{C:attention}Vouchers{} worden aangevuld", + "als je de", + "{C:attention}blind van een baas{} hebt verslagen." + }, + s_11 = { + "En bekijk de", + "beide {C:booster}Boosterpakketten{} in", + "elke winkel eens. Ze zitten", + "boordevol handigheidjes!" + }, + s_12 = { + "Laten we naar", + "de {C:attention}volgende ronde{} gaan." + } + }, + achievement_names = { + ante_up = "Verhoog de ante!", + ante_upper = "Anteverhoger!", + heads_up = "Heads-up", + low_stakes = "Lage inzet", + mid_stakes = "Gemiddelde inzet", + high_stakes = "Hoge inzet", + card_player = "Kaartspeler", + card_discarder = "Kaartweggooier", + nest_egg = "Nestei", + flushed = "Geflusht", + speedrunner = "Snelheidsduivel", + roi = "Rendement", + shattered = "Vernietigd", + royale = "Royaal", + retrograde = "Achteruitgaand", + _10k = "10 K", + _1000k = "1000 K", + _100000k = "100.000 K", + tiny_hands = "Kleine handen", + big_hands = "Grote handen", + you_get_what_you_get = "Pak wat je pakken kunt", + rule_bender = "Buig de regels", + rule_breaker = "Regelbreker", + legendary = "Mythisch", + astronomy = "Astronomie", + cartomancy = "Kaartenmagie", + clairvoyance = "Helderziendheid", + extreme_couponer = "Koopjesjager", + completionist = "Afronder", + completionist_plus = "Afronder+", + completionist_plus_plus = "Afronder++" + }, + achievement_descriptions = { + ante_up = "Bereik ante 4", + ante_upper = "Bereik ante 8", + heads_up = "Win een spel", + low_stakes = "Win een spel met ten minste moeilijkheidsgraad rode inzet", + mid_stakes = "Win een spel met ten minste moeilijkheidsgraad zwarte inzet", + high_stakes = "Win een spel met ten minste moeilijkheidsgraad gouden inzet", + card_player = "Speel ten minste 2500 kaarten", + card_discarder = "Gooi ten minste 2500 kaarten weg", + nest_egg = "Zorg dat je $ 400 of meer hebt in één spel", + flushed = "Speel een flush met 5 Wildkaarten", + speedrunner = "Win een spel in maximaal 12 rondes", + roi = "Koop 5 vouchers vóór ante 4", + shattered = "Breek 2 glazen kaarten in één hand", + royale = "Speel een royal flush", + retrograde = "Bereik level 10 in een pokerhand", + _10k = "Scoor 10.000 fiches in één hand", + _1000k = "Scoor 1.000.000 fiches in één hand", + _100000k = "Scoor 100.000.000 fiches in één hand", + tiny_hands = "Dun je kaartspel uit tot maximaal 20 kaarten", + big_hands = "Zorg dat je 80 of meer kaarten in je kaartspel hebt", + you_get_what_you_get = "Win een spel zonder de winkel opnieuw te gooien", + rule_bender = "Voltooi een uitdagingsspel", + rule_breaker = "Voltooi elk uitdagingsspel", + legendary = "Ontdek een mythische Joker", + astronomy = "Ontdek elke planeetkaart", + cartomancy = "Ontdek elke tarotkaart", + clairvoyance = "Ontdek elke spectrale kaart", + extreme_couponer = "Ontdek elke voucher", + completionist = "Ontdek 100% van je verzameling", + completionist_plus = "Win met elk kaartspel met moeilijkheidsgraad gouden inzet", + completionist_plus_plus = "Verdien een gouden sticker met elke Joker" + }, + quips = { + wq_1 = { + "Geweldig gedaan!" + }, + wq_2 = { + "Daar ben je goed", + "mee omgegaan!" + }, + wq_3 = { + "Blijkbaar blufte", + "je toch niet!" + }, + wq_4 = { + "Jammer dat die", + "fiches allemaal", + "virtueel zijn..." + }, + wq_5 = { + "Zo te zien heb ik", + "je veel geleerd!" + }, + wq_6 = { + "Je hebt wat", + "heads-up potjes gespeeld!" + }, + wq_7 = { + "Maar goed dat", + "ik niet tegen", + "jou heb ingezet!" + }, + lq_1 = { + "Misschien kunnen we", + "beter gaan", + "kwartetten..." + }, + lq_2 = { + "We hebben gefold", + "als een folder!" + }, + lq_3 = { + "Tijd voor een nieuwe", + "ronde, en", + "nieuwe kansen!" + }, + lq_4 = { + "Je weet toch wat ze", + "altijd zeggen: het", + "huis wint altijd!" + }, + lq_5 = { + "Nu zijn we erachter", + "wie de echte", + "Joker is!" + }, + lq_6 = { + "O nee, was jij", + "ook aan het bluffen?" + }, + lq_7 = { + "Nu staan wij", + "voor paal!" + }, + lq_8 = { + "Als ik handen had,", + "zou ik ze voor mijn", + "ogen houden!" + }, + lq_9 = { + "Ik ben letterlijk", + "een nar, maar wat", + "is jouw excuus?" + }, + lq_10 = { + "Wat een flop!" + }, + dq_1 = { + "Jemig! Hopelijk heb", + "je nog wat trucs", + "in petto voor deze", + "laatste uitdaging!" + } + }, + challenge_names = { + c_omelette_1 = "De omelet", + c_city_1 = "15-minutenstad", + c_rich_1 = "Rijken worden rijker", + c_knife_1 = "Bloedstollend", + c_xray_1 = "Röntgenogen", + c_mad_world_1 = "Krankzinnige wereld", + c_luxury_1 = "Welvaartsbelasting", + c_non_perishable_1 = "Houdbaar", + c_medusa_1 = "Medusa", + c_double_nothing_1 = "Dubbel of niets", + c_typecast_1 = "Beeldvorming", + c_inflation_1 = "Inflatie", + c_bram_poker_1 = "Bram Poker", + c_fragile_1 = "Kwetsbaar", + c_monolith_1 = "Monoliet", + c_blast_off_1 = "Explosie", + c_five_card_1 = "Trekking van vijf kaarten", + c_golden_needle_1 = "Gouden naald", + c_cruelty_1 = "Wreedheid", + c_jokerless_1 = "Zonder jokers" + } + } +} \ No newline at end of file diff --git a/localization/pl.lua b/localization/pl.lua new file mode 100644 index 0000000..d75c062 --- /dev/null +++ b/localization/pl.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Joker", + text = { + "Mnoż. {C:red,s:1.1}+#1#{}" + } + }, + j_jolly = { + name = "Wesoły Joker", + text = { + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + } + }, + j_zany = { + name = "Zwariowany Joker", + text = { + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + } + }, + j_mad = { + name = "Obłąkany Joker", + text = { + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + } + }, + j_crazy = { + name = "Szalony Joker", + text = { + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + } + }, + j_droll = { + name = "Dziwaczny Joker", + text = { + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + } + }, + j_half = { + name = "Pół-Joker", + text = { + "Mnoż. {C:red}+#1#{}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#{} lub mniej kart" + } + }, + j_fortune_teller = { + name = "Wróżbita", + text = { + "Mnoż. {C:red}+#1#{} za każdą", + "wykorzystaną kartę {C:purple}Tarota{}", + "{C:inactive}(obecnie {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Żongler", + text = { + "{C:attention}+#1#{} do rozmiaru ręki" + } + }, + j_drunkard = { + name = "Pijak", + text = { + "{C:red}+#1#{} do zrzutki" + } + }, + j_stone = { + name = "Kamienny Joker", + text = { + "Gdy karta {C:attention}Kamień zostanie", + "zagrana, na stałe", + "daje {C:chips}+#1#{} żet.", + "{C:inactive}(obecnie {C:chips}+#2#{C:inactive} żet.)" + } + }, + j_golden = { + name = "Złoty Joker", + text = { + "Zyskujesz {C:money}#1#${} na", + "końcu rundy" + } + }, + j_stencil = { + name = "Joker Szablon", + text = { + "mnoż. {X:red,C:white} X1 {} za każdy", + "pusty slot na {C:attention}jokera{}", + "{s:0.8}Joker Szablon zawarty", + "{C:inactive}(obecnie {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Cztery Palce", + text = { + "Wszystkie {C:attention}kolory{} i", + "{C:attention}strity{} można", + "uzyskać z {C:attention}4{} kart" + } + }, + j_mime = { + name = "Mim", + text = { + "Aktywuj ponownie wszystkie", + "zdolności kart {C:attention}posiadanych w", + "{C:attention}dłoni{}" + } + }, + j_credit_card = { + name = "Karta kredytowa", + text = { + "Zaciągnij dług", + "do wartości {C:red}-#1#${}" + } + }, + j_greedy_joker = { + name = "Chciwy Joker", + text = { + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę w", + "kolorze {C:diamonds}#2#{}" + } + }, + j_lusty_joker = { + name = "Żwawy Joker", + text = { + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę w", + "kolorze {C:hearts}#2#{}" + } + }, + j_wrathful_joker = { + name = "Gniewny Joker", + text = { + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę w", + "kolorze {C:spades}#2#{}" + } + }, + j_gluttenous_joker = { + name = "Żarłoczny Joker", + text = { + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę w", + "kolorze {C:clubs}#2#{}" + } + }, + j_ceremonial = { + name = "Sztylet Rytualny", + text = { + "Po wybraniu {C:attention}Przeszkadzajki{},", + "niszczy jokera po prawej", + "oraz na stałe dodaje {C:attention}podwojenie", + "wartości sprzedaży do tego {C:red}mnoż.", + "{C:inactive}(obecnie mnoż. {C:mult}+#1#{C:inactive})" + } + }, + j_banner = { + name = "Chorągiew", + text = { + "{C:chips}+#1#{} żet. za", + "każdą pozostałą", + "zrzutkę {C:attention}" + } + }, + j_mystic_summit = { + name = "Mistyczny Szczyt", + text = { + "Mnoż. {C:mult}+#1#{}, gdy", + "pozostanie {C:attention}#2#{} zrzutek", + "w grze" + } + }, + j_marble = { + name = "Marmurowy Joker", + text = { + "Dodaje jedną kartę {C:attention}Kamień{} do", + "do talii", + "po wybraniu {C:attention}Przeszkadzajki{}" + } + }, + j_loyalty_card = { + name = "Karta Lojalnościowa", + text = { + "Mnoż. {X:red,C:white} X#1# {} co", + "{C:attention}#2#{} rozegranych układów", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "Bila 8", + text = { + "Tworzy kartę {C:planet}Planety{},", + "jeśli zagrana ręka zawiera", + "{C:attenetion}#1#{} lub więcej {C:attention}8{}", + "{C:inactive}(wymaga miejsca)" + } + }, + j_misprint = { + name = "Błąd w druku", + text = { + "" + } + }, + j_dusk = { + name = "Zmierzch", + text = { + "Uruchom ponownie wszystkie karty", + "punktujące w {C:attention}ostatniej", + "{C:attention}ręce{} rundy" + } + }, + j_raised_fist = { + name = "Uniesiona Pięść", + text = { + "Dodaje {C:attention}podwójną{} rangę", + "karcie w ręce o {C:attention}najmniejszej wartości{}", + "do mnoż." + } + }, + j_chaos = { + name = "Klaun Chaos", + text = { + "{C:attention}#1#{} darmowy ponowny {C:green}rzut", + "na wizytę w sklepie" + } + }, + j_fibonacci = { + name = "Ciąg Fibonacciego", + text = { + "Mnoż. {C:mult}+#1#{} za każdego", + "zagranego {C:attention}asa{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} lub {C:attention}8{}" + } + }, + j_steel_joker = { + name = "Stalowy Joker", + text = { + "Ten Joker daje", + "mnoż. {X:mult,C:white} X#1# {}", + "za każdą Kartę {C:attention}Stalową w kompletnej talii", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_scary_face = { + name = "Straszna Twarz", + text = { + "Figury {C:attention}karciane{}", + "dają {C:chips}+#1#{} żet.", + "przy ich zagraniu" + } + }, + j_abstract = { + name = "Abstrakcyjny Joker", + text = { + "Mnoż. {C:mult}+#1#{} za", + "każdego {C:attention}jokera{}", + "{C:inactive}(obecnie mnoż. {C:red}+#2#{C:inactive})" + } + }, + j_delayed_grat = { + name = "Gratyfikacja z opóźnieniem", + text = { + "Zyskaj {C:money}#1#${} za {C:attention}zrzutkę{}, jeśli", + "nie skorzystano ze zrzutek", + "do końca rundy" + } + }, + j_hack = { + name = "Kabareciarz", + text = { + "Aktywuj ponownie", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} lub {C:attention}5{}", + "przy ich zagraniu" + } + }, + j_pareidolia = { + name = "Pareidolia", + text = { + "Wszystkie karty są", + "traktowane jako", + "{C:attention}figury{}" + } + }, + j_gros_michel = { + name = "Gros Michel", + text = { + "Mnoż. {C:mult}+#1#{}", + "{C:green}#2# na #3#{} szans, że ta", + "karta zostanie zniszczona", + "na końcu rundy" + } + }, + j_even_steven = { + name = "Równiacha", + text = { + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę", + "o {C:attention}parzystej{} randze", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "Nierówniacha", + text = { + "{C:chips}+#1#{} żet. za", + "każdą zagraną kartę", + "o {C:attention}nieparzystej{} randze", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Uczony", + text = { + "Zagrane {C:attention}asy{}", + "dają {C:chips}+#2#{} żet.", + "oraz mnoż. {C:mult}+#1#{}", + "przy ich zagraniu" + } + }, + j_business = { + name = "Wizytówka", + text = { + "Figury {C:attention}karciane{} dają", + "{C:green}#1# na #2#{} szanse", + "zdobycia {C:money}2${}, przy ich zagraniu" + } + }, + j_supernova = { + name = "Supernowa", + text = { + "Dodaje krotność", + "rozegranego {C:attention}układu pokerowego{}", + "do mnoż." + } + }, + j_ride_the_bus = { + name = "Przejażdżka autobusem", + text = { + "Mnoż. {C:mult}+#1#{} na", + "każdą kolejną rękę", + "zagraną bez", + "punktującej figury {C:attention}karcianej{}", + "{C:inactive}(obecnie mnoż. {C:mult}+#2#{C:inactive})" + } + }, + j_space = { + name = "Kosmiczny Joker", + text = { + "{C:green}#1# na #2#{} szans na", + "podniesienie poziomu", + "zagranego {C:attention}układu pokerowego{}" + } + }, + j_egg = { + name = "Jajo", + text = { + "Zyskujesz {C:money}#1#${}", + "{C:attention}wartości sprzedaży{} na", + "końcu rundy" + } + }, + j_burglar = { + name = "Włamywacz", + text = { + "Po wybraniu {C:attention}Przeszkadzajki{},", + "zyskujesz {C:blue}+#1#{} rąk oraz", + "{C:attention}tracisz wszystkie zrzutki" + } + }, + j_blackboard = { + name = "Tablica", + text = { + "Mnoż. {X:red,C:white} X#1# {}, jeśli wszystkie", + "nie zagrane karty w ręce", + "to {C:spades}#2#{} lub {C:clubs}#3#{}" + } + }, + j_runner = { + name = "Biegacz", + text = { + "Zyskujesz {C:chips}+#2#{} żet.,", + "jeśli zagrana ręka", + "zawiera {C:attention}strita{}", + "{C:inactive}(obecnie {C:chips}+#1#{C:inactive} żet.)" + } + }, + j_ice_cream = { + name = "Lody", + text = { + "{C:chips}+#1#{} żet.", + "{C:chips}-#2#{} żet. za", + "każdą rozegraną rękę" + } + }, + j_dna = { + name = "DNA", + text = { + "Jeśli {C:attention}pierwsza ręką{} w rundzie", + "to tylko {C:attention}1{} karta, dodaje", + "na stałe do talii drugą tę samą kartę", + "i dobiera ją do {C:attention}ręki" + } + }, + j_splash = { + name = "Plusk", + text = { + "Każda {C:attention}zagrana karta", + "zalicza się do punktacji" + } + }, + j_blue_joker = { + name = "Niebieski Joker", + text = { + "{C:chips}+#1#{} żet. za każdą", + "pozostałą kartę w {C:attention}talii", + "{C:inactive}(obecnie {C:chips}+#2#{C:inactive} żet.)" + } + }, + j_sixth_sense = { + name = "Szósty zmysł", + text = { + "Gdy {C:attention}pierwsza ręka{} rundy to", + "pojedyncza {C:attention}6{}, ulega zniszczeniu, przy jednoczesnym", + "utworzeniu karty {C:spectral}Ducha{}", + "{C:inactive}(wymaga miejsca)" + } + }, + j_constellation = { + name = "Gwiazdozbiór", + text = { + "Zyskujesz mnoż. {X:mult,C:white} X#1# {}", + "na wykorzystaną kartę {C:planet}Planety{}", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_hiker = { + name = "Wycieczkowicz", + text = { + "Przy zagraniu dowolnej {C:attention}karty{}", + "na stałe otrzymujesz", + "{C:chips}+#1#{} żet." + } + }, + j_faceless = { + name = "Joker bez twarzy", + text = { + "Zyskujesz {C:money}#1#${}, jeśli {C:attention}#2#{} lub", + "więcej {C:attention}figur karcianych{}", + "zostanie odrzuconych", + "jednocześnie" + } + }, + j_green_joker = { + name = "Zielony Joker", + text = { + "Mnoż. {C:mult}+#1#{} na rozegraną rękę", + "Mnoż. {C:mult}-#2#{} za zrzutkę", + "{C:inactive}(obecnie mnoż. {C:mult}+#3#{C:inactive})" + } + }, + j_superposition = { + name = "Superpozycja", + text = { + "Jeśli układ pokerowy zawiera", + "{C:attention}asa{} i {C:attention}strita{},", + "otrzymujesz kartę {C:tarot}Tarota{}", + "{C:inactive}(wymaga miejsca)" + } + }, + j_todo_list = { + name = "Lista zadań", + text = { + "Zyskujesz {C:money}#1#${}, jeśli {C:attention}układ pokerowy{}", + "to {C:attention}#2#{},", + "przy czym układ pokerowy zmienia się", + "przy każdej wypłacie" + } + }, + j_ticket = { + name = "Złoty bilet", + text = { + "Zyskujesz {C:money}#1#${} za", + "każdą zagraną {C:attention}Złotą{} kartę" + }, + unlock = { + "Zagraj rękę składającą się z 5 kart,", + "która zawiera tylko", + "karty {C:attention,E:1}Złote{}" + } + }, + j_mr_bones = { + name = "Kostek", + text = { + "Chroni przed śmiercią,", + "jeśli punkty z żetonów", + "stanowią przynajmniej {C:attention}25%", + "wymaganych żetonów", + "{S:1.1,C:red,E:2}Ulega samozniszczeniu{}" + }, + unlock = { + "Przegrywasz {C:attention,E:1}#1#{} podejść", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Akrobata", + text = { + "Mnoż. {X:red,C:white} X#1# {} w ostatniej", + "{C:attention}ręce{} rundy" + }, + unlock = { + "Zagraj {C:attention,E:1}#1#{} kart", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "Maski teatralne", + text = { + "Aktywuj ponownie wszystkie", + "{C:attention}figury{} karciane przy ich zagraniu" + }, + unlock = { + "Zagraj łącznie", + "{C:attention,E:1}#1#{} figur karcianych", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "Korsarz", + text = { + "Dodaje wartość sprzedaży", + "wszystkich pozostałych posiadanych {C:attention}jokerów{}", + "tej karty do mnoż.", + "{C:inactive}(obecnie mnoż. {C:mult}+#1#{C:inactive})" + }, + unlock = { + "Sprzedaj łącznie", + "{C:attention,E:1}#1#{} jokerów", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Trubadur", + text = { + "{C:attention}+#1#{} do rozmiaru ręki", + "{C:red}-#2#{} ręka na rundę" + }, + unlock = { + "Wygraj {C:attention,E:1}#1#{} rund", + "z rzędu, rozgrywając", + "tylko 1 rękę" + } + }, + j_certificate = { + name = "Świadectwo", + text = { + "Na początku rundy", + "dodaje losową {C:attention}kartę", + "{C:attention}rozgrywającą{}", + "{C:attention}pieczęć{} do twojej ręki" + }, + unlock = { + "Zyskaj Złotą", + "kartę rozgrywającą", + "ze {C:attention,E:1}Złotą Pieczęcią" + } + }, + j_smeared = { + name = "Rozmazany Joker", + text = { + "{C:hearts}Kiery{} i {C:diamonds}karo", + "liczą się jako ten sam kolor", + "{C:spades}Piki{} i {C:clubs}trefle", + "liczą się jako ten sam kolor" + }, + unlock = { + "Posiadaj przynajmniej {C:attention}#1#", + "{E:1,C:attention}#2#{} w", + "swojej talii" + } + }, + j_throwback = { + name = "Powrót do przeszłości", + text = { + "Zyskujesz mnoż. {X:mult,C:white} X#1# {}", + "za każdą pominiętą {C:attention}Przeszkadzajkę{} w tym podejściu", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + }, + unlock = { + "Kontynuuj zapisane podejście", + "z menu głównego" + } + }, + j_hanging_chad = { + name = "Na włosku", + text = { + "Aktywuj ponownie {C:attention}pierwszą{}", + "kartę wykorzystaną do zdobycia punktów" + }, + unlock = { + "Pokonaj Przeszkadzajkę Bossa", + "za pomocą {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Surowy klejnot", + text = { + "{C:money}+#1#{} żet. za", + "zagraną kartę w", + "kolorze {C:diamonds}karo{}" + }, + unlock = { + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "kart w kolorze {E:1,C:attention}#2#", + "swojej talii" + } + }, + j_bloodstone = { + name = "Krwawy kamień", + text = { + "{C:green}#1# na #2#{} szans za każdą", + "zagraną kartę w", + "kolorze {C:hearts}kier{}", + "mnoż. {X:mult,C:white} X#3# {} przy zdobyciu punktów," + }, + unlock = { + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "kart w kolorze {E:1,C:attention}#2#", + "swojej talii" + } + }, + j_arrowhead = { + name = "Grot", + text = { + "{C:chips}+#1#{} żet. za każdą", + "zagraną kartę w", + "kolorze {C:spades}pik{}" + }, + unlock = { + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "kart w kolorze {E:1,C:attention}#2#", + "swojej talii" + } + }, + j_onyx_agate = { + name = "Agat onyksowy", + text = { + "Mnoż. {C:mult}+#1#{} za każdą", + "zagraną kartę w", + "w kolorze {C:clubs}trefl{}" + }, + unlock = { + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "kart w kolorze {E:1,C:attention}#2#", + "swojej talii" + } + }, + j_glass = { + name = "Szklany Joker", + text = { + "Zyskujesz mnoż. {X:mult,C:white} X#1# {}", + "za każdą {C:attention}Szklaną kartę,", + "która zostanie zniszczona", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + }, + unlock = { + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "{E:1,C:attention}#2#{} w", + "swojej talii" + } + }, + j_ring_master = { + name = "Konferansjer cyrkowy", + text = { + "{C:attention}Jokery{}, karty {C:tarot}Tarota{}, karty {C:planet}Planet{}", + "oraz karty {C:spectral}Ducha{} mogą", + "pojawić się wielokrotnie" + }, + unlock = { + "Osiągnij stawkę", + "na poziomie {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Doniczka", + text = { + "Mnoż. {X:mult,C:white} X#1# {}, jeśli", + "w ręce znajdują się punktujące", + "{C:diamonds}karo{} i {C:clubs}trefle{}", + "{C:hearts}Kier{} i {C:spades}Pik{}" + }, + unlock = { + "Osiągnij stawkę", + "na poziomie {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Światłokopia", + text = { + "Powiela zdolność", + "{C:attention}jokera{} na prawo" + }, + unlock = { + "Wygraj podejście" + } + }, + j_wee = { + name = "Maleńki Joker", + text = { + "Joker ten daje", + "{C:chips}+#2#{} żet., przy zagraniu", + "każdej {C:attention}2{}", + "{C:inactive}(obecnie {C:chips}+#1#{C:inactive} żet.)" + }, + unlock = { + "Wygraj podejście w ciągu {E:1,C:attention}#1#", + "lub mniej rund" + } + }, + j_merry_andy = { + name = "Radosny Radek", + text = { + "{C:red}+#1#{} do zrzutek,", + "{C:red}#2#{} do rozmiaru ręki" + }, + unlock = { + "Wygraj podejście w ciągu {E:1,C:attention}#1#", + "lub mniej rund" + } + }, + j_oops = { + name = "Same szóstki!", + text = { + "Podwaja {C:attention}wszystkie", + "{C:green,E:1,S:1.1}prawdopodobieństwa", + "{C:inactive}(przykład: {C:green}1 na 3{C:inactive} -> {C:green}2 na 3{C:inactive})" + }, + unlock = { + "Zdobądź przynajmniej", + "{E:1,C:attention}#1#{} żet.", + "w ciągu jednej ręki" + } + }, + j_idol = { + name = "Bożek", + text = { + "Mnoż. {X:mult,C:white} X#1# {} za każdą", + "#2# z {V:1}#3#{} kart", + "przy jej zagraniu;", + "{s:0.8}karta zmienia się co rundę" + }, + unlock = { + "Zdobądź przynajmniej", + "{E:1,C:attention}#1#{} żet.", + "w ciągu jednej ręki" + } + }, + j_seeing_double = { + name = "Podwójne widzenie", + text = { + "Mnoż. {X:mult,C:white} X#1# {}, jeśli", + "w ręce znajdują się punktujące karty", + "{C:clubs}Trefl{} i punktująca", + "karta innego {C:attention}koloru" + }, + unlock = { + "Zagraj rękę,", + "która zawiera", + "{E:1,C:attention}#1#" + } + }, + j_matador = { + name = "Matador", + text = { + "Zyskaj {C:money}#1#${}, jeśli zagrana", + "ręka aktywuje", + "zdolność {C:attention}Przeszkadzajki Bossa{}" + }, + unlock = { + "Pokonaj Przeszkadzajkę Bossa", + "w ciągu {E:1,C:attention}1 ręki{} bez", + "wykorzystywania zrzutek" + } + }, + j_hit_the_road = { + name = "W drogę", + text = { + "Mnoż. {X:mult,C:white} X#1# {}", + "za każdego odrzuconego", + "{C:attention}waleta{} w tej rundzie", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + }, + unlock = { + "Odrzuć {E:1,C:attention}5", + "{E:1,C:attention}waletów{}", + "jednocześnie" + } + }, + j_duo = { + name = "Duet", + text = { + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + }, + unlock = { + "Wygraj podejście", + "bez zagrywania", + "{E:1,C:attention}#1#" + } + }, + j_trio = { + name = "Trio", + text = { + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + }, + unlock = { + "Wygraj podejście", + "bez zagrywania", + "{E:1,C:attention}#1#" + } + }, + j_family = { + name = "Rodzinka", + text = { + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + }, + unlock = { + "Wygraj podejście", + "bez zagrywania", + "{E:1,C:attention}#1#" + } + }, + j_order = { + name = "Porządek", + text = { + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + }, + unlock = { + "Wygraj podejście", + "bez zagrywania", + "{E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "Plemię", + text = { + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + }, + unlock = { + "Wygraj podejście", + "bez zagrywania", + "{E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "Cavendish", + text = { + "Mnoż. {X:mult,C:white} X#1# {}", + "{C:green}#2# na #3#{} szans, że ta", + "karta zostanie zniszczona", + "na końcu rundy" + } + }, + j_card_sharp = { + name = "Ostra karta", + text = { + "Mnoż. {X:mult,C:white} X#1# {}, jeśli zagrany", + "{C:attention}układ pokerowy{} został już", + "rozegrany w tej rundzie" + } + }, + j_red_card = { + name = "Czerwona karta", + text = { + "Zyskujesz mnoż. {C:red}+#1#{}, gdy dowolna", + "{C:attention}paczka wzmacniająca{} zostanie pominięta", + "{C:inactive}(obecnie mnoż. {C:red}+#2#{C:inactive})" + } + }, + j_madness = { + name = "Szaleństwo", + text = { + "Po wybraniu {C:attention}Przeszkadzajki{},", + "zyskujesz mnoż. {X:mult,C:white} X#1# {} oraz", + "{C:attention}niszczysz{} losowego jokera", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {})" + } + }, + j_square = { + name = "Kwadratowy Joker", + text = { + "{C:chips}+#2#{} żet., jeśli", + "w zagranej ręce znajdują się", + "dokładnie {C:attention}4{} karty", + "{C:inactive}(obecnie {C:chips}#1#{} żet.)" + } + }, + j_seance = { + name = "Seans", + text = { + "Jeśli {C:attention}układ pokerowy{} to", + "{C:attention}#1#{}, otrzymujesz", + "losową kartę {C:spectral}Ducha{}", + "{C:inactive}(wymaga miejsca)" + } + }, + j_riff_raff = { + name = "Motłoch", + text = { + "Po wybraniu {C:attention}Przeszkadzajki{},", + "zyskujesz {C:attention}#1# {C:blue}zwykłego{C:attention} jokera", + "{C:inactive}(wymaga miejsca)" + } + }, + j_stuntman = { + name = "Kaskader", + text = { + "{C:chips}+#1#{} żet.,", + "{C:attention}-#2#{} do rozmiaru ręki" + }, + unlock = { + "Zdobądź przynajmniej", + "{E:1,C:attention}#1#{} żet.", + "w ciągu jednej ręki" + } + }, + j_invisible = { + name = "Niewidzialny Joker", + text = { + "Po {C:attention}#1#{} rundach", + "sprzedaj tę kartę, aby", + "{C:attention}zduplikować{} losowego jokera", + "{C:inactive}(obecnie {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Wygraj podejście bez", + "posiadania więcej", + "niż {E:1,C:attention}4 jokerów{}" + } + }, + j_brainstorm = { + name = "Burza mózgów", + text = { + "Powiela zdolność", + "{C:attention}jokera najbardziej wysuniętego na lewo" + }, + unlock = { + "Odrzuca", + "{E:1,C:attention}pokera królewskiego" + } + }, + j_satellite = { + name = "Satelita", + text = { + "Zyskujesz {C:money}#1#${} na końcu", + "rundy za każdą unikalną kartę {C:planet}Planety", + "wykorzystaną w tym podejściu", + "{C:inactive}(obecnie {C:money}$#2#{C:inactive})" + }, + unlock = { + "Posiadaj {E:1,C:money}#1#$", + "lub więcej" + } + }, + j_shoot_the_moon = { + name = "Mierz w Księżyc", + text = { + "Mnoż. {C:mult}+#1#{} za", + "każdą {C:attention}królową{}", + "w ręce" + }, + unlock = { + "Zagraj każdą kartą {E:1,C:attention}kier", + "w swojej talii w ciągu", + "jednej rundy" + } + }, + j_drivers_license = { + name = "Prawo jazdy", + text = { + "Mnoż. {X:mult,C:white} X#1# {}, jeśli w talii", + "znajduje się przynajmniej {C:attention}16", + "ulepszonych kart", + "{C:inactive}(obecnie {C:attention}#2#{C:inactive})" + }, + unlock = { + "Ulepsz {E:1,C:attention}#1#{} kart", + "w swojej talii" + } + }, + j_cartomancer = { + name = "Kartomancja", + text = { + "Otrzymujesz kartę {C:tarot}Tarota{}", + "po wybraniu {C:attention}Przeszkadzajki{}", + "{C:inactive}(wymaga miejsca)" + }, + unlock = { + "Odkryj każdą", + "kartę {E:1,C:tarot}Tarota{}" + } + }, + j_astronomer = { + name = "Astronom", + text = { + "Wszystkie karty {C:planet}Planet{} oraz", + "{C:planet}paczki niebiańskie{} w", + "sklepie są {C:attention}za darmo" + }, + unlock = { + "Odkryj każdą", + "kartę {E:1,C:planet}Planet{}" + } + }, + j_burnt = { + name = "Przypalony Joker", + text = { + "Podniesienie poziomu", + "pierwszego {C:attention}odrzuconego", + "układu pokerowego w każdej rundzie" + }, + unlock = { + "Sprzedaj łącznie", + "{E:1,C:attention}#1#{} karty", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Ucha od buta", + text = { + "Mnoż. {C:mult}+#1#{} za każde", + "posiadane {C:money}#2#${}" + }, + unlock = { + "Posiadaj przynajmniej {E:1,C:attention}#1#", + "Jokery {C:dark_edition}polichromowane{}" + } + }, + j_caino = { + name = "Caino", + text = { + "Mnoż {X:mult,C:white} X#1# {} przy", + "zniszczeniu", + "{C:attention}figury{} karcianej", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "Triboulet", + text = { + "Każde zagranie {C:attention}króla{} i", + "{C:attention}królowej{} daje", + "mnoż. {X:mult,C:white} X#1# {} przy zdobyciu punktów," + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "Yorick", + text = { + "mnoż. {X:mult,C:white} X#1# {} tylko po", + "wykorzystaniu {C:attention}#2#{} zrzut.", + "{C:inactive}(zostało zrzutek: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "Chicot", + text = { + "Wyłącza efekt", + "każdej zdolności {C:attention}Przeszkadzajki Bossa" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "Perkeo", + text = { + "Tworzy {C:dark_edition}Negatyw{}", + "{C:attention}1{} losowej posiadanej", + "{C:attention}zużywalnej{} karty", + "na końcu zakupów w {C:attention}sklepie" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "Przebiegły Joker", + text = { + "{C:chips}+#1#{} żet., jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + } + }, + j_wily = { + name = "Chytry Joker", + text = { + "{C:chips}+#1#{} żet., jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + } + }, + j_clever = { + name = "Bystry Joker", + text = { + "{C:chips}+#1#{} żet., jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + } + }, + j_devious = { + name = "Podstępny Joker", + text = { + "{C:chips}+#1#{} żet., jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + } + }, + j_crafty = { + name = "Cwany Joker", + text = { + "{C:chips}+#1#{} żet., jeśli zagrana", + "ręka zawiera", + "{C:attention}#2#" + } + }, + j_vampire = { + name = "Wampir", + text = { + "Zyskujesz mnoż. {X:mult,C:white} X#1# {} na", + "zagraną {C:attention}ulepszoną kartę{},", + "usuwa {C:attention}ulepszenie karty", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_shortcut = { + name = "Skrót", + text = { + "Pozwala ułożyć {C:attention}strity{}", + "używając luk o randze {C:attention}1", + "{C:inactive}(np.: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Hologram", + text = { + "Zyskujesz mnoż. {X:mult,C:white} X#1# {}", + "na każdą {C:attention}kartę rozgrywającą{} dodaną", + "do swojej talii", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_vagabond = { + name = "Włóczęga", + text = { + "Tworzy kartę {C:purple}Tarota{},", + "jeśli została zagrana ręka", + "mając {C:money}$#1#{} lub mniej" + } + }, + j_baron = { + name = "Baron", + text = { + "Każdy {C:attention}Król{}", + "w ręce", + "daje mnoż. {X:mult,C:white} X#1# {}" + } + }, + j_cloud_9 = { + name = "Dziewiątka z nieba", + text = { + "Zyskujesz {C:money}$#1#{} za każdą", + "{C:attention}9{} w {C:attention}kompletnej talii", + "na końcu rundy", + "{C:inactive}(obecnie {C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "Rakieta", + text = { + "Zyskujesz {C:money}#1#${} na końcu", + "rundy. Zyskujesz {C:money}$#2#{} po", + "pokonaniu {C:attention}Oślepiającego Bossa{}" + } + }, + j_obelisk = { + name = "Obelisk", + text = { + "Mnoż. {X:mult,C:white} X#1# {} za", + "każdą kolejną zagraną rękę", + "bez zagrywania", + "najczęściej zagrywanego {C:attention}układu pokerowego", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_midas_mask = { + name = "Maska Midasa", + text = { + "Wszystkie {C:attention}figury{} karciane", + "zamieniają się w {C:attention}Złote{} karty", + "przy zagraniu" + } + }, + j_luchador = { + name = "Luchador", + text = { + "Sprzedaj tę kartę, aby", + "zablokować bieżącą", + "{C:attention}Przeszkadzajkę Bossa{}" + } + }, + j_photograph = { + name = "Zdjęcie", + text = { + "Mnoż. {X:mult,C:white} X#1# {} za", + "pierwszą zagraną {C:attention}figurę karcianą", + "przy zdobyciu punktów" + } + }, + j_gift = { + name = "Karta podarunkowa", + text = { + "Dodaje {C:money}$#1#{} wartości {C:attention}sprzedaży", + "do każdego {C:attention}jokera{} oraz", + "karty {C:attention}zużywalnej{} przy", + "końcu rundy" + } + }, + j_turtle_bean = { + name = "Czarna fasola", + text = { + "{C:attention}+#1#{} do rozmiaru ręki,", + "zmniejsza się o", + "{C:red}#2#{} w każdej rundzie" + } + }, + j_erosion = { + name = "Erozja", + text = { + "Mnoż. {C:red}+#1#{} za każdą", + "kartę poniżej {C:attention}#3#{}", + "w kompletnej talii", + "{C:inactive}(obecnie mnoż. {C:red}+#2#{C:inactive})" + } + }, + j_reserved_parking = { + name = "Parking zastrzeżony", + text = { + "Każda {C:attention}figura{} karciana", + "w ręce daje", + "{C:green}#2# na #3#{} szanse", + "daje {C:money}$#1#{}" + } + }, + j_mail = { + name = "Rabat", + text = { + "Zdobywasz {C:money}$#1#{} za każdą", + "odrzuconą {C:attention}#2#{}, ranga", + "zmienia się co rundę" + } + }, + j_to_the_moon = { + name = "Na Księżyc", + text = { + "Zdobywasz bonusowe {C:money}$#1#{}", + "{C:attention}odsetki{} za każde {C:money}$5{}, które", + "masz na końcu rundy" + } + }, + j_hallucination = { + name = "Halucynacja", + text = { + "{C:green}#1# na #2#{} szanse, aby stworzyć", + "kartę {C:tarot}Tarota{} przy", + "otworzeniu dowolnej {C:attention}paczki wzmacniającej{}", + "{C:inactive}(wymaga miejsca)" + } + }, + j_lucky_cat = { + name = "Kot na szczęście", + text = { + "Zyskujesz mnoż. {X:mult,C:white} X#1# {} za każdym", + "razem, gdy {C:attention}szczęśliwa{} karta", + "{C:green}zadziała{}", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + } + }, + j_baseball = { + name = "Karta bejsbolowa", + text = { + "{C:green}Niepospolite{} Jokery", + "dają mnoż. {X:mult,C:white} X#1# {}" + } + }, + j_bull = { + name = "Byk", + text = { + "{C:chips}+#1#{} żet. za każdego", + "posiadanego {C:money}${}", + "{C:inactive}(obecnie {C:chips}+#2#{C:inactive} żet.)" + } + }, + j_diet_cola = { + name = "Dietetyczna cola", + text = { + "Sprzedaj tę kartę, aby", + "stworzyć darmowy", + "{C:attention}#1#" + } + }, + j_trading = { + name = "Karta kolekcjonerska", + text = { + "Jeśli {C:attention}pierwsza zrzutka{} w rundzie", + "to tylko {C:attention}1{} karta, niszczy", + "ją i zyskujesz {C:money}$#1#" + } + }, + j_flash = { + name = "Szybka karta", + text = { + "Mnoż. {C:mult}X#1#{} na", + "{C:attention}ponowny rzut{} podczas wizyty w sklepie", + "{C:inactive}(obecnie mnoż. {C:mult}+#2#{C:inactive})" + } + }, + j_popcorn = { + name = "Popcorn", + text = { + "Mnoż. {C:mult}+#1#{}", + "Mnoż. {C:mult}-#2#{} na", + "rozegraną rundę" + } + }, + j_trousers = { + name = "Zapasowe spodnie", + text = { + "Mnoż. {C:mult}+#1#{}, jeśli", + "zagrana ręka zawiera", + "{C:attention}#2#", + "{C:inactive}(obecnie mnoż. {C:red}+#3#{C:inactive})" + } + }, + j_ancient = { + name = "Pradawny Joker", + text = { + "Każda zagrana karta w", + "kolorze {V:1}#2#{} daje", + "mnoż. {X:mult,C:white} X#1# {} przy zdobyciu punktów,", + "kolor {s:0.8} zmienia się na końcu rundy" + } + }, + j_ramen = { + name = "Ramen", + text = { + "Mnoż. {X:mult,C:white} X#1# {},", + "tracisz mnoż. {X:mult,C:white} X#2# {}", + "za każdą odrzuconą {C:attention}kartę{}" + } + }, + j_walkie_talkie = { + name = "Krótkofalówka", + text = { + "Każda zagrana {C:attention}10{} lub {C:attention}4", + "daje {C:chips}+#1#{} żet. oraz", + "mnoż. {C:mult}+#2#{} przy zdobyciu punktów" + } + }, + j_selzer = { + name = "Tabletka musująca", + text = { + "Aktywuj ponownie wszystkie", + "zagrane karty przez", + "następne {C:attention}#1#{} rozd." + } + }, + j_castle = { + name = "Zamek", + text = { + "Ten joker zdobywa {C:chips}+#1#{} żet.", + "na odrzuconą kartę {V:1}#2#{},", + "kolor zmienia się co rundę", + "{C:inactive}(obecnie {C:chips}+#3#{C:inactive} żet.)" + } + }, + j_smiley = { + name = "Uśmiechnięta buzia", + text = { + "Zagrane {C:attention}figury{} karciane", + "dają mnoż. {C:mult}+#1#{}", + "przy zdobyciu punktów" + } + }, + j_campfire = { + name = "Ognisko", + text = { + "Ten joker daje mnoż. {X:mult,C:white}X#1#{}", + "za każdą {C:attention}sprzedaną{} kartę i zeruje się", + "po pokonaniu {C:attention}Przeszkadzajki Bossa{}", + "{C:inactive}(obecnie mnoż. {X:mult,C:white} X#2# {C:inactive})" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Nadmiar zapasów", + text = { + "{C:attention}+1{} slot na kartę", + "dostępny w sklepie" + } + }, + v_clearance_sale = { + name = "Wyprzedaż", + text = { + "Wszystkie karty i paczki w", + "w sklepie mają zniżkę {C:attention}#1#%{}" + } + }, + v_tarot_merchant = { + name = "Handlarz kart Tarota", + text = { + "Karty {C:tarot}Tarota{} pojawiają się", + "{C:attention}#1#X{} częściej", + "w sklepie" + } + }, + v_planet_merchant = { + name = "Handlarz kart Planet", + text = { + "Karty {C:planet}Planet{} pojawiają się", + "{C:attention}#1#X{} częściej", + "w sklepie" + } + }, + v_hone = { + name = "Udoskonalenie", + text = { + "Karty {C:dark_edition}w folii{}, {C:dark_edition}holograficzne{} oraz", + "{C:dark_edition}polichromowane{}", + "pojawiają się {C:attention}#1#X{} częściej" + } + }, + v_reroll_surplus = { + name = "Mniej za ponowny rzut", + text = { + "Ponowne rzuty kosztują", + "{C:money}#1#${} mniej" + } + }, + v_crystal_ball = { + name = "Kryształowa kula", + text = { + "{C:attention}+1{} slot na przedm. zużywalne" + } + }, + v_telescope = { + name = "Teleskop", + text = { + "{C:attention}Paczki niebiańskie{} zawsze", + "zawierają kartę {C:planet}Planety{}", + "dla najczęściej", + "zagrywanego {C:attention}układu pokerowego" + } + }, + v_grabber = { + name = "Chwytacz", + text = { + "Zyskujesz na stałe", + "{C:blue}+#1#{} do ręki", + "na rundę" + } + }, + v_wasteful = { + name = "Rozrzutny", + text = { + "Zyskujesz na stałe", + "{C:red}+#1#{} do zrzutki", + "na rundę" + } + }, + v_seed_money = { + name = "Kapitał początkowy", + text = { + "Podnosi limit", + "zarobionych odsetek", + "na rundę do {C:money}#1#${}" + } + }, + v_blank = { + name = "In-blanco", + text = { + "{C:inactive}Nie robi nic?" + } + }, + v_magic_trick = { + name = "Magiczna sztuczka", + text = { + "{C:attention}Karty rozgrywające{} można", + "kupić", + "w {C:attention}sklepie" + } + }, + v_hieroglyph = { + name = "Hieroglif", + text = { + "{C:attention}-#1#{} na wejście", + "{C:blue}-#1#{} do ręki", + "na rundę", + "{C:attention}-#1#{} na wejście" + } + }, + v_directors_cut = { + name = "Wersja reżyserska", + text = { + "Wyrzuć ponownie Przeszkadzajkę Bossa", + "{C:attention}1{} raz na wejście;", + "{C:money}#1#${} za rzut" + } + }, + v_pattern = { + name = "Wzorzec", + text = { + "Otrzymujesz najczęściej", + "wykorzystywaną kartę {C:attention}zużywalną{}", + "{E:1,V:1}#1#", + "{C:inactive}(wymaga miejsca)" + } + }, + v_overstock_plus = { + name = "Nadmiar zapasów+", + text = { + "{C:attention}+1{} slot na kartę", + "dostępny w sklepie" + }, + unlock = { + "Wydaj łącznie", + "{C:money}#1#${} w sklepie", + "{C:inactive}(#2#$)" + } + }, + v_liquidation = { + name = "Sprzedaż zasobów", + text = { + "Wszystkie karty i paczki w", + "w sklepie mają zniżkę {C:attention}#1#%{}" + }, + unlock = { + "Zrealizuj co najmniej", + "{C:attention}#1#{C:voucher} kuponów{}", + "podczas jednego podejścia" + } + }, + v_tarot_tycoon = { + name = "Tarotowy magnat", + text = { + "Karty {C:tarot}Tarota{} pojawiają się", + "{C:attention}#1#X{} częściej", + "w sklepie" + }, + unlock = { + "Kup łącznie", + "{C:attention}#1# kart {C:tarot} Tarota{}", + "w sklepie", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Planetowy magnat", + text = { + "Karty {C:planet}Planet{} pojawiają się", + "{C:attention}#1#X{} częściej", + "w sklepie" + }, + unlock = { + "Kup łącznie", + "{C:attention}#1# kart {C:planet} Planet{}", + "w sklepie", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Błysk", + text = { + "Karty {C:dark_edition}w folii{}, {C:dark_edition}holograficzne{} oraz", + "{C:dark_edition}polichromowane{}", + "pojawiają się {C:attention}#1#X{} częściej" + }, + unlock = { + "Posiadaj przynajmniej {C:attention}#1#", + "{C:attention}jokerów{} w wersji", + "{C:dark_edition}w folii{}, {C:dark_edition}holograficznej{} oraz", + "{C:dark_edition}polichromowanej{}" + } + }, + v_reroll_glut = { + name = "Przesyt przerzutów", + text = { + "Ponowne rzuty kosztują", + "{C:money}#1#${} mniej" + }, + unlock = { + "Wykonaj ponowny rzut w sklepie", + "łącznie {C:attention}#1#{} razy", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Kula Omen", + text = { + "Karty {C:spectral}Duchy{} mogą", + "pojawić się w dowolnych", + "{C:attention}paczkach wiedzy tajemnej" + }, + unlock = { + "Wykorzystaj łącznie {C:attention}#1#", + "kart {C:tarot}Tarota{} z dowolnej", + "{C:tarot}paczki wiedzy tajemnej", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Obserwatorium astronomiczne", + text = { + "Karty {C:planet}Planety{} w", + "obszarze przedm. {C:attention}zużywalnych{} dają", + "mnoż. {X:red,C:white} X#1# {} za utworzony", + "z nich konkretny {C:attention}układ pokerowy" + }, + unlock = { + "Wykorzystaj łącznie {C:attention}#1#", + "kart {C:planet}Planet{} z dowolnej", + "{C:planet}paczki niebiańskiej", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Nacho Tong", + text = { + "Zyskujesz na stałe", + "{C:blue}+#1#{} do ręki", + "na rundę" + }, + unlock = { + "Zagraj łącznie", + "{C:attention}#1#{} kart", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Recyklomancja", + text = { + "Zyskujesz na stałe", + "{C:red}+#1#{} do zrzutki", + "na rundę" + }, + unlock = { + "Odrzuć łącznie", + "{C:attention}#1#{} kart", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Drzewko pieniężne", + text = { + "Podnosi limit", + "zarobionych odsetek", + "na rundę do {C:money}#1#${}" + }, + unlock = { + "Zwiększ maksymalnie zyski", + "z odsetek na rundę przez", + "{C:attention}#1#{} rund z rzędu", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Antymateria", + text = { + "{C:dark_edition}+1{} slot na jokera" + }, + unlock = { + "Zrealizuj {C:voucher}In-blanco{}", + "łącznie {C:attention}#1#{} razy", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Iluzja", + text = { + "{C:attention}Karty rozgrywające{} w sklepie", + "mogą być {C:enhanced}ulepszone{},", + "mieć {C:dark_edition}jedną wersję{} i/lub {C:attention}pieczęć{}" + }, + unlock = { + "Kup łącznie", + "{C:attention}#1#{} kart rozgrywających", + "w sklepie", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Petroglif", + unlock = { + "Osiągnij stawkę", + "na poziomie {E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{} na wejście", + "{C:red}-#1#{} do zrzutki", + "na rundę" + } + }, + v_retcon = { + name = "Wsteczna ciągłość", + text = { + "Wyrzuć ponownie Przeszkadzajkę Bossa", + "{C:attention}nieograniczoną{} ilość razy;", + "daje {C:money}$#1#{} na rzut" + }, + unlock = { + "Odkryj", + "{C:attention}#1#{} Przeszkadzajki" + } + }, + v_tesselation = { + name = "Parkietaż", + text = { + "Otrzymujesz najczęściej", + "wykorzystywane {C:attention}Jokery{}", + "{E:1,V:1}#1#", + "{C:inactive}(wymaga miejsca)" + }, + unlock = { + "Kup wersję {C:dark_edition}polichromowaną", + "twojego", + "najczęściej wykorzystywanego {C:attention}jokera", + "w sklepie" + } + }, + v_palette = { + name = "Paleta", + text = { + "Trzymaj {C:attention}+#1#{} kartę", + "w ręce", + "{C:attention}+#1#{} do rozmiaru ręki" + }, + unlock = { + "Zmniejsz rozmiar ręki", + "do {C:attention}#1#{} kart." + } + }, + v_paint_brush = { + name = "Pędzel malarski", + text = { + "{C:attention}+#1#{} do rozmiaru ręki" + } + } + }, + Tarot = { + c_fool = { + name = "Błazen", + text = { + "Otrzymujesz ostatnią", + "kartę {C:tarot}Tarota{} lub {C:planet}Planety{}", + "wykorzystaną w tym podejściu,", + "z wyjątkiem {s:0.8,C:tarot}Błazna{s:0.8}" + } + }, + c_magician = { + name = "Mag", + text = { + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "Arcykapłanka", + text = { + "Otrzymujesz maks. {C:attention}#1#", + "losowych kart {C:planet}Planet{}", + "{C:inactive}(wymaga miejsca)" + } + }, + c_empress = { + name = "Cesarzowa", + text = { + "Ulepsza {C:attention}#1#", + "wybrane karty do:", + "{C:attention}#2#" + } + }, + c_emperor = { + name = "Cesarz", + text = { + "Otrzymujesz maks. {C:attention}#1#", + "losowych kart {C:tarot}Tarota{}", + "{C:inactive}(wymaga miejsca)" + } + }, + c_heirophant = { + name = "Hierofant", + text = { + "Ulepsza {C:attention}#1#", + "wybrane karty do:", + "{C:attention}#2#" + } + }, + c_lovers = { + name = "Kochankowie", + text = { + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "Rydwan", + text = { + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#" + } + }, + c_justice = { + name = "Sprawiedliwość", + text = { + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "Pustelnik", + text = { + "Podwaja pieniądze", + "{C:inactive}(maks. {C:money}#1#${C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "Koło Fortuny", + text = { + "{C:green}#1# na #2#{} szans zamiany", + "losowego {C:attention}jokera na jego wersję", + "{C:dark_edition}w folii{}, {C:dark_edition}holograficzną{} lub", + "{C:dark_edition}polichromowaną{}" + } + }, + c_strength = { + name = "Siła", + text = { + "Zwiększa rangę", + "wybranych kart o maks. {C:attention}#1#{}", + "o {C:attention}1" + } + }, + c_hanged_man = { + name = "Wisielec", + text = { + "Niszczy do", + "{C:attention}#1#{} wybranych kart" + } + }, + c_death = { + name = "Śmierć", + text = { + "Wybierz {C:attention}#1#{} karty,", + "zamień kartę {C:attention}po lewej{}", + "w kartę {C:attention}po prawej{}", + "{C:inactive}(przeciągnij, aby zmienić położenie)" + } + }, + c_temperance = { + name = "Umiarkowanie", + text = { + "Daje łączną wartość", + "sprzedaży wszystkich obecnych", + "jokerów {C:inactive}(maks. {C:money}#1#${C:inactive})", + "{C:inactive}(obecnie {C:money}#2#${C:inactive})" + } + }, + c_devil = { + name = "Diabeł", + text = { + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#" + } + }, + c_tower = { + name = "Wieża", + text = { + "Ulepsza {C:attention}#1#{} wybraną", + "kartę do:", + "{C:attention}#2#" + } + }, + c_star = { + name = "Gwiazda", + text = { + "Zamienia kolor", + "{C:attention}#1#{} wybranych kart", + "w {V:1}#2#{}" + } + }, + c_moon = { + name = "Księżyc", + text = { + "Zamienia do", + "{C:attention}#1#{} wybranych kart", + "w {V:1}#2#{}" + } + }, + c_sun = { + name = "Słońce", + text = { + "Zamienia do", + "{C:attention}#1#{} wybranych kart", + "w {V:1}#2#{}" + } + }, + c_judgement = { + name = "Wyrok", + text = { + "Otrzymujesz losowego", + "{C:attention}jokera{}", + "{C:inactive}(wymaga miejsca)" + } + }, + c_world = { + name = "Świat", + text = { + "Zamienia do", + "{C:attention}#1#{} wybranych kart", + "w {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Merkury", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_venus = { + name = "Wenus", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_earth = { + name = "Ziemia", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_mars = { + name = "Mars", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_jupiter = { + name = "Jowisz", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_saturn = { + name = "Saturn", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_uranus = { + name = "Uran", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_neptune = { + name = "Neptun", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_pluto = { + name = "Pluton", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_ceres = { + name = "Ceres", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_planet_x = { + name = "Planeta X", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + }, + c_eris = { + name = "Eris", + text = { + "{S:0.8}({S:0.8,V:1}poz.#1#{S:0.8}){} Zwiększ poziom układu:", + "{C:attention}#2#", + "mnoż. {C:mult}+#3#{} oraz", + "{C:chips}+#4#{} żet." + } + } + }, + Spectral = { + c_familiar = { + name = "Chowaniec", + text = { + "Niszczy {C:attention}1{} losową", + "kartę w twojej ręce,", + "dodaje {C:attention}#1#{} losowe {C:attention}ulepszone figury", + "{C:attention}karciane{} do twojej ręki" + } + }, + c_grim = { + name = "Ponurak", + text = { + "Niszczy {C:attention}1{} losową", + "kartę w twojej ręce,", + "dodaje {C:attention}#1#{} losowe {C:attention}ulepszone", + "{C:attention}asy{} do twojej ręki" + } + }, + c_incantation = { + name = "Inkantacja", + text = { + "Niszczy {C:attention}1{} losową", + "kartę w twojej ręce, dodaje {C:attention}#1#", + "losową {C:attention}ulepszoną numerowaną", + "{C:attention}kartę{} do twojej ręki" + } + }, + c_talisman = { + name = "Talizman", + text = { + "Dodaje {C:attention}Złotą Pieczęć{}", + "do {C:attention}1{} wybranej", + "karty w twojej ręce" + } + }, + c_aura = { + name = "Aura", + text = { + "Dodaje wersję {C:dark_edition}w folii{}, {C:dark_edition}holograficzną{},", + "lub {C:dark_edition}polichromowaną{} do", + "{C:attention}1{} wybranej karty w ręce" + } + }, + c_wraith = { + name = "Upiór", + text = { + "Otrzymujesz losowego", + "{C:red}rzadkiego{C:attention} jokera{},", + "ustawia pieniądze na {C:money}0$" + } + }, + c_sigil = { + name = "Pieczęć", + text = { + "Zamienia wszystkie karty", + "w ręce na pojedynczy", + "losowy {C:attention}kolor" + } + }, + c_ouija = { + name = "Ouija", + text = { + "Zamienia wszystkie karty", + "w ręce na pojedynczą", + "losową {C:attention}rangę", + "{C:red}-1{} do rozmiaru ręki" + } + }, + c_ectoplasm = { + name = "Ektoplazma", + text = { + "Dodaje {C:dark_edition}Negatyw{} do", + "losowego {C:attention}jokera,", + "{C:red}-1{} do rozmiaru ręki" + } + }, + c_immolate = { + name = "Zniszczenie", + text = { + "Niszczy {C:attention}#1#{} losowych", + "kart w ręce,", + "zyskujesz {C:money}#2#$" + } + }, + c_soul = { + name = "Dusza", + text = { + "Tworzy", + "{C:legendary,E:1}Legendarnego{} Jokera", + "{C:inactive}(wymaga miejsca)" + } + }, + c_black_hole = { + name = "Czarna dziura", + text = { + "Ulepsza każdy", + "{C:legendary,E:1}układ pokerowy", + "o {C:attention}1{} poziom" + } + }, + c_ankh = { + name = "Ankh", + text = { + "Tworzy kopię", + "losowego {C:attention}jokera{}, niszczy", + "wszystkie inne jokery" + } + }, + c_deja_vu = { + name = "Déjà vu", + text = { + "Dodaj {C:red}Czerwoną Pieczęć{}", + "do {C:attention}1{} wybranej", + "karty w swojej ręce" + } + }, + c_hex = { + name = "Zły urok", + text = { + "Dodaj {C:dark_edition}polichromowanie{} do", + "losowego {C:attention}jokera{}, niszczy", + "wszystkie inne jokery" + } + }, + c_trance = { + name = "Trans", + text = { + "Dodaj {C:blue}Niebieską Pieczęć{}", + "do {C:attention}1{} wybranej", + "karty w swojej ręce" + } + }, + c_medium = { + name = "Medium", + text = { + "Dodaj {C:purple}Fioletową Pieczęć{}", + "do {C:attention}1{} wybranej", + "karty w swojej ręce" + } + }, + c_cryptid = { + name = "Kryptyda", + text = { + "Tworzy {C:attention}#1#{} kopie", + "{C:attention}1{} wybranej karty", + "w ręce" + } + } + }, + Edition = { + e_base = { + name = "Bazowa", + text = { + "Brak dodatkowych efektów" + } + }, + e_foil = { + name = "W folii", + text = { + "{C:chips}+#1#{} żet." + } + }, + e_holo = { + name = "Holograficzna", + text = { + "Mnoż. {C:mult}+#1#{}" + } + }, + e_polychrome = { + name = "Polichromowana", + text = { + "Mnoż. {X:mult,C:white} X#1# {}" + } + }, + e_negative = { + name = "Negatyw", + text = { + "{C:dark_edition}+#1#{} slot na jokera" + } + }, + e_negative_consumable = { + name = "Negatyw", + text = { + "{C:dark_edition}+#1#{} slot na przedm. zużywalne" + } + } + }, + Enhanced = { + m_bonus = { + name = "Karta Bonusowa", + text = {} + }, + m_mult = { + name = "Karta Mnożnikowa", + text = { + "Mnoż. {C:mult}+#1#{}" + } + }, + m_wild = { + name = "Karta Dzika", + text = { + "Można jej użyć", + "jako dowolnego koloru" + } + }, + m_glass = { + name = "Karta Szklana", + text = { + "Mnoż. {X:mult,C:white} X#1# {}", + "{C:green}#2# na #3#{} szanse", + "zniszczenia karty" + } + }, + m_steel = { + name = "Karta Stalowa", + text = { + "Mnoż. {X:mult,C:white} X#1# {},", + "gdy ta karta", + "pozostanie w ręce" + } + }, + m_stone = { + name = "Karta Kamienna", + text = { + "{C:chips}+#1#{} żet.", + "bez rangi lub koloru" + } + }, + m_gold = { + name = "Karta Złota", + text = { + "{C:money}#1#${}, jeśli ta", + "karta jest w ręce", + "na końcu rundy" + } + }, + m_lucky = { + name = "Karta Szczęścia", + text = { + "{C:green}#1# na #3#{} szans", + "na mnoż. {C:mult}+#2#{}", + "{C:green}#1# na #5#{} szans", + "na wygranie {C:money}#4#$" + } + } + }, + Stake = { + stake_white = { + name = "Biała stawka", + text = { + "Trudność podstawowa" + } + }, + stake_red = { + name = "Czerwona stawka", + text = { + "{C:attention}Mała w ciemno{} nie daje", + "nagrody pieniężnej", + "{s:0.8}Działa na wszystkie poprzednie stawki" + } + }, + stake_green = { + name = "Zielona stawka", + text = { + "Wymagany wynik skaluje się", + "szybciej dla każdego {C:attention}wejścia", + "{s:0.8}Działa na wszystkie poprzednie stawki" + } + }, + stake_blue = { + name = "Niebieska stawka", + text = { + "{C:red}-1{} zrzutka", + "{s:0.8}Działa na wszystkie poprzednie stawki" + } + }, + stake_black = { + name = "Czarna stawka", + text = { + "W sklepie mogą pojawić się {C:attention}Wieczne{} Jokery", + "{C:inactive,s:0.8}{Nie można ich sprzedaż lub zniszczyć}", + "{s:0.8}Działa na wszystkie poprzednie stawki" + } + }, + stake_purple = { + name = "Fioletowa stawka", + text = { + "Wymagany wynik skaluje się", + "szybciej dla każdego {C:attention}wejścia", + "{s:0.8}Działa na wszystkie poprzednie stawki" + } + }, + stake_orange = { + name = "Pomarańczowa stawka", + text = { + "{C:attention}Paczki wzmacniające{} kosztują", + "o {C:money}1${} więcej na wejście", + "{s:0.8}Działa na wszystkie poprzednie stawki" + } + }, + stake_gold = { + name = "Złota stawka", + text = { + "{C:red}-1{} do rozmiaru ręki", + "{s:0.8}Działa na wszystkie poprzednie stawki" + } + } + }, + Tag = { + tag_uncommon = { + name = "Znacznik niepospolity", + text = { + "Sklep oferuje", + "{C:green}Niepospolitego Jokera" + } + }, + tag_rare = { + name = "Znacznik rzadki", + text = { + "Sklep oferuje", + "{C:red}Rzadkiego Jokera" + } + }, + tag_negative = { + name = "Znacznik negatyw", + text = { + "Sklep oferuje", + "{C:dark_edition}Negatywnego Jokera" + } + }, + tag_foil = { + name = "Znacznik foliowy", + text = { + "Sklep oferuje", + "{C:dark_edition}Jokera w folii" + } + }, + tag_holo = { + name = "Znacznik holograficzny", + text = { + "Sklep oferuje", + "{C:dark_edition}Holograficznego Jokera" + } + }, + tag_polychrome = { + name = "Znacznik polichromowany", + text = { + "Sklep oferuje", + "{C:dark_edition}Polichromowanego Jokera" + } + }, + tag_investment = { + name = "Znacznik inwestycji", + text = { + "Po pokonaniu", + "Przeszkadzajki Bossa", + "zyskujesz {C:money}#1#$" + } + }, + tag_voucher = { + name = "Znacznik kuponu", + text = { + "Dodaje jeden {C:voucher}kupon", + "do następnej wizyty w sklepie" + } + }, + tag_boss = { + name = "Znacznik Bossa", + text = { + "Ponowne rzuty dają", + "{C:attention}Przeszkadzajkę Bossa" + } + }, + tag_standard = { + name = "Znacznik standardowy", + text = { + "Daje darmową", + "{C:attention}megapaczkę standardową" + } + }, + tag_charm = { + name = "Znacznik czaru", + text = { + "Daje darmową", + "{C:tarot}megapaczkę wiedzy tajemnej" + } + }, + tag_meteor = { + name = "Znacznik meteorytu", + text = { + "Daje darmową", + "{C:planet}megapaczkę niebiańską" + } + }, + tag_buffoon = { + name = "Znacznik pajaca", + text = { + "Daje darmową", + "{C:attention}paczkę pajaca" + } + }, + tag_handy = { + name = "Znacznik podręczny", + text = { + "Daje {C:money}$#1#{} na każdą zagraną", + "{C:blue}rękę{} w tym podejściu", + "{C:inactive}(da {C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "Znacznik śmieciarza", + text = { + "Daje {C:money}$#1#{} na każdą niewykorzystaną", + "{C:red}zrzutkę{} w tym podejściu", + "{C:inactive}(da {C:money}$#2#{C:inactive})" + } + }, + tag_coupon = { + name = "Znacznik kuponu", + text = { + "Początkowe karty oraz", + "paczki wzmacniające podczas", + "następnej wizyty w sklepie są za darmo" + } + }, + tag_double = { + name = "Znacznik podwójny", + text = { + "Daje kopię", + "następnego wybranego {C:attention}znacznika{}", + "{s:0.8}z wyjątkiem {s:0.8,C:attention}znacznika podwójnego" + } + }, + tag_juggle = { + name = "Znacznik żonglera", + text = { + "{C:attention}+#1#{} do rozmiaru ręki", + "w następnej rundzie" + } + }, + tag_d_six = { + name = "Znacznik K6", + text = { + "Ponowne rzuty podczas następnej wizyty w sklepie", + "zaczynają się od {C:money}0$" + } + }, + tag_top_up = { + name = "Znacznik doładowania", + text = { + "Otrzymujesz maks. {C:attention}#1#", + "{C:blue}Pospolitych{} Jokerów", + "{C:inactive}(wymaga miejsca)" + } + }, + tag_skip = { + name = "Znacznik szybkości", + text = { + "Daje {C:money}#1#${} na pominiętą", + "Przeszkadzajkę w tym podejściu", + "{C:inactive}(da {C:money}#2#${C:inactive})" + } + }, + tag_orbital = { + name = "Znacznik orbitalny", + text = { + "Ulepsza {C:attention}#1#", + "o {C:attention}#2# poz." + } + }, + tag_economy = { + name = "Znacznik ekonomiczny", + text = { + "Podwaja pieniądze", + "{C:inactive}(maks. {C:money}#1#${C:inactive})" + } + }, + tag_ethereal = { + name = "Znacznik eteryczny", + text = { + "Daje darmową", + "{C:planet}paczkę kart Ducha" + } + } + }, + Blind = { + bl_small = { + name = "Mała w ciemno", + text = {} + }, + bl_big = { + name = "Duża w ciemno", + text = {} + }, + bl_hook = { + name = "Hak", + text = { + "Odrzuca 2 losowe", + "karty za rozegraną rękę" + } + }, + bl_wall = { + name = "Mur", + text = { + "Przeszkadzajka XL" + } + }, + bl_wheel = { + name = "Koło", + text = { + " na 7 kart jest", + "dobierana twarzą w dół" + } + }, + bl_arm = { + name = "Ramię", + text = { + "Zmniejsza poziom", + "zagranego układu pokerowego" + } + }, + bl_psychic = { + name = "Medium", + text = { + "Należy zagrać 5 kart" + } + }, + bl_goad = { + name = "Oścień", + text = { + "Wszystkie piki", + "zostają osłabione" + } + }, + bl_water = { + name = "Woda", + text = { + "Rozpoczynasz", + "z 0 zrzutek" + } + }, + bl_eye = { + name = "Oko", + text = { + "Brak powtórzenia", + "tych samych rodzajów ręki w tej rundzie" + } + }, + bl_mouth = { + name = "Usta", + text = { + "Zagrywasz tylko 1 rodzaj", + "ręki w tej rundzie" + } + }, + bl_plant = { + name = "Roślina", + text = { + "Wszystkie figury karciane", + "zostają osłabione" + } + }, + bl_needle = { + name = "Igła", + text = { + "Zagrywasz tylko 1 rękę" + } + }, + bl_head = { + name = "Głowa", + text = { + "Wszystkie kiery", + "zostają osłabione" + } + }, + bl_tooth = { + name = "Ząb", + text = { + "Tracisz 1$ za", + "każdą zagraną kartę" + } + }, + bl_final_leaf = { + name = "Zielony liść", + text = { + "Wszystkie karty są osłabione", + "aż do sprzedania 1 jokera" + } + }, + bl_final_vessel = { + name = "Fioletowe naczynie", + text = { + "Bardzo duża przeszkadzajka" + } + }, + bl_ox = { + name = "Wół", + text = { + "Zagranie #1#", + "ustawia pieniądze na 0$" + } + }, + bl_house = { + name = "Dom", + text = { + "Pierwsza ręka jest", + "dobierana twarzą w dół" + } + }, + bl_club = { + name = "Klub", + text = { + "Wszystkie trefle", + "zostają osłabione" + } + }, + bl_fish = { + name = "Ryba", + text = { + "Karty są dobierane twarzą w dół", + "po każdej zagranej ręce" + } + }, + bl_window = { + name = "Okno", + text = { + "Wszystkie karo", + "zostają osłabione" + } + }, + bl_manacle = { + name = "Kajdany", + text = { + "-1 do rozmiaru ręki" + } + }, + bl_serpent = { + name = "Wąż", + text = { + "Po zagraniu lub zrzutce", + "zawsze dobierasz 3 karty" + } + }, + bl_pillar = { + name = "Filar", + text = { + "Karty zagrane wcześniej", + "w tym wejściu zostają osłabione" + } + }, + bl_flint = { + name = "Krzemień", + text = { + "Żetony bazowei mnożnik", + "są pomniejszane o połowę" + } + }, + bl_mark = { + name = "Cel", + text = { + "Wszystkie figury karciane są", + "dobierane twarzą w dół" + } + }, + bl_final_acorn = { + name = "Bursztynowy żołądź", + text = { + "Obraca i tasuje", + "wszystkie Jokery" + } + }, + bl_final_heart = { + name = "Szkarłatne serce", + text = { + "Jeden losowy joker", + "jest wyłączany z każdej ręki" + } + }, + bl_final_bell = { + name = "Modry dzwonek", + text = { + "Sprawia, że 1 karta", + "jest zawsze wybierana" + } + } + }, + Back = { + b_red = { + name = "Czerwona talia", + text = { + "{C:red}+#1#{} zrzutka", + "w każdej rundzie" + } + }, + b_blue = { + name = "Niebieska talia", + text = { + "{C:blue}+#1#{} ręka", + "w każdej rundzie" + } + }, + b_yellow = { + name = "Żółta talia", + text = { + "Rozpoczynasz", + "z dodatkową kwotą {C:money}#1#$" + } + }, + b_green = { + name = "Zielona talia", + text = { + "Na końcu każdej rundy otrzymujesz:", + "{C:money}#1#${s:0.85} na każdą pozostałą {C:blue}rękę", + "{C:money}#2#${s:0.85} na każdą pozostałą {C:red}zrzutkę", + "Nie zarabiasz {C:attention}odsetek" + } + }, + b_black = { + name = "Czarna talia", + text = { + "{C:attention}+#1#{} slot na jokera", + "", + "{C:blue}-#2#{} do ręki", + "w każdej rundzie" + } + }, + b_magic = { + name = "Magiczna talia", + text = { + "Rozpoczynasz podejście z", + "kuponem {C:tarot,T:v_crystal_ball}#1#{}", + "oraz {C:attention}2{} kopiami", + "karty {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Mgławicowa talia", + text = { + "Rozpoczynasz podejście z", + "kuponem {C:planet,T:v_telescope}#1#{}", + "", + "{C:red}#2#{} slot na przedm. zużywalne" + } + }, + b_metal = { + name = "Metalowa talia", + text = { + "Rozpoczynasz podejście z {C:attention}#1#", + "kartami rozgrywającymi ulepszonymi", + "do {C:attention}kart Stalowych" + } + }, + b_abandoned = { + name = "Porzucona talia", + text = { + "Rozpoczynasz podejście", + "bez żadnych {C:attention}figur karcianych", + "w swojej talii" + } + }, + b_checkered = { + name = "Talia w kratkę", + text = { + "Rozpoczynasz podejście z", + "{C:attention}26{C:spades} pikami{} oraz", + "{C:attention}26{C:hearts} kierami{} w talii" + } + }, + b_rocky = { + name = "Skalista talia", + text = { + "Rozpoczynasz podejście z {C:attention}#1#", + "dodatkowymi {C:attention}kartami Kamień" + } + }, + b_braided = { + name = "Spleciona talia", + text = { + "Pierwsza zagrana ręką", + "zostaje ulepszona do {C:attention}poz. 3" + } + }, + b_anaglyph = { + name = "Anaglificzna talia", + text = { + "Po pokonaniu każdej", + "{C:attention}Przeszkadzajki Bossa{}, zdobywasz", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "Plazmowa talia", + text = { + "Równoważy {C:blue}żetony{} i", + "{C:red}mnożnik{} przy obliczaniu", + "wyniku za rękę zagraną", + "{C:red}X#1#{} bazowej wartości Przeszkadzajki" + } + }, + b_erratic = { + name = "Zmienna talia", + text = { + "Wszystkie {C:attention}rangi{} i", + "{C:attention}kolory{} w talii", + "są przydzielane losowo" + } + }, + b_challenge = { + name = "Talia wyzwania", + text = { + "" + } + }, + b_ghost = { + name = "Talia Ducha", + text = { + "Karty {C:spectral}Duchy{} mogą", + "pojawia się podczas wizyty w sklepie,", + "rozpocznij z kartą {C:spectral,T:c_hex}Zły urok{}" + } + }, + b_zodiac = { + name = "Talia Znaków zodiaku", + text = { + "Rozpoczynasz podejście z", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "i {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Malowana talia", + text = { + "{C:attention}+#1#{} do rozmiaru ręki", + "{C:red}#2#{} slot na jokera" + } + } + }, + Other = { + gold_seal = { + name = "Złota Pieczęć", + text = { + "Zdobywasz {C:money}$3{}, gdy ta", + "karta zostanie zagrana", + "i zdobywa punkty" + } + }, + white_sticker = { + name = "Biała naklejka", + text = { + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Biała", + "{C:attention}stawka{}" + } + }, + red_sticker = { + name = "Czerwona naklejka", + text = { + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Czerwona", + "{C:attention}stawka{}" + } + }, + green_sticker = { + name = "Zielona naklejka", + text = { + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Zielona", + "{C:attention}stawka{}" + } + }, + blue_sticker = { + name = "Niebieska naklejka", + text = { + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Niebieska", + "{C:attention}stawka{}" + } + }, + black_sticker = { + name = "Czarna naklejka", + text = { + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Czarna", + "{C:attention}stawka{}" + } + }, + purple_sticker = { + name = "Fioletowa naklejka", + text = { + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Fioletowa", + "{C:attention}stawka{}" + } + }, + orange_sticker = { + name = "Pomarańczowa naklejka", + text = { + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Pomarańczowa", + "{C:attention}stawka{}" + } + }, + gold_sticker = { + name = "Złota naklejka", + text = { + "Użyto tego jokera", + "w wygranej na poz. trudności {C:attention}Złota", + "{C:attention}stawka{}" + } + }, + playing_card = { + text = { + "{C:light_black}#1# z {V:1}#2#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} żet." + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1#{} dod. żet." + } + }, + locked = { + name = "Zablokowane", + text = {} + }, + debuffed_default = { + name = "Osłabiono", + text = { + "Wszystkie zdolności", + "są wyłączone" + } + }, + debuffed_playing_card = { + name = "Osłabiono", + text = { + "Brak zdobywania żetonów,", + "wszystkie zdolności", + "są wyłączone" + } + }, + demo_locked = { + name = "Zablokowane", + text = { + "Brak dostępu", + "w tym demie" + } + }, + demo_shop_locked = { + name = "Zablokowane", + text = { + "Karta z osobistej {C:attention}kolekcji", + "{C:attention}Jimbo,", + "dostępna w pełnej", + "wersji {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Zablokowane", + text = { + "Praca w", + "toku" + } + }, + deck_locked_win = { + name = "Zablokowane", + text = { + "Wygraj podejście używając:", + "{C:attention}#1#{}", + "na dowolnym poz. trudności" + } + }, + deck_locked_discover = { + name = "Zablokowane", + text = { + "Odkryj przynajmniej", + "{C:attention}#1#{} przedm. ze", + "swojej kolekcji" + } + }, + deck_locked_stake = { + name = "Zablokowane", + text = { + "Wygraj podejście dowolną", + "talią na poz. trudności:", + "{V:1}#1#{} lub wyższym" + } + }, + joker_locked_legendary = { + name = "Zablokowane", + text = { + "Znajdź tego jokera", + "za pomocą karty {C:spectral}Duszy{}" + } + }, + undiscovered_joker = { + name = "Nie odkryto", + text = { + "Kup albo użyj", + "tej karty w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt" + } + }, + undiscovered_tarot = { + name = "Nie odkryto", + text = { + "Kup albo użyj", + "tej karty w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt" + } + }, + undiscovered_planet = { + name = "Nie odkryto", + text = { + "Kup albo użyj", + "tej karty w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt" + } + }, + undiscovered_spectral = { + name = "Nie odkryto", + text = { + "Kup albo użyj", + "tej karty w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt" + } + }, + undiscovered_voucher = { + name = "Nie odkryto", + text = { + "Zrealizuj ten", + "kupon w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jego efekt" + } + }, + undiscovered_booster = { + name = "Nie odkryto", + text = { + "Otwórz tę paczkę", + "w nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt" + } + }, + undiscovered_edition = { + name = "Nie odkryto", + text = { + "Znajdź tę wersję", + "w nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jej efekt" + } + }, + undiscovered_tag = { + name = "Nie odkryto", + text = { + "Użyj tego znacznika w", + "nierozstawionym podejściu,", + "by dowiedzieć się, jaki jest jego efekt" + } + }, + p_arcana_normal = { + name = "Paczka wiedzy tajemnej", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:tarot} Tarota{}, by", + "użyć ich natychmiast" + } + }, + p_arcana_jumbo = { + name = "Olbrzymia paczka wiedzy tajemnej", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:tarot} Tarota{}, by", + "użyć ich natychmiast" + } + }, + p_arcana_mega = { + name = "Megapaczka wiedzy tajemnej", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:tarot} Tarota{}, by", + "użyć ich natychmiast" + } + }, + p_celestial_normal = { + name = "Paczka niebiańska", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:planet} Planety{}, by", + "użyć ich natychmiast" + } + }, + p_celestial_jumbo = { + name = "Olbrzymia paczka niebiańska", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:planet} Planety{}, by", + "użyć ich natychmiast" + } + }, + p_celestial_mega = { + name = "Megapaczka niebiańska", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:planet} Planety{}, by", + "użyć ich natychmiast" + } + }, + p_spectral_normal = { + name = "Paczka kart Ducha", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:spectral} Ducha{}, by", + "użyć ich natychmiast" + } + }, + p_spectral_jumbo = { + name = "Olbrzymia paczka kart Ducha", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:spectral} Ducha{}, by", + "użyć ich natychmiast" + } + }, + p_spectral_mega = { + name = "Megapaczka kart Ducha", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart{C:spectral} Ducha{}, by", + "użyć ich natychmiast" + } + }, + p_standard_normal = { + name = "Paczka standardowa", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart {C:attention}rozgrywających{}, by", + "dodać jej do swojej talii" + } + }, + p_standard_jumbo = { + name = "Olbrzymia paczka standardowa", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart {C:attention}rozgrywających{}, by", + "dodać jej do swojej talii" + } + }, + p_standard_mega = { + name = "Megapaczka standardowa", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{} kart {C:attention}rozgrywających{}, by", + "dodać jej do swojej talii" + } + }, + p_buffoon_normal = { + name = "Paczka pajaca", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{C:joker} jokerów{}" + } + }, + p_buffoon_jumbo = { + name = "Olbrzymia paczka pajaca", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{C:joker} jokerów{}" + } + }, + p_buffoon_mega = { + name = "Megapaczka pajaca", + text = { + "Wybierz {C:attention}#1#{} z", + "{C:attention}#2#{C:joker} jokerów{}" + } + }, + pinned_left = { + name = "Przyszpilony", + text = { + "Ten joker pozostanie", + "przyszpilony w pozycji", + "najbardziej wysuniętej na lewo" + } + }, + red_seal = { + name = "Czerwona Pieczęć", + text = { + "Aktywuj ponownie tę", + "kartę {C:attention}1{} raz" + } + }, + blue_seal = { + name = "Niebieska Pieczęć", + text = { + "Tworzy kartę {C:planet}Planety{},", + "jeśli karta ta jest w {C:attention}ręce{}", + "na końcu rundy" + } + }, + purple_seal = { + name = "Fioletowa Pieczęć", + text = { + "Tworzy kartę {C:tarot}Tarota{},", + "gdy zostanie {C:attention}odrzucona", + "{C:inactive}(wymaga miejsca)" + } + }, + eternal = { + name = "Wieczny", + text = { + "Nie można jej sprzedać", + "ani zniszczyć" + } + }, + challenge_locked = { + name = "Zablokowany", + text = { + "Wygraj podejście z co najmniej", + "#1# różnymi taliami, aby odblokować", + "Tryb wyzwań", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Pik", + Hearts = "Kier", + Clubs = "Trefl", + Diamonds = "Karo" + }, + suits_plural = { + Spades = "Piki", + Hearts = "Kiery", + Clubs = "Trefle", + Diamonds = "Karo" + }, + blind_states = { + Select = "Wybierz", + Skipped = "Pominięto", + Current = "Bieżący", + Defeated = "Pokonano", + Upcoming = "Wkrótce", + Selected = "Wybrano" + }, + ranks = { + Ace = "As", + King = "Król", + Queen = "Królowa", + Jack = "Walet", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Najlepsza ręka", + furthest_round = "Najwyższa runda", + furthest_ante = "Najwyższe wejście", + most_money = "Najwięcej pieniędzy", + boss_streak = "Najwięcej Bossów z rzędu", + collection = "Kolekcja", + win_streak = "Najlepsza passa zwycięstw", + current_streak = "", + poker_hand = "Najczęściej zagrywana ręka" + }, + poker_hands = { + ['Flush House'] = "Garnitur koloru", + ['Five of a Kind'] = "Piątka", + ['Royal Flush'] = "Poker królewski", + ['Straight Flush'] = "Poker", + ['Four of a Kind'] = "Kareta", + ['Full House'] = "Full", + ['Flush'] = "Kolor", + ['Straight'] = "Strit", + ['Three of a Kind'] = "Trójka", + ['Two Pair'] = "Dwie pary", + ['Pair'] = "Para", + ['High Card'] = "Wysoka karta", + ['Flush Five'] = "Kolorowa piątka" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "Trójka i para, przy czym", + "wszystkie karty są tego samego koloru" + }, + ['Five of a Kind'] = { + "5 kart tej samej rangi" + }, + ['Royal Flush'] = { + "5 kart z rzędu {kolejne rangi}, przy czym", + "wszystkie karty są tego samego koloru" + }, + ['Straight Flush'] = { + "5 kart z rzędu {kolejne rangi}, przy czym", + "wszystkie karty są tego samego koloru" + }, + ['Four of a Kind'] = { + "4 karty tej samej rangi. Mogą być", + "zagrane z 1 kartą niepunktowaną" + }, + ['Full House'] = { + "Trójka i para" + }, + ['Flush'] = { + "5 kart tego samego koloru" + }, + ['Straight'] = { + "5 kart z rzędu {kolejne rangi}" + }, + ['Three of a Kind'] = { + "3 karty tej samej rangi. Mogą być", + "zagrane z maks. 2 kartami niepunktowanymi" + }, + ['Two Pair'] = { + "2 pary kart o różnych rangach. Mogą być", + "zagrane z 1 kartą niepunktowaną" + }, + ['Pair'] = { + "2 karty tej samej rangi. Mogą być", + "zagrane z maks. 3 kartami niepunktowanymi" + }, + ['High Card'] = { + "Jeśli zagrywana ręka nie odpowiada powyższym", + "rękom, punkty zdobywa się tylko kartami o najwyższej randze" + }, + ['Flush Five'] = { + "5 kart o tej samej randze i kolorze" + } + }, + labels = { + common = "Pospolita", + uncommon = "Niepospolita", + rare = "Rzadka", + legendary = "Legendarna", + tarot = "Tarot", + planet = "Planeta", + pluto_planet = "Planeta karłowata", + voucher = "Kupon", + foil = "W folii", + holographic = "Holograficzna", + polychrome = "Polichromowana", + negative = "Negatyw", + gold_seal = "Złota Pieczęć", + locked = "Zablokowany", + blue_seal = "Niebieska Pieczęć", + red_seal = "Czerwona Pieczęć", + purple_seal = "Fioletowa Pieczęć", + eternal = "Wieczny", + pinned_left = "Przyszpilony" + }, + dictionary = { + b_sell = "SPRZEDAJ", + b_use = "UŻYJ", + b_select = "WYBIERZ", + b_buy = "KUP", + b_redeem = "ZREALIZUJ", + b_open = "OTWÓRZ", + b_and_use = "I UŻYJ", + b_next_round_1 = "Następna", + b_next_round_2 = "runda", + b_play_hand = "Zagraj rękę", + b_discard = "Odrzuć", + b_sort_hand = "Sortuj rękę", + b_run_info_1 = "Podejście", + b_run_info_2 = "Informacje", + b_options = "Opcje", + b_reroll_boss = "Wyrzuć ponownie zdolność Bossa", + b_skip_blind = "Pomiń Przeszkadzajkę", + b_skip_reward = "Pomiń nagrodę", + b_skip = "Pomiń", + b_start_new_run = "Nowe podejście", + b_main_menu = "Menu główne", + b_collection = "Kolekcja", + b_seed = "Rozstawienie", + b_copy_seed = "Kopiuj rozstawienie", + b_credits = "Twórcy", + b_stats = "Statystyki", + b_settings = "Ustawienia", + b_set_game = "Rozgrywka", + b_set_video = "Ustawienia obrazu", + b_set_graphics = "Ustawienia grafiki", + b_set_audio = "Ustawienia dźwięku", + b_set_gamespeed = "Prędkość gry", + b_set_play_discard_pos = "Pozycja przycisku Zagraj/Odrzuć", + b_set_screenshake = "Wstrząsanie ekranem", + b_set_crash_reports = "Raporty o błędach", + b_set_monitor = "Monitor", + b_set_windowmode = "Tryb okienkowy", + b_set_apply = "Zastosuj", + b_set_master_vol = "Głośność ogólna", + b_set_music_vol = "Głośność muzyki", + b_set_game_vol = "Głośność gry", + b_set_shadows = "Cienie", + b_set_pixel_smoothing = "Wygładzanie grafiki pikselowej", + b_set_CRT = "Efekt monitora CRT", + b_set_CRT_bloom = "Efekt poświaty CRT", + b_stat_jokers = "Jokery", + b_stat_consumables = "Przedmioty zużywalne", + b_stat_tarots = "Karty Tarota", + b_stat_planets = "Karty Planet", + b_stat_spectrals = "Karty Ducha", + b_stat_vouchers = "Kupony", + b_next = "Następna", + b_endless = "Tryb niekończącej się rozgrywki", + b_wishlist = "Dodaj do listy życzeń na Steam", + b_playbalatro = "Odwiedź stronę playbalatro.com", + b_remaining = "Pozostało", + b_full_deck = "Kompletna talia", + b_poker_hands = "Układy pokerowe", + b_blinds = "Przeszkadzajki", + b_vouchers = "Kupony", + b_stake = "Stawka", + b_jokers = "Jokery", + b_tarot_cards = "Karty Tarota", + b_planet_cards = "Karty Planet", + b_spectral_cards = "Karty Ducha", + b_enhanced_cards = "Karty ulepszone", + b_editions = "Wersje", + b_booster_packs = "Paczki wzmacniające", + b_tags = "Znaczniki", + b_decks = "Talie", + b_continue = "Kontynuuj", + b_back = "Cofnij", + b_music = "Muzyka", + b_sounds = "Dźwięki", + b_imagery = "Obrazki", + b_new_run = "Nowe podejście", + b_challenges = "Wyzwania", + b_current_profile = "Bieżący profil", + b_load_profile = "Wczytaj profil", + b_create_profile = "Utwórz profil", + b_delete_profile = "Usuń profil", + b_reset_profile = "Resetuj profil", + b_rules = "Zasady", + b_restrictions = "Ograniczenia", + b_deck = "Talia", + b_play_cap = "GRAJ", + b_options_cap = "OPCJE", + b_collection_cap = "KOLEKCJA", + b_quit_cap = "WYJDŹ", + b_cash_out = "Wypłata", + k_unknown = "?????", + k_compatible = "kompatybil.", + k_incompatible = "niekompatybil.", + k_round = "Runda", + k_ante = "Wejście", + k_seed = "Rozstawienie", + k_reroll = "Ponowny rzut", + k_mult = "Mnożnik", + k_rank = "Ranga", + k_suit = "Kolor", + k_stake = "Stawka", + k_common = "Pospolita", + k_uncommon = "Niepospolita", + k_rare = "Rzadka", + k_legendary = "Legendarna", + k_debuffed = "Osłabiono", + k_locked = "Zablokowano", + k_undisovered = "Nieodkryto", + k_joker = "Joker", + k_voucher = "Kupon", + k_tarot = "Tarot", + k_planet = "Planeta", + k_dwarf_planet = "Planeta karłowata", + k_planet_q = "Karta Planeta?", + k_spectral = "Karta Ducha", + k_booster = "Wzmocnienie", + k_edition = "Wersja", + k_hud_hands = "Ręce", + k_hud_discards = "Zrzutki", + k_lower_score = "wynik", + k_arcana_pack = "Paczka wiedzy tajemnej", + k_celestial_pack = "Paczka niebiańska", + k_spectral_pack = "Paczka kart Ducha", + k_standard_pack = "Paczka standardowa", + k_buffoon_pack = "Paczka pajaca", + k_enter_text = "Wprowadź tekst", + k_defeated_by = "Przegrana z", + k_level_prefix = "poz.", + k_also_applied = "Zastosowano również", + k_base_cards = "Karty bazowe", + k_effective = "Skuteczna", + k_aces = "Asy", + k_face_cards = "Figury karciane", + k_numbered_cards = "Karty numerowane", + k_cap_consumables = "PRZEDMIOTY ZUŻYWALNE", + k_page = "Strona", + k_ante_cap = "WEJŚCIE", + k_base_cap = "BAZOWA", + k_jokers_cap = "JOKERY", + k_vouchers_cap = "KUPONY", + k_x_base = "X bazowa", + k_not_discovered = "Nie odkryto", + k_unlocked_ex = "Odblokowane!", + k_challenge_mode = "Tryb wyzwań", + k_daily_run = "Ilość podejść dziennie", + k_profile = "Profil", + k_wins = "Wygrane", + k_empty_caps = "PUSTO", + k_collection = "Kolekcja", + k_stake_level = "Poziom stawek", + k_none = "Brak", + k_game_modifiers = "Modyfikatory gry", + k_custom_rules = "Zasady niestandardowe", + k_banned_cards = "Wykluczone karty", + k_banned_tags = "Wykluczone znaczniki", + k_other = "Inne", + k_money = "Pieniądze", + k_best_hand = "Najlepsza ręka", + k_seeded_run = "Rozstawione podejście", + k_enter_seed = "Wprowadź rozstawienie", + k_lvl = "poz.", + k_skipped_cap = "POMINIĘTO", + k_no_reward = "Brak nagrody", + k_reward = "Nagroda", + k_nope_ex = "Nie!", + k_or = "lub", + k_balanced = "Zrównoważono", + ph_improve_run = "Popraw swoje podejście!", + ph_sneak_peek = "Zapowiedź", + ph_deck_preview_stones = "Karty Kamień", + ph_deck_preview_effective = "Całkowita wartość łączna wynikająca z posiadania jokerów, Przeszkadzajek i ulepszeń kart", + ph_blind_score_at_least = "Zdobądź przynajmniej X pkt.", + ph_blind_reward = "Nagroda:", + ph_up_ante_1 = "Podnieś stawkę", + ph_up_ante_2 = "Podbij stawkę dla wszystkich Przeszkadzajek", + ph_up_ante_3 = "Odśwież Przeszkadzajki", + ph_stat_joker = "Łączna ilość ukończonych rund z tą kartą", + ph_stat_consumable = "Ilość użyć tej karty", + ph_stat_voucher = "Ilość realizacji tego kuponu", + ph_demo_thanks_1 = "Dziękujemy za grę w", + ph_demo_thanks_2 = "DEMO BALATRO", + ph_game_over = "KONIEC GRY", + ph_vouchers_redeemed = "Liczba kuponów zrealizowanych w tym podejściu", + ph_no_vouchers = "Brak realizacji kuponów w tym podejściu", + ph_defeat_this_blind_1 = "Pokonaj tę Przeszkadzajkę, by", + ph_defeat_this_blind_2 = "ją odkryć", + ph_click_confirm = "Kliknij ponownie, aby potwierdzić", + ph_choose_blind_1 = "Wybierz", + ph_choose_blind_2 = "kolejną Przeszkadzajkę", + ph_mr_bones = "Kostek cię ocalił", + ph_score_at_least = "Zdobądź przynajmniej X pkt.", + ph_all_poker_hand = "Wszystkie układy rąk w pokerze", + ph_1_level = "+1 poziom", + ph_boss_disabled = "Boss został wyłączony!", + ph_most_played = "{najczęściej zagrywana ręka}", + ml_demo_thanks_message = { + "Rozważ dodanie", + "Balatro do listy życzeń na Steam oraz zapisz się", + "do biuletynu na stronie playbalatro.com" + }, + ml_eternal = { + "Wieczny", + "Nie można jej sprzedać", + "ani zniszczyć" + }, + ml_gold_seal_desc = { + "Złota Pieczęć", + "wraca do ręki", + "przy zagraniu" + }, + ml_crash_report_info = { + "Raporty o błędach będą wysyłane do twórców gry,", + "aby ograniczyć problemy w przyszłości.", + "Wysłane dane są anonimizowane." + }, + ml_play_discard_pos_opt = { + "Odrzuć/Zagraj", + "Zagraj/Odrzuć" + }, + ml_windowmode_opt = { + "W oknie", + "Pełny ekran", + "Bez ramki" + }, + ml_vsync_opt = { + "Synchr. pion. wł.", + "Synchr. pion. wył." + }, + ml_shadow_opt = { + "Wł.", + "Wył." + }, + ml_smoothing_opt = { + "Wył.", + "Wł." + }, + ml_bloom_opt = { + "Wył.", + "Wł." + }, + ml_card_stats = { + "kart", + "Statystyki" + }, + ml_paste_seed = { + "Wklej", + "Rozst." + }, + ml_disabled_seed = { + "Wszystkie przedm. odblokowane i", + "odkryte są wyłączone" + }, + ['$'] = "$", + k_redeemed_ex = "Zrealizowano!", + k_duplicated_ex = "Zduplikowano!", + k_no_room_ex = "Brak miejsca!", + k_no_space_ex = "Brak miejsca!", + k_no_other_jokers = "Brak innych Jokerów!", + k_plus_tarot = "+1 Tarot", + k_plus_stone = "+1 Karty Kamień", + k_plus_planet = "+1 Planeta", + k_plus_spectral = "+1 Karta Ducha", + k_active_ex = "Aktywuj!", + k_level_up_ex = "Zwiększ poziom!", + k_upgrade_ex = "Ulepsz!", + k_again_ex = "Znów!", + k_val_up = "Zwiększ wartość!", + k_reset = "Zresetuj", + k_extinct_ex = "Wyginięcie!", + k_safe_ex = "Bezpiecznie!", + k_saved_ex = "Zapisano!", + k_swapped_ex = "Zamieniono!", + k_copied_ex = "Skopiowano!", + k_melted_ex = "Stopiono!", + b_copy = "Kopiuj", + b_high_contrast_cards = "Karty o wysokim kontraście", + b_set_rumble = "Wibracje kontrolera", + b_seals = "Pieczęcie", + b_new_challenge = "Rozpocznij nowe wyzwanie", + b_unlock_all = "Odblokuj wszystko", + k_active = "aktywny", + k_deck = "Talia", + k_progress = "Postępy", + k_challenges = "Wyzwania", + k_joker_stickers = "Naklejki na Jokery", + k_deck_stake_wins = "Wygrane stawki talią", + k_enter_name = "Wprowadź nazwę", + k_gold = "Złoto", + k_card_stats = "Statystyki kart", + k_view = "Widok", + k_all_hands = "Wszystkie ręce", + k_high_score_ex = "Wysoki wynik!", + k_demo_version_ex = "Wersja demo!", + k_playing_as = "Gram jako", + k_choose = "Wybierz", + k_achievements_disabled = "Osiągnięcia są wyłączone", + ph_no_boss_active = "brak aktywnego bossa", + ph_you_win = "WYGRYWASZ!", + ph_you_win_demo = "WYGRYWASZ W DEMO!", + ph_defeat_the_boss = "Pokonaj Przeszkadzajkę Bossa", + ph_score_furthest_ante = "Wejście", + ph_score_furthest_round = "Runda", + ph_score_hand = "Najlepsza ręka", + ph_score_poker_hand = "Najczęściej zagrywana ręka", + ph_score_new_collection = "Nowe odkrycia", + ph_score_cards_played = "Zagrane karty", + ph_score_cards_discarded = "Odrzucone karty", + ph_score_times_rerolled = "Liczba ponownych rzutów", + ph_score_cards_purchased = "Liczba zakupionych kart", + ml_edition_seal_enhancement_explanation = { + "Karty rozgrywające mogą mieć jedno", + "ulepszenie, jedną wersję i pieczęć" + }, + ml_unlock_all_explanation = { + "OSTRZEŻENIE! Odblokowanie pełnej kolekcji", + "wyłączy osiągnięcia dla tego profilu!" + }, + k_plus_joker = "+1 Joker", + k_eaten_ex = "Zjedzone!", + k_eroded_ex = "Zniszczone!", + k_achievement = "Osiągnięcie", + ph_unscored_hand = "Niepunktująca ręka", + ph_alert_debuff_confirm = "Kliknij ponownie „Zagraj”, aby potwierdzić", + k_drank_ex = "Wypite!", + k_trophy = "Trofeum", + k_trophies_disabled = "Trofea są wyłączone", + ml_unlock_all_trophies = { + "OSTRZEŻENIE! Odblokowanie pełnej kolekcji", + "wyłączy trofea dla tego profilu!" + }, + k_poker_hand = "układ pokerowy", + ph_4_7_of_clubs = "cztery 7 trefl" + }, + v_dictionary = { + a_xmult = "Mnoż. X#1#", + a_mult = "Mnoż. +#1#", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# do rozmiaru ręki", + a_hands = "+#1# Ręce", + a_sold_tally = "Sprzedano #1#/#2#", + a_remaining = "Pozostało #1#", + ante_x_voucher = "WEJŚCIE #1# KUPON", + loyalty_active = "Aktywuj!", + loyalty_inactive = "pozostało #1#", + deck_preview_wheel_singular = "Liczby mogą być niższe przez #1# kartę dobraną twarzą w dół", + deck_preview_wheel_plural = "Liczby mogą być niższe przez #1# karty dobrane twarzą w dół", + challenges_completed = "Ukończono #1#/#2# wyzwań", + interest = "#1# odsetek na $#2# (#3# maks.)", + remaining_hand_money = "Pozostałe ręce (#1#$ każda)", + remaining_discard_money = "Pozostałe zrzutki (#1#$ każda)", + ml_foil_desc = { + "W folii", + "+#1# żet." + }, + ml_holo_desc = { + "Holograficzna", + "+#1# Mnoż." + }, + ml_polychrome_desc = { + "Polichromowana", + "Mnoż. X#1#" + }, + ml_negative_desc = { + "Negatyw", + "+#1# slot na jokera" + }, + a_mult_minus = "Mnoż. -#1#", + a_handsize_minus = "-#1# do rozmiaru ręki", + ml_negative_consumable_desc = { + "Negatyw", + "+#1# slot na przedm. zużywalne" + }, + a_xmult_minus = "-Mnoż. X#1#", + unlocked = "Odblokowano #1#/#2#", + completed = "Ukończono #1#/#2#" + }, + v_text = { + ch_m_dollars = { + "Rozpocznij z {C:money}#1#$" + }, + ch_m_hands = { + "{C:blue}#1#{} rąk na rundę" + }, + ch_m_discards = { + "{C:red}#1#{} zrzutek na rundę" + }, + ch_m_reroll_cost = { + "Bazowy koszt ponownego rzutu: {C:money}#1#${}" + }, + ch_m_joker_slots = { + "{C:attention}#1#{} slotów na jokery" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} slot. na przedm. zużywalne" + }, + ch_m_hand_size = { + "{C:attention}#1#{} do rozmiaru ręki" + }, + ch_m_none = { + "{C:inactive}Brak" + }, + ch_c_no_reward = { + "Wszystkie {C:attention}Przeszkadzajki{} nie dają nagrody pieniężnej" + }, + ch_c_no_reward_specific = { + "{C:attention}#1# Przeszkadzajki{} nie dają nagrody pieniężnej" + }, + ch_c_no_extra_hand_money = { + "Dodatkowe {C:blue}ręce{} nie zdobywają pieniędzy" + }, + ch_c_no_interest = { + "Brak {C:attention}odsetek{} na końcu rundy" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}Wyzwanie dnia!" + }, + ch_c_set_seed = { + "1 próba z ustalonym rozstawieniem: {C:inactive}{ukryte}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}Żetony{} nie mogą przekroczyć obecnej wartości {C:money}$" + }, + ch_c_none = { + "{C:inactive}Brak" + }, + ch_c_inflation = { + "Na stałe podnosi ceny o {C:money}$1{} z każdym zakupem" + }, + ch_c_discard_cost = { + "Każda zrzutka kosztuje {C:money}$#1#{}" + }, + ch_c_all_eternal = { + "Wszystkie zakupione Jokery są {C:eternal}Wieczne{}" + }, + ch_c_flipped_cards = { + "{C:green}1 na #1#{} kart jest dobierana twarzą w dół" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Trzymaj {C:red}-1{} kart w ręce za każdego {C:money}$#1#{}, którego masz" + }, + ch_c_no_shop_jokers = { + "Jokery już się nie pojawiają podczas wizyty w {C:attention}sklepie" + }, + ch_c_debuff_played_cards = { + "Wszystkie {C:attention}zagrane{} karty zostają {C:attention}osłabione{} po zdobyciu punktów" + }, + ch_c_set_eternal_ante = { + "Gdy w grze ze stawką pokonasz bossa {C:attention}#1#{}, wszystkie Jokery stają się {C:attention}Wieczne" + }, + ch_c_set_joker_slots_ante = { + "Gdy w grze ze stawką pokonasz bossa {C:attention}#1#{}, sloty na jokery mają przypisaną wartość {C:attention}0" + } + }, + tutorial = { + sb_1 = { + "Witaj! Jestem", + "{C:attention}Jimbo{} i będą pomagać ci", + "w nauce gry!" + }, + sb_2 = { + "Twoim celem jest zdobywanie", + "{C:blue}żetonów{} w celu pokonania", + "{C:attention}Przeszkadzajki przeciwnika" + }, + sb_3 = { + "Tutaj mamy przeszkadzajkę {C:blue}Mała w ciemno{},", + "której pokonanie wymaga jedynie zdobycia", + "{C:attention}300 żetonów{}." + }, + sb_4 = { + "Wybierz przeszkadzajkę {C:blue}Mała w ciemno,", + "aby rozpocząć rundkę!" + }, + bb_1 = { + "Wybranie przeszkadzajki {C:attention}Duża w ciemno", + "pozwoli ci zdobyć więcej pieniędzy" + }, + bb_2 = { + "Możesz także wybrać {C:attention}jej pominięcie,", + "co da ci {C:attention}znacznik{}! Każdy", + "{C:attention}znacznik{} skutkuje unikalnym efektem" + }, + bb_3 = { + "Należy jednak uważać na", + "{C:attention}Przeszkadzajki Bossów{}. Ma", + "on zdolność, do pokonania której trzeba", + "mieć dobry plan." + }, + bb_4 = { + "Jeśli go pokonasz, wtedy", + "{C:attention}stawka wejściowa{} rośnie, a wszystkie", + "{C:attention}Przeszkadzajki{} stają się trudniejsze do pokonania" + }, + bb_5 = { + "Pobij {C:attention}stawkę wejściową{} #1# aby wygrać.", + "Teraz wybierz swoją ścieżkę!" + }, + fh_1 = { + "Żetony zdobywasz poprzez", + "zagrywanie {C:attention}układów pokerowych" + }, + fh_2 = { + "Każdy {C:attention}układ pokerowy{} pozwala wygrać", + "kwotę bazową {C:blue}żet.", + "pomnożoną przez dany mnoż. {C:red}" + }, + fh_3 = { + "Zapoznaj się z {C:attention}układami pokerowymi", + "w obszarze {C:attention}Informacje o podejściu{},", + "gdzie znajdują się też inne informacje", + "dotyczące bieżącego podejścia" + }, + fh_4 = { + "Karty pozwalają też zdobyć", + "pewną ilość {C:blue}żetonów{};", + "Najedź kursorem, aby ją sprawdzić!" + }, + fh_5 = { + "Teraz wybierz do", + "{C:attention}5{} kart, aby zagrać", + "i naciśnij przycisk {C:blue}„Zagraj rękę”" + }, + fh_6 = { + "Możesz też nacisnąć przycisk {C:red}„Odrzuć”{},", + "aby odrzucić do {C:attention}5{} wybranych kart", + "w celu uzyskania jeszcze", + "silniejszych układów ręki. Spróbuj!" + }, + fh_7 = { + "Uważaj! Masz do dyspozycji jedynie", + "ograniczoną ilość układów {C:blue}ręki", + "i {C:red}zrzutek{} na rundę" + }, + fh_8 = { + "Zdobądź {C:attention}300 żetonów{} zanim", + "skończą ci się układy {C:blue}ręki{}, aby", + "wygrać tę rundę.", + "Powodzenia!" + }, + sh_1 = { + "Kiedy zdobędziesz więcej kart,", + "pamiętaj, że możesz zmieniać", + "ich położenie. {C:attention}Jokery{} wyzwalane są", + "w kolejności od lewej do prawej" + }, + sh_2 = { + "Upewnij się także, aby", + "{C:attention}UŻYWAĆ{} przedmiotów zużywalnych!" + }, + sh_3 = { + "Wybierz do {C:attention}2{} kart", + "z twojej ręki i naciśnij przycisk", + "{C:attention}„UŻYJ”{} na karcie {C:tarot}Tarota{},", + "aby je ulepszyć!" + }, + s_1 = { + "Świetnie! Teraz, gdy", + "{E:1}opływasz{} w {C:money}forsę{},", + "możesz kupić nowe", + "karty w {C:attention}Sklepie" + }, + s_2 = { + "Spróbuj kupić tego", + "przystojnego Diabła" + }, + s_3 = { + "To jeden z {C:attention}#1#", + "{C:attention}Jokerów{}, które można dodać", + "do podejścia. Każdy {C:attention}Joker", + "daje inny efekt" + }, + s_4 = { + "Ten dodaje mnoż. {C:red}+4{} do", + "każdej rozegranej ręki!" + }, + s_5 = { + "Bądź wybredny! Możesz mieć tylko", + "{C:attention}5 jokerów{}", + "jednocześnie" + }, + s_6 = { + "Kup teraz drugą", + "kartę w {C:attention}Sklepie" + }, + s_7 = { + "To karta {C:tarot}Tarota{}, która jest", + "{C:attention}zużywalna{}. Ta pozwoli ci", + "ulepszyć twoje karty", + "rozgrywające! Nie pozbywaj się jej." + }, + s_8 = { + "Możesz mieć do", + "{C:attention}2 zużywalnych{} kart", + "jednocześnie" + }, + s_9 = { + "Jeśli zgromadzisz ich wystarczająco dużo,", + "możesz kupić {C:attention}kupon{}.", + "{C:attention}Kupony{} to pasywne", + "ulepszenia twojego podejścia!" + }, + s_10 = { + "{C:attention}Kupony{} są uzupełniane", + "po pokonaniu", + "{C:attention}Przeszkadzajki Bossa{}." + }, + s_11 = { + "Sprawdź także obie", + "{C:booster}paczki wzmacniające{} podczas", + "każdej wizyty w sklepie. Jest", + "w nich mnóstwo mecyi!" + }, + s_12 = { + "Przejdźmy do", + "następnej rundy{}." + } + }, + achievement_names = { + ante_up = "Stawka w górę!", + ante_upper = "Stawka jeszcze w górę!", + heads_up = "Uwaga!", + low_stakes = "Niskie stawki", + mid_stakes = "Średnie stawki", + high_stakes = "Wysokie stawki", + card_player = "Miłośnik zagrywania kart", + card_discarder = "Miłośnik odrzucania kart", + nest_egg = "Kura nioska", + flushed = "Mamy kolor", + speedrunner = "Struś pędziwiatr", + roi = "Zwrot z inwestycji", + shattered = "Roztrzaskanie", + royale = "Królewski", + retrograde = "Wsteczny", + _10k = "10 tysi", + _1000k = "1000 tysi", + _100000k = "100 000 tysi", + tiny_hands = "Małe ręce", + big_hands = "Duże ręce", + you_get_what_you_get = "Dostajesz to, co dostajesz", + rule_bender = "Naginacz zasad", + rule_breaker = "Łamacz zasad", + legendary = "Legendarny", + astronomy = "Astronomia", + cartomancy = "Kartomancja", + clairvoyance = "Jasnowidztwo", + extreme_couponer = "Ekstremalny zbieracz kuponów", + completionist = "Pasjonat", + completionist_plus = "Pasjonat+", + completionist_plus_plus = "Pasjonat++" + }, + achievement_descriptions = { + ante_up = "Osiągnij stawkę 4", + ante_upper = "Osiągnij stawkę 8", + heads_up = "Wygraj podejście", + low_stakes = "Wygraj podejście przynajmniej na poz. trudności Czerwona stawka", + mid_stakes = "Wygraj podejście przynajmniej na poz. trudności Czarna stawka", + high_stakes = "Wygraj podejście przynajmniej na poz. trudności Złota stawka", + card_player = "Zagraj przynajmniej 2500 kart", + card_discarder = "Odrzuć przynajmniej 2500 kart", + nest_egg = "Posiadaj $400 lub więcej w trakcie jednego podejścia", + flushed = "Zagraj kolor za pomocą 5 Dzikich Kart", + speedrunner = "Wygraj podejście w ciągu 12 rund lub mniej", + roi = "Kup 5 kuponów przed stawką 4", + shattered = "Rozbij 2 Szklane Karty z pojedynczej ręki", + royale = "Zagraj pokera królewskiego", + retrograde = "Doprowadź dowolny układ pokerowy do poziomu 10.", + _10k = "Zdobądź 10 000 żetonów z pojedynczej ręki", + _1000k = "Zdobądź 1 000 000 żetonów z pojedynczej ręki", + _100000k = "Zdobądź 100 000 000 żetonów z pojedynczej ręki", + tiny_hands = "Odchudź talię do 20 kart lub mniej", + big_hands = "Posiadaj w swojej talii 80 kart lub więcej", + you_get_what_you_get = "Wygraj podejście bez ponownego rzutu podczas wizyty w sklepie", + rule_bender = "Ukończ dowolne podejście-wyzwanie", + rule_breaker = "Ukończ każde podejście-wyzwanie", + legendary = "Odkryj Legendarnego Jokera", + astronomy = "Odkryj każdą kartę Planety", + cartomancy = "Odkryj każdą kartę Tarota", + clairvoyance = "Odkryj każdą kartę Ducha", + extreme_couponer = "Odkryj każdy kupon", + completionist = "Odkryj 100% swojej kolekcji", + completionist_plus = "Wygraj każdą talią na poz. trudności Złota stawka", + completionist_plus_plus = "Zdobądź Złotą naklejkę dla każdego Jokera" + }, + quips = { + wq_1 = { + "Udało ci się!" + }, + wq_2 = { + "Całkiem nieźle", + "zrobione!" + }, + wq_3 = { + "Wygląda na to, że", + "to nie był blef!" + }, + wq_4 = { + "Wielka szkoda, że", + "wszystkie żetony są", + "tylko wirtualne..." + }, + wq_5 = { + "Wygląda na to, że", + "nauka nie poszła w las!" + }, + wq_6 = { + "Udało ci się wykonać", + "kilka świetnych zagrań!" + }, + wq_7 = { + "Dobrze, że", + "nie postawiłem", + "przeciwko tobie!" + }, + lq_1 = { + "Może Go Fish", + "lepiej pasuje", + "do naszej szybkości..." + }, + lq_2 = { + "Pasujemy,", + "jak tani garnitur!" + }, + lq_3 = { + "Czas", + "przetasować", + "i spróbować jeszcze raz!" + }, + lq_4 = { + "Wiesz, jak", + "to jest,", + "kasyno zawsze wygrywa!" + }, + lq_5 = { + "Wygląda na to,", + "że wiemy, kto", + "jest prawdziwym Jokerem!" + }, + lq_6 = { + "No nie,", + "to też był blef?" + }, + lq_7 = { + "Wygląda na to,", + "że padliśmy ofiarą własnego żartu!" + }, + lq_8 = { + "Gdybym miał ręce,", + "zasłoniłbym", + "teraz oczy!" + }, + lq_9 = { + "Nie mam zbyt dużo", + "oleju w głowie, a jaka", + "jest twoja wymówka?" + }, + lq_10 = { + "Co za wpadka!" + }, + dq_1 = { + "Aj! Mam nadzieję,", + "że masz kilka asów", + "w rękawie na", + "ostatnie wyzwanie!" + } + }, + challenge_names = { + c_omelette_1 = "Omlet", + c_city_1 = "15-minutowe miasto", + c_rich_1 = "Bogaci jeszcze bogatsi", + c_knife_1 = "Na ostrzu noża", + c_xray_1 = "Rentgenowski wzrok", + c_mad_world_1 = "Szalony świat", + c_luxury_1 = "Podatek od wzbogacenia", + c_non_perishable_1 = "Trwały", + c_medusa_1 = "Meduza", + c_double_nothing_1 = "Wszystko albo nic", + c_typecast_1 = "Szufladkowanie", + c_inflation_1 = "Inflacja", + c_bram_poker_1 = "Bram Poker", + c_fragile_1 = "Kruchy", + c_monolith_1 = "Monolit", + c_blast_off_1 = "Odpalenie", + c_five_card_1 = "Losowanie pięciu kart", + c_golden_needle_1 = "Złota igła", + c_cruelty_1 = "Okrucieństwo", + c_jokerless_1 = "Bez jokera" + } + } +} \ No newline at end of file diff --git a/localization/pt_BR.lua b/localization/pt_BR.lua new file mode 100644 index 0000000..850cf12 --- /dev/null +++ b/localization/pt_BR.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Curinga", + text = { + "{C:red,s:1.1}+#1#{} Multi" + } + }, + j_jolly = { + name = "Curinga Alegre", + text = { + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + } + }, + j_zany = { + name = "Curinga Bobo", + text = { + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + } + }, + j_mad = { + name = "Curinga Irritado", + text = { + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + } + }, + j_crazy = { + name = "Curinga Maluco", + text = { + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + } + }, + j_droll = { + name = "Curinga Engraçado", + text = { + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + } + }, + j_half = { + name = "Meio Curinga", + text = { + "{C:red}+#1#{} Multi se a mão", + "jogada contém", + "{C:attention}#2#{} ou menos cartas" + } + }, + j_fortune_teller = { + name = "Vidente", + text = { + "{C:red}+#1#{} Multi por", + "carta de {C:purple}Tarô{} usada", + "{C:inactive}(No momento {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Malabarista", + text = { + "{C:attention}+#1#{} tamanho de mão" + } + }, + j_drunkard = { + name = "Bêbado", + text = { + "{C:red}+#1#{} descarte(s)" + } + }, + j_stone = { + name = "Curinga de Pedra", + text = { + "Este Curinga ganha {C:chips}+#1#{} Fichas", + "por cada {C:attention}Carta de Pedra", + "no seu baralho completo", + "{C:inactive}(No momento {C:chips}+#2#{C:inactive} Fichas)" + } + }, + j_golden = { + name = "Curinga Dourado", + text = { + "Ganhe {C:money}$#1#{} no", + "fim da rodada" + } + }, + j_stencil = { + name = "Curinga Estampado", + text = { + "{X:red,C:white} X1 {} Multi por cada", + "espaço de {C:attention}Curinga{} vazio", + "{s:0.8}Curinga Estampado incluído", + "{C:inactive}(No momento {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Quatro Dedos", + text = { + "Todos os {C:attention}Flushes{} e", + "{C:attention}Sequências{} podem", + "ser efetuados com {C:attention}4{} cartas" + } + }, + j_mime = { + name = "Mímico", + text = { + "Reativa todas as", + "habilidades das cartas {C:attention}na sua", + "{C:attention}mão{}" + } + }, + j_credit_card = { + name = "Cartão de Crédito", + text = { + "Tenha até", + "{C:red}-$#1#{} em dívida" + } + }, + j_greedy_joker = { + name = "Curinga Ganancioso", + text = { + "Cartas jogadas com", + "naipe de {C:diamonds}#2#{} dão", + "{C:mult}+#1#{} Multi quando pontuadas" + } + }, + j_lusty_joker = { + name = "Curinga Vigoroso", + text = { + "Cartas jogadas com", + "naipe de {C:hearts}#2#{} dão", + "{C:mult}+#1#{} Multi quando pontuadas" + } + }, + j_wrathful_joker = { + name = "Curinga Furioso", + text = { + "Cartas jogadas com", + "naipe de {C:spades}#2#{} dão", + "{C:mult}+#1#{} Multi quando pontuadas" + } + }, + j_gluttenous_joker = { + name = "Curinga Guloso", + text = { + "Cartas jogadas com", + "naipe de {C:clubs}#2#{} dão", + "{C:mult}+#1#{} Multi quando pontuadas" + } + }, + j_ceremonial = { + name = "Adaga Cerimonial", + text = { + "Quando o {C:attention}Blind{} é selecionado,", + "destrói o Curinga da direita", + "e adiciona, permanentemente, o {C:attention}dobro", + "do valor de venda a esta {C:red}Multi", + "{C:inactive}(No momento {C:mult}+#1#{C:inactive} Multi)" + } + }, + j_banner = { + name = "Estandarte", + text = { + "{C:chips}+#1#{} Fichas", + "por cada", + "{C:attention}descarte restante" + } + }, + j_mystic_summit = { + name = "Pico Místico", + text = { + "{C:mult}+#1#{} Multi quando", + "{C:attention}#2#{} descartes", + "restantes" + } + }, + j_marble = { + name = "Curinga de Mármore", + text = { + "Adiciona uma carta de {C:attention}Pedra{}", + "ao seu baralho quando", + "o {C:attention}Blind{} é selecionado" + } + }, + j_loyalty_card = { + name = "Carta de Lealdade", + text = { + "{X:red,C:white} X#1# {} Multi a cada", + "{C:attention}#2#{} mãos jogadas", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "Bola 8", + text = { + "Cria uma carta de {C:planet}Planeta{}", + "se a mão jogada contém", + "{C:attenetion}#1#{} ou mais {C:attention}8s{}", + "{C:inactive}(Deve ter espaço)" + } + }, + j_misprint = { + name = "Erro de Impressão", + text = { + "" + } + }, + j_dusk = { + name = "Anoitecer", + text = { + "Reativa as cartas", + "pontuadoras na {C:attention}mão", + "{C:attention}final{} da rodada" + } + }, + j_raised_fist = { + name = "Punho Erguido", + text = { + "Adiciona o {C:attention}dobro{} da classe", + "da carta {C:attention}mais baixa{} na", + "mão à Multi" + } + }, + j_chaos = { + name = "Caos, o Palhaço", + text = { + "{C:attention}#1#{} {C:green}atualização(ões) grátis", + "por loja" + } + }, + j_fibonacci = { + name = "Fibonacci", + text = { + "Cada {C:attention}Ás{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} ou {C:attention}8{} jogados dão", + "{C:mult}+#1#{} Multi quando pontuados" + } + }, + j_steel_joker = { + name = "Curinga de Aço", + text = { + "Este Curinga ganha {X:mult,C:white} X#1# {} Multi", + "por cada {C:attention}Carta de Aço", + "no seu baralho completo", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_scary_face = { + name = "Realeza Assustadora", + text = { + "Cartas de {C:attention}realeza{} jogadas", + "dão {C:chips}+#1#{} Fichas", + "quando pontuadas" + } + }, + j_abstract = { + name = "Curinga Abstrato", + text = { + "{C:mult}+#1#{} Multi por", + "cada carta {C:attention}Curinga{}", + "{C:inactive}(No momento {C:red}+#2#{C:inactive} Multi)" + } + }, + j_delayed_grat = { + name = "Gratificação Atrasada", + text = { + "Ganhe {C:money}$#1#{} por {C:attention}descarte{} se", + "nenhum descarte for usado", + "até o fim da rodada" + } + }, + j_hack = { + name = "Impostor", + text = { + "Reativa", + "cada", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} ou {C:attention}5{}" + } + }, + j_pareidolia = { + name = "Pareidolia", + text = { + "Todas as cartas são", + "consideradas", + "cartas de {C:attention}Realeza{}" + } + }, + j_gros_michel = { + name = "Banana-prata", + text = { + "{C:mult}+#1#{} Multi", + "{C:green}#2# de #3#{} chance desta", + "carta ser destruída", + "jogados no fim da rodada" + } + }, + j_even_steven = { + name = "Par Perfeito", + text = { + "Cartas jogadas com", + "classe {C:attention}par{} dão", + "{C:mult}+#1#{} Multi quando pontuadas", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "Ímpar Imperfeito", + text = { + "Cartas jogadas com", + "classe {C:attention}ímpar{} dão", + "{C:chips}+#1#{} Fichas quando pontuadas", + "{C:inactive}(A, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Estudioso", + text = { + "{C:attention}Ases{} jogados", + "dão {C:chips}+#2#{} Fichas", + "e {C:mult}+#1#{} Multi", + "quando pontuados" + } + }, + j_business = { + name = "Cartão de Visita", + text = { + "Cartas de {C:attention}realeza{} jogadas têm", + "a chance de {C:green}#1# em #2#{} de", + "dar {C:money}$2{} quando pontuadas" + } + }, + j_supernova = { + name = "Supernova", + text = { + "Adiciona o número de", + "vezes que a {C:attention}mão de pôquer{}", + "foi jogada ao Multi" + } + }, + j_ride_the_bus = { + name = "Passear de Ônibus", + text = { + "{C:mult}+#1#{} Multi por", + "mãos consecutivas", + "jogadas sem uma", + "carta de {C:attention}Realeza{} pontuando", + "{C:inactive}(No momento {C:mult}+#2#{C:inactive} Multi)" + } + }, + j_space = { + name = "Curinga Espacial", + text = { + "Chance de {C:green}#1# em #2#{} para", + "aprimorar o nível da", + "{C:attention}mão de pôquer{} jogada" + } + }, + j_egg = { + name = "Ovo", + text = { + "Ganha {C:money}$#1#{} do", + "{C:attention}valor de venda{} ao", + "fim da rodada" + } + }, + j_burglar = { + name = "Ladrão", + text = { + "Quando o {C:attention}Blind{} é selecionado,", + "ganha {C:blue}+#1#{} Mãos e", + "{C:attention}perde todos os descartes" + } + }, + j_blackboard = { + name = "Quadro Negro", + text = { + "{X:red,C:white} X#1# {} Multi se todas as", + "cartas mantidas na mão", + "forem {C:spades}#2#{} ou {C:clubs}#3#{}" + } + }, + j_runner = { + name = "Atleta", + text = { + "Ganha {C:chips}+#2#{} Fichas", + "se a mão jogada", + "tiver uma {C:attention}Sequência{}", + "{C:inactive}(No momento {C:chips}+#1#{C:inactive} Fichas)" + } + }, + j_ice_cream = { + name = "Sorvete", + text = { + "{C:chips}+#1#{} Fichas", + "{C:chips}-#2#{} Fichas por", + "cada mão jogada" + } + }, + j_dna = { + name = "DNA", + text = { + "Se a {C:attention}primeira mão{} da rodada", + "tiver somente {C:attention}1{} carta, adiciona uma", + "cópia permanente ao baralho", + "e a coloca na {C:attention}mão" + } + }, + j_splash = { + name = "Splash", + text = { + "Cada {C:attention}carta jogada", + "conta na pontuação" + } + }, + j_blue_joker = { + name = "Curinga Azul", + text = { + "{C:chips}+#1#{} Fichas por cada", + "carta restante no {C:attention}baralho", + "{C:inactive}(No momento {C:chips}+#2#{C:inactive} Fichas)" + } + }, + j_sixth_sense = { + name = "Sexto Sentido", + text = { + "Se a {C:attention}primeira mão{} da rodada for", + "um único {C:attention}6{}, destrói a mesma e", + "cria uma carta {C:spectral}Espectral{}", + "{C:inactive}(Deve ter espaço)" + } + }, + j_constellation = { + name = "Constelação", + text = { + "Ganha {X:mult,C:white} X#1# {} Multi", + "por cada carta de {C:planet}Planeta{} usada", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_hiker = { + name = "Caminhante", + text = { + "Todas as {C:attention}cartas{} jogadas", + "ganham, permanentemente,", + "{C:chips}+#1#{} Fichas quando pontuadas" + } + }, + j_faceless = { + name = "Curinga Plebeu", + text = { + "Ganhe {C:money}$#1#{} se {C:attention}#2#{} ou", + "mais {C:attention}cartas de Realeza{}", + "são descartadas", + "ao mesmo tempo" + } + }, + j_green_joker = { + name = "Curinga Verde", + text = { + "{C:mult}+#1#{} Multi por mão jogada", + "{C:mult}-#2#{} Multi por descarte", + "{C:inactive}(No momento {C:mult}+#3#{C:inactive} Multi)" + } + }, + j_superposition = { + name = "Sobreposição", + text = { + "Cria uma carta de {C:tarot}Tarô{} se", + "a mão de pôquer tiver um", + "{C:attention}Às{} e um {C:attention}Sequência{}", + "{C:inactive}(Deve ter espaço)" + } + }, + j_todo_list = { + name = "Lista de Tarefas", + text = { + "Ganhe {C:money}$#1#{} se a {C:attention}mão de pôquer{}", + "for {C:attention}#2#{},", + "a mão de pôquer muda", + "em cada pagamento" + } + }, + j_ticket = { + name = "Bilhete Dourado", + text = { + "Cartas {C:attention}Douradas{} jogadas", + "ganham {C:money}$#1#{} quando pontuadas" + }, + unlock = { + "Jogue uma mão de 5 cartas", + "contendo somente", + "cartas {C:attention,E:1}Douradas{}" + } + }, + j_mr_bones = { + name = "Sr. Osso", + text = { + "Evita a Morte", + "se as fichas pontuadas", + "forem, pelo menos, {C:attention}25%", + "das fichas necessárias", + "{S:1.1,C:red,E:2}se autodestrói{}" + }, + unlock = { + "Perde {C:attention,E:1}#1#{} tentativas", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Acrobata", + text = { + "{X:red,C:white} X#1# {} Multi na {C:attention}mão", + "{C:attention}final{} da rodada" + }, + unlock = { + "Jogue {C:attention,E:1}#1#{} mãos", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "A Meia e o Coturno", + text = { + "Reativa todas as", + "cartas de {C:attention}realeza{} jogadas" + }, + unlock = { + "Jogue um total de", + "{C:attention,E:1}#1#{} cartas de Realeza", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "Aventureiro", + text = { + "Adiciona o valor de venda de", + "todos os {C:attention}Curingas{} esquerdos", + "desta carta à Multi", + "{C:inactive}(No momento {C:mult}+#1#{C:inactive} Multi)" + }, + unlock = { + "Venda um total de", + "{C:attention,E:1}#1#{} cartas Curinga", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Trovador", + text = { + "{C:attention}+#1#{} tamanho de mão,", + "{C:red}-#2#{} mãos por rodada" + }, + unlock = { + "Vença {C:attention,E:1}#1#{} rodadas", + "consecutivas jogando", + "somente 1 mão" + } + }, + j_certificate = { + name = "Certificado", + text = { + "Quando a rodada começa,", + "adiciona uma {C:attention}carta de jogo", + "{C:attention}aleatória{} com um", + "{C:attention}selo{} para a sua mão" + }, + unlock = { + "Tenha uma", + "carta de jogo de Ouro com", + "um {C:attention,E:1}Selo Dourado" + } + }, + j_smeared = { + name = "Curinga Borrado", + text = { + "{C:hearts}Copas{} e {C:diamonds}Ouros", + "contam como o mesmo naipe,", + "{C:spades}Espadas{} e {C:clubs}Paus", + "contam como o mesmo naipe" + }, + unlock = { + "Tenha pelo menos {C:attention}#1#", + "{E:1,C:attention}#2#{} no", + "seu baralho" + } + }, + j_throwback = { + name = "Retorno", + text = { + "{X:mult,C:white} X#1# {} Multi por cada", + "{C:attention}Blind{} ignorado nesta rodada", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + }, + unlock = { + "Continue uma tentativa salva", + "através do menu principal" + } + }, + j_hanging_chad = { + name = "Comprovante", + text = { + "Reativa a {C:attention}primeira{}", + "carta usada para pontuar" + }, + unlock = { + "Acabe com o Blind de Chefe", + "com uma {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Joia Bruta", + text = { + "Cartas jogadas com", + "naipe de {C:diamonds}Ouros{} ganham", + "{C:money}$#1#{} quando pontuadas" + }, + unlock = { + "Tenha pelo menos {E:1,C:attention}#1#", + "cartas com naipe de {E:1,C:attention}#2#", + "no seu baralho" + } + }, + j_bloodstone = { + name = "Pedra de Sangue", + text = { + "Chance de {C:green}#1# em #2#{} para", + "cartas jogadas com", + "naipe de {C:hearts}Copas{} darem", + "{X:mult,C:white} X#3# {} Multi ao pontuar," + }, + unlock = { + "Tenha pelo menos {E:1,C:attention}#1#", + "cartas com naipe de {E:1,C:attention}#2#", + "no seu baralho" + } + }, + j_arrowhead = { + name = "Ponta de Flecha", + text = { + "Cartas jogadas com", + "naipe de {C:spades}Espadas{} dão", + "{C:chips}+#1#{} Fichas quando pontuadas" + }, + unlock = { + "Tenha pelo menos {E:1,C:attention}#1#", + "cartas com naipe de {E:1,C:attention}#2#", + "no seu baralho" + } + }, + j_onyx_agate = { + name = "Ágata Ônix", + text = { + "Cartas jogadas com", + "naipe de {C:clubs}Paus{} dão", + "{C:mult}+#1#{} Multi quando pontuadas" + }, + unlock = { + "Tenha pelo menos {E:1,C:attention}#1#", + "cartas com naipe de {E:1,C:attention}#2#", + "no seu baralho" + } + }, + j_glass = { + name = "Curinga de Vidro", + text = { + "Ganha {X:mult,C:white} X#1# {} Multi", + "por cada {C:attention}Carta de Vidro", + "que é destruída", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + }, + unlock = { + "Tenha pelo menos {E:1,C:attention}#1#", + "{E:1,C:attention}#2#s{} no", + "seu baralho" + } + }, + j_ring_master = { + name = "Mestre do Ringue", + text = { + "Cartas de {C:attention}Curinga{}, {C:tarot}Tarô{}, {C:planet}Planeta{}", + "e {C:spectral}Espectral{} podem", + "aparecer várias vezes" + }, + unlock = { + "Alcance", + "Nível de Aposta {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Vaso de Flores", + text = { + "{X:mult,C:white} X#1# {} Multi se a mão jogada ", + "conter uma mão com carta de", + "{C:diamonds}Ouros{}, {C:clubs}Paus{},", + "de Copas e de Espadas que pontuam" + }, + unlock = { + "Alcance", + "Nível de Aposta {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Projeto", + text = { + "Copia a habilidade do", + "{C:attention}Curinga{} da direita" + }, + unlock = { + "Vença uma tentativa" + } + }, + j_wee = { + name = "Curinguinha", + text = { + "Este Curinga ganha", + "{C:chips}+#2#{} Fichas quando cada", + "{C:attention}2{} jogado pontua", + "{C:inactive}(No momento {C:chips}+#1#{C:inactive} Fichas)" + }, + unlock = { + "Vença uma tentativa em {E:1,C:attention}#1#", + "ou menos rodadas" + } + }, + j_merry_andy = { + name = "Jogada de Descartes", + text = { + "{C:red}+#1#{} descartes,", + "{C:red}#2#{} tamanho de mão" + }, + unlock = { + "Vença uma tentativa em {E:1,C:attention}#1#", + "ou menos rodadas" + } + }, + j_oops = { + name = "Opa! Tudo 6", + text = { + "Dobra {C:attention}todas as", + "{C:green,E:1,S:1.1}probabilidades", + "{C:inactive}(ex: {C:green}1 em 3{C:inactive} -> {C:green}2 em 3{C:inactive})" + }, + unlock = { + "Em uma mão,", + "ganhe pelo menos", + "{E:1,C:attention}#1#{} fichas" + } + }, + j_idol = { + name = "O Ídolo", + text = { + "Cada {C:attention}#2#", + "de {V:1}#3#{} jogado dá", + "{X:mult,C:white} X#1# {} Multi ao pontuar", + "{s:0.8}Carta muda em cada rodada" + }, + unlock = { + "Em uma mão,", + "ganhe pelo menos", + "{E:1,C:attention}#1#{} fichas" + } + }, + j_seeing_double = { + name = "Visão Duplicada", + text = { + "{X:mult,C:white} X#1# {} Multi se jogar", + "uma mão com carta pontuadora de", + "Carta de {C:clubs}Paus{} e uma carta", + "de pontuação de qualquer outro {C:attention}naipe" + }, + unlock = { + "Jogue uma mão", + "que contém", + "{E:1,C:attention}#1#" + } + }, + j_matador = { + name = "Matador", + text = { + "Ganhe {C:money}$#1#{} se a", + "mão jogada ativa a", + "habilidade {C:attention}Blind de Chefe{}" + }, + unlock = { + "Derrote um Blind de Chefe", + "em {E:1,C:attention}1 mão{} sem", + "usar qualquer descarte" + } + }, + j_hit_the_road = { + name = "Cai Fora", + text = { + "Ganha {X:mult,C:white} X#1# {} Multi", + "por cada", + "{C:attention}Valete{} descartado nesta rodada", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + }, + unlock = { + "Descarte {E:1,C:attention}5", + "{E:1,C:attention}Valetes{} ao", + "mesmo tempo" + } + }, + j_duo = { + name = "A Dupla", + text = { + "{X:mult,C:white} X#1# {} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + }, + unlock = { + "Vença uma tentativa", + "sem jogar", + "{E:1,C:attention}#1#" + } + }, + j_trio = { + name = "O Trio", + text = { + "{X:mult,C:white} X#1# {} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + }, + unlock = { + "Vença uma tentativa", + "sem jogar", + "um {E:1,C:attention}#1#" + } + }, + j_family = { + name = "A Família", + text = { + "{X:mult,C:white} X#1# {} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + }, + unlock = { + "Vença uma tentativa", + "sem jogar", + "um {E:1,C:attention}#1#" + } + }, + j_order = { + name = "A Ordem", + text = { + "{X:mult,C:white} X#1# {} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + }, + unlock = { + "Vença uma tentativa", + "sem jogar", + "um {E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "A Tribo", + text = { + "{X:mult,C:white} X#1# {} Multi se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + }, + unlock = { + "Vença uma tentativa", + "sem jogar", + "um {E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "Cavendish", + text = { + "{X:mult,C:white} X#1# {} Multi", + "{C:green}#2# de #3#{} chance desta", + "carta ser destruída", + "no fim da rodada" + } + }, + j_card_sharp = { + name = "Carta Afiada", + text = { + "{X:mult,C:white} X#1# {} Multi se a", + "{C:attention}mão de pôquer{} já tiver sido", + "jogada nesta rodada" + } + }, + j_red_card = { + name = "Carta Vermelha", + text = { + "Ganha {C:red}+#1#{} Multi quando qualquer", + "{C:attention}Pacote de Reforço{} for ignorado", + "{C:inactive}(No momento {C:red}+#2#{C:inactive} Multi)" + } + }, + j_madness = { + name = "Insanidade", + text = { + "Quando o {C:attention}Blind{} é selecionado,", + "ganhe {X:mult,C:white} X#1# {} Multi e", + "{C:attention}destrua{} um Curinga aleatório", + "{C:inactive}(No momento {X:mult,C:white} X#2# {} Multi)" + } + }, + j_square = { + name = "Curinga Quadrado", + text = { + "Ganha {C:chips}+#2#{} Fichas se", + "a mão jogada tiver", + "exatamente {C:attention}4{} cartas", + "{C:inactive}(No momento {C:chips}#1#{} Fichas)" + } + }, + j_seance = { + name = "Sessão Mediúnica", + text = { + "Se a {C:attention}mão de pôquer{} for", + "{C:attention}#1#{}, cria um(a)", + "carta {C:spectral}Espectral{} aleatória", + "{C:inactive}(Deve ter espaço)" + } + }, + j_riff_raff = { + name = "Ralé", + text = { + "Quando o {C:attention}Blind{} é selecionado,", + "cria {C:attention}#1# {C:blue}{C:attention}Curinga Comum", + "{C:inactive}(Deve ter espaço)" + } + }, + j_stuntman = { + name = "Dublê", + text = { + "{C:chips}+#1#{} Fichas,", + "{C:attention}-#2#{} de tamanho de mão" + }, + unlock = { + "Em uma mão,", + "ganhe pelo menos", + "{E:1,C:attention}#1#{} fichas" + } + }, + j_invisible = { + name = "Curinga Invisível", + text = { + "Após {C:attention}#1#{} rodadas,", + "venda esta carta para", + "{C:attention}Duplicar{} um Curinga aleatório", + "{C:inactive}(No momento {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Vença uma tentativa sem", + "ter mais de", + "{E:1,C:attention}4 Curingas{}" + } + }, + j_brainstorm = { + name = "Boa Ideia", + text = { + "Copia a habilidade", + "do {C:attention}Curinga que está mais à esquerda" + }, + unlock = { + "Descarte um", + "{E:1,C:attention}Royal Flush" + } + }, + j_satellite = { + name = "Satélite", + text = { + "Ganhe {C:money}$#1#{} no fim da", + "rodada por {C:planet}Planeta único", + "usada nesta tentativa", + "{C:inactive}(No momento {C:money}$#2#{C:inactive})" + }, + unlock = { + "Tenha {E:1,C:money}$#1#", + "ou mais" + } + }, + j_shoot_the_moon = { + name = "Alcance os Céus", + text = { + "{C:mult}+#1#{} Multi por", + "cada {C:attention}Rainha{}", + "na sua mão" + }, + unlock = { + "Jogue cada carta de {E:1,C:attention}Copas", + "do seu baralho em", + "uma única rodada" + } + }, + j_drivers_license = { + name = "Carteira de Habilitação", + text = { + "{X:mult,C:white} X#1# {} Multi se você", + "tiver pelo menos {C:attention}16", + "cartas aprimoradas", + "{C:inactive}(No momento {C:attention}#2#{C:inactive})" + }, + unlock = { + "Aprimora {E:1,C:attention}#1#{} cartas", + "no seu baralho" + } + }, + j_cartomancer = { + name = "Cartomante", + text = { + "Cria uma carta de {C:tarot}Tarô{}", + "quando o {C:attention}Blind{} é selecionado", + "{C:inactive}(Deve ter espaço)" + }, + unlock = { + "Descubra todas as", + "cartas de {E:1,C:tarot}Tarô{}" + } + }, + j_astronomer = { + name = "Astrônomo", + text = { + "Todas as cartas de {C:planet}Planeta{} e", + "{C:planet}Pacotes Celestiais{} em", + "na loja ficam {C:attention}grátis" + }, + unlock = { + "Descubra cada", + "carta de {E:1,C:planet}Planeta{}" + } + }, + j_burnt = { + name = "Curinga Queimado", + text = { + "Aprimore o nível da", + "primeira mão {C:attention}descartada", + "em cada rodada" + }, + unlock = { + "Venda um total", + "de {E:1,C:attention}#1#{} cartas", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Bonificação", + text = { + "{C:mult}+#1#{} Multi por cada", + "{C:money}$#2#{} que tiver" + }, + unlock = { + "Tenha pelo menos {E:1,C:attention}#1#", + "Curingas {C:dark_edition}Policromáticos{}" + } + }, + j_caino = { + name = "Caino", + text = { + "Ganhe {X:mult,C:white} X#1# {} Multi quando", + "uma carta de {C:attention}realeza{}", + "for destruída", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "Triboulet", + text = { + "{C:attention}Reis{} e", + "{C:attention}Rainhas{} jogados dão", + "{X:mult,C:white} X#1# {} Multi ao pontuar," + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "Yorick", + text = { + "{X:mult,C:white} X#1# {} Multi somente após", + "usar {C:attention}#2#{} descartes", + "{C:inactive}(Descartes restantes: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "Chicot", + text = { + "Desativa o efeito de", + "cada {C:attention}Blind de Chefe" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "Perkeo", + text = { + "Cria uma cópia {C:dark_edition}Negativa{} de", + "{C:attention}1{} carta {C:attention}consumível{} aleatória", + "em sua posse", + "no final da {C:attention}loja" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "Curinga Malandro", + text = { + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + } + }, + j_wily = { + name = "Curinga Sagaz", + text = { + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + } + }, + j_clever = { + name = "Curinga Astuto", + text = { + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + } + }, + j_devious = { + name = "Curinga Desonesto", + text = { + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + } + }, + j_crafty = { + name = "Curinga Engenhoso", + text = { + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um(a) {C:attention}#2#" + } + }, + j_vampire = { + name = "Vampiro", + text = { + "Ganha {X:mult,C:white} X#1# {} Multi por", + "{C:attention}carta aprimorada{} jogada,", + "remove {C:attention}aprimoramento de carta", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_shortcut = { + name = "Atalho", + text = { + "Permite que {C:attention}Sequências{} sejam", + "efetuados com intervalos de {C:attention}1 classe", + "{C:inactive}(ex: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Holograma", + text = { + "Ganha {X:mult,C:white} X#1# {} Multi", + "por {C:attention}cartas jogadas{} adicionadas", + "ao seu baralho", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_vagabond = { + name = "Vagabundo", + text = { + "Cria uma carta de {C:purple}Tarô{}", + "se a mão é jogada", + "com {C:money}$#1#{} ou menos" + } + }, + j_baron = { + name = "Barão", + text = { + "Cada {C:attention}Rei{}", + "na mão", + "dá {X:mult,C:white} X#1# {} Multi" + } + }, + j_cloud_9 = { + name = "9dades", + text = { + "Ganhe {C:money}$#1#{} por cada", + "{C:attention}9{} no seu {C:attention}baralho completo", + "no fim da rodada", + "{C:inactive}(No momento {C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "Foguete", + text = { + "Ganhe {C:money}$#1#{} no fim da", + "rodada. Ganha {C:money}$#2#{} quando", + "{C:attention}Blind de Chefe{} é derrotado" + } + }, + j_obelisk = { + name = "Obelisco", + text = { + "{X:mult,C:white} X#1# {} Multi por", + "mão consecutiva jogada", + "sem jogar sua", + "{C:attention}mão de pôquer mais jogada", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_midas_mask = { + name = "Máscara de Midas", + text = { + "Todas as cartas de {C:attention}Realeza{}", + "tornam-se cartas {C:attention}Douradas{}", + "quando jogadas" + } + }, + j_luchador = { + name = "Luchador", + text = { + "Venda esta carta para", + "desativar o", + "{C:attention}Blind de Chefe{} atual" + } + }, + j_photograph = { + name = "Fotografia", + text = { + "Primeira carta de {C:attention}realeza", + "jogada dá {X:mult,C:white} X#1# {} Multi", + "quando pontuada" + } + }, + j_gift = { + name = "Cartão Presente", + text = { + "Adiciona {C:money}$#1#{} do {C:attention}valor de venda", + "a cada {C:attention}Curinga{} e", + "a cada carta {C:attention}Consumível{} em", + "fim da rodada" + } + }, + j_turtle_bean = { + name = "Feijão Preto", + text = { + "{C:attention}+#1#{} tamanho de mão,", + "reduz por", + "{C:red}#2#{} a cada rodada" + } + }, + j_erosion = { + name = "Erosão", + text = { + "{C:red}+#1#{} Multi por cada", + "carta abaixo de {C:attention}#3#{}", + "no seu baralho completo", + "{C:inactive}(No momento {C:red}+#2#{C:inactive} Multi)" + } + }, + j_reserved_parking = { + name = "Estacionamento Reservado", + text = { + "Cada carta de {C:attention}realeza{}", + "na sua mão tem", + "uma chance de {C:green}#2# em #3#{}", + "para dar {C:money}$#1#{}" + } + }, + j_mail = { + name = "Desconto de Correio", + text = { + "Ganhe {C:money}$#1#{} por cada", + "{C:attention}#2#{} descartado, a classe", + "muda em cada rodada" + } + }, + j_to_the_moon = { + name = "Para a Lua", + text = { + "Ganhe {C:money}$#1#{} adicional de", + "{C:attention}juros{} por cada {C:money}$5{} que", + "tiver no fim da rodada" + } + }, + j_hallucination = { + name = "Alucinação", + text = { + "{C:green}#1# em #2#{} chances de criar", + "uma carta de {C:tarot}Tarô{} quando qualquer", + "{C:attention}Pacote de Reforço{} for aberto", + "{C:inactive}(Deve ter espaço)" + } + }, + j_lucky_cat = { + name = "Gato Sortudo", + text = { + "Ganha {X:mult,C:white} X#1# {} Multi cada", + "vez que uma carta {C:attention}Sortuda{}", + "é ativada {C:green}com sucesso{}", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + } + }, + j_baseball = { + name = "Carta de Beisebol", + text = { + "Curingas {C:green}Incomuns{}", + "cada um dá {X:mult,C:white} X#1# {} Multi" + } + }, + j_bull = { + name = "Touro", + text = { + "{C:chips}+#1#{} Fichas por cada", + "{C:money}dólar{} que tiver", + "{C:inactive}(No momento {C:chips}+#2#{C:inactive} Fichas)" + } + }, + j_diet_cola = { + name = "Cola Diet", + text = { + "Venda esta carta para", + "criar um(a)", + "{C:attention}#1# grátis" + } + }, + j_trading = { + name = "Carta de Troca", + text = { + "Se o {C:attention}primeiro descarte{} da rodada", + "tiver somente {C:attention}1{} carta, destrói", + "a mesma e ganha {C:money}$#1#" + } + }, + j_flash = { + name = "Carta Relâmpago", + text = { + "{C:mult}+#1#{} Multi por", + "{C:attention}atualização{} na loja", + "{C:inactive}(No momento {C:mult}+#2#{C:inactive} Multi)" + } + }, + j_popcorn = { + name = "Pipoca", + text = { + "{C:mult}+#1#{} Multi", + "{C:mult}-#2#{} Multi por", + "rodada jogada" + } + }, + j_trousers = { + name = "Calças Sobressalentes", + text = { + "Ganhe {C:mult}+#1#{} Multi se", + "a mão jogada contém", + "um(a) {C:attention}#2#", + "{C:inactive}(No momento {C:red}+#3#{C:inactive} Multi)" + } + }, + j_ancient = { + name = "Curinga Antigo", + text = { + "Cada carta jogada com", + "naipe {V:1}#2#{} dá", + "{X:mult,C:white} X#1# {} Multi ao pontuar,", + "{s:0.8}naipe muda no fim da rodada" + } + }, + j_ramen = { + name = "Lámen", + text = { + "{X:mult,C:white} X#1# {} Multi,", + "perde {X:mult,C:white} X#2# {} Multi", + "por {C:attention}carta{} descartada" + } + }, + j_walkie_talkie = { + name = "Walkie Talkie", + text = { + "Cada vez que joga {C:attention}10{} ou {C:attention}4", + "dá {C:chips}+#1#{} Fichas e", + "{C:mult}+#2#{} Multi ao pontuar" + } + }, + j_selzer = { + name = "Seltzer", + text = { + "Reativa todas as", + "cartas jogadas para as", + "próximas {C:attention}#1#{} mãos" + } + }, + j_castle = { + name = "Castelo", + text = { + "Este Curinga ganha {C:chips}+#1#{} Fichas", + "por cada carta {V:1}#2#{} descartada,", + "naipe muda em cada rodada", + "{C:inactive}(No momento {C:chips}+#3#{C:inactive} Fichas)" + } + }, + j_smiley = { + name = "Carinha Sorridente", + text = { + "Cartas de {C:attention}realeza{} jogadas", + "dão {C:mult}+#1#{} Multi", + "quando pontuadas" + } + }, + j_campfire = { + name = "Fogueira", + text = { + "Este Curinga ganha {X:mult,C:white}X#1#{} Multi", + "por cada carta {C:attention}vendida{}, redefine", + "quando o {C:attention}Blind de Chefe{} é derrotado", + "{C:inactive}(No momento {X:mult,C:white} X#2# {C:inactive} Multi)" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Estoque", + text = { + "{C:attention}+1{} espaço de carta", + "disponível na loja" + } + }, + v_clearance_sale = { + name = "Promoção", + text = { + "Todas as cartas e pacotes na", + "loja têm {C:attention}#1#%{} de desconto" + } + }, + v_tarot_merchant = { + name = "Comerciante de Tarô", + text = { + "Cartas de {C:tarot}Tarô{} aparecem", + "{C:attention}#1#X{} mais frequentemente", + "na loja" + } + }, + v_planet_merchant = { + name = "Comerciante de Planetas", + text = { + "Cartas de {C:planet}Planeta{} aparecem", + "{C:attention}#1#X{} mais frequentemente", + "na loja" + } + }, + v_hone = { + name = "Apuramento", + text = { + "Cartas {C:dark_edition}Laminadas{}, {C:dark_edition}Holográficas{} e", + "{C:dark_edition}Policromáticas{}", + "aparecem {C:attention}#1#X{} mais frequentemente" + } + }, + v_reroll_surplus = { + name = "Atualizações", + text = { + "Custo de Atualizações", + "{C:money}$#1#{} a menos" + } + }, + v_crystal_ball = { + name = "Bola de Cristal", + text = { + "{C:attention}+1{} espaço de consumível" + } + }, + v_telescope = { + name = "Telescópio", + text = { + "{C:attention}Pacotes Celestiais{} sempre", + "têm a carta de {C:planet}Planeta{}", + "para a", + "{C:attention}mão de pôquer mais jogada" + } + }, + v_grabber = { + name = "Agarrador", + text = { + "Ganha", + "permanentemente {C:blue}+#1#{} mão", + "por rodada" + } + }, + v_wasteful = { + name = "Desperdício", + text = { + "Ganha", + "permanentemente {C:red}+#1#{} descarte", + "por rodada" + } + }, + v_seed_money = { + name = "Dinheiro Inicial", + text = { + "Aumenta o limite de", + "juros adquiridos", + "por rodada para {C:money}$#1#{}" + } + }, + v_blank = { + name = "Em Branco", + text = { + "{C:inactive}Não faz nada?" + } + }, + v_magic_trick = { + name = "Truque de Mágica", + text = { + "{C:attention}Cartas de jogo{} podem", + "ser compradas", + "na {C:attention}loja" + } + }, + v_hieroglyph = { + name = "Hieróglifo", + text = { + "{C:attention}-#1#{} Na Aposta", + "{C:blue}-#1#{} mão", + "por rodada", + "{C:attention}-#1#{} Na Aposta" + } + }, + v_directors_cut = { + name = "Edição do Diretor", + text = { + "Atualiza Blind de Chefe", + "{C:attention}1{} vez por Aposta,", + "{C:money}$#1#{} por lançamento" + } + }, + v_pattern = { + name = "Padrão", + text = { + "Invoca sua carta de", + "{C:attention}Consumível{} mais usada", + "{E:1,V:1}#1#", + "{C:inactive}(Deve ter espaço)" + } + }, + v_overstock_plus = { + name = "Excesso de Estoque", + text = { + "{C:attention}+1{} espaço de carta", + "disponível na loja" + }, + unlock = { + "Gaste um total de", + "{C:money}$#1#{} na loja", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "Super Promoção", + text = { + "Todas as cartas e pacotes na", + "loja têm {C:attention}#1#%{} de desconto" + }, + unlock = { + "Resgate pelo menos", + "cartas de{C:attention}#1#{C:voucher} Cupom{}", + "em uma tentativa" + } + }, + v_tarot_tycoon = { + name = "Magnata do Tarô", + text = { + "Cartas de {C:tarot}Tarô{} aparecem", + "{C:attention}#1#X{} mais frequentemente", + "na loja" + }, + unlock = { + "Compre um total de", + "{E:1,C:attention}#1# cartas de {C:tarot}Tarô{}", + "na loja", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Magnata dos Planetas", + text = { + "Cartas de {C:planet}Planeta{} aparecem", + "{C:attention}#1#X{} mais frequentemente", + "na loja" + }, + unlock = { + "Compre um total de", + "{C:attention}#1#{C:planet} cartas de Planeta{}", + "na loja", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Brilhando", + text = { + "Cartas {C:dark_edition}Laminadas{}, {C:dark_edition}Holográficas{} e", + "{C:dark_edition}Policromáticas{}", + "aparecem {C:attention}#1#X{} mais frequentemente" + }, + unlock = { + "Tenha pelo menos {C:attention}#1#", + "cartas de {C:attention}Curinga{} com", + "edição {C:dark_edition}Laminada{}, {C:dark_edition}Holográfica{} ou", + "{C:dark_edition}Policromática{}" + } + }, + v_reroll_glut = { + name = "Excesso de Atualizações", + text = { + "Custo de Atualizações", + "{C:money}$#1#{} a menos" + }, + unlock = { + "Atualize a loja um", + "total de {C:attention}#1#{} vezes", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Globo Auspicioso", + text = { + "Cartas {C:spectral}Espectrais{} podem", + "aparecer em qualquer um", + "dos {C:attention}Pacotes Arcanos" + }, + unlock = { + "Use um total de {C:attention}#1#", + "cartas de {C:tarot}Tarô{} de qualquer", + "{C:tarot}Pacote Arcano", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Observatório", + text = { + "Cartas de {C:planet}Planeta{} na sua", + "área de {C:attention}consumíveis{} dão", + "{X:red,C:white} X#1# {} Multi pela", + "{C:attention}mão de pôquer especificada" + }, + unlock = { + "Use um total de {C:attention}#1#", + "cartas de {C:planet}Planeta{} de qualquer", + "{C:planet}Pacote Celestial", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Mão Boba", + text = { + "Ganha", + "permanentemente {C:blue}+#1#{} mão", + "por rodada" + }, + unlock = { + "Jogue um total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Reciclomancia", + text = { + "Ganha", + "permanentemente {C:red}+#1#{} descarte", + "por rodada" + }, + unlock = { + "Descarte um total", + "de {C:attention}#1#{} cartas", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Árvore de Dinheiro", + text = { + "Aumenta o limite de", + "juros adquiridos", + "por rodada para {C:money}$#1#{}" + }, + unlock = { + "Maximiza os juros", + "por lucros de rodada por", + "{C:attention}#1#{} rodadas consecutivas", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Antimatéria", + text = { + "{C:dark_edition}+1{} Espaço de Curinga" + }, + unlock = { + "Resgata {C:voucher}Em Branco{}", + "um total de {C:attention}#1#{} vezes", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Ilusão", + text = { + "{C:attention}Cartas de jogo{} na loja", + "pode ter um {C:enhanced}Aprimoramento{},", + "{C:dark_edition}Edição{} e/ou um {C:attention}Selo{}" + }, + unlock = { + "Compre um total de", + "{C:attention}#1#{} cartas de jogo", + "na loja", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Petróglifo", + unlock = { + "Alcance", + "Nível de Aposta {E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{} Na Aposta", + "{C:red}-#1#{} descarte", + "por rodada" + } + }, + v_retcon = { + name = "Refazer", + text = { + "Atualiza Blind de Chefe", + "{C:attention}ilimitadas{} vezes,", + "{C:money}$#1#{} por lançamento" + }, + unlock = { + "Descubra", + "{C:attention}#1#{} Blinds" + } + }, + v_tesselation = { + name = "Tesselação", + text = { + "Invoca sua carta de", + "{C:attention}Curinga{} mais usada", + "{E:1,V:1}#1#", + "{C:inactive}(Deve ter espaço)" + }, + unlock = { + "Compre a edição", + "{C:dark_edition}Policromática do seu", + "{C:attention}Curinga mais usado", + "na loja" + } + }, + v_palette = { + name = "Paleta", + text = { + "Tenha {C:attention}+#1#{} cartas", + "na sua mão", + "{C:attention}+#1#{} tamanho de mão" + }, + unlock = { + "Reduz o tamanho da mão", + "para {C:attention}#1#{} cartas" + } + }, + v_paint_brush = { + name = "Pincel", + text = { + "{C:attention}+#1#{} tamanho de mão" + } + } + }, + Tarot = { + c_fool = { + name = "O Tolo", + text = { + "Cria a última", + "carta de {C:tarot}Tarô{} ou {C:planet}Planeta{}", + "usada durante esta tentativa", + "{s:0.8,C:tarot}O Tolo{s:0.8} excluído" + } + }, + c_magician = { + name = "O Mago", + text = { + "Aprimora {C:attention}#1#{} carta(s)", + "selecionada para", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "A Sacerdotisa", + text = { + "Cria até {C:attention}#1#", + "cartas de {C:planet}Planeta{} aleatórias", + "{C:inactive}(Deve ter espaço)" + } + }, + c_empress = { + name = "A Imperatriz", + text = { + "Aprimora {C:attention}#1#", + "cartas selecionadas para", + "{C:attention}#2#s" + } + }, + c_emperor = { + name = "O Imperador", + text = { + "Cria até {C:attention}#1#", + "cartas de {C:tarot}Tarô{} aleatórias", + "{C:inactive}(Deve ter espaço)" + } + }, + c_heirophant = { + name = "O Hierofante", + text = { + "Aprimora {C:attention}#1#", + "cartas selecionadas para", + "{C:attention}#2#" + } + }, + c_lovers = { + name = "Os Amantes", + text = { + "Aprimora {C:attention}#1#{} carta", + "selecionada para", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "A Carruagem", + text = { + "Aprimora {C:attention}#1#{} carta", + "selecionada para", + "{C:attention}#2#" + } + }, + c_justice = { + name = "Justiça", + text = { + "Aprimora {C:attention}#1#{} carta", + "selecionada para", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "O Eremita", + text = { + "Duplica o dinheiro", + "{C:inactive}(Máximo de {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "A Roda da Fortuna", + text = { + "Chance de {C:green}#1# em #2#{} de adicionar", + "edição {C:dark_edition}Laminada{}, {C:dark_edition}Holográfica{} ou", + "{C:dark_edition}Policromática{}", + "a um {C:attention}Curinga aleatório" + } + }, + c_strength = { + name = "Força", + text = { + "Aumenta a classe de", + "até {C:attention}#1#{} cartas", + "selecionadas em {C:attention}1" + } + }, + c_hanged_man = { + name = "O Enforcado", + text = { + "Destrói até", + "{C:attention}#1#{} cartas selecionadas" + } + }, + c_death = { + name = "Morte", + text = { + "Selecione {C:attention}#1#{} cartas,", + "converta a carta da {C:attention}esquerda{}", + "na carta da {C:attention}direita{}", + "{C:inactive}(Arraste para reorganizar)" + } + }, + c_temperance = { + name = "Temperança", + text = { + "Dá o valor total", + "de venda de todos os", + "Curingas atuais {C:inactive}(Máximo de {C:money}$#1#{C:inactive})", + "{C:inactive}(No momento {C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "O Demônio", + text = { + "Aprimora {C:attention}#1#{} a carta(s)", + "selecionada para", + "{C:attention}#2#" + } + }, + c_tower = { + name = "A Torre", + text = { + "Aprimora {C:attention}#1#{} carta", + "selecionada para", + "{C:attention}#2#" + } + }, + c_star = { + name = "A Estrela", + text = { + "Converte até", + "{C:attention}#1#{} cartas selecionadas", + "para {V:1}#2#{}" + } + }, + c_moon = { + name = "A Lua", + text = { + "Converte até", + "{C:attention}#1#{} cartas selecionadas", + "para {V:1}#2#{}" + } + }, + c_sun = { + name = "O Sol", + text = { + "Converte até", + "{C:attention}#1#{} cartas selecionadas", + "para {V:1}#2#{}" + } + }, + c_judgement = { + name = "Julgamento", + text = { + "Cria uma", + "carta {C:attention}Curinga{} aleatória", + "{C:inactive}(Deve ter espaço)" + } + }, + c_world = { + name = "O Mundo", + text = { + "Converte até", + "{C:attention}#1#{} cartas selecionadas", + "para {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Mercúrio", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_venus = { + name = "Vênus", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_earth = { + name = "Terra", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_mars = { + name = "Marte", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_jupiter = { + name = "Júpiter", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_saturn = { + name = "Saturno", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_uranus = { + name = "Urano", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_neptune = { + name = "Neptuno", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_pluto = { + name = "Plutão", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_ceres = { + name = "Ceres", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_planet_x = { + name = "Planeta X", + text = { + "{S:0.8}({S:0.8,V:1}nv.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + }, + c_eris = { + name = "Eris", + text = { + "{S:0.8}({S:0.8,V:1}nvl.#1#{S:0.8}){} Subida de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Multi e", + "{C:chips}+#4#{} fichas" + } + } + }, + Spectral = { + c_familiar = { + name = "Familiar", + text = { + "Destrói {C:attention}1{} carta", + "na sua mão, adiciona", + "{C:attention}#1#{} {C:attention}realeza Aprimorada", + "{C:attention}aleatórias{} à sua mão" + } + }, + c_grim = { + name = "Sombrio", + text = { + "Destrói {C:attention}1{} carta", + "aleatória na sua mão,", + "adiciona {C:attention}#1#{} {C:attention}realeza aprimorada aleatória", + "{C:attention}Ases{} aleatórios na sua mão" + } + }, + c_incantation = { + name = "Encantamento", + text = { + "Destrói {C:attention}1{} carta", + "na sua mão, adiciona {C:attention}#1#", + "{C:attention}cartas Aprimoradas e numeradas", + "{C:attention}aleatórias{} à sua mão" + } + }, + c_talisman = { + name = "Talismã", + text = { + "Adiciona um {C:attention}Selo Dourado{}", + "a {C:attention}1{} carta", + "aleatória na sua mão" + } + }, + c_aura = { + name = "Aura", + text = { + "Adiciona o efeito {C:dark_edition}Laminado{}, {C:dark_edition}Holográfico{}", + "ou {C:dark_edition}Policromático{} a", + "{C:attention}1{} carta selecionada na sua mão" + } + }, + c_wraith = { + name = "Espectro", + text = { + "Cria um", + "{C:attention}Curinga{} {C:red}Raro,", + "define o dinheiro para {C:money}$0" + } + }, + c_sigil = { + name = "Símbolo", + text = { + "Converte todas as cartas", + "da mão em um único", + "{C:attention}naipe aleatório" + } + }, + c_ouija = { + name = "Ouija", + text = { + "Converte todas as cartas", + "da mão em uma única", + "{C:attention}classe aleatória", + "{C:red}-1{} de tamanho de mão" + } + }, + c_ectoplasm = { + name = "Ectoplasma", + text = { + "Adiciona {C:dark_edition}Negativo{} a", + "um {C:attention}Curinga aleatório,", + "{C:red}-1{} de tamanho de mão" + } + }, + c_immolate = { + name = "Imolação", + text = { + "Destrói {C:attention}#1#{} cartas", + "aleatórias na mão,", + "ganha {C:money}$#2#" + } + }, + c_soul = { + name = "A Alma", + text = { + "Cria um", + "Curinga {C:legendary,E:1}Lendário{}", + "{C:inactive}(Deve ter espaço)" + } + }, + c_black_hole = { + name = "Buraco Negro", + text = { + "Melhora cada", + "{C:legendary,E:1}mão de pôquer", + "em {C:attention}1{} nível" + } + }, + c_ankh = { + name = "Ankh", + text = { + "Cria uma cópia de um", + "{C:attention}Curinga{} aleatório, destrói", + "todos os outros Curingas" + } + }, + c_deja_vu = { + name = "Déjà vu", + text = { + "Adiciona um {C:red}Selo Vermelho{}", + "a {C:attention}1{} carta selecionada", + "na sua mão" + } + }, + c_hex = { + name = "Feitiço", + text = { + "Adiciona {C:dark_edition}Policromático{} a um", + "{C:attention}Curinga{} aleatório, destrói", + "todos os outros Curingas" + } + }, + c_trance = { + name = "Transe", + text = { + "Adiciona um {C:blue}Selo Azul{}", + "a {C:attention}1{} carta selecionada", + "na sua mão" + } + }, + c_medium = { + name = "Médium", + text = { + "Adiciona um {C:purple}Selo Roxo{}", + "a {C:attention}1{} carta selecionada", + "na sua mão" + } + }, + c_cryptid = { + name = "Criptídeo", + text = { + "Cria {C:attention}#1#{} cópias de", + "{C:attention}1{} carta selecionada", + "na sua mão" + } + } + }, + Edition = { + e_base = { + name = "Base", + text = { + "Nenhum efeito adicional" + } + }, + e_foil = { + name = "Laminado", + text = { + "{C:chips}+#1#{} fichas" + } + }, + e_holo = { + name = "Holográfico", + text = { + "{C:mult}+#1#{} Multi" + } + }, + e_polychrome = { + name = "Policromático", + text = { + "{X:mult,C:white} X#1# {} Multi" + } + }, + e_negative = { + name = "Negativo", + text = { + "{C:dark_edition}+#1#{} espaço(s) de Curinga" + } + }, + e_negative_consumable = { + name = "Negativo", + text = { + "{C:dark_edition}+#1#{} espaço(s) de consumível" + } + } + }, + Enhanced = { + m_bonus = { + name = "Carta Bônus", + text = {} + }, + m_mult = { + name = "Carta Multi", + text = { + "{C:mult}+#1#{} Multi" + } + }, + m_wild = { + name = "Carta Curinga", + text = { + "Pode ser usada", + "como qualquer naipe" + } + }, + m_glass = { + name = "Carta de Vidro", + text = { + "{X:mult,C:white} X#1# {} Multi", + "Chance de {C:green}#2# em #3#{} de", + "destruir carta" + } + }, + m_steel = { + name = "Carta de Aço", + text = { + "{X:mult,C:white} X#1# {} Multi", + "enquanto esta carta", + "permanece na mão" + } + }, + m_stone = { + name = "Carta de Pedra", + text = { + "{C:chips}+#1#{} Fichas", + "sem classe ou naipe" + } + }, + m_gold = { + name = "Carta Dourada", + text = { + "{C:money}$#1#{} se esta", + "carta estiver na mão", + "no fim da rodada" + } + }, + m_lucky = { + name = "Carta Sortuda", + text = { + "Chance de {C:green}#1# em #3#{}", + "de {C:mult}+#2#{} Multi", + "Chance de {C:green}#1# em #5#{}", + "para ganhar {C:money}$#4#" + } + } + }, + Stake = { + stake_white = { + name = "Aposta Branca", + text = { + "Dificuldade Base" + } + }, + stake_red = { + name = "Aposta Vermelha", + text = { + "{C:attention}Small Blind{} não dá", + "recompensas em dinheiro", + "{s:0.8}Aplica todas as Apostas anteriores" + } + }, + stake_green = { + name = "Aposta Verde", + text = { + "A pontuação necessária escala", + "cada vez mais rapidamente com cada {C:attention}Aposta", + "{s:0.8}Aplica todas as Apostas anteriores" + } + }, + stake_blue = { + name = "Aposta Azul", + text = { + "{C:red}-1{} Descarte", + "{s:0.8}Aplica todas as Apostas anteriores" + } + }, + stake_black = { + name = "Aposta Negra", + text = { + "A loja pode ter Curingas {C:attention}Eternos{}", + "{C:inactive,s:0.8}{Não é possível vender ou destruir}", + "{s:0.8}Aplica todas as Apostas anteriores" + } + }, + stake_purple = { + name = "Aposta Roxa", + text = { + "A pontuação necessária escala", + "cada vez mais rapidamente com cada {C:attention}Aposta", + "{s:0.8}Aplica todas as Apostas anteriores" + } + }, + stake_orange = { + name = "Aposta Laranja", + text = { + "{C:attention}Pacotes de Reforço{} custam", + "mais {C:money}1${} por Aposta", + "{s:0.8}Aplica todas as Apostas anteriores" + } + }, + stake_gold = { + name = "Aposta Dourada", + text = { + "{C:red}-1{} tamanho de mão", + "{s:0.8}Aplica todas as Apostas anteriores" + } + } + }, + Tag = { + tag_uncommon = { + name = "Marca Incomum", + text = { + "A loja tem um", + "{C:green}Curinga Incomum" + } + }, + tag_rare = { + name = "Marca Rara", + text = { + "A loja tem um", + "{C:red}Curinga Raro" + } + }, + tag_negative = { + name = "Marca Negativa", + text = { + "A loja tem um", + "{C:dark_edition}Curinga Negativo" + } + }, + tag_foil = { + name = "Marca Laminada", + text = { + "A loja tem um", + "{C:dark_edition}Curinga Laminado" + } + }, + tag_holo = { + name = "Marca Holográfica", + text = { + "A loja tem um", + "{C:dark_edition}Curinga Holográfico" + } + }, + tag_polychrome = { + name = "Marca Policromática", + text = { + "A loja tem um", + "{C:dark_edition}Curinga Policromático" + } + }, + tag_investment = { + name = "Marca de Investimento", + text = { + "Após derrotar", + "o Blind de Chefe,", + "ganhe {C:money}$#1#" + } + }, + tag_voucher = { + name = "Marca de Cupom", + text = { + "Adiciona um {C:voucher}Cupom", + "à próxima loja" + } + }, + tag_boss = { + name = "Marca de Chefe", + text = { + "Atualiza o", + "{C:attention}Blind de Chefe" + } + }, + tag_standard = { + name = "Marca Padrão", + text = { + "Oferece gratuitamente um", + "{C:attention}Pacote Padrão Mega" + } + }, + tag_charm = { + name = "Marca de Amuleto", + text = { + "Oferece gratuitamente um", + "{C:tarot}Pacote Arcano Mega" + } + }, + tag_meteor = { + name = "Marca de Meteoro", + text = { + "Oferece gratuitamente um", + "{C:planet}Pacote Celestial Mega" + } + }, + tag_buffoon = { + name = "Marca de Bobão", + text = { + "Oferece gratuitamente um", + "{C:attention}Pacote Bobão" + } + }, + tag_handy = { + name = "Marca Útil", + text = { + "Dá {C:money}$#1#{} por", + "{C:blue}mão{} jogada nesta rodada", + "{C:inactive}(Dará {C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "Marca de Lixo", + text = { + "Dá {C:money}$#1#{} por", + "{C:red}descarte{} não usado nesta rodada", + "{C:inactive}(Dará {C:money}$#2#{C:inactive})" + } + }, + tag_coupon = { + name = "Marca de Cupom", + text = { + "Cartas iniciais e", + "pacotes de reforço na próxima", + "loja ficam gratuitos" + } + }, + tag_double = { + name = "Marca Dupla", + text = { + "Oferece uma cópia da", + "próxima {C:attention}Marca{} selecionada", + "{s:0.8,C:attention}Marca Dupla{s:0.8} excluída" + } + }, + tag_juggle = { + name = "Marca de Malabarismo", + text = { + "{C:attention}+#1#{} tamanho de mão", + "próxima rodada" + } + }, + tag_d_six = { + name = "Marca D6", + text = { + "Atualização na próxima loja", + "começa em {C:money}0$" + } + }, + tag_top_up = { + name = "Marca de Abastecimento", + text = { + "Cria até {C:attention}#1#", + "Curingas {C:blue}Comuns{}", + "{C:inactive}(Deve ter espaço)" + } + }, + tag_skip = { + name = "Marca Veloz", + text = { + "Dá {C:money}$#1#{} por", + "Blind ignorado nesta tentativa", + "{C:inactive}(Dará {C:money}$#2#{C:inactive})" + } + }, + tag_orbital = { + name = "Marca Orbital", + text = { + "Melhora {C:attention}#1#", + "em {C:attention}#2# níveis" + } + }, + tag_economy = { + name = "Marca Econômica", + text = { + "Duplica o seu dinheiro", + "{C:inactive}(Máximo de {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "Marca Etérea", + text = { + "Oferece gratuitamente um", + "{C:planet}Pacote Espectral" + } + } + }, + Blind = { + bl_small = { + name = "Small Blind", + text = {} + }, + bl_big = { + name = "Big Blind", + text = {} + }, + bl_hook = { + name = "O Gancho", + text = { + "Descarta 2 cartas", + "aleatórias por mão jogada" + } + }, + bl_wall = { + name = "O Muro", + text = { + "Blind ainda maior" + } + }, + bl_wheel = { + name = "A Roda", + text = { + " em 7 cartas são", + "compradas viradas para baixo" + } + }, + bl_arm = { + name = "O Braço", + text = { + "Reduz o nível da", + "mão de pôquer jogada" + } + }, + bl_psychic = { + name = "O Psíquico", + text = { + "Deve jogar 5 cartas" + } + }, + bl_goad = { + name = "Aguilhão", + text = { + "Todas as cartas de Espadas", + "recebem desvantagem" + } + }, + bl_water = { + name = "A Água", + text = { + "Inicia com", + "0 descartes" + } + }, + bl_eye = { + name = "O Olho", + text = { + "Nenhum tipo de", + "mão repetida nesta rodada" + } + }, + bl_mouth = { + name = "A Boca", + text = { + "Jogue só 1 tipo", + "de mão nesta rodada" + } + }, + bl_plant = { + name = "A Planta", + text = { + "Todas as cartas de Realeza", + "recebem desvantagem" + } + }, + bl_needle = { + name = "A Agulha", + text = { + "Jogue somente 1 tipo" + } + }, + bl_head = { + name = "A Cabeça", + text = { + "Todas as cartas de Copas", + "recebem desvantagem" + } + }, + bl_tooth = { + name = "O Dente", + text = { + "Perde 1$ por", + "jogada" + } + }, + bl_final_leaf = { + name = "Folha Verdejante", + text = { + "Todas as cartas têm desvantagem", + "até 1 Curinga ser vendido" + } + }, + bl_final_vessel = { + name = "Recipiente Roxo", + text = { + "Blind muito grande" + } + }, + bl_ox = { + name = "O Touro", + text = { + "Jogar #1#", + "define o dinheiro para $0" + } + }, + bl_house = { + name = "A Casa", + text = { + "A primeira mão é", + "comprada virada para baixo" + } + }, + bl_club = { + name = "Paulada", + text = { + "Todas as cartas de Paus", + "recebem desvantagem" + } + }, + bl_fish = { + name = "O Peixe", + text = { + "Cartas compradas viradas para baixo", + "após cada mão jogada" + } + }, + bl_window = { + name = "A Janela", + text = { + "Todas as cartas de Ouros", + "recebem desvantagem" + } + }, + bl_manacle = { + name = "As Algemas", + text = { + "-1 de tamanho de mão" + } + }, + bl_serpent = { + name = "A Serpente", + text = { + "Após Jogar ou Descartar,", + "sempre compre 3 cartas" + } + }, + bl_pillar = { + name = "O Pilar", + text = { + "Cartas jogadas antes", + "desta Aposta recebem desvantagem" + } + }, + bl_flint = { + name = "A Pederneira", + text = { + "Fichas Básicas e", + "Multi são reduzidas pela metade" + } + }, + bl_mark = { + name = "A Marca", + text = { + "Todas as cartas de Realeza são", + "compradas viradas para baixo" + } + }, + bl_final_acorn = { + name = "Semente Dourada", + text = { + "Vira e embaralha", + "todas as cartas Curinga" + } + }, + bl_final_heart = { + name = "Coração Rubro", + text = { + "Um Curinga aleatório", + "desativado em cada mão" + } + }, + bl_final_bell = { + name = "Sino Cerúleo", + text = { + "Obriga 1 carta a", + "sempre ser selecionada" + } + } + }, + Back = { + b_red = { + name = "Baralho Vermelho", + text = { + "{C:red}+#1#{} descarte", + "em cada rodada" + } + }, + b_blue = { + name = "Baralho Azul", + text = { + "{C:blue}+#1#{} mão", + "em cada rodada" + } + }, + b_yellow = { + name = "Baralho Amarelo", + text = { + "Inicia com", + "mais {C:money}$#1#" + } + }, + b_green = { + name = "Baralho Verde", + text = { + "No fim de cada Rodada:", + "{C:money}$#1#{s:0.85} por {C:blue}Mão restante", + "{C:money}$#2#{s:0.85} por {C:red}Descarte restante", + "Sem {C:attention}Juros" + } + }, + b_black = { + name = "Baralho Preto", + text = { + "{C:attention}+#1#{} Espaço de Curinga", + "", + "{C:blue}-#2#{} mão", + "em cada rodada" + } + }, + b_magic = { + name = "Baralho Mágico", + text = { + "Comece a tentativa com o", + "cupom de {C:tarot,T:v_crystal_ball}#1#{}", + "e {C:attention}2{} cópias", + "de {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Baralho de Nebulosa", + text = { + "Comece a tentativa com o", + "cupom de {C:planet,T:v_telescope}#1#{}", + "", + "{C:red}#2#{} espaço(s) de consumível" + } + }, + b_metal = { + name = "Baralho de Metal", + text = { + "Comece a tentativa com {C:attention}#1#", + "cartas de jogo aprimoradas", + "para {C:attention}Cartas de Aço" + } + }, + b_abandoned = { + name = "Baralho Abandonado", + text = { + "Comece a tentativa", + "sem {C:attention}Cartas de Realeza", + "no seu baralho" + } + }, + b_checkered = { + name = "Baralho Xadrez", + text = { + "Comece a tentativa com", + "{C:attention}26{C:spades} Espadas{} e", + "{C:attention}26{C:hearts} Copas{} no baralho" + } + }, + b_rocky = { + name = "Baralho Duro", + text = { + "Comece a tentativa com {C:attention}#1#", + "mais {C:attention}Cartas de Pedra" + } + }, + b_braided = { + name = "Baralho Entrelaçado", + text = { + "Primeira mão jogada", + "melhorada para o {C:attention}Nvl. 3" + } + }, + b_anaglyph = { + name = "Baralho Anáglifo", + text = { + "Após derrotar cada", + "{C:attention}Blind de Chefe{}, ganhe", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "Baralho de Plasma", + text = { + "Equilibre {C:blue}Fichas{} e", + "{C:red}Multi{} ao calcular a", + "pontuação para a mão preferida", + "{C:red}X#1#{} de tamanho base do Blind" + } + }, + b_erratic = { + name = "Baralho Errático", + text = { + "Todas as {C:attention}Classes{} e", + "{C:attention}Naipes{} no baralho", + "são aleatórios" + } + }, + b_challenge = { + name = "Baralho Desafiante", + text = { + "" + } + }, + b_ghost = { + name = "Baralho Fantasma", + text = { + "Cartas {C:spectral}Espectrais{} podem", + "aparecer na loja,", + "comece com uma carta de {C:spectral,T:c_hex}Feitiço{}" + } + }, + b_zodiac = { + name = "Baralho do Zodíaco", + text = { + "Comece a tentativa com", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planeta,T:v_planet_merchant}#2#{},", + "e {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Baralho Pintado", + text = { + "{C:attention}+#1#{} tamanho de mão", + "{C:red}#2#{} espaço de Curinga" + } + } + }, + Other = { + gold_seal = { + name = "Selo Dourado", + text = { + "Ganhe {C:money}$3{} quando esta", + "carta é jogada", + "e pontua a" + } + }, + white_sticker = { + name = "Adesivo Branco", + text = { + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Branca{}" + } + }, + red_sticker = { + name = "Adesivo Vermelho", + text = { + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Vermelha{}" + } + }, + green_sticker = { + name = "Adesivo Verde", + text = { + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Verde{}" + } + }, + blue_sticker = { + name = "Adesivo Azul", + text = { + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Azul{}" + } + }, + black_sticker = { + name = "Adesivo Preto", + text = { + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Preta{}" + } + }, + purple_sticker = { + name = "Adesivo Roxo", + text = { + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Roxa{}" + } + }, + orange_sticker = { + name = "Adesivo Laranja", + text = { + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta Laranja{}" + } + }, + gold_sticker = { + name = "Adesivo Dourado", + text = { + "Usou este Curinga", + "para vencer na dificuldade", + "{C:attention}Aposta de Ouro{}" + } + }, + playing_card = { + text = { + "{C:light_black}#1# de {V:1}#2#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} fichas" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1#{} fichas adicionais" + } + }, + locked = { + name = "Bloqueada", + text = {} + }, + debuffed_default = { + name = "Com desvantagem", + text = { + "Todas as habilidades", + "são desativadas" + } + }, + debuffed_playing_card = { + name = "Com desvantagem", + text = { + "Não pontua fichas", + "e todas as habilidades", + "são desativadas" + } + }, + demo_locked = { + name = "Bloqueada", + text = { + "Não disponível", + "neste demo" + } + }, + demo_shop_locked = { + name = "Bloqueada", + text = { + "Carta da coleção", + "pessoal do {C:attention}Jimbo", + "disponível na versão", + "completa de {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Bloqueada", + text = { + "Em", + "construção" + } + }, + deck_locked_win = { + name = "Bloqueada", + text = { + "Vença uma tentativa com", + "{C:attention}#1#{}", + "em qualquer dificuldade" + } + }, + deck_locked_discover = { + name = "Bloqueada", + text = { + "Descubra pelo menos", + "{C:attention}#1#{} itens da", + "sua coleção" + } + }, + deck_locked_stake = { + name = "Bloqueada", + text = { + "Vença uma tentativa com qualquer", + "baralho pelo menos na", + "dificuldade {V:1}#1#{}" + } + }, + joker_locked_legendary = { + name = "Bloqueada", + text = { + "Encontre este Curinga", + "através da carta de {C:spectral}Alma{}" + } + }, + undiscovered_joker = { + name = "Não descoberto", + text = { + "Compre ou use", + "esta carta em uma", + "tentativa sem código", + "para descobrir o que ela faz" + } + }, + undiscovered_tarot = { + name = "Não descoberto", + text = { + "Compre ou use", + "esta carta em uma", + "tentativa sem código", + "para descobrir o que ela faz" + } + }, + undiscovered_planet = { + name = "Não descoberto", + text = { + "Compre ou use", + "esta carta em uma", + "tentativa sem código", + "para descobrir o que ela faz" + } + }, + undiscovered_spectral = { + name = "Não descoberto", + text = { + "Compre ou use", + "esta carta em uma", + "tentativa sem código", + "para descobrir o que ela faz" + } + }, + undiscovered_voucher = { + name = "Não descoberto", + text = { + "Resgate este", + "cupom em uma", + "tentativa sem código", + "para descobrir o que ele faz" + } + }, + undiscovered_booster = { + name = "Não descoberto", + text = { + "Abra este pacote", + "em uma tentativa sem código", + "para descobrir o que ele faz" + } + }, + undiscovered_edition = { + name = "Não descoberto", + text = { + "Encontre esta edição", + "em uma tentativa sem código", + "para descobrir o que ela faz" + } + }, + undiscovered_tag = { + name = "Não descoberto", + text = { + "Use esta marca em", + "uma tentativa sem código", + "para descobrir o que ela faz" + } + }, + p_arcana_normal = { + name = "Pacote Arcano", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:tarot} cartas de Tarô{} para", + "serem usadas imediatamente" + } + }, + p_arcana_jumbo = { + name = "Pacote Arcano Jumbo", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:tarot} cartas de Tarô{} para", + "serem usadas imediatamente" + } + }, + p_arcana_mega = { + name = "Pacote Arcano Mega", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:tarot} cartas de Tarô{} para", + "serem usadas imediatamente" + } + }, + p_celestial_normal = { + name = "Pacote Celestial", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:planet} cartas de Planeta{} para", + "serem usadas imediatamente" + } + }, + p_celestial_jumbo = { + name = "Pacote Celestial Jumbo", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:planet} cartas de Planeta{} para", + "serem usadas imediatamente" + } + }, + p_celestial_mega = { + name = "Pacote Celestial Mega", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:planet} cartas de Planeta{} para", + "serem usadas imediatamente" + } + }, + p_spectral_normal = { + name = "Pacote Espectral", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:spectral} cartas Espectrais{} para", + "serem usadas imediatamente" + } + }, + p_spectral_jumbo = { + name = "Pacote Espectral Jumbo", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:spectral} cartas Espectrais{} para", + "serem usadas imediatamente" + } + }, + p_spectral_mega = { + name = "Pacote Espectral Mega", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:spectral} cartas Espectrais{} para", + "serem usadas imediatamente" + } + }, + p_standard_normal = { + name = "Pacote Padrão", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:attention} cartas de Jogo{} para", + "serem adicionadas ao seu baralho" + } + }, + p_standard_jumbo = { + name = "Pacote Padrão Jumbo", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:attention} cartas de Jogo{} para", + "serem adicionadas ao seu baralho" + } + }, + p_standard_mega = { + name = "Pacote Padrão Mega", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:attention} cartas de Jogo{} para", + "serem adicionadas ao seu baralho" + } + }, + p_buffoon_normal = { + name = "Pacote Bobão", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:joker} cartas Curinga{}" + } + }, + p_buffoon_jumbo = { + name = "Pacote Bobão Jumbo", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:joker} cartas Curinga{}" + } + }, + p_buffoon_mega = { + name = "Pacote Bobão Mega", + text = { + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2#{C:joker} cartas Curinga{}" + } + }, + pinned_left = { + name = "Encurralado", + text = { + "Este Curinga permanece", + "encurralado na", + "posição mais à esquerda" + } + }, + red_seal = { + name = "Selo Vermelho", + text = { + "Reativa esta", + "carta {C:attention}1{} vez" + } + }, + blue_seal = { + name = "Selo Azul", + text = { + "Cria uma carta de {C:planet}Planeta{}", + "se a carta estiver {C:attention}presente{} em", + "mão no fim da rodada" + } + }, + purple_seal = { + name = "Selo Roxo", + text = { + "Cria uma carta {C:tarot}Tarô{}", + "quando {C:attention}descartada", + "{C:inactive}(Deve ter espaço)" + } + }, + eternal = { + name = "Eterna", + text = { + "Não é possível vender", + "ou destruir" + } + }, + challenge_locked = { + name = "Bloqueado", + text = { + "Vença uma tentativa com pelo menos", + "#1# baralhos diferentes para desbloquear", + "Modo Desafio", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Espadas", + Hearts = "Copas", + Clubs = "Paus", + Diamonds = "Ouros" + }, + suits_plural = { + Spades = "Espadas", + Hearts = "Copas", + Clubs = "Paus", + Diamonds = "Ouros" + }, + blind_states = { + Select = "Selecionar", + Skipped = "Ignorado", + Current = "Atual", + Defeated = "Derrotado", + Upcoming = "Próximo", + Selected = "Selecionado" + }, + ranks = { + Ace = "Ás", + King = "Rei", + Queen = "Dama", + Jack = "Valete", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Melhor Mão", + furthest_round = "Rodada Mais Alta", + furthest_ante = "Aposta Mais Alta", + most_money = "Maior Quantidade de Dinheiro", + boss_streak = "Maior Número de Chefes Consecutivos", + collection = "Coleção", + win_streak = "Melhor Sequência de Vitórias", + current_streak = "", + poker_hand = "Mão Mais Jogada" + }, + poker_hands = { + ['Flush House'] = "Flush House", + ['Five of a Kind'] = "Five of a Kind", + ['Royal Flush'] = "Royal Flush", + ['Straight Flush'] = "Straight Flush", + ['Four of a Kind'] = "Quadra", + ['Full House'] = "Full House", + ['Flush'] = "Flush", + ['Straight'] = "Sequência", + ['Three of a Kind'] = "Trinca", + ['Two Pair'] = "Dois Pares", + ['Pair'] = "Par", + ['High Card'] = "Carta Alta", + ['Flush Five'] = "Flush Five" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "Uma Trinca e um Par com", + "todas as cartas tendo o mesmo naipe" + }, + ['Five of a Kind'] = { + "5 cartas com a mesma classe" + }, + ['Royal Flush'] = { + "5 cartas em sequência {classes consecutivas} com", + "todas as cartas tendo o mesmo naipe" + }, + ['Straight Flush'] = { + "5 cartas em sequência {classes consecutivas} com", + "todas as cartas tendo o mesmo naipe" + }, + ['Four of a Kind'] = { + "4 cartas com a mesma classe. Elas podem", + "ser jogadas com 1 outra carta não pontuada" + }, + ['Full House'] = { + "Uma Trinca e um Par" + }, + ['Flush'] = { + "5 cartas com o mesmo naipe" + }, + ['Straight'] = { + "5 cartas em jogada {classes consecutivas}" + }, + ['Three of a Kind'] = { + "3 cartas com a mesma classe. Elas podem ser", + "jogadas com até 2 outras cartas não pontuadas" + }, + ['Two Pair'] = { + "2 pares de cartas com classes diferentes, podem", + "ser jogadas com 1 outra carta não pontuada" + }, + ['Pair'] = { + "2 cartas com a mesma classe. Elas podem", + "ser jogadas com até 3 outras cartas não pontuadas" + }, + ['High Card'] = { + "Se a mão jogada não for uma das mãos", + "acima, somente as cartas de classe mais alta pontuarão" + }, + ['Flush Five'] = { + "5 cartas com a mesma classe e naipe" + } + }, + labels = { + common = "Comum", + uncommon = "Incomum", + rare = "Raro", + legendary = "Lendário", + tarot = "Tarô", + planet = "Planeta", + pluto_planet = "Planeta Anão", + voucher = "Cupom", + foil = "Laminado", + holographic = "Holográfico", + polychrome = "Policromático", + negative = "Negativo", + gold_seal = "Selo Dourado", + locked = "Bloqueada", + blue_seal = "Selo Azul", + red_seal = "Selo Vermelho", + purple_seal = "Selo Roxo", + eternal = "Eterna", + pinned_left = "Encurralada" + }, + dictionary = { + b_sell = "VENDER", + b_use = "USAR", + b_select = "SELECIONAR", + b_buy = "COMPRAR", + b_redeem = "RESGATAR", + b_open = "ABRIR", + b_and_use = "E USAR", + b_next_round_1 = "Próxima", + b_next_round_2 = "Rodada", + b_play_hand = "Jogar mão", + b_discard = "Descartar", + b_sort_hand = "Organizar Mão", + b_run_info_1 = "Tentativa", + b_run_info_2 = "Informações", + b_options = "Opções", + b_reroll_boss = "Atualizar Chefe", + b_skip_blind = "Ignorar Blind", + b_skip_reward = "Ignorar Recompensa", + b_skip = "Ignorar", + b_start_new_run = "Nova Tentativa", + b_main_menu = "Menu Principal", + b_collection = "Coleção", + b_seed = "Código", + b_copy_seed = "Copiar Código", + b_credits = "Créditos", + b_stats = "Estatísticas", + b_settings = "Configurações", + b_set_game = "Jogo", + b_set_video = "Vídeo", + b_set_graphics = "Gráficos", + b_set_audio = "Áudio", + b_set_gamespeed = "Velocidade de Jogo", + b_set_play_discard_pos = "Posição do Botão Jogar/Descartar", + b_set_screenshake = "Vibração da Tela", + b_set_crash_reports = "Relatórios de Falha", + b_set_monitor = "Monitor de Exibição", + b_set_windowmode = "Modo Janela", + b_set_apply = "Aplicar", + b_set_master_vol = "Volume Principal", + b_set_music_vol = "Volume da Música", + b_set_game_vol = "Volume do Jogo", + b_set_shadows = "Sombras", + b_set_pixel_smoothing = "Filtro de Pixel Art", + b_set_CRT = "CRT", + b_set_CRT_bloom = "Brilho CRT", + b_stat_jokers = "Curingas", + b_stat_consumables = "Consumíveis", + b_stat_tarots = "Tarôs", + b_stat_planets = "Planetas", + b_stat_spectrals = "Espectrais", + b_stat_vouchers = "Cupons", + b_next = "Próxima", + b_endless = "Modo Infinito", + b_wishlist = "Adicionar à lista de desejos da Steam", + b_playbalatro = "Visite playbalatro.com", + b_remaining = "Restante(s)", + b_full_deck = "Baralho Completo", + b_poker_hands = "Mãos de Pôquer", + b_blinds = "Blinds", + b_vouchers = "Cupons", + b_stake = "Aposta", + b_jokers = "Curingas", + b_tarot_cards = "Cartas de Tarô", + b_planet_cards = "Cartas de Planeta", + b_spectral_cards = "Cartas Espectrais", + b_enhanced_cards = "Cartas Aprimoradas", + b_editions = "Edições", + b_booster_packs = "Pacotes de Reforço", + b_tags = "Marcas", + b_decks = "Baralhos", + b_continue = "Continuar", + b_back = "Voltar", + b_music = "Música", + b_sounds = "Sons", + b_imagery = "Exibição", + b_new_run = "Nova Tentativa", + b_challenges = "Desafios", + b_current_profile = "Perfil Atual", + b_load_profile = "Carregar Perfil", + b_create_profile = "Criar Perfil", + b_delete_profile = "Eliminar Perfil", + b_reset_profile = "Redefinir Perfil", + b_rules = "Regras", + b_restrictions = "Restrições", + b_deck = "Baralho", + b_play_cap = "JOGAR", + b_options_cap = "OPÇÕES", + b_collection_cap = "COLEÇÃO", + b_quit_cap = "SAIR", + b_cash_out = "Pegar a Grana", + k_unknown = "?????", + k_compatible = "compatível", + k_incompatible = "incompatível", + k_round = "Rodada", + k_ante = "Aposta", + k_seed = "Código", + k_reroll = "Atualizar", + k_mult = "Multi", + k_rank = "Classe", + k_suit = "Naipe", + k_stake = "Aposta", + k_common = "Comum", + k_uncommon = "Incomum", + k_rare = "Raro", + k_legendary = "Lendário", + k_debuffed = "Com desvantagem", + k_locked = "Bloqueada", + k_undisovered = "Não Descoberto", + k_joker = "Curinga", + k_voucher = "Cupom", + k_tarot = "Tarô", + k_planet = "Planeta", + k_dwarf_planet = "Planeta Anão", + k_planet_q = "Planeta?", + k_spectral = "Espectral", + k_booster = "Reforço", + k_edition = "Edição", + k_hud_hands = "Mãos", + k_hud_discards = "Descartes", + k_lower_score = "pontuação", + k_arcana_pack = "Pacote Arcano", + k_celestial_pack = "Pacote Celestial", + k_spectral_pack = "Pacote Espectral", + k_standard_pack = "Pacote Padrão", + k_buffoon_pack = "Pacote Bobão", + k_enter_text = "Inserir Texto", + k_defeated_by = "Derrotado por", + k_level_prefix = "nv.", + k_also_applied = "Também aplicado", + k_base_cards = "Cartas base", + k_effective = "Funcional:", + k_aces = "Ases", + k_face_cards = "Cartas de Realeza", + k_numbered_cards = "Cartas Numeradas", + k_cap_consumables = "CONSUMÍVEIS", + k_page = "Página", + k_ante_cap = "APOSTA", + k_base_cap = "BASE", + k_jokers_cap = "CURINGAS", + k_vouchers_cap = "CUPONS", + k_x_base = "Base X", + k_not_discovered = "Não descoberto", + k_unlocked_ex = "Desbloqueado!", + k_challenge_mode = "Modo Desafio", + k_daily_run = "Tentativa Diária", + k_profile = "Perfil", + k_wins = "Vitórias", + k_empty_caps = "VAZIO", + k_collection = "Coleção", + k_stake_level = "Nível de Aposta", + k_none = "Nada", + k_game_modifiers = "Modificadores de Jogo", + k_custom_rules = "Regras Personalizadas", + k_banned_cards = "Cartas Banidas", + k_banned_tags = "Marcas Banidas", + k_other = "Outro(a)", + k_money = "Dinheiro", + k_best_hand = "Melhor Mão", + k_seeded_run = "Tentativa com Código", + k_enter_seed = "Inserir código", + k_lvl = "nv.", + k_skipped_cap = "IGNORADO(A)", + k_no_reward = "Sem Recompensa", + k_reward = "Recompensa", + k_nope_ex = "Não!", + k_or = "ou", + k_balanced = "Equilibrado", + ph_improve_run = "Melhore a sua tentativa!", + ph_sneak_peek = "Espiadinha", + ph_deck_preview_stones = "Pedras", + ph_deck_preview_effective = "Funcional graças ao total de Curingas, Blinds e aprimoramentos de carta", + ph_blind_score_at_least = "Pontue pelo menos", + ph_blind_reward = "Recompensa:", + ph_up_ante_1 = "Aumentar a Aposta", + ph_up_ante_2 = "Aumentar todos os Blinds", + ph_up_ante_3 = "Atualizar Blinds", + ph_stat_joker = "Total de rodadas concluídas com esta carta", + ph_stat_consumable = "Número de vezes que esta carta foi usada", + ph_stat_voucher = "Número de vezes que este Cupom foi resgatado", + ph_demo_thanks_1 = "Obrigado por jogar a", + ph_demo_thanks_2 = "DEMO DE BALATRO", + ph_game_over = "FIM DE JOGO", + ph_vouchers_redeemed = "Cupons resgatados nesta tentativa", + ph_no_vouchers = "Nenhum cupom resgatado nesta tentativa", + ph_defeat_this_blind_1 = "Derrote este Blind", + ph_defeat_this_blind_2 = "para descobrir", + ph_click_confirm = "Clique novamente para confirmar", + ph_choose_blind_1 = "Escolha seu", + ph_choose_blind_2 = "próximo Blind", + ph_mr_bones = "Salvo pelo Sr. Osso", + ph_score_at_least = "Pontue pelo menos", + ph_all_poker_hand = "Todas as Mãos de Pôquer", + ph_1_level = "+1 nível", + ph_boss_disabled = "Chefe Desativado!", + ph_most_played = "{mão mais jogada}", + ml_demo_thanks_message = { + "Considere colocar", + "Balatro na lista de desejos da Steam e se inscrever", + "na newsletter em playbalatro.com" + }, + ml_eternal = { + "Eterno", + "Não é possível vender", + "ou destruir" + }, + ml_gold_seal_desc = { + "Selo Dourado", + "retorna para a mão", + "quando jogada" + }, + ml_crash_report_info = { + "Relatórios de falhas serão enviados para o desenvolvedor", + "para ajudar a corrigir os problemas no futuro. Nenhuma", + "informação de identificação ou pessoal será enviada." + }, + ml_play_discard_pos_opt = { + "Descartar/Jogar", + "Jogar/Descartar" + }, + ml_windowmode_opt = { + "Janela", + "Tela Cheia", + "Sem Bordas" + }, + ml_vsync_opt = { + "Sinc. Vertical Lig.", + "Sinc. Vertical Desl." + }, + ml_shadow_opt = { + "Lig.", + "Desl." + }, + ml_smoothing_opt = { + "Desl.", + "Lig." + }, + ml_bloom_opt = { + "Desl.", + "Lig." + }, + ml_card_stats = { + "Carta", + "Estatísticas" + }, + ml_paste_seed = { + "Colar", + "Código" + }, + ml_disabled_seed = { + "Todos os Desbloqueios e", + "Descobertas desativados" + }, + ['$'] = "$", + k_redeemed_ex = "Resgatado!", + k_duplicated_ex = "Duplicado!", + k_no_room_ex = "Sem Espaço!", + k_no_space_ex = "Sem Espaço!", + k_no_other_jokers = "Sem outros Curingas!", + k_plus_tarot = "+1 Tarô", + k_plus_stone = "+1 Pedras", + k_plus_planet = "+1 Planeta", + k_plus_spectral = "+1 Espectral", + k_active_ex = "Ativo!", + k_level_up_ex = "Subiu de nível!", + k_upgrade_ex = "Melhoria!", + k_again_ex = "Outa vez!", + k_val_up = "Aumento de Valor!", + k_reset = "Redefinir", + k_extinct_ex = "Extinto!", + k_safe_ex = "Seguro!", + k_saved_ex = "Salvou!", + k_swapped_ex = "Trocou!", + k_copied_ex = "Copiou!", + k_melted_ex = "Derreteu!", + b_copy = "Cópia", + b_high_contrast_cards = "Carta de Alto Contraste", + b_set_rumble = "Vibração do Controle", + b_seals = "Selos", + b_new_challenge = "Iniciar Novo Desafio", + b_unlock_all = "Desbloquear Tudo", + k_active = "ativo", + k_deck = "Baralho", + k_progress = "Progresso", + k_challenges = "Desafios", + k_joker_stickers = "Adesivos de Curingas", + k_deck_stake_wins = "Vitórias de Aposta de Baralho", + k_enter_name = "Inserir Nome", + k_gold = "Ouro", + k_card_stats = "Estatísticas de Carta", + k_view = "Ver", + k_all_hands = "Todas as Mãos", + k_high_score_ex = "Pontuação Alta!", + k_demo_version_ex = "Versão de Demonstração!", + k_playing_as = "Jogando como", + k_choose = "Escolher", + k_achievements_disabled = "Conquistas Desativadas", + ph_no_boss_active = "sem chefe ativo", + ph_you_win = "VOCÊ VENCEU!", + ph_you_win_demo = "VOCÊ VENCEU NA DEMO!", + ph_defeat_the_boss = "Derrote o Blind de Chefe", + ph_score_furthest_ante = "Aposta", + ph_score_furthest_round = "Rodada", + ph_score_hand = "Melhor Mão", + ph_score_poker_hand = "Mão Mais Jogada", + ph_score_new_collection = "Novas Descobertas", + ph_score_cards_played = "Mãos Jogadas", + ph_score_cards_discarded = "Cartas Descartadas", + ph_score_times_rerolled = "Vezes em que Atualizou", + ph_score_cards_purchased = "Cartas Compradas", + ml_edition_seal_enhancement_explanation = { + "As cartas de jogo podem ter", + "Aprimoramento, Edição e Selo" + }, + ml_unlock_all_explanation = { + "AVISO! Liberar a Coleção completa", + "desativará as conquistas para este perfil!" + }, + k_plus_joker = "+1 Curinga", + k_eaten_ex = "Comido!", + k_eroded_ex = "Derretido!", + k_achievement = "Conquista", + ph_unscored_hand = "A mão não pontuará", + ph_alert_debuff_confirm = "Pressione 'Jogar' novamente para confirmar", + k_drank_ex = "Bebeu!", + k_trophy = "Troféu", + k_trophies_disabled = "Troféus Desativados", + ml_unlock_all_trophies = { + "AVISO! Liberar a Coleção completa", + "desativará os troféus para este perfil!" + }, + k_poker_hand = "mão de pôquer", + ph_4_7_of_clubs = "quatro 7 de Paus" + }, + v_dictionary = { + a_xmult = "X#1# Multi", + a_mult = "+#1# Multi.", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# de tamanho de mão", + a_hands = "+#1# Mãos", + a_sold_tally = "#1#/#2# Vendido(s)", + a_remaining = "#1# Restante(s)", + ante_x_voucher = "CUPOM DE APOSTA #1#", + loyalty_active = "Ativo!", + loyalty_inactive = "#1# restante(s)", + deck_preview_wheel_singular = "Os números podem ser mais baixos graças a #1# carta comprada virada para baixo", + deck_preview_wheel_plural = "Os números podem ser mais baixos graças às #1# cartas compradas viradas para baixo", + challenges_completed = "Completou #1#/#2# Desafios", + interest = "#1# de juros por $#2# (#3# máx.)", + remaining_hand_money = "Mãos Restantes ($#1# cada)", + remaining_discard_money = "Descartes Restantes ($#1# cada)", + ml_foil_desc = { + "Laminado", + "+#1# Fichas" + }, + ml_holo_desc = { + "Holográfico", + "+#1# Multi" + }, + ml_polychrome_desc = { + "Policromático", + "X#1# Multi" + }, + ml_negative_desc = { + "Negativo", + "+#1# Espaço de Curinga" + }, + a_mult_minus = "-#1# Multi", + a_handsize_minus = "-#1# Tamanho de Mão", + ml_negative_consumable_desc = { + "Negativo", + "+#1# espaço(s) de consumível" + }, + a_xmult_minus = "-X#1# Multi", + unlocked = "#1#/#2# Desbloqueado(s)", + completed = "#1#/#2# Concluído(s)" + }, + v_text = { + ch_m_dollars = { + "Começa com {C:money}$#1#" + }, + ch_m_hands = { + "{C:blue}#1#{} mãos por rodada" + }, + ch_m_discards = { + "{C:red}#1#{} descartes por rodada" + }, + ch_m_reroll_cost = { + "{C:money}$#1#{} de custo base de atualização" + }, + ch_m_joker_slots = { + "{C:attention}#1#{} Espaços de Curinga" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{} Espaços de Consumíveis" + }, + ch_m_hand_size = { + "{C:attention}#1#{} tamanho de mão" + }, + ch_m_none = { + "{C:inactive}Nenhum(a)" + }, + ch_c_no_reward = { + "Nenhum {C:attention}Blind{} dá recompensas em dinheiro" + }, + ch_c_no_reward_specific = { + "{C:attention}#1# Blinds{} não dão recompensas em dinheiro" + }, + ch_c_no_extra_hand_money = { + "{C:blue}Mãos{} Adicionais não ganham mais dinheiro" + }, + ch_c_no_interest = { + "Sem {C:attention}Juros{} ao fim da rodada" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}Desafio Diário!" + }, + ch_c_set_seed = { + "1 tentativa com Código definido: {C:inactive}{Hidden}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}Fichas{} não podem exceder {C:money}$" + }, + ch_c_none = { + "{C:inactive}Nenhum(a)" + }, + ch_c_inflation = { + "Aumente, permanentemente, os preços em {C:money}$1{} por cada compra" + }, + ch_c_discard_cost = { + "Cada descarte custa {C:money}$#1#{}" + }, + ch_c_all_eternal = { + "Todos os Curingas são {C:eternal}Eternos{}" + }, + ch_c_flipped_cards = { + "{C:green}1 em #1#{} cartas são compradas viradas para baixo" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Segure {C:red}-1{} cartas na mão por cada {C:money}$#1#{} que tiver" + }, + ch_c_no_shop_jokers = { + "Os Curingas não aparecem mais na {C:attention}loja" + }, + ch_c_debuff_played_cards = { + "Todas as cartas {C:attention}Jogadas{} ficam {C:attention}com desvantagem{} após pontuar" + }, + ch_c_set_eternal_ante = { + "Quando o chefe da aposta {C:attention}#1#{} é derrotado, todos os Curingas ficam {C:attention}eternos" + }, + ch_c_set_joker_slots_ante = { + "Quando o chefe da aposta {C:attention}#1#{} é derrotado, define os espaços de Curinga para {C:attention}0" + } + }, + tutorial = { + sb_1 = { + "Olá! Meu nome é", + "{C:attention}Jimbo{}, estou aqui pra te ajudar", + "a descobrir como jogar!" + }, + sb_2 = { + "Seu objetivo é ganhar", + "{C:blue}Fichas{} pra derrotar", + "o {C:attention}Blind do inimigo" + }, + sb_3 = { + "Aqui temos um {C:blue}Small Blind{}.", + "Você só precisa pontuar", + "{C:attention}300 Fichas{} para derrotá-lo." + }, + sb_4 = { + "Selecione o {C:blue}Small Blind", + "para iniciar a rodada!" + }, + bb_1 = { + "Selecionar o {C:attention}Big Blind", + "permite ganhar um pouco de grana..." + }, + bb_2 = { + "Ou escolha {C:attention}ignorá-lo", + "para obter uma {C:attention}Marca{}! Cada", + "{C:attention}Marca{} tem um efeito exclusivo" + }, + bb_3 = { + "Mas fique de olho", + "no {C:attention}Blind de Chefe{}. Ele", + "tem uma habilidade que", + "vai exigir um pouco de planejamento." + }, + bb_4 = { + "Se você derrotá-lo, a", + "{C:attention}Aposta{} sobe e todos os", + "{C:attention}Blinds{} ficam mais difíceis" + }, + bb_5 = { + "Vença a {C:attention}Aposta{} #1# para ganhar.", + "Escolha seu caminho!" + }, + fh_1 = { + "Você ganha fichas", + "jogando {C:attention}mãos de pôquer" + }, + fh_2 = { + "Cada {C:attention}Mão de pôquer{} ganha uma", + "quantidade definida de {C:blue}Fichas", + "multiplicada pelo {C:red}Multi" + }, + fh_3 = { + "Veja suas {C:attention}mãos de pôquer", + "na área de {C:attention}Informação da Tentativa{},", + "junto com outras informações", + "sobre a tentativa atual" + }, + fh_4 = { + "As cartas também podem", + "ganhar algumas {C:blue}Fichas{}.", + "Passe por cima pra ver!" + }, + fh_5 = { + "Agora, selecione até", + "{C:attention}5{} cartas pra jogar", + "e pressione {C:blue}'Jogar Mão'" + }, + fh_6 = { + "Você também pode {C:red}'Descartar'{} até", + "{C:attention}5{} cartas selecionadas", + "para experimentar e deixar", + "as mãos ainda mais fortes. Experimente!" + }, + fh_7 = { + "Cuidado! Você tem somente um", + "um número limitado de {C:blue}Mãos", + "e {C:red}Descartes{} por rodada" + }, + fh_8 = { + "Ganhe {C:attention}300 Fichas{} antes", + "de ficar sem {C:blue}Mãos", + "para vencer esta rodada.", + "Boa sorte!" + }, + sh_1 = { + "Quando ganhar mais cartas,", + "não se esqueça de reorganizá-las.", + "{C:attention}Curingas{} são ativados em", + "ordem, da esquerda para a direita." + }, + sh_2 = { + "E não se esqueça de que você pode", + "{C:attention}USAR{} os seus consumíveis!" + }, + sh_3 = { + "Selecione até {C:attention}2{} cartas", + "da sua mão e pressione", + "{C:attention}'USAR'{} na carta de {C:tarot}Tarô{}", + "para aprimorá-la!" + }, + s_1 = { + "Muito bem! Agora que", + "você tem {E:1}muita{} {C:money}Grana{},", + "você pode comprar algumas", + "cartas novas na {C:attention}Loja." + }, + s_2 = { + "Experimente comprar", + "esta belezinha." + }, + s_3 = { + "Este é um dos {C:attention}#1#", + "{C:attention}Curingas{} que você pode adicionar", + "à sua tentativa. Cada {C:attention}Curinga", + "faz algo diferente." + }, + s_4 = { + "Este adiciona um {C:red}Multi +4{} para", + "cada mão jogada!" + }, + s_5 = { + "Tenha cuidado: você só pode", + "carregar {C:attention}5 cartas Curinga{}", + "ao mesmo tempo." + }, + s_6 = { + "Agora compre a outra", + "carta na {C:attention}Loja" + }, + s_7 = { + "Esta carta de {C:tarot}Tarô{} é um", + "{C:attention}consumível{}. Ela vai", + "aprimorar suas cartas", + "de jogo! Guarde ela." + }, + s_8 = { + "Você pode carregar até", + "{C:attention}2 cartas consumíveis{}", + "ao mesmo tempo" + }, + s_9 = { + "Se poupar o suficiente,", + "você poderá comprar um {C:attention}Cupom{}.", + "{C:attention}Cupons{} melhoram,", + "passivamente, a sua tentativa!" + }, + s_10 = { + "{C:attention}Cupons{} são reabastecidos", + "após derrotar o", + "{C:attention}Blind de Chefe{}." + }, + s_11 = { + "E confira ambos os", + "{C:booster}Pacotes de Reforço{} em", + "cada loja. Eles são", + "cheios de coisas boas!" + }, + s_12 = { + "Vamos avançar para", + "a {C:attention}próxima rodada{}." + } + }, + achievement_names = { + ante_up = "Aumento de Aposta!", + ante_upper = "Aumento Maior de Aposta!", + heads_up = "Atenção", + low_stakes = "Aposta Baixa", + mid_stakes = "Aposta Média", + high_stakes = "Aposta Alta", + card_player = "Jogador de Cartas", + card_discarder = "Descartador de Cartas", + nest_egg = "Pé de Meia", + flushed = "Cheio de Dinheiro", + speedrunner = "Speedrunner", + roi = "Retorno de Investimento", + shattered = "Quebrado", + royale = "Royale", + retrograde = "Retrógrado", + _10k = "10 Mil", + _1000k = "1 Milhão", + _100000k = "100 Milhões", + tiny_hands = "Mãos Pequenas", + big_hands = "Mãos Grandes", + you_get_what_you_get = "É o que É", + rule_bender = "Manipulador de Regras", + rule_breaker = "Quebrador de Regras", + legendary = "Lendário", + astronomy = "Astronomia", + cartomancy = "Cartomancia", + clairvoyance = "Clarividência", + extreme_couponer = "Apreciador de Cupons", + completionist = "Complecionista", + completionist_plus = "Complecionista+", + completionist_plus_plus = "Complecionista++" + }, + achievement_descriptions = { + ante_up = "Alcance Aposta 4", + ante_upper = "Alcance Aposta 8", + heads_up = "Vença uma Tentativa", + low_stakes = "Vença uma tentativa com no mínimo a dificuldade Aposta Vermelha", + mid_stakes = "Vença uma tentativa com no mínimo a dificuldade Aposta Negra", + high_stakes = "Vença uma tentativa com no mínimo a dificuldade Aposta Dourada", + card_player = "Jogue no mínimo 2500 cartas", + card_discarder = "Descarte no mínimo 2500 cartas", + nest_egg = "Tenha $400 ou mais durante uma única tentativa", + flushed = "Jogue um Flush com 5 Cartas Curinga", + speedrunner = "Vença uma tentativa em 12 ou menos rodadas", + roi = "Compre 5 Cupons em Aposta 4", + shattered = "Quebre 2 Cartas de Vidro em uma mão", + royale = "Jogue um Royal Flush", + retrograde = "Suba o nível de qualquer mão de pôquer até o 10", + _10k = "Pontue 10.000 Fichas com uma só mão", + _1000k = "Pontue 1.000.000 Fichas com uma só mão", + _100000k = "Pontue 100.000.000 Fichas com uma só mão", + tiny_hands = "Reduza o seu baralho para 20 cartas ou menos.", + big_hands = "Tenha 80 cartas ou mais no seu baralho", + you_get_what_you_get = "Vença uma tentativa sem atualizar a loja", + rule_bender = "Complete qualquer tentativa de desafio", + rule_breaker = "Complete todas as tentativas de desafio", + legendary = "Descubra um Curinga Lendário", + astronomy = "Descubra todas as cartas de Planeta", + cartomancy = "Descubra todas as cartas de Tarô", + clairvoyance = "Descubra todas as cartas Espectrais", + extreme_couponer = "Descubra todos os Cupons", + completionist = "Descubra 100% da sua coleção", + completionist_plus = "Vença com todos os baralhos na dificuldade Aposta Dourada", + completionist_plus_plus = "Ganhe um Adesivo Dourado em cada Curinga" + }, + quips = { + wq_1 = { + "Mandou Bem!" + }, + wq_2 = { + "Você lidou com", + "isso muito bem!" + }, + wq_3 = { + "Parece que você", + "não estava blefando!" + }, + wq_4 = { + "É uma pena", + "estas fichas serem", + "virtuais..." + }, + wq_5 = { + "Parece que", + "ensinei direitinho!" + }, + wq_6 = { + "Você fez umas", + "jogadas bem calculadas!" + }, + wq_7 = { + "Ainda bem", + "que eu não apostei", + "contra você!" + }, + lq_1 = { + "Talvez jogar", + "Mico Doido combine", + "mais com você..." + }, + lq_2 = { + "Fomos completamente", + "derrotados!" + }, + lq_3 = { + "Está na hora", + "de embaralhar", + "e tentar outra vez!" + }, + lq_4 = { + "Você sabe o", + "que costumam dizer,", + "a casa sempre vence!" + }, + lq_5 = { + "Parece que", + "descobrimos quem é", + "o verdadeiro Curinga!" + }, + lq_6 = { + "Oh não, você também", + "estava blefando?" + }, + lq_7 = { + "Parece que", + "fomos enganados!" + }, + lq_8 = { + "Se eu tivesse mãos", + "acho que tinha", + "tampado os meus olhos!" + }, + lq_9 = { + "Sou, literalmente,", + "um bobo, qual é a", + "sua desculpa?" + }, + lq_10 = { + "Que fracasso!" + }, + dq_1 = { + "Nossa, espero que você", + "tenha alguns truques", + "na manga para", + "este desafio final!" + } + }, + challenge_names = { + c_omelette_1 = "A Omelete", + c_city_1 = "Cidade dos 15 Minutos", + c_rich_1 = "Ricos ficam Mais Ricos", + c_knife_1 = "No Fio da Navalha", + c_xray_1 = "Visão de Raio X", + c_mad_world_1 = "Mundo Maluco", + c_luxury_1 = "Imposto de Luxo", + c_non_perishable_1 = "Não Perecível", + c_medusa_1 = "Medusa", + c_double_nothing_1 = "O Dobro ou Nada", + c_typecast_1 = "Estereótipo", + c_inflation_1 = "Inflação", + c_bram_poker_1 = "Bram Pôquer", + c_fragile_1 = "Frágil", + c_monolith_1 = "Monólito", + c_blast_off_1 = "Decolar", + c_five_card_1 = "Saque de Cinco Cartas", + c_golden_needle_1 = "Agulha Dourada", + c_cruelty_1 = "Crueldade", + c_jokerless_1 = "Sem Curinga" + } + } +} \ No newline at end of file diff --git a/localization/ru.lua b/localization/ru.lua new file mode 100644 index 0000000..9a82147 --- /dev/null +++ b/localization/ru.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "Джокер", + text = { + "{C:red,s:1.1}+#1#{} множ." + } + }, + j_jolly = { + name = "Веселый джокер", + text = { + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#" + } + }, + j_zany = { + name = "Дурацкий джокер", + text = { + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#" + } + }, + j_mad = { + name = "Безумный джокер", + text = { + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#" + } + }, + j_crazy = { + name = "Сумасшедший джокер", + text = { + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#" + } + }, + j_droll = { + name = "Забавный джокер", + text = { + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#" + } + }, + j_half = { + name = "Полуджокер", + text = { + "{C:red}+#1#{} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#{} или меньше карт" + } + }, + j_fortune_teller = { + name = "Предсказатель", + text = { + "{C:red}+#1#{} множ. за каждую", + "использованную карту {C:purple}Таро{}", + "{C:inactive}(сейчас {C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "Жонглер", + text = { + "{C:attention}+#1#{} размер руки" + } + }, + j_drunkard = { + name = "Пьяница", + text = { + "{C:red}+#1#{} сброс" + } + }, + j_stone = { + name = "Каменный джокер", + text = { + "Этот джокер получает {C:chips}+#1#{} шт. фишек", + "за каждую {C:attention}каменную карту", + "в вашей полной колоде", + "{C:inactive}(сейчас {C:chips}+#2#{C:inactive} шт. фишек)" + } + }, + j_golden = { + name = "Золотой джокер", + text = { + "Получайте {C:money}$#1#{} в", + "конце раунда" + } + }, + j_stencil = { + name = "Трафарет джокера", + text = { + "{X:red,C:white} X1 {} множ. за каждый", + "пустой слот {C:attention}джокера{},", + "{s:0.8}включая трафарет джокера", + "{C:inactive}(сейчас {X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "Четыре пальца", + text = { + "Все {C:attention}флеши{} и", + "{C:attention}стриты{} можно", + "собрать с {C:attention}4{} картами" + } + }, + j_mime = { + name = "Мим", + text = { + "Перезапустить все", + "способности {C:attention}удерживаемых", + "в {C:attention}руке{} карт" + } + }, + j_credit_card = { + name = "Кредитная карта", + text = { + "Взять до", + "{C:red}-$#1#{} в долг" + } + }, + j_greedy_joker = { + name = "Жадный джокер", + text = { + "Сыгранные карты с", + "мастью {C:diamonds}#2#{} дают", + "{C:mult}+#1#{} множ. при подсчете" + } + }, + j_lusty_joker = { + name = "Похотливый джокер", + text = { + "Сыгранные карты с", + "мастью {C:hearts}#2#{} дают", + "{C:mult}+#1#{} множ. при подсчете" + } + }, + j_wrathful_joker = { + name = "Гневный джокер", + text = { + "Сыгранные карты с", + "мастью {C:spades}#2#{} дают", + "{C:mult}+#1#{} множ. при подсчете" + } + }, + j_gluttenous_joker = { + name = "Прожорливый джокер", + text = { + "Сыгранные карты с", + "мастью {C:clubs}#2#{} дают", + "{C:mult}+#1#{} множ. при подсчете" + } + }, + j_ceremonial = { + name = "Церемониальный кинжал", + text = { + "При выборе {C:attention}блайнда{}", + "уничтожается джокер справа", + "и навсегда добавляется {C:attention}двойная", + "стоимость продажи к этому {C:red}множ.", + "{C:inactive}(сейчас {C:mult}+#1#{C:inactive} множ.)" + } + }, + j_banner = { + name = "Баннер", + text = { + "{C:chips}+#1#{} шт. фишек за", + "каждый оставшийся", + "{C:attention}сброс" + } + }, + j_mystic_summit = { + name = "Мистическая вершина", + text = { + "{C:mult}+#1#{} множ. при", + "{C:attention}#2#{} оставшихся", + "сбросах" + } + }, + j_marble = { + name = "Мраморный джокер", + text = { + "Добавляет одну {C:attention}каменную{} карту", + "в колоду при", + "выборе {C:attention}блайнда{}" + } + }, + j_loyalty_card = { + name = "Карта лояльности", + text = { + "{X:red,C:white} X#1# {} множ. с каждыми", + "{C:attention}#2#{} сыгранными руками", + "{C:inactive}#3#" + } + }, + j_8_ball = { + name = "8 шар", + text = { + "Создайте карту {C:planet}планеты{},", + "если сыгранная рука содержит", + "{C:attenetion}#1#{} или более {C:attention}8-ок{}", + "{C:inactive}(должно быть место)" + } + }, + j_misprint = { + name = "Опечатка", + text = { + "" + } + }, + j_dusk = { + name = "Сумерки", + text = { + "Перезапуск всех сыгранных", + "карт в {C:attention}последней", + "{C:attention}руке{} раунда" + } + }, + j_raised_fist = { + name = "Поднятый кулак", + text = { + "Добавляет {C:attention}двойное{} достоинство", + "{C:attention}наименьшей{} карты", + "в руке к множ." + } + }, + j_chaos = { + name = "Клоун Хаос", + text = { + "{C:attention}#1#{} бесплатных {C:green}перебросов", + "за каждую лавку" + } + }, + j_fibonacci = { + name = "Фибоначчи", + text = { + "Каждый сыгранный {C:attention}туз{},", + "{C:attention}2{}, {C:attention}3{}, {C:attention}5{} или {C:attention}8{} дает", + "{C:mult}+#1#{} множ. при подсчете" + } + }, + j_steel_joker = { + name = "Стальной джокер", + text = { + "Этот джокер дает {X:mult,C:white} X#1# {} множ.", + "за каждую {C:attention}стальную карту", + "в вашей полной колоде", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + } + }, + j_scary_face = { + name = "Жуткое лицо", + text = { + "Сыгранные карты {C:attention}с лицом{}", + "дают {C:chips}+#1#{} шт. фишек", + "при подсчете" + } + }, + j_abstract = { + name = "Абстрактный джокер", + text = { + "{C:mult}+#1#{} множ. за", + "каждую карту {C:attention}джокера{}", + "{C:inactive}(сейчас {C:red}+#2#{C:inactive} множ.)" + } + }, + j_delayed_grat = { + name = "Запоздалое признание", + text = { + "Получите {C:money}$#1#{} за каждый {C:attention}сброс{}, если", + "сбросы не использовались", + "до конца раунда" + } + }, + j_hack = { + name = "Паяц", + text = { + "Перезапуск", + "каждой сыгранной", + "{C:attention}2{}, {C:attention}3{}, {C:attention}4{} или {C:attention}5{}" + } + }, + j_pareidolia = { + name = "Парейдолия", + text = { + "Все карты", + "считаются", + "картами с {C:attention}лицом{}" + } + }, + j_gros_michel = { + name = "Гро Мишель", + text = { + "{C:mult}+#1#{} множ.", + "шанс {C:green}#2# из #3#{}, что", + "карта будет уничтожена", + "в конце раунда" + } + }, + j_even_steven = { + name = "Все че(с)тно", + text = { + "Сыгранные карты с", + "{C:attention}четным{} достоинством дают", + "{C:mult}+#1#{} множ. при подсчете", + "{C:inactive}(10, 8, 6, 4, 2)" + } + }, + j_odd_todd = { + name = "Нече(с)тные правила", + text = { + "Сыгранные карты с", + "{C:attention}нечетным{} достоинством дают", + "{C:chips}+#1#{} шт. фишек при подсчете", + "{C:inactive}(Т, 9, 7, 5, 3)" + } + }, + j_scholar = { + name = "Ученый", + text = { + "Сыгранные {C:attention}тузы{}", + "дают {C:chips}+#2#{} шт. фишек", + "и {C:mult}+#1#{} множ.", + "при подсчете" + } + }, + j_business = { + name = "Бизнес-карта", + text = { + "Сыгранные карты {C:attention}с лицом{} имеют", + "шанс {C:green}#1# из #2#{}", + "дать {C:money}$2{} при подсчете" + } + }, + j_supernova = { + name = "Сверхновая", + text = { + "Добавляет количество", + "раз, когда {C:attention}покерная рука{}", + "сыграла, к множ." + } + }, + j_ride_the_bus = { + name = "Автобусный тур", + text = { + "{C:mult}+#1#{} множ. за каждую", + "последовательную руку,", + "сыгранную без", + "дающей очки карты с {C:attention}лицом{}", + "{C:inactive}(сейчас {C:mult}+#2#{C:inactive} множ.)" + } + }, + j_space = { + name = "Космический джокер", + text = { + "{C:green}#1# из #2#{} шанс", + "повысить уровень", + "играемой {C:attention}покерной руки{}" + } + }, + j_egg = { + name = "Яйцо", + text = { + "Дает {C:money}$#1#{} от", + "{C:attention}стоимости продажи{} в", + "конце раунда" + } + }, + j_burglar = { + name = "Грабитель", + text = { + "При выборе {C:attention}блайнда{}", + "вы получите {C:blue}+#1#{} рук(и) и", + "{C:attention}потеряете все сбросы" + } + }, + j_blackboard = { + name = "Школьная доска", + text = { + "{X:red,C:white} X#1# {} множ., если все", + "карты в руке", + "являются {C:spades}#2#{} или {C:clubs}#3#{}" + } + }, + j_runner = { + name = "Бегун", + text = { + "Дает {C:chips}+#2#{} шт. фишек,", + "если сыгранная рука", + "содержит {C:attention}стрейт{}", + "{C:inactive}(сейчас {C:chips}+#1#{C:inactive} шт. фишек)" + } + }, + j_ice_cream = { + name = "Мороженое", + text = { + "{C:chips}+#1#{} шт. фишек", + "{C:chips}-#2#{} шт. фишек за", + "каждую сыгранную руку" + } + }, + j_dna = { + name = "ДНК", + text = { + "Если в {C:attention}первой руке{} раунда", + "только {C:attention}1{} карта, добавьте", + "постоянную копию в колоду", + "и положите ее в {C:attention}руку" + } + }, + j_splash = { + name = "Всплеск", + text = { + "Каждая {C:attention}сыгранная карта", + "учитывается при подсчете" + } + }, + j_blue_joker = { + name = "Синий джокер", + text = { + "{C:chips}+#1#{} шт. фишек за каждую", + "оставшуюся карту в {C:attention}колоде", + "{C:inactive}(сейчас {C:chips}+#2#{C:inactive} шт. фишек)" + } + }, + j_sixth_sense = { + name = "Шестое чувство", + text = { + "Если {C:attention}первой рукой{} раунда является", + "одиночная {C:attention}6{}, она уничтожается, и", + "создается {C:spectral}спектральная{} карта", + "{C:inactive}(должно быть место)" + } + }, + j_constellation = { + name = "Созвездие", + text = { + "Дает {X:mult,C:white} X#1# {} множ.", + "за каждую карту {C:planet}планеты{}", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + } + }, + j_hiker = { + name = "Турист", + text = { + "Каждая сыгранная {C:attention}карта{}", + "навсегда дает", + "{C:chips}+#1#{} шт. фишек при подсчете" + } + }, + j_faceless = { + name = "Безликий джокер", + text = { + "Получите {C:money}$#1#{}, если {C:attention}#2#{} или", + "больше {C:attention}карт с лицом{}", + "сбрасываются", + "за один раз" + } + }, + j_green_joker = { + name = "Зеленый джокер", + text = { + "{C:mult}+#1#{} множ. за каждую сыгранную руку", + "{C:mult}-#2#{} множ. за каждый сброс", + "{C:inactive}(сейчас {C:mult}+#3#{C:inactive} множ.)" + } + }, + j_superposition = { + name = "Суперпозиция", + text = { + "Создайте карту {C:tarot}Таро{}, если", + "покерная рука содержит", + "{C:attention}туз{} и {C:attention}стрейт{}", + "{C:inactive}(должно быть место)" + } + }, + j_todo_list = { + name = "Список дел", + text = { + "Получите {C:money}$#1#{}, если {C:attention}покерная рука{}", + "содержит: {C:attention}#2#{},", + "покерная рука меняется", + "при каждой выплате" + } + }, + j_ticket = { + name = "Золотой билет", + text = { + "Сыгранные {C:attention}золотые{} карты", + "дают {C:money}$#1#{} при подсчете" + }, + unlock = { + "Сыграйте руку из 5 карт,", + "которая содержит только", + "{C:attention,E:1}золотые{} карты" + } + }, + j_mr_bones = { + name = "Костлявый", + text = { + "Предотвращает смерть,", + "если фишки с очками", + "составляют минимум {C:attention}25%", + "от необходимых фишек", + "{S:1.1,C:red,E:2}самоуничтожается{}" + }, + unlock = { + "Проиграть {C:attention,E:1}#1#{} парт.", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "Акробат", + text = { + "{X:red,C:white} X#1# {} множ. на {C:attention}последней", + "{C:attention}руке{} раунда" + }, + unlock = { + "Сыграйте {C:attention,E:1}#1#{} рук(и)", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "Трагедия и комедия", + text = { + "Перезапуск всех", + "сыгранных карт {C:attention}с лицом{}" + }, + unlock = { + "Сыграйте суммарно", + "{C:attention,E:1}#1#{} карт(ы) с лицом", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "Головорез", + text = { + "Добавляет стоимость продажи", + "всех {C:attention}джокеров{} во владении слева", + "от этой карты к множ.", + "{C:inactive}(сейчас {C:mult}+#1#{C:inactive} множ.)" + }, + unlock = { + "Продайте суммарно", + "{C:attention,E:1}#1#{} карт(ы) джокера", + "{C:inactive}(#2#)" + } + }, + j_troubadour = { + name = "Трубадур", + text = { + "{C:attention}+#1#{} размер руки,", + "{C:red}-#2#{} рук(и) за каждый раунд" + }, + unlock = { + "Выиграйте {C:attention,E:1}#1#{} последовательных", + "раунда(ов) с игрой", + "только 1 руки" + } + }, + j_certificate = { + name = "Сертификат", + text = { + "Когда начинается раунд,", + "добавляется случайная {C:attention}играющая", + "{C:attention}карта{} со случайным множ.", + "{C:attention}печать{} в вашу руку" + }, + unlock = { + "Иметь золотую", + "играемую карту с", + "{C:attention,E:1}Золотой печатью" + } + }, + j_smeared = { + name = "Смазанный джокер", + text = { + "{C:hearts}черви{} и {C:diamonds}бубны", + "считаются одной мастью,", + "{C:spades}пики{} и {C:clubs}трефы", + "также считаются одной мастью" + }, + unlock = { + "Иметь минимум {C:attention}#1#", + "{E:1,C:attention}#2#{} в", + "своей колоде" + } + }, + j_throwback = { + name = "Возврат", + text = { + "{X:mult,C:white} X#1# {} для каждого", + "{C:attention}блайнда{}, пропущенного в этой партии", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + }, + unlock = { + "Продолжить сохраненную партию", + "из главного меню" + } + }, + j_hanging_chad = { + name = "Еще разок", + text = { + "Перезапуск {C:attention}первой{} сыгранной", + "карты, использованной при подсчете" + }, + unlock = { + "Победить Босс-блайнд", + "с: {E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "Грубый самоцвет", + text = { + "Сыгранные карты с", + "{C:diamonds}бубновой{} мастью дают", + "{C:money}$#1#{} при подсчете очков" + }, + unlock = { + "Иметь минимум {E:1,C:attention}#1#", + "карт(ы) масти {E:1,C:attention}#2#", + "в колоде" + } + }, + j_bloodstone = { + name = "Гелиотроп", + text = { + "{C:green}#1# из #2#{} шанс для", + "сыгранных карт с", + "{C:hearts}червовой{} мастью дать", + "{X:mult,C:white} X#3# {} множ. при подсчете очков," + }, + unlock = { + "Иметь минимум {E:1,C:attention}#1#", + "карт(ы) масти {E:1,C:attention}#2#", + "в колоде" + } + }, + j_arrowhead = { + name = "Наконечник стрелы", + text = { + "Сыгранные карты с", + "{C:spades}пиковой{} мастью дают", + "{C:chips}+#1#{} шт. фишек при подсчете" + }, + unlock = { + "Иметь минимум {E:1,C:attention}#1#", + "карт(ы) масти {E:1,C:attention}#2#", + "в колоде" + } + }, + j_onyx_agate = { + name = "Ониксовый агат", + text = { + "Сыгранные карты с", + "{C:clubs}трефовой{} мастью дают", + "{C:mult}+#1#{} множ. при подсчете" + }, + unlock = { + "Иметь минимум {E:1,C:attention}#1#", + "карт(ы) масти {E:1,C:attention}#2#", + "в колоде" + } + }, + j_glass = { + name = "Стеклянный джокер", + text = { + "Дает {X:mult,C:white} X#1# {} множ.", + "за каждую {C:attention}стеклянную карту,", + "которая была уничтожена", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + }, + unlock = { + "Иметь минимум {E:1,C:attention}#1#", + "{E:1,C:attention}#2#{} в", + "своей колоде" + } + }, + j_ring_master = { + name = "Мастер колец", + text = { + "{C:attention}Джокер{}, {C:tarot}Таро{}, карты {C:planet}планет{}", + "и {C:spectral}спектральные{} карты могут", + "появляться многократно" + }, + unlock = { + "Достичь анте", + "уровня {E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "Цветочный горшок", + text = { + "{X:mult,C:white} X#1# {} множ., если играемая", + "рука содержит подсчитываемую", + "{C:diamonds}бубновую{} карту, {C:clubs}трефовую{} карту,", + "{C:hearts}Червовая{} карта и {C:spades}пиковая{} карта" + }, + unlock = { + "Достичь анте", + "уровня {E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "Чертеж", + text = { + "Копирует способность", + "{C:attention}джокера{} справа" + }, + unlock = { + "Выиграть партию" + } + }, + j_wee = { + name = "Трусливый джокер", + text = { + "Этот джокер дает", + "{C:chips}+#2#{} шт. фишей при подсчете", + "каждой сыгранной {C:attention}2-ки{}", + "{C:inactive}(сейчас {C:chips}+#1#{C:inactive} шт. фишек)" + }, + unlock = { + "Выиграть партию за {E:1,C:attention}#1#", + "или меньше раундов" + } + }, + j_merry_andy = { + name = "Веселый Энди", + text = { + "{C:red}+#1#{} сбросов,", + "{C:red}#2#{} размер руки" + }, + unlock = { + "Выиграть партию за {E:1,C:attention}#1#", + "или меньше раундов" + } + }, + j_oops = { + name = "Упс! Все шестерки", + text = { + "Удваивает все {C:attention}перечисленные", + "{C:green,E:1,S:1.1}вероятности", + "{C:inactive}(напр.: {C:green}1 из 3{C:inactive} -> {C:green}2 из 3{C:inactive})" + }, + unlock = { + "В одной руке", + "набрать минимум", + "{E:1,C:attention}#1#{} шт. фишек" + } + }, + j_idol = { + name = "Идол", + text = { + "Каждая играемая {C:attention}#2#", + "из {V:1}#3#{} дает", + "{X:mult,C:white} X#1# {} множ. при подсчете", + "{s:0.8}Карта меняется каждый раунд" + }, + unlock = { + "В одной руке", + "набрать минимум", + "{E:1,C:attention}#1#{} шт. фишек" + } + }, + j_seeing_double = { + name = "Двоение в глазах", + text = { + "{X:mult,C:white} X#1# {} множ., если играемая", + "рука содержит подсчитываемую", + "{C:clubs}Трефовая{} карта и подсчет", + "карты любой другой {C:attention}масти" + }, + unlock = { + "Сыграть руку,", + "что содержит", + "{E:1,C:attention}#1#" + } + }, + j_matador = { + name = "Матадор", + text = { + "Получите {C:money}$#1#{}, если сыгранная", + "рука активирует", + "способность {C:attention}Босс-блайнда{}" + }, + unlock = { + "Победить Босс-блайнд", + "в {E:1,C:attention}1 руку{} без", + "использования сбросов" + } + }, + j_hit_the_road = { + name = "В путь", + text = { + "Дает {X:mult,C:white} X#1# {} множ.", + "за каждого сброшенного", + "{C:attention}валета{} в этом раунде", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + }, + unlock = { + "Сбросить {E:1,C:attention}5", + "{E:1,C:attention}валетов{} за", + "один раз" + } + }, + j_duo = { + name = "Дуэт", + text = { + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#" + }, + unlock = { + "Выиграть партию", + "не сыграв", + "{E:1,C:attention}#1#" + } + }, + j_trio = { + name = "Трио", + text = { + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#" + }, + unlock = { + "Выиграть партию", + "не сыграв", + "{E:1,C:attention}#1#" + } + }, + j_family = { + name = "Семья", + text = { + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#" + }, + unlock = { + "Выиграть партию", + "не сыграв", + "{E:1,C:attention}#1#" + } + }, + j_order = { + name = "Орден", + text = { + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#" + }, + unlock = { + "Выиграть партию", + "не сыграв", + "{E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "Племя", + text = { + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "рука содержит", + "{C:attention}#2#" + }, + unlock = { + "Выиграть партию", + "не сыграв", + "{E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "Кавендиш", + text = { + "{X:mult,C:white} X#1# {} множ.", + "шанс {C:green}#2# из #3#{}, что", + "карта будет уничтожена", + "в конце раунда" + } + }, + j_card_sharp = { + name = "Острая карта", + text = { + "{X:mult,C:white} X#1# {} множ., если сыгранная", + "{C:attention}покерная рука{} уже", + "сыграла в этом раунде" + } + }, + j_red_card = { + name = "Красная карта", + text = { + "Дает {C:red}+#1#{} множ., когда любой", + "{C:attention}бустерный набор{} пропущен", + "{C:inactive}(сейчас {C:red}+#2#{C:inactive} множ.)" + } + }, + j_madness = { + name = "Безумие", + text = { + "При выборе {C:attention}блайнда{}", + "получите {X:mult,C:white} X#1# {} множ. и", + "{C:attention}уничтожьте{} случайного джокера", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {} множ.)" + } + }, + j_square = { + name = "Квадратный джокер", + text = { + "Дает {C:chips}+#2#{} шт. фишек, если", + "в сыгранной руке", + "ровно {C:attention}4{} карты", + "{C:inactive}(сейчас {C:chips}#1#{} шт. фишек)" + } + }, + j_seance = { + name = "Сеанс", + text = { + "Если {C:attention}покерная рука{} содержит", + "{C:attention}#1#{}, создает", + "случайную {C:spectral}спектральную{} карту", + "{C:inactive}(должно быть место)" + } + }, + j_riff_raff = { + name = "Рифф-рафф", + text = { + "При выборе {C:attention}блайнда{}", + "создает {C:attention}#1# {C:blue}обычного(ых){C:attention} джокера", + "{C:inactive}(должно быть место)" + } + }, + j_stuntman = { + name = "Каскадер", + text = { + "{C:chips}+#1#{} шт. фишек,", + "{C:attention}-#2#{} размер руки" + }, + unlock = { + "В одной руке", + "набрать минимум", + "{E:1,C:attention}#1#{} шт. фишек" + } + }, + j_invisible = { + name = "Невидимый джокер", + text = { + "После {C:attention}#1#{} раундов", + "продайте эту карту, чтобы", + "{C:attention}дублировать{} случайного джокера", + "{C:inactive}(сейчас {C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "Выиграйте партию,", + "имея не более", + "{E:1,C:attention}4 джокеров{}" + } + }, + j_brainstorm = { + name = "Мозговой штурм", + text = { + "Копирует способность", + "крайнего левого {C:attention}джокера" + }, + unlock = { + "Сбросьте", + "{E:1,C:attention}флеш-рояль" + } + }, + j_satellite = { + name = "Спутник", + text = { + "Получите {C:money}$#1#{} в конце", + "раунда за каждую уникальную {C:planet}планету,", + "использованную в этой партии", + "{C:inactive}(сейчас {C:money}$#2#{C:inactive})" + }, + unlock = { + "Иметь {E:1,C:money}$#1#", + "или более" + } + }, + j_shoot_the_moon = { + name = "На Луну", + text = { + "{C:mult}+#1#{} множ. за", + "каждую {C:attention}даму{}", + "в руке" + }, + unlock = { + "Сыграть все {E:1,C:attention}черви", + "из вашей колоды в", + "одном раунде" + } + }, + j_drivers_license = { + name = "Водительские права", + text = { + "{X:mult,C:white} X#1# {} множ., если у вас", + "не менее {C:attention}16", + "улучшенных карт", + "{C:inactive}(сейчас {C:attention}#2#{C:inactive})" + }, + unlock = { + "Улучшить {E:1,C:attention}#1#{} карт(ы)", + "в вашей колоде" + } + }, + j_cartomancer = { + name = "Картомант", + text = { + "Создайте карту {C:tarot}Таро{}", + "при выборе {C:attention}блайнда{}", + "{C:inactive}(должно быть место)" + }, + unlock = { + "Открыть каждую", + "карту {E:1,C:tarot}Таро{}" + } + }, + j_astronomer = { + name = "Астроном", + text = { + "Все карты {C:planet}планет{} и", + "{C:planet}небесные наборы{} в", + "лавке {C:attention}бесплатны" + }, + unlock = { + "Открыть каждую", + "карту {E:1,C:planet}планет{}" + } + }, + j_burnt = { + name = "Горелый джокер", + text = { + "Повысить уровень", + "первой {C:attention}сброшенной", + "покерной руки в каждом раунде" + }, + unlock = { + "Продать суммарно", + "{E:1,C:attention}#1#{} карт(ы)", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "Бутстрэп", + text = { + "{C:mult}+#1#{} множ. за каждые", + "ваши {C:money}$#2#{}" + }, + unlock = { + "Иметь минимум {E:1,C:attention}#1#", + "{C:dark_edition}Полихромных{} джокеров" + } + }, + j_caino = { + name = "Канио", + text = { + "Дает {X:mult,C:white} X#1# {} множ., когда", + "карта {C:attention}с лицом{}", + "уничтожается", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "Трибуле", + text = { + "Сыгранные {C:attention}короли{} и", + "{C:attention}дамы{} дают", + "{X:mult,C:white} X#1# {} множ. при подсчете очков," + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "Йорик", + text = { + "{X:mult,C:white} X#1# {} множ. только после", + "использования {C:attention}#2#{} сбросов", + "{C:inactive}(осталось сбросов: {C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "Шико", + text = { + "Отключает эффект", + "каждого {C:attention}Босс-блайнда" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "Перкео", + text = { + "Создает {C:dark_edition}негативную{} копию", + "{C:attention}1{} случайной {C:attention}расходуемой{}", + "карты в вашем владении", + "в конце {C:attention}лавки" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "Хитрый джокер", + text = { + "{C:chips}+#1#{} шт. фишек, если сыгранная", + "рука содержит", + "{C:attention}#2#" + } + }, + j_wily = { + name = "Ловкий джокер", + text = { + "{C:chips}+#1#{} шт. фишек, если сыгранная", + "рука содержит", + "{C:attention}#2#" + } + }, + j_clever = { + name = "Умный джокер", + text = { + "{C:chips}+#1#{} шт. фишек, если сыгранная", + "рука содержит", + "{C:attention}#2#" + } + }, + j_devious = { + name = "Коварный джокер", + text = { + "{C:chips}+#1#{} шт. фишек, если сыгранная", + "рука содержит", + "{C:attention}#2#" + } + }, + j_crafty = { + name = "Пронырливый джокер", + text = { + "{C:chips}+#1#{} шт. фишек, если сыгранная", + "рука содержит", + "{C:attention}#2#" + } + }, + j_vampire = { + name = "Вампир", + text = { + "Дает {X:mult,C:white} X#1# {} множ. за каждую", + "сыгранную {C:attention}улучшенную карту{},", + "снимает {C:attention}улучшение карты", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + } + }, + j_shortcut = { + name = "Короткий путь", + text = { + "Позволяет составлять {C:attention}стриты{}", + "с промежутками в {C:attention}1 достоинство", + "{C:inactive}(напр.: {C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "Голограмма", + text = { + "Дает {X:mult,C:white} X#1# {} множ.", + "за каждую {C:attention}играемую карту{}, добавленную", + "в вашу колоду", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + } + }, + j_vagabond = { + name = "Бродяга", + text = { + "Создайте карту {C:purple}Таро{},", + "если рука сыграна", + "с {C:money}$#1#{} или меньше" + } + }, + j_baron = { + name = "Барон", + text = { + "Каждый {C:attention}король{}", + "в руке", + "дает {X:mult,C:white} X#1# {} множ." + } + }, + j_cloud_9 = { + name = "Девятое небо", + text = { + "Получите {C:money}$#1#{} за каждую", + "{C:attention}9{} в вашей {C:attention}полной колоде", + "в конце раунда", + "{C:inactive}(сейчас {C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "Ракета", + text = { + "Получите {C:money}$#1#{} в конце", + "раунда. Дает {C:money}$#2#{}", + "при победе над {C:attention}Босс-блайндом{}" + } + }, + j_obelisk = { + name = "Обелиск", + text = { + "{X:mult,C:white} X#1# {} множ. за каждую", + "последовательную руку,", + "сыгранную без вашей", + "наиболее часто играемой {C:attention}покерной руки", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + } + }, + j_midas_mask = { + name = "Маска Мидаса", + text = { + "Все карты {C:attention}с лицом{}", + "становятся {C:attention}золотыми{}", + "при разыгрывании" + } + }, + j_luchador = { + name = "Лучадор", + text = { + "Продайте эту карту, чтобы", + "отключить текущий", + "{C:attention}Босс-блайнд{}" + } + }, + j_photograph = { + name = "Фотография", + text = { + "Первая сыгранная карта {C:attention}с лицом", + "дает {X:mult,C:white} X#1# {} множ.", + "при подсчете" + } + }, + j_gift = { + name = "Подарочная карта", + text = { + "Добавляет {C:money}$#1#{} {C:attention}стоимости продажи", + "каждому {C:attention}джокеру{} и", + "{C:attention}расходуемой карте{} при", + "конце раунда" + } + }, + j_turtle_bean = { + name = "Черепаховый боб", + text = { + "Размер руки {C:attention}+#1#{},", + "уменьшается на", + "{C:red}#2#{} каждый раунд" + } + }, + j_erosion = { + name = "Эрозия", + text = { + "{C:red}+#1#{} множ. за каждую", + "карту ниже {C:attention}#3#{}", + "в вашей полной колоде", + "{C:inactive}(сейчас {C:red}+#2#{C:inactive} множ.)" + } + }, + j_reserved_parking = { + name = "Зарезервированное место", + text = { + "Каждая карта {C:attention}с лицом{}", + "в руке имеет", + "{C:green}#2# из #3#{} шанс", + "принесут {C:money}$#1#{}" + } + }, + j_mail = { + name = "Почтовая скидка", + text = { + "Получите {C:money}$#1#{} за каждую", + "сброшенную {C:attention}#2#{}, достоинство", + "меняется каждый раунд" + } + }, + j_to_the_moon = { + name = "До Луны", + text = { + "Получите дополнительно {C:money}$#1#{}", + "{C:attention}процентов{} за каждые {C:money}$5{} у вас", + "в конце раунда" + } + }, + j_hallucination = { + name = "Галлюцинация", + text = { + "Шанс {C:green}#1# из #2#{} создать", + "карту {C:tarot}Таро{} при открытии", + "любого {C:attention}бустерного набора{}", + "{C:inactive}(должно быть место)" + } + }, + j_lucky_cat = { + name = "Счастливый кот", + text = { + "Дает {X:mult,C:white} X#1# {} множ. каждый", + "раз, когда {C:attention}счастливая{} карта", + "{C:green}успешно{} срабатывает", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + } + }, + j_baseball = { + name = "Бейсбольная карточка", + text = { + "{C:green}Необычные{} джокеры,", + "каждый дает {X:mult,C:white} X#1# {} множ." + } + }, + j_bull = { + name = "Бык", + text = { + "{C:chips}+#1#{} шт. фишек за каждый", + "ваш {C:money}доллар{}", + "{C:inactive}(сейчас {C:chips}+#2#{C:inactive} шт. фишек)" + } + }, + j_diet_cola = { + name = "Диетическая кола", + text = { + "Продайте эту карту, чтобы", + "бесплатно создать", + "{C:attention}#1#" + } + }, + j_trading = { + name = "Торговая карта", + text = { + "Если в {C:attention}первом сбросе{} раунда", + "только {C:attention}1{} карта, уничтожьте", + "ее и получите {C:money}$#1#" + } + }, + j_flash = { + name = "Флеш-карта", + text = { + "{C:mult}+#1#{} множ. за каждый", + "{C:attention}переброс{} в лавке", + "{C:inactive}(сейчас {C:mult}+#2#{C:inactive} множ.)" + } + }, + j_popcorn = { + name = "Попкорн", + text = { + "{C:mult}+#1#{} множ.", + "{C:mult}-#2#{} множ. за каждый", + "сыгранный раунд" + } + }, + j_trousers = { + name = "Запасные брюки", + text = { + "Дает {C:mult}+#1#{} множ., если", + "сыгранная рука содержит", + "{C:attention}#2#", + "{C:inactive}(сейчас {C:red}+#3#{C:inactive} множ.)" + } + }, + j_ancient = { + name = "Древний джокер", + text = { + "Каждая сыгранная карта с", + "мастью {V:1}#2#{} дает", + "{X:mult,C:white} X#1# {} множ. при подсчете очков,", + "{s:0.8}масть меняется в конце раунда" + } + }, + j_ramen = { + name = "Рамен", + text = { + "{X:mult,C:white} X#1# {} множ.,", + "теряет {X:mult,C:white} X#2# {} множ.", + "за каждую сброшенную {C:attention}карту{}" + } + }, + j_walkie_talkie = { + name = "Рация", + text = { + "Каждая сыгранная {C:attention}10{} или {C:attention}4", + "дает {C:chips}+#1#{} шт. фишек и", + "{C:mult}+#2#{} множ. при подсчете очков" + } + }, + j_selzer = { + name = "Зельцер", + text = { + "Перезапуск всех", + "сыгранных карт для", + "{C:attention}#1#{} следующих рук" + } + }, + j_castle = { + name = "Замок", + text = { + "Этот джокер получает {C:chips}+#1#{} шт. фишек", + "за каждую сброшенную карту {V:1}#2#{},", + "масть меняется каждый раунд", + "{C:inactive}(сейчас {C:chips}+#3#{C:inactive} шт. фишек)" + } + }, + j_smiley = { + name = "Улыбочка", + text = { + "Сыгранные карты {C:attention}с лицом{}", + "дают {C:mult}+#1#{} множ.", + "при подсчете очков" + } + }, + j_campfire = { + name = "Костер", + text = { + "Этот джокер дает {X:mult,C:white}X#1#{} множ.", + "за каждую {C:attention}проданную{} карту, сбрасывается", + "при победе над {C:attention}Босс-блайндом{}", + "{C:inactive}(сейчас {X:mult,C:white} X#2# {C:inactive} множ.)" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "Избыток", + text = { + "{C:attention}+1{} слот карты", + "доступен в лавке" + } + }, + v_clearance_sale = { + name = "Распродажа", + text = { + "Все карты и наборы в", + "лавке со скидкой {C:attention}#1#%{}" + } + }, + v_tarot_merchant = { + name = "Торговец Таро", + text = { + "Карты {C:tarot}Таро{} появляются", + "в {C:attention}#1# раз(а){} чаще", + "в лавке" + } + }, + v_planet_merchant = { + name = "Торговец планетами", + text = { + "Карты {C:planet}планет{} появляются", + "в {C:attention}#1# раз(а){} чаще", + "в лавке" + } + }, + v_hone = { + name = "Заточка", + text = { + "{C:dark_edition}Фольговые{}, {C:dark_edition}голографические{} и", + "{C:dark_edition}полихромные{} карты", + "появляются в {C:attention}#1# раз(а){} чаще" + } + }, + v_reroll_surplus = { + name = "Излишек перебросов", + text = { + "Перебросы стоят", + "на {C:money}$#1#{} меньше" + } + }, + v_crystal_ball = { + name = "Хрустальный шар", + text = { + "{C:attention}+1{} слот расходуемого" + } + }, + v_telescope = { + name = "Телескоп", + text = { + "{C:attention}Небесные наборы{} всегда", + "содержат карту {C:planet}планеты{}", + "для вашей наиболее", + "играемой {C:attention}покерной руки" + } + }, + v_grabber = { + name = "Хапуга", + text = { + "Навсегда", + "дает {C:blue}+#1#{} руку", + "на каждый раунд" + } + }, + v_wasteful = { + name = "Транжира", + text = { + "Навсегда", + "дает {C:red}+#1#{} сброс", + "на каждый раунд" + } + }, + v_seed_money = { + name = "Подъемные", + text = { + "Повышение максимума", + "процентов, набираемых", + "за раунд, до {C:money}$#1#{}" + } + }, + v_blank = { + name = "Пусто", + text = { + "{C:inactive}Ничего не делает?" + } + }, + v_magic_trick = { + name = "Фокус", + text = { + "{C:attention}Играемые карты{} можно", + "приобрести", + "в {C:attention}лавке" + } + }, + v_hieroglyph = { + name = "Иероглиф", + text = { + "{C:attention}-#1#{} анте", + "{C:blue}-#1#{} рука", + "на каждый раунд", + "{C:attention}-#1#{} анте" + } + }, + v_directors_cut = { + name = "Режиссерская версия", + text = { + "Переброс Босс-блайнда", + "{C:attention}1{} раз за анте,", + "{C:money}$#1#{} за ролл" + } + }, + v_pattern = { + name = "Шаблон", + text = { + "Создает наиболее используемую", + "вами за все время {C:attention}расходуемую{} карту", + "{E:1,V:1}#1#", + "{C:inactive}(должно быть место)" + } + }, + v_overstock_plus = { + name = "Избыток плюс", + text = { + "{C:attention}+1{} слот карты", + "доступен в лавке" + }, + unlock = { + "Потратить суммарно", + "{C:money}$#1#{} в лавке", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "Ликвидация", + text = { + "Все карты и наборы в", + "лавке со скидкой {C:attention}#1#%{}" + }, + unlock = { + "Выкупить минимум", + "{C:attention}#1#{C:voucher} карт-ваучеров{}", + "в одной партии" + } + }, + v_tarot_tycoon = { + name = "Магнат Таро", + text = { + "Карты {C:tarot}Таро{} появляются", + "в {C:attention}#1# раз(а){} чаще", + "в лавке" + }, + unlock = { + "Купить суммарно", + "{C:attention}#1#{C:tarot} карт(ы) Таро{}", + "в лавке", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "Магнат планет", + text = { + "Карты {C:planet}планет{} появляются", + "в {C:attention}#1# раз(а){} чаще", + "в лавке" + }, + unlock = { + "Купить суммарно", + "{C:attention}#1#{C:planet} карт(ы) планет{}", + "в лавке", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "Свечение", + text = { + "{C:dark_edition}Фольговые{}, {C:dark_edition}голографические{} и", + "{C:dark_edition}полихромные{} карты", + "появляются в {C:attention}#1# раз(а){} чаще" + }, + unlock = { + "Иметь минимум {C:attention}#1#", + "карт(ы) {C:attention}джокера{} с", + "{C:dark_edition}фольговым{}, {C:dark_edition}голографическим{} или", + "{C:dark_edition}полихромным{} выпуском" + } + }, + v_reroll_glut = { + name = "Изобилие перебросов", + text = { + "Перебросы стоят", + "на {C:money}$#1#{} меньше" + }, + unlock = { + "Перебросить лавку", + "суммарно {C:attention}#1#{} раз(а)", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "Омут", + text = { + "{C:spectral}Спектральные{} карты могут", + "появляться в любых", + "{C:attention}наборах аркана" + }, + unlock = { + "Использовать суммарно {C:attention}#1#", + "карт(ы) {C:tarot}Таро{} из любого", + "{C:tarot}набора аркана", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "Обсерватория", + text = { + "Карты {C:planet}планет{} в вашей", + "{C:attention}расходуемой{} зоне дают", + "{X:red,C:white} X#1# {} множ. за", + "соотв. {C:attention}покерную руку" + }, + unlock = { + "Использовать суммарно {C:attention}#1#", + "карт(ы) {C:planet}планет{} из любого", + "{C:planet}Небесного набора", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "Начо Тонг", + text = { + "Навсегда", + "дает {C:blue}+#1#{} руку", + "на каждый раунд" + }, + unlock = { + "Сыграть суммарно", + "{C:attention}#1#{} карт(ы)", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "Рецикломантия", + text = { + "Навсегда", + "дает {C:red}+#1#{} сброс", + "на каждый раунд" + }, + unlock = { + "Сбросить суммарно", + "{C:attention}#1#{} карт(ы)", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "Денежное дерево", + text = { + "Повышение максимума", + "процентов, набираемых", + "за раунд, до {C:money}$#1#{}" + }, + unlock = { + "Набрать максимум", + "процентов за раунд в", + "{C:attention}#1#{} раундах подряд", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "Антиматерия", + text = { + "{C:dark_edition}+1{} слот джокера" + }, + unlock = { + "Получить {C:voucher}«Пусто»{}", + "суммарно {C:attention}#1#{} раз(а)", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "Иллюзия", + text = { + "{C:attention}Играемые карты{} в лавке", + "могут иметь {C:enhanced}улучшение{},", + "{C:dark_edition}выпуск{} и/или {C:attention}печать{}" + }, + unlock = { + "Купить суммарно", + "{C:attention}#1#{} играемых карт(ы)", + "в лавке", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "Петроглиф", + unlock = { + "Достичь анте", + "уровня {E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{} анте", + "{C:red}-#1#{} сброс", + "на каждый раунд" + } + }, + v_retcon = { + name = "Реткон", + text = { + "Переброс Босс-блайнда", + "{C:attention}неограниченное{} число раз,", + "по {C:money}$#1#{} за ролл" + }, + unlock = { + "Открыть", + "{C:attention}#1#{} блайнды" + } + }, + v_tesselation = { + name = "Тесселяция", + text = { + "Создает наиболее используемую", + "вами за все время карту {C:attention}джокера{}", + "{E:1,V:1}#1#", + "{C:inactive}(должно быть место)" + }, + unlock = { + "Купить {C:dark_edition}полихромный", + "выпуск наиболее", + "используемого вами {C:attention}джокера", + "в лавке" + } + }, + v_palette = { + name = "Палитра", + text = { + "Держите ({C:attention}+#1#{}) карт", + "в руке", + "{C:attention}+#1#{} размер руки" + }, + unlock = { + "Уменьшите размер руки", + "до {C:attention}#1#{} карт" + } + }, + v_paint_brush = { + name = "Кисть для рисования", + text = { + "{C:attention}+#1#{} размер руки" + } + } + }, + Tarot = { + c_fool = { + name = "Дурак", + text = { + "Создает последнюю", + "карту {C:tarot}Таро{} или {C:planet}планеты{},", + "использованную в этой партии,", + "за исключением {s:0.8,C:tarot}Дурака{s:0.8}" + } + }, + c_magician = { + name = "Волшебник", + text = { + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "Верховная Жрица", + text = { + "Создает до {C:attention}#1#", + "случайных карт {C:planet}планет{}", + "{C:inactive}(должно быть место)" + } + }, + c_empress = { + name = "Императрица", + text = { + "Улучшает {C:attention}#1#", + "выбранных(е) карт(ы) до:", + "{C:attention}#2#" + } + }, + c_emperor = { + name = "Император", + text = { + "Создает до {C:attention}#1#", + "случайных карт {C:tarot}Таро{}", + "{C:inactive}(должно быть место)" + } + }, + c_heirophant = { + name = "Иерофант", + text = { + "Улучшает {C:attention}#1#", + "выбранных(е) карт(ы) до:", + "{C:attention}#2#" + } + }, + c_lovers = { + name = "Влюбленные", + text = { + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "Колесница", + text = { + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#" + } + }, + c_justice = { + name = "Правосудие", + text = { + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "Отшельник", + text = { + "Удваивает деньги", + "{C:inactive}(макс. {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "Колесо Фортуны", + text = { + "Шанс {C:green}#1# из #2#{} добавить", + "{C:dark_edition}фольговый{}, {C:dark_edition}голографический{} или", + "{C:dark_edition}полихромный{} выпуск", + "к случайному {C:attention}джокеру" + } + }, + c_strength = { + name = "Сила", + text = { + "Увеличивает достоинство", + "до {C:attention}#1#{} выбранных", + "карт(ы) на {C:attention}1" + } + }, + c_hanged_man = { + name = "Висельник", + text = { + "Уничтожает до", + "{C:attention}#1#{} выбранных карт(ы)" + } + }, + c_death = { + name = "Смерть", + text = { + "Выберите {C:attention}#1#{} карт(ы),", + "{C:attention}левая{} карта будет", + "преобразована в {C:attention}правую{}", + "{C:inactive}(перетащите, чтобы изменить)" + } + }, + c_temperance = { + name = "Умеренность", + text = { + "Дает общую стоимость", + "продажи всех текущих", + "джокеров {C:inactive}(макс. {C:money}$#1#{C:inactive})", + "{C:inactive}(сейчас {C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "Дьявол", + text = { + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#" + } + }, + c_tower = { + name = "Башня", + text = { + "Улучшает {C:attention}#1#{} выбранную", + "карту до:", + "{C:attention}#2#" + } + }, + c_star = { + name = "Звезда", + text = { + "Преобразует до", + "{C:attention}#1#{} выбранных карт", + "в: {V:1}#2#{}" + } + }, + c_moon = { + name = "Луна", + text = { + "Преобразует до", + "{C:attention}#1#{} выбранных карт", + "в: {V:1}#2#{}" + } + }, + c_sun = { + name = "Солнце", + text = { + "Преобразует до", + "{C:attention}#1#{} выбранных карт", + "в: {V:1}#2#{}" + } + }, + c_judgement = { + name = "Суд", + text = { + "Создает случайную", + "карту {C:attention}джокера{}", + "{C:inactive}(должно быть место)" + } + }, + c_world = { + name = "Мир", + text = { + "Преобразует до", + "{C:attention}#1#{} выбранных карт", + "в: {V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "Меркурий", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_venus = { + name = "Венера", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_earth = { + name = "Земля", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_mars = { + name = "Марс", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_jupiter = { + name = "Юпитер", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_saturn = { + name = "Сатурн", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_uranus = { + name = "Уран", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_neptune = { + name = "Нептун", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_pluto = { + name = "Плутон", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_ceres = { + name = "Церера", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_planet_x = { + name = "Планета X", + text = { + "{S:0.8}({S:0.8,V:1}ур.#1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + }, + c_eris = { + name = "Эрида", + text = { + "{S:0.8}({S:0.8,V:1}ур. #1#{S:0.8}){} Повышение уровня", + "{C:attention}#2#", + "{C:mult}+#3#{} множ. и", + "{C:chips}+#4#{} шт. фишек" + } + } + }, + Spectral = { + c_familiar = { + name = "Фамильяр", + text = { + "Уничтожает {C:attention}1{} случайную", + "карту в вашей руке, добавляет", + "{C:attention}#1#{} случайную {C:attention}улучшенную карту", + "{C:attention}с лицом{} в вашу руку" + } + }, + c_grim = { + name = "Мрак", + text = { + "Уничтожает {C:attention}1{} случайную", + "карту в вашей руке,", + "добавляет {C:attention}#1#{} случайную {C:attention}улучшенную карту", + "{C:attention}туза(ов){} в вашу руку" + } + }, + c_incantation = { + name = "Заклинание", + text = { + "Уничтожает {C:attention}1{} случайную", + "карту в вашей руке, добавляет {C:attention}#1#", + "случайную {C:attention}улучшенную числовую", + "{C:attention}карт(ы){} в вашу руку" + } + }, + c_talisman = { + name = "Талисман", + text = { + "Добавляет {C:attention}золотую печать{}", + "к {C:attention}1{} выбранной", + "карте в вашей руке" + } + }, + c_aura = { + name = "Аура", + text = { + "Добавляет {C:dark_edition}фольговый{}, {C:dark_edition}голографический{}", + "или {C:dark_edition}полихромный{} эффект к", + "{C:attention}1{} выбранной карте в руке" + } + }, + c_wraith = { + name = "Призрак", + text = { + "Создает случайного", + "{C:red}редкого{C:attention} джокера{},", + "устанавливает деньги на {C:money}$0" + } + }, + c_sigil = { + name = "Символ", + text = { + "Преобразует все карты", + "в руке в одну", + "случайную {C:attention}масть" + } + }, + c_ouija = { + name = "Уиджа", + text = { + "Преобразует все карты", + "в руке в одно", + "случайное {C:attention}достоинство", + "{C:red}-1{} размер руки" + } + }, + c_ectoplasm = { + name = "Эктоплазма", + text = { + "Добавляет {C:dark_edition}негатив{} к", + "случайному {C:attention}джокеру,", + "{C:red}-1{} размер руки" + } + }, + c_immolate = { + name = "Жертвоприношение", + text = { + "Уничтожает {C:attention}#1#{} случ.", + "карт(ы) в руке,", + "дает {C:money}$#2#" + } + }, + c_soul = { + name = "Душа", + text = { + "Создает", + "{C:legendary,E:1}легендарного{} джокера", + "{C:inactive}(должно быть место)" + } + }, + c_black_hole = { + name = "Черная дыра", + text = { + "Повышает каждую", + "{C:legendary,E:1}покерную руку", + "на {C:attention}1{} уровень" + } + }, + c_ankh = { + name = "Анх", + text = { + "Создайте копию", + "случайного {C:attention}джокера{}, уничтожьте", + "всех остальных джокеров" + } + }, + c_deja_vu = { + name = "Дежавю", + text = { + "Добавьте {C:red}красную печать{}", + "к {C:attention}1{} выбранной", + "карте в вашей руке" + } + }, + c_hex = { + name = "Порча", + text = { + "Добавьте {C:dark_edition}полихром{}", + "случайному {C:attention}джокеру{}, уничтожьте", + "всех остальных джокеров" + } + }, + c_trance = { + name = "Транс", + text = { + "Добавьте {C:blue}синюю печать{}", + "к {C:attention}1{} выбранной", + "карте в вашей руке" + } + }, + c_medium = { + name = "Медиум", + text = { + "Добавьте {C:purple}фиолетовую печать{}", + "к {C:attention}1{} выбранной", + "карте в вашей руке" + } + }, + c_cryptid = { + name = "Криптид", + text = { + "Создайте {C:attention}#1#{} копии", + "{C:attention}1{} выбранной карты", + "в руке" + } + } + }, + Edition = { + e_base = { + name = "База", + text = { + "Без дополнительных эффектов" + } + }, + e_foil = { + name = "Фольговый", + text = { + "{C:chips}+#1#{} шт. фишек" + } + }, + e_holo = { + name = "Голографический", + text = { + "{C:mult}+#1#{} множ." + } + }, + e_polychrome = { + name = "Полихромный", + text = { + "{X:mult,C:white} X#1# {} множ." + } + }, + e_negative = { + name = "Негативный", + text = { + "{C:dark_edition}+#1#{} слот джокера" + } + }, + e_negative_consumable = { + name = "Негативный", + text = { + "{C:dark_edition}+#1#{} слот расходуемого" + } + } + }, + Enhanced = { + m_bonus = { + name = "Бонусная карта", + text = {} + }, + m_mult = { + name = "Карта множителя", + text = { + "{C:mult}+#1#{} множ." + } + }, + m_wild = { + name = "Дикая карта", + text = { + "Может использоваться", + "как любая масть" + } + }, + m_glass = { + name = "Стеклянная карта", + text = { + "{X:mult,C:white} X#1# {} множ.", + "Шанс {C:green}#2# из #3#{}", + "уничтожить карту" + } + }, + m_steel = { + name = "Стальная карта", + text = { + "{X:mult,C:white} X#1# {} множ.,", + "пока эта карта", + "остается в руке" + } + }, + m_stone = { + name = "Каменная карта", + text = { + "{C:chips}+#1#{} шт. фишек", + "без достоинства или масти" + } + }, + m_gold = { + name = "Золотая карта", + text = { + "{C:money}$#1#{}, если эта", + "карта есть в руке", + "в конце раунда" + } + }, + m_lucky = { + name = "Счастливая карта", + text = { + "Шанс {C:green}#1# из #3#{}", + "на {C:mult}+#2#{} множ.", + "Шанс {C:green}#1# из #5#{}", + "выиграть {C:money}$#4#" + } + } + }, + Stake = { + stake_white = { + name = "Белая ставка", + text = { + "Базовая сложность" + } + }, + stake_red = { + name = "Красная ставка", + text = { + "{C:attention}Малый блайнд{} не дает", + "денег в награду", + "{s:0.8}Применяет все предыдущие ставки" + } + }, + stake_green = { + name = "Зеленая ставка", + text = { + "Требуемые очки масштабируются", + "быстрее для каждого {C:attention}анте", + "{s:0.8}Применяет все предыдущие ставки" + } + }, + stake_blue = { + name = "Синяя ставка", + text = { + "{C:red}-1{} сброс", + "{s:0.8}Применяет все предыдущие ставки" + } + }, + stake_black = { + name = "Черная ставка", + text = { + "В лавке могут быть {C:attention}вечные{} джокеры", + "{C:inactive,s:0.8}{нельзя продать или уничтожить}", + "{s:0.8}Применяет все предыдущие ставки" + } + }, + stake_purple = { + name = "Фиолетовая ставка", + text = { + "Требуемые очки масштабируются", + "быстрее для каждого {C:attention}анте", + "{s:0.8}Применяет все предыдущие ставки" + } + }, + stake_orange = { + name = "Оранжевая ставка", + text = { + "{C:attention}Бустерные наборы{} стоят", + "на {C:money}$1{} больше с каждым анте", + "{s:0.8}Применяет все предыдущие ставки" + } + }, + stake_gold = { + name = "Золотая ставка", + text = { + "{C:red}-1{} размер руки", + "{s:0.8}Применяет все предыдущие ставки" + } + } + }, + Tag = { + tag_uncommon = { + name = "Необычный тег", + text = { + "В лавке есть", + "{C:green}необычный джокер" + } + }, + tag_rare = { + name = "Редкий тег", + text = { + "В лавке есть", + "{C:red}редкий джокер" + } + }, + tag_negative = { + name = "Негативный тег", + text = { + "В лавке есть", + "{C:dark_edition}негативный джокер" + } + }, + tag_foil = { + name = "Фольговый тег", + text = { + "В лавке есть", + "{C:dark_edition}фольговый джокер" + } + }, + tag_holo = { + name = "Голографический тег", + text = { + "В лавке есть", + "{C:dark_edition}голографический джокер" + } + }, + tag_polychrome = { + name = "Полихромный тег", + text = { + "В лавке есть", + "{C:dark_edition}полихромный джокер" + } + }, + tag_investment = { + name = "Инвестиционный тег", + text = { + "После победы", + "над Босс-блайндом", + "дает {C:money}$#1#" + } + }, + tag_voucher = { + name = "Тег ваучера", + text = { + "Добавляет один {C:voucher}ваучер", + "в следующую лавку" + } + }, + tag_boss = { + name = "Тег босса", + text = { + "Перебрасывает", + "{C:attention}Босс-блайнд" + } + }, + tag_standard = { + name = "Стандартный тег", + text = { + "Дает бесплатный", + "{C:attention}Мегастандартный набор" + } + }, + tag_charm = { + name = "Тег очарования", + text = { + "Дает бесплатный", + "{C:tarot}Набор мегааркана" + } + }, + tag_meteor = { + name = "Тег метеора", + text = { + "Дает бесплатный", + "{C:planet}Меганебесный набор" + } + }, + tag_buffoon = { + name = "Тег шута", + text = { + "Дает бесплатный", + "{C:attention}Набор шута" + } + }, + tag_handy = { + name = "Ручной тег", + text = { + "Дает {C:money}$#1#{} за каждую сыгранную", + "{C:blue}руку{} в этой партии", + "{C:inactive}(даст {C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "Мусорный тег", + text = { + "Дает {C:money}$#1#{} за каждый неиспользованный", + "{C:red}сброс{} в этой партии", + "{C:inactive}(даст {C:money}$#2#{C:inactive})" + } + }, + tag_coupon = { + name = "Тег купона", + text = { + "Начальные карты и", + "бустерные наборы в следующей", + "лавке бесплатны" + } + }, + tag_double = { + name = "Двойной тег", + text = { + "Дает копию", + "следующего выбранного {C:attention}тега{},", + "{s:0.8}за исключением {s:0.8,C:attention}двойного тега" + } + }, + tag_juggle = { + name = "Жонглерский тег", + text = { + "{C:attention}+#1#{} размер руки", + "на следующий раунд" + } + }, + tag_d_six = { + name = "Тег D6", + text = { + "Перебросы в следующей лавке", + "начинаются при {C:money}$0" + } + }, + tag_top_up = { + name = "Тег пополнения", + text = { + "Создать до {C:attention}#1#", + "{C:blue}обычных{} джокеров", + "{C:inactive}(должно быть место)" + } + }, + tag_skip = { + name = "Тег скорости", + text = { + "Дает по {C:money}$#1#{} за пропущенный", + "блайнд в этой партии", + "{C:inactive}(даст {C:money}$#2#{C:inactive})" + } + }, + tag_orbital = { + name = "Орбитальный тег", + text = { + "Повышает {C:attention}#1#", + "на {C:attention}#2# ур." + } + }, + tag_economy = { + name = "Экономический тег", + text = { + "Удваивает ваши деньги", + "{C:inactive}(макс. {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "Эфирный тег", + text = { + "Дает бесплатный", + "{C:planet}Спектральный набор" + } + } + }, + Blind = { + bl_small = { + name = "Малый блайнд", + text = {} + }, + bl_big = { + name = "Большой блайнд", + text = {} + }, + bl_hook = { + name = "Крюк", + text = { + "Сбрасывает по 2 случайные", + "карты за каждую сыгранную руку" + } + }, + bl_wall = { + name = "Стена", + text = { + "Особо большой блайнд" + } + }, + bl_wheel = { + name = "Колесо", + text = { + " из 7 карт тянутся", + "лицом вниз" + } + }, + bl_arm = { + name = "Рука", + text = { + "Уменьшает уровень", + "играемой покерной руки" + } + }, + bl_psychic = { + name = "Экстрасенс", + text = { + "Необходимо сыграть 5 карт" + } + }, + bl_goad = { + name = "Побуждение", + text = { + "Все пиковые карты", + "ослабляются" + } + }, + bl_water = { + name = "Вода", + text = { + "Начинайте с", + "0 сбросов" + } + }, + bl_eye = { + name = "Глаз", + text = { + "Без повторяемых типов", + "рук в этом раунде" + } + }, + bl_mouth = { + name = "Пасть", + text = { + "Играйте только 1 тип", + "руки в этом раунде" + } + }, + bl_plant = { + name = "Цветок", + text = { + "Все карты с лицом", + "ослабляются" + } + }, + bl_needle = { + name = "Игла", + text = { + "Играйте только 1 руку" + } + }, + bl_head = { + name = "Голова", + text = { + "Все червовые карты", + "ослабляются" + } + }, + bl_tooth = { + name = "Зуб", + text = { + "Потеряйте $1 за каждую", + "сыгранную карту" + } + }, + bl_final_leaf = { + name = "Зеленый лист", + text = { + "Все карты ослабляются", + "до продажи 1 джокера" + } + }, + bl_final_vessel = { + name = "Фиолетовый сосуд", + text = { + "Очень большой блайнд" + } + }, + bl_ox = { + name = "Буйвол", + text = { + "Игра #1#", + "устанавливает деньги на $0" + } + }, + bl_house = { + name = "Дом", + text = { + "Первая рука тянется", + "лицом вниз" + } + }, + bl_club = { + name = "Трефа", + text = { + "Все трефовые карты", + "ослабляются" + } + }, + bl_fish = { + name = "Рыба", + text = { + "Карты тянутся лицом вниз", + "после каждой сыгранной руки" + } + }, + bl_window = { + name = "Окно", + text = { + "Все бубновые карты", + "ослабляются" + } + }, + bl_manacle = { + name = "Кандалы", + text = { + "-1 размер руки" + } + }, + bl_serpent = { + name = "Змей", + text = { + "После игры или сброса", + "всегда тяните 3 карты" + } + }, + bl_pillar = { + name = "Столп", + text = { + "Ранее сыгранные карты", + "ослабляются в этом анте" + } + }, + bl_flint = { + name = "Кремень", + text = { + "Базовые фишки и", + "множ. делятся пополам" + } + }, + bl_mark = { + name = "Знак", + text = { + "Все карты с лицом", + "тянутся лицом вниз" + } + }, + bl_final_acorn = { + name = "Янтарный желудь", + text = { + "Переворачивает и тасует", + "все карты джокеров" + } + }, + bl_final_heart = { + name = "Багровое сердце", + text = { + "Один случайный джокер", + "отключается с каждой рукой" + } + }, + bl_final_bell = { + name = "Лазурный колокольчик", + text = { + "1 карта принудительно", + "выбирается всегда" + } + } + }, + Back = { + b_red = { + name = "Красная колода", + text = { + "{C:red}+#1#{} сброс", + "в каждом раунде" + } + }, + b_blue = { + name = "Синяя колода", + text = { + "{C:blue}+#1#{} рука", + "в каждом раунде" + } + }, + b_yellow = { + name = "Желтая колода", + text = { + "Начинайте с", + "дополнительными {C:money}$#1#" + } + }, + b_green = { + name = "Зеленая колода", + text = { + "В конце каждого раунда:", + "{C:money}$#1#{s:0.85} за каждую оставшуюся {C:blue}руку", + "{C:money}$#2#{s:0.85} за каждый оставшийся {C:red}сброс", + "Без набора {C:attention}процентов" + } + }, + b_black = { + name = "Черная колода", + text = { + "{C:attention}+#1#{} слот джокера", + "", + "{C:blue}-#2#{} рука", + "в каждом раунде" + } + }, + b_magic = { + name = "Волшебная колода", + text = { + "Начинаете партию с", + "{C:tarot,T:v_crystal_ball}#1#{} ваучером", + "и {C:attention}2{} копиями:", + "из {C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "Колода туманности", + text = { + "Начинаете партию с", + "{C:planet,T:v_telescope}#1#{} ваучером", + "", + "и {C:red}#2#{} слотом расходуемого" + } + }, + b_metal = { + name = "Металлическая колода", + text = { + "Начинаете партию с {C:attention}#1#", + "играемыми картами, улучшенными", + "до {C:attention}стальных карт" + } + }, + b_abandoned = { + name = "Заброшенная колода", + text = { + "Начинаете партию", + "без {C:attention}карт с лицом", + "в вашей колоде" + } + }, + b_checkered = { + name = "Клетчатая колода", + text = { + "Начинаете партию с", + "{C:attention}26{C:spades} пиками{} и", + "{C:attention}26{C:hearts} червами{} в колоде" + } + }, + b_rocky = { + name = "Скалистая колода", + text = { + "Начинаете партию с {C:attention}#1#", + "дополнительными {C:attention}каменными картами" + } + }, + b_braided = { + name = "Плетеная колода", + text = { + "Первая играемая рука", + "улучшена до {C:attention}ур. 3" + } + }, + b_anaglyph = { + name = "Анаглифическая колода", + text = { + "После победы над каждым", + "{C:attention}Босс-блайндом{} получите:", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "Плазменная колода", + text = { + "Баланс {C:blue}фишек{} и", + "{C:red}множ.{} при расчете", + "очков для сыгранной руки", + "{C:red}X#1#{} базовый размер блайнда" + } + }, + b_erratic = { + name = "Неустойчивая колода", + text = { + "Все {C:attention}достоинства{} и", + "{C:attention}масти{} в колоде", + "случайны" + } + }, + b_challenge = { + name = "Колода испытаний", + text = { + "" + } + }, + b_ghost = { + name = "Призрачная колода", + text = { + "{C:spectral}Спектральные{} карты могут", + "появляется в лавке,", + "начинается с карты {C:spectral,T:c_hex}Порчи{}" + } + }, + b_zodiac = { + name = "Зодиакальная колода", + text = { + "Начинаете партию с", + "{C:tarot,T:v_tarot_merchant}#1#{},", + "{C:planet,T:v_planet_merchant}#2#{},", + "и {C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "Рисованная колода", + text = { + "{C:attention}+#1#{} размер руки", + "{C:red}#2#{} слот джокера" + } + } + }, + Other = { + gold_seal = { + name = "Золотая печать", + text = { + "Получите {C:money}$3{}, когда", + "разыгрывается эта карта", + "и подсчитывается" + } + }, + white_sticker = { + name = "Белая наклейка", + text = { + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}белой", + "{C:attention}ставки{}" + } + }, + red_sticker = { + name = "Красная наклейка", + text = { + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}красной", + "{C:attention}ставки{}" + } + }, + green_sticker = { + name = "Зеленая наклейка", + text = { + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}зеленой", + "{C:attention}ставки{}" + } + }, + blue_sticker = { + name = "Синяя наклейка", + text = { + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}синей", + "{C:attention}ставки{}" + } + }, + black_sticker = { + name = "Черная наклейка", + text = { + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}черной", + "{C:attention}ставки{}" + } + }, + purple_sticker = { + name = "Фиолетовая наклейка", + text = { + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}фиолетовой", + "{C:attention}ставки{}" + } + }, + orange_sticker = { + name = "Оранжевая наклейка", + text = { + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}оранжевой", + "{C:attention}ставки{}" + } + }, + gold_sticker = { + name = "Золотая наклейка", + text = { + "Этот джокер использовался", + "для выигрыша на сложности {C:attention}золотой", + "{C:attention}ставки{}" + } + }, + playing_card = { + text = { + "{C:light_black}#1# из {V:1}#2#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{} шт. фишек" + } + }, + card_extra_chips = { + text = { + "Бонус {C:chips}+#1#{} шт. фишек" + } + }, + locked = { + name = "Заблокировано", + text = {} + }, + debuffed_default = { + name = "Ослаблено", + text = { + "Все способности", + "отключены" + } + }, + debuffed_playing_card = { + name = "Ослаблено", + text = { + "Подсчет без фишек", + "и все способности", + "отключены" + } + }, + demo_locked = { + name = "Заблокировано", + text = { + "Недоступно", + "в этом демо" + } + }, + demo_shop_locked = { + name = "Заблокировано", + text = { + "Карта {C:attention}Джимбо", + "из личной коллекции,", + "доступная в полной", + "версии {E:1,C:red}Balatro" + } + }, + wip_locked = { + name = "Заблокировано", + text = { + "Разработка", + "в процессе" + } + }, + deck_locked_win = { + name = "Заблокировано", + text = { + "Выиграть партию с:", + "{C:attention}#1#{}", + "на любой сложности" + } + }, + deck_locked_discover = { + name = "Заблокировано", + text = { + "Открыть минимум", + "{C:attention}#1#{} предм. из", + "вашей коллекции" + } + }, + deck_locked_stake = { + name = "Заблокировано", + text = { + "Выиграть партию с любой", + "колодой на сложности", + "минимум {V:1}#1#{}" + } + }, + joker_locked_legendary = { + name = "Заблокировано", + text = { + "Найти этого джокера", + "из карты {C:spectral}Души{}" + } + }, + undiscovered_joker = { + name = "Не открыто", + text = { + "Купите или используйте", + "эту карту в партии", + "без сида, чтобы", + "узнать, что она делает" + } + }, + undiscovered_tarot = { + name = "Не открыто", + text = { + "Купите или используйте", + "эту карту в партии", + "без сида, чтобы", + "узнать, что она делает" + } + }, + undiscovered_planet = { + name = "Не открыто", + text = { + "Купите или используйте", + "эту карту в партии", + "без сида, чтобы", + "узнать, что она делает" + } + }, + undiscovered_spectral = { + name = "Не открыто", + text = { + "Купите или используйте", + "эту карту в партии", + "без сида, чтобы", + "узнать, что она делает" + } + }, + undiscovered_voucher = { + name = "Не открыто", + text = { + "Выкупите этот", + "ваучер в партии", + "без сида, чтобы", + "узнать, что он делает" + } + }, + undiscovered_booster = { + name = "Не открыто", + text = { + "Откройте этот набор", + "в партии без сида,", + "чтобы узнать, что он делает" + } + }, + undiscovered_edition = { + name = "Не открыто", + text = { + "Найдите этот выпуск", + "в партии без сида,", + "чтобы узнать, что он делает" + } + }, + undiscovered_tag = { + name = "Не открыто", + text = { + "Используйте этот тег в", + "партии без сида, чтобы", + "узнать, что он делает" + } + }, + p_arcana_normal = { + name = "Набор аркана", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:tarot} карт Таро{}, чтобы", + "использовать немедленно" + } + }, + p_arcana_jumbo = { + name = "Набор аркана Джамбо", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:tarot} карт Таро{}, чтобы", + "использовать немедленно" + } + }, + p_arcana_mega = { + name = "Набор мегааркана", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:tarot} карт Таро{}, чтобы", + "использовать немедленно" + } + }, + p_celestial_normal = { + name = "Небесный набор", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:planet} карт планет{}, чтобы", + "использовать немедленно" + } + }, + p_celestial_jumbo = { + name = "Небесный набор Джамбо", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:planet} карт планет{}, чтобы", + "использовать немедленно" + } + }, + p_celestial_mega = { + name = "Меганебесный набор", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:planet} карт планет{}, чтобы", + "использовать немедленно" + } + }, + p_spectral_normal = { + name = "Спектральный набор", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:spectral} спектральных{} карт, чтобы", + "использовать немедленно" + } + }, + p_spectral_jumbo = { + name = "Спектральный набор Джамбо", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:spectral} спектральных{} карт, чтобы", + "использовать немедленно" + } + }, + p_spectral_mega = { + name = "Мегаспектральный набор", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:spectral} спектральных{} карт, чтобы", + "использовать немедленно" + } + }, + p_standard_normal = { + name = "Стандартный набор", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:attention} играемых{} карт, чтобы", + "добавить их в вашу колоду" + } + }, + p_standard_jumbo = { + name = "Стандартный набор Джамбо", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:attention} играемых{} карт, чтобы", + "добавить их в вашу колоду" + } + }, + p_standard_mega = { + name = "Мегастандартный набор", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:attention} играемых{} карт, чтобы", + "добавить их в вашу колоду" + } + }, + p_buffoon_normal = { + name = "Набор шута", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:joker} карт джокеров{}" + } + }, + p_buffoon_jumbo = { + name = "Набор шута Джамбо", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:joker} карт джокеров{}" + } + }, + p_buffoon_mega = { + name = "Меганабор шута", + text = { + "Выберите {C:attention}#1#{} из", + "{C:attention}#2#{C:joker} карт джокеров{}" + } + }, + pinned_left = { + name = "Закреплено", + text = { + "Этот джокер остается", + "закрепленным в", + "крайней левой позиции" + } + }, + red_seal = { + name = "Красная печать", + text = { + "Перезапуск этой", + "карты {C:attention}1{} раз" + } + }, + blue_seal = { + name = "Синяя печать", + text = { + "Создает карту {C:planet}планеты{},", + "если эта карта {C:attention}удерживается{} в", + "руки в конце раунда" + } + }, + purple_seal = { + name = "Фиолетовая печать", + text = { + "Создает карту {C:tarot}Таро{}", + "при {C:attention}сбросе", + "{C:inactive}(должно быть место)" + } + }, + eternal = { + name = "Вечное", + text = { + "Нельзя продать", + "или уничтожить" + } + }, + challenge_locked = { + name = "Заблокировано", + text = { + "Выиграйте партию с минимум", + "#1# разными колодами, чтобы открыть", + "режим испытания", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "Пики", + Hearts = "Черви", + Clubs = "Трефы", + Diamonds = "Бубны" + }, + suits_plural = { + Spades = "Пики", + Hearts = "Черви", + Clubs = "Трефы", + Diamonds = "Бубны" + }, + blind_states = { + Select = "Выбрать", + Skipped = "Пропущено", + Current = "Сейчас", + Defeated = "Побежден", + Upcoming = "Следующее", + Selected = "Выбрано" + }, + ranks = { + Ace = "Туз", + King = "Король", + Queen = "Дама", + Jack = "Валет", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "Лучшая рука", + furthest_round = "Наивысший раунд", + furthest_ante = "Наивысшее анте", + most_money = "Максимум денег", + boss_streak = "Максимум боссов подряд", + collection = "Коллекция", + win_streak = "Лучшая серия побед", + current_streak = "", + poker_hand = "Наиболее часто сыгранная рука" + }, + poker_hands = { + ['Flush House'] = "Флеш-хаус", + ['Five of a Kind'] = "Пять одного вида", + ['Royal Flush'] = "Флеш-рояль", + ['Straight Flush'] = "Стрит-флеш", + ['Four of a Kind'] = "Каре", + ['Full House'] = "Фулл-хаус", + ['Flush'] = "Флеш", + ['Straight'] = "Стрит", + ['Three of a Kind'] = "Сет", + ['Two Pair'] = "Две пары", + ['Pair'] = "Пара", + ['High Card'] = "Старшая карта", + ['Flush Five'] = "Флеш-пять" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "Сет и пара со", + "всеми картами одной масти" + }, + ['Five of a Kind'] = { + "5 карт одного достоинства" + }, + ['Royal Flush'] = { + "5 карт в ряд {последовательные ранги} со", + "всеми картами одной масти" + }, + ['Straight Flush'] = { + "5 карт в ряд {последовательные ранги} со", + "всеми картами одной масти" + }, + ['Four of a Kind'] = { + "4 карты одного достоинства. Они могут", + "быть сыграны с 1 неподсчитанной картой" + }, + ['Full House'] = { + "Сет и пара" + }, + ['Flush'] = { + "5 карт одной масти" + }, + ['Straight'] = { + "5 карт по порядку {последовательных достоинств}" + }, + ['Three of a Kind'] = { + "3 карты одного достоинства. Они могут", + "быть сыграны с 2 неподсчитанными картами" + }, + ['Two Pair'] = { + "2 пары карт разного достоинства, могут", + "быть сыграны с 1 неподсчитанной картой" + }, + ['Pair'] = { + "2 карты одного достоинства. Они могут", + "быть сыграны с 3 неподсчитанными картами" + }, + ['High Card'] = { + "Если сыгранная рука не является одной из вышеуказанных", + "рук, считается только карта с наибольшим достоинством" + }, + ['Flush Five'] = { + "5 карт с одинаковыми достоинством и мастью" + } + }, + labels = { + common = "Обычная", + uncommon = "Необычная", + rare = "Редкая", + legendary = "Легендарная", + tarot = "Таро", + planet = "Планета", + pluto_planet = "Карликовая планета", + voucher = "Ваучер", + foil = "Фольговый", + holographic = "Голографический", + polychrome = "Полихромный", + negative = "Негатив", + gold_seal = "Золотая печать", + locked = "Заблокировано", + blue_seal = "Синяя печать", + red_seal = "Красная печать", + purple_seal = "Фиолетовая печать", + eternal = "Вечное", + pinned_left = "Закреплено" + }, + dictionary = { + b_sell = "ПРОДАТЬ", + b_use = "ИСПОЛЬЗОВАТЬ", + b_select = "ВЫБРАТЬ", + b_buy = "КУПИТЬ", + b_redeem = "ВЫКУПИТЬ", + b_open = "ОТКРЫТЬ", + b_and_use = "И ИСПОЛЬЗОВАТЬ", + b_next_round_1 = "Дальше", + b_next_round_2 = "Раунд", + b_play_hand = "Играть руку", + b_discard = "Сброс", + b_sort_hand = "Сортировать руку", + b_run_info_1 = "Партия", + b_run_info_2 = "Детали", + b_options = "Параметры", + b_reroll_boss = "Переброс босса", + b_skip_blind = "Пропустить блайнд", + b_skip_reward = "Пропустить награду", + b_skip = "Пропуcк", + b_start_new_run = "Новая партия", + b_main_menu = "Главное меню", + b_collection = "Коллекция", + b_seed = "Сид", + b_copy_seed = "Копировать сид", + b_credits = "Титры", + b_stats = "Статистика", + b_settings = "Настройки", + b_set_game = "Игра", + b_set_video = "Видео", + b_set_graphics = "Графика", + b_set_audio = "Аудио", + b_set_gamespeed = "Скорость игры", + b_set_play_discard_pos = "Положение кнопки «Игра/Сброс»", + b_set_screenshake = "Тряска экрана", + b_set_crash_reports = "Отчеты о сбоях", + b_set_monitor = "Монитор вывода", + b_set_windowmode = "Оконный режим", + b_set_apply = "Применить", + b_set_master_vol = "Основная громкость", + b_set_music_vol = "Громкость музыки", + b_set_game_vol = "Громкость игры", + b_set_shadows = "Тени", + b_set_pixel_smoothing = "Сглаживание пиксель-арта", + b_set_CRT = "ЭЛТ", + b_set_CRT_bloom = "Свечение ЭЛТ", + b_stat_jokers = "Джокеры", + b_stat_consumables = "Расходуемое", + b_stat_tarots = "Таро", + b_stat_planets = "Планеты", + b_stat_spectrals = "Спектральные", + b_stat_vouchers = "Ваучеры", + b_next = "Дальше", + b_endless = "Бесконечный режим", + b_wishlist = "Список желаний в Steam", + b_playbalatro = "Посетите playbalatro.com", + b_remaining = "Осталось", + b_full_deck = "Полная колода", + b_poker_hands = "Покерные руки", + b_blinds = "Блайнды", + b_vouchers = "Ваучеры", + b_stake = "Ставка", + b_jokers = "Джокеры", + b_tarot_cards = "Карты Таро", + b_planet_cards = "Карты планет", + b_spectral_cards = "Спектральные карты", + b_enhanced_cards = "Улучшенные карты", + b_editions = "Выпуски", + b_booster_packs = "Бустерные наборы", + b_tags = "Теги", + b_decks = "Колоды", + b_continue = "Продолжить", + b_back = "Назад", + b_music = "Музыка", + b_sounds = "Звуки", + b_imagery = "Изображения", + b_new_run = "Новая партия", + b_challenges = "Испытания", + b_current_profile = "Текущий профиль", + b_load_profile = "Загрузить профиль", + b_create_profile = "Создать профиль", + b_delete_profile = "Удалить профиль", + b_reset_profile = "Сбросить профиль", + b_rules = "Правила", + b_restrictions = "Ограничения", + b_deck = "Колода", + b_play_cap = "ИГРАТЬ", + b_options_cap = "ПАРАМЕТРЫ", + b_collection_cap = "КОЛЛЕКЦИЯ", + b_quit_cap = "ВЫХОД", + b_cash_out = "Обналичить", + k_unknown = "?????", + k_compatible = "совместимо", + k_incompatible = "несовместимо", + k_round = "Раунд", + k_ante = "Анте", + k_seed = "Сид", + k_reroll = "Переброс", + k_mult = "Множ.", + k_rank = "Достоинство", + k_suit = "Масть", + k_stake = "Ставка", + k_common = "Обычная", + k_uncommon = "Необычная", + k_rare = "Редкая", + k_legendary = "Легендарная", + k_debuffed = "Ослаблено", + k_locked = "Заблокировано", + k_undisovered = "Не открыто", + k_joker = "Джокер", + k_voucher = "Ваучер", + k_tarot = "Таро", + k_planet = "Планета", + k_dwarf_planet = "Карликовая планета", + k_planet_q = "Планета?", + k_spectral = "Спектральная", + k_booster = "Бустер", + k_edition = "Выпуск", + k_hud_hands = "Руки", + k_hud_discards = "Сбросы", + k_lower_score = "очки", + k_arcana_pack = "Набор аркана", + k_celestial_pack = "Небесный набор", + k_spectral_pack = "Спектральный набор", + k_standard_pack = "Стандартный набор", + k_buffoon_pack = "Набор шута", + k_enter_text = "Введите текст", + k_defeated_by = "Поражение от:", + k_level_prefix = "ур.", + k_also_applied = "Также применено", + k_base_cards = "Базовые карты", + k_effective = "Действительно", + k_aces = "Тузы", + k_face_cards = "Карты с лицом", + k_numbered_cards = "Числовые карты", + k_cap_consumables = "РАСХОДУЕМОЕ", + k_page = "Страница", + k_ante_cap = "АНТЕ", + k_base_cap = "БАЗА", + k_jokers_cap = "ДЖОКЕРЫ", + k_vouchers_cap = "ВАУЧЕРЫ", + k_x_base = "X база", + k_not_discovered = "Не открыто", + k_unlocked_ex = "Разблокировано!", + k_challenge_mode = "Режим испытания", + k_daily_run = "Ежедневная партия", + k_profile = "Профиль", + k_wins = "Победы", + k_empty_caps = "ПУСТО", + k_collection = "Коллекция", + k_stake_level = "Уровень ставки", + k_none = "Нет", + k_game_modifiers = "Модификаторы игры", + k_custom_rules = "Особые правила", + k_banned_cards = "Запрещенные карты", + k_banned_tags = "Запрещенные теги", + k_other = "Другое", + k_money = "Деньги", + k_best_hand = "Лучшая рука", + k_seeded_run = "Партия с сидом", + k_enter_seed = "Введите сид", + k_lvl = "ур.", + k_skipped_cap = "ПРОПУЩЕНО", + k_no_reward = "Без награды", + k_reward = "Награда", + k_nope_ex = "Нет!", + k_or = "или", + k_balanced = "Сбалансировано", + ph_improve_run = "Улучшите свою партию!", + ph_sneak_peek = "Беглый взгляд", + ph_deck_preview_stones = "Камни", + ph_deck_preview_effective = "Действительный итог благодаря джокерам, блайндам и улучшениям карт", + ph_blind_score_at_least = "Минимум очков", + ph_blind_reward = "Награда:", + ph_up_ante_1 = "Повысить анте", + ph_up_ante_2 = "Поднять все блайнды", + ph_up_ante_3 = "Обновить блайнды", + ph_stat_joker = "Всего завершено раундов с этой картой", + ph_stat_consumable = "Количество использований карты", + ph_stat_voucher = "Количество выкупов ваучера", + ph_demo_thanks_1 = "Спасибо за игру", + ph_demo_thanks_2 = "В ДЕМО-ВЕРСИЮ BALATRO", + ph_game_over = "ИГРА ОКОНЧЕНА", + ph_vouchers_redeemed = "Ваучеры, выкупленные в этой партии", + ph_no_vouchers = "В этой партии не были выкуплены ваучеры", + ph_defeat_this_blind_1 = "Победите этот блайнд,", + ph_defeat_this_blind_2 = "чтобы открыть его", + ph_click_confirm = "Щелкните снова, чтобы подтвердить", + ph_choose_blind_1 = "Выберите ваш", + ph_choose_blind_2 = "следующий блайнд", + ph_mr_bones = "Спасены Костлявым", + ph_score_at_least = "Минимум очков", + ph_all_poker_hand = "Все покерные руки", + ph_1_level = "+1 уровень", + ph_boss_disabled = "Босс отключен!", + ph_most_played = "{наиболее часто сыгранная рука}", + ml_demo_thanks_message = { + "Добавляйте Balatro в список", + "желаний в Steam и подписывайтесь на", + "рассылку на playbalatro.com" + }, + ml_eternal = { + "Вечный", + "Нельзя продать", + "или уничтожить" + }, + ml_gold_seal_desc = { + "Золотая печать", + "возвращается в руку", + "при разыгрывании" + }, + ml_crash_report_info = { + "Отчеты о сбоях будут отправлены разработчику,", + "чтобы помочь уменьшить проблемы в будущем.", + "Идентификационные или личные данные не отправляются." + }, + ml_play_discard_pos_opt = { + "Сброс/Игра", + "Игра/Сброс" + }, + ml_windowmode_opt = { + "В окне", + "Полный экран", + "Без границ" + }, + ml_vsync_opt = { + "Верт. синрх. вкл.", + "Верт. синрх. откл." + }, + ml_shadow_opt = { + "Вкл.", + "Откл." + }, + ml_smoothing_opt = { + "Откл.", + "Вкл." + }, + ml_bloom_opt = { + "Откл.", + "Вкл." + }, + ml_card_stats = { + "Карта", + "Статистика" + }, + ml_paste_seed = { + "Вставить", + "Сид" + }, + ml_disabled_seed = { + "Все разблокировки и", + "открытия отключены" + }, + ['$'] = "$", + k_redeemed_ex = "Выкуплено!", + k_duplicated_ex = "Дублировано!", + k_no_room_ex = "Нет места!", + k_no_space_ex = "Нет пространства!", + k_no_other_jokers = "Нет других джокеров!", + k_plus_tarot = "+1 Таро", + k_plus_stone = "+1 Камни", + k_plus_planet = "+1 Планета", + k_plus_spectral = "+1 Спектральная", + k_active_ex = "Активно!", + k_level_up_ex = "Уровень повышен!", + k_upgrade_ex = "Улучшение!", + k_again_ex = "Снова!", + k_val_up = "Значение повышено!", + k_reset = "Перезапуск", + k_extinct_ex = "Исчезло!", + k_safe_ex = "Безопасно!", + k_saved_ex = "Сохранено!", + k_swapped_ex = "Заменено!", + k_copied_ex = "Скопировано!", + k_melted_ex = "Расплавлено!", + b_copy = "Копия", + b_high_contrast_cards = "Высококонтрастные карты", + b_set_rumble = "Вибрация контроллера", + b_seals = "Печати", + b_new_challenge = "Начать новое испытание", + b_unlock_all = "Разблокировать все", + k_active = "активно", + k_deck = "Колода", + k_progress = "Прогресс", + k_challenges = "Испытания", + k_joker_stickers = "Наклейки джокера", + k_deck_stake_wins = "Выигрыш колоды", + k_enter_name = "Введите имя", + k_gold = "Золото", + k_card_stats = "Статистика карт", + k_view = "Просмотр", + k_all_hands = "Все руки", + k_high_score_ex = "Высокий балл!", + k_demo_version_ex = "Демоверсия!", + k_playing_as = "Игра за", + k_choose = "Выбрать", + k_achievements_disabled = "Достижения отключены", + ph_no_boss_active = "босс не активен", + ph_you_win = "ВЫ ПОБЕДИЛИ!", + ph_you_win_demo = "ВЫ ВЫИГРАЛИ В ДЕМО!", + ph_defeat_the_boss = "Победить Босс-блайнд", + ph_score_furthest_ante = "Анте", + ph_score_furthest_round = "Раунд", + ph_score_hand = "Лучшая рука", + ph_score_poker_hand = "Наиболее часто сыгранная рука", + ph_score_new_collection = "Новые открытия", + ph_score_cards_played = "Сыгранные карты", + ph_score_cards_discarded = "Сброшенные карты", + ph_score_times_rerolled = "Количество перебросов", + ph_score_cards_purchased = "Купленные карты", + ml_edition_seal_enhancement_explanation = { + "У каждой игральной карты может быть по одному", + "улучшению, выпуску и печати" + }, + ml_unlock_all_explanation = { + "ВНИМАНИЕ! Разблокировав полную коллекцию,", + "вы отключите достижения для этого профиля!" + }, + k_plus_joker = "+1 джокер", + k_eaten_ex = "Съедено!", + k_eroded_ex = "Разрушено!", + k_achievement = "Достижение", + ph_unscored_hand = "Рука не принесет очки", + ph_alert_debuff_confirm = "Нажмите «Играть» снова, чтобы подтвердить", + k_drank_ex = "Принято!", + k_trophy = "Трофей", + k_trophies_disabled = "Трофеи отключены", + ml_unlock_all_trophies = { + "ВНИМАНИЕ! Разблокировав полную коллекцию,", + "отключит трофеи для этого профиля!" + }, + k_poker_hand = "покерную руку", + ph_4_7_of_clubs = "четыре 7 треф" + }, + v_dictionary = { + a_xmult = "X#1# множ.", + a_mult = "+#1# множ.", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1# размер руки", + a_hands = "+#1# Руки", + a_sold_tally = "#1#/#2# продано", + a_remaining = "#1# осталось", + ante_x_voucher = "ВАУЧЕР #1# АНТЕ", + loyalty_active = "Активно!", + loyalty_inactive = "#1# осталось", + deck_preview_wheel_singular = "Числа могут быть меньшими из-за #1# карты, вытянутой лицом вниз", + deck_preview_wheel_plural = "Числа могут быть меньшими из-за #1# карт, вытянутых лицом вниз", + challenges_completed = "Завершено #1#/#2# испытаний", + interest = "#1# процент за каждые $#2# (#3# макс.)", + remaining_hand_money = "Осталось рук ($#1# каждая)", + remaining_discard_money = "Осталось сбросов ($#1# каждый)", + ml_foil_desc = { + "Фольговый", + "+#1# шт. фишек" + }, + ml_holo_desc = { + "Голографический", + "+#1# множ." + }, + ml_polychrome_desc = { + "Полихромный", + "X#1# множ." + }, + ml_negative_desc = { + "Негатив", + "+#1# слот джокера" + }, + a_mult_minus = "-#1# множ.", + a_handsize_minus = "-#1# размер руки", + ml_negative_consumable_desc = { + "Негативный", + "+#1# слот расходуемого" + }, + a_xmult_minus = "-X#1# множ.", + unlocked = "Разблокировано: #1#/#2#", + completed = "Завершено: #1#/#2#" + }, + v_text = { + ch_m_dollars = { + "Начинайте с {C:money}$#1#" + }, + ch_m_hands = { + "Рук за раунд: {C:blue}#1#{} " + }, + ch_m_discards = { + "Сбросов за раунд: {C:red}#1#{}" + }, + ch_m_reroll_cost = { + "Базовая стоимость переброса: {C:money}$#1#{}" + }, + ch_m_joker_slots = { + "Слота(ов) джокера: {C:attention}#1#{}" + }, + ch_m_consumable_slots = { + "Слота(ов) расходуемого: {C:attention}#1#{}" + }, + ch_m_hand_size = { + "{C:attention}#1#{} размер руки" + }, + ch_m_none = { + "{C:inactive}Нет" + }, + ch_c_no_reward = { + "Все {C:attention}блайнды{} не дают денег в награду" + }, + ch_c_no_reward_specific = { + "{C:attention}#1# блайнда(ов){} не дают денег в награду" + }, + ch_c_no_extra_hand_money = { + "Дополнительные {C:blue}руки{} больше не приносят деньги" + }, + ch_c_no_interest = { + "В конце раунда не заработаете {C:attention}процентов{}" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}Ежедневное испытание!" + }, + ch_c_set_seed = { + "1 попытка с сидом: {C:inactive}{Hidden}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}Фишки{} не могут превысить текущее количество {C:money}$" + }, + ch_c_none = { + "{C:inactive}Нет" + }, + ch_c_inflation = { + "Постоянное повышение цен на {C:money}$1{} при каждой покупке" + }, + ch_c_discard_cost = { + "Каждый сброс стоит {C:money}$#1#{}" + }, + ch_c_all_eternal = { + "Все джокеры в лавке {C:eternal}вечные{}" + }, + ch_c_flipped_cards = { + "{C:green}1 из #1#{} карт разыгрываются рубашкой вверх" + }, + ch_c_minus_hand_size_per_X_dollar = { + "Держите в руке {C:red}-1{} карты(у) за каждый(е): {C:money}$#1#{}" + }, + ch_c_no_shop_jokers = { + "Джокеры больше не появляются в {C:attention}лавке" + }, + ch_c_debuff_played_cards = { + "Все {C:attention}сыгранные{} карты становятся {C:attention}ослабленными{} после подсчета" + }, + ch_c_set_eternal_ante = { + "Когда босс анте {C:attention}#1#{} побежден, все джокеры становятся {C:attention}вечными" + }, + ch_c_set_joker_slots_ante = { + "Когда босс анте {C:attention}#1#{} побежден, слоты джокера становятся: {C:attention}0" + } + }, + tutorial = { + sb_1 = { + "Привет! Меня зовут", + "{C:attention}Джимбо{}, я здесь, чтобы помочь", + "вам научиться играть!" + }, + sb_2 = { + "Ваша цель — зарабатывать", + "{C:blue}фишки{}, чтобы побить", + "{C:attention}блайнд противника" + }, + sb_3 = { + "Это {C:blue}малый блайнд{},", + "и вам нужно всего", + "{C:attention}300 фишек{}, чтобы побить его." + }, + sb_4 = { + "Выберите {C:blue}малый блайнд,", + "чтобы начать раунд!" + }, + bb_1 = { + "Выбор {C:attention}большого блайнда", + "принесет немного денег" + }, + bb_2 = { + "Или же выберите {C:attention}пропустить его,", + "чтобы получить {C:attention}тег{}! Каждый", + "{C:attention}тег{} обладает уникальным эффектом" + }, + bb_3 = { + "Но следите за", + "{C:attention}Босс-блайндом{}. У него", + "есть способность, вокруг", + "которой нужно строить тактику." + }, + bb_4 = { + "Если побьете его, то", + "{C:attention}анте{} поднимется и все", + "{C:attention}блайнды{} станут сложнее" + }, + bb_5 = { + "Побейте {C:attention}анте{} #1#, чтобы выиграть.", + "Выберите свой путь!" + }, + fh_1 = { + "Фишки зарабатываются путем", + "игры {C:attention}покерных рук" + }, + fh_2 = { + "Каждая {C:attention}покерная рука{} приносит", + "базовое количество {C:blue}фишек,", + "умноженное на некий {C:red}множ. (множитель)" + }, + fh_3 = { + "Просмотреть свои {C:attention}покерные руки", + "вы можете в зоне {C:attention}«Сведения о партии»{} —", + "наряду с другой информацией", + "о вашей текущей партии" + }, + fh_4 = { + "Карты также", + "зарабатывают {C:blue}фишки{},", + "наведите курсор, чтобы посмотреть!" + }, + fh_5 = { + "Теперь выберите до", + "{C:attention}5{} карт, чтобы сыграть,", + "и нажмите {C:blue}«Играть руку»" + }, + fh_6 = { + "Можно также {C:red}сбросить{}", + "до {C:attention}5{} выбранных карт,", + "чтобы попытаться сделать", + "руки еще сильнее. Попробуйте!" + }, + fh_7 = { + "Осторожно! У вас", + "ограниченное число {C:blue}рук", + "и {C:red}сбросов{} на раунд" + }, + fh_8 = { + "Заработайте {C:attention}300 фишек{}, прежде", + "чем у вас закончатся {C:blue}руки,", + "чтобы выиграть в этом раунде.", + "Удачи!" + }, + sh_1 = { + "Когда получите больше карт,", + "не забудьте, что можно менять их", + "порядок. {C:attention}Джокеры{} активируются", + "в порядке слева направо" + }, + sh_2 = { + "Также не забудьте", + "{C:attention}ИСПОЛЬЗОВАТЬ{} расходуемое!" + }, + sh_3 = { + "Выберите до {C:attention}2{} карт", + "в руке и нажмите", + "{C:attention}«ИСПОЛЬЗОВАТЬ»{} на карте {C:tarot}Таро{},", + "чтобы улучшить их!" + }, + s_1 = { + "Замечательно! Теперь, когда", + "у вас {E:1}полно{} {C:money}денег{},", + "вы можете купить новые", + "карты в {C:attention}лавке" + }, + s_2 = { + "Попробуйте купить этого", + "симпатичного Дьявола" + }, + s_3 = { + "Это один из {C:attention}#1#", + "{C:attention}джокеров{}, которых вы можете добавить", + "в партию. Каждый {C:attention}джокер", + "делает что-то особенное" + }, + s_4 = { + "Этот добавляет {C:red}+4 множ.{} к", + "каждой руке, которую вы играете!" + }, + s_5 = { + "Внимательно выбирайте. Можно", + "держать только {C:attention}5 карт джокеров{}", + "одновременно" + }, + s_6 = { + "Теперь купите другую", + "карту в {C:attention}лавке" + }, + s_7 = { + "Эта карта {C:tarot}Таро{} —", + "{C:attention}расходуемая{}. Она", + "улучшит карты, которые вы", + "играете! Придержите ее." + }, + s_8 = { + "У вас может быть до", + "{C:attention}2 расходуемых{} карт", + "одновременно" + }, + s_9 = { + "Если накопите достаточно,", + "сможете купить {C:attention}ваучер{}.", + "{C:attention}Ваучеры{} пассивно", + "улучшают вашу партию!" + }, + s_10 = { + "{C:attention}Ваучеры{} пополняются", + "после победы над", + "{C:attention}Босс-блайндом{}." + }, + s_11 = { + "Также проверяйте оба", + "{C:booster}бустерных набора{} в", + "каждой лавке. В них", + "полно полезностей!" + }, + s_12 = { + "Перейдем к", + "{C:attention}следующему раунду{}." + } + }, + achievement_names = { + ante_up = "Больше анте!", + ante_upper = "Еще больше анте!", + heads_up = "Один на один", + low_stakes = "Низкие ставки", + mid_stakes = "Средние ставки", + high_stakes = "Высокие ставки", + card_player = "Разыгрывающий карты", + card_discarder = "Сбрасывающий карты", + nest_egg = "Заначка", + flushed = "Флеш", + speedrunner = "Скороход", + roi = "Окупаемость инвестиций", + shattered = "Вдребезги", + royale = "Рояль", + retrograde = "Ретроград", + _10k = "10К", + _1000k = "1000К", + _100000k = "100 000К", + tiny_hands = "Крохотные ручки", + big_hands = "Огромные ручищи", + you_get_what_you_get = "Что вышло, то вышло", + rule_bender = "Изменяя правила", + rule_breaker = "Нарушая правила", + legendary = "Легенда", + astronomy = "Астрономия", + cartomancy = "Картомантия", + clairvoyance = "Ясновидение", + extreme_couponer = "Купономания", + completionist = "Все и сразу", + completionist_plus = "Все и сразу+", + completionist_plus_plus = "Все и сразу++" + }, + achievement_descriptions = { + ante_up = "Достичь анте 4", + ante_upper = "Достичь анте 8", + heads_up = "Выиграть партию", + low_stakes = "Выиграть партию на сложности не ниже Красной ставки", + mid_stakes = "Выиграть партию на сложности не ниже Черной ставки", + high_stakes = "Выиграть партию на сложности не ниже Золотой ставки", + card_player = "Разыграть не менее 2500 карт", + card_discarder = "Сбросить не менее 2500 карт", + nest_egg = "Иметь $400 или больше за одну партию", + flushed = "Сыграть флеш с 5 дикими картами", + speedrunner = "Выиграть партию за 12 или менее раундов", + roi = "Купить 5 ваучеров до анте 4", + shattered = "Разбить 2 стеклянные карты за одну руку", + royale = "Сыграть флеш-рояль", + retrograde = "Поднять любую покерную руку до 10 уровня", + _10k = "Набрать 10 000 шт. фишек за одну руку", + _1000k = "Набрать 1 000 000 шт. фишек за одну руку", + _100000k = "Набрать 100 000 000 шт. фишек за одну руку", + tiny_hands = "Сократить колоду до 20 или менее карт", + big_hands = "Собрать 80 или более карт в колоде", + you_get_what_you_get = "Выиграть партию без переброса лавки", + rule_bender = "Завершить любое испытание", + rule_breaker = "Завершить каждое испытание", + legendary = "Открыть легендарного джокера", + astronomy = "Открыть каждую карту планеты", + cartomancy = "Открыть каждую карту Таро", + clairvoyance = "Открыть каждую спектральную карту", + extreme_couponer = "Открыть каждый ваучер", + completionist = "Открыть 100% коллекции", + completionist_plus = "Выиграть с каждой колодой на сложности Золотая ставка", + completionist_plus_plus = "Получить золотую наклейку на каждом джокере" + }, + quips = { + wq_1 = { + "Великолепно!" + }, + wq_2 = { + "Отличная", + "работа!" + }, + wq_3 = { + "Похоже, это", + "был не блеф!" + }, + wq_4 = { + "Как жаль, что", + "фишки", + "виртуальные..." + }, + wq_5 = { + "Похоже, я неплохо", + "тебя обучил!" + }, + wq_6 = { + "Тебе удалось сыграть", + "несколько хороших партий!" + }, + wq_7 = { + "Хорошо,", + "что я поставил", + "на тебя!" + }, + lq_1 = { + "Может, нам", + "лучше поиграть", + "в пасьянс..." + }, + lq_2 = { + "Какой неудачный", + "расклад!" + }, + lq_3 = { + "Время", + "перетасовать карты и", + "попробовать снова!" + }, + lq_4 = { + "Знаешь,", + "как говорится:", + "казино всегда в выигрыше." + }, + lq_5 = { + "Похоже, мы узнали,", + "кто здесь", + "настоящий джокер!" + }, + lq_6 = { + "Ты что,", + "тоже блефовал?" + }, + lq_7 = { + "Похоже,", + "мы в дураках!" + }, + lq_8 = { + "Будь у меня руки,", + "я бы закрыл", + "ими глаза!" + }, + lq_9 = { + "Я буквально", + "шут, а у тебя", + "какое оправдание?" + }, + lq_10 = { + "Вот так облом!" + }, + dq_1 = { + "Ух! Надеюсь, у тебя", + "осталось пару козырей", + "в рукаве для", + "последнего испытания!" + } + }, + challenge_names = { + c_omelette_1 = "Омлет", + c_city_1 = "15-минутный город", + c_rich_1 = "Богатые становятся богаче", + c_knife_1 = "На острие ножа", + c_xray_1 = "Рентгеновское зрение", + c_mad_world_1 = "Безумный мир", + c_luxury_1 = "Налог на роскошь", + c_non_perishable_1 = "Не портится", + c_medusa_1 = "Медуза", + c_double_nothing_1 = "Все или ничего", + c_typecast_1 = "Одно и то же", + c_inflation_1 = "Инфляция", + c_bram_poker_1 = "Брэм-покер", + c_fragile_1 = "Хрупкое", + c_monolith_1 = "Монолит", + c_blast_off_1 = "На взлет", + c_five_card_1 = "Пять карт", + c_golden_needle_1 = "Золотая игла", + c_cruelty_1 = "Жестокость", + c_jokerless_1 = "Без джокеров" + } + } +} \ No newline at end of file diff --git a/localization/zh_CN.lua b/localization/zh_CN.lua new file mode 100644 index 0000000..b6728e3 --- /dev/null +++ b/localization/zh_CN.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "小丑", + text = { + "{C:red,s:1.1}+#1#{}倍率" + } + }, + j_jolly = { + name = "开心小丑", + text = { + "如果出牌包含", + "{C:attention}#2#{},", + "{C:red}+#1#{}倍率" + } + }, + j_zany = { + name = "古怪小丑", + text = { + "如果出牌包含", + "{C:attention}#2#{},", + "{C:red}+#1#{}倍率" + } + }, + j_mad = { + name = "疯狂小丑", + text = { + "如果出牌包含", + "{C:attention}#2#{},", + "{C:red}+#1#{}倍率" + } + }, + j_crazy = { + name = "狂野小丑", + text = { + "如果出牌包含", + "{C:attention}#2#{},", + "{C:red}+#1#{}倍率" + } + }, + j_droll = { + name = "滑稽小丑", + text = { + "如果出牌包含", + "{C:attention}#2#{},", + "{C:red}+#1#{}倍率" + } + }, + j_half = { + name = "半张小丑", + text = { + "如果出牌包含", + "{C:attention}#2#{}张或更少的牌,", + "{C:red}+#1#{}倍率" + } + }, + j_fortune_teller = { + name = "占卜师", + text = { + "本赛局每使用一张{C:purple}塔罗牌{}", + "{C:red}+#1#{}倍率", + "{C:inactive}(当前为{C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "杂耍师", + text = { + "{C:attention}+#1#{}手牌大小" + } + }, + j_drunkard = { + name = "醉汉", + text = { + "{C:red}+#1#{}次弃牌数" + } + }, + j_stone = { + name = "石头小丑", + text = { + "为牌组内的", + "每张{C:attention}石头牌", + "{C:chips}+#1#{}筹码", + "{C:inactive}(当前为{C:chips}+#2#{C:inactive}筹码)" + } + }, + j_golden = { + name = "黄金小丑", + text = { + "在回合结束时", + "获得{C:money}$#1#{}" + } + }, + j_stencil = { + name = "模具小丑", + text = { + "每个空的{C:attention}小丑牌{}槽位", + "获得{X:red,C:white} X1{}倍率。", + "{s:0.8}包括模具小丑", + "(当前为{X:red,C:white} X#1# {C:inactive})" + } + }, + j_four_fingers = { + name = "四指", + text = { + "所有{C:attention}同花{}和", + "{C:attention}顺子{}都可以", + "由{C:attention}4{}张牌组成。" + } + }, + j_mime = { + name = "哑剧演员", + text = { + "重新触发所有", + "所有手中{C:attention}持有的", + "{C:attention}手牌{}的能力" + } + }, + j_credit_card = { + name = "信用卡", + text = { + "负债限额", + "最多可至{C:red}-$#1#{}" + } + }, + j_greedy_joker = { + name = "贪婪小丑", + text = { + "每打出一张", + "{C:diamonds}#2#{}花色的牌,", + "计分时{C:mult}+#1#{}倍率" + } + }, + j_lusty_joker = { + name = "色欲小丑", + text = { + "每打出一张", + "{C:hearts}#2#{}花色的牌", + "计分时{C:mult}+#1#{}倍率" + } + }, + j_wrathful_joker = { + name = "愤怒小丑", + text = { + "每打出一张", + "{C:spades}#2#{}花色的牌", + "计分时{C:mult}+#1#{}倍率" + } + }, + j_gluttenous_joker = { + name = "暴食小丑", + text = { + "每打出一张", + "{C:clubs}#2#{}花色的牌", + "计分时{C:mult}+#1#{}倍率" + } + }, + j_ceremonial = { + name = "恐怖匕首", + text = { + "当选择 {C:attention}盲注{}时,", + "摧毁右侧的小丑牌,", + "并永久将其售价{C:attention}加倍", + "添加至当前{C:attention}倍率", + "{C:inactive}(当前为 {C:mult}+#1#{C:inactive}倍)" + } + }, + j_banner = { + name = "旗帜", + text = { + "每一个剩余的", + "{C:attention}弃牌{}次数", + "{C:chips}+#1#{}筹码" + } + }, + j_mystic_summit = { + name = "神秘之峰", + text = { + "当剩余{C:attention}#2#{}次", + "弃牌次数,", + "{C:mult}+#1#{}倍率" + } + }, + j_marble = { + name = "大理石小丑", + text = { + "选择{C:attention}盲注{}后", + "牌组中会添加", + "一张{C:attention}石头{}牌" + } + }, + j_loyalty_card = { + name = "积分卡", + text = { + "每出牌{C:attention}#2#{}次", + "倍率{X:red,C:white}X#1#{}", + "{C:inactive}#3#次" + } + }, + j_8_ball = { + name = "八号球", + text = { + "打出{C:attenetion}#1#{}张", + "或更多张数字{C:attention}8{},", + "则获得一张{C:planet}星球牌{}", + "{C:inactive}(必须有空位)" + } + }, + j_misprint = { + name = "印错小丑", + text = { + "" + } + }, + j_dusk = { + name = "黄昏卡", + text = { + "每回合", + "{C:attention}最后一次出牌{}", + "该手牌会被触发两次" + } + }, + j_raised_fist = { + name = "致胜之拳", + text = { + "将手中持有的 {C:attention}最小{}牌的", + "点数 {C:attention}翻倍{},", + "并应用到倍率上" + } + }, + j_chaos = { + name = "混沌小丑", + text = { + "每次商店", + "{C:green}#1#{}次免费重掷" + } + }, + j_fibonacci = { + name = "斐波那契", + text = { + "每打出一张", + "{C:attention}A{}、{C:attention}2{}、{C:attention}3{}、{C:attention}5{}或{C:attention}8{}时", + "计分时{C:mult}+#1#{}倍率" + } + }, + j_steel_joker = { + name = "钢铁小丑", + text = { + "牌组内的", + "每张{C:attention}钢铁牌", + "可使倍率{X:mult,C:white}X#1#", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)" + } + }, + j_scary_face = { + name = "恐怖面孔", + text = { + "打出{C:attention}人头牌{}时,", + "计分时", + "获得{C:chips}{C:chips}+#1#{}" + } + }, + j_abstract = { + name = "抽象小丑", + text = { + "每张{C:attention}小丑牌{}", + "{C:mult}+#1#{}倍率", + "{C:inactive}(当前为{C:red}+#2#{C:inactive}倍率)" + } + }, + j_delayed_grat = { + name = "延迟满足", + text = { + "如果在回合结束时", + "没有使用弃牌,则每把{C:attention}弃牌{}", + "获得{C:money}$#1#{}" + } + }, + j_hack = { + name = "烂脱口秀演员", + text = { + "重新触发", + "所有打出的", + "{C:attention}2{}、{C:attention}3{}、{C:attention}4{}和 {C:attention}5{}" + } + }, + j_pareidolia = { + name = "幻视", + text = { + "所有卡牌", + "均视为", + "{C:attention}人头牌{}" + } + }, + j_gros_michel = { + name = "格罗斯·米歇尔", + text = { + "{C:mult}+#1#{}倍率", + "回合结束时", + "有{C:green}#2#/#3#{}的几率", + "摧毁此牌" + } + }, + j_even_steven = { + name = "偶数史蒂文", + text = { + "每打出一张计分的", + "{C:attention}偶数{}点的牌,", + "{C:mult}+#1#{}倍率", + "{C:inactive}(10、8、6、4、2)" + } + }, + j_odd_todd = { + name = "奇数托德", + text = { + "每打出一张计分的", + "{C:attention}奇数{}点的牌,", + "获得 {C:chips}+#1#{}筹码", + "{C:inactive}(A、9、7、5、3)" + } + }, + j_scholar = { + name = "学者", + text = { + "计分时", + "每打出一张{C:attention}A{}", + "{C:mult}+#1#{}倍率", + "和{C:chips}+#2#{}筹码" + } + }, + j_business = { + name = "名片", + text = { + "计分时,打出的{C:attention}人头牌{}", + "有{C:green}#1#/#2#{}的几率", + "获得{C:money}$2{}" + } + }, + j_supernova = { + name = "超新星", + text = { + "将{C:attention}牌型{}的", + "{C:attention}出牌{}次数", + "添加至倍率" + } + }, + j_ride_the_bus = { + name = "搭乘巴士", + text = { + "若连续打出", + "没有{C:attention}人头牌{}的", + "計分手牌,", + "每次{C:mult}+#1#{}倍率", + "{C:inactive}(当前为{C:mult}+#2#{C:inactive}倍率)" + } + }, + j_space = { + name = "太空小丑", + text = { + "有{C:green}#1#/#2#{}的", + "几率升级", + "打出的{C:attention}牌型等级{}" + } + }, + j_egg = { + name = "鸡蛋", + text = { + "在回合结束时", + "本卡的{C:attention}出售价值", + "增加{C:money}$#1#" + } + }, + j_burglar = { + name = "窃贼", + text = { + "选择{C:attention}盲注{}后,", + "出牌次数{C:red}+#1#{},并", + "{C:attention}失去所有弃牌次数" + } + }, + j_blackboard = { + name = "黑板", + text = { + "倍率{X:red,C:white}X#1# {},若手牌中", + "未出手的牌", + "都是{C:spades}#2#{}或{C:clubs}#3#{}" + } + }, + j_runner = { + name = "跑步选手", + text = { + "每次打出一手", + "{C:attention}顺子{}", + "{C:chips}+#2#{}筹码", + "{C:inactive}(当前 {C:chips}+#1#{C:inactive}筹码)" + } + }, + j_ice_cream = { + name = "冰淇淋", + text = { + "{C:chips}+#1#{}筹码", + "每次出牌", + "{C:chips}-#2#{}筹码" + } + }, + j_dna = { + name = "DNA", + text = { + "如果回合的{C:attention}第一次出牌{}", + "只有 {C:attention}1{}张牌,则将其", + "永久复制到牌组", + "并放到{C:attention}手牌中" + } + }, + j_splash = { + name = "飞溅", + text = { + "每张{C:attention}打出的牌", + "都计入得分" + } + }, + j_blue_joker = { + name = "蓝色小丑", + text = { + "每张{C:attention}牌组{}内剩余", + "的卡牌,{C:chips}+#1#{}筹码", + "{C:inactive}(当前为{C:chips}+#2#{C:inactive}筹码)" + } + }, + j_sixth_sense = { + name = "第六感", + text = { + "若此回合第一次出牌", + "为一张单独的{C:attention}6{}", + "就将其销毁并创建一张{C:spectral}幻灵牌{}", + "{C:inactive}(必须有空位)" + } + }, + j_constellation = { + name = "星座", + text = { + "每使用一张{C:planet}星球牌{}", + "倍率{X:mult,C:white}X#1#{}", + "{C:inactive}(当前为倍率{X:mult,C:white}X#2#{C:inactive})" + } + }, + j_hiker = { + name = "徒步者", + text = { + "每张打出的", + "{C:attention}計分牌{}可永久", + "增加{C:chips}+#1#{}筹码" + } + }, + j_faceless = { + name = "无面小丑", + text = { + "如果同时弃掉", + "{C:attention}#2#{}张或更多张", + "{C:attention}人头牌{},", + "获得{C:money}$#1#{}" + } + }, + j_green_joker = { + name = "绿色小丑", + text = { + "每次出牌,{C:mult}+#1#{}倍率", + "每次弃牌,{C:mult}-#2#{}倍率", + "{C:inactive}(当前为 {C:mult}+#3#{C:inactive}倍)" + } + }, + j_superposition = { + name = "叠加", + text = { + "如果出牌中计分的牌包含", + "一张{C:attention}A{}和一个{C:attention}顺子{}", + "产生一张{C:tarot}塔罗牌{}", + "{C:inactive}(必须有空位)" + } + }, + j_todo_list = { + name = "待办清单", + text = { + "如果{C:attention}出牌牌型{}為{C:attention}#2#{},", + "獲得{C:money}$#1#{}", + "每次支付时", + "牌型都会改变" + } + }, + j_ticket = { + name = "黄金门票", + text = { + "打出{C:attention}黃金牌{},", + "计分时,{C:money}$#1#{}" + }, + unlock = { + "当打出一手五张", + "只包含", + "{C:attention,E:1}黃金牌{}的牌" + } + }, + j_mr_bones = { + name = "骷髅先生", + text = { + "若计分的筹码", + "至少是", + "所需筹码的{C:attention}25%", + "则不会死亡", + "{S:1.1,C:red,E:2}自毁{}" + }, + unlock = { + "失去{C:attention,E:1}#1#{}局", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "杂技演员", + text = { + "回合的最后一次", + "{C:attention}出牌{}中,倍率{X:red,C:white}X#1#" + }, + unlock = { + "打出{C:attention,E:1}#1#{}张牌", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "喜与悲", + text = { + "重新触发所有", + "打出的{C:attention}人头牌{}" + }, + unlock = { + "打出总共", + "{C:attention,E:1}#1#{}张人头牌", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "侠盗", + text = { + "将此卡左侧所有", + "{C:attention}小丑牌{}的总售价", + "添加至倍率", + "{C:inactive}(当前为{C:mult}+#1#{C:inactive}倍率)" + }, + unlock = { + "总共卖出", + "{C:attention,E:1}#1#{}张小丑牌", + "{C:inactive}(#2#)张" + } + }, + j_troubadour = { + name = "游吟诗人", + text = { + "{C:attention}+#1#{}手牌大小", + "每回合出牌次数{C:red}-#2#{}" + }, + unlock = { + "连续赢得{C:attention,E:1}#1#{}回合,", + "且每回合只使用", + "一次出牌次数" + } + }, + j_certificate = { + name = "证书", + text = { + "回合开始时", + "随机添加一张", + "带随机{C:attention}蜡封{}的{C:attention}牌", + "到手牌中" + }, + unlock = { + "拥有一张", + "带{C:attention,E:1}金色蜡封{}的", + "黄金牌" + } + }, + j_smeared = { + name = "模糊小丑", + text = { + "{C:diamonds}红桃{}和{C:diamonds}方片", + "视作同一花色,", + "{C:spades}黑桃{}和{C:spades}梅花", + "也视作同一花色" + }, + unlock = { + "在你的牌组中", + "至少拥有{C:attention}#1#", + "{E:1,C:attention}#2#{}" + } + }, + j_throwback = { + name = "回溯", + text = { + "本赛局内每跳过一次", + "{C:attention}盲注{},获得{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为 {X:mult,C:white}X#2#{C:inactive}倍)" + }, + unlock = { + "从主菜单中选择继续", + "游玩已保存的局" + } + }, + j_hanging_chad = { + name = "悬垂查德", + text = { + "重新触发得分中", + "使用的{C:attention}第一张{}牌" + }, + unlock = { + "用{E:1,C:attention}#1#", + "打赢Boss盲注" + } + }, + j_rough_gem = { + name = "璞玉", + text = { + "计分时{C:mult}+#1#{}", + "若每打出一张带有", + "{C:diamonds}方片{}花色的卡牌" + }, + unlock = { + "在你的牌组中", + "至少要有{E:1,C:attention}#1#张", + "带有{E:1,C:attention}#2#花色的卡牌" + } + }, + j_bloodstone = { + name = "血石", + text = { + "若每打出一张带有", + "{C:hearts}红桃{}花色的卡牌", + "有{C:green}#1#/#2#{}的机率", + "获得{X:mult,C:white}X#3#{}倍率" + }, + unlock = { + "在你的牌组中", + "至少要有{E:1,C:attention}#1#张", + "带有{E:1,C:attention}#2#花色的卡牌" + } + }, + j_arrowhead = { + name = "箭头", + text = { + "若每打出一张带有", + "{C:spades}黑桃{}花色的卡牌", + "计分时{C:mult}+#1#{}筹码" + }, + unlock = { + "在你的牌组中", + "至少要有{E:1,C:attention}#1#张", + "带有{E:1,C:attention}#2#花色的卡牌" + } + }, + j_onyx_agate = { + name = "缟玛瑙", + text = { + "若每打出一张带有", + "{C:clubs}梅花{}花色的牌", + "计分时{C:mult}+#1#{}倍率" + }, + unlock = { + "在你的牌组中", + "至少要有{E:1,C:attention}#1#张", + "带有{E:1,C:attention}#2#花色的卡牌" + } + }, + j_glass = { + name = "玻璃小丑", + text = { + "每摧毁一张", + "{C:attention}玻璃牌", + "获得{C:mult}+#1#{}倍率", + "{C:inactive}(当前为 {X:mult,C:white} X#2#{C:inactive}倍)" + }, + unlock = { + "在你的牌组中", + "拥有{E:1,C:attention}#1#个", + "{E:1,C:attention}#2#{}" + } + }, + j_ring_master = { + name = "马戏团长", + text = { + "{C:attention}小丑牌{}、{C:tarot}塔罗牌{}、{C:planet}星球牌{}", + "和{C:planet}幻灵牌{}会出现", + "多次" + }, + unlock = { + "达到底注", + "等级{E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "花盆", + text = { + "{X:mult,C:white} X#1# {}倍率,若", + "出牌中,计分的牌", + "含有{C:diamonds}方片{}、{C:clubs}梅花{}", + "{C:hearts}红桃{}和{C:spades}黑桃{}" + }, + unlock = { + "达到底注", + "等级{E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "蓝图", + text = { + "复制", + "右侧{C:attention}小丑牌{}的能力" + }, + unlock = { + "赢一局" + } + }, + j_wee = { + name = "小小丑", + text = { + "每打出一张{C:attention}2{}并得分时", + "此小丑牌获得", + "获得{C:chips}+#2#{}筹码", + "{C:inactive}(当前为{C:chips}+#1#{C:inactive}筹码)" + }, + unlock = { + "在{E:1,C:attention}#1#回合", + "或更少回合内赢得一局" + } + }, + j_merry_andy = { + name = "快乐安迪", + text = { + "{C:red}+#1#{}次弃牌", + "{C:red}#2#{}手牌大小" + }, + unlock = { + "在{E:1,C:attention}#1#回合", + "或更少回合内赢得一局" + } + }, + j_oops = { + name = "六六大顺", + text = { + "全部加倍{C:attention}列出的", + "{C:green,E:1,S:1.1}几率", + "{C:inactive}(例如:{C:green}3中1{C:inactive} -> {C:green}3中2{C:inactive})" + }, + unlock = { + "在一次出牌中", + "获得至少", + "{E:1,C:attention}#1#{}筹码" + } + }, + j_idol = { + name = "偶像", + text = { + "计分时在{V:1}#3#{}中", + "每打出的{C:attention}#2#", + "{X:mult,C:white} X#1#{}倍率", + "{s:0.8}每回合卡牌都会变动" + }, + unlock = { + "在一次出牌中", + "获得至少", + "{E:1,C:attention}#1#{}筹码" + } + }, + j_seeing_double = { + name = "双重视角", + text = { + "出牌中,计分的牌若", + "含有{C:clubs}梅花{}和", + "任何其他{C:attention}花色{},", + "{X:mult,C:white}X#1#{}倍率" + }, + unlock = { + "当打一手", + "包含", + "{E:1,C:attention}#1#的牌" + } + }, + j_matador = { + name = "斗牛士", + text = { + "若出牌触发了", + "{C:attention}Boss盲注{}的限制条件,", + "获得{C:money}$#1#{}" + }, + unlock = { + "打赢Boss盲注", + "在{E:1,C:attention}一手之内{}且没有", + "使用任何弃牌" + } + }, + j_hit_the_road = { + name = "上路", + text = { + "每弃掉一张", + "{C:attention}J{}牌,本回合", + "获得{X:mult,C:white}X#1# {}倍率", + "{C:inactive}(当前为 {X:mult,C:white} X#2#{C:inactive}倍)" + }, + unlock = { + "同时将{E:1,C:attention}5张", + "{E:1,C:attention}J", + "全部弃掉" + } + }, + j_duo = { + name = "二重奏", + text = { + "若出牌包含", + "{C:attention}#2#", + "{X:mult,C:white}X#1#{}倍率" + }, + unlock = { + "赢一局", + "且不打出", + "{E:1,C:attention}#1#" + } + }, + j_trio = { + name = "三重奏", + text = { + "若出牌包含", + "{C:attention}#2#", + "{X:mult,C:white}X#1#{}倍率" + }, + unlock = { + "赢一局", + "且不打出", + "{E:1,C:attention}#1#" + } + }, + j_family = { + name = "一家人", + text = { + "若出牌包含", + "{C:attention}#2#", + "{X:mult,C:white}X#1#{}倍率" + }, + unlock = { + "赢一局", + "且不打出", + "{E:1,C:attention}#1#" + } + }, + j_order = { + name = "秩序", + text = { + "若出牌包含", + "{C:attention}#2#", + "{X:mult,C:white}X#1#{}倍率" + }, + unlock = { + "赢一局", + "且不打出", + "{E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "部落", + text = { + "若出牌包含", + "{C:attention}#2#", + "{X:mult,C:white}X#1#{}倍率" + }, + unlock = { + "赢一局", + "且不打出", + "{E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "卡文迪什", + text = { + "{X:mult,C:white}X#1#{}倍率", + "回合结束时", + "有{C:green}#2#/#3#{}的几率", + "摧毁此牌" + } + }, + j_card_sharp = { + name = "老千小丑", + text = { + "若该{C:attention}牌型{}已经", + "在本回合打出过,", + "{X:mult,C:white}X#1#{}倍率" + } + }, + j_red_card = { + name = "红牌", + text = { + "当跳过任一{C:attention}补充包{}时", + "{C:red}+#1#{}倍率", + "{C:inactive}(当前为 {C:red}+#2#{C:inactive}倍)" + } + }, + j_madness = { + name = "疯狂", + text = { + "当选择 {C:attention}盲注{}时,", + "{X:mult,C:white}X#1#{}倍率并且", + "随机{C:attention}消灭{}一个小丑", + "{C:inactive}(当前为{X:mult,C:white}X#2#{}倍)" + } + }, + j_square = { + name = "方形小丑", + text = { + "若打出的手牌", + "恰好有{C:attention}4{}张牌", + "那么获得", + "{C:chips}+#2#{}筹码" + } + }, + j_seance = { + name = "通灵", + text = { + "如果{C:attention}牌型{}为", + "{C:attention}#1#{},随机产生", + "一张{C:spectral}幻灵牌{}", + "{C:inactive}(必须有空位)" + } + }, + j_riff_raff = { + name = "乌合之众", + text = { + "当选择{C:attention}盲注{}时,", + "产生{C:attention}#1#张{C:blue}常规{C:attention}小丑牌", + "{C:inactive}(必须有空间)" + } + }, + j_stuntman = { + name = "特技演员", + text = { + "{C:chips}+#1#{}筹码", + "{C:attention}-#2#{}手牌大小" + }, + unlock = { + "在一次出牌中", + "获得至少", + "{E:1,C:attention}#1#{}筹码" + } + }, + j_invisible = { + name = "隐形小丑", + text = { + "{C:attention}#1#{}个回合后,", + "卖掉此卡牌就可以", + "随机{C:attention}复制{}一张小丑牌", + "{C:inactive}(当前为{C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "赢一局,", + "且从未拥有超过", + "{E:1,C:attention}4张小丑牌{}" + } + }, + j_brainstorm = { + name = "头脑风暴", + text = { + "复制最左边的", + "{C:attention}小丑牌的技能" + }, + unlock = { + "弃掉一张", + "{E:1,C:attention}皇家同花顺" + } + }, + j_satellite = { + name = "卫星", + text = { + "本赛局每使用一张", + "{C:planet}星球牌{},每回合结束时", + "可得到{C:money}$#1#{}", + "{C:inactive}(当前{C:money}$#2#{C:inactive})" + }, + unlock = { + "有{E:1,C:money}$#1#", + "或更多" + } + }, + j_shoot_the_moon = { + name = "射月", + text = { + "若每持有一张{C:attention}Q", + "在手牌中", + "{C:mult}+#1#{}倍率" + }, + unlock = { + "在单个回合中", + "打出牌组里的", + "{E:1,C:attention}红桃" + } + }, + j_drivers_license = { + name = "驾驶执照", + text = { + "{X:mult,C:white} X#1# {}倍率,如果牌组", + "至少有{C:attention}16张", + "增强卡牌", + "{C:inactive}(当前{C:attention}#2#{C:inactive})" + }, + unlock = { + "增强牌组里", + "{E:1,C:attention}#1#{}张卡牌" + } + }, + j_cartomancer = { + name = "卡牌术士", + text = { + "当选择{C:attention}盲注{}时", + "产生一张{C:tarot}塔罗牌{}", + "{C:inactive}(必须有空位)" + }, + unlock = { + "发现每张", + "{E:1,C:tarot}塔罗牌{}" + } + }, + j_astronomer = { + name = "天文学家", + text = { + "所有{C:planet}星球牌{}", + "和{C:planet}天体包{}", + "在商店内的都{C:attention}免费" + }, + unlock = { + "找到所有", + "{E:1,C:planet}星球牌{}" + } + }, + j_burnt = { + name = "烧焦小丑", + text = { + "升级每回合", + "首次{C:attention}被弃掉的", + "扑克手牌的等级" + }, + unlock = { + "售出所有", + "{E:1,C:attention}+#1#{}张卡牌", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "提靴带", + text = { + "每拥有{C:money}$#2#{},", + "{C:mult}+#1#{}倍率" + }, + unlock = { + "在你的牌组中", + "{C:dark_edition}多彩{}小丑" + } + }, + j_caino = { + name = "卡伊诺", + text = { + "每有一张被摧毁的", + "{C:attention}人头牌{}时", + "获得{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为{X:mult,C:white} X#2#{C:inactive}倍率)" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "特里布莱", + text = { + "打出的{C:attention}K{}和{C:attention}Q", + "各自获得", + "{X:mult,C:white}X#1#{}倍率" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "约里克", + text = { + "使用{C:attention}#2#{}次弃牌后", + "获得{X:mult,C:white}X#1#{}倍数", + "{C:inactive}(弃牌剩余:{C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "奇科特", + text = { + "每个{C:attention}Boss盲注", + "限制条件消失" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "佩尔科欧", + text = { + "在结束商店后", + "随机复制{C:attention}1{}张", + "拥有的{C:attention}消耗牌{}", + "并给那张牌{C:dark_edition}负片{}效果" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "奸诈小丑", + text = { + "如果出牌中", + "包含一个{C:attention}#2#,", + "{C:chips}+#1#{}筹码" + } + }, + j_wily = { + name = "狡猾小丑", + text = { + "如果出牌中", + "包含一个{C:attention}#2#,", + "{C:chips}+#1#{}筹码" + } + }, + j_clever = { + name = "聪敏小丑", + text = { + "如果出牌中", + "包含一个{C:attention}#2#,", + "{C:chips}+#1#{}筹码" + } + }, + j_devious = { + name = "阴险小丑", + text = { + "如果出牌中", + "包含一个{C:attention}#2#,", + "{C:chips}+#1#{}筹码" + } + }, + j_crafty = { + name = "精明小丑", + text = { + "如果出牌中", + "包含一个{C:attention}#2#,", + "{C:chips}+#1#{}筹码" + } + }, + j_vampire = { + name = "吸血鬼", + text = { + "每打出一张{C:attention}增强卡牌{}", + "即可获得{X:mult,C:white}X#1#{}倍率,", + "並移除卡牌{C:attention}增强效果", + "{C:inactive}(当前为 {X:mult,C:white}X#2#{C:inactive}倍率)" + } + }, + j_shortcut = { + name = "捷径", + text = { + "让{C:attention}顺子{}可以", + "相隔{C:attention}1个点数", + "{C:inactive}(例如:{C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "全息影像", + text = { + "每添加一张{C:attention}卡牌{}", + "到你的牌组中,", + "获得{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为 {X:mult,C:white}X#2#{C:inactive}倍率)" + } + }, + j_vagabond = { + name = "流浪者", + text = { + "若在出牌时当下", + "拥有{C:money}$#1#{}或更少的金钱", + "获得一张{C:purple}塔罗牌{}" + } + }, + j_baron = { + name = "男爵", + text = { + "手牌中,", + "每持有一张{C:attention}K{},", + "获得{X:mult,C:white}X#1#{}倍率" + } + }, + j_cloud_9 = { + name = "9霄云外", + text = { + "每张牌组内的数字{C:attention}9{}", + "在每回合结束时", + "获得{C:money}$#1#{}", + "{C:inactive}(当前{C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "火箭", + text = { + "每回合结束时获得{C:money}$#1#{}。", + "击败{C:attention}Boss盲注{}", + "获得 {C:money}$#2#{}" + } + }, + j_obelisk = { + name = "方尖石塔", + text = { + "每次连续不使用", + "你最常用的{C:attention}牌型", + "即可获得", + "{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)" + } + }, + j_midas_mask = { + name = "迈达斯面具", + text = { + "所有的{C:attention}人头牌{}", + "在打出的时候", + "都会变成{C:attention}黄金牌{}" + } + }, + j_luchador = { + name = "斗士", + text = { + "卖掉此卡牌就可以", + "消除当前的", + "{C:attention}Boss盲注{}限制功能" + } + }, + j_photograph = { + name = "照片", + text = { + "计分时第一张打出的", + "{C:attention}人头牌{}", + "获得 {X:mult,C:white}X#1#{}倍率" + } + }, + j_gift = { + name = "礼品卡", + text = { + "在每回合结束时", + "每张拥有的{C:attention}小丑牌{}", + "及{C:attention}消耗牌{}", + "{C:attention}售价{}加{C:money}$#1#{}" + } + }, + j_turtle_bean = { + name = "海龟豆", + text = { + "{C:attention}+#1#{}手牌大小", + "每回合", + "减少{C:red}#2#{}张" + } + }, + j_erosion = { + name = "腐蚀", + text = { + "在你的完整牌组中", + "每张低于 {C:attention}#3#{}张的牌", + "均可获得 {C:red}+#1#{}倍率", + "{C:inactive}(当前为{C:red}+#2#{C:inactive}倍率)" + } + }, + j_reserved_parking = { + name = "私人车位", + text = { + "手牌中持有的", + "每持有一张 {C:attention}人头牌{}", + "有{C:green}#2#/#3#{}的几率", + "给予{C:money}$#1#{}" + } + }, + j_mail = { + name = "邮件回扣", + text = { + "每弃掉一张{C:attention}#2#{},", + "即可获得{C:money}$#1#{},", + "每个回合点数都会变" + } + }, + j_to_the_moon = { + name = "冲向月球", + text = { + "回合结束时,", + "每拥有{C:money}$5{},", + "都可额外获得{C:money}$#1#{}的{C:attention}利息{}" + } + }, + j_hallucination = { + name = "幻觉", + text = { + "打开任一{C:attention}补充包{}时,", + "有{C:green}#1#/#2#{}的机会能够", + "创建一张{C:attention}塔罗牌{}", + "{C:inactive}(必须有空位)" + } + }, + j_lucky_cat = { + name = "招财猫", + text = { + "每次{C:green}成功{}触发", + "一张{C:attention}幸运牌{}", + "即可获得{X:mult,C:white}X#1#{}倍率", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)" + } + }, + j_baseball = { + name = "棒球卡", + text = { + "每张拥有的{C:green}罕见{}小丑牌", + "获得{X:mult,C:white}X#1#{}倍率" + } + }, + j_bull = { + name = "斗牛", + text = { + "每拥有{C:money}$1{}", + "均可获得 {C:chips}+#1#{}筹码", + "{C:inactive}(当前为{C:chips}+#2#{C:inactive}筹码)" + } + }, + j_diet_cola = { + name = "零糖可乐", + text = { + "卖掉此卡牌就可以", + "创建一张免费的", + "{C:attention}#1#" + } + }, + j_trading = { + name = "交易卡", + text = { + "如果回合的{C:attention}第一次弃牌{}", + "只有 {C:attention}1{}张牌,则将其", + "摧毁并获得 {C:money}$#1#" + } + }, + j_flash = { + name = "闪光卡", + text = { + "在商店中每{C:attention}重掷{}一次", + "就可以获得{C:mult}+#1#{}倍率", + "{C:inactive}(当前为{C:mult}+#2#{C:inactive}倍率)" + } + }, + j_popcorn = { + name = "爆米花", + text = { + "{C:mult}+#1#{}倍率", + "每进行一个回合", + "{C:mult}-#2#{}倍率" + } + }, + j_trousers = { + name = "备用裤子", + text = { + "如果出牌的牌型包含", + "{C:attention}#2#,", + "此牌获得 {C:mult}+#1#{}倍率", + "{C:inactive}(当前为{C:red}+#3#{C:inactive}倍率)" + } + }, + j_ancient = { + name = "古老小丑", + text = { + "计分时,打出的每张{V:1}#2#{}", + "均可获得", + "{X:mult,C:white}X#1#{}倍率", + "{s:0.8}回合结束时花色会变" + } + }, + j_ramen = { + name = "拉面", + text = { + "{X:mult,C:white}X#1#{}倍率", + "每{C:attention}丢弃一张牌{},", + "失去{X:mult,C:white}X#2#{}倍率" + } + }, + j_walkie_talkie = { + name = "对讲机", + text = { + "计分时,打出的每张{C:attention}10{}或{C:attention}4", + "均可获得{C:chips}+#1#{}筹码以及", + "{C:mult}+#2#{}倍率" + } + }, + j_selzer = { + name = "苏打水", + text = { + "在接下来的{C:attention}#1#{}次出牌中", + "重新触发所有", + "打出的卡牌" + } + }, + j_castle = { + name = "城堡", + text = { + "每次弃掉 {V:1}#2#{}牌,", + "这张小丑牌均可获得{C:chips}+#1#{}筹码", + "每个回合花色都会变", + "{C:inactive}(当前为{C:chips}+#3#{C:inactive}筹码)" + } + }, + j_smiley = { + name = "微笑表情", + text = { + "打出的{C:attention}人头牌{}", + "计分时", + "均可获得{C:mult}+#1#{}倍率" + } + }, + j_campfire = { + name = "篝火", + text = { + "每次{C:attention}卖掉{}一张牌", + "这张小丑牌就增加{X:mult,C:white}X#1#{}倍率,", + "当{C:attention}Boss盲注{}被击败时即重置倍率", + "{C:inactive}(当前为{X:mult,C:white}X#2#{C:inactive}倍率)" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "库存过剩", + text = { + "店內卡牌槽位", + "{C:attention}+1{}" + } + }, + v_clearance_sale = { + name = "清仓特卖", + text = { + "所有卡牌和卡牌包", + "在店内费用减{C:attention}#1#%{}" + } + }, + v_tarot_merchant = { + name = "塔罗牌商人", + text = { + "商店内", + "{C:tarot}塔罗牌{}出现", + "频率增加{C:attention}X#1#{}倍" + } + }, + v_planet_merchant = { + name = "星球牌商人", + text = { + "商店内", + "{C:planet}星球牌{}出现", + "频率增加{C:attention}X#1#{}倍 " + } + }, + v_hone = { + name = "打磨", + text = { + "{C:dark_edition}闪箔卡{}、{C:dark_edition}镭射卡{}和", + "{C:dark_edition}多彩{}卡", + "出现频率{C:attention}X#1#{}倍" + } + }, + v_reroll_surplus = { + name = "多次重掷", + text = { + "重掷费用", + "减少{C:money}$#1#{}" + } + }, + v_crystal_ball = { + name = "水晶球", + text = { + "{C:attention}+1{}消耗牌槽位" + } + }, + v_telescope = { + name = "望远镜", + text = { + "{C:attention}天体包中的", + "{C:planet}星球牌{}{}始终有", + "你最常用的", + "的{C:attention}牌型" + } + }, + v_grabber = { + name = "抓手", + text = { + "每回合", + "永久增加", + "{C:blue}+#1#{}次出牌" + } + }, + v_wasteful = { + name = "废物", + text = { + "每回合", + "永久增加", + "{C:blue}+#1#{}次弃牌" + } + }, + v_seed_money = { + name = "种子基金", + text = { + "每回合", + "已获利息", + "上限提高到{C:money}$#1#{}" + } + }, + v_blank = { + name = "空白", + text = { + "{C:inactive}什么都没有?" + } + }, + v_magic_trick = { + name = "魔术", + text = { + "{C:attention}商店{}里面", + "有{C:attention}游戏牌{}", + "可供选购" + } + }, + v_hieroglyph = { + name = "象形文字", + text = { + "{C:attention}-#1#{}底注", + "每回合", + "{C:blue}-#1#{}出牌次数", + "每回合" + } + }, + v_directors_cut = { + name = "导演剪辑版", + text = { + "重掷Boss盲注", + "每个底注重掷{C:attention}1{}次", + "每次{C:money}$#1#{}" + } + }, + v_pattern = { + name = "图案", + text = { + "产生你最常用的", + "{C:attention}消耗牌{}", + "{E:1,V:1}#1#", + "{C:inactive}(必须有空位)" + } + }, + v_overstock_plus = { + name = "库存过剩加强版", + text = { + "店內卡牌槽位", + "{C:attention}+1{}" + }, + unlock = { + "在商店内总共花费", + "{C:money}$#1#{}", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "清算", + text = { + "所有卡牌和卡牌包", + "在店内均可享受{C:attention}#1#%{}折扣" + }, + unlock = { + "在一场赛局中", + "至少兑换", + "{C:attention}#1#{C:voucher}张优惠券{}" + } + }, + v_tarot_tycoon = { + name = "塔罗大亨", + text = { + "商店内", + "{C:tarot}星球牌{}出现", + "频率增加{C:attention}X#1#{}倍" + }, + unlock = { + "在商店", + "购买总计", + "{C:attention}#1#张{C:tarot}塔罗牌{}", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "星球大亨", + text = { + "商店内", + "{C:tarot}星球牌{}出现", + "频率增加{C:attention}X#1#{}倍" + }, + unlock = { + "在商店", + "购买总计", + "{C:attention}#1#{}张{C:planet}星球牌{}", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "焕彩", + text = { + "{C:dark_edition}闪箔卡{}、{C:dark_edition}镭射卡{}和", + "{C:dark_edition}多彩{}卡", + "出现频率{C:attention}X#1#{}倍" + }, + unlock = { + "手上的牌至少要有{C:attention}#1#张", + "{C:attention}小丑牌{}且为", + "{C:dark_edition}闪箔卡{}、{C:dark_edition}镭射卡{},或", + "{C:dark_edition}多彩{}卡版型" + } + }, + v_reroll_glut = { + name = "重掷加強版", + text = { + "重掷费用", + "减少{C:money}$#1#{}" + }, + unlock = { + "重掷商店", + "总共{C:attention}#1#{}次", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "预兆球", + text = { + "{C:spectral}幻灵牌{}可能", + "会在任何", + "{C:attention}秘术包中出现" + }, + unlock = { + "从任何{C:tarot}秘术包中", + "总共使用{C:attention}#1#张", + "{C:tarot}塔罗牌{}", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "天文台", + text = { + "在您{C:attention}消耗牌栏位{}中", + "的{C:planet}星球牌{}", + "为该特定{C:attention}手牌类型", + "给予{X:red,C:white}X#1#{}倍率" + }, + unlock = { + "从任何{C:planet}天体包中", + "总共使用{C:attention}#1#张", + "{C:planet}星球牌{}", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "纳乔之舌", + text = { + "每回合", + "永久", + "增加{C:blue}+#1#{}次出牌" + }, + unlock = { + "打出总共", + "{C:attention}#1#{}张卡牌", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "回收魔法", + text = { + "每回合", + "永久", + "增加{C:blue}+#1#{}次弃牌" + }, + unlock = { + "弃牌总数达到", + "{C:attention}#1#{}张卡牌", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "摇钱树", + text = { + "每回合", + "已获利息", + "上限提高到{C:money}$#1#{}" + }, + unlock = { + "每回合利息收入", + "提升到最高,", + "持续{C:attention}#1#{}回合", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "反物质", + text = { + "{C:dark_edition}+1{}小丑牌槽位" + }, + unlock = { + "兑换{C:voucher}空白{}优惠券", + "总计{C:attention}#1#{}次", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "幻觉", + text = { + "{C:attention}游戏牌{}在店内", + "可以是{C:enhanced}增强卡牌{}、", + "{C:dark_edition}不同版本{},和/或{C:attention}蜡封{}" + }, + unlock = { + "在商店", + "购买总计", + "{C:attention}#1#{}张游戏牌", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "岩画", + unlock = { + "达到底注", + "等级{E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{}底注", + "每回合", + "{C:red}-#1#{}次弃牌" + } + }, + v_retcon = { + name = "重构", + text = { + "重掷Boss盲注", + "{C:attention}不限{}次数", + "每次重掷获得{C:money}$#1#{}" + }, + unlock = { + "发现", + "{C:attention}#1#{}盲注" + } + }, + v_tesselation = { + name = "镶嵌", + text = { + "生成你最常", + "打出的{C:attention}小丑牌{}", + "{E:1,V:1}#1#", + "{C:inactive}(必须有空位)" + }, + unlock = { + "在商店购买", + "你最常使用的{C:attention}小丑牌", + "并且是", + "{C:dark_edition}多彩版本" + } + }, + v_palette = { + name = "调色板", + text = { + "手牌中持有的", + "卡牌 {C:attention}+#1#{}", + "{C:attention}+#1#{}手牌大小" + }, + unlock = { + "手牌大小减少", + "至 {C:attention}#1#{}张" + } + }, + v_paint_brush = { + name = "油漆刷", + text = { + "{C:attention}+#1#{}手牌大小" + } + } + }, + Tarot = { + c_fool = { + name = "愚者", + text = { + "产生本赛局中", + "上一次使用的", + "{C:tarot}塔罗牌{}或{C:planet}星球牌{}", + "不包括{s:0.8,C:tarot}愚者牌{s:0.8}" + } + }, + c_magician = { + name = "魔术师", + text = { + "增强{C:attention}#1#{}张选定", + "卡牌成为", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "女祭司", + text = { + "产生最多{C:attention}#1#张", + "张随机{C:planet}星球牌{}", + "{C:inactive}(必须有空位)" + } + }, + c_empress = { + name = "皇后", + text = { + "增强{C:attention}#1#张", + "选定卡牌成为", + "{C:attention}#2#" + } + }, + c_emperor = { + name = "皇帝", + text = { + "产生最多{C:attention}#1#张", + "随机{C:tarot}塔罗牌{}", + "{C:inactive}(必须有空位)" + } + }, + c_heirophant = { + name = "教皇", + text = { + "增强{C:attention}#1#张", + "选定卡牌成为", + "{C:attention}#2#" + } + }, + c_lovers = { + name = "恋人", + text = { + "增强{C:attention}#1#{}张选定", + "卡牌成为", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "战车", + text = { + "增强{C:attention}#1#{}张选定", + "卡牌成为", + "{C:attention}#2#" + } + }, + c_justice = { + name = "正义", + text = { + "增强{C:attention}#1#{}张选定", + "卡牌成为", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "隐士", + text = { + "金钱加倍", + "{C:inactive}(最高 {C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "命运之轮", + text = { + "有{C:green}#1#/#2#{}的几率", + "添加{C:dark_edition}闪箔{}、{C:dark_edition}镭射{}", + "或{C:dark_edition}多彩{}版本", + "添加给一张随机{C:attention}小丑牌" + } + }, + c_strength = { + name = "力量", + text = { + "将最多", + "{C:attention}#1#{}张选定", + "卡牌点数提高{C:attention}1" + } + }, + c_hanged_man = { + name = "倒吊人", + text = { + "最多可摧毁", + "{C:attention}#1#{}张选定卡牌" + } + }, + c_death = { + name = "死神", + text = { + "选定{C:attention}#1#{}张卡牌,", + "将{C:attention}左侧{}牌", + "转换为{C:attention}右侧{}牌", + "{C:inactive}(拖动重新排列)" + } + }, + c_temperance = { + name = "节制", + text = { + "给出当前", + "所有小丑牌{C:inactive}的", + "总卖价(最高 {C:money}$#1#{C:inactive})", + "{C:inactive}(当前{C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "魔鬼", + text = { + "增强{C:attention}#1#{}张选定", + "卡牌成为", + "{C:attention}#2#" + } + }, + c_tower = { + name = "高塔", + text = { + "增强{C:attention}#1#{}张选定", + "卡牌成为", + "{C:attention}#2#" + } + }, + c_star = { + name = "星星", + text = { + "最多可转换", + "{C:attention}#1#{}张选定卡牌", + "至{V:1}#2#{}" + } + }, + c_moon = { + name = "月亮", + text = { + "最多可转换", + "{C:attention}#1#{}张选定卡牌", + "至{V:1}#2#{}" + } + }, + c_sun = { + name = "太阳", + text = { + "最多可转换", + "{C:attention}#1#{}张选定卡牌", + "至{V:1}#2#{}" + } + }, + c_judgement = { + name = "审判", + text = { + "产生一张随机的", + "{C:attention}{}小丑牌", + "{C:inactive}(必须有空位)" + } + }, + c_world = { + name = "世界", + text = { + "最多可转换", + "{C:attention}#1#{}张选定卡牌", + "至{V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "水星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_venus = { + name = "金星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_earth = { + name = "地球", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_mars = { + name = "火星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_jupiter = { + name = "木星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_saturn = { + name = "土星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_uranus = { + name = "天王星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_neptune = { + name = "海王星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_pluto = { + name = "冥王星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_ceres = { + name = "谷神星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_planet_x = { + name = "X行星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "获得{C:chips}+#4#{}筹码" + } + }, + c_eris = { + name = "阋神星", + text = { + "{S:0.8}({S:0.8,V:1}等级#1#{S:0.8}){}等级提升", + "{C:attention}#2#", + "{C:mult}+#3#{}倍率并且", + "{C:chips}+#4#{}筹码" + } + } + }, + Spectral = { + c_familiar = { + name = "熟知", + text = { + "随机摧毁{C:attention}1{}张手牌,", + "并添加{C:attention}#1#{}张", + "随机{C:attention}增强版人头牌{}", + "到手牌中" + } + }, + c_grim = { + name = "严峻", + text = { + "随机摧毁{C:attention}1{}张手牌,", + "并添加{C:attention}#1#{}张", + "随机{C:attention}增强版A{}", + "到手牌中" + } + }, + c_incantation = { + name = "咒语", + text = { + "随机摧毁{C:attention}1{}张手牌,", + "并添加{C:attention}#1#{}张", + "随机{C:attention}增强版数字牌{}", + "到手牌中" + } + }, + c_talisman = { + name = "护身符", + text = { + "将{C:attention}金色蜡封{}添加到", + "{C:attention}1{}张选定的", + "手牌中" + } + }, + c_aura = { + name = "光环", + text = { + "将{C:dark_edition}闪箔卡{}、{C:dark_edition}镭射卡{},", + "或{C:dark_edition}多彩卡{}效果添加至", + "{C:attention}1{}张选定的手牌中" + } + }, + c_wraith = { + name = "幽灵", + text = { + "产生一张随机的", + "{C:red}稀有{C:attention}小丑牌{},", + "设定金额至{C:money}$0" + } + }, + c_sigil = { + name = "符印", + text = { + "将手中所有", + "卡牌转换至一种", + "随机{C:attention}花色" + } + }, + c_ouija = { + name = "占卜", + text = { + "将手中所有", + "手持牌转换至一种", + "随机{C:attention}点数", + "{C:red}-1{}手牌大小" + } + }, + c_ectoplasm = { + name = "灵质", + text = { + "添加{C:dark_edition}负片{}效果到", + "一张随机的{C:attention}小丑牌,", + "{C:red}-1{}的手牌大小" + } + }, + c_immolate = { + name = "火祭", + text = { + "随机摧毁{C:attention}#1#{}张", + "手牌,", + "获得{C:money}$#2#" + } + }, + c_soul = { + name = "灵魂", + text = { + "创建一张", + "{C:legendary,E:1}传奇{}小丑牌", + "{C:inactive}(必须有空位)" + } + }, + c_black_hole = { + name = "黑洞", + text = { + "为每副", + "{C:legendary,E:1}牌型", + "提升{C:attention}1{}级" + } + }, + c_ankh = { + name = "生命十字章", + text = { + "随机复制一张", + "{C:attention}小丑牌{},摧毁", + "其他小丑牌" + } + }, + c_deja_vu = { + name = "既视感", + text = { + "给你手牌中的", + "{C:attention}1{}张所选卡牌", + "加上{C:red}红色蜡封+D1670{}" + } + }, + c_hex = { + name = "妖法", + text = { + "随机为一张{C:attention}小丑牌{}添加", + "{C:attention}多彩{},摧毁", + "其他小丑牌" + } + }, + c_trance = { + name = "入迷", + text = { + "给你手牌中的", + "{C:attention}1{}张所选卡牌", + "加上{C:blue}蓝色蜡封{}" + } + }, + c_medium = { + name = "灵媒", + text = { + "给你手牌中的", + "{C:attention}1{}张所选卡牌", + "加上{C:purple}紫色蜡封{}" + } + }, + c_cryptid = { + name = "神秘生物", + text = { + "复制{C:attention}#1#{}张", + "建立{C:attention}#1#{}张", + "选定牌的复制牌" + } + } + }, + Edition = { + e_base = { + name = "基础", + text = { + "无额外效果" + } + }, + e_foil = { + name = "闪箔", + text = { + "{C:chips}+#1#{}筹码" + } + }, + e_holo = { + name = "镭射", + text = { + "{C:mult}+#1#{}倍率" + } + }, + e_polychrome = { + name = "多彩", + text = { + "{X:mult,C:white}X#1#{}倍率" + } + }, + e_negative = { + name = "负片", + text = { + "{C:dark_edition}+#1#{}个小丑牌槽位" + } + }, + e_negative_consumable = { + name = "负片", + text = { + "{C:dark_edition}+#1#{}个消耗牌槽位" + } + } + }, + Enhanced = { + m_bonus = { + name = "奖励牌", + text = {} + }, + m_mult = { + name = "倍率牌", + text = { + "{C:mult}+#1#{}倍率" + } + }, + m_wild = { + name = "万能牌", + text = { + "可以视作", + "任何花色" + } + }, + m_glass = { + name = "玻璃牌", + text = { + "{X:mult,C:white}X#1#{}倍率,", + "有{C:green}#2#/#3#{}的几率", + "摧毁牌卡" + } + }, + m_steel = { + name = "钢铁牌", + text = { + "当手中", + "持有该牌时", + "{X:mult,C:white}X#1#{}倍率" + } + }, + m_stone = { + name = "石头牌", + text = { + "{C:chips}+#1#{}筹码", + "无点数无花色" + } + }, + m_gold = { + name = "黄金牌", + text = { + "如果这张卡牌", + "在回合结束时还在手中,", + "获得{C:money}$#1#{}" + } + }, + m_lucky = { + name = "幸运牌", + text = { + "{C:green}#1#/#3#{}的几率", + "{C:mult}+#2#{}倍率", + "{C:green}#1#/#5#{}的几率", + "获得{C:money}$#4#" + } + } + }, + Stake = { + stake_white = { + name = "白注", + text = { + "基础难度" + } + }, + stake_red = { + name = "红注", + text = { + "{C:attention}小盲注{}", + "没有奖励金", + "{s:0.8}适用于之前的所有赌注" + } + }, + stake_green = { + name = "绿注", + text = { + "所需分数随每个底注{C:attention}变化", + "速度更快", + "{s:0.8}适用于之前的所有赌注" + } + }, + stake_blue = { + name = "蓝注", + text = { + "弃牌数{C:red}-1{}", + "{s:0.8}适用于之前的所有赌注" + } + }, + stake_black = { + name = "黑注", + text = { + "商店可以拥有{C:attention}永恒{}小丑牌", + "{C:inactive,s:0.8}(无法卖出或摧毁)", + "{s:0.8}适用于之前的所有赌注" + } + }, + stake_purple = { + name = "紫注", + text = { + "所需分数随每个底注{C:attention}变化", + "速度更快", + "{s:0.8}适用于之前的所有赌注" + } + }, + stake_orange = { + name = "橙注", + text = { + "{C:attention}补充包{}成本", + "每个底注增加{C:money}$1{}", + "{s:0.8}适用于之前的所有赌注" + } + }, + stake_gold = { + name = "金注", + text = { + "{C:attention}-1{}手牌大小", + "{s:0.8}应用于此前所有赌注" + } + } + }, + Tag = { + tag_uncommon = { + name = "罕见标签", + text = { + "下个商店内有一张", + "{C:green}罕见小丑牌" + } + }, + tag_rare = { + name = "稀有标签", + text = { + "下个商店内有一张", + "{C:red}稀有小丑牌," + } + }, + tag_negative = { + name = "负片标签", + text = { + "下个商店内有一张", + "{C:dark_edition}负片小丑牌" + } + }, + tag_foil = { + name = "闪箔标签", + text = { + "下个商店内有一张", + "{C:dark_edition}闪箔小丑牌" + } + }, + tag_holo = { + name = "镭射标签", + text = { + "下个商店内有一张", + "{C:dark_edition}镭射小丑牌" + } + }, + tag_polychrome = { + name = "多彩标签", + text = { + "下个商店内有一张", + "{C:dark_edition}多彩小丑牌" + } + }, + tag_investment = { + name = "投资标签", + text = { + "击败", + "Boss盲注后,", + "获得{C:money}$#1#" + } + }, + tag_voucher = { + name = "优惠券标签", + text = { + "添加一张{C:voucher}优惠券", + "到下一家商店" + } + }, + tag_boss = { + name = "Boss标签", + text = { + "重掷", + "{C:attention}Boss盲注" + } + }, + tag_standard = { + name = "标准标签", + text = { + "获得一个免费的", + "{C:attention}超大标准包" + } + }, + tag_charm = { + name = "吊饰标签", + text = { + "获得一个免费的", + "{C:tarot}超级秘术包" + } + }, + tag_meteor = { + name = "流星标签", + text = { + "获得一个免费的", + "{C:planet}超级天体包" + } + }, + tag_buffoon = { + name = "小丑标签", + text = { + "获得一个免费的", + "{C:attention}小丑包" + } + }, + tag_handy = { + name = "便携式标签", + text = { + "本赛局每打出一次{C:blue}手牌{}", + "获得{C:money}$#1#{}", + "{C:inactive}(将给 {C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "垃圾标签", + text = { + "本赛局每一未使用的{C:red}弃牌数{}", + "得到{C:money}$#1#{}", + "{C:inactive}(将得到 {C:money}$#2#{C:inactive})" + } + }, + tag_coupon = { + name = "折扣券标签", + text = { + "下一家店内的", + "初始卡牌和补充包", + "均为免费" + } + }, + tag_double = { + name = "双倍标签", + text = { + "复制下一个", + "选定的{C:attention}标签{}", + "{s:0.8,C:attention}双倍标签{s:0.8}除外" + } + }, + tag_juggle = { + name = "戏法标签", + text = { + "下一回合", + "{C:attention}+#1#{}手牌大小" + } + }, + tag_d_six = { + name = "D6标签", + text = { + "下一家商店重掷", + "起价为{C:money}$0" + } + }, + tag_top_up = { + name = "充值标签", + text = { + "产生最多{C:attention}#1#张", + "{C:blue}普通{}小丑牌", + "{C:inactive}(必须有空位)" + } + }, + tag_skip = { + name = "速度标签", + text = { + "本赛局中每跳过", + "一次盲注,获得{C:money}$#1#{}", + "{C:inactive}(将获得 {C:money}$#2#{C:inactive})" + } + }, + tag_orbital = { + name = "轨道标签", + text = { + "升级{C:attention}#1#", + "{C:attention}#2#个等级" + } + }, + tag_economy = { + name = "经济标签", + text = { + "资金翻倍", + "{C:inactive}(最高 {C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "空灵标签", + text = { + "获得一个免费的", + "{C:spectral}幻灵包" + } + } + }, + Blind = { + bl_small = { + name = "小盲注", + text = {} + }, + bl_big = { + name = "大盲注", + text = {} + }, + bl_hook = { + name = "钩子", + text = { + "每次出牌", + "随机弃掉2张手牌" + } + }, + bl_wall = { + name = "围墙", + text = { + "特大盲注" + } + }, + bl_wheel = { + name = "车轮", + text = { + "/7的概率一张牌", + "以背面朝上的方式抽取" + } + }, + bl_arm = { + name = "手臂", + text = { + "降低已出", + "牌型等级" + } + }, + bl_psychic = { + name = "灵媒", + text = { + "必须出 5 张牌" + } + }, + bl_goad = { + name = "挑衅", + text = { + "所有黑桃牌", + "都不计分" + } + }, + bl_water = { + name = "水", + text = { + "以0弃牌", + "次数开始" + } + }, + bl_eye = { + name = "眼睛", + text = { + "本回合中不可", + "打出重复牌型" + } + }, + bl_mouth = { + name = "嘴巴", + text = { + "本回合只能打出", + "1种牌型" + } + }, + bl_plant = { + name = "植物", + text = { + "所有人头牌", + "都不计分" + } + }, + bl_needle = { + name = "针", + text = { + "这一回合只能出一次牌" + } + }, + bl_head = { + name = "头部", + text = { + "所有红桃牌", + "都不计分" + } + }, + bl_tooth = { + name = "牙齿", + text = { + "每出一张牌", + "损失$1" + } + }, + bl_final_leaf = { + name = "绿叶", + text = { + "所有卡牌都不计分", + "直到售出1张小丑牌" + } + }, + bl_final_vessel = { + name = "紫罗兰容器", + text = { + "超大盲注" + } + }, + bl_ox = { + name = "公牛", + text = { + "打出#1#牌型时,", + "资金归$0" + } + }, + bl_house = { + name = "房屋", + text = { + "第一次的手牌", + "以背面朝上方式抽取" + } + }, + bl_club = { + name = "梅花", + text = { + "所有梅花牌", + "都不计分" + } + }, + bl_fish = { + name = "鱼", + text = { + "在第一次出牌后", + "抽的牌都是面朝下抽出" + } + }, + bl_window = { + name = "窗口", + text = { + "所有方片牌", + "都不计分" + } + }, + bl_manacle = { + name = "镣铐", + text = { + "手牌大小-1" + } + }, + bl_serpent = { + name = "巨蟒", + text = { + "出牌或弃牌后,", + "总是抽 3 张牌" + } + }, + bl_pillar = { + name = "支柱", + text = { + "上一次底注中", + "打过的牌都不计分" + } + }, + bl_flint = { + name = "燧石", + text = { + "基础筹码和", + "倍率减半" + } + }, + bl_mark = { + name = "标记", + text = { + "所有人头牌都是", + "以背面朝上的方式抽取" + } + }, + bl_final_acorn = { + name = "琥珀橡子", + text = { + "翻转并洗乱", + "所有小丑牌" + } + }, + bl_final_heart = { + name = "绯红之心", + text = { + "每次出牌", + "使任一小丑牌功能失效" + } + }, + bl_final_bell = { + name = "蔚蓝钟", + text = { + "迫使 1 张牌", + "总是被选中" + } + } + }, + Back = { + b_red = { + name = "红色牌组", + text = { + "每回合", + "{C:red}+#1#{}次弃牌" + } + }, + b_blue = { + name = "蓝色牌组", + text = { + "每回合", + "{C:blue}+#1#{}次出牌" + } + }, + b_yellow = { + name = "黄色牌组", + text = { + "每回合开始", + "额外获得{C:money}$#1#" + } + }, + b_green = { + name = "绿色牌组", + text = { + "每回合结束时:", + "每剩一次{C:blue}出牌次数,获得{C:money}$#1#{s:0.85}", + "每剩一次{C:red}弃牌次数,获得{C:money}$#2#{s:0.85}", + "不赚取任何{C:attention}利息" + } + }, + b_black = { + name = "黑色牌组", + text = { + "每回合", + "", + "{C:attention}+#1#{}小丑牌槽位", + "{C:blue}-#2#{}次出牌" + } + }, + b_magic = { + name = "魔法牌组", + text = { + "开局时拥有", + "{C:tarot,T:v_crystal_ball}#1#{}张优惠券", + "和{C:attention}2{}份", + "{C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "星云牌组", + text = { + "开局时拥有", + "{C:planet,T:v_telescope}#1#{}张优惠券", + "", + "{C:red}#2#{}消耗牌槽位" + } + }, + b_metal = { + name = "金属牌组", + text = { + "开局时,将牌组内", + "{C:attention}#1#张游戏牌", + "加强成{C:attention}钢铁牌" + } + }, + b_abandoned = { + name = "废弃牌组", + text = { + "开局时", + "玩家牌组中", + "没有{C:attention}人头牌" + } + }, + b_checkered = { + name = "方格牌组", + text = { + "开局时", + "牌组中有{C:attention}26{C:spades}张黑桃{}和", + "{C:attention}26{C:hearts}张红桃{}" + } + }, + b_rocky = { + name = "岩石牌组", + text = { + "开局时拥有{C:attention}#1#张", + "额外的{C:attention}石头牌" + } + }, + b_braided = { + name = "编织牌组", + text = { + "第一次出牌的牌型", + "升级到{C:attention}第3级" + } + }, + b_anaglyph = { + name = "浮雕牌组", + text = { + "击败每个", + "{C:attention}Boss盲注{}后,获得一个", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "等离子牌组", + text = { + "计算出牌分数时", + "平衡{C:blue}筹码{}和", + "{C:red}倍率{}", + "盲注要求分数{C:red}X#1#{}" + } + }, + b_erratic = { + name = "古怪牌组", + text = { + "所有{C:attention}牌级{}和", + "牌组的{C:attention}花色{}", + "都是随机的" + } + }, + b_challenge = { + name = "挑战牌组", + text = { + "" + } + }, + b_ghost = { + name = "幽灵牌组", + text = { + "{C:spectral}幻灵牌{}可能", + "出现在商店中,", + "初始带有{C:spectral,T:c_hex}妖法{}牌" + } + }, + b_zodiac = { + name = "黄道牌组", + text = { + "开局时即拥有", + "{C:tarot,T:v_tarot_merchant}#1#{}、", + "{C:planet,T:v_planet_merchant}#2#{}、", + "和{C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "彩绘牌组", + text = { + "{C:attention}+#1#{}手牌大小", + "{C:red}#2#{}小丑牌槽位" + } + } + }, + Other = { + gold_seal = { + name = "金色蜡封", + text = { + "打出这张牌", + "并得分时", + "获得{C:money}$3{}" + } + }, + white_sticker = { + name = "白标贴", + text = { + "使用这个小丑牌", + "在{C:attention}白注", + "难度下获胜" + } + }, + red_sticker = { + name = "红标贴", + text = { + "使用这个小丑牌", + "在{C:attention}红注", + "难度下获胜" + } + }, + green_sticker = { + name = "绿标贴", + text = { + "使用这个小丑牌", + "在{C:attention}绿注", + "难度下获胜" + } + }, + blue_sticker = { + name = "蓝标贴", + text = { + "使用这个小丑牌", + "在{C:attention}蓝注", + "难度下获胜" + } + }, + black_sticker = { + name = "黑标贴", + text = { + "使用这个小丑牌", + "在{C:attention}黑注", + "难度下获胜" + } + }, + purple_sticker = { + name = "紫标贴", + text = { + "使用这个小丑牌", + "在{C:attention}紫注", + "难度下获胜" + } + }, + orange_sticker = { + name = "橙标贴", + text = { + "使用这个小丑牌", + "在{C:attention}橙注", + "难度下获胜" + } + }, + gold_sticker = { + name = "金色标贴", + text = { + "使用这个小丑牌", + "在{C:attention}金注", + "难度下获胜" + } + }, + playing_card = { + text = { + "{V:1}#2#{C:light_black}#1#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{}筹码" + } + }, + card_extra_chips = { + text = { + "获得{C:chips}+#1#{}个额外筹码" + } + }, + locked = { + name = "锁定", + text = {} + }, + debuffed_default = { + name = "被削弱", + text = { + "所有能力", + "禁用" + } + }, + debuffed_playing_card = { + name = "被削弱", + text = { + "得分无筹码,", + "不能触发任何", + "功能或效果" + } + }, + demo_locked = { + name = "已锁定", + text = { + "本试玩版", + "暂不可用" + } + }, + demo_shop_locked = { + name = "已锁定", + text = { + "{C:attention}金宝的", + "个人卡牌收藏。", + "可在完整版", + "{E:1,C:red}Balatro中找到" + } + }, + wip_locked = { + name = "已锁定", + text = { + "正在", + "制作中" + } + }, + deck_locked_win = { + name = "已锁定", + text = { + "在任一难度下", + "以{C:attention}#1#{}", + "赢得一局" + } + }, + deck_locked_discover = { + name = "锁定", + text = { + "在收藏中", + "发现至少", + "{C:attention}#1#{}个项目" + } + }, + deck_locked_stake = { + name = "已锁定", + text = { + "在{V:1}#1#{}或以上", + "难度以任一牌组", + "赢得一局" + } + }, + joker_locked_legendary = { + name = "已锁定", + text = { + "通过{C:spectral}灵魂{}牌", + "找到这张小丑牌" + } + }, + undiscovered_joker = { + name = "未发现", + text = { + "在非预设局", + "中购买或", + "使用此牌", + "以了解其效果" + } + }, + undiscovered_tarot = { + name = "未发现", + text = { + "在非预设局", + "中购买或", + "使用此牌", + "以了解其效果" + } + }, + undiscovered_planet = { + name = "未发现", + text = { + "在非预设局", + "中购买或", + "使用此牌", + "以了解其效果" + } + }, + undiscovered_spectral = { + name = "未发现", + text = { + "在非预设局", + "中购买或", + "使用此牌", + "以了解其效果" + } + }, + undiscovered_voucher = { + name = "未发现", + text = { + "在非预设局", + "中兑换并使用", + "此优惠券", + "以了解其效果" + } + }, + undiscovered_booster = { + name = "未发现", + text = { + "在非预设局", + "中打开此包", + "以了解其效果" + } + }, + undiscovered_edition = { + name = "未发现", + text = { + "在非预设局", + "中找到此版本", + "以了解其效果" + } + }, + undiscovered_tag = { + name = "未发现", + text = { + "在非预设局", + "中使用此标签", + "以了解其效果" + } + }, + p_arcana_normal = { + name = "秘术包", + text = { + "从最多{C:attention}#2#张{C:tarot}塔罗牌{}中", + "选择{C:attention}#1#{}张", + "即选即用" + } + }, + p_arcana_jumbo = { + name = "巨型秘术包", + text = { + "从最多{C:attention}#2#张{C:tarot}塔罗牌{}中", + "选择{C:attention}#1#{}张", + "即选即用" + } + }, + p_arcana_mega = { + name = "超级秘术包", + text = { + "从最多{C:attention}#2#张{C:tarot}塔罗牌{}中", + "选择{C:attention}#1#{}张", + "即选即用" + } + }, + p_celestial_normal = { + name = "天体包", + text = { + "从最多{C:attention}#2#张{C:planet}星球牌{}中", + "选择{C:attention}#1#{}张", + "即选即用" + } + }, + p_celestial_jumbo = { + name = "巨型天体包", + text = { + "从最多{C:attention}#2#张{C:planet}星球牌{}中", + "选择{C:attention}#1#{}张", + "即选即用" + } + }, + p_celestial_mega = { + name = "超级天体包", + text = { + "从最多{C:attention}#2#张{C:planet}星球牌{}中", + "选择{C:attention}#1#{}张", + "即选即用" + } + }, + p_spectral_normal = { + name = "幻灵包", + text = { + "从最多{C:attention}#2#张{C:spectral}幻灵牌{}中", + "选择{C:attention}#1#{}张", + "即选即用" + } + }, + p_spectral_jumbo = { + name = "巨型幻灵包", + text = { + "从最多{C:attention}#2#张{C:spectral}幻灵牌{}中", + "选择{C:attention}#1#{}张", + "即选即用" + } + }, + p_spectral_mega = { + name = "超级幻灵包", + text = { + "从最多{C:attention}#2#张{C:spectral}幻灵牌{}中", + "选择{C:attention}#1#{}张", + "即选即用" + } + }, + p_standard_normal = { + name = "标准包", + text = { + "从最多{C:attention}#2#张{C:attention}游戏牌{}中", + "选择{C:attention}#1#{}张", + "到你的牌组" + } + }, + p_standard_jumbo = { + name = "巨型标准包", + text = { + "从最多{C:attention}#2#张{C:attention}游戏牌{}中", + "选择{C:attention}#1#{}张", + "到你的牌组" + } + }, + p_standard_mega = { + name = "超大标准包", + text = { + "从最多{C:attention}#2#张{C:attention}游戏牌{}中", + "选择{C:attention}#1#{}张", + "到你的牌组" + } + }, + p_buffoon_normal = { + name = "小丑包", + text = { + "从最多{C:attention}#2#张{C:joker}小丑牌{}中", + "选择{C:attention}#1#{}张" + } + }, + p_buffoon_jumbo = { + name = "巨型小丑包", + text = { + "从最多{C:attention}#2#张{C:joker}小丑牌{}中", + "选择{C:attention}#1#{}张" + } + }, + p_buffoon_mega = { + name = "超级小丑包", + text = { + "从最多{C:attention}#2#张{C:joker}小丑牌{}中", + "选择{C:attention}#1#{}张" + } + }, + pinned_left = { + name = "固定", + text = { + "这张小丑牌", + "固定在", + "最左侧" + } + }, + red_seal = { + name = "红色蜡封", + text = { + "重新触发{C:attention}1{}次", + "此卡牌" + } + }, + blue_seal = { + name = "蓝色蜡封", + text = { + "当这张牌在回合结束时", + "还{C:attention}保留{}在手牌中", + "产生一张 {C:planet}星球卡{}" + } + }, + purple_seal = { + name = "紫色蜡封", + text = { + "被{C:attention}弃掉时", + "产生一张{C:tarot}塔罗牌{}", + "{C:inactive}(必须有空位)" + } + }, + eternal = { + name = "永恒卡", + text = { + "不能出售", + "或摧毁" + } + }, + challenge_locked = { + name = "未解锁", + text = { + "用至少#1#个不同牌组", + "赢得一场比赛以解锁", + "挑战模式", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "黑桃", + Hearts = "红桃", + Clubs = "梅花", + Diamonds = "方片" + }, + suits_plural = { + Spades = "黑桃", + Hearts = "红桃", + Clubs = "梅花", + Diamonds = "方片" + }, + blind_states = { + Select = "选择", + Skipped = "跳过", + Current = "当前", + Defeated = "已被击败", + Upcoming = "下一回合", + Selected = "已选择" + }, + ranks = { + Ace = "A", + King = "K", + Queen = "Q", + Jack = "J", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "最佳出牌", + furthest_round = "最高回合", + furthest_ante = "最高投注额", + most_money = "最多资金", + boss_streak = "最多连续击败Boss", + collection = "收藏", + win_streak = "最佳连胜纪录", + current_streak = "", + poker_hand = "最常用的出牌" + }, + poker_hands = { + ['Flush House'] = "同花葫芦", + ['Five of a Kind'] = "五条", + ['Royal Flush'] = "皇家同花顺", + ['Straight Flush'] = "同花顺", + ['Four of a Kind'] = "四条", + ['Full House'] = "葫芦", + ['Flush'] = "同花", + ['Straight'] = "顺子", + ['Three of a Kind'] = "三条", + ['Two Pair'] = "两对", + ['Pair'] = "对子", + ['High Card'] = "高牌", + ['Flush Five'] = "同花五条" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "三条及对子,且", + "花色相同" + }, + ['Five of a Kind'] = { + "5张相同点数的牌" + }, + ['Royal Flush'] = { + "连续5张牌(连续数字),且", + "花色相同" + }, + ['Straight Flush'] = { + "连续5张牌(连续数字),且", + "花色相同" + }, + ['Four of a Kind'] = { + "4张相同点数的牌", + "可以与其他一张未计分的牌一同打出" + }, + ['Full House'] = { + "三条及对子,且" + }, + ['Flush'] = { + "5张牌花色相同" + }, + ['Straight'] = { + "连续5张牌(连续数字)" + }, + ['Three of a Kind'] = { + "3张点数相同的牌可以与最多", + "2张其他未计分的牌一同打出" + }, + ['Two Pair'] = { + "两对不同点数的牌", + "可以与其他一张未计分的牌一同打出" + }, + ['Pair'] = { + "两张点数相同的牌可以与最多", + "3张其他未计分的牌一同打出" + }, + ['High Card'] = { + "如果打出的牌不是以上任何一种", + "那么只有点数最高的牌得分" + }, + ['Flush Five'] = { + "5张相同点数和相同花色的牌" + } + }, + labels = { + common = "普通", + uncommon = "罕见", + rare = "稀有", + legendary = "传奇", + tarot = "塔罗牌", + planet = "星球牌", + pluto_planet = "矮行星", + voucher = "优惠券", + foil = "闪箔", + holographic = "镭射", + polychrome = "多彩", + negative = "负片", + gold_seal = "金色蜡封", + locked = "未解锁", + blue_seal = "蓝色蜡封", + red_seal = "红色蜡封", + purple_seal = "紫色蜡封", + eternal = "永恒卡", + pinned_left = "已固定" + }, + dictionary = { + b_sell = "售出", + b_use = "使用", + b_select = "选择", + b_buy = "购买", + b_redeem = "兑换", + b_open = "打开", + b_and_use = "&使用", + b_next_round_1 = "下一个", + b_next_round_2 = "回合", + b_play_hand = "出牌", + b_discard = "弃牌", + b_sort_hand = "理牌", + b_run_info_1 = "比赛", + b_run_info_2 = "信息", + b_options = "选项", + b_reroll_boss = "重掷Boss盲注", + b_skip_blind = "跳过盲注", + b_skip_reward = "跳过奖励", + b_skip = "跳过", + b_start_new_run = "开始新的一局", + b_main_menu = "主菜单", + b_collection = "收藏", + b_seed = "种子", + b_copy_seed = "复制种子", + b_credits = "制作人员", + b_stats = "统计数据", + b_settings = "设置", + b_set_game = "游戏", + b_set_video = "视频", + b_set_graphics = "图形", + b_set_audio = "音频", + b_set_gamespeed = "游戏速度", + b_set_play_discard_pos = "出牌/弃牌按钮位置", + b_set_screenshake = "屏幕震动", + b_set_crash_reports = "崩溃报告", + b_set_monitor = "显示监视器", + b_set_windowmode = "窗口模式", + b_set_apply = "应用", + b_set_master_vol = "主音量", + b_set_music_vol = "音乐音量", + b_set_game_vol = "游戏音量", + b_set_shadows = "阴影", + b_set_pixel_smoothing = "像素画平滑", + b_set_CRT = "CRT", + b_set_CRT_bloom = "模拟CRT荧光效果", + b_stat_jokers = "小丑", + b_stat_consumables = "消耗牌", + b_stat_tarots = "塔罗牌", + b_stat_planets = "星球牌", + b_stat_spectrals = "幻灵牌", + b_stat_vouchers = "优惠券", + b_next = "下一个", + b_endless = "无尽模式", + b_wishlist = "在Steam上加入愿望单", + b_playbalatro = "访问 playbalatro.com", + b_remaining = "剩余", + b_full_deck = "完整牌组", + b_poker_hands = "牌型", + b_blinds = "盲注", + b_vouchers = "优惠券", + b_stake = "赌注", + b_jokers = "小丑", + b_tarot_cards = "塔罗牌", + b_planet_cards = "星球牌", + b_spectral_cards = "幻灵牌", + b_enhanced_cards = "增强卡牌", + b_editions = "版本", + b_booster_packs = "补充包", + b_tags = "标签", + b_decks = "牌组", + b_continue = "继续", + b_back = "返回", + b_music = "音乐", + b_sounds = "声音", + b_imagery = "图像", + b_new_run = "新一局", + b_challenges = "挑战", + b_current_profile = "当前配置", + b_load_profile = "加载配置", + b_create_profile = "创建配置", + b_delete_profile = "删除配置", + b_reset_profile = "重设配置", + b_rules = "规则", + b_restrictions = "限制条件", + b_deck = "牌组", + b_play_cap = "开始游戏", + b_options_cap = "选项", + b_collection_cap = "收藏", + b_quit_cap = "退出", + b_cash_out = "提现", + k_unknown = "?????", + k_compatible = "兼容", + k_incompatible = "不兼容", + k_round = "回合", + k_ante = "底注", + k_seed = "种子", + k_reroll = "重掷", + k_mult = "倍率", + k_rank = "点数", + k_suit = "花色", + k_stake = "赌注", + k_common = "普通", + k_uncommon = "罕见", + k_rare = "稀有", + k_legendary = "传奇", + k_debuffed = "被削弱", + k_locked = "锁定", + k_undisovered = "未发现", + k_joker = "小丑", + k_voucher = "优惠券", + k_tarot = "塔罗牌", + k_planet = "星球牌", + k_dwarf_planet = "矮行星", + k_planet_q = "星球?", + k_spectral = "幻灵", + k_booster = "补充包", + k_edition = "版本", + k_hud_hands = "出牌", + k_hud_discards = "弃牌", + k_lower_score = "分数", + k_arcana_pack = "秘术包", + k_celestial_pack = "天体包", + k_spectral_pack = "幻灵包", + k_standard_pack = "标准包", + k_buffoon_pack = "小丑包", + k_enter_text = "输入文本", + k_defeated_by = "击败", + k_level_prefix = "等级", + k_also_applied = "同适用", + k_base_cards = "基础卡牌", + k_effective = "有效", + k_aces = "A", + k_face_cards = "人头牌", + k_numbered_cards = "数字牌", + k_cap_consumables = "消耗牌", + k_page = "页", + k_ante_cap = "底注", + k_base_cap = "基础", + k_jokers_cap = "小丑", + k_vouchers_cap = "优惠券", + k_x_base = "X 基础", + k_not_discovered = "未发现", + k_unlocked_ex = "已解锁!", + k_challenge_mode = "挑战模式", + k_daily_run = "每日挑战", + k_profile = "配置", + k_wins = "获胜数", + k_empty_caps = "空", + k_collection = "收藏", + k_stake_level = "赌注等级", + k_none = "无", + k_game_modifiers = "游戏修改器", + k_custom_rules = "自定义规则", + k_banned_cards = "禁用卡", + k_banned_tags = "禁用标签", + k_other = "其他", + k_money = "资金", + k_best_hand = "最佳出牌", + k_seeded_run = "预设局", + k_enter_seed = "输入种子", + k_lvl = "级别", + k_skipped_cap = "跳过", + k_no_reward = "无奖励", + k_reward = "奖励", + k_nope_ex = "没有!", + k_or = "或", + k_balanced = "平衡", + ph_improve_run = "提升你的成绩!", + ph_sneak_peek = "抢先看", + ph_deck_preview_stones = "石头", + ph_deck_preview_effective = "因小丑、盲注和卡牌强化而产生的有效总数", + ph_blind_score_at_least = "至少得分", + ph_blind_reward = "奖励:", + ph_up_ante_1 = "提高底注", + ph_up_ante_2 = "加注所有盲注", + ph_up_ante_3 = "刷新盲注", + ph_stat_joker = "使用此卡完成的总回合数", + ph_stat_consumable = "这张卡的使用次数", + ph_stat_voucher = "兑换此优惠券的次数", + ph_demo_thanks_1 = "感谢游玩", + ph_demo_thanks_2 = "BALATRO 演示版", + ph_game_over = "游戏结束", + ph_vouchers_redeemed = "本赛局兑换的优惠券", + ph_no_vouchers = "本赛局并未兑换任何优惠券", + ph_defeat_this_blind_1 = "打败盲注", + ph_defeat_this_blind_2 = "发现它", + ph_click_confirm = "再次点击确认", + ph_choose_blind_1 = "选择你的", + ph_choose_blind_2 = "下一个盲注", + ph_mr_bones = "被骷髅先生救了", + ph_score_at_least = "至少得分", + ph_all_poker_hand = "所有牌型", + ph_1_level = "+1级", + ph_boss_disabled = "Boss盲注限制条件失效", + ph_most_played = "{最常出的牌型}", + ml_demo_thanks_message = { + "请考虑将Balatro列入", + "steam许愿清单并注册", + "playbalatro.com上的时事通讯" + }, + ml_eternal = { + "永恒卡", + "不能出售", + "或摧毁" + }, + ml_gold_seal_desc = { + "黄金蜡封", + "若打出", + "返回手牌" + }, + ml_crash_report_info = { + "崩溃报告将发送给开发人员", + "用以减少今后出现问题。", + "不会发送身份信息或个人信息。" + }, + ml_play_discard_pos_opt = { + "弃牌/出牌", + "出牌/弃牌" + }, + ml_windowmode_opt = { + "窗口模式", + "全屏模式", + "无边框模式" + }, + ml_vsync_opt = { + "垂直同步开启", + "垂直同步关闭" + }, + ml_shadow_opt = { + "开启", + "关闭" + }, + ml_smoothing_opt = { + "关闭", + "开启" + }, + ml_bloom_opt = { + "关闭", + "开启" + }, + ml_card_stats = { + "卡牌", + "统计数据" + }, + ml_paste_seed = { + "粘贴", + "种子" + }, + ml_disabled_seed = { + "所有解锁和", + "发现均被禁用" + }, + ['$'] = "$", + k_redeemed_ex = "兑换!", + k_duplicated_ex = "重复!", + k_no_room_ex = "没有空间!", + k_no_space_ex = "没有空间!", + k_no_other_jokers = "没有其他小丑牌!", + k_plus_tarot = "+1塔罗牌", + k_plus_stone = "+1石头牌", + k_plus_planet = "+1星球牌", + k_plus_spectral = "+1幻灵牌", + k_active_ex = "激活!", + k_level_up_ex = "提升等级!", + k_upgrade_ex = "升级!", + k_again_ex = "再来一次!", + k_val_up = "价值提升!", + k_reset = "重置", + k_extinct_ex = "已灭绝!", + k_safe_ex = "安全!", + k_saved_ex = "已储存!", + k_swapped_ex = "已切换!", + k_copied_ex = "已复制!", + k_melted_ex = "已融化!", + b_copy = "复制", + b_high_contrast_cards = "高对比度卡牌", + b_set_rumble = "控制器震动", + b_seals = "蜡封", + b_new_challenge = "开始新挑战", + b_unlock_all = "解锁全部", + k_active = "已激活", + k_deck = "牌组", + k_progress = "进度", + k_challenges = "挑战", + k_joker_stickers = "小丑贴纸", + k_deck_stake_wins = "牌组赌注完成度", + k_enter_name = "输入名字", + k_gold = "金色", + k_card_stats = "卡牌属性", + k_view = "查看", + k_all_hands = "全部出牌", + k_high_score_ex = "高分!", + k_demo_version_ex = "试玩版!", + k_playing_as = "使用", + k_choose = "选择", + k_achievements_disabled = "未开启成就", + ph_no_boss_active = "无活跃boss", + ph_you_win = "你赢了!", + ph_you_win_demo = "你赢下了试玩版!", + ph_defeat_the_boss = "打赢Boss盲注", + ph_score_furthest_ante = "底注", + ph_score_furthest_round = "回合", + ph_score_hand = "最佳出牌", + ph_score_poker_hand = "最常用出牌", + ph_score_new_collection = "新发现", + ph_score_cards_played = "已使用卡牌", + ph_score_cards_discarded = "已弃掉卡牌", + ph_score_times_rerolled = "重掷次数", + ph_score_cards_purchased = "已购买卡牌", + ml_edition_seal_enhancement_explanation = { + "每张游戏牌可能会有", + "增强、版本和蜡封版本" + }, + ml_unlock_all_explanation = { + "警告!解锁全部收藏道具", + "会禁用此账号的成就!" + }, + k_plus_joker = "+1小丑", + k_eaten_ex = "被吃掉!", + k_eroded_ex = "被腐蚀!", + k_achievement = "成就", + ph_unscored_hand = "出牌将不会计分", + ph_alert_debuff_confirm = "再次按下”出牌“确认", + k_drank_ex = "喝下去!", + k_trophy = "奖杯", + k_trophies_disabled = "奖杯被禁用", + ml_unlock_all_trophies = { + "警告!解锁全部收藏道具", + "会禁用此账号的奖杯!" + }, + k_poker_hand = "牌型", + ph_4_7_of_clubs = "四张梅花7" + }, + v_dictionary = { + a_xmult = "X#1#倍率", + a_mult = "+#1#倍率", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1#的手牌大小", + a_hands = "+#1#出牌次数", + a_sold_tally = "#1#/#2#售出", + a_remaining = "剩余#1#", + ante_x_voucher = "底注#1#张优惠券", + loyalty_active = "激活!", + loyalty_inactive = "#1#剩余", + deck_preview_wheel_singular = "由于抽出的#1#牌面朝下,数字可能较低", + deck_preview_wheel_plural = "由于抽出的#1#牌面朝下,数字可能较低", + challenges_completed = "已完成#1#/#2#挑战", + interest = "每$#2#获得#1#利息(最高 #3#)", + remaining_hand_money = "剩余出牌次数(每次$#1#)", + remaining_discard_money = "剩余弃牌次数(每次$#1#)", + ml_foil_desc = { + "闪箔", + "+#1#筹码" + }, + ml_holo_desc = { + "镭射", + "+#1#倍率" + }, + ml_polychrome_desc = { + "多彩", + "+#1#倍率" + }, + ml_negative_desc = { + "负片", + "+#1#小丑牌槽位" + }, + a_mult_minus = "-#1#倍率", + a_handsize_minus = "-#1#手牌大小", + ml_negative_consumable_desc = { + "负片", + "+#1#消耗牌槽位" + }, + a_xmult_minus = "-X#1#倍率", + unlocked = "#1#/#2#已解锁", + completed = "#1#/#2#已完成" + }, + v_text = { + ch_m_dollars = { + "从{C:money}$#1#开始" + }, + ch_m_hands = { + "每回合{C:blue}#1#{}次出牌" + }, + ch_m_discards = { + "每回合{C:red}#1#{}次弃牌" + }, + ch_m_reroll_cost = { + "{C:money}$#1#{}基本重掷费用" + }, + ch_m_joker_slots = { + "{C:attention}#1#{}小丑牌槽位" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{}消耗牌槽位" + }, + ch_m_hand_size = { + "{C:attention}#1#{}手牌大小" + }, + ch_m_none = { + "{C:inactive}无" + }, + ch_c_no_reward = { + "所有{C:attention}盲注{}均无奖励金" + }, + ch_c_no_reward_specific = { + "{C:attention}#1# 盲注{}均无奖励金" + }, + ch_c_no_extra_hand_money = { + "额外的{C:blue}牌不再赚取资金" + }, + ch_c_no_interest = { + "回合结束时不赚取{C:attention}利息{}" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}每日挑战!" + }, + ch_c_set_seed = { + "使用设定的种子尝试1次:{C:inactive}{Hidden}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}筹码{}不能超过当前{C:money}$" + }, + ch_c_none = { + "{C:inactive}无" + }, + ch_c_inflation = { + "每次购买后价格永久上涨 {C:money}$1{}" + }, + ch_c_discard_cost = { + "每次弃牌需花费 {C:money}$#1#{}" + }, + ch_c_all_eternal = { + "所有商店里的小丑牌都是{C:eternal}永恒卡{}" + }, + ch_c_flipped_cards = { + "{C:green}#1#中的1张{}卡牌以背面朝上的方式抽取" + }, + ch_c_minus_hand_size_per_X_dollar = { + "你每拥有{C:money}$#1#{},可持有的卡牌 {C:red}-1{}" + }, + ch_c_no_shop_jokers = { + "小丑牌不再出现在{C:attention}商店{}中" + }, + ch_c_debuff_played_cards = { + "所有{C:attention}已打出{}的牌在计分后都会{C:attention}被削弱" + }, + ch_c_set_eternal_ante = { + "当{C:attention}#1#{}Boss盲注被击败时,所有小丑牌变为{C:attention}永恒卡" + }, + ch_c_set_joker_slots_ante = { + "当{C:attention}#1#{}Boss盲注被击败时,将小丑牌槽位设置为{C:attention}0" + } + }, + tutorial = { + sb_1 = { + "你好呀!我叫", + "{C:attention}金宝{},我是来帮你的", + "让我带你了解游玩的方法!" + }, + sb_2 = { + "你的目标是赚取", + "{C:blue}筹码{}以击败", + "对手的{C:attention}盲注" + }, + sb_3 = { + "这是{C:blue}小盲注{},", + "你只需要获得", + "{C:attention}300筹码{}就可击败它。" + }, + sb_4 = { + "选择{C:blue}小盲注", + "来开始回合!" + }, + bb_1 = { + "选择{C:attention}大盲注", + "可以让你赚钱" + }, + bb_2 = { + "或选择{C:attention}跳过", + "可获得一个{C:attention}标签{}!每个", + "{C:attention}标签{}具有独特的效果" + }, + bb_3 = { + "但要注意", + "{C:attention}Boss盲注{}。 每个Boss盲注", + "都有着限制条件", + "您必须要有策略来应对。" + }, + bb_4 = { + "如果你战胜了它,那么", + "{C:attention}底注{}提升并且所有", + "{C:attention}盲注{}变得更难" + }, + bb_5 = { + "击败{C:attention}底注{}#1#以获胜。", + "现在做出你的选择!" + }, + fh_1 = { + "你可以通过以下方式获得筹码", + "打出{C:attention}牌型" + }, + fh_2 = { + "{C:attention}牌型{}可获得", + "基本{C:blue}筹码", + "再乘以某个数值的{C:red}倍率加成" + }, + fh_3 = { + "查看你的{C:attention}牌型", + "可通过{C:attention}比赛信息{}区操作,", + "同时可以查看其他", + "关于当前游戏的信息" + }, + fh_4 = { + "卡牌还可获得", + "一些{C:blue}筹码{},", + "悬停此处查看!" + }, + fh_5 = { + "现在选择最多", + "{C:attention}5{}张牌", + "并按下{C:blue}“出牌键”" + }, + fh_6 = { + "还可以选择{C:red}“弃牌”{},最多", + "可弃掉{C:attention}5{}张选定卡牌", + "以求组成", + "更强牌型。试试吧!" + }, + fh_7 = { + "小心!每回合你的", + "{C:blue}出牌{}和{C:red}弃牌{}", + "次数有限" + }, + fh_8 = { + "在使用完所有{C:blue}出牌{}", + "次数前,赚取{C:attention}300筹码{},", + "来赢得此回合。", + "祝你好运!" + }, + sh_1 = { + "当你得到更多的卡牌时,", + "请记住,你可以重新理牌。", + "{C:attention}小丑牌{}触发顺序为", + "从左至右" + }, + sh_2 = { + "确保你", + "{C:attention}使用{}消耗牌!" + }, + sh_3 = { + "最多选择{C:attention}2{}张", + "手持牌,并按下", + "{C:attention}“使用”{}键,打出{C:tarot}塔罗牌{}", + "施加增强效果!" + }, + s_1 = { + "干得漂亮!现在", + "你有一些{C:money}现金{},", + "你可以从{C:attention}店内", + "买一些新的卡牌" + }, + s_2 = { + "试试买这个", + "超酷的小丑牌" + }, + s_3 = { + "这是{C:attention}#1#张", + "{C:attention}小丑牌{}之一的卡牌,可以添加到", + "游戏中。每张{C:attention}小丑牌", + "效果不同" + }, + s_4 = { + "这个可以让你每次出牌", + "{C:red}+4倍率{}" + }, + s_5 = { + "挑剔着点,", + "你一次只能带", + "{C:attention}5张小丑牌{}" + }, + s_6 = { + "现在,从{C:attention}店内", + "购买另一张卡牌。" + }, + s_7 = { + "这张{C:tarot}塔罗牌{}是", + "{C:attention}消耗牌{}。此牌可", + "增强您在玩的", + "卡牌。好好留着这张牌" + }, + s_8 = { + "您一次最多", + "可以携带", + "{C:attention}2张消耗牌{}" + }, + s_9 = { + "如果你有足够的积蓄,", + "可以购买{C:attention}优惠券{}。", + "{C:attention}优惠券{}可以帮您", + "提升本局体验" + }, + s_10 = { + "只要你打败", + "{C:attention}Boss盲注{},", + "{C:attention}优惠券{}会重新上架。" + }, + s_11 = { + "快来查看这两个", + "{C:booster}补充包{},", + "所有商店均有售,", + "补充包内增益多多!" + }, + s_12 = { + "让我们继续", + "{C:attention}下一回合{}。" + } + }, + achievement_names = { + ante_up = "底注上升!", + ante_upper = "底注再上升!", + heads_up = "注意", + low_stakes = "低赌注", + mid_stakes = "中赌注", + high_stakes = "高赌注", + card_player = "玩牌能手", + card_discarder = "弃牌能手", + nest_egg = "储备金", + flushed = "同花", + speedrunner = "速通大神", + roi = "投资回报率", + shattered = "破碎", + royale = "皇家", + retrograde = "逆序", + _10k = "1万", + _1000k = "100万", + _100000k = "1亿", + tiny_hands = "小手", + big_hands = "大手", + you_get_what_you_get = "种瓜得瓜", + rule_bender = "规则篡改者", + rule_breaker = "规则破坏者", + legendary = "传奇", + astronomy = "天文", + cartomancy = "纸牌卜卦", + clairvoyance = "未卜先知", + extreme_couponer = "优惠券重度使用者", + completionist = "完美主义者", + completionist_plus = "完美主义者+", + completionist_plus_plus = "完美主义者++" + }, + achievement_descriptions = { + ante_up = "达到底注4阶段", + ante_upper = "达到底注8阶段", + heads_up = "赢一局", + low_stakes = "在至少红注难度下赢一局", + mid_stakes = "在至少黑注难度下赢一局", + high_stakes = "在至少金注难度下赢一局", + card_player = "打出至少2500张牌", + card_discarder = "弃掉至少2500张牌", + nest_egg = "单局中拥有 $400 或以上", + flushed = "用5张万能牌打出一次同花", + speedrunner = "在12回合内赢得一局", + roi = "在底注4阶段时购买5张优惠券", + shattered = "单次出牌打碎2张玻璃牌", + royale = "打出一次皇家同花顺", + retrograde = "让任一牌型升至第10级", + _10k = "单次出牌获得1万筹码", + _1000k = "单次出牌获得100万筹码", + _100000k = "单次出牌获得1亿筹码", + tiny_hands = "将你的牌组减少到20张或更少", + big_hands = "牌组中拥有80张或以上的卡牌", + you_get_what_you_get = "赢下一局且没有在商店中重掷", + rule_bender = "完成任一挑战局", + rule_breaker = "完成每一场挑战局", + legendary = "发现一张传奇小丑牌", + astronomy = "发现所有星球牌", + cartomancy = "发现所有塔罗牌", + clairvoyance = "发现所有幻灵牌", + extreme_couponer = "发现所有优惠券", + completionist = "发现100%的收藏道具", + completionist_plus = "赢得胜利且每个牌组都在金注难度", + completionist_plus_plus = "每张小丑牌都获得一个金色标贴" + }, + quips = { + wq_1 = { + "你太棒了!" + }, + wq_2 = { + "你表现得", + "相当不错!" + }, + wq_3 = { + "看起来你", + "是有真本事的!" + }, + wq_4 = { + "这些筹码", + "都是虚拟的", + "真是太可惜了……" + }, + wq_5 = { + "看来我把你", + "教的不错啊!" + }, + wq_6 = { + "你有几局", + "非常精彩啊!" + }, + wq_7 = { + "幸好", + "我没有", + "和你打赌" + }, + lq_1 = { + "可能消消乐", + "才更适合", + "我们的节奏……" + }, + lq_2 = { + "我们的牌打的", + "相当潦草!" + }, + lq_3 = { + "我们是时候", + "撤出", + "重来了!" + }, + lq_4 = { + "你也知道", + "老话怎么说的,", + "你可能小赚,但庄家永远不亏!" + }, + lq_5 = { + "看来我们", + "找到了谁才是", + "真正的小丑!" + }, + lq_6 = { + "哦不,你刚刚是", + "真的在吹牛?" + }, + lq_7 = { + "看来我们才是", + "那个出洋相的!" + }, + lq_8 = { + "如果我有手的话", + "我肯定会", + "捂上双眼!" + }, + lq_9 = { + "我真是个", + "傻瓜,你的借口", + "又是什么?" + }, + lq_10 = { + "真是太惨了!" + }, + dq_1 = { + "哎哟!我希望你", + "肚子里还有", + "别的招式来", + "应对这场最终挑战!" + } + }, + challenge_names = { + c_omelette_1 = "煎蛋卷", + c_city_1 = "15分钟都市", + c_rich_1 = "富者愈富", + c_knife_1 = "刀锋之上", + c_xray_1 = "X光视界", + c_mad_world_1 = "疯狂世界", + c_luxury_1 = "奢侈税", + c_non_perishable_1 = "不腐之物", + c_medusa_1 = "美杜莎", + c_double_nothing_1 = "孤注一掷", + c_typecast_1 = "模式转换", + c_inflation_1 = "通货膨胀", + c_bram_poker_1 = "布拉姆扑克", + c_fragile_1 = "易碎品", + c_monolith_1 = "巨石", + c_blast_off_1 = "引燃", + c_five_card_1 = "五连抽", + c_golden_needle_1 = "金针", + c_cruelty_1 = "残酷", + c_jokerless_1 = "无小丑" + } + } +} \ No newline at end of file diff --git a/localization/zh_TW.lua b/localization/zh_TW.lua new file mode 100644 index 0000000..d2290e2 --- /dev/null +++ b/localization/zh_TW.lua @@ -0,0 +1,4237 @@ +return { + descriptions = { + Joker = { + j_joker = { + name = "小丑", + text = { + "倍數{C:red,s:1.1}+#1#{}" + } + }, + j_jolly = { + name = "開心小丑", + text = { + "如果打出的牌包含", + "{C:attention}#2#{},", + "倍數{C:red}+#1#{}" + } + }, + j_zany = { + name = "滑稽小丑", + text = { + "如果打出的牌包含", + "{C:attention}#2#{},", + "倍數{C:red}+#1#{}" + } + }, + j_mad = { + name = "生氣小丑", + text = { + "如果打出的牌包含", + "{C:attention}#2#{},", + "倍數{C:red}+#1#{}" + } + }, + j_crazy = { + name = "瘋狂小丑", + text = { + "如果打出的牌包含", + "{C:attention}#2#{},", + "倍數{C:red}+#1#{}" + } + }, + j_droll = { + name = "古怪小丑", + text = { + "如果打出的牌包含", + "{C:attention}#2#{},", + "倍數{C:red}+#1#{}" + } + }, + j_half = { + name = "半個小丑", + text = { + "如果打出", + "不超過{C:attention}#2#{}張牌,", + "倍數{C:red}+#1#{}" + } + }, + j_fortune_teller = { + name = "占卜師小丑", + text = { + "本賽局每使用一張{C:purple}塔羅牌{}時", + "倍數{C:red}+#1#{}", + "{C:inactive}(目前為{C:red}+#2#{C:inactive})" + } + }, + j_juggler = { + name = "雜耍小丑", + text = { + "{C:attention}+#1#{}手牌大小" + } + }, + j_drunkard = { + name = "喝掛小丑", + text = { + "{C:red}+#1#{}次棄牌數" + } + }, + j_stone = { + name = "石頭小丑", + text = { + "為牌組內的", + "每張{C:attention}石頭牌{}", + "{C:chips}+#1#{}籌碼", + "{C:inactive}(目前為{C:chips}+#2#{C:inactive}籌碼)" + } + }, + j_golden = { + name = "黃金小丑", + text = { + "於每一回合結束時", + "獲得{C:money}$#1#{}" + } + }, + j_stencil = { + name = "模具小丑", + text = { + "每個空的{C:attention}小丑牌{}欄位", + "獲得{X:red,C:white}X#1#{}倍數。", + "包含{s:0.8}模具小丑", + "{C:inactive}(目前為{X:red,C:white}X#1#{C:inactive})" + } + }, + j_four_fingers = { + name = "四張牌", + text = { + "所有{C:attention}同花{}和", + "{C:attention}順子{}可以", + "只用{C:attention}4{}張牌湊成" + } + }, + j_mime = { + name = "默劇小丑", + text = { + "重新觸發", + "所有手中{C:attention}持有的", + "{C:attention}手牌{}的能力" + } + }, + j_credit_card = { + name = "信用卡", + text = { + "最多可負債", + "至{C:red}$#1#{}" + } + }, + j_greedy_joker = { + name = "貪心小丑", + text = { + "每打出一張", + "{C:diamonds}#2#{}花色的牌,", + "倍數{C:red}+#1#{}" + } + }, + j_lusty_joker = { + name = "好色小丑", + text = { + "每打出一張", + "{C:hearts}#2#{}花色的牌,", + "倍數{C:red}+#1#{}" + } + }, + j_wrathful_joker = { + name = "憤怒小丑", + text = { + "每打出一張", + "{C:spades}#2#{}花色的牌,", + "倍數{C:red}+#1#{}" + } + }, + j_gluttenous_joker = { + name = "貪吃小丑", + text = { + "每打出一張", + "{C:clubs}#2#{}花色的牌,", + "倍數{C:red}+#1#{}" + } + }, + j_ceremonial = { + name = "恐佈匕首", + text = { + "每次{C:attention}盲注{}選擇後,", + "摧毀右邊的小丑牌", + "並永久增加其賣出價", + "的{C:attention}兩倍{}至目前{C:red}倍數", + "{C:inactive}(目前為{C:mult}+#1#{C:inactive}倍)" + } + }, + j_banner = { + name = "旗幟", + text = { + "每一個剩餘的", + "{C:attention}棄牌{}次數可獲得", + "{C:chips}+#1#{}籌碼" + } + }, + j_mystic_summit = { + name = "神秘之峰", + text = { + "當剩下{C:attention}#2#{}次", + "棄牌數時,", + "倍數{C:mult}+#1#{}" + } + }, + j_marble = { + name = "大理石小丑", + text = { + "每次選完{C:attention}盲注{},", + "增加1張{C:attention}石頭牌{}", + "到牌組中" + } + }, + j_loyalty_card = { + name = "積分卡", + text = { + "每出牌{C:attention}#2#{}次", + "獲得一次倍數{X:red,C:white}X#1#{}", + "{C:inactive}#3#次" + } + }, + j_8_ball = { + name = "八號球", + text = { + "每打出{C:attenetion}#1#{}張", + "或更多張數字{C:attention}8{},", + "獲得一張{C:planet}行星牌{}", + "{C:inactive}(必須有空位)" + } + }, + j_misprint = { + name = "印錯小丑", + text = { + "" + } + }, + j_dusk = { + name = "夕陽卡", + text = { + "在{C:attention}最後{}", + "{C:attention}一次出牌{}時,", + "該手牌會被觸發兩次" + } + }, + j_raised_fist = { + name = "致勝之拳", + text = { + "將手牌中的{C:attention}最小{}牌的", + "點數{C:attention}翻倍{}", + "加到倍數中" + } + }, + j_chaos = { + name = "慌亂小丑", + text = { + "每回合在商店可", + "{C:green}免費{}重新洗牌{C:attention}#1#{}次" + } + }, + j_fibonacci = { + name = "黃金分割數", + text = { + "每次打出{C:attention}A{}、", + "{C:attention}2{}、{C:attention}3{}、{C:attention}5{}、或{C:attention}8{}時,", + "得分時{C:mult}+#1#{}倍數" + } + }, + j_steel_joker = { + name = "鋼鐵小丑", + text = { + "每次{C:attention}鋼鐵牌", + "你的牌組裡的", + "{C:chips}+#1#{}籌碼", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + } + }, + j_scary_face = { + name = "駭人的臉", + text = { + "打出{C:attention}花牌{}時,", + "得分時", + "給予{C:chips}+#1#{}" + } + }, + j_abstract = { + name = "抽象小丑", + text = { + "每張{C:attention}小丑牌{}", + "{C:mult}+#1#{}倍數", + "{C:inactive}(目前為{C:red}+#2#{C:inactive}倍)" + } + }, + j_delayed_grat = { + name = "最後獎賞", + text = { + "如果在本回合未使用棄牌,", + "每一個{C:attention}棄牌數{}", + "獲得{C:money}$#1#{}" + } + }, + j_hack = { + name = "爛脫口秀演員", + text = { + "重新觸發", + "所有打出的", + "{C:attention}2{}、{C:attention}3{}、{C:attention}4{}、或{C:attention}5{}" + } + }, + j_pareidolia = { + name = "迷幻錯覺", + text = { + "所有牌", + "一律會被視為", + "{C:attention}花牌{}" + } + }, + j_gros_michel = { + name = "大麥克香蕉", + text = { + "倍數{C:mult}+#1#{},", + "每回合結束時", + "有{C:green}#2#/#3#{}的機率", + "此牌會被銷毀" + } + }, + j_even_steven = { + name = "互不相欠", + text = { + "每打出一張計分的", + "{C:attention}偶數{}點的牌,", + "得分時,{C:mult}+#1#{}倍數", + "{C:inactive}(10、8、6、4、2)" + } + }, + j_odd_todd = { + name = "古怪托德", + text = { + "每打出一張計分的", + "{C:attention}奇數{}點的牌,", + "得分時,{C:chips}+#1#{}籌碼", + "{C:inactive}(A、9、7、5、3)" + } + }, + j_scholar = { + name = "學者小丑", + text = { + "每打出一張{C:attention}A{},", + "得分時,", + "{C:chips}+#2#{}籌碼、", + "{C:mult}+#1#{}倍數" + } + }, + j_business = { + name = "名片", + text = { + "打出的{C:attention}花牌{}有", + "{C:green}#1#/#2#{}的機率", + "在得分時獲得{C:money}$2{}" + } + }, + j_supernova = { + name = "超新星", + text = { + "將{C:attention}牌型{}的", + "出牌次數", + "增加到得分倍數" + } + }, + j_ride_the_bus = { + name = "公車卡", + text = { + "若連續打出", + "沒有{C:attention}花牌{}的", + "計分手牌,", + "每次倍數{C:mult}+#1#", + "{C:inactive}(目前為{C:mult}+#2#{C:inactive}倍)" + } + }, + j_space = { + name = "太空小丑", + text = { + "每次出牌", + "有{C:green}#1#/#2#{}的機率", + "升級{C:attention}牌型等級{}" + } + }, + j_egg = { + name = "蛋頭小丑", + text = { + "在回合結束時", + "本卡的{C:attention}出售價值", + "增加{C:money}$#1#" + } + }, + j_burglar = { + name = "竊賊小丑", + text = { + "選擇{C:attention}盲注{}後,", + "{C:blue}+#1#{}出牌次數並", + "{C:attention}失去所有棄牌次數" + } + }, + j_blackboard = { + name = "黑板小丑", + text = { + "如果手牌中未打出的牌", + "都是{C:spades}#2#{}或{C:clubs}#3#{},", + "倍數{X:red,C:white}X#1#{}" + } + }, + j_runner = { + name = "跑者小丑", + text = { + "每次打出{C:attention}順子{}", + "就會獲得", + "{C:chips}+#2#{}籌碼", + "{C:inactive}(目前{C:chips}+#1#{C:inactive}籌碼)" + } + }, + j_ice_cream = { + name = "冰淇淋", + text = { + "{C:chips}+#1#{}籌碼,", + "每次出牌", + "{C:chips}-#2#{}籌碼" + } + }, + j_dna = { + name = "DNA", + text = { + "如果一回合的{C:attention}第一次出牌{}", + "只有出{C:attention}1{}張牌", + "將永久複製{C:attention}那張牌{}到牌組", + "並放到{C:attention}手牌{}" + } + }, + j_splash = { + name = "水花噴濺", + text = { + "每張{C:attention}打出的牌", + "都會計分" + } + }, + j_blue_joker = { + name = "藍色小丑", + text = { + "每張在{C:attention}牌組{}剩下的牌", + "可{C:chips}+#1#{}籌碼", + "{C:inactive}(目前為{C:chips}+#2#{C:inactive}籌碼)" + } + }, + j_sixth_sense = { + name = "第六感", + text = { + "如果回合第一次出牌為", + "單張數字{C:attention}6{},將銷毀那張牌並且", + "產生一張隨機的{C:spectral}幻靈牌{}", + "{C:inactive}(必須有空位)" + } + }, + j_constellation = { + name = "星空小丑", + text = { + "每張已使用的{C:planet}行星牌{}", + "可獲得{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + } + }, + j_hiker = { + name = "登山小丑", + text = { + "每張打出的", + "{C:attention}計分牌{}可永久", + "獲得{C:chips}+#1#{}籌碼" + } + }, + j_faceless = { + name = "無臉小丑", + text = { + "如果同時捨棄", + "{C:attention}#2#{}張或更多張", + "{C:attention}花牌{}", + "獲得{C:money}$#1#{}" + } + }, + j_green_joker = { + name = "綠色小丑", + text = { + "每次出牌,{C:mult}+#1#{}倍數", + "每次棄牌,{C:mult}-#2#{}倍數", + "{C:inactive}(目前為{C:mult}+#3#{C:inactive}倍)" + } + }, + j_superposition = { + name = "完美位置", + text = { + "如果計分手牌包含", + "一張{C:attention}A{}及{C:attention}順子{}", + "即產生一張{C:tarot}塔羅牌{}", + "{C:inactive}(必須有空位)" + } + }, + j_todo_list = { + name = "待辦事項", + text = { + "如果{C:attention}出牌牌型{}為{C:attention}#2#{},", + "獲得{C:money}$#1#{}", + "每次支付時", + "牌型都會改變" + } + }, + j_ticket = { + name = "黃金門票", + text = { + "若打出{C:money}黃金牌{},", + "得分時,{C:money}$#1#{}" + }, + unlock = { + "打出5張手牌,", + "其中只包含 ", + "{C:attention,E:1}黃金牌{}" + } + }, + j_mr_bones = { + name = "骷髏頭", + text = { + "若得分時,獲得", + "所需籌碼的", + "{C:attention}25%{}或以上,", + "可避免死亡", + "{S:1.1,C:red,E:2}自我毀滅{}" + }, + unlock = { + "輸掉{C:attention,E:1}#1#{}場比賽", + "{C:inactive}(#2#)" + } + }, + j_acrobat = { + name = "雜技演員", + text = { + "每回合{C:attention}最後一次{C:attention}出牌{}", + "可得到{X:red,C:white}X#1#{}倍數" + }, + unlock = { + "打{C:attention,E:1}#1#{}手牌", + "{C:inactive}(#2#)" + } + }, + j_sock_and_buskin = { + name = "花牌小丑", + text = { + "重新觸發全部", + "打出的{C:attention}花牌{}" + }, + unlock = { + "總共打出", + "{C:attention,E:1}#1#{}張花牌", + "{C:inactive}(#2#)" + } + }, + j_swashbuckler = { + name = "盜賊小丑", + text = { + "將這張卡左邊所有", + "{C:attention}小丑牌{}的總售價", + "增加至倍數", + "{C:inactive}(目前為{C:mult}+#1#{C:inactive}倍)" + }, + unlock = { + "賣出總共", + "{C:attention,E:1}#1#{}張小丑牌", + "{C:inactive}(#2#)張" + } + }, + j_troubadour = { + name = "吟遊詩人", + text = { + "手牌大小{C:attention}+#1#{},", + "每回合出牌次數{C:red}-#2#{}次" + }, + unlock = { + "透過只打出", + "一次手牌", + "連勝{C:attention,E:1}#1#{}回合" + } + }, + j_certificate = { + name = "證書", + text = { + "每回合開始時", + "隨機增加一張", + "帶有隨機{C:attention}封蠟章{}的", + "牌到手牌中" + }, + unlock = { + "擁有一張", + "帶有{C:attention,E:1}金色封蠟章", + "的黃金牌" + } + }, + j_smeared = { + name = "歪臉小丑", + text = { + "{C:hearts}紅心{}和{C:diamonds}方塊", + "視為相同花色,", + "{C:spades}黑桃{}和{C:clubs}梅花", + "視為相同花色" + }, + unlock = { + "手上的牌至少要有{C:attention}#1#", + "{E:1,C:attention}#2#{}", + "出現" + } + }, + j_throwback = { + name = "復古小丑", + text = { + "此比賽中每跳過一次", + "{C:attention}盲注{},{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + }, + unlock = { + "從主選單", + "繼續玩已儲存的比賽" + } + }, + j_hanging_chad = { + name = "懸孔票", + text = { + "重新觸發{C:attention}第一張{}打出的", + "記入計分的牌" + }, + unlock = { + "贏得Boss盲注", + "使用的是{E:1,C:attention}#1#" + } + }, + j_rough_gem = { + name = "原礦", + text = { + "只要每次打出", + "{C:diamonds}方塊{}花色牌,", + "得分時{C:money}$#1#{}" + }, + unlock = { + "手上的牌至少要有{E:1,C:attention}#1#", + "{E:1,C:attention}#2#", + "花色" + } + }, + j_bloodstone = { + name = "血石", + text = { + "每次打出的", + "{C:hearts}紅心{}花色牌", + "有{C:green}#1#/#2#{}的機率", + "獲得{X:mult,C:white}X#3#{}倍數" + }, + unlock = { + "手上的牌至少要有{E:1,C:attention}#1#", + "{E:1,C:attention}#2#", + "花色" + } + }, + j_arrowhead = { + name = "石箭頭", + text = { + "只要每次打出", + "{C:spades}黑桃{}花色牌,", + "得分時{C:chips}+#1#{}籌碼" + }, + unlock = { + "牌組中至少要有", + "{E:1,C:attention}#1#張{E:1,C:attention}#2#", + "花色的牌" + } + }, + j_onyx_agate = { + name = "黑瑪瑙", + text = { + "只要每次打出", + "{C:clubs}梅花{}花色牌,", + "得分時,{C:mult}+#1#{}倍數" + }, + unlock = { + "在你的牌組中", + "至少要有{E:1,C:attention}#1#張", + "{E:1,C:attention}#2#花色的牌" + } + }, + j_glass = { + name = "玻璃小丑", + text = { + "每摧毀一張", + "{C:attention}玻璃牌{},", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + }, + unlock = { + "牌組中至少要有", + "{E:1,C:attention}#1#張{E:1,C:attention}#2#", + "花色的牌" + } + }, + j_ring_master = { + name = "馬戲王小丑", + text = { + "{C:attention}小丑牌{}、{C:tarot}塔羅牌{}、{C:planet}行星牌{}和", + "{C:spectral}幻靈牌{}會在商店出現", + "多次" + }, + unlock = { + "達到底注", + "級別{E:1,C:attention}#1#" + } + }, + j_flower_pot = { + name = "盆栽", + text = { + "如果出牌中有計分的牌", + "包含{C:diamonds}方塊{}、{C:clubs}梅花{}、", + "{C:hearts}紅心{}及{C:spades}黑桃{},", + "{X:mult,C:white}X#1#{}倍數" + }, + unlock = { + "達到底注", + "級別{E:1,C:attention}#1#" + } + }, + j_blueprint = { + name = "藍圖小丑", + text = { + "複製", + "右邊{C:attention}小丑牌{}的能力" + }, + unlock = { + "贏得比賽" + } + }, + j_wee = { + name = "小小丑", + text = { + "每打出一張數字{C:attention}2{}並得分時", + "這張小丑牌", + "永久獲得{C:chips}+#2#{}籌碼", + "{C:inactive}(目前為{C:chips}+#1#{C:inactive}籌碼)" + }, + unlock = { + "在{E:1,C:attention}#1#回合或", + "或更少的回合數下勝出" + } + }, + j_merry_andy = { + name = "快樂小丑", + text = { + "{C:red}+#1#{}棄牌次數", + "{C:red}#2#{}手牌大小" + }, + unlock = { + "在{E:1,C:attention}#1#回合或", + "或更少的回合數下勝出" + } + }, + j_oops = { + name = "六六大順", + text = { + "所有{C:attention}機率牌{}的", + "{C:green,E:1,S:1.1}機率加倍", + "{C:inactive}(例:{C:green}1/3{C:inactive} -> {C:green}2/3{C:inactive})" + }, + unlock = { + "在一手牌中", + "得到最少", + "{E:1,C:attention}#1#{}籌碼" + } + }, + j_idol = { + name = "偶像小丑", + text = { + "打出每張{V:1}#3#{}花色的", + "{C:attention}#2#{}在得分時", + "{X:mult,C:white}X#1#{}倍數", + "{s:0.8}每個回合牌都會變" + }, + unlock = { + "在一手牌中", + "得到最少", + "{E:1,C:attention}#1#{}籌碼" + } + }, + j_seeing_double = { + name = "幻視", + text = { + "如果出牌中有計分的牌", + "包含{C:clubs}梅花{}和", + "其他任意{C:attention}花色{},", + "{X:mult,C:white}X#1#{}倍數" + }, + unlock = { + "打一手", + "要包含", + "{E:1,C:attention}#1#的牌" + } + }, + j_matador = { + name = "鬥牛小丑", + text = { + "如果打出的牌觸發", + "{C:attention}Boss盲注{}的限制條件,", + "獲得{C:money}$#1#{}" + }, + unlock = { + "在{E:1,C:attention}一手之内{}且没有", + "且不使用棄牌次數", + "戰勝Boss盲注" + } + }, + j_hit_the_road = { + name = "一路暢通", + text = { + "每捨棄一張", + "{C:attention}J{},本回合", + "獲得{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + }, + unlock = { + "同時將{E:1,C:attention}5張", + "{E:1,C:attention}J{}", + "全部棄掉" + } + }, + j_duo = { + name = "二重奏", + text = { + "如果打出的牌", + "包含{C:attention}#2#{},", + "{X:mult,C:white}X#1#{}倍數" + }, + unlock = { + "贏得比賽", + "且沒有打出", + "{E:1,C:attention}#1#" + } + }, + j_trio = { + name = "三重奏", + text = { + "如果打出的牌", + "包含{C:attention}#2#{},", + "{X:mult,C:white}X#1#{}倍數" + }, + unlock = { + "贏得比賽", + "且沒有打出", + "{E:1,C:attention}#1#" + } + }, + j_family = { + name = "鐵支", + text = { + "如果打出的牌", + "包含{C:attention}#2#{},", + "{X:mult,C:white}X#1#{}倍數" + }, + unlock = { + "贏得比賽", + "且沒有打出", + "{E:1,C:attention}#1#" + } + }, + j_order = { + name = "順子", + text = { + "如果打出的牌", + "包含{C:attention}#2#{},", + "{X:mult,C:white}X#1#{}倍數" + }, + unlock = { + "贏得比賽", + "且沒有打出", + "{E:1,C:attention}#1#" + } + }, + j_tribe = { + name = "同花", + text = { + "如果打出的牌", + "包含{C:attention}#2#{},", + "{X:mult,C:white}X#1#{}倍數" + }, + unlock = { + "贏得比賽", + "且沒有打出", + "{E:1,C:attention}#1#" + } + }, + j_cavendish = { + name = "華蕉", + text = { + "倍數{X:mult,C:white}X#1#{},", + "每回合結束時", + "有{C:green}#2#/#3#{}的機率", + "此牌會被摧毀" + } + }, + j_card_sharp = { + name = "老千小丑", + text = { + "當這一{C:attention}牌型{}", + "已經在這回合出過時,", + "倍數{X:mult,C:white}X#1#{}" + } + }, + j_red_card = { + name = "紅牌", + text = { + "當跳過任一{C:attention}擴充包{}時", + "獲得{C:red}+#1#{}倍數", + "{C:inactive}(目前為{C:red}+#2#{C:inactive}倍)" + } + }, + j_madness = { + name = "瘋狂小丑", + text = { + "在{C:attention}盲注{}選擇後,", + "獲得{X:mult,C:white}X#1#{}倍數並", + "{C:attention}摧毀{}隨機一張小丑牌", + "{C:inactive}(目前為{X:mult,C:white}X#2#{}倍)" + } + }, + j_square = { + name = "方塊小丑", + text = { + "每打出{C:attention}4{}張牌", + "則可獲得", + "{C:chips}+#1#{}籌碼", + "{C:inactive}(目前{C:chips}#1#{}籌碼)" + } + }, + j_seance = { + name = "亡靈之約", + text = { + "如果{C:attention}手牌{}為{C:attention}#1#{}", + "即產生一張", + "隨機的{C:spectral}幻靈牌{}", + "{C:inactive}(必須有空位)" + } + }, + j_riff_raff = { + name = "即興演出", + text = { + "每當選擇{C:attention}盲注{}時", + "其會產生{C:attention}#1#張{C:blue}一般{C:attention}小丑牌", + "{C:inactive}(必須有空位)" + } + }, + j_stuntman = { + name = "特技演員", + text = { + "{C:chips}+#1#{}籌碼", + "{C:attention}-#2#{}手牌大小" + }, + unlock = { + "在一手牌中", + "至少獲得", + "{E:1,C:attention}#1#{}籌碼" + } + }, + j_invisible = { + name = "隱形小丑", + text = { + "在{C:attention}#1#{}回合後,", + "賣出這張牌卡以", + "{C:attention}複製{}隨機一張小丑牌", + "{C:inactive}(目前為{C:attention}#2#{C:inactive}/#1#)" + }, + unlock = { + "拿到不超過{E:1,C:attention}4張小丑牌{}", + "的情況", + "贏得比賽" + } + }, + j_brainstorm = { + name = "腦力激盪", + text = { + "複製", + "最左邊{C:attention}小丑牌的能力" + }, + unlock = { + "丟棄", + "{E:1,C:attention}皇家同花順" + } + }, + j_satellite = { + name = "衛星", + text = { + "本赛局每使用一張", + "{C:planet}行星牌{},每回合結束時", + "可得到{C:money}$#1#{}", + "{C:inactive}(目前為{C:money}$#2#{C:inactive})" + }, + unlock = { + "得到{E:1,C:money}$#1#", + "或更多" + } + }, + j_shoot_the_moon = { + name = "射月亮", + text = { + "手上每張持有的", + "{C:attention}黑桃Q", + "{C:mult}+#1#{}倍數" + }, + unlock = { + "在一個回合中", + "打出牌組中", + "所有{E:1,C:attention}紅心" + } + }, + j_drivers_license = { + name = "駕照", + text = { + "如果手上的牌至少有{C:attention}16", + "張加強牌", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{C:attention}#2#{C:inactive})" + }, + unlock = { + "在你的牌組中", + "加強{E:1,C:attention}#1#{}張牌" + } + }, + j_cartomancer = { + name = "卜卦小丑", + text = { + "在選了{C:attention}盲注{}後", + "產生一張{C:tarot}塔羅牌{}", + "{C:inactive}(必須有空位)" + }, + unlock = { + "發現每張", + "{E:1,C:attention}#1#{C:tarot}塔羅牌{}" + } + }, + j_astronomer = { + name = "天文學家", + text = { + "商店裡的{C:planet}行星牌{}", + "以及{C:planet}天外禮包{}", + "全部{C:attention}免費" + }, + unlock = { + "發現每張", + "{E:1,C:planet}行星牌{}" + } + }, + j_burnt = { + name = "累爆小丑", + text = { + "升級", + "每回合中", + "第一次{C:attention}棄牌的牌型" + }, + unlock = { + "共賣出", + "{E:1,C:attention}#1#{}牌", + "{C:inactive}(#2#)" + } + }, + j_bootstraps = { + name = "拔靴帶", + text = { + "每擁有{C:money}$#2#{},", + "{C:mult}+#1#{}倍數" + }, + unlock = { + "手上的牌至少要有{E:1,C:attention}#1#", + "{C:dark_edition}彩色{}小丑" + } + }, + j_caino = { + name = "白臉小丑", + text = { + "每張{C:attention}花牌{}被摧毀時", + "永久獲得", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_triboulet = { + name = "弄臣小丑", + text = { + "打出的{C:attention}K{}和{C:attention}Q", + "各自獲得", + "{X:mult,C:white}X#1#{}倍數" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_yorick = { + name = "約里克", + text = { + "使用{C:attention}#2#{}次棄牌後", + "獲得{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(剩下棄牌數:{C:attention}#3#{C:inactive})" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_chicot = { + name = "奇科特", + text = { + "每個{C:attention}Boss盲注", + "限制條件消失" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_perkeo = { + name = "佩爾基", + text = { + "在結束商店後", + "隨機複製{C:attention}1{}張", + "擁有的{C:attention}消耗牌{}", + "並給那張牌{C:dark_edition}負片{}效果" + }, + unlock = { + "{E:1,s:1.3}?????" + } + }, + j_sly = { + name = "狡詐小丑", + text = { + "如果打出的牌包含", + "{C:attention}#2#,", + "{C:chips}+#1#{}籌碼" + } + }, + j_wily = { + name = "狡猾小丑", + text = { + "如果打出的牌包含", + "{C:attention}#2#,", + "{C:chips}+#1#{}籌碼" + } + }, + j_clever = { + name = "機靈小丑", + text = { + "如果打出的牌包含", + "{C:attention}#2#,", + "{C:chips}+#1#{}籌碼" + } + }, + j_devious = { + name = "心機小丑", + text = { + "如果打出的牌包含", + "{C:attention}#2#,", + "{C:chips}+#1#{}籌碼" + } + }, + j_crafty = { + name = "鬼靈精小丑", + text = { + "如果打出的牌包含", + "{C:attention}#2#,", + "{C:chips}+#1#{}籌碼" + } + }, + j_vampire = { + name = "吸血鬼小丑", + text = { + "每次打出{C:attention}加強牌{},", + "移除牌卡{C:attention}加強效果", + "並獲得{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + } + }, + j_shortcut = { + name = "捷徑", + text = { + "允許{C:attention}順子{}能以", + "相差1點的牌{C:attention}組成", + "{C:inactive}(例如:{C:attention}2 3 5 7 8{C:inactive})" + } + }, + j_hologram = { + name = "全像", + text = { + "每次新增{C:attention}牌卡{}", + "至牌組時,", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + } + }, + j_vagabond = { + name = "流浪者", + text = { + "若在出牌時當下", + "擁有{C:money}$#1#{}或更少的金錢", + "產生一張{C:purple}塔羅牌{}" + } + }, + j_baron = { + name = "男爵", + text = { + "手牌中,每", + "持有一張{C:attention}K{},", + "給予{X:mult,C:white}X#1#{}倍數" + } + }, + j_cloud_9 = { + name = "9霄雲外", + text = { + "每張牌組內的數字{C:attention}9{}", + "在每回合結束時", + "獲得{C:money}$#1#{}", + "{C:inactive}(目前{C:money}$#2#{}{C:inactive})" + } + }, + j_rocket = { + name = "火箭", + text = { + "每回合結束時獲得{C:money}$#1#{}。", + "每次打敗{C:attention}Boss盲注{}時", + "獲得{C:money}$#2#" + } + }, + j_obelisk = { + name = "方尖碑", + text = { + "每次連續打出的牌", + "若非最常打出的", + "{C:attention}牌型{},就給予", + "{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + } + }, + j_midas_mask = { + name = "邁達斯面具", + text = { + "出牌時,", + "將所有打出的{C:attention}花牌{}", + "變成{C:attention}黃金牌{}" + } + }, + j_luchador = { + name = "鬥士", + text = { + "賣出這張牌卡以", + "消除目前的", + "{C:attention}Boss盲注{}限制功能" + } + }, + j_photograph = { + name = "攝影", + text = { + "出牌時", + "第一張記分的{C:attention}花牌{}", + "獲得{X:mult,C:white}X#1#{}倍數" + } + }, + j_gift = { + name = "禮物卡", + text = { + "在每回合結束時", + "每張擁有的{C:attention}小丑牌{}", + "及{C:attention}消耗卡{}", + "{C:attention}售價{}加{C:money}$#1#{}" + } + }, + j_turtle_bean = { + name = "烏龜豆", + text = { + "手牌大小{C:attention}+#1#{}", + "每一回合", + "減少{C:red}#2#{}" + } + }, + j_erosion = { + name = "侵蝕", + text = { + "在你的牌組中", + "每張低於{C:attention}#3#{}張的牌卡", + "均可獲得{C:red}+#1#{}倍數", + "{C:inactive}(目前為{C:red}+#2#{C:inactive}倍)" + } + }, + j_reserved_parking = { + name = "私人車位", + text = { + "手牌中", + "每張持有的{C:attention}花牌{}", + "有{C:green}#2#/#3#{}的機率", + "給予{C:money}$#1#{}" + } + }, + j_mail = { + name = "郵件", + text = { + "每棄牌一張{C:attention}#2#{}", + "獲得{C:money}$#1#{},", + "每回合數字都會變更" + } + }, + j_to_the_moon = { + name = "登月", + text = { + "每回合結束時,", + "每擁有{C:money}$5{},", + "皆可獲得額外{C:money}$#1#{}利息" + } + }, + j_hallucination = { + name = "產生幻覺", + text = { + "當開啟任一{C:attention}擴充包{}時,", + "有{C:green}#1#/#2#{}的機會", + "產生一張{C:tarot}塔羅牌{}", + "{C:inactive}(必須有空位)" + } + }, + j_lucky_cat = { + name = "幸運貓", + text = { + "每次{C:green}成功{}觸發", + "{C:attention}幸運牌{}時", + "獲得{X:mult,C:white}X#1#{}倍數", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + } + }, + j_baseball = { + name = "棒球牌", + text = { + "每張擁有的{C:green}罕見{}小丑牌", + "給予{X:mult,C:white}X#1#{}倍數" + } + }, + j_bull = { + name = "鬥牛", + text = { + "每擁有{C:money}$1{}", + "{C:chips}+#1#{}籌碼", + "{C:inactive}(目前為{C:chips}+#2#{C:inactive}籌碼)" + } + }, + j_diet_cola = { + name = "低卡可樂", + text = { + "賣出這張牌卡以", + "建立一個免費", + "{C:attention}#1#" + } + }, + j_trading = { + name = "交換卡", + text = { + "每回合的{C:attention}第一次棄牌{}", + "如果只有棄{C:attention}1{}張牌", + "摧毀那張牌並獲得{C:money}$#1#" + } + }, + j_flash = { + name = "閃卡", + text = { + "在商店內每{C:attention}重摋{}一次", + "獲得{C:mult}+#1#{}倍數", + "{C:inactive}(目前為{C:mult}+#2#{C:inactive}倍)" + } + }, + j_popcorn = { + name = "爆米花", + text = { + "{C:mult}+#1#{}倍數,", + "每結束一回合", + "{C:mult}-#2#{}倍數" + } + }, + j_trousers = { + name = "備用長褲", + text = { + "如果出牌的牌型包含", + "{C:attention}#2#,", + "獲得{C:mult}+#1#{}倍數", + "{C:inactive}(目前為{C:red}+#3#{C:inactive}倍)" + } + }, + j_ancient = { + name = "古代小丑", + text = { + "每次打出", + "{V:1}#2#{}花色的牌,", + "得分時獲得{X:mult,C:white}X#1#{}倍數", + "{s:0.8}花色於每回合結束時變更" + } + }, + j_ramen = { + name = "拉麵", + text = { + "擁有{X:mult,C:white}X#1#{}倍數", + "每{C:attention}丟棄一張牌{},", + "失去{X:mult,C:white}X#2#{}倍數" + } + }, + j_walkie_talkie = { + name = "對講機", + text = { + "每打出數字{C:attention}10{}或{C:attention}4,", + "得分時給予{C:chips}+#1#{}籌碼及", + "{C:mult}+#2#{}倍數" + } + }, + j_selzer = { + name = "氣泡水", + text = { + "未來{C:attention}#1#{}次出牌", + "重新觸發所有", + "打出的牌" + } + }, + j_castle = { + name = "城堡", + text = { + "每次丟棄{V:1}#2#{}花色牌,", + "此小丑牌獲得{C:chips}+#1#{}籌碼", + "每回合花色都會變更", + "{C:inactive}(目前為{C:chips}+#3#{C:inactive}籌碼)" + } + }, + j_smiley = { + name = "笑臉", + text = { + "打出{C:attention}花牌{}", + "得分時", + "給予{C:mult}+#1#{}倍數" + } + }, + j_campfire = { + name = "營火", + text = { + "每{C:attention}賣出{}一張牌卡", + "此小丑獲得{X:mult,C:white}X#1#{}倍數,", + "每戰勝{C:attention}Boss盲注{}時重置", + "{C:inactive}(目前為{X:mult,C:white}X#2#{C:inactive}倍)" + } + } + }, + Voucher = { + v_overstock_norm = { + name = "存貨過多", + text = { + "店內牌卡欄位", + "{C:attention}+1{}" + } + }, + v_clearance_sale = { + name = "清倉拍賣", + text = { + "店內的所有牌卡和套組", + "費用減{C:attention}#1#%{}" + } + }, + v_tarot_merchant = { + name = "塔羅牌商家", + text = { + "在商店出現{C:tarot}塔羅牌{}", + "的頻率增加", + "{C:attention}#1#X{}倍" + } + }, + v_planet_merchant = { + name = "行星牌商家", + text = { + "在商店出現{C:planet}行星牌{}", + "的頻率增加", + "{C:attention}#1#X{}倍" + } + }, + v_hone = { + name = "磨刀石", + text = { + "{C:dark_edition}銀箔{}、{C:dark_edition}全像攝影{}和", + "{C:dark_edition}彩色{}牌卡", + "出現頻率{C:attention}X#1#倍" + } + }, + v_reroll_surplus = { + name = "多次重摋", + text = { + "重摋費用", + "減少{C:money}$#1#{}" + } + }, + v_crystal_ball = { + name = "水晶球", + text = { + "{C:attention}+1{}消耗牌欄位" + } + }, + v_telescope = { + name = "望遠鏡", + text = { + "{C:attention}天外禮包{}裡面", + "總是會有", + "你最常使用{C:attention}牌型{}", + "的{C:planet}行星牌{}" + } + }, + v_grabber = { + name = "搶奪者", + text = { + "每回合", + "永久增加", + "{C:blue}+#1#{}次出牌" + } + }, + v_wasteful = { + name = "浪費", + text = { + "每回合", + "永久增加", + "{C:red}+#1#{}次棄牌" + } + }, + v_seed_money = { + name = "種子資金", + text = { + "提高每回合", + "利息收入的", + "上限至{C:money}$#1#{}" + } + }, + v_blank = { + name = "空白", + text = { + "{C:inactive}有作用嗎?" + } + }, + v_magic_trick = { + name = "魔術", + text = { + "{C:attention}商店{}裡面", + "有{C:attention}遊戲牌{}", + "可供選購" + } + }, + v_hieroglyph = { + name = "象形文字", + text = { + "{C:attention}-#1#{}底注", + "每回合", + "{C:blue}-#1#{}出牌次數", + "每回合" + } + }, + v_directors_cut = { + name = "導演佳作", + text = { + "重摋Boss盲注", + "每個底注重摋{C:attention}1{}次,", + "每次{C:money}$#1#{}" + } + }, + v_pattern = { + name = "圖案", + text = { + "召喚出您最常", + "使用的{C:attention}消耗牌{}", + "{E:1,V:1}#1#", + "{C:inactive}(必須有空位)" + } + }, + v_overstock_plus = { + name = "存貨過多增強版", + text = { + "店內牌卡欄位", + "{C:attention}+1{}" + }, + unlock = { + "在店內花費總計", + "{C:money}$#1#{}", + "{C:inactive}($#2#)" + } + }, + v_liquidation = { + name = "清算", + text = { + "店內的所有牌卡和套組", + "皆享{C:attention}#1#%{}折扣優惠" + }, + unlock = { + "在一場賽局中", + "至少兌換", + "{C:attention}#1#{C:voucher}張禮券{}" + } + }, + v_tarot_tycoon = { + name = "塔羅大亨", + text = { + "在商店出現{C:tarot}塔羅牌{}", + "的頻率增加", + "{C:attention}#1#X{}倍" + }, + unlock = { + "在商店", + "購買總共", + "{C:attention}#1#張{C:tarot}塔羅牌{}", + "{C:inactive}(#2#)" + } + }, + v_planet_tycoon = { + name = "行星大亨", + text = { + "在商店出現{C:planet}行星牌{}", + "的頻率增加", + "{C:attention}#1#X{}倍" + }, + unlock = { + "在商店", + "購買總共", + "{C:attention}#1#{}張{C:planet}行星牌{}", + "{C:inactive}(#2#)" + } + }, + v_glow_up = { + name = "閃亮亮", + text = { + "{C:dark_edition}銀箔{}、{C:dark_edition}全像攝影{}和", + "{C:dark_edition}彩色{}牌卡", + "出現頻率{C:attention}X#1#倍" + }, + unlock = { + "手上的牌至少要有{C:attention}#1#張", + "{C:attention}小丑牌{}有", + "{C:dark_edition}銀箔{}、{C:dark_edition}全像攝影{}或", + "{C:dark_edition}彩色{}版本" + } + }, + v_reroll_glut = { + name = "重摋加強版", + text = { + "重摋費用", + "減少{C:money}$#1#{}" + }, + unlock = { + "商店重摋", + "總計{C:attention}#1#{}次", + "{C:inactive}(#2#)" + } + }, + v_omen_globe = { + name = "預兆地球儀", + text = { + "{C:spectral}幻靈牌{}", + "可能出現在任何", + "{C:attention}奧秘禮包中" + }, + unlock = { + "從任一{C:tarot}奧秘禮包中", + "使用總計{C:attention}#1#張", + "{C:tarot}塔羅牌{}", + "{C:inactive}(#2#)" + } + }, + v_observatory = { + name = "天文台", + text = { + "在您{C:attention}消耗牌欄位{}中", + "的{C:planet}行星牌{}", + "為該特定{C:attention}手牌類型", + "給予{X:red,C:white}X#1#{}倍數" + }, + unlock = { + "從任一{C:planet}天外禮包中", + "使用總計{C:attention}#1#張", + "{C:planet}行星牌{}", + "{C:inactive}(#2#)" + } + }, + v_nacho_tong = { + name = "唐納喬", + text = { + "每回合", + "永久獲得", + "{C:blue}+#1#{}次出牌" + }, + unlock = { + "打出總共", + "{C:attention}#1#{}張牌", + "{C:inactive}(#2#)" + } + }, + v_recyclomancy = { + name = "回收魔法", + text = { + "每回合", + "永久獲得", + "{C:red}+#1#{}次棄牌" + }, + unlock = { + "棄牌總數達到", + "{C:attention}#1#{}張牌", + "{C:inactive}(#2#)" + } + }, + v_money_tree = { + name = "金錢樹", + text = { + "提高每回合", + "利息收入的", + "上限至{C:money}$#1#{}" + }, + unlock = { + "連續{C:attention}#1#{}回合", + "將回合收益", + "利息提升到最高", + "{C:inactive}(#2#)" + } + }, + v_antimatter = { + name = "反物質", + text = { + "{C:dark_edition}+1{}小丑牌欄位" + }, + unlock = { + "兌換{C:voucher}空白{}禮券", + "總計{C:attention}#1#{}次", + "{C:inactive}(#2#)" + } + }, + v_illusion = { + name = "幻想", + text = { + "在商店內的{C:attention}遊戲牌{}", + "可能是{C:enhanced}加強牌{}、{C:dark_edition}不同版本{}", + "或/及蓋有{C:attention}封蠟章{}" + }, + unlock = { + "在商店", + "購買總共", + "{C:attention}#1#{}張遊戲牌", + "{C:inactive}(#2#)" + } + }, + v_petroglyph = { + name = "岩石雕刻", + unlock = { + "達到底注", + "級別{E:1,C:attention}#1#" + }, + text = { + "{C:attention}-#1#{}底注", + "每回合", + "{C:red}-#1#{}棄牌次數" + } + }, + v_retcon = { + name = "修訂佳作", + text = { + "重開Boss盲注", + "{C:attention}無限次{}", + "每次花費{C:money}$#1#{}" + }, + unlock = { + "發現", + "{C:attention}#1#{}盲注" + } + }, + v_tesselation = { + name = "棋盤佈置", + text = { + "產生您最常", + "使用的{C:attention}小丑牌{}", + "{E:1,V:1}#1#", + "{C:inactive}(必須有空位)" + }, + unlock = { + "在商店購買", + "你最常使用的{C:attention}小丑牌", + "並且是", + "{C:dark_edition}彩色版本" + } + }, + v_palette = { + name = "調色板", + text = { + "手上持有{C:attention}+#1#{}", + "牌", + "{C:attention}+#1#{}手牌大小" + }, + unlock = { + "縮減手牌大小", + "至{C:attention}#1#{}牌" + } + }, + v_paint_brush = { + name = "油漆刷", + text = { + "{C:attention}+#1#{}手牌大小" + } + } + }, + Tarot = { + c_fool = { + name = "愚者", + text = { + "產生本賽局中", + "上一張使用的", + "{C:tarot}塔羅牌{}或{C:planet}行星牌{}", + "{s:0.8,C:tarot}愚者牌{s:0.8}除外" + } + }, + c_magician = { + name = "魔術師", + text = { + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#" + } + }, + c_high_priestess = { + name = "女祭司", + text = { + "產生最多{C:attention}#1#張", + "隨機{C:planet}行星牌{}", + "{C:inactive}(必須有空位)" + } + }, + c_empress = { + name = "皇后", + text = { + "加強{C:attention}#1#{}張", + "所選的牌卡至", + "{C:attention}#2#" + } + }, + c_emperor = { + name = "皇帝", + text = { + "產生最多{C:attention}#1#張", + "任意{C:tarot}塔羅牌{}", + "{C:inactive}(必須有空位)" + } + }, + c_heirophant = { + name = "教皇", + text = { + "加強{C:attention}#1#{}張", + "所選的牌卡成為", + "{C:attention}#2#" + } + }, + c_lovers = { + name = "戀人", + text = { + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#" + } + }, + c_chariot = { + name = "戰車", + text = { + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#" + } + }, + c_justice = { + name = "正義", + text = { + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#" + } + }, + c_hermit = { + name = "隱士", + text = { + "金錢加倍", + "{C:inactive}(最高{C:money}$#1#{C:inactive})" + } + }, + c_wheel_of_fortune = { + name = "幸運之輪", + text = { + "{C:green}#1#/#2#{}的機率會增加", + "{C:dark_edition}銀箔{}、{C:dark_edition}全像攝影{}和", + "{C:dark_edition}彩色{}版本", + "至隨機一張{C:attention}小丑牌" + } + }, + c_strength = { + name = "力量", + text = { + "將最多{C:attention}#1#{}張", + "選定的牌卡", + "點數提高{C:attention}1" + } + }, + c_hanged_man = { + name = "吊人", + text = { + "最多可摧毀", + "{C:attention}#1#{}張選定的牌" + } + }, + c_death = { + name = "死神", + text = { + "選擇{C:attention}#1#{}張牌卡,", + "將{C:attention}左邊{}的牌卡", + "轉換至{C:attention}右邊{}的牌卡", + "{C:inactive}(拉動即可重新排列)" + } + }, + c_temperance = { + name = "節制", + text = { + "給出目前手上", + "所有小丑牌卡", + "的總賣價{C:inactive}(最高{C:money}$#1#{C:inactive})", + "{C:inactive}(目前為{C:money}$#2#{C:inactive})" + } + }, + c_devil = { + name = "惡魔", + text = { + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#" + } + }, + c_tower = { + name = "高塔", + text = { + "加強{C:attention}#1#{}張", + "所選的牌成為", + "{C:attention}#2#" + } + }, + c_star = { + name = "星星", + text = { + "最多可轉換", + "{C:attention}#1#{}張選定的牌", + "至{V:1}#2#{}" + } + }, + c_moon = { + name = "月亮", + text = { + "最多可轉換", + "{C:attention}#1#{}張選定的牌", + "至{V:1}#2#{}" + } + }, + c_sun = { + name = "太陽", + text = { + "最多可轉換", + "{C:attention}#1#{}張選定的牌", + "至{V:1}#2#{}" + } + }, + c_judgement = { + name = "審判", + text = { + "產生一張隨機的", + "{C:attention}小丑牌{}", + "{C:inactive}(必須有空位)" + } + }, + c_world = { + name = "世界", + text = { + "最多可轉換", + "{C:attention}#1#{}張選定的牌", + "至{V:1}#2#{}" + } + } + }, + Planet = { + c_mercury = { + name = "水星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_venus = { + name = "金星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_earth = { + name = "地球", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_mars = { + name = "火星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_jupiter = { + name = "木星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_saturn = { + name = "土星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_uranus = { + name = "天王星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_neptune = { + name = "海王星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_pluto = { + name = "冥王星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_ceres = { + name = "穀神星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_planet_x = { + name = "X行星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + }, + c_eris = { + name = "鬩神星", + text = { + "{S:0.8}({S:0.8,V:1}目前等級#1#{S:0.8}){}升級", + "{C:attention}#2#", + "{C:mult}+#3#{}倍數和", + "{C:chips}+#4#{}籌碼" + } + } + }, + Spectral = { + c_familiar = { + name = "熟悉", + text = { + "摧毀隨機{C:attention}1{}張手牌,", + "再新增{C:attention}#1#{}張", + "隨機{C:attention}加強花牌{}", + "到手牌中" + } + }, + c_grim = { + name = "無情", + text = { + "摧毀手上隨機{C:attention}1{}張牌", + "再新增{C:attention}#1#{}張", + "{C:attention}加強版A{}", + "到手牌中" + } + }, + c_incantation = { + name = "咒語", + text = { + "摧毀手上隨機{C:attention}1{}張牌", + "再新增{C:attention}#1#{}張", + "{C:attention}加強版數字牌{}", + "到手牌中" + } + }, + c_talisman = { + name = "護身符", + text = { + "新增{C:attention}金色封蠟章{}", + "到選擇的{C:attention}1{}張", + "手牌中" + } + }, + c_aura = { + name = "光環", + text = { + "新增{C:dark_edition}銀箔{}、{C:dark_edition}全像攝影{},", + "或{C:dark_edition}彩色{}效果到", + "{C:attention}1{}張選定的手牌中" + } + }, + c_wraith = { + name = "幻影", + text = { + "產生一張隨機的", + "{C:red}稀有{C:attention}小丑牌{},", + "設定金額至{C:money}$0" + } + }, + c_sigil = { + name = "魔符", + text = { + "轉換手牌中", + "所有牌卡成一種", + "隨機{C:attention}花色" + } + }, + c_ouija = { + name = "占卜板", + text = { + "轉換手牌中", + "所有牌卡成一種", + "隨機{C:attention}點數", + "{C:red}-1{}手牌大小" + } + }, + c_ectoplasm = { + name = "靈質", + text = { + "新增{C:dark_edition}負片{}效果到", + "一張隨機的{C:attention}小丑牌,", + "{C:red}-1{}的手牌大小" + } + }, + c_immolate = { + name = "犧牲", + text = { + "隨機摧毀", + "{C:attention}#1#{}張手牌", + "獲得{C:money}$#2#" + } + }, + c_soul = { + name = "靈魂", + text = { + "產生一張", + "{C:legendary,E:1}傳奇{}小丑牌", + "{C:inactive}(必須有空位)" + } + }, + c_black_hole = { + name = "黑洞", + text = { + "升級每個", + "{C:legendary,E:1}牌型", + "{C:attention}1{}個等級" + } + }, + c_ankh = { + name = "安卡", + text = { + "隨機複製一張", + "擁有的{C:attention}小丑牌{}", + "並摧毀其它小丑牌" + } + }, + c_deja_vu = { + name = "既視感", + text = { + "新增一個{C:red}紅色封蠟章{}", + "至{C:attention}1{}張", + "選擇的手牌中" + } + }, + c_hex = { + name = "妖術", + text = { + "新增{C:dark_edition}彩色{}效果至", + "一個隨機{C:attention}小丑牌{},", + "並摧毀其它小丑牌" + } + }, + c_trance = { + name = "入迷", + text = { + "新增一個{C:blue}藍色封蠟章{}", + "至{C:attention}1{}張", + "選擇的手牌中" + } + }, + c_medium = { + name = "靈媒", + text = { + "新增一個{C:purple}紫色封蠟章{}", + "至{C:attention}1{}張", + "選擇的手牌中" + } + }, + c_cryptid = { + name = "傳說動物", + text = { + "選擇{C:attention}1{}張手牌", + "建立{C:attention}#1#{}張", + "選定牌的複製牌" + } + } + }, + Edition = { + e_base = { + name = "基本", + text = { + "無額外效果" + } + }, + e_foil = { + name = "銀箔", + text = { + "{C:chips}+#1#{}籌碼" + } + }, + e_holo = { + name = "全像攝影", + text = { + "{C:mult}+#1#{}倍數" + } + }, + e_polychrome = { + name = "彩色", + text = { + "{X:mult,C:white}X#1#{}倍數" + } + }, + e_negative = { + name = "負片", + text = { + "{C:dark_edition}+#1#{}小丑牌欄位" + } + }, + e_negative_consumable = { + name = "負片", + text = { + "{C:dark_edition}+#1#{}消耗牌欄位" + } + } + }, + Enhanced = { + m_bonus = { + name = "獎勵牌", + text = {} + }, + m_mult = { + name = "倍數牌", + text = { + "{C:mult}+#1#{}倍數" + } + }, + m_wild = { + name = "萬能牌", + text = { + "可以用在", + "任何花色" + } + }, + m_glass = { + name = "玻璃牌", + text = { + "{X:mult,C:white}X#1#{}倍數,", + "擁有{C:green}#2#/#3#{}的機率", + "摧毀牌卡" + } + }, + m_steel = { + name = "鋼鐵牌", + text = { + "當這張牌卡", + "在手上時", + "{X:mult,C:white}X#1#{}倍數" + } + }, + m_stone = { + name = "石頭牌", + text = { + "{C:chips}+#1#{}籌碼", + "無點數或花色" + } + }, + m_gold = { + name = "黃金牌", + text = { + "在這回合結束時", + "如果這張牌卡還在手上,", + "金錢{C:money}$#1#{}" + } + }, + m_lucky = { + name = "幸運牌", + text = { + "{C:green}#1#/#3#{}的機率", + "{C:mult}+#2#{}倍數", + "{C:green}#1#/#5#{}的機率", + "獲得{C:money}$#4#" + } + } + }, + Stake = { + stake_white = { + name = "白色賭注", + text = { + "基本難度" + } + }, + stake_red = { + name = "紅色賭注", + text = { + "{C:attention}小盲注{}", + "無獎勵金", + "{s:0.8}適用於所有先前的賭注" + } + }, + stake_green = { + name = "綠色賭注", + text = { + "每個{C:attention}底注所需分數", + "以更快的尺度提高", + "{s:0.8}適用於所有先前的賭注" + } + }, + stake_blue = { + name = "藍色賭注", + text = { + "{C:red}-1{}棄牌次數", + "{s:0.8}適用於所有先前的賭注" + } + }, + stake_black = { + name = "黑色賭注", + text = { + "商店有{C:attention}永存{}小丑牌", + "{C:inactive,s:0.8}(無法賣出或摧毀)", + "{s:0.8}適用於所有先前的賭注" + } + }, + stake_purple = { + name = "紫色賭注", + text = { + "每個{C:attention}底注所需分數", + "以更快的尺度提高", + "{s:0.8}適用於所有先前的賭注" + } + }, + stake_orange = { + name = "橘色賭注", + text = { + "{C:attention}擴充包{}費用", + "會在每底注多貴{C:money}$1{}", + "{s:0.8}適用於所有先前的賭注" + } + }, + stake_gold = { + name = "金色賭注", + text = { + "手牌大小{C:red}-1{}", + "{s:0.8}適用於所有先前的賭注" + } + } + }, + Tag = { + tag_uncommon = { + name = "罕見標籤", + text = { + "下個商店內有一張", + "{C:green}罕見小丑牌" + } + }, + tag_rare = { + name = "稀有標籤", + text = { + "下個商店內有一張", + "{C:red}稀有小丑牌" + } + }, + tag_negative = { + name = "負片標籤", + text = { + "下個商店內有一張", + "{C:dark_edition}負片小丑牌" + } + }, + tag_foil = { + name = "銀箔標籤", + text = { + "下個商店內有一張", + "{C:dark_edition}銀箔小丑牌" + } + }, + tag_holo = { + name = "全像攝影標籤", + text = { + "下個商店內有一張", + "{C:dark_edition}全像攝影小丑牌" + } + }, + tag_polychrome = { + name = "彩色標籤", + text = { + "下個商店內有一張", + "{C:dark_edition}彩色小丑牌" + } + }, + tag_investment = { + name = "投資標籤", + text = { + "擊敗", + "Boss盲注以後,", + "獲得{C:money}$#1#" + } + }, + tag_voucher = { + name = "禮券標籤", + text = { + "增加一張{C:voucher}禮券", + "到下一間商店" + } + }, + tag_boss = { + name = "Boss標籤", + text = { + "重摋", + "{C:attention}Boss盲注" + } + }, + tag_standard = { + name = "標準標籤", + text = { + "獲得一個免費的", + "{C:attention}超級標準禮包" + } + }, + tag_charm = { + name = "魔力標籤", + text = { + "獲得一個免費的", + "{C:tarot}超級奧秘禮包" + } + }, + tag_meteor = { + name = "流星標籤", + text = { + "獲得一個免費的", + "{C:planet}超級天外禮包" + } + }, + tag_buffoon = { + name = "丑角標籤", + text = { + "獲得一個免費的", + "{C:attention}丑角禮包" + } + }, + tag_handy = { + name = "方便標籤", + text = { + "本賽局每打出一次{C:blue}手牌{}", + "獲得{C:money}$#1#{}", + "{C:inactive}(將得到{C:money}$#2#{C:inactive})" + } + }, + tag_garbage = { + name = "垃圾標籤", + text = { + "本賽局每一未使用的{C:red}弃牌次数{}", + "得到{C:money}$#1#{}", + "{C:inactive}(將得到{C:money}$#2#{C:inactive})" + } + }, + tag_coupon = { + name = "優惠券標籤", + text = { + "下一家店的", + "初始牌卡和擴充包", + "均為免費" + } + }, + tag_double = { + name = "雙倍標籤", + text = { + "複製下一個", + "選定的{C:attention}標籤{}", + "{s:0.8,C:attention}雙倍標籤{s:0.8}除外" + } + }, + tag_juggle = { + name = "雜耍標籤", + text = { + "下一回合", + "{C:attention}+#1#{}手牌大小" + } + }, + tag_d_six = { + name = "D6標籤", + text = { + "下一次商店重摋", + "起價為{C:money}$0" + } + }, + tag_top_up = { + name = "儲值標籤", + text = { + "產生最多{C:attention}#1#張", + "{C:blue}一般{}小丑牌", + "{C:inactive}(必須有空位)" + } + }, + tag_skip = { + name = "速度標籤", + text = { + "本賽局中每跳過", + "一次盲注,獲得{C:money}$#1#{}", + "{C:inactive}(會給{C:money}$#2#{C:inactive})" + } + }, + tag_orbital = { + name = "軌道標籤", + text = { + "升級{C:attention}#1#", + "{C:attention}#2#個等級" + } + }, + tag_economy = { + name = "經濟標籤", + text = { + "金錢加倍", + "{C:inactive}(最高{C:money}$#1#{C:inactive})" + } + }, + tag_ethereal = { + name = "永存標籤", + text = { + "獲得一個免費的", + "{C:spectral}幻靈禮包" + } + } + }, + Blind = { + bl_small = { + name = "小盲注", + text = {} + }, + bl_big = { + name = "大盲注", + text = {} + }, + bl_hook = { + name = "鉤子", + text = { + "每次出牌", + "隨機丟棄2張手牌" + } + }, + bl_wall = { + name = "高牆", + text = { + "特大盲注" + } + }, + bl_wheel = { + name = "巨輪", + text = { + "/7機率一張牌", + "以面朝下方式抽出" + } + }, + bl_arm = { + name = "手臂", + text = { + "降低玩的這局", + "出牌的牌型等級" + } + }, + bl_psychic = { + name = "靈媒", + text = { + "必須出5張牌" + } + }, + bl_goad = { + name = "鞭策", + text = { + "所有的黑桃牌卡", + "都不計分" + } + }, + bl_water = { + name = "清水", + text = { + "此回合開始於", + "0 次棄牌次數" + } + }, + bl_eye = { + name = "眼睛", + text = { + "本回合不能打出", + "重複的手牌類型" + } + }, + bl_mouth = { + name = "嘴巴", + text = { + "本回合只能打出", + "一種手牌類型" + } + }, + bl_plant = { + name = "星球", + text = { + "所有花牌", + "都不計分" + } + }, + bl_needle = { + name = "細針", + text = { + "此回合只能打出一種手牌類型" + } + }, + bl_head = { + name = "頭顱", + text = { + "所有紅心牌卡", + "都不計分" + } + }, + bl_tooth = { + name = "尖齒", + text = { + "每出一張牌", + "損失$1" + } + }, + bl_final_leaf = { + name = "翠綠樹葉", + text = { + "所有牌卡都不計分", + "直到賣出1張小丑牌" + } + }, + bl_final_vessel = { + name = "紫羅蘭花器", + text = { + "非常大盲注" + } + }, + bl_ox = { + name = "公牛", + text = { + "打出#1#牌型時,", + "設定金額至$0" + } + }, + bl_house = { + name = "房子", + text = { + "第一次的手牌", + "以背面朝上方式抽取" + } + }, + bl_club = { + name = "梅花", + text = { + "所有梅花牌卡", + "都不計分" + } + }, + bl_fish = { + name = "魚", + text = { + "在第一次出牌後", + "抽的牌都是面朝下抽出" + } + }, + bl_window = { + name = "窗戶", + text = { + "所有方塊牌卡", + "都不計分" + } + }, + bl_manacle = { + name = "手銬", + text = { + "手牌大小-1" + } + }, + bl_serpent = { + name = "蛇", + text = { + "每次出牌或棄牌後,", + "都只抽出3張牌" + } + }, + bl_pillar = { + name = "支柱", + text = { + "上一次底注中", + "打過的牌都不計分" + } + }, + bl_flint = { + name = "燧石", + text = { + "基本籌碼和", + "倍數都減半" + } + }, + bl_mark = { + name = "標記", + text = { + "所有花牌", + "面朝下抽出" + } + }, + bl_final_acorn = { + name = "琥珀橡果", + text = { + "所有小丑牌都面朝下", + "和牌位亂調" + } + }, + bl_final_heart = { + name = "緋紅之心", + text = { + "每次出牌", + "任一小丑牌功能失效" + } + }, + bl_final_bell = { + name = "蔚藍鐘", + text = { + "有一張牌會一直", + "被強制選定" + } + } + }, + Back = { + b_red = { + name = "紅色牌組", + text = { + "每一回合", + "{C:red}+#1#{}次棄牌" + } + }, + b_blue = { + name = "藍色牌組", + text = { + "每一回合", + "{C:blue}+#1#{}次出牌" + } + }, + b_yellow = { + name = "黃色牌組", + text = { + "開始時", + "額外獲得{C:money}$#1#" + } + }, + b_green = { + name = "綠色牌組", + text = { + "每一回合結束時:", + "每剩一次{C:blue}出牌次數,獲得{C:money}$#1#{s:0.85}", + "每剩一次{C:red}棄牌次數,獲得{C:money}$#2#{s:0.85}", + "不獲得任何{C:attention}利息" + } + }, + b_black = { + name = "黑色牌組", + text = { + "每一回合", + "", + "{C:attention}+#1#{}小丑牌欄位", + "{C:blue}-#2#{}出牌次數" + } + }, + b_magic = { + name = "魔術牌組", + text = { + "開局時得到", + "{C:tarot,T:v_crystal_ball}#1#{}禮券", + "和{C:attention}2張{}", + "{C:tarot,T:c_fool}#2#" + } + }, + b_nebula = { + name = "星雲牌組", + text = { + "開局時得到", + "{C:planet,T:v_telescope}#1#{}禮券", + "", + "及{C:red}#2#{}消耗牌欄位" + } + }, + b_metal = { + name = "金屬牌組", + text = { + "開局時,將牌組內", + "{C:attention}#1#張遊戲牌", + "加強為{C:attention}鋼鐵牌卡" + } + }, + b_abandoned = { + name = "拋棄牌組", + text = { + "開局時", + "玩家牌組中", + "沒有{C:attention}花牌" + } + }, + b_checkered = { + name = "方格牌組", + text = { + "開局時牌組為", + "{C:attention}26張{C:spades}黑桃{}和", + "{C:attention}26張{C:hearts}紅心{}" + } + }, + b_rocky = { + name = "岩石牌組", + text = { + "開局時得到{C:attention}#1#張", + "額外的{C:attention}石頭牌" + } + }, + b_braided = { + name = "編織牌組", + text = { + "第一個出牌的牌型", + "升級到{C:attention}第3級" + } + }, + b_anaglyph = { + name = "浮雕牌組", + text = { + "每次擊敗", + "{C:attention}Boss盲注{}後,獲得一個", + "{C:attention,T:tag_double}#1#" + } + }, + b_plasma = { + name = "等離子牌組", + text = { + "在計算局數分數時", + "平均{C:blue}籌碼{}", + "和{C:red}倍數{}", + "盲注要求分數{C:red}X#1#{}" + } + }, + b_erratic = { + name = "不穩定牌組", + text = { + "牌組中所有", + "{C:attention}點數{}和{C:attention}花色", + "均為隨機設定" + } + }, + b_challenge = { + name = "挑戰牌組", + text = { + "" + } + }, + b_ghost = { + name = "幽靈牌組", + text = { + "商店內可能會有", + "{C:spectral}幻靈牌{}", + "開始時擁有{C:spectral,T:c_hex}妖術{}卡" + } + }, + b_zodiac = { + name = "星座牌組", + text = { + "開局時即擁有", + "{C:tarot,T:v_tarot_merchant}#1#{}、", + "{C:planet,T:v_planet_merchant}#2#{}", + "和{C:attention,T:v_overstock_norm}#3#" + } + }, + b_painted = { + name = "彩繪牌組", + text = { + "{C:attention}+#1#{}手牌大小", + "{C:red}#2#{}小丑牌欄位" + } + } + }, + Other = { + gold_seal = { + name = "金色封蠟章", + text = { + "打出這張牌", + "且此牌計分,", + "獲得{C:money}$3{}" + } + }, + white_sticker = { + name = "白色貼紙", + text = { + "使用這張小丑牌", + "贏得{C:attention}白色", + "{C:attention}賭注{}難度" + } + }, + red_sticker = { + name = "紅色貼紙", + text = { + "使用這張小丑牌", + "贏得{C:attention}紅色", + "{C:attention}賭注{}難度" + } + }, + green_sticker = { + name = "綠色貼紙", + text = { + "使用這張小丑牌", + "贏得{C:attention}綠色", + "{C:attention}賭注{}難度" + } + }, + blue_sticker = { + name = "藍色貼紙", + text = { + "使用這張小丑牌", + "贏得{C:attention}藍色", + "{C:attention}賭注{}難度" + } + }, + black_sticker = { + name = "黑色貼紙", + text = { + "使用這張小丑牌", + "贏得{C:attention}黑色", + "{C:attention}賭注{}難度" + } + }, + purple_sticker = { + name = "紫色貼紙", + text = { + "使用這張小丑牌", + "贏得{C:attention}紫色", + "{C:attention}賭注{}難度" + } + }, + orange_sticker = { + name = "橘色貼紙", + text = { + "使用這張小丑牌", + "贏得{C:attention}橘色", + "{C:attention}賭注{}難度" + } + }, + gold_sticker = { + name = "金色貼紙", + text = { + "使用這張小丑牌", + "贏得{C:attention}金色", + "{C:attention}賭注{}難度" + } + }, + playing_card = { + text = { + "{V:1}#2#{C:light_black}#1#" + } + }, + card_chips = { + text = { + "{C:chips}+#1#{}籌碼" + } + }, + card_extra_chips = { + text = { + "{C:chips}+#1#{}個額外籌碼" + } + }, + locked = { + name = "已鎖定", + text = {} + }, + debuffed_default = { + name = "遭減益", + text = { + "所有能力", + "失效" + } + }, + debuffed_playing_card = { + name = "遭減益", + text = { + "得分無籌碼,", + "不能觸發任何", + "功能或效果" + } + }, + demo_locked = { + name = "已鎖定", + text = { + "本試玩版", + "暫不適用" + } + }, + demo_shop_locked = { + name = "已鎖定", + text = { + "{C:attention}金寶的", + "個人收藏牌卡。", + "將於正式版的", + "{E:1,C:red}Balatro可供使用" + } + }, + wip_locked = { + name = "已鎖定", + text = { + "正在", + "製作中" + } + }, + deck_locked_win = { + name = "已鎖定", + text = { + "在任一難度下", + "使用{C:attention}#1#{}", + "贏得一場比賽" + } + }, + deck_locked_discover = { + name = "已鎖定", + text = { + "在收藏中", + "發現至少", + "{C:attention}#1#{}個項目" + } + }, + deck_locked_stake = { + name = "已鎖定", + text = { + "用任一牌組贏得比賽,", + "至少需為", + "{V:1}#1#{}難度" + } + }, + joker_locked_legendary = { + name = "已鎖定", + text = { + "透過{C:spectral}靈魂{}牌", + "找到這張小丑牌" + } + }, + undiscovered_joker = { + name = "未發現", + text = { + "在無種子比賽", + "購買或使用", + "禮券", + "瞭解功用" + } + }, + undiscovered_tarot = { + name = "未發現", + text = { + "在無種子比賽", + "購買或使用", + "禮券", + "瞭解功用" + } + }, + undiscovered_planet = { + name = "未發現", + text = { + "在無種子比賽", + "購買或使用", + "禮券", + "瞭解功用" + } + }, + undiscovered_spectral = { + name = "未發現", + text = { + "在無種子比賽", + "購買或使用", + "禮券", + "瞭解功用" + } + }, + undiscovered_voucher = { + name = "未發現", + text = { + "在無種子比賽", + "兌換此", + "禮券", + "瞭解功用" + } + }, + undiscovered_booster = { + name = "未發現", + text = { + "在無種子比賽", + "打開此禮包", + "瞭解功用" + } + }, + undiscovered_edition = { + name = "未發現", + text = { + "在無種子比賽", + "找到此版本", + "瞭解功用" + } + }, + undiscovered_tag = { + name = "未發現", + text = { + "使用這個標籤在", + "在無種子比賽", + "瞭解功用" + } + }, + p_arcana_normal = { + name = "奧秘禮包", + text = { + "從最多{C:attention}#2#張{C:tarot}塔羅牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用" + } + }, + p_arcana_jumbo = { + name = "特大奧秘禮包", + text = { + "從最多{C:attention}#2#張{C:tarot}塔羅牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用" + } + }, + p_arcana_mega = { + name = "超級奧秘禮包", + text = { + "從最多{C:attention}#2#張{C:tarot}塔羅牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用" + } + }, + p_celestial_normal = { + name = "天外禮包", + text = { + "從最多{C:attention}#2#張{C:planet}行星牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用" + } + }, + p_celestial_jumbo = { + name = "超大天外禮包", + text = { + "從最多{C:attention}#2#張{C:planet}行星牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用" + } + }, + p_celestial_mega = { + name = "超級天外禮包", + text = { + "從最多{C:attention}#2#張{C:planet}行星牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用" + } + }, + p_spectral_normal = { + name = "幻靈禮包", + text = { + "從最多{C:attention}#2#張{C:spectral}幻靈牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用" + } + }, + p_spectral_jumbo = { + name = "特大幻靈禮包", + text = { + "從最多{C:attention}#2#張{C:spectral}幻靈牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用" + } + }, + p_spectral_mega = { + name = "超級幻靈禮包", + text = { + "從最多{C:attention}#2#張{C:spectral}幻靈牌{}中", + "選擇{C:attention}#1#{}張", + "並馬上使用" + } + }, + p_standard_normal = { + name = "標準禮包", + text = { + "從最多{C:attention}#2#張{C:attention}遊戲牌{}中", + "選擇{C:attention}#1#{}張", + "到你的牌組" + } + }, + p_standard_jumbo = { + name = "特大標準禮包", + text = { + "從最多{C:attention}#2#張{C:attention}遊戲牌{}中", + "選擇{C:attention}#1#{}張", + "到你的牌組" + } + }, + p_standard_mega = { + name = "超級標準禮包", + text = { + "從最多{C:attention}#2#張{C:attention}遊戲牌{}中", + "選擇{C:attention}#1#{}張", + "到你的牌組" + } + }, + p_buffoon_normal = { + name = "丑角禮包", + text = { + "從最多{C:attention}#2#張{C:joker}小丑牌{}中", + "選擇{C:attention}#1#{}張" + } + }, + p_buffoon_jumbo = { + name = "特大丑角禮包", + text = { + "從最多{C:attention}#2#張{C:joker}小丑牌{}中", + "選擇{C:attention}#1#{}張" + } + }, + p_buffoon_mega = { + name = "超級丑角禮包", + text = { + "從最多{C:attention}#2#張{C:joker}小丑牌{}中", + "選擇{C:attention}#1#{}張" + } + }, + pinned_left = { + name = "已釘選", + text = { + "這張小丑牌", + "已釘選在", + "最左邊位置" + } + }, + red_seal = { + name = "紅色封蠟章", + text = { + "重新觸發", + "{C:attention}1{}次這張牌" + } + }, + blue_seal = { + name = "藍色封蠟章", + text = { + "當這張牌在回合結束時", + "還{C:attention}保留{}在手牌中", + "產生一張{C:planet}行星牌{}" + } + }, + purple_seal = { + name = "紫色封蠟章", + text = { + "{C:attention}棄此牌時", + "產生一張{C:tarot}塔羅牌{}", + "{C:inactive}(必須有空位)" + } + }, + eternal = { + name = "永恆", + text = { + "不能賣出", + "或催毀" + } + }, + challenge_locked = { + name = "已鎖定", + text = { + "用至少#1#個不同牌組", + "贏得一場比賽以解鎖", + "挑戰模式", + "{C:attention,s:2}#2#/#1#" + } + } + } + }, + UI = {}, + tutorial = {}, + misc = { + suits_singular = { + Spades = "黑桃", + Hearts = "紅心", + Clubs = "梅花", + Diamonds = "方塊" + }, + suits_plural = { + Spades = "黑桃", + Hearts = "紅心", + Clubs = "梅花", + Diamonds = "方塊" + }, + blind_states = { + Select = "選擇", + Skipped = "跳過", + Current = "目前", + Defeated = "已被擊敗", + Upcoming = "下一回合", + Selected = "已選擇" + }, + ranks = { + Ace = "A", + King = "K", + Queen = "Q", + Jack = "J", + ['10'] = "10", + ['9'] = "9", + ['8'] = "8", + ['7'] = "7", + ['6'] = "6", + ['5'] = "5", + ['4'] = "4", + ['3'] = "3", + ['2'] = "2" + }, + high_scores = { + hand = "最好的一手", + furthest_round = "最高回合", + furthest_ante = "最高底注", + most_money = "最多資金", + boss_streak = "最多連續好牌", + collection = "收藏", + win_streak = "至佳連贏", + current_streak = "", + poker_hand = "最常出的牌" + }, + poker_hands = { + ['Flush House'] = "同花葫蘆", + ['Five of a Kind'] = "五條", + ['Royal Flush'] = "皇家同花順", + ['Straight Flush'] = "同花順", + ['Four of a Kind'] = "四條", + ['Full House'] = "葫蘆", + ['Flush'] = "同花", + ['Straight'] = "順子", + ['Three of a Kind'] = "三條", + ['Two Pair'] = "兩對", + ['Pair'] = "對子", + ['High Card'] = "高牌", + ['Flush Five'] = "同花五條" + }, + poker_hand_descriptions = { + ['Flush House'] = { + "三條和對子與", + "所有牌分享相同花色" + }, + ['Five of a Kind'] = { + "5張相同點數的牌" + }, + ['Royal Flush'] = { + "5張牌一連(連續數字)且", + "所有牌分享相同花色" + }, + ['Straight Flush'] = { + "5張牌一連(連續數字)且", + "所有牌分享相同花色" + }, + ['Four of a Kind'] = { + "4張牌一樣點數。可以與", + "其他1張未計分的牌一起出" + }, + ['Full House'] = { + "三條和對子" + }, + ['Flush'] = { + "5張相同花色的牌" + }, + ['Straight'] = { + "5張牌一連(連續數字)" + }, + ['Three of a Kind'] = { + "3張牌相同點數的牌。可以與", + "其他2張未計分的牌卡一起出" + }, + ['Two Pair'] = { + "兩對不同點數的牌。可以與", + "其他1張未計分的牌一起出" + }, + ['Pair'] = { + "2張相同點數的牌。可以與", + "最多其他3張未計分的牌卡一起出" + }, + ['High Card'] = { + "如果玩的手牌不屬於上述任一種,", + "只有最高點數的牌可以計入分數" + }, + ['Flush Five'] = { + "5張相同點數與花色的牌" + } + }, + labels = { + common = "一般", + uncommon = "罕見", + rare = "稀有", + legendary = "傳奇", + tarot = "塔羅牌", + planet = "行星牌", + pluto_planet = "矮行星", + voucher = "禮券", + foil = "銀箔", + holographic = "全像攝影", + polychrome = "彩色", + negative = "負片", + gold_seal = "金色封蠟章", + locked = "已鎖定", + blue_seal = "藍色封蠟章", + red_seal = "紅色封蠟章", + purple_seal = "紫色封蠟章", + eternal = "永恆", + pinned_left = "已釘選" + }, + dictionary = { + b_sell = "賣出", + b_use = "使用", + b_select = "選擇", + b_buy = "購買", + b_redeem = "兌換", + b_open = "打開", + b_and_use = "和使用", + b_next_round_1 = "下一個", + b_next_round_2 = "回合", + b_play_hand = "出牌", + b_discard = "棄牌", + b_sort_hand = "理牌", + b_run_info_1 = "比賽", + b_run_info_2 = "資訊", + b_options = "選項", + b_reroll_boss = "重開Boss盲注", + b_skip_blind = "跳過盲注", + b_skip_reward = "跳過獎勵", + b_skip = "跳過", + b_start_new_run = "開始新的一局", + b_main_menu = "主選單", + b_collection = "收藏", + b_seed = "種子", + b_copy_seed = "複製種子", + b_credits = "製作人員", + b_stats = "統計數據", + b_settings = "設定", + b_set_game = "遊戲", + b_set_video = "影像", + b_set_graphics = "圖像", + b_set_audio = "音訊", + b_set_gamespeed = "遊戲速度", + b_set_play_discard_pos = "出牌/棄牌按鈕位置", + b_set_screenshake = "螢幕抖動", + b_set_crash_reports = "當機報告", + b_set_monitor = "顯示螢幕", + b_set_windowmode = "視窗模式", + b_set_apply = "套用", + b_set_master_vol = "主音量", + b_set_music_vol = "音樂音量", + b_set_game_vol = "遊戲音量", + b_set_shadows = "陰影", + b_set_pixel_smoothing = "像素圖像平滑", + b_set_CRT = "CRT", + b_set_CRT_bloom = "模擬CRT螢光效果", + b_stat_jokers = "小丑", + b_stat_consumables = "消耗牌", + b_stat_tarots = "塔羅牌", + b_stat_planets = "行星牌", + b_stat_spectrals = "幻靈牌", + b_stat_vouchers = "禮券", + b_next = "下一個", + b_endless = "無盡模式", + b_wishlist = "加入Steam願望清單", + b_playbalatro = "造訪playbalatro.com", + b_remaining = "剩下", + b_full_deck = "完整牌組", + b_poker_hands = "手牌", + b_blinds = "盲注", + b_vouchers = "禮券", + b_stake = "賭注", + b_jokers = "小丑", + b_tarot_cards = "塔羅牌", + b_planet_cards = "行星牌", + b_spectral_cards = "幻靈牌", + b_enhanced_cards = "加強牌", + b_editions = "版本", + b_booster_packs = "擴充包", + b_tags = "標籤", + b_decks = "牌組", + b_continue = "繼續", + b_back = "返回", + b_music = "音樂", + b_sounds = "聲音", + b_imagery = "影像", + b_new_run = "新一回合", + b_challenges = "挑戰", + b_current_profile = "目前資料", + b_load_profile = "載入個人檔案", + b_create_profile = "建立個人檔案", + b_delete_profile = "刪除個人檔案", + b_reset_profile = "重設個人檔案", + b_rules = "規則", + b_restrictions = "限制", + b_deck = "牌組", + b_play_cap = "開始遊戲", + b_options_cap = "選項", + b_collection_cap = "收藏", + b_quit_cap = "退出", + b_cash_out = "兌現", + k_unknown = "?????", + k_compatible = "相容", + k_incompatible = "不相容", + k_round = "回合", + k_ante = "底注", + k_seed = "種子", + k_reroll = "重開牌", + k_mult = "倍數", + k_rank = "點數", + k_suit = "花色", + k_stake = "賭注", + k_common = "一般", + k_uncommon = "罕見", + k_rare = "稀有", + k_legendary = "傳奇", + k_debuffed = "遭減益", + k_locked = "已鎖定", + k_undisovered = "未發現", + k_joker = "小丑", + k_voucher = "禮券", + k_tarot = "塔羅牌", + k_planet = "行星牌", + k_dwarf_planet = "矮行星", + k_planet_q = "行星?", + k_spectral = "幻靈", + k_booster = "擴充", + k_edition = "版本", + k_hud_hands = "出牌", + k_hud_discards = "棄牌", + k_lower_score = "分數", + k_arcana_pack = "奧秘禮包", + k_celestial_pack = "天外禮包", + k_spectral_pack = "幻靈禮包", + k_standard_pack = "標準禮包", + k_buffoon_pack = "丑角禮包", + k_enter_text = "輸入文字", + k_defeated_by = "擊敗", + k_level_prefix = "等級", + k_also_applied = "也適用於", + k_base_cards = "基本牌卡", + k_effective = "有效", + k_aces = "A", + k_face_cards = "花牌", + k_numbered_cards = "數字牌", + k_cap_consumables = "消耗牌", + k_page = "頁", + k_ante_cap = "底注", + k_base_cap = "基本", + k_jokers_cap = "小丑", + k_vouchers_cap = "禮券", + k_x_base = "X基本", + k_not_discovered = "未發現", + k_unlocked_ex = "已解鎖!", + k_challenge_mode = "挑戰模式", + k_daily_run = "每日比賽", + k_profile = "個人檔案", + k_wins = "獲勝數", + k_empty_caps = "空", + k_collection = "收藏", + k_stake_level = "賭注等級", + k_none = "無", + k_game_modifiers = "遊戲修改者", + k_custom_rules = "自訂規則", + k_banned_cards = "禁卡", + k_banned_tags = "禁標籤", + k_other = "其他", + k_money = "資金", + k_best_hand = "最好的一手", + k_seeded_run = "種子比賽", + k_enter_seed = "進入種子", + k_lvl = "等級", + k_skipped_cap = "已跳過", + k_no_reward = "無獎勵", + k_reward = "獎勵", + k_nope_ex = "不!", + k_or = "或", + k_balanced = "已平衡", + ph_improve_run = "順順手氣!", + ph_sneak_peek = "先睹為快", + ph_deck_preview_stones = "石頭", + ph_deck_preview_effective = "因小丑、盲注和卡牌增強而產生的有效總數量", + ph_blind_score_at_least = "至少得分", + ph_blind_reward = "獎勵:", + ph_up_ante_1 = "提高底注", + ph_up_ante_2 = "提高所有盲注", + ph_up_ante_3 = "重洗盲注", + ph_stat_joker = "這張牌卡總共完成的回合數", + ph_stat_consumable = "這張牌卡使用過的次數", + ph_stat_voucher = "這張禮券兌換過的次數", + ph_demo_thanks_1 = "感謝您體驗", + ph_demo_thanks_2 = "BALATRO試玩版", + ph_game_over = "遊戲結束", + ph_vouchers_redeemed = "本賽局兌換的禮券", + ph_no_vouchers = "本賽局沒有兌換禮券", + ph_defeat_this_blind_1 = "戰勝盲注", + ph_defeat_this_blind_2 = "發現它", + ph_click_confirm = "再按一下即可確認", + ph_choose_blind_1 = "選擇您的", + ph_choose_blind_2 = "下一個盲注", + ph_mr_bones = "已被骷髏頭救出", + ph_score_at_least = "分數最少", + ph_all_poker_hand = "所有手牌", + ph_1_level = "+1級", + ph_boss_disabled = "Boss盲注限制條件失效", + ph_most_played = "{最常出的牌型}", + ml_demo_thanks_message = { + "不妨到", + "Steam將Balatro加入願望清單", + "並在playbalatro.com訂閱電子報" + }, + ml_eternal = { + "永恆", + "不能賣出", + "或催毀" + }, + ml_gold_seal_desc = { + "金色封蠟章", + "重返手上", + "白貼紙時" + }, + ml_crash_report_info = { + "當機報告會送給開發商", + "以協助減少未來的問題。系統並不會", + "送出可識別身分的資訊或個人資料。" + }, + ml_play_discard_pos_opt = { + "棄牌/出牌", + "出牌/棄牌" + }, + ml_windowmode_opt = { + "視窗模式", + "全螢幕模式", + "無邊界模式" + }, + ml_vsync_opt = { + "垂直同步開啟", + "垂直同步關閉" + }, + ml_shadow_opt = { + "開啟", + "關閉" + }, + ml_smoothing_opt = { + "關閉", + "開啟" + }, + ml_bloom_opt = { + "關閉", + "開啟" + }, + ml_card_stats = { + "牌卡", + "統計數據" + }, + ml_paste_seed = { + "貼上", + "種子" + }, + ml_disabled_seed = { + "全部解鎖及", + "發現均被禁用" + }, + ['$'] = "$", + k_redeemed_ex = "已兌換!", + k_duplicated_ex = "複製!", + k_no_room_ex = "沒有空間!", + k_no_space_ex = "沒有空間!", + k_no_other_jokers = "沒有其他小丑牌!", + k_plus_tarot = "+1塔羅牌", + k_plus_stone = "+1石頭牌", + k_plus_planet = "+1行星牌", + k_plus_spectral = "+1幻靈牌", + k_active_ex = "使用中!", + k_level_up_ex = "升級!", + k_upgrade_ex = "升級!", + k_again_ex = "再一次!", + k_val_up = "提高價值!", + k_reset = "重設", + k_extinct_ex = "消滅了!", + k_safe_ex = "安全!", + k_saved_ex = "已儲存!", + k_swapped_ex = "已切換!", + k_copied_ex = "已複製!", + k_melted_ex = "已融化!", + b_copy = "複製", + b_high_contrast_cards = "高對比牌", + b_set_rumble = "控制器振動", + b_seals = "封蠟章", + b_new_challenge = "開始新挑戰", + b_unlock_all = "解鎖全部", + k_active = "使用中", + k_deck = "牌組", + k_progress = "進度", + k_challenges = "挑戰", + k_joker_stickers = "小丑貼紙", + k_deck_stake_wins = "牌組賭注完成度", + k_enter_name = "輸入名稱", + k_gold = "金色", + k_card_stats = "牌卡統計數據", + k_view = "檢視", + k_all_hands = "所有手牌", + k_high_score_ex = "高分!", + k_demo_version_ex = "試玩版", + k_playing_as = "角色名稱", + k_choose = "選擇", + k_achievements_disabled = "禁用成就", + ph_no_boss_active = "無使用中的好牌", + ph_you_win = "你獲勝了!", + ph_you_win_demo = "你在試玩版中獲勝了!", + ph_defeat_the_boss = "戰勝Boss盲注", + ph_score_furthest_ante = "底注", + ph_score_furthest_round = "回合", + ph_score_hand = "最好的一手", + ph_score_poker_hand = "玩得最多的一局", + ph_score_new_collection = "新發現", + ph_score_cards_played = "打出的牌", + ph_score_cards_discarded = "丟棄的牌", + ph_score_times_rerolled = "已重開時間", + ph_score_cards_purchased = "已選購的牌", + ml_edition_seal_enhancement_explanation = { + "每張遊戲牌可能會有", + "加強、版本與封蠟章版本" + }, + ml_unlock_all_explanation = { + "警告!解鎖完整收藏", + "將禁用此個人檔案的成就!" + }, + k_plus_joker = "+1小丑", + k_eaten_ex = "吞噬!", + k_eroded_ex = "侵蝕!", + k_achievement = "成就", + ph_unscored_hand = "出牌將不會得分", + ph_alert_debuff_confirm = "再按一次「出牌」確認", + k_drank_ex = "大喝一口!", + k_trophy = "獎盃", + k_trophies_disabled = "獎盃停用", + ml_unlock_all_trophies = { + "警告!解鎖完整收藏", + "將停用此個人檔案的獎盃!" + }, + k_poker_hand = "牌型", + ph_4_7_of_clubs = "四張梅花7" + }, + v_dictionary = { + a_xmult = "X#1#倍數", + a_mult = "+#1#倍數", + a_chips = "+#1#", + a_chips_minus = "-#1#", + a_handsize = "+#1#的手牌大小", + a_hands = "+#1# 出牌次數", + a_sold_tally = "#1#/#2#賣出", + a_remaining = "剩下#1#", + ante_x_voucher = "底注#1#張禮券", + loyalty_active = "開啟!", + loyalty_inactive = "剩下#1#", + deck_preview_wheel_singular = "因#1#牌面朝下,數字可能較小", + deck_preview_wheel_plural = "因#1#牌面朝下,數字可能較小", + challenges_completed = "已完成#1#/#2#個挑戰", + interest = "每$#2#獲得#1#利息(上限為#3#)", + remaining_hand_money = "剩下出牌次數(每次$#1#)", + remaining_discard_money = "剩下棄牌次數(每次$#1#)", + ml_foil_desc = { + "銀箔", + "+#1#籌碼" + }, + ml_holo_desc = { + "全像攝影", + "+#1#倍數" + }, + ml_polychrome_desc = { + "彩色", + "X#1#倍數" + }, + ml_negative_desc = { + "負片", + "+#1#小丑牌欄位" + }, + a_mult_minus = "-#1#倍數", + a_handsize_minus = "-#1#手牌大小", + ml_negative_consumable_desc = { + "負片", + "+#1#消耗牌欄位" + }, + a_xmult_minus = "-X#1#倍數", + unlocked = "已解鎖#1#/#2#", + completed = "已完成#1#/#2#" + }, + v_text = { + ch_m_dollars = { + "從{C:money}$#1#開始玩" + }, + ch_m_hands = { + "每回合{C:blue}#1#{}出牌次數" + }, + ch_m_discards = { + "每回合{C:red}-#1#{}棄牌次數" + }, + ch_m_reroll_cost = { + "{C:money}$#1#{}重摋基本費用" + }, + ch_m_joker_slots = { + "{C:attention}#1#{}小丑牌欄位" + }, + ch_m_consumable_slots = { + "{C:attention}#1#{}消耗牌欄位" + }, + ch_m_hand_size = { + "{C:attention}#1#{}手牌大小" + }, + ch_m_none = { + "{C:inactive}無" + }, + ch_c_no_reward = { + "所有{C:attention}盲注{}均沒有獎勵金" + }, + ch_c_no_reward_specific = { + "{C:attention}#1#盲注{}均沒有獎勵金" + }, + ch_c_no_extra_hand_money = { + "額外{C:blue}手牌{}無法再獲得資金" + }, + ch_c_no_interest = { + "每一回合結束時無法獲得{C:attention}利息{}" + }, + ch_c_daily = { + "{E:1,s:1.2,C:red}每日挑戰!" + }, + ch_c_set_seed = { + "嘗試設定種子1次:{C:inactive}{隱藏}" + }, + ch_c_chips_dollar_cap = { + "{C:blue}籌碼{}不能超過目前的{C:money}$" + }, + ch_c_none = { + "{C:inactive}無" + }, + ch_c_inflation = { + "每次選購永久提高價格{C:money}$1{}" + }, + ch_c_discard_cost = { + "每次棄牌支付{C:money}$#1#{}" + }, + ch_c_all_eternal = { + "所有商店內小丑都是{C:eternal}永恆的{}" + }, + ch_c_flipped_cards = { + "每{C:green}#1#{}張牌中有1張會是面朝下抽出" + }, + ch_c_minus_hand_size_per_X_dollar = { + "每擁有{C:money}$#1#{},就{C:red}-1{}張能持有的手牌" + }, + ch_c_no_shop_jokers = { + "{C:attention}商店{}中不再出現小丑牌" + }, + ch_c_debuff_played_cards = { + "所有{C:attention}打出過的{}牌在計分後會遭到{C:attention}減益{}" + }, + ch_c_set_eternal_ante = { + "當{C:attention}#1#{}Boss盲注被擊敗後,所有的小丑牌都會成為{C:attention}永恆狀態" + }, + ch_c_set_joker_slots_ante = { + "當{C:attention}#1#{}Boss盲注被擊敗後,將小丑牌欄位數變為{C:attention}0" + } + }, + tutorial = { + sb_1 = { + "您好!我的名字是", + "{C:attention}金寶{},讓我來幫您", + "瞭解遊玩的方式!" + }, + sb_2 = { + "您的目標是要賺取", + "{C:blue}籌碼{}來擊敗", + "對手的{C:attention}盲注" + }, + sb_3 = { + "這裡是{C:blue}小盲注{},", + "您只需要獲得", + "{C:attention}300籌碼{}就可以擊敗他。" + }, + sb_4 = { + "選擇{C:blue}小盲注", + "開始這一回合!" + }, + bb_1 = { + "選擇{C:attention}大盲注", + "將賺到現金" + }, + bb_2 = { + "您也可以選擇{C:attention}跳過", + "取得{C:attention}標籤{}!每個", + "{C:attention}標籤{}都有獨特的效果" + }, + bb_3 = { + "不過請小心", + "{C:attention}Boss盲注{}。每個Boss盲注", + "都有著限制條件", + "您必須要有策略來應對。" + }, + bb_4 = { + "如果您贏了,", + "{C:attention}底注{}就會增加,然後所有", + "{C:attention}盲注{}都會變難" + }, + bb_5 = { + "打敗{C:attention}底注{}#1#就能獲勝", + "現在做出您的選擇吧!" + }, + fh_1 = { + "賺到籌碼,全靠", + "打出{C:attention}手牌" + }, + fh_2 = { + "每次打出{C:attention}手牌{}都", + "能賺取基本{C:blue}籌碼", + "再透過{C:red}倍數加成" + }, + fh_3 = { + "請前往{C:attention}比賽資訊{}區塊", + "查看你的{C:attention}牌型", + "以及其他跟目前比賽", + "有關的資訊" + }, + fh_4 = { + "牌卡也可賺取", + "{C:blue}籌碼{},將滑鼠", + "移到卡上即可查看!" + }, + fh_5 = { + "現在,最多", + "選擇{C:attention}5{}張牌", + "並按下{C:blue}「出牌」" + }, + fh_6 = { + "您也可以{C:red}「棄牌」", + "(最多選定{C:attention}5{}張牌)", + "來創造更好的手牌。", + "快試試看吧!" + }, + fh_7 = { + "請小心,每回合", + "{C:blue}出牌{}和{C:red}棄牌{}次數", + "皆有上限" + }, + fh_8 = { + "在使用所有{C:blue}手牌次數前", + "賺取{C:attention}300籌碼{}", + "贏得這一回合。", + "祝您好運!" + }, + sh_1 = { + "如果您有多張牌卡,", + "記得您可以重新", + "理牌。{C:attention}小丑牌{}觸發", + "是從左到右的排列方式" + }, + sh_2 = { + "別忘了", + "{C:attention}使用{}您的消耗牌!" + }, + sh_3 = { + "選擇手上最多{C:attention}2{}張牌", + "然後在{C:tarot}塔羅牌{}上", + "按下{C:attention}「使用」{}", + "就能加強效果!" + }, + s_1 = { + "很棒!現在", + "您有一些{C:money}現金{},", + "立即前往{C:attention}商店", + "買一些新卡牌吧!" + }, + s_2 = { + "試試買這張", + "帥氣的小丑牌" + }, + s_3 = { + "這是{C:attention}#1#張其中一張", + "可以加到比賽的", + "{C:attention}小丑牌{}。每張{C:attention}小丑牌", + "都有不一樣的功能" + }, + s_4 = { + "這張可以增加{C:red}+4倍數{}到", + "您打出的每張牌!" + }, + s_5 = { + "挑剔一點,", + "您一次只能帶", + "{C:attention}5張小丑牌{}" + }, + s_6 = { + "現在,從{C:attention}商店購買", + "另一張卡牌。" + }, + s_7 = { + "這張{C:tarot}塔羅牌{}是", + "{C:attention}消耗牌{},可以", + "加強您打出的牌。", + "好好留著這張牌!" + }, + s_8 = { + "您一次最多", + "可以攜帶", + "{C:attention}2張消耗牌{}" + }, + s_9 = { + "如果您有足夠積蓄,", + "也可考慮購買{C:attention}禮券{}。", + "{C:attention}禮券{}可以", + "幫您升級比賽!" + }, + s_10 = { + "{C:attention}禮券{}會在", + "您擊敗{C:attention}Boss盲注{}", + "後重新上架。" + }, + s_11 = { + "快去看看兩個", + "商店賣的{C:booster}擴充包{},", + "每次商店都會販售,", + "擴充包有滿滿好康!" + }, + s_12 = { + "我們現在進入", + "{C:attention}下一回合{}。" + } + }, + achievement_names = { + ante_up = "底注上升!", + ante_upper = "底注再上升!", + heads_up = "注意", + low_stakes = "低賭注", + mid_stakes = "中賭注", + high_stakes = "高賭注", + card_player = "牌卡玩家", + card_discarder = "棄牌者", + nest_egg = "儲備金", + flushed = "同花", + speedrunner = "快速破關者", + roi = "投報率", + shattered = "粉碎", + royale = "王室", + retrograde = "逆行", + _10k = "10K", + _1000k = "1,000K", + _100000k = "100,000K", + tiny_hands = "小手牌", + big_hands = "大手牌", + you_get_what_you_get = "接受現況", + rule_bender = "規則突破者", + rule_breaker = "規則破壞者", + legendary = "傳奇", + astronomy = "天文學", + cartomancy = "卜卦", + clairvoyance = "未卜先知", + extreme_couponer = "精打細算者", + completionist = "完美主義者", + completionist_plus = "完美主義者+", + completionist_plus_plus = "完美主義者++" + }, + achievement_descriptions = { + ante_up = "達到底注4", + ante_upper = "達到底注8", + heads_up = "贏得比賽", + low_stakes = "至少在紅色賭注難度贏得比賽", + mid_stakes = "至少在藍色賭注難度贏得比賽", + high_stakes = "至少在金色賭注難度贏得比賽", + card_player = "打出至少2500張牌", + card_discarder = "丟棄至少2500張牌", + nest_egg = "在單一回合中擁有$400以上", + flushed = "用5張萬能牌打出一次同花", + speedrunner = "在12回合以內贏得比賽", + roi = "在底注4的遊戲中購買5禮券", + shattered = "在單一手牌中破壞2玻璃牌", + royale = "打出同花大順", + retrograde = "將任一手牌提升至等級10", + _10k = "在單一手牌中獲得10,000籌碼", + _1000k = "在單一手牌中獲得1,000,000籌碼", + _100000k = "在單一手牌中獲得100,000,000籌碼", + tiny_hands = "將你的牌組縮減至20張或以下", + big_hands = "牌組中擁有80張以上牌卡", + you_get_what_you_get = "在不使用商店重開牌的情況下贏得比賽", + rule_bender = "完成任一挑戰賽", + rule_breaker = "完成所有挑戰賽", + legendary = "找到傳奇小丑", + astronomy = "找到所有行星牌", + cartomancy = "找到所有塔羅牌", + clairvoyance = "找到所有幻靈牌", + extreme_couponer = "找到所有禮券", + completionist = "找到100%個人收藏牌卡", + completionist_plus = "在金色賭注難度中,使用每副牌組贏得勝利", + completionist_plus_plus = "每張小丑牌都獲得金色貼紙" + }, + quips = { + wq_1 = { + "你的表現超出色!" + }, + wq_2 = { + "你超讚", + "很棒呢!" + }, + wq_3 = { + "看來", + "你不是在吹牛!" + }, + wq_4 = { + "這些籌碼", + "要是都是真錢", + "該有多好啊……" + }, + wq_5 = { + "看來我已", + "我把你教得很好嘛!" + }, + wq_6 = { + "你的決策", + "非常明智!" + }, + wq_7 = { + "幸好", + "我不打賭", + "不是你!" + }, + lq_1 = { + "感覺", + "我們更適合玩", + "Go Fish……" + }, + lq_2 = { + "我們放棄得", + "有點輕易欸!" + }, + lq_3 = { + "是時候該", + "重新洗牌", + "然後重新開局了!" + }, + lq_4 = { + "人家不是常說那句話嗎?", + "就是", + "贏的永遠是莊家!" + }, + lq_5 = { + "看來", + "我們找到", + "誰才是真正的「小丑」了!" + }, + lq_6 = { + "天啊,難到", + "你也是在吹牛?" + }, + lq_7 = { + "沒想到", + "我們讓人看笑話了!" + }, + lq_8 = { + "這種情況,", + "只要有手的人都想", + "把眼睛遮起來吧!" + }, + lq_9 = { + "我是", + "真的傻,但你", + "的藉口是什麼?" + }, + lq_10 = { + "真是糗到不行!" + }, + dq_1 = { + "唉!我希望", + "你有什麼妙計", + "能應付這", + "最後的挑戰!" + } + }, + challenge_names = { + c_omelette_1 = "煎蛋捲", + c_city_1 = "一刻鐘城市", + c_rich_1 = "富者愈富", + c_knife_1 = "刀鋒之上", + c_xray_1 = "透視眼", + c_mad_world_1 = "瘋狂世界", + c_luxury_1 = "奢侈稅", + c_non_perishable_1 = "保久物資", + c_medusa_1 = "梅杜莎", + c_double_nothing_1 = "孤注一擲", + c_typecast_1 = "定型角色", + c_inflation_1 = "通貨膨脹", + c_bram_poker_1 = "布蘭撲克", + c_fragile_1 = "脆弱不堪", + c_monolith_1 = "巨石柱", + c_blast_off_1 = "一飛沖天", + c_five_card_1 = "五張換牌", + c_golden_needle_1 = "黃金針", + c_cruelty_1 = "殘忍無情", + c_jokerless_1 = "小丑不再" + } + } +} \ No newline at end of file diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..bca6141 --- /dev/null +++ b/main.lua @@ -0,0 +1,370 @@ +if (love.system.getOS() == 'OS X' ) and (jit.arch == 'arm64' or jit.arch == 'arm' or true) then jit.off() end +require "engine/object" +require "bit" +require "engine/string_packer" +require "engine/controller" +require "back" +require "tag" +require "engine/event" +require "engine/node" +require "engine/moveable" +require "engine/sprite" +require "engine/animatedsprite" +require "functions/misc_functions" +require "game" +require "globals" +require "engine/ui" +require "functions/UI_definitions" +require "functions/state_events" +require "functions/common_events" +require "functions/button_callbacks" +require "functions/misc_functions" +require "functions/test_functions" +require "card" +require "cardarea" +require "blind" +require "card_character" +require "engine/particles" +require "engine/text" +require "challenges" + +math.randomseed( G.SEED ) + +function love.run() + if love.load then love.load(love.arg.parseGameArguments(arg), arg) end + + -- We don't want the first frame's dt to include time taken by love.load. + if love.timer then love.timer.step() end + + local dt = 0 + local dt_smooth = 1/100 + local run_time = 0 + + -- Main loop time. + return function() + run_time = love.timer.getTime() + -- Process events. + if love.event and G and G.CONTROLLER then + love.event.pump() + local _n,_a,_b,_c,_d,_e,_f,touched + for name, a,b,c,d,e,f in love.event.poll() do + if name == "quit" then + if not love.quit or not love.quit() then + return a or 0 + end + end + if name == 'touchpressed' then + touched = true + elseif name == 'mousepressed' then + _n,_a,_b,_c,_d,_e,_f = name,a,b,c,d,e,f + else + love.handlers[name](a,b,c,d,e,f) + end + end + if _n then + love.handlers['mousepressed'](_a,_b,_c,touched) + end + end + + -- Update dt, as we'll be passing it to update + if love.timer then dt = love.timer.step() end + dt_smooth = math.min(0.8*dt_smooth + 0.2*dt, 0.1) + -- Call update and draw + if love.update then love.update(dt_smooth) end -- will pass 0 if love.timer is disabled + + if love.graphics and love.graphics.isActive() then + if love.draw then love.draw() end + love.graphics.present() + end + + run_time = math.min(love.timer.getTime() - run_time, 0.1) + G.FPS_CAP = G.FPS_CAP or 500 + if run_time < 1./G.FPS_CAP then love.timer.sleep(1./G.FPS_CAP - run_time) end + end +end + +function love.load() + G:start_up() + --Steam integration + local os = love.system.getOS() + if os == 'OS X' or os == 'Windows' then + local st = nil + --To control when steam communication happens, make sure to send updates to steam as little as possible + if os == 'OS X' then + local dir = love.filesystem.getSourceBaseDirectory() + local old_cpath = package.cpath + package.cpath = package.cpath .. ';' .. dir .. '/?.so' + st = require 'luasteam' + package.cpath = old_cpath + else + st = require 'luasteam' + end + + st.send_control = { + last_sent_time = -200, + last_sent_stage = -1, + force = false, + } + if not (st.init and st:init()) then + love.event.quit() + end + --Set up the render window and the stage for the splash screen, then enter the gameloop with :update + G.STEAM = st + else + end + + --Set the mouse to invisible immediately, this visibility is handled in the G.CONTROLLER + love.mouse.setVisible(false) +end + +function love.quit() + --Steam integration + if G.SOUND_MANAGER then G.SOUND_MANAGER.channel:push({type = 'stop'}) end + if G.STEAM then G.STEAM:shutdown() end +end + +function love.update( dt ) + --Perf monitoring checkpoint + timer_checkpoint(nil, 'update', true) + G:update(dt) +end + +function love.draw() + --Perf monitoring checkpoint + timer_checkpoint(nil, 'draw', true) + G:draw() +end + +function love.keypressed(key) + if not _RELEASE_MODE and G.keybind_mapping[key] then love.gamepadpressed(G.CONTROLLER.keyboard_controller, G.keybind_mapping[key]) + else + G.CONTROLLER:set_HID_flags('mouse') + G.CONTROLLER:key_press(key) + end +end + +function love.keyreleased(key) + if not _RELEASE_MODE and G.keybind_mapping[key] then love.gamepadreleased(G.CONTROLLER.keyboard_controller, G.keybind_mapping[key]) + else + G.CONTROLLER:set_HID_flags('mouse') + G.CONTROLLER:key_release(key) + end +end + +function love.gamepadpressed(joystick, button) + button = G.button_mapping[button] or button + G.CONTROLLER:set_gamepad(joystick) + G.CONTROLLER:set_HID_flags('button', button) + G.CONTROLLER:button_press(button) +end + +function love.gamepadreleased(joystick, button) + button = G.button_mapping[button] or button + G.CONTROLLER:set_gamepad(joystick) + G.CONTROLLER:set_HID_flags('button', button) + G.CONTROLLER:button_release(button) +end + +function love.mousepressed(x, y, button, touch) + G.CONTROLLER:set_HID_flags(touch and 'touch' or 'mouse') + if button == 1 then + G.CONTROLLER:queue_L_cursor_press(x, y) + end + if button == 2 then + G.CONTROLLER:queue_R_cursor_press(x, y) + end +end + + +function love.mousereleased(x, y, button) + if button == 1 then G.CONTROLLER:L_cursor_release(x, y) end +end + +function love.mousemoved(x, y, dx, dy, istouch) + G.CONTROLLER.last_touch_time = G.CONTROLLER.last_touch_time or -1 + if next(love.touch.getTouches()) ~= nil then + G.CONTROLLER.last_touch_time = G.TIMERS.UPTIME + end + G.CONTROLLER:set_HID_flags(G.CONTROLLER.last_touch_time > G.TIMERS.UPTIME - 0.2 and 'touch' or 'mouse') +end + +function love.joystickaxis( joystick, axis, value ) + if math.abs(value) > 0.2 and joystick:isGamepad() then + G.CONTROLLER:set_gamepad(joystick) + G.CONTROLLER:set_HID_flags('axis') + end +end + +function love.errhand(msg) + if G.F_NO_ERROR_HAND then return end + msg = tostring(msg) + + if G.SETTINGS.crashreports and _RELEASE_MODE and G.F_CRASH_REPORTS then + local http_thread = love.thread.newThread([[ + local https = require('https') + CHANNEL = love.thread.getChannel("http_channel") + + while true do + --Monitor the channel for any new requests + local request = CHANNEL:demand() + if request then + https.request(request) + end + end + ]]) + local http_channel = love.thread.getChannel('http_channel') + http_thread:start() + local httpencode = function(str) + local char_to_hex = function(c) + return string.format("%%%02X", string.byte(c)) + end + str = str:gsub("\n", "\r\n"):gsub("([^%w _%%%-%.~])", char_to_hex):gsub(" ", "+") + return str + end + + + local error = msg + local file = string.sub(msg, 0, string.find(msg, ':')) + local function_line = string.sub(msg, string.len(file)+1) + function_line = string.sub(function_line, 0, string.find(function_line, ':')-1) + file = string.sub(file, 0, string.len(file)-1) + local trace = debug.traceback() + local boot_found, func_found = false, false + for l in string.gmatch(trace, "(.-)\n") do + if string.match(l, "boot.lua") then + boot_found = true + elseif boot_found and not func_found then + func_found = true + trace = '' + function_line = string.sub(l, string.find(l, 'in function')+12)..' line:'..function_line + end + + if boot_found and func_found then + trace = trace..l..'\n' + end + end + + http_channel:push('https://958ha8ong3.execute-api.us-east-2.amazonaws.com/?error='..httpencode(error)..'&file='..httpencode(file)..'&function_line='..httpencode(function_line)..'&trace='..httpencode(trace)..'&version='..(G.VERSION)) + end + + if not love.window or not love.graphics or not love.event then + return + end + + if not love.graphics.isCreated() or not love.window.isOpen() then + local success, status = pcall(love.window.setMode, 800, 600) + if not success or not status then + return + end + end + + -- Reset state. + if love.mouse then + love.mouse.setVisible(true) + love.mouse.setGrabbed(false) + love.mouse.setRelativeMode(false) + end + if love.joystick then + -- Stop all joystick vibrations. + for i,v in ipairs(love.joystick.getJoysticks()) do + v:setVibration() + end + end + if love.audio then love.audio.stop() end + love.graphics.reset() + local font = love.graphics.setNewFont("resources/fonts/m6x11plus.ttf", 20) + + love.graphics.setBackgroundColor(G.C.BLACK) + love.graphics.setColor(255, 255, 255, 255) + + love.graphics.clear(love.graphics.getBackgroundColor()) + love.graphics.origin() + + + local p = 'Oops! Something went wrong:\n'..msg..'\n\n'..(not _RELEASE_MODE and debug.traceback() or G.SETTINGS.crashreports and + 'Since you are opted in to sending crash reports, LocalThunk HQ was sent some useful info about what happened.\nDon\'t worry! There is no identifying or personal information. If you would like\nto opt out, change the \'Crash Report\' setting to Off' or + 'Crash Reports are set to Off. If you would like to send crash reports, please opt in in the Game settings.\nThese crash reports help us avoid issues like this in the future') + + local function draw() + local pos = love.window.toPixels(70) + love.graphics.clear(love.graphics.getBackgroundColor()) + love.graphics.printf(p, pos, pos, love.graphics.getWidth() - pos) + love.graphics.present() + end + + while true do + love.event.pump() + + for e, a, b, c in love.event.poll() do + if e == "quit" then + return + elseif e == "keypressed" and a == "escape" then + return + elseif e == "touchpressed" then + local name = love.window.getTitle() + if #name == 0 or name == "Untitled" then name = "Game" end + local buttons = {"OK", "Cancel"} + local pressed = love.window.showMessageBox("Quit "..name.."?", "", buttons) + if pressed == 1 then + return + end + end + end + + draw() + + if love.timer then + love.timer.sleep(0.1) + end + end + +end + +function love.resize(w, h) + if w/h < 1 then --Dont allow the screen to be too square, since pop in occurs above and below screen + h = w/1 + end + + --When the window is resized, this code resizes the Canvas, then places the 'room' or gamearea into the middle without streching it + if w/h < G.window_prev.orig_ratio then + G.TILESCALE = G.window_prev.orig_scale*w/G.window_prev.w + else + G.TILESCALE = G.window_prev.orig_scale*h/G.window_prev.h + end + + if G.ROOM then + G.ROOM.T.w = G.TILE_W + G.ROOM.T.h = G.TILE_H + G.ROOM_ATTACH.T.w = G.TILE_W + G.ROOM_ATTACH.T.h = G.TILE_H + + if w/h < G.window_prev.orig_ratio then + G.ROOM.T.x = G.ROOM_PADDING_W + G.ROOM.T.y = (h/(G.TILESIZE*G.TILESCALE) - (G.ROOM.T.h+G.ROOM_PADDING_H))/2 + G.ROOM_PADDING_H/2 + else + G.ROOM.T.y = G.ROOM_PADDING_H + G.ROOM.T.x = (w/(G.TILESIZE*G.TILESCALE) - (G.ROOM.T.w+G.ROOM_PADDING_W))/2 + G.ROOM_PADDING_W/2 + end + + G.ROOM_ORIG = { + x = G.ROOM.T.x, + y = G.ROOM.T.y, + r = G.ROOM.T.r + } + + if G.buttons then G.buttons:recalculate() end + if G.HUD then G.HUD:recalculate() end + end + + G.WINDOWTRANS = { + x = 0, y = 0, + w = G.TILE_W+2*G.ROOM_PADDING_W, + h = G.TILE_H+2*G.ROOM_PADDING_H, + real_window_w = w, + real_window_h = h + } + G.CANV_SCALE = 1 + + G.CANVAS = love.graphics.newCanvas(w*G.CANV_SCALE, h*G.CANV_SCALE, {type = '2d', readable = true}) + G.CANVAS:setFilter('linear', 'linear') +end diff --git a/resources/.DS_Store b/resources/.DS_Store new file mode 100644 index 0000000..101f210 Binary files /dev/null and b/resources/.DS_Store differ diff --git a/resources/fonts/GoNotoCJKCore.ttf b/resources/fonts/GoNotoCJKCore.ttf new file mode 100644 index 0000000..be659ac Binary files /dev/null and b/resources/fonts/GoNotoCJKCore.ttf differ diff --git a/resources/fonts/GoNotoCurrent-Bold.ttf b/resources/fonts/GoNotoCurrent-Bold.ttf new file mode 100644 index 0000000..665626a Binary files /dev/null and b/resources/fonts/GoNotoCurrent-Bold.ttf differ diff --git a/resources/fonts/NotoSans-Bold.ttf b/resources/fonts/NotoSans-Bold.ttf new file mode 100644 index 0000000..d84248e Binary files /dev/null and b/resources/fonts/NotoSans-Bold.ttf differ diff --git a/resources/fonts/NotoSansJP-Bold.ttf b/resources/fonts/NotoSansJP-Bold.ttf new file mode 100644 index 0000000..384f8eb Binary files /dev/null and b/resources/fonts/NotoSansJP-Bold.ttf differ diff --git a/resources/fonts/NotoSansKR-Bold.ttf b/resources/fonts/NotoSansKR-Bold.ttf new file mode 100644 index 0000000..6cf639e Binary files /dev/null and b/resources/fonts/NotoSansKR-Bold.ttf differ diff --git a/resources/fonts/NotoSansSC-Bold.ttf b/resources/fonts/NotoSansSC-Bold.ttf new file mode 100644 index 0000000..b9010df Binary files /dev/null and b/resources/fonts/NotoSansSC-Bold.ttf differ diff --git a/resources/fonts/NotoSansTC-Bold.ttf b/resources/fonts/NotoSansTC-Bold.ttf new file mode 100644 index 0000000..461a666 Binary files /dev/null and b/resources/fonts/NotoSansTC-Bold.ttf differ diff --git a/resources/fonts/m6x11plus.ttf b/resources/fonts/m6x11plus.ttf new file mode 100644 index 0000000..bc81cbc Binary files /dev/null and b/resources/fonts/m6x11plus.ttf differ diff --git a/resources/gamecontrollerdb.txt b/resources/gamecontrollerdb.txt new file mode 100644 index 0000000..13f8dea --- /dev/null +++ b/resources/gamecontrollerdb.txt @@ -0,0 +1,1515 @@ +# Game Controller DB for SDL in 2.0.16 format +# Source: https://github.com/gabomdq/SDL_GameControllerDB + +# Windows +03000000fa2d00000100000000000000,3DRUDDER,leftx:a0,lefty:a1,rightx:a5,righty:a2,platform:Windows, +03000000d0160000040d000000000000,4Play,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000050d000000000000,4Play,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000060d000000000000,4Play,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000070d000000000000,4Play,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000d0160000600a000000000000,4Play,a:b1,b:b3,back:b4,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,leftstick:b14,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b15,righttrigger:b9,rightx:a3,righty:a4,start:b5,x:b0,y:b2,platform:Windows, +03000000c82d00000951000000000000,8BitDo Dogbone Modkit,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows, +03000000008000000210000000000000,8BitDo F30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000003512000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000c82d00001028000000000000,8BitDo F30 Arcade Joystick,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d000011ab000000000000,8BitDo F30 Arcade Joystick,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000801000000900000000000000,8BitDo F30 Arcade Stick,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001038000000000000,8BitDo F30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000090000000000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000650000000000000,8BitDo M30,a:b0,b:b1,back:b10,guide:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00005106000000000000,8BitDo M30,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b2,start:b11,leftshoulder:b8,rightshoulder:b6,dpup:-a2,dpdown:+a2,dpleft:-a0,dpright:+a0,lefttrigger:b9,righttrigger:b7,platform:Windows, +03000000c82d00000151000000000000,8BitDo M30 ModKit,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000310000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00002028000000000000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00008010000000000000,8BitDo N30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d0000e002000000000000,8BitDo N30,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b6,platform:Windows, +03000000c82d00000451000000000000,8BitDo N30 Modkit,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,start:b11,platform:Windows, +03000000c82d00000190000000000000,8BitDo N30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001590000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006528000000000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000290000000000000,8Bitdo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows, +03000000c82d00003038000000000000,8Bitdo N64,+rightx:b9,+righty:b3,-rightx:b4,-righty:b8,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,platform:Windows, +03000000c82d000012ab000000000000,8BitDo NES30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000022000000090000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000203800000900000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00002038000000000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000751000000000000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000360000000000000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00002867000000000000,8BitDo S30 Modkit,a:b0,b:b1,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b8,lefttrigger:b9,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000130000000000000,8BitDo SF30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000060000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000061000000000000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000021ab000000000000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000102800000900000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00003028000000000000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000030000000000000,8BitDo SN30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001290000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d000020ab000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00004028000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00006228000000000000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000351000000000000,8BitDo SN30 Modkit,a:b1,b:b0,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000021000000000000,8BitDo SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000121000000000000,8BitDo SN30 Pro for Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000031000000000000,8BitDo Wireless Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000a00500003232000000000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, +03000000d81d00000e00000000000000,AC02,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows, +030000008f0e00001200000000000000,Acme GA02,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000c01100000355000000000000,Acrux,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fa190000f0ff000000000000,Acteck AGJ 3200,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006d0400000bc2000000000000,Action Pad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:a5~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:a2~,start:b8,x:b3,y:b4,platform:Windows, +03000000d1180000402c000000000000,ADT1,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a3,rightx:a2,righty:a5,x:b3,y:b4,platform:Windows, +030000006f0e00001301000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001302000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001304000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001413000000000000,Afterglow,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00003901000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ab1200000103000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000000f9000000000000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00003608000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000263000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001101000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001401000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001402000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001901000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001a01000000000000,Afterglow PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000491900001904000000000000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000710100001904000000000000,Amazon Luna Controller,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b8,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b4,rightstick:b7,rightx:a3,righty:a4,start:b6,x:b3,y:b2,platform:Windows, +03000000830500000160000000000000,Arcade,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b4,platform:Windows, +03000000120c0000100e000000000000,Armor 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000ef0500000300000000000000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +03000000fd0500000230000000000000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows, +03000000d6200000e557000000000000,Batarang,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000e4150000103f000000000000,Batarang,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows, +030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ad1b000001f9000000000000,BB 070,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000bc2000005250000000000000,Beitong G3,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a3,righty:a4,start:b15,x:b3,y:b4,platform:Windows, +030000000d0500000208000000000000,Belkin Nostromo N40,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000000055000000000000,Betop BFM Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000bc2000006312000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006321000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000bc2000006412000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000555000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000655000000000000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000790000000700000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000808300000300000000000000,Betop Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00006401000000000000,BF One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000300f00000202000000000000,Bigben,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a5,righty:a2,start:b7,x:b2,y:b3,platform:Windows, +030000006b1400000209000000000000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000380700008232000000000000,Brawlpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +0300000066f700000500000000000000,BrutalLegendTest,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000d81d00000b00000000000000,BUFFALO BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows, +030000006d04000042c2000000000000,ChillStream,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000e82000006058000000000000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000457500000401000000000000,Cobra,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000b0400003365000000000000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +030000004c050000c505000000000000,CronusMax Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d814000007cd000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d8140000cefa000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000260900008888000000000000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a4,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Windows, +030000003807000002cb000000000000,Cyborg,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000a306000022f6000000000000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000f806000000a3000000000000,DA Leader,a:b7,b:b6,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b8,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:b3,rightx:a2,righty:a3,start:b12,x:b4,y:b5,platform:Windows, +030000001a1c00000001000000000000,Datel,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000451300000830000000000000,Defender Game Racer X7,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000007d0400000840000000000000,Destroyer Tiltpad,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b1,b:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,x:b0,y:b3,platform:Windows, +03000000c0160000e105000000000000,Dual,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000791d00000103000000000000,Dual Box WII,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000007c1800000006000000000000,Dual Compat,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +030000004f040000070f000000000000,Dual Power,a:b8,b:b9,back:b4,dpdown:b1,dpleft:b2,dpright:b3,dpup:b0,leftshoulder:b13,leftstick:b6,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b12,rightstick:b7,righttrigger:b15,start:b5,x:b10,y:b11,platform:Windows, +030000004f04000012b3000000000000,Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000020b3000000000000,Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +03000000bd12000002e0000000000000,Dual USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000ff1100003133000000000000,DualForce,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b1,platform:Windows, +030000008f0e00000910000000000000,DualShock 2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000317300000100000000000000,DualShock 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000006f0e00003001000000000000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fc0400000250000000000000,Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +030000006e0500000a20000000000000,Elecom DUX60 MMO Gamepad,a:b2,b:b3,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b14,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b15,righttrigger:b13,rightx:a3,righty:a4,start:b20,x:b0,y:b1,platform:Windows, +03000000b80500000410000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000b80500000610000000000000,Elecom Gamepad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +030000006e0500000520000000000000,Elecom P301U,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +03000000411200004450000000000000,Elecom U1012,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000320000000000000,Elecom U3613M (DInput),a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000e20000000000000,Elecom U3912T,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000f20000000000000,Elecom U4013S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500001320000000000000,Elecom U4113,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006e0500001020000000000000,Elecom U4113S,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +030000006e0500000720000000000000,Elecom W01U,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, +03000000120c0000f61c000000000000,Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000430b00000300000000000000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000242f000000b7000000000000,ESM 9110,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows, +03000000101c0000181c000000000000,Essential,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b4,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00000f31000000000000,EXEQ,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000341a00000108000000000000,EXEQ RF USB Gamepad 8206,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000790000003018000000000000,F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00003900000000000000,F300 Elite,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008401000000000000,Faceoff Deluxe Audio Wired Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008001000000000000,Faceoff Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000021000000090000000000000,FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Windows, +0300000011040000c600000000000000,FC801,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +030000004f04000008d0000000000000,Ferrari 150,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000852100000201000000000000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008500000000000000,Fighting Commander 2016 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008400000000000000,Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008700000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008800000000000000,Fighting Stick mini 4,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +030000000d0f00002700000000000000,FIGHTING STICK V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000380700002847000000000000,FightPad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000028f0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b00002ef0000000000000,Fightpad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000038f0000000000000,Fightpad TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700001847000000000000,FightStick,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700008031000000000000,FightStick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008731000000000000,FightStick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000003807000038b7000000000000,FightStick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +78696e70757403000000000000000000,Fightstick TES,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000f806000001a3000000000000,Firestorm,a:b9,b:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b0,leftstick:b10,lefttrigger:b1,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b12,x:b8,y:b4,platform:Windows, +03000000b50700000399000000000000,Firestorm 2,a:b2,b:b4,back:b10,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,righttrigger:b9,start:b11,x:b3,y:b5,platform:Windows, +03000000b50700001302000000000000,Firestorm D3,a:b0,b:b2,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,x:b1,y:b3,platform:Windows, +03000000b40400001024000000000000,Flydigi Apex,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000151900004000000000000000,Flydigi Vader 2,a:b11,b:b10,back:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,leftstick:b1,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b0,righttrigger:b4,rightx:a3,righty:a4,start:b2,x:b9,y:b8,platform:Windows, +03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Windows, +030000008305000000a0000000000000,G08XU,a:b0,b:b1,back:b4,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b5,x:b2,y:b3,platform:Windows, +03000000ac0500002d02000000000000,G2U,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000790000002201000000000000,Game Controller for PC,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +0300000066f700000100000000000000,Game VIB Joystick,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Windows, +03000000341a000005f7000000000000,GameCube,a:b2,b:b3,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b1,y:b0,platform:Windows, +03000000430b00000500000000000000,GameCube,a:b0,b:b2,dpdown:b10,dpleft:b8,dpright:b9,dpup:b11,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a3,rightx:a5,righty:a2,start:b7,x:b1,y:b3,platform:Windows, +03000000790000004718000000000000,GameCube,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000260900002625000000000000,Gamecube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,lefttrigger:a4,leftx:a0,lefty:a1,righttrigger:a5,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Windows, +03000000790000004618000000000000,GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +030000008f0e00000d31000000000000,Gamepad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000280400000140000000000000,GamePad Pro USB,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000ac0500003d03000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ac0500004d04000000000000,GameSir,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00001110000000000000,GameStick Bluetooth Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +0300000047530000616d000000000000,GameStop,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000ffff00000000000000000000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000b62500000100000000000000,Gametel GT004 01,a:b3,b:b0,dpdown:b10,dpleft:b9,dpright:b8,dpup:b11,leftshoulder:b4,rightshoulder:b5,start:b7,x:b1,y:b2,platform:Windows, +030000008f0e00001411000000000000,Gamo2 Divaller PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000a857000000000000,Gator Claw,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000c9110000f055000000000000,GC100XF,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008305000009a0000000000000,Genius,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008305000031b0000000000000,Genius Maxfire Blaze 3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000451300000010000000000000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000005c1a00003330000000000000,Genius MaxFire Grandias 12V,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000300f00000b01000000000000,GGE909 Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c283000000000000,Gioteck,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f025000021c1000000000000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c383000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000f0250000c483000000000000,Gioteck VX2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000004f04000026b3000000000000,GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +0300000079000000d418000000000000,GPD Win,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000025b000000000000,GPX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000007d0400000540000000000000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000007d0400000340000000000000,Gravis G44011 Xterminator,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a2,start:b9,x:b3,y:b4,platform:Windows, +030000008f0e00000610000000000000,GreenAsia,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a5,righty:a2,start:b11,x:b3,y:b0,platform:Windows, +03000000ac0500006b05000000000000,GT2a,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000341a00000302000000000000,Hama Scorpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fd0500003902000000000000,Hammerhead,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b2,lefttrigger:b8,rightshoulder:b7,rightstick:b5,righttrigger:b9,start:b10,x:b0,y:b1,platform:Windows, +03000000fd0500002a26000000000000,Hammerhead FX,a:b3,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b0,y:b1,platform:Windows, +03000000fd0500002f26000000000000,Hammerhead FX,a:b4,b:b5,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b1,y:b2,platform:Windows, +030000000d0f00004900000000000000,Hatsune Miku Sho Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000001008000001e1000000000000,Havit HV G60,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows, +030000000d0f00000c00000000000000,HEXT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d81400000862000000000000,HitBox Edition Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +03000000632500002605000000000000,HJD X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f00000a00000000000000,Hori DOA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008600000000000000,Hori Fighting Commander,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000ba00000000000000,Hori Fighting Commander,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005100000000000000,Hori Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001000000000000000,Hori Fighting Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000f0d00000010000000000000,Hori Fighting Stick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003200000000000000,Hori Fighting Stick 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c000000000000000,Hori Fighting Stick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00000d00000000000000,Hori Fighting Stick EX2,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00003701000000000000,Hori Fighting Stick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Windows, +030000000d0f00004000000000000000,Hori Fighting Stick Mini 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b4,rightshoulder:b7,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002100000000000000,Hori Fighting Stick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows, +030000000d0f00000101000000000000,Hori Mini Hatsune Miku FT,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004d00000000000000,Hori Pad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003801000000000000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Windows, +030000000d0f00009200000000000000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001100000000000000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002600000000000000,Hori Real Arcade Pro 3P,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004b00000000000000,Hori Real Arcade Pro 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008a00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00008b00000000000000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006f00000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00007000000000000000,Hori Real Arcade Pro 4 VLX,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00003d00000000000000,Hori Real Arcade Pro N3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b4,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b6,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000ae00000000000000,Hori Real Arcade Pro N4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f00008c00000000000000,Hori Real Arcade Pro P4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000aa00000000000000,Hori Real Arcade Pro S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000d800000000000000,Hori Real Arcade Pro S,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00002200000000000000,Hori Real Arcade Pro V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005b00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005c00000000000000,Hori Real Arcade Pro V4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000af00000000000000,Hori Real Arcade Pro VHS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001b00000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000002f5000000000000,Hori Real Arcade Pro VX,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b07,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b08,righttrigger:b11,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00009c00000000000000,Hori TAC Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000c900000000000000,Hori Taiko Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002301000000000000,Hori Wired PS4 Controller Light,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000000d0f0000c100000000000000,Horipad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006400000000000000,Horipad 3TP,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00001300000000000000,Horipad 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006e00000000000000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006600000000000000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00004200000000000000,Horipad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005b1c00002400000000000000,Horipad Mini,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, +030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008f0e00001330000000000000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Windows, +03000000d81d00000f00000000000000,iBUFFALO BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d81d00001000000000000000,iBUFFALO BSGP1204P Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000005c0a00000285000000000000,iDroidCon,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b6,platform:Windows, +03000000696400006964000000000000,iDroidCon Bluetooth Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000b50700001403000000000000,Impact Black,a:b2,b:b3,back:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +030000006f0e00002401000000000000,Injustice FightStick PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000830500005130000000000000,InterAct ActionPad,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000fd0500005302000000000000,InterAct ProPad,a:b3,b:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,x:b0,y:b1,platform:Windows, +03000000ac0500002c02000000000000,Ipega Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000491900000204000000000000,Ipega PG9023,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000491900000304000000000000,Ipega PG9087 - Bluetooth Gamepad,+righty:+a5,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows, +030000007e0500000620000000000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Windows, +030000007e0500000720000000000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000bd12000003c0000000000000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000250900000017000000000000,Joypad to USB Adapter,a:b2,b:b1,back:b9,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b8,x:b3,y:b0,platform:Windows, +03000000ff1100004033000000000000,JPD FFB,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a2,start:b15,x:b3,y:b0,platform:Windows, +03000000242f00002d00000000000000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000242f00008a00000000000000,JYS Wireless Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +03000000c4100000c082000000000000,KADE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000828200000180000000000000,Keio,a:b4,b:b5,back:b8,leftshoulder:b2,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b1,platform:Windows, +03000000790000000200000000000000,King PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000bd12000001e0000000000000,Leadership,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000006f0e00000103000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00000104000000000000,Logic3,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008f0e00001300000000000000,Logic3,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000006d040000d1ca000000000000,Logitech ChillStream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d040000d2ca000000000000,Logitech Cordless Precision,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000011c2000000000000,Logitech Cordless Wingman,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows, +030000006d04000016c2000000000000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001dc2000000000000,Logitech F310,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d0400001ec2000000000000,Logitech F510,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d04000018c2000000000000,Logitech F510 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006d04000019c2000000000000,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d0400001ac2000000000000,Logitech Precision Gamepad,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000009c2000000000000,Logitech WingMan,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000006d0400000ac2000000000000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows, +03000000380700005645000000000000,Lynx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000222200006000000000000000,Macally,a:b1,b:b2,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700003888000000000000,Mad Catz Arcade Fightstick TE S Plus PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008532000000000000,Mad Catz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006352000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006652000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000380700005032000000000000,Mad Catz FightPad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700005082000000000000,Mad Catz FightPad PRO PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008433000000000000,Mad Catz FightStick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008483000000000000,Mad Catz FightStick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008134000000000000,Mad Catz FightStick TE2 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008184000000000000,Mad Catz FightStick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700006252000000000000,Mad Catz Micro CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000380700001888000000000000,Mad Catz SFIV FightStick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000380700008081000000000000,Mad Catz SFV Arcade FightStick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, +03000000790000004418000000000000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000790000004318000000000000,Mayflash GameCube Controller Adapter,a:b1,b:b2,back:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b4,leftstick:b0,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b0,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000008f0e00001030000000000000,Mayflash USB Adapter for original Sega Saturn controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows, +0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000002418000000000000,Mega Drive,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows, +0300000079000000ae18000000000000,Mega Drive,a:b0,b:b1,back:b7,dpdown:b14,dpleft:b15,dpright:b13,dpup:b2,rightshoulder:b6,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000c0160000990a000000000000,Mega Drive,a:b0,b:b1,leftx:a0,lefty:a1,righttrigger:b2,start:b3,platform:Windows, +030000005e0400000300000000000000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000005e0400000700000000000000,Microsoft SideWinder,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +030000005e0400000e00000000000000,Microsoft SideWinder Freestyle Pro,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b8,x:b3,y:b4,platform:Windows, +030000005e0400002700000000000000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Windows, +03000000280d00000202000000000000,Miller Lite Cantroller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b5,x:b2,y:b3,platform:Windows, +030000005b1c00002500000000000000,Mini,a:b3,b:b4,back:b7,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b6,x:b0,y:b1,platform:Windows, +03000000ad1b000023f0000000000000,MLG,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a6,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000ad1b00003ef0000000000000,MLG FightStick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000380700006382000000000000,MLG GamePad PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d6200000e589000000000000,Moga 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000007162000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +03000000d6200000ad0d000000000000,Moga Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400002a89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400002b89000000000000,Moga XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400001a89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c62400001b89000000000000,Moga XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000efbe0000edfe000000000000,Monect Virtual Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000250900006688000000000000,MP-8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows, +030000006b140000010c000000000000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006b1400001106000000000000,Nacon Revolution 3 PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000100d000000000000,Nacon Revolution Infinity PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000080d000000000000,Nacon Revolution Unlimited Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000bd12000001c0000000000000,Nebular,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000eb0300000000000000000000,NeGcon USB Adapter,a:a2,b:b13,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,lefttrigger:a4,leftx:a1,righttrigger:b11,start:b3,x:a3,y:b12,platform:Windows, +0300000038070000efbe000000000000,NEO SE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000921200004b46000000000000,NES 2 port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Windows, +03000000000f00000100000000000000,NES Controller,a:b1,b:b0,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +03000000571d00002100000000000000,NES Controller,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +03000000921200004346000000000000,NES Controller,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +03000000790000004518000000000000,NEXILUX GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +030000001008000001e5000000000000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Windows, +03000000050b00000045000000000000,Nexus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Windows, +03000000152000000182000000000000,NGDS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +030000007e0500001920000000000000,Nintendo Switch N64 Controller,+rightx:b8,+righty:b2,-rightx:b3,-righty:b7,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,start:b9,platform:Windows, +030000007e0500001720000000000000,Nintendo Switch Online Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows, +030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000000d0500000308000000000000,Nostromo N45,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Windows, +03000000d620000013a7000000000000,NSW wired controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000550900001472000000000000,NVIDIA Controller v01.04,a:b11,b:b10,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b5,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b4,righttrigger:a5,rightx:a3,righty:a6,start:b3,x:b9,y:b8,platform:Windows, +03000000550900001072000000000000,NVIDIA Shield,a:b9,b:b8,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b3,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b2,righttrigger:a4,rightx:a2,righty:a5,start:b0,x:b7,y:b6,platform:Windows, +030000005509000000b4000000000000,NVIDIA Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c00000288000000000000,Nyko Air Flo Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000004b120000014d000000000000,Nyko Airflo,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a3,leftstick:a0,lefttrigger:b6,rightshoulder:b5,rightstick:a2,righttrigger:b7,start:b9,x:b2,y:b3,platform:Windows, +03000000d62000001d57000000000000,Nyko Airflo PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000782300000a10000000000000,Onlive Wireless Controller,a:b15,b:b14,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b11,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b13,y:b12,platform:Windows, +030000000d0f00000401000000000000,Onyx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008916000001fd000000000000,Onza CE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a3,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000008916000000fd000000000000,Onza TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000006d57000000000000,OPP PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006b14000001a1000000000000,Orange Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows, +03000000362800000100000000000000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,x:b1,y:b2,platform:Windows, +03000000120c0000f60e000000000000,P4 Wired Gamepad,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b7,rightshoulder:b4,righttrigger:b6,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00008501000000000000,PDP Fightpad Pro,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Windows, +030000006f0e00000901000000000000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000d9040000160f000000000000,Playstation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000004c0500003713000000000000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000d62000006dca000000000000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006d04000084ca000000000000,Precision,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000d62000009557000000000000,Pro Elite PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c62400001a53000000000000,Pro Ex Mini,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000d62000009f31000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d6200000c757000000000000,Pro Ex mini PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000110e000000000000,Pro5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000632500002306000000000000,PS Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000e30500009605000000000000,PS to USB convert cable,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000100800000100000000000000,PS1 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00007530000000000000,PS1 Controller,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b1,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000100800000300000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000666600006706000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, +030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000250900000088000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900006888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b6,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000120a00000100000000000000,PS3 Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000120c00001307000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c00001cf1000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f90e000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000250900000118000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000218000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows, +030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows, +030000004f1f00000800000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, +03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,leftshoulder:b10,leftstick:b1,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows, +030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ba2200002010000000000000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows, +030000003807000056a8000000000000,PS3 RF pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000100000008200000000000000,PS360 v1.66,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:h0.4,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +03000000120c00000807000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000111e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000121e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000130e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000150e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000180e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000181e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000191e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f10e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f51c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120c0000f70e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000120e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000160e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000001a1e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000ff000000cb01000000000000,PSP,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000830500005020000000000000,PSX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Windows, +03000000300f00000111000000000000,Qanba 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00000211000000000000,Qanba 2P,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000300f00000011000000000000,Qanba Arcade Stick 1008,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b10,x:b0,y:b3,platform:Windows, +03000000300f00001611000000000000,Qanba Arcade Stick 4018,a:b1,b:b2,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows, +03000000222c00000020000000000000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001211000000000000,Qanba Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001210000000000000,Qanba Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows, +03000000341a00000104000000000000,Qanba Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows, +03000000222c00000223000000000000,Qanba Obsidian Arcade Stick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000008a2400006682000000000000,R1 Mobile Controller,a:b3,b:b1,back:b7,leftx:a0,lefty:a1,start:b6,x:b4,y:b0,platform:Windows, +03000000086700006626000000000000,RadioShack,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +030000009b2800002300000000000000,Raphnet Technologies 3DO USB Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows, +030000009b2800006900000000000000,Raphnet Technologies 3DO USB Adapter,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b2,start:b3,platform:Windows, +030000009b2800000800000000000000,Raphnet Technologies Dreamcast USB Adapter,a:b2,b:b1,dpdown:b5,dpleft:b6,dpright:b7,dpup:b4,lefttrigger:a2,leftx:a0,righttrigger:a3,righty:a1,start:b3,x:b10,y:b9,platform:Windows, +030000009b2800003200000000000000,Raphnet Technologies GC/N64 to USB v3.4,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000009b2800006000000000000000,Raphnet Technologies GC/N64 to USB v3.6,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:+a2,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Windows, +030000009b2800001800000000000000,Raphnet Technologies Jaguar USB Adapter,a:b2,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b0,righttrigger:b10,start:b3,x:b11,y:b12,platform:Windows, +030000009b2800000200000000000000,Raphnet Technologies NES USB Adapter,a:b7,b:b6,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,start:b4,platform:Windows, +030000009b2800004300000000000000,Raphnet Technologies Saturn,a:b0,b:b1,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000009b2800000500000000000000,Raphnet Technologies Saturn Adapter 2.0,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +030000009b2800000300000000000000,Raphnet Technologies SNES USB Adapter,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +030000009b2800005600000000000000,Raphnet Technologies SNES USB Adapter,a:b1,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800005700000000000000,Raphnet Technologies SNES USB Adapter,a:b1,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800001e00000000000000,Raphnet Technologies Vectrex USB Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a1,lefty:a2,x:b2,y:b3,platform:Windows, +030000009b2800002b00000000000000,Raphnet Technologies Wii Classic USB Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +030000009b2800002c00000000000000,Raphnet Technologies Wii Classic USB Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Windows, +03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000321500000204000000000000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000321500000710000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000a10000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000410000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000011000000000000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +03000000830500006020000000000000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, +03000000bd12000013d0000000000000,Retrolink USB Sega Saturn Classic,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,lefttrigger:b6,rightshoulder:b2,righttrigger:b7,start:b8,x:b3,y:b4,platform:Windows, +03000000bd12000015d0000000000000,Retrolink USB Super SNES Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +0300000000f000000300000000000000,RetroUSB.com RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, +0300000000f00000f100000000000000,RetroUSB.com Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, +03000000830500000960000000000000,Revenger,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b5,platform:Windows, +030000006b140000010d000000000000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000020d000000000000,Revolution Pro Controller 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006b140000130d000000000000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00001f01000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00004601000000000000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000fefa000000000000,Rock Candy Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e00001e01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00002801000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00002f01000000000000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000001d0000000000000,Rumble Force,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000003d0000000000000,Run N Drive,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b7,leftshoulder:a3,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:a4,rightstick:b11,righttrigger:b5,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000009d0000000000000,Run N Drive,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000008916000000fe000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000045d000000000000,Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000a30600001af5000000000000,Saitek Cyborg,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000023f6000000000000,Saitek Cyborg V.1 Game pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001201000000000000,Saitek Dual Analog Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000a30600000701000000000000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Windows, +03000000a30600000cff000000000000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b0,y:b1,platform:Windows, +03000000a30600000d5f000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000a30600000dff000000000000,Saitek P2600,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b8,x:b0,y:b3,platform:Windows, +03000000a30600000c04000000000000,Saitek P2900,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000018f5000000000000,Saitek P3200,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001001000000000000,Saitek P480 Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000a30600000901000000000000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b8,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b5,rightx:a3,righty:a2,x:b0,y:b1,platform:Windows, +03000000a30600000b04000000000000,Saitek P990,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Windows, +03000000a30600002106000000000000,Saitek PS1000,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000a306000020f6000000000000,Saitek PS2700,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Windows, +03000000300f00001101000000000000,Saitek Rumble Pad,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000e804000000a0000000000000,Samsung EIGP20,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c01100000252000000000000,Sanwa Easy Grip,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000c01100004350000000000000,Sanwa Micro Grip P3,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,x:b3,y:b2,platform:Windows, +03000000411200004550000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a1,righty:a2,start:b9,x:b1,y:b3,platform:Windows, +03000000c01100004150000000000000,Sanwa Micro Grip Pro,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +03000000c01100004450000000000000,Sanwa Online Grip,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b11,righttrigger:b9,rightx:a3,righty:a2,start:b14,x:b3,y:b4,platform:Windows, +03000000730700000401000000000000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Windows, +03000000830500006120000000000000,Sanwa Smart Grip II,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,x:b1,y:b3,platform:Windows, +03000000c01100000051000000000000,Satechi Bluetooth Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +030000004f04000028b3000000000000,Score A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows, +03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, +0300000000050000289b000000000000,Sega Saturn Adapter 2,a:b1,b:b2,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows, +0300000000f000000800000000000000,Sega Saturn Controller,a:b1,b:b2,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b3,start:b0,x:b5,y:b6,platform:Windows, +03000000730700000601000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows, +03000000b40400000a01000000000000,Sega Saturn Controller,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows, +030000003b07000004a1000000000000,SFX,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Windows, +03000000120c00001c1e000000000000,SnakeByte GamePad 4S PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +0300000003040000c197000000000000,SNES Controller,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +03000000571d00002000000000000000,SNES Controller,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +0300000081170000960a000000000000,SNES Controller,a:b4,b:b0,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b5,y:b1,platform:Windows, +03000000811700009d0a000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +030000008b2800000300000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +03000000921200004653000000000000,SNES Controller,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows, +03000000341a00000208000000000000,Speedlink 6555,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:-a4,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a3,righty:a2,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000908000000000000,Speedlink 6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000008f0e00000800000000000000,Speedlink Strike FX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000c01100000591000000000000,Speedlink Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, +03000000de280000fc11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000de280000ff11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c0000160e000000000000,Steel Play Metaltech PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, +03000000110100003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000001814000000000000,SteelSeries Stratus XL,a:b0,b:b1,back:b18,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b19,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b2,y:b3,platform:Windows, +03000000790000001c18000000000000,STK 7024X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000381000003014000000000000,Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000381000003114000000000000,Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700003847000000000000,Street Fighter Fighting Stick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows, +030000001f08000001e4000000000000,Super Famicom Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000790000000418000000000000,Super Famicom Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000d620000011a7000000000000,Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f0000f600000000000000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000457500002211000000000000,Szmy Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +030000004f0400000ab1000000000000,T16000M,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b10,x:b2,y:b3,platform:Windows, +030000000d0f00007b00000000000000,TAC GEAR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000d814000001a0000000000000,TE Kitty,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000fa1900000706000000000000,Team 5,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000b50700001203000000000000,Techmobility X6-38V,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000ba2200000701000000000000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b2,platform:Windows, +03000000c61100001000000000000000,Tencent Xianyou Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows, +03000000790000002601000000000000,TGZ,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +030000004f04000015b3000000000000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000004f04000023b3000000000000,Thrustmaster Dual Trigger 3 in 1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f0400000ed0000000000000,ThrustMaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Windows, +030000004f04000004b3000000000000,Thrustmaster Firestorm Dual Power 3,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Windows, +030000006d04000088ca000000000000,Thunderpad,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000666600000488000000000000,TigerGame PS/PS2 Game Controller Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000004f04000007d0000000000000,TMini Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000d62000006000000000000000,Tournament PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000c01100000055000000000000,Tronsmart,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000005f140000c501000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000b80500000210000000000000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000004f04000087b6000000000000,TWCS Throttle,dpdown:b8,dpleft:b9,dpright:b7,dpup:b6,leftstick:b5,lefttrigger:-a5,leftx:a0,lefty:a1,righttrigger:+a5,platform:Windows, +03000000411200000450000000000000,Twin Shock,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows, +03000000d90400000200000000000000,TwinShock PS2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000101c0000171c000000000000,uRage Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +030000000b0400003065000000000000,USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000242f00006e00000000000000,USB Game Controller,a:b1,b:b4,back:b10,leftshoulder:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b7,rightx:a2,righty:a5,start:b11,x:b0,y:b3,platform:Windows, +03000000300f00000701000000000000,USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000341a00002308000000000000,USB Game Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000666600000188000000000000,USB Game Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +03000000666600000288000000000000,USB Game Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, +030000006b1400000203000000000000,USB Game Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000790000000a00000000000000,USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b3,y:b0,platform:Windows, +03000000b404000081c6000000000000,USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows, +03000000b50700001503000000000000,USB Game Controller,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b0,y:b1,platform:Windows, +03000000bd12000012d0000000000000,USB Game Controller,a:b0,b:b1,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows, +03000000f0250000c183000000000000,USB Game Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000ff1100004133000000000000,USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000632500002305000000000000,USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000790000001a18000000000000,Venom,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000302000000000000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +030000006f0e00000702000000000000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, +0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows, +03000000120c0000ab57000000000000,Warrior Joypad JS083,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000007e0500003003000000000000,WiiU Pro,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b6,leftstick:b11,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b12,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +0300000032150000030a000000000000,Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000ff02000000000000,Wired Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000ea02000000000000,Wireless Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +0300000032150000140a000000000000,Wolverine,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000002e160000efbe000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b10,rightshoulder:b5,righttrigger:b11,start:b7,x:b2,y:b3,platform:Windows, +03000000380700001647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700002045000000000000,Xbox 360 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +03000000380700002644000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a5,start:b8,x:b2,y:b3,platform:Windows, +03000000380700002647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000003807000026b7000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700003647000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a7,righty:a5,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400001907000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400009102000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000000fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000001fd000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b000016f0000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000ad1b00008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400000053000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c6240000fdfa000000000000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000a102000000000000,Xbox 360 Wireless Receiver,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000120c00000a88000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000120c00001088000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2~,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5~,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000002a0600002000000000000000,Xbox Controller,a:b0,b:b1,back:b13,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b5,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b15,righttrigger:b7,rightx:a2,righty:a5,start:b12,x:b2,y:b3,platform:Windows, +03000000300f00008888000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:b13,dpleft:b10,dpright:b11,dpup:b12,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700001645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700002645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000380700003645000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +03000000380700008645000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000202000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000005e0400008502000000000000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400008702000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000005e0400008902000000000000,Xbox Controller,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b10,leftstick:b8,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b9,righttrigger:b4,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, +030000000d0f00006300000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e0400000c0b000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000e302000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000fd02000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e0000a802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000006f0e0000c802000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000c62400003a54000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +030000005e040000130b000000000000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000341a00000608000000000000,Xeox,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +03000000450c00002043000000000000,Xeox Gamepad SL6556BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, +030000006f0e00000300000000000000,XGear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, +03000000ac0500005b05000000000000,Xiaoji Gamesir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, +03000000172700004431000000000000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, +03000000786901006e70000000000000,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000790000004f18000000000000,ZDT Android Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000120c0000101e000000000000,Zeroplus P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, +030000000d0f00002500000000000000,Hori Fighting Commander 3,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b12,start:b9,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,lefttrigger:b6,righttrigger:b7,platform:Windows, +03000000490b00004406000000000000,ASCII Seamic Controller,a:b0,b:b1,x:b3,y:b4,back:b8,start:b9,leftshoulder:b6,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,lefttrigger:b7,righttrigger:b2,platform:Windows, +030000005e0400002800000000000000,Microsoft Dual Strike,a:b3,b:b2,x:b1,y:b0,back:b4,start:b5,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,rightx:a0,righty:a1~,platform:Windows, + +# Mac OS X +030000008f0e00000300000009010000,2In1 USB Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000c82d00000090000001000000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001038000000010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000650000001000000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00005106000000010000,8BitDo M30 Gamepad,a:b1,b:b0,back:b10,guide:b2,leftshoulder:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001590000001000000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d000012ab000001000000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00002028000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +030000003512000012ab000001000000,8BitDo NES30 Gamepad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000022000000090000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000190000001000000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000102800000900000000000000,8Bitdo SFC30 GamePad Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001290000001000000,8BitDo SN30 Gamepad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00004028000000010000,8Bitdo SN30 GamePad,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000031000001000000,8BitDo Wireless Adapter,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a31,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000a00500003232000009010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000491900001904000001010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +03000000a30c00002700000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000a30c00002800000003030000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000ef0500000300000000020000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X, +03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X, +03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000120c0000200e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000120c0000210e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d8140000cecf000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000a306000022f6000001030000,Cyborg V.3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008400000000010000,Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00008500000000010000,Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle3:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Mac OS X, +03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, +03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006f0e00000102000000000000,GameStop Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000007d0400000540000001010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000280400000140000000020000,Gravis Gamepad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00000300000007010000,GreenAsia USB Joystick,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Mac OS X, +030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005f00000000010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f00006600000000000000,Horipad FPS Plus 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00001330000011010000,HuiJia SNES Controller,a:b4,b:b2,back:b16,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b12,rightshoulder:b14,start:b18,x:b6,y:b0,platform:Mac OS X, +03000000830500006020000000000000,iBuffalo Gamepad,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Mac OS X, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000242f00002d00000007010000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006d04000016c2000000020000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000030000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000014040000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000016c2000000000000,Logitech F310 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000018c2000000000000,Logitech F510 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000019c2000005030000,Logitech F710 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d0400001fc2000000000000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006d04000018c2000000010000,Logitech RumblePad 2 USB,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006d04000019c2000000000000,Logitech Wireless Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700005032000000010000,Mad Catz FightPad PRO (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700005082000000010000,Mad Catz FightPad PRO (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008433000000010000,Mad Catz FightStick TE S+ (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008483000000010000,Mad Catz FightStick TE S+ (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X, +0300000079000000d218000026010000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000010a7000003010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +0300000025090000e803000000000000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Mac OS X, +03000000790000000018000000010000,Mayflash Wii U Pro Controller Adapter,a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, +03000000790000000018000000000000,Mayflash WiiU Pro Game Controller Adapter (DInput),a:b4,b:b8,back:b32,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b16,leftstick:b40,lefttrigger:b24,leftx:a0,lefty:a4,rightshoulder:b20,rightstick:b44,righttrigger:b28,rightx:a8,righty:a12,start:b36,x:b0,y:b12,platform:Mac OS X, +030000005e0400002700000001010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Mac OS X, +03000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Mac OS X, +03000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c62400002b89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000632500007505000000020000,NEOGEO mini PAD Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000921200004b46000003020000,NES 2-port Adapter,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b11,platform:Mac OS X, +030000001008000001e5000006010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000d620000011a7000000020000,Nintendo Switch Core Plus Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d620000011a7000010050000,Nintendo Switch PowerA Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000007e0500000920000000000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +030000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, +03000000550900001472000025050000,NVIDIA Controller v01.04,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X, +030000006f0e00000901000002010000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008f0e00000300000000000000,Piranha Xtreme PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c050000da0c000000010000,Playstation Classic Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c0500003713000000010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000100800000300000006010000,PS2 Adapter,a:b2,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a4,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X, +030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000321500000204000000010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000104000000010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000010000000010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000321500000011000000010000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000001100000005010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000830500006020000000010000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Mac OS X, +03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000c6240000fefa000000000000,Rock Candy Gamepad for PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000730700000401000000010000,Sanwa PlayOnline Mobile,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Mac OS X, +03000000811700007e05000000000000,Sega Saturn,a:b2,b:b4,dpdown:b16,dpleft:b15,dpright:b14,dpup:b17,leftshoulder:b8,lefttrigger:a5,leftx:a0,lefty:a2,rightshoulder:b9,righttrigger:a4,start:b13,x:b0,y:b6,platform:Mac OS X, +03000000b40400000a01000000000000,Sega Saturn USB Gamepad,a:b0,b:b1,back:b5,guide:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X, +030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, +0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X, +030000004c050000e60c000000010000,Sony DualSense,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000a00b000000000000,Sony DualShock 4 Wireless Adaptor,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b12,x:b2,y:b3,platform:Mac OS X, +03000000110100002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, +05000000484944204465766963650000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, +050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, +05000000556e6b6e6f776e2048494400,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, +03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, +03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, +03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X, +030000004f0400000ed0000000020000,ThrustMaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X, +03000000bd12000015d0000000000000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,leftshoulder:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000bd12000015d0000000010000,Tomee Retro Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, +030000006f0e00000302000025040000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000006f0e00000702000003060000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000791d00000103000009010000,Wii Classic Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, +050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X, +030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000006f0e00000104000000000000,Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000c6240000045d000000000000,Xbox 360 Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e0400000a0b000000000000,Xbox Adaptive Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000050b000003090000,Xbox Elite Wireless Controller Series 2,a:b0,b:b1,back:b31,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b53,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c62400003a54000000000000,Xbox One PowerA Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000d102000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000dd02000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000e302000000000000,Xbox One Wired Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000011050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000e002000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, +030000005e040000e002000003090000,Xbox Wireless Controller,a:b0,b:b1,x:b3,y:b4,back:b16,guide:b15,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X, +030000005e040000ea02000000000000,Xbox Wireless Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +030000005e040000fd02000003090000,Xbox Wireless Controller,a:b0,b:b1,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000120c0000100e000000010000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000120c0000101e000000010000,Zeroplus P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000005e0400002800000002010000,Microsoft Dual Strike,a:b3,b:b2,x:b1,y:b0,back:b4,start:b5,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,rightx:a0,righty:a1~,platform:Mac OS X, + +# Linux +03000000021000000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000090000011010000,8BitDo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00001038000000010000,8Bitdo FC30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001590000011010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006528000000010000,8BitDo N30 Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000008000000210000011010000,8BitDo NES30,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000c82d00000310000011010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +05000000c82d00008010000000010000,8BitDo NES30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b9,righttrigger:b8,start:b11,x:b3,y:b4,platform:Linux, +03000000022000000090000011010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000190000011010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000203800000900000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00002038000000010000,8Bitdo NES30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000060000000010000,8BitDo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000061000000010000,8Bitdo SF30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +030000003512000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d000021ab000010010000,8BitDo SFC30,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +030000003512000012ab000010010000,8Bitdo SFC30 GamePad,a:b2,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b0,platform:Linux, +05000000102800000900000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00003028000000010000,8Bitdo SFC30 GamePad,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000160000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000202800000900000000010000,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000031000011010000,8BitDo Wireless Adapter (DInput),a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e0400008e02000020010000,8BitDo Wireless Adapter (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00003032000000010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +050000005e040000e002000030110000,8BitDo Zero 2 (XInput),a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +05000000a00500003232000001000000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, +05000000a00500003232000008010000,8Bitdo Zero GamePad,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, +03000000c01100000355000011010000,Acrux Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00001302000000010000,Afterglow,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000020060000,Afterglow Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000000430000,Afterglow Prismatic Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003901000013020000,Afterglow Prismatic Wired Controller 048-007-NA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000100000008200000011010000,Akishop Customs PS360 v1.66,a:b1,b:b2,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000007c1800000006000010010000,Alienware Dual Compatible Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +05000000491900000204000021000000,Amazon Fire Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b17,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b12,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000491900001904000011010000,Amazon Luna Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b9,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b7,x:b2,y:b3,platform:Linux, +05000000710100001904000000010000,Amazon Luna Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000a30c00002700000011010000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000a30c00002800000011010000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +05000000050b00000045000031000000,Asus Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +05000000050b00000045000040000000,Asus Gamepad,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b10,x:b2,y:b3,platform:Linux, +03000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, +05000000503200000110000000000000,Atari Classic Controller,a:b0,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b4,start:b3,x:b1,platform:Linux, +03000000503200000210000000000000,Atari Game Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux, +05000000503200000210000000000000,Atari Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux, +03000000120c00000500000010010000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, +03000000ef0500000300000000010000,AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Linux, +03000000c62400001b89000011010000,BDA MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000c21100000791000011010000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000c31100000791000011010000,Be1 GC101 GAMEPAD 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e0400008e02000003030000,Be1 GC101 Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +05000000bc2000000055000001000000,BETOP AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000006b1400000209000011010000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000666600006706000000010000,Boom PSX to PC Converter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, +03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000f70e000011010000,Brook Universal Fighting Board,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000000b0400003365000000010000,Competition Pro,a:b0,b:b1,back:b2,leftx:a0,lefty:a1,start:b3,platform:Linux, +03000000260900008888000000010000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Linux, +03000000a306000022f6000011010000,Cyborg V3 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:-a3,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000004b3000010010000,Dual Power 2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000006f0e00003001000001010000,EA Sports PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000c11100000191000011010000,EasySMX,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006e0500000320000010010000,Elecom U3613M,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b0,y:b1,platform:Linux, +03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000ac0500002d0200001b010000,Gamesir G4s,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b33,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000bc2000005656000011010000,Gamesir T4w,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000007d0400000540000000010000,Gravis Eliminator GamePad Pro,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000280400000140000000010000,Gravis GamePad Pro USB,a:b1,b:b2,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00000610000000010000,GreenAsia Electronics Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a3,righty:a2,start:b11,x:b3,y:b0,platform:Linux, +030000008f0e00001200000010010000,GreenAsia USB Joystick,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +0500000047532067616d657061640000,GS gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000f0250000c383000010010000,GT VX2,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +06000000adde0000efbe000002010000,Hidromancer Game Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d81400000862000011010000,HitBox PS3 PC Analog Mode,a:b1,b:b2,back:b8,guide:b9,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b12,x:b0,y:b3,platform:Linux, +03000000c9110000f055000011010000,HJC Game Gamepqd,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000632500002605000010010000,HJDX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000000d0f00000d00000000010000,Hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,rightshoulder:b7,start:b9,x:b1,y:b2,platform:Linux, +030000000d0f00008500000010010000,Hori Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00008600000002010000,Hori Fighting Commander,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00005f00000011010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005e00000011010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00005001000009040000,Hori Fighting Commander OCTA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00001000000011010000,Hori Fighting Stick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b000001f5000033050000,Hori Pad EX Turbo 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00003801000011010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Linux, +030000000d0f00009200000011010000,Hori Pokken Tournament DX Pro Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f0000aa00000011010000,Hori Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000000d0f00002200000011010000,Hori Real Arcade Pro 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006a00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006b00000011010000,Hori Real Arcade Pro 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00001600000000010000,Hori Real Arcade Pro EXSE,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00006e00000011010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f0000c100000011010000,Horipad S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00001330000010010000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Linux, +03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700001503000010010000,Impact,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000d80400008200000003000000,IMS PCU0 Gamepad,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b5,x:b3,y:b2,platform:Linux, +03000000fd0500000030000000010000,InterAct GoPad I73000,a:b3,b:b4,back:b6,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,start:b7,x:b0,y:b1,platform:Linux, +0500000049190000020400001b010000,Ipega PG 9069 Bluetooth Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b161,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000632500007505000011010000,Ipega PG 9099 Bluetooth Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +0500000049190000030400001b010000,Ipega PG9099,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000491900000204000000000000,Ipega PG9118,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000300f00001001000010010000,Jess Tech Dual Analog Rumble Pad,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000300f00000b01000010010000,Jess Tech GGE909 PC Recoil Pad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000ba2200002010000001010000,Jess Technology USB Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +030000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, +050000007e0500000620000001000000,Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b13,leftshoulder:b4,leftstick:b10,rightshoulder:b5,start:b8,x:b2,y:b3,platform:Linux, +030000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000720000001000000,Joy-Con (R),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b12,leftshoulder:b4,leftstick:b11,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +03000000bd12000003c0000010010000,Joypad Alpha Shock,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000242f00002d00000011010000,JYS Wireless Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000242f00008a00000011010000,JYS Wireless Adapter,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +030000006f0e00000103000000020000,Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d040000d1ca000000000000,Logitech Chillstream,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000019c2000010010000,Logitech Cordless RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000016c2000010010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000016c2000011010000,Logitech Dual Action,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d0400001dc2000014400000,Logitech F310 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400001ec2000019200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d0400001ec2000020200000,Logitech F510 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d04000019c2000011010000,Logitech F710 Gamepad (DInput),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d0400001fc2000005030000,Logitech F710 Gamepad (XInput),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d04000018c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006d04000011c2000010010000,Logitech WingMan Cordless RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux, +030000006d0400000ac2000010010000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux, +05000000380700006652000025010000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700005032000011010000,Mad Catz FightPad PRO PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700005082000011010000,Mad Catz FightPad PRO PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux, +03000000380700008034000011010000,Mad Catz fightstick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008084000011010000,Mad Catz fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008433000011010000,Mad Catz FightStick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700008483000011010000,Mad Catz FightStick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000380700001647000010040000,Mad Catz Wired Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000380700003847000090040000,Mad Catz Wired Xbox 360 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000380700001888000010010000,MadCatz PC USB Wired Stick 8818,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000380700003888000010010000,MadCatz PC USB Wired Stick 8838,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000790000004318000010010000,Mayflash GameCube Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, +03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, +0300000079000000d218000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d620000010a7000011010000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000242f0000f700000001010000,Mayflash Magic S Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0300000025090000e803000001010000,Mayflash Wii Classic Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +03000000780000000600000010010000,Microntek USB Joystick,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +030000005e0400000e00000000010000,Microsoft SideWinder,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Linux, +030000005e0400000700000000010000,Microsoft SideWinder Game Pad USB,a:b0,b:b1,back:b8,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Linux, +030000005e0400002700000000010000,Microsoft SideWinder Plug and Play,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b4,righttrigger:b5,x:b2,y:b3,platform:Linux, +030000005e0400008e02000056210000,Microsoft X-Box 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000004010000,Microsoft Xbox 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000062230000,Microsoft Xbox 360 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000000b000008040000,Microsoft Xbox One Elite 2 pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000050b000003090000,Microsoft Xbox One Elite 2 pad,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e040000e302000003020000,Microsoft Xbox One Elite pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000001010000,Microsoft Xbox One pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000dd02000003020000,Microsoft Xbox One pad 2015,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000d102000003020000,Microsoft Xbox One pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000ea02000008040000,Microsoft Xbox One S pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008502000000010000,Microsoft Xbox pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +030000005e0400008902000021010000,Microsoft Xbox pad v2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, +050000004d4f435554452d3035335800,Mocute 053X,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000004d4f435554452d3035305800,Mocute 054X,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000d6200000e589000001000000,Moga 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +05000000d6200000ad0d000001000000,Moga Pro,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +05000000d62000007162000001000000,Moga Pro 2 HID,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Linux, +03000000c62400002b89000011010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c62400002a89000000010000,MOGA XP5A Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b22,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000c62400001a89000000010000,MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000250900006688000000010000,MP8866 Super Dual Box,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +030000006b140000010c000010010000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0f00000900000010010000,Natec Genesis P44,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f1f00000800000011010000,Neogeo PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +03000000790000004518000010010000,Nexilux GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Linux, +060000007e0500003713000000000000,Nintendo 3DS,a:b0,b:b1,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +060000007e0500000820000000000000,Nintendo Combined Joy-Cons (joycond),a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux, +03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux, +050000004c69632050726f20436f6e00,Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000620000001800000,Nintendo Switch Left Joy-Con,a:b9,b:b8,back:b5,leftshoulder:b2,leftstick:b6,leftx:a1,lefty:a0~,rightshoulder:b4,start:b0,x:b7,y:b10,platform:Linux, +03000000d620000013a7000011010000,Nintendo Switch PowerA Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000007e0500000920000011810000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500000920000001000000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500000920000001800000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, +050000007e0500000720000001800000,Nintendo Switch Right Joy-Con,a:b1,b:b2,back:b9,leftshoulder:b4,leftstick:b10,leftx:a1~,lefty:a0~,rightshoulder:b6,start:b8,x:b0,y:b3,platform:Linux, +050000007e0500001720000001000000,Nintendo Switch SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Linux, +050000007e0500003003000001000000,Nintendo Wii Remote Pro Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +05000000010000000100000003000000,Nintendo Wiimote,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000000d0500000308000010010000,Nostromo n45 Dual Analog Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b12,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b2,y:b3,platform:Linux, +03000000550900001072000011010000,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b8,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000550900001472000011010000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, +05000000550900001472000001000000,NVIDIA Controller v01.04,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux, +03000000451300000830000010010000,NYKO CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +19000000010000000100000001010000,odroidgo2 joypad,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux, +19000000010000000200000011000000,odroidgo2 joypad v11,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux, +03000000c0160000dc27000001010000,OnyxSoft Dual JoyDivision,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:Linux, +05000000362800000100000002010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, +05000000362800000100000003010000,OUYA Game Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, +03000000830500005020000010010000,Padix Co. Ltd. Rockfire PSX/USB Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux, +03000000790000001c18000011010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000ff1100003133000010010000,PC Game Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e0000b802000001010000,PDP Afterglow Wired Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e0000b802000013020000,PDP Afterglow Wired Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00006401000001010000,PDP Battlefield One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00003101000000010000,PDP EA Sports Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00008001000011010000,PDP Faceoff Wired Pro Controller for Nintendo Switch,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e0000c802000012010000,PDP Kingdom Hearts Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00008701000011010000,PDP Rock Candy Wired Controller for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e00000901000011010000,PDP Versus Fighting Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e0000a802000023020000,PDP Wired Controller for Xbox One,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000006f0e00008501000011010000,PDP Wired Fight Pad Pro for Nintendo Switch,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000004c050000da0c000011010000,Playstation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000d9040000160f000000010000,Playstation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000c62400000053000000010000,PowerA,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400003a54000001010000,PowerA 1428124-01,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400001a53000000010000,PowerA Mini Pro Ex,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000006dca000011010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000d62000000228000001010000,PowerA Wired Controller for Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d62000000220000001010000,PowerA Wired Controller for Xbox One and Xbox Series S and X,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, +03000000c62400001a58000001010000,PowerA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c62400001a54000001010000,PowerA Xbox One Mini Wired Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006d040000d2ca000011010000,Precision Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ff1100004133000010010000,PS2 Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000341a00003608000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004c0500006802000010010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c0500006802000010810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c0500006802000011010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c0500006802000011810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000006f0e00001402000011010000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000008f0e00000300000010010000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +050000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +050000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:a12,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:a13,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +050000004c0500006802000000800000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux, +030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000c405000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000ff000000cb01000010010000,PSP,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux, +03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux, +03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux, +030000009b2800004200000001010000,Raphnet Technologies Dual NES to USB v2.0,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux, +030000009b2800003200000001010000,Raphnet Technologies GC/N64 to USB v3.4,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +030000009b2800006000000001010000,Raphnet Technologies GC/N64 to USB v3.6,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, +030000009b2800000300000001010000,raphnet.net 4nes4snes v1.5,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux, +030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000008916000000fd000024010000,Razer Onza Tournament Edition,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000810000011010000,Razer Panthera Evo Arcade Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000321500000a10000001000000,Razer Raiju Tournament Edition,a:b1,b:b2,x:b0,y:b3,back:b8,guide:b13,start:b9,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux, +03000000321500000010000011010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000321500000011000011010000,Razer Raion Fightpad for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000321500000009000011010000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux, +0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux, +0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, +030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001e01000011010000,Rock Candy PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000c6240000fefa000000010000,Rock Candy Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00004601000001010000,Rock Candy Xbox One Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000a306000023f6000011010000,Saitek Cyborg V.1 Game Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000a30600001005000000010000,Saitek P150,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b7,lefttrigger:b6,rightshoulder:b2,righttrigger:b5,x:b3,y:b4,platform:Linux, +03000000a30600000701000000010000,Saitek P220,a:b2,b:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,x:b0,y:b1,platform:Linux, +03000000a30600000cff000010010000,Saitek P2500 Force Rumble Pad,a:b2,b:b3,back:b11,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b10,x:b0,y:b1,platform:Linux, +03000000a30600000c04000011010000,Saitek P2900 Wireless Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b12,x:b0,y:b3,platform:Linux, +03000000a306000018f5000010010000,Saitek P3200 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000300f00001201000010010000,Saitek P380,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Linux, +03000000a30600000901000000010000,Saitek P880,a:b2,b:b3,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,x:b0,y:b1,platform:Linux, +03000000a30600000b04000000010000,Saitek P990 Dual Analog Pad,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b8,x:b0,y:b3,platform:Linux, +03000000a306000020f6000011010000,Saitek PS2700 Rumble Pad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a4,start:b9,x:b0,y:b3,platform:Linux, +03000000d81d00000e00000010010000,Savior,a:b0,b:b1,back:b8,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,start:b9,x:b4,y:b5,platform:Linux, +03000000a30c00002500000011010000,Sega Genesis Mini 3B controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Linux, +030000001f08000001e4000010010000,SFC Controller,a:b2,b:b1,back:b8,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000f025000021c1000010010000,Shanwan Gioteck PS3 Wired Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000632500007505000010010000,Shanwan PS3 PC Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000bc2000000055000010010000,Shanwan PS3 PC Wired GamePad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005f140000c501000010010000,Shanwan Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000632500002305000010010000,ShanWan USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000341a00000908000010010000,SL6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000004c050000e60c000011810000,Sony DualSense,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000e60c000000810000,Sony DualSense,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +03000000250900000500000000010000,Sony PS2 pad with SmartJoy adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +030000005e0400008e02000073050000,Speedlink Torid Wireless Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000020200000,SpeedLink Xeox Pro Analog Gamepad pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000d11800000094000011010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000112000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800000211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, +03000000de2800004211000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de2800004211000011010000,Steam Controller,a:b2,b:b3,back:b10,dpdown:b18,dpleft:b19,dpright:b20,dpup:b17,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b15,paddle2:b16,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b5,platform:Linux, +03000000de280000fc11000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000212000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b10,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Linux, +03000000de280000ff11000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000381000003014000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000381000003114000075010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0500000011010000311400001b010000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b32,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +05000000110100001914000009010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000ad1b000038f0000090040000,Street Fighter IV FightStick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000003b07000004a1000000010000,Suncom SFX Plus for USB,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Linux, +03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, +0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, +030000008f0e00000d31000010010000,SZMY Power 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000457500002211000010010000,SZMY Power Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +030000008f0e00001431000010010000,SZMY Power PS3 gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux, +030000004f04000020b3000010010000,Thrustmaster 2 in 1 DT,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +030000004f04000023b3000000010000,Thrustmaster Dual Trigger 3 in 1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004f0400000ed0000011010000,Thrustmaster eSwap PRO Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000b50700000399000000010000,Thrustmaster Firestorm Digital 2,a:b2,b:b4,back:b11,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b8,rightstick:b0,righttrigger:b9,start:b1,x:b3,y:b5,platform:Linux, +030000004f04000003b3000010010000,Thrustmaster Firestorm Dual Analog 2,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b9,rightx:a2,righty:a3,x:b1,y:b3,platform:Linux, +030000004f04000000b3000010010000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Linux, +030000004f04000026b3000002040000,Thrustmaster Gamepad GP XID,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c6240000025b000002020000,Thrustmaster GPX Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000004f04000008d0000000010000,Thrustmaster Run N Drive Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000009d0000000010000,Thrustmaster Run N Drive Wireless PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000007d0000000010000,Thrustmaster T Mini Wireless,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +030000004f04000012b3000010010000,Thrustmaster vibrating gamepad,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, +03000000bd12000015d0000010010000,Tomee SNES USB Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Linux, +03000000d814000007cd000011010000,Toodles 2008 Chimp PC PS3,a:b0,b:b1,back:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b2,platform:Linux, +030000005e0400008e02000070050000,Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000c01100000591000011010000,Torid,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +03000000100800000100000010010000,Twin USB PS2 Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, +03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux, +03000000790000001100000000010000,USB Gamepad1,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux, +03000000790000001100000011010000,USB Saturn Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Linux, +03000000790000002201000011010000,USB Saturn Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux, +03000000b40400000a01000000010000,USB Saturn Pad,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Linux, +030000006f0e00000302000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +030000006f0e00000702000011010000,Victrix Pro Fight Stick for PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, +05000000ac0500003232000001000000,VR Box Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +03000000791d00000103000010010000,Wii Classic Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +050000000d0f0000f600000001000000,Wireless HORIPAD Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000014010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +0000000058626f782033363020576900,Xbox 360 Wireless Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, +030000005e0400001907000000010000,Xbox 360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400009102000007010000,Xbox 360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000000010000,Xbox 360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000007010000,Xbox 360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400008e02000000010000,Xbox 360 Wireless EasySMX,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000a102000014010000,Xbox 360 Wireless Receiver,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000006f0e00001304000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000ffff0000ffff000000010000,Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +0000000058626f782047616d65706100,Xbox Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400000a0b000005040000,Xbox One Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +030000005e040000d102000002010000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000fd02000030110000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000e302000002090000,Xbox One Elite,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000050b000002090000,Xbox One Elite Series 2,a:b0,b:b1,back:b136,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +060000005e040000ea0200000b050000,Xbox One S Controller,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, +030000005e040000ea02000000000000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000e002000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000fd02000003090000,Xbox One Wireless Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +030000005e040000ea02000001030000,Xbox One Wireless Controller (Model 1708),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +060000005e040000120b000007050000,Xbox One Wireless Controller (Model 1914),a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e0400000202000000010000,Xbox pad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b4,platform:Linux, +060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux, +030000005e040000120b000001050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000120b000005050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +050000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Linux, +03000000450c00002043000010010000,XEOX Gamepad SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +03000000ac0500005b05000010010000,Xiaoji Gamesir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, +05000000172700004431000029010000,XiaoMi Game Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux, +03000000c0160000e105000001010000,XinMo Dual Arcade,a:b4,b:b3,back:b6,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b9,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b1,y:b0,platform:Linux, +xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000120c0000100e000011010000,Zeroplus P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +03000000120c0000101e000011010000,Zeroplus P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, +030000005e0400002800000000010000,Microsoft Dual Strike,a:b3,b:b2,x:b1,y:b0,back:b4,start:b5,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,rightx:a0,righty:a1~,platform:Linux, +03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b2,start:b11,leftshoulder:b6,rightshoulder:b7,lefttrigger:b8,righttrigger:b9,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,platform:Linux, +060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,x:b3,y:b2,back:b9,start:b10,leftshoulder:b5,rightshoulder:b6,lefttrigger:b7,righttrigger:b8,dpup:b14,dpdown:b15,dpleft:b16,dpright:b17,leftx:a0,lefty:a1,rightx:a2,righty:a3,leftstick:b12,rightstick:b13,platform:Linux, +03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,y:b0,x:b3,start:b9,guide:b30,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7,platform:Linux, +03000000380700008532000010010000,Madcatz Fightpad,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftshoulder:b4,rightshoulder:b6,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,lefttrigger:b5,righttrigger:b7,platform:Linux, +03000000ad1b000003f5000033050000,Hori Fighting Stick VX,a:b0,b:b1,x:b2,y:b3,back:b8,guide:b10,start:b9,leftshoulder:b4,rightshoulder:b5,-leftx:h0.8,+leftx:h0.2,-lefty:h0.1,+lefty:h0.4,lefttrigger:b6,righttrigger:b7,platform:Linux, +050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,leftstick:b10,rightstick:b11,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a5,lefttrigger:a3,righttrigger:a4,platform:Linux, +03000000571d00002000000010010000,Tomee SNES USB Adapter,x:b2,a:b0,b:b1,y:b3,back:b6,start:b7,leftshoulder:b4,rightshoulder:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,platform:Linux, + +# Android +38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android, +33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android, +39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android, +64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android, +66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android, +66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000006500000ffff3f00,8BitDo M30 Gamepad,a:b1,b:b0,back:b4,guide:b17,leftshoulder:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a4,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000051060000ffff3f00,8BitDo M30 Gamepad,a:b1,b:b0,back:b4,guide:b17,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000000600000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000000610000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android, +61623334636338643233383735326439,8BitDo SFC30,a:b0,b:b1,back:b4,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b31,start:b5,x:b30,y:b2,platform:Android, +05000000c82d000012900000ffff3f00,8BitDo SN30 Gamepad,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000062280000ffff3f00,8BitDo SN30 Gamepad,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000002600000ffff0f00,8BitDo SN30 Pro+,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000002028000009000000ffff3f00,8BitDo SNES30 Gamepad,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +050000003512000020ab000000780f00,8BitDo SNES30 Gamepad,a:b21,b:b20,back:b30,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b26,rightshoulder:b27,start:b31,x:b24,y:b23,platform:Android, +33666663316164653937326237613331,8BitDo Zero,a:b0,b:b1,back:b15,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android, +63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, +32333634613735616163326165323731,Amazon Luna Game Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android, +30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android, +05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, +0500000031366332860c44aadfff0f00,GS Gamepad,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b18,platform:Android, +31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android, +64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android, +65346535636333663931613264643164,Joy Con,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android, +33346566643039343630376565326335,Joy Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +35313531613435623366313835326238,Joy Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android, +38383665633039363066383334653465,Joy Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39363561613936303237333537383931,Joy Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android, +39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, +64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android, +32303165626138343962363666346165,Mars,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +31323564663862633234646330373138,Mega Drive,a:b23,b:b22,leftx:a0,lefty:a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android, +37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Android, +30306461613834333439303734316539,Microsoft SideWinder Pro,a:b0,b:b1,leftshoulder:b20,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b19,righttrigger:b10,start:b17,x:b2,y:b3,platform:Android, +64633436313965656664373634323364,Microsoft X-Box 360 pad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +7573622067616d657061642020202020,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Android, +050000007e05000009200000ffff0f00,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b17,y:b2,platform:Android, +34323437396534643531326161633738,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000003720000cf7f3f00,NVIDIA Controller v01.01,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000010720000ffff3f00,NVIDIA Controller v01.03,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005509000014720000df7f3f00,NVIDIA Controller v01.04,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, +61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android, +32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android, +61363034663839376638653463633865,PS3,a:b0,b:b1,back:b15,dpdown:a14,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66366539656564653432353139356536,PS3,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +66383132326164626636313737373037,PS3,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30303839663330346632363232623138,PS4,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +31326235383662333266633463653332,PS4,a:b1,b:b16,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android, +31663838336334393132303338353963,PS4,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +34613139376634626133336530386430,PS4,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37626233336235343937333961353732,PS4,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38393161636261653636653532386639,PS4,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63313733393535663339656564343962,PS4,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +63393662363836383439353064663939,PS4,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65366465656364636137653363376531,PS4,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, +66613532303965383534396638613230,PS4,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +050000004c050000c405000000783f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000c4050000fffe3f00,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +62653335326261303663356263626339,PSX,a:b19,b:b1,back:b17,leftshoulder:b9,lefttrigger:b3,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b20,start:b18,x:b2,y:b0,platform:Android, +64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android, +38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b6,platform:Android, +33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android, +66386565396238363534313863353065,Sanwa Mobile,a:b21,b:b22,leftshoulder:b23,leftx:a0,lefty:a1,rightshoulder:b24,platform:Android, +32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, +37316565396364386635383230353365,Saturn,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android, +38613865396530353338373763623431,Saturn,a:b0,b:b1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android, +61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, +30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android, +66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, +62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +38376662666661636265313264613039,SNES,a:b0,b:b1,back:b9,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android, +32633532643734376632656664383733,Sony DualSense,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +61303162353165316365336436343139,Sony DualSense,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android, +63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, +0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android, +050000004f0400000ed00000fffe3f00,ThrustMaster eSwap PRO Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +5477696e20555342204a6f7973746963,Twin USB Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android, +30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b23,paddle2:b24,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b23,paddle2:b24,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +30386438313564306161393537333663,Wii Classic,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +33333034646336346339646538643633,Wii Classic,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android, +30306539356238653637313730656134,Wireless HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +30396232393162346330326334636566,Xbox 360,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +38313038323730383864666463383533,Xbox 360,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65353331386662343338643939643636,Xbox 360,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65613532386633373963616462363038,Xbox 360,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e0400008e02000000783f00,Xbox 360 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +050000005e040000e002000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000ea02000000783f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000e00200000ffe3f00,Xbox One Wireless Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android, +050000005e040000fd020000ffff3f00,Xbox One Wireless Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000005e04000091020000ff073f00,Xbox Wireless Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, +34356136633366613530316338376136,Xbox Wireless Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android, +36616131643361333337396261666433,Xbox Wireless Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +050000001727000044310000ffff3f00,XiaoMi Game Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, + +# iOS +05000000ac0500000100000000006d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac050000010000004f066d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac05000001000000cf076d01,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b2,y:b3,platform:iOS, +05000000ac05000001000000df076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +05000000ac05000001000000ff076d01,*,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +05000000ac0500000200000000006d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, +4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, +4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, +050000004c050000cc090000df070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000004c050000cc090000df870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS, +050000004c050000cc090000ff876d01,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000004c050000e60c0000df870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,touchpad:b10,x:b2,y:b3,platform:iOS, +050000004c050000e60c0000ff870000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,touchpad:b11,x:b2,y:b3,platform:iOS, +05000000ac0500000300000000006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000ac0500000300000043006d03,Remote,a:b0,b:b2,leftx:a0,lefty:a1,platform:iOS, +05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:iOS, +050000005e040000050b0000df070001,Xbox Elite Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b10,paddle2:b12,paddle3:b11,paddle4:b13,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000050b0000ff070001,Xbox Elite Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000005e040000130b0000df870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000130b0000ff870001,Xbox Series X Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, +050000005e040000e0020000df070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, +050000005e040000e0020000ff070000,Xbox Wireless Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, diff --git a/resources/shaders/CRT.fs b/resources/shaders/CRT.fs new file mode 100644 index 0000000..588a27c --- /dev/null +++ b/resources/shaders/CRT.fs @@ -0,0 +1,154 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec2 distortion_fac; +extern MY_HIGHP_OR_MEDIUMP vec2 scale_fac; +extern MY_HIGHP_OR_MEDIUMP number feather_fac; +extern MY_HIGHP_OR_MEDIUMP number noise_fac; +extern MY_HIGHP_OR_MEDIUMP number bloom_fac; +extern MY_HIGHP_OR_MEDIUMP number crt_intensity; +extern MY_HIGHP_OR_MEDIUMP number glitch_intensity; +extern MY_HIGHP_OR_MEDIUMP number scanlines; + +#define BUFF 0.01 +#define BLOOM_AMT 3 + +vec4 effect(vec4 color, Image tex, vec2 tc, vec2 pc) +{ + //Keep the original texture coords + vec2 orig_tc = tc; + + //recenter + tc = tc*2.0 - vec2(1.0); + tc *= scale_fac; + + //bulge from middle + tc += (tc.yx*tc.yx) * tc * (distortion_fac - 1.0); + + //smoothly transition the edge to black + //buffer for the outer edge, this gets wonky if there is no buffer + number mask = (1.0 - smoothstep(1.0-feather_fac,1.0,abs(tc.x) - BUFF)) + * (1.0 - smoothstep(1.0-feather_fac,1.0,abs(tc.y) - BUFF)); + + //undo the recenter + tc = (tc + vec2(1.0))/2.0; + + //Create the horizontal glitch offset effects + number offset_l = 0.; + number offset_r = 0.; + if(glitch_intensity > 0.01){ + number timefac = 3.0*time; + offset_l = 50.0*(-3.5+sin(timefac*0.512 + tc.y*40.0) + + sin(-timefac*0.8233 + tc.y*81.532) + + sin(timefac*0.333 + tc.y*30.3) + + sin(-timefac*0.1112331 + tc.y*13.0)); + offset_r = -50.0*(-3.5+sin(timefac*0.6924 + tc.y*29.0) + + sin(-timefac*0.9661 + tc.y*41.532) + + sin(timefac*0.4423 + tc.y*40.3) + + sin(-timefac*0.13321312 + tc.y*11.0)); + + if(glitch_intensity > 1.0){ + offset_l = 50.0*(-1.5+sin(timefac*0.512 + tc.y*4.0) + + sin(-timefac*0.8233 + tc.y*1.532) + + sin(timefac*0.333 + tc.y*3.3) + + sin(-timefac*0.1112331 + tc.y*1.0)); + offset_r = -50.0*(-1.5+sin(timefac*0.6924 + tc.y*19.0) + + sin(-timefac*0.9661 + tc.y*21.532) + + sin(timefac*0.4423 + tc.y*20.3) + + sin(-timefac*0.13321312 + tc.y*5.0)); + } + tc.x = tc.x + 0.001*glitch_intensity*clamp(offset_l, clamp(offset_r, -1.0, 0.0), 1.0); + } + + //Apply mask and bulging effect + vec4 crt_tex = Texel( tex, tc); + + //intensity multiplier for any visual artifacts + float artifact_amplifier = (abs(clamp(offset_l, clamp(offset_r, -1.0, 0.0), 1.0))*glitch_intensity > 0.9 ? 3. : 1.); + + //Horizontal Chromatic Aberration + float crt_amout_adjusted = (max(0., (crt_intensity)/(0.16*0.3)))*artifact_amplifier; + if(crt_amout_adjusted > 0.0000001) { + crt_tex.r = crt_tex.r*(1.-crt_amout_adjusted) + crt_amout_adjusted*Texel( tex, tc + vec2(0.0005*(1. +10.*(artifact_amplifier - 1.))*1600./love_ScreenSize.x, 0.)).r; + crt_tex.g = crt_tex.g*(1.-crt_amout_adjusted) + crt_amout_adjusted*Texel( tex, tc + vec2(-0.0005*(1. +10.*(artifact_amplifier - 1.))*1600./love_ScreenSize.x, 0.)).g; + } + vec3 rgb_result = crt_tex.rgb*(1.0 - (1.0*crt_intensity*artifact_amplifier)); + + //post processing on the glitch effect to amplify green or red for a few lines of pixels + if (sin(time + tc.y*200.0) > 0.85) { + if (offset_l < 0.99 && offset_l > 0.01) rgb_result.r = rgb_result.g*1.5; + if (offset_r > -0.99 && offset_r < -0.01) rgb_result.g = rgb_result.r*1.5; + } + + //Add the pixel scanline overlay, a repeated 'pixel' mask that doesn't actually render the real image. If these pixels were used to render the image it would be too harsh + vec3 rgb_scanline = 1.0*vec3( + clamp(-0.3+2.0*sin( tc.y * scanlines-3.14/4.0) - 0.8*clamp(sin( tc.x*scanlines*4.0), 0.4, 1.0), -1.0, 2.0), + clamp(-0.3+2.0*cos( tc.y * scanlines) - 0.8*clamp(cos( tc.x*scanlines*4.0), 0.0, 1.0), -1.0, 2.0), + clamp(-0.3+2.0*cos( tc.y * scanlines -3.14/3.0) - 0.8*clamp(cos( tc.x*scanlines*4.0-3.14/4.0), 0.0, 1.0), -1.0, 2.0)); + + rgb_result += crt_tex.rgb * rgb_scanline * crt_intensity * artifact_amplifier; + + //Add in some noise + number x = (tc.x - mod(tc.x, 0.002)) * (tc.y - mod(tc.y, 0.0013)) * time * 1000.0; + x = mod( x, 13.0 ) * mod( x, 123.0 ); + number dx = mod( x, 0.11 )/0.11; + rgb_result = (1.0-clamp( noise_fac*artifact_amplifier, 0.0,1.0 ))*rgb_result + dx * clamp( noise_fac*artifact_amplifier, 0.0,1.0 ) * vec3(1.0,1.0,1.0); + + //contrast and brightness correction for the CRT effect, also adjusting brightness for bloom + rgb_result -= vec3(0.55 - 0.02*(artifact_amplifier - 1. - crt_amout_adjusted*bloom_fac*0.7)); + rgb_result = rgb_result*(1.0 + 0.14 + crt_amout_adjusted*(0.012 - bloom_fac*0.12)); + rgb_result += vec3(0.5); + + //Prepare the final colour to return + vec4 final_col = vec4( rgb_result*1.0, 1.0 ); + + //Finally apply bloom + vec4 col = vec4(0.0); + float bloom = 0.0; + + if (bloom_fac > 0.00001 && crt_intensity > 0.000001){ + bloom = 0.03*(max(0., (crt_intensity)/(0.16*0.3))); + float bloom_dist = 0.0015*float(BLOOM_AMT); + vec4 samp; + float cutoff = 0.6; + + for (int i = -BLOOM_AMT; i <= BLOOM_AMT; ++i) + for (int j = -BLOOM_AMT; j <= BLOOM_AMT; ++j){ + samp = Texel( tex, tc + (bloom_dist/float(BLOOM_AMT))*vec2(float(i), float(j))); + samp.r = max(1./(1.-cutoff)*samp.r - 1./(1.-cutoff) + 1., 0.); + samp.g = max(1./(1.-cutoff)*samp.g - 1./(1.-cutoff) + 1., 0.); + samp.b = max(1./(1.-cutoff)*samp.b - 1./(1.-cutoff) + 1., 0.); + col += min(min(samp.r,samp.g),samp.b) * (2. - float(abs(float(i+j)))/float(BLOOM_AMT+BLOOM_AMT)); + } + + col /= float(BLOOM_AMT*BLOOM_AMT); + col.a = final_col.a; + } + + return (final_col*(1. -1.*bloom) + bloom*col)*mask; +} + + + +#ifdef VERTEX +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.002*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/background.fs b/resources/shaders/background.fs new file mode 100644 index 0000000..c914fc2 --- /dev/null +++ b/resources/shaders/background.fs @@ -0,0 +1,46 @@ +extern number time; +extern number spin_time; +extern vec4 colour_1; +extern vec4 colour_2; +extern vec4 colour_3; +extern number contrast; +extern number spin_amount; + +#define PIXEL_SIZE_FAC 700. +#define SPIN_EASE 0.5 + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + //Convert to UV coords (0-1) and floor for pixel effect + number pixel_size = length(love_ScreenSize.xy)/PIXEL_SIZE_FAC; + vec2 uv = (floor(screen_coords.xy*(1./pixel_size))*pixel_size - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy) - vec2(0.12, 0.); + number uv_len = length(uv); + + //Adding in a center swirl, changes with time. Only applies meaningfully if the 'spin amount' is a non-zero number + number speed = (spin_time*SPIN_EASE*0.2) + 302.2; + number new_pixel_angle = (atan(uv.y, uv.x)) + speed - SPIN_EASE*20.*(1.*spin_amount*uv_len + (1. - 1.*spin_amount)); + vec2 mid = (love_ScreenSize.xy/length(love_ScreenSize.xy))/2.; + uv = (vec2((uv_len * cos(new_pixel_angle) + mid.x), (uv_len * sin(new_pixel_angle) + mid.y)) - mid); + + //Now add the paint effect to the swirled UV + uv *= 30.; + speed = time*(2.); + vec2 uv2 = vec2(uv.x+uv.y); + + for(int i=0; i < 5; i++) { + uv2 += sin(max(uv.x, uv.y)) + uv; + uv += 0.5*vec2(cos(5.1123314 + 0.353*uv2.y + speed*0.131121),sin(uv2.x - 0.113*speed)); + uv -= 1.0*cos(uv.x + uv.y) - 1.0*sin(uv.x*0.711 - uv.y); + } + + //Make the paint amount range from 0 - 2 + number contrast_mod = (0.25*contrast + 0.5*spin_amount + 1.2); + number paint_res =min(2., max(0.,length(uv)*(0.035)*contrast_mod)); + number c1p = max(0.,1. - contrast_mod*abs(1.-paint_res)); + number c2p = max(0.,1. - contrast_mod*abs(paint_res)); + number c3p = 1. - min(1., c1p + c2p); + + vec4 ret_col = (0.3/contrast)*colour_1 + (1. - 0.3/contrast)*(colour_1*c1p + colour_2*c2p + vec4(c3p*colour_3.rgb, c3p*colour_1.a)); + + return ret_col; +} \ No newline at end of file diff --git a/resources/shaders/booster.fs b/resources/shaders/booster.fs new file mode 100644 index 0000000..2c61adb --- /dev/null +++ b/resources/shaders/booster.fs @@ -0,0 +1,98 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 booster; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel( texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = max(high-low, low*0.7); + + number fac = 0.8 + 0.9*sin(13.*uv.x+5.32*uv.y + booster.r*12. + cos(booster.r*5.3 + uv.y*4.2 - uv.x*4.)); + number fac2 = 0.5 + 0.5*sin(10.*uv.x+2.32*uv.y + booster.r*5. - cos(booster.r*2.3 + uv.x*8.2)); + number fac3 = 0.5 + 0.5*sin(12.*uv.x+6.32*uv.y + booster.r*6.111 + sin(booster.r*5.3 + uv.y*3.2)); + number fac4 = 0.5 + 0.5*sin(4.*uv.x+2.32*uv.y + booster.r*8.111 + sin(booster.r*1.3 + uv.y*13.2)); + number fac5 = sin(0.5*16.*uv.x+5.32*uv.y + booster.r*12. + cos(booster.r*5.3 + uv.y*4.2 - uv.x*4.)); + + number maxfac = 0.6*max(max(fac, max(fac2, max(fac3,0.0))) + (fac+fac2+fac3*fac4), 0.); + + tex.rgb = tex.rgb*0.5 + vec3(0.4, 0.4, 0.8); + + tex.r = tex.r-delta + delta*maxfac*(0.7 + fac5*0.07) - 0.1; + tex.g = tex.g-delta + delta*maxfac*(0.7 - fac5*0.17) - 0.1; + tex.b = tex.b-delta + delta*maxfac*0.7 - 0.1; + tex.a = tex.a*(0.8*max(min(1., max(0.,0.3*max(low*0.2, delta)+ min(max(maxfac*0.1,0.), 0.4)) ), 0.) + 0.15*maxfac*(0.1+delta)); + + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/debuff.fs b/resources/shaders/debuff.fs new file mode 100644 index 0000000..1656b75 --- /dev/null +++ b/resources/shaders/debuff.fs @@ -0,0 +1,149 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + + +extern MY_HIGHP_OR_MEDIUMP vec2 debuff; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y == 0.) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel(texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + vec4 SAT = HSL(tex*0.8 + 0.2*vec4(1., 0., 0., tex.a)); + SAT.g = 0.5; + + number width = 0.0; + + if (debuff.g > 0.0 || debuff.g < 0.0) { + width = 0.1; + } + bool test = false; + if ((uv.x+uv.y > 1. - width && uv.x+uv.y < 1. + width) || ((1.-uv.x)+uv.y > 1. - width && (1.-uv.x)+uv.y < 1. + width)) + { + test = true; + SAT.r = 1.; + SAT.g = 0.7; + SAT.b = 0.8*SAT.b; + } else{ + SAT.g = SAT.g*0.5; + SAT.b = SAT.b*0.7; + } + + + tex = RGB(SAT); + if (!test){ + tex.a = tex.a*0.3; + } + + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/dissolve.fs b/resources/shaders/dissolve.fs new file mode 100644 index 0000000..04b5f64 --- /dev/null +++ b/resources/shaders/dissolve.fs @@ -0,0 +1,86 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel( texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + if (!shadow && dissolve > 0.01){ + if (burn_colour_2.a > 0.01){ + tex.rgb = tex.rgb*(1.-0.6*dissolve) + 0.6*burn_colour_2.rgb*dissolve; + } else if (burn_colour_1.a > 0.01){ + tex.rgb = tex.rgb*(1.-0.6*dissolve) + 0.6*burn_colour_1.rgb*dissolve; + } + } + + return dissolve_mask(tex, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/flame.fs b/resources/shaders/flame.fs new file mode 100644 index 0000000..8118c95 --- /dev/null +++ b/resources/shaders/flame.fs @@ -0,0 +1,69 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + + +extern MY_HIGHP_OR_MEDIUMP float time; +extern MY_HIGHP_OR_MEDIUMP float amount; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern MY_HIGHP_OR_MEDIUMP vec4 colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 colour_2; +extern MY_HIGHP_OR_MEDIUMP float id; + +#define PIXEL_SIZE_FAC 60. +#define WHITE vec4(1.,1.,1.,1.) + + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + float intensity = 1.0*min(10.,amount); + if(intensity < 0.1){ + return vec4(0.,0.,0.,0.); + } + + //Convert to UV coords (0-1) and floor for pixel effect + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba - 0.5; + vec2 floored_uv = (floor((uv*PIXEL_SIZE_FAC)))/PIXEL_SIZE_FAC; + vec2 uv_scaled_centered = (floored_uv); + uv_scaled_centered += uv_scaled_centered*0.01*(sin(-1.123*floored_uv.x + 0.2*time)*cos(5.3332*floored_uv.y + time*0.931)); + vec2 flame_up_vec = vec2(0., mod(4.*time, 10000.) - 5000. + mod(1.781*id, 1000.) ); + + float scale_fac = (7.5 + 3./(2. + 2.*intensity)); + vec2 sv = uv_scaled_centered*scale_fac + flame_up_vec; + float speed = mod(20.781*id, 100.) + 1.*sin(time+id)*cos(time*0.151+id); + vec2 sv2 = vec2(0.,0.); + + for(int i=0; i < 5; i++) { + sv2 += sv + 0.05*sv2.yx*(mod(float(i), 2.)>1.?-1.:1.) + 0.3*(cos(length(sv)*0.411) + 0.3344*sin(length(sv)) - 0.23*cos(length(sv))); + sv += 0.5*vec2( + cos(cos(sv2.y) + speed*0.0812)*sin(3.22 + (sv2.x) - speed*0.1531), + sin(-sv2.x*1.21222 + 0.113785*speed)*cos(sv2.y*0.91213 - 0.13582*speed)); + } + + //Make the smoke amount range from 0 - 2 + float smoke_res = max(0.,((length((sv - flame_up_vec)/scale_fac*5.)+ 0.1*(length(uv_scaled_centered) - 0.5))*(2./(2.+ intensity*0.2)))) ; + smoke_res = intensity < 0.1 ? 1.: smoke_res + max(0., 2. - 0.3*intensity)*max(0., 2.*(uv_scaled_centered.y - 0.5)*(uv_scaled_centered.y - 0.5)); + + if(abs(uv.x) > 0.4){ + smoke_res = smoke_res + 10.*(abs(uv.x) - 0.4); + } + if(length((uv - vec2(0., 0.1))*vec2(0.19, 1.)) < min(0.1, intensity*0.5) && smoke_res > 1.){ + smoke_res = smoke_res + min(8.5,intensity*10.)*(length((uv - vec2(0., 0.1))*vec2(0.19, 1.))-0.1); + } + + vec4 ret_col = colour_1; + if(smoke_res > 1.){ + ret_col.a = 0.; + }else{ + if( uv.y < 0.12){ + ret_col = ret_col*(1. - 0.5*(0.12 - uv.y)) + 2.5*(0.12 - uv.y)*colour_2; + ret_col += ret_col*(-2.+0.5*intensity*smoke_res)*(0.12 - uv.y); + } + ret_col.a = 1.; + } + + return ret_col; +} \ No newline at end of file diff --git a/resources/shaders/flash.fs b/resources/shaders/flash.fs new file mode 100644 index 0000000..fc4485a --- /dev/null +++ b/resources/shaders/flash.fs @@ -0,0 +1,23 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + + +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP number mid_flash; + +#define PIXEL_SIZE_FAC 700. + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + //Convert to UV coords (0-1) and floor for pixel effect + number pixel_size = length(love_ScreenSize.xy)/PIXEL_SIZE_FAC; + vec2 uv = (floor(screen_coords.xy*(1./pixel_size))*pixel_size - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + + float mid_white = min(1.,(time > 2.5 ? max(0., sqrt(time - 2.5) - 60.*length(uv)) : 0.) + + (time > 11. ? max(0., (time-11.)*(time-11.) - 5.*length(uv)) : 0.)); + + return vec4(1., 1., 1., mid_flash*mid_white); +} \ No newline at end of file diff --git a/resources/shaders/foil.fs b/resources/shaders/foil.fs new file mode 100644 index 0000000..fbd221f --- /dev/null +++ b/resources/shaders/foil.fs @@ -0,0 +1,143 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + + +extern MY_HIGHP_OR_MEDIUMP vec2 foil; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y < 0.0001) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel( texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + vec2 adjusted_uv = uv - vec2(0.5, 0.5); + adjusted_uv.x = adjusted_uv.x*texture_details.b/texture_details.a; + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = min(high, max(0.5, 1. - low)); + + number fac = max(min(2.*sin((length(90.*adjusted_uv) + foil.r*2.) + 3.*(1.+0.8*cos(length(113.1121*adjusted_uv) - foil.r*3.121))) - 1. - max(5.-length(90.*adjusted_uv), 0.), 1.), 0.); + vec2 rotater = vec2(cos(foil.r*0.1221), sin(foil.r*0.3512)); + number angle = dot(rotater, adjusted_uv)/(length(rotater)*length(adjusted_uv)); + number fac2 = max(min(5.*cos(foil.g*0.3 + angle*3.14*(2.2+0.9*sin(foil.r*1.65 + 0.2*foil.g))) - 4. - max(2.-length(20.*adjusted_uv), 0.), 1.), 0.); + number fac3 = 0.3*max(min(2.*sin(foil.r*5. + uv.x*3. + 3.*(1.+0.5*cos(foil.r*7.))) - 1., 1.), -1.); + number fac4 = 0.3*max(min(2.*sin(foil.r*6.66 + uv.y*3.8 + 3.*(1.+0.5*cos(foil.r*3.414))) - 1., 1.), -1.); + + number maxfac = max(max(fac, max(fac2, max(fac3, max(fac4, 0.0)))) + 2.2*(fac+fac2+fac3+fac4), 0.); + + tex.r = tex.r-delta + delta*maxfac*0.3; + tex.g = tex.g-delta + delta*maxfac*0.3; + tex.b = tex.b + delta*maxfac*1.9; + tex.a = min(tex.a, 0.3*tex.a + 0.9*min(0.5, maxfac*0.1)); + + return dissolve_mask(tex, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/gold_seal.fs b/resources/shaders/gold_seal.fs new file mode 100644 index 0000000..850dd31 --- /dev/null +++ b/resources/shaders/gold_seal.fs @@ -0,0 +1,22 @@ +extern vec4 gold_seal; + +vec4 effect( vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + //r controls timing + //a controls alpha, but white will always be 1 + vec4 pixel; + pixel = Texel(texture, texture_coords); + number low = min(pixel.r, min(pixel.g, pixel.b)); + number high = max(pixel.r, max(pixel.g, pixel.b)); + number delta; + delta = high*0.5; + + number fac; + fac = 0.3+sin((texture_coords.x*450. + sin(gold_seal.r*6.)*180.)-700.*gold_seal.r) - sin((texture_coords.x*190. + texture_coords.y*30.)+1080.3*gold_seal.r); + + pixel.r = max(pixel.r, (1. - pixel.r)*delta*fac + pixel.r); + pixel.g = max(pixel.g, (1. - pixel.g)*delta*fac + pixel.g); + pixel.b = max(pixel.b, (1. - pixel.b)*delta*fac + pixel.b); + + return pixel; +} \ No newline at end of file diff --git a/resources/shaders/holo.fs b/resources/shaders/holo.fs new file mode 100644 index 0000000..c1d2d54 --- /dev/null +++ b/resources/shaders/holo.fs @@ -0,0 +1,152 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 holo; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y < 0.0001) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel(texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + vec4 hsl = HSL(0.5*tex + 0.5*vec4(0.,0.,1.,tex.a)); + + float t = holo.y*7.221 + time; + vec2 floored_uv = (floor((uv*texture_details.ba)))/texture_details.ba; + vec2 uv_scaled_centered = (floored_uv - 0.5) * 250.; + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + + float res = (.5 + .5* cos( (holo.x) * 2.612 + ( field + -.5 ) *3.14)); + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = 0.2+0.3*(high- low) + 0.1*high; + + number gridsize = 0.79; + number fac = 0.5*max(max(max(0., 7.*abs(cos(uv.x*gridsize*20.))-6.),max(0., 7.*cos(uv.y*gridsize*45. + uv.x*gridsize*20.)-6.)), max(0., 7.*cos(uv.y*gridsize*45. - uv.x*gridsize*20.)-6.)); + + hsl.x = hsl.x + res + fac; + hsl.y = hsl.y*1.3; + hsl.z = hsl.z*0.6+0.4; + + tex =(1.-delta)*tex + delta*RGB(hsl)*vec4(0.9,0.8,1.2,tex.a); + + if (tex[3] < 0.7) + tex[3] = tex[3]/3.; + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/hologram.fs b/resources/shaders/hologram.fs new file mode 100644 index 0000000..c101f70 --- /dev/null +++ b/resources/shaders/hologram.fs @@ -0,0 +1,129 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 hologram; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + //Glow effect + number glow = 0.; + int glow_samples = 4; + int actual_glow_samples = 0; + number glow_dist = 0.0015; + number _a = 0.; + + for (int i = -glow_samples; i <= glow_samples; ++i){ + for (int j = -glow_samples; j <= glow_samples; ++j){ + _a = Texel( texture, texture_coords + (glow_dist)*vec2(float(i), float(j))).a; + if (_a < 0.9){ + actual_glow_samples += 1; + glow = glow + _a; + } + } + } + glow /= 0.7*float(actual_glow_samples); + + //Create the horizontal glitch offset effects + number offset_l = 0.; + number offset_r = 0.; + number timefac = 1.0*hologram.g; + offset_l = -10.0*(-0.5+sin(timefac*0.512 + texture_coords.y*14.0) + + sin(-timefac*0.8233 + texture_coords.y*11.532) + + sin(timefac*0.333 + texture_coords.y*13.3) + + sin(-timefac*0.1112331 + texture_coords.y*4.044343)); + offset_r = -10.0*(-0.5+sin(timefac*0.6924 + texture_coords.y*19.0) + + sin(-timefac*0.9661 + texture_coords.y*21.532) + + sin(timefac*0.4423 + texture_coords.y*30.3) + + sin(-timefac*0.13321312 + texture_coords.y*3.011)); + if (offset_r >= 1.5 || offset_r <= 0.){offset_r = 0.;} + if (offset_l >= 1.5 || offset_l <= 0.){offset_l = 0.;} + texture_coords.x = texture_coords.x + 0.002*(-offset_l + offset_r); + + vec4 tex = Texel( texture, texture_coords); + if (tex.a > 0.999){tex = vec4(0.,0.,0.,0.);} + if (tex.a < 0.001){tex.rgb = vec3(0.,1.,1.);} + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + if (uv.x >0.95 || uv.x < 0.05 || uv.y > 0.95 || uv.y < 0.05){ + return vec4(0.,0.,0.,0.); + } + + number light_strength = 0.4*(0.3*sin(2.*hologram.g) + 0.6 + 0.3*sin(hologram.r*3.) + 0.9); + vec4 final_col; + if (tex.a < 0.001){ + final_col = tex*colour + vec4(0., 1., .5,0.6)*light_strength*(1.+abs(offset_l)+abs(offset_r))*glow; + } + else{ + final_col = tex*colour + vec4(0., 0.3, 0.2,0.3)*light_strength*(1.+abs(offset_l)+abs(offset_r))*glow; + } + +// + return dissolve_mask(final_col, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/negative.fs b/resources/shaders/negative.fs new file mode 100644 index 0000000..689f8e1 --- /dev/null +++ b/resources/shaders/negative.fs @@ -0,0 +1,133 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 negative; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y < 0.0001) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel(texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + vec4 SAT = HSL(tex); + + if (negative.g > 0.0 || negative.g < 0.0) { + SAT.b = (1.-SAT.b); + } + SAT.r = -SAT.r+0.2; + + tex = RGB(SAT) + 0.8*vec4(79./255., 99./255.,103./255.,0.); + + if (tex[3] < 0.7) + tex[3] = tex[3]/3.; + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/negative_shine.fs b/resources/shaders/negative_shine.fs new file mode 100644 index 0000000..c168779 --- /dev/null +++ b/resources/shaders/negative_shine.fs @@ -0,0 +1,98 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 negative_shine; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel( texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = high-low -0.1; + + number fac = 0.8 + 0.9*sin(11.*uv.x+4.32*uv.y + negative_shine.r*12. + cos(negative_shine.r*5.3 + uv.y*4.2 - uv.x*4.)); + number fac2 = 0.5 + 0.5*sin(8.*uv.x+2.32*uv.y + negative_shine.r*5. - cos(negative_shine.r*2.3 + uv.x*8.2)); + number fac3 = 0.5 + 0.5*sin(10.*uv.x+5.32*uv.y + negative_shine.r*6.111 + sin(negative_shine.r*5.3 + uv.y*3.2)); + number fac4 = 0.5 + 0.5*sin(3.*uv.x+2.32*uv.y + negative_shine.r*8.111 + sin(negative_shine.r*1.3 + uv.y*11.2)); + number fac5 = sin(0.9*16.*uv.x+5.32*uv.y + negative_shine.r*12. + cos(negative_shine.r*5.3 + uv.y*4.2 - uv.x*4.)); + + number maxfac = 0.7*max(max(fac, max(fac2, max(fac3,0.0))) + (fac+fac2+fac3*fac4), 0.); + + tex.rgb = tex.rgb*0.5 + vec3(0.4, 0.4, 0.8); + + tex.r = tex.r-delta + delta*maxfac*(0.7 + fac5*0.27) - 0.1; + tex.g = tex.g-delta + delta*maxfac*(0.7 - fac5*0.27) - 0.1; + tex.b = tex.b-delta + delta*maxfac*0.7 - 0.1; + tex.a = tex.a*(0.5*max(min(1., max(0.,0.3*max(low*0.2, delta)+ min(max(maxfac*0.1,0.), 0.4)) ), 0.) + 0.15*maxfac*(0.1+delta)); + + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/played.fs b/resources/shaders/played.fs new file mode 100644 index 0000000..6e0533a --- /dev/null +++ b/resources/shaders/played.fs @@ -0,0 +1,130 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + + +extern MY_HIGHP_OR_MEDIUMP vec2 played; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y == 0.) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel(texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + vec4 SAT = HSL(tex); + SAT.g = SAT.g*0.5 + 0.000001*played.r; + SAT.b = SAT.b*0.8; + + tex = RGB(SAT); + tex.a = tex.a*0.5; + + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/polychrome.fs b/resources/shaders/polychrome.fs new file mode 100644 index 0000000..1197afe --- /dev/null +++ b/resources/shaders/polychrome.fs @@ -0,0 +1,150 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 polychrome; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +number hue(number s, number t, number h) +{ + number hs = mod(h, 1.)*6.; + if (hs < 1.) return (t-s) * hs + s; + if (hs < 3.) return t; + if (hs < 4.) return (t-s) * (4.-hs) + s; + return s; +} + +vec4 RGB(vec4 c) +{ + if (c.y < 0.0001) + return vec4(vec3(c.z), c.a); + + number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z); + number s = 2.0 * c.z - t; + return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w); +} + +vec4 HSL(vec4 c) +{ + number low = min(c.r, min(c.g, c.b)); + number high = max(c.r, max(c.g, c.b)); + number delta = high - low; + number sum = high+low; + + vec4 hsl = vec4(.0, .0, .5 * sum, c.a); + if (delta == .0) + return hsl; + + hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum); + + if (high == c.r) + hsl.x = (c.g - c.b) / delta; + else if (high == c.g) + hsl.x = (c.b - c.r) / delta + 2.0; + else + hsl.x = (c.r - c.g) / delta + 4.0; + + hsl.x = mod(hsl.x / 6., 1.); + return hsl; +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel(texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = high - low; + + number saturation_fac = 1. - max(0., 0.05*(1.1-delta)); + + vec4 hsl = HSL(vec4(tex.r*saturation_fac, tex.g*saturation_fac, tex.b, tex.a)); + + float t = polychrome.y*2.221 + time; + vec2 floored_uv = (floor((uv*texture_details.ba)))/texture_details.ba; + vec2 uv_scaled_centered = (floored_uv - 0.5) * 50.; + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + + float res = (.5 + .5* cos( (polychrome.x) * 2.612 + ( field + -.5 ) *3.14)); + hsl.x = hsl.x+ res + polychrome.y*0.04; + hsl.y = min(0.6,hsl.y+0.5); + + tex.rgb = RGB(hsl).rgb; + + if (tex[3] < 0.7) + tex[3] = tex[3]/3.; + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/skew.fs b/resources/shaders/skew.fs new file mode 100644 index 0000000..4934eed --- /dev/null +++ b/resources/shaders/skew.fs @@ -0,0 +1,18 @@ +extern vec2 mouse_screen_pos; +extern float hovering; +extern float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/shaders/splash.fs b/resources/shaders/splash.fs new file mode 100644 index 0000000..af6bb1f --- /dev/null +++ b/resources/shaders/splash.fs @@ -0,0 +1,50 @@ +extern number time; +extern number vort_speed; +extern vec4 colour_1; +extern vec4 colour_2; +extern number mid_flash; +extern number vort_offset; + +#define PIXEL_SIZE_FAC 700. +#define BLACK 0.6*vec4(79./255.,99./255., 103./255., 1./0.6) + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + //Convert to UV coords (0-1) and floor for pixel effect + number pixel_size = length(love_ScreenSize.xy)/PIXEL_SIZE_FAC; + vec2 uv = (floor(screen_coords.xy*(1./pixel_size))*pixel_size - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + number uv_len = length(uv); + + //Adding in a center swirl, changes with time + number speed = time*vort_speed; + number new_pixel_angle = atan(uv.y, uv.x) + (2.2 + 0.4*min(6.,speed))*uv_len - 1. - speed*0.05 - min(6.,speed)*speed*0.02 + vort_offset; + vec2 mid = (love_ScreenSize.xy/length(love_ScreenSize.xy))/2.; + vec2 sv = vec2((uv_len * cos(new_pixel_angle) + mid.x), (uv_len * sin(new_pixel_angle) + mid.y)) - mid; + + //Now add the smoke effect to the swirled UV + + sv *= 30.; + speed = time*(6.)*vort_speed + vort_offset + 1033.; + vec2 uv2 = vec2(sv.x+sv.y); + + for(int i=0; i < 5; i++) { + uv2 += sin(max(sv.x, sv.y)) + sv; + sv += 0.5*vec2(cos(5.1123314 + 0.353*uv2.y + speed*0.131121),sin(uv2.x - 0.113*speed)); + sv -= 1.0*cos(sv.x + sv.y) - 1.0*sin(sv.x*0.711 - sv.y); + } + + //Make the smoke amount range from 0 - 2 + number smoke_res =min(2., max(-2., 1.5 + length(sv)*0.12 - 0.17*(min(10.,time*1.2 - 4.)))); + if (smoke_res < 0.2) { + smoke_res = (smoke_res - 0.2)*0.6 + 0.2; + } + + number c1p = max(0.,1. - 2.*abs(1.-smoke_res)); + number c2p = max(0.,1. - 2.*(smoke_res)); + number cb = 1. - min(1., c1p + c2p); + + vec4 ret_col = colour_1*c1p + colour_2*c2p + vec4(cb*BLACK.rgb, cb*colour_1.a); + number mod_flash = max(mid_flash*0.8, max(c1p, c2p)*5. - 4.4) + mid_flash*max(c1p, c2p); + + return ret_col*(1. - mod_flash) + mod_flash*vec4(1., 1., 1., 1.); +} \ No newline at end of file diff --git a/resources/shaders/vortex.fs b/resources/shaders/vortex.fs new file mode 100644 index 0000000..da1eb38 --- /dev/null +++ b/resources/shaders/vortex.fs @@ -0,0 +1,21 @@ +extern float vortex_amt; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + vec2 uv = (vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + + float effectRadius = 1.6 - 0.05*vortex_amt; + float effectAngle = 0.5 + 0.15*vortex_amt; + + float len = length(uv * vec2(love_ScreenSize.x / love_ScreenSize.y, 1.)); + float angle = atan(uv.y, uv.x) + effectAngle * smoothstep(effectRadius, 0., len); + float radius = length(uv); + + vec2 center = 0.5*love_ScreenSize.xy/length(love_ScreenSize.xy); + + vertex_position.x = (radius * cos(angle) + center.x)*length(love_ScreenSize.xy); + vertex_position.y = (radius * sin(angle) + center.y)*length(love_ScreenSize.xy); + return transform_projection * vertex_position; +} +#endif \ No newline at end of file diff --git a/resources/shaders/voucher.fs b/resources/shaders/voucher.fs new file mode 100644 index 0000000..5031cde --- /dev/null +++ b/resources/shaders/voucher.fs @@ -0,0 +1,98 @@ +#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH) + #define MY_HIGHP_OR_MEDIUMP highp +#else + #define MY_HIGHP_OR_MEDIUMP mediump +#endif + +extern MY_HIGHP_OR_MEDIUMP vec2 voucher; +extern MY_HIGHP_OR_MEDIUMP number dissolve; +extern MY_HIGHP_OR_MEDIUMP number time; +extern MY_HIGHP_OR_MEDIUMP vec4 texture_details; +extern MY_HIGHP_OR_MEDIUMP vec2 image_details; +extern bool shadow; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; +extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; + +vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv) +{ + if (dissolve < 0.001) { + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a); + } + + float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values + + float t = time * 10.0 + 2003.; + vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); + vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a); + + vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324)); + vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532)); + vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000)); + + float field = (1.+ ( + cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) + + cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.; + vec2 borders = vec2(0.2, 0.8); + + float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14)) + - (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) + - (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve); + + if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) { + tex.rgba = burn_colour_1.rgba; + } else if (burn_colour_2.a > 0.01) { + tex.rgba = burn_colour_2.rgba; + } + } + + return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0); +} + +vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords ) +{ + vec4 tex = Texel( texture, texture_coords); + vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; + + number low = min(tex.r, min(tex.g, tex.b)); + number high = max(tex.r, max(tex.g, tex.b)); + number delta = high-low; + + number fac = 0.8 + 0.9*sin(13.*uv.x+5.32*uv.y + voucher.r*12. + cos(voucher.r*5.3 + uv.y*4.2 - uv.x*4.)); + number fac2 = 0.5 + 0.5*sin(10.*uv.x+2.32*uv.y + voucher.r*5. - cos(voucher.r*2.3 + uv.x*8.2)); + number fac3 = 0.5 + 0.5*sin(12.*uv.x+6.32*uv.y + voucher.r*6.111 + sin(voucher.r*5.3 + uv.y*3.2)); + number fac4 = 0.5 + 0.5*sin(4.*uv.x+2.32*uv.y + voucher.r*8.111 + sin(voucher.r*1.3 + uv.y*13.2)); + number fac5 = sin(0.5*16.*uv.x+5.32*uv.y + voucher.r*12. + cos(voucher.r*5.3 + uv.y*4.2 - uv.x*4.)); + + number maxfac = 0.6*max(max(fac, max(fac2, max(fac3,0.0))) + (fac+fac2+fac3*fac4), 0.); + + tex.rgb = tex.rgb*0.5 + vec3(0.4, 0.4, 0.8); + + tex.r = tex.r-delta + delta*maxfac*(0.7 + fac5*0.07) - 0.1; + tex.g = tex.g-delta + delta*maxfac*(0.7 - fac5*0.17) - 0.1; + tex.b = tex.b-delta + delta*maxfac*0.7 - 0.1; + tex.a = tex.a*(0.8*max(min(1., max(0.,0.3*max(low*0.2, delta)+ min(max(maxfac*0.1,0.), 0.4)) ), 0.) + 0.15*maxfac*(0.1+delta)); + + return dissolve_mask(tex*colour, texture_coords, uv); +} + +extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos; +extern MY_HIGHP_OR_MEDIUMP float hovering; +extern MY_HIGHP_OR_MEDIUMP float screen_scale; + +#ifdef VERTEX +vec4 position( mat4 transform_projection, vec4 vertex_position ) +{ + if (hovering <= 0.){ + return transform_projection * vertex_position; + } + float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); + vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale; + float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist)) + *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); + + return transform_projection * vertex_position + vec4(0,0,0,scale); +} +#endif \ No newline at end of file diff --git a/resources/sounds/ambientFire1.ogg b/resources/sounds/ambientFire1.ogg new file mode 100644 index 0000000..fb30ee0 Binary files /dev/null and b/resources/sounds/ambientFire1.ogg differ diff --git a/resources/sounds/ambientFire2.ogg b/resources/sounds/ambientFire2.ogg new file mode 100644 index 0000000..8e47da1 Binary files /dev/null and b/resources/sounds/ambientFire2.ogg differ diff --git a/resources/sounds/ambientFire3.ogg b/resources/sounds/ambientFire3.ogg new file mode 100644 index 0000000..7846b71 Binary files /dev/null and b/resources/sounds/ambientFire3.ogg differ diff --git a/resources/sounds/ambientOrgan1.ogg b/resources/sounds/ambientOrgan1.ogg new file mode 100644 index 0000000..93dd7de Binary files /dev/null and b/resources/sounds/ambientOrgan1.ogg differ diff --git a/resources/sounds/button.ogg b/resources/sounds/button.ogg new file mode 100644 index 0000000..226d626 Binary files /dev/null and b/resources/sounds/button.ogg differ diff --git a/resources/sounds/cancel.ogg b/resources/sounds/cancel.ogg new file mode 100644 index 0000000..14059f9 Binary files /dev/null and b/resources/sounds/cancel.ogg differ diff --git a/resources/sounds/card1.ogg b/resources/sounds/card1.ogg new file mode 100644 index 0000000..6b8b67a Binary files /dev/null and b/resources/sounds/card1.ogg differ diff --git a/resources/sounds/card3.ogg b/resources/sounds/card3.ogg new file mode 100644 index 0000000..4d9ffe5 Binary files /dev/null and b/resources/sounds/card3.ogg differ diff --git a/resources/sounds/cardFan2.ogg b/resources/sounds/cardFan2.ogg new file mode 100644 index 0000000..4d0fe22 Binary files /dev/null and b/resources/sounds/cardFan2.ogg differ diff --git a/resources/sounds/cardSlide1.ogg b/resources/sounds/cardSlide1.ogg new file mode 100644 index 0000000..22cb1a7 Binary files /dev/null and b/resources/sounds/cardSlide1.ogg differ diff --git a/resources/sounds/cardSlide2.ogg b/resources/sounds/cardSlide2.ogg new file mode 100644 index 0000000..3fc4fe9 Binary files /dev/null and b/resources/sounds/cardSlide2.ogg differ diff --git a/resources/sounds/chips1.ogg b/resources/sounds/chips1.ogg new file mode 100644 index 0000000..c953e73 Binary files /dev/null and b/resources/sounds/chips1.ogg differ diff --git a/resources/sounds/chips2.ogg b/resources/sounds/chips2.ogg new file mode 100644 index 0000000..2a3f9d7 Binary files /dev/null and b/resources/sounds/chips2.ogg differ diff --git a/resources/sounds/coin1.ogg b/resources/sounds/coin1.ogg new file mode 100644 index 0000000..3262684 Binary files /dev/null and b/resources/sounds/coin1.ogg differ diff --git a/resources/sounds/coin2.ogg b/resources/sounds/coin2.ogg new file mode 100644 index 0000000..4840b3c Binary files /dev/null and b/resources/sounds/coin2.ogg differ diff --git a/resources/sounds/coin3.ogg b/resources/sounds/coin3.ogg new file mode 100644 index 0000000..d20899d Binary files /dev/null and b/resources/sounds/coin3.ogg differ diff --git a/resources/sounds/coin4.ogg b/resources/sounds/coin4.ogg new file mode 100644 index 0000000..263e53d Binary files /dev/null and b/resources/sounds/coin4.ogg differ diff --git a/resources/sounds/coin5.ogg b/resources/sounds/coin5.ogg new file mode 100644 index 0000000..fd40a16 Binary files /dev/null and b/resources/sounds/coin5.ogg differ diff --git a/resources/sounds/coin6.ogg b/resources/sounds/coin6.ogg new file mode 100644 index 0000000..046ab3d Binary files /dev/null and b/resources/sounds/coin6.ogg differ diff --git a/resources/sounds/coin7.ogg b/resources/sounds/coin7.ogg new file mode 100644 index 0000000..1140d4b Binary files /dev/null and b/resources/sounds/coin7.ogg differ diff --git a/resources/sounds/crumple1.ogg b/resources/sounds/crumple1.ogg new file mode 100644 index 0000000..e23e3cf Binary files /dev/null and b/resources/sounds/crumple1.ogg differ diff --git a/resources/sounds/crumple2.ogg b/resources/sounds/crumple2.ogg new file mode 100644 index 0000000..8525f8c Binary files /dev/null and b/resources/sounds/crumple2.ogg differ diff --git a/resources/sounds/crumple3.ogg b/resources/sounds/crumple3.ogg new file mode 100644 index 0000000..bf102aa Binary files /dev/null and b/resources/sounds/crumple3.ogg differ diff --git a/resources/sounds/crumple4.ogg b/resources/sounds/crumple4.ogg new file mode 100644 index 0000000..2ad288b Binary files /dev/null and b/resources/sounds/crumple4.ogg differ diff --git a/resources/sounds/crumple5.ogg b/resources/sounds/crumple5.ogg new file mode 100644 index 0000000..970af6f Binary files /dev/null and b/resources/sounds/crumple5.ogg differ diff --git a/resources/sounds/crumpleLong1.ogg b/resources/sounds/crumpleLong1.ogg new file mode 100644 index 0000000..2e26e93 Binary files /dev/null and b/resources/sounds/crumpleLong1.ogg differ diff --git a/resources/sounds/crumpleLong2.ogg b/resources/sounds/crumpleLong2.ogg new file mode 100644 index 0000000..dfee185 Binary files /dev/null and b/resources/sounds/crumpleLong2.ogg differ diff --git a/resources/sounds/explosion1.ogg b/resources/sounds/explosion1.ogg new file mode 100644 index 0000000..ac1d1f7 Binary files /dev/null and b/resources/sounds/explosion1.ogg differ diff --git a/resources/sounds/explosion_buildup1.ogg b/resources/sounds/explosion_buildup1.ogg new file mode 100644 index 0000000..19ba006 Binary files /dev/null and b/resources/sounds/explosion_buildup1.ogg differ diff --git a/resources/sounds/explosion_release1.ogg b/resources/sounds/explosion_release1.ogg new file mode 100644 index 0000000..d950551 Binary files /dev/null and b/resources/sounds/explosion_release1.ogg differ diff --git a/resources/sounds/foil1.ogg b/resources/sounds/foil1.ogg new file mode 100644 index 0000000..f234c5e Binary files /dev/null and b/resources/sounds/foil1.ogg differ diff --git a/resources/sounds/foil2.ogg b/resources/sounds/foil2.ogg new file mode 100644 index 0000000..754c567 Binary files /dev/null and b/resources/sounds/foil2.ogg differ diff --git a/resources/sounds/generic1.ogg b/resources/sounds/generic1.ogg new file mode 100644 index 0000000..d5d6a20 Binary files /dev/null and b/resources/sounds/generic1.ogg differ diff --git a/resources/sounds/glass1.ogg b/resources/sounds/glass1.ogg new file mode 100644 index 0000000..31ae330 Binary files /dev/null and b/resources/sounds/glass1.ogg differ diff --git a/resources/sounds/glass2.ogg b/resources/sounds/glass2.ogg new file mode 100644 index 0000000..6e5c139 Binary files /dev/null and b/resources/sounds/glass2.ogg differ diff --git a/resources/sounds/glass3.ogg b/resources/sounds/glass3.ogg new file mode 100644 index 0000000..659eefa Binary files /dev/null and b/resources/sounds/glass3.ogg differ diff --git a/resources/sounds/glass4.ogg b/resources/sounds/glass4.ogg new file mode 100644 index 0000000..b2f90f4 Binary files /dev/null and b/resources/sounds/glass4.ogg differ diff --git a/resources/sounds/glass5.ogg b/resources/sounds/glass5.ogg new file mode 100644 index 0000000..52d86c4 Binary files /dev/null and b/resources/sounds/glass5.ogg differ diff --git a/resources/sounds/glass6.ogg b/resources/sounds/glass6.ogg new file mode 100644 index 0000000..d7cf979 Binary files /dev/null and b/resources/sounds/glass6.ogg differ diff --git a/resources/sounds/gold_seal.ogg b/resources/sounds/gold_seal.ogg new file mode 100644 index 0000000..8dd3d70 Binary files /dev/null and b/resources/sounds/gold_seal.ogg differ diff --git a/resources/sounds/gong.ogg b/resources/sounds/gong.ogg new file mode 100644 index 0000000..0cf31ad Binary files /dev/null and b/resources/sounds/gong.ogg differ diff --git a/resources/sounds/highlight1.ogg b/resources/sounds/highlight1.ogg new file mode 100644 index 0000000..db0b4a1 Binary files /dev/null and b/resources/sounds/highlight1.ogg differ diff --git a/resources/sounds/highlight2.ogg b/resources/sounds/highlight2.ogg new file mode 100644 index 0000000..1dff921 Binary files /dev/null and b/resources/sounds/highlight2.ogg differ diff --git a/resources/sounds/holo1.ogg b/resources/sounds/holo1.ogg new file mode 100644 index 0000000..2d7d366 Binary files /dev/null and b/resources/sounds/holo1.ogg differ diff --git a/resources/sounds/introPad1.ogg b/resources/sounds/introPad1.ogg new file mode 100644 index 0000000..d2199bd Binary files /dev/null and b/resources/sounds/introPad1.ogg differ diff --git a/resources/sounds/magic_crumple.ogg b/resources/sounds/magic_crumple.ogg new file mode 100644 index 0000000..36b5cc4 Binary files /dev/null and b/resources/sounds/magic_crumple.ogg differ diff --git a/resources/sounds/magic_crumple2.ogg b/resources/sounds/magic_crumple2.ogg new file mode 100644 index 0000000..9569f0e Binary files /dev/null and b/resources/sounds/magic_crumple2.ogg differ diff --git a/resources/sounds/magic_crumple3.ogg b/resources/sounds/magic_crumple3.ogg new file mode 100644 index 0000000..6cc136f Binary files /dev/null and b/resources/sounds/magic_crumple3.ogg differ diff --git a/resources/sounds/multhit1.ogg b/resources/sounds/multhit1.ogg new file mode 100644 index 0000000..c578f67 Binary files /dev/null and b/resources/sounds/multhit1.ogg differ diff --git a/resources/sounds/multhit2.ogg b/resources/sounds/multhit2.ogg new file mode 100644 index 0000000..be2903a Binary files /dev/null and b/resources/sounds/multhit2.ogg differ diff --git a/resources/sounds/music1.ogg b/resources/sounds/music1.ogg new file mode 100644 index 0000000..71ebb23 Binary files /dev/null and b/resources/sounds/music1.ogg differ diff --git a/resources/sounds/music2.ogg b/resources/sounds/music2.ogg new file mode 100644 index 0000000..8ff5784 Binary files /dev/null and b/resources/sounds/music2.ogg differ diff --git a/resources/sounds/music3.ogg b/resources/sounds/music3.ogg new file mode 100644 index 0000000..6ccdbc3 Binary files /dev/null and b/resources/sounds/music3.ogg differ diff --git a/resources/sounds/music4.ogg b/resources/sounds/music4.ogg new file mode 100644 index 0000000..8590901 Binary files /dev/null and b/resources/sounds/music4.ogg differ diff --git a/resources/sounds/music5.ogg b/resources/sounds/music5.ogg new file mode 100644 index 0000000..1db4df5 Binary files /dev/null and b/resources/sounds/music5.ogg differ diff --git a/resources/sounds/negative.ogg b/resources/sounds/negative.ogg new file mode 100644 index 0000000..b0b1805 Binary files /dev/null and b/resources/sounds/negative.ogg differ diff --git a/resources/sounds/other1.ogg b/resources/sounds/other1.ogg new file mode 100644 index 0000000..eb24357 Binary files /dev/null and b/resources/sounds/other1.ogg differ diff --git a/resources/sounds/paper1.ogg b/resources/sounds/paper1.ogg new file mode 100644 index 0000000..0f1efef Binary files /dev/null and b/resources/sounds/paper1.ogg differ diff --git a/resources/sounds/polychrome1.ogg b/resources/sounds/polychrome1.ogg new file mode 100644 index 0000000..96a5f42 Binary files /dev/null and b/resources/sounds/polychrome1.ogg differ diff --git a/resources/sounds/slice1.ogg b/resources/sounds/slice1.ogg new file mode 100644 index 0000000..65889da Binary files /dev/null and b/resources/sounds/slice1.ogg differ diff --git a/resources/sounds/splash_buildup.ogg b/resources/sounds/splash_buildup.ogg new file mode 100644 index 0000000..0f2d9b7 Binary files /dev/null and b/resources/sounds/splash_buildup.ogg differ diff --git a/resources/sounds/tarot1.ogg b/resources/sounds/tarot1.ogg new file mode 100644 index 0000000..51ba5bc Binary files /dev/null and b/resources/sounds/tarot1.ogg differ diff --git a/resources/sounds/tarot2.ogg b/resources/sounds/tarot2.ogg new file mode 100644 index 0000000..fbc8913 Binary files /dev/null and b/resources/sounds/tarot2.ogg differ diff --git a/resources/sounds/timpani.ogg b/resources/sounds/timpani.ogg new file mode 100644 index 0000000..3a47ded Binary files /dev/null and b/resources/sounds/timpani.ogg differ diff --git a/resources/sounds/voice1.ogg b/resources/sounds/voice1.ogg new file mode 100644 index 0000000..afa722e Binary files /dev/null and b/resources/sounds/voice1.ogg differ diff --git a/resources/sounds/voice10.ogg b/resources/sounds/voice10.ogg new file mode 100644 index 0000000..b1083ee Binary files /dev/null and b/resources/sounds/voice10.ogg differ diff --git a/resources/sounds/voice11.ogg b/resources/sounds/voice11.ogg new file mode 100644 index 0000000..ddb6823 Binary files /dev/null and b/resources/sounds/voice11.ogg differ diff --git a/resources/sounds/voice2.ogg b/resources/sounds/voice2.ogg new file mode 100644 index 0000000..5e7124f Binary files /dev/null and b/resources/sounds/voice2.ogg differ diff --git a/resources/sounds/voice3.ogg b/resources/sounds/voice3.ogg new file mode 100644 index 0000000..6238b88 Binary files /dev/null and b/resources/sounds/voice3.ogg differ diff --git a/resources/sounds/voice4.ogg b/resources/sounds/voice4.ogg new file mode 100644 index 0000000..28d4673 Binary files /dev/null and b/resources/sounds/voice4.ogg differ diff --git a/resources/sounds/voice5.ogg b/resources/sounds/voice5.ogg new file mode 100644 index 0000000..664de83 Binary files /dev/null and b/resources/sounds/voice5.ogg differ diff --git a/resources/sounds/voice6.ogg b/resources/sounds/voice6.ogg new file mode 100644 index 0000000..e4acc6a Binary files /dev/null and b/resources/sounds/voice6.ogg differ diff --git a/resources/sounds/voice7.ogg b/resources/sounds/voice7.ogg new file mode 100644 index 0000000..3974e41 Binary files /dev/null and b/resources/sounds/voice7.ogg differ diff --git a/resources/sounds/voice8.ogg b/resources/sounds/voice8.ogg new file mode 100644 index 0000000..d6ee50f Binary files /dev/null and b/resources/sounds/voice8.ogg differ diff --git a/resources/sounds/voice9.ogg b/resources/sounds/voice9.ogg new file mode 100644 index 0000000..ea409f8 Binary files /dev/null and b/resources/sounds/voice9.ogg differ diff --git a/resources/sounds/whoosh.ogg b/resources/sounds/whoosh.ogg new file mode 100644 index 0000000..a9aa892 Binary files /dev/null and b/resources/sounds/whoosh.ogg differ diff --git a/resources/sounds/whoosh1.ogg b/resources/sounds/whoosh1.ogg new file mode 100644 index 0000000..f8fadcc Binary files /dev/null and b/resources/sounds/whoosh1.ogg differ diff --git a/resources/sounds/whoosh2.ogg b/resources/sounds/whoosh2.ogg new file mode 100644 index 0000000..5c3ee83 Binary files /dev/null and b/resources/sounds/whoosh2.ogg differ diff --git a/resources/sounds/whoosh_long.ogg b/resources/sounds/whoosh_long.ogg new file mode 100644 index 0000000..098a29b Binary files /dev/null and b/resources/sounds/whoosh_long.ogg differ diff --git a/resources/sounds/win.ogg b/resources/sounds/win.ogg new file mode 100644 index 0000000..e8d69d3 Binary files /dev/null and b/resources/sounds/win.ogg differ diff --git a/resources/textures/1x/8BitDeck.png b/resources/textures/1x/8BitDeck.png new file mode 100644 index 0000000..6661550 Binary files /dev/null and b/resources/textures/1x/8BitDeck.png differ diff --git a/resources/textures/1x/8BitDeck_opt2.png b/resources/textures/1x/8BitDeck_opt2.png new file mode 100644 index 0000000..39b931f Binary files /dev/null and b/resources/textures/1x/8BitDeck_opt2.png differ diff --git a/resources/textures/1x/BlindChips.png b/resources/textures/1x/BlindChips.png new file mode 100644 index 0000000..37fcbc1 Binary files /dev/null and b/resources/textures/1x/BlindChips.png differ diff --git a/resources/textures/1x/Enhancers.png b/resources/textures/1x/Enhancers.png new file mode 100644 index 0000000..e0cf3cc Binary files /dev/null and b/resources/textures/1x/Enhancers.png differ diff --git a/resources/textures/1x/Jokers.png b/resources/textures/1x/Jokers.png new file mode 100644 index 0000000..7075b3b Binary files /dev/null and b/resources/textures/1x/Jokers.png differ diff --git a/resources/textures/1x/ShopSignAnimation.png b/resources/textures/1x/ShopSignAnimation.png new file mode 100644 index 0000000..0d797a4 Binary files /dev/null and b/resources/textures/1x/ShopSignAnimation.png differ diff --git a/resources/textures/1x/Tarots.png b/resources/textures/1x/Tarots.png new file mode 100644 index 0000000..c75cfdc Binary files /dev/null and b/resources/textures/1x/Tarots.png differ diff --git a/resources/textures/1x/Vouchers.png b/resources/textures/1x/Vouchers.png new file mode 100644 index 0000000..ae65b0b Binary files /dev/null and b/resources/textures/1x/Vouchers.png differ diff --git a/resources/textures/1x/balatro.png b/resources/textures/1x/balatro.png new file mode 100644 index 0000000..a3ccb5e Binary files /dev/null and b/resources/textures/1x/balatro.png differ diff --git a/resources/textures/1x/balatro_alt.png b/resources/textures/1x/balatro_alt.png new file mode 100644 index 0000000..73afcba Binary files /dev/null and b/resources/textures/1x/balatro_alt.png differ diff --git a/resources/textures/1x/boosters.png b/resources/textures/1x/boosters.png new file mode 100644 index 0000000..79a640a Binary files /dev/null and b/resources/textures/1x/boosters.png differ diff --git a/resources/textures/1x/chips.png b/resources/textures/1x/chips.png new file mode 100644 index 0000000..92b1445 Binary files /dev/null and b/resources/textures/1x/chips.png differ diff --git a/resources/textures/1x/gamepad_ui.png b/resources/textures/1x/gamepad_ui.png new file mode 100644 index 0000000..b621653 Binary files /dev/null and b/resources/textures/1x/gamepad_ui.png differ diff --git a/resources/textures/1x/icons.png b/resources/textures/1x/icons.png new file mode 100644 index 0000000..c2931c3 Binary files /dev/null and b/resources/textures/1x/icons.png differ diff --git a/resources/textures/1x/localthunk-logo.png b/resources/textures/1x/localthunk-logo.png new file mode 100644 index 0000000..9cad67a Binary files /dev/null and b/resources/textures/1x/localthunk-logo.png differ diff --git a/resources/textures/1x/playstack-logo.png b/resources/textures/1x/playstack-logo.png new file mode 100644 index 0000000..d7b9618 Binary files /dev/null and b/resources/textures/1x/playstack-logo.png differ diff --git a/resources/textures/1x/stickers.png b/resources/textures/1x/stickers.png new file mode 100644 index 0000000..0849da8 Binary files /dev/null and b/resources/textures/1x/stickers.png differ diff --git a/resources/textures/1x/tags.png b/resources/textures/1x/tags.png new file mode 100644 index 0000000..b0248cd Binary files /dev/null and b/resources/textures/1x/tags.png differ diff --git a/resources/textures/1x/ui_assets.png b/resources/textures/1x/ui_assets.png new file mode 100644 index 0000000..ffb5f32 Binary files /dev/null and b/resources/textures/1x/ui_assets.png differ diff --git a/resources/textures/1x/ui_assets_opt2.png b/resources/textures/1x/ui_assets_opt2.png new file mode 100644 index 0000000..dfb2b81 Binary files /dev/null and b/resources/textures/1x/ui_assets_opt2.png differ diff --git a/resources/textures/2x/8BitDeck.png b/resources/textures/2x/8BitDeck.png new file mode 100644 index 0000000..7af99be Binary files /dev/null and b/resources/textures/2x/8BitDeck.png differ diff --git a/resources/textures/2x/8BitDeck_opt2.png b/resources/textures/2x/8BitDeck_opt2.png new file mode 100644 index 0000000..e284646 Binary files /dev/null and b/resources/textures/2x/8BitDeck_opt2.png differ diff --git a/resources/textures/2x/BlindChips.png b/resources/textures/2x/BlindChips.png new file mode 100644 index 0000000..0f67c8c Binary files /dev/null and b/resources/textures/2x/BlindChips.png differ diff --git a/resources/textures/2x/Enhancers.png b/resources/textures/2x/Enhancers.png new file mode 100644 index 0000000..b8fdc3d Binary files /dev/null and b/resources/textures/2x/Enhancers.png differ diff --git a/resources/textures/2x/Jokers.png b/resources/textures/2x/Jokers.png new file mode 100644 index 0000000..acedec5 Binary files /dev/null and b/resources/textures/2x/Jokers.png differ diff --git a/resources/textures/2x/ShopSignAnimation.png b/resources/textures/2x/ShopSignAnimation.png new file mode 100644 index 0000000..813b8a9 Binary files /dev/null and b/resources/textures/2x/ShopSignAnimation.png differ diff --git a/resources/textures/2x/Tarots.png b/resources/textures/2x/Tarots.png new file mode 100644 index 0000000..2880644 Binary files /dev/null and b/resources/textures/2x/Tarots.png differ diff --git a/resources/textures/2x/Vouchers.png b/resources/textures/2x/Vouchers.png new file mode 100644 index 0000000..6927a72 Binary files /dev/null and b/resources/textures/2x/Vouchers.png differ diff --git a/resources/textures/2x/balatro.png b/resources/textures/2x/balatro.png new file mode 100644 index 0000000..160ea68 Binary files /dev/null and b/resources/textures/2x/balatro.png differ diff --git a/resources/textures/2x/balatro_alt.png b/resources/textures/2x/balatro_alt.png new file mode 100644 index 0000000..d7c6051 Binary files /dev/null and b/resources/textures/2x/balatro_alt.png differ diff --git a/resources/textures/2x/boosters.png b/resources/textures/2x/boosters.png new file mode 100644 index 0000000..cbfe9bc Binary files /dev/null and b/resources/textures/2x/boosters.png differ diff --git a/resources/textures/2x/chips.png b/resources/textures/2x/chips.png new file mode 100644 index 0000000..9ebaaa2 Binary files /dev/null and b/resources/textures/2x/chips.png differ diff --git a/resources/textures/2x/gamepad_ui.png b/resources/textures/2x/gamepad_ui.png new file mode 100644 index 0000000..7828a5b Binary files /dev/null and b/resources/textures/2x/gamepad_ui.png differ diff --git a/resources/textures/2x/icons.png b/resources/textures/2x/icons.png new file mode 100644 index 0000000..cbb12ca Binary files /dev/null and b/resources/textures/2x/icons.png differ diff --git a/resources/textures/2x/localthunk-logo.png b/resources/textures/2x/localthunk-logo.png new file mode 100644 index 0000000..e770984 Binary files /dev/null and b/resources/textures/2x/localthunk-logo.png differ diff --git a/resources/textures/2x/playstack-logo.png b/resources/textures/2x/playstack-logo.png new file mode 100644 index 0000000..8c2c17c Binary files /dev/null and b/resources/textures/2x/playstack-logo.png differ diff --git a/resources/textures/2x/stickers.png b/resources/textures/2x/stickers.png new file mode 100644 index 0000000..9e009b8 Binary files /dev/null and b/resources/textures/2x/stickers.png differ diff --git a/resources/textures/2x/tags.png b/resources/textures/2x/tags.png new file mode 100644 index 0000000..5c59357 Binary files /dev/null and b/resources/textures/2x/tags.png differ diff --git a/resources/textures/2x/ui_assets.png b/resources/textures/2x/ui_assets.png new file mode 100644 index 0000000..5b36bcf Binary files /dev/null and b/resources/textures/2x/ui_assets.png differ diff --git a/resources/textures/2x/ui_assets_opt2.png b/resources/textures/2x/ui_assets_opt2.png new file mode 100644 index 0000000..6b5a487 Binary files /dev/null and b/resources/textures/2x/ui_assets_opt2.png differ diff --git a/tag.lua b/tag.lua new file mode 100644 index 0000000..a283a31 --- /dev/null +++ b/tag.lua @@ -0,0 +1,583 @@ +--Class +Tag = Object:extend() + +--Class Methods +function Tag:init(_tag, for_collection, _blind_type) + self.key = _tag + local proto = G.P_TAGS[_tag] or G.tag_undiscovered + self.config = copy_table(proto.config) + self.pos = proto.pos + self.name = proto.name + self.tally = G.GAME.tag_tally or 0 + self.triggered = false + G.tagid = G.tagid or 0 + self.ID = G.tagid + G.tagid = G.tagid + 1 + self.ability = { + orbital_hand = '['..localize('k_poker_hand')..']', + blind_type = _blind_type + } + G.GAME.tag_tally = G.GAME.tag_tally and (G.GAME.tag_tally + 1) or 1 + if not for_collection then self:set_ability() end +end + +function Tag:nope() + G.E_MANAGER:add_event(Event({ + delay = 0.2, + trigger = 'after', + func = (function() + attention_text({ + text = 'NOPE', + colour = G.C.WHITE, + scale = 0.7, + hold = 0.3/G.SETTINGS.GAMESPEED, + cover = self.HUD_tag, + cover_colour = G.C.BLACK, + align = 'cm', + }) + play_sound('cancel', 1.4, 0.5) + return true + end) + })) + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.1, + func = (function() + self.HUD_tag.states.visible = false + play_sound('cancel', 1.26, 0.5) + return true + end) + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.5, + func = (function() + self:remove() + return true + end) + })) +end + +function Tag:yep(message, _colour, func) + stop_use() + + G.E_MANAGER:add_event(Event({ + delay = 0.4, + trigger = 'after', + func = (function() + attention_text({ + text = message, + colour = G.C.WHITE, + scale = 1, + hold = 0.3/G.SETTINGS.GAMESPEED, + cover = self.HUD_tag, + cover_colour = _colour or G.C.GREEN, + align = 'cm', + }) + play_sound('generic1', 0.9 + math.random()*0.1, 0.8) + play_sound('holo1', 1.2 + math.random()*0.1, 0.4) + return true + end) + })) + G.E_MANAGER:add_event(Event({ + func = (function() + self.HUD_tag.states.visible = false + return true + end) + })) + G.E_MANAGER:add_event(Event({ + func = func + })) + + G.E_MANAGER:add_event(Event({ + trigger = 'after', + delay = 0.7, + func = (function() + self:remove() + return true + end) + })) +end + +function Tag:set_ability() + if self.name == 'Orbital Tag' then + if G.orbital_hand then + self.ability.orbital_hand = G.orbital_hand + elseif self.ability.blind_type then + if G.GAME.orbital_choices and G.GAME.orbital_choices[G.GAME.round_resets.ante][self.ability.blind_type] then + self.ability.orbital_hand = G.GAME.orbital_choices[G.GAME.round_resets.ante][self.ability.blind_type] + end + end + end +end + +function Tag:apply_to_run(_context) + if not self.triggered and self.config.type == _context.type then + if _context.type == 'eval' then + if self.name == 'Investment Tag' and + G.GAME.last_blind and G.GAME.last_blind.boss then + self:yep('+', G.C.GOLD,function() + return true + end) + self.triggered = true + return { + dollars = 15, + condition = localize('ph_defeat_the_boss'), + pos = self.pos, + tag = self + } + end + elseif _context.type == 'immediate' then + local lock = self.ID + G.CONTROLLER.locks[lock] = true + if self.name == 'Top-up Tag' then + self:yep('+', G.C.PURPLE,function() + for i = 1, self.config.spawn_jokers do + if G.jokers and #G.jokers.cards < G.jokers.config.card_limit then + local card = create_card('Joker', G.jokers, nil, 0, nil, nil, nil, 'top') + card:add_to_deck() + G.jokers:emplace(card) + end + end + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Skip Tag' then + self:yep('+', G.C.MONEY,function() + G.CONTROLLER.locks[lock] = nil + return true + end) + ease_dollars((G.GAME.skips or 0)*self.config.skip_bonus) + self.triggered = true + return true + end + if self.name == 'Garbage Tag' then + self:yep('+', G.C.MONEY,function() + G.CONTROLLER.locks[lock] = nil + return true + end) + ease_dollars((G.GAME.unused_discards or 0)*self.config.dollars_per_discard) + self.triggered = true + return true + end + if self.name == 'Handy Tag' then + self:yep('+', G.C.MONEY,function() + G.CONTROLLER.locks[lock] = nil + return true + end) + ease_dollars((G.GAME.hands_played or 0)*self.config.dollars_per_hand) + self.triggered = true + return true + end + if self.name == 'Economy Tag' then + self:yep('+', G.C.MONEY,function() + G.CONTROLLER.locks[lock] = nil + return true + end) + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + ease_dollars(math.min(self.config.max, math.max(0,G.GAME.dollars)), true) + return true + end + })) + self.triggered = true + return true + end + if self.name == 'Orbital Tag' then + update_hand_text({sound = 'button', volume = 0.7, pitch = 0.8, delay = 0.3}, { + handname= self.ability.orbital_hand, + chips = G.GAME.hands[self.ability.orbital_hand].chips, + mult = G.GAME.hands[self.ability.orbital_hand].mult, + level= G.GAME.hands[self.ability.orbital_hand].level}) + level_up_hand(self, self.ability.orbital_hand, nil, self.config.levels) + update_hand_text({sound = 'button', volume = 0.7, pitch = 1.1, delay = 0}, {mult = 0, chips = 0, handname = '', level = ''}) + self:yep('+', G.C.MONEY,function() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + elseif _context.type == 'new_blind_choice' then + local lock = self.ID + G.CONTROLLER.locks[lock] = true + if self.name == 'Charm Tag' then + self:yep('+', G.C.PURPLE,function() + local key = 'p_arcana_mega_'..(math.random(1,2)) + local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2, + G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true}) + card.cost = 0 + card.from_tag = true + G.FUNCS.use_card({config = {ref_table = card}}) + card:start_materialize() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Meteor Tag' then + self:yep('+', G.C.SECONDARY_SET.Planet,function() + local key = 'p_celestial_mega_'..(math.random(1,2)) + local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2, + G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true}) + card.cost = 0 + card.from_tag = true + G.FUNCS.use_card({config = {ref_table = card}}) + card:start_materialize() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Ethereal Tag' then + self:yep('+', G.C.SECONDARY_SET.Spectral,function() + local key = 'p_spectral_normal_1' + local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2, + G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true}) + card.cost = 0 + card.from_tag = true + G.FUNCS.use_card({config = {ref_table = card}}) + card:start_materialize() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Standard Tag' then + self:yep('+', G.C.SECONDARY_SET.Spectral,function() + local key = 'p_standard_mega_1' + local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2, + G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true}) + card.cost = 0 + card.from_tag = true + G.FUNCS.use_card({config = {ref_table = card}}) + card:start_materialize() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Buffoon Tag' then + self:yep('+', G.C.SECONDARY_SET.Spectral,function() + local key = 'p_buffoon_mega_1' + local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2, + G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true}) + card.cost = 0 + card.from_tag = true + G.FUNCS.use_card({config = {ref_table = card}}) + card:start_materialize() + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + return true + end + if self.name == 'Boss Tag' then + local lock = self.ID + G.CONTROLLER.locks[lock] = true + self:yep('+', G.C.GREEN,function() + G.from_boss_tag = true + G.FUNCS.reroll_boss() + + G.E_MANAGER:add_event(Event({func = function() + G.E_MANAGER:add_event(Event({func = function() + G.CONTROLLER.locks[lock] = nil + return true; end})) + return true; end})) + + return true + end) + self.triggered = true + return true + end + elseif _context.type == 'voucher_add' then + if self.name == 'Voucher Tag' then + self:yep('+', G.C.SECONDARY_SET.Voucher,function() + G.ARGS.voucher_tag = G.ARGS.voucher_tag or {} + local voucher_key = get_next_voucher_key(true) + G.ARGS.voucher_tag[voucher_key] = true + G.shop_vouchers.config.card_limit = G.shop_vouchers.config.card_limit + 1 + local card = Card(G.shop_vouchers.T.x + G.shop_vouchers.T.w/2, + G.shop_vouchers.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[voucher_key],{bypass_discovery_center = true, bypass_discovery_ui = true}) + create_shop_card_ui(card, 'Voucher', G.shop_vouchers) + card:start_materialize() + G.shop_vouchers:emplace(card) + G.ARGS.voucher_tag = nil + return true + end) + self.triggered = true + end + elseif _context.type == 'tag_add' then + if self.name == 'Double Tag' and _context.tag.key ~= 'tag_double' then + local lock = self.ID + G.CONTROLLER.locks[lock] = true + self:yep('+', G.C.BLUE,function() + if _context.tag.ability and _context.tag.ability.orbital_hand then + G.orbital_hand = _context.tag.ability.orbital_hand + end + add_tag(Tag(_context.tag.key)) + G.orbital_hand = nil + G.CONTROLLER.locks[lock] = nil + return true + end) + self.triggered = true + end + elseif _context.type == 'round_start_bonus' then + if self.name == 'Juggle Tag' then + self:yep('+', G.C.BLUE,function() + return true + end) + G.hand:change_size(self.config.h_size) + G.GAME.round_resets.temp_handsize = (G.GAME.round_resets.temp_handsize or 0) + self.config.h_size + self.triggered = true + return true + end + elseif _context.type == 'store_joker_create' then + local card = nil + if self.name == 'Rare Tag' then + local rares_in_posession = {0} + for k, v in ipairs(G.jokers.cards) do + if v.config.center.rarity == 3 and not rares_in_posession[v.config.center.key] then + rares_in_posession[1] = rares_in_posession[1] + 1 + rares_in_posession[v.config.center.key] = true + end + end + + if #G.P_JOKER_RARITY_POOLS[3] > rares_in_posession[1] then + card = create_card('Joker', _context.area, nil, 1, nil, nil, nil, 'rta') + create_shop_card_ui(card, 'Joker', _context.area) + card.states.visible = false + self:yep('+', G.C.RED,function() + card:start_materialize() + return true + end) + else + self:nope() + end + self.triggered = true + elseif self.name == 'Uncommon Tag' then + card = create_card('Joker', _context.area, nil, 0.9, nil, nil, nil, 'uta') + create_shop_card_ui(card, 'Joker', _context.area) + card.states.visible = false + self:yep('+', G.C.GREEN,function() + card:start_materialize() + return true + end) + end + self.triggered = true + return card + elseif _context.type == 'shop_start' then + if self.name == 'D6 Tag' and not G.GAME.shop_d6ed then + G.GAME.shop_d6ed = true + self:yep('+', G.C.GREEN,function() + G.GAME.round_resets.temp_reroll_cost = 0 + calculate_reroll_cost(true) + return true + end) + self.triggered = true + return true + end + elseif _context.type == 'store_joker_modify' then + local _applied = nil + if not _context.card.edition and not _context.card.temp_edition and _context.card.ability.set == 'Joker' then + local lock = self.ID + G.CONTROLLER.locks[lock] = true + if self.name == 'Foil Tag' then + _context.card.temp_edition = true + self:yep('+', G.C.DARK_EDITION,function() + _context.card:set_edition({foil = true}, true) + _context.card.temp_edition = nil + G.CONTROLLER.locks[lock] = nil + return true + end) + _applied = true + elseif self.name == 'Holographic Tag' then + _context.card.temp_edition = true + self:yep('+', G.C.DARK_EDITION,function() + _context.card.temp_edition = nil + _context.card:set_edition({holo = true}, true) + G.CONTROLLER.locks[lock] = nil + return true + end) + _applied = true + elseif self.name == 'Polychrome Tag' then + _context.card.temp_edition = true + self:yep('+', G.C.DARK_EDITION,function() + _context.card.temp_edition = nil + _context.card:set_edition({polychrome = true}, true) + G.CONTROLLER.locks[lock] = nil + return true + end) + _applied = true + elseif self.name == 'Negative Tag' then + _context.card.temp_edition = true + self:yep('+', G.C.DARK_EDITION,function() + _context.card.temp_edition = nil + _context.card:set_edition({negative = true}, true) + G.CONTROLLER.locks[lock] = nil + return true + end) + _applied = true + end + self.triggered = true + end + + return _applied + elseif _context.type == 'shop_final_pass' then + if self.name == 'Coupon Tag' and (G.shop and not G.GAME.shop_free) then + G.GAME.shop_free = true + self:yep('+', G.C.GREEN,function() + if G.shop_jokers and G.shop_booster then + for k, v in pairs(G.shop_jokers.cards) do + v.ability.couponed = true + v:set_cost() + end + for k, v in pairs(G.shop_booster.cards) do + v.ability.couponed = true + v:set_cost() + end + end + return true + end) + self.triggered = true + return true + end + end + end +end + +function Tag:save() + return { + key = self.key, + tally = self.tally, + ability = self.ability + } +end + +function Tag:load(tag_savetable) + self.key = tag_savetable.key + local proto = G.P_TAGS[self.key] or G.tag_undiscovered + self.config = copy_table(proto.config) + self.pos = proto.pos + self.name = proto.name + self.tally = tag_savetable.tally + self.ability = tag_savetable.ability + G.GAME.tag_tally = math.max(self.tally, G.GAME.tag_tally) + 1 +end + +function Tag:juice_up(_scale, _rot) + if self.tag_sprite then self.tag_sprite:juice_up(_scale, _rot) end +end + +function Tag:generate_UI(_size) + _size = _size or 0.8 + + local tag_sprite_tab = nil + + local tag_sprite = Sprite(0,0,_size*1,_size*1,G.ASSET_ATLAS["tags"], (self.hide_ability) and G.tag_undiscovered.pos or self.pos) + tag_sprite.T.scale = 1 + tag_sprite_tab = {n= G.UIT.C, config={align = "cm", ref_table = self, group = self.tally}, nodes={ + {n=G.UIT.O, config={w=_size*1,h=_size*1, colour = G.C.BLUE, object = tag_sprite, focus_with_object = true}}, + }} + tag_sprite:define_draw_steps({ + {shader = 'dissolve', shadow_height = 0.05}, + {shader = 'dissolve'}, + }) + tag_sprite.float = true + tag_sprite.states.hover.can = true + tag_sprite.states.drag.can = false + tag_sprite.states.collide.can = true + tag_sprite.config = {tag = self, force_focus = true} + + tag_sprite.hover = function(_self) + if not G.CONTROLLER.dragging.target or G.CONTROLLER.using_touch then + if not _self.hovering and _self.states.visible then + _self.hovering = true + if _self == tag_sprite then + _self.hover_tilt = 3 + _self:juice_up(0.05, 0.02) + play_sound('paper1', math.random()*0.1 + 0.55, 0.42) + play_sound('tarot2', math.random()*0.1 + 0.55, 0.09) + end + + self:get_uibox_table(tag_sprite) + _self.config.h_popup = G.UIDEF.card_h_popup(_self) + _self.config.h_popup_config ={align = 'cl', offset = {x=-0.1,y=0},parent = _self} + Node.hover(_self) + if _self.children.alert then + _self.children.alert:remove() + _self.children.alert = nil + if self.key and G.P_TAGS[self.key] then G.P_TAGS[self.key].alerted = true end + G:save_progress() + end + end + end + end + tag_sprite.stop_hover = function(_self) _self.hovering = false; Node.stop_hover(_self); _self.hover_tilt = 0 end + + tag_sprite:juice_up() + self.tag_sprite = tag_sprite + + return tag_sprite_tab, tag_sprite +end + +function Tag:get_uibox_table(tag_sprite) + tag_sprite = tag_sprite or self.tag_sprite + local name_to_check, loc_vars = self.name, {} + if name_to_check == 'Uncommon Tag' then + elseif name_to_check == 'Investment Tag' then loc_vars = {self.config.dollars} + elseif name_to_check == 'Handy Tag' then loc_vars = {self.config.dollars_per_hand, self.config.dollars_per_hand*(G.GAME.hands_played or 0)} + elseif name_to_check == 'Garbage Tag' then loc_vars = {self.config.dollars_per_discard, self.config.dollars_per_discard*(G.GAME.unused_discards or 0)} + elseif name_to_check == 'Juggle Tag' then loc_vars = {self.config.h_size} + elseif name_to_check == 'Top-up Tag' then loc_vars = {self.config.spawn_jokers} + elseif name_to_check == 'Skip Tag' then loc_vars = {self.config.skip_bonus, self.config.skip_bonus*((G.GAME.skips or 0)+1)} + elseif name_to_check == 'Orbital Tag' then loc_vars = { + (self.ability.orbital_hand == '['..localize('k_poker_hand')..']') and self.ability.orbital_hand or localize(self.ability.orbital_hand, 'poker_hands'), self.config.levels} + elseif name_to_check == 'Economy Tag' then loc_vars = {self.config.max} + end + tag_sprite.ability_UIBox_table = generate_card_ui(G.P_TAGS[self.key], nil, loc_vars, (self.hide_ability) and 'Undiscovered' or 'Tag', nil, (self.hide_ability)) + return tag_sprite +end + +function Tag:remove_from_game() + local tag_key = nil + for k, v in pairs(G.GAME.tags) do + if v == self then tag_key = k end + end + table.remove(G.GAME.tags, tag_key) +end + +function Tag:remove() + self:remove_from_game() + local HUD_tag_key = nil + for k, v in pairs(G.HUD_tags) do + if v == self.HUD_tag then HUD_tag_key = k end + end + + if HUD_tag_key then + if G.HUD_tags and G.HUD_tags[HUD_tag_key+1] then + if HUD_tag_key == 1 then + G.HUD_tags[HUD_tag_key+1]:set_alignment({type = 'bri', + offset = {x=0.7,y=0}, + xy_bond = 'Weak', + major = G.ROOM_ATTACH}) + else + G.HUD_tags[HUD_tag_key+1]:set_role({ + xy_bond = 'Weak', + major = G.HUD_tags[HUD_tag_key-1]}) + end + end + table.remove(G.HUD_tags, HUD_tag_key) + end + + self.HUD_tag:remove() +end diff --git a/version.jkr b/version.jkr new file mode 100644 index 0000000..02238b1 --- /dev/null +++ b/version.jkr @@ -0,0 +1,3 @@ +1.0.0k-FULL +1.0.0k +Console_other \ No newline at end of file