balatro-mods/Cryptid/Items/Achievements.lua
2025-01-19 15:01:49 +08:00

451 lines
11 KiB
Lua

local achievement_atlas = {
object_type = "Atlas",
key = "achievements",
path = "cry_achievements.png",
px = 66,
py = 66,
}
local break_infinity = {
object_type = "Achievement",
key = "break_infinity",
order = 1,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "chip_score" and to_big(args.chips) >= to_big(2) ^ to_big(1024) then
return true
end
end,
}
local used_crash = {
object_type = "Achievement",
key = "used_crash",
order = 2,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if
args.type == "ach_cry_used_crash"
and G.PROFILES[G.SETTINGS.profile].consumeable_usage["c_cry_crash"]
and G.PROFILES[G.SETTINGS.profile].consumeable_usage["c_cry_crash"].count > 0
then
return true
end
end,
}
local haxxor = {
object_type = "Achievement",
key = "haxxor",
order = 3,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "cheat_used" then
return true
end
end,
}
local googol_play_pass = {
object_type = "Achievement",
key = "googol_play_pass",
order = 4,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "googol_play_rigged" then
return true
end
end,
}
local bullet_hell = {
object_type = "Achievement",
key = "bullet_hell",
order = 5,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "modify_jokers" then
local ap_joker_count = 0
if G.jokers then
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].config.center.key == "j_cry_apjoker" then
ap_joker_count = ap_joker_count + 1
end
end
end
if ap_joker_count >= 15 then
return true
end
end
end,
}
local what_have_you_done = {
object_type = "Achievement",
key = "what_have_you_done",
order = 6,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "what_have_you_done" then
return true
end
end,
}
local cryptid_the_cryptid = {
object_type = "Achievement",
key = "cryptid_the_cryptid",
order = 7,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "cryptid_the_cryptid" then
return true
end
end,
}
local niw_uoy = {
object_type = "Achievement",
key = "niw_uoy",
order = 8,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "ante_up" and args.ante <= -8 then
return true
end
end,
}
local jokes_on_you = {
object_type = "Achievement",
key = "jokes_on_you",
order = 9,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args) --NOTE: Might be buggy due to G.GAME saving
if args.type == "win" and G.GAME.cry_ach_conditions.the_jokes_on_you_triggered == true then
return true
end
end,
}
local now_the_fun_begins = {
object_type = "Achievement",
key = "now_the_fun_begins",
order = 10,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "modify_jokers" then
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].config.center.key == "j_cry_canvas" then
return true
end
end
end
end,
}
local blurred_blurred_joker = {
object_type = "Achievement",
key = "blurred_blurred_joker",
order = 11,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "modify_jokers" then
for i = 1, #G.jokers.cards do
if
G.jokers.cards[i].config.center.key == "j_cry_blurred"
and (G.jokers.cards[i].edition and G.jokers.cards[i].edition.cry_blur)
then
return true
end
end
end
end,
}
local exodia = {
object_type = "Achievement",
key = "exodia",
order = 12,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "modify_jokers" then
local exotic_count = 0
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].config.center.rarity == "cry_exotic" then
exotic_count = exotic_count + 1
end
end
if exotic_count >= 5 then
return true
end
end
end,
}
local freak_house = {
object_type = "Achievement",
key = "freak_house",
order = 13,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args) -- NOTE: I hate doing checks like this. Unscuff later
if args.type == "hand" then
-- Do you have Nice
local has_nice
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].config.center.key == "j_cry_nice" then
has_nice = true
end
end
--Is it a hearts flush house
local total_6s = 0
local total_9s = 0
local total_hearts = 0
for k, v in ipairs(args.scoring_hand) do
if v:is_suit("Hearts", nil, true) then
total_hearts = total_hearts + 1
end
if v:get_id() == 6 then
total_6s = total_6s + 1
elseif v:get_id() == 9 then
total_9s = total_9s + 1
end
end
if
has_nice
and ((total_6s == 3 and total_9s == 2) or (total_6s == 2 and total_9s == 3))
and total_hearts == 5
and args.disp_text == "Flush House"
then
return true
end
end
end,
}
local ult_full_skip = {
object_type = "Achievement",
key = "ult_full_skip",
order = 14,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "win" and G.GAME.round == 1 then
return true
end
end,
}
local patience_virtue = {
object_type = "Achievement",
key = "patience_virtue",
order = 15,
bypass_all_unlocked = true,
hidden_text = true,
pos = { x = 2, y = 0 },
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "round_win" then
if
G.GAME.blind.config.blind.key == "bl_cry_lavender_loop"
and G.GAME.cry_ach_conditions.patience_virtue_earnable == true
then
return true
end
if G.GAME.cry_ach_conditions.patience_virtue_earnable then
G.GAME.cry_ach_conditions.patience_virtue_earnable = nil
end
if G.GAME.cry_ach_conditions.patience_virtue_timer then
G.GAME.cry_ach_conditions.patience_virtue_timer = nil
end
end
end,
}
local pull_request = {
object_type = "Achievement",
key = "pull_request",
order = 16,
bypass_all_unlocked = true,
hidden_text = true,
pos = { x = 2, y = 0 },
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "pr_unlock" then
return true
end
end,
}
local ace_through_crash = {
object_type = "Achievement",
key = "ace_in_crash",
order = 17,
bypass_all_unlocked = true,
pos = { x = 2, y = 0 },
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "ace_in_crash" then
return true
end
end,
}
local home_realtor = {
object_type = "Achievement",
key = "home_realtor",
order = 18,
bypass_all_unlocked = true,
hidden_text = true,
pos = { x = 2, y = 0 },
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
--todo: check for doe/antimatter sleeves
if args.type == "home_realtor" then
return true
end
end,
}
local traffic_jam = {
object_type = "Achievement",
key = "traffic_jam",
order = 19,
bypass_all_unlocked = true,
hidden_text = true,
pos = { x = 2, y = 0 },
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "win_challenge" or args.type == "win_challenge_startup" then
local rush_hours_beaten = 0
if G.PROFILES[G.SETTINGS.profile].challenge_progress.completed["c_cry_rush_hour"] then
rush_hours_beaten = rush_hours_beaten + 1
end
if G.PROFILES[G.SETTINGS.profile].challenge_progress.completed["c_cry_rush_hour_ii"] then
rush_hours_beaten = rush_hours_beaten + 1
end
if G.PROFILES[G.SETTINGS.profile].challenge_progress.completed["c_cry_rush_hour_iii"] then
rush_hours_beaten = rush_hours_beaten + 1
end
if rush_hours_beaten == 3 then
return true
end
end
end,
}
local perfectly_balanced = {
object_type = "Achievement",
key = "perfectly_balanced",
order = 20,
bypass_all_unlocked = true,
hidden_text = true,
pos = { x = 2, y = 0 },
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "win_stake" or args.type == "win_stake_startup" then
if
(G.GAME.selected_back.effect.center.key == "b_cry_very_fair" and G.GAME.stake == 32)
or get_deck_win_stake("b_cry_very_fair") == 32
then
return true
end
end
end,
}
-- TODO: Add new Achievements.
-- Current Ideas (Normal):
-- Cry: Win a run with only Sob and Obelisk
-- Overtuned: Have any Glitched item give either 100x or 0.01x its original values
-- Current Ideas (Platinum):
-- Implemented (Normal)
-- Break Infinity: Score more than 1.57e308 in one hand
-- H4xx0r: Use a cheat code
-- We Told You Not To: Use ://CRASH
-- Googol Play Pass: Rig a Googol Play Card
-- Bullet Hell: Have 15 copies of AP Joker
-- !niW uoY: Reach Ante -8
-- Now the Fun Begins: Obtain Canvas
-- Exodia: Have 5 Exotic Jokers
-- WHAT HAVE YOU DONE: Delete or Sacrifice an Exotic Joker
-- Joke's on You, Pal!: Trigger The Joke's effect on Ante 1 and win the run
-- Freak House: Play a Flush House consisting of 6s and 9s of Hearts whilst possessing Nice
-- Ultimate Full Skip: Win in 1 round
-- Legally Blind: Obtain a Blurred Blurred Joker
-- Cryptid the Cryptid: Use Cryptid on Cryptid
-- Implemented (Platinum)
-- Patience is a Virtue: Wait out Lavender Loop for 2 minutes before playing first hand and beat it
-- Pull Request: Have ://COMMIT spawn the same Joker that it destroyed
-- Pocket ACE: Only unlockable through using ACE to unlock
-- Home Realtor: Activate Happy House before Ante 8 (without DoE/Antimatter)
-- Traffic Jam: Win all Rush Hour challenges
-- Perfectly Balanced: Beat Very Fair Deck on Ascendant Stake
local achievement_objects = {
achievement_atlas,
break_infinity,
bullet_hell,
cryptid_the_cryptid,
now_the_fun_begins,
blurred_blurred_joker,
exodia,
what_have_you_done,
used_crash,
haxxor,
googol_play_pass,
pull_request,
niw_uoy,
jokes_on_you,
freak_house,
ult_full_skip,
patience_virtue,
ace_through_crash,
home_realtor,
traffic_jam,
perfectly_balanced,
}
return { name = "Achievements", init = function() end, items = achievement_objects }