This commit is contained in:
2024-05-24 22:01:27 +08:00
parent 7f124132ed
commit 3f54d1f79b
42 changed files with 11201 additions and 11796 deletions

View File

@ -212,7 +212,7 @@ function Blind:set_blind(blind, reset, silent)
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)
G.ARGS.spin.real = (G.SETTINGS.reduced_motion and 0 or 1)*(self.config.blind.boss and (self.config.blind.boss.showdown and 0.5 or 0.25) or 0)
end
function Blind:alert_debuff(first)
@ -727,7 +727,7 @@ function Blind:load(blindTable)
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)
G.ARGS.spin.real = (G.SETTINGS.reduced_motion and 0 or 1)*(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

329
card.lua
View File

@ -196,6 +196,9 @@ function Card:set_sprites(_center, _front)
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
if _center.name == 'Square Joker' and (_center.discovered or self.bypass_discovery_center) then
self.children.center.scale.y = self.children.center.scale.x
end
end
if _center.soul_pos then
@ -240,6 +243,11 @@ function Card:set_ability(center, initial, delay_sprites)
self.T.h = H
end
if center.name == "Square Joker" and (center.discovered or self.bypass_discovery_center) then
H = W
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
@ -368,6 +376,7 @@ function Card:set_cost()
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
if self.ability.rental then self.cost = 1 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
@ -493,12 +502,33 @@ function Card:get_seal(bypass_debuff)
end
function Card:set_eternal(_eternal)
if self.config.center.eternal_compat then
self.ability.eternal = nil
if self.config.center.eternal_compat and not self.ability.perishable then
self.ability.eternal = _eternal
end
end
function Card:set_perishable(_perishable)
self.ability.perishable = nil
if self.config.center.perishable_compat and not self.ability.eternal then
self.ability.perishable = true
self.ability.perish_tally = G.GAME.perishable_rounds
end
end
function Card:set_rental(_rental)
self.ability.rental = _rental
self:set_cost()
end
function Card:set_debuff(should_debuff)
if self.ability.perishable and self.ability.perish_tally <= 0 then
if not self.debuff then
self.debuff = true
if self.area == G.jokers then self:remove_from_deck(true) end
end
return
end
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
@ -595,11 +625,15 @@ function Card:add_to_deck(from_debuff)
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
if self.edition and self.edition.negative then
if from_debuff then
self.ability.queue_negative_removal = nil
else
G.jokers.config.card_limit = G.jokers.config.card_limit + 1
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
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
@ -648,12 +682,16 @@ function Card:remove_from_deck(from_debuff)
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
if self.edition and self.edition.negative and G.jokers then
if from_debuff then
self.ability.queue_negative_removal = true
else
G.jokers.config.card_limit = G.jokers.config.card_limit - 1
end
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
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
@ -740,7 +778,7 @@ function Card:generate_UIBox_ability_table()
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 == '8 Ball' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1),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}
@ -787,7 +825,7 @@ function Card:generate_UIBox_ability_table()
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 == 'Hanging Chad' then loc_vars = {self.ability.extra}
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}
@ -872,10 +910,10 @@ function Card:generate_UIBox_ability_table()
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 == 'Bootstraps' then loc_vars = {self.ability.extra.mult, self.ability.extra.dollars, self.ability.extra.mult*math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/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 == 'Yorick' then loc_vars = {self.ability.extra.xmult, self.ability.extra.discards, self.ability.yorick_discards, self.ability.x_mult}
elseif self.ability.name == 'Chicot' then
elseif self.ability.name == 'Perkeo' then loc_vars = {self.ability.extra}
end
@ -896,6 +934,11 @@ function Card:generate_UIBox_ability_table()
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.ability.perishable then
loc_vars = loc_vars or {}; loc_vars.perish_tally=self.ability.perish_tally
badges[#badges + 1] = 'perishable'
end
if self.ability.rental then badges[#badges + 1] = 'rental' 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
@ -1000,10 +1043,18 @@ function Card:get_end_of_round_effect(context)
trigger = 'before',
delay = 0.0,
func = (function()
local card = create_card(card_type,G.consumeables, nil, nil, nil, nil, nil, 'blusl')
if G.GAME.last_hand_played then
local _planet = 0
for k, v in pairs(G.P_CENTER_POOLS.Planet) do
if v.config.hand_type == G.GAME.last_hand_played then
_planet = v.key
end
end
local card = create_card(card_type,G.consumeables, nil, nil, nil, nil, _planet, 'blusl')
card:add_to_deck()
G.consumeables:emplace(card)
G.GAME.consumeable_buffer = 0
end
return true
end)}))
card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_planet'), colour = G.C.SECONDARY_SET.Planet})
@ -2216,6 +2267,26 @@ function Card:calculate_seal(context)
end
end
function Card:calculate_rental()
if self.ability.rental then
ease_dollars(-G.GAME.rental_rate)
card_eval_status_text(self, 'dollars', -G.GAME.rental_rate)
end
end
function Card:calculate_perishable()
if self.ability.perishable and self.ability.perish_tally > 0 then
if self.ability.perish_tally == 1 then
self.ability.perish_tally = 0
card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_disabled_ex'),colour = G.C.FILTER, delay = 0.45})
self:set_debuff()
else
self.ability.perish_tally = self.ability.perish_tally - 1
card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_remaining',vars={self.ability.perish_tally}},colour = G.C.FILTER, delay = 0.45})
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
@ -2400,6 +2471,7 @@ function Card:calculate_joker(context)
elseif seal_type > 0.25 then _card:set_seal('Gold', true)
else _card:set_seal('Purple', true)
end
G.GAME.blind:debuff_card(_card)
G.hand:sort()
if context.blueprint_card then context.blueprint_card:juice_up() else self:juice_up() end
return true
@ -2427,7 +2499,7 @@ function Card:calculate_joker(context)
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
if self.ability.name == 'Madness' and not context.blueprint and not context.blind.boss then
self.ability.x_mult = self.ability.x_mult + self.ability.extra
local destructable_jokers = {}
for i = 1, #G.jokers.cards do
@ -2712,6 +2784,20 @@ function Card:calculate_joker(context)
}
end
end
if self.ability.name == 'Yorick' and not context.blueprint then
if self.ability.yorick_discards <= 1 then
self.ability.yorick_discards = self.ability.extra.discards
self.ability.x_mult = self.ability.x_mult + self.ability.extra.xmult
return {
delay = 0.2,
message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}},
colour = G.C.RED
}
else
self.ability.yorick_discards = self.ability.yorick_discards - 1
end
return
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)
@ -2767,21 +2853,6 @@ function Card:calculate_joker(context)
}
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
@ -2900,6 +2971,16 @@ function Card:calculate_joker(context)
}
end
end
if self.ability.name == 'To Do List' and not context.blueprint then
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 {
message = localize('k_reset')
}
end
if self.ability.name == 'Egg' then
self.ability.extra_value = self.ability.extra_value + self.ability.extra
self:set_cost()
@ -3021,6 +3102,27 @@ function Card:calculate_joker(context)
}
end
end
if self.ability.name == '8 Ball' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
if (context.other_card:get_id() == 8) and (pseudorandom('8ball') < G.GAME.probabilities.normal/self.ability.extra) then
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1
return {
extra = {focus = self, message = localize('k_plus_tarot'), func = function()
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)}))
end},
colour = G.C.SECONDARY_SET.Tarot,
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
@ -3339,7 +3441,7 @@ function Card:calculate_joker(context)
end
if self.ability.name == 'Midas Mask' and not context.blueprint then
local faces = {}
for k, v in ipairs(context.full_hand) do
for k, v in ipairs(context.scoring_hand) do
if v:is_face() then
faces[#faces+1] = v
v:set_ability(G.P_CENTERS.m_gold, nil, true)
@ -3361,7 +3463,7 @@ function Card:calculate_joker(context)
end
if self.ability.name == 'Vampire' and not context.blueprint then
local enhanced = {}
for k, v in ipairs(context.full_hand) do
for k, v in ipairs(context.scoring_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
@ -3386,16 +3488,6 @@ function Card:calculate_joker(context)
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)}))
@ -3647,30 +3739,6 @@ function Card:calculate_joker(context)
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
@ -3744,10 +3812,10 @@ function Card:calculate_joker(context)
}
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
if context.scoring_hand[i]:is_suit('Hearts', true) and suits["Hearts"] == 0 then suits["Hearts"] = suits["Hearts"] + 1
elseif context.scoring_hand[i]:is_suit('Diamonds', true) and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 1
elseif context.scoring_hand[i]:is_suit('Spades', true) and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 1
elseif context.scoring_hand[i]:is_suit('Clubs', true) and suits["Clubs"] == 0 then suits["Clubs"] = suits["Clubs"] + 1 end
end
end
for i = 1, #context.scoring_hand do
@ -3986,14 +4054,6 @@ function Card:calculate_joker(context)
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
@ -4084,7 +4144,6 @@ function Card:update(dt)
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
@ -4093,33 +4152,6 @@ function Card:update(dt)
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
@ -4203,8 +4235,9 @@ function Card:update(dt)
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
if G.jokers.cards[i] ~= self and (G.jokers.cards[i].area and G.jokers.cards[i].area == G.jokers) then
sell_cost = sell_cost + G.jokers.cards[i].sell_cost
end
end
self.ability.mult = sell_cost
end
@ -4261,6 +4294,7 @@ function Card:align_h_popup()
0
},
type = popup_direction,
--lr_clamp = true
}
end
@ -4278,7 +4312,7 @@ function Card:hover()
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()
@ -4293,7 +4327,7 @@ 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})
local rot_amt = rot_amount and 0.4*(math.random()>0.5 and 1 or -1)*rot_amount or (math.random()>0.5 and 1 or -1)*0.16
scale = scale and scale*0.4 or 0.11
Moveable.juice_up(self, scale, rot_amt)
end
@ -4329,21 +4363,19 @@ function Card:draw(layer)
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}
self.tilt_var = 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
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
--Any particles
if self.children.particles then self.children.particles:draw() end
@ -4404,7 +4436,7 @@ function Card:draw(layer)
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.edition or self.seal or self.ability.eternal or self.ability.rental or self.ability.perishable 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
@ -4442,6 +4474,16 @@ function Card:draw(layer)
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.ability.perishable then
G.shared_sticker_perishable.role.draw_major = self
G.shared_sticker_perishable:draw_shader('dissolve', nil, nil, nil, self.children.center)
G.shared_sticker_perishable:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center)
end
if self.ability.rental then
G.shared_sticker_rental.role.draw_major = self
G.shared_sticker_rental:draw_shader('dissolve', nil, nil, nil, self.children.center)
G.shared_sticker_rental: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)
@ -4487,7 +4529,12 @@ function Card:draw(layer)
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}
self.back_overlay = self.back_overlay or {}
self.back_overlay[1] = 0.5 + ((#self.area.cards - self.rank)%7)/50
self.back_overlay[2] = 0.5 + ((#self.area.cards - self.rank)%7)/50
self.back_overlay[3] = 0.5 + ((#self.area.cards - self.rank)%7)/50
self.back_overlay[4] = 1
overlay = self.back_overlay
end
if self.area and self.area.config.type == 'deck' then
@ -4503,23 +4550,8 @@ function Card:draw(layer)
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()
if k ~= 'focused_ui' and k ~= "front" 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 (layer == 'card' or layer == 'both') and self.area == G.hand then
@ -4632,6 +4664,10 @@ function Card:load(cardTable, other_card)
elseif self.config.center.name == "Photograph" then
self.T.h = H*scale/1.2*scale
self.T.w = W*scale
elseif self.config.center.name == "Square Joker" then
H = W
self.T.h = H*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
@ -4683,6 +4719,13 @@ function Card:remove()
if self.area then self.area:remove_card(self) end
self:remove_from_deck()
if self.ability.queue_negative_removal 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 not G.OVERLAY_MENU then
for k, v in pairs(G.P_CENTERS) do

View File

@ -336,7 +336,7 @@ function CardArea:draw()
end
end
end
for i = 1, #self.cards do
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
@ -436,12 +436,12 @@ function CardArea:align_cards()
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)
card.T.r = 0.4*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*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.y = G.hand.T.y - 1.8*card.T.h - highlight_height + (G.SETTINGS.reduced_motion and 0 or 1)*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
@ -451,13 +451,13 @@ function CardArea:align_cards()
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.r = 0.2*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*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.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + (G.SETTINGS.reduced_motion and 0 or 1)*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
@ -466,12 +466,12 @@ function CardArea:align_cards()
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)
card.T.r = 0.2*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*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.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + (G.SETTINGS.reduced_motion and 0 or 1)*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
@ -481,12 +481,12 @@ function CardArea:align_cards()
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
card.T.r = 0.2*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*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.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + (G.SETTINGS.reduced_motion and 0 or 1)*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
@ -509,7 +509,7 @@ function CardArea:align_cards()
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)
card.T.r = 0.1*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*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
@ -521,7 +521,7 @@ function CardArea:align_cards()
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.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height+ (G.SETTINGS.reduced_motion and 0 or 1)*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
@ -537,7 +537,7 @@ function CardArea:align_cards()
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.y = self.T.y + self.T.h/2 - card.T.h/2 - highlight_height + (not card.highlighted and (G.SETTINGS.reduced_motion and 0 or 1)*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

View File

@ -55,7 +55,7 @@ G.CHALLENGES = {
{id = 'tag_handy'},
},
banned_other = {
{id = 'bl_wall', type = 'blind'}
}
}
},]]--
@ -246,6 +246,7 @@ G.CHALLENGES = {
banned_tags = {
},
banned_other = {
{id = 'bl_plant', type = 'blind'},
}
}
},
@ -314,6 +315,7 @@ G.CHALLENGES = {
banned_tags = {
},
banned_other = {
{id = 'bl_final_leaf', type = 'blind'},
}
}
},
@ -401,6 +403,7 @@ G.CHALLENGES = {
banned_tags = {
},
banned_other = {
{id = 'bl_final_leaf', type = 'blind'},
}
}
},
@ -709,6 +712,7 @@ G.CHALLENGES = {
{id = 'c_judgement'},
{id = 'c_wraith'},
{id = 'c_soul'},
{id = 'v_antimatter'},
{id = 'p_buffoon_normal_1', ids = {
'p_buffoon_normal_1','p_buffoon_normal_2','p_buffoon_jumbo_1','p_buffoon_mega_1',
}},
@ -721,8 +725,13 @@ G.CHALLENGES = {
{id = 'tag_negative'},
{id = 'tag_foil'},
{id = 'tag_buffoon'},
{id = 'tag_top_up'},
},
banned_other = {
{id = 'bl_final_acorn', type = 'blind'},
{id = 'bl_final_heart', type = 'blind'},
{id = 'bl_final_leaf', type = 'blind'}
}
}
},

