balatro-mods/Cryptid/items/exotic.lua

1689 lines
43 KiB
Lua

--TIP!!! for coding exotics, make sure you know which layer corresponds to which value!
--The Normal pos correponds to the background. use this for the layer that goes all the way in the back!
--The soul_pos = {blahblahblah, extra = {blahblahblah}} correspomds to the other two layers. the value in the extra table is for the layer that goes in the middle, and the other value is the one that goes all the way in the front
local gateway = {
dependencies = {
items = {
"set_cry_exotic",
},
},
object_type = "Consumable",
set = "Spectral",
name = "cry-Gateway",
key = "gateway",
pos = { x = 0, y = 0 },
cost = 4,
atlas = "atlasnotjokers",
order = 90,
hidden = true, --default soul_set and soul_rate of 0.3% in spectral packs is used
can_use = function(self, card)
--Don't allow use if everything is eternal and there is no room
return #Cryptid.advanced_find_joker(nil, nil, nil, { "eternal" }, true, "j") < G.jokers.config.card_limit
end,
use = function(self, card, area, copier)
local deletable_jokers = {}
for k, v in pairs(G.jokers.cards) do
if not SMODS.is_eternal(v) then
deletable_jokers[#deletable_jokers + 1] = v
end
end
local _first_dissolve = nil
G.E_MANAGER:add_event(Event({
trigger = "before",
delay = 0.75,
func = function()
for k, v in pairs(deletable_jokers) do
if v.config.center.rarity == "cry_exotic" then
check_for_unlock({ type = "what_have_you_done" })
end
v:start_dissolve(nil, _first_dissolve)
_first_dissolve = true
end
return true
end,
}))
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.4,
func = function()
play_sound("timpani")
local card = create_card("Joker", G.jokers, nil, "cry_exotic", nil, nil, nil, "cry_gateway")
card:add_to_deck()
G.jokers:emplace(card)
card:juice_up(0.3, 0.5)
return true
end,
}))
delay(0.6)
end,
demicoloncompat = true,
force_use = function(self, card, area)
self:use(card, area)
end,
}
local iterum = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Iterum",
key = "iterum",
config = {
extra = {
x_mult = 2,
repetitions = 1,
},
immutable = {
max_repetitions = 40,
},
},
pos = { x = 0, y = 1 },
rarity = "cry_exotic",
order = 500,
cost = 50,
blueprint_compat = true,
demicoloncompat = true,
atlas = "atlasexotic",
soul_pos = { x = 1, y = 1, extra = { x = 2, y = 1 } },
loc_vars = function(self, info_queue, center)
return {
vars = {
number_format(center.ability.extra.x_mult),
math.min(center.ability.immutable.max_repetitions, center.ability.extra.repetitions),
center.ability.immutable.max_repetitions,
},
}
end,
calculate = function(self, card, context)
if context.repetition then
if context.cardarea == G.play then
return {
message = localize("k_again_ex"),
repetitions = to_number(
math.min(card.ability.immutable.max_repetitions, card.ability.extra.repetitions)
),
card = card,
}
end
elseif context.individual then
if context.cardarea == G.play then
return {
x_mult = card.ability.extra.x_mult,
colour = G.C.RED,
card = card,
}
end
end
if context.forcetrigger then
return {
x_mult = card.ability.extra.x_mult,
colour = G.C.RED,
card = card,
}
end
end,
cry_credits = {
idea = { "Math", "Project666" },
art = { "Ein13" },
code = { "Math" },
},
}
local universum = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Universum",
key = "universum",
config = { extra = 2 },
pos = { x = 3, y = 3 },
rarity = "cry_exotic",
cost = 50,
order = 501,
blueprint_compat = true,
atlas = "atlasexotic",
soul_pos = { x = 4, y = 3, extra = { x = 5, y = 3 } },
loc_vars = function(self, info_queue, center)
return { vars = { number_format(center.ability.extra) } }
end,
calculate = function(self, card, context)
if context.cry_universum then
return {
mod = lenient_bignum(card.ability.extra),
colour = G.C.DARK_EDITION,
message = localize("k_upgrade_ex"),
}
end
end,
cry_credits = {
idea = { "Ein13" },
art = { "Ein13", "hydro" },
},
init = function(self)
--Universum Patches
local uht = update_hand_text
function update_hand_text(config, vals)
if next(find_joker("cry-Universum")) and not Talisman.config_file.disable_anims then
G.E_MANAGER:add_event(Event({ --This is the Hand name text for the poker hand
trigger = "before",
blockable = not config.immediate,
delay = config.delay or 0.8,
func = function()
local col = G.C.GREEN
if vals.chips and G.GAME.current_round.current_hand.chips ~= vals.chips then
local delta = vals.chips
if is_number(vals.chips) and is_number(G.GAME.current_round.current_hand.chips) then
delta = "X" .. number_format(vals.chips / G.GAME.current_round.current_hand.chips)
end
G.GAME.current_round.current_hand.chips = vals.chips
G.hand_text_area.chips:update(0)
if vals.StatusText then
attention_text({
text = delta,
scale = 0.8,
hold = 1,
cover = G.hand_text_area.chips.parent,
cover_colour = mix_colours(G.C.CHIPS, col, 0.1),
emboss = 0.05,
align = "cm",
cover_align = "cr",
})
end
end
if vals.mult and G.GAME.current_round.current_hand.mult ~= vals.mult then
local delta = vals.mult
if is_number(vals.mult) and is_number(G.GAME.current_round.current_hand.mult) then
delta = "X" .. number_format(vals.mult / G.GAME.current_round.current_hand.mult)
end
G.GAME.current_round.current_hand.mult = vals.mult
G.hand_text_area.mult:update(0)
if vals.StatusText then
attention_text({
text = delta,
scale = 0.8,
hold = 1,
cover = G.hand_text_area.mult.parent,
cover_colour = mix_colours(G.C.MULT, col, 0.1),
emboss = 0.05,
align = "cm",
cover_align = "cl",
})
end
if not G.TAROT_INTERRUPT then
G.hand_text_area.mult:juice_up()
end
end
if vals.handname and G.GAME.current_round.current_hand.handname ~= vals.handname then
G.GAME.current_round.current_hand.handname = vals.handname
if not config.nopulse then
G.hand_text_area.handname.config.object:pulse(0.2)
end
end
if vals.chip_total then
G.GAME.current_round.current_hand.chip_total = vals.chip_total
G.hand_text_area.chip_total.config.object:pulse(0.5)
end
if
vals.level
and G.GAME.current_round.current_hand.hand_level
~= " " .. localize("k_lvl") .. tostring(vals.level)
then
if vals.level == "" then
G.GAME.current_round.current_hand.hand_level = vals.level
else
G.GAME.current_round.current_hand.hand_level = " "
.. localize("k_lvl")
.. tostring(vals.level)
if is_number(vals.level) then
G.hand_text_area.hand_level.config.colour =
G.C.HAND_LEVELS[to_number(math.min(vals.level, 7))]
else
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[1]
end
G.hand_text_area.hand_level:juice_up()
end
end
if config.sound and not config.modded then
play_sound(config.sound, config.pitch or 1, config.volume or 1)
end
if config.modded then
if
G.HUD_blind
and G.HUD_blind.get_UIE_by_ID
and G.HUD_blind:get_UIE_by_ID("HUD_blind_debuff_1")
and G.HUD_blind:get_UIE_by_ID("HUD_blind_debuff_2")
then
G.HUD_blind:get_UIE_by_ID("HUD_blind_debuff_1"):juice_up(0.3, 0)
G.HUD_blind:get_UIE_by_ID("HUD_blind_debuff_2"):juice_up(0.3, 0)
end
G.GAME.blind:juice_up()
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.06 * G.SETTINGS.GAMESPEED,
blockable = false,
blocking = false,
func = function()
play_sound("tarot2", 0.76, 0.4)
return true
end,
}))
play_sound("tarot2", 1, 0.4)
end -- hi
return true
end,
}))
else
uht(config, vals)
end
end
end,
}
local exponentia = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Exponentia",
key = "exponentia",
config = { extra = { Emult = 1, Emult_mod = 0.03 } },
pos = { x = 0, y = 0 },
rarity = "cry_exotic",
cost = 50,
blueprint_compat = true,
perishable_compat = false,
demicoloncompat = true,
atlas = "atlasexotic",
order = 503,
soul_pos = { x = 2, y = 0, extra = { x = 1, y = 0 } },
calculate = function(self, card, context)
if context.joker_main and (to_big(card.ability.extra.Emult) > to_big(1)) then
return {
message = localize({
type = "variable",
key = "a_powmult",
vars = {
number_format(card.ability.extra.Emult),
},
}),
Emult_mod = lenient_bignum(card.ability.extra.Emult),
colour = G.C.DARK_EDITION,
}
end
if context.forcetrigger then
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "Emult",
scalar_value = "Emult_mod",
message_key = "a_powmult",
message_colour = G.C.DARK_EDITION,
})
return {
Emult_mod = lenient_bignum(card.ability.extra.Emult),
}
end
end,
loc_vars = function(self, info_queue, center)
return {
vars = {
number_format(center.ability.extra.Emult_mod),
number_format(center.ability.extra.Emult),
},
}
end,
cry_credits = {
idea = { "Enemui" },
art = { "Lil Mr. Slipstream" },
art = { "George the Rat" },
code = { "Math" },
},
init = function(self)
-- Hook for scaling
local scie = SMODS.calculate_individual_effect
function SMODS.calculate_individual_effect(effect, scored_card, key, amount, from_edition)
local ret = scie(effect, scored_card, key, amount, from_edition)
if
(
key == "x_mult"
or key == "xmult"
or key == "Xmult"
or key == "x_mult_mod"
or key == "xmult_mod"
or key == "Xmult_mod"
)
and amount ~= 1
and mult
then
for _, v in pairs(find_joker("cry-Exponentia")) do
local old = v.ability.extra.Emult
SMODS.scale_card(v, {
ref_table = v.ability.extra,
ref_value = "Emult",
scalar_value = "Emult_mod",
message_key = "a_powmult",
message_colour = G.C.DARK_EDITION,
})
end
end
return ret
end
end,
}
local speculo = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Speculo",
key = "speculo",
pos = { x = 3, y = 1 },
rarity = "cry_exotic",
cost = 50,
blueprint_compat = true,
demicoloncompat = true,
immutable = true,
atlas = "atlasexotic",
order = 504,
soul_pos = { x = 4, y = 1, extra = { x = 5, y = 1 } },
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,
calculate = function(self, card, context)
if context.ending_shop or context.forcetrigger then
local eligibleJokers = {}
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].ability.name ~= card.ability.name and G.jokers.cards[i].ability.set == "Joker" 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_speculo")), nil)
card:set_edition({ negative = true }, true)
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
end
return
end
end,
cry_credits = {
idea = { "Mystic" },
art = { "Mystic" },
code = { "Math" },
},
}
local redeo = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Redeo",
key = "redeo",
config = { extra = { ante_reduction = 1, money_req = 10, money_remaining = 0, money_mod = 10 } },
loc_vars = function(self, info_queue, center)
return {
vars = {
number_format(center.ability.extra.ante_reduction),
number_format(center.ability.extra.money_req),
number_format(center.ability.extra.money_remaining),
number_format(center.ability.extra.money_mod),
},
}
end,
pos = { x = 3, y = 0 },
rarity = "cry_exotic",
cost = 50,
order = 506,
atlas = "atlasexotic",
soul_pos = { x = 4, y = 0, extra = { x = 5, y = 0 } },
demicoloncompat = true,
calculate = function(self, card, context)
if context.cry_ease_dollars and to_big(context.cry_ease_dollars) < to_big(0) and not context.blueprint then
card.ability.extra.money_remaining =
lenient_bignum(to_big(card.ability.extra.money_remaining) - context.cry_ease_dollars)
local ante_mod = 0
while to_big(card.ability.extra.money_remaining) >= to_big(card.ability.extra.money_req) do
card.ability.extra.money_remaining =
lenient_bignum(to_big(card.ability.extra.money_remaining) - card.ability.extra.money_req)
card.ability.extra.money_req =
lenient_bignum(to_big(card.ability.extra.money_req) + card.ability.extra.money_mod)
card.ability.extra.money_mod = lenient_bignum(math.ceil(to_big(card.ability.extra.money_mod) * 1.06))
ante_mod = lenient_bignum(ante_mod - to_big(card.ability.extra.ante_reduction))
end
if ante_mod < 0 then
ease_ante(ante_mod)
end
return nil, true
end
if context.forcetrigger then
ease_ante(card.ability.extra.ante_reduction)
end
end,
cry_credits = {
idea = { "Enemui" },
art = { "Jevonn", "Darren_The_Frog" },
code = { "Math", "jenwalter666" },
},
init = function(self)
local ed = ease_dollars
function ease_dollars(mod, x)
ed(mod, x)
for i = 1, #G.jokers.cards do
local effects = G.jokers.cards[i]:calculate_joker({ cry_ease_dollars = mod })
end
end
end,
}
local tenebris = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Tenebris",
key = "tenebris",
pos = { x = 3, y = 2 },
soul_pos = { x = 4, y = 2, extra = { x = 5, y = 2 } },
config = {
extra = {
slots = 25,
money = 25,
},
immutable = {
max_slots = 100,
},
},
rarity = "cry_exotic",
cost = 50,
order = 507,
atlas = "atlasexotic",
demicoloncompat = true,
calc_dollar_bonus = function(self, card)
return lenient_bignum(card.ability.extra.money)
end,
loc_vars = function(self, info_queue, center)
return {
vars = {
number_format(math.min(center.ability.immutable.max_slots, center.ability.extra.slots)),
number_format(center.ability.extra.money),
},
}
end,
calculate = function(self, card, context)
if context.forcetrigger then
return {
dollars = lenient_bignum(card.ability.extra.money),
card = card,
}
end
end,
add_to_deck = function(self, card, from_debuff)
G.jokers.config.card_limit = lenient_bignum(
G.jokers.config.card_limit + math.min(card.ability.immutable.max_slots, to_big(card.ability.extra.slots))
)
end,
remove_from_deck = function(self, card, from_debuff)
G.jokers.config.card_limit = lenient_bignum(
G.jokers.config.card_limit - math.min(card.ability.immutable.max_slots, to_big(card.ability.extra.slots))
)
end,
cry_credits = {
idea = { "Gold" },
art = { "Mystic" },
code = { "jenwalter666" },
},
}
local effarcire = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Effarcire",
key = "effarcire",
config = {},
immutable = true,
pos = { x = 0, y = 0 },
soul_pos = { x = 1, y = 0, extra = { x = 2, y = 0 } },
cost = 50,
order = 505,
atlas = "effarcire",
rarity = "cry_exotic",
demicoloncompat = true,
calculate = function(self, card, context)
if not context.blueprint and not context.retrigger_joker or context.forcetrigger then
if context.first_hand_drawn or context.forcetrigger then
G.FUNCS.draw_from_deck_to_hand(#G.deck.cards)
return nil, true
elseif G.hand.config.card_limit < 1 then
G.hand.config.card_limit = 1
end
end
end,
cry_credits = {
idea = { "Frix" },
art = { "AlexZGreat", "Catformer" },
code = { "jenwalter666" },
},
}
local effarcire_sprite = {
object_type = "Atlas",
key = "effarcire",
path = "goofy.png",
px = 71,
py = 95,
}
local crustulum = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-crustulum",
key = "crustulum",
config = {
extra = {
chips = 0,
chip_mod = 4,
},
},
pos = { x = 0, y = 2 },
soul_pos = { x = 2, y = 2, extra = { x = 1, y = 2 } },
rarity = "cry_exotic",
cost = 50,
order = 508,
atlas = "atlasexotic",
blueprint_compat = true,
perishable_compat = false,
demicoloncompat = true,
loc_vars = function(self, info_queue, center)
return {
vars = {
number_format(center.ability.extra.chips),
number_format(center.ability.extra.chip_mod),
},
}
end,
calculate = function(self, card, context)
if context.reroll_shop and not context.blueprint then
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "chips",
scalar_value = "chip_mod",
message_key = "a_chips",
colour = G.C.CHIPS,
})
return nil, true
end
if context.joker_main and to_big(card.ability.extra.chips) > to_big(0) then
return {
message = localize({
type = "variable",
key = "a_chips",
vars = { number_format(card.ability.extra.chips) },
}),
chip_mod = lenient_bignum(card.ability.extra.chips),
}
end
if context.forcetrigger then
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "chips",
scalar_value = "chip_mod",
message_key = "a_chips",
colour = G.C.CHIPS,
})
return {
chip_mod = lenient_bignum(card.ability.extra.chips),
}
end
end,
add_to_deck = function(self, card, from_debuff)
--This makes the reroll immediately after obtaining free because the game doesn't do that for some reason
G.GAME.current_round.free_rerolls = G.GAME.current_round.free_rerolls + 1
calculate_reroll_cost(true)
end,
remove_from_deck = function(self, card, from_debuff)
calculate_reroll_cost(true)
end,
cry_credits = {
idea = { "AlexZGreat" },
art = { "lolxddj" },
code = { "Jevonn" },
},
}
--todo: make the Emult always prime
local primus = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-primus",
key = "primus",
config = {
extra = {
Emult = 1.01,
Emult_mod = 0.17,
},
},
pos = { x = 0, y = 4 },
rarity = "cry_exotic",
cost = 53,
order = 510,
blueprint_compat = true,
perishable_compat = false,
demicoloncompat = true,
atlas = "atlasexotic",
soul_pos = { x = 2, y = 4, extra = { x = 1, y = 4 } },
calculate = function(self, card, context)
local check = true
if context.cardarea == G.jokers and context.before and not context.blueprint then
if context.scoring_hand then
for k, v in ipairs(context.full_hand) do
if
v:get_id() == 4
or v:get_id() == 6
or v:get_id() == 8
or v:get_id() == 9
or v:get_id() == 10
or v:get_id() == 11
or v:get_id() == 12
or v:get_id() == 13
then
check = false
end
end
end
if check then
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "Emult",
scalar_value = "Emult_mod",
message_colour = G.C.DARK_EDITION,
})
card.children.floating_sprite:set_sprite_pos({ x = 8, y = 6 })
end
end
if context.joker_main and (to_big(card.ability.extra.Emult) > to_big(1)) then
card.children.floating_sprite:set_sprite_pos({ x = 8, y = 6 })
return {
message = localize({
type = "variable",
key = "a_powmult",
vars = {
number_format(card.ability.extra.Emult),
},
}),
Emult_mod = lenient_bignum(card.ability.extra.Emult),
colour = G.C.DARK_EDITION,
}
end
if context.end_of_round then
card.children.floating_sprite:set_sprite_pos({ x = 2, y = 4 })
end
if context.forcetrigger then
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "Emult",
scalar_value = "Emult_mod",
message_colour = G.C.DARK_EDITION,
})
return {
Emult_mod = lenient_bignum(card.ability.extra.Emult),
colour = G.C.DARK_EDITION,
}
end
end,
loc_vars = function(self, info_queue, center)
return {
vars = {
number_format(center.ability.extra.Emult_mod),
number_format(center.ability.extra.Emult),
},
}
end,
cry_credits = {
idea = { "Jevonn" },
art = { "George the Rat" },
code = { "Jevonn" },
},
}
local scalae = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Scalae",
key = "Scalae",
pos = { x = 3, y = 4 },
soul_pos = { x = 5, y = 4, extra = { x = 4, y = 4 } },
immutable = false,
rarity = "cry_exotic",
cost = 50,
atlas = "atlasexotic",
order = 311,
config = { extra = { scale = 1, scale_mod = 1 } },
demicoloncompat = true,
calculate = function(self, card, context)
if
(context.end_of_round and not context.individual and not context.repetition and not context.blueprint)
or context.forcetrigger
then
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "scale",
scalar_value = "scale_mod",
message_colour = G.C.DARK_EDITION,
})
end
end,
calc_scaling = function(self, card, other, current_scaling, current_scalar, args)
if other.ability.name ~= "cry-Scalae" then
if not G.GAME.cryptid_base_scales then
G.GAME.cryptid_base_scales = {}
end
if not G.GAME.cryptid_base_scales[other.config.center.key] then
G.GAME.cryptid_base_scales[other.config.center.key] = {}
end
if not G.GAME.cryptid_base_scales[other.config.center.key][args.scalar_value] then
G.GAME.cryptid_base_scales[other.config.center.key][args.scalar_value] = current_scalar
end
local true_base = G.GAME.cryptid_base_scales[other.config.center.key][args.scalar_value]
local orig_scale_scale = current_scaling
local new_scale = lenient_bignum(
to_big(true_base)
* (
(
1
+ (
(to_big(orig_scale_scale) / to_big(true_base))
^ (to_big(1) / to_big(card.ability.extra.scale))
)
) ^ to_big(card.ability.extra.scale)
)
)
if not Cryptid.is_card_big(other) and to_big(new_scale) >= to_big(1e300) then
new_scale = 1e300
end
return {
scalar_value = new_scale,
message = localize("k_upgrade_ex"),
}
end
end,
loc_vars = function(self, info_queue, card)
local example = { 2, 3, 4 }
for i = 1, #example do
example[i] = to_big(example[i]) ^ (card.ability.extra.scale + 1)
end
return {
vars = {
number_format(card.ability.extra.scale + 1),
number_format(card.ability.extra.scale_mod),
example[1],
example[2],
example[3],
},
}
end,
cry_credits = {
idea = { "Mathguy" },
art = { "Mathguy" },
code = { "Mathguy" },
},
}
local stella_mortis = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Stella Mortis",
key = "stella_mortis",
config = {
extra = {
Emult = 1,
Emult_mod = 0.4,
},
},
pos = { x = 3, y = 5 },
rarity = "cry_exotic",
cost = 50,
order = 502,
blueprint_compat = true,
perishable_compat = false,
demicoloncompat = true,
atlas = "atlasexotic",
soul_pos = { x = 5, y = 5, extra = { x = 4, y = 5 } },
calculate = function(self, card, context)
if (context.ending_shop and not context.blueprint) or context.forcetrigger then
local destructable_planet = {}
local quota = 1
for i = 1, #G.consumeables.cards do
if
G.consumeables.cards[i].ability.set == "Planet"
and not G.consumeables.cards[i].getting_sliced
and not SMODS.is_eternal(G.consumeables.cards[i])
then
destructable_planet[#destructable_planet + 1] = G.consumeables.cards[i]
end
end
local planet_to_destroy = #destructable_planet > 0
and pseudorandom_element(destructable_planet, pseudoseed("stella_mortis"))
or nil
if planet_to_destroy then
if Incantation then
quota = planet_to_destroy:getEvalQty()
end
if Overflow then
quaota = planet_to_destroy.ability.immutable and planet_to_destroy.ability.immutable.overflow_amount
end
planet_to_destroy.getting_sliced = true
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "Emult",
scalar_value = "Emult_mod",
operation = function(ref_table, ref_value, initial, change)
ref_table[ref_value] = initial + change * quota
end,
message_key = "a_powmult",
})
G.E_MANAGER:add_event(Event({
func = function()
(context.blueprint_card or card):juice_up(0.8, 0.8)
planet_to_destroy:start_dissolve({ G.C.RED }, nil, 1.6)
return true
end,
}))
planet_to_destroy.dissolve = 0 --timing issues related to crossmod stuff
return nil, true
end
end
if (context.joker_main and (to_big(card.ability.extra.Emult) > to_big(1))) or context.forcetrigger then
return {
message = localize({
type = "variable",
key = "a_powmult",
vars = {
number_format(card.ability.extra.Emult),
},
}),
Emult_mod = lenient_bignum(card.ability.extra.Emult),
colour = G.C.DARK_EDITION,
}
end
end,
loc_vars = function(self, info_queue, center)
return {
vars = {
number_format(center.ability.extra.Emult_mod),
number_format(center.ability.extra.Emult),
},
}
end,
cry_credits = {
idea = { "SMG9000" },
art = { "SMG9000", "George the Rat", "patchy", "lolxDdj" },
code = { "SMG9000" },
},
}
local circulus_pistoris = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Circulus Pistoris",
key = "circulus_pistoris",
config = {
extra = {
Emult = math.pi,
Echips = math.pi,
hands_remaining = 3,
},
},
pos = { x = 0, y = 3 },
rarity = "cry_exotic",
cost = 10 * math.pi,
order = 509,
blueprint_compat = true,
demicoloncompat = true,
immutable = true,
atlas = "atlasexotic",
soul_pos = { x = 2, y = 3, extra = { x = 1, y = 3 } },
loc_vars = function(self, info_queue, center)
return {
vars = {
Cryptid.safe_get(center, "edition", "cry_oversat") and "tau" or "pi",
center.ability.extra.hands_remaining,
},
}
end,
calculate = function(self, card, context)
if
(
context.joker_main
and (
G.GAME.current_round.hands_left >= card.ability.extra.hands_remaining
and G.GAME.current_round.hands_left < card.ability.extra.hands_remaining + 1
)
) or context.forcetrigger
then
local pi = math.pi
if Cryptid.safe_get(card, "edition", "cry_oversat") then
pi = 2 * pi
end
return {
Echip_mod = pi,
Emult_mod = pi,
message = localize({
type = "variable",
key = "a_powmultchips",
vars = { (Cryptid.safe_get(card, "edition", "cry_oversat") and "tau" or "pi") },
}),
colour = { 0.8, 0.45, 0.85, 1 }, --plasma colors
}
end
end,
cry_credits = {
idea = { "SMG9000", "Math" }, --not sure if there's more ppl I'm missing
art = { "HexaCryonic", "ori" },
code = { "SMG9000", "Math" },
},
}
local aequilibrium = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "Ace Aequilibrium",
key = "equilib",
config = {
extra = {
jokers = 2,
card = nil,
},
},
rarity = "cry_exotic",
pos = { x = 7, y = 0 },
soul_pos = { x = 6, y = 0, extra = { x = 8, y = 0 } },
atlas = "atlasexotic",
cost = 50,
order = 512,
blueprint_compat = true,
eternal_compat = true,
perishable_compat = true,
demicoloncompat = true,
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
local joker_generated = "???"
if G.GAME.aequilibriumkey and G.GAME.aequilibriumkey > 1 then
joker_generated = localize({
type = "name_text",
set = "Joker",
key = G.P_CENTER_POOLS["Joker"][math.floor(G.GAME.aequilibriumkey or 1) - 1].key,
})
end
return { vars = { math.floor(math.min(25, center.ability.extra.jokers)), joker_generated } }
end,
calculate = function(self, card, context)
if
(context.cardarea == G.jokers and context.before and not context.retrigger_joker) or context.forcetrigger
then
for i = 1, math.floor(math.min(25, card.ability.extra.jokers)) do
local newcard = create_card("Joker", G.jokers, nil, nil, nil, nil, nil)
newcard:add_to_deck()
G.jokers:emplace(newcard)
newcard:set_edition({ negative = true }, true)
end
return nil, true
end
end,
cry_credits = {
idea = { "Elial2" },
art = { "Elial2", "unexian", "hydro" },
code = { "Elial2" },
},
}
local facile = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-facile",
key = "facile",
config = {
extra = {
Emult = 3,
check = 10,
},
immutable = {
check2 = 0,
},
},
pos = { x = 6, y = 2 },
soul_pos = { x = 8, y = 2, extra = { x = 7, y = 2 } },
rarity = "cry_exotic",
cost = 50,
order = 513,
blueprint_compat = true,
demicoloncompat = true,
atlas = "atlasexotic",
loc_vars = function(self, info_queue, center)
return {
vars = {
number_format(center.ability.extra.Emult),
number_format(center.ability.extra.check),
},
}
end,
calculate = function(self, card, context)
if context.individual then
if context.cardarea == G.play then
card.ability.immutable.check2 = lenient_bignum(card.ability.immutable.check2 + 1)
end
end
if context.joker_main and (to_big(card.ability.extra.Emult) > to_big(1)) then
if to_big(card.ability.immutable.check2) <= to_big(card.ability.extra.check) then
card.ability.immutable.check2 = 0
return {
message = localize({
type = "variable",
key = "a_powmult",
vars = { number_format(card.ability.extra.Emult) },
}),
Emult_mod = lenient_bignum(card.ability.extra.Emult),
colour = G.C.DARK_EDITION,
}
else
card.ability.immutable.check2 = 0
end
end
if context.forcetrigger then
return {
message = localize({
type = "variable",
key = "a_powmult",
vars = { number_format(card.ability.extra.Emult) },
}),
Emult_mod = lenient_bignum(card.ability.extra.Emult),
colour = G.C.DARK_EDITION,
}
end
end,
cry_credits = {
idea = { "Enemui" },
art = { "Kailen", "hydro" },
code = { "Jevonn" },
},
}
local gemino = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Gemino",
key = "gemino",
pos = { x = 6, y = 1 },
soul_pos = { x = 8, y = 1, extra = { x = 7, y = 1 } },
immutable = true,
cry_credits = {
jolly = {
"Jolly Open Winner",
"Requiacity",
},
art = { "unexian" },
code = { "Math" },
},
rarity = "cry_exotic",
blueprint_compat = true,
demicoloncompat = true,
cost = 50,
order = 515,
atlas = "atlasexotic",
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 {
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
other_joker = G.jokers.cards[1]
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, card2, context)
if (context.end_of_round and not context.repetition and not context.individual) or context.forcetrigger then
local check = false
local card = G.jokers.cards[1]
if not Card.no(G.jokers.cards[1], "immutable", true) then
Cryptid.manipulate(G.jokers.cards[1], { value = 2 })
check = true
end
if check then
card_eval_status_text(
context.blueprint_card or card2,
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex"), colour = G.C.GREEN }
)
end
return nil, true
end
end,
}
local energia = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-Energia",
key = "energia",
pos = { x = 6, y = 3 },
soul_pos = { x = 8, y = 3, extra = { x = 7, y = 3 } },
blueprint_compat = true,
perishable_compat = false,
demicoloncompat = true,
order = 514,
config = {
extra = { tags = 1, tag_mod = 1 },
immutable = { max_tags = 40 },
},
loc_vars = function(self, info_queue, center)
return {
vars = {
math.min(center.ability.extra.tags, center.ability.immutable.max_tags),
center.ability.extra.tag_mod,
},
}
end,
rarity = "cry_exotic",
cost = 50,
atlas = "atlasexotic",
calculate = function(self, card, context)
if context.tag_added and not context.tag_added.from_energia then
-- Don't add tags if there are more then 40 (lag)
local added_tags =
math.max(math.min(card.ability.immutable.max_tags - #G.GAME.tags, card.ability.extra.tags), 0)
print(added_tags)
if added_tags > 0 then
for i = 1, added_tags do
local ab = copy_table(context.tag_added.ability)
local new_tag = Tag(context.tag_added.key)
new_tag.from_energia = true
add_tag(new_tag)
new_tag.from_energia = nil
new_tag.ability = ab
end
end
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "tags",
scalar_value = "tag_mod",
scaling_message = {
message = localize({
type = "variable",
key = card.ability.extra.tags == 1 and "a_tag" or "a_tags",
vars = { added_tags },
})[1],
colour = G.C.DARK_EDITION,
},
})
elseif context.forcetrigger then
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "tags",
scalar_value = "tag_mod",
no_message = true,
})
end
end,
cry_credits = {
idea = { "jenwalter666" },
art = { "unexian" },
code = { "Math" },
},
}
--why is this an exotic???
local verisimile = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-verisimile",
key = "verisimile",
pos = { x = 0, y = 1 },
soul_pos = { x = 1, y = 1, extra = { x = 2, y = 1 } },
config = { extra = { xmult = 1 } },
rarity = "cry_exotic",
cost = 50,
order = 516,
-- "i'm not making this compatible" - nova
-- "well i am" - invalid, writing this comment
demicoloncompat = true,
blueprint_compat = true,
atlas = "placeholders",
loc_vars = function(self, info_queue, center)
return { vars = { number_format(center.ability.extra.xmult) } }
end,
calculate = function(self, card, context)
if context.pseudorandom_result and context.result then
-- implementation that doesn't use SMODS.scale_card; use if scale_card causes weird or unexpected behavior
--[[
card.ability.extra.xmult = lenient_bignum(card.ability.extra.xmult + context.denominator)
return {
message = localize({
type = "variable",
key = "a_xmult",
vars = { number_format(card.ability.extra.xmult) },
})
}
]]
SMODS.scale_card(card, {
-- this should not affect the probability in the context table
block_overrides = {
scalar = true,
},
ref_table = card.ability.extra,
ref_value = "xmult",
scalar_table = context,
scalar_value = "denominator",
scaling_message = {
message = localize({
type = "variable",
key = "a_xmult",
vars = { number_format(card.ability.extra.xmult) },
}),
},
})
-- forcetriggers won't scale non verisimile, because how much would you scale it by
elseif context.joker_main or context.forcetrigger then
return {
xmult = lenient_bignum(card.ability.extra.xmult),
}
end
end,
cry_credits = {
idea = { "Enemui" },
code = { "Jevonn", "invalidOS" },
},
}
local duplicare = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
},
},
object_type = "Joker",
name = "cry-duplicare",
key = "duplicare",
config = { extra = { Xmult = 1, Xmult_mod = 1 } },
pos = { x = 0, y = 6 },
soul_pos = { x = 2, y = 6, extra = { x = 1, y = 6 } },
rarity = "cry_exotic",
cost = 50,
order = 517,
blueprint_compat = true,
demicoloncompat = true,
atlas = "atlasexotic",
loc_vars = function(self, info_queue, center)
return {
vars = {
number_format(center.ability.extra.Xmult),
number_format(center.ability.extra.Xmult_mod),
},
}
end,
calculate = function(self, card, context)
if
not context.blueprint
and (
(
context.post_trigger
and context.other_joker ~= card
and Cryptid.isNonRollProbabilityContext(context.other_context)
) or (context.individual and context.cardarea == G.play)
)
then
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "Xmult",
scalar_value = "Xmult_mod",
})
end
if (context.joker_main and (to_big(card.ability.extra.Xmult) > to_big(1))) or context.forcetrigger then
if context.forcetrigger then
SMODS.scale_card(card, {
ref_table = card.ability.extra,
ref_value = "Xmult",
scalar_value = "Xmult_mod",
no_message = true,
})
end
return {
message = localize({
type = "variable",
key = "a_xmult",
vars = {
number_format(card.ability.extra.Xmult),
},
}),
Xmult_mod = lenient_bignum(card.ability.extra.Xmult),
colour = G.C.MULT,
}
end
end,
cry_credits = {
idea = { "Enemui" },
art = { "Shellular" },
code = { "elial2" },
},
}
-- to be honest, this needs a refactor because
-- rescribed jokers are forgotten on save reload
-- they are not saved in a good way right now
-- status text is not handled properly
local rescribere = {
object_type = "Joker",
name = "cry-Rescribere",
key = "rescribere",
pos = { x = 0, y = 1 },
soul_pos = { x = 1, y = 1, extra = { x = 2, y = 1 } },
blueprint_compat = false,
perishable_compat = false,
rarity = "cry_exotic",
cost = 50,
order = 69420,
atlas = "placeholders",
calculate = function(self, card, context)
local eligibleJokers = {}
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].ability.name ~= card.ability.name then
eligibleJokers[#eligibleJokers + 1] = G.jokers.cards[i]
end
end
for i = 1, #eligibleJokers do
if
context.selling_card
and context.card.ability.name ~= card.ability.name
and context.card ~= eligibleJokers[i]
then
local oldfunc = eligibleJokers[i].calculate_joker
eligibleJokers[i].ability.rescribere_jokers = eligibleJokers[i].ability.rescribere_jokers or {}
eligibleJokers[i].ability.rescribere_jokers[#eligibleJokers[i].ability.rescribere_jokers + 1] =
context.card
eligibleJokers[i].calculate_joker = function(cardd, contextt)
local totalret = oldfunc(cardd, contextt)
v = eligibleJokers[i].ability.rescribere_jokers[#eligibleJokers[i].ability.rescribere_jokers]
local ret = v:calculate_joker(contextt)
if ret and type(ret) == "table" then
totalret = totalret or { message = "Copying", card = eligibleJokers[i] }
for _i, _v in pairs(ret) do
if not totalret[_i] then
totalret[_i] = ret[_i] or _v
--print(totalret[_i] .. "--------------")
else
if type(totalret[_i]) == "number" then
totalret[_i] = totalret[_i] + ret[_i]
end
end
end
totalret.card = eligibleJokers[i]
end
return totalret
end
end
end
end,
}
local formidiulosus = {
dependencies = {
items = {
"c_cry_gateway",
"set_cry_exotic",
"set_cry_spooky",
},
},
object_type = "Joker",
name = "cry-Formidiulosus",
key = "formidiulosus",
pos = { x = 6, y = 4 },
soul_pos = { x = 8, y = 4, extra = { x = 7, y = 4 } },
blueprint_compat = true,
demicoloncompat = true,
config = {
extra = {
Emult_mod = 0.01,
Emult = 1,
},
immutable = {
num_candies = 3,
},
},
loc_vars = function(self, info_queue, center)
return {
vars = {
center.ability.immutable.num_candies,
center.ability.extra.Emult_mod,
center.ability.extra.Emult,
},
}
end,
rarity = "cry_exotic",
cost = 50,
order = 518,
atlas = "atlasexotic",
no_dbl = true,
update = function(self, card, front)
card.ability.extra.Emult = lenient_bignum(
1 + (card.ability.extra.Emult_mod * #Cryptid.advanced_find_joker(nil, "cry_candy", nil, nil, true))
)
end,
calculate = function(self, card, context)
if
(context.buying_card or context.cry_creating_card)
and context.card.ability.set == "Joker"
and context.card.config.center.rarity == "cry_cursed"
and not context.blueprint
and not (context.card == card)
then
G.E_MANAGER:add_event(Event({
func = function()
context.card:start_dissolve()
card_eval_status_text(card, "extra", nil, nil, nil, {
message = localize("k_nope_ex"),
colour = G.C.BLACK,
})
return true
end,
}))
end
if context.ending_shop then
for i = 1, card.ability.immutable.num_candies do
local card = create_card("Joker", G.jokers, nil, "cry_candy", nil, nil, nil, "cry_trick_candy")
card:set_edition({ negative = true }, true)
card:add_to_deck()
G.jokers:emplace(card)
end
end
if context.cardarea == G.jokers and (to_big(card.ability.extra.Emult) > to_big(1)) and context.joker_main then
return {
message = localize({
type = "variable",
key = "a_powmult",
vars = {
number_format(card.ability.extra.Emult),
},
}),
Emult_mod = lenient_bignum(card.ability.extra.Emult),
colour = G.C.DARK_EDITION,
}
end
if context.forcetrigger then
for i = 1, card.ability.immutable.num_candies do
local card = create_card("Joker", G.jokers, nil, "cry_candy", nil, nil, nil, "cry_trick_candy")
card:set_edition({ negative = true }, true)
card:add_to_deck()
G.jokers:emplace(card)
end
return {
message = localize({
type = "variable",
key = "a_powmult",
vars = {
number_format(card.ability.extra.Emult),
},
}),
Emult_mod = lenient_bignum(card.ability.extra.Emult),
colour = G.C.DARK_EDITION,
}
end
end,
cry_credits = {
idea = { "HexaCryonic", "Kailen" },
art = { "Foegro", "hydro" },
code = { "Foegro" },
},
}
local items = {
gateway,
iterum,
universum,
exponentia,
speculo,
redeo,
tenebris, -- disabled due to bignum crash, possibly fixed?
effarcire,
effarcire_sprite,
crustulum,
primus,
scalae,
stella_mortis,
circulus_pistoris,
aequilibrium,
facile,
gemino,
energia,
--verisimile, WHY IS THIS AN EXOTIC????????????????????
--rescribere, [NEEDS REFACTOR]
duplicare,
formidiulosus, -- see tenebris
}
return {
name = "Exotic Jokers",
init = function() end,
items = items,
}