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 if not reset then self:debuff_card(v, true) end
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 end
function Blind:alert_debuff(first) function Blind:alert_debuff(first)
@ -727,7 +727,7 @@ function Blind:load(blindTable)
self.only_hand = blindTable.only_hand self.only_hand = blindTable.only_hand
self.triggered = blindTable.triggered 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 if G.P_BLINDS[blindTable.config_blind] then
self.blind_set = true self.blind_set = true

325
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 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 self.children.center.scale.y = self.children.center.scale.y/1.2
end 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 end
if _center.soul_pos then if _center.soul_pos then
@ -240,6 +243,11 @@ function Card:set_ability(center, initial, delay_sprites)
self.T.h = H self.T.h = H
end 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 if center.name == "Wee Joker" and (center.discovered or self.bypass_discovery_center) then
H = H*0.7 H = H*0.7
W = W*0.7 W = W*0.7
@ -368,6 +376,7 @@ function Card:set_cost()
self.cost = self.cost + 3 self.cost = self.cost + 3
end 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.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) 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 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 self.sell_cost_label = self.facing == 'back' and '?' or self.sell_cost
@ -493,12 +502,33 @@ function Card:get_seal(bypass_debuff)
end end
function Card:set_eternal(_eternal) 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 self.ability.eternal = _eternal
end end
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) 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 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 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 self.debuff = should_debuff
@ -595,11 +625,15 @@ function Card:add_to_deck(from_debuff)
if self.ability.name == 'Stuntman' then if self.ability.name == 'Stuntman' then
G.hand:change_size(-self.ability.extra.h_size) G.hand:change_size(-self.ability.extra.h_size)
end end
if self.edition and self.edition.negative and not from_debuff then if self.edition and self.edition.negative then
if self.ability.consumeable then if from_debuff then
G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1 self.ability.queue_negative_removal = nil
else 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
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 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,11 +682,15 @@ function Card:remove_from_deck(from_debuff)
if self.ability.name == 'Stuntman' then if self.ability.name == 'Stuntman' then
G.hand:change_size(self.ability.extra.h_size) G.hand:change_size(self.ability.extra.h_size)
end end
if self.edition and self.edition.negative and not from_debuff and G.jokers then if self.edition and self.edition.negative and G.jokers then
if self.ability.consumeable then if from_debuff then
G.consumeables.config.card_limit = G.consumeables.config.card_limit - 1 self.ability.queue_negative_removal = true
else 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
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 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
@ -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 == '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 == '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 == '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 == 'Dusk' then loc_vars = {self.ability.extra+1}
elseif self.ability.name == 'Raised Fist' then elseif self.ability.name == 'Raised Fist' then
elseif self.ability.name == 'Fibonacci' then loc_vars = {self.ability.extra} 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 == '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 == '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 == '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 == '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 == 'Bloodstone' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds, self.ability.extra.Xmult}
elseif self.ability.name == 'Arrowhead' then loc_vars = {self.ability.extra} elseif self.ability.name == '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 == '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 == "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 == '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 == '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 == '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 == 'Chicot' then
elseif self.ability.name == 'Perkeo' then loc_vars = {self.ability.extra} elseif self.ability.name == 'Perkeo' then loc_vars = {self.ability.extra}
end end
@ -896,6 +934,11 @@ function Card:generate_UIBox_ability_table()
end end
if self.seal then badges[#badges + 1] = string.lower(self.seal)..'_seal' 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.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.pinned then badges[#badges + 1] = 'pinned_left' end
if self.sticker then loc_vars = loc_vars or {}; loc_vars.sticker=self.sticker 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', trigger = 'before',
delay = 0.0, delay = 0.0,
func = (function() 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() card:add_to_deck()
G.consumeables:emplace(card) G.consumeables:emplace(card)
G.GAME.consumeable_buffer = 0 G.GAME.consumeable_buffer = 0
end
return true return true
end)})) end)}))
card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_planet'), colour = G.C.SECONDARY_SET.Planet}) 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
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) function Card:calculate_joker(context)
if self.debuff then return nil end if self.debuff then return nil end
if self.ability.set == "Planet" and not self.debuff then 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) elseif seal_type > 0.25 then _card:set_seal('Gold', true)
else _card:set_seal('Purple', true) else _card:set_seal('Purple', true)
end end
G.GAME.blind:debuff_card(_card)
G.hand:sort() G.hand:sort()
if context.blueprint_card then context.blueprint_card:juice_up() else self:juice_up() end if context.blueprint_card then context.blueprint_card:juice_up() else self:juice_up() end
return true 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')}) card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('ph_boss_disabled')})
return true end })) return true end }))
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 self.ability.x_mult = self.ability.x_mult + self.ability.extra
local destructable_jokers = {} local destructable_jokers = {}
for i = 1, #G.jokers.cards do for i = 1, #G.jokers.cards do
@ -2712,6 +2784,20 @@ function Card:calculate_joker(context)
} }
end end
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 if self.ability.name == 'Trading Card' and not context.blueprint and
G.GAME.current_round.discards_used <= 0 and #context.full_hand == 1 then G.GAME.current_round.discards_used <= 0 and #context.full_hand == 1 then
ease_dollars(self.ability.extra) ease_dollars(self.ability.extra)
@ -2767,21 +2853,6 @@ function Card:calculate_joker(context)
} }
end end
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 if self.ability.name == 'Faceless Joker' and context.other_card == context.full_hand[#context.full_hand] then
local face_cards = 0 local face_cards = 0
@ -2900,6 +2971,16 @@ function Card:calculate_joker(context)
} }
end end
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 if self.ability.name == 'Egg' then
self.ability.extra_value = self.ability.extra_value + self.ability.extra self.ability.extra_value = self.ability.extra_value + self.ability.extra
self:set_cost() self:set_cost()
@ -3021,6 +3102,27 @@ function Card:calculate_joker(context)
} }
end end
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 if self.ability.name == 'The Idol' and
context.other_card:get_id() == G.GAME.current_round.idol_card.id 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 context.other_card:is_suit(G.GAME.current_round.idol_card.suit) then
@ -3339,7 +3441,7 @@ function Card:calculate_joker(context)
end end
if self.ability.name == 'Midas Mask' and not context.blueprint then if self.ability.name == 'Midas Mask' and not context.blueprint then
local faces = {} 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 if v:is_face() then
faces[#faces+1] = v faces[#faces+1] = v
v:set_ability(G.P_CENTERS.m_gold, nil, true) v:set_ability(G.P_CENTERS.m_gold, nil, true)
@ -3361,7 +3463,7 @@ function Card:calculate_joker(context)
end end
if self.ability.name == 'Vampire' and not context.blueprint then if self.ability.name == 'Vampire' and not context.blueprint then
local enhanced = {} 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 if v.config.center ~= G.P_CENTERS.c_base and not v.debuff and not v.vampired then
enhanced[#enhanced+1] = v enhanced[#enhanced+1] = v
v.vampired = true v.vampired = true
@ -3386,16 +3488,6 @@ function Card:calculate_joker(context)
end end
end end
if self.ability.name == 'To Do List' and context.scoring_name == self.ability.to_do_poker_hand then 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) ease_dollars(self.ability.extra.dollars)
G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + 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)})) 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 mult_mod = self.ability.mult
} }
end 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 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 if G.GAME.dollars <= self.ability.extra then
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 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 for i = 1, #context.scoring_hand do
if context.scoring_hand[i].ability.name ~= 'Wild Card' then 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 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') and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 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') and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 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') and suits["Clubs"] == 0 then suits["Clubs"] = suits["Clubs"] + 1 end elseif context.scoring_hand[i]:is_suit('Clubs', true) and suits["Clubs"] == 0 then suits["Clubs"] = suits["Clubs"] + 1 end
end end
end end
for i = 1, #context.scoring_hand do for i = 1, #context.scoring_hand do
@ -3986,14 +4054,6 @@ function Card:calculate_joker(context)
Xmult_mod = self.ability.caino_xmult Xmult_mod = self.ability.caino_xmult
} }
end end
if self.ability.name == 'Yorick' and self.ability.yorick_discards <= 0 then
return {
message = localize{type='variable',key='a_xmult',vars={self.ability.extra.xmult}},
Xmult_mod = self.ability.extra.xmult,
colour = G.C.RED,
card = self
}
end
end end
end end
end end
@ -4084,7 +4144,6 @@ function Card:update(dt)
self.children.focused_ui:remove() self.children.focused_ui:remove()
self.children.focused_ui = nil self.children.focused_ui = nil
end end
if self.cost then self.DEBUG_VALUE = self.cost end
self:update_alert() self:update_alert()
if self.ability.consumeable and self.ability.consumeable.max_highlighted then 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 G.STAGE == G.STAGES.RUN then
if self.ability and self.ability.perma_debuff then self.debuff = true end 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 if self.area and ((self.area == G.jokers) or (self.area == G.consumeables)) then
self.bypass_lock = true self.bypass_lock = true
self.bypass_discovery_center = true self.bypass_discovery_center = true
@ -4203,8 +4235,9 @@ function Card:update(dt)
if self.ability.name == 'Swashbuckler' then if self.ability.name == 'Swashbuckler' then
local sell_cost = 0 local sell_cost = 0
for i = 1, #G.jokers.cards do for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == self or (self.area and (self.area ~= G.jokers)) then break end 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 sell_cost = sell_cost + G.jokers.cards[i].sell_cost
end
end end
self.ability.mult = sell_cost self.ability.mult = sell_cost
end end
@ -4261,6 +4294,7 @@ function Card:align_h_popup()
0 0
}, },
type = popup_direction, type = popup_direction,
--lr_clamp = true
} }
end end
@ -4293,7 +4327,7 @@ end
function Card:juice_up(scale, rot_amount) function Card:juice_up(scale, rot_amount)
--G.VIBRATION = G.VIBRATION + 0.4 --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 scale = scale and scale*0.4 or 0.11
Moveable.juice_up(self, scale, rot_amt) Moveable.juice_up(self, scale, rot_amt)
end end
@ -4329,21 +4363,19 @@ function Card:draw(layer)
if (layer == 'card' or layer == 'both') then if (layer == 'card' or layer == 'both') then
-- for all hover/tilting: -- 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 local tilt_factor = 0.3
if not self.overwrite_tilt_var then if self.states.focus.is 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.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
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
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.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
self.tilt_var.amt = math.abs(self.hover_offset.y + self.hover_offset.x - 1)*tilt_factor elseif self.ambient_tilt then
elseif self.ambient_tilt then local tilt_angle = G.TIMERS.REAL*(1.56 + (self.ID/1.14212)%1) + self.ID/1.35122
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.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.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
self.tilt_var.amt = self.ambient_tilt*(0.5+math.cos(tilt_angle))*tilt_factor
end
end end
--Any particles --Any particles
if self.children.particles then self.children.particles:draw() end if self.children.particles then self.children.particles:draw() end
@ -4404,7 +4436,7 @@ function Card:draw(layer)
end end
--If the card has any edition/seal, add that here --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 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) self.children.center:draw_shader('voucher', nil, self.ARGS.send_to_shader)
end 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('dissolve', nil, nil, nil, self.children.center)
G.shared_sticker_eternal:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) G.shared_sticker_eternal:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center)
end 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 if self.sticker and G.shared_stickers[self.sticker] then
G.shared_stickers[self.sticker].role.draw_major = self G.shared_stickers[self.sticker].role.draw_major = self
G.shared_stickers[self.sticker]:draw_shader('dissolve', nil, nil, nil, self.children.center) G.shared_stickers[self.sticker]:draw_shader('dissolve', nil, nil, nil, self.children.center)
@ -4487,7 +4529,12 @@ function Card:draw(layer)
elseif self.sprite_facing == 'back' then elseif self.sprite_facing == 'back' then
local overlay = G.C.WHITE local overlay = G.C.WHITE
if self.area and self.area.config.type == 'deck' and self.rank > 3 then 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 end
if self.area and self.area.config.type == 'deck' then if self.area and self.area.config.type == 'deck' then
@ -4503,23 +4550,8 @@ function Card:draw(layer)
end end
end end
if self.children.overwrite and self.tilt_var then
self.children.overwrite.overwrite_tilt_var = copy_table(self.tilt_var)
end
for k, v in pairs(self.children) do 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 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 self.children.overwrite then
love.graphics.push()
love.graphics.setColor(G.C.BLUE)
G.BRUTE_OVERLAY = {1,1,1,math.sin(5*G.TIMERS.REAL)}
self.children.overwrite:draw('card')
G.BRUTE_OVERLAY = nil
love.graphics.pop()
end end
if (layer == 'card' or layer == 'both') and self.area == G.hand then 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 elseif self.config.center.name == "Photograph" then
self.T.h = H*scale/1.2*scale self.T.h = H*scale/1.2*scale
self.T.w = W*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 elseif self.config.center.set == 'Booster' then
self.T.h = H*1.27 self.T.h = H*1.27
self.T.w = W*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 if self.area then self.area:remove_card(self) end
self:remove_from_deck() 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 if not G.OVERLAY_MENU then
for k, v in pairs(G.P_CENTERS) do for k, v in pairs(G.P_CENTERS) do