View File

@ -2,8 +2,6 @@ _RELEASE_MODE = true
_DEMO = false
function love.conf(t)
os.execute("set LOVE_GRAPHICS_USE_OPENGLES=1")
t.console = not _RELEASE_MODE
t.title = 'Balatro'
t.window.width = 0

View File

@ -108,6 +108,7 @@ function Moveable:set_alignment(args)
args.offset = nil
end
self.alignment.offset = args.offset or self.alignment.offset
self.alignment.lr_clamp = args.lr_clamp
end
function Moveable:align_to_major()
@ -247,6 +248,7 @@ function Moveable:drag(offset)
end
function Moveable:juice_up(amount, rot_amt)
if G.SETTINGS.reduced_motion then return end
local amount = amount or 0.4
local end_time = G.TIMERS.REAL + 0.4
@ -275,13 +277,14 @@ end
function Moveable:move(dt)
if self.FRAME.MOVE >= G.FRAMES.MOVE then return end
self.FRAME.OLD_MAJOR = self.FRAME.MAJOR
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()
--local timestart = love.timer.getTime()
-------------------------------------------------------
self:align_to_major()
@ -309,9 +312,20 @@ function Moveable:move(dt)
self:move_wh(dt)
self:calculate_parrallax()
end
if self.alignment and self.alignment.lr_clamp then
self:lr_clamp()
end
self.NEW_ALIGNMENT = false
end
function Moveable:lr_clamp()
if self.T.x < 0 then self.T.x = 0 end
if self.VT.x < 0 then self.VT.x = 0 end
if (self.T.x + self.T.w) > G.ROOM.T.w then self.T.x = G.ROOM.T.w - self.T.w end
if (self.VT.x + self.VT.w) > G.ROOM.T.w then self.VT.x = G.ROOM.T.w - self.VT.w end
end
function Moveable:glue_to_major(major_tab)
self.T = major_tab.T
@ -326,21 +340,19 @@ function Moveable:glue_to_major(major_tab)
self.shadow_parrallax = major_tab.shadow_parrallax
end
MWM = {
rotated_offset = {},
angles = {},
WH = {},
offs = {},
}
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
@ -471,10 +483,11 @@ 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)
self.FRAME.MAJOR = self.FRAME.MAJOR or EMPTY(self.FRAME.OLD_MAJOR)
self.temp_offs = EMPTY(self.temp_offs)
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 = self.FRAME.MAJOR.offset or self.temp_offs
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
@ -488,14 +501,16 @@ function Moveable:get_major()
end
function Moveable:remove()
for k, v in ipairs(G.MOVEABLES) do
for k, v in pairs(G.MOVEABLES) do
if v == self then
table.remove(G.MOVEABLES, k)
break;
end
end
for k, v in ipairs(G.I.MOVEABLE) do
for k, v in pairs(G.I.MOVEABLE) do
if v == self then
table.remove(G.I.MOVEABLE, k)
break;
end
end
Node.remove(self)

View File

@ -318,19 +318,19 @@ end
--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
for k, v in pairs(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
for k, v in pairs(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
for k, v in pairs(G.STAGE_OBJECTS[G.STAGE]) do
if v == self then
table.remove(G.STAGE_OBJECTS[G.STAGE], k)
break;

View File

@ -71,6 +71,7 @@ function Sprite:define_draw_steps(draw_step_definitions)
end
function Sprite:draw_shader(_shader, _shadow_height, _send, _no_tilt, other_obj, ms, mr, mx, my, custom_shader, tilt_shadow)
if G.SETTINGS.reduced_motion then _no_tilt = true end
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

View File

@ -212,27 +212,27 @@ function DynaText:align_letters()
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.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)+ (G.SETTINGS.reduced_motion and 0 or 1)*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(
letter.scale = letter.scale + (G.SETTINGS.reduced_motion and 0 or 1)*(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))
letter.r = letter.r + (G.SETTINGS.reduced_motion and 0 or 1)*(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*(
letter.scale = letter.scale + (G.SETTINGS.reduced_motion and 0 or 1)*(0.1*self.config.quiver.amount)
letter.r = letter.r + (G.SETTINGS.reduced_motion and 0 or 1)*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
if self.config.float then letter.offset.y = (G.SETTINGS.reduced_motion and 0 or 1)*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 = (G.SETTINGS.reduced_motion and 0 or 1)*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

View File

@ -34,7 +34,8 @@ function UIBox:init(args)
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}
offset = args.config.offset or {x=0,y=0},
lr_clamp = args.config.lr_clamp
})
self:set_role{
xy_bond = args.config.xy_bond,
@ -82,6 +83,10 @@ function UIBox:init(args)
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
if self.alignment and self.alignment.lr_clamp then
self:lr_clamp()
end
self.UIRoot:initialize_VT(true)
if getmetatable(self) == UIBox then
@ -268,6 +273,7 @@ function UIBox: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)
break;
end
end
remove_all(self.children)
@ -682,7 +688,6 @@ function UIElement:draw_self()
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 {}

View File

