balatro-mods/Cryptid/lib/ascended.lua

302 lines
10 KiB
Lua

-- ascended.lua - Used for Ascended Hands
G.FUNCS.cry_asc_UI_set = function(e)
if G.GAME.cry_exploit_override then
e.config.object.colours = { darken(G.C.SECONDARY_SET.Code, 0.2) }
else
e.config.object.colours = { G.C.GOLD }
end
e.config.object:update_text()
end
-- Needed because get_poker_hand_info isnt called at the end of the road
local evaluateroundref = G.FUNCS.evaluate_round
function G.FUNCS.evaluate_round()
evaluateroundref()
-- This is just the easiest way to check if its gold because lua is annoying
if G.C.UI_CHIPS[1] == G.C.GOLD[1] then
ease_colour(G.C.UI_CHIPS, G.C.BLUE, 0.3)
ease_colour(G.C.UI_MULT, G.C.RED, 0.3)
end
end
-- this is a hook to make funny "x of a kind"/"flush x" display text
local pokerhandinforef = G.FUNCS.get_poker_hand_info
function G.FUNCS.get_poker_hand_info(_cards)
local text, loc_disp_text, poker_hands, scoring_hand, disp_text = pokerhandinforef(_cards)
-- Display text if played hand contains a Cluster and a Bulwark
-- Not Ascended hand related but this hooks in the same spot so i'm lumping it here anyways muahahahahahaha
if text == "cry_Clusterfuck" then
if next(poker_hands["cry_Bulwark"]) then
disp_text = "cry-Cluster Bulwark"
loc_disp_text = localize(disp_text, "poker_hands")
end
end
local hidden = false
for i, v in pairs(scoring_hand) do
if v.facing == "back" then
hidden = true
break
end
end
if G.SETTINGS.language == "en-us" then
if #scoring_hand > 5 and (text == "Flush Five" or text == "Five of a Kind" or text == "bunc_Spectrum Five") then
local rank_array = {}
local county = 0
for i = 1, #scoring_hand do
local val = scoring_hand[i]:get_id()
rank_array[val] = (rank_array[val] or 0) + 1
if rank_array[val] > county then
county = rank_array[val]
end
end
local function create_num_chunk(int) -- maybe useful enough to not be local? but tbh this function is probably some common coding exercise
if int >= 1000 then
int = 999
end
local ones = {
["1"] = "One",
["2"] = "Two",
["3"] = "Three",
["4"] = "Four",
["5"] = "Five",
["6"] = "Six",
["7"] = "Seven",
["8"] = "Eight",
["9"] = "Nine",
}
local tens = {
["1"] = "Ten",
["2"] = "Twenty",
["3"] = "Thirty",
["4"] = "Forty",
["5"] = "Fifty",
["6"] = "Sixty",
["7"] = "Seventy",
["8"] = "Eighty",
["9"] = "Ninety",
}
local str_int = string.reverse(int .. "") -- ehhhh whatever
local str_ret = ""
for i = 1, string.len(str_int) do
local place = str_int:sub(i, i)
if place ~= "0" then
if i == 1 then
str_ret = ones[place]
elseif i == 2 then
if place == "1" and str_ret ~= "" then -- admittedly not my smartest moment, i dug myself into a hole here...
if str_ret == "One" then
str_ret = "Eleven"
elseif str_ret == "Two" then
str_ret = "Twelve"
elseif str_ret == "Three" then
str_ret = "Thirteen"
elseif str_ret == "Five" then
str_ret = "Fifteen"
elseif str_ret == "Eight" then
str_ret = "Eighteen"
else
str_ret = str_ret .. "teen"
end
else
str_ret = tens[place] .. ((string.len(str_ret) > 0 and " " or "") .. str_ret)
end
elseif i == 3 then
str_ret = ones[place]
.. (" Hundred" .. ((string.len(str_ret) > 0 and " and " or "") .. str_ret))
end -- this line is wild
end
end
return str_ret
end
-- text gets stupid small at 100+ anyway
loc_disp_text = (text == "Flush Five" and "Flush " or text == "bunc_Spectrum Five" and "Spectrum " or "")
.. (
(county < 1000 and create_num_chunk(county) or "Thousand")
.. (text == "Five of a Kind" and " of a Kind" or "")
)
end
end
-- Ascension power
local a_power = Cryptid.calculate_ascension_power(
text,
_cards,
scoring_hand,
G.GAME.used_vouchers.v_cry_hyperspacetether,
G.GAME.bonus_asc_power
)
if a_power > 0 then
G.GAME.current_round.current_hand.cry_asc_num = a_power
-- Change mult and chips colors if hand is ascended
if not hidden then
ease_colour(G.C.UI_CHIPS, copy_table(G.C.GOLD), 0.3)
ease_colour(G.C.UI_MULT, copy_table(G.C.GOLD), 0.3)
G.GAME.current_round.current_hand.cry_asc_num_text = (
a_power and (type(a_power) == "table" and a_power:gt(to_big(0)) or a_power > 0)
)
and " (+" .. a_power .. ")"
or ""
else
ease_colour(G.C.UI_CHIPS, G.C.BLUE, 0.3)
ease_colour(G.C.UI_MULT, G.C.RED, 0.3)
G.GAME.current_round.current_hand.cry_asc_num_text = ""
end
else
G.GAME.current_round.current_hand.cry_asc_num = 0
ease_colour(G.C.UI_CHIPS, G.C.BLUE, 0.3)
ease_colour(G.C.UI_MULT, G.C.RED, 0.3)
G.GAME.current_round.current_hand.cry_asc_num_text = ""
end
return text, loc_disp_text, poker_hands, scoring_hand, disp_text
end
function Cryptid.ascend(num) -- edit this function at your leisure
if (Cryptid.safe_get(G, "GAME", "current_round", "current_hand", "cry_asc_num") or 0) <= 0 then
return num
end
if Cryptid.gameset(G.P_CENTERS.c_cry_sunplanet) == "modest" then
-- Default: Chips and Mult multiplier + 0.25 for every 1 Ascension power
return num * to_big(1 + ((0.25 + G.GAME.sunnumber.modest) * G.GAME.current_round.current_hand.cry_asc_num))
else
-- Default: Chips and Mult multiplier X1.25 for every 1 Ascension power
return num * to_big((1.25 + G.GAME.sunnumber.not_modest) ^ G.GAME.current_round.current_hand.cry_asc_num)
end
end
function Cryptid.pulse_flame(duration, intensity) -- duration is in seconds, intensity is in idfk honestly, but it increases pretty quickly
G.cry_flame_override = G.cry_flame_override or {}
G.cry_flame_override["duration"] = duration or 0.01
G.cry_flame_override["intensity"] = intensity or 2
end
function Cryptid.calculate_ascension_power(hand_name, hand_cards, hand_scoring_cards, tether, bonus)
bonus = bonus or 0
local starting = 0
if Cryptid.enabled("set_cry_poker_hand_stuff") ~= true then
return 0
end
if hand_name then
-- Get Starting Ascension power from Poker Hands
if hand_cards then
local check = Cryptid.hand_ascension_numbers(hand_name, tether)
if check then
starting = (tether and #hand_cards or #hand_scoring_cards) - check
end
end
-- Extra starting calculation for Declare hands
if G.GAME.hands[hand_name] and G.GAME.hands[hand_name].declare_cards then
local total = 0
for i, v in pairs(G.GAME.hands[hand_name].declare_cards or {}) do
local how_many_fit = 0
local suit, rank
for i2, v2 in pairs(hand_cards) do
if not v2.marked then
if SMODS.has_no_rank(v2) and v.rank == "rankless" or v2:get_id() == v.rank then
rank = true
end
if v2:is_suit(v.suit) or (v.suit == "suitless" and SMODS.has_no_suit(v2)) or not v.suit then
suit = true
end
if not (suit and rank) then
suit = false
rank = false
end
if suit and rank then
how_many_fit = how_many_fit + 1
v2.marked = true
end
end
end
if not rank or not suit then
how_many_fit = 0
end
total = total + how_many_fit
end
for i2, v2 in pairs(hand_cards) do
v2.marked = nil
end
starting = starting + (total - #hand_scoring_cards)
end
end
-- Get Ascension power from Exploit
if G.GAME.cry_exploit_override then
bonus = bonus + 1
end
-- Get Ascension Power From Sol (Observatory effect)
if G.GAME.used_vouchers.v_observatory and next(find_joker("cry-sunplanet")) then
if #find_joker("cry-sunplanet") == 1 then
bonus = bonus + 1
else
bonus = bonus + Cryptid.nuke_decimals(Cryptid.funny_log(2, #find_joker("cry-sunplanet") + 1), 2)
end
end
local final = math.max(0, starting + bonus)
-- Round to 1 if final value is less than 1 but greater than 0
if final > 0 and final < 1 then
final = 1
end
return final
end
function Cryptid.hand_ascension_numbers(hand_name, tether)
if Cryptid.ascension_numbers[hand_name] and type(Cryptid.ascension_numbers[hand_name]) == "function" then
return Cryptid.ascension_numbers[hand_name](hand_name, tether)
end
if hand_name == "High Card" then
return tether and 1 or nil
elseif hand_name == "Pair" then
return tether and 2 or nil
elseif hand_name == "Two Pair" then
return 4
elseif hand_name == "Three of a Kind" then
return tether and 3 or nil
elseif hand_name == "Straight" or hand_name == "Flush" or hand_name == "Straight Flush" then
return next(SMODS.find_card("j_four_fingers")) and Cryptid.gameset() ~= "modest" and 4 or 5
elseif
hand_name == "Full House"
or hand_name == "Five of a Kind"
or hand_name == "Flush House"
or hand_name == "cry_Bulwark"
or hand_name == "Flush Five"
or hand_name == "bunc_Spectrum"
or hand_name == "bunc_Straight Spectrum"
or hand_name == "bunc_Spectrum House"
or hand_name == "bunc_Spectrum Five"
then
return 5
elseif hand_name == "Four of a Kind" then
return G.GAME.used_vouchers.v_cry_hyperspacetether and 4 or nil
elseif hand_name == "cry_Clusterfuck" or hand_name == "cry_UltPair" then
return 8
elseif hand_name == "cry_WholeDeck" then
return 52
elseif hand_name == "cry_Declare0" then
return G.GAME.hands.cry_Declare0
and G.GAME.hands.cry_Declare0.declare_cards
and #G.GAME.hands.cry_Declare0.declare_cards
elseif hand_name == "cry_Declare1" then
return G.GAME.hands.cry_Declare1
and G.GAME.hands.cry_Declare1.declare_cards
and #G.GAME.hands.cry_Declare1.declare_cards
elseif hand_name == "cry_Declare2" then
return G.GAME.hands.cry_Declare2
and G.GAME.hands.cry_Declare2.declare_cards
and #G.GAME.hands.cry_Declare2.declare_cards
elseif
hand_name == "spa_Spectrum"
or hand_name == "spa_Straight_Spectrum"
or hand_name == "spa_Spectrum_House"
or hand_name == "spa_Spectrum_Five"
or hand_name == "spa_Flush_Spectrum"
or hand_name == "spa_Straight_Flush_Spectrum"
or hand_name == "spa_Flush_Spectrum_House"
or hand_name == "spa_Flush_Spectrum_Five"
then
return SpectrumAPI
and SpectrumAPI.configuration.misc.four_fingers_spectrums
and next(SMODS.find_card("j_four_fingers"))
and Cryptid.gameset() ~= "modest"
and 4
or 5
end
return nil
end