View File

@ -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 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 for k, card in ipairs(self.cards) do
if not card.states.drag.is then 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) 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) 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 local highlight_height = G.HIGHLIGHT_H
if not card.highlighted then highlight_height = 0 end 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 card.T.x = card.T.x + card.shadow_parrallax.x/30
end end
end end
@ -451,13 +451,13 @@ function CardArea:align_cards()
for k, card in ipairs(self.cards) do for k, card in ipairs(self.cards) do
if not card.states.drag.is then 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) 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) 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 local highlight_height = G.HIGHLIGHT_H
if not card.highlighted then highlight_height = 0 end 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 card.T.x = card.T.x + card.shadow_parrallax.x/30
end end
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 if self.config.type == 'title' or (self.config.type == 'voucher' and #self.cards == 1) then
for k, card in ipairs(self.cards) do for k, card in ipairs(self.cards) do
if not card.states.drag.is then 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) 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) 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 local highlight_height = G.HIGHLIGHT_H
if not card.highlighted then highlight_height = 0 end 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 card.T.x = card.T.x + card.shadow_parrallax.x/30
end end
end end
@ -481,12 +481,12 @@ function CardArea:align_cards()
local self_w = math.max(self.T.w, 3.2) local self_w = math.max(self.T.w, 3.2)
for k, card in ipairs(self.cards) do for k, card in ipairs(self.cards) do
if not card.states.drag.is then 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) 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 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 local highlight_height = G.HIGHLIGHT_H
if not card.highlighted then highlight_height = 0 end 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 card.T.x = card.T.x + card.shadow_parrallax.x/30
end end
end end
@ -509,7 +509,7 @@ function CardArea:align_cards()
if self.config.type == 'joker' or self.config.type == 'title_2' then if self.config.type == 'joker' or self.config.type == 'title_2' then
for k, card in ipairs(self.cards) do for k, card in ipairs(self.cards) do
if not card.states.drag.is then 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) 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) 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 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 end
local highlight_height = G.HIGHLIGHT_H/2 local highlight_height = G.HIGHLIGHT_H/2
if not card.highlighted then highlight_height = 0 end 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 card.T.x = card.T.x + card.shadow_parrallax.x/30
end end
end end
@ -537,7 +537,7 @@ function CardArea:align_cards()
end end
local highlight_height = G.HIGHLIGHT_H local highlight_height = G.HIGHLIGHT_H
if not card.highlighted then highlight_height = 0 end 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 card.T.x = card.T.x + card.shadow_parrallax.x/30
end end
end end

View File