@ -303,7 +303,7 @@ function G.UIDEF.card_focus_ui(card)
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 tcnx, tcny = card.T.x + card.T.w/2 - G.ROOM.T.w/2, card.T.y + card.T.h/2 - G.ROOM.T.h/2
local base_background = UIBox{
T = {card.VT.x,card.VT.y,0,0},
@ -316,15 +316,15 @@ function G.UIDEF.card_focus_ui(card)
}},
config = {
align = 'cm',
offset = {x= 0.007*t_card_norm.x*card.T.w, y = 0.007*t_card_norm.y*card.T.h},
offset = {x= 0.007*tcnx*card.T.w, y = 0.007*tcny*card.T.h},
parent = card,
r_bond = (not G.hand or card.area ~= G.hand) and 'Weak' or 'Strong'
}
}
base_background.set_alignment = function()
local 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}})
local cnx, cny = card.T.x + card.T.w/2 - G.ROOM.T.w/2, card.T.y + card.T.h/2 - G.ROOM.T.h/2
Moveable.set_alignment(card.children.focused_ui, {offset = {x= 0.007*cnx*card.T.w, y = 0.007*cny*card.T.h}})
end
local base_attach = base_background:get_UIE_by_ID('ATTACH_TO_ME')
@ -1135,6 +1135,8 @@ end
function get_badge_colour(key)
G.BADGE_COL = G.BADGE_COL or {
eternal = G.C.ETERNAL,
perishable = G.C.PERISHABLE,
rental = G.C.RENTAL,
foil = G.C.DARK_EDITION,
holographic = G.C.DARK_EDITION,
polychrome = G.C.DARK_EDITION,
@ -2312,6 +2314,7 @@ function G.UIDEF.settings_tab(tab)
end
end
)}),
create_toggle({label = localize('b_reduced_motion'), ref_table = G.SETTINGS, ref_value = 'reduced_motion'}),
G.F_CRASH_REPORTS and create_toggle({label = localize('b_set_crash_reports'), ref_table = G.SETTINGS, ref_value = 'crashreports', info = localize('ml_crash_report_info')}) or nil,
}}
elseif tab == 'Video' then
@ -5270,6 +5273,49 @@ function G.UIDEF.challenge_description_tab(args)
)
end
end
if challenge.restrictions.banned_other then
local other_tab = {}
for k, v in pairs(challenge.restrictions.banned_other) do
if v.type == 'blind' then
other_tab[#other_tab+1] = G.P_BLINDS[v.id]
end
end
table.sort(other_tab, function (a, b) return a.order < b.order end)
for k, v in ipairs(other_tab) do
local temp_blind = AnimatedSprite(0,0,1,1, G.ANIMATION_ATLAS['blind_chips'], v.pos)
temp_blind:define_draw_steps({
{shader = 'dissolve', shadow_height = 0.05},
{shader = 'dissolve'}
})
temp_blind.float = true
temp_blind.states.hover.can = true
temp_blind.states.drag.can = false
temp_blind.states.collide.can = true
temp_blind.config = {blind = v, force_focus = true}
temp_blind.hover = function()
if not G.CONTROLLER.dragging.target or G.CONTROLLER.using_touch then
if not temp_blind.hovering and temp_blind.states.visible then
temp_blind.hovering = true
temp_blind.hover_tilt = 3
temp_blind:juice_up(0.05, 0.02)
play_sound('chips1', math.random()*0.1 + 0.55, 0.12)
temp_blind.config.h_popup = create_UIBox_blind_popup(v, true)
temp_blind.config.h_popup_config ={align = 'cl', offset = {x=-0.1,y=0},parent = temp_blind}
Node.hover(temp_blind)
end
end
end
temp_blind.stop_hover = function() temp_blind.hovering = false; Node.stop_hover(temp_blind); temp_blind.hover_tilt = 0 end
table.insert(banned_other,
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = temp_blind}}
}}
)
end
end
end
if not banned_cards[1] then banned_cards[#banned_cards+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_m_none', vars = {}}} end
if not banned_tags[1] then banned_tags[#banned_tags+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_none', vars = {}}} end
@ -5687,11 +5733,13 @@ function G.UIDEF.language_selector()
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 not G.F_HIDE_BETA_LANGS or (not v.beta) then
_row[#_row+1] = {n=G.UIT.C, config={align = "cm", func = 'beta_lang_alert', padding = 0.05, r = 0.1, minh = 0.7, minw = 4.5, button = v.beta and 'warn_lang' or 'change_lang', ref_table = v, colour = v.beta and G.C.RED or G.C.BLUE, hover = true, shadow = true, focus_args = {snap_to = (k == 1)}}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = v.label, lang = v, scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}}
}}
}}
end
if _row[3] or (k == #langs) then
rows[#rows+1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes=_row}
_row = {}
@ -5704,12 +5752,12 @@ function G.UIDEF.language_selector()
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={
G.F_EXTERNAL_LINKS and {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1, minw = 4, maxw = 4, r = 0.1, minh = 0.8, hover = true, colour = mix_colours(G.C.GREEN, G.C.GREY, 0.4), button = 'loc_survey', shadow = true}, nodes={
{n=G.UIT.O, config={object = discord}},
{n=G.UIT.T, config={text = G.LANG.button, scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}},
}}
}} or nil
}})
return t
end

View File

@ -1169,7 +1169,7 @@ G.FUNCS.apply_window_changes = function(_initial)
vsync = G.SETTINGS.WINDOW.vsync,
resizable = true,
display = G.SETTINGS.WINDOW.selected_display,
highdpi = true
highdpi = (love.system.getOS() == 'OS X')
})
G.SETTINGS.QUEUED_CHANGE = {}
if _initial ~= true then
@ -1215,7 +1215,7 @@ G.FUNCS.RUN_SETUP_check_back = function(e)
end
G.FUNCS.RUN_SETUP_check_back_name = function(e)
if G.GAME.viewed_back.name ~= e.config.id then
if e.config.object and 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()
@ -2085,8 +2085,8 @@ 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
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] or (G.hand.config.card_limit <= 0)))) then
e.config.colour = G.C.GREY
e.config.button = 'skip_booster'
else
@ -2458,11 +2458,6 @@ end
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
@ -2906,6 +2901,12 @@ G.FUNCS.cash_out = function(e)
G.VIBRATION = G.VIBRATION + 1
end
ease_chips(0)
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
reset_blinds()
delay(0.6)
end

View File

