balatro-mods/Cryptid/items/misc_joker.lua
2025-04-13 17:53:04 +08:00

8108 lines
193 KiB
Lua

local dropshot = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Dropshot",
key = "dropshot",
order = 3,
config = { extra = { Xmult_mod = 0.2, x_mult = 1 } },
pos = { x = 5, y = 0 },
rarity = 3,
cost = 8,
blueprint_compat = true,
perishable_compat = false,
atlas = "atlasone",
loc_vars = function(self, info_queue, center)
return {
vars = {
center.ability.extra.Xmult_mod,
localize(
G.GAME.current_round.cry_dropshot_card and G.GAME.current_round.cry_dropshot_card.suit or "Spades",
"suits_singular"
),
center.ability.extra.x_mult,
colours = {
G.C.SUITS[G.GAME.current_round.cry_dropshot_card and G.GAME.current_round.cry_dropshot_card.suit or "Spades"],
},
},
}
end,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.before and not context.blueprint then
cards = 0
for k, v in ipairs(context.scoring_hand) do
v.cry_dropshot_incompat = true
end
for k, v in ipairs(context.full_hand) do
if not v.cry_dropshot_incompat and v:is_suit(G.GAME.current_round.cry_dropshot_card.suit) then
cards = cards + 1
G.E_MANAGER:add_event(Event({
func = function()
v:juice_up()
return true
end,
}))
end
end
for k, v in ipairs(context.scoring_hand) do
v.cry_dropshot_incompat = nil
end
if cards > 0 then
card.ability.extra.x_mult = card.ability.extra.x_mult + cards * card.ability.extra.Xmult_mod
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }) }
)
return nil, true
end
end
if context.joker_main and (to_big(card.ability.extra.x_mult) > to_big(1)) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }),
Xmult_mod = card.ability.extra.x_mult,
}
end
end,
cry_credits = {
idea = {
"Mystic Misclick",
},
art = {
"Mystic Misclick",
"George the Rat",
},
code = {
"Math",
},
},
}
local happyhouse = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-happyhouse",
key = "happyhouse",
pos = { x = 2, y = 4 },
order = 2,
config = { extra = { mult = 4, check = 0 } },
immutable = true,
pools = { ["Meme"] = true },
rarity = 2,
cost = 2,
blueprint_compat = true,
atlas = "atlastwo",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.mult, center.ability.extra.check } }
end,
calculate = function(self, card, context)
if
context.cardarea == G.jokers
and context.before
and not context.blueprint
and not context.retrigger_joker
then
card.ability.extra.check = card.ability.extra.check + 1
if
card.ability.extra.check == 114
and G.GAME.round_resets.ante < 8
and not (G.GAME.selected_back.effect.center.key == "antimatter" or G.GAME.selected_back.effect.center.key == "equilibrium")
and (
not CardSleeves
or (
CardSleeves
and G.GAME.selected_sleeve
-- and G.GAME.selected_sleeve ~= "sleeve_cry_antimatter_sleeve" TODO: Add check if Antimatter sleeve gets added
and G.GAME.selected_sleeve ~= "sleeve_cry_equilibrium_sleeve"
)
)
then --Yes, the cut off point is boss blind Ante 7. I'm evil >:3.
check_for_unlock({ type = "home_realtor" })
end
if card.ability.extra.check < 114 then --Hardcoded, dont want misprint to mess with this hehe
return {
card_eval_status_text(card, "extra", nil, nil, nil, {
message = card.ability.extra.check .. "/114",
colour = G.C.DARK_EDITION,
}),
}
end
end
if context.joker_main and (to_big(card.ability.extra.mult) > to_big(1)) and card.ability.extra.check > 113 then
return {
message = localize({ type = "variable", key = "a_powmult", vars = { card.ability.extra.mult } }),
Emult_mod = card.ability.extra.mult,
colour = G.C.DARK_EDITION,
card = card,
}
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Jevonn",
},
code = {
"Jevonn",
},
},
}
local maximized = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Maximized",
key = "maximized",
pos = { x = 5, y = 2 },
rarity = 3,
order = 13,
cost = 11,
immutable = true,
atlas = "atlastwo",
cry_credits = {
idea = {
"Gold",
},
art = {
"Gold",
},
code = {
"Math",
},
},
init = function(self)
local cgi_ref = Card.get_id
override_maximized = false
function Card:get_id()
local id = cgi_ref(self)
if id == nil then
id = 10
end
if next(find_joker("cry-Maximized")) and not override_maximized then
if id >= 2 and id <= 10 then
id = 10
end
if id >= 11 and id <= 13 or next(find_joker("Pareidolia")) then
id = 13
end
end
return id
end
--Fix issues with View Deck and Maximized
local gui_vd = G.UIDEF.view_deck
function G.UIDEF.view_deck(unplayed_only)
override_maximized = true
local ret_value = gui_vd(unplayed_only)
override_maximized = false
return ret_value
end
end,
}
local potofjokes = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Pot of Jokes",
key = "pot_of_jokes",
config = { extra = { h_size = -2, h_mod = 1 }, immutable = { h_added = 0, h_mod_max = 1000 } },
pos = { x = 5, y = 0 },
rarity = 3,
order = 104,
cost = 10,
perishable_compat = false,
atlas = "atlastwo",
loc_vars = function(self, info_queue, center)
return {
vars = {
center.ability.extra.h_size < 0 and center.ability.extra.h_size
or "+" .. math.min(1000, center.ability.extra.h_size),
center.ability.extra.h_mod,
"+" .. center.ability.immutable.h_mod_max,
},
}
end,
calculate = function(self, card, context)
if context.end_of_round and not context.individual and not context.repetition and not context.blueprint then
if
to_big(card.ability.extra.h_size) + to_big(card.ability.extra.h_mod)
>= to_big(card.ability.immutable.h_mod_max)
then
card.ability.extra.h_size = card.ability.immutable.h_mod_max
card.ability.extra.h_mod = 0
-- Fallback for if Pot of Jokes comes into this calcuate function with large h_size
if card.ability.immutable.h_added < card.ability.immutable.h_mod_max then
local delta = card.ability.immutable.h_mod_max - card.ability.immutable.h_added
G.hand:change_size(delta)
card.ability.immutable.h_added = card.ability.immutable.h_mod_max
end
end
local delta = math.min(
math.max(0, card.ability.immutable.h_mod_max - card.ability.extra.h_size),
card.ability.extra.h_mod
)
G.hand:change_size(delta)
card.ability.extra.h_size = card.ability.extra.h_size + card.ability.extra.h_mod
card.ability.immutable.h_added = card.ability.immutable.h_added + delta
return {
message = localize({ type = "variable", key = "a_handsize", vars = { card.ability.extra.h_mod } }),
colour = G.C.FILTER,
card = card,
}
end
end,
add_to_deck = function(self, card, from_debuff)
G.hand:change_size(math.min(card.ability.immutable.h_mod_max, card.ability.extra.h_size))
end,
remove_from_deck = function(self, card, from_debuff)
G.hand:change_size(-1 * math.min(card.ability.immutable.h_mod_max, card.ability.extra.h_size))
end,
cry_credits = {
idea = {
"Mjiojio",
},
art = {
"Ein13",
},
code = {
"Math",
"BobJoe400",
},
},
unlocked = false,
check_for_unlock = function(self, args)
if G and G.hand and G.hand.config and G.hand.config.card_limit and G.hand.config.card_limit >= 12 then
unlock_card(self)
end
if args.type == "cry_lock_all" then
lock_card(self)
end
if args.type == "cry_unlock_all" then
unlock_card(self)
end
end,
}
local queensgambit = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Queen's Gambit",
key = "queens_gambit",
pos = { x = 1, y = 0 },
rarity = 1,
order = 7,
cost = 7,
immutable = true,
loc_vars = function(self, info_queue, center)
if not center.edition or (center.edition and not center.edition.negative) then
info_queue[#info_queue + 1] = G.P_CENTERS.e_negative
end
end,
atlas = "atlastwo",
config = { extra = { type = "Straight Flush" } },
calculate = function(self, card, context)
if context.destroying_card and not context.blueprint then
if
G.GAME.current_round.current_hand.handname == "Royal Flush"
and context.destroying_card:get_id() == 12
then
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_plus_joker"), colour = G.C.FILTER }
)
G.E_MANAGER:add_event(Event({
trigger = "after",
func = function()
local card = create_card("Joker", G.jokers, nil, 0.99, nil, nil, nil, "cry_gambit")
card:set_edition({ negative = true })
card:add_to_deck()
G.jokers:emplace(card)
card:start_materialize()
return true
end,
}))
return { remove = not context.destroying_card.ability.eternal }
end
end
end,
cry_credits = {
idea = {
"Project666",
},
art = {
"Ein13",
},
code = {
--wonder what happened to this guy
"Thedrunkenbrick",
},
},
}
local wee_fib = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Wee Fibonacci",
key = "wee_fib",
config = { extra = { mult = 0, mult_mod = 3 } },
pos = { x = 1, y = 5 },
display_size = { w = 0.7 * 71, h = 0.7 * 95 },
rarity = 3,
cost = 9,
order = 98,
blueprint_compat = true,
perishable_compat = false,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.mult, center.ability.extra.mult_mod } }
end,
calculate = function(self, card, context)
if context.cardarea == G.play and context.individual and not context.blueprint then
local rank = context.other_card:get_id()
if rank == 14 or rank == 2 or rank == 3 or rank == 5 or rank == 8 then
card.ability.extra.mult = card.ability.extra.mult + card.ability.extra.mult_mod
return {
extra = { focus = card, message = localize("k_upgrade_ex") },
card = card,
colour = G.C.MULT,
}
end
end
if context.joker_main and (to_big(card.ability.extra.mult) > to_big(0)) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.extra.mult } }),
mult_mod = card.ability.extra.mult,
colour = G.C.MULT,
}
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"LocalThunk",
},
code = {
"Math",
},
},
}
local whip = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-The WHIP",
key = "whip",
pos = { x = 5, y = 3 },
config = { extra = { Xmult_mod = 0.5, x_mult = 1 } },
rarity = 2,
cost = 8,
order = 15,
blueprint_compat = true,
perishable_compat = false,
atlas = "atlasone",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.Xmult_mod, center.ability.extra.x_mult } }
end,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.before and not context.blueprint then
local two = false
local seven = false
local twosuits = {}
local sevensuits = {}
for i = 1, #context.full_hand do
if context.full_hand[i]:get_id() == 2 or context.full_hand[i]:get_id() == 7 then
if context.full_hand[i]:get_id() == 2 then
if not two then
two = true
end
for k, v in pairs(SMODS.Suits) do
if context.full_hand[i]:is_suit(k, nil, true) then
local contained = false
for i = 1, #twosuits do
if k == twosuits[i] then
contained = true
end
end
if not contained then
twosuits[#twosuits + 1] = k
end
end
end
else
if not seven then
seven = true
end
for k, v in pairs(SMODS.Suits) do
if context.full_hand[i]:is_suit(k, nil, true) then
local contained = false
for i = 1, #sevensuits do
if k == sevensuits[i] then
contained = true
end
end
if not contained then
sevensuits[#sevensuits + 1] = k
end
end
end
end
end
if two and seven then
if
(#twosuits > 1 or #sevensuits > 1)
or (#twosuits == 1 and #sevensuits == 1 and twosuits[1] ~= sevensuits[1])
then
card.ability.extra.x_mult = card.ability.extra.x_mult + card.ability.extra.Xmult_mod
card_eval_status_text(card, "extra", nil, nil, nil, {
message = localize({
type = "variable",
key = "a_xmult",
vars = { card.ability.extra.x_mult },
}),
})
return nil, true
end
end
end
end
if context.joker_main and (to_big(card.ability.extra.x_mult) > to_big(1)) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }),
Xmult_mod = card.ability.extra.x_mult,
}
end
end,
cry_credits = {
idea = {
"Gold",
},
art = {
"Ein13",
},
code = {
"Math",
},
},
}
local lucky_joker = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Lucky Joker",
key = "lucky_joker",
config = { extra = { dollars = 5 } },
pos = { x = 4, y = 3 },
rarity = 1,
cost = 4,
order = 36,
blueprint_compat = true,
atlas = "atlasone",
enhancement_gate = "m_lucky",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue + 1] = G.P_CENTERS.m_lucky
return { vars = { center.ability.extra.dollars } }
end,
calculate = function(self, card, context)
if context.individual and context.other_card.lucky_trigger then
G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + card.ability.extra.dollars
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.dollar_buffer = 0
return true
end,
}))
return {
dollars = card.ability.extra.dollars,
card = card,
}
end
end,
cry_credits = {
idea = {
"Ein13",
},
art = {
"Jevonn",
},
code = {
"WilsontheWolf",
},
},
}
local cursor = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Cursor",
key = "cursor",
config = { extra = { chips = 0, chip_mod = 8 } },
pos = { x = 4, y = 1 },
rarity = 1,
cost = 5,
order = 5,
blueprint_compat = true,
perishable_compat = false,
atlas = "atlasone",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.chips, center.ability.extra.chip_mod } }
end,
calculate = function(self, card, context)
if context.buying_card and not context.blueprint and not (context.card == card) then
card.ability.extra.chips = card.ability.extra.chips + card.ability.extra.chip_mod
card_eval_status_text(card, "extra", nil, nil, nil, {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.extra.chips } }),
colour = G.C.CHIPS,
})
return nil, true
end
if context.joker_main and (to_big(card.ability.extra.chips) > to_big(0)) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.extra.chips } }),
chip_mod = card.ability.extra.chips,
}
end
end,
cry_credits = {
idea = {
"Math",
},
art = {
"Jevonn",
},
code = {
"Math",
},
},
}
local pickle = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Pickle",
key = "pickle",
config = { extra = { tags = 3, tags_mod = 1 } },
pos = { x = 3, y = 3 },
rarity = 2,
order = 45,
cost = 6,
blueprint_compat = true,
eternal_compat = false,
atlas = "atlasone",
pools = { ["Food"] = true },
loc_vars = function(self, info_queue, center)
return { vars = { math.min(20, center.ability.extra.tags), center.ability.extra.tags_mod } }
end,
calculate = function(self, card, context)
if context.skip_blind then
for i = 1, math.min(20, card.ability.extra.tags) do
local tag_key = get_next_tag_key("cry_pickle")
if tag_key == "tag_boss" then
i = i - 1 --skip these, as they can cause bugs with pack opening from other tags
else
local tag = Tag(tag_key)
if tag.name == "Orbital Tag" then
local _poker_hands = {}
for k, v in pairs(G.GAME.hands) do
if v.visible then
_poker_hands[#_poker_hands + 1] = k
end
end
tag.ability.orbital_hand = pseudorandom_element(_poker_hands, pseudoseed("cry_pickle_orbital"))
end
tag.ability.shiny = Cryptid.is_shiny()
add_tag(tag)
end
end
card_eval_status_text(card, "extra", nil, nil, nil, {
message = localize({
type = "variable",
key = card.ability.extra.tags == 1 and "a_tag" or "a_tags",
vars = { card.ability.extra.tags },
})[1],
colour = G.C.FILTER,
})
return nil, true
end
if context.setting_blind and not context.blueprint then
card.ability.extra.tags = card.ability.extra.tags - card.ability.extra.tags_mod
if to_big(card.ability.extra.tags) > to_big(0) then
card_eval_status_text(card, "extra", nil, nil, nil, {
message = localize({
type = "variable",
key = card.ability.extra.tags_mod == 1 and "a_tag_minus" or "a_tags_minus",
vars = { card.ability.extra.tags_mod },
})[1],
colour = G.C.FILTER,
})
return nil, true
else
G.E_MANAGER:add_event(Event({
func = function()
play_sound("tarot1")
card.T.r = -0.2
card:juice_up(0.3, 0.4)
card.states.drag.is = true
card.children.center.pinch.x = true
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.3,
blockable = false,
func = function()
G.jokers:remove_card(card)
card:remove()
card = nil
return true
end,
}))
return true
end,
}))
return {
message = localize("k_eaten_ex"),
colour = G.C.FILTER,
}
end
end
end,
cry_credits = {
idea = {
"5381",
},
art = {
"Mystic Misclick",
"unexian",
},
code = {
"Math",
},
},
}
local cube = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Cube",
key = "cube",
config = { extra = { chips = 6 } },
pos = { x = 5, y = 4 },
pixel_size = { w = 0.1 * 71, h = 0.1 * 95 },
rarity = 1,
order = 11,
cost = -27,
blueprint_compat = true,
atlas = "atlasone",
pools = { ["Meme"] = true },
source_gate = "sho",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.chips } }
end,
calculate = function(self, card, context)
if context.joker_main then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.extra.chips } }),
chip_mod = card.ability.extra.chips,
}
end
end,
cry_credits = {
idea = {
"Ein13",
"Math",
},
art = {
"Ein13",
},
code = {
"Math",
},
},
}
local triplet_rhythm = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Triplet Rhythm",
key = "triplet_rhythm",
config = { extra = { Xmult = 3 } },
pos = { x = 0, y = 4 },
rarity = 1,
order = 10,
cost = 6,
blueprint_compat = true,
atlas = "atlastwo",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.Xmult } }
end,
calculate = function(self, card, context)
if context.joker_main and context.scoring_hand then
local threes = 0
for i = 1, #context.scoring_hand do
if context.scoring_hand[i]:get_id() == 3 then
threes = threes + 1
end
end
if threes == 3 then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.Xmult } }),
Xmult_mod = card.ability.extra.Xmult,
}
end
end
end,
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Math",
},
},
}
local booster = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Booster Joker",
key = "booster",
config = { extra = { booster_slots = 1 } },
pos = { x = 2, y = 0 },
display_size = { w = 1.17 * 71, h = 1.17 * 95 },
order = 34,
rarity = 2,
cost = 6,
blueprint_compat = false,
atlas = "atlastwo",
loc_vars = function(self, info_queue, center)
return { vars = { math.min(25, center.ability.extra.booster_slots) } }
end,
add_to_deck = function(self, card, from_debuff)
local mod = math.min(25, card.ability.extra.booster_slots)
SMODS.change_booster_limit(mod)
end,
remove_from_deck = function(self, card, from_debuff)
local mod = math.min(25, card.ability.extra.booster_slots)
SMODS.change_booster_limit(-mod)
end,
cry_credits = {
idea = {
"Ein13",
},
art = {
"Jevonn",
},
code = {
"Math",
},
},
}
local chili_pepper = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Chili Pepper",
key = "chili_pepper",
config = { extra = { Xmult = 1, Xmult_mod = 0.5, rounds_remaining = 8 } },
pos = { x = 0, y = 1 },
rarity = 2,
cost = 6,
order = 48,
blueprint_compat = true,
eternal_compat = false,
perishable_compat = false,
atlas = "atlastwo",
pools = { ["Food"] = true },
loc_vars = function(self, info_queue, center)
return {
vars = { center.ability.extra.Xmult, center.ability.extra.Xmult_mod, center.ability.extra.rounds_remaining },
}
end,
calculate = function(self, card, context)
if context.joker_main and to_big(card.ability.extra.Xmult) > to_big(1) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.Xmult } }),
Xmult_mod = card.ability.extra.Xmult,
}
end
if
context.end_of_round
and not context.blueprint
and not context.individual
and not context.repetition
and not context.retrigger_joker
then
card.ability.extra.Xmult = card.ability.extra.Xmult + card.ability.extra.Xmult_mod
card.ability.extra.rounds_remaining = card.ability.extra.rounds_remaining - 1
if card.ability.extra.rounds_remaining > 0 then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.Xmult } }),
colour = G.C.FILTER,
}
else
G.E_MANAGER:add_event(Event({
func = function()
play_sound("tarot1")
card.T.r = -0.2
card:juice_up(0.3, 0.4)
card.states.drag.is = true
card.children.center.pinch.x = true
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.3,
blockable = false,
func = function()
G.jokers:remove_card(card)
card:remove()
card = nil
return true
end,
}))
return true
end,
}))
return {
message = localize("k_eaten_ex"),
colour = G.C.FILTER,
}
end
end
end,
cry_credits = {
idea = {
"Mystic Misclick",
},
art = {
"Mystic Misclick",
"George the Rat",
},
code = {
"Math",
},
},
}
local compound_interest = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Compound Interest",
key = "compound_interest",
config = { extra = { percent_mod = 3, percent = 12 } },
pos = { x = 3, y = 2 },
rarity = 3,
order = 9,
cost = 10,
perishable_compat = false,
atlas = "atlastwo",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.percent, center.ability.extra.percent_mod } }
end,
calc_dollar_bonus = function(self, card)
if G.GAME.dollars > to_big(0) then
local bonus = math.max(0, math.floor(0.01 * card.ability.extra.percent * (G.GAME.dollars or 1)))
local old = card.ability.extra.percent
card.ability.extra.percent = card.ability.extra.percent + card.ability.extra.percent_mod
Cryptid.compound_interest_scale_mod(card, card.ability.extra.percent_mod, old, card.ability.extra.percent)
if bonus > to_big(0) then
return bonus
end
else
return 0
end
end,
cry_credits = {
idea = {
"Mjiojio",
},
art = {
"Linus Goof Balls",
},
code = {
"Math",
},
},
}
local big_cube = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"j_cry_cube",
},
},
name = "cry-Big Cube",
key = "big_cube",
joker_gate = "cry-Cube",
config = { extra = { x_chips = 6 }, override_x_chips_check = true },
pos = { x = 4, y = 4 },
rarity = 1,
order = 105,
cost = 27,
blueprint_compat = true,
atlas = "atlasone",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.x_chips } }
end,
calculate = function(self, card, context)
if context.joker_main then
return {
message = localize({ type = "variable", key = "a_xchips", vars = { card.ability.extra.x_chips } }),
Xchip_mod = card.ability.extra.x_chips,
colour = G.C.CHIPS,
}
end
end,
cry_credits = {
idea = {
"Mystic Misclick",
},
art = {
"AlexZGreat",
},
code = {
"Math",
},
},
}
local eternalflame = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-eternalflame",
key = "eternalflame",
pos = { x = 0, y = 4 },
config = { extra = { extra = 0.2, x_mult = 1 } },
rarity = 3,
order = 100,
cost = 9,
perishable_compat = false,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return {
vars = { center.ability.extra.extra, center.ability.extra.x_mult },
key = Card.get_gameset(card) ~= "modest" and "j_cry_eternalflame2" or "j_cry_eternalflame",
}
end,
atlas = "atlasone",
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.extra.x_mult) > to_big(1)) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }),
Xmult_mod = card.ability.extra.x_mult,
}
elseif
context.selling_card
and (context.card.sell_cost >= 3 or Card.get_gameset(card) ~= "modest")
and not context.blueprint
then
card.ability.extra.x_mult = card.ability.extra.x_mult + card.ability.extra.extra
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }) }
)
return nil, true
end
end,
cry_credits = {
idea = {
"Dovahkiin1307",
},
art = {
"Jevonn",
},
code = {
"Jevonn",
},
},
}
local nice = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Nice",
key = "nice",
config = { extra = { chips = 420, sixcount = 0, ninecount = 0 } },
pos = { x = 2, y = 3 },
pools = { ["Meme"] = true },
rarity = 3,
cost = 6.9,
order = 84,
atlas = "atlasone",
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.chips } }
end,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.before then
card.ability.extra.sixcount = 0
card.ability.extra.ninecount = 0
for i, v in pairs(context.full_hand) do
if v:get_id() == 6 then
card.ability.extra.sixcount = card.ability.extra.sixcount + 1
elseif v:get_id() == 9 then
card.ability.extra.ninecount = card.ability.extra.ninecount + 1
end
end
elseif context.cardarea == G.jokers and context.joker_main then
if card.ability.extra.sixcount > 0 and card.ability.extra.ninecount > 0 then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.extra.chips or 0 } }),
chip_mod = card.ability.extra.chips or 0,
}
end
end
end,
cry_credits = {
idea = {
"AlexZGreat",
},
art = {
"Jevonn",
},
code = {
"AlexZGreat",
},
},
}
local seal_the_deal = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Seal The Deal",
key = "seal_the_deal",
config = { extra = nil },
pos = { x = 2, y = 4 },
rarity = 2,
cost = 5,
order = 101,
immutable = true,
atlas = "atlasone",
calculate = function(self, card, context)
if
context.after
and G.GAME.current_round.hands_left == 0
and not context.blueprint
and not context.retrigger_joker
then
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 1.3,
func = function() -- i can't figure out how to split these events without making em look bad so you get this?
for j = 1, #context.scoring_hand do
if not context.scoring_hand[j].seal then
context.scoring_hand[j]:set_seal(
SMODS.poll_seal({ guaranteed = true, type_key = "sealthedeal" }),
true,
false
)
context.scoring_hand[j]:juice_up()
end
end
play_sound("gold_seal", 1.2, 0.4)
card:juice_up()
return true
end,
}))
return nil, true
end
end,
set_ability = function(self, card, initial, delay_sprites)
local sealtable = { "blue", "red", "purple" }
if Cryptid.enabled("cry_azure") then
sealtable[#sealtable + 1] = "azure"
end
if Cryptid.enabled("cry_green") then
sealtable[#sealtable + 1] = "green"
end
card.ability.extra = pseudorandom_element(sealtable, pseudoseed("abc"))
if self.discovered then
--Gold (ULTRA RARE!!!!!!!!)
if pseudorandom("xyz") <= 0.000001 and not (card.area and card.area.config.collection) then
card.children.center:set_sprite_pos({ x = 6, y = 4 })
--Others
elseif card.ability.extra == "red" then
card.children.center:set_sprite_pos({ x = 6, y = 0 })
elseif card.ability.extra == "azure" then
card.children.center:set_sprite_pos({ x = 6, y = 2 })
elseif card.ability.extra == "purple" then
card.children.center:set_sprite_pos({ x = 6, y = 3 })
elseif card.ability.extra == "green" then
card.children.center:set_sprite_pos({ x = 6, y = 1 })
end
end
end,
cry_credits = {
idea = {
"Zak",
},
art = {
"5381",
},
code = {
"AlexZGreat",
},
},
}
local chad = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Chad",
key = "chad",
pos = { x = 0, y = 3 },
order = 71,
config = { extra = { retriggers = 2 } },
pools = { ["Meme"] = true },
rarity = 3,
cost = 10,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { math.min(25, center.ability.extra.retriggers) } }
end,
atlas = "atlasone",
calculate = function(self, card, context)
if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= self then
if context.other_card == G.jokers.cards[1] then
return {
message = localize("k_again_ex"),
repetitions = math.min(25, card.ability.extra.retriggers),
card = card,
}
else
return nil, true
end
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"SDM_0",
},
code = {
"Math",
},
},
}
local jimball = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Jimball",
key = "jimball",
pos = { x = 0, y = 0 },
pixel_size = { w = 57 / 69 * 71, h = 57 / 69 * 71 },
order = 8,
config = { x_mult = 1, extra = 0.15, override_x_mult_check = true },
pools = { ["Meme"] = true },
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra, center.ability.x_mult } }
end,
rarity = 3,
cost = 9,
blueprint_compat = true,
perishable_compat = false,
calculate = function(self, card, context)
if context.before and not context.blueprint then
local reset = false
local play_more_than = (G.GAME.hands[context.scoring_name].played or 0)
for k, v in pairs(G.GAME.hands) do
if k ~= context.scoring_name and v.played >= play_more_than and v.visible then
reset = true
end
end
if reset then
if to_big(card.ability.x_mult) > to_big(1) then
card.ability.x_mult = 1
return {
card = self,
message = localize("k_reset"),
}
end
else
card.ability.x_mult = card.ability.x_mult + card.ability.extra
return nil, true
end
end
end,
add_to_deck = function(self, card, from_debuff)
if not from_debuff then
Cryptid.notification_overlay("jimball")
end
end,
atlas = "jimball",
cry_credits = {
idea = {
"Math",
},
art = {
"Grazzy",
"Zakosek Artworks",
},
code = {
"Math",
},
},
unlocked = false,
check_for_unlock = function(self, args)
if args.type == "win" then
local hand = nil
for k, v in pairs(G.GAME.hands) do
if G.GAME.hands[k].played ~= 0 then
if not hand then
hand = G.GAME.hands[k]
else
return
end
end
end
return true
end
if args.type == "cry_lock_all" then
lock_card(self)
end
if args.type == "cry_unlock_all" then
unlock_card(self)
end
end,
init = function(self)
G.FUNCS.notif_jimball = function()
Cryptid_config.Cryptid.jimball_music = false
G:save_settings()
G.FUNCS:exit_overlay_menu()
-- todo: autosave settings (Not sure if this autosaves it)
end
end,
}
local jimball_sprite = { --left this one on it's own atlas for obvious reasons
object_type = "Atlas",
key = "jimball",
path = "j_cry_jimball.png",
px = 71,
py = 95,
}
local sus = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-SUS",
key = "sus",
pos = { x = 1, y = 3 },
pools = { ["Meme"] = true },
rarity = 3,
cost = 7,
order = 79,
blueprint_compat = true,
atlas = "atlasone",
calculate = function(self, card, context)
local function is_impostor(card)
return card.base.value and SMODS.Ranks[card.base.value].key == "King" and card:is_suit("Hearts")
end
if
context.end_of_round
and context.cardarea == G.jokers
and not context.blueprint
and not context.retrigger_joker
then
if not card.ability.used_round or card.ability.used_round ~= G.GAME.round then
card.ability.chosen_card = nil
end
local choosable_cards = {}
local has_impostor = false
for i = 1, #G.hand.cards do
if not G.hand.cards[i].murdered_by_impostor then
choosable_cards[#choosable_cards + 1] = G.hand.cards[i]
if is_impostor(G.hand.cards[i]) then
has_impostor = true
end
end
end
if has_impostor then
choosable_cards = {}
for i = 1, #G.hand.cards do
if not G.hand.cards[i].murdered_by_impostor and is_impostor(G.hand.cards[i]) then
choosable_cards[#choosable_cards + 1] = G.hand.cards[i]
end
end
end
card.ability.chosen_card = card.ability.chosen_card
or pseudorandom_element(choosable_cards, pseudoseed("cry_sus"))
if not card.ability.used_round or card.ability.used_round ~= G.GAME.round then
card.ability.used_round = G.GAME.round
local deletable_cards = {}
for k, v in pairs(G.hand.cards) do
if not v.ability.eternal and not is_impostor(v) then
deletable_cards[#deletable_cards + 1] = v
end
end
if #deletable_cards ~= 0 then
local _first_dissolve = nil
for j = 1, #G.jokers.cards do
eval_card(
G.jokers.cards[j],
{ cardarea = G.jokers, remove_playing_cards = true, removed = deletable_cards }
)
end
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 0.75,
func = function()
for k, v in pairs(deletable_cards) do
if v ~= card.ability.chosen_card then
v.murdered_by_impostor = true
v:start_dissolve(nil, _first_dissolve)
_first_dissolve = true
end
end
return true
end,
}))
end
end
if card.ability.chosen_card ~= nil then
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 0.4,
func = function()
card:juice_up(0.3, 0.4)
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
local _c = copy_card(card.ability.chosen_card, nil, nil, G.playing_card)
_c:start_materialize()
_c:add_to_deck()
G.deck.config.card_limit = G.deck.config.card_limit + 1
table.insert(G.playing_cards, _c)
G.hand:emplace(_c)
playing_card_joker_effects({ _c })
return true
end,
}))
return { message = localize("cry_sus_ex") }
end
end
end,
cry_credits = {
idea = {
"Math",
},
art = {
"Jevonn",
"unexian",
},
code = {
"Math",
},
},
}
local fspinner = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-fspinner",
key = "fspinner",
pos = { x = 4, y = 0 },
config = { extra = { chips = 0, chip_mod = 6 } },
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.chips, center.ability.extra.chip_mod } }
end,
rarity = 1,
cost = 5,
order = 77,
blueprint_compat = true,
perishable_compat = false,
calculate = function(self, card, context)
if context.before and not context.blueprint then
local play_more_than = (G.GAME.hands[context.scoring_name].played or 0)
for k, v in pairs(G.GAME.hands) do
if k ~= context.scoring_name and v.played >= play_more_than and v.visible then
card.ability.extra.chips = card.ability.extra.chips + card.ability.extra.chip_mod
return {
message = localize("k_upgrade_ex"),
card = card,
}
end
end
end
if context.joker_main and (to_big(card.ability.extra.chips) > to_big(0)) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.extra.chips } }),
chip_mod = card.ability.extra.chips,
}
end
end,
atlas = "atlasone",
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Jevonn",
"George the Rat",
},
code = {
"Jevonn",
},
},
}
local waluigi = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Waluigi",
key = "waluigi",
pos = { x = 0, y = 3 },
soul_pos = { x = 1, y = 3 },
config = { extra = { Xmult = 2.5 } },
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.Xmult } }
end,
rarity = 4,
cost = 20,
order = 87,
blueprint_compat = true,
calculate = function(self, card, context)
if context.other_joker and context.other_joker.ability.set == "Joker" then
if not Talisman.config_file.disable_anims then
G.E_MANAGER:add_event(Event({
func = function()
context.other_joker:juice_up(0.5, 0.5)
return true
end,
}))
end
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.Xmult } }),
Xmult_mod = card.ability.extra.Xmult,
}
end
end,
atlas = "atlastwo",
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Math",
},
},
}
local wario = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-wario",
key = "wario",
order = 88,
pos = { x = 2, y = 3 },
soul_pos = { x = 3, y = 3 },
config = { extra = { money = 3 } },
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.money } }
end,
calculate = function(self, card, context)
if context.post_trigger then
return {
dollars = card.ability.extra.money,
card = context.other_context.blueprint_card or context.other_card,
-- This function isn't working properly :sob:
--[[func = function()
G.E_MANAGER:add_event(Event({
func = function()
if not Talisman.config_file.disable_anims then
(context.blueprint_card or card):juice_up(0.5, 0.5)
end
return true
end,
}))
return true
end,--]]
}
end
end,
rarity = 4,
cost = 20,
blueprint_compat = true,
atlas = "atlasthree",
cry_credits = {
idea = {
"Auto Watto",
},
art = {
"MarioFan597",
},
code = {
"Auto Watto",
},
},
}
local krustytheclown = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-krustytheclown",
key = "krustytheclown",
pos = { x = 3, y = 4 },
config = { extra = { extra = 0.02, x_mult = 1 } },
pools = { ["Meme"] = true },
rarity = 2,
order = 31,
cost = 7,
perishable_compat = false,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.extra, center.ability.extra.x_mult } }
end,
atlas = "atlasone",
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.extra.x_mult) > to_big(1)) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }),
Xmult_mod = card.ability.extra.x_mult,
}
end
if context.cardarea == G.play and context.individual and not context.blueprint then
card.ability.extra.x_mult = card.ability.extra.x_mult + card.ability.extra.extra
return {
extra = { focus = card, message = localize("k_upgrade_ex") },
card = card,
colour = G.C.MULT,
}
end
end,
cry_credits = {
idea = {
"Izumi",
},
art = {
"Jevonn",
},
code = {
"Jevonn",
},
},
}
local blurred = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-blurred Joker",
key = "blurred",
pos = { x = 4, y = 4 },
pools = { ["Meme"] = true },
config = { extra = 1 },
rarity = 1,
cost = 4,
order = 51,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra } }
end,
atlas = "atlastwo",
calculate = function(self, card, context)
if context.setting_blind and not (context.blueprint_card or card).getting_sliced then
G.E_MANAGER:add_event(Event({
func = function()
ease_hands_played(card.ability.extra)
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize({ type = "variable", key = "a_hands", vars = { card.ability.extra } }) }
)
return true
end,
}))
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Jevonn",
},
code = {
"Jevonn",
},
},
}
local gardenfork = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-gardenfork",
key = "gardenfork",
pos = { x = 0, y = 1 },
config = { extra = { money = 7 } },
rarity = 3,
cost = 7,
order = 66,
blueprint_compat = true,
atlas = "atlasone",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.money } }
end,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.before and context.full_hand then
local has_ace = false
local has_7 = false
for i = 1, #context.full_hand do
if context.full_hand[i]:get_id() == 14 then
has_ace = true
elseif context.full_hand[i]:get_id() == 7 then
has_7 = true
end
end
if has_ace and has_7 then
ease_dollars(card.ability.extra.money)
return { message = "$" .. card.ability.extra.money, colour = G.C.MONEY }
end
end
end,
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Jevonn",
},
},
}
local lightupthenight = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-lightupthenight",
key = "lightupthenight",
config = { extra = { xmult = 1.5 } },
pos = { x = 1, y = 1 },
atlas = "atlasone",
rarity = 3,
cost = 7,
order = 67,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.xmult } }
end,
calculate = function(self, card, context)
if context.cardarea == G.play and context.individual then
local rank = context.other_card:get_id()
if rank == 2 or rank == 7 then
return {
x_mult = card.ability.extra.xmult,
colour = G.C.RED,
card = card,
}
end
end
end,
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Jevonn",
},
},
}
local nosound = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-nosound",
key = "nosound",
config = { extra = { retriggers = 3 } },
pos = { x = 2, y = 1 },
atlas = "atlasone",
rarity = 3,
order = 68,
cost = 7,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.retriggers } }
end,
calculate = function(self, card, context)
if context.repetition then
if context.cardarea == G.play then
if context.other_card:get_id() == 7 then
return {
message = localize("k_again_ex"),
repetitions = card.ability.extra.retriggers,
card = card,
}
end
end
end
end,
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Jevonn",
},
},
}
local antennastoheaven = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-antennastoheaven",
key = "antennastoheaven",
pos = { x = 3, y = 1 },
config = { extra = { bonus = 0.1, x_chips = 1 } },
rarity = 3,
cost = 7,
order = 69,
perishable_compat = false,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.bonus, center.ability.extra.x_chips } }
end,
atlas = "atlasone",
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.extra.x_chips) > to_big(1)) then
return {
message = localize({
type = "variable",
key = "a_xchips",
vars = { number_format(card.ability.extra.x_chips) },
}),
Xchip_mod = card.ability.extra.x_chips,
colour = G.C.CHIPS,
}
end
if context.cardarea == G.play and context.individual and not context.blueprint then
local rank = context.other_card:get_id()
if rank == 4 or rank == 7 then
card.ability.extra.x_chips = card.ability.extra.x_chips + card.ability.extra.bonus
return {
extra = { focus = card, message = localize("k_upgrade_ex") },
card = card,
colour = G.C.CHIPS,
}
end
end
end,
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Jevonn",
},
},
}
local hunger = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-hunger",
key = "hunger",
config = { extra = { money = 3 } },
extra_gamesets = { "exp_modest" },
gameset_config = {
exp_modest = { extra = { money = 2 } },
},
pos = { x = 3, y = 0 },
rarity = 2,
cost = 6,
order = 80,
blueprint_compat = true,
atlas = "atlastwo",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.money } }
end,
calculate = function(self, card, context) -- haha one liner
return context.using_consumeable and { p_dollars = card.ability.extra.money }
end,
cry_credits = {
idea = {
"Mjiojio",
},
art = {
"AlexZGreat",
},
code = {
"Jevonn",
},
},
}
local weegaming = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-weegaming",
key = "weegaming",
order = 62,
config = { extra = { retriggers = 2 } },
pos = { x = 3, y = 4 },
atlas = "atlastwo",
rarity = 1,
cost = 5,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.retriggers } }
end,
calculate = function(self, card, context)
if context.repetition then
if context.cardarea == G.play then
if context.other_card:get_id() == 2 then
return {
message = localize("k_again_ex"),
repetitions = card.ability.extra.retriggers,
card = card,
}
end
end
end
end,
cry_credits = {
idea = {
"Gold",
},
art = {
"Mystic Misclick",
},
code = {
"Jevonn",
},
},
}
local redbloon = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-redbloon",
key = "redbloon",
config = { extra = { money = 20, rounds_remaining = 2 } },
pos = { x = 5, y = 1 },
rarity = 1,
cost = 4,
order = 97,
blueprint_compat = false,
eternal_compat = false,
perishable_compat = false,
atlas = "atlasone",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.money, center.ability.extra.rounds_remaining } }
end,
calculate = function(self, card, context)
if
context.end_of_round
and not context.blueprint
and not context.individual
and not context.repetition
and not context.retrigger_joker
then
card.ability.extra.rounds_remaining = card.ability.extra.rounds_remaining - 1
if card.ability.extra.rounds_remaining > 0 then
return {
message = { localize("cry_minus_round") },
colour = G.C.FILTER,
}
else
ease_dollars(card.ability.extra.money)
G.E_MANAGER:add_event(Event({
func = function()
play_sound("tarot1")
card.T.r = -0.2
card:juice_up(0.3, 0.4)
card.states.drag.is = true
card.children.center.pinch.x = true
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.3,
blockable = false,
func = function()
G.jokers:remove_card(card)
card:remove()
card = nil
return true
end,
}))
return true
end,
}))
return {
message = "$" .. card.ability.extra.money,
colour = G.C.MONEY,
}
end
end
end,
cry_credits = {
idea = {
"Roguefort Cookie",
},
art = {
"Darren_The_Frog",
},
code = {
"Jevonn",
},
},
}
local apjoker = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-AP Joker",
key = "apjoker",
pos = { x = 2, y = 0 },
config = { extra = { x_mult = 4 } },
rarity = 2,
cost = 6,
order = 37,
blueprint_compat = true,
perishable_compat = false,
atlas = "atlasone",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.x_mult } }
end,
calculate = function(self, card, context)
if context.joker_main and G.GAME.blind.boss then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }),
Xmult_mod = card.ability.extra.x_mult,
}
end
end,
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Jevonn",
},
},
}
local maze = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-maze",
key = "maze",
pos = { x = 1, y = 1 },
rarity = 1,
cost = 1,
order = 61,
immutable = true,
atlas = "atlastwo",
update = function(self, card, dt)
if G.STAGE == G.STAGES.RUN then
if G.GAME.current_round.hands_played > 0 then
G.GAME.current_round.hands_played = 0
end
if G.GAME.current_round.discards_used > 0 then
G.GAME.current_round.discards_used = 0
end
end
end,
add_to_deck = function(self, card, from_debuff)
if G.GAME.current_round.hands_played > 0 then
G.GAME.current_round.hands_played = 0
end
if G.GAME.current_round.discards_used > 0 then
G.GAME.current_round.discards_used = 0
end
end,
cry_credits = {
idea = {
"zy-b-org",
},
art = {
"Math",
},
code = {
"Jevonn",
},
},
}
--Fixed Jank for the most part. Other modded jokers may still be jank depending on how they are implemented
--funny side effect of this fix causes trading card and dna to juice up like craaazy lol
local panopticon = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-panopticon",
key = "panopticon",
pos = { x = 1, y = 4 },
config = {
extra = {},
},
rarity = 1,
order = 47,
cost = 1,
immutable = true,
atlas = "atlastwo",
calculate = function(self, card, context)
if context.before and not context.blueprint and not context.retrigger_joker then
if not G.GAME.cry_panop_juggle then
G.GAME.cry_panop_juggle = G.GAME.current_round.hands_left
end
G.GAME.current_round.hands_left = 0
end
if context.after and not context.blueprint and not context.retrigger_joker then
if G.GAME.cry_panop_juggle then
G.GAME.current_round.hands_left = G.GAME.cry_panop_juggle
G.GAME.cry_panop_juggle = nil
end
end
end,
cry_credits = {
idea = {
"Samario",
},
art = {
"Samario",
},
code = {
"Samario",
"Toneblock",
},
},
}
local magnet = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-magnet",
key = "magnet",
pos = { x = 4, y = 0 },
pixel_size = { w = 35, h = 35 },
config = { extra = { money = 2, Xmoney = 5, slots = 4 } },
rarity = 1,
cost = 6,
order = 96,
blueprint_compat = false,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.money, center.ability.extra.Xmoney, center.ability.extra.slots } }
end,
atlas = "atlastwo",
calc_dollar_bonus = function(self, card)
if #G.jokers.cards <= card.ability.extra.slots then
return card.ability.extra.money * card.ability.extra.Xmoney
else
return card.ability.extra.money
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Jevonn",
},
code = {
"Jevonn",
},
},
}
local unjust_dagger = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Unjust Dagger",
key = "unjust_dagger",
pos = { x = 3, y = 0 },
config = { extra = { x_mult = 1 } },
rarity = 2,
cost = 8,
order = 102,
perishable_compat = false,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.x_mult } }
end,
atlas = "atlasone",
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and (card.ability.extra.x_mult > 1) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }),
Xmult_mod = card.ability.extra.x_mult,
}
end
local my_pos = nil
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
my_pos = i
break
end
end
if
context.setting_blind
and not (context.blueprint_card or self).getting_sliced
and my_pos
and G.jokers.cards[my_pos - 1]
and not G.jokers.cards[my_pos - 1].ability.eternal
and not G.jokers.cards[my_pos - 1].getting_sliced
then
local sliced_card = G.jokers.cards[my_pos - 1]
sliced_card.getting_sliced = true
if sliced_card.config.center.rarity == "cry_exotic" then
check_for_unlock({ type = "what_have_you_done" })
end
G.GAME.joker_buffer = G.GAME.joker_buffer - 1
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.joker_buffer = 0
card.ability.extra.x_mult = card.ability.extra.x_mult + sliced_card.sell_cost * 0.2
card:juice_up(0.8, 0.8)
sliced_card:start_dissolve({ HEX("57ecab") }, nil, 1.6)
play_sound("slice1", 0.96 + math.random() * 0.08)
return true
end,
}))
card_eval_status_text(card, "extra", nil, nil, nil, {
message = localize({
type = "variable",
key = "a_xmult",
vars = { card.ability.extra.x_mult + 0.2 * sliced_card.sell_cost },
}),
colour = G.C.RED,
no_juice = true,
})
return nil, true
end
end,
cry_credits = {
idea = {
"Mystic Misclick",
},
art = {
"Mystic Misclick",
},
code = {
"Mystic Misclick",
},
},
}
local monkey_dagger = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Monkey Dagger",
key = "monkey_dagger",
pos = { x = 4, y = 3 },
config = { extra = { chips = 0 } },
rarity = 2,
cost = 6,
order = 49,
perishable_compat = false,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.chips } }
end,
atlas = "atlastwo",
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.extra.chips) > to_big(0)) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.extra.chips } }),
chip_mod = card.ability.extra.chips,
}
end
local my_pos = nil
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
my_pos = i
break
end
end
if
context.setting_blind
and not (context.blueprint_card or self).getting_sliced
and my_pos
and G.jokers.cards[my_pos - 1]
and not G.jokers.cards[my_pos - 1].ability.eternal
and not G.jokers.cards[my_pos - 1].getting_sliced
then
local sliced_card = G.jokers.cards[my_pos - 1]
sliced_card.getting_sliced = true
if sliced_card.config.center.rarity == "cry_exotic" then
check_for_unlock({ type = "what_have_you_done" })
end
G.GAME.joker_buffer = G.GAME.joker_buffer - 1
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.joker_buffer = 0
card.ability.extra.chips = card.ability.extra.chips + sliced_card.sell_cost * 10
card:juice_up(0.8, 0.8)
sliced_card:start_dissolve({ HEX("57ecab") }, nil, 1.6)
play_sound("slice1", 0.96 + math.random() * 0.08)
return true
end,
}))
card_eval_status_text(card, "extra", nil, nil, nil, {
message = localize({
type = "variable",
key = "a_chips",
vars = { card.ability.extra.chips + 10 * sliced_card.sell_cost },
}),
colour = G.C.CHIPS,
no_juice = true,
})
return nil, true
end
end,
cry_credits = {
idea = {
"Mystic Misclick",
},
art = {
"Mystic Misclick",
},
code = {
"Mystic Misclick",
},
},
}
local pirate_dagger = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Pirate Dagger",
key = "pirate_dagger",
pos = { x = 3, y = 3 },
config = { extra = { x_chips = 1 } },
rarity = 2,
cost = 8,
order = 103,
perishable_compat = false,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.x_chips } }
end,
atlas = "atlastwo",
calculate = function(self, card, context)
if context.joker_main and (card.ability.extra.x_chips > 1) then
return {
message = localize({ type = "variable", key = "a_xchips", vars = { card.ability.extra.x_chips } }),
Xchip_mod = card.ability.extra.x_chips,
}
end
local my_pos = nil
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
my_pos = i
break
end
end
if
context.setting_blind
and not (context.blueprint_card or self).getting_sliced
and my_pos
and G.jokers.cards[my_pos + 1]
and not G.jokers.cards[my_pos + 1].ability.eternal
and not G.jokers.cards[my_pos + 1].getting_sliced
then
local sliced_card = G.jokers.cards[my_pos + 1]
sliced_card.getting_sliced = true
if sliced_card.config.center.rarity == "cry_exotic" then
check_for_unlock({ type = "what_have_you_done" })
end
G.GAME.joker_buffer = G.GAME.joker_buffer - 1
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.joker_buffer = 0
card.ability.extra.x_chips = card.ability.extra.x_chips + sliced_card.sell_cost * 0.25
card:juice_up(0.8, 0.8)
sliced_card:start_dissolve({ HEX("57ecab") }, nil, 1.6)
play_sound("slice1", 0.96 + math.random() * 0.08)
return true
end,
}))
card_eval_status_text(card, "extra", nil, nil, nil, {
message = localize({
type = "variable",
key = "a_xchips",
vars = { card.ability.extra.x_chips + 0.25 * sliced_card.sell_cost },
}),
colour = G.C.CHIPS,
no_juice = true,
})
return nil, true
end
end,
cry_credits = {
idea = {
"Mystic Misclick",
},
art = {
"Mystic Misclick",
},
code = {
"Mystic Misclick",
},
},
}
local mondrian = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-mondrian",
key = "mondrian",
pos = { x = 5, y = 3 },
config = { extra = { extra = 0.25, x_mult = 1 } },
rarity = 2,
cost = 7,
order = 44,
perishable_compat = false,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.extra, center.ability.extra.x_mult } }
end,
atlas = "atlastwo",
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.extra.x_mult) > to_big(1)) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }),
Xmult_mod = card.ability.extra.x_mult,
}
end
if
context.end_of_round
and G.GAME.current_round.discards_used == 0
and not context.blueprint
and not context.individual
and not context.repetition
then
card.ability.extra.x_mult = card.ability.extra.x_mult + card.ability.extra.extra
return {
message = localize("k_upgrade_ex"),
card = card,
}
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Jevonn",
},
code = {
"Jevonn",
},
},
}
local sapling = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-sapling",
key = "sapling",
pos = { x = 3, y = 2 }, --todo animations
config = { extra = { score = 0, req = 18, check = nil } },
rarity = 2,
cost = 6,
order = 42,
blueprint_compat = false,
eternal_compat = false,
loc_vars = function(self, info_queue, center)
return {
vars = {
center.ability.extra.score,
center.ability.extra.req,
Cryptid.enabled("set_cry_epic") == true and localize("k_cry_epic") or localize("k_rare"),
colours = { G.C.RARITY[Cryptid.enabled("set_cry_epic") == true and "cry_epic" or 3] },
Cryptid.enabled("set_cry_epic") == true and localize("cry_sapling_an") or localize("cry_sapling_a"),
},
}
end,
atlas = "atlasone",
calculate = function(self, card, context)
if
context.individual
and context.cardarea == G.play
and not context.blueprint
and not context.retrigger_joker
then
if context.other_card.ability.effect ~= "Base" then
card.ability.extra.score = card.ability.extra.score + 1
if card.ability.extra.score >= card.ability.extra.req and not card.ability.extra.check then
card.ability.extra.check = true --Prevents violent juice up spam when playing enchanced cards while already active
local eval = function(card)
return not card.REMOVED
end
juice_card_until(card, eval, true)
end
end
elseif context.selling_self and not context.blueprint and not context.retrigger_joker then
if card.ability.extra.score >= card.ability.extra.req then
local value = Cryptid.enabled("set_cry_epic") == true and "cry_epic" or 0.99
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_plus_joker"), colour = G.C.RARITY["cry_epic"] }
)
local card = create_card("Joker", G.jokers, nil, value, nil, nil, nil, "cry_sapling")
card:add_to_deck()
G.jokers:emplace(card)
card:start_materialize()
return nil, true
else
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_nope_ex"), colour = G.C.RARITY["cry_epic"] }
)
end
end
end,
cry_credits = {
idea = {
"Mjiojio",
},
art = {
"Jevonn",
"George the Rat",
},
code = {
"Jevonn",
},
},
}
local spaceglobe = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-spaceglobe",
key = "spaceglobe",
pos = { x = 1, y = 4 },
config = { extra = { x_chips = 1, Xchipmod = 0.2, type = "High Card" } },
rarity = 3,
cost = 8,
order = 73,
blueprint_compat = true,
perishable_compat = false,
loc_vars = function(self, info_queue, center)
return {
vars = {
center.ability.extra.x_chips,
center.ability.extra.Xchipmod,
localize(center.ability.extra.type, "poker_hands"),
},
}
end,
atlas = "atlasone",
set_ability = function(self, card, initial, delay_sprites)
local _poker_hands = {}
for k, v in pairs(G.GAME.hands) do
if v.visible then
_poker_hands[#_poker_hands + 1] = k
end
end
card.ability.extra.type = pseudorandom_element(_poker_hands, pseudoseed("cry_space_globe"))
end,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.before and not context.blueprint then
if context.scoring_name == card.ability.extra.type then
G.E_MANAGER:add_event(Event({
func = function()
local _type = {}
for k, v in pairs(G.GAME.hands) do
if v.visible and k ~= card.ability.extra.type then
_type[#_type + 1] = k
end
end
card.ability.extra.type = pseudorandom_element(_type, pseudoseed("cry_space_globe"))
return true
end,
}))
card.ability.extra.x_chips = card.ability.extra.x_chips + card.ability.extra.Xchipmod
return {
message = localize("k_upgrade_ex"),
card = card,
colour = G.C.CHIPS,
}
end
end
if context.joker_main and (to_big(card.ability.extra.x_chips) > to_big(1)) then
return {
message = localize({
type = "variable",
key = "a_xchips",
vars = { number_format(card.ability.extra.x_chips) },
}),
Xchip_mod = card.ability.extra.x_chips,
colour = G.C.CHIPS,
}
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Selicre",
},
code = {
"Jevonn",
},
},
}
local happy = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-happy",
key = "happy",
pos = { x = 2, y = 1 },
rarity = 1,
cost = 2,
order = 63,
immutable = true,
blueprint_compat = true,
eternal_compat = false,
atlas = "atlastwo",
calculate = function(self, card, context)
if context.selling_self and #G.jokers.cards + G.GAME.joker_buffer <= G.jokers.config.card_limit then
local sellcreatejoker = 1
G.GAME.joker_buffer = G.GAME.joker_buffer + sellcreatejoker
G.E_MANAGER:add_event(Event({
func = function()
for i = 1, sellcreatejoker do
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "happy")
card:add_to_deck()
G.jokers:emplace(card)
card:start_materialize()
G.GAME.joker_buffer = 0
end
return true
end,
}))
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize("k_plus_joker"), colour = G.C.BLUE }
)
return nil, true
end
if
context.end_of_round
and not context.individual
and not context.repetition
and #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit
then
local roundcreatejoker = math.min(1, G.jokers.config.card_limit - (#G.jokers.cards + G.GAME.joker_buffer))
G.GAME.joker_buffer = G.GAME.joker_buffer + roundcreatejoker
G.E_MANAGER:add_event(Event({
func = function()
if roundcreatejoker > 0 then
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "happy")
card:add_to_deck()
G.jokers:emplace(card)
card:start_materialize()
G.GAME.joker_buffer = 0
end
return true
end,
}))
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize("k_plus_joker"), colour = G.C.BLUE }
)
return nil, true
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Jevonn",
},
code = {
"Jevonn",
},
},
}
local meteor = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-meteor",
key = "meteor",
pos = { x = 0, y = 2 },
config = { extra = { chips = 75 } },
loc_vars = function(self, info_queue, center)
if not center.edition or (center.edition and not center.edition.foil) then
info_queue[#info_queue + 1] = G.P_CENTERS.e_foil
end
return { vars = { center.ability.extra.chips } }
end,
rarity = 1,
cost = 4,
order = 38,
blueprint_compat = true,
calculate = function(self, card, context)
if
context.other_joker
and context.other_joker.edition
and context.other_joker.edition.foil == true
and card ~= context.other_joker
then
if not Talisman.config_file.disable_anims then
G.E_MANAGER:add_event(Event({
func = function()
context.other_joker:juice_up(0.5, 0.5)
return true
end,
}))
end
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.extra.chips } }),
chip_mod = card.ability.extra.chips,
}
end
if context.individual and context.cardarea == G.play then
if context.other_card.edition and context.other_card.edition.foil == true then
return {
chips = card.ability.extra.chips,
colour = G.C.CHIPS,
card = card,
}
end
end
if
context.individual
and context.cardarea == G.hand
and context.other_card.edition
and context.other_card.edition.foil == true
and not context.end_of_round
then
if context.other_card.debuff then
return {
message = localize("k_debuffed"),
colour = G.C.RED,
card = card,
}
else
return {
chips = card.ability.extra.chips, --this doesn't exist yet :pensive: if only...
card = card,
}
end
end
end,
atlas = "atlastwo",
cry_credits = {
idea = {
"Mystic Misclick",
},
art = {
"Linus Goof Balls",
},
code = {
"Jevonn",
},
},
}
local exoplanet = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-exoplanet",
key = "exoplanet",
pos = { x = 1, y = 2 },
config = { extra = { mult = 15 } },
loc_vars = function(self, info_queue, center)
if not center.edition or (center.edition and not center.edition.holo) then
info_queue[#info_queue + 1] = G.P_CENTERS.e_holo
end
return { vars = { center.ability.extra.mult } }
end,
rarity = 1,
order = 39,
cost = 3,
blueprint_compat = true,
calculate = function(self, card, context)
if
context.other_joker
and context.other_joker.edition
and context.other_joker.edition.holo == true
and card ~= context.other_joker
then
if not Talisman.config_file.disable_anims then
G.E_MANAGER:add_event(Event({
func = function()
context.other_joker:juice_up(0.5, 0.5)
return true
end,
}))
end
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.extra.mult } }),
mult_mod = card.ability.extra.mult,
}
end
if context.individual and context.cardarea == G.play then
if context.other_card.edition and context.other_card.edition.holo == true then
return {
mult = card.ability.extra.mult,
colour = G.C.MULT,
card = card,
}
end
end
if
context.individual
and context.cardarea == G.hand
and context.other_card.edition
and context.other_card.edition.holo == true
and not context.end_of_round
then
if context.other_card.debuff then
return {
message = localize("k_debuffed"),
colour = G.C.RED,
card = card,
}
else
return {
h_mult = card.ability.extra.mult,
card = card,
}
end
end
end,
atlas = "atlastwo",
cry_credits = {
idea = {
"Mystic Misclick",
},
art = {
"Linus Goof Balls",
},
code = {
"Jevonn",
},
},
}
local stardust = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-stardust",
key = "stardust",
pos = { x = 2, y = 2 },
config = { extra = { xmult = 2 } },
loc_vars = function(self, info_queue, center)
if not center.edition or (center.edition and not center.edition.polychrome) then
info_queue[#info_queue + 1] = G.P_CENTERS.e_polychrome
end
return { vars = { center.ability.extra.xmult } }
end,
rarity = 1,
cost = 2,
order = 40,
blueprint_compat = true,
calculate = function(self, card, context)
if
context.other_joker
and context.other_joker.edition
and context.other_joker.edition.polychrome == true
and card ~= context.other_joker
then
if not Talisman.config_file.disable_anims then
G.E_MANAGER:add_event(Event({
func = function()
context.other_joker:juice_up(0.5, 0.5)
return true
end,
}))
end
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.xmult } }),
Xmult_mod = card.ability.extra.xmult,
}
end
if context.individual and context.cardarea == G.play then
if context.other_card.edition and context.other_card.edition.polychrome == true then
return {
x_mult = card.ability.extra.xmult,
colour = G.C.MULT,
card = card,
}
end
end
if
context.individual
and context.cardarea == G.hand
and context.other_card.edition
and context.other_card.edition.polychrome == true
and not context.end_of_round
then
if context.other_card.debuff then
return {
message = localize("k_debuffed"),
colour = G.C.RED,
card = card,
}
else
return {
x_mult = card.ability.extra.xmult,
card = card,
}
end
end
end,
atlas = "atlastwo",
cry_credits = {
idea = {
"Mystic Misclick",
},
art = {
"Linus Goof Balls",
},
code = {
"Jevonn",
},
},
}
local rnjoker = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-rnjoker Joker", --:balatrojoker:
key = "rnjoker",
pos = { x = 5, y = 4 },
config = {},
order = 59,
loc_vars = function(self, info_queue, card)
local vars = {
vars = {
(card.ability.extra and card.ability.extra.value_mod and card.ability.extra.value) or 0,
(card.ability.extra and card.ability.extra.value and card.ability.extra.value_mod)
or (card.ability.extra and card.ability.extra.value)
or 0,
card.ability.extra and card.ability.extra.cond_value or 0,
cry_prob(
card.ability.cry_prob,
card.ability.extra and card.ability.extra.cond_value or 0,
card.ability.cry_rigged
),
},
}
if card.ability.extra and card.ability.extra.color then
vars.vars.colours = { card.ability.extra.color }
end
return vars
end,
rarity = 2,
cost = 6,
blueprint_compat = true,
set_ability = function(self, card, initial, delay_sprites)
card.ability.abilities = {}
Cryptid.rnjoker_randomize(card)
end,
calculate = function(self, card, context)
if card.ability and card.ability.abilities then
for i, j in ipairs(card.ability.abilities) do
local j_context = j.context
local indiv = false
if j_context ~= "cry_payout" then
local valid_context = not not context[j.context]
if j.scale_value and context.blueprint then
valid_context = false
end
if (j_context == "playing_card_added") and card.getting_sliced then
valid_context = false
end
if (j_context == "setting_blind") and card.getting_sliced then
valid_context = false
end
if (j_context == "setting_blind") and card.getting_sliced then
valid_context = false
end
if (j_context == "before") and (card.area ~= G.jokers) then
valid_context = false
end
if (j_context == "after") and (card.area ~= G.jokers) then
valid_context = false
end
if (j_context == "joker_main") and (card.area ~= G.jokers) then
valid_context = false
end
if (j_context == "end_of_round") and (context.repetition or context.individual) then
valid_context = false
end
if
(j_context == "individual_play")
and context.individual
and not context.repetition
and (context.cardarea == G.play)
then
valid_context = true
indiv = true
end
if
(j_context == "individual_hand_score")
and context.individual
and not context.repetition
and (context.cardarea == G.hand)
and not context.end_of_round
then
valid_context = true
indiv = true
end
if
(j_context == "individual_hand_end")
and context.individual
and not context.repetition
and (context.cardarea == G.hand and context.end_of_round)
then
valid_context = true
indiv = true
end
if (j_context == "repetition_play") and context.repetition and (context.cardarea == G.play) then
valid_context = true
end
if (j_context == "repetition_hand") and context.repetition and (context.cardarea == G.hand) then
valid_context = true
end
if valid_context then
local cond_passed = false
local times_passed = 1
if j.cond then
if j.cond == "buy_common" then
if
context.card
and context.card.ability
and (context.card.ability.set == "Joker")
and (context.card.config.center.rarity == 1)
then
cond_passed = true
end
elseif j.cond == "buy_uncommon" then
if
context.card
and context.card.ability
and (context.card.ability.set == "Joker")
and (context.card.config.center.rarity == 2)
then
cond_passed = true
end
elseif j.cond == "tarot" then
local card = context.card or context.consumeable
if card and card.ability and (card.ability.set == "Tarot") then
cond_passed = true
end
elseif j.cond == "planet" then
local card = context.card or context.consumeable
if card and card.ability and (card.ability.set == "Planet") then
cond_passed = true
end
elseif j.cond == "spectral" then
local card = context.card or context.consumeable
if card and card.ability and (card.ability.set == "Spectral") then
cond_passed = true
end
elseif j.cond == "joker" then
if context.card and context.card.ability and (context.card.ability.set == "Joker") then
cond_passed = true
end
elseif j.cond == "suit" then
times_passed = 0
local cards = context.cards
if cards == nil then
cards = context.removed
end
if cards == nil then
cards = { context.other_card }
end
for i2, j2 in ipairs(cards) do
if j2:is_suit(j.suit) then
cond_passed = true
times_passed = times_passed + 1
end
end
elseif j.cond == "rank" then
times_passed = 0
local cards = context.cards
if cards == nil then
cards = context.removed
end
if cards == nil then
cards = { context.other_card }
end
for i2, j2 in ipairs(cards) do
if j2:get_id() == j.rank then
cond_passed = true
times_passed = times_passed + 1
end
end
elseif j.cond == "face" then
times_passed = 0
local cards = context.cards
if cards == nil then
cards = context.removed
end
if cards == nil then
cards = { context.other_card }
end
for i2, j2 in ipairs(cards) do
if j2:is_face() then
cond_passed = true
times_passed = times_passed + 1
end
end
elseif j.cond == "boss" then
if context.blind.boss and not (context.blind.config and context.blind.config.bonus) then
cond_passed = true
end
elseif j.cond == "non_boss" then
if context.blind and not G.GAME.blind.boss then
cond_passed = true
end
elseif j.cond == "small" then
if context.blind == G.P_BLINDS.bl_small then
cond_passed = true
end
elseif j.cond == "big" then
if context.blind == G.P_BLINDS.bl_big then
cond_passed = true
end
elseif j.cond == "first" then
if G.GAME.current_round.hands_played == 0 then
cond_passed = true
end
elseif j.cond == "last" then
if G.GAME.current_round.hands_left == 0 then
cond_passed = true
end
elseif j.cond == "common" then
if context.other_joker.config.center.rarity == 1 then
cond_passed = true
end
elseif j.cond == "uncommon" then
if context.other_joker.config.center.rarity == 2 then
cond_passed = true
end
elseif j.cond == "rare" then
if context.other_joker.config.center.rarity == 3 then
cond_passed = true
end
elseif j.cond == "poker_hand" then
if context.poker_hands ~= nil and next(context.poker_hands[j.poker_hand]) then
cond_passed = true
end
elseif j.cond == "or_more" then
if #context.full_hand >= j.cond_value then
cond_passed = true
end
elseif j.cond == "or_less" then
if #context.full_hand <= j.cond_value then
cond_passed = true
end
elseif j.cond == "hands_left" then
if G.GAME.current_round.hands_left == j.cond_value then
cond_passed = true
end
elseif j.cond == "discards_left" then
if G.GAME.current_round.discards_left == j.cond_value then
cond_passed = true
end
elseif j.cond == "first_discard" then
if G.GAME.current_round.discards_used <= 0 then
cond_passed = true
end
elseif j.cond == "last_discard" then
if G.GAME.current_round.discards_left <= 1 then
cond_passed = true
end
elseif j.cond == "odds" then
if
pseudorandom("rnj")
< (
cry_prob(
card.ability.cry_prob,
card.ability.extra.cond_value,
card.ability.cry_rigged
) / card.ability.extra.cond_value
)
then
cond_passed = true
end
end
else
cond_passed = true
end
if cond_passed then
if j.context == "other_joker" then
local stats = {
plus_mult = "a_mult",
plus_chips = "a_chips",
x_mult = "a_xmult",
x_chips = "a_xchips",
}
local mods = {
plus_chips = "chip_mod",
plus_mult = "mult_mod",
x_mult = "Xmult_mod",
x_chips = "Xchip_mod",
}
local table = {}
table.message = localize({
type = "variable",
key = stats[j.stat],
vars = {
card.ability.extra.value,
},
})
table[mods[j.stat]] = card.ability.extra.value
table.card = card
G.E_MANAGER:add_event(Event({
func = function()
context.other_joker:juice_up(0.5, 0.5)
return true
end,
}))
return table
elseif (j.context == "repetition_play") or (j.context == "repetition_hand") then
return {
message = localize("k_again_ex"),
repetitions = 1,
card = card,
}
elseif j.scale_value then
card.ability.extra.value = card.ability.extra.value
+ (card.ability.extra.value_mod * times_passed)
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex") }
)
if j.stat == "h_size" then
G.hand:change_size(card.ability.extra.value_mod)
end
elseif j.act then
local j_mod = 0
if j.context == "selling_self" and (card.ability.set == "Joker") then
j_mod = 1
end
if j.context == "selling_card" and (context.card.ability.set == "Joker") then
j_mod = 1
end
local c_mod = 0
if j.context == "selling_self" and card.ability.consumeable then
c_mod = 1
end
if j.context == "selling_card" and card.ability.consumeable then
c_mod = 1
end
if j.act == "make_joker" then
local amount = card.ability.extra.value * times_passed
if
(G.jokers.config.card_limit + j_mod - #G.jokers.cards - G.GAME.joker_buffer)
< amount
then
amount = G.jokers.config.card_limit
+ j_mod
- #G.jokers.cards
- G.GAME.joker_buffer
end
if amount > 0 then
G.GAME.joker_buffer = G.GAME.joker_buffer + amount
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 0.0,
func = function()
for i = 1, amount do
if G.jokers.config.card_limit + j_mod > #G.jokers.cards then
local card = create_card(
"Joker",
G.jokers,
nil,
nil,
nil,
nil,
nil,
"rnj"
)
card:add_to_deck()
G.jokers:emplace(card)
else
break
end
end
G.GAME.joker_buffer = 0
return true
end,
}))
end
elseif j.act == "make_tarot" then
local amount = card.ability.extra.value * times_passed
if
(
G.consumeables.config.card_limit
+ c_mod
- #G.consumeables.cards
- G.GAME.consumeable_buffer
) < amount
then
amount = G.consumeables.config.card_limit
+ c_mod
- #G.consumeables.cards
- G.GAME.consumeable_buffer
end
if amount > 0 then
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + amount
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 0.0,
func = function()
for i = 1, amount do
if
G.consumeables.config.card_limit + c_mod
> #G.consumeables.cards
then
local card = create_card(
"Tarot",
G.consumeables,
nil,
nil,
nil,
nil,
nil,
"rnj"
)
card:add_to_deck()
G.consumeables:emplace(card)
else
break
end
end
G.GAME.consumeable_buffer = 0
return true
end,
}))
end
elseif j.act == "make_planet" then
local amount = card.ability.extra.value * times_passed
if
(
G.consumeables.config.card_limit
+ c_mod
- #G.consumeables.cards
- G.GAME.consumeable_buffer
) < amount
then
amount = G.consumeables.config.card_limit
+ c_mod
- #G.consumeables.cards
- G.GAME.consumeable_buffer
end
if amount > 0 then
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + amount
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 0.0,
func = function()
for i = 1, amount do
if
G.consumeables.config.card_limit + c_mod
> #G.consumeables.cards
then
local card = create_card(
"Planet",
G.consumeables,
nil,
nil,
nil,
nil,
nil,
"rnj"
)
card:add_to_deck()
G.consumeables:emplace(card)
else
break
end
end
G.GAME.consumeable_buffer = 0
return true
end,
}))
end
elseif j.act == "make_spectral" then
local amount = card.ability.extra.value * times_passed
if
(
G.consumeables.config.card_limit
+ c_mod
- #G.consumeables.cards
- G.GAME.consumeable_buffer
) < amount
then
amount = G.consumeables.config.card_limit
+ c_mod
- #G.consumeables.cards
- G.GAME.consumeable_buffer
end
if amount > 0 then
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + amount
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 0.0,
func = function()
for i = 1, amount do
if
G.consumeables.config.card_limit + c_mod
> #G.consumeables.cards
then
local card = create_card(
"Spectral",
G.consumeables,
nil,
nil,
nil,
nil,
nil,
"rnj"
)
card:add_to_deck()
G.consumeables:emplace(card)
else
break
end
end
G.GAME.consumeable_buffer = 0
return true
end,
}))
end
elseif j.act == "add_dollars" then
ease_dollars(card.ability.extra.value)
return {
message = localize("$") .. card.ability.extra.value,
colour = G.C.MONEY,
card = card,
}
end
end
end
end
if j.stat and context.individual and indiv then
local cond_passed = false
if j.cond == "suit" then
if context.other_card:is_suit(j.suit) then
cond_passed = true
end
elseif j.cond == "rank" then
if context.other_card:get_id() == j.rank then
cond_passed = true
end
elseif j.cond == "face" then
if context.other_card:is_face() then
cond_passed = true
end
elseif j.cond == "odds" then
if
pseudorandom("rnj")
< (
cry_prob(
card.ability.cry_prob,
card.ability.extra.cond_value,
card.ability.cry_rigged
) / card.ability.extra.cond_value
)
then
cond_passed = true
end
end
if not j.cond then
cond_passed = true
end
if cond_passed then
if (context.cardarea == G.hand) and context.other_card.debuff then
return {
message = localize("k_debuffed"),
colour = G.C.RED,
card = card,
}
end
if j.scale_value then
card.ability.extra.value = card.ability.extra.value + card.ability.extra.value_mod
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex") }
)
if j.stat == "h_size" then
G.hand:change_size(card.ability.extra.value_mod)
end
else
local stats = {
plus_mult = "mult",
plus_chips = "chips",
}
if context.cardarea == G.hand then
local stats = {
plus_mult = "h_mult",
plus_chips = "h_chips",
}
end
local stat = stats[j.stat] or j.stat
local colors = {
plus_mult = G.C.RED,
plus_chips = G.C.BLUE,
x_mult = G.C.RED,
x_chips = G.C.BLUE,
}
local table = {
card = card,
}
table.colour = colors[j.stat]
table[stat] = card.ability.extra.value
return table
end
end
end
if context.joker_main and j.stat and (j.stat ~= "h_size") and (j.stat ~= "money") then
local cond_passed = false
if j_context ~= "joker_main" then
cond_passed = true
end
if j.cond == "first" then
if G.GAME.current_round.hands_played == 0 then
cond_passed = true
end
elseif j.cond == "last" then
if G.GAME.current_round.hands_left == 0 then
cond_passed = true
end
elseif j.cond == "poker_hand" then
if context.poker_hands ~= nil and next(context.poker_hands[j.poker_hand]) then
cond_passed = true
end
elseif j.cond == "or_more" then
if #context.full_hand >= j.cond_value then
cond_passed = true
end
elseif j.cond == "or_less" then
if #context.full_hand <= j.cond_value then
cond_passed = true
end
elseif j.cond == "odds" then
if
pseudorandom("rnj")
< (
cry_prob(
card.ability.cry_prob,
card.ability.extra.cond_value,
card.ability.cry_rigged
) / card.ability.extra.cond_value
)
then
cond_passed = true
end
end
if not j.cond then
cond_passed = true
end
if cond_passed then
local stats = {
plus_mult = "a_mult",
plus_chips = "a_chips",
x_mult = "a_xmult",
x_chips = "a_xchips",
}
local mods = {
plus_mult = "mult_mod",
plus_chips = "chip_mod",
x_mult = "Xmult_mod",
x_chips = "Xchip_mod",
}
local table = {}
table.message = localize({
type = "variable",
key = stats[j.stat],
vars = { card.ability.extra.value },
})
table[mods[j.stat]] = card.ability.extra.value
return table
end
end
end
end
end
if
not context.individual
and not context.repetition
and not card.debuff
and context.end_of_round
and not context.blueprint
and G.GAME.blind.boss
and not (G.GAME.blind.config and G.GAME.blind.config.bonus)
then
local hand_size = 0
if card.ability and card.ability.abilities then
for i, j in ipairs(card.ability.abilities) do
if j.stat == "h_size" then
hand_size = hand_size + card.ability.extra.value
end
end
end
G.hand:change_size(-hand_size)
Cryptid.rnjoker_randomize(card)
return {
message = localize("k_reset"),
colour = G.C.RED,
}
end
end,
add_to_deck = function(self, card, from_debuff)
local hand_size = 0
if card.ability and card.ability.abilities then
for i, j in ipairs(card.ability.abilities) do
if j.stat == "h_size" then
hand_size = hand_size + card.ability.extra.value
end
end
end
G.hand:change_size(hand_size)
end,
remove_from_deck = function(self, card, from_debuff)
local hand_size = 0
if card.ability and card.ability.abilities then
for i, j in ipairs(card.ability.abilities) do
if j.stat == "h_size" then
hand_size = hand_size + card.ability.extra.value
end
end
end
G.hand:change_size(-hand_size)
end,
generate_ui = function(self, info_queue, card, desc_nodes, specific_vars, full_UI_table)
card = card or self:create_fake_card()
local len = (
card.ability
and card.ability.abilities
and card.ability.abilities[1].loc_txt
and #card.ability.abilities[1].loc_txt
) or 0
local target = {
type = "descriptions",
key = self.key,
set = self.set,
nodes = desc_nodes,
vars = specific_vars or {},
}
if self.loc_vars and type(self.loc_vars) == "function" then
res = self:loc_vars(info_queue, card) or {}
target.vars = res.vars or target.vars
target.key = res.key or target.key
end
local new_loc = { text = {} }
if
card.ability
and card.ability.abilities
and card.ability.abilities[1].loc_txt
and #card.ability.abilities[1].loc_txt
then
for i, j in ipairs(card.ability.abilities[1].loc_txt) do
table.insert(new_loc.text, j)
end
new_loc.text_parsed = card.ability.abilities[1].text_parsed
end
new_loc.text_parsed = new_loc.text_parsed or {}
if not full_UI_table.name then
full_UI_table.name =
localize({ type = "name", set = self.set, key = target.key or self.key, nodes = full_UI_table.name })
end
if specific_vars and specific_vars.debuffed then
target = {
type = "other",
key = "debuffed_" .. (specific_vars.playing_card and "playing_card" or "default"),
nodes = desc_nodes,
}
localize(target)
else
Cryptid.direct_localize(new_loc, target)
end
end,
calc_dollar_bonus = function(self, card)
if card.ability and card.ability.abilities then
for i, j in ipairs(card.ability.abilities) do
if j.stat == "money" then
if card.ability.extra.value > 0 then
return card.ability.extra.value
end
end
end
end
end,
atlas = "atlastwo",
cry_credits = {
idea = {
"Mathguy",
},
art = {
"Mathguy",
},
code = {
"Mathguy",
},
},
init = function(self)
function Cryptid.rnjoker_randomize(card)
card.ability.abilities = {}
card.ability.extra = {}
card.ability.extra.value = {}
card.ability.extra.value_mod = {}
card.ability.extra.cond_value = {}
local values = {}
local contexts = {
"open_booster",
"buying_card",
"selling_self",
"selling_card",
"reroll_shop",
"ending_shop",
"skip_blind",
"skipping_booster",
"playing_card_added",
"first_hand_drawn",
"setting_blind",
"remove_playing_cards",
"using_consumeable",
"debuffed_hand",
"pre_discard",
"discard",
"end_of_round",
"individual_play",
"individual_hand_score",
"individual_hand_end",
"repetition_play",
"repetition_hand",
"other_joker",
"before",
"after",
"joker_main",
}
local stats = {
plus_mult = 2 + pseudorandom("rnj_mult1") * 28,
plus_chips = 4 + pseudorandom("rnj_chips1") * 196,
x_mult = 1 + pseudorandom("rnj_mult2") * 3,
x_chips = 1 + pseudorandom("rnj_chips2") * 3,
h_size = 1 + math.floor(pseudorandom("rnj_h_size") * 3),
money = 1 + math.floor(pseudorandom("rnj_money") * 5),
}
local actions = {
make_joker = 1,
make_tarot = 1 + math.min(2, math.floor(pseudorandom("rnj_tarot") * 2)),
make_planet = 1 + math.min(2, math.floor(pseudorandom("rnj_planet") * 2)),
make_spectral = 1,
add_dollars = 1 + math.min(4, math.floor(pseudorandom("rnj_dollars") * 5)),
}
local context = pseudorandom_element(contexts, pseudoseed("rnj_context"))
values.context = context
if context == "other_joker" or context == "joker_main" then
stats.h_size = nil
stats.money = nil
end
local stat_val, stat = pseudorandom_element(stats, pseudoseed("rnj_stat"))
local act_val, act = pseudorandom_element(actions, pseudoseed("rnj_stat"))
local scale = (pseudorandom("rnj_scale") > 0.5)
local is_stat = (pseudorandom("rnj_stat") > 0.5)
if context == "other_joker" or context == "joker_main" then
is_stat = true
scale = false
end
if
((stat == "h_size") or (stat == "money"))
and (context == "individual_play" or context == "individual_hand_score" or context == "individual_hand_end")
and is_stat
then
scale = true
end
if context == "selling_self" then
is_stat = false
scale = false
end
if is_stat then
values.value = stat_val or 0
values.stat = stat
if
scale
or (
(context ~= "joker_main")
and (context ~= "other_joker")
and (context ~= "individual_play")
and (context ~= "individual_hand_score")
)
then
values.value = ((stat == "x_mult") or (stat == "x_chips")) and 1 or 0
scale = true
if stat == "plus_mult" then
values.scale_value = pseudorandom("rnj_scaling") * 10
elseif stat == "plus_chips" then
values.scale_value = pseudorandom("rnj_scaling") * 50
elseif stat == "h_size" then
values.scale_value = 1
elseif stat == "money" then
values.scale_value = pseudorandom("rnj_scaling") * 4
else
values.scale_value = pseudorandom("rnj_scaling")
end
end
else
scale = false
values.value = act_val
values.act = act
end
if pseudorandom("rnj_stat") < 0.8 then
local conds = {}
if context == "buying_card" then
conds = {
"buy_common",
"buy_uncommon",
"tarot",
"planet",
"spectral",
"odds",
}
elseif context == "selling_card" then
conds = {
"tarot",
"planet",
"spectral",
"joker",
"odds",
}
elseif context == "playing_card_added" then
conds = {
"suit",
"rank",
"face",
"odds",
}
elseif context == "setting_blind" then
conds = {
"boss",
"non_boss",
"small",
"big",
"odds",
}
elseif context == "remove_playing_cards" then
conds = {
"suit",
"rank",
"face",
"odds",
}
elseif context == "using_consumeable" then
conds = {
"tarot",
"planet",
"spectral",
"odds",
}
elseif context == "pre_discard" then
conds = {
"first_discard",
"last_discard",
"odds",
}
elseif context == "discard" then
conds = {
"suit",
"rank",
"face",
"odds",
}
elseif context == "individual_play" then
conds = {
"suit",
"rank",
"face",
"odds",
}
elseif context == "individual_hand_score" then
conds = {
"suit",
"rank",
"face",
"odds",
}
elseif context == "individual_hand_end" then
conds = {
"suit",
"rank",
"face",
"odds",
}
elseif context == "repetition_play" then
conds = {
"suit",
"rank",
"face",
"odds",
}
elseif context == "repetition_hand" then
conds = {
"suit",
"rank",
"face",
"odds",
}
elseif context == "other_joker" then
conds = {
"uncommon",
"rare",
"odds",
}
elseif context == "before" then
conds = {
"first",
"last",
"poker_hand",
"odds",
}
elseif context == "after" then
conds = {
"first",
"last",
"poker_hand",
"odds",
}
elseif context == "joker_main" then
conds = {
"first",
"last",
"poker_hand",
"or_more",
"or_less",
"odds",
}
elseif context == "cry_payout" then
conds = {
"hands_left",
"discards_left",
}
end
if #conds > 0 then
local cond = pseudorandom_element(conds, pseudoseed("rnj_stat"))
values.cond = cond
if cond == "poker_hand" then
local none, key = pseudorandom_element(G.GAME.hands, pseudoseed("rnj_poker-hand"))
values.cond_value = localize(key, "poker_hands")
values.poker_hand = key
end
if cond == "suit" then
local suit = pseudorandom_element(SMODS.Suits, pseudoseed("rnj_suit"))
values.cond_value = localize(suit.key, "suits_singular")
values.suit = suit.key
values.color = G.C.SUITS[suit.key]
if values.color == nil then
values.color = G.C.IMPORTANT
end
end
if cond == "rank" then
local rank = pseudorandom_element(SMODS.Ranks, pseudoseed("rnj_rank"))
values.cond_value = localize(rank.key, "ranks")
values.rank = rank.id
end
if (cond == "or_more") or (cond == "or_less") then
values.cond_value = math.min(5, math.floor(pseudorandom("rnj_cards") * 6))
end
if (cond == "hands_left") or (cond == "discards_left") then
values.cond_value = math.min(3, math.floor(pseudorandom("rnj_cards") * 4))
end
if cond == "odds" then
values.cond_value = 2 + math.min(3, math.floor(pseudorandom("rnj_cards") * 4))
end
end
end
local loc_txt = ""
local extra_lines = { "" }
if (context ~= "repetition_play") and (context ~= "repetition_hand") then
if values.stat then
for i, j in ipairs(G.localization.misc.rnj_loc_txts.stats[values.stat]) do
if scale and (i == 1) then
loc_txt = loc_txt .. "Gains "
end
loc_txt = loc_txt .. j
end
end
if values.act then
for i, j in ipairs(G.localization.misc.rnj_loc_txts.actions[values.act]) do
loc_txt = loc_txt .. j
end
end
else
scale = false
values.stat = nil
values.act = nil
values.value = nil
values.scale_value = nil
end
loc_txt = loc_txt .. " "
if values.context then
for i, j in ipairs(G.localization.misc.rnj_loc_txts.contexts[values.context]) do
loc_txt = loc_txt .. j
end
end
if values.context ~= "joker_main" then
loc_txt = loc_txt .. " "
end
if values.cond then
for i, j in ipairs(G.localization.misc.rnj_loc_txts.conds[values.cond]) do
loc_txt = loc_txt .. j
end
end
if scale then
for i, j in ipairs(G.localization.misc.rnj_loc_txts.stats_inactive[values.stat]) do
table.insert(extra_lines, j)
end
end
if values.act and (values.act ~= "add_dollars") then
table.insert(extra_lines, "{C:inactive}(Must have room){}")
end
local accum = 0
local lines = { "Randomize abilities each {C:attention}Ante{}" }
local in_brace = false
local cuur_str = ""
for i = 1, string.len(loc_txt) do
local char = string.sub(loc_txt, i, i)
if char == "{" then
in_brace = true
cuur_str = cuur_str .. char
elseif char == "}" then
in_brace = false
cuur_str = cuur_str .. char
elseif char == " " and (accum >= 25) then
table.insert(lines, cuur_str)
cuur_str = ""
accum = 0
else
if not in_brace then
accum = accum + 1
end
cuur_str = cuur_str .. char
end
end
if string.len(cuur_str) > 0 then
table.insert(lines, cuur_str)
end
if #extra_lines > 0 then
for i, j in ipairs(extra_lines) do
table.insert(lines, j)
end
end
values.loc_txt = lines
card.ability.extra = {}
if values.value then
values.value = math.floor(values.value * 100) / 100
card.ability.extra.value = values.value
end
if values.scale_value then
values.scale_value = math.floor(values.scale_value * 100) / 100
card.ability.extra.value_mod = values.scale_value
end
if values.cond_value then
card.ability.extra.cond_value = values.cond_value
end
if values.color then
card.ability.extra.color = values.color
end
local text_parsed = {}
for _, line in ipairs(values.loc_txt) do
text_parsed[#text_parsed + 1] = loc_parse_string(line)
end
values.text_parsed = text_parsed
card.ability.abilities = { values }
end
function Cryptid.direct_localize(loc_target, args, misc_cat)
if loc_target then
for _, lines in
ipairs(
args.type == "unlocks" and loc_target.unlock_parsed
or args.type == "name" and loc_target.name_parsed
or (args.type == "text" or args.type == "tutorial" or args.type == "quips") and loc_target
or loc_target.text_parsed
)
do
local final_line = {}
for _, part in ipairs(lines) do
local assembled_string = ""
for _, subpart in ipairs(part.strings) do
assembled_string = assembled_string
.. (
type(subpart) == "string" and subpart
or format_ui_value(args.vars[tonumber(subpart[1])])
or "ERROR"
)
end
local desc_scale = G.LANG.font.DESCSCALE
if G.F_MOBILE_UI then
desc_scale = desc_scale * 1.5
end
if args.type == "name" then
final_line[#final_line + 1] = {
n = G.UIT.O,
config = {
object = DynaText({
string = { assembled_string },
colours = {
(part.control.V and args.vars.colours[tonumber(part.control.V)])
or (part.control.C and loc_colour(part.control.C))
or G.C.UI.TEXT_LIGHT,
},
bump = true,
silent = true,
pop_in = 0,
pop_in_rate = 4,
maxw = 5,
shadow = true,
y_offset = -0.6,
spacing = math.max(0, 0.32 * (17 - #assembled_string)),
scale = (0.55 - 0.004 * #assembled_string)
* (part.control.s and tonumber(part.control.s) or 1),
}),
},
}
elseif part.control.E then
local _float, _silent, _pop_in, _bump, _spacing = nil, true, nil, nil, nil
if part.control.E == "1" then
_float = true
_silent = true
_pop_in = 0
elseif part.control.E == "2" then
_bump = true
_spacing = 1
end
final_line[#final_line + 1] = {
n = G.UIT.O,
config = {
object = DynaText({
string = { assembled_string },
colours = {
part.control.V and args.vars.colours[tonumber(part.control.V)]
or loc_colour(part.control.C or nil),
},
float = _float,
silent = _silent,
pop_in = _pop_in,
bump = _bump,
spacing = _spacing,
scale = 0.32 * (part.control.s and tonumber(part.control.s) or 1) * desc_scale,
}),
},
}
elseif part.control.X then
final_line[#final_line + 1] = {
n = G.UIT.C,
config = {
align = "m",
colour = loc_colour(part.control.X),
r = 0.05,
padding = 0.03,
res = 0.15,
},
nodes = {
{
n = G.UIT.T,
config = {
text = assembled_string,
colour = loc_colour(part.control.C or nil),
scale = 0.32
* (part.control.s and tonumber(part.control.s) or 1)
* desc_scale,
},
},
},
}
else
final_line[#final_line + 1] = {
n = G.UIT.T,
config = {
detailed_tooltip = part.control.T
and (G.P_CENTERS[part.control.T] or G.P_TAGS[part.control.T])
or nil,
text = assembled_string,
shadow = args.shadow,
colour = part.control.V and args.vars.colours[tonumber(part.control.V)]
or loc_colour(part.control.C or nil, args.default_col),
scale = 0.32 * (part.control.s and tonumber(part.control.s) or 1) * desc_scale,
},
}
end
end
if args.type == "name" or args.type == "text" then
return final_line
end
args.nodes[#args.nodes + 1] = final_line
end
end
end
end,
}
local duos = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-duos",
key = "duos",
order = 90,
pos = { x = 0, y = 0 },
config = { Xmult = 2.5, type = "Two Pair" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.x_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 3,
cost = 8,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.x_mult) > to_big(1)) then
if
context.poker_hands ~= nil and next(context.poker_hands[card.ability.type])
or context.poker_hands ~= nil and next(context.poker_hands["Full House"])
then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }),
colour = G.C.RED,
Xmult_mod = card.ability.x_mult,
}
end
end
end,
cry_credits = {
idea = {
"Mathguy",
},
art = {
"Mathguy",
},
code = {
"Mathguy",
},
},
unlocked = false,
unlock_condition = { type = "win_no_hand", extra = "Two Pair" },
}
local home = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-home",
key = "home",
order = 91,
pos = { x = 2, y = 0 },
config = { Xmult = 3.5, type = "Full House" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.x_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 3,
cost = 8,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.x_mult) > to_big(1)) then
if context.poker_hands ~= nil and next(context.poker_hands[card.ability.type]) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }),
colour = G.C.RED,
Xmult_mod = card.ability.x_mult,
}
end
end
end,
cry_credits = {
idea = {
"Mathguy",
},
art = {
"Mathguy",
},
code = {
"Mathguy",
},
},
unlocked = false,
unlock_condition = { type = "win_no_hand", extra = "Full House" },
}
local nuts = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-nuts",
key = "nuts",
order = 92,
pos = { x = 1, y = 0 },
config = { Xmult = 5, type = "Straight Flush" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.x_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 3,
cost = 8,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.x_mult) > to_big(1)) then
if context.poker_hands ~= nil and next(context.poker_hands[card.ability.type]) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }),
colour = G.C.RED,
Xmult_mod = card.ability.x_mult,
}
end
end
end,
cry_credits = {
idea = {
"Mathguy",
},
art = {
"Mathguy",
},
code = {
"Mathguy",
},
},
unlocked = false,
unlock_condition = { type = "win_no_hand", extra = "Straight Flush" },
}
local quintet = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-quintet",
key = "quintet",
order = 93,
pos = { x = 3, y = 0 },
config = { Xmult = 5, type = "Five of a Kind" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.x_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 3,
cost = 8,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.x_mult) > to_big(1)) then
if context.poker_hands ~= nil and next(context.poker_hands[card.ability.type]) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }),
colour = G.C.RED,
Xmult_mod = card.ability.x_mult,
}
end
end
end,
in_pool = function(self)
if G.GAME.hands["Five of a Kind"].played > 0 then
return true
end
return false
end,
check_for_unlock = function(self, args)
if args.type == "win" and G.GAME.last_hand_played == "Five of a Kind" then
return true
end
end,
cry_credits = {
idea = {
"Mathguy",
},
art = {
"Mathguy",
},
code = {
"Mathguy",
},
},
unlocked = false,
}
local unity = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-unity",
key = "unity",
order = 94,
pos = { x = 4, y = 0 },
config = { Xmult = 9, type = "Flush House" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.x_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 3,
cost = 8,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.x_mult) > to_big(1)) then
if context.poker_hands ~= nil and next(context.poker_hands[card.ability.type]) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }),
colour = G.C.RED,
Xmult_mod = card.ability.x_mult,
}
end
end
end,
in_pool = function(self)
if G.GAME.hands["Flush House"].played > 0 then
return true
end
return false
end,
check_for_unlock = function(self, args)
if args.type == "win" and G.GAME.last_hand_played == "Flush House" then
return true
end
end,
cry_credits = {
idea = {
"Mathguy",
},
art = {
"Mathguy",
},
code = {
"Mathguy",
},
},
unlocked = false,
}
local swarm = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-swarm",
key = "swarm",
order = 95,
pos = { x = 5, y = 0 },
config = { Xmult = 9, type = "Flush Five" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.x_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 3,
cost = 8,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.x_mult) > to_big(1)) then
if context.poker_hands ~= nil and next(context.poker_hands[card.ability.type]) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }),
colour = G.C.RED,
Xmult_mod = card.ability.x_mult,
}
end
end
end,
in_pool = function(self)
if G.GAME.hands["Flush Five"].played > 0 then
return true
end
return false
end,
check_for_unlock = function(self, args)
if args.type == "win" and G.GAME.last_hand_played == "Flush Five" then
return true
end
end,
cry_credits = {
idea = {
"Mathguy",
},
art = {
"Mathguy",
},
code = {
"Mathguy",
},
},
unlocked = false,
}
local stronghold = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"set_cry_poker_hand_stuff",
"c_cry_asteroidbelt",
},
},
name = "cry-stronghold",
key = "stronghold",
order = 119,
pos = { x = 8, y = 4 },
config = { Xmult = 5, type = "cry_Bulwark" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.x_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 3,
cost = 8,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.x_mult) > to_big(1)) then
if context.poker_hands ~= nil and next(context.poker_hands[card.ability.type]) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }),
colour = G.C.RED,
Xmult_mod = card.ability.x_mult,
}
end
end
end,
in_pool = function(self)
if G.GAME.hands["cry_Bulwark"].played > 0 then
return true
end
return false
end,
check_for_unlock = function(self, args)
if args.type == "win" and G.GAME.last_hand_played == "cry_Bulwark" then
return true
end
end,
unlocked = false,
}
local wtf = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"set_cry_poker_hand_stuff",
"c_cry_void",
},
},
name = "cry-wtf",
key = "wtf",
order = 120,
pos = { x = 7, y = 1 },
config = { Xmult = 10, type = "cry_Clusterfuck" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.x_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 3,
cost = 8,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.x_mult) > to_big(1)) then
if context.poker_hands ~= nil and next(context.poker_hands[card.ability.type]) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }),
colour = G.C.RED,
Xmult_mod = card.ability.x_mult,
}
end
end
end,
in_pool = function(self)
if G.GAME.hands["cry_Clusterfuck"].played > 0 then
return true
end
return false
end,
check_for_unlock = function(self, args)
if args.type == "win" and G.GAME.last_hand_played == "cry_Clusterfuck" then
return true
end
end,
unlocked = false,
}
local clash = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"set_cry_poker_hand_stuff",
"c_cry_marsmoons",
},
},
name = "cry-clash",
key = "clash",
order = 121,
pos = { x = 8, y = 1 },
config = { Xmult = 12, type = "cry_UltPair" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.x_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 3,
cost = 8,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.x_mult) > to_big(1)) then
if context.poker_hands ~= nil and next(context.poker_hands[card.ability.type]) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }),
colour = G.C.RED,
Xmult_mod = card.ability.x_mult,
}
end
end
end,
in_pool = function(self)
if G.GAME.hands["cry_UltPair"].played > 0 then
return true
end
return false
end,
check_for_unlock = function(self, args)
if args.type == "win" and G.GAME.last_hand_played == "cry_UltPair" then
return true
end
end,
unlocked = false,
}
local filler = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-filler",
key = "filler",
pos = { x = 0, y = 1 },
pools = { ["Meme"] = true },
config = { Xmult = 1.00000000000003, type = "High Card" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.x_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 3,
order = 89,
cost = 1,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands[card.ability.type]) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }),
colour = G.C.RED,
Xmult_mod = card.ability.x_mult,
}
end
end,
cry_credits = {
idea = {
"Mathguy",
},
art = {
"Mathguy",
},
code = {
"Mathguy",
},
},
unlocked = false,
unlock_condition = { type = "win_no_hand", extra = "High Card" },
}
local giggly = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Giggly Joker",
key = "giggly",
effect = "Cry Type Mult",
pos = { x = 0, y = 5 },
config = { t_mult = 4, type = "High Card" },
order = 16,
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 1,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["High Card"]) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.t_mult } }),
colour = G.C.RED,
mult_mod = card.ability.t_mult,
}
end
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local nutty = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Nutty Joker",
key = "nutty",
effect = "Cry Type Mult",
pos = { x = 1, y = 5 },
order = 17,
config = { t_mult = 19, type = "Four of a Kind" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Four of a Kind"]) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.t_mult } }),
colour = G.C.RED,
mult_mod = card.ability.t_mult,
}
end
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local manic = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Manic Joker",
key = "manic",
effect = "Cry Type Mult",
pos = { x = 2, y = 5 },
order = 18,
config = { t_mult = 22, type = "Straight Flush" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Straight Flush"]) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.t_mult } }),
colour = G.C.RED,
mult_mod = card.ability.t_mult,
}
end
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local silly = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Silly Joker",
key = "silly",
pos = { x = 3, y = 5 },
effect = "Cry Type Mult",
order = 19,
config = { t_mult = 16, type = "Full House" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Full House"]) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.t_mult } }),
colour = G.C.RED,
mult_mod = card.ability.t_mult,
}
end
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local delirious = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Delirious Joker",
key = "delirious",
effect = "Cry Type Mult",
pos = { x = 4, y = 5 },
order = 20,
config = { t_mult = 22, type = "Five of a Kind" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Five of a Kind"]) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.t_mult } }),
colour = G.C.RED,
mult_mod = card.ability.t_mult,
}
end
end,
in_pool = function(self)
if G.GAME.hands["Five of a Kind"].played > 0 then
return true
end
return false
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local wacky = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Wacky Joker",
key = "wacky",
pos = { x = 5, y = 5 },
order = 21,
config = { t_mult = 30, type = "Flush House" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
effect = "Cry Type Mult",
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Flush House"]) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.t_mult } }),
colour = G.C.RED,
mult_mod = card.ability.t_mult,
}
end
end,
in_pool = function(self)
if G.GAME.hands["Flush House"].played > 0 then
return true
end
return false
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local kooky = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Kooky Joker",
key = "kooky",
pos = { x = 6, y = 5 },
order = 22,
config = { t_mult = 30, type = "Flush Five" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
effect = "Cry Type Mult",
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Flush Five"]) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.t_mult } }),
colour = G.C.RED,
mult_mod = card.ability.t_mult,
}
end
end,
in_pool = function(self)
if G.GAME.hands["Flush Five"].played > 0 then
return true
end
return false
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local bonkers = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"set_cry_poker_hand_stuff",
"c_cry_asteroidbelt",
},
},
name = "cry-Bonkers Joker",
key = "bonkers",
pos = { x = 8, y = 5 },
order = 113,
config = { t_mult = 20, type = "cry_Bulwark" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
effect = "Cry Type Mult",
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["cry_Bulwark"]) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.t_mult } }),
colour = G.C.RED,
mult_mod = card.ability.t_mult,
}
end
end,
in_pool = function(self)
if G.GAME.hands["cry_Bulwark"].played > 0 then
return true
end
return false
end,
}
local fuckedup = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"set_cry_poker_hand_stuff",
"c_cry_void",
},
},
name = "cry-Fucked-Up Joker",
key = "fuckedup",
pos = { x = 7, y = 2 },
order = 114,
config = { t_mult = 37, type = "cry_Clusterfuck" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
effect = "Cry Type Mult",
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["cry_Clusterfuck"]) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.t_mult } }),
colour = G.C.RED,
mult_mod = card.ability.t_mult,
}
end
end,
in_pool = function(self)
if G.GAME.hands["cry_Clusterfuck"].played > 0 then
return true
end
return false
end,
}
local foolhardy = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"set_cry_poker_hand_stuff",
"c_cry_marsmoons",
},
},
name = "cry-Foolhardy Joker",
key = "foolhardy",
pos = { x = 8, y = 2 },
order = 115,
config = { t_mult = 42, type = "cry_UltPair" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_mult, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
effect = "Cry Type Mult",
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["cry_UltPair"]) then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.t_mult } }),
colour = G.C.RED,
mult_mod = card.ability.t_mult,
}
end
end,
in_pool = function(self)
if G.GAME.hands["cry_UltPair"].played > 0 then
return true
end
return false
end,
}
local dubious = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Dubious Joker",
key = "dubious",
pos = { x = 0, y = 6 },
order = 24,
config = { t_chips = 20, type = "High Card" },
effect = "Cry Type Chips",
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_chips, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 1,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["High Card"]) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.t_chips } }),
colour = G.C.BLUE,
chip_mod = card.ability.t_chips,
}
end
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local shrewd = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Shrewd Joker",
key = "shrewd",
pos = { x = 1, y = 6 },
order = 25,
effect = "Cry Type Chips",
config = { t_chips = 150, type = "Four of a Kind" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_chips, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Four of a Kind"]) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.t_chips } }),
colour = G.C.BLUE,
chip_mod = card.ability.t_chips,
}
end
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local tricksy = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Tricksy Joker",
key = "tricksy",
effect = "Cry Type Chips",
order = 26,
pos = { x = 2, y = 6 },
config = { t_chips = 170, type = "Straight Flush" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_chips, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Straight Flush"]) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.t_chips } }),
colour = G.C.BLUE,
chip_mod = card.ability.t_chips,
}
end
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local foxy = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Foxy Joker",
key = "foxy",
pos = { x = 3, y = 6 },
order = 27,
effect = "Cry Type Chips",
config = { t_chips = 130, type = "Full House" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_chips, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Full House"]) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.t_chips } }),
colour = G.C.BLUE,
chip_mod = card.ability.t_chips,
}
end
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local savvy = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Savvy Joker",
key = "savvy",
pos = { x = 4, y = 6 },
effect = "Cry Type Chips",
order = 28,
config = { t_chips = 170, type = "Five of a Kind" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_chips, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Five of a Kind"]) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.t_chips } }),
colour = G.C.BLUE,
chip_mod = card.ability.t_chips,
}
end
end,
in_pool = function(self)
if G.GAME.hands["Five of a Kind"].played > 0 then
return true
end
return false
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local subtle = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Subtle Joker",
key = "subtle",
pos = { x = 5, y = 6 },
effect = "Cry Type Chips",
order = 29,
config = { t_chips = 240, type = "Flush House" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_chips, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Flush House"]) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.t_chips } }),
colour = G.C.BLUE,
chip_mod = card.ability.t_chips,
}
end
end,
in_pool = function(self)
if G.GAME.hands["Flush House"].played > 0 then
return true
end
return false
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local discreet = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Discreet Joker",
key = "discreet",
pos = { x = 6, y = 6 },
effect = "Cry Type Chips",
order = 30,
config = { t_chips = 240, type = "Flush Five" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_chips, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["Flush Five"]) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.t_chips } }),
colour = G.C.BLUE,
chip_mod = card.ability.t_chips,
}
end
end,
in_pool = function(self)
if G.GAME.hands["Flush Five"].played > 0 then
return true
end
return false
end,
cry_credits = {
idea = {
"Luigicat11",
},
art = {
"Luigicat11",
},
code = {
"Math",
},
},
}
local adroit = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"set_cry_poker_hand_stuff",
"c_cry_asteroidbelt",
},
},
name = "cry-Adroit Joker",
key = "adroit",
pos = { x = 7, y = 4 },
effect = "Cry Type Chips",
order = 116,
config = { t_chips = 170, type = "cry_Bulwark" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_chips, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["cry_Bulwark"]) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.t_chips } }),
colour = G.C.BLUE,
chip_mod = card.ability.t_chips,
}
end
end,
in_pool = function(self)
if G.GAME.hands["cry_Bulwark"].played > 0 then
return true
end
return false
end,
}
local penetrating = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"set_cry_poker_hand_stuff",
"c_cry_void",
},
},
name = "cry-Penetrating Joker",
key = "penetrating",
pos = { x = 7, y = 3 },
effect = "Cry Type Chips",
order = 117,
config = { t_chips = 270, type = "cry_Clusterfuck" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_chips, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["cry_Clusterfuck"]) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.t_chips } }),
colour = G.C.BLUE,
chip_mod = card.ability.t_chips,
}
end
end,
in_pool = function(self)
if G.GAME.hands["cry_Clusterfuck"].played > 0 then
return true
end
return false
end,
}
local treacherous = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"set_cry_poker_hand_stuff",
"c_cry_marsmoons",
},
},
name = "cry-Treacherous Joker",
key = "treacherous",
pos = { x = 8, y = 3 },
effect = "Cry Type Chips",
order = 118,
config = { t_chips = 300, type = "cry_UltPair" },
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.t_chips, localize(card.ability.type, "poker_hands") } }
end,
atlas = "atlasthree",
rarity = 1,
cost = 4,
blueprint_compat = true,
calculate = function(self, card, context)
if context.joker_main and context.poker_hands and next(context.poker_hands["cry_UltPair"]) then
return {
message = localize({ type = "variable", key = "a_chips", vars = { card.ability.t_chips } }),
colour = G.C.BLUE,
chip_mod = card.ability.t_chips,
}
end
end,
in_pool = function(self)
if G.GAME.hands["cry_UltPair"].played > 0 then
return true
end
return false
end,
}
local coin = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-coin",
key = "coin",
pos = { x = 0, y = 2 },
config = { extra = { money = 1 } },
rarity = 1,
order = 53,
cost = 5,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.money, center.ability.extra.money * 10 } }
end,
atlas = "atlasthree",
calculate = function(self, card, context)
if context.selling_card and context.card.ability.set == "Joker" then
local option = pseudorandom(pseudoseed("coin"), card.ability.extra.money, card.ability.extra.money * 10)
ease_dollars(option)
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize("$") .. option, colour = G.C.MONEY, delay = 0.45 }
)
return nil, true
end
end,
cry_credits = {
idea = {
"Squiddy",
},
art = {
"Timetoexplode",
"George the Rat",
},
code = {
"Jevonn",
},
},
}
local wheelhope = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-wheelhope",
key = "wheelhope",
pos = { x = 1, y = 1 },
config = { extra = { extra = 0.5, x_mult = 1 } },
rarity = 2,
cost = 5,
order = 74,
perishable_compat = false,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
info_queue[#info_queue + 1] = G.P_CENTERS.c_wheel_of_fortune
return { vars = { center.ability.extra.extra, center.ability.extra.x_mult } }
end,
atlas = "atlasthree",
calculate = function(self, card, context)
if context.joker_main and (card.ability.extra.x_mult > 1) then
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }),
Xmult_mod = card.ability.extra.x_mult,
}
end
if context.consumeable then
if
context.consumeable.ability.name == "The Wheel of Fortune"
and not context.consumeable.cry_wheel_success
then
card.ability.extra.x_mult = card.ability.extra.x_mult + card.ability.extra.extra
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.x_mult } }) }
)
return nil, true
end
end
end,
cry_credits = {
idea = {
"Linus Goof Balls",
},
art = {
"Linus Good Balls",
},
code = {
"Toneblock",
},
},
}
local oldblueprint = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-oldblueprint",
key = "oldblueprint",
pos = { x = 2, y = 1 },
config = { extra = { odds = 4 } },
rarity = 1,
cost = 6,
order = 83,
update = function(self, card, front)
if G.STAGE == G.STAGES.RUN then
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
other_joker = G.jokers.cards[i + 1]
end
end
if other_joker and other_joker ~= card and other_joker.config.center.blueprint_compat then
card.ability.blueprint_compat = "compatible"
else
card.ability.blueprint_compat = "incompatible"
end
end
end,
loc_vars = function(self, info_queue, card)
card.ability.blueprint_compat_ui = card.ability.blueprint_compat_ui or ""
card.ability.blueprint_compat_check = nil
return {
vars = {
cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged),
card.ability.extra.odds,
},
main_end = (card.area and card.area == G.jokers) and {
{
n = G.UIT.C,
config = { align = "bm", minh = 0.4 },
nodes = {
{
n = G.UIT.C,
config = {
ref_table = card,
align = "m",
colour = G.C.JOKER_GREY,
r = 0.05,
padding = 0.06,
func = "blueprint_compat",
},
nodes = {
{
n = G.UIT.T,
config = {
ref_table = card.ability,
ref_value = "blueprint_compat_ui",
colour = G.C.UI.TEXT_LIGHT,
scale = 0.32 * 0.8,
},
},
},
},
},
},
} or nil,
}
end,
blueprint_compat = true,
eternal_compat = false,
atlas = "atlasthree",
calculate = function(self, card, context)
if
context.end_of_round2
and not context.individual
and not context.repetition
and not context.blueprint
and not context.retrigger_joker
then
if
pseudorandom("oldblueprint")
< cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged)
/ card.ability.extra.odds
then
G.E_MANAGER:add_event(Event({
func = function()
play_sound("tarot1")
card.T.r = -0.2
card:juice_up(0.3, 0.4)
card.states.drag.is = true
card.children.center.pinch.x = true
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.3,
blockable = false,
func = function()
G.jokers:remove_card(card)
card:remove()
card = nil
if G.P_CENTERS["j_blueprint"].unlocked then
G.GAME.oldbpfactor = (G.GAME.oldbpfactor or 1) * 3
end
return true
end,
}))
return true
end,
}))
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_extinct_ex"), colour = G.C.FILTER }
)
else
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_safe_ex"), colour = G.C.FILTER }
)
end
end
local other_joker = nil
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
other_joker = G.jokers.cards[i + 1]
end
end
if other_joker and other_joker ~= card then
context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1
context.blueprint_card = context.blueprint_card or card
if context.blueprint > #G.jokers.cards + 1 then
return
end
local other_joker_ret, trig = other_joker:calculate_joker(context)
local eff_card = context.blueprint_card or card
context.blueprint = nil
context.blueprint_card = nil
if other_joker_ret == true then
return other_joker_ret
end
if other_joker_ret or trig then
if not other_joker_ret then
other_joker_ret = {}
end
other_joker_ret.card = eff_card
other_joker_ret.colour = darken(G.C.BLUE, 0.3)
other_joker_ret.no_callback = true
return other_joker_ret
end
end
end,
cry_credits = {
idea = {
"Linus Goof Balls",
},
art = {
"Linus Goof Balls",
"unexian",
},
code = {
"Math",
},
},
}
local night = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-night",
key = "night",
config = { extra = { mult = 3 } },
pos = { x = 3, y = 1 },
rarity = 3,
cost = 6,
order = 41,
eternal_compat = false,
blueprint_compat = true,
atlas = "atlasthree",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.mult } }
end,
calculate = function(self, card, context)
if context.joker_main and G.GAME.current_round.hands_left == 0 then
if card.ability.extra.mult > 1 then
return {
message = localize({ type = "variable", key = "a_powmult", vars = { card.ability.extra.mult } }),
Emult_mod = card.ability.extra.mult,
colour = G.C.DARK_EDITION,
}
end
elseif
context.cardarea == G.jokers
and context.after
and not context.blueprint
and not context.retrigger_joker
then
if G.GAME.current_round.hands_left <= 0 then
G.E_MANAGER:add_event(Event({
func = function()
play_sound("tarot1")
card.T.r = -0.2
card:juice_up(0.3, 0.4)
card.states.drag.is = true
card.children.center.pinch.x = true
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.3,
blockable = false,
func = function()
G.jokers:remove_card(card)
card:remove()
card = nil
return true
end,
}))
return true
end,
}))
return {
message = localize("k_extinct_ex"),
colour = G.C.FILTER,
}
elseif G.GAME.current_round.hands_left <= 1 then
local eval = function(card)
return G.GAME.current_round.hands_left <= 1 and not G.RESET_JIGGLES
end
juice_card_until(card, eval, true)
end
elseif context.first_hand_drawn and not context.blueprint and not context.retrigger_joker then
if next(find_joker("cry-panopticon")) then
local eval = function(card)
return G.GAME.current_round.hands_played == 0 and not G.RESET_JIGGLES
end
juice_card_until(card, eval, true)
end
end
end,
cry_credits = {
idea = {
"Linus Goof Balls",
},
art = {
"Linus Goof Balls",
},
code = {
"Jevonn",
},
},
}
local busdriver = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-busdriver",
key = "busdriver",
config = { extra = { mult = 50, odds = 4 } },
pos = { x = 5, y = 1 },
rarity = 2,
cost = 7,
order = 46,
atlas = "atlasthree",
blueprint_compat = true,
loc_vars = function(self, info_queue, card)
local prob = cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged)
local oddy = math.max(1, card.ability.extra.odds)
return {
vars = {
(oddy - 1 / prob),
card.ability.extra.mult,
oddy,
(1 / prob),
},
}
end,
calculate = function(self, card, context)
if context.joker_main and (card.ability.extra.mult > 0) then
local oddy = math.max(1, card.ability.extra.odds)
if
pseudorandom("busdriver")
< 1
- (1 / (cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) * oddy))
then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.extra.mult } }),
mult_mod = card.ability.extra.mult,
colour = G.C.MULT,
}
else
return {
message = localize({ type = "variable", key = "a_mult_minus", vars = { card.ability.extra.mult } }),
mult_mod = (card.ability.extra.mult * -1),
colour = G.C.MULT,
}
end
end
end,
cry_credits = {
idea = {
"Linus Goof Balls",
},
art = {
"Linus Goof Balls",
},
code = {
"Jevonn",
},
},
}
local translucent = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"banana",
},
},
name = "cry-translucent Joker",
key = "translucent",
pos = { x = 5, y = 2 },
rarity = 1,
cost = 4,
order = 52,
immutable = true,
eternal_compat = false,
atlas = "atlasthree",
calculate = function(self, card, context)
if context.selling_self and not (context.retrigger_joker or context.blueprint) then
local jokers = {}
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] ~= card and not G.jokers.cards[i].debuff then
jokers[#jokers + 1] = G.jokers.cards[i]
end
end
if #jokers > 0 then
if #G.jokers.cards <= G.jokers.config.card_limit then
card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("k_duplicated_ex") })
local chosen_joker = pseudorandom_element(jokers, pseudoseed("trans"))
local _card =
copy_card(chosen_joker, nil, nil, nil, chosen_joker.edition and chosen_joker.edition.negative)
_card:add_to_deck()
_card:set_banana(true)
_card.ability.perishable = true -- Done manually to bypass perish compat
_card.ability.perish_tally = G.GAME.perishable_rounds
G.jokers:emplace(_card)
return nil, true
else
card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("k_no_room_ex") })
end
else
card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("k_no_other_jokers") })
end
end
end,
cry_credits = {
idea = {
"SDM_0",
},
art = {
"SDM_0",
},
code = {
"SDM_0",
},
},
}
local morse = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-morse",
key = "morse",
pos = { x = 5, y = 1 },
config = { extra = { bonus = 2, money = 1 } },
rarity = 1,
cost = 5,
order = 57,
perishable_compat = false,
blueprint_compat = false,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.bonus, center.ability.extra.money } }
end,
atlas = "atlastwo",
calculate = function(self, card, context)
if context.selling_card and context.card.edition and not context.blueprint then
card.ability.extra.money = card.ability.extra.money + card.ability.extra.bonus
return {
card_eval_status_text(card, "extra", nil, nil, nil, {
message = localize("k_upgrade_ex"),
colour = G.C.MONEY,
}),
}
end
end,
calc_dollar_bonus = function(self, card)
if card.ability.extra.money > 0 then
return card.ability.extra.money
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Jevonn",
},
code = {
"Jevonn",
},
},
}
local membershipcard = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-membershipcard",
key = "membershipcard",
config = { extra = { Xmult_mod = 0.1 } },
pos = { x = 6, y = 2 },
soul_pos = { x = 6, y = 1 },
rarity = 4,
cost = 20,
order = 35,
blueprint_compat = true,
atlas = "atlasthree",
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.Xmult_mod, card.ability.extra.Xmult_mod * Cryptid.member_count } }
end,
calculate = function(self, card, context)
if context.joker_main and card.ability.extra.Xmult_mod * Cryptid.member_count > 1 then
return {
message = localize({
type = "variable",
key = "a_xmult",
vars = { card.ability.extra.Xmult_mod * Cryptid.member_count },
}),
Xmult_mod = card.ability.extra.Xmult_mod * Cryptid.member_count,
}
end
end,
cry_credits = {
idea = {
"Toneblock",
},
art = {
"HexaCryonic",
},
code = {
"Toneblock",
},
},
}
local kscope = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-kscope",
key = "kscope",
pos = { x = 3, y = 4 },
rarity = 3,
cost = 7,
order = 55,
atlas = "atlasthree",
immutable = true,
calculate = function(self, card, context)
if context.end_of_round and G.GAME.blind.boss and not context.individual and not context.repetition then
local eligiblejokers = {}
for k, v in pairs(G.jokers.cards) do
if v.ability.set == "Joker" and not v.edition and v ~= card then
table.insert(eligiblejokers, v)
end
end
if #eligiblejokers > 0 then
--you just lost the game
local eligible_card =
pseudorandom_element(eligiblejokers, pseudoseed("nevergonnagiveyouupnevergonnaletyoudown"))
local edition = { polychrome = true }
eligible_card:set_edition(edition, true)
check_for_unlock({ type = "have_edition" })
end
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Jevonn",
},
code = {
"Jevonn",
},
},
}
local cryptidmoment = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry_cryptidmoment",
key = "cryptidmoment",
pos = { x = 6, y = 0 },
config = { extra = { money = 1 } },
loc_vars = function(self, info_queue, center)
return { vars = { math.max(1, math.floor(center.ability.extra.money)) } }
end,
rarity = 1,
cost = 4,
order = 65,
eternal_compat = false,
atlas = "atlasthree",
calculate = function(self, card, context)
if context.selling_self and not context.blueprint then
for k, v in ipairs(G.jokers.cards) do
if v.set_cost then
v.ability.extra_value = (v.ability.extra_value or 0)
+ math.max(1, math.floor(card.ability.extra.money))
v:set_cost()
end
end
card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("k_val_up"), colour = G.C.MONEY })
end
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Yamper",
},
code = {
"Jevonn",
},
},
}
local flipside = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"e_cry_double_sided",
},
},
name = "cry-Flip Side",
key = "flip_side",
pos = { x = 3, y = 6 },
rarity = 2,
cost = 7,
order = 107,
atlas = "atlastwo",
no_dbl = true,
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_double_sided
end,
add_to_deck = function(self, card, from_debuff)
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].edition and G.jokers.cards[i].edition.cry_double_sided then
G.jokers.cards[i]:init_dbl_side()
G.jokers.cards[i]:remove_from_deck(true)
G.jokers.cards[i].dbl_side:add_to_deck(true)
end
end
end,
remove_from_deck = function(self, card, from_debuff)
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].edition and G.jokers.cards[i].edition.cry_double_sided then
G.jokers.cards[i]:init_dbl_side()
G.jokers.cards[i]:add_to_deck(true)
G.jokers.cards[i].dbl_side:remove_from_deck(true)
end
end
end,
calculate = function(self, card, context)
if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= self then
if context.other_context and context.other_context.dbl_side then
return {
message = localize("k_again_ex"),
repetitions = 1,
card = card,
}
else
return nil, true
end
end
end,
cry_credits = {
idea = {
"Axolotus",
},
art = {
"Pyrocreep",
},
code = {
"Math",
},
},
}
local oldinvisible = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Old Invisible Joker",
key = "oldinvisible",
pos = { x = 4, y = 4 },
config = { extra = 0 },
rarity = 4,
cost = 20,
order = 78,
atlas = "atlasthree",
immutable = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra } }
end,
calculate = function(self, card, context)
if
context.selling_card
and context.card.ability.set == "Joker"
and not context.blueprint
and not context.retrigger_joker
then
if card.ability.extra >= 3 then
card.ability.extra = 0
local eligibleJokers = {}
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].ability.name ~= card.ability.name and G.jokers.cards[i] ~= context.card then
eligibleJokers[#eligibleJokers + 1] = G.jokers.cards[i]
end
end
if #eligibleJokers > 0 then
G.E_MANAGER:add_event(Event({
func = function()
local card =
copy_card(pseudorandom_element(eligibleJokers, pseudoseed("cry_oldinvis")), nil)
card:add_to_deck()
G.jokers:emplace(card)
return true
end,
}))
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize("k_duplicated_ex") }
)
return nil, true
else
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize("k_no_other_jokers") }
)
end
return
else
card.ability.extra = card.ability.extra + 1
if card.ability.extra == 3 then
local eval = function(card)
return (card.ability.extra == 3)
end
juice_card_until(card, eval, true)
end
return {
card_eval_status_text(card, "extra", nil, nil, nil, {
message = card.ability.extra .. "/4",
colour = G.C.FILTER,
}),
}
end
end
end,
cry_credits = {
idea = {
"LocalThunk",
},
art = {
"LocalThunk",
},
code = {
"Jevonn",
},
},
}
local fractal = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"set_cry_poker_hand_stuff",
},
},
name = "cry-FractalFingers",
key = "fractal",
pos = { x = 6, y = 4 },
config = { extra = 2 },
rarity = 3,
cost = 7,
order = 76,
atlas = "atlasthree",
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra } }
end,
add_to_deck = function(self, card, from_debuff)
card.ability.extra = math.floor(card.ability.extra)
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit + card.ability.extra
end,
remove_from_deck = function(self, card, from_debuff)
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit - card.ability.extra
if G.hand.config.highlighted_limit < 5 then
G.hand.config.highlighted_limit = 5
end
if not G.GAME.before_play_buffer then
G.hand:unhighlight_all()
end
end,
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"HexaCryonic",
},
},
}
local universe = {
cry_credits = {
idea = { "Mystic Misclick" },
art = { "spire_winder" },
code = { "spire_winder" },
},
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"e_cry_astral",
},
},
name = "cry-universe",
key = "universe",
pos = { x = 8, y = 0 },
atlas = "atlasthree",
config = { extra = { emult = 1.2 } },
loc_vars = function(self, info_queue, center)
if not center.edition or (center.edition and not center.edition.cry_astral) then
info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_astral
end
return { vars = { center.ability.extra.emult } }
end,
rarity = 3,
cost = 6,
order = 121,
blueprint_compat = true,
calculate = function(self, card, context)
if
context.other_joker
and context.other_joker.edition
and context.other_joker.edition.cry_astral == true
and card ~= context.other_joker
then
if not Talisman.config_file.disable_anims then
G.E_MANAGER:add_event(Event({
func = function()
context.other_joker:juice_up(0.5, 0.5)
return true
end,
}))
end
return {
message = localize({ type = "variable", key = "a_powmult", vars = { card.ability.extra.emult } }),
Emult_mod = card.ability.extra.emult,
colour = G.C.DARK_EDITION,
}
end
if context.individual and context.cardarea == G.play then
if context.other_card.edition and context.other_card.edition.cry_astral == true then
return {
e_mult = card.ability.extra.emult,
colour = G.C.DARK_EDITION,
card = card,
}
end
end
if
context.individual
and context.cardarea == G.hand
and context.other_card.edition
and context.other_card.edition.cry_astral == true
and not context.end_of_round
then
if context.other_card.debuff then
return {
message = localize("k_debuffed"),
colour = G.C.RED,
card = card,
}
else
return {
e_mult = card.ability.extra.emult,
colour = G.C.DARK_EDITION,
card = card,
}
end
end
end,
}
local astral_bottle = {
cry_credits = {
idea = { "AlexZGreat" },
art = { "spire_winder" },
code = { "spire_winder" },
},
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"e_cry_astral",
},
},
name = "cry-astral_bottle",
extra_gamesets = { "exp_modest", "exp_mainline", "exp_madness" },
key = "astral_bottle",
eternal_compat = false,
pos = { x = 7, y = 0 },
atlas = "atlasthree",
rarity = 2,
cost = 6,
order = 122,
blueprint_compat = false,
loc_vars = function(self, info_queue, center)
if not center.edition or (center.edition and not center.edition.cry_astral) then
info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_astral
end
return {
key = Cryptid.gameset_loc(
self,
{ exp_modest = "mainline", exp_mainline = "mainline", exp_madness = "madness" }
),
}
end,
calculate = function(self, card, context)
if context.selling_self and not context.retrigger_joker and not context.blueprint then
local g = Cryptid.gameset(card)
local effect = { { astral = true, perishable = true } }
if g == "exp_modest" or g == "exp_mainline" then
effect = { { astral = true }, { perishable = true } }
end
if g == "exp_madness" then
effect = { { astral = true } }
end
local jokers = {}
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] ~= card and not G.jokers.cards[i].debuff and not G.jokers.cards[i].edition then
jokers[#jokers + 1] = G.jokers.cards[i]
end
end
if #jokers >= #effect then
card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("k_duplicated_ex") })
for i = 1, #effect do
local chosen_joker = pseudorandom_element(jokers, pseudoseed("astral_bottle"))
if effect[i].astral then
chosen_joker:set_edition({ cry_astral = true })
end
if effect[i].perishable then
chosen_joker.ability.perishable = true -- Done manually to bypass perish compat
chosen_joker.ability.perish_tally = G.GAME.perishable_rounds
end
for i = 1, #jokers do
if jokers[i] == chosen_joker then
table.remove(jokers, i)
break
end
end
end
return nil, true
else
card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("k_no_other_jokers") })
end
end
end,
}
local kittyprinter = {
dependencies = {
items = {
"tag_cry_cat",
},
},
object_type = "Joker",
name = "cry-kittyprinter",
key = "kittyprinter",
config = { extra = { Xmult = 2 } },
pos = { x = 3, y = 5 },
rarity = 2,
cost = 6,
atlas = "atlasone",
order = 133,
blueprint_compat = true,
loc_vars = function(self, info_queue, card)
return { vars = { card.ability.extra.Xmult } }
end,
calculate = function(self, card, context)
if context.joker_main then
return {
message = localize({
type = "variable",
key = "a_xmult",
vars = { card.ability.extra.Xmult },
}),
Xmult_mod = card.ability.extra.Xmult,
}
end
end,
}
local kidnap = {
dependencies = {
items = {
"set_cry_misc_joker",
},
},
object_type = "Joker",
name = "cry-kidnap",
key = "kidnap",
order = 23,
pos = { x = 1, y = 2 },
config = {
extra = 4,
},
rarity = 1,
cost = 4,
blueprint_compat = false,
loc_vars = function(self, info_queue, center)
local value = 0
if G.GAME and G.GAME.jokers_sold then
for _, v in ipairs(G.GAME.jokers_sold) do
if
G.P_CENTERS[v].effect == "Type Mult"
or G.P_CENTERS[v].effect == "Cry Type Mult"
or G.P_CENTERS[v].effect == "Cry Type Chips"
or G.P_CENTERS[v].effect == "Boost Kidnapping"
or (
G.P_CENTERS[v].name == "Sly Joker"
or G.P_CENTERS[v].name == "Wily Joker"
or G.P_CENTERS[v].name == "Clever Joker"
or G.P_CENTERS[v].name == "Devious Joker"
or G.P_CENTERS[v].name == "Crafty Joker"
)
then
value = value + 1
end
end
end
return { vars = { center.ability.extra, center.ability.extra * value } }
end,
atlas = "atlasone",
calc_dollar_bonus = function(self, card)
local value = 0
for _, v in ipairs(G.GAME.jokers_sold) do
if
G.P_CENTERS[v].effect == "Type Mult"
or G.P_CENTERS[v].effect == "Cry Type Mult"
or G.P_CENTERS[v].effect == "Cry Type Chips"
or G.P_CENTERS[v].effect == "Boost Kidnapping"
or (
G.P_CENTERS[v].name == "Sly Joker"
or G.P_CENTERS[v].name == "Wily Joker"
or G.P_CENTERS[v].name == "Clever Joker"
or G.P_CENTERS[v].name == "Devious Joker"
or G.P_CENTERS[v].name == "Crafty Joker"
)
then
value = value + 1
end
end
if value == 0 then
return
end
return card.ability.extra * value
end,
cry_credits = {
idea = {
"Jevonn",
},
art = {
"Jevonn",
},
code = {
"Jevonn",
},
},
}
local exposed = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Exposed",
key = "exposed",
pos = { x = 0, y = 5 },
config = { extra = 2 },
rarity = 3,
cost = 8,
order = 123,
atlas = "atlastwo",
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { math.min(40, center.ability.extra) } }
end,
update = function(self, card, dt)
if G.deck and card.added_to_deck then
for i, v in pairs(G.deck.cards) do
if v:is_face() then
v:set_debuff(true)
end
end
end
if G.hand and card.added_to_deck then
for i, v in pairs(G.hand.cards) do
if v:is_face() then
v:set_debuff(true)
end
end
end
end,
calculate = function(self, card, context)
if context.repetition and context.cardarea == G.play then
if not context.other_card:is_face() then
return {
message = localize("k_again_ex"),
repetitions = math.min(40, card.ability.extra),
card = card,
}
end
end
end,
}
local mask = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Mask",
key = "mask",
pos = { x = 1, y = 5 },
config = { extra = 3 },
rarity = 3,
cost = 7,
atlas = "atlastwo",
order = 124,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { math.min(40, center.ability.extra) } }
end,
update = function(self, card, dt)
if G.deck and card.added_to_deck then
for i, v in pairs(G.deck.cards) do
if not v:is_face() then
v:set_debuff(true)
end
end
end
if G.hand and card.added_to_deck then
for i, v in pairs(G.hand.cards) do
if not v:is_face() then
v:set_debuff(true)
end
end
end
end,
calculate = function(self, card, context)
if context.repetition and context.cardarea == G.play then
if context.other_card:is_face() then
return {
message = localize("k_again_ex"),
repetitions = math.min(40, card.ability.extra),
card = card,
}
end
end
end,
}
local tropical_smoothie = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Tropical Smoothie",
key = "tropical_smoothie",
pos = { x = 2, y = 5 },
config = { extra = 1.5 },
rarity = 3,
eternal_compat = false,
cost = 5,
order = 125,
atlas = "atlastwo",
pools = { ["Food"] = true },
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra } }
end,
calculate = function(self, card, context)
if context.selling_self then
local check = false
for i, v in pairs(G.jokers.cards) do
if v ~= card then
if not Card.no(v, "immutable", true) then
Cryptid.with_deck_effects(v, function(cards)
Cryptid.misprintize(
cards,
{ min = card.ability.extra, max = card.ability.extra },
nil,
true
)
end)
check = true
end
end
end
if check then
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex"), colour = G.C.GREEN }
)
end
end
end,
}
local pumpkin = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
key = "pumpkin",
pos = { x = 0, y = 6 },
rarity = 3,
cost = 10,
atlas = "atlastwo",
order = 131,
config = { extra = { scoreReq = 50, enabled = true } },
blueprint_compat = true,
eternal_compat = false,
perishable_compat = false,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.scoreReq } }
end,
calculate = function(self, card, context)
if context.game_over and G.GAME.chips / G.GAME.blind.chips >= to_big(card.ability.extra.scoreReq / 100) then
G.E_MANAGER:add_event(Event({
func = function()
G.hand_text_area.blind_chips:juice_up()
G.hand_text_area.game_chips:juice_up()
play_sound("tarot1")
return true
end,
}))
return {
message = localize("k_saved_ex"),
saved = true,
colour = G.C.RED,
}
end
if context.selling_self then
card.ability.extra.enabled = false
end
if context.cry_start_dissolving and context.card == card and card.ability.extra.enabled == true then
local newcard = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_cry_carved_pumpkin")
newcard:add_to_deck()
G.jokers:emplace(newcard)
end
end,
cry_credits = {
idea = {
"Squiddy",
},
art = {
"B",
},
code = {
"wawa person",
},
},
}
local carved_pumpkin = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
key = "carved_pumpkin",
pos = { x = 1, y = 6 },
rarity = 3,
cost = 10,
atlas = "atlastwo",
order = 132,
config = { extra = { disables = 5 } },
blueprint_compat = true,
eternal_compat = false,
perishable_compat = false,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.disables } }
end,
calculate = function(self, card, context)
if context.end_of_round and not context.blueprint and not context.individual and not context.repetition then
if G.GAME.blind:get_type() == "Boss" then
card.ability.extra.disables = card.ability.extra.disables - 1
card:juice_up()
if card.ability.extra.disables <= 0 then
card:start_dissolve()
end
end
end
if context.setting_blind and G.GAME.blind:get_type() == "Boss" and not G.GAME.blind.disabled then
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize("ph_boss_disabled") }
)
G.GAME.blind:disable()
end
end,
in_pool = function(self, wawa, wawa2)
return false
end,
cry_credits = {
idea = {
"Squiddy",
},
art = {
"B",
},
code = {
"wawa person",
},
},
}
local cookie = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
key = "clicked_cookie",
pos = { x = 2, y = 6 },
rarity = 1,
cost = 4,
atlas = "atlastwo",
order = 133,
config = { extra = { chips = 200, chip_mod = 1 } },
blueprint_compat = true,
eternal_compat = false,
perishable_compat = false,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.chips, center.ability.extra.chip_mod } }
end,
calculate = function(self, card, context)
if context.joker_main then
return {
card = card,
chip_mod = card.ability.extra.chips,
message = "+" .. card.ability.extra.chips,
colour = G.C.CHIPS,
}
end
if context.cry_press then
if card.ability.extra.chips - card.ability.extra.chip_mod <= 0 then
G.E_MANAGER:add_event(Event({
func = function()
play_sound("tarot1")
card.T.r = -0.2
card:juice_up(0.3, 0.4)
card.states.drag.is = true
card.children.center.pinch.x = true
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.3,
blockable = false,
func = function()
G.jokers:remove_card(card)
card:remove()
card = nil
return true
end,
}))
return true
end,
}))
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_eaten_ex"), colour = G.C.CHIPS }
)
else
card.ability.extra.chips = card.ability.extra.chips - card.ability.extra.chip_mod
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = "-" .. card.ability.extra.chip_mod, colour = G.C.CHIPS }
)
end
end
end,
cry_credits = {
idea = {
"playerrWon",
},
art = {
"lolxDdj",
},
code = {
"wawa person",
},
},
}
local necromancer = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Necromancer",
key = "necromancer",
pos = { x = 3, y = 5 },
config = {},
rarity = 2,
cost = 5,
atlas = "atlastwo",
order = 126,
immutable = true,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra } }
end,
calculate = function(self, card, context)
if
context.selling_card
and context.card.sell_cost > 0
and context.card.config.center.set == "Joker"
and G.GAME.jokers_sold
and #G.GAME.jokers_sold > 0
and not context.blueprint
and not context.retrigger_joker
then
local card = create_card(
"Joker",
G.jokers,
nil,
nil,
nil,
nil,
G.GAME.jokers_sold[pseudorandom("cry_necromancer", 1, #G.GAME.jokers_sold)]
)
card.sell_cost = 0
card:add_to_deck()
G.jokers:emplace(card)
card:start_materialize()
end
end,
cry_credits = {
idea = {
"Pyrocreep",
},
art = {
"Pyrocreep",
},
code = {
"Foegro",
},
},
}
local oil_lamp = { --You want it? It's yours my friend
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Oil-Lamp",
key = "oil_lamp",
pos = { x = 4, y = 5 },
config = { extra = { increase = 1.2 } },
rarity = 3,
cost = 10,
order = 127,
atlas = "atlastwo",
loc_vars = function(self, info_queue, card)
card.ability.blueprint_compat_ui = card.ability.blueprint_compat_ui or ""
card.ability.blueprint_compat_check = nil
return {
vars = { card.ability.extra.increase },
main_end = (card.area and card.area == G.jokers) and {
{
n = G.UIT.C,
config = { align = "bm", minh = 0.4 },
nodes = {
{
n = G.UIT.C,
config = {
ref_table = card,
align = "m",
colour = G.C.JOKER_GREY,
r = 0.05,
padding = 0.06,
func = "blueprint_compat",
},
nodes = {
{
n = G.UIT.T,
config = {
ref_table = card.ability,
ref_value = "blueprint_compat_ui",
colour = G.C.UI.TEXT_LIGHT,
scale = 0.32 * 0.8,
},
},
},
},
},
},
} or nil,
}
end,
update = function(self, card, front)
if G.STAGE == G.STAGES.RUN then
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
other_joker = G.jokers.cards[i + 1]
end
end
if other_joker and other_joker ~= card and not (Card.no(other_joker, "immutable", true)) then
card.ability.blueprint_compat = "compatible"
else
card.ability.blueprint_compat = "incompatible"
end
end
end,
calculate = function(self, card, context)
if context.end_of_round and not context.repetition and not context.individual and not context.blueprint then
local check = false
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == card then
if i < #G.jokers.cards then
if not Card.no(G.jokers.cards[i + 1], "immutable", true) then
check = true
Cryptid.with_deck_effects(G.jokers.cards[i + 1], function(cards)
Cryptid.misprintize(
cards,
{ min = card.ability.extra.increase, max = card.ability.extra.increase },
nil,
true
)
end)
end
end
end
end
if check then
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex"), colour = G.C.GREEN }
)
end
end
end,
cry_credits = {
idea = {
"AlexZGreat",
},
art = {
"AlexZGreat",
},
code = {
"Foegro",
},
},
}
local tax_fraud = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Tax-Fraud",
key = "tax_fraud",
pos = { x = 4, y = 6 },
config = { extra = { money = 6 } },
rarity = 3,
cost = 10,
order = 128,
atlas = "atlastwo",
in_pool = function(self)
if not G.GAME.modifiers.enable_rentals_in_shop then
return false
end
return true
end,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.money } }
end,
calc_dollar_bonus = function(self, card)
if #Cryptid.advanced_find_joker(nil, nil, nil, { "rental" }, true) ~= 0 then
return card.ability.extra.money * #Cryptid.advanced_find_joker(nil, nil, nil, { "rental" }, true)
end
end,
cry_credits = {
idea = {
"DoNotSus",
},
art = {
"Dragokillfist",
},
code = {
"Foegro",
},
},
}
local pity_prize = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Pity-Prize",
key = "pity_prize",
blueprint_compat = true,
pos = { x = 5, y = 5 },
config = {},
rarity = 1,
cost = 2,
atlas = "atlastwo",
order = 129,
loc_vars = function(self, info_queue, center)
return { vars = {} }
end,
calculate = function(self, card, context)
if context.skipping_booster then
local tag_key
repeat
tag_key = get_next_tag_key("cry_pity_prize")
until tag_key ~= "tag_boss" --I saw pickle not generating boss tags because it apparently causes issues, so I did the same here
-- this is my first time seeing repeat... wtf
local tag = Tag(tag_key)
tag.ability.shiny = Cryptid.is_shiny()
if tag.name == "Orbital Tag" then
local _poker_hands = {}
for k, v in pairs(G.GAME.hands) do
if v.visible then
_poker_hands[#_poker_hands + 1] = k
end
end
tag.ability.orbital_hand = pseudorandom_element(_poker_hands, pseudoseed("cry_pity_prize"))
end
add_tag(tag)
if Card.get_gameset(card) == "modest" and not context.blueprint and not context.retrigger_joker then
G.E_MANAGER:add_event(Event({
func = function()
play_sound("tarot1")
card.T.r = -0.2
card:juice_up(0.3, 0.4)
card.states.drag.is = true
card.children.center.pinch.x = true
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.3,
blockable = false,
func = function()
G.jokers:remove_card(card)
card:remove()
card = nil
return true
end,
}))
return true
end,
}))
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{ message = localize("k_extinct_ex"), colour = G.C.FILTER }
)
end
return nil, true
end
end,
cry_credits = {
idea = {
"Pyrocreep",
},
art = {
"Pyrocreep",
},
code = {
"Foegro",
},
},
}
local digitalhallucinations = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Digital Hallucinations",
key = "digitalhallucinations",
pos = { x = 0, y = 7 },
order = 130,
config = { odds = 2 },
loc_vars = function(self, info_queue, card)
return {
vars = { cry_prob(card.ability.cry_prob, card.ability.odds, card.ability.cry_rigged), card.ability.odds },
}
end,
atlas = "atlasthree",
rarity = 2,
cost = 8,
blueprint_compat = true,
calculate = function(self, card, context)
-- you know, i was totally ready to do something smart here but vanilla hardcodes this stuff, so i will too
-- some cards need to be handled slightly differently anyway, adding mod support can't really be automatic in some circumstances
if
context.open_booster
and (
pseudorandom("digi")
< cry_prob(card.ability.cry_prob, card.ability.odds, card.ability.cry_rigged) / card.ability.odds
)
then
local boosty = context.card
-- finally mod compat?
if boosty.config.center.cry_digital_hallucinations then
local conf = boosty.config.center.cry_digital_hallucinations
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 0.0,
func = function()
conf.create()
return true
end,
}))
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize(conf.loc_key), colour = conf.colour }
)
return nil, true
end
local consums = { "Arcana", "Celestial", "Spectral" }
local short1 = { "tarot", "planet", "spectral" }
local short2 = { "Tarot", "Planet", "Spectral" }
for i = 1, #consums do
if boosty.ability.name:find(consums[i]) then
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 0.0,
func = function()
local ccard = create_card(short2[i], G.consumeables, nil, nil, nil, nil, nil, "diha")
ccard:set_edition({ negative = true }, true)
ccard:add_to_deck()
G.consumeables:emplace(ccard)
return true
end,
}))
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize("k_plus_" .. short1[i]), colour = G.C.SECONDARY_SET[short2[i]] }
)
return nil, true -- this triggers BEFORE a retrigger joker and looks like jank. i can't get a message showing up without status text so this is the best option rn
end
end
if boosty.ability.name:find("Buffoon") then
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 0.0,
func = function()
local ccard = create_card(
boosty.ability.name:find("meme") and "Meme" or "Joker",
G.jokers,
nil,
nil,
nil,
nil,
nil,
"diha"
) -- who up wasting their cycles rn
ccard:set_edition({ negative = true }, true)
ccard:add_to_deck()
G.jokers:emplace(ccard)
ccard:start_materialize()
return true
end,
}))
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize("k_plus_joker"), colour = G.C.FILTER }
)
return nil, true
end
if boosty.ability.name:find("Standard") then
G.E_MANAGER:add_event(Event({
func = function()
local front = pseudorandom_element(G.P_CARDS, pseudoseed("diha_p"))
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
local ccard = Card(
G.play.T.x + G.play.T.w / 2,
G.play.T.y,
G.CARD_W,
G.CARD_H,
front,
G.P_CENTERS.c_base,
{ playing_card = G.playing_card }
)
ccard:set_edition({ negative = true }, true)
ccard:start_materialize({ G.C.SECONDARY_SET.Enhanced })
G.play:emplace(ccard)
playing_card_joker_effects({ ccard }) -- odd timing
table.insert(G.playing_cards, ccard)
return true
end,
}))
card_eval_status_text(
context.blueprint_card or card,
"extra",
nil,
nil,
nil,
{ message = localize("cry_plus_card"), colour = G.C.FILTER }
)
G.E_MANAGER:add_event(Event({
func = function()
G.deck.config.card_limit = G.deck.config.card_limit + 1
return true
end,
}))
draw_card(G.play, G.deck, 90, "up", nil)
return nil, true
end
end
end,
cry_credits = {
idea = {
"lolxddj",
},
art = {
"lolxddj",
},
code = {
"toneblock",
},
},
}
local arsonist = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Arsonist",
key = "arsonist",
pos = { x = 0, y = 5 },
config = {},
rarity = 3,
cost = 5,
atlas = "atlasone",
order = 131,
loc_vars = function(self, info_queue, center)
return { vars = {} }
end,
calculate = function(self, card, context)
if context.destroying_card then
local eval = evaluate_poker_hand(context.full_hand)
if next(eval["Full House"]) then
return not context.destroying_card.ability.eternal
end
end
end,
cry_credits = {
idea = {
"AlexZGreat",
},
art = {
"Darren_The_Frog",
},
code = {
"AlexZGreat",
},
},
}
local zooble = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-Zooble",
key = "zooble",
pos = { x = 1, y = 5 },
config = { extra = { mult = 0, a_mult = 1 } },
rarity = 2,
cost = 6,
atlas = "atlasone",
order = 132,
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.mult, center.ability.extra.a_mult } }
end,
calculate = function(self, card, context)
if context.before and context.cardarea == G.jokers then
if not (next(context.poker_hands["Straight"]) or next(context.poker_hands["Straight Flush"])) then
local unique_ranks = {}
for i, v in pairs(context.scoring_hand) do
if not (SMODS.has_no_rank(v) and not v.vampired) then
local not_unique = false
for i = 1, #unique_ranks do
if unique_ranks[i] == v:get_id() then
not_unique = true
end
end
if not not_unique then
unique_ranks[#unique_ranks + 1] = v:get_id()
end
end
end
if #unique_ranks >= 1 then
card.ability.extra.mult = card.ability.extra.mult + (#unique_ranks * card.ability.extra.a_mult)
return {
message = localize("k_upgrade_ex"),
colour = G.C.RED,
card = card,
}
end
end
end
if context.joker_main and card.ability.extra.mult > 0 then
return {
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.extra.mult } }),
mult_mod = card.ability.extra.mult,
}
end
end,
cry_credits = {
idea = {
"lolxDdj",
},
art = {
"lolxDdj",
},
code = {
"AlexZGreat",
},
},
}
local lebaron_james = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-LeBaron James",
pools = { ["Meme"] = true },
key = "lebaron_james",
pos = { x = 2, y = 5 },
config = { extra = { h_mod = 1 } },
blueprint_compat = true,
rarity = 3,
cost = 6,
atlas = "atlasone",
order = 133,
no_dbl = true,
immutable = true, -- has issues with value manip and not easy to fix
loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.h_mod } }
end,
calculate = function(self, card, context)
if context.cardarea == G.play and context.individual then
if context.other_card:get_id() == 13 then
local h_size = math.max(0, math.min(1000 - 0, card.ability.extra.h_mod))
G.hand:change_size(math.floor(h_size))
G.GAME.round_resets.temp_handsize = (G.GAME.round_resets.temp_handsize or 0) + math.floor(h_size)
if math.floor(h_size) > 0 then
return {
message = localize({ type = "variable", key = "a_handsize", vars = { math.floor(h_size) } }),
colour = G.C.FILTER,
card = card,
}
end
end
end
end,
cry_credits = {
idea = {
"indefenite_idiot",
"HexaCryonic",
},
code = {
"AlexZGreat",
},
art = {
"lamborghiniofficial",
},
},
init = function(self)
-- Calculate enhancements for kings as if held in hand
-- Note that for enhancements that work when played and held in hand, this will fail
-- Not tested since no enhancements use this yet (Steel is weird, and Gold won't work)
local cce = Card.calculate_enhancement
function Card:calculate_enhancement(context)
local ret = cce(self, context)
if
not ret
and next(SMODS.find_card("j_cry_lebaron_james"))
and SMODS.Ranks[self.base.value].key == "King"
and context.cardarea == G.play
then
context.cardarea = G.hand
local ret = cce(self, context)
context.cardarea = G.play
end
return ret
end
end,
}
local huntingseason = { -- If played hand contains three cards, destroy the middle card after scoring
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-huntingseason",
key = "huntingseason",
pos = { x = 4, y = 5 },
order = 134,
immutable = true,
rarity = 2,
cost = 7,
blueprint_compat = false,
atlas = "atlasone",
calculate = function(self, card, context)
if
(context.cardarea == G.play or context.cardarea == "unscored")
and context.destroy_card == context.full_hand[2]
and #context.full_hand == 3 -- 3 cards in played hand
and not context.blueprint
and not context.retrigger_joker
then
return { remove = not context.destroy_card.ability.eternal }
end
end,
cry_credits = {
art = {
"Unexian",
},
idea = {
"Nova",
},
code = {
"Nova",
},
},
}
local cat_owl = { -- Lucky Cards are considered Echo Cards and vice versa
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
"m_cry_echo",
"set_cry_misc",
},
},
name = "cry-cat_owl",
pools = { ["Meme"] = true },
key = "cat_owl",
pos = { x = 6, y = 5 },
order = 135,
rarity = 3,
cost = 8,
blueprint_compat = false,
atlas = "atlasone",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue + 1] = G.P_CENTERS.m_lucky
info_queue[#info_queue + 1] = G.P_CENTERS.m_cry_echo
end,
calculate = function(self, card, context)
if context.check_enhancement then
if context.other_card.config.center.key == "m_lucky" then
return { m_cry_echo = true }
end
if context.other_card.config.center.key == "m_cry_echo" then
return { m_lucky = true }
end
end
end,
cry_credits = {
idea = {
"Math",
},
code = {
"Math",
},
art = {
"George the Rat",
},
},
}
local eyeofhagane = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-eyeofhagane",
key = "eyeofhagane",
order = 136,
pos = { x = 5, y = 6 },
rarity = 2,
cost = 6,
blueprint_compat = false,
immutable = true,
atlas = "atlastwo", -- https://discord.com/channels/1264429948970733782/1274103559113150629/1351479917367263312
calculate = function(self, card, context)
if context.before then
local faces = {}
for k, v in ipairs(context.scoring_hand) do
if v:is_face() then
faces[#faces + 1] = v
v:set_ability(G.P_CENTERS.m_steel, nil, true)
G.E_MANAGER:add_event(Event({
func = function()
v:juice_up()
return true
end,
}))
end
end
if #faces > 0 then
return {
message = "Steel",
colour = G.C.UI.TEXT_INACTIVE,
card = self,
}
end
end
end,
cry_credits = {
idea = { "Soren" },
code = { "Lexi" },
art = { "Soren" },
},
}
local highfive = {
object_type = "Joker",
dependencies = {
items = {
"set_cry_misc_joker",
},
},
name = "cry-highfive",
key = "highfive",
order = 137,
atlas = "atlastwo",
pos = { x = 4, y = 1 },
blueprint_compat = false,
eternal_compat = true,
perishable_compat = true,
rarity = 3,
cost = 5,
calculate = function(self, card, context)
if context.final_scoring_step then
local maximum = -1
local fives = 0
for k, v in ipairs(context.scoring_hand) do
if not SMODS.has_no_rank(v) then
local thunk = v:get_id() == 14 and 1 or v:get_id()
if thunk == 5 then
fives = fives + 1
end
if thunk > maximum then
maximum = thunk
end
end
end
local whapoosh = false
if maximum == 5 and fives ~= #context.scoring_hand then
for index = 1, #context.scoring_hand do
local v = context.scoring_hand[index]
if v:get_id() ~= 5 and not SMODS.has_no_rank(v) then
whapoosh = true
G.E_MANAGER:add_event(Event({
func = function()
assert(SMODS.change_base(v, _, "5"))
v:juice_up()
return true
end,
}))
end
end
if whapoosh then
G.E_MANAGER:add_event(Event({
func = function()
play_sound("cry_whapoosh")
return true
end,
}))
return {
message = localize("cry_highfive_ex"),
}
end
end
end
end,
cry_credits = {
idea = { "cassknows" },
art = { "MarioFan597" },
code = { "astrapboy" },
},
}
local miscitems = {
jimball_sprite,
dropshot,
happyhouse,
maximized,
potofjokes,
queensgambit,
wee_fib,
compound_interest,
whip,
pickle,
triplet_rhythm,
booster,
chili_pepper,
lucky_joker,
cursor,
cube,
big_cube,
nice,
sus,
chad,
jimball,
waluigi,
wario,
eternalflame,
seal_the_deal,
fspinner,
krustytheclown,
blurred,
gardenfork,
lightupthenight,
nosound,
antennastoheaven,
hunger,
weegaming,
redbloon,
apjoker,
maze,
panopticon,
magnet,
unjust_dagger,
monkey_dagger,
pirate_dagger,
mondrian,
sapling,
spaceglobe,
happy,
meteor,
exoplanet,
stardust,
rnjoker,
filler,
duos,
home,
nuts,
quintet,
unity,
swarm,
coin,
wheelhope,
night,
busdriver,
oldblueprint,
morse,
membershipcard,
kscope,
cryptidmoment,
oldinvisible,
fractal,
giggly,
nutty,
manic,
silly,
delirious,
wacky,
kooky,
dubious,
shrewd,
tricksy,
foxy,
savvy,
subtle,
discreet,
kittyprinter,
kidnap,
exposed,
mask,
tropical_smoothie,
--pumpkin,
--carved_pumpkin,
cookie,
necromancer,
oil_lamp,
tax_fraud,
pity_prize,
digitalhallucinations,
arsonist,
zooble,
flipside,
universe,
astral_bottle,
stronghold,
wtf,
clash,
adroit,
penetrating,
treacherous,
bonkers,
fuckedup,
foolhardy,
translucent,
lebaron_james,
huntingseason,
--cat_owl,
--eyeofhagane, (apparently this wasn't screened)
highfive,
}
return {
name = "Misc. Jokers",
init = function()
-- Add more calculation contexts (used by Pumpkin and Clicked Cookie)
local oldfunc = Card.start_dissolve
function Card:start_dissolve(dissolve_colours, silent, dissolve_time_fac, no_juice)
if G and G.jokers and G.jokers.cards then
SMODS.calculate_context({ cry_start_dissolving = true, card = self })
end
return oldfunc(self, dissolve_colours, silent, dissolve_time_fac, no_juice)
end
local lcpref = Controller.L_cursor_press
function Controller:L_cursor_press(x, y)
lcpref(self, x, y)
if G and G.jokers and G.jokers.cards and not G.SETTINGS.paused then
SMODS.calculate_context({ cry_press = true })
end
end
end,
items = miscitems,
}