@ -55,7 +55,7 @@ G.CHALLENGES = {
{id = 'tag_handy'}, {id = 'tag_handy'},
}, },
banned_other = { banned_other = {
{id = 'bl_wall', type = 'blind'}
} }
} }
},]]-- },]]--
@ -246,6 +246,7 @@ G.CHALLENGES = {
banned_tags = { banned_tags = {
}, },
banned_other = { banned_other = {
{id = 'bl_plant', type = 'blind'},
} }
} }
}, },
@ -314,6 +315,7 @@ G.CHALLENGES = {
banned_tags = { banned_tags = {
}, },
banned_other = { banned_other = {
{id = 'bl_final_leaf', type = 'blind'},
} }
} }
}, },
@ -401,6 +403,7 @@ G.CHALLENGES = {
banned_tags = { banned_tags = {
}, },
banned_other = { banned_other = {
{id = 'bl_final_leaf', type = 'blind'},
} }
} }
}, },
@ -709,6 +712,7 @@ G.CHALLENGES = {
{id = 'c_judgement'}, {id = 'c_judgement'},
{id = 'c_wraith'}, {id = 'c_wraith'},
{id = 'c_soul'}, {id = 'c_soul'},
{id = 'v_antimatter'},
{id = 'p_buffoon_normal_1', ids = { {id = 'p_buffoon_normal_1', ids = {
'p_buffoon_normal_1','p_buffoon_normal_2','p_buffoon_jumbo_1','p_buffoon_mega_1', '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_negative'},
{id = 'tag_foil'}, {id = 'tag_foil'},
{id = 'tag_buffoon'}, {id = 'tag_buffoon'},
{id = 'tag_top_up'},
}, },
banned_other = { 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 _DEMO = false
function love.conf(t) function love.conf(t)
os.execute("set LOVE_GRAPHICS_USE_OPENGLES=1")
t.console = not _RELEASE_MODE t.console = not _RELEASE_MODE
t.title = 'Balatro' t.title = 'Balatro'
t.window.width = 0 t.window.width = 0

View File

@ -108,6 +108,7 @@ function Moveable:set_alignment(args)
args.offset = nil args.offset = nil
end end
self.alignment.offset = args.offset or self.alignment.offset self.alignment.offset = args.offset or self.alignment.offset
self.alignment.lr_clamp = args.lr_clamp
end end
function Moveable:align_to_major() function Moveable:align_to_major()
@ -247,6 +248,7 @@ function Moveable:drag(offset)
end end
function Moveable:juice_up(amount, rot_amt) function Moveable:juice_up(amount, rot_amt)
if G.SETTINGS.reduced_motion then return end
local amount = amount or 0.4 local amount = amount or 0.4
local end_time = G.TIMERS.REAL + 0.4 local end_time = G.TIMERS.REAL + 0.4
@ -275,13 +277,14 @@ end
function Moveable:move(dt) function Moveable:move(dt)
if self.FRAME.MOVE >= G.FRAMES.MOVE then return end if self.FRAME.MOVE >= G.FRAMES.MOVE then return end
self.FRAME.OLD_MAJOR = self.FRAME.MAJOR
self.FRAME.MAJOR = nil self.FRAME.MAJOR = nil
self.FRAME.MOVE = G.FRAMES.MOVE self.FRAME.MOVE = G.FRAMES.MOVE
if not self.created_on_pause and G.SETTINGS.paused then return end 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??? --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() self:align_to_major()
@ -309,9 +312,20 @@ function Moveable:move(dt)
self:move_wh(dt) self:move_wh(dt)
self:calculate_parrallax() self:calculate_parrallax()
end end
if self.alignment and self.alignment.lr_clamp then
self:lr_clamp()
end
self.NEW_ALIGNMENT = false self.NEW_ALIGNMENT = false
end 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) function Moveable:glue_to_major(major_tab)
self.T = major_tab.T self.T = major_tab.T
@ -326,21 +340,19 @@ function Moveable:glue_to_major(major_tab)
self.shadow_parrallax = major_tab.shadow_parrallax self.shadow_parrallax = major_tab.shadow_parrallax
end end
MWM = {
rotated_offset = {},
angles = {},
WH = {},
offs = {},
}
function Moveable:move_with_major(dt) function Moveable:move_with_major(dt)
if self.role.role_type ~= 'Minor' then return end if self.role.role_type ~= 'Minor' then return end
local major_tab = self.role.major:get_major() local major_tab = self.role.major:get_major()
self:move_juice(dt) self:move_juice(dt)
if not MWM then
MWM = {
rotated_offset = {},
angles = {},
WH = {},
offs = {},
}
end
if self.role.r_bond == 'Weak' then 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 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 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 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? --First, does the major already have their offset precalculated for this frame?
if not self.FRAME.MAJOR or (G.REFRESH_FRAME_MAJOR_CACHE) then 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() local major = self.role.major:get_major()
self.FRAME.MAJOR.major = major.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 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 end
return self.FRAME.MAJOR return self.FRAME.MAJOR
@ -488,14 +501,16 @@ function Moveable:get_major()
end end
function Moveable:remove() function Moveable:remove()
for k, v in ipairs(G.MOVEABLES) do for k, v in pairs(G.MOVEABLES) do
if v == self then if v == self then
table.remove(G.MOVEABLES, k) table.remove(G.MOVEABLES, k)
break;
end end
end end
for k, v in ipairs(G.I.MOVEABLE) do for k, v in pairs(G.I.MOVEABLE) do
if v == self then if v == self then
table.remove(G.I.MOVEABLE, k) table.remove(G.I.MOVEABLE, k)
break;
end end
end end
Node.remove(self) Node.remove(self)

View File

@ -318,19 +318,19 @@ end
--Also calls the remove method of all children to have them do the same --Also calls the remove method of all children to have them do the same
function Node:remove() 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 if v == self then
table.remove(G.I.POPUP, k) table.remove(G.I.POPUP, k)
break; break;
end end
end end
for k, v in ipairs(G.I.NODE) do for k, v in pairs(G.I.NODE) do
if v == self then if v == self then
table.remove(G.I.NODE, k) table.remove(G.I.NODE, k)
break; break;
end end
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 if v == self then
table.remove(G.STAGE_OBJECTS[G.STAGE], k) table.remove(G.STAGE_OBJECTS[G.STAGE], k)
break; break;

View File

@ -71,6 +71,7 @@ function Sprite:define_draw_steps(draw_step_definitions)
end end
function Sprite:draw_shader(_shader, _shadow_height, _send, _no_tilt, other_obj, ms, mr, mx, my, custom_shader, tilt_shadow) 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 local _draw_major = self.role.draw_major or self
if _shadow_height then if _shadow_height then
self.VT.y = self.VT.y - _draw_major.shadow_parrallax.y*_shadow_height self.VT.y = self.VT.y - _draw_major.shadow_parrallax.y*_shadow_height

View File

@ -212,27 +212,27 @@ function DynaText:align_letters()
end end
letter.r = 0 letter.r = 0
letter.scale = 1 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 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, 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), (G.TIMERS.REAL - self.config.pulse.start)*self.config.pulse.speed - k + self.config.pulse.width+ 2),
0)) 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 if self.config.pulse.start > G.TIMERS.REAL + 2*self.config.pulse.speed*#self.strings[self.focused_string].letters then
self.config.pulse = nil self.config.pulse = nil
end end
end end
if self.config.quiver then if self.config.quiver then
letter.scale = letter.scale + (0.1*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 + 0.3*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.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(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.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)) math.sin(30.133421*G.TIMERS.REAL*self.config.quiver.speed + k*123.2))
end 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.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 = 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.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
end end

View File

@ -34,7 +34,8 @@ function UIBox:init(args)
major = args.config.major, major = args.config.major,
type = args.config.align or args.config.type or '', type = args.config.align or args.config.type or '',
bond = args.config.bond or 'Strong', 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{ self:set_role{
xy_bond = args.config.xy_bond, xy_bond = args.config.xy_bond,
@ -83,6 +84,10 @@ function UIBox:init(args)
self.VT.y = self.VT.y - self.Mid.role.offset.y + (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 end
if self.alignment and self.alignment.lr_clamp then
self:lr_clamp()
end
self.UIRoot:initialize_VT(true) self.UIRoot:initialize_VT(true)
if getmetatable(self) == UIBox then if getmetatable(self) == UIBox then
if args.config.instance_type then if args.config.instance_type then
@ -268,6 +273,7 @@ function UIBox:remove()
for k, v in pairs(G.I[self.config.instance_type or 'UIBOX']) do for k, v in pairs(G.I[self.config.instance_type or 'UIBOX']) do
if v == self then if v == self then
table.remove(G.I[self.config.instance_type or 'UIBOX'], k) table.remove(G.I[self.config.instance_type or 'UIBOX'], k)
break;
end end
end end
remove_all(self.children) 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 if self.config.button_UIE and not self.config.button_UIE.config.button then button_active = false end
end end
if self.config.colour[4] > 0.01 then if self.config.colour[4] > 0.01 then
if self.UIT == G.UIT.T and self.config.scale then if self.UIT == G.UIT.T and self.config.scale then
self.ARGS.text_parallax = self.ARGS.text_parallax or {} self.ARGS.text_parallax = self.ARGS.text_parallax or {}

View File

@ -303,7 +303,7 @@ function G.UIDEF.card_focus_ui(card)
playing_card_colour[4] = 1.5 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 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{ local base_background = UIBox{
T = {card.VT.x,card.VT.y,0,0}, T = {card.VT.x,card.VT.y,0,0},
@ -316,15 +316,15 @@ function G.UIDEF.card_focus_ui(card)
}}, }},
config = { config = {
align = 'cm', 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, parent = card,
r_bond = (not G.hand or card.area ~= G.hand) and 'Weak' or 'Strong' r_bond = (not G.hand or card.area ~= G.hand) and 'Weak' or 'Strong'
} }
} }
base_background.set_alignment = function() 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} 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*card_norm.x*card.T.w, y = 0.007*card_norm.y*card.T.h}}) Moveable.set_alignment(card.children.focused_ui, {offset = {x= 0.007*cnx*card.T.w, y = 0.007*cny*card.T.h}})
end end
local base_attach = base_background:get_UIE_by_ID('ATTACH_TO_ME') local base_attach = base_background:get_UIE_by_ID('ATTACH_TO_ME')
@ -1135,6 +1135,8 @@ end
function get_badge_colour(key) function get_badge_colour(key)
G.BADGE_COL = G.BADGE_COL or { G.BADGE_COL = G.BADGE_COL or {
eternal = G.C.ETERNAL, eternal = G.C.ETERNAL,
perishable = G.C.PERISHABLE,
rental = G.C.RENTAL,
foil = G.C.DARK_EDITION, foil = G.C.DARK_EDITION,
holographic = G.C.DARK_EDITION, holographic = G.C.DARK_EDITION,
polychrome = G.C.DARK_EDITION, polychrome = G.C.DARK_EDITION,
@ -2312,6 +2314,7 @@ function G.UIDEF.settings_tab(tab)
end end
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, 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 elseif tab == 'Video' then
@ -5270,6 +5273,49 @@ function G.UIDEF.challenge_description_tab(args)
) )
end end
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 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_cards[1] then banned_cards[#banned_cards+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_m_none', vars = {}}} end
if not banned_tags[1] then banned_tags[#banned_tags+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_none', vars = {}}} end if not banned_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)) table.sort(langs, (function(a, b) return a.label < b.label end))
local _row = {} local _row = {}
for k, v in ipairs(langs) do 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={ if not G.F_HIDE_BETA_LANGS or (not v.beta) then
{n=G.UIT.R, config={align = "cm"}, nodes={ _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.T, config={text = v.label, lang = v, scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} {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 if _row[3] or (k == #langs) then
rows[#rows+1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes=_row} rows[#rows+1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes=_row}
_row = {} _row = {}
@ -5704,12 +5752,12 @@ function G.UIDEF.language_selector()
local t = create_UIBox_generic_options({contents ={ 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=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.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.O, config={object = discord}},
{n=G.UIT.T, config={text = G.LANG.button, scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} {n=G.UIT.T, config={text = G.LANG.button, scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}}, }},
}} }} or nil
}}) }})
return t return t
end end

