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

473 lines
14 KiB
Lua

--Move all the stuff in here into atlasdeck.png later
--Also a lot of the edition decks have wrong proportions so those also need to get fixed
local atlasedition = {
object_type = "Atlas",
key = "atlaseditiondeck",
path = "atlaseditiondeck.png",
px = 71,
py = 95,
}
Cryptid.edeck_sprites = {
edition = {
order = 1,
default = { atlas = "cry_placeholders", pos = { x = 4, y = 2 } },
foil = { atlas = "cry_atlaseditiondeck", pos = { x = 0, y = 0 } },
holo = { atlas = "cry_atlaseditiondeck", pos = { x = 1, y = 0 } },
polychrome = { atlas = "cry_atlaseditiondeck", pos = { x = 2, y = 0 } },
negative = { atlas = "cry_atlaseditiondeck", pos = { x = 3, y = 0 } },
cry_glitched = { atlas = "cry_atlaseditiondeck", pos = { x = 4, y = 0 } },
cry_mosaic = { atlas = "cry_atlaseditiondeck", pos = { x = 0, y = 1 } },
cry_oversat = { atlas = "cry_atlaseditiondeck", pos = { x = 1, y = 1 } },
cry_glass = { atlas = "cry_atlaseditiondeck", pos = { x = 2, y = 1 } },
cry_gold = { atlas = "cry_atlaseditiondeck", pos = { x = 3, y = 1 } },
cry_blur = { atlas = "cry_atlaseditiondeck", pos = { x = 0, y = 2 } },
cry_noisy = { atlas = "cry_atlaseditiondeck", pos = { x = 1, y = 2 } },
cry_astral = { atlas = "cry_atlaseditiondeck", pos = { x = 2, y = 2 } },
cry_m = { atlas = "cry_atlaseditiondeck", pos = { x = 3, y = 2 } },
},
enhancement = {
order = 2,
default = { atlas = "cry_placeholders", pos = { x = 4, y = 2 } },
m_bonus = { atlas = "cry_atlasdeck", pos = { x = 3, y = 3 } },
m_mult = { atlas = "cry_atlasdeck", pos = { x = 2, y = 3 } },
m_wild = { atlas = "cry_atlasdeck", pos = { x = 5, y = 3 } },
m_glass = { atlas = "cry_atlasdeck", pos = { x = 4, y = 3 } },
m_steel = { atlas = "cry_atlasdeck", pos = { x = 8, y = 4 } },
m_stone = { atlas = "cry_atlasdeck", pos = { x = 6, y = 4 } },
m_gold = { atlas = "cry_atlasdeck", pos = { x = 7, y = 4 } },
m_lucky = { atlas = "cry_atlasdeck", pos = { x = 6, y = 3 } },
m_cry_echo = { atlas = "cry_atlasdeck", pos = { x = 1, y = 5 } },
m_cry_light = { atlas = "cry_atlasdeck", pos = { x = 7, y = 3 } },
},
sticker = {
order = 3,
default = { atlas = "cry_placeholders", pos = { x = 4, y = 2 } },
eternal = { atlas = "cry_atlasdeck", pos = { x = 6, y = 0 } },
perishable = { atlas = "cry_atlasdeck", pos = { x = 7, y = 0 } },
rental = { atlas = "cry_atlasdeck", pos = { x = 8, y = 0 } },
pinned = { atlas = "cry_atlasdeck", pos = { x = 7, y = 1 } },
banana = { atlas = "cry_atlasdeck", pos = { x = 6, y = 1 } },
cry_rigged = { atlas = "cry_atlasdeck", pos = { x = 8, y = 1 } },
cry_absolute = { atlas = "cry_atlasdeck", pos = { x = 8, y = 2 } },
cry_possessed = { atlas = "cry_atlasdeck", pos = { x = 7, y = 2 } },
cry_flickering = { atlas = "cry_atlasdeck", pos = { x = 6, y = 2 } },
},
suit = {
order = 4,
default = { atlas = "cry_placeholders", pos = { x = 4, y = 2 } },
Diamonds = { atlas = "cry_atlasdeck", pos = { x = 2, y = 1 } },
Hearts = { atlas = "cry_atlasdeck", pos = { x = 3, y = 1 } },
Spades = { atlas = "cry_atlasdeck", pos = { x = 4, y = 1 } },
Clubs = { atlas = "cry_atlasdeck", pos = { x = 5, y = 1 } },
},
seal = {
order = 5,
default = { atlas = "cry_placeholders", pos = { x = 4, y = 2 } },
Gold = { atlas = "cry_atlasdeck", pos = { x = 3, y = 2 } },
Red = { atlas = "cry_atlasdeck", pos = { x = 0, y = 2 } },
Blue = { atlas = "cry_atlasdeck", pos = { x = 2, y = 2 } },
Purple = { atlas = "cry_atlasdeck", pos = { x = 1, y = 2 } },
cry_azure = { atlas = "cry_atlasdeck", pos = { x = 8, y = 3 } },
cry_green = { atlas = "cry_atlasdeck", pos = { x = 3, y = 5 } },
},
}
Cryptid.edeck_atlas_update = function(self)
local sprite = Cryptid.edeck_sprites[self.edeck_type]
if not sprite then
error(self.edeck_type)
end
local enh_info = { Cryptid.enhanced_deck_info(self) }
sprite = sprite[enh_info[sprite.order]] or sprite.default
self.atlas, self.pos = sprite.atlas, sprite.pos
return sprite
end
local e_deck = {
object_type = "Back",
dependencies = {
items = {
"set_cry_deck",
},
},
name = "cry-Edition Deck",
key = "e_deck",
order = 17,
pos = { x = 5, y = 2 },
loc_vars = function(self, info_queue, center)
local aaa = Cryptid.enhanced_deck_info(self)
return { vars = { localize({ type = "name_text", set = "Edition", key = "e_" .. aaa }) } }
end,
edeck_type = "edition",
config = { cry_no_edition_price = true },
apply = function(self)
local aaa = Cryptid.enhanced_deck_info(self)
G.GAME.modifiers.cry_force_edition = aaa
--Ban Edition tags (They will never redeem)
for k, v in pairs(G.P_TAGS) do
if v.config and v.config.edition then
G.GAME.banned_keys[k] = true
end
end
G.E_MANAGER:add_event(Event({
func = function()
for c = #G.playing_cards, 1, -1 do
G.playing_cards[c]:set_edition(aaa, true, true)
end
return true
end,
}))
end,
unlocked = false,
check_for_unlock = function(self, args)
if args.type == "discover_amount" then
if G.DISCOVER_TALLIES.editions.tally / G.DISCOVER_TALLIES.editions.of >= 1 then
unlock_card(self)
end
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 et_deck = {
object_type = "Back",
dependencies = {
items = {
"set_cry_deck",
},
},
name = "cry-Enhancement Deck",
key = "et_deck",
order = 18,
pos = { x = 5, y = 2 },
edeck_type = "enhancement",
config = {},
loc_vars = function(self, info_queue, center)
local _, bbb = Cryptid.enhanced_deck_info(self)
return { vars = { localize({ type = "name_text", set = "Enhanced", key = bbb }) } }
end,
apply = function(self)
local aaa, bbb = Cryptid.enhanced_deck_info(self)
G.GAME.modifiers.cry_force_enhancement = bbb
G.E_MANAGER:add_event(Event({
func = function()
for c = #G.playing_cards, 1, -1 do
G.playing_cards[c]:set_ability(G.P_CENTERS[bbb])
end
return true
end,
}))
end,
draw = cry_edeck_draw,
unlocked = false,
check_for_unlock = function(self, args)
if args.cry_used_consumable == "c_cry_vacuum" 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 sk_deck = {
object_type = "Back",
dependencies = {
items = {
"set_cry_deck",
},
},
name = "cry-Sticker Deck",
key = "sk_deck",
order = 19,
pos = { x = 5, y = 2 },
edeck_type = "sticker",
config = {},
loc_vars = function(self, info_queue, center)
local _, _, ccc = Cryptid.enhanced_deck_info(self)
if ccc == "pinned" then
ccc = "pinned_left"
end
return { vars = { localize({ type = "name_text", set = "Other", key = ccc }) } }
end,
apply = function(self)
local aaa, bbb, ccc = Cryptid.enhanced_deck_info(self)
G.GAME.modifiers.cry_force_sticker = ccc
G.E_MANAGER:add_event(Event({
func = function()
for c = #G.playing_cards, 1, -1 do
G.playing_cards[c].config.center.eternal_compat = true
G.playing_cards[c].config.center.perishable_compat = true
if SMODS.Stickers[ccc] and SMODS.Stickers[ccc].apply then
SMODS.Stickers[ccc]:apply(G.playing_cards[c], true)
else
G.playing_cards[c]["set_" .. ccc](G.playing_cards[c], true)
end
end
return true
end,
}))
end,
unlocked = false,
check_for_unlock = function(self, args)
if args.cry_used_consumable == "c_cry_lock" 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 st_deck = {
object_type = "Back",
dependencies = {
items = {
"set_cry_deck",
},
},
name = "cry-Suit Deck",
key = "st_deck",
config = {},
order = 20,
pos = { x = 5, y = 2 },
edeck_type = "suit",
loc_vars = function(self, info_queue, center)
local _, _, _, ddd = Cryptid.enhanced_deck_info(self)
return { vars = { localize(ddd, "suits_plural") } }
end,
apply = function(self)
local aaa, bbb, ccc, ddd = Cryptid.enhanced_deck_info(self)
if ddd == "Spades" then
G.GAME.bosses_used["bl_goad"] = 1e308
elseif ddd == "Hearts" then
G.GAME.bosses_used["bl_head"] = 1e308
elseif ddd == "Clubs" then
G.GAME.bosses_used["bl_club"] = 1e308
elseif ddd == "Diamonds" then
G.GAME.bosses_used["bl_window"] = 1e308
end
G.GAME.modifiers.cry_force_suit = ddd
G.E_MANAGER:add_event(Event({
func = function()
for c = #G.playing_cards, 1, -1 do
G.playing_cards[c]:change_suit(ddd)
end
return true
end,
}))
end,
unlocked = false,
check_for_unlock = function(self, args)
if args.cry_used_consumable == "c_cry_replica" 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 sl_deck = {
object_type = "Back",
dependencies = {
items = {
"set_cry_deck",
},
},
name = "cry-Seal Deck",
key = "sl_deck",
order = 21,
pos = { x = 5, y = 2 },
config = {},
edeck_type = "seal",
loc_vars = function(self, info_queue, center)
local _, _, _, _, eee = Cryptid.enhanced_deck_info(self)
return { vars = { localize({ type = "name_text", set = "Other", key = eee:lower() .. "_seal" }) } }
end,
apply = function(self)
local aaa, bbb, ccc, ddd, eee = Cryptid.enhanced_deck_info(self)
G.GAME.modifiers.cry_force_seal = eee
G.E_MANAGER:add_event(Event({
func = function()
for c = #G.playing_cards, 1, -1 do
G.playing_cards[c]:set_seal(eee, true)
end
return true
end,
}))
end,
unlocked = false,
check_for_unlock = function(self, args)
if args.cry_used_consumable == "c_cry_typhoon" 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,
}
return {
name = "Enhanced Decks",
init = function()
local sa = Card.set_ability
function Card:set_ability(center, y, z)
--adding immutable to cards because
-- A they are hardcoded and unaffected by misprintize but still have a description that changes because of it
-- B so they ignore misprintize in order to keep vanilla descripton accurate (ex hack shouldn't be able to trigger more than once)
-- C so Gemini doesn't say they are compatible when they are not
-- D Invisible Joker
if
center
and center.name
== ("Fortune Teller" or "Shoot the Moon" or "Riff-raff" or "Chaos the Clown" or "Dusk" or "Mime" or "Hack" or "Sock and Buskin" or "Invisible Joker" or "Swashbuckler" or "Smeared Joker" or "Certificate" or "Mr. Bones" or "Diet Cola" or "Luchador" or "Midas Mask" or "Shortcut" or "Seance" or "Superposition" or "Sixth Sense" or "DNA" or "Splash" or "Supernova" or "Pareidolia" or "Raised Fist" or "Marble Joker" or "Four Fingers" or "Joker Stencil" or "Showman" or "Blueprint" or "Oops! All 6s" or "Brainstorm" or "Cartomancer" or "Astronomer" or "Burnt Joker" or "Chicot" or "Perkeo")
then
self.config.center.immutable = true
end
if Cryptid.safe_get(center, "name") == "Default Base" then -- scuffed
return sa(
self,
(not self.no_forced_enhancement and G.GAME.modifiers.cry_force_enhancement)
and G.P_CENTERS[G.GAME.modifiers.cry_force_enhancement]
or center,
y,
z
)
else
return sa(self, center, y, z)
end
end
local se = Card.set_edition
function Card:set_edition(edition, y, z, force)
if not force then
return se(
self,
(not self.no_forced_edition and G.GAME.modifiers.cry_force_edition)
and { [G.GAME.modifiers.cry_force_edition] = true }
or edition,
y,
z
)
end
return se(self, edition, y, z)
end
local ss = Card.set_seal
function Card:set_seal(seal, y, z)
return ss(self, not self.no_forced_seal and G.GAME.modifiers.cry_force_seal or seal, y, z)
end
local cs = Card.change_suit
function Card:change_suit(new_suit)
return cs(self, not self.no_forced_suit and G.GAME.modifiers.cry_force_suit or new_suit)
end
local ccl = Card.click
function Card:click()
ccl(self)
if
Galdur
and Cryptid.safe_get(Galdur, "run_setup", "current_page") == 1
and (self.edeck_select or (self.area == Cryptid.safe_get(Galdur, "run_setup", "selected_deck_area") and Cryptid.safe_get(
self,
"config",
"center",
"edeck_type"
)))
or not Galdur
and (Cryptid.safe_get(G.GAME, "viewed_back", "effect", "center", "edeck_type") and (self.back == "viewed_back" or self.edeck_select))
then
if not G.cry_edeck_select then
Cryptid.enhancement_config_UI(Galdur and self.config.center or G.GAME.viewed_back.effect.center)
G.cry_edeck_select = true
else
if self.edeck_select then
G.PROFILES[G.SETTINGS.profile]["cry_edeck_" .. self.config.center.edeck_type] =
self.edeck_select
end
G.FUNCS.overlay_menu({
definition = G.UIDEF.run_setup("main_menu_play"),
})
G.cry_edeck_select = nil
end
end
end
function Cryptid.enhancement_config_UI(center)
if not center.edeck_type then
return
end
G.SETTINGS.paused = true
G.your_collection = {}
G.your_collection[1] = CardArea(
G.ROOM.T.x + 0.2 * G.ROOM.T.w / 2,
G.ROOM.T.h,
5.3 * G.CARD_W,
1.03 * G.CARD_H,
{ card_limit = 5, type = "title", highlight_limit = 0, collection = true }
)
local deck_tables = {
n = G.UIT.R,
config = { align = "cm", padding = 0, no_fill = true },
nodes = {
{ n = G.UIT.O, config = { object = G.your_collection[1] } },
},
}
local pool_table = {
edition = G.P_CENTER_POOLS.Edition,
enhancement = G.P_CENTER_POOLS.Enhanced,
sticker = SMODS.Stickers,
suit = SMODS.Suits,
seal = G.P_SEALS,
}
local editions = {}
for _, v in pairs(pool_table[center.edeck_type]) do
if v.key ~= "e_base" and not v.no_edeck then
editions[#editions + 1] = (center.edeck_type == "edition" and v.key:sub(3)) or v.key
end
end
for i = 1, #editions do
local _center = Cryptid.deep_copy(center)
_center.config["cry_force_" .. center.edeck_type] = editions[i]
Cryptid.edeck_atlas_update(_center)
local card = Cryptid.generic_card(_center)
card.edeck_select = editions[i]
G.your_collection[1]:emplace(card)
end
INIT_COLLECTION_CARD_ALERTS()
local t = create_UIBox_generic_options({
--infotip = localize("cry_gameset_explanation"),
back_func = "setup_run",
snap_back = true,
contents = {
{
n = G.UIT.R,
config = { align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05 },
nodes = { deck_tables },
},
},
})
G.FUNCS.overlay_menu({
definition = t,
})
end
end,
items = { e_deck, et_deck, sk_deck, st_deck, sl_deck, atlasedition },
}