local dropshot = {
	object_type = "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.cardarea == G.jokers
			and (to_big(card.ability.extra.x_mult) > to_big(1))
			and not context.before
			and not context.after
		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"
		},
		code = {
			"Math"
		}
	},
}
local happyhouse = {
	object_type = "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"
				)
			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.cardarea == G.jokers
			and (to_big(card.ability.extra.mult) > to_big(1))
			and card.ability.extra.check > 113
			and not context.before
			and not context.after
		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",
	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"
		}
	},
}
local potofjokes = {
	object_type = "Joker",
	name = "cry-Pot of Jokes",
	key = "pot_of_jokes",
	config = { extra = { h_size = -2, h_mod = 1 } },
	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,
			},
		}
	end,
	calculate = function(self, card, context)
		if context.end_of_round and not context.individual and not context.repetition and not context.blueprint then
			G.hand:change_size(math.min(1000-card.ability.extra.h_size, card.ability.extra.h_mod))
			card.ability.extra.h_size = card.ability.extra.h_size + card.ability.extra.h_mod
			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(1000, card.ability.extra.h_size))
	end,
	remove_from_deck = function(self, card, from_debuff)
		G.hand:change_size(-1*math.min(1000, card.ability.extra.h_size))
	end,
	cry_credits = {
		idea = {
			"Mjiojio"
		},
		art = {
			"Ein13"
		},
		code = {
			"Math"
		}
	},
	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",
	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 SMODS.Ranks[context.destroying_card.base.value].key == "Queen"
			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 nil, true
			end
		end
	end,
	cry_credits = {
		idea = {
			"Project666"
		},
		art = {
			"Ein13"
		},
		code = {
			--wonder what happened to this guy
			"Thedrunkenbrick"
		}
	},
}
local wee_fib = {
	object_type = "Joker",
	name = "cry-Wee Fibonacci",
	key = "wee_fib",
	config = { extra = { mult = 0, mult_mod = 3 } },
	pos = { x = 1, y = 5 },
	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 = SMODS.Ranks[context.other_card.base.value].key
			if rank == "Ace" 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.cardarea == G.jokers
			and (to_big(card.ability.extra.mult) > to_big(0))
			and not context.before
			and not context.after
		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",
	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.cardarea == G.jokers
			and (to_big(card.ability.extra.x_mult) > to_big(1))
			and not context.before
			and not context.after
		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",
	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",
	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.cardarea == G.jokers
			and (to_big(card.ability.extra.chips) > to_big(0))
			and not context.before
			and not context.after
		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",
	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",
	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 = Tag(get_next_tag_key("cry_pickle"))
				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
				if tag.name == "Boss Tag" then
					i = i - 1 --skip these, as they can cause bugs with pack opening from other tags
				else
					add_tag(tag)
				end
			end
			card_eval_status_text(
				card,
				"extra",
				nil,
				nil,
				nil,
				{
					message = "+"..localize({ type = "variable", key = "a_tag" .. (card.ability.extra.tags > 1 and "s" or ""), 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 = "a_tag" .. (card.ability.extra.tags > 1 and "s" or ""), vars = { card.ability.extra.tags } })[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"
		},
		code = {
			"Math"
		}
	},
}
local cube = {
	object_type = "Joker",
	name = "cry-Cube",
	key = "cube",
	config = { extra = { chips = 6 } },
	pos = { x = 5, y = 4 },
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after and context.scoring_hand then
			local threes = 0
			for i = 1, #context.scoring_hand do
				if SMODS.Ranks[context.scoring_hand[i].base.value].key == "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",
	name = "cry-Booster Joker",
	key = "booster",
	config = { extra = { booster_slots = 1 } },
	pos = { x = 2, y = 0 },
	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)
		if not G.GAME.modifiers.cry_booster_packs then
			G.GAME.modifiers.cry_booster_packs = 2
		end
		G.GAME.modifiers.cry_booster_packs = G.GAME.modifiers.cry_booster_packs + math.min(25, card.ability.extra.booster_slots)
	end,
	remove_from_deck = function(self, card, from_debuff)
		if not G.GAME.modifiers.cry_booster_packs then
			G.GAME.modifiers.cry_booster_packs = 2
		end
		G.GAME.modifiers.cry_booster_packs = G.GAME.modifiers.cry_booster_packs - math.min(25, card.ability.extra.booster_slots)
	end,
	cry_credits = {
		idea = {
			"Ein13"
		},
		art = {
			"Jevonn"
		},
		code = {
			"Math"
		}
	},
}
local chili_pepper = {
	object_type = "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",
	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.cardarea == G.jokers
			and not context.before
			and not context.after
			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"
		},
		code = {
			"Math"
		}
	},
}
local compound_interest = {
	object_type = "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 > 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
			compound_interest_scale_mod(card, card.ability.extra.percent_mod, old, card.ability.extra.percent)
			if bonus > 0 then
				if G.GAME.dollars > 1e10 then
					return 1
				else
					return bonus
				end
			end
		else 
			return 0
		end
	end,
	cry_credits = {
		idea = {
			"Mjiojio"
		},
		art = {
			"Linus Goof Balls"
		},
		code = {
			"Math"
		}
	},
}
local big_cube = {
	object_type = "Joker",
	name = "cry-Big Cube",
	key = "big_cube",
	joker_gate = "cry-Cube",
	config = { extra = { x_chips = 6 } },
	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.cardarea == G.jokers and not context.before and not context.after 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 = {
			"Mystick Myclick"
		},
		art = {
			"AlexZGreat"
		},
		code = {
			"Math"
		}
	},
}
local eternalflame = {
	object_type = "Joker",
	name = "cry-eternalflame",
	key = "eternalflame",
	pos = { x = 0, y = 4 },
	config = { extra = { extra = 0.1, 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 } }
	end,
	atlas = "atlasone",
	calculate = function(self, card, context)
		if
			context.cardarea == G.jokers
			and (to_big(card.ability.extra.x_mult) > to_big(1))
			and not context.before
			and not context.after
		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.selling_card 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",
	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 and not context.after 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 not context.before and not context.after 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",
	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["Misc."] then sealtable[#sealtable + 1] = "azure" end
		if Cryptid.enabled["Code Cards"] then sealtable[#sealtable + 1] = "green" end
		card.ability.extra = pseudorandom_element(sealtable, pseudoseed('abc'))
		if G.P_CENTERS["j_cry_seal_the_deal"].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",
	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",
	name = "cry-Jimball",
	key = "jimball",
	pos = { x = 0, y = 0 },
	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
			create_cryptid_notif_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,
}
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
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",
	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 not context.cardarea 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"
		},
		code = {
			"Math"
		}
	},
}
local fspinner = {
	object_type = "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 = 6,
	order = 77,
	blueprint_compat = true,
	perishable_compat = false,
	atlas = "fspinner",
	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.cardarea == G.jokers
			and (to_big(card.ability.extra.chips) > to_big(0))
			and not context.before
			and not context.after
		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"
		},
		code = {
			"Jevonn"
		}
	},
}