View File

@ -1169,7 +1169,7 @@ G.FUNCS.apply_window_changes = function(_initial)
vsync = G.SETTINGS.WINDOW.vsync, vsync = G.SETTINGS.WINDOW.vsync,
resizable = true, resizable = true,
display = G.SETTINGS.WINDOW.selected_display, display = G.SETTINGS.WINDOW.selected_display,
highdpi = true highdpi = (love.system.getOS() == 'OS X')
}) })
G.SETTINGS.QUEUED_CHANGE = {} G.SETTINGS.QUEUED_CHANGE = {}
if _initial ~= true then if _initial ~= true then
@ -1215,7 +1215,7 @@ G.FUNCS.RUN_SETUP_check_back = function(e)
end end
G.FUNCS.RUN_SETUP_check_back_name = function(e) 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 --removes the UI from the previously selected back and adds the new one
e.config.object:remove() e.config.object:remove()
@ -2085,8 +2085,8 @@ end
end end
G.FUNCS.can_skip_booster = function(e) G.FUNCS.can_skip_booster = function(e)
if G.pack_cards and G.pack_cards.cards[1] and 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 (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.colour = G.C.GREY
e.config.button = 'skip_booster' e.config.button = 'skip_booster'
else else
@ -2458,11 +2458,6 @@ end
G.SHOP_SIGN = nil G.SHOP_SIGN = nil
G.STATE_COMPLETE = false G.STATE_COMPLETE = false
G.STATE = G.STATES.BLIND_SELECT 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 G.CONTROLLER.locks.toggle_shop = nil
return true return true
end end
@ -2906,6 +2901,12 @@ G.FUNCS.cash_out = function(e)
G.VIBRATION = G.VIBRATION + 1 G.VIBRATION = G.VIBRATION + 1
end end
ease_chips(0) 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) delay(0.6)
end end

View File