@ -843,8 +843,8 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra)
elseif eval_type == 'dollars' then
sound = 'coin3'
amt = amt
text = localize("$")..tostring(amt)
colour = G.C.MONEY
text = (amt <-0.01 and '-' or '')..localize("$")..tostring(math.abs(amt))
colour = amt <-0.01 and G.C.RED or G.C.MONEY
elseif eval_type == 'swap' then
sound = 'generic1'
amt = amt
@ -877,7 +877,7 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra)
end
delay = delay*1.25
if amt > 0 then
if amt > 0 or amt < 0 then
if extra and extra.instant then
if extrafunc then extrafunc() end
attention_text({
@ -1127,16 +1127,16 @@ 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
G.SETTINGS.screenshake = G.SETTINGS.reduced_motion and 0 or 50
end
local shake_amt = math.max(0,G.SETTINGS.screenshake-30)/100
local shake_amt = (G.SETTINGS.reduced_motion and 0 or 1)*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
shake_amt = (G.SETTINGS.reduced_motion and 0 or 1)*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)
@ -1942,6 +1942,10 @@ function create_playing_card(card_init, area, skip_materialize, silent, colours)
end
function get_pack(_key, _type)
if not G.GAME.first_shop_buffoon and not G.GAME.banned_keys['p_buffoon_normal_1'] then
G.GAME.first_shop_buffoon = true
return G.P_CENTERS['p_buffoon_normal_'..(math.random(1, 2))]
end
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
@ -1964,7 +1968,7 @@ function get_current_pool(_type, _rarity, _legendary, _append)
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 '')
_starting_pool, _pool_key = G.P_JOKER_RARITY_POOLS[rarity], 'Joker'..rarity..((not _legendary and _append) or '')
else _starting_pool, _pool_key = G.P_CENTER_POOLS[_type], _type..(_append or '')
end
@ -2034,7 +2038,7 @@ function get_current_pool(_type, _rarity, _legendary, _append)
--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"
if _type == 'Tarot' or _type == 'Tarot_Planet' then _pool[#_pool + 1] = "c_strength"
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"
@ -2045,7 +2049,7 @@ function get_current_pool(_type, _rarity, _legendary, _append)
end
end
return _pool, _pool_key..G.GAME.round_resets.ante
return _pool, _pool_key..(not _legendary and G.GAME.round_resets.ante or '')
end
function poll_edition(_key, _mod, _no_neg, _guaranteed)
@ -2130,9 +2134,15 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable
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
if (area == G.shop_jokers) or (area == G.pack_cards) then
local eternal_perishable_poll = pseudorandom((area == G.pack_cards and 'packetper' or 'etperpoll')..G.GAME.round_resets.ante)
if G.GAME.modifiers.enable_eternals_in_shop and eternal_perishable_poll > 0.7 then
card:set_eternal(true)
elseif G.GAME.modifiers.enable_perishables_in_shop and ((eternal_perishable_poll > 0.4) and (eternal_perishable_poll <= 0.7)) then
card:set_perishable(true)
end
if G.GAME.modifiers.enable_rentals_in_shop and pseudorandom((area == G.pack_cards and 'packssjr' or 'ssjr')..G.GAME.round_resets.ante) > 0.7 then
card:set_rental(true)
end
end
@ -2291,7 +2301,11 @@ function reset_mail_rank()
end
function reset_ancient_card()
local ancient_card = pseudorandom_element({'Spades','Hearts','Clubs','Diamonds'}, pseudoseed('anc'..G.GAME.round_resets.ante))
local ancient_suits = {}
for k, v in ipairs({'Spades','Hearts','Clubs','Diamonds'}) do
if v ~= G.GAME.current_round.ancient_card.suit then ancient_suits[#ancient_suits + 1] = v end
end
local ancient_card = pseudorandom_element(ancient_suits, pseudoseed('anc'..G.GAME.round_resets.ante))
G.GAME.current_round.ancient_card.suit = ancient_card
end
@ -2309,6 +2323,18 @@ function reset_castle_card()
end
end
function reset_blinds()
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
end
function get_new_boss()
G.GAME.perscribed_bosses = G.GAME.perscribed_bosses or {
}
@ -2330,6 +2356,9 @@ function get_new_boss()
eligible_bosses[k] = true
end
end
for k, v in pairs(G.GAME.banned_keys) do
if eligible_bosses[k] then eligible_bosses[k] = nil end
end
local min_use = 100
for k, v in pairs(G.GAME.bosses_used) do
@ -2415,7 +2444,7 @@ function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, h
end
if _c.set == 'Other' then
localize{type = 'other', key = _c.key, nodes = desc_nodes, vars = specific_vars}
localize{type = 'other', key = _c.key, nodes = desc_nodes, vars = specific_vars or _c.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}
@ -2702,6 +2731,8 @@ function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, h
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 == 'perishable' then info_queue[#info_queue+1] = {key = 'perishable', set = 'Other', vars = {G.GAME.perishable_rounds or 1, specific_vars.perish_tally or G.GAME.perishable_rounds}} end
if v == 'rental' then info_queue[#info_queue+1] = {key = 'rental', set = 'Other', vars = {G.GAME.rental_rate or 1}} end
if v == 'pinned_left' then info_queue[#info_queue+1] = {key = 'pinned_left', set = 'Other'} end
end
end

View File

@ -61,6 +61,7 @@ function GET_DISPLAYINFO(screenmode, display)
end
function timer_checkpoint(label, type, reset)
G.PREV_GARB = G.PREV_GARB or 0
if not G.F_ENABLE_PERF_OVERLAY then return end
G.check = G.check or {
draw = {
@ -83,7 +84,7 @@ function timer_checkpoint(label, type, reset)
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].label = label..': '..(collectgarbage( "count" ) - G.PREV_GARB)
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 {}
@ -93,7 +94,7 @@ function timer_checkpoint(label, type, reset)
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
G.PREV_GARB = collectgarbage( "count" )
local av = 0
for k, v in ipairs(cp.checkpoint_list[cp.checkpoints].trend) do
av = av + v/#cp.checkpoint_list[cp.checkpoints].trend
@ -215,6 +216,40 @@ function pseudoshuffle(list, seed)
end
end
function generate_starting_seed()
if G.GAME.stake >= 8 then
local r_leg, r_tally = {}, 0
local g_leg, g_tally = {}, 0
for k, v in pairs(G.P_JOKER_RARITY_POOLS[4]) do
local win_ante = get_joker_win_sticker(v, true)
if win_ante and (win_ante >= 8) then
g_leg[v.key] = true
g_tally = g_tally + 1
else
r_leg[v.key] = true
r_tally = r_tally + 1
end
end
if r_tally > 0 and g_tally > 0 then
local seed_found = nil
local extra_num = 0
while not seed_found do
extra_num = extra_num + 0.561892350821
seed_found = random_string(8, extra_num + G.CONTROLLER.cursor_hover.T.x*0.33411983 + G.CONTROLLER.cursor_hover.T.y*0.874146 + 0.412311010*G.CONTROLLER.cursor_hover.time)
if not r_leg[get_first_legendary(seed_found)] then seed_found = nil end
end
return seed_found
end
end
return 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
function get_first_legendary(_key)
local _t, key = pseudorandom_element(G.P_JOKER_RARITY_POOLS[4], pseudoseed('Joker4', _key))
return _t.key
end
function pseudorandom_element(_t, seed)
if seed then math.randomseed(seed) end
local keys = {}
@ -260,8 +295,14 @@ function pseudohash(str)
end
end
function pseudoseed(key)
function pseudoseed(key, predict_seed)
if key == 'seed' then return math.random() end
if predict_seed then
local _pseed = pseudohash(key..(predict_seed or ''))
_pseed = math.abs(tonumber(string.format("%.13f", (2.134453429141+_pseed*1.72431234)%1)))
return (_pseed + (pseudohash(predict_seed) or 0))/2
end
if not G.GAME.pseudorandom[key] then
G.GAME.pseudorandom[key] = pseudohash(key..(G.GAME.pseudorandom.seed or ''))
@ -350,15 +391,25 @@ function evaluate_poker_hand(hand)
top = nil
}
if next(get_X_same(5,hand)) and next(get_flush(hand)) then
results["Flush Five"] = get_X_same(5,hand)
local parts = {
_5 = get_X_same(5,hand),
_4 = get_X_same(4,hand),
_3 = get_X_same(3,hand),
_2 = get_X_same(2,hand),
_flush = get_flush(hand),
_straight = get_straight(hand),
_highest = get_highest(hand)
}
if next(parts._5) and next(parts._flush) then
results["Flush Five"] = parts._5
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
if next(parts._3) and next(parts._2) and next(parts._flush) then
local fh_hand = {}
local fh_3 = get_X_same(3,hand)[1]
local fh_2 = get_X_same(2,hand)[1]
local fh_3 = parts._3[1]
local fh_2 = parts._2[1]
for i=1, #fh_3 do
fh_hand[#fh_hand+1] = fh_3[i]
end
@ -369,13 +420,13 @@ function evaluate_poker_hand(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 next(parts._5) then
results["Five of a Kind"] = parts._5
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), {}
if next(parts._flush) and next(parts._straight) then
local _s, _f, ret = parts._straight, parts._flush, {}
for _, v in ipairs(_f[1]) do
ret[#ret+1] = v
end
@ -391,15 +442,15 @@ function evaluate_poker_hand(hand)
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 next(parts._4) then
results["Four of a Kind"] = parts._4
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
if next(parts._3) and next(parts._2) then
local fh_hand = {}
local fh_3 = get_X_same(3,hand)[1]
local fh_2 = get_X_same(2,hand)[1]
local fh_3 = parts._3[1]
local fh_2 = parts._2[1]
for i=1, #fh_3 do
fh_hand[#fh_hand+1] = fh_3[i]
end
@ -410,26 +461,29 @@ function evaluate_poker_hand(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 next(parts._flush) then
results["Flush"] = parts._flush
if not results.top then results.top = results["Flush"] end
end
if next(get_straight(hand)) then
results["Straight"] = get_straight(hand)
if next(parts._straight) then
results["Straight"] = parts._straight
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 next(parts._3) then
results["Three of a Kind"] = parts._3
if not results.top then results.top = results["Three of a Kind"] end
end
if #get_X_same(2,hand) == 2 then
if (#parts._2 == 2) or (#parts._3 == 1 and #parts._2 == 1) then
local fh_hand = {}
local r = get_X_same(2,hand)
local r = parts._2
local fh_2a = r[1]
local fh_2b = r[2]
if not fh_2b then
fh_2b = parts._3[1]
end
for i=1, #fh_2a do
fh_hand[#fh_hand+1] = fh_2a[i]
end
@ -440,13 +494,13 @@ function evaluate_poker_hand(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 next(parts._2) then
results["Pair"] = parts._2
if not results.top then results.top = results["Pair"] end
end
if next(get_highest(hand)) then
results["High Card"] = get_highest(hand)
if next(parts._highest) then
results["High Card"] = parts._highest
if not results.top then results.top = results["High Card"] end
end
@ -570,6 +624,47 @@ function reset_drawhash()
G.DRAW_HASH = EMPTY(G.DRAW_HASH)
end
--Copyright 2021 Max Cahill (Zlib license)
--
--This software is provided 'as-is', without any express or implied
--warranty. In no event will the authors be held liable for any damages
--arising from the use of this software.
--
--Permission is granted to anyone to use this software for any purpose,
--including commercial applications, and to alter it and redistribute it
--freely, subject to the following restrictions:
--
--1. The origin of this software must not be misrepresented; you must not
-- claim that you wrote the original software. If you use this software
-- in a product, an acknowledgment in the product documentation would be
-- appreciated but is not required.
--2. Altered source versions must be plainly marked as such, and must not be
-- misrepresented as being the original software.
--3. This notice may not be removed or altered from any source distribution.
--This function was slightly modified from it's original state
function nuGC(time_budget, memory_ceiling, disable_otherwise)
time_budget = time_budget or 3e-4
memory_ceiling = memory_ceiling or 300
local max_steps = 1000
local steps = 0
local start_time = love.timer.getTime()
while
love.timer.getTime() - start_time < time_budget and
steps < max_steps
do
collectgarbage("step", 1)
steps = steps + 1
end
--safety net
if collectgarbage("count") / 1024 > memory_ceiling then
collectgarbage("collect")
end
--don't collect gc outside this margin
if disable_otherwise then
collectgarbage("stop")
end
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
@ -599,7 +694,7 @@ 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
if sound_code and G.SETTINGS.SOUND.volume > 0.001 then
G.ARGS.play_sound = G.ARGS.play_sound or {}
G.ARGS.play_sound.type = 'sound'
G.ARGS.play_sound.time = G.TIMERS.REAL
@ -825,7 +920,7 @@ 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
300, 800, 2000, 5000, 11000, 20000, 35000, 50000
}
if ante < 1 then return 100 end
if ante <= 8 then return amounts[ante] end
@ -835,7 +930,8 @@ function get_blind_amount(ante)
return amount
elseif G.GAME.modifiers.scaling == 2 then
local amounts = {
300, 1000, 3200, 9000, 18000, 32000, 56000, 90000
300, 900, 2600, 8000, 20000, 36000, 60000, 100000
--300, 900, 2400, 7000, 18000, 32000, 56000, 90000
}
if ante < 1 then return 100 end
if ante <= 8 then return amounts[ante] end
@ -845,7 +941,8 @@ function get_blind_amount(ante)
return amount
elseif G.GAME.modifiers.scaling == 3 then
local amounts = {
300, 1200, 3600, 10000, 25000, 50000, 90000, 180000
300, 1000, 3200, 9000, 25000, 60000, 110000, 200000
--300, 1000, 3000, 8000, 22000, 50000, 90000, 180000
}
if ante < 1 then return 100 end
if ante <= 8 then return amounts[ante] end
@ -1347,7 +1444,6 @@ function recursive_table_cull(t)
end
function save_with_action(action)
print('SAVE WITH ACTION')
G.action = action
save_run()
G.action = nil
@ -1460,6 +1556,7 @@ function init_localization()
for _, set in pairs(group) do
for _, center in pairs(set) do
center.text_parsed = {}
if not center.text then else
for _, line in ipairs(center.text) do
center.text_parsed[#center.text_parsed+1] = loc_parse_string(line)
end
@ -1474,6 +1571,7 @@ function init_localization()
end
end
end
end
end
end
end
@ -1661,6 +1759,7 @@ function localize(args, misc_cat)
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 G.F_MOBILE_UI then desc_scale = desc_scale*1.5 end
if args.type == 'name' then
final_line[#final_line+1] = {n=G.UIT.O, config={
object = DynaText({string = {assembled_string},
@ -1673,7 +1772,7 @@ function localize(args, misc_cat)
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
scale = (0.55 - 0.004*#assembled_string)*(part.control.s and tonumber(part.control.s) or 1)
})
}}
elseif part.control.E then

View File

@ -101,6 +101,8 @@ function end_round()
end
card_eval_status_text(G.jokers.cards[i], 'jokers', nil, nil, nil, eval)
end
G.jokers.cards[i]:calculate_rental()
G.jokers.cards[i]:calculate_perishable()
end
if G.GAME.round_resets.ante == G.GAME.win_ante and G.GAME.blind:get_type() == 'Boss' then
game_won = true
@ -736,6 +738,7 @@ G.FUNCS.evaluate_play = function(e)
hand_chips = mod_chips(old_mult)
extras.hand_chips = true; extras.mult = true
end
if effects[ii].extra.func then effects[ii].extra.func() 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

View File

@ -1,5 +1,4 @@
function live_test()
end
function do_action(action)

389
game.lua
View File

@ -173,6 +173,9 @@ function Game:start_up()
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_sticker_perishable = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 0,y = 2})
self.shared_sticker_rental = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 1,y = 2})
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}),
@ -203,9 +206,7 @@ function Game:start_up()
--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()
@ -227,7 +228,7 @@ function Game:init_item_prototypes()
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_investment = {name = 'Investment Tag', set = 'Tag', discovered = false, min_ante = nil, order = 7, config = {type = 'eval', dollars = 25}, 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}},
@ -364,165 +365,165 @@ function Game:init_item_prototypes()
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_joker= {order = 1, unlocked = true, start_alerted = true, discovered = true, blueprint_compat = true, perishable_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, perishable_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 = 3, suit = 'Diamonds'}}},
j_lusty_joker= {order = 3, unlocked = true, discovered = false, blueprint_compat = true, perishable_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 = 3, suit = 'Hearts'}}},
j_wrathful_joker= {order = 4, unlocked = true, discovered = false, blueprint_compat = true, perishable_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 = 3, suit = 'Spades'}}},
j_gluttenous_joker= {order = 5, unlocked = true, discovered = false, blueprint_compat = true, perishable_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 = 3, suit = 'Clubs'}}},
j_jolly= {order = 6, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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, perishable_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 = 10, type = 'Two Pair'}},
j_crazy= {order = 9, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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, perishable_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, perishable_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, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Clever Joker",set = "Joker", config = {t_chips = 80, type = 'Two Pair'}, pos = {x=2,y=14}},
j_devious= {order = 14, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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_half= {order = 16, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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, perishable_compat = true, 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, perishable_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, perishable_compat = true, 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, perishable_compat = false, 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, perishable_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 = 30}},
j_mystic_summit= {order = 23, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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, perishable_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, perishable_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=4}},
j_misprint= {order = 27, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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, perishable_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, perishable_compat = true, 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_fibonacci= {order = 31, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 8, 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, perishable_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.2}, enhancement_gate = 'm_steel'},
j_scary_face= {order = 33, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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, perishable_compat = true, 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, perishable_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, perishable_compat = true, 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, perishable_compat = true, eternal_compat = false, rarity = 1, cost = 5, name = "Gros Michel", pos = {x=7,y=6}, set = "Joker", effect = "", config = {extra = {odds = 6, mult = 15}}, no_pool_flag = 'gros_michel_extinct'},
j_even_steven= {order = 39, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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 = 31}},
j_scholar= {order = 41, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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, perishable_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, perishable_compat = false, 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, perishable_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_egg= {order = 46, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, 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, perishable_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, perishable_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, perishable_compat = false, eternal_compat = true, rarity = 1, cost = 5, name = 'Runner', pos = {x = 3, y = 10}, set = 'Joker', config = {extra = {chips = 0, chip_mod = 15}}},
j_ice_cream= {order = 50, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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, perishable_compat = true, 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, perishable_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, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = 'Sixth Sense', pos = {x = 8, y = 10}, set = 'Joker', config = {}},
j_constellation= {order = 55, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, 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, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 5, name = 'Hiker', pos = {x = 0, y = 11}, set = 'Joker', config = {extra = 5}},
j_faceless= {order = 57, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_compat = false, 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, perishable_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, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = 'To Do List', pos = {x = 4, y = 11}, set = 'Joker', config = {extra = {dollars = 4, 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_cavendish= {order = 61, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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, perishable_compat = false, 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, perishable_compat = false, 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, perishable_compat = false, eternal_compat = true, rarity = 1, cost = 4, name = "Square Joker", pos = {x=9,y=11}, set = "Joker", cost_mult = 1.0, config = {extra = {chips = 0, chip_mod = 4}}},
j_seance= {order = 66, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, 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, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 6, 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, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 7, name = "Vampire",set = "Joker", config = {extra = 0.1, Xmult = 1}, pos = {x=2,y=12}},
j_shortcut= {order = 69, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, 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, perishable_compat = false, 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, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, name = "Vagabond",set = "Joker", config = {extra = 4}, pos = {x=5,y=12}},
j_baron= {order = 72, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Cloud 9",set = "Joker", config = {extra = 1}, pos = {x=7,y=12}},
j_rocket= {order = 74, unlocked = true, discovered = false, blueprint_compat = false, perishable_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, perishable_compat = false, 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 = false, 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_midas_mask= {order = 76, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Midas Mask",set = "Joker", config = {}, pos = {x=0,y=13}},
j_luchador= {order = 77, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = false, 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, perishable_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, perishable_compat = true, 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, perishable_compat = true, 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, perishable_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, perishable_compat = true, eternal_compat = true, rarity = 1, 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, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Mail-In Rebate",set = "Joker", config = {extra = 5}, pos = {x=7,y=13}},
j_to_the_moon= {order = 84, unlocked = true, discovered = false, blueprint_compat = false, perishable_compat = true, 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, perishable_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, perishable_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, perishable_compat = true, 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, perishable_compat = true, 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, perishable_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, perishable_compat = true, 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_lucky_cat= {order = 91, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, eternal_compat = true, rarity = 2, cost = 6, name = "Lucky Cat",set = "Joker", config = {Xmult = 1, extra = 0.25}, pos = {x=5,y=14}, enhancement_gate = 'm_lucky'},
j_baseball= {order = 92, unlocked = true, discovered = false, blueprint_compat = true, perishable_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, perishable_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, perishable_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, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 6, name = "Trading Card",set = "Joker", config = {extra = 3}, pos = {x=9,y=14}},
j_flash= {order = 96, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = false, 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, perishable_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, perishable_compat = false, 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, perishable_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, perishable_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, perishable_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, perishable_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, perishable_compat = false, 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, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Smiley Face",set = "Joker", config = {extra = 5}, pos = {x=6,y=15}},
j_campfire= {order = 105, unlocked = true, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 9, name = "Campfire",set = "Joker", config = {extra = 0.25}, 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_ticket= {order = 106, unlocked = false, discovered = false, blueprint_compat = true, perishable_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 = 4},unlock_condition = {type = 'hand_contents', extra = 'Gold'}, enhancement_gate = 'm_gold'},
j_mr_bones= {order = 107, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, 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, perishable_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, perishable_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, perishable_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, perishable_compat = true, 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, perishable_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, perishable_compat = true, 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, perishable_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, perishable_compat = true, eternal_compat = true, rarity = 1, cost = 4, name = "Hanging Chad", pos = {x=9,y=6}, set = "Joker", effect = "", config = {extra = 2}, unlock_condition = {type = 'round_win', extra = 'High Card'}},
j_rough_gem= {order = 116, unlocked = false, discovered = false, blueprint_compat = true, perishable_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, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Bloodstone", pos = {x=0,y=8}, set = "Joker", effect = "", config = {extra = {odds = 2, Xmult = 1.5}}, unlock_condition = {type = 'modify_deck', extra = {count = 30, suit = 'Hearts'}}},
j_arrowhead= {order = 118, unlocked = false, discovered = false, blueprint_compat = true, perishable_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, perishable_compat = true, eternal_compat = true, rarity = 2, cost = 7, name = "Onyx Agate", pos = {x=2,y=8}, set = "Joker", effect = "", config = {extra = 7}, unlock_condition = {type = 'modify_deck', extra = {count = 30, suit = 'Clubs'}}},
j_glass= {order = 120, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = false, 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.75, 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_ring_master= {order = 121, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, 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, perishable_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, perishable_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, perishable_compat = false, eternal_compat = true, rarity = 3, cost = 8, name = "Wee Joker", pos = {x=0,y=0}, set = "Joker", effect = "", config = {extra = {chips = 0, chip_mod = 8}}, unlock_condition = {type = 'win', n_rounds = 18}},
j_merry_andy= {order = 125, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, 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, perishable_compat = true, 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, perishable_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, perishable_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, perishable_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, perishable_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, perishable_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, perishable_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, perishable_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, perishable_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, perishable_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}},
j_stuntman= {order = 136, unlocked = false, discovered = false, blueprint_compat = true, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 7, name = "Stuntman", pos = {x=8,y=6}, set = "Joker", effect = "", config = {extra = {h_size = 2, chip_mod = 250}}, unlock_condition = {type = 'chip_score', chips = 100000000}},
j_invisible= {order = 137, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, eternal_compat = false, rarity = 3, cost = 8, name = "Invisible Joker", pos = {x=1,y=7}, set = "Joker", effect = "", config = {extra = 2}, unlock_condition = {type = 'win_custom'}},
j_brainstorm= {order = 138, unlocked = false, discovered = false, blueprint_compat = true, perishable_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, perishable_compat = true, 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, perishable_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, perishable_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, perishable_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, perishable_compat = true, 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, perishable_compat = true, eternal_compat = true, rarity = 3, cost = 8, 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, perishable_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, perishable_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, perishable_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, perishable_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 = 1, discards = 23}}, unlock_condition = {type = '', extra = '', hidden = true}},
j_chicot= {order = 149, unlocked = false, discovered = false, blueprint_compat = false, perishable_compat = true, 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, perishable_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}},
@ -530,7 +531,7 @@ function Game:init_item_prototypes()
--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_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 = 2}},
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}},
@ -1002,7 +1003,6 @@ function Game:set_render_settings()
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
@ -1496,7 +1496,7 @@ function Game:main_menu(change_context) --True if main menu is accessed from the
G.SPLASH_BACK:define_draw_steps({{
shader = 'splash',
send = {
{name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'},
{name = 'time', ref_table = G.TIMERS, ref_value = 'REAL_SHADER'},
{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'},
@ -1687,7 +1687,7 @@ function Game:demo_cta() --True if main menu is accessed from the splash screen,
G.SPLASH_BACK:define_draw_steps({{
shader = 'splash',
send = {
{name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'},
{name = 'time', ref_table = G.TIMERS, ref_value = 'REAL_SHADER'},
{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'},
@ -1859,6 +1859,8 @@ function Game:init_game_object()
inflation = 0,
hands_played = 0,
unused_discards = 0,
perishable_rounds = 5,
rental_rate = 3,
blind = nil,
chips = 0,
chips_text = '0',
@ -1945,14 +1947,14 @@ function Game:init_game_object()
['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}}},
["Flush Five"] = {visible = false, order = 1, mult = 16, chips = 160, s_mult = 16, s_chips = 160, level = 1, l_mult = 3, l_chips = 50, 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 = 4, 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}}},
["Straight Flush"] = {visible = true, order = 4, mult = 8, chips = 100, s_mult = 8, s_chips = 100, level = 1, l_mult = 4, 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}}},
["Straight"] = {visible = true, order = 8, mult = 4, chips = 30, s_mult = 4, s_chips = 30, level = 1, l_mult = 3, 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}}},
@ -2001,10 +2003,8 @@ function Game:start_run(args)
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
if self.GAME.stake >= 7 then self.GAME.modifiers.enable_perishables_in_shop = true end
if self.GAME.stake >= 8 then self.GAME.modifiers.enable_rentals_in_shop = true end
self.GAME.selected_back:apply_to_run()
@ -2088,6 +2088,11 @@ function Game:start_run(args)
G.GAME.banned_keys[v.id] = true
end
end
if _ch.restrictions.banned_other then
for k, v in ipairs(_ch.restrictions.banned_other) do
G.GAME.banned_keys[v.id] = true
end
end
end
end
@ -2104,7 +2109,7 @@ function Game:start_run(args)
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)
self.GAME.pseudorandom.seed = args.seed or (not (G.SETTINGS.tutorial_complete or G.SETTINGS.tutorial_progress.completed_parts['big_blind']) and "TUTORIAL") or generate_starting_seed()
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
@ -2225,7 +2230,7 @@ function Game:start_run(args)
G.SPLASH_BACK:define_draw_steps({{
shader = 'background',
send = {
{name = 'time', ref_table = G.TIMERS, ref_value = 'REAL'},
{name = 'time', ref_table = G.TIMERS, ref_value = 'REAL_SHADER'},
{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'},
@ -2253,7 +2258,6 @@ function Game:start_run(args)
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
@ -2328,6 +2332,7 @@ function Game:start_run(args)
self.deck:hard_set_T()
reset_idol_card()
reset_mail_rank()
self.GAME.current_round.ancient_card.suit = nil
reset_ancient_card()
reset_castle_card()
end
@ -2372,6 +2377,7 @@ function Game:start_run(args)
end
else
G.GAME.blind:set_blind(nil, nil, true)
reset_blinds()
end
G.FUNCS.blind_chip_UI_scale(G.hand_text_area.blind_chips)
@ -2389,7 +2395,7 @@ function Game:start_run(args)
end
function Game:update(dt)
nuGC(nil, nil, true)
G.MAJORS = 0
G.MINORS = 0
@ -2404,6 +2410,7 @@ function Game:update(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.REAL_SHADER = G.SETTINGS.reduced_motion and 300 or self.TIMERS.REAL
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)
@ -2564,7 +2571,7 @@ function Game:update(dt)
G.exp_times.max_vel = 70*move_dt
for k, v in ipairs(self.MOVEABLES) do
for k, v in pairs(self.MOVEABLES) do
if v.FRAME.MOVE < G.FRAMES.MOVE then v:move(move_dt) end
end
timer_checkpoint('move', 'update')
@ -2615,7 +2622,6 @@ function Game:update(dt)
(not G.FILE_HANDLER.last_sent_time or (G.FILE_HANDLER.last_sent_time < (G.TIMERS.UPTIME - G.F_SAVE_TIMER)))) then
if G.FILE_HANDLER.metrics then
print('SAVING METRICS')
G.SAVE_MANAGER.channel:push({
type = 'save_metrics',
save_metrics = G.ARGS.save_metrics
@ -2623,13 +2629,11 @@ function Game:update(dt)
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,
@ -2639,7 +2643,6 @@ function Game:update(dt)
end
if G.FILE_HANDLER.run then
print('SAVING RUN')
G.SAVE_MANAGER.channel:push({
type = 'save_run',
save_table = G.ARGS.save_run,
@ -2858,11 +2861,11 @@ function Game:draw()
end
end
love.graphics.pop()
love.graphics.setCanvas()
love.graphics.setCanvas(G.AA_CANVAS)
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
love.graphics.setColor(G.C.WHITE)
if (not G.recording_mode or G.video_control )and true 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
@ -2881,10 +2884,20 @@ love.graphics.pop()
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.draw(self.CANVAS, 0, 0)
love.graphics.pop()
love.graphics.setCanvas()
love.graphics.setShader()
if G.AA_CANVAS then
love.graphics.push()
love.graphics.scale(1/G.CANV_SCALE)
love.graphics.draw(G.AA_CANVAS, 0, 0)
love.graphics.pop()
end
timer_checkpoint('canvas', 'draw')
if not _RELEASE_MODE and not G.video_control and G.F_VERBOSE then
@ -3188,15 +3201,15 @@ function Game:update_blind_select(dt)
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
--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(),

View File

@ -1,4 +1,4 @@
VERSION = '1.0.0n'
VERSION = '1.0.1f'
VERSION = VERSION..'-FULL'
--check_version
@ -7,7 +7,7 @@ VERSION = VERSION..'-FULL'
function Game:set_globals()
self.VERSION = VERSION
--|||||||||||||||||||||||||||||
--||||||||||||||||||||||||||||||
-- Feature Flags
--||||||||||||||||||||||||||||||
self.F_QUIT_BUTTON = true --Include the main menu 'Quit' button
@ -30,7 +30,7 @@ function Game:set_globals()
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_ENGLISH_ONLY = nil --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
@ -38,14 +38,15 @@ function Game:set_globals()
self.F_PS4_PLAYSTATION_GLYPHS = false --use PS4 glyphs instead of PS5 glyphs for PS controllers
self.F_LOCAL_CLIPBOARD = false
self.F_SAVE_TIMER = 30
self.F_MOBILE_UI = nil
self.F_MOBILE_UI = false
self.F_HIDE_BETA_LANGS = nil
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")()
--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_SAVE_TIMER = 5
self.F_ENGLISH_ONLY = false
self.F_CRASH_REPORTS = true
self.F_CRASH_REPORTS = false
end
if love.system.getOS() == 'OS X' then
@ -56,6 +57,7 @@ function Game:set_globals()
end
if love.system.getOS() == 'Nintendo Switch' then
self.F_HIDE_BETA_LANGS = true
self.F_BASIC_CREDITS = true
self.F_NO_ERROR_HAND = true
self.F_QUIT_BUTTON = false
@ -72,13 +74,14 @@ function Game:set_globals()
self.F_CTA = false
self.F_VERBOSE = false
self.F_NO_ACHIEVEMENTS = true
self.F_ENGLISH_ONLY = true
self.F_ENGLISH_ONLY = nil
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_HIDE_BETA_LANGS = true
self.F_NO_ERROR_HAND = true
self.F_QUIT_BUTTON = false
self.F_SKIP_TUTORIAL = false
@ -100,6 +103,7 @@ function Game:set_globals()
end
if love.system.getOS() == 'xbox' then
self.F_HIDE_BETA_LANGS = true
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
@ -122,6 +126,7 @@ function Game:set_globals()
self.TIMERS = {
TOTAL=0,
REAL = 0,
REAL_SHADER = 0,
UPTIME = 0,
BACKGROUND = 0
}
@ -212,8 +217,8 @@ function Game:set_globals()
--||||||||||||||||||||||||||||||
self.TILESIZE = 20
self.TILESCALE = 3.65
self.TILE_W = self.F_MOBILE_UI and 11.5 or 20
self.TILE_H = self.F_MOBILE_UI and 20 or 11.5
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
@ -321,6 +326,8 @@ function Game:set_globals()
EDITION = {1,1,1,1},
DARK_EDITION = {0,0,0,1},
ETERNAL = HEX('c75985'),
PERISHABLE = HEX('4f5da1'),
RENTAL = HEX('b18f43'),
DYN_UI = {
MAIN = HEX('374244'),
DARK = HEX('374244'),
@ -404,7 +411,7 @@ function Game:set_globals()
},
BACKGROUND = {
L = {1,1,0,1},
D = {0,1,1,1},
D = HEX("374244"),
C = HEX("374244"),
contrast = 1
}

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
return {
return {
descriptions = {
Joker = {
j_joker = {
@ -112,15 +112,16 @@ return {
j_drunkard = {
name = "Drunkard",
text = {
"{C:red}+#1#{} discard"
"{C:red}+#1#{} discard",
"each round"
}
},
j_stone = {
name = "Stone Joker",
text = {
"This Joker gains {C:chips}+#1#{} Chips",
"for each {C:attention}Stone Card",
"in your full deck",
"Gives {C:chips}+#1#{} Chips for",
"each {C:attention}Stone Card",
"in your {C:attention}full deck",
"{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)",
}
},
@ -240,9 +241,9 @@ return {
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:green}#1# in #2#{} chance for each",
"played {C:attention}8{} to create a",
"{C:tarot}Tarot{} card when scored",
"{C:inactive}(Must have room)"
}
},
@ -271,8 +272,8 @@ return {
name = "Raised Fist",
text = {
"Adds {C:attention}double{} the rank",
"of {C:attention}lowest{} card held",
"in hand to Mult"
"of {C:attention}lowest{} ranked card",
"held in hand to Mult"
}
},
j_fibonacci = {
@ -286,9 +287,9 @@ return {
j_steel_joker = {
name = "Steel Joker",
text = {
"This Joker gains {X:mult,C:white} X#1# {} Mult",
"Gives {X:mult,C:white} X#1# {} Mult",
"for each {C:attention}Steel Card",
"in your full deck",
"in your {C:attention}full deck",
"{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)",
}
},
@ -379,9 +380,9 @@ return {
j_supernova = {
name = "Supernova",
text = {
"Adds the number of",
"times {C:attention}poker hand{} has",
"been played to Mult"
"Adds the number of times",
"{C:attention}poker hand{} has been",
"played this run to Mult"
}
},
j_superposition = {
@ -396,8 +397,8 @@ return {
j_ride_the_bus = {
name = "Ride the Bus",
text = {
"{C:mult}+#1#{} Mult per",
"consecutive hand",
"This Joker gains {C:mult}+#1#{} Mult",
"per {C:attention}consecutive{} hand",
"played without a",
"scoring {C:attention}face{} card",
"{C:inactive}(Currently {C:mult}+#2#{C:inactive} Mult)"
@ -488,8 +489,9 @@ return {
j_constellation = {
name = "Constellation",
text = {
"Gains {X:mult,C:white} X#1# {} Mult",
"per {C:planet}Planet{} card used",
"This Joker gains",
"{X:mult,C:white} X#1# {} Mult every time",
"a {C:planet}Planet{} card is used",
"{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)"
}
},
@ -516,7 +518,7 @@ return {
"Earn {C:money}$#1#{} if {C:attention}poker hand{}",
"is a {C:attention}#2#{},",
"poker hand changes",
"on every payout"
"at end of round"
}
},
j_ticket = {
@ -579,9 +581,9 @@ return {
j_swashbuckler = {
name = "Swashbuckler",
text = {
"Adds the sell value of",
"all owned {C:attention}Jokers{} left",
"of this card to Mult",
"Adds the sell value",
"of all other owned",
"{C:attention}Jokers{} to Mult",
"{C:inactive}(Currently {C:mult}+#1#{C:inactive} Mult)"
},
unlock = {
@ -594,7 +596,7 @@ return {
name = "Troubadour",
text = {
"{C:attention}+#1#{} hand size,",
"{C:red}-#2#{} hands per round"
"{C:blue}-#2#{} hand each round"
},
unlock = {
"Win {C:attention,E:1}#1#{} consecutive",
@ -646,7 +648,8 @@ return {
name = "Hanging Chad",
text = {
"Retrigger {C:attention}first{} played",
"card used in scoring"
"card used in scoring",
"{C:attention}#1#{} additional times"
},
unlock = {
"Beat a Boss Blind",
@ -709,7 +712,7 @@ return {
j_glass = {
name = "Glass Joker",
text = {
"Gains {X:mult,C:white} X#1# {} Mult",
"This Joker 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)"
@ -735,8 +738,8 @@ return {
j_flower_pot = {
name = "Flower Pot",
text = {
"{X:mult,C:white} X#1# {} Mult if played",
"hand has a scoring",
"{X:mult,C:white} X#1# {} Mult if poker",
"hand contains a",
"{C:diamonds}Diamond{} card, {C:clubs}Club{} card,",
"{C:hearts}Heart{} card, and {C:spades}Spade{} card"
},
@ -771,7 +774,8 @@ return {
j_merry_andy = {
name = "Merry Andy",
text = {
"{C:red}+#1#{} discards,",
"{C:red}+#1#{} discards",
"each round,",
"{C:red}#2#{} hand size"
},
unlock = {
@ -836,9 +840,9 @@ return {
j_hit_the_road = {
name = "Hit the Road",
text = {
"Gains {X:mult,C:white} X#1# {} Mult",
"per discarded",
"{C:attention}Jack{} this round",
"This Joker gains {X:mult,C:white} X#1# {} Mult",
"for every {C:attention}Jack{}",
"discarded this round",
"{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)"
},
unlock = {
@ -932,7 +936,8 @@ return {
j_red_card = {
name = "Red Card",
text = {
"Gains {C:red}+#1#{} Mult when any",
"This Joker gains",
"{C:red}+#1#{} Mult when any",
"{C:attention}Booster Pack{} is skipped",
"{C:inactive}(Currently {C:red}+#2#{C:inactive} Mult)"
}
@ -940,17 +945,17 @@ return {
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)"
"When {C:attention}Small Blind{} or {C:attention}Big 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# {C:inactive} Mult)"
}
},
j_square = {
name = "Square Joker",
text = {
"Gains {C:chips}+#2#{} Chips if",
"played hand has",
"This Joker gains {C:chips}+#2#{} Chips",
"if played hand has",
"exactly {C:attention}4{} cards",
"{C:inactive}(Currently {C:chips}#1#{C:inactive} Chips)"
}
@ -975,8 +980,8 @@ return {
j_vampire = {
name = "Vampire",
text = {
"Gains {X:mult,C:white} X#1# {} Mult per",
"{C:attention}Enhanced card{} played,",
"This Joker gains {X:mult,C:white} X#1# {} Mult",
"per scoring {C:attention}Enhanced card{} played,",
"removes card {C:attention}Enhancement",
"{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)"
}
@ -986,15 +991,15 @@ return {
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})"
"{C:inactive}(ex: {C:attention}10 8 6 5 3{C:inactive})"
}
},
j_hologram = {
name = "Hologram",
text = {
"Gains {X:mult,C:white} X#1# {} Mult",
"per {C:attention}playing card{} added",
"to your deck",
"This Joker gains {X:mult,C:white} X#1# {} Mult",
"every time a {C:attention}playing card{}",
"is added to your deck",
"{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)"
}
},
@ -1027,16 +1032,16 @@ return {
j_rocket = {
name = "Rocket",
text = {
"Earn {C:money}$#1#{} at end of",
"round. Gains {C:money}$#2#{} when",
"{C:attention}Boss Blind{} is defeated",
"Earn {C:money}$#1#{} at end of round",
"Payout increases by {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",
"This Joker gains {X:mult,C:white} X#1# {} Mult",
"per {C:attention}consecutive{} hand played",
"without playing your",
"most played {C:attention}poker hand",
"{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)"
@ -1045,9 +1050,9 @@ return {
j_midas_mask = {
name = "Midas Mask",
text = {
"All {C:attention}face{} cards",
"All played {C:attention}face{} cards",
"become {C:attention}Gold{} cards",
"when played",
"when scored",
}
},
j_luchador = {
@ -1130,8 +1135,8 @@ return {
j_lucky_cat = {
name = "Lucky Cat",
text = {
"Gains {X:mult,C:white} X#1# {} Mult each",
"time a {C:attention}Lucky{} card",
"This Joker gains {X:mult,C:white} X#1# {} Mult",
"every time a {C:attention}Lucky{} card",
"{C:green}successfully{} triggers",
"{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)"
}
@ -1146,8 +1151,8 @@ return {
j_bull = {
name = "Bull",
text = {
"{C:chips}+#1#{} Chips for each",
"{C:money}dollar{} you have",
"{C:chips}+#1#{} Chips for",
"each {C:money}$1{} you have",
"{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)"
}
},
@ -1170,8 +1175,8 @@ return {
j_flash = {
name = "Flash Card",
text = {
"{C:mult}+#1#{} Mult per",
"{C:attention}reroll{} in the shop",
"This Joker gains {C:mult}+#1#{} Mult",
"per {C:attention}reroll{} in the shop",
"{C:inactive}(Currently {C:mult}+#2#{C:inactive} Mult)"
}
},
@ -1194,8 +1199,8 @@ return {
j_trousers= {
name = "Spare Trousers",
text = {
"Gains {C:mult}+#1#{} Mult if",
"played hand contains",
"This Joker gains {C:mult}+#1#{} Mult",
"if played hand contains",
"a {C:attention}#2#",
"{C:inactive}(Currently {C:red}+#3#{C:inactive} Mult)"
}
@ -1306,9 +1311,9 @@ return {
j_shoot_the_moon = {
name = "Shoot the Moon",
text = {
"{C:mult}+#1#{} Mult for",
"each {C:attention}Queen{}",
"held in hand"
"Each {C:attention}Queen{}",
"held in hand",
"gives {C:mult}+#1#{} Mult",
},
unlock = {
"Play every {E:1,C:attention}Heart",
@ -1370,7 +1375,8 @@ return {
name = "Bootstraps",
text = {
"{C:mult}+#1#{} Mult for every",
"{C:money}$#2#{} you have"
"{C:money}$#2#{} you have",
"{C:inactive}(Currently {C:mult}+#3#{C:inactive} Mult)"
},
unlock = {
"Have at least {E:1,C:attention}#1#",
@ -1380,8 +1386,8 @@ return {
j_caino = {
name = "Canio",
text = {
"Gains {X:mult,C:white} X#1# {} Mult when",
"a {C:attention}face{} card",
"This Joker 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)"
},
@ -1403,9 +1409,10 @@ return {
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})"
"This Joker gains",
"{X:mult,C:white} X#1# {} Mult every {C:attention}#2#{C:inactive} [#3#]{}",
"cards discarded",
"{C:inactive}(Currently {X:mult,C:white} X#4# {C:inactive} Mult)"
},
unlock = {
"{E:1,s:1.3}?????"
@ -1508,15 +1515,15 @@ return {
text = {
"Permanently",
"gain {C:red}+#1#{} discard",
"per round"
"each round"
}
},
v_seed_money = {
name = "Seed Money",
text = {
"Raise the cap on",
"interest earned",
"per round to {C:money}$#1#{}"
"interest earned in",
"each round to {C:money}$#1#{}"
}
},
v_blank = {
@ -1538,7 +1545,7 @@ return {
text = {
"{C:attention}-#1#{} Ante,",
"{C:blue}-#1#{} hand",
"per round"
"each round"
}
},
v_directors_cut = {
@ -1680,7 +1687,7 @@ return {
text = {
"Permanently",
"gain {C:red}+#1#{} discard",
"per round"
"each round"
},
unlock = {
"Discard a total",
@ -1692,8 +1699,8 @@ return {
name = "Money Tree",
text = {
"Raise the cap on",
"interest earned",
"per round to {C:money}$#1#{}"
"interest earned in",
"each round to {C:money}$#1#{}"
},
unlock = {
"Max out the interest",
@ -1732,7 +1739,7 @@ return {
text = {
"{C:attention}-#1#{} Ante,",
"{C:red}-#1#{} discard",
"per round"
"each round"
},
unlock = {
"Reach Ante",
@ -1775,9 +1782,9 @@ return {
c_magician = {
name = "The Magician",
text = {
"Enhances {C:attention}#1#{} selected",
"card into a",
"{C:attention}#2#"
"Enhances {C:attention}#1#{}",
"selected cards to",
"{C:attention}#2#s"
}
},
c_high_priestess = {
@ -2348,15 +2355,16 @@ return {
stake_orange = {
name = "Orange Stake",
text = {
"{C:attention}Booster Packs{} cost",
"{C:money}$1{} more per Ante",
"Shop can have {C:attention}Perishable{} Jokers",
"{C:inactive,s:0.8}(Debuffed after 5 Rounds)",
"{s:0.8}Applies all previous Stakes"
}
},
stake_gold = {
name = "Gold Stake",
text = {
"{C:red}-1{} hand size",
"Shop can have {C:attention}Rental{} Jokers",
"{C:inactive,s:0.8}(Costs {C:money,s:0.8}$3{C:inactive,s:0.8} per round)",
"{s:0.8}Applies all previous Stakes"
}
}
@ -2365,14 +2373,14 @@ return {
tag_uncommon = {
name = "Uncommon Tag",
text = {
"Shop has an",
"Shop has a free",
"{C:green}Uncommon Joker"
}
},
tag_rare = {
name = "Rare Tag",
text = {
"Shop has a",
"Shop has a free",
"{C:red}Rare Joker"
}
},
@ -2380,28 +2388,32 @@ return {
name = "Negative Tag",
text = {
"Next base edition shop",
"Joker becomes {C:dark_edition}Negative"
"Joker is free and",
"becomes {C:dark_edition}Negative"
}
},
tag_foil = {
name = "Foil Tag",
text = {
"Next base edition shop",
"Joker becomes {C:dark_edition}Foil"
"Joker is free and",
"becomes {C:dark_edition}Foil"
}
},
tag_holo = {
name = "Holographic Tag",
text = {
"Next base edition shop",
"Joker becomes {C:dark_edition}Holographic"
"Joker is free and",
"becomes {C:dark_edition}Holographic"
}
},
tag_polychrome = {
name = "Polychrome Tag",
text = {
"Next base edition shop",
"Joker becomes {C:dark_edition}Polychrome"
"Joker is free and",
"becomes {C:dark_edition}Polychrome"
}
},
tag_investment = {
@ -2888,9 +2900,10 @@ return {
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"
"Creates the {C:planet}Planet{} card",
"for final played {C:attention}poker hand{}",
"of round if {C:attention}held{} in hand",
"{C:inactive}(Must have room)"
}
},
purple_seal = {
@ -2908,6 +2921,21 @@ return {
"or destroyed"
}
},
perishable = {
name = "Perishable",
text = {
"Debuffed after",
"{C:attention}#1#{} rounds",
"{C:inactive}({C:attention}#2#{C:inactive} remaining)"
}
},
rental = {
name = "Rental",
text = {
"Lose {C:money}$#1#{} at",
"end of round"
}
},
white_sticker = {
name = "White Sticker",
text = {
@ -3491,6 +3519,8 @@ return {
purple_seal = "Purple Seal",
locked = "Locked",
eternal = "Eternal",
perishable = "Perishable",
rental = "Rental",
pinned_left = "Pinned",
},
dictionary = {
@ -3530,6 +3560,7 @@ return {
b_set_play_discard_pos = "Play/Discard Button Position",
b_set_screenshake = "Screenshake",
b_high_contrast_cards = "High Contrast Cards",
b_reduced_motion = "Reduced Motion",
b_set_rumble = "Controller Rumble",
b_set_crash_reports = "Crash Reports",
b_set_monitor = "Display Monitor",
@ -3820,6 +3851,7 @@ return {
k_val_up = "Value Up!",
k_reset = "Reset",
k_extinct_ex = "Extinct!",
k_disabled_ex = "Disabled!",
k_safe_ex = "Safe!",
k_saved_ex = "Saved!",
k_swapped_ex = "Swapped!",

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -323,7 +323,7 @@ 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 = G.F_MOBILE_UI and h or w/1
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
@ -364,8 +364,25 @@ function love.resize(w, h)
real_window_w = w,
real_window_h = h
}
G.CANV_SCALE = 1
if love.system.getOS() == 'Windows' and false then --implement later if needed
local render_w, render_h = love.window.getDesktopDimensions(G.SETTINGS.WINDOW.selcted_display)
local unscaled_dims = love.window.getFullscreenModes(G.SETTINGS.WINDOW.selcted_display)[1]
local DPI_scale = math.floor((0.5*unscaled_dims.width/render_w + 0.5*unscaled_dims.height/render_h)*500 + 0.5)/500
if DPI_scale > 1.1 then
G.CANV_SCALE = 1.5
G.AA_CANVAS = love.graphics.newCanvas(G.WINDOWTRANS.real_window_w*G.CANV_SCALE, G.WINDOWTRANS.real_window_h*G.CANV_SCALE, {type = '2d', readable = true})
G.AA_CANVAS:setFilter('linear', 'linear')
else
G.AA_CANVAS = nil
end
end
G.CANVAS = love.graphics.newCanvas(w*G.CANV_SCALE, h*G.CANV_SCALE, {type = '2d', readable = true})
G.CANVAS:setFilter('linear', 'linear')
end

View File

@ -144,7 +144,7 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
if (hovering <= 0.){
return transform_projection * vertex_position;
}
MY_HIGHP_OR_MEDIUMP float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy);
MY_HIGHP_OR_MEDIUMP float mid_dist = screen_scale*length(vertex_position.xy/screen_scale - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy);
MY_HIGHP_OR_MEDIUMP vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale;
MY_HIGHP_OR_MEDIUMP float scale = 0.002*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist);

View File

@ -19,22 +19,22 @@ vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
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
MY_HIGHP_OR_MEDIUMP 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);
MY_HIGHP_OR_MEDIUMP float t = time * 10.0 + 2003.;
MY_HIGHP_OR_MEDIUMP vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a);
MY_HIGHP_OR_MEDIUMP 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));
MY_HIGHP_OR_MEDIUMP vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324));
MY_HIGHP_OR_MEDIUMP vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532));
MY_HIGHP_OR_MEDIUMP vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000));
float field = (1.+ (
MY_HIGHP_OR_MEDIUMP 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);
MY_HIGHP_OR_MEDIUMP vec2 borders = vec2(0.2, 0.8);
float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14))
MY_HIGHP_OR_MEDIUMP 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)
@ -53,20 +53,20 @@ vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
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;
MY_HIGHP_OR_MEDIUMP vec4 tex = Texel( texture, texture_coords);
MY_HIGHP_OR_MEDIUMP 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);
MY_HIGHP_OR_MEDIUMP number low = min(tex.r, min(tex.g, tex.b));
MY_HIGHP_OR_MEDIUMP number high = max(tex.r, max(tex.g, tex.b));
MY_HIGHP_OR_MEDIUMP 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.));
MY_HIGHP_OR_MEDIUMP 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.));
MY_HIGHP_OR_MEDIUMP 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));
MY_HIGHP_OR_MEDIUMP 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));
MY_HIGHP_OR_MEDIUMP 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));
MY_HIGHP_OR_MEDIUMP 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.);
MY_HIGHP_OR_MEDIUMP 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);
@ -88,9 +88,9 @@ 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))
MY_HIGHP_OR_MEDIUMP float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy);
MY_HIGHP_OR_MEDIUMP vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale;
MY_HIGHP_OR_MEDIUMP 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);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 493 KiB

After

Width:  |  Height:  |  Size: 493 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 598 KiB

After

Width:  |  Height:  |  Size: 598 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

14
tag.lua
View File

@ -122,7 +122,7 @@ function Tag:apply_to_run(_context)
end)
self.triggered = true
return {
dollars = 15,
dollars = self.config.dollars,
condition = localize('ph_defeat_the_boss'),
pos = self.pos,
tag = self
@ -358,6 +358,8 @@ function Tag:apply_to_run(_context)
card.states.visible = false
self:yep('+', G.C.RED,function()
card:start_materialize()
card.ability.couponed = true
card:set_cost()
return true
end)
else
@ -370,6 +372,8 @@ function Tag:apply_to_run(_context)
card.states.visible = false
self:yep('+', G.C.GREEN,function()
card:start_materialize()
card.ability.couponed = true
card:set_cost()
return true
end)
end
@ -395,6 +399,8 @@ function Tag:apply_to_run(_context)
_context.card.temp_edition = true
self:yep('+', G.C.DARK_EDITION,function()
_context.card:set_edition({foil = true}, true)
_context.card.ability.couponed = true
_context.card:set_cost()
_context.card.temp_edition = nil
G.CONTROLLER.locks[lock] = nil
return true
@ -405,6 +411,8 @@ function Tag:apply_to_run(_context)
self:yep('+', G.C.DARK_EDITION,function()
_context.card.temp_edition = nil
_context.card:set_edition({holo = true}, true)
_context.card.ability.couponed = true
_context.card:set_cost()
G.CONTROLLER.locks[lock] = nil
return true
end)
@ -414,6 +422,8 @@ function Tag:apply_to_run(_context)
self:yep('+', G.C.DARK_EDITION,function()
_context.card.temp_edition = nil
_context.card:set_edition({polychrome = true}, true)
_context.card.ability.couponed = true
_context.card:set_cost()
G.CONTROLLER.locks[lock] = nil
return true
end)
@ -423,6 +433,8 @@ function Tag:apply_to_run(_context)
self:yep('+', G.C.DARK_EDITION,function()
_context.card.temp_edition = nil
_context.card:set_edition({negative = true}, true)
_context.card.ability.couponed = true
_context.card:set_cost()
G.CONTROLLER.locks[lock] = nil
return true
end)

View File

@ -1,3 +1,3 @@
1.0.0n-FULL
1.0.0n
1.0.1f-FULL
1.0.1f
Console_other