local waluigi = {
	object_type = "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",
	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
			ease_dollars(card.ability.extra.money)
			if not Talisman.config_file.disable_anims then
				G.E_MANAGER:add_event(Event({
					func = function()
						(context.blueprint_card or card):juice_up(0.5, 0.5)
						return true
					end,
				}))
			end
			card_eval_status_text(
				context.other_context.blueprint_card or context.other_joker,
				"extra",
				nil,
				nil,
				nil,
				{ message = localize("$") .. card.ability.extra.money, colour = G.C.MONEY }
			)
			return nil, true
		end
	end,

	rarity = 4,
	cost = 20,
	blueprint_compat = true,
	atlas = "atlasthree",
	cry_credits = {
		idea = {
			"Auto Watto"
		},
		art = {
			"Linus Goof Balls"
		},
		code = {
			"Auto Watto"
		}
	},
}
local krustytheclown = {
	object_type = "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.cardarea == G.jokers
			and (to_big(card.ability.extra.x_mult) > to_big(1))
			and not context.before
			and not context.after
		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",
	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",
	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 not context.blueprint then
			for i = 1, #context.full_hand do
				if SMODS.Ranks[context.full_hand[i].base.value].key == "Ace" then
					for j = 1, #context.full_hand do
						if SMODS.Ranks[context.full_hand[j].base.value].key == "7" then
							ease_dollars(card.ability.extra.money)
							return { message = "$" .. card.ability.extra.money, colour = G.C.MONEY }
						end
					end
				end
			end
		end
	end,
	cry_credits = {
		idea = {
			"HexaCryonic"
		},
		art = {
			"HexaCryonic"
		},
		code = {
			"Jevonn"
		}
	},
}
local lightupthenight = {
	object_type = "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 = SMODS.Ranks[context.other_card.base.value].key
			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",
	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
				local rank = SMODS.Ranks[context.other_card.base.value].key
				if rank == "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",
	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.cardarea == G.jokers
			and (to_big(card.ability.extra.x_chips) > to_big(1))
			and not context.before
			and not context.after
		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 = SMODS.Ranks[context.other_card.base.value].key
			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",
	name = "cry-hunger",
	key = "hunger",
	config = { extra = { money = 3 } },
	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) --This didn't work for Jevonn for some reason but it works for me :joker:
		if context.using_consumeable then --shush
			ease_dollars(card.ability.extra.money)
			card_eval_status_text(
					context.blueprint_card or card,
					"extra",
					nil,
					nil,
					nil,
					{ message = "$" .. card.ability.extra.money, colour = G.C.MONEY, }
			)
		end
	end,
	cry_credits = {
		idea = {
			"Mjiojio"
		},
		art = {
			"AlexZGreat"
		},
		code = {
			"Jevonn"
		}
	},
}
local weegaming = {
	object_type = "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
				local rank = SMODS.Ranks[context.other_card.base.value].key
				if rank == "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",
	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 = {
			"Jevonn"
		},
		code = {
			"Jevonn"
		}
	},
}
local apjoker = {
	object_type = "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.cardarea == G.jokers and G.GAME.blind.boss and not context.before and not context.after 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",
	name = "cry-maze",
	key = "maze",
	pos = { x = 1, y = 1 },
	rarity = 1,
	cost = 1,
	order = 61,
	immutable = true,
	atlas = "atlastwo",
	calculate = function(self, card, context)
		if context.after and not context.blueprint and not context.retrigger_joker then
			G.E_MANAGER:add_event(Event({
				trigger = "after",
				delay = 0.3,
				blockable = false,
				func = function()
					G.GAME.current_round.hands_played = 0
					G.GAME.current_round.discards_used = 0
					return true
				end,
			}))
			return true
		end
		if context.discard and not context.blueprint and not context.retrigger_joker then
			G.E_MANAGER:add_event(Event({
				trigger = "after",
				delay = 0.3,
				blockable = false,
				func = function()
					G.GAME.current_round.hands_played = 0
					G.GAME.current_round.discards_used = 0
					return true
				end,
			}))
			return true
		end
	end,
	add_to_deck = function(self, card, from_debuff)
		G.GAME.current_round.hands_played = 0
		G.GAME.current_round.discards_used = 0
	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",
	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",
	name = "cry-magnet",
	key = "magnet",
	pos = { x = 4, y = 0 },
	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",
	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.cardarea == G.jokers
			and (card.ability.extra.x_mult > 1)
			and not context.before
			and not context.after
		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",
	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.cardarea == G.jokers
			and (to_big(card.ability.extra.chips) > to_big(0))
			and not context.before
			and not context.after
		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",
	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.cardarea == G.jokers
			and (card.ability.extra.x_chips > 1)
			and not context.before
			and not context.after
		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",
	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.cardarea == G.jokers
			and (to_big(card.ability.extra.x_mult) > to_big(1))
			and not context.before
			and not context.after
		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",
	name = "cry-sapling",
	key = "sapling",
	pos = { x = 3, y = 2 },
	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 } }
	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
				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, cry_enable_epics and 'cry_epic' or 1, 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"
		},
		code = {
			"Jevonn"
		}
	},
}
local spaceglobe = {
	object_type = "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.cardarea == G.jokers
			and (to_big(card.ability.extra.x_chips) > to_big(1))
			and not context.before
			and not context.after
		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 = {
			"Jevonn"
		},
		code = {
			"Jevonn"
		}
	},
}
local happy = {
	object_type = "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
			and not context.retrigger_joker
		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
			and not context.retrigger_joker
		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",
	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",
	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",
	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"
		}
	},
}
function 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 localalize_with_direct(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
local rnjoker = {
	object_type = "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 = {}
		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)
			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)
		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
		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
			localalize_with_direct(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"
		}
	},
}
local duos = {
	object_type = "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.cardarea == G.jokers
			and (to_big(card.ability.x_mult) > to_big(1))
			and not context.before
			and not context.after
		then
			if context.poker_hands~= nil and next(context.poker_hands["Two Pair"]) 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",
	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.cardarea == G.jokers
			and (to_big(card.ability.x_mult) > to_big(1))
			and not context.before
			and not context.after
		then
			if 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 = 'Full House'},
}
local nuts = {
	object_type = "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.cardarea == G.jokers
			and (to_big(card.ability.x_mult) > to_big(1))
			and not context.before
			and not context.after
		then
			if context.poker_hands ~= nil and  next(context.poker_hands["Straight Flush"]) 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",
	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.cardarea == G.jokers
			and (to_big(card.ability.x_mult) > to_big(1))
			and not context.before
			and not context.after
		then
			if context.poker_hands~= nil and next(context.poker_hands["Five of a Kind"]) 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 == 'cry_win_with_hand' and args.hand == 'Five of a Kind' then return true end
	end,
	cry_credits = {
		idea = {
			"Mathguy"
		},
		art = {
			"Mathguy"
		},
		code = {
			"Mathguy"
		}
	},
	unlocked = false,
}
local unity = {
	object_type = "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.cardarea == G.jokers
			and (to_big(card.ability.x_mult) > to_big(1))
			and not context.before
			and not context.after
		then
			if context.poker_hands~= nil and next(context.poker_hands["Flush 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,
	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 == 'cry_win_with_hand' and args.hand == 'Flush House' then return true end
	end,
	cry_credits = {
		idea = {
			"Mathguy"
		},
		art = {
			"Mathguy"
		},
		code = {
			"Mathguy"
		}
	},
	unlocked = false,
}
local swarm = {
	object_type = "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.cardarea == G.jokers
			and (to_big(card.ability.x_mult) > to_big(1))
			and not context.before
			and not context.after
		then
			if context.poker_hands~= nil and next(context.poker_hands["Flush Five"]) 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 == 'cry_win_with_hand' and args.hand == 'Flush Five' then return true end
	end,
	cry_credits = {
		idea = {
			"Mathguy"
		},
		art = {
			"Mathguy"
		},
		code = {
			"Mathguy"
		}
	},
	unlocked = false,
}
local stronghold = {
	object_type = "Joker",
	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("cry_hand_bulwark") } }
	end,
	atlas = "atlasthree",
	rarity = 3,
	cost = 8,
	blueprint_compat = true,
	calculate = function(self, card, context)
		if
			context.cardarea == G.jokers
			and (to_big(card.ability.x_mult) > to_big(1))
			and not context.before
			and not context.after
		then
			if context.poker_hands~= nil and next(context.poker_hands["cry_Bulwark"]) 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 == 'cry_win_with_hand' and args.hand == 'cry_Bulwark' then return true end
	end,
	unlocked = false,
}
local wtf = {
	object_type = "Joker",
	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("cry_hand_clusterfuck") } }
	end,
	atlas = "atlasthree",
	rarity = 3,
	cost = 8,
	blueprint_compat = true,
	calculate = function(self, card, context)
		if
			context.cardarea == G.jokers
			and (to_big(card.ability.x_mult) > to_big(1))
			and not context.before
			and not context.after
		then
			if context.poker_hands~= nil and next(context.poker_hands["cry_Clusterfuck"]) 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 == 'cry_win_with_hand' and args.hand == 'cry_Clusterfuck' then return true end
	end,
	unlocked = false,
}
local clash = {
	object_type = "Joker",
	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("cry_hand_ultpair") } }
	end,
	atlas = "atlasthree",
	rarity = 3,
	cost = 8,
	blueprint_compat = true,
	calculate = function(self, card, context)
		if
			context.cardarea == G.jokers
			and (to_big(card.ability.x_mult) > to_big(1))
			and not context.before
			and not context.after
		then
			if context.poker_hands~= nil and next(context.poker_hands["cry_UltPair"]) 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 == 'cry_win_with_hand' and args.hand == 'cry_UltPair' then return true end
	end,
	unlocked = false,
}
local filler = {
	object_type = "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.cardarea == G.jokers and not context.before and not context.after and context.poker_hands and next(context.poker_hands["High Card"]) 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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("cry_hand_bulwark") } }
	end,
	atlas = "atlasthree",
	rarity = 1,
	effect = "Cry Type Mult",
	cost = 4,
	blueprint_compat = true,
	calculate = function(self, card, context)
		if context.cardarea == G.jokers and not context.before and not context.after 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",
	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("cry_hand_clusterfuck") } }
	end,
	atlas = "atlasthree",
	rarity = 1,
	effect = "Cry Type Mult",
	cost = 4,
	blueprint_compat = true,
	calculate = function(self, card, context)
		if context.cardarea == G.jokers and not context.before and not context.after 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",
	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("cry_hand_ultpair") } }
	end,
	atlas = "atlasthree",
	rarity = 1,
	effect = "Cry Type Mult",
	cost = 4,
	blueprint_compat = true,
	calculate = function(self, card, context)
		if context.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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.cardarea == G.jokers and not context.before and not context.after 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",
	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("cry_hand_bulwark") } }
	end,
	atlas = "atlasthree",
	rarity = 1,
	cost = 4,
	blueprint_compat = true,
	calculate = function(self, card, context)
		if context.cardarea == G.jokers and not context.before and not context.after 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",
	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("cry_hand_clusterfuck") } }
	end,
	atlas = "atlasthree",
	rarity = 1,
	cost = 4,
	blueprint_compat = true,
	calculate = function(self, card, context)
		if context.cardarea == G.jokers and not context.before and not context.after 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",
	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("cry_hand_ultpair") } }
	end,
	atlas = "atlasthree",
	rarity = 1,
	cost = 4,
	blueprint_compat = true,
	calculate = function(self, card, context)
		if context.cardarea == G.jokers and not context.before and not context.after 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",
	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"
		},
		code = {
			"Jevonn"
		}
	},
}
local wheelhope = {
	object_type = "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.cardarea == G.jokers
			and (card.ability.extra.x_mult > 1)
			and not context.before
			and not context.after
		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",
	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)
			if other_joker_ret or trig then
				if not other_joker_ret then
					other_joker_ret = {}
				end
				other_joker_ret.card = context.blueprint_card or card
				other_joker_ret.colour = G.C.BLUE
				other_joker_ret.no_callback = true
				return other_joker_ret
			end
		end
	end,
	cry_credits = {
		idea = {
			"Linus Goof Balls"
		},
		art = {
			"Linus Goof Balls"
		},
		code = {
			"Math"
		}
	},
}
local night = {
	object_type = "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.cardarea == G.jokers
			and not context.before
			and not context.after
			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",
	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.cardarea == G.jokers
			and (card.ability.extra.mult > 0)
			and not context.before
			and not context.after
		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",
	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",
	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",
	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 * GLOBAL_cry_member_count } }
	end,
	calculate = function(self, card, context)
		if
			context.cardarea == G.jokers
			and not context.before
			and not context.after
			and card.ability.extra.Xmult_mod * GLOBAL_cry_member_count > 1
		then
			return {
				message = localize({
					type = "variable",
					key = "a_xmult",
					vars = { card.ability.extra.Xmult_mod * GLOBAL_cry_member_count },
				}),
				Xmult_mod = card.ability.extra.Xmult_mod * GLOBAL_cry_member_count,
			}
		end
	end,
	cry_credits = {
		idea = {
			"Toneblock"
		},
		art = {
			"HexaCryonic"
		},
		code = {
			"Toneblock"
		}
	},
}
local kscope = {
	object_type = "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",
	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",
	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",
	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",
	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
		G.hand:unhighlight_all()
	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",
	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",
	name = "cry-astral_bottle",
	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
	end,
	calculate = function(self, card, context)
		if context.selling_self and not context.retrigger_joker and not 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 and not G.jokers.cards[i].edition then
					jokers[#jokers + 1] = G.jokers.cards[i]
				end
			end
			if #jokers > 0 then
				card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("k_duplicated_ex") })
				local chosen_joker = pseudorandom_element(jokers, pseudoseed("trans"))
				chosen_joker:set_edition{cry_astral = true}
				chosen_joker.ability.perishable = true -- Done manually to bypass perish compat
				chosen_joker.ability.perish_tally = G.GAME.perishable_rounds
				return nil, true
			else
				card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("k_no_other_jokers") })
			end
		end
	end,
}
local kidnap = {
	object_type = "Joker",
	name = "cry-kidnap",
	key = "kidnap",
	order = 23,
	pos = { x = 1, y = 2 },
	config = {
		extra = { money = 1, money_mod = 3 },
		jolly = { t_mult = 8, type = "Pair" },
		zany = { t_mult = 12, type = "Three of a Kind" },
		mad = { t_mult = 10, type = "Two Pair" },
		crazy = { t_mult = 12, type = "Straight" },
		droll = { t_mult = 10, type = "Flush" },
	},
	rarity = 1,
	cost = 4,
	blueprint_compat = false,
	loc_vars = function(self, info_queue, center)
		info_queue[#info_queue + 1] = {
			set = "Joker",
			key = "j_jolly",
			specific_vars = { self.config.jolly.t_mult, localize(self.config.jolly.type, "poker_hands") },
		}
		info_queue[#info_queue + 1] = {
			set = "Joker",
			key = "j_zany",
			specific_vars = { self.config.zany.t_mult, localize(self.config.zany.type, "poker_hands") },
		}
		info_queue[#info_queue + 1] = {
			set = "Joker",
			key = "j_mad",
			specific_vars = { self.config.mad.t_mult, localize(self.config.mad.type, "poker_hands") },
		}
		info_queue[#info_queue + 1] = {
			set = "Joker",
			key = "j_crazy",
			specific_vars = { self.config.crazy.t_mult, localize(self.config.crazy.type, "poker_hands") },
		}
		info_queue[#info_queue + 1] = {
			set = "Joker",
			key = "j_droll",
			specific_vars = { self.config.droll.t_mult, localize(self.config.droll.type, "poker_hands") },
		}
		info_queue[#info_queue + 1] = {
			set = "Joker",
			key = "j_sly",
			specific_vars = { 50, localize(self.config.jolly.type, "poker_hands") },
		}
		info_queue[#info_queue + 1] = {
			set = "Joker",
			key = "j_wily",
			specific_vars = { 100, localize(self.config.zany.type, "poker_hands") },
		}
		info_queue[#info_queue + 1] = {
			set = "Joker",
			key = "j_clever",
			specific_vars = { 80, localize(self.config.mad.type, "poker_hands") },
		}
		info_queue[#info_queue + 1] = {
			set = "Joker",
			key = "j_devious",
			specific_vars = { 100, localize(self.config.crazy.type, "poker_hands") },
		}
		info_queue[#info_queue + 1] = {
			set = "Joker",
			key = "j_crafty",
			specific_vars = { 80, localize(self.config.droll.type, "poker_hands") },
		}
		return { vars = { center.ability.extra.money_mod, center.ability.extra.money } }
	end,
	atlas = "atlasone",
	calculate = function(self, card, context)
		if
			context.selling_card
			and (
				(
					context.card.ability.name == "Sly Joker"
					or context.card.ability.name == "Wily Joker"
					or context.card.ability.name == "Clever Joker"
					or context.card.ability.name == "Devious Joker"
					or context.card.ability.name == "Crafty Joker"
				)
				or context.card.ability.effect == "Type Mult"
				or context.card.ability.effect == "Cry Type Mult"
				or context.card.ability.effect == "Cry Type Chips"
				--[[
				Other developers can add effect == "Boost Kidnapping"
                to their joker config if they want it to boost kidnapping when sold
				]]--
				or context.card.ability.effect == "Boost Kidnapping"
				or context.card:is_jolly()
			)
			and not context.blueprint
		then
			card.ability.extra.money = card.ability.extra.money + card.ability.extra.money_mod
			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 exposed = {
	object_type = "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 = { 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 = card.ability.extra,
                    card = card
                }
            end
		end
	end,
}
local mask = {
	object_type = "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 = { 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 = card.ability.extra,
                    card = card
                }
            end
		end
	end,
}
local tropical_smoothie = {
	object_type = "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",
	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
						cry_with_deck_effects(v, function(cards)
							cry_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",
	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",
	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",
	key = "clicked_cookie",
	pos = { x = 2, y = 6 },
	rarity = 1,
	cost = 4,
	atlas = "atlastwo",
	order = 133,
	config = {extra = {chips = 150, chip_mod = 1}},
	blueprint_compat = true,
	eternal_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",
	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 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",
	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
							cry_with_deck_effects(G.jokers.cards[i+1], function(cards)
								cry_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",
	name = "cry-Tax-Fraud",
	key = "tax_fraud",
	pos = { x = 2, y = 0 },
	config = { extra = { money = 6 } },
	rarity = 3,
	cost = 10,
	order = 128,
	atlas = "placeholders",
	in_pool = function(self)
		if G.jokers then
			for i = 1, #G.jokers.cards do
				if G.jokers.cards[i].ability.rental then return true end
			end
		end
		return false
	end,
	loc_vars = function(self, info_queue, center)
		return { vars = { center.ability.extra.money } }
	end,
	calc_dollar_bonus = function(self, card)
		local rentals = 0
		for i = 1, #G.jokers.cards do
			if G.jokers.cards[i].ability.rental then rentals = rentals+1 end
		end
		return rentals*card.ability.extra.money
	end,
	cry_credits = {
		idea = {
			"DoNotSus"
		},
		code = {
			"Foegro"
		}
	},
}
local pity_prize = {
	object_type = "Joker",
	name = "cry-Pity-Prize",
	key = "pity_prize",
	pos = { x = 5, y = 5 },
	config = { },
	rarity = 1,
	cost = 4,
	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
			repeat
				tag = Tag(get_next_tag_key("cry_pity_prize"))
			until tag.name ~= "Boss Tag" and tag.name ~= "Gambler's Tag" and tag.name ~= "Empowered Tag" --I saw pickle not generating boss tags because it apparently causes issues, so I did the same here
			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)
		end
	end,
	cry_credits = {
		idea = {
			"Pyrocreep"
		},
		art = {
			"Pyrocreep"
		},
		code = {
			"Foegro"
		}
	},
}
local digitalhallucinations = {
	object_type = "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
			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.consumables, 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 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('code') then
				G.E_MANAGER:add_event(Event({
					trigger = 'before',
					delay = 0.0,
					func = function()
						local ccard = create_card("Code", G.consumables, 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('cry_plus_code'), colour = G.C.SET.Code})
				return true
			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("Joker", G.jokers, nil, nil, nil, nil, nil, "diha")
						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 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)
						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)  

				playing_card_joker_effects({true})	-- who knows what most this stuff does, i just copied it from marble jonkler
				return true
			end
		end
	end,
	cry_credits = {
		idea = {
			"lolxddj"
		},
		art = {
			"lolxddj"
		},
		code = {
			"toneblock"
		}
	},
}
local arsonist = {
	object_type = "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 true
            end
		end
	end,
	cry_credits = {
		idea = {
			"AlexZGreat"
		},
		art = {
			"Darren_the_frog"
		},
		code = {
			"AlexZGreat"
		}
	},
}
local zooble = {
	object_type = "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
					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
				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 context.cardarea == G.jokers 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 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,
	kidnap,
	exposed,
	mask,
	tropical_smoothie,
	pumpkin,
	carved_pumpkin,
	cookie,
	necromancer,
	oil_lamp,
	tax_fraud,
	pity_prize,
	digitalhallucinations,
	arsonist,
	zooble,
}
if Cryptid.enabled["Misc."] then
	miscitems[#miscitems+1] = flipside
	miscitems[#miscitems+1] = universe
	miscitems[#miscitems+1] = astral_bottle
	miscitems[#miscitems+1] = stronghold
	miscitems[#miscitems+1] = wtf
	miscitems[#miscitems+1] = clash
	miscitems[#miscitems+1] = adroit
	miscitems[#miscitems+1] = penetrating
	miscitems[#miscitems+1] = treacherous
	miscitems[#miscitems+1] = bonkers
	miscitems[#miscitems+1] = fuckedup
	miscitems[#miscitems+1] = foolhardy
end
if Cryptid.enabled["More Stakes"] then
	miscitems[#miscitems+1] = translucent
end
return {
	name = "Misc. Jokers",
	init = function()
		cry_enable_jokers = true
		--Dropshot Patches
		local gigo = Game.init_game_object
		function Game:init_game_object()
			local g = gigo(self)
			g.current_round.cry_dropshot_card = { suit = "Spades" }
			return g
		end
		local rcc = reset_castle_card
		function reset_castle_card()
			rcc()
			if not G.GAME.current_round.cry_dropshot_card then
				G.GAME.current_round.cry_dropshot_card = {}
			end
			G.GAME.current_round.cry_dropshot_card.suit = "Spades"
			local valid_castle_cards = {}
			for k, v in ipairs(G.playing_cards) do
				if v.ability.effect ~= "Stone Card" then
					valid_castle_cards[#valid_castle_cards + 1] = v
				end
			end
			if valid_castle_cards[1] then
				local castle_card =
					pseudorandom_element(valid_castle_cards, pseudoseed("cry_dro" .. G.GAME.round_resets.ante))
				if not G.GAME.current_round.cry_dropshot_card then
					G.GAME.current_round.cry_dropshot_card = {}
				end
				G.GAME.current_round.cry_dropshot_card.suit = castle_card.base.suit
			end
		end

		--Maximized Patches
		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

		--Cube Patches
		local sc = Card.set_cost
		function Card:set_cost()
			sc(self)
			if self.ability.name == "cry-Cube" then
				self.cost = -27
			end
			if self.ability.name == "cry-Big Cube" then
				self.cost = 27
			end
		end
		--Jimball Patches
		local upd = Game.update
		cry_jimball_dt = 0
		function Game:update(dt)
			upd(self, dt)
			cry_jimball_dt = cry_jimball_dt + dt
			if G.P_CENTERS and G.P_CENTERS.j_cry_jimball and cry_jimball_dt > 0.1 then
				cry_jimball_dt = 0
				local obj = G.P_CENTERS.j_cry_jimball
				if obj.pos.x == 5 and obj.pos.y == 6 then
					obj.pos.x = 0
					obj.pos.y = 0
				elseif obj.pos.x < 8 then
					obj.pos.x = obj.pos.x + 1
				elseif obj.pos.y < 6 then
					obj.pos.x = 0
					obj.pos.y = obj.pos.y + 1
				end
			end
		end

		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
				for i = 1, #G.jokers.cards do
					G.jokers.cards[i]:calculate_joker({cry_start_dissolving = true, card = self})
				end
			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
				for i = 1, #G.jokers.cards do
					G.jokers.cards[i]:calculate_joker({cry_press = true})
				end
			end
		end
	end,
	items = miscitems,
}