@ -843,8 +843,8 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra)
elseif eval_type == 'dollars' then elseif eval_type == 'dollars' then
sound = 'coin3' sound = 'coin3'
amt = amt amt = amt
text = localize("$")..tostring(amt) text = (amt <-0.01 and '-' or '')..localize("$")..tostring(math.abs(amt))
colour = G.C.MONEY colour = amt <-0.01 and G.C.RED or G.C.MONEY
elseif eval_type == 'swap' then elseif eval_type == 'swap' then
sound = 'generic1' sound = 'generic1'
amt = amt amt = amt
@ -877,7 +877,7 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra)
end end
delay = delay*1.25 delay = delay*1.25
if amt > 0 then if amt > 0 or amt < 0 then
if extra and extra.instant then if extra and extra.instant then
if extrafunc then extrafunc() end if extrafunc then extrafunc() end
attention_text({ attention_text({
@ -1127,16 +1127,16 @@ end
function update_canvas_juice(dt) function update_canvas_juice(dt)
G.JIGGLE_VIBRATION = G.ROOM.jiggle or 0 G.JIGGLE_VIBRATION = G.ROOM.jiggle or 0
if not G.SETTINGS.screenshake or (type(G.SETTINGS.screenshake) ~= 'number') then 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 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 = 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.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.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.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) 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 if shake_amt < 0.05 then shake_amt = 0 end
G.ROOM.jiggle = (G.ROOM.jiggle or 0)*(1-5*dt)*(shake_amt > 0.05 and 1 or 0) G.ROOM.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 end
function get_pack(_key, _type) 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 local cume, it, center = 0, 0, nil
for k, v in ipairs(G.P_CENTER_POOLS['Booster']) do 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 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 if _type == 'Joker' then
local rarity = _rarity or pseudorandom('rarity'..G.GAME.round_resets.ante..(_append or '')) 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 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 '') else _starting_pool, _pool_key = G.P_CENTER_POOLS[_type], _type..(_append or '')
end end
@ -2034,7 +2038,7 @@ function get_current_pool(_type, _rarity, _legendary, _append)
--if pool is empty --if pool is empty
if _pool_size == 0 then if _pool_size == 0 then
_pool = EMPTY(G.ARGS.TEMP_POOL) _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 == 'Planet' then _pool[#_pool + 1] = "c_pluto"
elseif _type == 'Spectral' then _pool[#_pool + 1] = "c_incantation" elseif _type == 'Spectral' then _pool[#_pool + 1] = "c_incantation"
elseif _type == 'Joker' then _pool[#_pool + 1] = "j_joker" elseif _type == 'Joker' then _pool[#_pool + 1] = "j_joker"
@ -2045,7 +2049,7 @@ function get_current_pool(_type, _rarity, _legendary, _append)
end end
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 end
function poll_edition(_key, _mod, _no_neg, _guaranteed) 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 if G.GAME.modifiers.all_eternal then
card:set_eternal(true) card:set_eternal(true)
end end
if area == G.shop_jokers then if (area == G.shop_jokers) or (area == G.pack_cards) then
if G.GAME.modifiers.enable_eternals_in_shop and pseudorandom('stake_shop_joker_eternal'..G.GAME.round_resets.ante) > 0.7 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) 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
end end
@ -2291,7 +2301,11 @@ function reset_mail_rank()
end end
function reset_ancient_card() 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 G.GAME.current_round.ancient_card.suit = ancient_card
end end
@ -2309,6 +2323,18 @@ function reset_castle_card()
end end
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() function get_new_boss()
G.GAME.perscribed_bosses = G.GAME.perscribed_bosses or { G.GAME.perscribed_bosses = G.GAME.perscribed_bosses or {
} }
@ -2330,6 +2356,9 @@ function get_new_boss()
eligible_bosses[k] = true eligible_bosses[k] = true
end end
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 local min_use = 100
for k, v in pairs(G.GAME.bosses_used) do 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 end
if _c.set == 'Other' then 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 elseif card_type == 'Locked' then
if _c.wip then localize{type = 'other', key = 'wip_locked', set = 'Other', nodes = desc_nodes, vars = loc_vars} if _c.wip then localize{type = 'other', key = 'wip_locked', set = 'Other', nodes = desc_nodes, vars = loc_vars}
elseif _c.demo and specific_vars then localize{type = 'other', key = 'demo_shop_locked', nodes = desc_nodes, vars = loc_vars} elseif _c.demo 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 == '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 == '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 == '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 if v == 'pinned_left' then info_queue[#info_queue+1] = {key = 'pinned_left', set = 'Other'} end
end end
end end

View File

@ -61,6 +61,7 @@ function GET_DISPLAYINFO(screenmode, display)
end end
function timer_checkpoint(label, type, reset) function timer_checkpoint(label, type, reset)
G.PREV_GARB = G.PREV_GARB or 0
if not G.F_ENABLE_PERF_OVERLAY then return end if not G.F_ENABLE_PERF_OVERLAY then return end
G.check = G.check or { G.check = G.check or {
draw = { 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.checkpoint_list[cp.checkpoints+1] = cp.checkpoint_list[cp.checkpoints+1] or {}
cp.checkpoints = cp.checkpoints+1 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].time = love.timer.getTime()
cp.checkpoint_list[cp.checkpoints].TTC = cp.checkpoint_list[cp.checkpoints].time - cp.last_time cp.checkpoint_list[cp.checkpoints].TTC = cp.checkpoint_list[cp.checkpoints].time - cp.last_time
cp.checkpoint_list[cp.checkpoints].trend = cp.checkpoint_list[cp.checkpoints].trend or {} cp.checkpoint_list[cp.checkpoints].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].trend[401] = nil
cp.checkpoint_list[cp.checkpoints].states[401] = nil cp.checkpoint_list[cp.checkpoints].states[401] = nil
cp.last_time = cp.checkpoint_list[cp.checkpoints].time cp.last_time = cp.checkpoint_list[cp.checkpoints].time
G.PREV_GARB = collectgarbage( "count" )
local av = 0 local av = 0
for k, v in ipairs(cp.checkpoint_list[cp.checkpoints].trend) do for k, v in ipairs(cp.checkpoint_list[cp.checkpoints].trend) do
av = av + v/#cp.checkpoint_list[cp.checkpoints].trend av = av + v/#cp.checkpoint_list[cp.checkpoints].trend
@ -215,6 +216,40 @@ function pseudoshuffle(list, seed)
end end
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) function pseudorandom_element(_t, seed)
if seed then math.randomseed(seed) end if seed then math.randomseed(seed) end
local keys = {} local keys = {}
@ -260,9 +295,15 @@ function pseudohash(str)
end end
end end
function pseudoseed(key) function pseudoseed(key, predict_seed)
if key == 'seed' then return math.random() end 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 if not G.GAME.pseudorandom[key] then
G.GAME.pseudorandom[key] = pseudohash(key..(G.GAME.pseudorandom.seed or '')) G.GAME.pseudorandom[key] = pseudohash(key..(G.GAME.pseudorandom.seed or ''))
end end
@ -350,15 +391,25 @@ function evaluate_poker_hand(hand)
top = nil top = nil
} }
if next(get_X_same(5,hand)) and next(get_flush(hand)) then local parts = {
results["Flush Five"] = get_X_same(5,hand) _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 if not results.top then results.top = results["Flush Five"] end
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_hand = {}
local fh_3 = get_X_same(3,hand)[1] local fh_3 = parts._3[1]
local fh_2 = get_X_same(2,hand)[1] local fh_2 = parts._2[1]
for i=1, #fh_3 do for i=1, #fh_3 do
fh_hand[#fh_hand+1] = fh_3[i] fh_hand[#fh_hand+1] = fh_3[i]
end end
@ -369,13 +420,13 @@ function evaluate_poker_hand(hand)
if not results.top then results.top = results["Flush House"] end if not results.top then results.top = results["Flush House"] end
end end
if next(get_X_same(5,hand)) then if next(parts._5) then
results["Five of a Kind"] = get_X_same(5,hand) results["Five of a Kind"] = parts._5
if not results.top then results.top = results["Five of a Kind"] end if not results.top then results.top = results["Five of a Kind"] end
end end
if next(get_flush(hand)) and next(get_straight(hand)) then if next(parts._flush) and next(parts._straight) then
local _s, _f, ret = get_straight(hand), get_flush(hand), {} local _s, _f, ret = parts._straight, parts._flush, {}
for _, v in ipairs(_f[1]) do for _, v in ipairs(_f[1]) do
ret[#ret+1] = v ret[#ret+1] = v
end end
@ -391,15 +442,15 @@ function evaluate_poker_hand(hand)
if not results.top then results.top = results["Straight Flush"] end if not results.top then results.top = results["Straight Flush"] end
end end
if next(get_X_same(4,hand)) then if next(parts._4) then
results["Four of a Kind"] = get_X_same(4,hand) results["Four of a Kind"] = parts._4
if not results.top then results.top = results["Four of a Kind"] end if not results.top then results.top = results["Four of a Kind"] end
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_hand = {}
local fh_3 = get_X_same(3,hand)[1] local fh_3 = parts._3[1]
local fh_2 = get_X_same(2,hand)[1] local fh_2 = parts._2[1]
for i=1, #fh_3 do for i=1, #fh_3 do
fh_hand[#fh_hand+1] = fh_3[i] fh_hand[#fh_hand+1] = fh_3[i]
end end
@ -410,26 +461,29 @@ function evaluate_poker_hand(hand)
if not results.top then results.top = results["Full House"] end if not results.top then results.top = results["Full House"] end
end end
if next(get_flush(hand)) then if next(parts._flush) then
results["Flush"] = get_flush(hand) results["Flush"] = parts._flush
if not results.top then results.top = results["Flush"] end if not results.top then results.top = results["Flush"] end
end end
if next(get_straight(hand)) then if next(parts._straight) then
results["Straight"] = get_straight(hand) results["Straight"] = parts._straight
if not results.top then results.top = results["Straight"] end if not results.top then results.top = results["Straight"] end
end end
if next(get_X_same(3,hand)) then if next(parts._3) then
results["Three of a Kind"] = get_X_same(3,hand) results["Three of a Kind"] = parts._3
if not results.top then results.top = results["Three of a Kind"] end if not results.top then results.top = results["Three of a Kind"] end
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 fh_hand = {}
local r = get_X_same(2,hand) local r = parts._2
local fh_2a = r[1] local fh_2a = r[1]
local fh_2b = r[2] local fh_2b = r[2]
if not fh_2b then
fh_2b = parts._3[1]
end
for i=1, #fh_2a do for i=1, #fh_2a do
fh_hand[#fh_hand+1] = fh_2a[i] fh_hand[#fh_hand+1] = fh_2a[i]
end end
@ -440,13 +494,13 @@ function evaluate_poker_hand(hand)
if not results.top then results.top = results["Two Pair"] end if not results.top then results.top = results["Two Pair"] end
end end
if next(get_X_same(2,hand)) then if next(parts._2) then
results["Pair"] = get_X_same(2,hand) results["Pair"] = parts._2
if not results.top then results.top = results["Pair"] end if not results.top then results.top = results["Pair"] end
end end
if next(get_highest(hand)) then if next(parts._highest) then
results["High Card"] = get_highest(hand) results["High Card"] = parts._highest
if not results.top then results.top = results["High Card"] end if not results.top then results.top = results["High Card"] end
end end
@ -570,6 +624,47 @@ function reset_drawhash()
G.DRAW_HASH = EMPTY(G.DRAW_HASH) G.DRAW_HASH = EMPTY(G.DRAW_HASH)
end 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 --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) function add_to_drawhash(obj)
if obj then if obj then
@ -599,7 +694,7 @@ end
function play_sound(sound_code, per, vol) function play_sound(sound_code, per, vol)
if G.F_MUTE then return end 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 = G.ARGS.play_sound or {}
G.ARGS.play_sound.type = 'sound' G.ARGS.play_sound.type = 'sound'
G.ARGS.play_sound.time = G.TIMERS.REAL G.ARGS.play_sound.time = G.TIMERS.REAL
@ -825,7 +920,7 @@ function get_blind_amount(ante)
local k = 0.75 local k = 0.75
if not G.GAME.modifiers.scaling or G.GAME.modifiers.scaling == 1 then if not G.GAME.modifiers.scaling or G.GAME.modifiers.scaling == 1 then
local amounts = { 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 < 1 then return 100 end
if ante <= 8 then return amounts[ante] end if ante <= 8 then return amounts[ante] end
@ -835,7 +930,8 @@ function get_blind_amount(ante)
return amount return amount
elseif G.GAME.modifiers.scaling == 2 then elseif G.GAME.modifiers.scaling == 2 then
local amounts = { 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 < 1 then return 100 end
if ante <= 8 then return amounts[ante] end if ante <= 8 then return amounts[ante] end
@ -845,7 +941,8 @@ function get_blind_amount(ante)
return amount return amount
elseif G.GAME.modifiers.scaling == 3 then elseif G.GAME.modifiers.scaling == 3 then
local amounts = { 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 < 1 then return 100 end
if ante <= 8 then return amounts[ante] end if ante <= 8 then return amounts[ante] end
@ -1347,7 +1444,6 @@ function recursive_table_cull(t)
end end
function save_with_action(action) function save_with_action(action)
print('SAVE WITH ACTION')
G.action = action G.action = action
save_run() save_run()
G.action = nil G.action = nil
@ -1460,6 +1556,7 @@ function init_localization()
for _, set in pairs(group) do for _, set in pairs(group) do
for _, center in pairs(set) do for _, center in pairs(set) do
center.text_parsed = {} center.text_parsed = {}
if not center.text then else
for _, line in ipairs(center.text) do for _, line in ipairs(center.text) do
center.text_parsed[#center.text_parsed+1] = loc_parse_string(line) center.text_parsed[#center.text_parsed+1] = loc_parse_string(line)
end end
@ -1474,6 +1571,7 @@ function init_localization()
end end
end end
end end
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') assembled_string = assembled_string..(type(subpart) == 'string' and subpart or args.vars[tonumber(subpart[1])] or 'ERROR')
end end
local desc_scale = G.LANG.font.DESCSCALE 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 if args.type == 'name' then
final_line[#final_line+1] = {n=G.UIT.O, config={ final_line[#final_line+1] = {n=G.UIT.O, config={
object = DynaText({string = {assembled_string}, object = DynaText({string = {assembled_string},
@ -1673,7 +1772,7 @@ function localize(args, misc_cat)
shadow = true, shadow = true,
y_offset = -0.6, y_offset = -0.6,
spacing = math.max(0, 0.32*(17 - #assembled_string)), 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 elseif part.control.E then

View File

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

View File

@ -1,5 +1,4 @@
function live_test() function live_test()
end end
function do_action(action) 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_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_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 = { self.shared_stickers = {
White = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 1,y = 0}), 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}), Red = Sprite(0, 0, self.CARD_W, self.CARD_H, self.ASSET_ATLAS["stickers"], {x = 2,y = 0}),
@ -204,8 +207,6 @@ function Game:start_up()
self.E_MANAGER = EventManager() self.E_MANAGER = EventManager()
self.SPEEDFACTOR = 1 self.SPEEDFACTOR = 1
self:prep_stage(G.STAGES.MAIN_MENU, G.STATES.SPLASH, true)
set_profile_progress() set_profile_progress()
boot_timer('prep stage', 'splash prep',1) boot_timer('prep stage', 'splash prep',1)
self:splash_screen() 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_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_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_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_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_boss = {name = 'Boss Tag', set = 'Tag', discovered = false, min_ante = nil, order = 9, config = {type = 'new_blind_choice', }, pos = {x = 0,y = 2}},
tag_standard = {name = 'Standard Tag', set = 'Tag', discovered = false, min_ante = 2, order = 10, config = {type = 'new_blind_choice', }, pos = {x = 1,y = 2}}, tag_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 = {}}, 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 --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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, eternal_compat = true, rarity = 1, cost = 3, name = "Sly Joker",set = "Joker", config = {t_chips = 50, type = 'Pair'}, pos = {x=0,y=14}}, 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, 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_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, 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_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, eternal_compat = true, rarity = 1, cost = 4, name = "Devious Joker",set = "Joker", config = {t_chips = 100, type = 'Straight'}, pos = {x=3,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, eternal_compat = true, rarity = 1, cost = 4, name = "Crafty Joker",set = "Joker", config = {t_chips = 80, type = 'Flush'}, pos = {x=4,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_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, 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_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, eternal_compat = true, rarity = 2, cost = 7, name = "Four Fingers", pos = {x=6,y=6}, set = "Joker", effect = "", 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, 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_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, 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_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, eternal_compat = true, rarity = 2, cost = 6, name = "Ceremonial Dagger", pos = {x=5,y=5}, set = "Joker", effect = "", config = {mult = 0}}, 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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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_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, eternal_compat = true, rarity = 2, cost = 6, name = 'Burglar', pos = {x = 1, 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, eternal_compat = true, rarity = 2, cost = 6, name = 'Blackboard', pos = {x = 2, 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, eternal_compat = true, rarity = 1, cost = 5, name = 'Runner', pos = {x = 3, y = 10}, set = 'Joker', config = {extra = {chips = 20, chip_mod = 10}}}, 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, 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_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, eternal_compat = true, rarity = 3, cost = 8, name = 'DNA', pos = {x = 5, y = 10}, set = 'Joker', config = {}}, 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, eternal_compat = true, rarity = 1, cost = 3, name = 'Splash', pos = {x = 6, 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, eternal_compat = true, rarity = 1, cost = 5, name = 'Blue Joker', pos = {x = 7, y = 10}, set = 'Joker', config = {extra = 2}}, 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, eternal_compat = true, rarity = 3, cost = 6, name = 'Sixth Sense', pos = {x = 8, y = 10}, set = 'Joker', config = {}}, 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, eternal_compat = true, rarity = 2, cost = 6, name = 'Constellation', pos = {x = 9, y = 10}, set = 'Joker', config = {extra = 0.1, Xmult = 1}}, 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, eternal_compat = true, rarity = 2, cost = 5, name = 'Hiker', pos = {x = 0, y = 11}, set = 'Joker', config = {extra = 4}}, 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, eternal_compat = true, rarity = 1, cost = 4, name = 'Faceless Joker', pos = {x = 1, y = 11}, set = 'Joker', config = {extra = {dollars = 5, faces = 3}}}, 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, 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_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, eternal_compat = true, rarity = 1, cost = 4, name = 'Superposition', pos = {x = 3, y = 11}, set = 'Joker', config = {}}, 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, 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_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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, eternal_compat = true, rarity = 2, cost = 7, name = "Vampire",set = "Joker", config = {extra = 0.2, Xmult = 1}, pos = {x=2,y=12}}, 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, eternal_compat = true, rarity = 2, cost = 7, name = "Shortcut",set = "Joker", config = {}, pos = {x=3,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, 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_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, eternal_compat = true, rarity = 2, cost = 6, name = "Vagabond",set = "Joker", config = {extra = 3}, pos = {x=5,y=12}}, 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, eternal_compat = true, rarity = 3, cost = 8, name = "Baron",set = "Joker", config = {extra = 1.5}, pos = {x=6,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, eternal_compat = true, rarity = 2, cost = 6, name = "Cloud 9",set = "Joker", config = {extra = 1}, pos = {x=7,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, eternal_compat = true, rarity = 2, cost = 6, name = "Rocket",set = "Joker", config = {extra = {dollars = 1, increase = 2}}, pos = {x=8,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, eternal_compat = true, rarity = 3, cost = 8, name = "Obelisk",set = "Joker", config = {extra = 0.2, Xmult = 1}, pos = {x=9,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_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, eternal_compat = false, rarity = 2, cost = 5, name = "Luchador",set = "Joker", config = {}, pos = {x=1,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, eternal_compat = true, rarity = 1, cost = 5, name = "Photograph",set = "Joker", config = {extra = 2}, pos = {x=2,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, eternal_compat = true, rarity = 2, cost = 6, name = "Gift Card",set = "Joker", config = {extra = 1}, pos = {x=3,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, 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_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, eternal_compat = true, rarity = 2, cost = 6, name = "Erosion",set = "Joker", config = {extra = 4}, pos = {x=5,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, eternal_compat = true, rarity = 2, cost = 6, name = "Reserved Parking",set = "Joker", config = {extra = {odds = 2, dollars = 1}}, pos = {x=6,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, eternal_compat = true, rarity = 1, cost = 4, name = "Mail-In Rebate",set = "Joker", config = {extra = 3}, pos = {x=7,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, eternal_compat = true, rarity = 2, cost = 5, name = "To the Moon",set = "Joker", config = {extra = 1}, pos = {x=8,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, eternal_compat = true, rarity = 1, cost = 4, name = "Hallucination",set = "Joker", config = {extra = 2}, pos = {x=9,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, eternal_compat = true, rarity = 1, cost = 6, name = "Fortune Teller", pos = {x=7,y=5}, set = "Joker", effect = "", config = {extra = 1}}, 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, 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_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, 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_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, 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_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, 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_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_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, eternal_compat = true, rarity = 3, cost = 8, name = "Baseball Card",set = "Joker", config = {extra = 1.5}, pos = {x=6,y=14}}, 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, eternal_compat = true, rarity = 2, cost = 6, name = "Bull",set = "Joker", config = {extra = 2}, pos = {x=7,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, eternal_compat = false, rarity = 2, cost = 6, name = "Diet Cola",set = "Joker", config = {}, pos = {x=8,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, eternal_compat = true, rarity = 2, cost = 5, name = "Trading Card",set = "Joker", config = {extra = 3}, pos = {x=9,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, eternal_compat = true, rarity = 2, cost = 5, name = "Flash Card",set = "Joker", config = {extra = 2, mult = 0}, pos = {x=0,y=15}}, 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, eternal_compat = false, rarity = 1, cost = 5, name = "Popcorn",set = "Joker", config = {mult = 20, extra = 4}, pos = {x=1,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, eternal_compat = true, rarity = 2, cost = 6, name = "Spare Trousers",set = "Joker", config = {extra = 2}, pos = {x=4,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, eternal_compat = true, rarity = 3, cost = 8, name = "Ancient Joker",set = "Joker", config = {extra = 1.5}, pos = {x=7,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, eternal_compat = false, rarity = 2, cost = 6, name = "Ramen",set = "Joker", config = {Xmult = 2, extra = 0.01}, pos = {x=2,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, eternal_compat = true, rarity = 1, cost = 4, name = "Walkie Talkie",set = "Joker", config = {extra = {chips = 10, mult = 4}}, pos = {x=8,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, eternal_compat = false, rarity = 2, cost = 6, name = "Seltzer",set = "Joker", config = {extra = 10}, pos = {x=3,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, eternal_compat = true, rarity = 2, cost = 6, name = "Castle",set = "Joker", config = {extra = {chips = 0, chip_mod = 3}}, pos = {x=9,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, eternal_compat = true, rarity = 1, cost = 4, name = "Smiley Face",set = "Joker", config = {extra = 4}, pos = {x=6,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, eternal_compat = true, rarity = 3, cost = 9, name = "Campfire",set = "Joker", config = {extra = 0.5}, pos = {x=5,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_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, 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_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, 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_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, 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_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, 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_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, 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_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, eternal_compat = true, rarity = 2, cost = 6, name = "Certificate", pos = {x=8,y=8}, set = "Joker", effect = "", config = {}, unlock_condition = {type = 'double_gold'}}, 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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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, 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_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 --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_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_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_empress= {order = 4, discovered = false, cost = 3, consumeable = true, name = "The Empress", pos = {x=3,y=0}, set = "Tarot", effect = "Enhance", cost_mult = 1.0, config = {mod_conv = 'm_mult', max_highlighted = 2}},
c_emperor= {order = 5, discovered = false, cost = 3, consumeable = true, name = "The Emperor", pos = {x=4,y=0}, set = "Tarot", effect = "Round Bonus", cost_mult = 1.0, config = {tarots = 2}}, c_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',
self.SETTINGS.GRAPHICS.texture_scaling == 1 and 'nearest' or 'linear', 1) 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") love.graphics.setLineStyle("rough")
--spritesheets --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({{ G.SPLASH_BACK:define_draw_steps({{
shader = 'splash', shader = 'splash',
send = { 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 = 'vort_speed', val = 0.4},
{name = 'colour_1', ref_table = G.C, ref_value = 'RED'}, {name = 'colour_1', ref_table = G.C, ref_value = 'RED'},
{name = 'colour_2', ref_table = G.C, ref_value = 'BLUE'}, {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({{ G.SPLASH_BACK:define_draw_steps({{
shader = 'splash', shader = 'splash',
send = { 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 = 'vort_speed', val = 0.4},
{name = 'colour_1', ref_table = G.C, ref_value = 'RED'}, {name = 'colour_1', ref_table = G.C, ref_value = 'RED'},
{name = 'colour_2', ref_table = G.C, ref_value = 'BLUE'}, {name = 'colour_2', ref_table = G.C, ref_value = 'BLUE'},
@ -1859,6 +1859,8 @@ function Game:init_game_object()
inflation = 0, inflation = 0,
hands_played = 0, hands_played = 0,
unused_discards = 0, unused_discards = 0,
perishable_rounds = 5,
rental_rate = 3,
blind = nil, blind = nil,
chips = 0, chips = 0,
chips_text = '0', chips_text = '0',
@ -1945,14 +1947,14 @@ function Game:init_game_object()
['King'] = {suits = {}, total = 0}, ['King'] = {suits = {}, total = 0},
}, },
hands = { 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 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 = 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 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}}}, ["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}}}, ["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}}}, ["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}}}, ["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}}}, ["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}}}, ["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}}}, ["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 >= 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 >= 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 >= 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 >= 7 then self.GAME.modifiers.enable_perishables_in_shop = true end
if self.GAME.stake >= 8 then if self.GAME.stake >= 8 then self.GAME.modifiers.enable_rentals_in_shop = true end
self.GAME.starting_params.hand_size = self.GAME.starting_params.hand_size - 1
end
self.GAME.selected_back:apply_to_run() self.GAME.selected_back:apply_to_run()
@ -2088,6 +2088,11 @@ function Game:start_run(args)
G.GAME.banned_keys[v.id] = true G.GAME.banned_keys[v.id] = true
end end
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
end end
@ -2104,7 +2109,7 @@ function Game:start_run(args)
if not saveTable then if not saveTable then
if args.seed then self.GAME.seeded = true end 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 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 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({{ G.SPLASH_BACK:define_draw_steps({{
shader = 'background', shader = 'background',
send = { 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 = 'spin_time', ref_table = G.TIMERS, ref_value = 'BACKGROUND'},
{name = 'colour_1', ref_table = G.C.BACKGROUND, ref_value = 'C'}, {name = 'colour_1', ref_table = G.C.BACKGROUND, ref_value = 'C'},
{name = 'colour_2', ref_table = G.C.BACKGROUND, ref_value = 'L'}, {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 for k, v in pairs(cardAreas) do
if G[k] then G[k]:load(v) if G[k] then G[k]:load(v)
else else
G.DEBUG_VALUE = ''
G['load_'..k] = v G['load_'..k] = v
print("ERROR LOADING GAME: Card area '"..k.."' not instantiated before load") end print("ERROR LOADING GAME: Card area '"..k.."' not instantiated before load") end
end end
@ -2328,6 +2332,7 @@ function Game:start_run(args)
self.deck:hard_set_T() self.deck:hard_set_T()
reset_idol_card() reset_idol_card()
reset_mail_rank() reset_mail_rank()
self.GAME.current_round.ancient_card.suit = nil
reset_ancient_card() reset_ancient_card()
reset_castle_card() reset_castle_card()
end end
@ -2372,6 +2377,7 @@ function Game:start_run(args)
end end
else else
G.GAME.blind:set_blind(nil, nil, true) G.GAME.blind:set_blind(nil, nil, true)
reset_blinds()
end end
G.FUNCS.blind_chip_UI_scale(G.hand_text_area.blind_chips) G.FUNCS.blind_chip_UI_scale(G.hand_text_area.blind_chips)
@ -2389,7 +2395,7 @@ function Game:start_run(args)
end end
function Game:update(dt) function Game:update(dt)
nuGC(nil, nil, true)
G.MAJORS = 0 G.MAJORS = 0
G.MINORS = 0 G.MINORS = 0
@ -2404,6 +2410,7 @@ function Game:update(dt)
timer_checkpoint('canvas and juice', 'update') timer_checkpoint('canvas and juice', 'update')
--Smooth out the dts to avoid any big jumps --Smooth out the dts to avoid any big jumps
self.TIMERS.REAL = self.TIMERS.REAL + dt 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.TIMERS.UPTIME = self.TIMERS.UPTIME + dt
self.SETTINGS.DEMO.total_uptime = (self.SETTINGS.DEMO.total_uptime or 0) + dt self.SETTINGS.DEMO.total_uptime = (self.SETTINGS.DEMO.total_uptime or 0) + dt
self.TIMERS.BACKGROUND = self.TIMERS.BACKGROUND + dt*(G.ARGS.spin and G.ARGS.spin.amount or 0) self.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 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 if v.FRAME.MOVE < G.FRAMES.MOVE then v:move(move_dt) end
end end
timer_checkpoint('move', 'update') 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 (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 if G.FILE_HANDLER.metrics then
print('SAVING METRICS')
G.SAVE_MANAGER.channel:push({ G.SAVE_MANAGER.channel:push({
type = 'save_metrics', type = 'save_metrics',
save_metrics = G.ARGS.save_metrics save_metrics = G.ARGS.save_metrics
@ -2623,13 +2629,11 @@ function Game:update(dt)
end end
if G.FILE_HANDLER.progress then if G.FILE_HANDLER.progress then
print('SAVING PROGRESS')
G.SAVE_MANAGER.channel:push({ G.SAVE_MANAGER.channel:push({
type = 'save_progress', type = 'save_progress',
save_progress = G.ARGS.save_progress save_progress = G.ARGS.save_progress
}) })
elseif G.FILE_HANDLER.settings then elseif G.FILE_HANDLER.settings then
print('SAVING SETTINGS')
G.SAVE_MANAGER.channel:push({ G.SAVE_MANAGER.channel:push({
type = 'save_settings', type = 'save_settings',
save_settings = G.ARGS.save_settings, save_settings = G.ARGS.save_settings,
@ -2639,7 +2643,6 @@ function Game:update(dt)
end end
if G.FILE_HANDLER.run then if G.FILE_HANDLER.run then
print('SAVING RUN')
G.SAVE_MANAGER.channel:push({ G.SAVE_MANAGER.channel:push({
type = 'save_run', type = 'save_run',
save_table = G.ARGS.save_run, save_table = G.ARGS.save_run,
@ -2858,11 +2861,11 @@ function Game:draw()
end end
end end
love.graphics.pop() love.graphics.pop()
love.graphics.setCanvas()
love.graphics.setCanvas(G.AA_CANVAS)
love.graphics.push() love.graphics.push()
love.graphics.scale(1/G.CANV_SCALE) love.graphics.setColor(G.C.WHITE)
love.graphics.setColor(G.C.WHITE) if (not G.recording_mode or G.video_control )and true then
if not G.recording_mode or G.video_control then
G.ARGS.eased_cursor_pos = G.ARGS.eased_cursor_pos or {x=G.CURSOR.T.x,y=G.CURSOR.T.y, sx = G.CONTROLLER.cursor_position.x, sy = G.CONTROLLER.cursor_position.y} G.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.screenwipe_amt = G.screenwipe_amt and (0.95*G.screenwipe_amt + 0.05*((self.screenwipe and 0.4 or self.screenglitch and 0.4) or 0)) or 1
G.SETTINGS.GRAPHICS.crt = G.SETTINGS.GRAPHICS.crt*0.3 G.SETTINGS.GRAPHICS.crt = G.SETTINGS.GRAPHICS.crt*0.3
@ -2881,10 +2884,20 @@ love.graphics.pop()
love.graphics.setShader( G.SHADERS['CRT']) love.graphics.setShader( G.SHADERS['CRT'])
G.SETTINGS.GRAPHICS.crt = G.SETTINGS.GRAPHICS.crt/0.3 G.SETTINGS.GRAPHICS.crt = G.SETTINGS.GRAPHICS.crt/0.3
end end
love.graphics.draw(self.CANVAS, 0, 0)
love.graphics.draw(self.CANVAS, 0, 0)
love.graphics.pop() love.graphics.pop()
love.graphics.setCanvas()
love.graphics.setShader() 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') timer_checkpoint('canvas', 'draw')
if not _RELEASE_MODE and not G.video_control and G.F_VERBOSE then 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({ G.E_MANAGER:add_event(Event({
trigger = 'immediate', trigger = 'immediate',
func = function() func = function()
G.GAME.round_resets.blind_states = G.GAME.round_resets.blind_states or {Small = 'Select', Big = 'Upcoming', Boss = 'Upcoming'} --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 --if G.GAME.round_resets.blind_states.Boss == 'Defeated' then
G.GAME.round_resets.blind_states.Small = 'Upcoming' -- G.GAME.round_resets.blind_states.Small = 'Upcoming'
G.GAME.round_resets.blind_states.Big = 'Upcoming' -- G.GAME.round_resets.blind_states.Big = 'Upcoming'
G.GAME.round_resets.blind_states.Boss = 'Upcoming' -- G.GAME.round_resets.blind_states.Boss = 'Upcoming'
G.GAME.blind_on_deck = 'Small' -- G.GAME.blind_on_deck = 'Small'
G.GAME.round_resets.blind_choices.Boss = get_new_boss() -- G.GAME.round_resets.blind_choices.Boss = get_new_boss()
G.GAME.round_resets.boss_rerolled = false -- G.GAME.round_resets.boss_rerolled = false
end --end
play_sound('cancel') play_sound('cancel')
G.blind_select = UIBox{ G.blind_select = UIBox{
definition = create_UIBox_blind_select(), definition = create_UIBox_blind_select(),

View File

@ -1,4 +1,4 @@
VERSION = '1.0.0n' VERSION = '1.0.1f'
VERSION = VERSION..'-FULL' VERSION = VERSION..'-FULL'
--check_version --check_version
@ -7,7 +7,7 @@ VERSION = VERSION..'-FULL'
function Game:set_globals() function Game:set_globals()
self.VERSION = VERSION self.VERSION = VERSION
--||||||||||||||||||||||||||||| --||||||||||||||||||||||||||||||
-- Feature Flags -- Feature Flags
--|||||||||||||||||||||||||||||| --||||||||||||||||||||||||||||||
self.F_QUIT_BUTTON = true --Include the main menu 'Quit' button 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_SWAP_XY_BUTTONS = false --Swapping button function for X and Y buttons (mainly for switch)
self.F_NO_ACHIEVEMENTS = false --Disable achievements 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_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_GUIDE = false --Replace back/select button with 'guide' button
self.F_JAN_CTA = false --Call to action for Jan demo self.F_JAN_CTA = false --Call to action for Jan demo
self.F_HIDE_BG = false --Hiding the game objects when paused 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_PS4_PLAYSTATION_GLYPHS = false --use PS4 glyphs instead of PS5 glyphs for PS controllers
self.F_LOCAL_CLIPBOARD = false self.F_LOCAL_CLIPBOARD = false
self.F_SAVE_TIMER = 30 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 if love.system.getOS() == 'Windows' then
self.F_DISCORD = true self.F_DISCORD = true
self.F_SAVE_TIMER = 5 self.F_SAVE_TIMER = 5
self.F_ENGLISH_ONLY = false self.F_ENGLISH_ONLY = false
self.F_CRASH_REPORTS = true self.F_CRASH_REPORTS = false
end end
if love.system.getOS() == 'OS X' then if love.system.getOS() == 'OS X' then
@ -56,6 +57,7 @@ function Game:set_globals()
end end
if love.system.getOS() == 'Nintendo Switch' then if love.system.getOS() == 'Nintendo Switch' then
self.F_HIDE_BETA_LANGS = true
self.F_BASIC_CREDITS = true self.F_BASIC_CREDITS = true
self.F_NO_ERROR_HAND = true self.F_NO_ERROR_HAND = true
self.F_QUIT_BUTTON = false self.F_QUIT_BUTTON = false
@ -72,13 +74,14 @@ function Game:set_globals()
self.F_CTA = false self.F_CTA = false
self.F_VERBOSE = false self.F_VERBOSE = false
self.F_NO_ACHIEVEMENTS = true self.F_NO_ACHIEVEMENTS = true
self.F_ENGLISH_ONLY = true self.F_ENGLISH_ONLY = nil
self.F_EXTERNAL_LINKS = false self.F_EXTERNAL_LINKS = false
self.F_HIDE_BG = true self.F_HIDE_BG = true
end end
if love.system.getOS() == 'ps4' or love.system.getOS() == 'ps5' then --PLAYSTATION this is for console stuff, modify as needed 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_NO_ERROR_HAND = true
self.F_QUIT_BUTTON = false self.F_QUIT_BUTTON = false
self.F_SKIP_TUTORIAL = false self.F_SKIP_TUTORIAL = false
@ -100,6 +103,7 @@ function Game:set_globals()
end end
if love.system.getOS() == 'xbox' then if love.system.getOS() == 'xbox' then
self.F_HIDE_BETA_LANGS = true
self.F_NO_ERROR_HAND = 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_DISP_USERNAME = true --SET THIS TO A STRING WHEN IT IS FETCHED, it will automatically add the profile / playing as UI when that happens
self.F_SKIP_TUTORIAL = false self.F_SKIP_TUTORIAL = false
@ -122,6 +126,7 @@ function Game:set_globals()
self.TIMERS = { self.TIMERS = {
TOTAL=0, TOTAL=0,
REAL = 0, REAL = 0,
REAL_SHADER = 0,
UPTIME = 0, UPTIME = 0,
BACKGROUND = 0 BACKGROUND = 0
} }
@ -212,8 +217,8 @@ function Game:set_globals()
--|||||||||||||||||||||||||||||| --||||||||||||||||||||||||||||||
self.TILESIZE = 20 self.TILESIZE = 20
self.TILESCALE = 3.65 self.TILESCALE = 3.65
self.TILE_W = self.F_MOBILE_UI and 11.5 or 20 self.TILE_W = 20
self.TILE_H = self.F_MOBILE_UI and 20 or 11.5 self.TILE_H = 11.5
self.DRAW_HASH_BUFF = 2 self.DRAW_HASH_BUFF = 2
self.CARD_W = 2.4*35/41 self.CARD_W = 2.4*35/41
self.CARD_H = 2.4*47/41 self.CARD_H = 2.4*47/41
@ -321,6 +326,8 @@ function Game:set_globals()
EDITION = {1,1,1,1}, EDITION = {1,1,1,1},
DARK_EDITION = {0,0,0,1}, DARK_EDITION = {0,0,0,1},
ETERNAL = HEX('c75985'), ETERNAL = HEX('c75985'),
PERISHABLE = HEX('4f5da1'),
RENTAL = HEX('b18f43'),
DYN_UI = { DYN_UI = {
MAIN = HEX('374244'), MAIN = HEX('374244'),
DARK = HEX('374244'), DARK = HEX('374244'),
@ -404,7 +411,7 @@ function Game:set_globals()
}, },
BACKGROUND = { BACKGROUND = {
L = {1,1,0,1}, L = {1,1,0,1},
D = {0,1,1,1}, D = HEX("374244"),
C = HEX("374244"), C = HEX("374244"),
contrast = 1 contrast = 1
} }

File diff suppressed because it is too large Load Diff

View File

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

View File

@ -144,7 +144,7 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
if (hovering <= 0.){ if (hovering <= 0.){
return transform_projection * vertex_position; 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 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)) 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); *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); 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.; MY_HIGHP_OR_MEDIUMP float t = time * 10.0 + 2003.;
vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a); MY_HIGHP_OR_MEDIUMP 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 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)); MY_HIGHP_OR_MEDIUMP 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)); MY_HIGHP_OR_MEDIUMP 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_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_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.; 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.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.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve) - (floored_uv.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 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords )
{ {
vec4 tex = Texel( texture, texture_coords); MY_HIGHP_OR_MEDIUMP 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 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)); MY_HIGHP_OR_MEDIUMP number low = min(tex.r, min(tex.g, tex.b));
number high = max(tex.r, max(tex.g, tex.b)); MY_HIGHP_OR_MEDIUMP number high = max(tex.r, max(tex.g, tex.b));
number delta = max(high-low, low*0.7); 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.)); 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.));
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 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)); 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));
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 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 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); 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.){ if (hovering <= 0.){
return transform_projection * vertex_position; return transform_projection * vertex_position;
} }
float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy); MY_HIGHP_OR_MEDIUMP 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; MY_HIGHP_OR_MEDIUMP 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 scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist); *hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist);
return transform_projection * vertex_position + vec4(0,0,0,scale); 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) end)
self.triggered = true self.triggered = true
return { return {
dollars = 15, dollars = self.config.dollars,
condition = localize('ph_defeat_the_boss'), condition = localize('ph_defeat_the_boss'),
pos = self.pos, pos = self.pos,
tag = self tag = self
@ -358,6 +358,8 @@ function Tag:apply_to_run(_context)
card.states.visible = false card.states.visible = false
self:yep('+', G.C.RED,function() self:yep('+', G.C.RED,function()
card:start_materialize() card:start_materialize()
card.ability.couponed = true
card:set_cost()
return true return true
end) end)
else else
@ -370,6 +372,8 @@ function Tag:apply_to_run(_context)
card.states.visible = false card.states.visible = false
self:yep('+', G.C.GREEN,function() self:yep('+', G.C.GREEN,function()
card:start_materialize() card:start_materialize()
card.ability.couponed = true
card:set_cost()
return true return true
end) end)
end end
@ -395,6 +399,8 @@ function Tag:apply_to_run(_context)
_context.card.temp_edition = true _context.card.temp_edition = true
self:yep('+', G.C.DARK_EDITION,function() self:yep('+', G.C.DARK_EDITION,function()
_context.card:set_edition({foil = true}, true) _context.card:set_edition({foil = true}, true)
_context.card.ability.couponed = true
_context.card:set_cost()
_context.card.temp_edition = nil _context.card.temp_edition = nil
G.CONTROLLER.locks[lock] = nil G.CONTROLLER.locks[lock] = nil
return true return true
@ -405,6 +411,8 @@ function Tag:apply_to_run(_context)
self:yep('+', G.C.DARK_EDITION,function() self:yep('+', G.C.DARK_EDITION,function()
_context.card.temp_edition = nil _context.card.temp_edition = nil
_context.card:set_edition({holo = true}, true) _context.card:set_edition({holo = true}, true)
_context.card.ability.couponed = true
_context.card:set_cost()
G.CONTROLLER.locks[lock] = nil G.CONTROLLER.locks[lock] = nil
return true return true
end) end)
@ -414,6 +422,8 @@ function Tag:apply_to_run(_context)
self:yep('+', G.C.DARK_EDITION,function() self:yep('+', G.C.DARK_EDITION,function()
_context.card.temp_edition = nil _context.card.temp_edition = nil
_context.card:set_edition({polychrome = true}, true) _context.card:set_edition({polychrome = true}, true)
_context.card.ability.couponed = true
_context.card:set_cost()
G.CONTROLLER.locks[lock] = nil G.CONTROLLER.locks[lock] = nil
return true return true
end) end)
@ -423,6 +433,8 @@ function Tag:apply_to_run(_context)
self:yep('+', G.C.DARK_EDITION,function() self:yep('+', G.C.DARK_EDITION,function()
_context.card.temp_edition = nil _context.card.temp_edition = nil
_context.card:set_edition({negative = true}, true) _context.card:set_edition({negative = true}, true)
_context.card.ability.couponed = true
_context.card:set_cost()
G.CONTROLLER.locks[lock] = nil G.CONTROLLER.locks[lock] = nil
return true return true
end) end)

View File

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