updated cryptid + smods

This commit is contained in:
Vomitblood 2025-02-11 02:03:23 +08:00
parent 8cc1ec0a2c
commit 9000c2b6d7
292 changed files with 29180 additions and 16219 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
**/lovely*.log

View file

@ -5,9 +5,9 @@
--- MOD_AUTHOR: [MathIsFun_, Cryptid and Balatro Discords] --- MOD_AUTHOR: [MathIsFun_, Cryptid and Balatro Discords]
--- MOD_DESCRIPTION: Adds unbalanced ideas to Balatro. --- MOD_DESCRIPTION: Adds unbalanced ideas to Balatro.
--- BADGE_COLOUR: 708b91 --- BADGE_COLOUR: 708b91
--- DEPENDENCIES: [Talisman>=2.0.0-beta8, Steamodded>=1.0.0~ALPHA-1216c] --- DEPENDENCIES: [Talisman>=2.0.0-beta8<=2.0.9, Steamodded>=1.0.0~ALPHA-1225a<=1.0.0~ALPHA-1304a]
--- VERSION: 0.5.3a --- VERSION: 0.5.3c
--- PRIORITY: 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 --- PRIORITY: 2147483647
---------------------------------------------- ----------------------------------------------
------------MOD CODE ------------------------- ------------MOD CODE -------------------------
@ -40,7 +40,7 @@ SMODS.Rarity{
SMODS.Rarity{ SMODS.Rarity{
key = "epic", key = "epic",
loc_txt = {}, loc_txt = {},
badge_colour = HEX('571d91'), badge_colour = HEX('ef0098'),
default_weight = 0.003, default_weight = 0.003,
pools = {["Joker"] = true}, pools = {["Joker"] = true},
get_weight = function(self, weight, object_type) get_weight = function(self, weight, object_type)
@ -56,7 +56,7 @@ SMODS.Rarity{
SMODS.Rarity{ SMODS.Rarity{
key = "candy", key = "candy",
loc_txt = {}, loc_txt = {},
badge_colour = HEX("e91ff0"), badge_colour = HEX("e275e6"),
} }
SMODS.Rarity{ SMODS.Rarity{
@ -389,6 +389,44 @@ function cry_edition_to_table(edition) -- look mom i figured it out (this does N
end end
end end
-- just dumping this garbage here
-- this just ensures that extra voucher slots work as expected
function cry_bonusvouchermod(mod)
if not G.GAME.shop then return end
G.GAME.cry_bonusvouchercount = G.GAME.cry_bonusvouchercount + mod
if G.shop_jokers and G.shop_jokers.cards then
G.shop:recalculate()
if mod > 0 then -- not doing minus mod because it'd be janky and who really cares
for i = 1, G.GAME.cry_bonusvouchercount+1 - #G.shop_vouchers.cards do
local curr_bonus = G.GAME.current_round.cry_bonusvouchers
curr_bonus[#curr_bonus+1] = get_next_voucher_key()
-- this could be a function but it's done like what... 3 times? it doesn't matter rn
local card = Card(G.shop_vouchers.T.x + G.shop_vouchers.T.w/2,
G.shop_vouchers.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[curr_bonus[#curr_bonus]],{bypass_discovery_center = true, bypass_discovery_ui = true})
card.shop_cry_bonusvoucher = #curr_bonus
cry_misprintize(card)
if G.GAME.events.ev_cry_choco2 then
card.misprint_cost_fac = (card.misprint_cost_fac or 1) * 2
card:set_cost()
end
if G.GAME.modifiers.cry_enable_flipped_in_shop and pseudorandom('cry_flip_vouch'..G.GAME.round_resets.ante) > 0.7 then
card.cry_flipped = true
end
create_shop_card_ui(card, 'Voucher', G.shop_vouchers)
card:start_materialize()
if G.GAME.current_round.cry_voucher_edition then
card:set_edition(G.GAME.current_round.cry_voucher_edition, true, true)
end
G.shop_vouchers.config.card_limit = G.shop_vouchers.config.card_limit + 1
G.shop_vouchers:emplace(card)
end
end
end
end
-- check if Director's Cut or Retcon offers a cheaper reroll price -- check if Director's Cut or Retcon offers a cheaper reroll price
function cry_cheapest_boss_reroll() function cry_cheapest_boss_reroll()
local dcut = G.GAME.cry_voucher_centers["v_directors_cut"].config.extra or 1e308 local dcut = G.GAME.cry_voucher_centers["v_directors_cut"].config.extra or 1e308
@ -587,7 +625,7 @@ function update_cry_member_count()
GLOBAL_cry_member_update_thread = love.thread.newThread(file_data) GLOBAL_cry_member_update_thread = love.thread.newThread(file_data)
GLOBAL_cry_member_update_thread:start() GLOBAL_cry_member_update_thread:start()
end end
local old = GLOBAL_cry_member_count or 5624 local old = GLOBAL_cry_member_count or 8830
-- get the HTTPS thread's value for Cryptid members -- get the HTTPS thread's value for Cryptid members
local ret = love.thread.getChannel("member_count"):pop() local ret = love.thread.getChannel("member_count"):pop()
if ret then if ret then
@ -603,7 +641,7 @@ function update_cry_member_count()
end end
else else
-- Use a fallback value if HTTPS is disabled (you all are awesome) -- Use a fallback value if HTTPS is disabled (you all are awesome)
GLOBAL_cry_member_count = 5624 GLOBAL_cry_member_count = 8830
end end
end end
-- deal with Rigged and Fragile when scoring a playing card -- deal with Rigged and Fragile when scoring a playing card
@ -1137,7 +1175,9 @@ function Card:calculate_joker(context)
if active_side.ability.cry_rigged then if active_side.ability.cry_rigged then
G.GAME.probabilities.normal = ggpn G.GAME.probabilities.normal = ggpn
end end
active_side:cry_double_scale_calc(orig_ability, in_context_scaling) active_side:cry_double_scale_calc(orig_ability, in_context_scaling)
--Calculate events --Calculate events
if self == G.jokers.cards[#G.jokers.cards] then if self == G.jokers.cards[#G.jokers.cards] then
for k, v in pairs(SMODS.Events) do for k, v in pairs(SMODS.Events) do
@ -2005,9 +2045,23 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable
center = G.P_CENTERS[center] center = G.P_CENTERS[center]
end end
-- handle banned keys for playing cards
-- can cache this if it's too much of a performance hit
local _cardlist = {}
for k, v in pairs(G.P_CARDS) do
local add = true
if G.GAME and G.GAME.cry_banned_pcards and G.GAME.cry_banned_pcards[k] then
add = false
end
if add then _cardlist[#_cardlist+1] = k end
end
if #_cardlist <= 0 then _cardlist[#_cardlist+1] = 'S_A' end
local front = ( local front = (
(_type == "Base" or _type == "Enhanced") (_type == "Base" or _type == "Enhanced")
and pseudorandom_element(G.P_CARDS, ps("front" .. (key_append or "") .. G.GAME.round_resets.ante)) and G.P_CARDS[pseudorandom_element(_cardlist, ps("front" .. (key_append or "") .. G.GAME.round_resets.ante))]
) or nil ) or nil
if area == "ERROR" then if area == "ERROR" then
@ -2212,7 +2266,8 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable
end end
end end
if if
G.GAME.modifiers.cry_enable_flipped_in_shop not card.ability.eternal
and G.GAME.modifiers.cry_enable_flipped_in_shop
and pseudorandom("cry_flip" .. (key_append or "") .. G.GAME.round_resets.ante) > 0.7 and pseudorandom("cry_flip" .. (key_append or "") .. G.GAME.round_resets.ante) > 0.7
then then
card.cry_flipped = true card.cry_flipped = true
@ -2245,6 +2300,11 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable
if not (card.edition and (card.edition.cry_oversat or card.edition.cry_glitched)) then if not (card.edition and (card.edition.cry_oversat or card.edition.cry_glitched)) then
cry_misprintize(card) cry_misprintize(card)
end end
if _type == "Joker" and G.GAME.modifiers.cry_common_value_quad then
if card.config.center.rarity == 1 then
cry_misprintize(card,{min = 4, max = 4}, nil, true)
end
end
if card.ability.consumeable and card.pinned then -- counterpart is in Sticker.toml if card.ability.consumeable and card.pinned then -- counterpart is in Sticker.toml
G.GAME.cry_pinned_consumeables = G.GAME.cry_pinned_consumeables + 0 G.GAME.cry_pinned_consumeables = G.GAME.cry_pinned_consumeables + 0
end end
@ -2274,7 +2334,7 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable
card:update(0.016) -- dt is unused in the base game, but we're providing a realistic value anyway card:update(0.016) -- dt is unused in the base game, but we're providing a realistic value anyway
--Debuff jokers if certain boss blinds are active --Debuff jokers if certain boss blinds are active
if G.GAME and G.GAME.blind and not G.GAME.blind.disabled then if _type == "Joker" and G.GAME and G.GAME.blind and not G.GAME.blind.disabled then
if G.GAME.blind.name == "cry-box" if G.GAME.blind.name == "cry-box"
or (G.GAME.blind.name == "cry-Obsidian Orb" and G.GAME.defeated_blinds["bl_cry_box"] == true) then or (G.GAME.blind.name == "cry-Obsidian Orb" and G.GAME.defeated_blinds["bl_cry_box"] == true) then
if card.config.center.rarity == 1 and not card.debuff then if card.config.center.rarity == 1 and not card.debuff then
@ -2494,6 +2554,7 @@ function cry_sanity_check(val)
return val return val
end end
function cry_misprintize(card, override, force_reset, stack) function cry_misprintize(card, override, force_reset, stack)
if Card.no(card, "immutable", true) then force_reset = true end
--infinifusion compat --infinifusion compat
if card.infinifusion then if card.infinifusion then
if card.config.center == card.infinifusion_center or card.config.center.key == 'j_infus_fused' then if card.config.center == card.infinifusion_center or card.config.center.key == 'j_infus_fused' then
@ -2505,7 +2566,7 @@ function cry_misprintize(card, override, force_reset, stack)
if if
(not force_reset or G.GAME.modifiers.cry_jkr_misprint_mod) (not force_reset or G.GAME.modifiers.cry_jkr_misprint_mod)
and (G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker") and (G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker")
and not stack or (not Card.no(card, "immune_to_chemach", true) and not Card.no(card, "immutable", true)) and not stack or not Card.no(card, "immutable", true)
then then
if G.GAME.modifiers.cry_jkr_misprint_mod and card.ability.set == "Joker" then if G.GAME.modifiers.cry_jkr_misprint_mod and card.ability.set == "Joker" then
if not override then if not override then
@ -2686,11 +2747,11 @@ function G.FUNCS.get_poker_hand_info(_cards)
['Pair'] = G.GAME.used_vouchers.v_cry_hyperspacetether and 2 or nil, ['Pair'] = G.GAME.used_vouchers.v_cry_hyperspacetether and 2 or nil,
['Two Pair'] = 4, ['Two Pair'] = 4,
['Three of a Kind'] = G.GAME.used_vouchers.v_cry_hyperspacetether and 3 or nil, ['Three of a Kind'] = G.GAME.used_vouchers.v_cry_hyperspacetether and 3 or nil,
['Straight'] = 5, ['Straight'] = next(SMODS.find_card('j_four_fingers')) and 4 or 5,
['Flush'] = 5, ['Flush'] = next(SMODS.find_card('j_four_fingers')) and 4 or 5,
['Full House'] = 5, ['Full House'] = 5,
['Four of a Kind'] = G.GAME.used_vouchers.v_cry_hyperspacetether and 4 or nil, ['Four of a Kind'] = G.GAME.used_vouchers.v_cry_hyperspacetether and 4 or nil,
['Straight Flush'] = 5, ['Straight Flush'] = next(SMODS.find_card('j_four_fingers')) and 4 or 5, -- debatable
['cry_Bulwark'] = 5, ['cry_Bulwark'] = 5,
['Five of a Kind'] = 5, ['Five of a Kind'] = 5,
['Flush House'] = 5, ['Flush House'] = 5,
@ -2714,7 +2775,7 @@ function G.FUNCS.get_poker_hand_info(_cards)
end end
function cry_ascend(num) -- edit this function at your leisure function cry_ascend(num) -- edit this function at your leisure
return num*((1.25 + (0.05 * (G.GAME.sunnumber or 0)))^G.GAME.current_round.current_hand.cry_asc_num or 0) return math.max(num, num*((1.25 + (0.05 * (G.GAME.sunnumber or 0)))^G.GAME.current_round.current_hand.cry_asc_num or 0))
end end
function cry_pulse_flame(duration, intensity) -- duration is in seconds, intensity is in idfk honestly, but it increases pretty quickly function cry_pulse_flame(duration, intensity) -- duration is in seconds, intensity is in idfk honestly, but it increases pretty quickly
@ -3271,7 +3332,7 @@ SMODS.Sticker:take_ownership("rental", {
local ec = eval_card local ec = eval_card
function eval_card(card, context) function eval_card(card, context)
local ret = ec(card, context) local ret = ec(card, context)
if card and card.area == G.hand or card.area == G.play or card.area == G.discard or card.area == G.deck then if card and (card.area == G.hand or card.area == G.play or card.area == G.discard or card.area == G.deck) then
for k, v in pairs(SMODS.Stickers) do for k, v in pairs(SMODS.Stickers) do
if card.ability[k] and v.calculate and type(v.calculate) == "function" then if card.ability[k] and v.calculate and type(v.calculate) == "function" then
context.from_playing_card = true context.from_playing_card = true

View file

@ -58,6 +58,7 @@ local antimatter = {
cry_force_seal = "random", cry_force_seal = "random",
cry_boss_blocked = { "bl_goad", "bl_window", "bl_club", "bl_head" }, cry_boss_blocked = { "bl_goad", "bl_window", "bl_club", "bl_head" },
cry_forced_draw_amount = 5, cry_forced_draw_amount = 5,
cry_common_value_quad = true,
}, },
pos = { x = 2, y = 0 }, pos = { x = 2, y = 0 },
trigger_effect = function(self, args) trigger_effect = function(self, args)

View file

@ -182,9 +182,9 @@ local oldserpent = {
order = 9, order = 9,
boss_colour = HEX("4f6367"), boss_colour = HEX("4f6367"),
modify_hand = function(self, cards, poker_hands, text, mult, hand_chips) modify_hand = function(self, cards, poker_hands, text, mult, hand_chips)
if G.GAME.hands[text].level > 1 then if to_big(G.GAME.hands[text].level) > to_big(1) then
G.GAME.blind.triggered = true G.GAME.blind.triggered = true
return math.floor(mult / G.GAME.hands[text].level), hand_chips, true return math.floor( mult / to_big(G.GAME.hands[text].level) ), hand_chips, true
end end
return mult, hand_chips, false return mult, hand_chips, false
end, end,
@ -270,6 +270,12 @@ local tax = {
atlas = "blinds", atlas = "blinds",
order = 2, order = 2,
boss_colour = HEX("40ff40"), boss_colour = HEX("40ff40"),
loc_vars = function(self, info_queue, card)
return { vars = { 0.4 * get_blind_amount(G.GAME.round_resets.ante)*2*G.GAME.starting_params.ante_scaling } } -- no bignum?
end,
collection_loc_vars = function(self)
return { vars = { localize("cry_tax_placeholder") }}
end,
cry_cap_score = function(self, score) cry_cap_score = function(self, score)
return math.floor(math.min(0.4 * G.GAME.blind.chips, score) + 0.5) return math.floor(math.min(0.4 * G.GAME.blind.chips, score) + 0.5)
end, end,
@ -369,9 +375,12 @@ local joke = {
atlas = "blinds", atlas = "blinds",
order = 15, order = 15,
boss_colour = HEX("00ffaa"), boss_colour = HEX("00ffaa"),
loc_vars = function(self, info_queue, card) loc_vars = function(self)
return { vars = { G.GAME.win_ante or 8 } } return { vars = { G.GAME.win_ante or 8, (G.GAME.win_ante and G.GAME.round_resets.ante) and math.floor(G.GAME.round_resets.ante + (G.GAME.win_ante - G.GAME.round_resets.ante % G.GAME.win_ante)) or 8 } }
end, end,
collection_loc_vars = function(self)
return { vars = { '8', localize('cry_joke_placeholder') }}
end,
cry_calc_ante_gain = function(self) cry_calc_ante_gain = function(self)
if to_big(G.GAME.chips) >= to_big(G.GAME.blind.chips) * 2 then if to_big(G.GAME.chips) >= to_big(G.GAME.blind.chips) * 2 then
if G.GAME.round_resets.ante == 1 then if G.GAME.round_resets.ante == 1 then
@ -493,6 +502,7 @@ local shackle = {
order = 18, order = 18,
boss_colour = HEX("010466"), boss_colour = HEX("010466"),
in_pool = function() in_pool = function()
if G.GAME.modifiers.cry_force_edition and G.GAME.modifiers.cry_force_edition == "negative" then return false end
if not G.jokers then if not G.jokers then
return false return false
end end
@ -1415,6 +1425,7 @@ return {
end end
if if
self.name ~= "cry-Obsidian Orb" self.name ~= "cry-Obsidian Orb"
and self.name ~= "The Sink"
and (self.name ~= "cry-oldarm" or not G.GAME.defeated_blinds["bl_psychic"]) and (self.name ~= "cry-oldarm" or not G.GAME.defeated_blinds["bl_psychic"])
and (self.name ~= "The Psychic" or not G.GAME.defeated_blinds["bl_cry_oldarm"]) and (self.name ~= "The Psychic" or not G.GAME.defeated_blinds["bl_cry_oldarm"])
and (self.name ~= "The Eye" or not G.GAME.defeated_blinds["bl_mouth"]) and (self.name ~= "The Eye" or not G.GAME.defeated_blinds["bl_mouth"])

View file

@ -215,10 +215,18 @@ local payload = {
end, end,
can_bulk_use = true, can_bulk_use = true,
use = function(self, card, area, copier) use = function(self, card, area, copier)
G.GAME.cry_payload = (G.GAME.cry_payload or 1) * card.ability.interest_mult if G.GAME.dollars > 1e10 then
G.GAME.cry_payload = 3
else
G.GAME.cry_payload = (G.GAME.cry_payload or 1) * card.ability.interest_mult
end
end, end,
bulk_use = function(self, card, area, copier, number) bulk_use = function(self, card, area, copier, number)
G.GAME.cry_payload = (G.GAME.cry_payload or 1) * card.ability.interest_mult ^ number if G.GAME.dollars > 1e10 then
G.GAME.cry_payload = 3
else
G.GAME.cry_payload = (G.GAME.cry_payload or 1) * card.ability.interest_mult ^ number
end
end, end,
} }
local reboot = { local reboot = {
@ -433,14 +441,25 @@ local seed = {
local rigged = { local rigged = {
object_type = "Sticker", object_type = "Sticker",
atlas = "sticker", atlas = "sticker",
pos = { x = 5, y = 1 }, pos = { x = 6, y = 1 },
key = "cry_rigged", key = "cry_rigged",
no_sticker_sheet = true, no_sticker_sheet = true,
prefix_config = { key = false }, prefix_config = { key = false },
badge_colour = HEX("14b341"), badge_colour = HEX("14b341"),
draw = function(self, card) --don't draw shine draw = function(self, card) --don't draw shine
if not G.shared_stickers["cry_rigged2"] then
G.shared_stickers["cry_rigged2"] = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_sticker"], { x = 5, y = 1 })
end -- no matter how late i init this, it's always late, so i'm doing it in the damn draw function
G.shared_stickers[self.key].role.draw_major = card G.shared_stickers[self.key].role.draw_major = card
G.shared_stickers["cry_rigged2"].role.draw_major = card
G.shared_stickers[self.key]:draw_shader("dissolve", nil, nil, nil, card.children.center) G.shared_stickers[self.key]:draw_shader("dissolve", nil, nil, nil, card.children.center)
card.hover_tilt = card.hover_tilt/2 -- call it spaghetti, but it's what hologram does so...
G.shared_stickers["cry_rigged2"]:draw_shader("dissolve", nil, nil, nil, card.children.center)
G.shared_stickers["cry_rigged2"]:draw_shader("hologram", nil, card.ARGS.send_to_shader, nil, card.children.center) -- this doesn't really do much tbh, but the slight effect is nice
card.hover_tilt = card.hover_tilt*2
end, end,
} }
@ -457,6 +476,7 @@ local hook = {
cost = 4, cost = 4,
atlas = "code", atlas = "code",
order = 14, order = 14,
no_pool_flag = "beta_deck",
can_use = function(self, card) can_use = function(self, card)
return #G.jokers.highlighted == 2 return #G.jokers.highlighted == 2
end, end,
@ -512,7 +532,7 @@ local variable = {
order = 8, order = 8,
config = { max_highlighted = 2, extra = { enteredrank = "" } }, config = { max_highlighted = 2, extra = { enteredrank = "" } },
loc_vars = function(self, info_queue, card) loc_vars = function(self, info_queue, card)
return { vars = { self.config.max_highlighted } } return { vars = { card and card.ability.max_highlighted or self.config.max_highlighted } }
end, end,
use = function(self, card, area, copier) use = function(self, card, area, copier)
G.GAME.USING_CODE = true G.GAME.USING_CODE = true
@ -546,7 +566,7 @@ local class = {
order = 16, order = 16,
config = { max_highlighted = 1, extra = { enteredrank = "" } }, config = { max_highlighted = 1, extra = { enteredrank = "" } },
loc_vars = function(self, info_queue, card) loc_vars = function(self, info_queue, card)
return { vars = { self.config.max_highlighted } } return { vars = { card and card.ability.max_highlighted or self.config.max_highlighted } }
end, end,
use = function(self, card, area, copier) use = function(self, card, area, copier)
G.GAME.USING_CODE = true G.GAME.USING_CODE = true
@ -819,9 +839,14 @@ local delete = {
if not G.GAME.banned_keys then if not G.GAME.banned_keys then
G.GAME.banned_keys = {} G.GAME.banned_keys = {}
end -- i have no idea if this is always initialised already tbh end -- i have no idea if this is always initialised already tbh
if not G.GAME.cry_banned_pcards then
G.GAME.cry_banned_pcards = {}
end
local a = nil local a = nil
local c = nil local c = nil
local _p = nil
if G.shop_jokers.highlighted[1] then if G.shop_jokers.highlighted[1] then
_p = not not G.shop_jokers.highlighted[1].base.value
a = G.shop_jokers a = G.shop_jokers
c = G.shop_jokers.highlighted[1] c = G.shop_jokers.highlighted[1]
end end
@ -843,6 +868,13 @@ local delete = {
check_for_unlock({ type = "what_have_you_done" }) check_for_unlock({ type = "what_have_you_done" })
end end
G.GAME.banned_keys[c.config.center.key] = true G.GAME.banned_keys[c.config.center.key] = true
if _p then
for k, v in pairs(G.P_CARDS) do
if v.value == c.base.value and v.suit == c.base.suit then
G.GAME.cry_banned_pcards[k] = true
end
end
end
c:start_dissolve() c:start_dissolve()
end, end,
} }
@ -895,12 +927,50 @@ local machinecode = {
return true return true
end, end,
can_bulk_use = true, can_bulk_use = true,
loc_vars = function(self, info_queue, center)
return {
main_start = {
randomchar(codechars6),
randomchar(codechars6),
randomchar(codechars6),
randomchar(codechars6),
randomchar(codechars6),
randomchar(codechars6),
}
}
end,
use = function(self, card, area, copier) use = function(self, card, area, copier)
local card = create_card("Consumeables", G.consumables, nil, nil, nil, nil, nil, "cry_machinecode") local card = create_card("Consumeables", G.consumables, nil, nil, nil, nil, get_random_consumable("cry_machinecode", nil, "c_cry_machinecode").key, c_cry_machinecode)
card:set_edition({ cry_glitched = true }) card:set_edition({ cry_glitched = true })
card:add_to_deck() card:add_to_deck()
G.consumeables:emplace(card) G.consumeables:emplace(card)
end, end,
bulk_use = function(self, card, area, copier, number)
local a = {}
local b
for i = 1, number do
b = get_random_consumable("cry_machinecode", nil, "c_cry_machinecode")
a[b] = (a[b] or 0) + 1
end
for k, v in pairs(a) do
local card = create_card("Consumeables", G.consumables, nil, nil, nil, nil, k.key)
card:set_edition({ cry_glitched = true })
card:add_to_deck()
if Incantation then
card:setQty(v)
end
G.consumeables:emplace(card)
end
G.E_MANAGER:add_event(
Event({
trigger = "after",
func = function()
a = nil
return true
end,
})
)
end,
} }
local run = { local run = {
object_type = "Consumable", object_type = "Consumable",
@ -938,6 +1008,7 @@ local run = {
G.GAME.shop_free = nil G.GAME.shop_free = nil
G.GAME.shop_d6ed = nil G.GAME.shop_d6ed = nil
G.STATE_COMPLETE = false G.STATE_COMPLETE = false
G.GAME.current_round.used_packs = {}
return true return true
end, end,
})) }))
@ -1014,6 +1085,7 @@ local rework = {
name = "cry-Rework", name = "cry-Rework",
atlas = "code", atlas = "code",
order = 25, order = 25,
no_pool_flag = "beta_deck",
pos = { pos = {
x = 3, x = 3,
y = 3, y = 3,
@ -1282,6 +1354,7 @@ local ctrl_v = {
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
local card = copy_card(G.consumeables.highlighted[1]) local card = copy_card(G.consumeables.highlighted[1])
if card.ability.name and card.ability.name == "cry-Chambered" then card.ability.extra.num_copies = 1 end
card:add_to_deck() card:add_to_deck()
if Incantation then if Incantation then
card:setQty(1) card:setQty(1)
@ -1311,6 +1384,7 @@ local ctrl_v = {
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
local card = copy_card(G.consumeables.highlighted[1]) local card = copy_card(G.consumeables.highlighted[1])
if card.ability.name and card.ability.name == "cry-Chambered" then card.ability.extra.num_copies = 1 end
card:add_to_deck() card:add_to_deck()
if Incantation then if Incantation then
card:setQty(1) card:setQty(1)
@ -1351,29 +1425,33 @@ local inst = {
return #selected_cards == 1 return #selected_cards == 1
end, end,
use = function(self, card, area, copier) use = function(self, card, area, copier)
local same = 0
for i = 1, #G.deck.cards do for i = 1, #G.deck.cards do
if G.deck.cards[i].base.value == G.hand.highlighted[1].base.value then if G.deck.cards[i].base.value == G.hand.highlighted[1].base.value then
same = i
draw_card(G.deck,G.hand,nil,nil,false,G.deck.cards[i]) draw_card(G.deck,G.hand,nil,nil,false,G.deck.cards[i])
break break
end end
end end
for i = 1, #G.deck.cards do for i = 1, #G.deck.cards do
if G.deck.cards[i].base.suit == G.hand.highlighted[1].base.suit then if G.deck.cards[i].base.suit == G.hand.highlighted[1].base.suit and i ~= same then
draw_card(G.deck,G.hand,nil,nil,false,G.deck.cards[i]) draw_card(G.deck,G.hand,nil,nil,false,G.deck.cards[i])
break break
end end
end end
end, end,
bulk_use = function(self, card, area, copier, number) bulk_use = function(self, card, area, copier, number)
for i = 1, number do for j = 1, number do
local same = 0
for i = 1, #G.deck.cards do for i = 1, #G.deck.cards do
if G.deck.cards[i].base.value == G.hand.highlighted[1].base.value then if G.deck.cards[i].base.value == G.hand.highlighted[1].base.value then
same = i
draw_card(G.deck,G.hand,nil,nil,false,G.deck.cards[i]) draw_card(G.deck,G.hand,nil,nil,false,G.deck.cards[i])
break break
end end
end end
for i = 1, #G.deck.cards do for i = 1, #G.deck.cards do
if G.deck.cards[i].base.suit == G.hand.highlighted[1].base.suit then if G.deck.cards[i].base.suit == G.hand.highlighted[1].base.suit and i ~= same then
draw_card(G.deck,G.hand,nil,nil,false,G.deck.cards[i]) draw_card(G.deck,G.hand,nil,nil,false,G.deck.cards[i])
break break
end end
@ -1381,6 +1459,74 @@ local inst = {
end end
end, end,
} }
local alttab = {
object_type = "Consumable",
set = "Code",
key = "alttab",
name = "cry-Alttab",
atlas = "code",
order = 28,
config = { },
pos = {
x = 4,
y = 4,
},
cost = 4,
can_bulk_use = true,
loc_vars = function(self, info_queue, card)
local ret = localize("k_none")
if G.GAME and G.GAME.blind and G.GAME.blind.in_blind then
if G.GAME.blind:get_type() == 'Small' then
ret = localize{type = 'name_text', key = G.GAME.round_resets.blind_tags.Small, set = 'Tag'}
elseif G.GAME.blind:get_type() == 'Big' then
ret = localize{type = 'name_text', key = G.GAME.round_resets.blind_tags.Big, set = 'Tag'}
elseif G.GAME.blind:get_type() == 'Boss' then
ret = '???'
end
end
return { vars = { ret } }
end,
can_use = function(self, card)
return G.GAME.blind and G.GAME.blind.in_blind
end,
use = function(self, card, area, copier)
local used_consumable = copier or card
delay(0.4)
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function()
play_sound('tarot1')
local tag = nil
local type = G.GAME.blind:get_type()
if type == 'Boss' then
tag = Tag(get_next_tag_key())
else
tag = Tag(G.GAME.round_resets.blind_tags[type])
end
add_tag(tag)
used_consumable:juice_up(0.8, 0.5)
return true end }))
delay(1.2)
end,
bulk_use = function(self, card, area, copier, number)
local used_consumable = copier or card
delay(0.4)
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function()
for j = 1, number do
play_sound('tarot1')
local tag = nil
local type = G.GAME.blind:get_type()
if type == 'Boss' then
tag = Tag(get_next_tag_key())
else
tag = Tag(G.GAME.round_resets.blind_tags[type])
end
add_tag(tag)
used_consumable:juice_up(0.8, 0.5)
delay(0.1)
end
return true end }))
delay(1.1)
end,
}
local automaton = { local automaton = {
object_type = "Consumable", object_type = "Consumable",
@ -1392,7 +1538,7 @@ local automaton = {
order = 5, order = 5,
atlas = "code", atlas = "code",
loc_vars = function(self, info_queue, card) loc_vars = function(self, info_queue, card)
return { vars = { self.config.create } } return { vars = { card and card.ability and card.ability.create or self.config.create } }
end, end,
can_use = function(self, card) can_use = function(self, card)
return #G.consumeables.cards < G.consumeables.config.card_limit or card.area == G.consumeables return #G.consumeables.cards < G.consumeables.config.card_limit or card.area == G.consumeables
@ -1597,6 +1743,28 @@ local CodeJoker = {
"Kailen" "Kailen"
} }
}, },
unlocked = false,
check_for_unlock = function(self, args)
if G.P_CENTER_POOLS['Code'] then
local count = 0
local count2 = 0
for k,v in pairs(G.P_CENTER_POOLS['Code']) do
count2 = count2+1
if v and v.discovered == true then
count = count + 1
end
end
if count == count2 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 copypaste = { local copypaste = {
@ -1606,13 +1774,13 @@ local copypaste = {
pos = { x = 3, y = 4 }, pos = { x = 3, y = 4 },
order = 110, order = 110,
immune_to_chemach = true, immune_to_chemach = true,
config = { extra = { odds = 2, ckt = 0 } }, config = { extra = { odds = 2, ckt = 0 } }, -- what is a ckt
rarity = "cry_epic", rarity = "cry_epic",
cost = 14, cost = 14,
blueprint_compat = true, blueprint_compat = true,
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, card)
return { return {
vars = { "" .. (G.GAME and G.GAME.probabilities.normal or 1), (center and center.ability.extra.odds or 2) }, vars = { card and cry_prob(math.min(card.ability.extra.odds/2, card.ability.cry_prob), card.ability.extra.odds, card.ability.cry_rigged) or 1, card and card.ability.extra.odds or 2 }, -- this effectively prevents a copypaste from ever initially misprinting at above 50% odds. still allows rigging/oops
} }
end, end,
atlas = "atlasepic", atlas = "atlasepic",
@ -1623,7 +1791,7 @@ local copypaste = {
and not context.consumeable.beginning_end and not context.consumeable.beginning_end
then then
if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
if pseudorandom("cry_copypaste_joker") < G.GAME.probabilities.normal / card.ability.extra.odds then if pseudorandom("cry_copypaste_joker") < cry_prob(math.min(card.ability.extra.odds/2, card.ability.cry_prob), card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds then
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
local cards = copy_card(context.consumeable) local cards = copy_card(context.consumeable)
@ -2208,7 +2376,7 @@ G.FUNCS.variable_apply = function()
{ "J", "Jack" }, { "J", "Jack" },
{ "Q", "Queen" }, { "Q", "Queen" },
{ "K", "King" }, { "K", "King" },
{ "A", "Ace", "One" }, { "A", "Ace", "One", "1", "I" },
{ "M" }, { "M" },
{ "nil" }, { "nil" },
} }
@ -2431,6 +2599,7 @@ G.FUNCS.class_apply = function()
m_gold = { "gold", "money", "yellow" }, m_gold = { "gold", "money", "yellow" },
m_lucky = { "lucky", "rng" }, m_lucky = { "lucky", "rng" },
m_cry_echo = { "echo", "retrigger", "retriggers" }, m_cry_echo = { "echo", "retrigger", "retriggers" },
m_cry_light = { "light" },
ccd = { "ccd" }, ccd = { "ccd" },
null = { "nil" }, null = { "nil" },
} }
@ -2875,6 +3044,7 @@ G.FUNCS.pointer_apply = function()
and not G.GAME.banned_keys[current_card] and not G.GAME.banned_keys[current_card]
then then
local card = create_card("Consumeable", G.consumeables, nil, nil, nil, nil, current_card) local card = create_card("Consumeable", G.consumeables, nil, nil, nil, nil, current_card)
if card.ability.name and card.ability.name == "cry-Chambered" then card.ability.extra.num_copies = 1 end
card:add_to_deck() card:add_to_deck()
G.consumeables:emplace(card) G.consumeables:emplace(card)
created = true created = true
@ -3046,6 +3216,203 @@ G.FUNCS.pointer_apply = function()
G.GAME.USING_POINTER = false G.GAME.USING_POINTER = false
end end
end end
if not current_card then -- if card isn't created yet, try playing cards
local words = {}
for i in string.gmatch(string.lower(entered_card), "%S+") do -- not using apply_lower because we actually want the spaces here
table.insert(words, i)
end
local rank_table = {
{ "stone" },
{ "2", "Two", "II" },
{ "3", "Three", "III" },
{ "4", "Four", "IV" },
{ "5", "Five", "V" },
{ "6", "Six", "VI" },
{ "7", "Seven", "VII" },
{ "8", "Eight", "VIII" },
{ "9", "Nine", "IX" },
{ "10", "1O", "Ten", "X", "T" },
{ "J", "Jack" },
{ "Q", "Queen" },
{ "K", "King" },
{ "A", "Ace", "One", "1", "I" },
} -- ty variable
local _rank = nil
for m = #words, 1, -1 do -- the legendary TRIPLE LOOP, checking from end since rank is most likely near the end
for i, v in pairs(rank_table) do
for j, k in pairs(v) do
if words[m] == string.lower(k) then
_rank = i
break
end
end
if _rank then break end
end
if _rank then break end
end
if _rank then -- a playing card is going to get created at this point, but we can find additional descriptors
local suit_table = {
["Spades"] = { "spades" },
["Hearts"] = { "hearts" },
["Clubs"] = { "clubs" },
["Diamonds"] = { "diamonds" },
}
for k, v in pairs(SMODS.Suits) do
local index = v.key
local current_name = G.localization.misc.suits_plural[index]
if not suit_table[v.key] then
suit_table[v.key] = { string.lower(current_name) }
end
end
-- i'd rather be pedantic and not forgive stuff like "spade", there's gonna be a lot of checks
-- can change that if need be
local enh_table = {
["m_lucky"] = { "lucky" },
["m_mult"] = { "mult" },
["m_bonus"] = { "bonus" },
["m_wild"] = { "wild" },
["m_steel"] = { "steel" },
["m_glass"] = { "glass" },
["m_gold"] = { "gold" },
["m_stone"] = { "stone" },
["m_cry_echo"] = { "echo" },
}
for k, v in pairs(G.P_CENTER_POOLS.Enhanced) do
local index = v.key
local current_name = G.localization.descriptions.Enhanced[index].name
current_name = current_name:gsub(" Card$", "")
if not enh_table[v.key] then
enh_table[v.key] = { string.lower(current_name) }
end
end
local ed_table = {
["e_base"] = { "base" },
["e_foil"] = { "foil" },
["e_holo"] = { "holo" },
["e_polychrome"] = { "polychrome" },
["e_negative"] = { "negative" },
["e_cry_mosaic"] = { "mosaic" },
["e_cry_oversat"] = { "oversat" },
["e_cry_glitched"] = { "glitched" },
["e_cry_astral"] = { "astral" },
["e_cry_blur"] = { "blurred" },
["e_cry_gold"] = { "golden" },
["e_cry_glass"] = { "fragile" },
["e_cry_m"] = { "jolly" },
["e_cry_noisy"] = { "noisy" },
["e_cry_double_sided"] = { "double-sided", "double_sided", "double" }, -- uhhh sure
}
for k, v in pairs(G.P_CENTER_POOLS.Edition) do
local index = v.key
local current_name = G.localization.descriptions.Edition[index].name
if not ed_table[v.key] then
ed_table[v.key] = { string.lower(current_name) }
end
end
local seal_table = {
["Red"] = { "red" },
["Blue"] = { "blue" },
["Purple"] = { "purple" },
["Gold"] = { "gold", "golden" }, -- don't worry we're handling seals differently
["cry_azure"] = { "azure" },
["cry_green"] = { "green" },
}
local sticker_table = {
["eternal"] = { "eternal" },
["perishable"] = { "perishable" },
["rental"] = { "rental" },
["pinned"] = { "pinned" },
["banana"] = { "banana" },
["cry_rigged"] = { "rigged" },
}
local function parsley(_table, _word)
for i, v in pairs(_table) do
for j, k in pairs(v) do
if _word == string.lower(k) then
return i
end
end
end
return ""
end
local function to_rank(rrank)
if rrank <= 10 then return tostring(rrank)
elseif rrank == 11 then return "Jack"
elseif rrank == 12 then return "Queen"
elseif rrank == 13 then return "King"
elseif rrank == 14 then return "Ace"
end
end
-- ok with all that fluff out the way now we can figure out what on earth we're creating
local _seal_att = false
local _suit = ""
local _enh = ""
local _ed = ""
local _seal = ""
local _stickers = {}
for m = #words, 1, -1 do
-- we have a word. figure out what that word is
-- this is dodgy spaghetti but w/ever
local wword = words[m]
if _suit == "" then _suit = parsley(suit_table, wword) end
if _enh == "" then
_enh = parsley(enh_table, wword)
if _enh == "m_gold" and _seal_att == true then _enh = "" end
end
if _ed == "" then
_ed = parsley(ed_table, wword)
if _ed == "e_cry_gold" and _seal_att == true then _ed = "" end
end
if _seal == "" then
_seal = parsley(seal_table, wword)
if _seal == "Gold" and _seal_att == false then _seal = "" end
end
local _st = parsley(sticker_table, wword)
if _st then _stickers[#_stickers+1] = _st end
if wword == "seal" or wword == "sealed" then
_seal_att = true
else
_seal_att = false
end -- from end so the next word should describe the seal
end
-- now to construct the playing card
-- i'm doing this by applying everything but maybe it's a bit janky?
G.CHOOSE_CARD:remove()
G.GAME.USING_CODE = false
G.GAME.USING_POINTER = false
G.E_MANAGER:add_event(Event({
func = function()
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
local _card = create_card("Base", G.play, nil, nil, nil, nil, nil, "pointer")
SMODS.change_base(_card, _suit ~= "" and _suit or pseudorandom_element({'Spades','Hearts','Diamonds','Clubs'}, pseudoseed('sigil')), _rank > 1 and to_rank(_rank) or nil)
if _enh ~= "" then _card:set_ability(G.P_CENTERS[_enh]) end
if _rank == 1 then _card:set_ability(G.P_CENTERS['m_stone']) end
if _seal ~= "" then _card:set_seal(_seal, true, true) end
if _ed ~= "" then _card:set_edition(_ed, true, true) end
for i = 1, #_stickers do
_card.ability[_stickers[i]] = true
if _stickers[i] == "pinned" then _card.pinned = true end
end
_card:start_materialize()
G.play:emplace(_card)
table.insert(G.playing_cards, _card)
playing_card_joker_effects({ _card })
return true
end}))
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)
end
end
end end
crashes = { crashes = {
function() function()
@ -3469,9 +3836,13 @@ crashes = {
blockable = false, blockable = false,
no_delete = true, no_delete = true,
func = function() func = function()
local c = create_card("Code", nil, nil, nil, nil, nil, "c_cry_crash") G.GAME.accel = G.GAME.accel or 1.1
c.T.x = math.random(-G.CARD_W, G.TILE_W) for i = 1, G.GAME.accel do
c.T.y = math.random(-G.CARD_H, G.TILE_H) local c = create_card("Code", nil, nil, nil, nil, nil, "c_cry_crash")
c.T.x = math.random(-G.CARD_W, G.TILE_W)
c.T.y = math.random(-G.CARD_H, G.TILE_H)
end
G.GAME.accel = G.GAME.accel^(1.005 + G.GAME.accel/20000)
return false return false
end, end,
}), }),
@ -3544,7 +3915,7 @@ local code_cards = {
malware, malware,
seed, seed,
rigged, rigged,
hook, --hook,
hooked, hooked,
variable, variable,
class, class,
@ -3562,8 +3933,11 @@ local code_cards = {
--patch, --patch,
ctrl_v, ctrl_v,
inst, inst,
encoded, alttab,
} }
if Cryptid.enabled["Misc. Decks"] then
code_cards[#code_cards + 1] = encoded
end
if Cryptid.enabled["Misc."] then if Cryptid.enabled["Misc."] then
code_cards[#code_cards + 1] = spaghetti code_cards[#code_cards + 1] = spaghetti
end end
@ -4042,8 +4416,9 @@ return {
local gfco = G.FUNCS.can_open local gfco = G.FUNCS.can_open
G.FUNCS.can_open = function(e) G.FUNCS.can_open = function(e)
if G.GAME.USING_RUN then if G.GAME.USING_RUN then
e.config.colour = G.C.UI.BACKGROUND_INACTIVE gfco(e)
e.config.button = nil -- e.config.colour = G.C.UI.BACKGROUND_INACTIVE
-- e.config.button = nil
else else
gfco(e) gfco(e)
end end
@ -4069,6 +4444,7 @@ return {
trigger = "after", trigger = "after",
delay = 0.5, delay = 0.5,
func = function() func = function()
G.GAME.current_round.used_packs = {}
G.cry_runarea:remove() G.cry_runarea:remove()
G.cry_runarea = nil G.cry_runarea = nil
G.STATE = G.STATES.SELECTING_HAND G.STATE = G.STATES.SELECTING_HAND
@ -4170,7 +4546,12 @@ return {
local results = evaluate_poker_hand_ref(hand) local results = evaluate_poker_hand_ref(hand)
if G.GAME.cry_exploit_override then if G.GAME.cry_exploit_override then
if not results[G.GAME.cry_exploit_override][1] then if not results[G.GAME.cry_exploit_override][1] then
results[G.GAME.cry_exploit_override] = results["High Card"] -- i would do results.top here but it just doesn't work, if someone could get that working that would be great for _, v in ipairs(G.handlist) do
if results[v][1] then
results[G.GAME.cry_exploit_override] = results[v]
break
end
end
end end
end end
return results return results
@ -4210,7 +4591,6 @@ return {
end end
local Cardstart_dissolveRef = Card.start_dissolve local Cardstart_dissolveRef = Card.start_dissolve
function Card:start_dissolve(dissolve_colours, silent, dissolve_time_fac, no_juice) function Card:start_dissolve(dissolve_colours, silent, dissolve_time_fac, no_juice)
Cardstart_dissolveRef(self,dissolve_colours, silent, dissolve_time_fac, no_juice)
if G.jokers then if G.jokers then
for i = 1, #G.jokers.cards do for i = 1, #G.jokers.cards do
if G.jokers.cards[i].hook_id == self.sort_id then if G.jokers.cards[i].hook_id == self.sort_id then
@ -4219,6 +4599,7 @@ return {
end end
end end
end end
Cardstart_dissolveRef(self,dissolve_colours, silent, dissolve_time_fac, no_juice)
end end
end, end,
items = code_cards, items = code_cards,

View file

@ -204,7 +204,7 @@ local glowing = {
trigger_effect = function(self, args) trigger_effect = function(self, args)
if args.context == "eval" and G.GAME.last_blind and G.GAME.last_blind.boss then if args.context == "eval" and G.GAME.last_blind and G.GAME.last_blind.boss then
for i = 1, #G.jokers.cards do for i = 1, #G.jokers.cards do
if G.jokers.cards[i].ability.name ~= "Ace Aequilibrium" then --Same Reason as Gemini/Multiply if not Card.no(G.jokers.cards[i], "immutable", true) then
cry_with_deck_effects(G.jokers.cards[i], function(card) cry_with_deck_effects(G.jokers.cards[i], function(card)
cry_misprintize(card, { min = 1.25, max = 1.25 }, nil, true) cry_misprintize(card, { min = 1.25, max = 1.25 }, nil, true)
end) end)
@ -227,9 +227,18 @@ local bountiful = {
name = "cry-Bountiful", name = "cry-Bountiful",
key = "bountiful", key = "bountiful",
config = { cry_forced_draw_amount = 5 }, config = { cry_forced_draw_amount = 5 },
pos = { x = 4, y = 2 }, pos = { x = 2, y = 6 },
order = 14, order = 14,
atlas = "placeholders", atlas = "atlasdeck",
}
local beige = {
object_type = "Back",
name = "cry-Beige",
key = "beige",
config = { cry_common_value_quad = true },
pos = { x = 1, y = 6 },
order = 15,
atlas = "atlasdeck",
} }
return { return {
name = "Misc. Decks", name = "Misc. Decks",
@ -247,8 +256,8 @@ return {
G.GAME.modifiers.cry_conveyor = true G.GAME.modifiers.cry_conveyor = true
end end
if self.effect.config.cry_misprint_min then if self.effect.config.cry_misprint_min then
G.GAME.modifiers.cry_misprint_min = self.effect.config.cry_misprint_min G.GAME.modifiers.cry_misprint_min = (G.GAME.modifiers.cry_misprint_min or 1) * self.effect.config.cry_misprint_min
G.GAME.modifiers.cry_misprint_max = self.effect.config.cry_misprint_max G.GAME.modifiers.cry_misprint_max = (G.GAME.modifiers.cry_misprint_max or 1) * self.effect.config.cry_misprint_max
end end
if self.effect.config.cry_highlight_limit then if self.effect.config.cry_highlight_limit then
G.GAME.modifiers.cry_highlight_limit = self.effect.config.cry_highlight_limit G.GAME.modifiers.cry_highlight_limit = self.effect.config.cry_highlight_limit
@ -258,6 +267,7 @@ return {
end end
if self.effect.config.cry_beta then if self.effect.config.cry_beta then
G.GAME.modifiers.cry_beta = true G.GAME.modifiers.cry_beta = true
G.GAME.pool_flags.beta_deck = true
end end
if self.effect.config.cry_legendary then if self.effect.config.cry_legendary then
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
@ -295,6 +305,9 @@ return {
if self.effect.config.cry_forced_draw_amount then if self.effect.config.cry_forced_draw_amount then
G.GAME.modifiers.cry_forced_draw_amount = self.effect.config.cry_forced_draw_amount G.GAME.modifiers.cry_forced_draw_amount = self.effect.config.cry_forced_draw_amount
end end
if self.effect.config.cry_common_value_quad then
G.GAME.modifiers.cry_common_value_quad = true
end
end end
--equilibrium deck patches --equilibrium deck patches
local gcp = get_current_pool local gcp = get_current_pool
@ -312,22 +325,26 @@ return {
and t ~= "Seal" and t ~= "Seal"
and t ~= "Stake" and t ~= "Stake"
then then
if not P_CRY_ITEMS then if true then -- if not P_CRY_ITEMS then
-- we're regenerating the pool every time because of banned keys but it's fine tbh
P_CRY_ITEMS = {} P_CRY_ITEMS = {}
local valid_pools = { "Joker", "Consumeables", "Voucher", "Booster" } local valid_pools = { "Joker", "Consumeables", "Voucher", "Booster" }
for _, id in ipairs(valid_pools) do for _, id in ipairs(valid_pools) do
for k, v in pairs(G.P_CENTER_POOLS[id]) do for k, v in pairs(G.P_CENTER_POOLS[id]) do
if v.unlocked == true and not center_no(v, "doe", k) then if v.unlocked == true and not center_no(v, "doe", k) and not G.GAME.banned_keys[v.key] then
P_CRY_ITEMS[#P_CRY_ITEMS + 1] = v.key P_CRY_ITEMS[#P_CRY_ITEMS + 1] = v.key
end end
end end
end end
--[[ this doesn't seem to be working
for k, v in pairs(G.P_CARDS) do for k, v in pairs(G.P_CARDS) do
if v.unlocked == true and not center_no(v, "doe", k) then if v.unlocked == true and not center_no(v, "doe", k) then
P_CRY_ITEMS[#P_CRY_ITEMS + 1] = v.key P_CRY_ITEMS[#P_CRY_ITEMS + 1] = v.key
end end
end end
]]
end end
if #P_CRY_ITEMS <= 0 then P_CRY_ITEMS[#P_CRY_ITEMS + 1] = 'v_blank' end
return P_CRY_ITEMS, "cry_equilibrium" .. G.GAME.round_resets.ante return P_CRY_ITEMS, "cry_equilibrium" .. G.GAME.round_resets.ante
end end
end end
@ -464,5 +481,6 @@ return {
glowing, glowing,
beta, beta,
bountiful, bountiful,
beige,
}, },
} }

View file

@ -56,6 +56,7 @@ local typed_decks = {
-- todo: work with mod config better here -- todo: work with mod config better here
{ "cry", "Enhancement", "The Eclipse's Deck", "Echo", "echo", nil, "atlasenhanced", 1, 5, "" }, { "cry", "Enhancement", "The Eclipse's Deck", "Echo", "echo", nil, "atlasenhanced", 1, 5, "" },
{ "cry", "Enhancement", "The Seraph's Deck", "Light", "light", nil, "cry_misc", 0, 3, "" },
{ "cry", "Edition", nil, "Fragile", "glass", nil, nil, 5, 2, "" }, { "cry", "Edition", nil, "Fragile", "glass", nil, nil, 5, 2, "" },
{ "cry", "Edition", nil, "Golden", "gold", nil, nil, 5, 2, "" }, { "cry", "Edition", nil, "Golden", "gold", nil, nil, 5, 2, "" },
@ -401,7 +402,6 @@ return {
if center.name == "Fortune Teller" if center.name == "Fortune Teller"
or center.name == "Shoot the Moon" or center.name == "Shoot the Moon"
or center.name == "Riff-raff" or center.name == "Riff-raff"
or center.name == "Business Card"
or center.name == "Chaos the Clown" or center.name == "Chaos the Clown"
or center.name == "Dusk" or center.name == "Dusk"
or center.name == "Mime" or center.name == "Mime"

View file

@ -102,12 +102,12 @@ local googol_play = {
blueprint_compat = true, blueprint_compat = true,
atlas = "atlasepic", atlas = "atlasepic",
soul_pos = { x = 10, y = 0, extra = { x = 4, y = 0 } }, soul_pos = { x = 10, y = 0, extra = { x = 4, y = 0 } },
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, card)
return { return {
vars = { vars = {
"" .. (G.GAME and G.GAME.probabilities.normal or 1), cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged),
center.ability.extra.odds, card.ability.extra.odds,
center.ability.extra.Xmult, card.ability.extra.Xmult,
}, },
} }
end, end,
@ -116,7 +116,7 @@ local googol_play = {
context.cardarea == G.jokers context.cardarea == G.jokers
and not context.before and not context.before
and not context.after and not context.after
and pseudorandom("cry_googol_play") < G.GAME.probabilities.normal / card.ability.extra.odds and pseudorandom("cry_googol_play") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds
then then
return { return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.Xmult } }), message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.Xmult } }),
@ -135,6 +135,18 @@ local googol_play = {
"Math" "Math"
} }
}, },
unlocked = false,
check_for_unlock = function(self, args)
if args.type == 'chip_score' and to_big(args.chips) >= to_big(1e100) 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 sync_catalyst = { local sync_catalyst = {
object_type = "Joker", object_type = "Joker",
@ -271,6 +283,21 @@ local error_joker = {
blueprint_compat = false, blueprint_compat = false,
eternal_compat = false, eternal_compat = false,
atlas = "atlasepic", atlas = "atlasepic",
loc_vars = function(self, info_queue, center)
if G.GAME and G.GAME.pseudorandom and G.STAGE == G.STAGES.RUN then
cry_error_msgs[#cry_error_msgs].string = "%%" .. predict_card_for_shop()
else
cry_error_msgs[#cry_error_msgs].string = "%%J6"
end
return {
main_start = {
{n=G.UIT.O, config={object = DynaText({string = cry_error_operators, colours = {G.C.DARK_EDITION,},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.30, scale = 0.32, min_cycle_time = 0})}},
{n=G.UIT.O, config={object = DynaText({string = cry_error_numbers, colours = {G.C.DARK_EDITION,},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.33, scale = 0.32, min_cycle_time = 0})}},
{n=G.UIT.O, config={object = DynaText({string = cry_error_msgs,
colours = {G.C.UI.TEXT_DARK},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.4011, scale = 0.32, min_cycle_time = 0})}},
}
}
end,
add_to_deck = function(self, card, from_debuff) add_to_deck = function(self, card, from_debuff)
if G.GAME.modifiers.cry_force_edition and not G.GAME.modifiers.cry_force_edition_from_deck then if G.GAME.modifiers.cry_force_edition and not G.GAME.modifiers.cry_force_edition_from_deck then
G.GAME.modifiers.cry_force_edition_from_deck = G.GAME.modifiers.cry_force_edition G.GAME.modifiers.cry_force_edition_from_deck = G.GAME.modifiers.cry_force_edition
@ -411,13 +438,15 @@ local m = {
local vc = self.calculate local vc = self.calculate
self.calculate = function(self, card, context) self.calculate = function(self, card, context)
local ret, trig = vc(self, card, context) local ret, trig = vc(self, card, context)
local reps = get_m_retriggers(self, card, context) if context.retrigger_joker_check and context.other_card == card then
if context.retrigger_joker_check and context.other_card == card and reps > 0 then local reps = get_m_retriggers(self, card, context)
return { if reps > 0 then
message = localize("k_again_ex"), return {
repetitions = reps + (ret and ret.repetitions or 0), message = localize("k_again_ex"),
card = card, repetitions = reps + (ret and ret.repetitions or 0),
} card = card,
}
end
end end
return ret, trig return ret, trig
end end
@ -474,13 +503,15 @@ local M = {
local vc = self.calculate local vc = self.calculate
self.calculate = function(self, card, context) self.calculate = function(self, card, context)
local ret, trig = vc(self, card, context) local ret, trig = vc(self, card, context)
local reps = get_m_retriggers(self, card, context) if context.retrigger_joker_check and context.other_card == card then
if context.retrigger_joker_check and context.other_card == card and reps > 0 then local reps = get_m_retriggers(self, card, context)
return { if reps > 0 then
message = localize("k_again_ex"), return {
repetitions = reps + (ret and ret.repetitions or 0), message = localize("k_again_ex"),
card = card, repetitions = reps + (ret and ret.repetitions or 0),
} card = card,
}
end
end end
return ret, trig return ret, trig
end end
@ -509,13 +540,13 @@ local boredom = {
order = 32, order = 32,
cost = 14, cost = 14,
blueprint_compat = true, blueprint_compat = true,
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, card)
return { vars = { "" .. (G.GAME and G.GAME.probabilities.normal or 1), center.ability.extra.odds } } return { vars = { cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged), card.ability.extra.odds } }
end, end,
atlas = "atlasepic", atlas = "atlasepic",
calculate = function(self, card, context) calculate = function(self, card, context)
if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= self then if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= self then
if pseudorandom("cry_boredom_joker") < G.GAME.probabilities.normal / card.ability.extra.odds then if pseudorandom("cry_boredom_joker") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds then
return { return {
message = localize("k_again_ex"), message = localize("k_again_ex"),
repetitions = 1, repetitions = 1,
@ -528,7 +559,7 @@ local boredom = {
if if
context.repetition context.repetition
and context.cardarea == G.play and context.cardarea == G.play
and pseudorandom("cry_boredom_card") < G.GAME.probabilities.normal / card.ability.extra.odds and pseudorandom("cry_boredom_card") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds
then then
return { return {
message = localize("k_again_ex"), message = localize("k_again_ex"),
@ -771,6 +802,27 @@ local circus = {
"Jevonn" "Jevonn"
} }
}, },
unlocked = false,
check_for_unlock = function(self, args)
if G and G.jokers and G.GAME and G.GAME.round_resets and G.GAME.round_resets.ante and G.GAME.round_resets.ante < 9 then
local rarities = {
}
for i = 1, #G.jokers.cards do
local card = G.jokers.cards[i]
rarities[card.config.center.rarity .. '_rarity'] = true
end
if rarities['3_rarity'] and rarities['4_rarity'] and rarities['cry_epic_rarity'] 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 caramel = { local caramel = {
object_type = "Joker", object_type = "Joker",
@ -908,8 +960,7 @@ local curse_sob = {
if not from_debuff then if not from_debuff then
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_obelisk") local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_obelisk")
card:set_edition("e_negative", true, nil, true) card:set_edition("e_negative", true, nil, true)
card.sob = true card.ability.cry_absolute = true
card:set_eternal(true)
card:add_to_deck() card:add_to_deck()
G.jokers:emplace(card) G.jokers:emplace(card)
return { return {
@ -931,29 +982,44 @@ local curse_sob = {
"Jevonn" "Jevonn"
} }
}, },
unlocked = false,
check_for_unlock = function(self, args)
if G and G.jokers then
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].config.center.key == 'j_obelisk' and G.jokers.cards[i].ability.eternal then
unlock_card(self)
end
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 bonusjoker = { local bonusjoker = {
object_type = "Joker", object_type = "Joker",
name = "cry-Bonus Joker", name = "cry-Bonus Joker",
key = "bonusjoker", key = "bonusjoker",
pos = { x = 3, y = 2 }, pos = { x = 3, y = 2 },
config = { extra = { odds = 8, check = 0 } }, config = { extra = { odds = 8, check = 0, add = 1 } },
immutable = true,
rarity = "cry_epic", rarity = "cry_epic",
cost = 11, cost = 11,
order = 75, order = 75,
blueprint_compat = true, blueprint_compat = true,
enhancement_gate = "m_bonus", enhancement_gate = "m_bonus",
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = G.P_CENTERS.m_bonus info_queue[#info_queue + 1] = G.P_CENTERS.m_bonus
return { vars = { "" .. (G.GAME and G.GAME.probabilities.normal or 1), center.ability.extra.odds } } return { vars = { cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged), card.ability.extra.odds, card.ability.extra.add } }
end, end,
atlas = "atlasepic", atlas = "atlasepic",
calculate = function(self, card, context) calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then if context.individual and context.cardarea == G.play then
if context.other_card.ability.effect == "Bonus Card" then if context.other_card.ability.effect == "Bonus Card" then
if if
pseudorandom("bonusjoker") < G.GAME.probabilities.normal / card.ability.extra.odds pseudorandom("bonusjoker") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds
and card.ability.extra.check < 2 and card.ability.extra.check < 2
and not context.retrigger_joker and not context.retrigger_joker
then then
@ -962,12 +1028,12 @@ local bonusjoker = {
if not context.blueprint then if not context.blueprint then
card.ability.extra.check = card.ability.extra.check + 1 card.ability.extra.check = card.ability.extra.check + 1
end end
G.jokers.config.card_limit = G.jokers.config.card_limit + 1 G.jokers.config.card_limit = G.jokers.config.card_limit + card.ability.extra.add
else else
if not context.blueprint then if not context.blueprint then
card.ability.extra.check = card.ability.extra.check + 1 card.ability.extra.check = card.ability.extra.check + 1
end end
G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1 G.consumeables.config.card_limit = G.consumeables.config.card_limit + card.ability.extra.add
end end
return { return {
extra = { focus = card, message = localize("k_upgrade_ex") }, extra = { focus = card, message = localize("k_upgrade_ex") },
@ -1015,10 +1081,10 @@ local multjoker = {
cost = 11, cost = 11,
blueprint_compat = true, blueprint_compat = true,
enhancement_gate = "m_mult", enhancement_gate = "m_mult",
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = G.P_CENTERS.m_mult info_queue[#info_queue + 1] = G.P_CENTERS.m_mult
info_queue[#info_queue + 1] = G.P_CENTERS.c_cryptid info_queue[#info_queue + 1] = G.P_CENTERS.c_cryptid
return { vars = { "" .. (G.GAME and G.GAME.probabilities.normal or 1), center.ability.extra.odds } } return { vars = { cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged), card.ability.extra.odds } }
end, end,
atlas = "atlasepic", atlas = "atlasepic",
calculate = function(self, card, context) calculate = function(self, card, context)
@ -1027,7 +1093,7 @@ local multjoker = {
context.other_card.ability.effect == "Mult Card" context.other_card.ability.effect == "Mult Card"
and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit
then then
if pseudorandom("multjoker") < G.GAME.probabilities.normal / card.ability.extra.odds then if pseudorandom("multjoker") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds then
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
@ -1105,7 +1171,11 @@ local goldjoker = {
calc_dollar_bonus = function(self, card) calc_dollar_bonus = function(self, card)
local bonus = math.max(0, math.floor(0.01 * card.ability.extra.percent * (G.GAME.dollars or 0))) local bonus = math.max(0, math.floor(0.01 * card.ability.extra.percent * (G.GAME.dollars or 0)))
if bonus > 0 then if bonus > 0 then
return bonus if G.GAME.dollars > 1e10 then
return 1
else
return bonus
end
end end
end, end,
cry_credits = { cry_credits = {
@ -1124,8 +1194,8 @@ local altgoogol = {
object_type = "Joker", object_type = "Joker",
name = "cry-altgoogol", name = "cry-altgoogol",
key = "altgoogol", key = "altgoogol",
config = { extra = { jokers = 2 } },
pos = { x = 4, y = 3 }, pos = { x = 4, y = 3 },
immutable = true,
rarity = "cry_epic", rarity = "cry_epic",
cost = 10, cost = 10,
order = 60, order = 60,
@ -1133,6 +1203,9 @@ local altgoogol = {
eternal_compat = false, eternal_compat = false,
atlas = "atlasepic", atlas = "atlasepic",
soul_pos = { x = 10, y = 0, extra = { x = 5, y = 3 } }, soul_pos = { x = 10, y = 0, extra = { x = 5, y = 3 } },
loc_vars = function(self, info_queue, card)
return { vars = { math.floor(math.min(20, card.ability.extra.jokers)) } }
end,
calculate = function(self, card, context) calculate = function(self, card, context)
if context.selling_self and not context.retrigger_joker then if context.selling_self and not context.retrigger_joker then
local jokers = {} local jokers = {}
@ -1146,7 +1219,7 @@ local altgoogol = {
local spawn = {G.jokers.cards[1]} local spawn = {G.jokers.cards[1]}
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
for i = 1, 2 do for i = 1, math.floor(math.min(20, card.ability.extra.jokers)) do
local card = copy_card(pseudorandom_element(spawn, pseudoseed("cry_ngpc")), nil) local card = copy_card(pseudorandom_element(spawn, pseudoseed("cry_ngpc")), nil)
card:add_to_deck() card:add_to_deck()
G.jokers:emplace(card) G.jokers:emplace(card)
@ -1214,34 +1287,36 @@ local soccer = {
key = "soccer", key = "soccer",
pos = { x = 1, y = 4 }, pos = { x = 1, y = 4 },
config = { extra = { holygrail = 1 } }, config = { extra = { holygrail = 1 } },
immutable = true,
rarity = "cry_epic", rarity = "cry_epic",
order = 58, order = 58,
cost = 20, cost = 20,
atlas = "atlasepic", atlas = "atlasepic",
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, center)
return { vars = { center.ability.extra.holygrail } } return { vars = { math.floor(math.min(15, center.ability.extra.holygrail)) } }
end, end,
add_to_deck = function(self, card, from_debuff) --TODO: Card in booster packs, Voucher slots add_to_deck = function(self, card, from_debuff) --TODO: Card in booster packs, Voucher slots
card.ability.extra.holygrail = math.floor(card.ability.extra.holygrail) local holy = math.floor(math.min(15, card.ability.extra.holygrail))
G.jokers.config.card_limit = G.jokers.config.card_limit + card.ability.extra.holygrail G.jokers.config.card_limit = G.jokers.config.card_limit + holy
G.consumeables.config.card_limit = G.consumeables.config.card_limit + card.ability.extra.holygrail G.consumeables.config.card_limit = G.consumeables.config.card_limit + holy
G.hand:change_size(card.ability.extra.holygrail) G.hand:change_size(holy)
if not G.GAME.modifiers.cry_booster_packs then if not G.GAME.modifiers.cry_booster_packs then
G.GAME.modifiers.cry_booster_packs = 2 G.GAME.modifiers.cry_booster_packs = 2
end end
G.GAME.modifiers.cry_booster_packs = G.GAME.modifiers.cry_booster_packs + card.ability.extra.holygrail G.GAME.modifiers.cry_booster_packs = G.GAME.modifiers.cry_booster_packs + holy
change_shop_size(card.ability.extra.holygrail) change_shop_size(holy)
cry_bonusvouchermod(holy)
end, end,
remove_from_deck = function(self, card, from_debuff) remove_from_deck = function(self, card, from_debuff)
G.jokers.config.card_limit = G.jokers.config.card_limit - card.ability.extra.holygrail local holy = math.floor(math.min(15, card.ability.extra.holygrail))
G.consumeables.config.card_limit = G.consumeables.config.card_limit - card.ability.extra.holygrail G.jokers.config.card_limit = G.jokers.config.card_limit - holy
G.hand:change_size(-card.ability.extra.holygrail) G.consumeables.config.card_limit = G.consumeables.config.card_limit - holy
G.hand:change_size(-holy)
if not G.GAME.modifiers.cry_booster_packs then if not G.GAME.modifiers.cry_booster_packs then
G.GAME.modifiers.cry_booster_packs = 2 G.GAME.modifiers.cry_booster_packs = 2
end end
G.GAME.modifiers.cry_booster_packs = G.GAME.modifiers.cry_booster_packs - card.ability.extra.holygrail G.GAME.modifiers.cry_booster_packs = G.GAME.modifiers.cry_booster_packs - holy
change_shop_size(card.ability.extra.holygrail * -1) change_shop_size(holy * -1)
cry_bonusvouchermod(-1*holy)
end, end,
cry_credits = { cry_credits = {
idea = { idea = {
@ -1254,6 +1329,24 @@ local soccer = {
"Jevonn" "Jevonn"
} }
}, },
unlocked = false,
check_for_unlock = function(self, args)
if args.type == 'win' then
for k,v in pairs(G.GAME.hands) do
if k ~= 'High Card' and G.GAME.hands[k].played ~= 0 then
return
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,
} }
local fleshpanopticon = { local fleshpanopticon = {
object_type = "Joker", object_type = "Joker",
@ -1261,7 +1354,6 @@ local fleshpanopticon = {
key = "fleshpanopticon", key = "fleshpanopticon",
pos = { x = 0, y = 5 }, pos = { x = 0, y = 5 },
config = { extra = { boss_size = 20 } }, config = { extra = { boss_size = 20 } },
immutable = true,
rarity = "cry_epic", rarity = "cry_epic",
cost = 15, cost = 15,
order = 146, order = 146,
@ -1335,6 +1427,54 @@ local fleshpanopticon = {
} }
}, },
} }
local spectrogram = {
object_type = "Joker",
name = "cry-Spectrogram",
key = "spectrogram",
pos = { x = 1, y = 5 },
config = { extra = {} },
rarity = "cry_epic",
cost = 9,
order = 133,
atlas = "atlasepic",
loc_vars = function(self, info_queue, center)
info_queue[#info_queue + 1] = G.P_CENTERS.m_cry_echo
return { vars = {} }
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.scoring_hand then
if context.other_card == G.jokers.cards[#G.jokers.cards] then
local echonum = 0
for i, v in pairs (context.other_context.scoring_hand) do
if v.config.center_key == 'm_cry_echo' then
echonum = echonum + 1
end
end
if echonum > 0 then
return {
message = localize("k_again_ex"),
repetitions = echonum,
card = card,
}
end
end
end
end
end,
cry_credits = {
idea = {
"AlexZGreat"
},
art = {
"SMG9000"
},
code = {
"AlexZGreat"
}
},
}
return { return {
name = "Epic Jokers", name = "Epic Jokers",
init = function() init = function()
@ -1364,6 +1504,13 @@ return {
"pi", "pi",
"1e9", "1e9",
"???", "???",
"114",
"leet",
"666",
"eee6",
"21",
"365",
"2024",
} }
cry_error_msgs = { cry_error_msgs = {
{ string = "rand()", colour = G.C.RARITY["cry_exotic"] }, { string = "rand()", colour = G.C.RARITY["cry_exotic"] },
@ -1378,7 +1525,11 @@ return {
{ string = "ERROR", colour = G.C.UI.TEXT_INACTIVE }, { string = "ERROR", colour = G.C.UI.TEXT_INACTIVE },
{ string = "Tarots", colour = G.C.SECONDARY_SET.Tarot }, { string = "Tarots", colour = G.C.SECONDARY_SET.Tarot },
{ string = "Planets", colour = G.C.SECONDARY_SET.Planet }, { string = "Planets", colour = G.C.SECONDARY_SET.Planet },
{ string = "Codes", colour = G.C.SECONDARY_SET.Code },
{ string = "Specls", colour = G.C.SECONDARY_SET.Spectral }, { string = "Specls", colour = G.C.SECONDARY_SET.Spectral },
{ string = "Jolly", colour = G.C.CRY_JOLLY },
{ string = "Tags", colour = G.C.RED },
{ string = "Cryptids", colour = G.C.SECONDARY_SET.Spectral },
{ string = "%%ERROR", colour = G.C.CRY_ASCENDANT }, --temp string, this will be modified { string = "%%ERROR", colour = G.C.CRY_ASCENDANT }, --temp string, this will be modified
} }
@ -1524,5 +1675,6 @@ return {
altgoogol, altgoogol,
soccer, soccer,
fleshpanopticon, fleshpanopticon,
spectrogram,
}, },
} }

View file

@ -224,7 +224,6 @@ local redeo = {
} }
end, end,
pos = { x = 3, y = 0 }, pos = { x = 3, y = 0 },
immutable = true,
rarity = "cry_exotic", rarity = "cry_exotic",
cost = 50, cost = 50,
order = 506, order = 506,
@ -441,7 +440,7 @@ local primus = {
} }
local big_num_whitelist = { local big_num_whitelist = {
j_ride_the_bus = true, j_ride_the_bus = true,
j_egg = true, j_egg = false,
j_runner = true, j_runner = true,
j_ice_cream = true, j_ice_cream = true,
j_constellation = true, j_constellation = true,
@ -699,12 +698,11 @@ local aequilibrium = {
config = { extra = { jokers = 2, card = nil } }, config = { extra = { jokers = 2, card = nil } },
rarity = "cry_exotic", rarity = "cry_exotic",
pos = { x = 7, y = 0 }, pos = { x = 7, y = 0 },
soul_pos = { x = 69, y = 0, extra = { x = 8, y = 0 } }, soul_pos = { x = 6, y = 0, extra = { x = 8, y = 0 } },
atlas = "atlasexotic", atlas = "atlasexotic",
cost = 50, cost = 50,
order = 512, order = 512,
blueprint_compat = true, blueprint_compat = true,
immutable = true,
eternal_compat = true, eternal_compat = true,
perishable_compat = true, perishable_compat = true,
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, center)
@ -719,11 +717,11 @@ local aequilibrium = {
key = G.P_CENTER_POOLS["Joker"][math.floor(G.GAME.aequilibriumkey or 1) - 1].key, key = G.P_CENTER_POOLS["Joker"][math.floor(G.GAME.aequilibriumkey or 1) - 1].key,
}) })
end end
return { vars = { center.ability.extra.jokers, joker_generated } } return { vars = { math.floor(math.min(25, center.ability.extra.jokers)), joker_generated } }
end, end,
calculate = function(self, card, context) calculate = function(self, card, context)
if context.cardarea == G.jokers and context.before and not context.retrigger_joker then if context.cardarea == G.jokers and context.before and not context.retrigger_joker then
for i = 1, math.min(200, card.ability.extra.jokers) do 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) local newcard = create_card("Joker", G.jokers, nil, nil, nil, nil, nil)
newcard:add_to_deck() newcard:add_to_deck()
G.jokers:emplace(newcard) G.jokers:emplace(newcard)
@ -732,6 +730,7 @@ local aequilibrium = {
return nil, true return nil, true
end end
end, end,
--[[
add_to_deck = function(self, card, from_debuff) add_to_deck = function(self, card, from_debuff)
if not from_debuff then if not from_debuff then
if card.ability.extra.card then if card.ability.extra.card then
@ -801,6 +800,7 @@ local aequilibrium = {
card.ability.extra.card:start_dissolve() card.ability.extra.card:start_dissolve()
end end
end, end,
]]--
cry_credits = { cry_credits = {
idea = {"Elial2"}, idea = {"Elial2"},
art = {"Elial2"}, art = {"Elial2"},
@ -900,6 +900,28 @@ local gemino = {
cost = 50, cost = 50,
order = 515, order = 515,
atlas = "atlasexotic", 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) calculate = function(self, card2, context)
if context.end_of_round and not context.repetition and not context.individual then if context.end_of_round and not context.repetition and not context.individual then
local check = false local check = false

View file

@ -407,14 +407,13 @@ local notebook = {
pos = { x = 1, y = 0 }, pos = { x = 1, y = 0 },
order = 255, order = 255,
config = { config = {
extra = { odds = 7, slot = 0, jollies = 4, check = true, active = "Active", inactive = "" }, extra = { odds = 7, slot = 0, jollies = 4, check = true, active = "Active", inactive = "", add = 1 },
jolly = { t_mult = 8, type = "Pair" }, jolly = { t_mult = 8, type = "Pair" },
}, },
immutable = true,
rarity = 3, rarity = 3,
cost = 9, cost = 9,
perishable_compat = false, perishable_compat = false,
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = { info_queue[#info_queue + 1] = {
set = "Joker", set = "Joker",
key = "j_jolly", key = "j_jolly",
@ -422,11 +421,12 @@ local notebook = {
} }
return { return {
vars = { vars = {
"" .. (G.GAME and G.GAME.probabilities.normal or 1), cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged),
center.ability.extra.odds, card.ability.extra.odds,
center.ability.extra.slot, card.ability.extra.slot,
center.ability.extra.active, card.ability.extra.active,
center.ability.extra.jollies, card.ability.extra.jollies,
card.ability.extra.add,
}, },
} }
end, end,
@ -448,10 +448,10 @@ local notebook = {
end end
if if
jollycount >= card.ability.extra.jollies --if there are 5 or more jolly jokers jollycount >= card.ability.extra.jollies --if there are 5 or more jolly jokers
or pseudorandom("cry_notebook") < G.GAME.probabilities.normal / card.ability.extra.odds or pseudorandom("cry_notebook") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds
then then
card.ability.extra.slot = card.ability.extra.slot + 1 card.ability.extra.slot = card.ability.extra.slot + card.ability.extra.add
G.jokers.config.card_limit = G.jokers.config.card_limit + 1 G.jokers.config.card_limit = G.jokers.config.card_limit + card.ability.extra.add
card.ability.extra.check = false card.ability.extra.check = false
card.ability.extra.active = localize("cry_inactive") card.ability.extra.active = localize("cry_inactive")
return { return {
@ -657,20 +657,20 @@ local scrabble = {
cost = 8, cost = 8,
blueprint_compat = true, blueprint_compat = true,
atlas = "atlasone", atlas = "atlasone",
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_m info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_m
return { vars = { "" .. (G.GAME and G.GAME.probabilities.normal or 1), center.ability.extra.odds } } return { vars = { cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged), card.ability.extra.odds } }
end, end,
calculate = function(self, card, context) calculate = function(self, card, context)
if context.cardarea == G.jokers and context.before and not context.retrigger_joker then if context.cardarea == G.jokers and context.before and not context.retrigger_joker then
local check = false local check = false
--if pseudorandom('scrabble') < G.GAME.probabilities.normal/card.ability.extra.odds then --if pseudorandom('scrabble') < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged)/card.ability.extra.odds then
--check = true --check = true
--local card = create_card('Joker', G.jokers, nil, nil, nil, nil, 'j_jolly') --local card = create_card('Joker', G.jokers, nil, nil, nil, nil, 'j_jolly')
--card:add_to_deck() --card:add_to_deck()
--G.jokers:emplace(card) --G.jokers:emplace(card)
--end --end
if pseudorandom("scrabbleother") < G.GAME.probabilities.normal / card.ability.extra.odds then if pseudorandom("scrabbleother") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds then
check = true check = true
local card = create_card("Joker", G.jokers, nil, 0.9, nil, nil, nil, "scrabbletile") local card = create_card("Joker", G.jokers, nil, 0.9, nil, nil, nil, "scrabbletile")
card:set_edition({ cry_m = true }) card:set_edition({ cry_m = true })
@ -700,10 +700,9 @@ local sacrifice = {
name = "cry-sacrifice", name = "cry-sacrifice",
key = "sacrifice", key = "sacrifice",
effect = "M Joker", effect = "M Joker",
config = { extra = { text = localize("k_active_ex"), spawn = true }, jolly = { t_mult = 8, type = "Pair" } }, config = { extra = { jollies = 3, unc = 1, text = localize("k_active_ex"), spawn = true }, jolly = { t_mult = 8, type = "Pair" } },
pos = { x = 5, y = 2 }, pos = { x = 5, y = 2 },
order = 259, order = 259,
immutable = true,
rarity = 1, rarity = 1,
cost = 4, cost = 4,
blueprint_compat = true, blueprint_compat = true,
@ -714,27 +713,34 @@ local sacrifice = {
key = "j_jolly", key = "j_jolly",
specific_vars = { self.config.jolly.t_mult, localize(self.config.jolly.type, "poker_hands") }, specific_vars = { self.config.jolly.t_mult, localize(self.config.jolly.type, "poker_hands") },
} }
return { vars = { center.ability.extra.text } } return { vars = { center.ability.extra.text, math.min(30, center.ability.extra.jollies), math.min(30, center.ability.extra.unc) } }
end, end,
calculate = function(self, card, context) calculate = function(self, card, context)
if context.using_consumeable and card.ability.extra.spawn and not context.retrigger_joker then if context.using_consumeable and card.ability.extra.spawn and not context.retrigger_joker then
if context.consumeable.ability.set == "Spectral" then if context.consumeable.ability.set == "Spectral" then
if not context.blueprint then if not context.blueprint then
card.ability.extra.spawn = false G.E_MANAGER:add_event(Event({
func = function()
card.ability.extra.spawn = false
return true
end,
}))
end end
if not card.ability.extra.spawn then if not card.ability.extra.spawn then
card.ability.extra.text = localize("cry_no_triggers") -- card.ability.extra.text = localize("cry_no_triggers") what is going on here?
end end
for i = 1, 3 do for i = 1, math.min(30, card.ability.extra.jollies) do
local jolly = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_jolly") local jolly = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_jolly")
jolly:add_to_deck() jolly:add_to_deck()
G.jokers:emplace(jolly) G.jokers:emplace(jolly)
end end
local card = create_card("Joker", G.jokers, nil, 0.9, nil, nil, nil, "sacrifice") for i = 1, math.min(30, card.ability.extra.unc) do
card:add_to_deck() local unc = create_card("Joker", G.jokers, nil, 0.9, nil, nil, nil, "sacrifice")
G.jokers:emplace(card) unc:add_to_deck()
card:start_materialize() G.jokers:emplace(unc)
card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("cry_m_ex"), colour = G.C.SPECTRAL }) unc:start_materialize()
end
card_eval_status_text(context.blueprint_card or card, "extra", nil, nil, nil, { message = localize("cry_m_ex"), colour = G.C.SPECTRAL })
return nil, true return nil, true
end end
end end
@ -853,9 +859,8 @@ local doodlem = {
key = "doodlem", key = "doodlem",
atlas = "atlasepic", atlas = "atlasepic",
effect = "M Joker", effect = "M Joker",
config = { jolly = { t_mult = 8, type = "Pair" } }, config = { extra = {add = 1, init = 2}, jolly = { t_mult = 8, type = "Pair" } },
pos = { x = 2, y = 0 }, pos = { x = 2, y = 0 },
immutable = true,
rarity = "cry_epic", rarity = "cry_epic",
cost = 13, cost = 13,
order = 266, order = 266,
@ -867,19 +872,20 @@ local doodlem = {
specific_vars = { self.config.jolly.t_mult, localize(self.config.jolly.type, "poker_hands") }, specific_vars = { self.config.jolly.t_mult, localize(self.config.jolly.type, "poker_hands") },
} }
info_queue[#info_queue + 1] = { key = "e_negative_consumable", set = "Edition", config = { extra = 1 } } info_queue[#info_queue + 1] = { key = "e_negative_consumable", set = "Edition", config = { extra = 1 } }
return { vars = { center.ability.extra.add, center.ability.extra.init } }
end, end,
calculate = function(self, card, context) calculate = function(self, card, context)
if context.setting_blind and not (context.blueprint_card or self).getting_sliced then if context.setting_blind and not (context.blueprint_card or self).getting_sliced then
local jollycount = 2 local jollycount = card.ability.extra.init
for i = 1, #G.jokers.cards do for i = 1, #G.jokers.cards do
if if
G.jokers.cards[i]:is_jolly() G.jokers.cards[i]:is_jolly()
then then
jollycount = jollycount + 1 jollycount = jollycount + card.ability.extra.add
end end
end end
if jollycount > 18 then if jollycount > 25 then
jollycount = 18 jollycount = 25
end --reduce excessive consumeable spam (Lag) end --reduce excessive consumeable spam (Lag)
for i = 1, jollycount do for i = 1, jollycount do
local card = create_card("Consumeables", G.consumeables, nil, nil, nil, nil, nil, "cry_doodlem") local card = create_card("Consumeables", G.consumeables, nil, nil, nil, nil, nil, "cry_doodlem")
@ -1209,14 +1215,14 @@ local macabre = {
effect = "M Joker", effect = "M Joker",
order = 263, order = 263,
pos = { x = 1, y = 2 }, pos = { x = 1, y = 2 },
immutable = true, config = { extra = {add = 1}, jolly = { t_mult = 8, type = "Pair" } },
config = { jolly = { t_mult = 8, type = "Pair" } },
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, center)
info_queue[#info_queue + 1] = { info_queue[#info_queue + 1] = {
set = "Joker", set = "Joker",
key = "j_jolly", key = "j_jolly",
specific_vars = { self.config.jolly.t_mult, localize(self.config.jolly.type, "poker_hands") }, specific_vars = { self.config.jolly.t_mult, localize(self.config.jolly.type, "poker_hands") },
} }
return { vars = { math.min(15, center.ability.extra.add) } }
end, end,
rarity = 1, rarity = 1,
cost = 5, cost = 5,
@ -1248,9 +1254,11 @@ local macabre = {
triggered = true triggered = true
v.getting_sliced = true v.getting_sliced = true
v:start_dissolve({ HEX("57ecab") }, nil, 1.6) v:start_dissolve({ HEX("57ecab") }, nil, 1.6)
local jolly_card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_jolly") for i = 1, math.min(15, card.ability.extra.add) do
jolly_card:add_to_deck() local jolly_card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_jolly")
G.jokers:emplace(jolly_card) jolly_card:add_to_deck()
G.jokers:emplace(jolly_card)
end
end end
if triggered then if triggered then
card:juice_up(0.8, 0.8) card:juice_up(0.8, 0.8)
@ -1473,13 +1481,15 @@ return {
local vc = ret_items[i].calculate local vc = ret_items[i].calculate
ret_items[i].calculate = function(self, card, context) ret_items[i].calculate = function(self, card, context)
local ret, trig = vc(self, card, context) local ret, trig = vc(self, card, context)
local reps = get_m_retriggers(self, card, context) if context.retrigger_joker_check and context.other_card == card then
if context.retrigger_joker_check and context.other_card == card and reps > 0 then local reps = get_m_retriggers(self, card, context)
return { if reps > 0 then
message = localize("k_again_ex"), return {
repetitions = reps + (ret and ret.repetitions or 0), message = localize("k_again_ex"),
card = card, repetitions = reps + (ret and ret.repetitions or 0),
} card = card,
}
end
end end
return ret, trig return ret, trig
end end

View file

@ -956,8 +956,8 @@ local echo = {
atlas = "cry_misc", atlas = "cry_misc",
pos = { x = 2, y = 0 }, pos = { x = 2, y = 0 },
config = { retriggers = 2, extra = 2 }, config = { retriggers = 2, extra = 2 },
loc_vars = function(self, info_queue) loc_vars = function(self, info_queue, card)
return { vars = { self.config.retriggers, G.GAME.probabilities.normal, self.config.extra } } return { vars = { self.config.retriggers, card and cry_prob(card.ability.cry_prob or 1, card.ability.extra, card.ability.cry_rigged) or 1, self.config.extra } } -- note that the check for (card.ability.cry_prob or 1) is probably unnecessary due to cards being initialised with ability.cry_prob
end, end,
} }
local eclipse = { local eclipse = {
@ -969,9 +969,49 @@ local eclipse = {
pos = { x = 4, y = 0 }, pos = { x = 4, y = 0 },
config = { mod_conv = "m_cry_echo", max_highlighted = 1 }, config = { mod_conv = "m_cry_echo", max_highlighted = 1 },
atlas = "atlasnotjokers", atlas = "atlasnotjokers",
loc_vars = function(self, info_queue) loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = G.P_CENTERS.m_cry_echo info_queue[#info_queue + 1] = G.P_CENTERS.m_cry_echo
return { vars = { card and card.ability.max_highlighted or self.config.max_highlighted } }
end,
}
local light = {
object_type = "Enhancement",
key = "light",
atlas = "cry_misc",
pos = { x = 0, y = 3 },
config = {extra = {a_x_mult = 0.2, current_x_mult = 1, req = 5, current = 5}},
loc_vars = function(self, info_queue, card)
return { vars = { card and card.ability.extra.a_x_mult or self.config.extra.a_x_mult, card and card.ability.extra.current_x_mult or self.config.extra.current_x_mult, card and card.ability.extra.current or self.config.extra.current, card and card.ability.extra.req or self.config.extra.req } }
end,
calculate = function(self,card,context,effect)
if context.cardarea == G.play and not context.repetition then
if #context.scoring_hand > 1 then
card.ability.extra.current = card.ability.extra.current - (#context.scoring_hand - 1)
while card.ability.extra.current <= 0 do
card.ability.extra.req = card.ability.extra.req +5
card.ability.extra.current = card.ability.extra.current + card.ability.extra.req
card.ability.extra.current_x_mult = card.ability.extra.current_x_mult + card.ability.extra.a_x_mult
end
end
if card.ability.extra.current_x_mult > 1 then
effect.x_mult = card.ability.extra.current_x_mult
end
end
end,
}
local seraph = {
object_type = "Consumable",
set = "Tarot",
name = "cry-Seraph",
key = "seraph",
order = 2,
pos = { x = 1, y = 2 },
config = { mod_conv = "m_cry_light", max_highlighted = 2 },
atlas = "placeholders",
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS.m_cry_light
return { vars = { self.config.max_highlighted } } return { vars = { self.config.max_highlighted } }
end, end,
} }
@ -1119,11 +1159,18 @@ local meld = {
cost = 4, cost = 4,
atlas = "atlasnotjokers", atlas = "atlasnotjokers",
can_use = function(self, card) can_use = function(self, card)
if #G.jokers.highlighted if #G.jokers.highlighted + #G.hand.highlighted - (G.hand.highlighted[1] and G.hand.highlighted[1] == self and 1 or 0) == 1 then
+ #G.hand.highlighted if
- (G.hand.highlighted[1] and G.hand.highlighted[1] == self and 1 or 0) #G.jokers.highlighted == 1 and
== 1 then (
if #G.jokers.highlighted == 1 and Card.no(G.jokers.highlighted[1], "dbl") then return false end Card.no(G.jokers.highlighted[1], "dbl")
or G.jokers.highlighted[1].edition
)
then return false end
if
#G.hand.highlighted == 1
and G.hand.highlighted[1].edition
then return false end
return true return true
end end
end, end,
@ -1261,10 +1308,10 @@ local fulldeck = {
object_type = "PokerHand", object_type = "PokerHand",
key = 'WholeDeck', key = 'WholeDeck',
visible = false, visible = false,
chips = 5200, chips = 525252525252525252525252525252,
mult = 520, mult = 52525252525252525252525252525,
l_chips = 520, l_chips = 52525252525252525252525252525,
l_mult = 52, l_mult = 5252525252525252525252525252,
example = { example = {
{ 'S_A', true }, { 'S_A', true },
{ 'H_A', true }, { 'H_A', true },
@ -1486,6 +1533,22 @@ local universe = {
end, end,
generate_ui = 0, generate_ui = 0,
} }
local absolute = {
object_type = "Sticker",
badge_colour = HEX('c75985'),
prefix_config = { key = false },
key = "cry_absolute",
atlas = "sticker",
pos = { x = 1, y = 5 },
should_apply = false,
no_sticker_sheet = true,
draw = function(self, card, layer)
G.shared_stickers["cry_absolute"].role.draw_major = card
G.shared_stickers["cry_absolute"]:draw_shader('dissolve', nil, nil, nil, card.children.center)
G.shared_stickers["cry_absolute"]:draw_shader('polychrome', nil, card.ARGS.send_to_shader, nil, card.children.center)
G.shared_stickers["cry_absolute"]:draw_shader('voucher', nil, card.ARGS.send_to_shader, nil, card.children.center)
end,
}
local miscitems = { local miscitems = {
memepack_atlas, memepack_atlas,
meme_object_type, meme_object_type,
@ -1523,6 +1586,9 @@ local miscitems = {
void, void,
marsmoons, marsmoons,
universe, universe,
absolute,
light,
seraph,
} }
if Cryptid.enabled["M Jokers"] then if Cryptid.enabled["M Jokers"] then
miscitems[#miscitems + 1] = jollyeditionshader miscitems[#miscitems + 1] = jollyeditionshader
@ -1539,7 +1605,7 @@ return {
local total_repetitions = ret and ret.repetitions or 0 local total_repetitions = ret and ret.repetitions or 0
if self.config.center == G.P_CENTERS.m_cry_echo then if self.config.center == G.P_CENTERS.m_cry_echo then
if pseudorandom("echo") < G.GAME.probabilities.normal / (self.ability.extra or 2) then --hacky crash fix if pseudorandom("echo") < cry_prob(self.ability.cry_prob, self.ability.extra or 2, self.ability.cry_rigged) / (self.ability.extra or 2) then --hacky crash fix
total_repetitions = total_repetitions + self.ability.retriggers total_repetitions = total_repetitions + self.ability.retriggers
end end
end end
@ -1802,6 +1868,13 @@ return {
end end
self:dbl_side_flip() self:dbl_side_flip()
end end
if self.ability.cry_absolute then -- feedback loop... may be problematic
self.cry_absolute = true
end
if self.cry_absolute then
self.ability.cry_absolute = true
self.ability.eternal = true
end
end end
function copy_dbl_card(C, c, deck_effects) function copy_dbl_card(C, c, deck_effects)
if not deck_effects then if not deck_effects then

File diff suppressed because it is too large Load diff

View file

@ -344,15 +344,15 @@ local planetlua = {
aurinko = true, aurinko = true,
atlas = "atlasnotjokers", atlas = "atlasnotjokers",
order = 1, order = 1,
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, card)
return { vars = { "" .. (G.GAME and G.GAME.probabilities.normal or 1), self.config.extra.odds } } return { vars = { card and cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) or 1, card and card.ability.extra.odds or self.config.extra.odds} }
end, end,
can_use = function(self, card) can_use = function(self, card)
return true return true
end, end,
use = function(self, card, area, copier) use = function(self, card, area, copier)
local used_consumable = copier or card local used_consumable = copier or card
if pseudorandom("planetlua") < G.GAME.probabilities.normal / card.ability.extra.odds then --Code "borrowed" from black hole if pseudorandom("planetlua") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds then --Code "borrowed" from black hole
update_hand_text( update_hand_text(
{ sound = "button", volume = 0.7, pitch = 0.8, delay = 0.3 }, { sound = "button", volume = 0.7, pitch = 0.8, delay = 0.3 },
{ handname = localize("k_all_hands"), chips = "...", mult = "...", level = "" } { handname = localize("k_all_hands"), chips = "...", mult = "...", level = "" }
@ -495,7 +495,7 @@ local planetlua = {
else else
for i = 1, number do for i = 1, number do
quota = quota quota = quota
+ (pseudorandom("planetlua") < G.GAME.probabilities.normal / card.ability.extra.odds and 1 or 0) + (pseudorandom("planetlua") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds and 1 or 0)
end end
if quota > 0 then if quota > 0 then
update_hand_text( update_hand_text(
@ -593,7 +593,7 @@ local planetlua = {
calculate = function(self, card, context) --Observatory effect: (G.GAME.probabilities.normal) in (odds) chance for (G.P_CENTERS.v_observatory.config.extra) Mult calculate = function(self, card, context) --Observatory effect: (G.GAME.probabilities.normal) in (odds) chance for (G.P_CENTERS.v_observatory.config.extra) Mult
if if
G.GAME.used_vouchers.v_observatory G.GAME.used_vouchers.v_observatory
and (pseudorandom("nstar") < G.GAME.probabilities.normal / card.ability.extra.odds) and (pseudorandom("nstar") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds)
then then
local value = G.P_CENTERS.v_observatory.config.extra local value = G.P_CENTERS.v_observatory.config.extra
return { return {
@ -691,15 +691,15 @@ local nstar = {
}) })
) )
end, end,
calculate = function(self, card, context) --Observatory effect: X0.04 mult for each neutron star used this run calculate = function(self, card, context) --Observatory effect: X0.1 mult for each neutron star used this run
if G.GAME.used_vouchers.v_observatory and G.GAME.neutronstarsusedinthisrun ~= nil then if G.GAME.used_vouchers.v_observatory and G.GAME.neutronstarsusedinthisrun ~= nil then
return { return {
message = localize({ message = localize({
type = "variable", type = "variable",
key = "a_xmult", key = "a_xmult",
vars = { 1 + (0.04 * G.GAME.neutronstarsusedinthisrun) }, vars = { 1 + (0.10 * G.GAME.neutronstarsusedinthisrun) },
}), }),
Xmult_mod = 1 + (0.04 * G.GAME.neutronstarsusedinthisrun), Xmult_mod = 1 + (0.10 * G.GAME.neutronstarsusedinthisrun),
} }
end end
end, end,

View file

@ -3,7 +3,7 @@ if CardSleeves then
object_type = "Atlas", object_type = "Atlas",
key = "atlasSleeves", key = "atlasSleeves",
path = "atlasSleeves.png", path = "atlasSleeves.png",
px = 71, px = 73,
py = 95, py = 95,
}) })
@ -78,18 +78,10 @@ if CardSleeves then
config = { cry_misprint_min = 0.1, cry_misprint_max = 10 }, config = { cry_misprint_min = 0.1, cry_misprint_max = 10 },
unlocked = true, unlocked = true,
unlock_condition = { deck = "Misprint Deck", stake = 1 }, unlock_condition = { deck = "Misprint Deck", stake = 1 },
trigger_effect = function(self, args)
if args.context.create_card then
cry_misprintize(
args.context.card,
{ min = 0.1 * (G.GAME.modifiers.cry_misprint_min or 1), max = 10
* (G.GAME.modifiers.cry_misprint_max or 1) }
)
end
end,
apply = function(self) apply = function(self)
G.GAME.modifiers.cry_misprint_min = self.config.cry_misprint_min G.GAME.modifiers.cry_misprint_min = self.config.cry_misprint_min
G.GAME.modifiers.cry_misprint_max = self.config.cry_misprint_max G.GAME.modifiers.cry_misprint_max = self.config.cry_misprint_max
if self.get_current_deck_key() == "b_cry_antimatter" then G.GAME.modifiers.cry_misprint_min = 1 end
end, end,
}) })
@ -132,7 +124,6 @@ if CardSleeves then
name = "CCD Sleeve", name = "CCD Sleeve",
atlas = "atlasSleeves", atlas = "atlasSleeves",
pos = { x = 6, y = 0 }, pos = { x = 6, y = 0 },
config = { cry_conveyor = true },
unlocked = true, unlocked = true,
unlock_condition = { deck = "CCD Deck", stake = 1 }, unlock_condition = { deck = "CCD Deck", stake = 1 },
loc_vars = function(self) loc_vars = function(self)

View file

@ -678,10 +678,21 @@ local ritual = {
cost = 5, cost = 5,
atlas = "atlasnotjokers", atlas = "atlasnotjokers",
pos = { x = 5, y = 1 }, pos = { x = 5, y = 1 },
can_use = function(self, card)
--TODO: CCD card compat
if #G.hand.highlighted > card.ability.max_highlighted then return false end
for _, v in ipairs(G.hand.highlighted) do
if v.edition then
return false
end
end
return true
end,
use = function(self, card, area, copier) use = function(self, card, area, copier)
local used_consumable = copier or card local used_consumable = copier or card
for i = 1, #G.hand.highlighted do for i = 1, #G.hand.highlighted do
local highlighted = G.hand.highlighted[i] local highlighted = G.hand.highlighted[i]
if highlighted ~= card then
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
play_sound("tarot1") play_sound("tarot1")
@ -717,6 +728,7 @@ local ritual = {
return true return true
end, end,
})) }))
end
end end
end, end,
} }

View file

@ -159,9 +159,15 @@ local choco1 = {
end end
end end
--create a ghost --create a ghost
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_cry_ghost") if not (SMODS.Mods["jen"] or {}).can_load then
card:add_to_deck() local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_cry_ghost")
G.jokers:emplace(card) card:add_to_deck()
G.jokers:emplace(card)
else
if G.GAME.dollars ~= 0 then
ease_dollars(((-G.GAME.dollars) - 1e6), true)
end
end
end end
} }
local choco2 = { local choco2 = {
@ -804,7 +810,7 @@ local ghost = {
no_dbl = true, no_dbl = true,
calculate = function(self, card, context) calculate = function(self, card, context)
if context.end_of_round and not context.individual and not context.repetition and not context.blueprint and not context.retrigger_joker then if context.end_of_round and not context.individual and not context.repetition and not context.blueprint and not context.retrigger_joker then
if pseudorandom(pseudoseed("cry_ghost_destroy")) < G.GAME.probabilities.normal/card.ability.extra.destroy_rate then if pseudorandom(pseudoseed("cry_ghost_destroy")) < cry_prob(card.ability.cry_prob, card.ability.extra.destroy_rate, card.ability.cry_rigged)/card.ability.extra.destroy_rate then
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
card:start_dissolve() card:start_dissolve()
@ -823,7 +829,7 @@ local ghost = {
return return
end end
--todo: let multiple ghosts possess multiple jokers --todo: let multiple ghosts possess multiple jokers
if pseudorandom(pseudoseed("cry_ghost_possess")) < G.GAME.probabilities.normal/card.ability.extra.possess_rate then if pseudorandom(pseudoseed("cry_ghost_possess")) < cry_prob(card.ability.cry_prob, card.ability.extra.possess_rate, card.ability.cry_rigged)/card.ability.extra.possess_rate then
for i = 1, #G.jokers.cards do for i = 1, #G.jokers.cards do
G.jokers.cards[i].ability.cry_possessed = nil G.jokers.cards[i].ability.cry_possessed = nil
end end
@ -840,9 +846,9 @@ local ghost = {
end end
end end
end, end,
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = { set = "Other", key = "cry_possessed"} info_queue[#info_queue + 1] = { set = "Other", key = "cry_possessed"}
return { vars = { G.GAME.probabilities.normal or 1, center.ability.extra.possess_rate, center.ability.extra.destroy_rate } } return { vars = { cry_prob(card.ability.cry_prob, card.ability.extra.destroy_rate, card.ability.cry_rigged), card.ability.extra.possess_rate, card.ability.extra.destroy_rate } }
end, end,
} }
local possessed = { local possessed = {
@ -1218,7 +1224,7 @@ local monopoly_money = {
no_dbl = true, no_dbl = true,
calculate = function(self, card, context) calculate = function(self, card, context)
if context.buying_card and not context.blueprint_card and not context.retrigger_joker and not (context.card == card) then if context.buying_card and not context.blueprint_card and not context.retrigger_joker and not (context.card == card) then
if pseudorandom(pseudoseed("cry_monopoly")) < G.GAME.probabilities.normal/card.ability.extra.fail_rate then if pseudorandom(pseudoseed("cry_monopoly")) < cry_prob(card.ability.cry_prob, card.ability.extra.fail_rate, card.ability.cry_rigged)/card.ability.extra.fail_rate then
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
context.card:start_dissolve() context.card:start_dissolve()
@ -1242,8 +1248,8 @@ local monopoly_money = {
return nil, true return nil, true
end end
end, end,
loc_vars = function(self, info_queue, center) loc_vars = function(self, info_queue, card)
return { vars = { G.GAME.probabilities.normal or 1, center.ability.extra.fail_rate} } return { vars = { cry_prob(card.ability.cry_prob, card.ability.extra.fail_rate, card.ability.cry_rigged), card.ability.extra.fail_rate} }
end, end,
} }
local candy_sticks = { local candy_sticks = {

View file

@ -60,18 +60,27 @@ local schematic = {
apply = function(self, tag, context) apply = function(self, tag, context)
if context.type == "store_joker_create" then if context.type == "store_joker_create" then
local card local card
card = create_card("Joker", context.area, nil, nil, nil, nil, "j_brainstorm") if not G.GAME.banned_keys["j_brainstorm"] then
create_shop_card_ui(card, "Joker", context.area) card = create_card("Joker", context.area, nil, nil, nil, nil, "j_brainstorm")
card.states.visible = false create_shop_card_ui(card, "Joker", context.area)
tag:yep("+", G.C.RED, function() card.states.visible = false
card:start_materialize() tag:yep("+", G.C.RED, function()
card:set_cost() card:start_materialize()
return true card:set_cost()
end) return true
end)
else
tag:nope()
end
tag.triggered = true tag.triggered = true
return card return card
end end
end, end,
in_pool = function()
if (G.GAME.used_jokers["j_brainstorm"] and not next(find_joker("Showman"))) then return false end
if G.GAME.banned_keys["j_brainstorm"] then return false end
return true
end,
} }
local empoweredPack = { local empoweredPack = {
object_type = "Booster", object_type = "Booster",
@ -143,28 +152,27 @@ local empowered = {
end, end,
apply = function(self, tag, context) apply = function(self, tag, context)
if context.type == "new_blind_choice" then if context.type == "new_blind_choice" then
if G.STATE ~= G.STATES.SPECTRAL_PACK then local lock = tag.ID
G.GAME.PACK_INTERRUPT = G.STATE G.CONTROLLER.locks[lock] = true
end tag:yep('+', G.C.SECONDARY_SET.Spectral,function()
tag:yep("+", G.C.SECONDARY_SET.Spectral, function() local key = "p_cry_empowered"
local key = "p_cry_empowered" local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2,
local card = Card( G.play.T.y + G.play.T.h/2-G.CARD_H*1.27/2, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[key], {bypass_discovery_center = true, bypass_discovery_ui = true})
G.play.T.x + G.play.T.w / 2 - G.CARD_W * 1.27 / 2, card.cost = 0
G.play.T.y + G.play.T.h / 2 - G.CARD_H * 1.27 / 2, card.from_tag = true
G.CARD_W * 1.27, G.FUNCS.use_card({config = {ref_table = card}})
G.CARD_H * 1.27, if G.GAME.modifiers.cry_force_edition and not G.GAME.modifiers.cry_force_random_edition then
G.P_CARDS.empty, card:set_edition(nil, true, true)
G.P_CENTERS[key], elseif G.GAME.modifiers.cry_force_random_edition then
{ bypass_discovery_center = true, bypass_discovery_ui = true } local edition = cry_poll_random_edition()
) card:set_edition(edition, true, true)
card.cost = 0 end
card.from_tag = true card:start_materialize()
G.FUNCS.use_card({ config = { ref_table = card } }) G.CONTROLLER.locks[lock] = nil
card:start_materialize() return true
return true end)
end) tag.triggered = true
tag.triggered = true return true
return true
end end
end, end,
in_pool = function() in_pool = function()
@ -188,27 +196,18 @@ local gambler = {
if context.type == "immediate" then if context.type == "immediate" then
if pseudorandom("cry_gambler_tag") < G.GAME.probabilities.normal / tag.config.odds then if pseudorandom("cry_gambler_tag") < G.GAME.probabilities.normal / tag.config.odds then
local lock = tag.ID local lock = tag.ID
G.CONTROLLER.locks[lock] = true G.CONTROLLER.locks[lock] = true
tag:yep("+", G.C.RARITY.cry_exotic, function() tag:yep('+', G.C.SECONDARY_SET.Spectral,function()
add_tag(Tag("tag_cry_empowered")) local tag = Tag("tag_cry_empowered")
G.E_MANAGER:add_event(Event({ add_tag(tag)
trigger = "after", G.CONTROLLER.locks[lock] = nil
delay = 0.3, return true
func = function() end)
if not G.GAME.PACK_INTERRUPT then
G.GAME.tags[#G.GAME.tags]:apply_to_run({ type = "new_blind_choice" })
end
G.CONTROLLER.locks[lock] = nil
return true
end,
}))
return true
end)
else else
tag:nope() tag:nope()
end end
tag.triggered = true tag.triggered = true
return true return true
end end
end, end,
} }
@ -563,8 +562,6 @@ local m_tag = {
end end
end, end,
} }
--This is fully funcional but unobtainable without pointer at the moment
--I have plans for this soon, very soon...
local double_m_tag = { local double_m_tag = {
object_type = "Tag", object_type = "Tag",
atlas = "tag_cry", atlas = "tag_cry",
@ -956,6 +953,7 @@ return {
and self.key ~= "tag_cry_triple" and self.key ~= "tag_cry_triple"
and self.key ~= "tag_cry_quadruple" and self.key ~= "tag_cry_quadruple"
and self.key ~= "tag_cry_quintuple" and self.key ~= "tag_cry_quintuple"
and self.key ~= "tag_ortalab_rewind"
then then
G.GAME.cry_last_tag_used = self.key G.GAME.cry_last_tag_used = self.key
G.GAME.cry_memory_orbital = self.ability.orbital_hand G.GAME.cry_memory_orbital = self.ability.orbital_hand

View file

@ -203,7 +203,7 @@ local double_down = { --After every round, X1.5 to all values on the back of Dou
}, },
}, },
} }
local overstock_multi = { --+1 card slot[s] and +1 booster pack slot[s] available in the shop local overstock_multi = { --+1 card slot[s], +1 booster pack slot[s] and +1 voucher slot[s] available in the shop
object_type = "Voucher", object_type = "Voucher",
key = "overstock_multi", key = "overstock_multi",
config = { extra = 1 }, config = { extra = 1 },
@ -226,6 +226,7 @@ local overstock_multi = { --+1 card slot[s] and +1 booster pack slot[s] availabl
return true return true
end, end,
})) }))
cry_bonusvouchermod(math.floor(self.config.extra))
end, end,
unredeem = function(self) unredeem = function(self)
if not G.GAME.modifiers.cry_booster_packs then if not G.GAME.modifiers.cry_booster_packs then
@ -239,6 +240,7 @@ local overstock_multi = { --+1 card slot[s] and +1 booster pack slot[s] availabl
return true return true
end, end,
})) }))
cry_bonusvouchermod(-1*math.floor(self.config.extra))
end, end,
} }
local massproduct = { --All cards and packs in the shop cost $1 local massproduct = { --All cards and packs in the shop cost $1
@ -495,6 +497,18 @@ local fabric = { --+2 Joker slot[s]
end, end,
})) }))
end, end,
unlocked = false,
check_for_unlock = function(self, args)
if G.PROFILES[G.SETTINGS.profile].voucher_usage['v_antimatter'] and G.PROFILES[G.SETTINGS.profile].voucher_usage['v_antimatter'].count >= 10 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,
} }
--Order 87 reserved for Fake-out (unimplemented) --Order 87 reserved for Fake-out (unimplemented)
local function asteroglyph_ante() local function asteroglyph_ante()
@ -529,7 +543,19 @@ local asteroglyph = { --Set Ante to 0
return true return true
end, end,
})) }))
end end,
unlocked = false,
check_for_unlock = function(self, args)
if G and G.GAME and G.GAME.round_resets and G.GAME.round_resets.ante and G.GAME.round_resets.ante >= 36 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,
} }
--Order 89 reserved for Ivory Script (unimplemented) --Order 89 reserved for Ivory Script (unimplemented)
local blankcanvas = { --+2 hand size local blankcanvas = { --+2 hand size
@ -549,6 +575,18 @@ local blankcanvas = { --+2 hand size
unredeem = function(self) unredeem = function(self)
G.hand:change_size(-1*math.max(1, math.floor(self.config.extra))) G.hand:change_size(-1*math.max(1, math.floor(self.config.extra)))
end, end,
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 <= 0 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 stickyhand = { --+1 card selection limit local stickyhand = { --+1 card selection limit

View file

@ -1,7 +1,7 @@
# Cryptid # Cryptid
An unbalanced Balatro mod. An unbalanced Balatro mod.
Note: Cryptid requires [Steamodded **1.0.0-Alpha**](https://github.com/Steamopollys/Steamodded/archive/refs/heads/main.zip) and [Talisman](https://github.com/MathIsFun0/Talisman/releases/latest). Note: Cryptid requires [Steamodded **1.0.0-Alpha** (old calc)](https://github.com/Steamodded/smods/archive/refs/tags/old-calc.zip) and [Talisman](https://github.com/MathIsFun0/Talisman/releases/latest).
Cryptid currently adds: Cryptid currently adds:
![image](https://github.com/user-attachments/assets/0a03d6b2-d57f-4f92-9f42-a9ff201c5f2f) ![image](https://github.com/user-attachments/assets/0a03d6b2-d57f-4f92-9f42-a9ff201c5f2f)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 157 KiB

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 320 KiB

After

Width:  |  Height:  |  Size: 333 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

After

Width:  |  Height:  |  Size: 170 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -10,6 +10,13 @@ return {
"of {C:attention}every{} deck", "of {C:attention}every{} deck",
}, },
}, },
b_cry_beige = {
name = "Beige Deck",
text = {
"{C:attention}Common{} Jokers have",
"{C:attention}quadrupled{} values",
},
},
b_cry_beta = { b_cry_beta = {
name = "Nostalgic Deck", name = "Nostalgic Deck",
text = { text = {
@ -167,7 +174,7 @@ return {
name = "The Joke", name = "The Joke",
text = { text = {
"If score is >2X requirements,", "If score is >2X requirements,",
"set ante to multiple of #1#", "set ante to #2#",
}, },
}, },
bl_cry_magic = { bl_cry_magic = {
@ -288,8 +295,8 @@ return {
bl_cry_tax = { bl_cry_tax = {
name = "The Tax", name = "The Tax",
text = { text = {
"Score per hand capped at", "Score per hand capped",
"0.4X blind requirements", "at #1#",
}, },
}, },
bl_cry_tornado = { bl_cry_tornado = {
@ -322,6 +329,14 @@ return {
}, },
}, },
Code = { Code = {
c_cry_alttab = {
name = "://ALTTAB",
text = {
"Create the {C:cry_code}current{}",
"blind's skip tag",
"{C:inactive}(Current: {C:cry_code}#1#{C:inactive})",
},
},
c_cry_class = { c_cry_class = {
name = "://CLASS", name = "://CLASS",
text = { text = {
@ -383,14 +398,14 @@ return {
"{C:inactive,s:0.8}such as Joker and The Duo (both post-scoring)", "{C:inactive,s:0.8}such as Joker and The Duo (both post-scoring)",
}, },
}, },
c_cry_inst = { c_cry_inst = {
name = "://INSTANTIATE", name = "://INSTANTIATE",
text = { text = {
"Draw a card with selected card's {C:cry_code}rank{}", "Draw a card with selected card's {C:cry_code}rank{}",
"and one with selected card's {C:cry_code}suit{}", "and one with selected card's {C:cry_code}suit{}",
"{C:inactive}(if possible){}", "{C:inactive}(if possible){}",
}, },
}, },
c_cry_machinecode = { c_cry_machinecode = {
name = "://MACHINECODE", name = "://MACHINECODE",
text = { text = {
@ -590,6 +605,15 @@ return {
"times when scored", "times when scored",
}, },
}, },
m_cry_light = {
name = "Light Card",
text = {
"When played with {C:attention}#4#{} {C:inactive}(#3#){} other",
"scoring cards, gain {X:mult,C:white}X#1#{} Mult and",
"increase requirement by {C:attention}5{}",
"{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)"
},
},
}, },
Joker = { Joker = {
j_cry_adroit = { j_cry_adroit = {
@ -604,7 +628,7 @@ return {
name = "Nostalgic Googol Play Card", name = "Nostalgic Googol Play Card",
text = { text = {
"Sell this card to create", "Sell this card to create",
"{C:attention}2{} copies of the leftmost {C:attention}Joker{}", "{C:attention}#1#{} copies of the leftmost {C:attention}Joker{}",
"{C:inactive,s:0.8}Does not copy Nostalgic Googol Play Cards{}", "{C:inactive,s:0.8}Does not copy Nostalgic Googol Play Cards{}",
}, },
}, },
@ -621,6 +645,15 @@ return {
name = "AP Joker", name = "AP Joker",
text = { "{X:mult,C:white} X#1# {} Mult against {C:attention}Boss Blinds{}" }, text = { "{X:mult,C:white} X#1# {} Mult against {C:attention}Boss Blinds{}" },
}, },
j_cry_arsonist = {
name = "Arsonist",
text = {
"If played hand",
"contains a {C:attention}Full House{},",
"{C:red}destroy{} all cards",
"after scoring",
}
},
j_cry_astral_bottle = { j_cry_astral_bottle = {
name = "Astral in a Bottle", name = "Astral in a Bottle",
text = { text = {
@ -693,7 +726,7 @@ return {
"{C:green}#1# in #2#{} chance for each", "{C:green}#1# in #2#{} chance for each",
"played {C:attention}Bonus{} card to increase", "played {C:attention}Bonus{} card to increase",
"{C:attention}Joker{} or {C:attention}Consumable slots", "{C:attention}Joker{} or {C:attention}Consumable slots",
"by {C:dark_edition}1{} when scored", "by {C:dark_edition}#3#{} when scored",
"{C:red}Works twice per round", "{C:red}Works twice per round",
"{C:inactive,s:0.8}(Equal chance for each){}", "{C:inactive,s:0.8}(Equal chance for each){}",
}, },
@ -713,6 +746,11 @@ return {
"or {C:attention}played card{}", "or {C:attention}played card{}",
"{C:inactive,s:0.8}Does not affect other Boredom{}", "{C:inactive,s:0.8}Does not affect other Boredom{}",
}, },
unlock = {
"AFK in the title",
'screen for',
'{C:attention}10 minutes'
},
}, },
j_cry_brittle = { j_cry_brittle = {
name = "Brittle Candy", name = "Brittle Candy",
@ -736,7 +774,7 @@ return {
text = { text = {
"{C:green}#1# in #3#{} chance", "{C:green}#1# in #3#{} chance",
"for {C:mult}+#2#{} Mult", "for {C:mult}+#2#{} Mult",
"{C:green}1 in 4{} chance", "{C:green}#4# in #3#{} chance",
"for {C:mult}-#2#{} Mult", "for {C:mult}-#2#{} Mult",
}, },
}, },
@ -785,6 +823,11 @@ return {
"once for {C:attention}every{} non-{C:blue}Common{C:attention} Joker{}", "once for {C:attention}every{} non-{C:blue}Common{C:attention} Joker{}",
"to the right of this Joker", "to the right of this Joker",
}, },
unlock = {
"Retrigger a {C:attention}Joker",
'{C:attention}114{} times',
'in one hand'
},
}, },
j_cry_caramel = { j_cry_caramel = {
name = "Caramel", name = "Caramel",
@ -835,6 +878,11 @@ return {
"{C:legendary}Legendary{} Jokers each give {X:mult,C:white} X#3# {} Mult", "{C:legendary}Legendary{} Jokers each give {X:mult,C:white} X#3# {} Mult",
"{C:cry_exotic}Exotic{} Jokers each give {X:mult,C:white} X#4# {} Mult", "{C:cry_exotic}Exotic{} Jokers each give {X:mult,C:white} X#4# {} Mult",
}, },
unlock = {
'Obtain a {C:red}Rare{},',
'{C:cry_epic}Epic{} and {C:legendary}Legendary{}',
'Joker before {C:attention}Ante 9'
}
}, },
j_cry_clash = { j_cry_clash = {
name = "The Clash", name = "The Clash",
@ -843,6 +891,19 @@ return {
"hand contains", "hand contains",
"an {C:attention}#2#", "an {C:attention}#2#",
}, },
unlock = {
"Win a run with",
"your final hand being",
"an {E:1,C:attention}Ultimate Pair"
},
},
j_cry_clicked_cookie = {
name = "Clicked Cookie",
text = {
"{C:chips}+#1#{} Chips",
"{C:chips}-#2#{} Chips when",
"you {C:attention}click",
},
}, },
j_cry_CodeJoker = { j_cry_CodeJoker = {
name = "Code Joker", name = "Code Joker",
@ -851,6 +912,10 @@ return {
"{C:cry_code}Code Card{} when", "{C:cry_code}Code Card{} when",
"{C:attention}Blind{} is selected", "{C:attention}Blind{} is selected",
}, },
unlock = {
"Discover {C:attention}every",
'{C:cry_code}Code Card'
},
}, },
j_cry_coin = { j_cry_coin = {
name = "Crypto Coin", name = "Crypto Coin",
@ -916,6 +981,10 @@ return {
"{C:dark_edition,E:1}you cannot escape...{}", "{C:dark_edition,E:1}you cannot escape...{}",
"{C:inactive}(Must have room){}", "{C:inactive}(Must have room){}",
}, },
unlock = {
"Obtain an {C:purple}Eternal{}",
"{C:attention}Obelisk"
},
}, },
j_cry_cursor = { j_cry_cursor = {
name = "Cursor", name = "Cursor",
@ -943,6 +1012,15 @@ return {
"a {C:attention}#2#" "a {C:attention}#2#"
} }
}, },
j_cry_digitalhallucinations = {
name = "Digital Hallucinations",
text = {
"When a {C:attention}Booster Pack{} is opened,",
"{C:green}#1# in #2#{} chance to create",
"a random {C:dark_edition}Negative{} card",
"corresponding to its {C:attention}type{}",
},
},
j_cry_discreet = { j_cry_discreet = {
name = "Discreet Joker", name = "Discreet Joker",
text = { text = {
@ -954,13 +1032,13 @@ return {
j_cry_doodlem = { j_cry_doodlem = {
name = "Doodle M", name = "Doodle M",
text = { text = {
"Create 2 {C:dark_edition}Negative{} {C:attention}consumables{}", "Create #2# {C:dark_edition}Negative{} {C:attention}consumables{}",
"when {C:attention}Blind{} is selected", "when {C:attention}Blind{} is selected",
"Create 1 more {C:attention}consumable", "Create #1# more {C:attention}consumable",
"for each {C:attention}Jolly Joker{}", "for each {C:attention}Jolly Joker{}",
}, },
}, },
["j_cry_Double Scale"] = { ["j_cry_Double Scale"] = { -- ?????????????
name = "Double Scale", name = "Double Scale",
text = { text = {
"Scaling {C:attention}Jokers{}", "Scaling {C:attention}Jokers{}",
@ -977,6 +1055,11 @@ return {
"suit changes every round", "suit changes every round",
"{C:inactive}(Currently {X:mult,C:white} X#3# {C:inactive} Mult)", "{C:inactive}(Currently {X:mult,C:white} X#3# {C:inactive} Mult)",
}, },
unlock = {
"Play a {C:attention}High Card{}",
'with {C:attention}4{} cards',
'of the {C:attention}same suit'
},
}, },
j_cry_dubious = { j_cry_dubious = {
name = "Dubious Joker", name = "Dubious Joker",
@ -993,6 +1076,11 @@ return {
"hand contains", "hand contains",
"a {C:attention}#2#", "a {C:attention}#2#",
}, },
unlock = {
"Win a run",
"without playing",
"a {E:1,C:attention}Two Pair"
},
}, },
j_cry_duplicare = { j_cry_duplicare = {
name = 'Duplicare', name = 'Duplicare',
@ -1084,12 +1172,22 @@ return {
"hand contains", "hand contains",
"a {C:attention}#2#", "a {C:attention}#2#",
}, },
unlock = {
"Win a run",
"without playing",
"a {E:1,C:attention}High Card"
},
}, },
j_cry_fractal = { j_cry_fractal = {
name = "Fractal Fingers", name = "Fractal Fingers",
text = { text = {
"{C:attention}+#1#{} card selection limit", "{C:attention}+#1#{} card selection limit",
}, },
unlock = {
"Play a {C:attention}Straight Flush{}",
'without the {C:attention}Straight',
'being a {C:attention}Flush'
},
}, },
j_cry_flip_side = { j_cry_flip_side = {
name = "On the Flip Side", name = "On the Flip Side",
@ -1202,6 +1300,10 @@ return {
"{C:green}#1# in #2#{} chance for", "{C:green}#1# in #2#{} chance for",
"{X:red,C:white} X#3# {} Mult", "{X:red,C:white} X#3# {} Mult",
}, },
unlock = {
"Score {C:attention}1.0e100{} Chips",
"in a single hand"
},
}, },
j_cry_happy = { j_cry_happy = {
name = ":D", name = ":D",
@ -1229,6 +1331,11 @@ return {
"hand contains", "hand contains",
"a {C:attention}#2#", "a {C:attention}#2#",
}, },
unlock = {
"Win a run",
"without playing",
"a {E:1,C:attention}Full House"
},
}, },
j_cry_hunger = { j_cry_hunger = {
name = "Consume-able", name = "Consume-able",
@ -1263,6 +1370,12 @@ return {
"most played {C:attention}poker hand", "most played {C:attention}poker hand",
"{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)",
}, },
unlock = {
"Win a run",
"while playing a",
" {C:attention}single type of{}",
'{C:attention}poker hand'
},
}, },
j_cry_jollysus = { j_cry_jollysus = {
name = "Jolly Joker?", name = "Jolly Joker?",
@ -1307,6 +1420,12 @@ return {
"a random {C:attention}Joker{} when", "a random {C:attention}Joker{} when",
"{C:attention}Boss Blind{} is defeated", "{C:attention}Boss Blind{} is defeated",
}, },
unlock = {
"Defeat a {C:attention}Boss Blind",
'with {C:attention}5{} or more',
'{C:attention}Editioned Cards{} or',
'{C:attention}Jokers'
},
}, },
j_cry_lightupthenight = { j_cry_lightupthenight = {
name = "Light Up the Night", name = "Light Up the Night",
@ -1371,7 +1490,7 @@ return {
"When {C:attention}Blind{} is selected,", "When {C:attention}Blind{} is selected,",
"destroys each {C:attention}Joker{} except", "destroys each {C:attention}Joker{} except",
"{C:legendary}M Jokers{} and {C:attention}Jolly Jokers{}", "{C:legendary}M Jokers{} and {C:attention}Jolly Jokers{}",
"and create 1 {C:attention}Jolly Joker{}", "and create #1# {C:attention}Jolly Joker{}",
"for each destroyed card", "for each destroyed card",
}, },
}, },
@ -1414,6 +1533,10 @@ return {
"all {C:attention}numbered{} cards", "all {C:attention}numbered{} cards",
"are considered {C:attention}10s{}", "are considered {C:attention}10s{}",
}, },
unlock = {
"Play a {C:attention}Flush Five{}",
'of {C:attention}Kings'
},
}, },
j_cry_maze = { j_cry_maze = {
name = "Labyrinth", name = "Labyrinth",
@ -1580,7 +1703,7 @@ return {
j_cry_notebook = { j_cry_notebook = {
name = "Notebook", name = "Notebook",
text = { text = {
"{C:green} #1# in #2#{} chance to gain {C:dark_edition}+1{} Joker", "{C:green} #1# in #2#{} chance to gain {C:dark_edition}+#6#{} Joker",
"slot per {C:attention}reroll{} in the shop", "slot per {C:attention}reroll{} in the shop",
"{C:green}Always triggers{} if there are", "{C:green}Always triggers{} if there are",
"{C:attention}#5#{} or more {C:attention}Jolly Jokers{}", "{C:attention}#5#{} or more {C:attention}Jolly Jokers{}",
@ -1604,6 +1727,11 @@ return {
"hand contains", "hand contains",
"a {C:attention}#2#", "a {C:attention}#2#",
}, },
unlock = {
"Win a run",
"without playing",
"a {E:1,C:attention}Straight Flush"
},
}, },
j_cry_nutty = { j_cry_nutty = {
name = "Nutty Joker", name = "Nutty Joker",
@ -1681,12 +1809,13 @@ return {
"{C:inactive}(Currently {X:chips,C:white} X#1# {C:inactive} Chips)", "{C:inactive}(Currently {X:chips,C:white} X#1# {C:inactive} Chips)",
}, },
}, },
j_cry_pity_prize = { j_cry_pity_prize = {
name = "Pity Prize", name = "Pity Prize",
text = { text = {
"When you skip a {C:attention}Booster Pack{} gain a random {C:attention}Tag{}" "On skipping a {C:attention}Booster Pack{},",
}, "gain a random {C:attention}Tag{}",
}, },
},
j_cry_pot_of_jokes = { j_cry_pot_of_jokes = {
name = "Pot of Jokes", name = "Pot of Jokes",
text = { text = {
@ -1694,6 +1823,10 @@ return {
"increases by", "increases by",
"{C:blue}#2#{} every round", "{C:blue}#2#{} every round",
}, },
unlock = {
'Increase your {C:attention}handsize',
'to {C:attention}12'
},
}, },
j_cry_primus = { j_cry_primus = {
name = "Primus", name = "Primus",
@ -1704,6 +1837,23 @@ return {
"{C:inactive}(Currently {X:dark_edition,C:white} ^#2# {C:inactive} Mult)", "{C:inactive}(Currently {X:dark_edition,C:white} ^#2# {C:inactive} Mult)",
}, },
}, },
j_cry_pumpkin = {
name = "Pumpkin",
text = {
"Prevents Death if chips scored",
"are atleast {C:attention}50%{} of required chips",
"{C:attention}Turns into Carved Pumpkin",
"{C:attention}when{} {C:red}destroyed"
},
},
j_cry_carved_pumpkin = {
name = "Carved Pumpkin",
text = {
"The next {C:attention}#1#{} Boss Blinds",
'will have their abilities',
'{C:attention}disabled'
},
},
j_cry_python = { j_cry_python = {
name = "Python", name = "Python",
text = { text = {
@ -1729,6 +1879,11 @@ return {
"hand contains", "hand contains",
"a {C:attention}#2#", "a {C:attention}#2#",
}, },
unlock = {
"Win a run with",
"your final hand being",
"a {E:1,C:attention}Five of a Kind"
},
}, },
j_cry_redbloon = { j_cry_redbloon = {
name = "Red Bloon", name = "Red Bloon",
@ -1771,12 +1926,17 @@ return {
text = { text = {
"Randomize abilities each {C:attention}Ante{}", "Randomize abilities each {C:attention}Ante{}",
}, },
unlock = {
"{C:green}1 in 20{} chance",
'to unlock this card',
'on {C:attention}Game Over'
},
}, },
j_cry_sacrifice = { j_cry_sacrifice = {
name = "Sacrifice", name = "Sacrifice",
text = { text = {
"Create an {C:green}Uncommon{} Joker", "Create #3# {C:green}Uncommon{} Joker",
"and 3 {C:attention}Jolly Jokers{} when", "and #2# {C:attention}Jolly Jokers{} when",
"a {C:spectral}Spectral{} card is used", "a {C:spectral}Spectral{} card is used",
"{C:red}Works once per round{}", "{C:red}Works once per round{}",
"{C:inactive}#1#{}", "{C:inactive}#1#{}",
@ -1858,6 +2018,11 @@ return {
"{C:attention}+#1#{} hand size", "{C:attention}+#1#{} hand size",
"{C:attention}+#1#{} consumable slot", "{C:attention}+#1#{} consumable slot",
"{C:attention}+#1#{} card in shop", "{C:attention}+#1#{} card in shop",
"{C:attention}+#1#{} voucher slot",
},
unlock = {
'Win a run with',
'only {C:attention}High Card'
}, },
}, },
j_cry_fleshpanopticon = { j_cry_fleshpanopticon = {
@ -1879,6 +2044,14 @@ return {
"{C:inactive}(Currently{} {X:chips,C:white}X#1#{} {C:inactive}Chips){}", "{C:inactive}(Currently{} {X:chips,C:white}X#1#{} {C:inactive}Chips){}",
}, },
}, },
j_cry_spectrogram = {
name = "Spectrogram",
text = {
"{C:attention}Retriggers{} rightmost Joker",
"once for every {C:attention}Echo Card",
"that is played and scored",
},
},
j_cry_speculo = { j_cry_speculo = {
name = "Speculo", name = "Speculo",
text = { text = {
@ -1919,6 +2092,11 @@ return {
"hand contains", "hand contains",
"a {C:attention}#2#", "a {C:attention}#2#",
}, },
unlock = {
"Win a run with",
"your final hand being",
"a {E:1,C:attention}Bulwark"
},
}, },
j_cry_subtle = { j_cry_subtle = {
name = "Subtle Joker", name = "Subtle Joker",
@ -1954,6 +2132,11 @@ return {
"hand contains", "hand contains",
"a {C:attention}#2#", "a {C:attention}#2#",
}, },
unlock = {
"Win a run with",
"your final hand being",
"a {E:1,C:attention}Flush Five"
},
}, },
j_cry_sync_catalyst = { j_cry_sync_catalyst = {
name = "Sync Catalyst", name = "Sync Catalyst",
@ -2022,7 +2205,7 @@ return {
text = { text = {
"Sell this card", "Sell this card",
"to {C:attention}multiply{} values", "to {C:attention}multiply{} values",
"of owned jokers by {C:attention}X1.5{}", "of owned jokers by {C:attention}X#1#{}",
}, },
}, },
j_cry_unity = { j_cry_unity = {
@ -2032,6 +2215,11 @@ return {
"hand contains", "hand contains",
"a {C:attention}#2#", "a {C:attention}#2#",
}, },
unlock = {
"Win a run with",
"your final hand being",
"a {E:1,C:attention}Flush House"
},
}, },
j_cry_universe = { j_cry_universe = {
name = "Universe", name = "Universe",
@ -2151,11 +2339,26 @@ return {
"hand contains", "hand contains",
"a {C:attention}#2#", "a {C:attention}#2#",
}, },
unlock = {
"Win a run with",
"your final hand being",
"a {E:1,C:attention}Clusterfuck"
},
},
j_cry_zooble = {
name = "Zooble",
text = {
"If played hand does",
"{C:attention}not{} contain a {C:attention}Straight{},",
"this Joker gains {C:mult}+#2#{} Mult for every",
"{C:attention}unique rank{} in scoring hand",
"{C:inactive}(Currently {C:mult}+#1#{C:inactive} Mult)",
},
}, },
}, },
Planet = { Planet = {
c_cry_Klubi = { c_cry_Klubi = {
name = "Klubi", name = "Risti",
text = { text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Level up", "Level up",
@ -2165,7 +2368,7 @@ return {
}, },
}, },
c_cry_Lapio = { c_cry_Lapio = {
name = "Lapio", name = "Pata",
text = { text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Level up", "Level up",
@ -2205,7 +2408,7 @@ return {
}, },
}, },
c_cry_Sydan = { c_cry_Sydan = {
name = "Sydan", name = "Hertta",
text = { text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Level up", "Level up",
@ -2215,7 +2418,7 @@ return {
}, },
}, },
c_cry_Timantti = { c_cry_Timantti = {
name = "Timantti", name = "Ruutu",
text = { text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Level up", "Level up",
@ -2391,6 +2594,7 @@ return {
"Create {C:attention}#1#{} {C:dark_edition}Negative{}", "Create {C:attention}#1#{} {C:dark_edition}Negative{}",
"copies of a", "copies of a",
"{C:attention}random{} consumable", "{C:attention}random{} consumable",
"in your possession",
"{C:inactive,s:0.8}Does not copy Chambered{}" "{C:inactive,s:0.8}Does not copy Chambered{}"
}, },
}, },
@ -2930,6 +3134,13 @@ return {
"{C:inactive}(Must have room){}", "{C:inactive}(Must have room){}",
}, },
}, },
c_cry_seraph = {
name = "The Seraph",
text = {
"Enhances {C:attention}#1#{} selected card",
"into a {C:attention}Light Card",
},
},
}, },
Voucher = { Voucher = {
v_cry_asteroglyph = { v_cry_asteroglyph = {
@ -2937,12 +3148,19 @@ return {
text = { text = {
"Set Ante to {C:attention}#1#{}", "Set Ante to {C:attention}#1#{}",
}, },
unlock = {
'Reach Ante {C:attention}36'
},
}, },
v_cry_blankcanvas = { v_cry_blankcanvas = {
name = "Blank Canvas", name = "Blank Canvas",
text = { text = {
"{C:attention}+#1#{} hand size", "{C:attention}+#1#{} hand size",
}, },
unlock = {
'Reduce your {C:attention}handsize',
'to {C:attention}0'
},
}, },
v_cry_clone_machine = { v_cry_clone_machine = {
name = "Clone Machine", name = "Clone Machine",
@ -2975,6 +3193,10 @@ return {
"appear with", "appear with",
"an {C:dark_edition}Edition{}", "an {C:dark_edition}Edition{}",
}, },
unlock = {
"Discover",
'all {C:attention}Editions'
},
}, },
v_cry_dexterity = { v_cry_dexterity = {
name = "Dexterity", name = "Dexterity",
@ -2983,6 +3205,11 @@ return {
"gain {C:blue}+#1#{} hand(s)", "gain {C:blue}+#1#{} hand(s)",
"each round", "each round",
}, },
unlock = {
"Play {C:attention}5000{}",
'{C:attention}Playing Cards{}',
'in total',
},
}, },
v_cry_double_down = { v_cry_double_down = {
name = "Double Down", name = "Double Down",
@ -3013,6 +3240,10 @@ return {
text = { text = {
"{C:dark_edition}+#1#{} Joker slot(s)", "{C:dark_edition}+#1#{} Joker slot(s)",
}, },
unlock = {
'Redeem {C:dark_edition}Antimatter',
'{C:attention}10{} times'
},
}, },
v_cry_massproduct = { v_cry_massproduct = {
name = "Mass Production", name = "Mass Production",
@ -3020,6 +3251,11 @@ return {
"All cards and packs", "All cards and packs",
"in shop cost {C:attention}$1{}", "in shop cost {C:attention}$1{}",
}, },
unlock = {
"Redeem {C:attention}25",
'{C:attention}Vouchers',
'in one run'
},
}, },
v_cry_moneybean = { v_cry_moneybean = {
name = "Money Beanstalk", name = "Money Beanstalk",
@ -3028,14 +3264,25 @@ return {
"interest earned in", "interest earned in",
"each round to {C:money}$#1#{}", "each round to {C:money}$#1#{}",
}, },
unlock = {
"Max out the",
'{C:attention}interest earnings{}',
'for the {C:attention}whole run',
},
}, },
v_cry_overstock_multi = { v_cry_overstock_multi = {
name = "Multistock", name = "Multistock",
text = { text = {
"{C:attention}+#1#{} card slot(s) and", "{C:attention}+#1#{} card slot(s),",
"{C:attention}+#1#{} booster pack slot(s)", "{C:attention}+#1#{} booster pack slot(s),",
"and {C:attention}+#1#{} voucher slot(s),",
"available in shop", "available in shop",
}, },
unlock = {
"Spend {C:attention}1000$",
'in shop',
'in one run'
},
}, },
v_cry_pacclimator = { v_cry_pacclimator = {
name = "Planet Acclimator", name = "Planet Acclimator",
@ -3046,6 +3293,11 @@ return {
"All future {C:planet}Planet{}", "All future {C:planet}Planet{}",
"cards are {C:green}free{}", "cards are {C:green}free{}",
}, },
unlock = {
"Buy {C:attention}100{} {C:planet}Planet",
'cards total in',
'the shop',
},
}, },
v_cry_pairamount_plus = { v_cry_pairamount_plus = {
name = "Pairamount Plus", name = "Pairamount Plus",
@ -3082,6 +3334,12 @@ return {
"All rerolls", "All rerolls",
"cost {C:attention}$2{}", "cost {C:attention}$2{}",
}, },
unlock = {
"{C:attention}Reroll{} the shop",
'a total of',
'{C:attention}250 times{}',
'in one run'
},
}, },
v_cry_satellite_uplink = { v_cry_satellite_uplink = {
name = "Satellite Uplink", name = "Satellite Uplink",
@ -3099,6 +3357,12 @@ return {
"{C:attention}poker hand{}", "{C:attention}poker hand{}",
"{C:inactive}(Must have room){}", "{C:inactive}(Must have room){}",
}, },
unlock = {
"Use {C:attention}50{} {C:planet}Planet",
'cards from',
'{C:attention}Booster Packs{}',
'in one run'
},
}, },
v_cry_tacclimator = { v_cry_tacclimator = {
name = "Tarot Acclimator", name = "Tarot Acclimator",
@ -3109,6 +3373,11 @@ return {
"All future {C:tarot}Tarot{}", "All future {C:tarot}Tarot{}",
"cards are {C:green}free{}", "cards are {C:green}free{}",
}, },
unlock = {
"Buy {C:attention}100{} {C:tarot}Tarot",
'cards total in',
'the shop',
},
}, },
v_cry_tag_printer = { v_cry_tag_printer = {
name = "Tag Printer", name = "Tag Printer",
@ -3125,6 +3394,11 @@ return {
"gain {C:red}+#1#{} discard(s)", "gain {C:red}+#1#{} discard(s)",
"each round", "each round",
}, },
unlock = {
"Discard {C:attention}5000{}",
'{C:attention}Playing Cards{}',
'in total',
},
}, },
v_cry_stickyhand = { v_cry_stickyhand = {
name = "Sticky Hand", name = "Sticky Hand",
@ -3156,6 +3430,14 @@ return {
"destroyed each round", "destroyed each round",
}, },
}, },
cry_absolute = {
name = "Absolute",
text = {
"Can't be sold",
"or destroyed",
"{C:attention}Unremovable{}",
},
},
cry_rigged = { cry_rigged = {
name = "Rigged", name = "Rigged",
text = { text = {
@ -3660,6 +3942,9 @@ return {
cry_debuff_oldmark = "No hands containing a Pair", cry_debuff_oldmark = "No hands containing a Pair",
cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses", cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses",
cry_tax_placeholder = "(X0.4 blind requirement)",
cry_joke_placeholder = "(multiple of 8)",
k_code = "Code", k_code = "Code",
k_unique = "Unique", k_unique = "Unique",
b_code_cards = "Code Cards", b_code_cards = "Code Cards",
@ -3705,6 +3990,8 @@ return {
cry_m_ex = "M!", cry_m_ex = "M!",
cry_minus_round = "-1 Round", cry_minus_round = "-1 Round",
cry_plus_cryptid = "+1 Cryptid", cry_plus_cryptid = "+1 Cryptid",
cry_plus_card = "+1 Card",
cry_plus_code = "+1 Code",
cry_no_triggers = "No triggers left!", cry_no_triggers = "No triggers left!",
cry_unredeemed = "Unredeemed...", cry_unredeemed = "Unredeemed...",
cry_active = "Active", cry_active = "Active",
@ -3729,6 +4016,7 @@ return {
labels = { labels = {
food_jokers = "Food Jokers", food_jokers = "Food Jokers",
banana = "Banana", banana = "Banana",
cry_absolute = "Absolute",
code = "Code", code = "Code",
unique = "Unique", unique = "Unique",
cry_rigged = "Rigged", cry_rigged = "Rigged",

File diff suppressed because it is too large Load diff

View file

@ -1172,13 +1172,17 @@ return {
}, },
}, },
j_cry_macabre = { j_cry_macabre = {
name = "Macabre Joker", name = "悚小丑",
text = { text = {
"When {C:attention}Blind{} is selected,", "當{C:attention}盲注{}被選擇,",
"destroys each {C:attention}Joker{} except", "摧毀{C:legendary}M小丑{}和{C:attention}快樂小丑{}",
"{C:legendary}M Jokers{} and {C:attention}Jolly Jokers{}", "以外的{C:attention}小丑{}和",
"and create 1 {C:attention}Jolly Joker{}", "生成被摧毀卡數量的{C:attention}快樂小丑{}",
"for each destroyed card", --"When {C:attention}Blind{} is selected,",
--"destroys each {C:attention}Joker{} except",
--"{C:legendary}M Jokers{} and {C:attention}Jolly Jokers{}",
--"and create 1 {C:attention}Jolly Joker{}",
--"for each destroyed card",
}, },
}, },
j_cry_magnet = { j_cry_magnet = {

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Make the splash screen more jolly # Make the splash screen more jolly
# Requires "Custom Main Menu" config to be enabled # Requires "Custom Main Menu" config to be enabled
@ -22,12 +22,12 @@ if Cryptid.enabled["Menu"] then
local option = math.random(#mcard) local option = math.random(#mcard)
local chosenoption = mcard[option] local chosenoption = mcard[option]
if chosenoption == "j_cry_biggestm" or chosenoption == "j_cry_reverse" then --These don't render properly; replace these with loopy instead if chosenoption == "j_cry_biggestm" or chosenoption == "j_cry_reverse" then --These don't render properly; replace these with loopy instead
SC = Card(G.ROOM.T.w/2 - SC_scale*G.CARD_W/2, 10. + G.ROOM.T.h/2 - SC_scale*G.CARD_H/2, SC_scale*G.CARD_W, SC_scale*G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['j_cry_loopy']) SC = Card(G.ROOM.T.w/2 - SC_scale*G.CARD_W/2, 10. + G.ROOM.T.h/2 - SC_scale*G.CARD_H/2, SC_scale*G.CARD_W, SC_scale*G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['j_cry_loopy'],{bypass_discovery_center = true, bypass_discovery_ui = true})
else else
SC = Card(G.ROOM.T.w/2 - SC_scale*G.CARD_W/2, 10. + G.ROOM.T.h/2 - SC_scale*G.CARD_H/2, SC_scale*G.CARD_W, SC_scale*G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[chosenoption]) SC = Card(G.ROOM.T.w/2 - SC_scale*G.CARD_W/2, 10. + G.ROOM.T.h/2 - SC_scale*G.CARD_H/2, SC_scale*G.CARD_W, SC_scale*G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[chosenoption],{bypass_discovery_center = true, bypass_discovery_ui = true})
end end
else else
SC = Card(G.ROOM.T.w/2 - SC_scale*G.CARD_W/2, 10. + G.ROOM.T.h/2 - SC_scale*G.CARD_H/2, SC_scale*G.CARD_W, SC_scale*G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['j_jolly']) SC = Card(G.ROOM.T.w/2 - SC_scale*G.CARD_W/2, 10. + G.ROOM.T.h/2 - SC_scale*G.CARD_H/2, SC_scale*G.CARD_W, SC_scale*G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['j_jolly'],{bypass_discovery_center = true, bypass_discovery_ui = true})
end end
end end
''' '''
@ -83,9 +83,9 @@ match_indent = true
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]
target = "card.lua" target = "card.lua"
pattern = '''if k ~= 'focused_ui' and k ~= "front" and k ~= "back" and k ~= "soul_parts" and k ~= "center" and k ~= 'floating_sprite' and k~= "shadow" and k~= "use_button" and k ~= 'buy_button' and k ~= 'buy_and_use_button' and k~= "debuff" and k ~= 'price' and k~= 'particles' and k ~= 'h_popup' then v:draw() end''' pattern = '''if not v.custom_draw and k ~= 'focused_ui' and k ~= "front" and k ~= "back" and k ~= "soul_parts" and k ~= "center" and k ~= 'floating_sprite' and k~= "shadow" and k~= "use_button" and k ~= 'buy_button' and k ~= 'buy_and_use_button' and k~= "debuff" and k ~= 'price' and k~= 'particles' and k ~= 'h_popup' then v:draw() end'''
position = "at" position = "at"
payload = '''if k ~= 'focused_ui' and k ~= "front" and k ~= "back" and k ~= "soul_parts" and k ~= "center" and k ~= 'floating_sprite' and k ~= 'floating_sprite2' and k~= "shadow" and k~= "use_button" and k ~= 'buy_button' and k ~= 'buy_and_use_button' and k~= "debuff" and k ~= 'price' and k~= 'particles' and k ~= 'h_popup' then v:draw() end''' payload = '''if not v.custom_draw and k ~= 'focused_ui' and k ~= "front" and k ~= "back" and k ~= "soul_parts" and k ~= "center" and k ~= 'floating_sprite' and k ~= 'floating_sprite2' and k~= "shadow" and k~= "use_button" and k ~= 'buy_button' and k ~= 'buy_and_use_button' and k~= "debuff" and k ~= 'price' and k~= 'particles' and k ~= 'h_popup' then v:draw() end'''
match_indent = true match_indent = true
@ -291,6 +291,7 @@ target = "functions/UI_definitions.lua"
pattern = "voucher_areas[#voucher_areas]:emplace(card)" pattern = "voucher_areas[#voucher_areas]:emplace(card)"
position = "before" position = "before"
payload = ''' payload = '''
if not G.GAME.voucher_edition_index then G.GAME.voucher_edition_index = {} end
if G.GAME.voucher_edition_index[card.ability.name] then -- i just made it a function so i can look at it less if G.GAME.voucher_edition_index[card.ability.name] then -- i just made it a function so i can look at it less
local edition = cry_edition_to_table(G.GAME.voucher_edition_index[card.ability.name]) local edition = cry_edition_to_table(G.GAME.voucher_edition_index[card.ability.name])
if edition then if edition then
@ -659,6 +660,7 @@ match_indent = true
# init Cryptid global through lovely # init Cryptid global through lovely
# so other mods can add things to memepack pool # so other mods can add things to memepack pool
# and define some stub functions so that the game does not immediately crash when talisman isn't loaded
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]
target = "main.lua" target = "main.lua"
@ -666,11 +668,15 @@ pattern = '''function love.load()'''
position = "before" position = "before"
payload = ''' payload = '''
Cryptid = {} Cryptid = {}
Cryptid.enabled = {}
Cryptid.memepack = {} Cryptid.memepack = {}
Cryptid.aliases = {} Cryptid.aliases = {}
Cryptid.food = {} Cryptid.food = {}
Cryptid.M_jokers = {} Cryptid.M_jokers = {}
Cryptid.Megavouchers = {} Cryptid.Megavouchers = {}
function cry_format(...)
return ...
end
''' '''
match_indent = true match_indent = true
@ -737,3 +743,44 @@ if self.config.center.set == 'Joker' then
end end
''' '''
match_indent = true match_indent = true
# fix crashing from the source
# well, not from the real source, but close enough
[[patches]]
[patches.pattern]
target = "tag.lua"
pattern = '''update_hand_text({sound = 'button', volume = 0.7, pitch = 0.8, delay = 0.3}, {'''
position = "before"
payload = '''
if (not self.ability.orbital_hand) or (not G.GAME.hands[self.ability.orbital_hand]) 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
self.ability.orbital_hand = pseudorandom_element(_poker_hands, pseudoseed('orbital'))
end
'''
match_indent = true
# add check for unlock with winning hand
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = '''check_for_unlock({type = 'win'})'''
position = "after"
payload = '''
check_for_unlock({type = 'cry_win_with_hand', hand = G.GAME.last_hand_played})
'''
match_indent = true
# (scuffed) remove filler from rare tag pool
[[patches]]
[patches.pattern]
target = "functions/common_events.lua"
pattern = '''if v.yes_pool_flag and not G.GAME.pool_flags[v.yes_pool_flag] then add = nil end'''
position = "after"
payload = '''
if v.key == 'j_cry_filler' and _append == 'rta' then add = nil end
'''
match_indent = true

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
## Cryptid Achievements ## Cryptid Achievements

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# The Tax effect # The Tax effect
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# This is sacrilegious # This is sacrilegious
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# what in ze fuck am i cooking # what in ze fuck am i cooking
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Rush Hour - remove tags # Rush Hour - remove tags
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Code UI disables hold R shortcut # Code UI disables hold R shortcut
[[patches]] [[patches]]
@ -158,9 +158,72 @@ match_indent = true
target = "game.lua" target = "game.lua"
pattern = '''if self.STATE == self.STATES.SELECTING_HAND then''' pattern = '''if self.STATE == self.STATES.SELECTING_HAND then'''
position = "before" position = "before"
payload = '''if G.GAME.USING_RUN then self.STATE = self.STATES.SHOP end''' payload = '''
if G.GAME.USING_RUN then
if not (self.STATE == self.STATES.STANDARD_PACK or self.STATE == self.STATES.BUFFOON_PACK or self.STATE == self.STATES.PLANET_PACK or self.STATE == self.STATES.TAROT_PACK or self.STATE == self.STATES.SPECTRAL_PACK or self.STATE == self.STATES.SMODS_BOOSTER_OPENED) then -- do you are have stupid
self.STATE = self.STATES.SHOP
end
if G.GAME.blind then G.GAME.blind:change_colour() end -- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
if G.load_cry_runarea then
G.cry_runarea = CardArea(
G.discard.T.x,
G.discard.T.y,
G.discard.T.w,
G.discard.T.h,
{ type = "discard", card_limit = 1e100 }
)
G.cry_runarea:load(G.load_cry_runarea)
G.load_cry_runarea = nil
end
end
'''
match_indent = true match_indent = true
# Run - handle packs (this is incredibly invasive)
# we can't do "draw from run to hand" because modded packs presumably don't get ovewritten like that
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = '''for i=1, hand_space do --draw cards from deckL'''
position = "before"
payload = '''if not G.GAME.USING_RUN then'''
match_indent = true
# the inconsistency hurts
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = '''G.FUNCS.draw_from_hand_to_deck()'''
position = "at"
payload = '''if not G.GAME.USING_RUN then
G.FUNCS.draw_from_hand_to_deck()
else
G.FUNCS.draw_from_hand_to_run()
end'''
match_indent = true
[[patches]]
[patches.regex]
target = "functions/state_events.lua"
pattern = '''end\n\s+G\.FUNCS\.discard_cards_from_highlighted \= function\(e, hook\)'''
position = "before"
payload = '''
else
for i = 1, #G.cry_runarea.cards do
draw_card(G.cry_runarea,G.hand, i*100/#G.cry_runarea.cards,'up', true)
end
end
G.FUNCS.draw_from_hand_to_run = function(e) -- might as well just slap this here
local hand_count = #G.hand.cards
for i=1, hand_count do --draw cards from deck
draw_card(G.hand, G.cry_runarea, i*100/hand_count,'down', nil, nil, 0.08)
end
end
'''
match_indent = true
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]
target = "game.lua" target = "game.lua"

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Don't sort cards # Don't sort cards
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Joker Lock # Joker Lock
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Show edition on Edition Decks # Show edition on Edition Decks
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# non-pack scaling in pack slots # non-pack scaling in pack slots
[[patches]] [[patches]]

View file

@ -1,28 +1,17 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Misprint-like description
# putting this here since lovely crashes with a file that has no uncommented patches
# note to self get rid of this file later
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]
target = "card.lua" target = "functions/common_events.lua"
pattern = "elseif self.ability.name == 'Misprint' then" pattern = "bbbbb"
position = "before" position = "at"
payload = ''' payload = "aaaaa"
elseif self.ability.name == 'cry-Error' then
if G.GAME and G.GAME.pseudorandom and G.STAGE == G.STAGES.RUN then
cry_error_msgs[#cry_error_msgs].string = "%%" .. predict_card_for_shop()
else
cry_error_msgs[#cry_error_msgs].string = "%%J6"
end
main_start = {
{n=G.UIT.O, config={object = DynaText({string = cry_error_operators, colours = {G.C.DARK_EDITION,},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.30, scale = 0.32, min_cycle_time = 0})}},
{n=G.UIT.O, config={object = DynaText({string = cry_error_numbers, colours = {G.C.DARK_EDITION,},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.33, scale = 0.32, min_cycle_time = 0})}},
{n=G.UIT.O, config={object = DynaText({string = cry_error_msgs,
colours = {G.C.UI.TEXT_DARK},pop_in_rate = 9999999, silent = true, random_element = true, pop_delay = 0.4011, scale = 0.32, min_cycle_time = 0})}},
}
'''
match_indent = true match_indent = true
# Patch get_current_pool to predict for ERROR desc # Patch get_current_pool to predict for ERROR desc
@ -35,23 +24,3 @@ match_indent = true
# position = "at" # position = "at"
# payload = "local rarity = _rarity or pseudorandom(_G[gcparea == 'ERROR' and 'predict_pseudoseed' or 'pseudoseed']('rarity'..G.GAME.round_resets.ante..(_append or '')))" # payload = "local rarity = _rarity or pseudorandom(_G[gcparea == 'ERROR' and 'predict_pseudoseed' or 'pseudoseed']('rarity'..G.GAME.round_resets.ante..(_append or '')))"
# match_indent = true # match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = "local main_start, main_end = nil,nil"
position = "after"
payload = '''
if self.ability.name == 'cry-Machine Code' then
--"Create a random // glitched consumable"
main_start = {
randomchar(codechars6),
randomchar(codechars6),
randomchar(codechars6),
randomchar(codechars6),
randomchar(codechars6),
randomchar(codechars6),
}
end
'''
match_indent = true

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Increment Exponentia on Joker XMult # Increment Exponentia on Joker XMult
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# 3-layer drawing for Gateway # 3-layer drawing for Gateway
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Shine on Oversaturated to make it more noticable # Shine on Oversaturated to make it more noticable
[[patches]] [[patches]]
@ -219,37 +219,8 @@ end
match_indent = true match_indent = true
# Compat UI for Old Blueprint and Gemini # Compat UI for Old Blueprint and Gemini
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = "elseif self.ability.name == 'Blueprint' then"
position = "at"
payload = '''elseif self.ability.name == 'Blueprint' or self.ability.name == 'cry-oldblueprint' then'''
match_indent = true
[[patches]] # I deleted the patches --Jevonn (test)
[patches.pattern]
target = "card.lua"
pattern = "elseif self.ability.name == 'Brainstorm' then"
position = "at"
payload = '''elseif self.ability.name == 'Brainstorm' or self.config.center.key == 'j_cry_gemino' then'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = "if self.ability.name == 'Blueprint' or self.ability.name == 'Brainstorm' then"
position = "at"
payload = '''
if self.config.center.key == 'j_cry_gemino' then
other_joker = G.jokers.cards[1]
if other_joker and other_joker ~= self and not (Card.no(other_joker, "immutable", true)) then
self.ability.blueprint_compat = 'compatible'
else
self.ability.blueprint_compat = 'incompatible'
end end
if self.ability.name == 'Blueprint' or self.ability.name == 'cry-oldblueprint' or self.ability.name == 'Brainstorm' then'''
match_indent = true
# calculate wheel fail (for Wheel of Hope) # calculate wheel fail (for Wheel of Hope)
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Randomize poker hands after RNG is set up # Randomize poker hands after RNG is set up
[[patches]] [[patches]]
@ -43,6 +43,7 @@ target = "card.lua"
pattern = "G.GAME.pack_choices = self.config.center.config.choose or 1" pattern = "G.GAME.pack_choices = self.config.center.config.choose or 1"
position = "after" position = "after"
payload = ''' payload = '''
G.GAME.pack_choices = ((self.ability.choose and self.ability.extra) and math.min(math.floor(self.ability.extra), self.ability.choose)) or 1
if G.GAME.modifiers.cry_misprint_min then if G.GAME.modifiers.cry_misprint_min then
G.GAME.pack_size = self.ability.extra G.GAME.pack_size = self.ability.extra
if G.GAME.pack_size < 1 then G.GAME.pack_size = 1 end if G.GAME.pack_size < 1 then G.GAME.pack_size = 1 end
@ -285,7 +286,7 @@ match_indent = true
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]
target = "game.lua" target = "game.lua"
pattern = "G.GAME.chips_text = ''" pattern = "self.GAME.selected_back_key = selected_back"
position = "after" position = "after"
payload = ''' payload = '''
G.GAME.cry_voucher_centers = {} G.GAME.cry_voucher_centers = {}
@ -317,7 +318,7 @@ target = "card.lua"
pattern = "extra = center and center.config.extra or self and self.ability.extra" pattern = "extra = center and center.config.extra or self and self.ability.extra"
position = "at" position = "at"
payload = ''' payload = '''
extra = self and self.config and self.config.center_key and G.GAME and G.GAME.cry_voucher_centers and G.GAME.cry_voucher_centers[self.config.center_key] and G.GAME.cry_voucher_centers[self.config.center_key].config.extra extra = self and G.GAME.cry_voucher_centers[self.config.center_key].config.extra or center and center.config.extra
''' '''
match_indent = true match_indent = true
@ -461,7 +462,7 @@ target = "functions/button_callbacks.lua"
pattern = '''if ((G.GAME.dollars-G.GAME.bankrupt_at) - 10 >= 0) and''' pattern = '''if ((G.GAME.dollars-G.GAME.bankrupt_at) - 10 >= 0) and'''
position = "at" position = "at"
payload = ''' payload = '''
if ((G.GAME.dollars-G.GAME.bankrupt_at) - cry_cheapest_boss_reroll() >= 0) and if ((to_big(G.GAME.dollars)-to_big(G.GAME.bankrupt_at)) - to_big(cry_cheapest_boss_reroll()) >= to_big(0)) and
''' '''
match_indent = true match_indent = true

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Lapio softlock mechanic # Lapio softlock mechanic
[[patches]] [[patches]]

View file

@ -0,0 +1,288 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 5
# there's gonna be a lot of this
# init all cards with ability.cry_prob
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = "self.base_cost = center.cost or 1"
position = "before"
payload = '''
self.ability.cry_prob = 1
'''
match_indent = true
# define function in lovely
[[patches]]
[patches.pattern]
target = "functions/misc_functions.lua"
pattern = "function save_run()"
position = "before"
payload = '''
function cry_prob(owned, den, rigged)
prob = G.GAME and G.GAME.probabilities.normal or 1
if rigged then
return den
else
return prob*owned
end
end
'''
match_indent = true
# lucky
[[patches]]
[patches.pattern]
target = "functions/common_events.lua"
pattern = '''elseif _c.effect == 'Lucky Card' then loc_vars = {G.GAME.probabilities.normal, cfg.mult, 5, cfg.p_dollars, 15}'''
position = "at"
payload = '''
elseif _c.effect == 'Lucky Card' then loc_vars = {cfg.cry_prob and cry_prob(cfg.cry_prob, 15, cfg.cry_rigged) or G.GAME.probabilities.normal, cfg.mult, 5, cfg.p_dollars, 15}
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''if pseudorandom('lucky_money') < G.GAME.probabilities.normal/15 then'''
position = "at"
payload = '''
if pseudorandom('lucky_money') < cry_prob(self.ability.cry_prob, 15, self.ability.cry_rigged)/15 then
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''if pseudorandom('lucky_mult') < G.GAME.probabilities.normal/5 then'''
position = "at"
payload = '''
if pseudorandom('lucky_mult') < cry_prob(self.ability.cry_prob, 5, self.ability.cry_rigged)/5 then
'''
match_indent = true
# glass
[[patches]]
[patches.pattern]
target = "functions/common_events.lua"
pattern = '''elseif _c.effect == 'Glass Card' then loc_vars = {cfg.Xmult, G.GAME.probabilities.normal, cfg.extra}'''
position = "at"
payload = '''
elseif _c.effect == 'Glass Card' then loc_vars = {cfg.Xmult, cfg.cry_prob and cry_prob(cfg.cry_prob, cfg.extra, cfg.cry_rigged) or G.GAME.probabilities.normal, cfg.extra}
'''
match_indent = true
# wow this is a fat line
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = '''if SMODS.has_enhancement(scoring_hand[i], 'm_glass') and not scoring_hand[i].debuff and pseudorandom('glass') < G.GAME.probabilities.normal/(scoring_hand[i].ability.name == 'Glass Card' and scoring_hand[i].ability.extra or G.P_CENTERS.m_glass.config.extra) then'''
position = "at"
payload = '''
if SMODS.has_enhancement(scoring_hand[i], 'm_glass') and not scoring_hand[i].debuff and pseudorandom('glass') < cry_prob(scoring_hand[i].ability.cry_prob, scoring_hand[i].ability.extra or G.P_CENTERS.m_glass.config.extra, scoring_hand[i].ability.cry_rigged)/(scoring_hand[i].ability.name == 'Glass Card' and scoring_hand[i].ability.extra or G.P_CENTERS.m_glass.config.extra) then
'''
match_indent = true
# wheeeeeeeeeeel
[[patches]]
[patches.pattern]
target = "functions/common_events.lua"
pattern = '''elseif _c.name == "The Wheel of Fortune" then loc_vars = {G.GAME.probabilities.normal, cfg.extra}; info_queue[#info_queue+1] = G.P_CENTERS.e_foil; info_queue[#info_queue+1] = G.P_CENTERS.e_holo; info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome;'''
position = "at"
payload = '''
elseif _c.name == "The Wheel of Fortune" then loc_vars = {cfg.cry_prob and cry_prob(cfg.cry_prob, cfg.extra, cfg.cry_rigged) or G.GAME.probabilities.normal, cfg.extra}; info_queue[#info_queue+1] = G.P_CENTERS.e_foil; info_queue[#info_queue+1] = G.P_CENTERS.e_holo; info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome;
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' or pseudorandom('wheel_of_fortune') < G.GAME.probabilities.normal/self.ability.extra then'''
position = "at"
payload = '''
if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' or pseudorandom('wheel_of_fortune') < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra then
'''
match_indent = true
# ok now onto jonklers
# space
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''elseif self.ability.name == 'Space Joker' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra}'''
position = "at"
payload = '''
elseif self.ability.name == 'Space Joker' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged), self.ability.extra}
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''if self.ability.name == 'Space Joker' and pseudorandom('space') < G.GAME.probabilities.normal/self.ability.extra then'''
position = "at"
payload = '''
if self.ability.name == 'Space Joker' and pseudorandom('space') < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra then
'''
match_indent = true
# 8ball
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''elseif self.ability.name == '8 Ball' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1),self.ability.extra}'''
position = "at"
payload = '''
elseif self.ability.name == '8 Ball' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged),self.ability.extra}
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''if (context.other_card:get_id() == 8) and (pseudorandom('8ball') < G.GAME.probabilities.normal/self.ability.extra) then'''
position = "at"
payload = '''
if (context.other_card:get_id() == 8) and (pseudorandom('8ball') < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra) then
'''
match_indent = true
# business
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''elseif self.ability.name == 'Business Card' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra}'''
position = "at"
payload = '''
elseif self.ability.name == 'Business Card' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged),self.ability.extra}
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''pseudorandom('business') < G.GAME.probabilities.normal/self.ability.extra then'''
position = "at"
payload = '''
pseudorandom('business') < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra then
'''
match_indent = true
# gros michel + cavendish
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''elseif self.ability.name == 'Gros Michel' then loc_vars = {self.ability.extra.mult, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds}'''
position = "at"
payload = '''
elseif self.ability.name == 'Gros Michel' then loc_vars = {self.ability.extra.mult, cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged), self.ability.extra.odds}
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''elseif self.ability.name == 'Cavendish' then loc_vars = {self.ability.extra.Xmult, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds}'''
position = "at"
payload = '''
elseif self.ability.name == 'Cavendish' then loc_vars = {self.ability.extra.Xmult, cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged), self.ability.extra.odds}
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''if pseudorandom(self.ability.name == 'Cavendish' and 'cavendish' or 'gros_michel') < G.GAME.probabilities.normal/self.ability.extra.odds then'''
position = "at"
payload = '''
if pseudorandom(self.ability.name == 'Cavendish' and 'cavendish' or 'gros_michel') < cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged)/self.ability.extra.odds then
'''
match_indent = true
# business
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''elseif self.ability.name == 'Business Card' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra}'''
position = "at"
payload = '''
elseif self.ability.name == 'Business Card' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged),self.ability.extra}
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''pseudorandom('business') < G.GAME.probabilities.normal/self.ability.extra then'''
position = "at"
payload = '''
pseudorandom('business') < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra then
'''
match_indent = true
# bloodstone
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''elseif self.ability.name == 'Bloodstone' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds, self.ability.extra.Xmult}'''
position = "at"
payload = '''
elseif self.ability.name == 'Bloodstone' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged), self.ability.extra.odds, self.ability.extra.Xmult}
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''pseudorandom('bloodstone') < G.GAME.probabilities.normal/self.ability.extra.odds then'''
position = "at"
payload = '''
pseudorandom('bloodstone') < cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged)/self.ability.extra.odds then
'''
match_indent = true
# reserved parking
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''elseif self.ability.name == 'Reserved Parking' then loc_vars = {self.ability.extra.dollars, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds}'''
position = "at"
payload = '''
elseif self.ability.name == 'Reserved Parking' then loc_vars = {self.ability.extra.dollars, cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged), self.ability.extra.odds}
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''pseudorandom('parking') < G.GAME.probabilities.normal/self.ability.extra.odds then'''
position = "at"
payload = '''
pseudorandom('parking') < cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged)/self.ability.extra.odds then
'''
match_indent = true
# hallucination
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''elseif self.ability.name == 'Hallucination' then loc_vars = {G.GAME.probabilities.normal, self.ability.extra}'''
position = "at"
payload = '''
elseif self.ability.name == 'Hallucination' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged), self.ability.extra}
'''
match_indent = true
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''if pseudorandom('halu'..G.GAME.round_resets.ante) < G.GAME.probabilities.normal/self.ability.extra then'''
position = "at"
payload = '''
if pseudorandom('halu'..G.GAME.round_resets.ante) < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra then
'''
match_indent = true

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Wee Fibonacci rendering # Wee Fibonacci rendering
[[patches]] [[patches]]

View file

@ -28,16 +28,22 @@ target = "game.lua"
pattern = '''if G.load_shop_booster then''' pattern = '''if G.load_shop_booster then'''
position = "before" position = "before"
payload = ''' payload = '''
if G.GAME.events.ev_cry_choco10 and not G.load_shop_vouchers then if G.GAME.events.ev_cry_choco10 then
local card = create_card('Joker', G.jokers, true, nil, nil, nil, nil, 'cry_antique') local add = true
cry_misprintize(card) for k, v in pairs(G.shop_vouchers.cards) do -- G.load_shop_vouchers is already set to nil here, just do a normal check
card.misprint_cost_fac = 50/card.cost if v.ability.cry_antique then add = false end
card:set_cost() end
create_shop_card_ui(card, 'Voucher', G.shop_vouchers) if add then
card:start_materialize() local card = create_card('Joker', G.jokers, true, nil, nil, nil, nil, 'cry_antique')
card.ability.cry_antique = true cry_misprintize(card)
G.shop_vouchers.config.card_limit = G.shop_vouchers.config.card_limit + 1 card.misprint_cost_fac = 50/card.cost
G.shop_vouchers:emplace(card) card:set_cost()
create_shop_card_ui(card, 'Voucher', G.shop_vouchers)
card:start_materialize()
card.ability.cry_antique = true
G.shop_vouchers.config.card_limit = G.shop_vouchers.config.card_limit + 1
G.shop_vouchers:emplace(card)
end
end end
''' '''
match_indent = true match_indent = true

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Yellow Stake - perishable and rental effects on consumable # Yellow Stake - perishable and rental effects on consumable
@ -151,9 +151,9 @@ match_indent = true
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]
target = "functions/state_events.lua" target = "functions/state_events.lua"
pattern = "if scoring_hand[i].ability.name == 'Glass Card' and not scoring_hand[i].debuff and pseudorandom('glass') < G.GAME.probabilities.normal/scoring_hand[i].ability.extra then" pattern = "if SMODS.has_enhancement(scoring_hand[i], 'm_glass') and not scoring_hand[i].debuff and pseudorandom('glass') < G.GAME.probabilities.normal/scoring_hand[i].ability.extra then"
position = "at" position = "at"
payload = "if ((scoring_hand[i].ability.name == 'Glass Card' and not scoring_hand[i].debuff and pseudorandom('glass') < G.GAME.probabilities.normal/scoring_hand[i].ability.extra) or (G.GAME.modifiers.cry_shatter_rate and pseudorandom('cry_shatter') < 1/G.GAME.modifiers.cry_shatter_rate)) and not scoring_hand[i].ability.eternal then" payload = "if ((SMODS.has_enhancement(scoring_hand[i], 'm_glass') and not scoring_hand[i].debuff and pseudorandom('glass') < G.GAME.probabilities.normal/scoring_hand[i].ability.extra) or (G.GAME.modifiers.cry_shatter_rate and pseudorandom('cry_shatter') < 1/G.GAME.modifiers.cry_shatter_rate)) and not scoring_hand[i].ability.eternal then"
match_indent = true match_indent = true

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# ok it seems i still have to use the dumb fix for pinned, smods please overwrite # ok it seems i still have to use the dumb fix for pinned, smods please overwrite
[[patches]] [[patches]]
@ -310,3 +310,14 @@ payload = '''
if self.ability.rental and (not (self.ability.set == "Planet" and #find_joker('Astronomer') > 0) and self.ability.set ~= "Booster") then self.cost = 1 end if self.ability.rental and (not (self.ability.set == "Planet" and #find_joker('Astronomer') > 0) and self.ability.set ~= "Booster") then self.cost = 1 end
''' '''
match_indent = true match_indent = true
# hmm
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = "if self.ability.eternal then badges[#badges + 1] = 'eternal' end"
position = "at"
payload = '''
if self.ability.eternal and not self.ability.cry_absolute then badges[#badges + 1] = 'eternal' end
'''
match_indent = true

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Level up modifier # Level up modifier
[[patches]] [[patches]]

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 0 priority = -1
# Remove voucher at start of run (also for Crimson Stake) # Remove voucher at start of run (also for Crimson Stake)
[[patches]] [[patches]]

134
Cryptid/lovely/Voucher.toml Normal file
View file

@ -0,0 +1,134 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
# first we need to fix what on earth is going on with card.shop_voucher
# for some reason it's not saved/loaded so... that's what's gonna happen
# also adding another variable here that will be useful later
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''ability = self.ability,'''
position = "before"
payload = '''
shop_voucher = self.shop_voucher,
shop_cry_bonusvoucher = self.shop_cry_bonusvoucher,
'''
match_indent = true
# water is wet
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''self.ability = cardTable.ability'''
position = "before"
payload = '''
self.shop_voucher = cardTable.shop_voucher
self.shop_cry_bonusvoucher = cardTable.shop_cry_bonusvoucher
'''
match_indent = true
# get rid of this dumb hackfix in :redeem()
# also track vouchers redeemed
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = '''G.GAME.current_round.voucher = nil'''
position = "at"
payload = '''
-- G.GAME.current_round.voucher = nil
if self.shop_cry_bonusvoucher then G.GAME.cry_bonusvouchersused[self.shop_cry_bonusvoucher] = true end
'''
match_indent = true
# create the table
[[patches]]
[patches.pattern]
target = "game.lua"
pattern = '''used_packs = {},'''
position = "after"
payload = '''
cry_bonusvouchers = {},
cry_voucher_stickers = {eternal = false, perishable = false, rental = false, pinned = false, banana = false},
cry_voucher_edition = {},
'''
match_indent = true
# initialise the other helpful variables
[[patches]]
[patches.pattern]
target = "game.lua"
pattern = '''ecto_minus = 1,'''
position = "after"
payload = '''
cry_bonusvouchercount = 0,
cry_bonusvouchersused = {},
voucher_edition_index = {},
voucher_sticker_index = {eternal = {}, perishable = {}, rental = {}, pinned = {}, banana = {}}, -- might as well
'''
match_indent = true
# populate the table with keys
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = '''G.GAME.current_round.voucher = get_next_voucher_key()'''
position = "after"
payload = '''
G.GAME.current_round.cry_bonusvouchers = {}
G.GAME.cry_bonusvouchersused = {} -- i'm not sure why i'm putting these in two separate tables but it doesn't matter much
for i = 1, G.GAME.cry_bonusvouchercount do
G.GAME.current_round.cry_bonusvouchers[i] = get_next_voucher_key()
end
'''
match_indent = true
# fire is hot
[[patches]]
[patches.pattern]
target = "game.lua"
pattern = '''self.GAME.current_round.voucher = G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_voucher or get_next_voucher_key()'''
position = "after"
payload = '''
for i = 1, self.GAME.cry_bonusvouchercount do
self.GAME.current_round.cry_bonusvouchers[i] = get_next_voucher_key()
end
'''
match_indent = true
# add the vouchers to the shop. couldn't be more simple
# use a simple regex to snipe the correct position
[[patches]]
[patches.regex]
target = "game.lua"
pattern = '''end\n\s+G\.shop_vouchers\:emplace\(card\)\n\s+end'''
position = "after"
payload = '''
for i = 1, #G.GAME.current_round.cry_bonusvouchers do
if not G.GAME.cry_bonusvouchersused[i] then
local card = Card(G.shop_vouchers.T.x + G.shop_vouchers.T.w/2,
G.shop_vouchers.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[G.GAME.current_round.cry_bonusvouchers[i]],{bypass_discovery_center = true, bypass_discovery_ui = true})
card.shop_cry_bonusvoucher = i
cry_misprintize(card)
if G.GAME.events.ev_cry_choco2 then
card.misprint_cost_fac = (card.misprint_cost_fac or 1) * 2
card:set_cost()
end
if G.GAME.modifiers.cry_enable_flipped_in_shop and pseudorandom('cry_flip_vouch'..G.GAME.round_resets.ante) > 0.7 then
card.cry_flipped = true
end
create_shop_card_ui(card, 'Voucher', G.shop_vouchers)
card:start_materialize()
if G.GAME.current_round.cry_voucher_edition then -- eh why not
card:set_edition(G.GAME.current_round.cry_voucher_edition, true, true)
end
G.shop_vouchers.config.card_limit = G.shop_vouchers.config.card_limit + 1 -- does this actually matter/even get reset??? i'm confused but whatever
G.shop_vouchers:emplace(card)
end
end
'''
match_indent = true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 978 B

View file

@ -1,495 +0,0 @@
--[[
Copyright 2020 megagrump@pm.me
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
]]--
-- module("nativefs", package.seeall)
local ffi, bit = require('ffi'), require('bit')
local C = ffi.C
local fopen, getcwd, chdir, unlink, mkdir, rmdir
local BUFFERMODE, MODEMAP
local ByteArray = ffi.typeof('unsigned char[?]')
local function _ptr(p) return p ~= nil and p or nil end -- NULL pointer to nil
local File = {
getBuffer = function(self) return self._bufferMode, self._bufferSize end,
getFilename = function(self) return self._name end,
getMode = function(self) return self._mode end,
isOpen = function(self) return self._mode ~= 'c' and self._handle ~= nil end,
}
function File:open(mode)
if self._mode ~= 'c' then return false, "File " .. self._name .. " is already open" end
if not MODEMAP[mode] then return false, "Invalid open mode for " .. self._name .. ": " .. mode end
local handle = _ptr(fopen(self._name, MODEMAP[mode]))
if not handle then return false, "Could not open " .. self._name .. " in mode " .. mode end
self._handle, self._mode = ffi.gc(handle, C.fclose), mode
self:setBuffer(self._bufferMode, self._bufferSize)
return true
end
function File:close()
if self._mode == 'c' then return false, "File is not open" end
C.fclose(ffi.gc(self._handle, nil))
self._handle, self._mode = nil, 'c'
return true
end
function File:setBuffer(mode, size)
local bufferMode = BUFFERMODE[mode]
if not bufferMode then
return false, "Invalid buffer mode " .. mode .. " (expected 'none', 'full', or 'line')"
end
if mode == 'none' then
size = math.max(0, size or 0)
else
size = math.max(2, size or 2) -- Windows requires buffer to be at least 2 bytes
end
local success = self._mode == 'c' or C.setvbuf(self._handle, nil, bufferMode, size) == 0
if not success then
self._bufferMode, self._bufferSize = 'none', 0
return false, "Could not set buffer mode"
end
self._bufferMode, self._bufferSize = mode, size
return true
end
function File:getSize()
-- NOTE: The correct way to do this would be a stat() call, which requires a
-- lot more (system-specific) code. This is a shortcut that requires the file
-- to be readable.
local mustOpen = not self:isOpen()
if mustOpen and not self:open('r') then return 0 end
local pos = mustOpen and 0 or self:tell()
C.fseek(self._handle, 0, 2)
local size = self:tell()
if mustOpen then
self:close()
else
self:seek(pos)
end
return size
end
function File:read(containerOrBytes, bytes)
if self._mode ~= 'r' then return nil, 0 end
local container = bytes ~= nil and containerOrBytes or 'string'
if container ~= 'string' and container ~= 'data' then
error("Invalid container type: " .. container)
end
bytes = not bytes and containerOrBytes or 'all'
bytes = bytes == 'all' and self:getSize() - self:tell() or math.min(self:getSize() - self:tell(), bytes)
if bytes <= 0 then
local data = container == 'string' and '' or love.data.newFileData('', self._name)
return data, 0
end
local data = love.data.newByteData(bytes)
local r = tonumber(C.fread(data:getFFIPointer(), 1, bytes, self._handle))
if container == 'data' then
-- FileData from ByteData requires LÖVE 11.4+
local ok, fd = pcall(love.filesystem.newFileData, data, self._name)
if ok then return fd end
end
local str = data:getString()
data:release()
data = container == 'data' and love.filesystem.newFileData(str, self._name) or str
return data, r
end
local function lines(file, autoclose)
local BUFFERSIZE = 4096
local buffer, bufferPos = ByteArray(BUFFERSIZE), 0
local bytesRead = tonumber(C.fread(buffer, 1, BUFFERSIZE, file._handle))
local offset = file:tell()
return function()
file:seek(offset)
local line = {}
while bytesRead > 0 do
for i = bufferPos, bytesRead - 1 do
if buffer[i] == 10 then -- end of line
bufferPos = i + 1
return table.concat(line)
end
if buffer[i] ~= 13 then -- ignore CR
table.insert(line, string.char(buffer[i]))
end
end
bytesRead = tonumber(C.fread(buffer, 1, BUFFERSIZE, file._handle))
offset, bufferPos = offset + bytesRead, 0
end
if not line[1] then
if autoclose then file:close() end
return nil
end
return table.concat(line)
end
end
function File:lines()
if self._mode ~= 'r' then error("File is not opened for reading") end
return lines(self)
end
function File:write(data, size)
if self._mode ~= 'w' and self._mode ~= 'a' then
return false, "File " .. self._name .. " not opened for writing"
end
local toWrite, writeSize
if type(data) == 'string' then
writeSize = (size == nil or size == 'all') and #data or size
toWrite = data
else
writeSize = (size == nil or size == 'all') and data:getSize() or size
toWrite = data:getFFIPointer()
end
if tonumber(C.fwrite(toWrite, 1, writeSize, self._handle)) ~= writeSize then
return false, "Could not write data"
end
return true
end
function File:seek(pos)
return self._handle and C.fseek(self._handle, pos, 0) == 0
end
function File:tell()
if not self._handle then return nil, "Invalid position" end
return tonumber(C.ftell(self._handle))
end
function File:flush()
if self._mode ~= 'w' and self._mode ~= 'a' then
return nil, "File is not opened for writing"
end
return C.fflush(self._handle) == 0
end
function File:isEOF()
return not self:isOpen() or C.feof(self._handle) ~= 0 or self:tell() == self:getSize()
end
function File:release()
if self._mode ~= 'c' then self:close() end
self._handle = nil
end
function File:type() return 'File' end
function File:typeOf(t) return t == 'File' end
File.__index = File
-----------------------------------------------------------------------------
local nativefs = {}
local loveC = ffi.os == 'Windows' and ffi.load('love') or C
function nativefs.newFile(name)
if type(name) ~= 'string' then
error("bad argument #1 to 'newFile' (string expected, got " .. type(name) .. ")")
end
return setmetatable({
_name = name,
_mode = 'c',
_handle = nil,
_bufferSize = 0,
_bufferMode = 'none'
}, File)
end
function nativefs.newFileData(filepath)
local f = nativefs.newFile(filepath)
local ok, err = f:open('r')
if not ok then return nil, err end
local data, err = f:read('data', 'all')
f:close()
return data, err
end
function nativefs.mount(archive, mountPoint, appendToPath)
return loveC.PHYSFS_mount(archive, mountPoint, appendToPath and 1 or 0) ~= 0
end
function nativefs.unmount(archive)
return loveC.PHYSFS_unmount(archive) ~= 0
end
function nativefs.read(containerOrName, nameOrSize, sizeOrNil)
local container, name, size
if sizeOrNil then
container, name, size = containerOrName, nameOrSize, sizeOrNil
elseif not nameOrSize then
container, name, size = 'string', containerOrName, 'all'
else
if type(nameOrSize) == 'number' or nameOrSize == 'all' then
container, name, size = 'string', containerOrName, nameOrSize
else
container, name, size = containerOrName, nameOrSize, 'all'
end
end
local file = nativefs.newFile(name)
local ok, err = file:open('r')
if not ok then return nil, err end
local data, size = file:read(container, size)
file:close()
return data, size
end
local function writeFile(mode, name, data, size)
local file = nativefs.newFile(name)
local ok, err = file:open(mode)
if not ok then return nil, err end
ok, err = file:write(data, size or 'all')
file:close()
return ok, err
end
function nativefs.write(name, data, size)
return writeFile('w', name, data, size)
end
function nativefs.append(name, data, size)
return writeFile('a', name, data, size)
end
function nativefs.lines(name)
local f = nativefs.newFile(name)
local ok, err = f:open('r')
if not ok then return nil, err end
return lines(f, true)
end
function nativefs.load(name)
local chunk, err = nativefs.read(name)
if not chunk then return nil, err end
return loadstring(chunk, name)
end
function nativefs.getWorkingDirectory()
return getcwd()
end
function nativefs.setWorkingDirectory(path)
if not chdir(path) then return false, "Could not set working directory" end
return true
end
function nativefs.getDriveList()
if ffi.os ~= 'Windows' then return { '/' } end
local drives, bits = {}, C.GetLogicalDrives()
for i = 0, 25 do
if bit.band(bits, 2 ^ i) > 0 then
table.insert(drives, string.char(65 + i) .. ':/')
end
end
return drives
end
function nativefs.createDirectory(path)
local current = path:sub(1, 1) == '/' and '/' or ''
for dir in path:gmatch('[^/\\]+') do
current = current .. dir .. '/'
local info = nativefs.getInfo(current, 'directory')
if not info and not mkdir(current) then return false, "Could not create directory " .. current end
end
return true
end
function nativefs.remove(name)
local info = nativefs.getInfo(name)
if not info then return false, "Could not remove " .. name end
if info.type == 'directory' then
if not rmdir(name) then return false, "Could not remove directory " .. name end
return true
end
if not unlink(name) then return false, "Could not remove file " .. name end
return true
end
local function withTempMount(dir, fn, ...)
local mountPoint = _ptr(loveC.PHYSFS_getMountPoint(dir))
if mountPoint then return fn(ffi.string(mountPoint), ...) end
if not nativefs.mount(dir, '__nativefs__temp__') then return false, "Could not mount " .. dir end
local a, b = fn('__nativefs__temp__', ...)
nativefs.unmount(dir)
return a, b
end
function nativefs.getDirectoryItems(dir)
local result, err = withTempMount(dir, love.filesystem.getDirectoryItems)
return result or {}
end
local function getDirectoryItemsInfo(path, filtertype)
local items = {}
local files = love.filesystem.getDirectoryItems(path)
for i = 1, #files do
local filepath = string.format('%s/%s', path, files[i])
local info = love.filesystem.getInfo(filepath, filtertype)
if info then
info.name = files[i]
table.insert(items, info)
end
end
return items
end
function nativefs.getDirectoryItemsInfo(path, filtertype)
local result, err = withTempMount(path, getDirectoryItemsInfo, filtertype)
return result or {}
end
local function getInfo(path, file, filtertype)
local filepath = string.format('%s/%s', path, file)
return love.filesystem.getInfo(filepath, filtertype)
end
local function leaf(p)
p = p:gsub('\\', '/')
local last, a = p, 1
while a do
a = p:find('/', a + 1)
if a then
last = p:sub(a + 1)
end
end
return last
end
function nativefs.getInfo(path, filtertype)
local dir = path:match("(.*[\\/]).*$") or './'
local file = leaf(path)
local result, err = withTempMount(dir, getInfo, file, filtertype)
return result or nil
end
-----------------------------------------------------------------------------
MODEMAP = { r = 'rb', w = 'wb', a = 'ab' }
local MAX_PATH = 4096
ffi.cdef([[
int PHYSFS_mount(const char* dir, const char* mountPoint, int appendToPath);
int PHYSFS_unmount(const char* dir);
const char* PHYSFS_getMountPoint(const char* dir);
typedef struct FILE FILE;
FILE* fopen(const char* path, const char* mode);
size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream);
size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* stream);
int fclose(FILE* stream);
int fflush(FILE* stream);
size_t fseek(FILE* stream, size_t offset, int whence);
size_t ftell(FILE* stream);
int setvbuf(FILE* stream, char* buffer, int mode, size_t size);
int feof(FILE* stream);
]])
if ffi.os == 'Windows' then
ffi.cdef([[
int MultiByteToWideChar(unsigned int cp, uint32_t flags, const char* mb, int cmb, const wchar_t* wc, int cwc);
int WideCharToMultiByte(unsigned int cp, uint32_t flags, const wchar_t* wc, int cwc, const char* mb,
int cmb, const char* def, int* used);
int GetLogicalDrives(void);
int CreateDirectoryW(const wchar_t* path, void*);
int _wchdir(const wchar_t* path);
wchar_t* _wgetcwd(wchar_t* buffer, int maxlen);
FILE* _wfopen(const wchar_t* path, const wchar_t* mode);
int _wunlink(const wchar_t* path);
int _wrmdir(const wchar_t* path);
]])
BUFFERMODE = { full = 0, line = 64, none = 4 }
local function towidestring(str)
local size = C.MultiByteToWideChar(65001, 0, str, #str, nil, 0)
local buf = ffi.new('wchar_t[?]', size + 1)
C.MultiByteToWideChar(65001, 0, str, #str, buf, size)
return buf
end
local function toutf8string(wstr)
local size = C.WideCharToMultiByte(65001, 0, wstr, -1, nil, 0, nil, nil)
local buf = ffi.new('char[?]', size + 1)
C.WideCharToMultiByte(65001, 0, wstr, -1, buf, size, nil, nil)
return ffi.string(buf)
end
local nameBuffer = ffi.new('wchar_t[?]', MAX_PATH + 1)
fopen = function(path, mode) return C._wfopen(towidestring(path), towidestring(mode)) end
getcwd = function() return toutf8string(C._wgetcwd(nameBuffer, MAX_PATH)) end
chdir = function(path) return C._wchdir(towidestring(path)) == 0 end
unlink = function(path) return C._wunlink(towidestring(path)) == 0 end
mkdir = function(path) return C.CreateDirectoryW(towidestring(path), nil) ~= 0 end
rmdir = function(path) return C._wrmdir(towidestring(path)) == 0 end
else
BUFFERMODE = { full = 0, line = 1, none = 2 }
ffi.cdef([[
char* getcwd(char *buffer, int maxlen);
int chdir(const char* path);
int unlink(const char* path);
int mkdir(const char* path, int mode);
int rmdir(const char* path);
]])
local nameBuffer = ByteArray(MAX_PATH)
fopen = C.fopen
unlink = function(path) return ffi.C.unlink(path) == 0 end
chdir = function(path) return ffi.C.chdir(path) == 0 end
mkdir = function(path) return ffi.C.mkdir(path, 0x1ed) == 0 end
rmdir = function(path) return ffi.C.rmdir(path) == 0 end
getcwd = function()
local cwd = _ptr(C.getcwd(nameBuffer, MAX_PATH))
return cwd and ffi.string(cwd) or nil
end
end
return nativefs

View file

@ -1,47 +0,0 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
# Check all registered keybinds
# inserted inside Controller:key_press_update
[[patches]]
[patches.pattern]
target = 'engine/controller.lua'
pattern = "if not _RELEASE_MODE then"
position = "before"
payload = '''
for _, keybind in pairs(SMODS.Keybinds) do
if keybind.action and keybind.key_pressed == key then
local execute = true
for _, other_key in pairs(keybind.held_keys) do
if not self.held_keys[other_key] then
execute = false
break
end
end
if execute then
keybind.action(self)
end
end
end
'''
match_indent = true
overwrite = false
[[patches]]
[patches.regex]
target = 'engine/controller.lua'
pattern = 'if key == "r"'
position = 'at'
line_prepend = '$indent'
payload = '''
if key == 'm' then
if self.held_key_times[key] > 1.1 then
SMODS.save_all_config()
SMODS.restart_game()
else
self.held_key_times[key] = self.held_key_times[key] + dt
end
elseif key == "r"'''

View file

@ -1,359 +0,0 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
### Addition Tab
## Jokers tab
# create_UIBox_your_collection_jokers()
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = '''local joker_options = {}'''
position = "before"
payload = '''
local joker_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Joker)'''
match_indent = true
# create_UIBox_your_collection_jokers()
[[patches]]
[patches.regex]
target = 'functions/UI_definitions.lua'
pattern = '''(?<indent>[\t ]*)for i = 1, math\.ceil\(#G\.P_CENTER_POOLS\.Joker\/\(5\*#G\.your_collection\)\) do\n[\s\S]{4}table\.insert\(joker_options, localize\('k_page'\)..' '..tostring\(i\)..'\/'..tostring\(math\.ceil\(#G\.P_CENTER_POOLS\.Joker\/\(5\*#G\.your_collection\)\)\)\)'''
position = 'at'
payload = '''
for i = 1, math.ceil(#joker_pool/(5*#G.your_collection)) do
table.insert(joker_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#joker_pool/(5*#G.your_collection))))'''
line_prepend = '$indent'
# create_UIBox_your_collection_jokers()
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = '''local center = G.P_CENTER_POOLS["Joker"][i+(j-1)*5]'''
position = "at"
payload = '''
local center = joker_pool[i+(j-1)*5]
if not center then break end'''
match_indent = true
# create_UIBox_your_collection_jokers()
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = '''local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = {'''
position = "at"
payload = '''local t = create_UIBox_generic_options({ back_func = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id or 'your_collection', contents = {'''
match_indent = true
# G.FUNCS.your_collections_joker_page
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = '''for i = 1, 5 do'''
position = "before"
payload = '''
local joker_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Joker)
'''
match_indent = true
# G.FUNCS.your_collection_joker_page
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = '''local center = G.P_CENTER_POOLS["Joker"][i+(j-1)*5 + (5*#G.your_collection*(args.cycle_config.current_option - 1))]'''
position = "at"
payload = '''local center = joker_pool[i+(j-1)*5 + (5*#G.your_collection*(args.cycle_config.current_option - 1))]'''
match_indent = true
## Decks tab
# create_UIBox_your_collection_decks()
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = '''G.GAME.viewed_back = Back(G.P_CENTERS.b_red)'''
position = "at"
payload = '''
local deck_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Back)
G.GAME.viewed_back = Back(G.ACTIVE_MOD_UI and deck_pool[1] or G.P_CENTERS.b_red)'''
match_indent = true
# create_UIBox_your_collection_decks()
[[patches]]
[patches.regex]
target = 'functions/UI_definitions.lua'
pattern = '''(?<indent>[\t ]*)for k, v in ipairs\(G\.P_CENTER_POOLS\.Back\) do\n[\s\S]{4}ordered_names\[#ordered_names\+1\] = v\.name\n[\s\S]{2}end'''
position = 'at'
payload = '''
for k, v in ipairs(deck_pool) do
ordered_names[#ordered_names+1] = v.key
end'''
line_prepend = '$indent'
## Note: This covers Decks, Boosters, and Tags
# create_UIBox_your_collection_decks() and create_UIBox_your_collection_boosters() and create_UIBox_your_collection_tags()
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = '''local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = {'''
position = "at"
payload = '''local t = create_UIBox_generic_options({ back_func = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id or 'your_collection', contents = {'''
match_indent = true
# G.FUNCS.your_collection_deck_page
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = '''G.GAME.viewed_back:change_to(G.P_CENTER_POOLS.Back[args.to_key])'''
position = "at"
payload = '''
local deck_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Back)
G.GAME.viewed_back:change_to(deck_pool[args.to_key])'''
match_indent = true
## Boosters Page
# create_UIBox_your_collection_boosters()
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = '''local booster_options = {}'''
position = "before"
payload = '''
local booster_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Booster)'''
match_indent = true
# create_UIBox_your_collection_boosters()
[[patches]]
[patches.regex]
target = 'functions/UI_definitions.lua'
pattern = '''(?<indent>[\t ]*)for i = 1, math\.ceil\(#G\.P_CENTER_POOLS\.Booster\/8\) do\n[\s\S]{4}table\.insert\(booster_options, localize\('k_page'\)..' '..tostring\(i\)..'\/'..tostring\(math\.ceil\(#G\.P_CENTER_POOLS\.Booster\/8\)\)\)'''
position = 'at'
payload = '''
for i = 1, math.ceil(#booster_pool/8) do
table.insert(booster_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#booster_pool/8)))'''
line_prepend = '$indent'
# create_UIBox_your_collection_boosters()
[[patches]]
[patches.pattern]
target = 'functions/UI_definitions.lua'
pattern = '''local center = G.P_CENTER_POOLS["Booster"][i+(j-1)*4]'''
position = 'at'
payload = '''
local center = booster_pool[i+(j-1)*4]
if not center then break end'''
match_indent = true
# G.FUNCS.your_collection_booster_page
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = '''G.FUNCS.your_collection_booster_page = function(args)'''
position = "after"
payload = '''
local booster_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Booster)'''
match_indent = true
# G.FUNCS.your_collection_booster_page
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = '''local center = G.P_CENTER_POOLS["Booster"][i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))]'''
position = "at"
payload = '''local center = booster_pool[i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))]'''
match_indent = true
## Voucher Tabs
# create_UIBox_your_collection_vouchers()
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = '''local voucher_options = {}'''
position = "before"
payload = '''
local voucher_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Voucher)'''
match_indent = true
# create_UIBox_your_collection_vouchers()
[[patches]]
[patches.regex]
target = 'functions/UI_definitions.lua'
pattern = '''(?<indent>[\t ]*)for i = 1, math\.ceil\(#G\.P_CENTER_POOLS\.Voucher\/\(4\*#G\.your_collection\)\) do\n[\s\S]{4}table\.insert\(voucher_options, localize\('k_page'\)..' '..tostring\(i\)..'\/'..tostring\(math\.ceil\(#G\.P_CENTER_POOLS\.Voucher\/\(4\*#G\.your_collection\)\)\)\)'''
position = 'at'
payload = '''
for i = 1, math.ceil(#voucher_pool/(4*#G.your_collection)) do
table.insert(voucher_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#voucher_pool/(4*#G.your_collection))))'''
line_prepend = '$indent'
# create_UIBox_your_collection_boosters()
[[patches]]
[patches.pattern]
target = 'functions/UI_definitions.lua'
pattern = '''local center = G.P_CENTER_POOLS["Voucher"][i+(j-1)*4]'''
position = 'at'
payload = '''
local center = voucher_pool[i+(j-1)*4]
if not center then break end'''
match_indent = true
## Note: This covers Blinds and Vouchers
# create_UIBox_your_collection_vouchers() and create_UIBox_your_collection_blinds()
[[patches]]
[patches.pattern]
target = "functions/UI_definitions.lua"
pattern = '''local t = create_UIBox_generic_options({ back_func = exit or 'your_collection', contents = {'''
position = "at"
payload = '''local t = create_UIBox_generic_options({ back_func = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id or exit or 'your_collection', contents = {'''
match_indent = true
# G.FUNCS.your_collection_voucher_page
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = '''G.FUNCS.your_collection_voucher_page = function(args)'''
position = "after"
payload = '''
local voucher_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Voucher)'''
match_indent = true
# G.FUNCS.your_collection_voucher_page
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
pattern = '''local center = G.P_CENTER_POOLS["Voucher"][i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))]'''
position = "at"
payload = '''local center = voucher_pool[i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))]'''
match_indent = true
# create_UIBox_your_collection()
[[patches]]
[patches.regex]
target = 'functions/UI_definitions.lua'
pattern = '''(?<indent>[\t ]*)UIBox_button\(\{button = 'your_collection_blinds', label = \{localize\('b_blinds'\)\}, count = G\.DISCOVER_TALLIES\.blinds, minw = 5, minh = 2.0, id = 'your_collection_blinds', focus_args = \{snap_to = true\}\}\),'''
position = 'after'
payload = '''UIBox_button({button = 'your_collection_other_gameobjects', label = {localize('k_other')}, minw = 5, id = 'your_collection_other_gameobjects', focus_args = {snap_to = true}}),'''
# Fix UIElement.config.chosen being overriden if choice=true is set
# UIElement:click()
[[patches]]
[patches.pattern]
target = "engine/ui.lua"
match_indent = true
position = "after"
pattern = "if self.config.choice then"
payload = " local chosen_temp = self.config.chosen"
[[patches]]
[patches.pattern]
target = "engine/ui.lua"
match_indent = true
position = "at"
pattern = "self.config.chosen = true"
payload = "self.config.chosen = chosen_temp or true"
# Escape from mod menu saves config
# Needs to be before all checks
[[patches]]
[patches.pattern]
target = 'engine/controller.lua'
pattern = "function Controller:key_press_update(key, dt)"
position = "after"
payload = '''
if key == "escape" and G.ACTIVE_MOD_UI then
G.FUNCS.exit_mods()
end
'''
match_indent = true
[[patches]]
[patches.regex]
target = 'functions/UI_definitions.lua'
position = 'before'
line_prepend = '$indent'
pattern = '''
(?<indent>[\t ]*)return \{n=G\.UIT\.ROOT, config = \{align = 'cm', colour = G\.C\.CLEAR\}, nodes=\{
[\t ]*\{n=G\.UIT\.C,'''
payload = '''
local cols
if #info_boxes <= 3 then
cols = 1
elseif #info_boxes <= 10 then
cols = 2
elseif #info_boxes <= 24 then
cols = 3
else
cols = 4
end
local nodes_per_col = math.ceil(#info_boxes/cols)
local info_cols = {}
for i = 0, cols-1 do
local col = {}
for j = 1, nodes_per_col do
local info_box = info_boxes[i*nodes_per_col+j]
if info_box then
table.insert(col, info_box)
else break end
end
table.insert(info_cols, {n=G.UIT.C, config = {align="cm"}, nodes = col})
end
info_boxes = {{n=G.UIT.R, config = {align="cm", padding = 0.05, card_pos = card.T.x }, nodes = info_cols}}
'''
[[patches]]
[patches.pattern]
target = 'functions/button_callbacks.lua'
match_indent = true
position = 'at'
pattern = "config = {offset = {x=-0.03,y=0}, align = 'cl', parent = e}"
payload = """config = (not e.config.ref_table or not e.config.ref_table[1].config.card_pos or e.config.ref_table[1].config.card_pos > G.ROOM.T.w*0.4) and
{offset = {x=-0.03,y=0}, align = 'cl', parent = e} or
{offset = {x=0.03,y=0}, align = 'cr', parent = e}"""
[[patches]]
[patches.pattern]
target = 'tag.lua'
match_indent = true
position = 'at'
pattern = "_self.config.h_popup_config ={align = 'cl', offset = {x=-0.1,y=0},parent = _self}"
payload = """_self.config.h_popup_config = (_self.T.x > G.ROOM.T.w*0.4) and
{align = 'cl', offset = {x=-0.1,y=0},parent = _self} or
{align = 'cr', offset = {x=0.1,y=0},parent = _self}"""
# desc_from_rows
[[patches]]
[patches.regex]
target = 'functions/UI_definitions.lua'
position = 'at'
pattern = 'colour = empty and G\.C\.CLEAR or G\.C\.UI\.BACKGROUND_WHITE'
payload = 'colour = desc_nodes.background_colour or empty and G.C.CLEAR or G.C.UI.BACKGROUND_WHITE'
# info_tip_from_rows
[[patches]]
[patches.regex]
target = 'functions/UI_definitions.lua'
position = 'at'
pattern = 'padding = 0\.05, colour = G\.C\.WHITE\}'
payload = 'padding = 0.05, colour = desc_nodes.background_colour or G.C.WHITE}'
# localize
[[patches]]
[patches.regex]
target = 'functions/misc_functions.lua'
position = 'after'
pattern = '\(part\.control\.C and loc_colour\(part\.control\.C\)\)'
payload = ' or args.text_colour'
[[patches]]
[patches.regex]
target = 'functions/misc_functions.lua'
position = 'at'
pattern = 'loc_colour\(part\.control\.C or nil, args\.default_col\)'
payload = 'not part.control.C and args.text_colour or loc_colour(part.control.C or nil, args.default_col)'
[[patches]]
[patches.regex]
target = 'functions/misc_functions.lua'
position = 'after'
pattern = 'part\.control\.s and tonumber\(part\.control\.s\)'
payload = ' or args.scale '

View file

@ -1,32 +0,0 @@
SMODS.fetch_index = function()
SMODS.index = {}
local https = require"https"
local status, contents = https.request("https://github.com/Aurelius7309/Steamodded.index/archive/refs/heads/main.zip")
if status ~= 200 then return false end
love.filesystem.write('index.zip', contents)
if not love.filesystem.mount('index.zip', 'index') then return false end
local path = 'index/Steamodded.index-main/mods/'
for _, filename in ipairs(love.filesystem.getDirectoryItems(path)) do
local key, ext = filename:sub(1, -6), filename:sub(-5)
if ext:lower() == '.json' then
local success, data = pcall(function() return JSON.decode(love.filesystem.read(path..filename)) end)
if success and data.id == key then SMODS.index[key] = data end
end
end
love.filesystem.unmount('index.zip')
return true
end
SMODS.update_mod_files = function(id)
local mod = SMODS.Mods[id]
if not mod then return false end
local use_git = os.execute('git -v') == 0
if false and use_git and os.execute(('cd %s & git pull'):format(mod.path)) == 0 then
return true
end
local https = require"https"
local url = mod.github or (SMODS.index[id] or {}).github
local status, contents = https.request(url) -- TODO account for branches
local hash = contents:match('"currentOid":"([^"]*)"')
sendWarnMessage(hash, "Index")
end

File diff suppressed because it is too large Load diff

View file

@ -1 +0,0 @@
return "1.0.0~ALPHA-1220a-STEAMODDED"

View file

@ -1 +1 @@
return {["disable_anims"]=false,["score_opt_id"]=3,["break_infinity"]="omeganum",} return {["disable_anims"]=true,["score_opt_id"]=3,["break_infinity"]="omeganum",}

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = 'ceaf7d365cb8eac62c7dcf3be1ef07cc6b0dac3977bde52960496d7f844a668d' LOVELY_INTEGRITY = '2c00c26e55b0f21d108e0353b98757a950fc433f1f9951ac8a454c589450b12c'
--class --class
Blind = Moveable:extend() Blind = Moveable:extend()
@ -606,7 +606,7 @@ function Blind:debuff_hand(cards, hand, handname, check)
end end
if self.name == 'The Arm' then if self.name == 'The Arm' then
self.triggered = false self.triggered = false
if G.GAME.hands[handname].level > 1 then if to_big(G.GAME.hands[handname].level) > to_big(1) then
self.triggered = true self.triggered = true
if not check then if not check then
level_up_hand(self.children.animatedSprite, handname, nil, -1) level_up_hand(self.children.animatedSprite, handname, nil, -1)

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = 'af84d6c3467720a23ecaec33b0418eba5566291929fca3634893138f120ee811' LOVELY_INTEGRITY = 'b7b1bb9e3088ca71ed96c4b7bdaf1ec1c67106c37ba37b8f4aef385f8743a60b'
--class --class
Card = Moveable:extend() Card = Moveable:extend()
@ -4171,7 +4171,7 @@ function Card:calculate_joker(context)
} }
end end
if self.ability.name == 'Vagabond' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then if self.ability.name == 'Vagabond' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
if G.GAME.dollars <= self.ability.extra then if to_big(G.GAME.dollars) <= to_big(self.ability.extra) then
G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
trigger = 'before', trigger = 'before',
@ -4363,7 +4363,7 @@ function Card:calculate_joker(context)
colour = G.C.MULT colour = G.C.MULT
} }
end end
if self.ability.name == 'Bull' and (G.GAME.dollars + (G.GAME.dollar_buffer or 0)) > 0 then if self.ability.name == 'Bull' and to_big(G.GAME.dollars + (G.GAME.dollar_buffer or 0)) > to_big(0) then
return { return {
message = localize{type='variable',key='a_chips',vars={self.ability.extra*math.max(0,(G.GAME.dollars + (G.GAME.dollar_buffer or 0))) }}, message = localize{type='variable',key='a_chips',vars={self.ability.extra*math.max(0,(G.GAME.dollars + (G.GAME.dollar_buffer or 0))) }},
chip_mod = self.ability.extra*math.max(0,(G.GAME.dollars + (G.GAME.dollar_buffer or 0))), chip_mod = self.ability.extra*math.max(0,(G.GAME.dollars + (G.GAME.dollar_buffer or 0))),
@ -4473,7 +4473,7 @@ function Card:calculate_joker(context)
Xmult_mod = self.ability.extra.Xmult, Xmult_mod = self.ability.extra.Xmult,
} }
end end
if self.ability.name == 'Bootstraps' and math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars) >= 1 then if self.ability.name == 'Bootstraps' and to_big(math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars)) >= to_big(1) then
return { return {
message = localize{type='variable',key='a_mult',vars={self.ability.extra.mult*math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars)}}, message = localize{type='variable',key='a_mult',vars={self.ability.extra.mult*math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars)}},
mult_mod = self.ability.extra.mult*math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars) mult_mod = self.ability.extra.mult*math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0))/self.ability.extra.dollars)
@ -4795,7 +4795,6 @@ function Card:draw(layer)
self.hover_tilt = 1 self.hover_tilt = 1
if not self.states.visible then return end if not self.states.visible then return end
if self.VT.x < -3 or self.VT.x > G.TILE_W + 2.5 then return end
if (layer == 'shadow' or layer == 'both') then if (layer == 'shadow' or layer == 'both') then
self.ARGS.send_to_shader = self.ARGS.send_to_shader or {} self.ARGS.send_to_shader = self.ARGS.send_to_shader or {}

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = 'e8693aca875516bf9cb3c84fcb6f392131135da095f221f2ef0e6ac727b926df' LOVELY_INTEGRITY = '0825b896143c8e8c22c2c18adfc937960d407b986f1c18addc68bedde1768967'
--Class --Class
CardArea = Moveable:extend() CardArea = Moveable:extend()
@ -32,9 +32,6 @@ function CardArea:init(X, Y, W, H, config)
end end
function CardArea:emplace(card, location, stay_flipped) function CardArea:emplace(card, location, stay_flipped)
if self == G.jokers then
Cartomancer.handle_joker_added(card)
end
if card.edition and card.edition.card_limit and (self == G.hand) then if card.edition and card.edition.card_limit and (self == G.hand) then
self.config.real_card_limit = (self.config.real_card_limit or self.config.card_limit) + card.edition.card_limit self.config.real_card_limit = (self.config.real_card_limit or self.config.card_limit) + card.edition.card_limit
self.config.card_limit = math.max(0, self.config.real_card_limit) self.config.card_limit = math.max(0, self.config.real_card_limit)
@ -326,9 +323,6 @@ function CardArea:draw()
} }
end end
self.children.area_uibox:draw() self.children.area_uibox:draw()
if self == G.jokers then
Cartomancer.add_visibility_controls()
end
end end
self:draw_boundingrect() self:draw_boundingrect()
@ -431,39 +425,15 @@ function CardArea:align_cards()
end end
if (self == G.hand or self == G.deck or self == G.discard or self == G.play) and G.view_deck and G.view_deck[1] and G.view_deck[1].cards then return end if (self == G.hand or self == G.deck or self == G.discard or self == G.play) and G.view_deck and G.view_deck[1] and G.view_deck[1].cards then return end
if self.config.type == 'deck' then if self.config.type == 'deck' then
local display_limit
if not Cartomancer.SETTINGS.compact_deck_enabled then
display_limit = 999999
else
display_limit = Cartomancer.SETTINGS.compact_deck_visible_cards
end
local deck_height = (self.config.deck_height or 0.15)/52 local deck_height = (self.config.deck_height or 0.15)/52
local total_cards = #self.cards <= display_limit and #self.cards or display_limit -- limit height
local fixedX, fixedY, fixedR = nil, nil, nil
for k, card in ipairs(self.cards) do for k, card in ipairs(self.cards) do
if card.facing == 'front' then card:flip() end if card.facing == 'front' then card:flip() end
if not card.states.drag.is then if not card.states.drag.is then
if fixedX then card.T.x = self.T.x + 0.5*(self.T.w - card.T.w) + self.shadow_parrallax.x*deck_height*(#self.cards/(self == G.deck and 1 or 2) - k) + 0.9*self.shuffle_amt*(1 - k*0.01)*(k%2 == 1 and 1 or -0)
card.T.x = fixedX card.T.y = self.T.y + 0.5*(self.T.h - card.T.h) + self.shadow_parrallax.y*deck_height*(#self.cards/(self == G.deck and 1 or 2) - k)
card.T.y = fixedY card.T.r = 0 + 0.3*self.shuffle_amt*(1 + k*0.05)*(k%2 == 1 and 1 or -0)
card.T.r = fixedR -- rotation card.T.x = card.T.x + card.shadow_parrallax.x/30
card.states.visible = false
else
card.T.x = self.T.x + 0.5*(self.T.w - card.T.w) + self.shadow_parrallax.x*deck_height*(total_cards/(self == G.deck and 1 or 2) - k) + 0.9*self.shuffle_amt*(1 - k*0.01)*(k%2 == 1 and 1 or -0)
card.T.y = self.T.y + 0.5*(self.T.h - card.T.h) + self.shadow_parrallax.y*deck_height*(total_cards/(self == G.deck and 1 or 2) - k)
card.T.r = 0 + 0.3*self.shuffle_amt*(1 + k*0.05)*(k%2 == 1 and 1 or -0)
card.T.x = card.T.x + card.shadow_parrallax.x/30
card.states.visible = true
if k >= display_limit then
fixedX = card.T.x
fixedY = card.T.y
fixedR = card.T.r
end
end
end end
end end
end end
@ -551,18 +521,7 @@ function CardArea:align_cards()
end end
table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end) table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end)
end end
if self == G.jokers and G.jokers.cart_jokers_expanded then if self.config.type == 'joker' or self.config.type == 'title_2' then
local align_cards = Cartomancer.expand_G_jokers()
-- This should work fine without cryptid. But because cryptid's patch is priority=0, it has to be this way
if not G.GAME.modifiers.cry_conveyor then
table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end)
end
if align_cards then
G.jokers:hard_set_cards()
end
elseif self.config.type == 'joker' or self.config.type == 'title_2' then
for k, card in ipairs(self.cards) do for k, card in ipairs(self.cards) do
if not card.states.drag.is then if not card.states.drag.is then
card.T.r = 0.1*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*0.02*math.sin(2*G.TIMERS.REAL+card.T.x) card.T.r = 0.1*(-#self.cards/2 - 0.5 + k)/(#self.cards)+ (G.SETTINGS.reduced_motion and 0 or 1)*0.02*math.sin(2*G.TIMERS.REAL+card.T.x)
@ -653,9 +612,6 @@ function CardArea:draw_card_from(area, stay_flipped, discarded_only)
if area == G.discard then if area == G.discard then
card.T.r = 0 card.T.r = 0
end end
if self == G.hand and not card.states.visible then
card.states.visible = true
end
local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(self, card) local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(self, card)
if (self == G.hand) and G.GAME.modifiers.flipped_cards then if (self == G.hand) and G.GAME.modifiers.flipped_cards then
if pseudorandom(pseudoseed('flipped_card')) < 1/G.GAME.modifiers.flipped_cards then if pseudorandom(pseudoseed('flipped_card')) < 1/G.GAME.modifiers.flipped_cards then

View file

@ -1,13 +0,0 @@
LOVELY_INTEGRITY = 'cd11f803e89c48e476527cbfeec15ed491f002735c8b21fdbb0b2939cfd96518'
_RELEASE_MODE = false
_DEMO = false
function love.conf(t)
t.console = not _RELEASE_MODE
t.title = 'Balatro'
t.window.width = 0
t.window.height = 0
t.window.minwidth = 100
t.window.minheight = 100
end

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = 'd36e3953c2739cd4ea15794fb5e4031a2dac09fc33baadd0a2820e4726891304' LOVELY_INTEGRITY = 'd9e5d51702216f37d8d0de3c89deb8d1a47bcad6430594945df872f263a14c04'
---@class Controller ---@class Controller
Controller = Object:extend() Controller = Object:extend()
@ -768,12 +768,6 @@ function Controller:button_release_update(button, dt)
end end
function Controller:key_press_update(key, dt) function Controller:key_press_update(key, dt)
if key == "escape" and Cartomancer.INTERNAL_in_config then
Cartomancer.INTERNAL_in_config = false
if not Cartomancer.use_smods() then
Cartomancer.save_config()
end
end
if key == "escape" and G.ACTIVE_MOD_UI then if key == "escape" and G.ACTIVE_MOD_UI then
G.FUNCS.exit_mods() G.FUNCS.exit_mods()
end end
@ -828,7 +822,7 @@ function Controller:key_press_update(key, dt)
end end
end end
end end
if not _RELEASE_MODE and require("debugplus.core").isOkayToHandleDebugForKey(key) then if not _RELEASE_MODE then
if key == 'tab' and not G.debug_tools then if key == 'tab' and not G.debug_tools then
G.debug_tools = UIBox{ G.debug_tools = UIBox{
definition = create_UIBox_debug_tools(), definition = create_UIBox_debug_tools(),
@ -859,8 +853,6 @@ function Controller:key_press_update(key, dt)
add_joker(_card.config.center.key) add_joker(_card.config.center.key)
_card:set_sprites(_card.config.center) _card:set_sprites(_card.config.center)
end end
local debugplus = require("debugplus.core")
debugplus.handleSpawn(self, _card)
if _card.ability.consumeable and G.consumeables and #G.consumeables.cards < G.consumeables.config.card_limit then if _card.ability.consumeable and G.consumeables and #G.consumeables.cards < G.consumeables.config.card_limit then
add_joker(_card.config.center.key) add_joker(_card.config.center.key)
_card:set_sprites(_card.config.center) _card:set_sprites(_card.config.center)
@ -912,17 +904,13 @@ function Controller:key_press_update(key, dt)
if key == "space" then if key == "space" then
live_test() live_test()
end end
local debugplus = require("debugplus.core")
debugplus.handleKeys(self, key, dt)
if key == 'v' then if key == 'v' then
if not G.prof then G.prof = require "engine/profile"; G.prof.start() if not G.prof then G.prof = require "engine/profile"; G.prof.start()
else G.prof:stop(); else G.prof:stop();
print(G.prof.report()); G.prof = nil end print(G.prof.report()); G.prof = nil end
debugplus.profileMessage()
end end
if key == "p" then if key == "p" then
G.SETTINGS.perf_mode = not G.SETTINGS.perf_mode G.SETTINGS.perf_mode = not G.SETTINGS.perf_mode
debugplus.togglePerfUI()
end end
end end
end end

View file

@ -0,0 +1,102 @@
LOVELY_INTEGRITY = 'a0a6222d417538f9ac51e6de9e5324e3e68a85bbdc35ead9c5c98bc11cb475e4'
require "love.system"
if (love.system.getOS() == 'OS X' ) and (jit.arch == 'arm64' or jit.arch == 'arm') then jit.off() end
require "love.timer"
require "love.thread"
require 'love.filesystem'
require "engine/object"
require "engine/string_packer"
--vars needed for sound manager thread
CHANNEL = love.thread.getChannel("save_request")
function tal_compress_and_save(_file, _data, talisman)
local save_string = type(_data) == 'table' and STR_PACK(_data) or _data
local fallback_save = STR_PACK({GAME = {won = true}}) --just bare minimum to not crash, maybe eventually display some info?
if talisman == 'bignumber' then
fallback_save = "if not BigMeta then " .. fallback_save
elseif talisman == 'omeganum' then
fallback_save = "if not OmegaMeta then " .. fallback_save
else
fallback_save = "if BigMeta or OmegaMeta then " .. fallback_save
end
fallback_save = fallback_save .. " end"
save_string = fallback_save .. " " .. save_string
save_string = love.data.compress('string', 'deflate', save_string, 1)
love.filesystem.write(_file,save_string)
end
while true do
--Monitor the channel for any new requests
local request = CHANNEL:demand() -- Value from channel
if request then
if request.type == 'kill' then return end
--Saves progress for settings, unlocks, alerts and discoveries
if request.type == 'save_progress' then
local prefix_profile = (request.save_progress.SETTINGS.profile or 1)..''
if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end
prefix_profile = prefix_profile..'/'
if not love.filesystem.getInfo(prefix_profile..'meta.jkr') then
love.filesystem.append( prefix_profile..'meta.jkr', 'return {}' )
end
local meta = STR_UNPACK(get_compressed(prefix_profile..'meta.jkr') or 'return {}')
meta.unlocked = meta.unlocked or {}
meta.discovered = meta.discovered or {}
meta.alerted = meta.alerted or {}
local _append = false
for k, v in pairs(request.save_progress.UDA) do
if string.find(v, 'u') and not meta.unlocked[k] then
meta.unlocked[k] = true
_append = true
end
if string.find(v, 'd') and not meta.discovered[k] then
meta.discovered[k] = true
_append = true
end
if string.find(v, 'a') and not meta.alerted[k] then
meta.alerted[k] = true
_append = true
end
end
if _append then compress_and_save( prefix_profile..'meta.jkr', STR_PACK(meta)) end
compress_and_save('settings.jkr', request.save_progress.SETTINGS)
compress_and_save(prefix_profile..'profile.jkr', request.save_progress.PROFILE)
CHANNEL:push('done')
--Saves the settings file
elseif request.type == 'save_settings' then
compress_and_save('settings.jkr', request.save_settings)
compress_and_save(request.profile_num..'/profile.jkr', request.save_profile)
--Saves the metrics file
elseif request.type == 'save_metrics' then
compress_and_save('metrics.jkr', request.save_metrics)
--Saves any notifications
elseif request.type == 'save_notify' then
local prefix_profile = (request.profile_num or 1)..''
if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end
prefix_profile = prefix_profile..'/'
if not love.filesystem.getInfo(prefix_profile..'unlock_notify.jkr') then love.filesystem.append( prefix_profile..'unlock_notify.jkr', '') end
local unlock_notify = get_compressed(prefix_profile..'unlock_notify.jkr') or ''
if request.save_notify and not string.find(unlock_notify, request.save_notify) then
compress_and_save( prefix_profile..'unlock_notify.jkr', unlock_notify..request.save_notify..'\n')
end
--Saves the run
elseif request.type == 'save_run' then
local prefix_profile = (request.profile_num or 1)..''
if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end
prefix_profile = prefix_profile..'/'
tal_compress_and_save(prefix_profile..'save.jkr', request.save_table, request.talisman)
end
end
end

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = '435a9e8ef1b3d548ef4488606196332b7d61c0a33e2dd2225ca6c7f97e3ec32b' LOVELY_INTEGRITY = 'ed73ce7b68b17bbbc04af6cf80e1577d8c38357ce87c6952cf5f2319cb9a578d'
--Class --Class
UIBox = Moveable:extend() UIBox = Moveable:extend()
@ -990,7 +990,6 @@ function UIElement:click()
G.NO_MOD_CURSOR_STACK = nil G.NO_MOD_CURSOR_STACK = nil
if self.config.choice then if self.config.choice then
local chosen_temp = self.config.chosen
local chosen_temp = self.config.chosen local chosen_temp = self.config.chosen
local choices = self.UIBox:get_group(nil, self.config.group) local choices = self.UIBox:get_group(nil, self.config.group)
for k, v in pairs(choices) do for k, v in pairs(choices) do

View file

@ -1,12 +1,10 @@
LOVELY_INTEGRITY = '6732b4a403b7b8feb5e2decf7325ea96cac23686fd99e992f1aa1c26a7881bbe' LOVELY_INTEGRITY = 'c4606c194e720d427e9e0e1b2181bd1cd60d72f540c2377514fa195a2271958b'
--Create a global UIDEF that contains all UI definition functions\ --Create a global UIDEF that contains all UI definition functions\
--As a rule, these contain functions that return a table T representing the definition for a UIBox --As a rule, these contain functions that return a table T representing the definition for a UIBox
G.UIDEF = {} G.UIDEF = {}
function create_UIBox_debug_tools() function create_UIBox_debug_tools()
local debugplus = require("debugplus.core")
debugplus.registerButtons()
G.debug_tool_config = G.debug_tool_config or {} G.debug_tool_config = G.debug_tool_config or {}
G.FUNCS.DT_add_money = function() if G.STAGE == G.STAGES.RUN then ease_dollars(10) end end G.FUNCS.DT_add_money = function() if G.STAGE == G.STAGES.RUN then ease_dollars(10) end end
G.FUNCS.DT_add_round = function() if G.STAGE == G.STAGES.RUN then ease_round(1) end end G.FUNCS.DT_add_round = function() if G.STAGE == G.STAGES.RUN then ease_round(1) end end
@ -96,40 +94,7 @@ debugplus.registerButtons()
{n=G.UIT.T, config={text = "Hover over any Joker/Playing card", scale = 0.25, colour = G.C.WHITE, shadow = true}} {n=G.UIT.T, config={text = "Hover over any Joker/Playing card", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}}, }},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "hold [" .. require("debugplus.util").ctrlText .. "] (togglable in config)", scale = 0.25, colour = G.C.WHITE, shadow = true}} {n=G.UIT.T, config={text = "and press [Q] to cycle Edition", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "and press [Q] to cycle Edition", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "press [W] to cycle Enhancement", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "press [E] to cycle Seal", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "press [A/S/D] to toggle Eternal/Perishable/Rental", scale = 0.2, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "press [F] to toggle Coupon (make free)", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "press [R/C] to destroy/copy card", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "press [M] to reload atlases", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "press [UP/DOWN] to cycle rank", scale = 0.2, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.00}, nodes={
{n=G.UIT.T, config={text = "press [RIGHT/LEFT] to cycle suit", scale = 0.2, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "press [z] plus [1-3] to save a save state", scale = 0.2, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.00}, nodes={
{n=G.UIT.T, config={text = "press [x] plus [1-3] to load a save state", scale = 0.2, colour = G.C.WHITE, shadow = true}}
}}, }},
}}, }},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
@ -161,8 +126,6 @@ debugplus.registerButtons()
UIBox_button{ label = {"+1 Discard"}, button = "DT_add_discard", minw = 1.7, minh = 0.4, scale = 0.35}, UIBox_button{ label = {"+1 Discard"}, button = "DT_add_discard", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Boss Reroll"}, button = "DT_reroll_boss", minw = 1.7, minh = 0.4, scale = 0.35}, UIBox_button{ label = {"Boss Reroll"}, button = "DT_reroll_boss", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Background"}, button = "DT_toggle_background", minw = 1.7, minh = 0.4, scale = 0.35}, UIBox_button{ label = {"Background"}, button = "DT_toggle_background", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Win Blind"}, button = "DT_win_blind", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Double Tag"}, button = "DT_double_tag", minw = 1.7, minh = 0.4, scale = 0.35},
}}, }},
{n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={
UIBox_button{ label = {"+10 chips"}, button = "DT_add_chips", minw = 1.7, minh = 0.4, scale = 0.35}, UIBox_button{ label = {"+10 chips"}, button = "DT_add_chips", minw = 1.7, minh = 0.4, scale = 0.35},
@ -556,7 +519,6 @@ function G.UIDEF.deck_preview(args)
end end
local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'} local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'}
local SUITS_SORTED = Cartomancer.tablecopy(SUITS)
local stones = nil local stones = nil
local rank_name_mapping = {'A','K','Q','J','10',9,8,7,6,5,4,3,2} local rank_name_mapping = {'A','K','Q','J','10',9,8,7,6,5,4,3,2}
@ -1048,7 +1010,6 @@ end
end end
function create_UIBox_buttons() function create_UIBox_buttons()
if G.hand and G.hand.cart_sorting == nil then G.hand.cart_sorting = true end
local text_scale = 0.45 local text_scale = 0.45
local button_height = 1.3 local button_height = 1.3
local play_button = {n=G.UIT.C, config={id = 'play_button', align = "tm", minw = 2.5, padding = 0.3, r = 0.1, hover = true, colour = G.C.BLUE, button = "play_cards_from_highlighted", one_press = true, shadow = true, func = 'can_play'}, nodes={ local play_button = {n=G.UIT.C, config={id = 'play_button', align = "tm", minw = 2.5, padding = 0.3, r = 0.1, hover = true, colour = G.C.BLUE, button = "play_cards_from_highlighted", one_press = true, shadow = true, func = 'can_play'}, nodes={
@ -1070,9 +1031,6 @@ end
{n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour =G.C.UI.TRANSPARENT_DARK, outline = 1.5, outline_colour = mix_colours(G.C.WHITE,G.C.JOKER_GREY, 0.7), line_emboss = 1}, nodes={ {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour =G.C.UI.TRANSPARENT_DARK, outline = 1.5, outline_colour = mix_colours(G.C.WHITE,G.C.JOKER_GREY, 0.7), line_emboss = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
Cartomancer.SETTINGS.improved_hand_sorting and
create_toggle{ col = true, label = localize('b_sort_hand'), label_scale = text_scale*0.8, scale = 0.30, w = 0, shadow = true, ref_table = G.hand, ref_value = 'cart_sorting', callback = function () G.FUNCS.cartomancer_sort_hand_off() end }
or
{n=G.UIT.T, config={text = localize('b_sort_hand'), scale = text_scale*0.8, colour = G.C.UI.TEXT_LIGHT}} {n=G.UIT.T, config={text = localize('b_sort_hand'), scale = text_scale*0.8, colour = G.C.UI.TEXT_LIGHT}}
}}, }},
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={ {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
@ -2027,11 +1985,11 @@ function create_slider(args)
local t = local t =
{n=G.UIT.C, config={align = "cm", minw = args.w, min_h = args.h, padding = 0.1, r = 0.1, colour = G.C.CLEAR, focus_args = {type = 'slider'}}, nodes={ {n=G.UIT.C, config={align = "cm", minw = args.w, min_h = args.h, padding = 0.1, r = 0.1, colour = G.C.CLEAR, focus_args = {type = 'slider'}}, nodes={
{n=G.UIT.C, config={align = "cl", minw = args.w, r = 0.1,min_h = args.h,collideable = true, hover = true, colour = G.C.BLACK,emboss = 0.05,func = 'slider', refresh_movement = true}, nodes={ {n=G.UIT.C, config={align = "cl", minw = args.w, r = 0.1,min_h = args.h,collideable = true, hover = true, colour = G.C.BLACK,emboss = 0.05,func = 'slider', refresh_movement = true}, nodes={
{n=G.UIT.B, config={id = args.id, w=startval,h=args.h, r = 0.1, colour = args.colour, ref_table = args, refresh_movement = true}}, {n=G.UIT.B, config={w=startval,h=args.h, r = 0.1, colour = args.colour, ref_table = args, refresh_movement = true}},
}}, }},
not args.hide_val and {n=G.UIT.C, config={align = "cm", minh = args.h,r = 0.1, minw = 0.8, colour = args.colour,shadow = true}, nodes={ {n=G.UIT.C, config={align = "cm", minh = args.h,r = 0.1, minw = 0.8, colour = args.colour,shadow = true}, nodes={
{n=G.UIT.T, config={ref_table = args, ref_value = 'text', scale = args.text_scale, colour = G.C.UI.TEXT_LIGHT, decimal_places = args.decimal_places}} {n=G.UIT.T, config={ref_table = args, ref_value = 'text', scale = args.text_scale, colour = G.C.UI.TEXT_LIGHT, decimal_places = args.decimal_places}}
}} or nil }},
}} }}
if args.label then if args.label then
t = {n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.1*args.label_scale, colour = G.C.CLEAR}, nodes={ t = {n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.1*args.label_scale, colour = G.C.CLEAR}, nodes={
@ -2437,21 +2395,6 @@ function create_UIBox_settings()
tab_definition_function_args = 'Audio' tab_definition_function_args = 'Audio'
} }
if not require("debugplus.config").SMODSLoaded then
tabs[#tabs+1] = {
label = "DebugPlus",
tab_definition_function = require("debugplus.config").fakeConfigTab,
}
end
local settings_icon = Cartomancer.add_settings_icon()
if settings_icon then
tabs[#tabs+1] = {
colour = G.C.MONEY,
custom_button = {settings_icon},
tab_definition_function = Cartomancer.config_tab,
tab_definition_function_args = ''
}
end
local t = create_UIBox_generic_options({back_func = 'options',contents = {create_tabs( local t = create_UIBox_generic_options({back_func = 'options',contents = {create_tabs(
{tabs = tabs, {tabs = tabs,
tab_h = 7.05, tab_h = 7.05,
@ -3252,8 +3195,8 @@ function create_UIBox_current_hand_row(handname, simple)
(not simple and (not simple and
{n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05, hover = true, force_focus = true, on_demand_tooltip = {text = localize(handname, 'poker_hand_descriptions'), filler = {func = create_UIBox_hand_tip, args = handname}}}, nodes={ {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05, hover = true, force_focus = true, on_demand_tooltip = {text = localize(handname, 'poker_hand_descriptions'), filler = {func = create_UIBox_hand_tip, args = handname}}}, nodes={
{n=G.UIT.C, config={align = "cl", padding = 0, minw = 5}, nodes={ {n=G.UIT.C, config={align = "cl", padding = 0, minw = 5}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.01, r = 0.1, colour = G.C.HAND_LEVELS[math.min(7, G.GAME.hands[handname].level)], minw = 1.5, outline = 0.8, outline_colour = G.C.WHITE}, nodes={ {n=G.UIT.C, config={align = "cm", padding = 0.01, r = 0.1, colour = G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands[handname].level)):to_number()], minw = 1.5, outline = 0.8, outline_colour = G.C.WHITE}, nodes={
{n=G.UIT.T, config={text = localize('k_level_prefix')..G.GAME.hands[handname].level, scale = 0.5, colour = G.C.UI.TEXT_DARK}} {n=G.UIT.T, config={text = localize('k_level_prefix')..number_format(G.GAME.hands[handname].level), scale = 0.5, colour = G.C.UI.TEXT_DARK}}
}}, }},
{n=G.UIT.C, config={align = "cm", minw = 4.5, maxw = 4.5}, nodes={ {n=G.UIT.C, config={align = "cm", minw = 4.5, maxw = 4.5}, nodes={
{n=G.UIT.T, config={text = ' '..localize(handname,'poker_hands'), scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}} {n=G.UIT.T, config={text = ' '..localize(handname,'poker_hands'), scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
@ -3452,59 +3395,37 @@ function G.UIDEF.view_deck(unplayed_only)
Diamonds = {}, Diamonds = {},
} }
local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'} local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'}
local SUITS_SORTED = Cartomancer.tablecopy(SUITS)
for k, v in ipairs(G.playing_cards) do for k, v in ipairs(G.playing_cards) do
local greyed table.insert(SUITS[v.base.suit], v)
if unplayed_only and not ((v.area and v.area == G.deck) or v.ability.wheel_flipped) then
greyed = true
end
local card_string = v:cart_to_string()
if greyed then
card_string = card_string .. "Greyed"
end
if greyed and Cartomancer.SETTINGS.deck_view_hide_drawn_cards then
-- Ignore this card.
elseif not SUITS[v.base.suit][card_string] then
table.insert(SUITS_SORTED[v.base.suit], card_string)
local _scale = 0.7
local copy = copy_card(v, nil, _scale)
copy.greyed = greyed
copy.stacked_quantity = 1
SUITS[v.base.suit][card_string] = copy
else
local stacked_card = SUITS[v.base.suit][card_string]
stacked_card.stacked_quantity = stacked_card.stacked_quantity + 1
end
end end
for j = 1, 4 do for j = 1, 4 do
if SUITS_SORTED[suit_map[j]][1] then if SUITS[suit_map[j]][1] then
local view_deck = CardArea( local view_deck = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
6.5*G.CARD_W, 6.5*G.CARD_W,
0.6*G.CARD_H, 0.6*G.CARD_H,
{card_limit = #SUITS_SORTED[suit_map[j]], type = 'title', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.7, draw_layers = {'card'}}) {card_limit = #SUITS[suit_map[j]], type = 'title', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.7, draw_layers = {'card'}})
table.insert(deck_tables, table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = view_deck}} {n=G.UIT.O, config={object = view_deck}}
}} }}
) )
for i = 1, #SUITS_SORTED[suit_map[j]] do for i = 1, #SUITS[suit_map[j]] do
local card_string = SUITS_SORTED[suit_map[j]][i] if SUITS[suit_map[j]][i] then
local card = SUITS[suit_map[j]][card_string] local greyed, _scale = nil, 0.7
if unplayed_only and not ((SUITS[suit_map[j]][i].area and SUITS[suit_map[j]][i].area == G.deck) or SUITS[suit_map[j]][i].ability.wheel_flipped) then
card.T.x = view_deck.T.x + view_deck.T.w/2 greyed = true
card.T.y = view_deck.T.y end
card:create_quantity_display() local copy = copy_card(SUITS[suit_map[j]][i],nil, _scale)
copy.greyed = greyed
card:hard_set_T() copy.T.x = view_deck.T.x + view_deck.T.w/2
view_deck:emplace(card) copy.T.y = view_deck.T.y
copy:hard_set_T()
view_deck:emplace(copy)
end
end end
end end
end end
@ -3618,7 +3539,6 @@ function G.UIDEF.view_deck(unplayed_only)
{n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables} {n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}
}}, }},
{n=G.UIT.R, config={align = "cm", minh = 0.8, padding = 0.05}, nodes={ {n=G.UIT.R, config={align = "cm", minh = 0.8, padding = 0.05}, nodes={
not unplayed_only and Cartomancer.add_unique_count() or nil,
modded and {n=G.UIT.R, config={align = "cm"}, nodes={ modded and {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7)}, nodes = {}}, {n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7)}, nodes = {}},
{n=G.UIT.T, config={text =' '..localize('ph_deck_preview_effective'),colour = G.C.WHITE, scale =0.3}}, {n=G.UIT.T, config={text =' '..localize('ph_deck_preview_effective'),colour = G.C.WHITE, scale =0.3}},
@ -4337,20 +4257,9 @@ function create_UIBox_your_collection_blinds(exit)
end) end)
})) }))
local min_ante = 1
local max_ante = 16
local spacing = 1 - 15*0.06
if G.GAME and G.GAME.round_resets and G.GAME.round_resets.ante then
local current_ante = G.GAME.round_resets.ante
if current_ante > 8 then
min_ante = current_ante - 8 + 1
max_ante = current_ante + 8
end
end
local ante_amounts = {} local ante_amounts = {}
for i = min_ante, max_ante do for i = 1, math.min(16, math.max(16, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt)) do
-- :3 local spacing = 1 - math.min(20, math.max(15, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt))*0.06
if spacing > 0 and i > 1 then if spacing > 0 and i > 1 then
ante_amounts[#ante_amounts+1] = {n=G.UIT.R, config={minh = spacing}, nodes={}} ante_amounts[#ante_amounts+1] = {n=G.UIT.R, config={minh = spacing}, nodes={}}
end end
@ -6455,13 +6364,6 @@ function UIBox_button(args)
local but_UI_label = {} local but_UI_label = {}
local button_pip = nil local button_pip = nil
if args.dynamic_label then
but_UI_label = {}
table.insert(but_UI_label, {n=G.UIT.R, config={align = "cm", padding = 0, minw = args.minw, maxw = args.maxw}, nodes={
{n=G.UIT.T, config={ref_table = args.dynamic_label, ref_value = 'text', scale = args.scale, colour = args.text_colour, shadow = args.shadow, focus_args = button_pip and args.focus_args or nil, func = button_pip,}}
}})
end
for k, v in ipairs(args.label) do for k, v in ipairs(args.label) do
if k == #args.label and args.focus_args and args.focus_args.set_button_pip then if k == #args.label and args.focus_args and args.focus_args.set_button_pip then
button_pip ='set_button_pip' button_pip ='set_button_pip'
@ -6486,7 +6388,7 @@ function UIBox_button(args)
padding = args.padding or 0, padding = args.padding or 0,
r = 0.1, r = 0.1,
hover = true, hover = true,
colour = args.ref_table and args.ref_table.colour or args.colour, -- Cartomancer colour = args.colour,
one_press = args.one_press, one_press = args.one_press,
button = (args.button ~= 'nil') and args.button or nil, button = (args.button ~= 'nil') and args.button or nil,
choice = args.choice, choice = args.choice,
@ -6500,6 +6402,6 @@ function UIBox_button(args)
ref_table = args.ref_table, ref_table = args.ref_table,
mid = args.mid mid = args.mid
}, nodes= }, nodes=
args.ref_table and args.ref_table.custom_button or but_UI_label -- Cartomancer but_UI_label
}}} }}}
end end

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = 'd7f48a66f05694a22b7aae4c15c27e443dc398089f32ae2891b595f051091e07' LOVELY_INTEGRITY = 'e36471bd79b456102440b1c69061665aed2f0a92e67cfd840d15eafe4e55be17'
--Moves the tutorial to the next step in queue --Moves the tutorial to the next step in queue
-- --
@ -55,7 +55,7 @@ end
---@param e {} ---@param e {}
--**e** Is the UIE that called this function --**e** Is the UIE that called this function
G.FUNCS.can_buy = function(e) G.FUNCS.can_buy = function(e)
if (e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at) and (e.config.ref_table.cost > 0) then if (to_big(e.config.ref_table.cost) > to_big(G.GAME.dollars) - to_big(G.GAME.bankrupt_at)) and (e.config.ref_table.cost > 0) then
e.config.colour = G.C.UI.BACKGROUND_INACTIVE e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil e.config.button = nil
else else
@ -77,7 +77,7 @@ end
---@param e {} ---@param e {}
--**e** Is the UIE that called this function --**e** Is the UIE that called this function
G.FUNCS.can_buy_and_use = function(e) G.FUNCS.can_buy_and_use = function(e)
if (((e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at) and (e.config.ref_table.cost > 0)) or (not e.config.ref_table:can_use_consumeable())) then if (((to_big(e.config.ref_table.cost) > to_big(G.GAME.dollars) - to_big(G.GAME.bankrupt_at)) and (e.config.ref_table.cost > 0)) or (not e.config.ref_table:can_use_consumeable())) then
e.UIBox.states.visible = false e.UIBox.states.visible = false
e.config.colour = G.C.UI.BACKGROUND_INACTIVE e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil e.config.button = nil
@ -96,7 +96,7 @@ end
---@param e {} ---@param e {}
--**e** Is the UIE that called this function --**e** Is the UIE that called this function
G.FUNCS.can_redeem = function(e) G.FUNCS.can_redeem = function(e)
if e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at then if to_big(e.config.ref_table.cost) > to_big(G.GAME.dollars) - to_big(G.GAME.bankrupt_at) then
e.config.colour = G.C.UI.BACKGROUND_INACTIVE e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil e.config.button = nil
else else
@ -111,7 +111,7 @@ end
---@param e {} ---@param e {}
--**e** Is the UIE that called this function --**e** Is the UIE that called this function
G.FUNCS.can_open = function(e) G.FUNCS.can_open = function(e)
if (e.config.ref_table.cost) > 0 and (e.config.ref_table.cost > G.GAME.dollars - G.GAME.bankrupt_at) then if (e.config.ref_table.cost) > 0 and (to_big(e.config.ref_table.cost) > to_big(G.GAME.dollars) - to_big(G.GAME.bankrupt_at)) then
e.config.colour = G.C.UI.BACKGROUND_INACTIVE e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil e.config.button = nil
else else
@ -2020,12 +2020,12 @@ G.FUNCS.flame_handler = function(e)
local exptime = math.exp(-0.4*G.real_dt) local exptime = math.exp(-0.4*G.real_dt)
if to_big(G.ARGS.score_intensity.earned_score) >= to_big(G.ARGS.score_intensity.required_score) and to_big(G.ARGS.score_intensity.required_score) > to_big(0) then if to_big(G.ARGS.score_intensity.earned_score) >= to_big(G.ARGS.score_intensity.required_score) and to_big(G.ARGS.score_intensity.required_score) > to_big(0) then
_F.intensity = ((G.pack_cards and not G.pack_cards.REMOVED) or (G.TAROT_INTERRUPT)) and 0 or Cartomancer.get_flames_intensity() _F.intensity = ((G.pack_cards and not G.pack_cards.REMOVED) or (G.TAROT_INTERRUPT)) and 0 or math.max(0., math.log(G.ARGS.score_intensity.earned_score, 5)-2)
else else
_F.intensity = 0 _F.intensity = 0
end end
_F.timer = Cartomancer.handle_flames_timer(_F.timer, _F.intensity) _F.timer = _F.timer + G.real_dt*(1 + _F.intensity*0.2)
if _F.intensity_vel < 0 then _F.intensity_vel = _F.intensity_vel*(1 - 10*G.real_dt) end if _F.intensity_vel < 0 then _F.intensity_vel = _F.intensity_vel*(1 - 10*G.real_dt) end
_F.intensity_vel = (1-exptime)*(_F.intensity - _F.real_intensity)*G.real_dt*25 + exptime*_F.intensity_vel _F.intensity_vel = (1-exptime)*(_F.intensity - _F.real_intensity)*G.real_dt*25 + exptime*_F.intensity_vel
_F.real_intensity = math.max(0, _F.real_intensity + _F.intensity_vel) _F.real_intensity = math.max(0, _F.real_intensity + _F.intensity_vel)
@ -2078,7 +2078,7 @@ end
end end
G.FUNCS.can_reroll = function(e) G.FUNCS.can_reroll = function(e)
if ((G.GAME.dollars-G.GAME.bankrupt_at) - G.GAME.current_round.reroll_cost < 0) and G.GAME.current_round.reroll_cost ~= 0 then if ((to_big(G.GAME.dollars)-to_big(G.GAME.bankrupt_at)) - to_big(G.GAME.current_round.reroll_cost) < to_big(0)) and G.GAME.current_round.reroll_cost ~= 0 then
e.config.colour = G.C.UI.BACKGROUND_INACTIVE e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil e.config.button = nil
--e.children[1].children[1].config.shadow = false --e.children[1].children[1].config.shadow = false

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = '2c8ce4c0bac30f3323a4c474be97cee2bdcdd76ecf06cecea0a240c944640f67' LOVELY_INTEGRITY = 'ab00e08d711a2c3f72976a640fd09ce67bc5a2fbcc3a1d480a50325ec883c75e'
function set_screen_positions() function set_screen_positions()
if G.STAGE == G.STAGES.RUN then if G.STAGE == G.STAGES.RUN then
@ -75,7 +75,7 @@ function ease_dollars(mod, instant)
mod = mod or 0 mod = mod or 0
local text = '+'..localize('$') local text = '+'..localize('$')
local col = G.C.MONEY local col = G.C.MONEY
if mod < 0 then if to_big(mod) < to_big(0) then
text = '-'..localize('$') text = '-'..localize('$')
col = G.C.RED col = G.C.RED
else else
@ -120,7 +120,7 @@ function ease_discard(mod, instant, silent)
mod = math.max(-G.GAME.current_round.discards_left, mod) mod = math.max(-G.GAME.current_round.discards_left, mod)
local text = '+' local text = '+'
local col = G.C.GREEN local col = G.C.GREEN
if mod < 0 then if to_big(mod) < to_big(0) then
text = '' text = ''
col = G.C.RED col = G.C.RED
end end
@ -159,7 +159,7 @@ function ease_hands_played(mod, instant)
mod = mod or 0 mod = mod or 0
local text = '+' local text = '+'
local col = G.C.GREEN local col = G.C.GREEN
if mod < 0 then if to_big(mod) < to_big(0) then
text = '' text = ''
col = G.C.RED col = G.C.RED
end end
@ -200,7 +200,7 @@ function ease_ante(mod)
mod = mod or 0 mod = mod or 0
local text = '+' local text = '+'
local col = G.C.IMPORTANT local col = G.C.IMPORTANT
if mod < 0 then if to_big(mod) < to_big(0) then
text = '-' text = '-'
col = G.C.RED col = G.C.RED
end end
@ -235,7 +235,7 @@ function ease_round(mod)
mod = mod or 0 mod = mod or 0
local text = '+' local text = '+'
local col = G.C.IMPORTANT local col = G.C.IMPORTANT
if mod < 0 then if to_big(mod) < to_big(0) then
text = '' text = ''
col = G.C.RED col = G.C.RED
end end
@ -405,9 +405,6 @@ function draw_card(from, to, percent, dir, sort, card, delay, mute, stay_flipped
if card then if card then
if from then card = from:remove_card(card) end if from then card = from:remove_card(card) end
if card then drawn = true end if card then drawn = true end
if card and to == G.hand and not card.states.visible then
card.states.visible = true
end
local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(to, card) local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(to, card)
if G.GAME.modifiers.flipped_cards and to == G.hand then if G.GAME.modifiers.flipped_cards and to == G.hand then
if pseudorandom(pseudoseed('flipped_card')) < 1/G.GAME.modifiers.flipped_cards then if pseudorandom(pseudoseed('flipped_card')) < 1/G.GAME.modifiers.flipped_cards then
@ -487,7 +484,7 @@ function level_up_hand(card, hand, instant, amount)
G.GAME.hands[hand].mult = math.max(G.GAME.hands[hand].mult * (universum_mod)^amount, 1) G.GAME.hands[hand].mult = math.max(G.GAME.hands[hand].mult * (universum_mod)^amount, 1)
G.GAME.hands[hand].chips = math.max(G.GAME.hands[hand].chips * (universum_mod)^amount, 1) G.GAME.hands[hand].chips = math.max(G.GAME.hands[hand].chips * (universum_mod)^amount, 1)
end end
if not instant then if not instant and not Talisman.config_file.disable_anims then
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function() G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2, func = function()
play_sound('tarot1') play_sound('tarot1')
if card and card.juice_up then card:juice_up(0.8, 0.5) end if card and card.juice_up then card:juice_up(0.8, 0.5) end
@ -577,8 +574,8 @@ function update_hand_text(config, vals)
G.GAME.current_round.current_hand.hand_level = vals.level G.GAME.current_round.current_hand.hand_level = vals.level
else else
G.GAME.current_round.current_hand.hand_level = ' '..localize('k_lvl')..tostring(vals.level) G.GAME.current_round.current_hand.hand_level = ' '..localize('k_lvl')..tostring(vals.level)
if type(vals.level) == 'number' then if is_number(vals.level) then
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[math.min(vals.level, 7)] G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[to_big(math.min(vals.level, 7)):to_number()]
else else
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[1] G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[1]
end end
@ -954,12 +951,12 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra)
sound = 'chips1' sound = 'chips1'
amt = amt amt = amt
colour = G.C.CHIPS colour = G.C.CHIPS
text = localize{type='variable',key='a_chips'..(amt<0 and '_minus' or ''),vars={math.abs(amt)}} text = localize{type='variable',key='a_chips'..(to_big(amt)<to_big(0) and '_minus' or ''),vars={math.abs(amt)}}
delay = 0.6 delay = 0.6
elseif eval_type == 'mult' then elseif eval_type == 'mult' then
sound = 'multhit1'--'other1' sound = 'multhit1'--'other1'
amt = amt amt = amt
text = localize{type='variable',key='a_mult'..(amt<0 and '_minus' or ''),vars={math.abs(amt)}} text = localize{type='variable',key='a_mult'..(to_big(amt)<to_big(0) and '_minus' or ''),vars={math.abs(amt)}}
colour = G.C.MULT colour = G.C.MULT
config.type = 'fade' config.type = 'fade'
config.scale = 0.7 config.scale = 0.7
@ -975,14 +972,14 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra)
sound = 'multhit2' sound = 'multhit2'
volume = 0.7 volume = 0.7
amt = amt amt = amt
text = localize{type='variable',key='a_xmult'..(amt<0 and '_minus' or ''),vars={math.abs(amt)}} text = localize{type='variable',key='a_xmult'..(to_big(amt)<to_big(0) and '_minus' or ''),vars={math.abs(amt)}}
colour = G.C.XMULT colour = G.C.XMULT
config.type = 'fade' config.type = 'fade'
config.scale = 0.7 config.scale = 0.7
elseif eval_type == 'h_mult' then elseif eval_type == 'h_mult' then
sound = 'multhit1' sound = 'multhit1'
amt = amt amt = amt
text = localize{type='variable',key='a_mult'..(amt<0 and '_minus' or ''),vars={math.abs(amt)}} text = localize{type='variable',key='a_mult'..(to_big(amt)<to_big(0) and '_minus' or ''),vars={math.abs(amt)}}
colour = G.C.MULT colour = G.C.MULT
config.type = 'fade' config.type = 'fade'
config.scale = 0.7 config.scale = 0.7
@ -1241,7 +1238,7 @@ function add_round_eval_row(config)
end end
})) }))
local dollar_row = 0 local dollar_row = 0
if num_dollars > 60 or num_dollars < -60 then num_dollars = to_number(num_dollars); if math.abs(to_number(num_dollars)) > 60 then
if num_dollars < 0 then --if negative if num_dollars < 0 then --if negative
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
trigger = 'before',delay = 0.38, trigger = 'before',delay = 0.38,
@ -1345,7 +1342,7 @@ function change_shop_size(mod)
if not G.GAME.shop then return end if not G.GAME.shop then return end
G.GAME.shop.joker_max = G.GAME.shop.joker_max + mod G.GAME.shop.joker_max = G.GAME.shop.joker_max + mod
if G.shop_jokers and G.shop_jokers.cards then if G.shop_jokers and G.shop_jokers.cards then
if mod < 0 then if to_big(mod) < to_big(0) then
--Remove jokers in shop --Remove jokers in shop
for i = #G.shop_jokers.cards, G.GAME.shop.joker_max+1, -1 do for i = #G.shop_jokers.cards, G.GAME.shop.joker_max+1, -1 do
if G.shop_jokers.cards[i] then if G.shop_jokers.cards[i] then
@ -1477,7 +1474,7 @@ function check_for_unlock(args)
end end
end end
if args.type == 'money' then if args.type == 'money' then
if G.GAME.dollars >= 400 then if to_big(G.GAME.dollars) >= to_big(400) then
unlock_achievement('nest_egg') unlock_achievement('nest_egg')
end end
end end
@ -1514,7 +1511,7 @@ function check_for_unlock(args)
end end
end end
if args.type == 'upgrade_hand' then if args.type == 'upgrade_hand' then
if args.level >= 10 then if to_big(args.level) >= to_big(10) then
unlock_achievement('retrograde') unlock_achievement('retrograde')
end end
end end
@ -1751,7 +1748,7 @@ function check_for_unlock(args)
end end
end end
if args.type == 'money' then if args.type == 'money' then
if card.unlock_condition.extra <= G.GAME.dollars then if to_big(card.unlock_condition.extra) <= to_big(G.GAME.dollars) then
ret = true ret = true
unlock_card(card) unlock_card(card)
end end
@ -3123,7 +3120,7 @@ function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, h
elseif _c.set == 'Planet' then elseif _c.set == 'Planet' then
loc_vars = { loc_vars = {
G.GAME.hands[cfg.hand_type].level,localize(cfg.hand_type, 'poker_hands'), G.GAME.hands[cfg.hand_type].l_mult, G.GAME.hands[cfg.hand_type].l_chips, G.GAME.hands[cfg.hand_type].level,localize(cfg.hand_type, 'poker_hands'), G.GAME.hands[cfg.hand_type].l_mult, G.GAME.hands[cfg.hand_type].l_chips,
colours = {(G.GAME.hands[cfg.hand_type].level==1 and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[math.min(7, G.GAME.hands[cfg.hand_type].level)])} colours = {(to_big(G.GAME.hands[cfg.hand_type].level)==to_big(1) and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands[cfg.hand_type].level)):to_number()])}
} }
localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = _c.vars or loc_vars} localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = _c.vars or loc_vars}
elseif _c.set == 'Tarot' then elseif _c.set == 'Tarot' then

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = '7af2e0e0690a3e982bc378e0f2810cf02634e614841ab27a2036b576c0fdc825' LOVELY_INTEGRITY = '947c501831366deb5e5f19e43dac710ed1309c3fcf0da962c8524122a4e9a142'
--Updates all display information for all displays for a given screenmode. Returns the key for the resolution option cycle --Updates all display information for all displays for a given screenmode. Returns the key for the resolution option cycle
-- --
@ -818,7 +818,7 @@ function modulate_sound(dt)
for k, v in pairs(G.ARGS.ambient_sounds) do for k, v in pairs(G.ARGS.ambient_sounds) do
AC[k] = AC[k] or {} AC[k] = AC[k] or {}
AC[k].per = (k == 'ambientOrgan1') and 0.7 or (k == 'ambientFire1' and 1.1) or (k == 'ambientFire2' and 1.05) or 1 AC[k].per = (k == 'ambientOrgan1') and 0.7 or (k == 'ambientFire1' and 1.1) or (k == 'ambientFire2' and 1.05) or 1
AC[k].vol = Cartomancer.handle_flames_volume((not G.video_organ and G.STATE == G.STATES.SPLASH) and 0 or AC[k].vol and v.volfunc(AC[k].vol) or 0) AC[k].vol = (not G.video_organ and G.STATE == G.STATES.SPLASH) and 0 or AC[k].vol and v.volfunc(AC[k].vol) or 0
end end
G.ARGS.push = G.ARGS.push or {} G.ARGS.push = G.ARGS.push or {}

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = '4e744c84a896d13965c350778ddd9bc20dc5aeec8b4dd69951b460db6f5383cb' LOVELY_INTEGRITY = '444830d91f018dc97aacd41f468f575ea3ad4eea5095b8d83a79bd7e8a40c1ff'
function win_game() function win_game()
if (not G.GAME.seeded and not G.GAME.challenge) or SMODS.config.seeded_unlocks then if (not G.GAME.seeded and not G.GAME.challenge) or SMODS.config.seeded_unlocks then
@ -1090,7 +1090,7 @@ G.FUNCS.evaluate_round = function()
dollars = dollars + ret.dollars dollars = dollars + ret.dollars
end end
end end
if G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest and G.GAME.cry_payload then if to_big(G.GAME.dollars) >= to_big(5) and not G.GAME.modifiers.no_interest and G.GAME.cry_payload then
add_round_eval_row({bonus = true, payload = G.GAME.cry_payload, name='interest_payload', pitch = pitch, dollars = G.GAME.interest_amount*G.GAME.cry_payload*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)}) add_round_eval_row({bonus = true, payload = G.GAME.cry_payload, name='interest_payload', pitch = pitch, dollars = G.GAME.interest_amount*G.GAME.cry_payload*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)})
pitch = pitch + 0.06 pitch = pitch + 0.06
if not G.GAME.seeded and not G.GAME.challenge then if not G.GAME.seeded and not G.GAME.challenge then
@ -1103,7 +1103,7 @@ G.FUNCS.evaluate_round = function()
check_for_unlock({type = 'interest_streak'}) check_for_unlock({type = 'interest_streak'})
dollars = dollars + G.GAME.interest_amount*G.GAME.cry_payload*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) dollars = dollars + G.GAME.interest_amount*G.GAME.cry_payload*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)
G.GAME.cry_payload = nil G.GAME.cry_payload = nil
elseif G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest then elseif to_big(G.GAME.dollars) >= to_big(5) and not G.GAME.modifiers.no_interest then
add_round_eval_row({bonus = true, name='interest', pitch = pitch, dollars = G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)}) add_round_eval_row({bonus = true, name='interest', pitch = pitch, dollars = G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)})
pitch = pitch + 0.06 pitch = pitch + 0.06
if (not G.GAME.seeded and not G.GAME.challenge) or SMODS.config.seeded_unlocks then if (not G.GAME.seeded and not G.GAME.challenge) or SMODS.config.seeded_unlocks then

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = '4af0a05e5998e1bbb1bd6610b6f3d87c6fea5c42d526b7d7d6bd3d6bf983044e' LOVELY_INTEGRITY = 'fff73090942942422c5293599c9a5f94fd18419e9275888a510770e6688dd01c'
--Class --Class
Game = Object:extend() Game = Object:extend()
@ -109,109 +109,7 @@ function Game:start_up()
boot_timer('window init', 'savemanager') boot_timer('window init', 'savemanager')
--call the save manager to wait for any save requests --call the save manager to wait for any save requests
G.SAVE_MANAGER = { G.SAVE_MANAGER = {
thread = love.thread.newThread([[require "love.system" thread = love.thread.newThread('engine/save_manager.lua'),
if (love.system.getOS() == 'OS X' ) and (jit.arch == 'arm64' or jit.arch == 'arm') then jit.off() end
require "love.timer"
require "love.thread"
require 'love.filesystem'
require "engine/object"
require "engine/string_packer"
--vars needed for sound manager thread
CHANNEL = love.thread.getChannel("save_request")
talisman = "]] .. Talisman.config_file.break_infinity .. [["
--untested
function tal_compress_and_save(_file, _data)
local save_string = type(_data) == 'table' and STR_PACK(_data) or _data
local fallback_save = STR_PACK({GAME = {won = true}}) --just bare minimum to not crash, maybe eventually display some info?
if talisman == 'bignumber' then
fallback_save = "if not BigMeta then " .. fallback_save
elseif talisman == 'omeganum' then
fallback_save = "if not OmegaMeta then " .. fallback_save
else
fallback_save = "if BigMeta or OmegaMeta then " .. fallback_save
end
fallback_save = fallback_save .. " end"
save_string = fallback_save .. " " .. save_string
save_string = love.data.compress('string', 'deflate', save_string, 1)
love.filesystem.write(_file,save_string)
end
while true do
--Monitor the channel for any new requests
local request = CHANNEL:demand() -- Value from channel
if request then
--Saves progress for settings, unlocks, alerts and discoveries
if request.type == 'save_progress' then
local prefix_profile = (request.save_progress.SETTINGS.profile or 1)..''
if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end
prefix_profile = prefix_profile..'/'
if not love.filesystem.getInfo(prefix_profile..'meta.jkr') then
love.filesystem.append( prefix_profile..'meta.jkr', 'return {}' )
end
local meta = STR_UNPACK(get_compressed(prefix_profile..'meta.jkr') or 'return {}')
meta.unlocked = meta.unlocked or {}
meta.discovered = meta.discovered or {}
meta.alerted = meta.alerted or {}
local _append = false
for k, v in pairs(request.save_progress.UDA) do
if string.find(v, 'u') and not meta.unlocked[k] then
meta.unlocked[k] = true
_append = true
end
if string.find(v, 'd') and not meta.discovered[k] then
meta.discovered[k] = true
_append = true
end
if string.find(v, 'a') and not meta.alerted[k] then
meta.alerted[k] = true
_append = true
end
end
if _append then compress_and_save( prefix_profile..'meta.jkr', STR_PACK(meta)) end
compress_and_save('settings.jkr', request.save_progress.SETTINGS)
compress_and_save(prefix_profile..'profile.jkr', request.save_progress.PROFILE)
CHANNEL:push('done')
--Saves the settings file
elseif request.type == 'save_settings' then
compress_and_save('settings.jkr', request.save_settings)
compress_and_save(request.profile_num..'/profile.jkr', request.save_profile)
--Saves the metrics file
elseif request.type == 'save_metrics' then
compress_and_save('metrics.jkr', request.save_metrics)
--Saves any notifications
elseif request.type == 'save_notify' then
local prefix_profile = (request.profile_num or 1)..''
if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end
prefix_profile = prefix_profile..'/'
if not love.filesystem.getInfo(prefix_profile..'unlock_notify.jkr') then love.filesystem.append( prefix_profile..'unlock_notify.jkr', '') end
local unlock_notify = get_compressed(prefix_profile..'unlock_notify.jkr') or ''
if request.save_notify and not string.find(unlock_notify, request.save_notify) then
compress_and_save( prefix_profile..'unlock_notify.jkr', unlock_notify..request.save_notify..'\n')
end
--Saves the run
elseif request.type == 'save_run' then
local prefix_profile = (request.profile_num or 1)..''
if not love.filesystem.getInfo(prefix_profile) then love.filesystem.createDirectory( prefix_profile ) end
prefix_profile = prefix_profile..'/'
tal_compress_and_save(prefix_profile..'save.jkr', request.save_table)
end
end
end]]),
channel = love.thread.getChannel('save_request') channel = love.thread.getChannel('save_request')
} }
G.SAVE_MANAGER.thread:start(2) G.SAVE_MANAGER.thread:start(2)
@ -322,7 +220,6 @@ function Game:start_up()
end end
end end
set_profile_progress() set_profile_progress()
Cartomancer.load_mod_file('internal/localization.lua', 'localization')
boot_timer('prep stage', 'splash prep',1) boot_timer('prep stage', 'splash prep',1)
self:splash_screen() self:splash_screen()
boot_timer('splash prep', 'end',1) boot_timer('splash prep', 'end',1)
@ -1355,7 +1252,7 @@ function Game:prep_stage(new_stage, new_state, new_game_obj)
self.CONTROLLER.locks[k] = nil self.CONTROLLER.locks[k] = nil
end end
if new_game_obj then self.GAME = self:init_game_object() end if new_game_obj then self.GAME = self:init_game_object() end
if new_game_obj and Talisman and Talisman.igo then self.GAME = Talisman.igo(self.GAME) end if Talisman and Talisman.igo then self.GAME = Talisman.igo(self.GAME) end
self.STAGE = new_stage or self.STAGES.MAIN_MENU self.STAGE = new_stage or self.STAGES.MAIN_MENU
self.STATE = new_state or self.STATES.MENU self.STATE = new_state or self.STATES.MENU
self.STATE_COMPLETE = false self.STATE_COMPLETE = false
@ -2193,7 +2090,7 @@ function Game:start_run(args)
local selected_back = saveTable and saveTable.BACK.name or (args.challenge and args.challenge.deck and args.challenge.deck.type) or (self.GAME.viewed_back and self.GAME.viewed_back.name) or self.GAME.selected_back and self.GAME.selected_back.name or 'Red Deck' local selected_back = saveTable and saveTable.BACK.name or (args.challenge and args.challenge.deck and args.challenge.deck.type) or (self.GAME.viewed_back and self.GAME.viewed_back.name) or self.GAME.selected_back and self.GAME.selected_back.name or 'Red Deck'
selected_back = get_deck_from_name(selected_back) selected_back = get_deck_from_name(selected_back)
self.GAME = saveTable and saveTable.GAME or self:init_game_object() self.GAME = saveTable and saveTable.GAME or self:init_game_object()
if (not saveTable or not saveTable.GAME) and Talisman and Talisman.igo then self.GAME = Talisman.igo(self.GAME) end if Talisman and Talisman.igo then self.GAME = Talisman.igo(self.GAME) end
Handy.UI.init() Handy.UI.init()
self.GAME.modifiers = self.GAME.modifiers or {} self.GAME.modifiers = self.GAME.modifiers or {}
self.GAME.stake = args.stake or self.GAME.stake or 1 self.GAME.stake = args.stake or self.GAME.stake or 1
@ -2656,7 +2553,6 @@ function Game:start_run(args)
reset_blinds() reset_blinds()
end end
Cartomancer.update_tags_visibility()
G.FUNCS.blind_chip_UI_scale(G.hand_text_area.blind_chips) G.FUNCS.blind_chip_UI_scale(G.hand_text_area.blind_chips)
self.HUD:recalculate() self.HUD:recalculate()
@ -2693,7 +2589,7 @@ function Game:update(dt)
self.TIMERS.BACKGROUND = self.TIMERS.BACKGROUND + dt*(G.ARGS.spin and G.ARGS.spin.amount or 0) self.TIMERS.BACKGROUND = self.TIMERS.BACKGROUND + dt*(G.ARGS.spin and G.ARGS.spin.amount or 0)
self.real_dt = dt self.real_dt = dt
if require('debugplus.config').getValue('enableLongDT') and self.real_dt > 0.05 then print('LONG DT @ '..math.floor(G.TIMERS.REAL)..': '..self.real_dt) end if self.real_dt > 0.05 then print('LONG DT @ '..math.floor(G.TIMERS.REAL)..': '..self.real_dt) end
if not G.fbf or G.new_frame then if not G.fbf or G.new_frame then
G.new_frame = false G.new_frame = false
@ -2711,7 +2607,7 @@ function Game:update(dt)
if G.STATE ~= G.ACC_state then G.ACC = 0 end if G.STATE ~= G.ACC_state then G.ACC = 0 end
G.ACC_state = G.STATE G.ACC_state = G.STATE
if (G.STATE == G.STATES.HAND_PLAYED) or (G.STATE == G.STATES.NEW_ROUND) or Incantation and Incantation.accelerate then if (G.STATE == G.STATES.HAND_PLAYED) or (G.STATE == G.STATES.NEW_ROUND) then
G.ACC = math.min((G.ACC or 0) + dt*0.2*self.SETTINGS.GAMESPEED, 16) G.ACC = math.min((G.ACC or 0) + dt*0.2*self.SETTINGS.GAMESPEED, 16)
elseif Handy.insta_cash_out.is_skipped then G.ACC = 999 elseif Handy.insta_cash_out.is_skipped then G.ACC = 999
else else
@ -2955,6 +2851,7 @@ function Game:update(dt)
if G.FILE_HANDLER.run then if G.FILE_HANDLER.run then
G.SAVE_MANAGER.channel:push({ G.SAVE_MANAGER.channel:push({
type = 'save_run', type = 'save_run',
talisman = Talisman.config_file.break_infinity,
save_table = G.ARGS.save_run, save_table = G.ARGS.save_run,
profile_num = G.SETTINGS.profile}) profile_num = G.SETTINGS.profile})
G.SAVED_GAME = nil G.SAVED_GAME = nil
@ -3210,23 +3107,11 @@ love.graphics.pop()
timer_checkpoint('canvas', 'draw') timer_checkpoint('canvas', 'draw')
if require("debugplus.config").getValue("showHUD") and not G.video_control and G.F_VERBOSE then if not _RELEASE_MODE and G.DEBUG and not G.video_control and G.F_VERBOSE then
love.graphics.push() love.graphics.push()
love.graphics.setColor(0, 1, 1,1) love.graphics.setColor(0, 1, 1,1)
local fps = love.timer.getFPS( ) local fps = love.timer.getFPS( )
do love.graphics.print("Current FPS: "..fps, 10, 10)
local otherSize = 0
for k,v in pairs(G.E_MANAGER.queues or {}) do
if k ~= 'base' then
otherSize = otherSize + #v
end
end
if otherSize ~= 0 then
love.graphics.print(string.format("Current FPS: %d\nBase event queue: %d\nOther event queues: %d", fps, #(G.E_MANAGER.queues and G.E_MANAGER.queues.base or {}), otherSize), 10, 10)
else
love.graphics.print(string.format("Current FPS: %d\nBase event queue: %d", fps, #(G.E_MANAGER.queues and G.E_MANAGER.queues.base or {})), 10, 10)
end
end
if G.check and G.SETTINGS.perf_mode then if G.check and G.SETTINGS.perf_mode then
local section_h = 30 local section_h = 30
@ -3245,10 +3130,6 @@ love.graphics.pop()
end end
love.graphics.rectangle('fill', 10+poll_w*kk, 20 + v_off, 5*poll_w, -(vv)*resolution) love.graphics.rectangle('fill', 10+poll_w*kk, 20 + v_off, 5*poll_w, -(vv)*resolution)
end end
v_off = v_off + section_h
end
local v_off = v_off - section_h * #b.checkpoint_list
for k, v in ipairs(b.checkpoint_list) do
love.graphics.setColor(a == 2 and 0.5 or 1, a == 2 and 1 or 0.5, 1,1) love.graphics.setColor(a == 2 and 0.5 or 1, a == 2 and 1 or 0.5, 1,1)
love.graphics.print(v.label..': '..(string.format("%.2f",1000*(v.average or 0)))..'\n', 10, -section_h + 30 + v_off) love.graphics.print(v.label..': '..(string.format("%.2f",1000*(v.average or 0)))..'\n', 10, -section_h + 30 + v_off)
v_off = v_off + section_h v_off = v_off + section_h

View file

@ -1,148 +1,4 @@
LOVELY_INTEGRITY = 'bb0f108ed0f5fea2a65f1d93362d3d1e1561e17a19a8c7e0d07c0cc4747d3696' LOVELY_INTEGRITY = '7a80102588959caa0bf8986947ac508ff87fd856221043d85aeb54a472571ab0'
local Cartomancer_replacements = {
{
find = [[
for k, v in ipairs%(G%.playing_cards%) do
if v%.base%.suit then table%.insert%(SUITS%[v%.base%.suit%], v%) end]],
-- Steamodded<0917b
find_alt = [[
for k, v in ipairs%(G%.playing_cards%) do
table%.insert%(SUITS%[v%.base%.suit%], v%)]],
place = [[
local SUITS_SORTED = Cartomancer.tablecopy(SUITS)
for k, v in ipairs(G.playing_cards) do
if v.base.suit then
local greyed
if unplayed_only and not ((v.area and v.area == G.deck) or v.ability.wheel_flipped) then
greyed = true
end
local card_string = v:cart_to_string()
if greyed then
card_string = card_string .. "Greyed" -- for some reason format doesn't work and final string is `sGreyed`
end
if greyed and Cartomancer.SETTINGS.deck_view_hide_drawn_cards then
-- Ignore this card.
elseif not Cartomancer.SETTINGS.deck_view_stack_enabled then
-- Don't stack cards
local _scale = 0.7
local copy = copy_card(v, nil, _scale)
copy.greyed = greyed
copy.stacked_quantity = 1
table.insert(SUITS_SORTED[v.base.suit], copy)
elseif not SUITS[v.base.suit][card_string] then
-- Initiate stack
table.insert(SUITS_SORTED[v.base.suit], card_string)
local _scale = 0.7
local copy = copy_card(v, nil, _scale)
copy.greyed = greyed
copy.stacked_quantity = 1
SUITS[v.base.suit][card_string] = copy
else
-- Stack cards
local stacked_card = SUITS[v.base.suit][card_string]
stacked_card.stacked_quantity = stacked_card.stacked_quantity + 1
end
end]]
},
{
find = "card_limit = #SUITS%[suit_map%[j%]%],",
place = "card_limit = #SUITS_SORTED[suit_map[j]],"
},
{
find = [[
for i = 1%, %#SUITS%[suit_map%[j%]%] do
if SUITS%[suit_map%[j%]%]%[i%] then
local greyed%, _scale = nil%, 0%.7
if unplayed_only and not %(%(SUITS%[suit_map%[j%]%]%[i%]%.area and SUITS%[suit_map%[j%]%]%[i%]%.area == G%.deck%) or SUITS%[suit_map%[j%]%]%[i%]%.ability%.wheel_flipped%) then
greyed = true
end
local copy = copy_card%(SUITS%[suit_map%[j%]%]%[i%]%, nil%, _scale%)
copy%.greyed = greyed
copy%.T%.x = view_deck%.T%.x %+ view_deck%.T%.w %/ 2
copy%.T%.y = view_deck%.T%.y
copy:hard_set_T%(%)
view_deck:emplace%(copy%)
end
end]],
place = [[
for i = 1%, %#SUITS_SORTED%[suit_map%[j%]%] do
local card
if not Cartomancer.SETTINGS.deck_view_stack_enabled then
card = SUITS_SORTED%[suit_map%[j%]%]%[i%]
else
local card_string = SUITS_SORTED%[suit_map%[j%]%]%[i%]
card = SUITS%[suit_map%[j%]%]%[card_string%]
end
card%.T%.x = view_deck%.T%.x %+ view_deck%.T%.w%/2
card%.T%.y = view_deck%.T%.y
card:create_quantity_display%(%)
card:hard_set_T%(%)
view_deck:emplace%(card%)
end]]
},
{
find = ' modded and {n = G.UIT.R, config = {align = "cm"}, nodes = {',
place = [=[
not unplayed_only and Cartomancer.add_unique_count() or nil,
modded and {n = G.UIT.R, config = {align = "cm"}, nodes = {]=]
},
}
-- Mom, can we have lovely patches for overrides.lua?
-- No, we have lovely patches at home
-- Lovely patches at home:
local Cartomancer_nfs_read
local Cartomancer_nfs_read_override = function (containerOrName, nameOrSize, sizeOrNil)
local data, size = Cartomancer_nfs_read(containerOrName, nameOrSize, sizeOrNil)
if type(containerOrName) ~= "string" then
return data, size
end
local overrides = '/overrides.lua'
if containerOrName:sub(-#overrides) ~= overrides then
return data, size
end
local replaced = 0
local total_replaced = 0
for _, v in ipairs(Cartomancer_replacements) do
data, replaced = string.gsub(data, v.find, v.place)
if replaced == 0 and v.find_alt then
data, replaced = string.gsub(data, v.find_alt, v.place)
end
if replaced == 0 then
print("Failed to replace " .. v.find .. " for overrides.lua")
else
total_replaced = total_replaced + 1
end
end
print("Totally applied " .. total_replaced .. " replacements to overrides.lua")
-- We no longer need this override
NFS.read = Cartomancer_nfs_read
return data, size
end
--- STEAMODDED CORE --- STEAMODDED CORE
--- MODULE STACKTRACE --- MODULE STACKTRACE
@ -1001,10 +857,6 @@ injectStackTrace()
-- --------MOD CORE API STACKTRACE END----------- -- --------MOD CORE API STACKTRACE END-----------
if (love.system.getOS() == 'OS X' ) and (jit.arch == 'arm64' or jit.arch == 'arm') then jit.off() end if (love.system.getOS() == 'OS X' ) and (jit.arch == 'arm64' or jit.arch == 'arm') then jit.off() end
do
local logger = require("debugplus.logger")
logger.registerLogHandler()
end
require "engine/object" require "engine/object"
require "bit" require "bit"
require "engine/string_packer" require "engine/string_packer"
@ -1150,17 +1002,10 @@ function love.draw()
--Perf monitoring checkpoint --Perf monitoring checkpoint
timer_checkpoint(nil, 'draw', true) timer_checkpoint(nil, 'draw', true)
G:draw() G:draw()
do
local console = require("debugplus.console")
console.doConsoleRender()
timer_checkpoint('DebugPlus Console', 'draw')
end
end end
function love.keypressed(key) function love.keypressed(key)
if Handy.controller.process_key(key, false) then return end if Handy.controller.process_key(key, false) then return end
local console = require("debugplus.console")
if not console.consoleHandleKey(key) then return end
if not _RELEASE_MODE and G.keybind_mapping[key] then love.gamepadpressed(G.CONTROLLER.keyboard_controller, G.keybind_mapping[key]) if not _RELEASE_MODE and G.keybind_mapping[key] then love.gamepadpressed(G.CONTROLLER.keyboard_controller, G.keybind_mapping[key])
else else
G.CONTROLLER:set_HID_flags('mouse') G.CONTROLLER:set_HID_flags('mouse')
@ -1480,10 +1325,6 @@ end
SMODS.path = find_self(SMODS.MODS_DIR, 'core.lua', '--- STEAMODDED CORE') SMODS.path = find_self(SMODS.MODS_DIR, 'core.lua', '--- STEAMODDED CORE')
Cartomancer_nfs_read = NFS.read
NFS.read = Cartomancer_nfs_read_override
for _, path in ipairs { for _, path in ipairs {
"src/ui.lua", "src/ui.lua",
"src/index.lua", "src/index.lua",
@ -3771,7 +3612,9 @@ if Talisman.config_file.break_infinity then
v.s_mult = to_big(v.s_mult) v.s_mult = to_big(v.s_mult)
v.l_chips = to_big(v.l_chips) v.l_chips = to_big(v.l_chips)
v.l_mult = to_big(v.l_mult) v.l_mult = to_big(v.l_mult)
v.level = to_big(v.level)
end end
obj.starting_params.dollars = to_big(obj.starting_params.dollars)
return obj return obj
end end
@ -3793,6 +3636,11 @@ if Talisman.config_file.break_infinity then
if type(x) == 'table' then return x:floor() end if type(x) == 'table' then return x:floor() end
return mf(x) return mf(x)
end end
local mc = math.ceil
function math.ceil(x)
if type(x) == 'table' then return x:ceil() end
return mc(x)
end
local l10 = math.log10 local l10 = math.log10
function math.log10(x) function math.log10(x)
@ -3908,6 +3756,25 @@ if Talisman.config_file.break_infinity then
end--]] --going to hold off on modifying this until proper save loading exists end--]] --going to hold off on modifying this until proper save loading exists
end end
local ics = inc_career_stat
-- This is used often for unlocks, so we can't just prevent big money from being added
-- Also, I'm completely overriding this, since I don't think any mods would want to change it
function inc_career_stat(stat, mod)
if G.GAME.seeded or G.GAME.challenge then return end
if not G.PROFILES[G.SETTINGS.profile].career_stats[stat] then G.PROFILES[G.SETTINGS.profile].career_stats[stat] = 0 end
G.PROFILES[G.SETTINGS.profile].career_stats[stat] = G.PROFILES[G.SETTINGS.profile].career_stats[stat] + (mod or 0)
-- Make sure this isn't ever a talisman number
if type(G.PROFILES[G.SETTINGS.profile].career_stats[stat]) == 'table' then
if G.PROFILES[G.SETTINGS.profile].career_stats[stat] > to_big(1e300) then
G.PROFILES[G.SETTINGS.profile].career_stats[stat] = to_big(1e300)
elseif G.PROFILES[G.SETTINGS.profile].career_stats[stat] < to_big(-1e300) then
G.PROFILES[G.SETTINGS.profile].career_stats[stat] = to_big(-1e300)
end
G.PROFILES[G.SETTINGS.profile].career_stats[stat] = G.PROFILES[G.SETTINGS.profile].career_stats[stat]:to_number()
end
G:save_settings()
end
local sn = scale_number local sn = scale_number
function scale_number(number, scale, max, e_switch_point) function scale_number(number, scale, max, e_switch_point)
if not Big then return sn(number, scale, max, e_switch_point) end if not Big then return sn(number, scale, max, e_switch_point) end
@ -4067,8 +3934,8 @@ function tal_uht(config, vals)
G.GAME.current_round.current_hand.hand_level = vals.level G.GAME.current_round.current_hand.hand_level = vals.level
else else
G.GAME.current_round.current_hand.hand_level = ' '..localize('k_lvl')..tostring(vals.level) G.GAME.current_round.current_hand.hand_level = ' '..localize('k_lvl')..tostring(vals.level)
if type(vals.level) == 'number' then if is_number(vals.level) then
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[math.min(vals.level, 7)] G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[to_big(math.min(vals.level, 7)):to_number()]
else else
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[1] G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[1]
end end
@ -4102,135 +3969,145 @@ function Game:update(dt)
Talisman.dollar_update = false Talisman.dollar_update = false
end end
end end
--scoring coroutine Talisman.F_NO_COROUTINE = false --easy disabling for bugfixing, since the coroutine can make it hard to see where errors are
local oldplay = G.FUNCS.evaluate_play if not Talisman.F_NO_COROUTINE then
function G.FUNCS.evaluate_play()
G.SCORING_COROUTINE = coroutine.create(oldplay)
G.LAST_SCORING_YIELD = love.timer.getTime()
G.CARD_CALC_COUNTS = {} -- keys = cards, values = table containing numbers
local success, err = coroutine.resume(G.SCORING_COROUTINE)
if not success then
error(err)
end
end
local oldupd = love.update
function love.update(dt, ...)
oldupd(dt, ...)
if G.SCORING_COROUTINE then
if collectgarbage("count") > 1024*1024 then
collectgarbage("collect")
end
if coroutine.status(G.SCORING_COROUTINE) == "dead" then
G.SCORING_COROUTINE = nil
G.FUNCS.exit_overlay_menu()
local totalCalcs = 0
for i, v in pairs(G.CARD_CALC_COUNTS) do
totalCalcs = totalCalcs + v[1]
end
G.GAME.LAST_CALCS = totalCalcs
else
G.SCORING_TEXT = nil
if not G.OVERLAY_MENU then
G.scoring_text = {"Calculating...", "", "", ""}
G.SCORING_TEXT = {
{n = G.UIT.C, nodes = {
{n = G.UIT.R, config = {padding = 0.1, align = "cm"}, nodes = {
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.scoring_text, ref_value = 1}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 1, silent = true})}},
}},{n = G.UIT.R, nodes = {
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.scoring_text, ref_value = 2}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4, silent = true})}},
}},{n = G.UIT.R, nodes = {
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.scoring_text, ref_value = 3}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4, silent = true})}},
}},{n = G.UIT.R, nodes = {
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.scoring_text, ref_value = 4}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4, silent = true})}},
}}}}}
G.FUNCS.overlay_menu({
definition =
{n=G.UIT.ROOT, minw = G.ROOM.T.w*5, minh = G.ROOM.T.h*5, config={align = "cm", padding = 9999, offset = {x = 0, y = -3}, r = 0.1, colour = {G.C.GREY[1], G.C.GREY[2], G.C.GREY[3],0.7}}, nodes= G.SCORING_TEXT},
config = {align="cm", offset = {x=0,y=0}, major = G.ROOM_ATTACH, bond = 'Weak'}
})
else
if G.OVERLAY_MENU and G.scoring_text then
local totalCalcs = 0
for i, v in pairs(G.CARD_CALC_COUNTS) do
totalCalcs = totalCalcs + v[1]
end
local jokersYetToScore = #G.jokers.cards + #G.play.cards - #G.CARD_CALC_COUNTS
G.scoring_text[1] = "Calculating..."
G.scoring_text[2] = "Elapsed calculations: "..tostring(totalCalcs)
G.scoring_text[3] = "Cards yet to score: "..tostring(jokersYetToScore)
G.scoring_text[4] = "Calculations last played hand: " .. tostring(G.GAME.LAST_CALCS or "Unknown")
end
end
--this coroutine allows us to stagger GC cycles through
--the main source of waste in terms of memory (especially w joker retriggers) is through local variables that become garbage
--this practically eliminates the memory overhead of scoring
--event queue overhead seems to not exist if Talismans Disable Scoring Animations is off.
--event manager has to wait for scoring to finish until it can keep processing events anyways.
G.LAST_SCORING_YIELD = love.timer.getTime()
local success, msg = coroutine.resume(G.SCORING_COROUTINE)
if not success then
error(msg)
end
end
end
end
TIME_BETWEEN_SCORING_FRAMES = 0.03 -- 30 fps during scoring
-- we dont want overhead from updates making scoring much slower
-- originally 10 fps, I think 30 fps is a good way to balance it while making it look smooth, too
--wrap everything in calculating contexts so we can do more things with it
Talisman.calculating_joker = false
Talisman.calculating_score = false
Talisman.calculating_card = false
Talisman.dollar_update = false
local ccj = Card.calculate_joker
function Card:calculate_joker(context)
--scoring coroutine --scoring coroutine
G.CURRENT_SCORING_CARD = self local oldplay = G.FUNCS.evaluate_play
G.CARD_CALC_COUNTS = G.CARD_CALC_COUNTS or {}
if G.CARD_CALC_COUNTS[self] then function G.FUNCS.evaluate_play()
G.CARD_CALC_COUNTS[self][1] = G.CARD_CALC_COUNTS[self][1] + 1 G.SCORING_COROUTINE = coroutine.create(oldplay)
else G.LAST_SCORING_YIELD = love.timer.getTime()
G.CARD_CALC_COUNTS[self] = {1, 1} G.CARD_CALC_COUNTS = {} -- keys = cards, values = table containing numbers
local success, err = coroutine.resume(G.SCORING_COROUTINE)
if not success then
error(err)
end
end end
if G.LAST_SCORING_YIELD and ((love.timer.getTime() - G.LAST_SCORING_YIELD) > TIME_BETWEEN_SCORING_FRAMES) and coroutine.running() then local oldupd = love.update
coroutine.yield() function love.update(dt, ...)
end oldupd(dt, ...)
Talisman.calculating_joker = true if G.SCORING_COROUTINE then
local ret = ccj(self, context) if collectgarbage("count") > 1024*1024 then
collectgarbage("collect")
end
if coroutine.status(G.SCORING_COROUTINE) == "dead" then
G.SCORING_COROUTINE = nil
G.FUNCS.exit_overlay_menu()
local totalCalcs = 0
for i, v in pairs(G.CARD_CALC_COUNTS) do
totalCalcs = totalCalcs + v[1]
end
G.GAME.LAST_CALCS = totalCalcs
G.GAME.LAST_CALC_TIME = G.CURRENT_CALC_TIME
else
G.SCORING_TEXT = nil
if not G.OVERLAY_MENU then
G.scoring_text = {"Calculating...", "", "", ""}
G.SCORING_TEXT = {
{n = G.UIT.C, nodes = {
{n = G.UIT.R, config = {padding = 0.1, align = "cm"}, nodes = {
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.scoring_text, ref_value = 1}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 1, silent = true})}},
}},{n = G.UIT.R, nodes = {
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.scoring_text, ref_value = 2}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4, silent = true})}},
}},{n = G.UIT.R, nodes = {
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.scoring_text, ref_value = 3}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4, silent = true})}},
}},{n = G.UIT.R, nodes = {
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.scoring_text, ref_value = 4}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4, silent = true})}},
}}}}}
G.FUNCS.overlay_menu({
definition =
{n=G.UIT.ROOT, minw = G.ROOM.T.w*5, minh = G.ROOM.T.h*5, config={align = "cm", padding = 9999, offset = {x = 0, y = -3}, r = 0.1, colour = {G.C.GREY[1], G.C.GREY[2], G.C.GREY[3],0.7}}, nodes= G.SCORING_TEXT},
config = {align="cm", offset = {x=0,y=0}, major = G.ROOM_ATTACH, bond = 'Weak'}
})
else
if ret and type(ret) == "table" and ret.repetitions then if G.OVERLAY_MENU and G.scoring_text then
G.CARD_CALC_COUNTS[ret.card] = G.CARD_CALC_COUNTS[ret.card] or {1,1} local totalCalcs = 0
G.CARD_CALC_COUNTS[ret.card][2] = G.CARD_CALC_COUNTS[ret.card][2] + ret.repetitions for i, v in pairs(G.CARD_CALC_COUNTS) do
totalCalcs = totalCalcs + v[1]
end
local jokersYetToScore = #G.jokers.cards + #G.play.cards - #G.CARD_CALC_COUNTS
G.CURRENT_CALC_TIME = (G.CURRENT_CALC_TIME or 0) + dt
G.scoring_text[1] = "Calculating..."
G.scoring_text[2] = "Elapsed calculations: "..tostring(totalCalcs).." ("..tostring(number_format(G.CURRENT_CALC_TIME)).."s)"
G.scoring_text[3] = "Cards yet to score: "..tostring(jokersYetToScore)
G.scoring_text[4] = "Calculations last played hand: " .. tostring(G.GAME.LAST_CALCS or "Unknown") .." ("..tostring(G.GAME.LAST_CALC_TIME and number_format(G.GAME.LAST_CALC_TIME) or "???").."s)"
end
end
--this coroutine allows us to stagger GC cycles through
--the main source of waste in terms of memory (especially w joker retriggers) is through local variables that become garbage
--this practically eliminates the memory overhead of scoring
--event queue overhead seems to not exist if Talismans Disable Scoring Animations is off.
--event manager has to wait for scoring to finish until it can keep processing events anyways.
G.LAST_SCORING_YIELD = love.timer.getTime()
local success, msg = coroutine.resume(G.SCORING_COROUTINE)
if not success then
error(msg)
end
end
end
end end
TIME_BETWEEN_SCORING_FRAMES = 0.03 -- 30 fps during scoring
-- we dont want overhead from updates making scoring much slower
-- originally 10 fps, I think 30 fps is a good way to balance it while making it look smooth, too
--wrap everything in calculating contexts so we can do more things with it
Talisman.calculating_joker = false Talisman.calculating_joker = false
return ret
end
local cuc = Card.use_consumable
function Card:use_consumable(x,y)
Talisman.calculating_score = true
local ret = cuc(self, x,y)
Talisman.calculating_score = false Talisman.calculating_score = false
return ret Talisman.calculating_card = false
end Talisman.dollar_update = false
local gfep = G.FUNCS.evaluate_play local ccj = Card.calculate_joker
G.FUNCS.evaluate_play = function(e) function Card:calculate_joker(context)
Talisman.calculating_score = true --scoring coroutine
local ret = gfep(e) G.CURRENT_SCORING_CARD = self
Talisman.calculating_score = false G.CARD_CALC_COUNTS = G.CARD_CALC_COUNTS or {}
return ret if G.CARD_CALC_COUNTS[self] then
G.CARD_CALC_COUNTS[self][1] = G.CARD_CALC_COUNTS[self][1] + 1
else
G.CARD_CALC_COUNTS[self] = {1, 1}
end
if G.LAST_SCORING_YIELD and ((love.timer.getTime() - G.LAST_SCORING_YIELD) > TIME_BETWEEN_SCORING_FRAMES) and coroutine.running() then
coroutine.yield()
end
Talisman.calculating_joker = true
local ret, trig = ccj(self, context)
if ret and type(ret) == "table" and ret.repetitions then
if not ret.card then
G.CARD_CALC_COUNTS.other = G.CARD_CALC_COUNTS.other or {1,1}
G.CARD_CALC_COUNTS.other[2] = G.CARD_CALC_COUNTS.other[2] + ret.repetitions
else
G.CARD_CALC_COUNTS[ret.card] = G.CARD_CALC_COUNTS[ret.card] or {1,1}
G.CARD_CALC_COUNTS[ret.card][2] = G.CARD_CALC_COUNTS[ret.card][2] + ret.repetitions
end
end
Talisman.calculating_joker = false
return ret, trig
end
local cuc = Card.use_consumable
function Card:use_consumable(x,y)
Talisman.calculating_score = true
local ret = cuc(self, x,y)
Talisman.calculating_score = false
return ret
end
local gfep = G.FUNCS.evaluate_play
G.FUNCS.evaluate_play = function(e)
Talisman.calculating_score = true
local ret = gfep(e)
Talisman.calculating_score = false
return ret
end
end end
--[[local ec = eval_card --[[local ec = eval_card
function eval_card() function eval_card()
@ -4325,7 +4202,7 @@ local edo = ease_dollars
function ease_dollars(mod, instant) function ease_dollars(mod, instant)
if Talisman.config_file.disable_anims then--and (Talisman.calculating_joker or Talisman.calculating_score or Talisman.calculating_card) then if Talisman.config_file.disable_anims then--and (Talisman.calculating_joker or Talisman.calculating_score or Talisman.calculating_card) then
mod = mod or 0 mod = mod or 0
if mod < 0 then inc_career_stat('c_dollars_earned', mod) end if to_big(mod) < to_big(0) then inc_career_stat('c_dollars_earned', mod) end
G.GAME.dollars = G.GAME.dollars + mod G.GAME.dollars = G.GAME.dollars + mod
Talisman.dollar_update = true Talisman.dollar_update = true
else return edo(mod, instant) end else return edo(mod, instant) end
@ -4340,11 +4217,13 @@ function safe_str_unpack(str)
if success then if success then
return result return result
else else
print("Error unpacking string: " .. result) print("[Talisman] Error unpacking string: " .. result)
print(tostring(str))
return nil return nil
end end
else else
print("Error loading string: " .. err) print("[Talisman] Error loading string: " .. err)
print(tostring(str))
return nil return nil
end end
end end
@ -4373,6 +4252,207 @@ function G.FUNCS.evaluate_round()
end end
end end
local g_start_run = Game.start_run
function Game:start_run(args)
local ret = g_start_run(self, args)
self.GAME.round_resets.ante_disp = self.GAME.round_resets.ante_disp or number_format(self.GAME.round_resets.ante)
return ret
end
-- Steamodded calculation API: add extra operations
if SMODS and SMODS.calculate_individual_effect then
local smods_xchips = false
for _, v in pairs(SMODS.calculation_keys) do
if v == 'x_chips' then
smods_xchips = true
break
end
end
local scie = SMODS.calculate_individual_effect
function SMODS.calculate_individual_effect(effect, scored_card, key, amount, from_edition)
-- For some reason, some keys' animations are completely removed
-- I think this is caused by a lovely patch conflict
--if key == 'chip_mod' then key = 'chips' end
--if key == 'mult_mod' then key = 'mult' end
--if key == 'Xmult_mod' then key = 'x_mult' end
local ret = scie(effect, scored_card, key, amount, from_edition)
if ret then
return ret
end
if not smods_xchips and (key == 'x_chips' or key == 'xchips' or key == 'Xchip_mod') and amount ~= 1 then
if effect.card then juice_card(effect.card) end
hand_chips = mod_chips(hand_chips * amount)
update_hand_text({delay = 0}, {chips = hand_chips, mult = mult})
if not effect.remove_default_message then
if from_edition then
card_eval_status_text(scored_card, 'jokers', nil, percent, nil, {message = "X"..amount, colour = G.C.EDITION, edition = true})
elseif key ~= 'Xchip_mod' then
if effect.xchip_message then
card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.xchip_message)
else
card_eval_status_text(scored_card or effect.card or effect.focus, 'x_chips', amount, percent)
end
end
end
return true
end
if (key == 'e_chips' or key == 'echips' or key == 'Echip_mod') and amount ~= 1 then
if effect.card then juice_card(effect.card) end
hand_chips = mod_chips(hand_chips ^ amount)
update_hand_text({delay = 0}, {chips = hand_chips, mult = mult})
if not effect.remove_default_message then
if from_edition then
card_eval_status_text(scored_card, 'jokers', nil, percent, nil, {message = "^"..amount, colour = G.C.EDITION, edition = true})
elseif key ~= 'Echip_mod' then
if effect.echip_message then
card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.echip_message)
else
card_eval_status_text(scored_card or effect.card or effect.focus, 'e_chips', amount, percent)
end
end
end
return true
end
if (key == 'ee_chips' or key == 'eechips' or key == 'EEchip_mod') and amount ~= 1 then
if effect.card then juice_card(effect.card) end
hand_chips = mod_chips(hand_chips:arrow(2, amount))
update_hand_text({delay = 0}, {chips = hand_chips, mult = mult})
if not effect.remove_default_message then
if from_edition then
card_eval_status_text(scored_card, 'jokers', nil, percent, nil, {message = "^^"..amount, colour = G.C.EDITION, edition = true})
elseif key ~= 'EEchip_mod' then
if effect.eechip_message then
card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.eechip_message)
else
card_eval_status_text(scored_card or effect.card or effect.focus, 'ee_chips', amount, percent)
end
end
end
return true
end
if (key == 'eee_chips' or key == 'eeechips' or key == 'EEEchip_mod') and amount ~= 1 then
if effect.card then juice_card(effect.card) end
hand_chips = mod_chips(hand_chips:arrow(3, amount))
update_hand_text({delay = 0}, {chips = hand_chips, mult = mult})
if not effect.remove_default_message then
if from_edition then
card_eval_status_text(scored_card, 'jokers', nil, percent, nil, {message = "^^^"..amount, colour = G.C.EDITION, edition = true})
elseif key ~= 'EEEchip_mod' then
if effect.eeechip_message then
card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.eeechip_message)
else
card_eval_status_text(scored_card or effect.card or effect.focus, 'eee_chips', amount, percent)
end
end
end
return true
end
if (key == 'hyper_chips' or key == 'hyperchips' or key == 'hyperchip_mod') and type(amount) == 'table' then
if effect.card then juice_card(effect.card) end
hand_chips = mod_chips(hand_chips:arrow(amount[1], amount[2]))
update_hand_text({delay = 0}, {chips = hand_chips, mult = mult})
if not effect.remove_default_message then
if from_edition then
card_eval_status_text(scored_card, 'jokers', nil, percent, nil, {message = (amount[1] > 5 and ('{' .. amount[1] .. '}') or string.rep('^', amount[1])) .. amount[2], colour = G.C.EDITION, edition = true})
elseif key ~= 'hyperchip_mod' then
if effect.hyperchip_message then
card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.hyperchip_message)
else
card_eval_status_text(scored_card or effect.card or effect.focus, 'hyper_chips', amount, percent)
end
end
end
return true
end
if (key == 'e_mult' or key == 'emult' or key == 'Emult_mod') and amount ~= 1 then
if effect.card then juice_card(effect.card) end
mult = mod_chips(mult ^ amount)
update_hand_text({delay = 0}, {chips = hand_chips, mult = mult})
if not effect.remove_default_message then
if from_edition then
card_eval_status_text(scored_card, 'jokers', nil, percent, nil, {message = "^"..amount.." Mult", colour = G.C.EDITION, edition = true})
elseif key ~= 'Emult_mod' then
if effect.emult_message then
card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.emult_message)
else
card_eval_status_text(scored_card or effect.card or effect.focus, 'e_mult', amount, percent)
end
end
end
return true
end
if (key == 'ee_mult' or key == 'eemult' or key == 'EEmult_mod') and amount ~= 1 then
if effect.card then juice_card(effect.card) end
mult = mod_chips(mult:arrow(2, amount))
update_hand_text({delay = 0}, {chips = hand_chips, mult = mult})
if not effect.remove_default_message then
if from_edition then
card_eval_status_text(scored_card, 'jokers', nil, percent, nil, {message = "^^"..amount.." Mult", colour = G.C.EDITION, edition = true})
elseif key ~= 'EEmult_mod' then
if effect.eemult_message then
card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.eemult_message)
else
card_eval_status_text(scored_card or effect.card or effect.focus, 'ee_mult', amount, percent)
end
end
end
return true
end
if (key == 'eee_mult' or key == 'eeemult' or key == 'EEEmult_mod') and amount ~= 1 then
if effect.card then juice_card(effect.card) end
mult = mod_chips(mult:arrow(3, amount))
update_hand_text({delay = 0}, {chips = hand_chips, mult = mult})
if not effect.remove_default_message then
if from_edition then
card_eval_status_text(scored_card, 'jokers', nil, percent, nil, {message = "^^^"..amount.." Mult", colour = G.C.EDITION, edition = true})
elseif key ~= 'EEEmult_mod' then
if effect.eeemult_message then
card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.eeemult_message)
else
card_eval_status_text(scored_card or effect.card or effect.focus, 'eee_mult', amount, percent)
end
end
end
return true
end
if (key == 'hyper_mult' or key == 'hypermult' or key == 'hypermult_mod') and type(amount) == 'table' then
if effect.card then juice_card(effect.card) end
mult = mod_chips(mult:arrow(amount[1], amount[2]))
update_hand_text({delay = 0}, {chips = hand_chips, mult = mult})
if not effect.remove_default_message then
if from_edition then
card_eval_status_text(scored_card, 'jokers', nil, percent, nil, {message = ((amount[1] > 5 and ('{' .. amount[1] .. '}') or string.rep('^', amount[1])) .. amount[2]).." Mult", colour = G.C.EDITION, edition = true})
elseif key ~= 'hypermult_mod' then
if effect.hypermult_message then
card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.hypermult_message)
else
card_eval_status_text(scored_card or effect.card or effect.focus, 'hyper_mult', amount, percent)
end
end
end
return true
end
end
for _, v in ipairs({'e_mult', 'e_chips', 'ee_mult', 'ee_chips', 'eee_mult', 'eee_chips', 'hyper_mult', 'hyper_chips',
'emult', 'echips', 'eemult', 'eechips', 'eeemult', 'eeechips', 'hypermult', 'hyperchips',
'Emult_mod', 'Echip_mod', 'EEmult_mod', 'EEchip_mod', 'EEEmult_mod', 'EEEchip_mod', 'hypermult_mod', 'hyperchip_mod'}) do
table.insert(SMODS.calculation_keys, v)
end
if not smods_xchips then
for _, v in ipairs({'x_chips', 'xchips', 'Xchip_mod'}) do
table.insert(SMODS.calculation_keys, v)
end
end
end
--some debugging functions --some debugging functions
--[[local callstep=0 --[[local callstep=0
function printCallerInfo() function printCallerInfo()
@ -4390,79 +4470,3 @@ function EventManager:add_event(x,y,z)
printCallerInfo() printCallerInfo()
return emae(self,x,y,z) return emae(self,x,y,z)
end--]] end--]]
require 'cartomancer.init'
Cartomancer.path = assert(
Cartomancer.find_self('cartomancer.lua'),
"Failed to find mod folder. Make sure that `Cartomancer` folder has `cartomancer.lua` file!"
)
Cartomancer.load_mod_file('internal/config.lua', 'internal.config')
Cartomancer.load_mod_file('internal/atlas.lua', 'internal.atlas')
Cartomancer.load_mod_file('internal/ui.lua', 'internal.ui')
Cartomancer.load_mod_file('internal/keybinds.lua', 'internal.keybinds')
Cartomancer.load_mod_file('core/view-deck.lua', 'core.view-deck')
Cartomancer.load_mod_file('core/flames.lua', 'core.flames')
Cartomancer.load_mod_file('core/optimizations.lua', 'core.optimizations')
Cartomancer.load_mod_file('core/jokers.lua', 'core.jokers')
Cartomancer.load_mod_file('core/hand.lua', 'core.hand')
Cartomancer.load_config()
Cartomancer.INTERNAL_jokers_menu = false
-- TODO dedicated keybinds file? keybinds need to load after config
Cartomancer.register_keybind {
name = 'hide_joker',
func = function (controller)
Cartomancer.hide_hovered_joker(controller)
end
}
Cartomancer.register_keybind {
name = 'toggle_tags',
func = function (controller)
Cartomancer.SETTINGS.hide_tags = not Cartomancer.SETTINGS.hide_tags
Cartomancer.update_tags_visibility()
end
}
Cartomancer.register_keybind {
name = 'toggle_consumables',
func = function (controller)
Cartomancer.SETTINGS.hide_consumables = not Cartomancer.SETTINGS.hide_consumables
end
}
Cartomancer.register_keybind {
name = 'toggle_deck',
func = function (controller)
Cartomancer.SETTINGS.hide_deck = not Cartomancer.SETTINGS.hide_deck
end
}
Cartomancer.register_keybind {
name = 'toggle_jokers',
func = function (controller)
if not (G and G.jokers) then
return
end
G.jokers.cart_hide_all = not G.jokers.cart_hide_all
if G.jokers.cart_hide_all then
Cartomancer.hide_all_jokers()
else
Cartomancer.show_all_jokers()
end
Cartomancer.align_G_jokers()
end
}
Cartomancer.register_keybind {
name = 'toggle_jokers_buttons',
func = function (controller)
Cartomancer.SETTINGS.jokers_controls_buttons = not Cartomancer.SETTINGS.jokers_controls_buttons
end
}

View file

@ -1,115 +0,0 @@
INFO - [♥] Lovely 0.6.0
INFO - [♥] Game directory is at "Z:\\run\\media\\vomitblood\\DataDisk1\\SteamLibrary\\steamapps\\common\\Balatro"
INFO - [♥] Writing logs to "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\log"
INFO - [♥] Using mod directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods"
INFO - [♥] Initialization complete in 127ms
WARN - [♥] Pattern 'G.ARGS.score_intensity.organ = G.video_organ or G.ARGS.score_intensity.required_score > 0 and math.max(math.min(0.4, 0.1*math.log(G.ARGS.score_intensity.earned_score/(G.ARGS.score_intensity.required_score+1), 5)),0.) or 0' on target 'main.lua' resulted in no matches
WARN - [♥] Pattern 'if type(G.GAME.current_round.current_hand.chips) ~= \'number\' or type(G.GAME.current_round.current_hand.mult) ~= \'number\' then' on target 'main.lua' resulted in no matches
INFO - [♥] Applied 10 patches to 'main.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
WARN - [♥] Pattern 'if not _RELEASE_MODE then' on target 'engine/controller.lua' resulted in no matches
INFO - [♥] Applied 4 patches to 'engine/controller.lua'
INFO - [♥] Applied 13 patches to 'back.lua'
INFO - [♥] Applied 14 patches to 'tag.lua'
INFO - [♥] Applied 2 patches to 'engine/moveable.lua'
INFO - [♥] Applied 2 patches to 'engine/sprite.lua'
INFO - [♥] Applied 2 patches to 'engine/animatedsprite.lua'
WARN - [♥] Pattern 'assembled_string = assembled_string..(type(subpart) == \'string\' and subpart or args.vars[tonumber(subpart[1])] or \'ERROR\')' on target 'functions/misc_functions.lua' resulted in no matches
INFO - [♥] Applied 45 patches to 'functions/misc_functions.lua'
INFO - [♥] Applied 72 patches to 'game.lua'
INFO - [♥] Applied 1 patch to 'globals.lua'
INFO - [♥] Applied 6 patches to 'engine/ui.lua'
WARN - [♥] Pattern '{card_limit = _size, type = \'consumeable\', highlight_limit = 1}' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].chips, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}},' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].mult, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}' on target 'functions/UI_definitions.lua' resulted in no matches
INFO - [♥] Applied 97 patches to 'functions/UI_definitions.lua'
WARN - [♥] Pattern 'ease_to = G.GAME.chips + math.floor(hand_chips * mult) * (e and e.antiscore and -1 or 1),' on target 'functions/state_events.lua' resulted in no matches
INFO - [♥] Applied 98 patches to 'functions/state_events.lua'
WARN - [♥] Pattern 'local cfg = (card and card.ability) or _c[\'config\']' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Regex '(?<indent>[\\t ]*)if G\\.F_NO_ACHIEVEMENTS then return end\\n[\\s\\S][\\s\\S]{16}--\\|LOCAL SETTINGS FILE' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'func = (function() if eval_func(card) then if not first or first then card:juice_up(0.1, 0.1) end;juice_card_until(card, eval_func, nil, 0.8) end return true end)' on target 'functions/common_events.lua' resulted in no matches
INFO - [♥] Applied 121 patches to 'functions/common_events.lua'
WARN - [♥] Pattern 'G.pack_cards:emplace(v)' on target 'functions/button_callbacks.lua' resulted in no matches
INFO - [♥] Applied 47 patches to 'functions/button_callbacks.lua'
WARN - [♥] Pattern 'if self.ability.name == \'Campfire\' and G.GAME.blind.boss and not (G.GAME.blind.config and G.GAME.blind.config.bonus) and self.ability.x_mult > 1 then' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if k ~= \'focused_ui\' and k ~= \"front\" and k ~= \"back\" and k ~= \"soul_parts\" and k ~= \"center\" and k ~= \'floating_sprite\' and k~= \"shadow\" and k~= \"use_button\" and k ~= \'buy_button\' and k ~= \'buy_and_use_button\' and k~= \"debuff\" and k ~= \'price\' and k~= \'particles\' and k ~= \'h_popup\' then v:draw() end' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if G.GAME.blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end' on target 'card.lua' resulted in no matches
INFO - [♥] Applied 203 patches to 'card.lua'
INFO - [♥] Applied 15 patches to 'cardarea.lua'
INFO - [♥] Applied 32 patches to 'blind.lua'
INFO - [♥] Applied 5 patches to 'engine/text.lua'
INFO - [G] Failed to connect to the debug server
INFO - [G] 2025-01-06 16:24:30 :: DEBUG :: DebugConsole :: Steamodded Debug Socket started !
INFO - [♥] Applied 9 patches to 'engine/sound_manager.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
INFO - [G] 2025-01-06 16:24:31 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua
INFO - [G] 2025-01-06 16:24:31 :: TRACE :: Loader :: Saving Mod Info: Cryptid
INFO - [G] 2025-01-06 16:24:31 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua
INFO - [G] 2025-01-06 16:24:31 :: TRACE :: Loader :: Saving Mod Info: Talisman
INFO - [G] Loading file Achievements.lua
INFO - [G] Loading file Antimatter.lua
INFO - [G] Loading file Blinds.lua
INFO - [G] Loading file Challenges.lua
INFO - [G] Loading file CodeCards.lua
INFO - [G] Loading file CryptidJokerDisplay.lua
INFO - [G] Warning: CryptidJokerDisplay.lua has no items
INFO - [G] Loading file Decks.lua
INFO - [G] Loading file Enhanced.lua
INFO - [G] Loading file EpicJokers.lua
INFO - [G] Loading file Exotic.lua
INFO - [G] Loading file M.lua
INFO - [G] Loading file Misc.lua
INFO - [G] Loading file MiscJokers.lua
INFO - [G] Loading file Planets.lua
INFO - [G] Loading file Sleeves.lua
INFO - [G] Loading file Spectrals.lua
INFO - [G] Loading file Spooky.lua
INFO - [G] Loading file Stakes.lua
INFO - [G] Loading file Tags.lua
INFO - [G] Loading file Vouchers.lua
INFO - [G] Loading file dummy_https.lua
INFO - [G] Loading file dummy_timerblinds.lua
INFO - [G] Warning: dummy_timerblinds.lua has no items
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Sticker :: Detected duplicate register call on object perishable
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Sticker :: Detected duplicate register call on object pinned
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Sticker :: Detected duplicate register call on object eternal
INFO - [G] 2025-01-06 16:24:31 :: WARN :: Sticker :: Detected duplicate register call on object rental
INFO - [G] 2025-01-06 16:24:31 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms
INFO - [G] 2025-01-06 16:24:31 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.747 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0030] Injected Atlas in 795.883 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0025] Injected Sound in 20.008 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0032] Injected Stake in 0.804 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0008] Injected Rarity in 0.031 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.073 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0391] Injected Center in 1.877 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.010 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0027] Injected Blind in 0.116 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0002] Injected Seal in 0.064 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0004] Injected Suit in 0.761 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0013] Injected Rank in 0.216 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.039 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.129 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0031] Injected Challenge in 0.033 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0028] Injected Tag in 0.116 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0009] Injected Sticker in 0.398 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0009] Injected Shader in 161.469 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0020] Injected Achievement in 0.157 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 3.633 ms
INFO - [G] 2025-01-06 16:24:32 :: INFO :: TIMER :: [0011] Injected Event in 0.105 ms
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 14: 0.08058204
INFO - [G] LONG DT @ 14: 0.064967672
INFO - [G] LONG DT @ 14: 0.0525077976

View file

@ -1,364 +0,0 @@
INFO - [♥] Lovely 0.6.0
INFO - [♥] Game directory is at "Z:\\run\\media\\vomitblood\\DataDisk1\\SteamLibrary\\steamapps\\common\\Balatro"
INFO - [♥] Writing logs to "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\log"
INFO - [♥] Using mod directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods"
INFO - [♥] Cleaning up dumps directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\dump"
INFO - [♥] Initialization complete in 124ms
WARN - [♥] Pattern 'G.ARGS.score_intensity.organ = G.video_organ or G.ARGS.score_intensity.required_score > 0 and math.max(math.min(0.4, 0.1*math.log(G.ARGS.score_intensity.earned_score/(G.ARGS.score_intensity.required_score+1), 5)),0.) or 0' on target 'main.lua' resulted in no matches
WARN - [♥] Pattern 'if type(G.GAME.current_round.current_hand.chips) ~= \'number\' or type(G.GAME.current_round.current_hand.mult) ~= \'number\' then' on target 'main.lua' resulted in no matches
INFO - [♥] Applied 10 patches to 'main.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
WARN - [♥] Pattern 'if not _RELEASE_MODE then' on target 'engine/controller.lua' resulted in no matches
INFO - [♥] Applied 4 patches to 'engine/controller.lua'
INFO - [♥] Applied 13 patches to 'back.lua'
INFO - [♥] Applied 14 patches to 'tag.lua'
INFO - [♥] Applied 2 patches to 'engine/moveable.lua'
INFO - [♥] Applied 2 patches to 'engine/sprite.lua'
INFO - [♥] Applied 2 patches to 'engine/animatedsprite.lua'
WARN - [♥] Pattern 'assembled_string = assembled_string..(type(subpart) == \'string\' and subpart or args.vars[tonumber(subpart[1])] or \'ERROR\')' on target 'functions/misc_functions.lua' resulted in no matches
INFO - [♥] Applied 45 patches to 'functions/misc_functions.lua'
INFO - [♥] Applied 72 patches to 'game.lua'
INFO - [♥] Applied 1 patch to 'globals.lua'
INFO - [♥] Applied 6 patches to 'engine/ui.lua'
WARN - [♥] Pattern '{card_limit = _size, type = \'consumeable\', highlight_limit = 1}' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].chips, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}},' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].mult, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}' on target 'functions/UI_definitions.lua' resulted in no matches
INFO - [♥] Applied 97 patches to 'functions/UI_definitions.lua'
WARN - [♥] Pattern 'ease_to = G.GAME.chips + math.floor(hand_chips * mult) * (e and e.antiscore and -1 or 1),' on target 'functions/state_events.lua' resulted in no matches
INFO - [♥] Applied 98 patches to 'functions/state_events.lua'
WARN - [♥] Pattern 'local cfg = (card and card.ability) or _c[\'config\']' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Regex '(?<indent>[\\t ]*)if G\\.F_NO_ACHIEVEMENTS then return end\\n[\\s\\S][\\s\\S]{16}--\\|LOCAL SETTINGS FILE' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'func = (function() if eval_func(card) then if not first or first then card:juice_up(0.1, 0.1) end;juice_card_until(card, eval_func, nil, 0.8) end return true end)' on target 'functions/common_events.lua' resulted in no matches
INFO - [♥] Applied 121 patches to 'functions/common_events.lua'
WARN - [♥] Pattern 'G.pack_cards:emplace(v)' on target 'functions/button_callbacks.lua' resulted in no matches
INFO - [♥] Applied 47 patches to 'functions/button_callbacks.lua'
WARN - [♥] Pattern 'if self.ability.name == \'Campfire\' and G.GAME.blind.boss and not (G.GAME.blind.config and G.GAME.blind.config.bonus) and self.ability.x_mult > 1 then' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if k ~= \'focused_ui\' and k ~= \"front\" and k ~= \"back\" and k ~= \"soul_parts\" and k ~= \"center\" and k ~= \'floating_sprite\' and k~= \"shadow\" and k~= \"use_button\" and k ~= \'buy_button\' and k ~= \'buy_and_use_button\' and k~= \"debuff\" and k ~= \'price\' and k~= \'particles\' and k ~= \'h_popup\' then v:draw() end' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if G.GAME.blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end' on target 'card.lua' resulted in no matches
INFO - [♥] Applied 203 patches to 'card.lua'
INFO - [♥] Applied 15 patches to 'cardarea.lua'
INFO - [♥] Applied 32 patches to 'blind.lua'
INFO - [♥] Applied 5 patches to 'engine/text.lua'
INFO - [G] Failed to connect to the debug server
INFO - [G] 2025-01-06 16:24:55 :: DEBUG :: DebugConsole :: Steamodded Debug Socket started !
INFO - [♥] Applied 9 patches to 'engine/sound_manager.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
INFO - [G] 2025-01-06 16:24:56 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua
INFO - [G] 2025-01-06 16:24:56 :: TRACE :: Loader :: Saving Mod Info: Cryptid
INFO - [G] 2025-01-06 16:24:56 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua
INFO - [G] 2025-01-06 16:24:56 :: TRACE :: Loader :: Saving Mod Info: Talisman
INFO - [G] Loading file Achievements.lua
INFO - [G] Loading file Antimatter.lua
INFO - [G] Loading file Blinds.lua
INFO - [G] Loading file Challenges.lua
INFO - [G] Loading file CodeCards.lua
INFO - [G] Loading file CryptidJokerDisplay.lua
INFO - [G] Warning: CryptidJokerDisplay.lua has no items
INFO - [G] Loading file Decks.lua
INFO - [G] Loading file Enhanced.lua
INFO - [G] Loading file EpicJokers.lua
INFO - [G] Loading file Exotic.lua
INFO - [G] Loading file M.lua
INFO - [G] Loading file Misc.lua
INFO - [G] Loading file MiscJokers.lua
INFO - [G] Loading file Planets.lua
INFO - [G] Loading file Sleeves.lua
INFO - [G] Loading file Spectrals.lua
INFO - [G] Loading file Spooky.lua
INFO - [G] Loading file Stakes.lua
INFO - [G] Loading file Tags.lua
INFO - [G] Loading file Vouchers.lua
INFO - [G] Loading file dummy_https.lua
INFO - [G] Loading file dummy_timerblinds.lua
INFO - [G] Warning: dummy_timerblinds.lua has no items
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Sticker :: Detected duplicate register call on object perishable
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Sticker :: Detected duplicate register call on object pinned
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Sticker :: Detected duplicate register call on object eternal
INFO - [G] 2025-01-06 16:24:56 :: WARN :: Sticker :: Detected duplicate register call on object rental
INFO - [G] 2025-01-06 16:24:56 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms
INFO - [G] 2025-01-06 16:24:56 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.728 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0030] Injected Atlas in 776.599 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0025] Injected Sound in 21.525 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0032] Injected Stake in 2.105 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0008] Injected Rarity in 0.062 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.083 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0391] Injected Center in 2.357 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.009 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0027] Injected Blind in 0.096 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0002] Injected Seal in 0.119 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0004] Injected Suit in 0.295 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0013] Injected Rank in 0.214 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.037 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.182 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0031] Injected Challenge in 0.034 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0028] Injected Tag in 0.255 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0009] Injected Sticker in 0.737 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0009] Injected Shader in 53.803 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0000] Injected Keybind in 0.002 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0020] Injected Achievement in 0.052 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 3.209 ms
INFO - [G] 2025-01-06 16:24:57 :: INFO :: TIMER :: [0011] Injected Event in 0.012 ms
INFO - [G] LONG DT @ 3: 0.1
INFO - [G] LONG DT @ 3: 0.08331644
INFO - [G] LONG DT @ 3: 0.069972552
INFO - [G] LONG DT @ 3: 0.0592162216
INFO - [G] LONG DT @ 3: 0.05065199728
INFO - [G] LONG DT @ 50: 0.1
INFO - [G] LONG DT @ 50: 0.1
INFO - [G] LONG DT @ 50: 0.1
INFO - [G] LONG DT @ 50: 0.1
INFO - [G] LONG DT @ 50: 0.08123894
INFO - [G] LONG DT @ 50: 0.065959192
INFO - [G] LONG DT @ 50: 0.053649213600001
INFO - [G] LONG DT @ 51: 0.1
INFO - [G] LONG DT @ 51: 0.1
INFO - [G] LONG DT @ 51: 0.1
INFO - [G] LONG DT @ 51: 0.1
INFO - [G] LONG DT @ 51: 0.1
INFO - [G] LONG DT @ 52: 0.1
INFO - [G] LONG DT @ 52: 0.1
INFO - [G] LONG DT @ 52: 0.1
INFO - [G] LONG DT @ 52: 0.1
INFO - [G] LONG DT @ 52: 0.1
INFO - [G] LONG DT @ 52: 0.1
INFO - [G] LONG DT @ 52: 0.1
INFO - [G] LONG DT @ 52: 0.1
INFO - [G] LONG DT @ 52: 0.1
INFO - [G] LONG DT @ 52: 0.1
INFO - [G] LONG DT @ 53: 0.1
INFO - [G] LONG DT @ 53: 0.1
INFO - [G] LONG DT @ 53: 0.1
INFO - [G] LONG DT @ 53: 0.081268919999998
INFO - [G] LONG DT @ 53: 0.066091736
INFO - [G] LONG DT @ 53: 0.0538612688
INFO - [G] LONG DT @ 55: 0.1
INFO - [G] LONG DT @ 55: 0.1
INFO - [G] LONG DT @ 55: 0.1
INFO - [G] LONG DT @ 55: 0.1
INFO - [G] LONG DT @ 55: 0.1
INFO - [G] LONG DT @ 55: 0.1
INFO - [G] LONG DT @ 55: 0.1
INFO - [G] LONG DT @ 55: 0.1
INFO - [G] LONG DT @ 56: 0.1
INFO - [G] LONG DT @ 56: 0.1
INFO - [G] LONG DT @ 56: 0.081317280000001
INFO - [G] LONG DT @ 56: 0.066314163999999
INFO - [G] LONG DT @ 56: 0.054187291200002
INFO - [G] LONG DT @ 210: 0.1
INFO - [G] LONG DT @ 210: 0.1
INFO - [G] LONG DT @ 210: 0.1
INFO - [G] LONG DT @ 210: 0.1
INFO - [G] LONG DT @ 210: 0.1
INFO - [G] LONG DT @ 210: 0.1
INFO - [G] LONG DT @ 210: 0.1
INFO - [G] LONG DT @ 211: 0.1
INFO - [G] LONG DT @ 211: 0.1
INFO - [G] LONG DT @ 211: 0.1
INFO - [G] LONG DT @ 211: 0.1
INFO - [G] LONG DT @ 211: 0.1
INFO - [G] LONG DT @ 211: 0.1
INFO - [G] LONG DT @ 211: 0.1
INFO - [G] LONG DT @ 211: 0.1
INFO - [G] LONG DT @ 211: 0.1
INFO - [G] LONG DT @ 211: 0.1
INFO - [G] LONG DT @ 212: 0.1
INFO - [G] LONG DT @ 212: 0.1
INFO - [G] LONG DT @ 212: 0.1
INFO - [G] LONG DT @ 212: 0.1
INFO - [G] LONG DT @ 212: 0.1
INFO - [G] LONG DT @ 212: 0.1
INFO - [G] LONG DT @ 212: 0.1
INFO - [G] LONG DT @ 212: 0.1
INFO - [G] LONG DT @ 212: 0.1
INFO - [G] LONG DT @ 212: 0.1
INFO - [G] LONG DT @ 213: 0.1
INFO - [G] LONG DT @ 213: 0.1
INFO - [G] LONG DT @ 213: 0.1
INFO - [G] LONG DT @ 213: 0.1
INFO - [G] LONG DT @ 213: 0.1
INFO - [G] LONG DT @ 213: 0.1
INFO - [G] LONG DT @ 213: 0.1
INFO - [G] LONG DT @ 213: 0.1
INFO - [G] LONG DT @ 213: 0.1
INFO - [G] LONG DT @ 213: 0.1
INFO - [G] LONG DT @ 214: 0.1
INFO - [G] LONG DT @ 214: 0.1
INFO - [G] LONG DT @ 214: 0.1
INFO - [G] LONG DT @ 214: 0.1
INFO - [G] LONG DT @ 214: 0.1
INFO - [G] LONG DT @ 214: 0.1
INFO - [G] LONG DT @ 214: 0.1
INFO - [G] LONG DT @ 214: 0.1
INFO - [G] LONG DT @ 214: 0.1
INFO - [G] LONG DT @ 214: 0.1
INFO - [G] LONG DT @ 215: 0.1
INFO - [G] LONG DT @ 215: 0.1
INFO - [G] LONG DT @ 215: 0.1
INFO - [G] LONG DT @ 215: 0.1
INFO - [G] LONG DT @ 215: 0.1
INFO - [G] LONG DT @ 215: 0.1
INFO - [G] LONG DT @ 215: 0.1
INFO - [G] LONG DT @ 215: 0.1
INFO - [G] LONG DT @ 215: 0.1
INFO - [G] LONG DT @ 215: 0.1
INFO - [G] LONG DT @ 216: 0.1
INFO - [G] LONG DT @ 216: 0.1
INFO - [G] LONG DT @ 216: 0.1
INFO - [G] LONG DT @ 216: 0.1
INFO - [G] LONG DT @ 216: 0.1
INFO - [G] LONG DT @ 216: 0.1
INFO - [G] LONG DT @ 216: 0.1
INFO - [G] LONG DT @ 216: 0.1
INFO - [G] LONG DT @ 216: 0.1
INFO - [G] LONG DT @ 216: 0.1
INFO - [G] LONG DT @ 217: 0.1
INFO - [G] LONG DT @ 217: 0.1
INFO - [G] LONG DT @ 217: 0.1
INFO - [G] LONG DT @ 217: 0.1
INFO - [G] LONG DT @ 217: 0.1
INFO - [G] LONG DT @ 217: 0.1
INFO - [G] LONG DT @ 217: 0.1
INFO - [G] LONG DT @ 217: 0.1
INFO - [G] LONG DT @ 217: 0.1
INFO - [G] LONG DT @ 217: 0.1
INFO - [G] LONG DT @ 218: 0.1
INFO - [G] LONG DT @ 218: 0.1
INFO - [G] LONG DT @ 218: 0.1
INFO - [G] LONG DT @ 218: 0.1
INFO - [G] LONG DT @ 218: 0.1
INFO - [G] LONG DT @ 218: 0.1
INFO - [G] LONG DT @ 218: 0.1
INFO - [G] LONG DT @ 218: 0.1
INFO - [G] LONG DT @ 218: 0.1
INFO - [G] LONG DT @ 218: 0.1
INFO - [G] LONG DT @ 219: 0.1
INFO - [G] LONG DT @ 219: 0.1
INFO - [G] LONG DT @ 219: 0.1
INFO - [G] LONG DT @ 219: 0.1
INFO - [G] LONG DT @ 219: 0.1
INFO - [G] LONG DT @ 219: 0.1
INFO - [G] LONG DT @ 219: 0.1
INFO - [G] LONG DT @ 219: 0.1
INFO - [G] LONG DT @ 219: 0.1
INFO - [G] LONG DT @ 219: 0.1
INFO - [G] LONG DT @ 220: 0.1
INFO - [G] LONG DT @ 220: 0.1
INFO - [G] LONG DT @ 220: 0.1
INFO - [G] LONG DT @ 220: 0.1
INFO - [G] LONG DT @ 220: 0.1
INFO - [G] LONG DT @ 220: 0.1
INFO - [G] LONG DT @ 220: 0.1
INFO - [G] LONG DT @ 220: 0.1
INFO - [G] LONG DT @ 220: 0.1
INFO - [G] LONG DT @ 220: 0.1
INFO - [G] LONG DT @ 221: 0.1
INFO - [G] LONG DT @ 221: 0.1
INFO - [G] LONG DT @ 221: 0.1
INFO - [G] LONG DT @ 221: 0.1
INFO - [G] LONG DT @ 221: 0.1
INFO - [G] LONG DT @ 221: 0.1
INFO - [G] LONG DT @ 221: 0.1
INFO - [G] LONG DT @ 221: 0.1
INFO - [G] LONG DT @ 221: 0.1
INFO - [G] LONG DT @ 221: 0.1
INFO - [G] LONG DT @ 222: 0.1
INFO - [G] LONG DT @ 222: 0.1
INFO - [G] LONG DT @ 222: 0.1
INFO - [G] LONG DT @ 222: 0.1
INFO - [G] LONG DT @ 222: 0.1
INFO - [G] LONG DT @ 222: 0.1
INFO - [G] LONG DT @ 222: 0.1
INFO - [G] LONG DT @ 222: 0.1
INFO - [G] LONG DT @ 222: 0.1
INFO - [G] LONG DT @ 222: 0.1
INFO - [G] LONG DT @ 223: 0.1
INFO - [G] LONG DT @ 223: 0.1
INFO - [G] LONG DT @ 223: 0.1
INFO - [G] LONG DT @ 223: 0.1
INFO - [G] LONG DT @ 223: 0.1
INFO - [G] LONG DT @ 223: 0.1
INFO - [G] LONG DT @ 223: 0.1
INFO - [G] LONG DT @ 223: 0.1
INFO - [G] LONG DT @ 223: 0.1
INFO - [G] LONG DT @ 223: 0.1
INFO - [G] LONG DT @ 224: 0.1
INFO - [G] LONG DT @ 224: 0.1
INFO - [G] LONG DT @ 224: 0.1
INFO - [G] LONG DT @ 224: 0.1
INFO - [G] LONG DT @ 224: 0.1
INFO - [G] LONG DT @ 224: 0.1
INFO - [G] LONG DT @ 224: 0.1
INFO - [G] LONG DT @ 224: 0.1
INFO - [G] LONG DT @ 224: 0.1
INFO - [G] LONG DT @ 224: 0.1
INFO - [G] LONG DT @ 225: 0.1
INFO - [G] LONG DT @ 225: 0.1
INFO - [G] LONG DT @ 225: 0.1
INFO - [G] LONG DT @ 225: 0.1
INFO - [G] LONG DT @ 225: 0.1
INFO - [G] LONG DT @ 225: 0.1
INFO - [G] LONG DT @ 225: 0.1
INFO - [G] LONG DT @ 225: 0.1
INFO - [G] LONG DT @ 225: 0.1
INFO - [G] LONG DT @ 225: 0.1
INFO - [G] LONG DT @ 226: 0.1
INFO - [G] LONG DT @ 226: 0.1
INFO - [G] LONG DT @ 226: 0.1
INFO - [G] LONG DT @ 226: 0.1
INFO - [G] LONG DT @ 226: 0.1
INFO - [G] LONG DT @ 226: 0.1
INFO - [G] LONG DT @ 226: 0.081283380000007
INFO - [G] LONG DT @ 226: 0.066030723999999
INFO - [G] LONG DT @ 226: 0.053615339200006
INFO - [G] LONG DT @ 326: 0.1
INFO - [G] LONG DT @ 326: 0.1
INFO - [G] LONG DT @ 326: 0.1
INFO - [G] LONG DT @ 326: 0.1
INFO - [G] LONG DT @ 326: 0.1
INFO - [G] LONG DT @ 326: 0.1
INFO - [G] LONG DT @ 326: 0.1
INFO - [G] LONG DT @ 326: 0.1
INFO - [G] LONG DT @ 327: 0.1
INFO - [G] LONG DT @ 327: 0.1
INFO - [G] LONG DT @ 327: 0.1
INFO - [G] LONG DT @ 327: 0.1
INFO - [G] LONG DT @ 327: 0.1
INFO - [G] LONG DT @ 327: 0.1
INFO - [G] LONG DT @ 327: 0.1
INFO - [G] LONG DT @ 327: 0.081428220000003
INFO - [G] LONG DT @ 327: 0.066303576000004
INFO - [G] LONG DT @ 327: 0.054125840800004
INFO - [G] LONG DT @ 360: 0.1
INFO - [G] LONG DT @ 360: 0.1
INFO - [G] LONG DT @ 361: 0.1
INFO - [G] LONG DT @ 361: 0.1
INFO - [G] LONG DT @ 361: 0.1
INFO - [G] LONG DT @ 361: 0.1
INFO - [G] LONG DT @ 361: 0.1
INFO - [G] LONG DT @ 361: 0.1
INFO - [G] LONG DT @ 361: 0.1
INFO - [G] LONG DT @ 361: 0.1
INFO - [G] LONG DT @ 361: 0.1
INFO - [G] LONG DT @ 361: 0.1
INFO - [G] LONG DT @ 362: 0.1
INFO - [G] LONG DT @ 362: 0.1
INFO - [G] LONG DT @ 362: 0.1
INFO - [G] LONG DT @ 362: 0.1
INFO - [G] LONG DT @ 362: 0.1
INFO - [G] LONG DT @ 362: 0.1
INFO - [G] LONG DT @ 362: 0.1
INFO - [G] LONG DT @ 362: 0.081710219999995
INFO - [G] LONG DT @ 362: 0.066695916000007
INFO - [G] LONG DT @ 362: 0.054951152799998

View file

@ -1,370 +0,0 @@
INFO - [♥] Lovely 0.6.0
INFO - [♥] Game directory is at "Z:\\run\\media\\vomitblood\\DataDisk1\\SteamLibrary\\steamapps\\common\\Balatro"
INFO - [♥] Writing logs to "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\log"
INFO - [♥] Using mod directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods"
INFO - [♥] Cleaning up dumps directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\dump"
INFO - [♥] Initialization complete in 142ms
WARN - [♥] Pattern 'G.ARGS.score_intensity.organ = G.video_organ or G.ARGS.score_intensity.required_score > 0 and math.max(math.min(0.4, 0.1*math.log(G.ARGS.score_intensity.earned_score/(G.ARGS.score_intensity.required_score+1), 5)),0.) or 0' on target 'main.lua' resulted in no matches
WARN - [♥] Pattern 'if type(G.GAME.current_round.current_hand.chips) ~= \'number\' or type(G.GAME.current_round.current_hand.mult) ~= \'number\' then' on target 'main.lua' resulted in no matches
INFO - [♥] Applied 10 patches to 'main.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
WARN - [♥] Pattern 'if not _RELEASE_MODE then' on target 'engine/controller.lua' resulted in no matches
INFO - [♥] Applied 4 patches to 'engine/controller.lua'
INFO - [♥] Applied 13 patches to 'back.lua'
INFO - [♥] Applied 14 patches to 'tag.lua'
INFO - [♥] Applied 2 patches to 'engine/moveable.lua'
INFO - [♥] Applied 2 patches to 'engine/sprite.lua'
INFO - [♥] Applied 2 patches to 'engine/animatedsprite.lua'
WARN - [♥] Pattern 'assembled_string = assembled_string..(type(subpart) == \'string\' and subpart or args.vars[tonumber(subpart[1])] or \'ERROR\')' on target 'functions/misc_functions.lua' resulted in no matches
INFO - [♥] Applied 45 patches to 'functions/misc_functions.lua'
INFO - [♥] Applied 72 patches to 'game.lua'
INFO - [♥] Applied 1 patch to 'globals.lua'
INFO - [♥] Applied 6 patches to 'engine/ui.lua'
WARN - [♥] Pattern '{card_limit = _size, type = \'consumeable\', highlight_limit = 1}' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].chips, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}},' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].mult, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}' on target 'functions/UI_definitions.lua' resulted in no matches
INFO - [♥] Applied 97 patches to 'functions/UI_definitions.lua'
WARN - [♥] Pattern 'ease_to = G.GAME.chips + math.floor(hand_chips * mult) * (e and e.antiscore and -1 or 1),' on target 'functions/state_events.lua' resulted in no matches
INFO - [♥] Applied 98 patches to 'functions/state_events.lua'
WARN - [♥] Pattern 'local cfg = (card and card.ability) or _c[\'config\']' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Regex '(?<indent>[\\t ]*)if G\\.F_NO_ACHIEVEMENTS then return end\\n[\\s\\S][\\s\\S]{16}--\\|LOCAL SETTINGS FILE' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'func = (function() if eval_func(card) then if not first or first then card:juice_up(0.1, 0.1) end;juice_card_until(card, eval_func, nil, 0.8) end return true end)' on target 'functions/common_events.lua' resulted in no matches
INFO - [♥] Applied 121 patches to 'functions/common_events.lua'
WARN - [♥] Pattern 'G.pack_cards:emplace(v)' on target 'functions/button_callbacks.lua' resulted in no matches
INFO - [♥] Applied 47 patches to 'functions/button_callbacks.lua'
WARN - [♥] Pattern 'if self.ability.name == \'Campfire\' and G.GAME.blind.boss and not (G.GAME.blind.config and G.GAME.blind.config.bonus) and self.ability.x_mult > 1 then' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if k ~= \'focused_ui\' and k ~= \"front\" and k ~= \"back\" and k ~= \"soul_parts\" and k ~= \"center\" and k ~= \'floating_sprite\' and k~= \"shadow\" and k~= \"use_button\" and k ~= \'buy_button\' and k ~= \'buy_and_use_button\' and k~= \"debuff\" and k ~= \'price\' and k~= \'particles\' and k ~= \'h_popup\' then v:draw() end' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if G.GAME.blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end' on target 'card.lua' resulted in no matches
INFO - [♥] Applied 203 patches to 'card.lua'
INFO - [♥] Applied 15 patches to 'cardarea.lua'
INFO - [♥] Applied 32 patches to 'blind.lua'
INFO - [♥] Applied 5 patches to 'engine/text.lua'
INFO - [G] Failed to connect to the debug server
INFO - [G] 2025-01-06 17:54:41 :: DEBUG :: DebugConsole :: Steamodded Debug Socket started !
INFO - [♥] Applied 9 patches to 'engine/sound_manager.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
INFO - [G] 2025-01-06 17:54:42 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua
INFO - [G] 2025-01-06 17:54:42 :: TRACE :: Loader :: Saving Mod Info: Cryptid
INFO - [G] 2025-01-06 17:54:42 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua
INFO - [G] 2025-01-06 17:54:42 :: TRACE :: Loader :: Saving Mod Info: Talisman
INFO - [G] Loading file Achievements.lua
INFO - [G] Loading file Antimatter.lua
INFO - [G] Loading file Blinds.lua
INFO - [G] Loading file Challenges.lua
INFO - [G] Loading file CodeCards.lua
INFO - [G] Loading file CryptidJokerDisplay.lua
INFO - [G] Warning: CryptidJokerDisplay.lua has no items
INFO - [G] Loading file Decks.lua
INFO - [G] Loading file Enhanced.lua
INFO - [G] Loading file EpicJokers.lua
INFO - [G] Loading file Exotic.lua
INFO - [G] Loading file M.lua
INFO - [G] Loading file Misc.lua
INFO - [G] Loading file MiscJokers.lua
INFO - [G] Loading file Planets.lua
INFO - [G] Loading file Sleeves.lua
INFO - [G] Loading file Spectrals.lua
INFO - [G] Loading file Spooky.lua
INFO - [G] Loading file Stakes.lua
INFO - [G] Loading file Tags.lua
INFO - [G] Loading file Vouchers.lua
INFO - [G] Loading file dummy_https.lua
INFO - [G] Loading file dummy_timerblinds.lua
INFO - [G] Warning: dummy_timerblinds.lua has no items
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Sticker :: Detected duplicate register call on object perishable
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Sticker :: Detected duplicate register call on object pinned
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Sticker :: Detected duplicate register call on object eternal
INFO - [G] 2025-01-06 17:54:42 :: WARN :: Sticker :: Detected duplicate register call on object rental
INFO - [G] 2025-01-06 17:54:42 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms
INFO - [G] 2025-01-06 17:54:42 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.853 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0030] Injected Atlas in 787.588 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0025] Injected Sound in 19.834 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0032] Injected Stake in 1.880 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0008] Injected Rarity in 0.067 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.112 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0391] Injected Center in 2.593 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.012 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0027] Injected Blind in 0.072 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0002] Injected Seal in 0.064 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0004] Injected Suit in 0.095 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0013] Injected Rank in 0.177 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.032 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.087 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0031] Injected Challenge in 0.035 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0028] Injected Tag in 0.095 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0009] Injected Sticker in 0.089 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0009] Injected Shader in 54.228 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0020] Injected Achievement in 0.053 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 3.124 ms
INFO - [G] 2025-01-06 17:54:43 :: INFO :: TIMER :: [0011] Injected Event in 0.018 ms
INFO - [G] LONG DT @ 1401: 0.1
INFO - [G] LONG DT @ 1401: 0.1
INFO - [G] LONG DT @ 1402: 0.1
INFO - [G] LONG DT @ 1402: 0.1
INFO - [G] LONG DT @ 1402: 0.1
INFO - [G] LONG DT @ 1402: 0.1
INFO - [G] LONG DT @ 1402: 0.1
INFO - [G] LONG DT @ 1402: 0.1
INFO - [G] LONG DT @ 1402: 0.1
INFO - [G] LONG DT @ 1402: 0.1
INFO - [G] LONG DT @ 1402: 0.1
INFO - [G] LONG DT @ 1402: 0.1
INFO - [G] LONG DT @ 1403: 0.1
INFO - [G] LONG DT @ 1403: 0.1
INFO - [G] LONG DT @ 1403: 0.1
INFO - [G] LONG DT @ 1403: 0.1
INFO - [G] LONG DT @ 1403: 0.1
INFO - [G] LONG DT @ 1403: 0.1
INFO - [G] LONG DT @ 1403: 0.1
INFO - [G] LONG DT @ 1403: 0.1
INFO - [G] LONG DT @ 1403: 0.1
INFO - [G] LONG DT @ 1403: 0.1
INFO - [G] LONG DT @ 1404: 0.1
INFO - [G] LONG DT @ 1404: 0.081285999999982
INFO - [G] LONG DT @ 1404: 0.066031859999979
INFO - [G] LONG DT @ 1404: 0.053697567999983
INFO - [G] LONG DT @ 1411: 0.1
INFO - [G] LONG DT @ 1411: 0.081767680000012
INFO - [G] LONG DT @ 1411: 0.066567164000002
INFO - [G] LONG DT @ 1411: 0.1
INFO - [G] LONG DT @ 1411: 0.1
INFO - [G] LONG DT @ 1411: 0.081600499999995
INFO - [G] LONG DT @ 1411: 0.066364679999982
INFO - [G] LONG DT @ 1412: 0.1
INFO - [G] LONG DT @ 1412: 0.081730199999975
INFO - [G] LONG DT @ 1412: 0.066622379999984
INFO - [G] LONG DT @ 1412: 0.1
INFO - [G] LONG DT @ 1412: 0.1
INFO - [G] LONG DT @ 1412: 0.1
INFO - [G] LONG DT @ 1412: 0.1
INFO - [G] LONG DT @ 1412: 0.081709560000018
INFO - [G] LONG DT @ 1412: 0.1
INFO - [G] LONG DT @ 1412: 0.081940880000029
INFO - [G] LONG DT @ 1412: 0.066753623999997
INFO - [G] LONG DT @ 1413: 0.1
INFO - [G] LONG DT @ 1413: 0.081713160000008
INFO - [G] LONG DT @ 1413: 0.066586568000015
INFO - [G] LONG DT @ 1413: 0.1
INFO - [G] LONG DT @ 1413: 0.081658380000026
INFO - [G] LONG DT @ 1413: 0.066325323999994
INFO - [G] LONG DT @ 1413: 0.053997039200024
INFO - [G] LONG DT @ 1446: 0.1
INFO - [G] LONG DT @ 1446: 0.1
INFO - [G] LONG DT @ 1446: 0.081840320000019
INFO - [G] LONG DT @ 1446: 0.1
INFO - [G] LONG DT @ 1446: 0.1
INFO - [G] LONG DT @ 1446: 0.1
INFO - [G] LONG DT @ 1446: 0.1
INFO - [G] LONG DT @ 1446: 0.1
INFO - [G] LONG DT @ 1447: 0.1
INFO - [G] LONG DT @ 1447: 0.1
INFO - [G] LONG DT @ 1447: 0.1
INFO - [G] LONG DT @ 1447: 0.082028060000021
INFO - [G] LONG DT @ 1447: 0.067336968000012
INFO - [G] LONG DT @ 1447: 0.055066294400017
INFO - [G] LONG DT @ 1554: 0.1
INFO - [G] LONG DT @ 1554: 0.1
INFO - [G] LONG DT @ 1554: 0.081597339999989
INFO - [G] LONG DT @ 1554: 0.066234331999989
INFO - [G] LONG DT @ 1554: 0.053803365599989
INFO - [G] LONG DT @ 1605: 0.1
INFO - [G] LONG DT @ 1605: 0.1
INFO - [G] LONG DT @ 1605: 0.1
INFO - [G] LONG DT @ 1605: 0.1
INFO - [G] LONG DT @ 1605: 0.1
INFO - [G] LONG DT @ 1605: 0.1
INFO - [G] LONG DT @ 1606: 0.1
INFO - [G] LONG DT @ 1606: 0.081722380000001
INFO - [G] LONG DT @ 1606: 0.066607564000036
INFO - [G] LONG DT @ 1606: 0.054445931200006
INFO - [G] LONG DT @ 1667: 0.1
INFO - [G] LONG DT @ 1667: 0.1
INFO - [G] LONG DT @ 1667: 0.1
INFO - [G] LONG DT @ 1667: 0.1
INFO - [G] LONG DT @ 1668: 0.1
INFO - [G] LONG DT @ 1668: 0.1
INFO - [G] LONG DT @ 1668: 0.1
INFO - [G] LONG DT @ 1668: 0.1
INFO - [G] LONG DT @ 1668: 0.1
INFO - [G] LONG DT @ 1668: 0.1
INFO - [G] LONG DT @ 1668: 0.1
INFO - [G] LONG DT @ 1668: 0.1
INFO - [G] LONG DT @ 1668: 0.1
INFO - [G] LONG DT @ 1668: 0.081780099999996
INFO - [G] LONG DT @ 1669: 0.06657709999999
INFO - [G] LONG DT @ 1669: 0.054286639999987
INFO - [G] 2025-01-06 18:24:01 :: INFO :: TIMER :: [0000] Injected Language in 0.002 ms
INFO - [G] 2025-01-06 18:24:01 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.939 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0030] Injected Atlas in 772.983 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0025] Injected Sound in 18.565 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0032] Injected Stake in 0.111 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0008] Injected Rarity in 0.019 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.062 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0391] Injected Center in 1.430 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.010 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0027] Injected Blind in 0.034 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0002] Injected Seal in 0.042 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0004] Injected Suit in 0.049 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0013] Injected Rank in 0.023 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.021 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.055 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0031] Injected Challenge in 0.106 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0028] Injected Tag in 0.221 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0009] Injected Sticker in 0.068 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0009] Injected Shader in 21.968 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0020] Injected Achievement in 0.054 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 3.055 ms
INFO - [G] 2025-01-06 18:24:02 :: INFO :: TIMER :: [0011] Injected Event in 0.010 ms
INFO - [G] LONG DT @ 18: 0.1
INFO - [G] LONG DT @ 12: 0.080777819999985
INFO - [G] LONG DT @ 12: 0.064926176000021
INFO - [G] LONG DT @ 12: 0.052253900799991
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0000] Injected Language in 0.002 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.767 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0030] Injected Atlas in 750.861 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0025] Injected Sound in 18.431 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0032] Injected Stake in 0.143 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0008] Injected Rarity in 0.017 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.032 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0391] Injected Center in 1.187 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.008 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0027] Injected Blind in 0.084 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0002] Injected Seal in 0.036 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0004] Injected Suit in 0.049 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0013] Injected Rank in 0.023 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.043 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.075 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0031] Injected Challenge in 0.055 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0028] Injected Tag in 0.079 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0009] Injected Sticker in 0.063 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0009] Injected Shader in 76.396 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0020] Injected Achievement in 0.071 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 3.298 ms
INFO - [G] 2025-01-06 18:24:12 :: INFO :: TIMER :: [0011] Injected Event in 0.013 ms
INFO - [G] LONG DT @ 21: 0.1
INFO - [G] LONG DT @ 12: 0.080835899999993
INFO - [G] LONG DT @ 12: 0.064991679999988
INFO - [G] LONG DT @ 12: 0.052397784000002
INFO - [G] LONG DT @ 13: 0.1
INFO - [G] LONG DT @ 13: 0.1
INFO - [G] LONG DT @ 13: 0.1
INFO - [G] LONG DT @ 13: 0.1
INFO - [G] LONG DT @ 13: 0.1
INFO - [G] LONG DT @ 13: 0.1
INFO - [G] LONG DT @ 13: 0.1
INFO - [G] LONG DT @ 13: 0.1
INFO - [G] LONG DT @ 13: 0.1
INFO - [G] LONG DT @ 13: 0.1
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 14: 0.1
INFO - [G] LONG DT @ 15: 0.1
INFO - [G] LONG DT @ 15: 0.1
INFO - [G] LONG DT @ 15: 0.1
INFO - [G] LONG DT @ 15: 0.1
INFO - [G] LONG DT @ 15: 0.1
INFO - [G] LONG DT @ 15: 0.1
INFO - [G] LONG DT @ 15: 0.1
INFO - [G] LONG DT @ 15: 0.1
INFO - [G] LONG DT @ 15: 0.1
INFO - [G] LONG DT @ 15: 0.1
INFO - [G] LONG DT @ 16: 0.1
INFO - [G] LONG DT @ 16: 0.1
INFO - [G] LONG DT @ 16: 0.1
INFO - [G] LONG DT @ 16: 0.1
INFO - [G] LONG DT @ 16: 0.1
INFO - [G] LONG DT @ 16: 0.1
INFO - [G] LONG DT @ 16: 0.1
INFO - [G] LONG DT @ 16: 0.1
INFO - [G] LONG DT @ 16: 0.1
INFO - [G] LONG DT @ 16: 0.1
INFO - [G] LONG DT @ 17: 0.1
INFO - [G] LONG DT @ 17: 0.1
INFO - [G] LONG DT @ 17: 0.1
INFO - [G] LONG DT @ 17: 0.1
INFO - [G] LONG DT @ 17: 0.1
INFO - [G] LONG DT @ 17: 0.1
INFO - [G] LONG DT @ 17: 0.1
INFO - [G] LONG DT @ 17: 0.1
INFO - [G] LONG DT @ 17: 0.1
INFO - [G] LONG DT @ 17: 0.1
INFO - [G] LONG DT @ 18: 0.080871459999962
INFO - [G] LONG DT @ 18: 0.065903347999978
INFO - [G] LONG DT @ 18: 0.053924178400007
INFO - [G] ERROR LOADING GAME: Card area 'shop_vouchers' not instantiated before load
INFO - [G] ERROR LOADING GAME: Card area 'shop_jokers' not instantiated before load
INFO - [G] ERROR LOADING GAME: Card area 'shop_booster' not instantiated before load
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 137: 0.1
INFO - [G] LONG DT @ 137: 0.1
INFO - [G] LONG DT @ 137: 0.1
INFO - [G] LONG DT @ 137: 0.1
INFO - [G] LONG DT @ 137: 0.1
INFO - [G] LONG DT @ 137: 0.1
INFO - [G] LONG DT @ 137: 0.1
INFO - [G] LONG DT @ 137: 0.1
INFO - [G] LONG DT @ 137: 0.1
INFO - [G] LONG DT @ 137: 0.1
INFO - [G] LONG DT @ 138: 0.1
INFO - [G] LONG DT @ 138: 0.081146120000067
INFO - [G] LONG DT @ 138: 0.065857816000047
INFO - [G] LONG DT @ 138: 0.05390055280003
INFO - [G] 2025-01-06 18:41:18 :: INFO :: TIMER :: [0000] Injected Language in 0.002 ms
INFO - [G] 2025-01-06 18:41:18 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.747 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0030] Injected Atlas in 762.820 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0025] Injected Sound in 18.082 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0032] Injected Stake in 0.378 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0008] Injected Rarity in 0.021 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.034 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0391] Injected Center in 0.985 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.008 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0027] Injected Blind in 0.027 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0002] Injected Seal in 0.038 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0004] Injected Suit in 0.049 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0013] Injected Rank in 0.022 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.022 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.039 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0031] Injected Challenge in 0.023 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0028] Injected Tag in 0.036 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0009] Injected Sticker in 0.082 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0009] Injected Shader in 54.513 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0020] Injected Achievement in 0.059 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 3.200 ms
INFO - [G] 2025-01-06 18:41:19 :: INFO :: TIMER :: [0011] Injected Event in 0.011 ms
INFO - [G] LONG DT @ 19: 0.1
INFO - [G] LONG DT @ 12: 0.081048679999985
INFO - [G] LONG DT @ 12: 0.065136364000049
INFO - [G] LONG DT @ 12: 0.052441751200043

View file

@ -1,408 +0,0 @@
INFO - [♥] Lovely 0.6.0
INFO - [♥] Game directory is at "Z:\\run\\media\\vomitblood\\DataDisk1\\SteamLibrary\\steamapps\\common\\Balatro"
INFO - [♥] Writing logs to "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\log"
INFO - [♥] Using mod directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods"
INFO - [♥] Cleaning up dumps directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\dump"
INFO - [♥] Initialization complete in 136ms
WARN - [♥] Pattern 'G.ARGS.score_intensity.organ = G.video_organ or G.ARGS.score_intensity.required_score > 0 and math.max(math.min(0.4, 0.1*math.log(G.ARGS.score_intensity.earned_score/(G.ARGS.score_intensity.required_score+1), 5)),0.) or 0' on target 'main.lua' resulted in no matches
WARN - [♥] Pattern 'if type(G.GAME.current_round.current_hand.chips) ~= \'number\' or type(G.GAME.current_round.current_hand.mult) ~= \'number\' then' on target 'main.lua' resulted in no matches
INFO - [♥] Applied 10 patches to 'main.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
WARN - [♥] Pattern 'if not _RELEASE_MODE then' on target 'engine/controller.lua' resulted in no matches
INFO - [♥] Applied 4 patches to 'engine/controller.lua'
INFO - [♥] Applied 13 patches to 'back.lua'
INFO - [♥] Applied 14 patches to 'tag.lua'
INFO - [♥] Applied 2 patches to 'engine/moveable.lua'
INFO - [♥] Applied 2 patches to 'engine/sprite.lua'
INFO - [♥] Applied 2 patches to 'engine/animatedsprite.lua'
WARN - [♥] Pattern 'assembled_string = assembled_string..(type(subpart) == \'string\' and subpart or args.vars[tonumber(subpart[1])] or \'ERROR\')' on target 'functions/misc_functions.lua' resulted in no matches
INFO - [♥] Applied 45 patches to 'functions/misc_functions.lua'
INFO - [♥] Applied 72 patches to 'game.lua'
INFO - [♥] Applied 1 patch to 'globals.lua'
INFO - [♥] Applied 6 patches to 'engine/ui.lua'
WARN - [♥] Pattern '{card_limit = _size, type = \'consumeable\', highlight_limit = 1}' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].chips, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}},' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].mult, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}' on target 'functions/UI_definitions.lua' resulted in no matches
INFO - [♥] Applied 97 patches to 'functions/UI_definitions.lua'
WARN - [♥] Pattern 'ease_to = G.GAME.chips + math.floor(hand_chips * mult) * (e and e.antiscore and -1 or 1),' on target 'functions/state_events.lua' resulted in no matches
INFO - [♥] Applied 98 patches to 'functions/state_events.lua'
WARN - [♥] Pattern 'local cfg = (card and card.ability) or _c[\'config\']' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Regex '(?<indent>[\\t ]*)if G\\.F_NO_ACHIEVEMENTS then return end\\n[\\s\\S][\\s\\S]{16}--\\|LOCAL SETTINGS FILE' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'func = (function() if eval_func(card) then if not first or first then card:juice_up(0.1, 0.1) end;juice_card_until(card, eval_func, nil, 0.8) end return true end)' on target 'functions/common_events.lua' resulted in no matches
INFO - [♥] Applied 121 patches to 'functions/common_events.lua'
WARN - [♥] Pattern 'G.pack_cards:emplace(v)' on target 'functions/button_callbacks.lua' resulted in no matches
INFO - [♥] Applied 47 patches to 'functions/button_callbacks.lua'
WARN - [♥] Pattern 'if self.ability.name == \'Campfire\' and G.GAME.blind.boss and not (G.GAME.blind.config and G.GAME.blind.config.bonus) and self.ability.x_mult > 1 then' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if k ~= \'focused_ui\' and k ~= \"front\" and k ~= \"back\" and k ~= \"soul_parts\" and k ~= \"center\" and k ~= \'floating_sprite\' and k~= \"shadow\" and k~= \"use_button\" and k ~= \'buy_button\' and k ~= \'buy_and_use_button\' and k~= \"debuff\" and k ~= \'price\' and k~= \'particles\' and k ~= \'h_popup\' then v:draw() end' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if G.GAME.blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end' on target 'card.lua' resulted in no matches
INFO - [♥] Applied 203 patches to 'card.lua'
INFO - [♥] Applied 15 patches to 'cardarea.lua'
INFO - [♥] Applied 32 patches to 'blind.lua'
INFO - [♥] Applied 5 patches to 'engine/text.lua'
INFO - [G] Failed to connect to the debug server
INFO - [G] 2025-01-06 23:32:19 :: DEBUG :: DebugConsole :: Steamodded Debug Socket started !
INFO - [♥] Applied 9 patches to 'engine/sound_manager.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
INFO - [G] 2025-01-06 23:32:19 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua
INFO - [G] 2025-01-06 23:32:19 :: TRACE :: Loader :: Saving Mod Info: Cryptid
INFO - [G] 2025-01-06 23:32:19 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua
INFO - [G] 2025-01-06 23:32:19 :: TRACE :: Loader :: Saving Mod Info: Talisman
INFO - [G] Loading file Achievements.lua
INFO - [G] Loading file Antimatter.lua
INFO - [G] Loading file Blinds.lua
INFO - [G] Loading file Challenges.lua
INFO - [G] Loading file CodeCards.lua
INFO - [G] Loading file CryptidJokerDisplay.lua
INFO - [G] Warning: CryptidJokerDisplay.lua has no items
INFO - [G] Loading file Decks.lua
INFO - [G] Loading file Enhanced.lua
INFO - [G] Loading file EpicJokers.lua
INFO - [G] Loading file Exotic.lua
INFO - [G] Loading file M.lua
INFO - [G] Loading file Misc.lua
INFO - [G] Loading file MiscJokers.lua
INFO - [G] Loading file Planets.lua
INFO - [G] Loading file Sleeves.lua
INFO - [G] Loading file Spectrals.lua
INFO - [G] Loading file Spooky.lua
INFO - [G] Loading file Stakes.lua
INFO - [G] Loading file Tags.lua
INFO - [G] Loading file Vouchers.lua
INFO - [G] Loading file dummy_https.lua
INFO - [G] Loading file dummy_timerblinds.lua
INFO - [G] Warning: dummy_timerblinds.lua has no items
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Sticker :: Detected duplicate register call on object perishable
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Sticker :: Detected duplicate register call on object pinned
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Sticker :: Detected duplicate register call on object eternal
INFO - [G] 2025-01-06 23:32:19 :: WARN :: Sticker :: Detected duplicate register call on object rental
INFO - [G] 2025-01-06 23:32:19 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms
INFO - [G] 2025-01-06 23:32:19 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.890 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0030] Injected Atlas in 788.181 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0025] Injected Sound in 21.314 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0032] Injected Stake in 1.667 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0008] Injected Rarity in 0.074 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.126 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0391] Injected Center in 2.374 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.012 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0027] Injected Blind in 0.188 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0002] Injected Seal in 0.058 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0004] Injected Suit in 0.115 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0013] Injected Rank in 0.212 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.031 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.202 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0031] Injected Challenge in 0.078 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0028] Injected Tag in 0.091 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0009] Injected Sticker in 0.209 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0009] Injected Shader in 53.804 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0020] Injected Achievement in 0.092 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 3.056 ms
INFO - [G] 2025-01-06 23:32:20 :: INFO :: TIMER :: [0011] Injected Event in 0.014 ms
INFO - [G] LONG DT @ 68: 0.1
INFO - [G] LONG DT @ 68: 0.1
INFO - [G] LONG DT @ 68: 0.1
INFO - [G] LONG DT @ 68: 0.1
INFO - [G] LONG DT @ 68: 0.1
INFO - [G] LONG DT @ 68: 0.1
INFO - [G] LONG DT @ 68: 0.1
INFO - [G] LONG DT @ 68: 0.1
INFO - [G] LONG DT @ 69: 0.1
INFO - [G] LONG DT @ 69: 0.1
INFO - [G] LONG DT @ 69: 0.1
INFO - [G] LONG DT @ 69: 0.1
INFO - [G] LONG DT @ 69: 0.1
INFO - [G] LONG DT @ 69: 0.1
INFO - [G] LONG DT @ 69: 0.1
INFO - [G] LONG DT @ 69: 0.1
INFO - [G] LONG DT @ 69: 0.1
INFO - [G] LONG DT @ 69: 0.1
INFO - [G] LONG DT @ 70: 0.1
INFO - [G] LONG DT @ 70: 0.1
INFO - [G] LONG DT @ 70: 0.1
INFO - [G] LONG DT @ 70: 0.1
INFO - [G] LONG DT @ 70: 0.1
INFO - [G] LONG DT @ 70: 0.1
INFO - [G] LONG DT @ 70: 0.1
INFO - [G] LONG DT @ 70: 0.1
INFO - [G] LONG DT @ 70: 0.1
INFO - [G] LONG DT @ 70: 0.1
INFO - [G] LONG DT @ 71: 0.1
INFO - [G] LONG DT @ 71: 0.1
INFO - [G] LONG DT @ 71: 0.1
INFO - [G] LONG DT @ 71: 0.1
INFO - [G] LONG DT @ 71: 0.1
INFO - [G] LONG DT @ 71: 0.1
INFO - [G] LONG DT @ 71: 0.1
INFO - [G] LONG DT @ 71: 0.1
INFO - [G] LONG DT @ 71: 0.1
INFO - [G] LONG DT @ 71: 0.1
INFO - [G] LONG DT @ 72: 0.1
INFO - [G] LONG DT @ 72: 0.1
INFO - [G] LONG DT @ 72: 0.1
INFO - [G] LONG DT @ 72: 0.1
INFO - [G] LONG DT @ 72: 0.1
INFO - [G] LONG DT @ 72: 0.1
INFO - [G] LONG DT @ 72: 0.1
INFO - [G] LONG DT @ 72: 0.1
INFO - [G] LONG DT @ 72: 0.1
INFO - [G] LONG DT @ 72: 0.1
INFO - [G] LONG DT @ 73: 0.1
INFO - [G] LONG DT @ 73: 0.1
INFO - [G] LONG DT @ 73: 0.1
INFO - [G] LONG DT @ 73: 0.1
INFO - [G] LONG DT @ 73: 0.1
INFO - [G] LONG DT @ 73: 0.1
INFO - [G] LONG DT @ 73: 0.1
INFO - [G] LONG DT @ 73: 0.1
INFO - [G] LONG DT @ 73: 0.1
INFO - [G] LONG DT @ 73: 0.1
INFO - [G] LONG DT @ 74: 0.1
INFO - [G] LONG DT @ 74: 0.1
INFO - [G] LONG DT @ 74: 0.1
INFO - [G] LONG DT @ 74: 0.1
INFO - [G] LONG DT @ 74: 0.1
INFO - [G] LONG DT @ 74: 0.1
INFO - [G] LONG DT @ 74: 0.1
INFO - [G] LONG DT @ 74: 0.081261959999999
INFO - [G] LONG DT @ 74: 0.066264627999999
INFO - [G] LONG DT @ 74: 0.054103482400001
INFO - [G] LONG DT @ 80: 0.1
INFO - [G] LONG DT @ 80: 0.1
INFO - [G] LONG DT @ 80: 0.1
INFO - [G] LONG DT @ 80: 0.1
INFO - [G] LONG DT @ 81: 0.1
INFO - [G] LONG DT @ 81: 0.1
INFO - [G] LONG DT @ 81: 0.1
INFO - [G] LONG DT @ 81: 0.1
INFO - [G] LONG DT @ 81: 0.1
INFO - [G] LONG DT @ 81: 0.1
INFO - [G] LONG DT @ 81: 0.1
INFO - [G] LONG DT @ 81: 0.1
INFO - [G] LONG DT @ 81: 0.1
INFO - [G] LONG DT @ 81: 0.1
INFO - [G] LONG DT @ 82: 0.1
INFO - [G] LONG DT @ 82: 0.1
INFO - [G] LONG DT @ 82: 0.1
INFO - [G] LONG DT @ 82: 0.1
INFO - [G] LONG DT @ 82: 0.1
INFO - [G] LONG DT @ 82: 0.1
INFO - [G] LONG DT @ 82: 0.1
INFO - [G] LONG DT @ 82: 0.1
INFO - [G] LONG DT @ 82: 0.1
INFO - [G] LONG DT @ 82: 0.1
INFO - [G] LONG DT @ 83: 0.1
INFO - [G] LONG DT @ 83: 0.1
INFO - [G] LONG DT @ 83: 0.1
INFO - [G] LONG DT @ 83: 0.1
INFO - [G] LONG DT @ 83: 0.1
INFO - [G] LONG DT @ 83: 0.1
INFO - [G] LONG DT @ 83: 0.1
INFO - [G] LONG DT @ 83: 0.1
INFO - [G] LONG DT @ 83: 0.1
INFO - [G] LONG DT @ 83: 0.1
INFO - [G] LONG DT @ 84: 0.1
INFO - [G] LONG DT @ 84: 0.1
INFO - [G] LONG DT @ 84: 0.1
INFO - [G] LONG DT @ 84: 0.1
INFO - [G] LONG DT @ 84: 0.1
INFO - [G] LONG DT @ 84: 0.1
INFO - [G] LONG DT @ 84: 0.1
INFO - [G] LONG DT @ 84: 0.1
INFO - [G] LONG DT @ 84: 0.1
INFO - [G] LONG DT @ 84: 0.1
INFO - [G] LONG DT @ 85: 0.1
INFO - [G] LONG DT @ 85: 0.1
INFO - [G] LONG DT @ 85: 0.1
INFO - [G] LONG DT @ 85: 0.1
INFO - [G] LONG DT @ 85: 0.1
INFO - [G] LONG DT @ 85: 0.1
INFO - [G] LONG DT @ 85: 0.1
INFO - [G] LONG DT @ 85: 0.1
INFO - [G] LONG DT @ 85: 0.1
INFO - [G] LONG DT @ 85: 0.1
INFO - [G] LONG DT @ 86: 0.1
INFO - [G] LONG DT @ 86: 0.1
INFO - [G] LONG DT @ 86: 0.1
INFO - [G] LONG DT @ 86: 0.1
INFO - [G] LONG DT @ 86: 0.1
INFO - [G] LONG DT @ 86: 0.1
INFO - [G] LONG DT @ 86: 0.1
INFO - [G] LONG DT @ 86: 0.1
INFO - [G] LONG DT @ 86: 0.1
INFO - [G] LONG DT @ 86: 0.1
INFO - [G] LONG DT @ 87: 0.1
INFO - [G] LONG DT @ 87: 0.1
INFO - [G] LONG DT @ 87: 0.081094640000002
INFO - [G] LONG DT @ 87: 0.065771371999999
INFO - [G] LONG DT @ 87: 0.053828057600003
INFO - [G] LONG DT @ 131: 0.1
INFO - [G] LONG DT @ 131: 0.1
INFO - [G] LONG DT @ 132: 0.1
INFO - [G] LONG DT @ 132: 0.1
INFO - [G] LONG DT @ 132: 0.1
INFO - [G] LONG DT @ 132: 0.1
INFO - [G] LONG DT @ 132: 0.1
INFO - [G] LONG DT @ 132: 0.1
INFO - [G] LONG DT @ 132: 0.1
INFO - [G] LONG DT @ 132: 0.1
INFO - [G] LONG DT @ 132: 0.1
INFO - [G] LONG DT @ 132: 0.1
INFO - [G] LONG DT @ 133: 0.1
INFO - [G] LONG DT @ 133: 0.1
INFO - [G] LONG DT @ 133: 0.1
INFO - [G] LONG DT @ 133: 0.1
INFO - [G] LONG DT @ 133: 0.1
INFO - [G] LONG DT @ 133: 0.1
INFO - [G] LONG DT @ 133: 0.1
INFO - [G] LONG DT @ 133: 0.1
INFO - [G] LONG DT @ 133: 0.1
INFO - [G] LONG DT @ 133: 0.1
INFO - [G] LONG DT @ 134: 0.1
INFO - [G] LONG DT @ 134: 0.1
INFO - [G] LONG DT @ 134: 0.1
INFO - [G] LONG DT @ 134: 0.1
INFO - [G] LONG DT @ 134: 0.1
INFO - [G] LONG DT @ 134: 0.1
INFO - [G] LONG DT @ 134: 0.1
INFO - [G] LONG DT @ 134: 0.1
INFO - [G] LONG DT @ 134: 0.1
INFO - [G] LONG DT @ 134: 0.1
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 135: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.1
INFO - [G] LONG DT @ 136: 0.081191100000005
INFO - [G] LONG DT @ 136: 0.066190239999998
INFO - [G] LONG DT @ 136: 0.054027572000007
INFO - [G] LONG DT @ 138: 0.1
INFO - [G] LONG DT @ 139: 0.1
INFO - [G] LONG DT @ 139: 0.1
INFO - [G] LONG DT @ 139: 0.1
INFO - [G] LONG DT @ 139: 0.1
INFO - [G] LONG DT @ 139: 0.1
INFO - [G] LONG DT @ 139: 0.1
INFO - [G] LONG DT @ 139: 0.1
INFO - [G] LONG DT @ 139: 0.1
INFO - [G] LONG DT @ 139: 0.1
INFO - [G] LONG DT @ 139: 0.1
INFO - [G] LONG DT @ 140: 0.1
INFO - [G] LONG DT @ 140: 0.1
INFO - [G] LONG DT @ 140: 0.1
INFO - [G] LONG DT @ 140: 0.1
INFO - [G] LONG DT @ 140: 0.1
INFO - [G] LONG DT @ 140: 0.1
INFO - [G] LONG DT @ 140: 0.1
INFO - [G] LONG DT @ 140: 0.1
INFO - [G] LONG DT @ 140: 0.1
INFO - [G] LONG DT @ 140: 0.1
INFO - [G] LONG DT @ 141: 0.1
INFO - [G] LONG DT @ 141: 0.1
INFO - [G] LONG DT @ 141: 0.1
INFO - [G] LONG DT @ 141: 0.1
INFO - [G] LONG DT @ 141: 0.1
INFO - [G] LONG DT @ 141: 0.1
INFO - [G] LONG DT @ 141: 0.1
INFO - [G] LONG DT @ 141: 0.1
INFO - [G] LONG DT @ 141: 0.1
INFO - [G] LONG DT @ 141: 0.1
INFO - [G] LONG DT @ 142: 0.1
INFO - [G] LONG DT @ 142: 0.1
INFO - [G] LONG DT @ 142: 0.1
INFO - [G] LONG DT @ 142: 0.1
INFO - [G] LONG DT @ 142: 0.1
INFO - [G] LONG DT @ 142: 0.1
INFO - [G] LONG DT @ 142: 0.1
INFO - [G] LONG DT @ 142: 0.1
INFO - [G] LONG DT @ 142: 0.1
INFO - [G] LONG DT @ 142: 0.1
INFO - [G] LONG DT @ 143: 0.1
INFO - [G] LONG DT @ 143: 0.1
INFO - [G] LONG DT @ 143: 0.1
INFO - [G] LONG DT @ 143: 0.1
INFO - [G] LONG DT @ 143: 0.1
INFO - [G] LONG DT @ 143: 0.1
INFO - [G] LONG DT @ 143: 0.1
INFO - [G] LONG DT @ 143: 0.1
INFO - [G] LONG DT @ 143: 0.1
INFO - [G] LONG DT @ 143: 0.1
INFO - [G] LONG DT @ 144: 0.1
INFO - [G] LONG DT @ 144: 0.1
INFO - [G] LONG DT @ 144: 0.1
INFO - [G] LONG DT @ 144: 0.1
INFO - [G] LONG DT @ 144: 0.1
INFO - [G] LONG DT @ 144: 0.1
INFO - [G] LONG DT @ 144: 0.1
INFO - [G] LONG DT @ 144: 0.1
INFO - [G] LONG DT @ 144: 0.1
INFO - [G] LONG DT @ 144: 0.1
INFO - [G] LONG DT @ 145: 0.1
INFO - [G] LONG DT @ 145: 0.1
INFO - [G] LONG DT @ 145: 0.1
INFO - [G] LONG DT @ 145: 0.1
INFO - [G] LONG DT @ 145: 0.1
INFO - [G] LONG DT @ 145: 0.1
INFO - [G] LONG DT @ 145: 0.1
INFO - [G] LONG DT @ 145: 0.1
INFO - [G] LONG DT @ 145: 0.1
INFO - [G] LONG DT @ 145: 0.1
INFO - [G] LONG DT @ 146: 0.1
INFO - [G] LONG DT @ 146: 0.1
INFO - [G] LONG DT @ 146: 0.1
INFO - [G] LONG DT @ 146: 0.1
INFO - [G] LONG DT @ 146: 0.1
INFO - [G] LONG DT @ 146: 0.1
INFO - [G] LONG DT @ 146: 0.1
INFO - [G] LONG DT @ 146: 0.1
INFO - [G] LONG DT @ 146: 0.1
INFO - [G] LONG DT @ 146: 0.1
INFO - [G] LONG DT @ 147: 0.1
INFO - [G] LONG DT @ 147: 0.1
INFO - [G] LONG DT @ 147: 0.1
INFO - [G] LONG DT @ 147: 0.1
INFO - [G] LONG DT @ 147: 0.1
INFO - [G] LONG DT @ 147: 0.1
INFO - [G] LONG DT @ 147: 0.1
INFO - [G] LONG DT @ 147: 0.1
INFO - [G] LONG DT @ 147: 0.1
INFO - [G] LONG DT @ 147: 0.1
INFO - [G] LONG DT @ 148: 0.1
INFO - [G] LONG DT @ 148: 0.1
INFO - [G] LONG DT @ 148: 0.1
INFO - [G] LONG DT @ 148: 0.1
INFO - [G] LONG DT @ 148: 0.1
INFO - [G] LONG DT @ 148: 0.1
INFO - [G] LONG DT @ 148: 0.1
INFO - [G] LONG DT @ 148: 0.1
INFO - [G] LONG DT @ 148: 0.1
INFO - [G] LONG DT @ 148: 0.1
INFO - [G] LONG DT @ 149: 0.1
INFO - [G] LONG DT @ 149: 0.1
INFO - [G] LONG DT @ 149: 0.1
INFO - [G] LONG DT @ 149: 0.0812112
INFO - [G] LONG DT @ 149: 0.066017799999999
INFO - [G] LONG DT @ 149: 0.053712919999999

View file

@ -1,118 +0,0 @@
INFO - [♥] Lovely 0.6.0
INFO - [♥] Game directory is at "Z:\\run\\media\\vomitblood\\DataDisk1\\SteamLibrary\\steamapps\\common\\Balatro"
INFO - [♥] Writing logs to "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\log"
INFO - [♥] Using mod directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods"
INFO - [♥] Cleaning up dumps directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\dump"
INFO - [♥] Initialization complete in 131ms
WARN - [♥] Pattern 'G.ARGS.score_intensity.organ = G.video_organ or G.ARGS.score_intensity.required_score > 0 and math.max(math.min(0.4, 0.1*math.log(G.ARGS.score_intensity.earned_score/(G.ARGS.score_intensity.required_score+1), 5)),0.) or 0' on target 'main.lua' resulted in no matches
WARN - [♥] Pattern 'if type(G.GAME.current_round.current_hand.chips) ~= \'number\' or type(G.GAME.current_round.current_hand.mult) ~= \'number\' then' on target 'main.lua' resulted in no matches
INFO - [♥] Applied 10 patches to 'main.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
WARN - [♥] Pattern 'if not _RELEASE_MODE then' on target 'engine/controller.lua' resulted in no matches
INFO - [♥] Applied 4 patches to 'engine/controller.lua'
INFO - [♥] Applied 13 patches to 'back.lua'
INFO - [♥] Applied 14 patches to 'tag.lua'
INFO - [♥] Applied 2 patches to 'engine/moveable.lua'
INFO - [♥] Applied 2 patches to 'engine/sprite.lua'
INFO - [♥] Applied 2 patches to 'engine/animatedsprite.lua'
WARN - [♥] Pattern 'assembled_string = assembled_string..(type(subpart) == \'string\' and subpart or args.vars[tonumber(subpart[1])] or \'ERROR\')' on target 'functions/misc_functions.lua' resulted in no matches
INFO - [♥] Applied 45 patches to 'functions/misc_functions.lua'
INFO - [♥] Applied 72 patches to 'game.lua'
INFO - [♥] Applied 1 patch to 'globals.lua'
INFO - [♥] Applied 6 patches to 'engine/ui.lua'
WARN - [♥] Pattern '{card_limit = _size, type = \'consumeable\', highlight_limit = 1}' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].chips, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}},' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].mult, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}' on target 'functions/UI_definitions.lua' resulted in no matches
INFO - [♥] Applied 97 patches to 'functions/UI_definitions.lua'
WARN - [♥] Pattern 'ease_to = G.GAME.chips + math.floor(hand_chips * mult) * (e and e.antiscore and -1 or 1),' on target 'functions/state_events.lua' resulted in no matches
INFO - [♥] Applied 98 patches to 'functions/state_events.lua'
WARN - [♥] Pattern 'local cfg = (card and card.ability) or _c[\'config\']' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Regex '(?<indent>[\\t ]*)if G\\.F_NO_ACHIEVEMENTS then return end\\n[\\s\\S][\\s\\S]{16}--\\|LOCAL SETTINGS FILE' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'func = (function() if eval_func(card) then if not first or first then card:juice_up(0.1, 0.1) end;juice_card_until(card, eval_func, nil, 0.8) end return true end)' on target 'functions/common_events.lua' resulted in no matches
INFO - [♥] Applied 121 patches to 'functions/common_events.lua'
WARN - [♥] Pattern 'G.pack_cards:emplace(v)' on target 'functions/button_callbacks.lua' resulted in no matches
INFO - [♥] Applied 47 patches to 'functions/button_callbacks.lua'
WARN - [♥] Pattern 'if self.ability.name == \'Campfire\' and G.GAME.blind.boss and not (G.GAME.blind.config and G.GAME.blind.config.bonus) and self.ability.x_mult > 1 then' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if k ~= \'focused_ui\' and k ~= \"front\" and k ~= \"back\" and k ~= \"soul_parts\" and k ~= \"center\" and k ~= \'floating_sprite\' and k~= \"shadow\" and k~= \"use_button\" and k ~= \'buy_button\' and k ~= \'buy_and_use_button\' and k~= \"debuff\" and k ~= \'price\' and k~= \'particles\' and k ~= \'h_popup\' then v:draw() end' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if G.GAME.blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end' on target 'card.lua' resulted in no matches
INFO - [♥] Applied 203 patches to 'card.lua'
INFO - [♥] Applied 15 patches to 'cardarea.lua'
INFO - [♥] Applied 32 patches to 'blind.lua'
INFO - [♥] Applied 5 patches to 'engine/text.lua'
INFO - [G] Failed to connect to the debug server
INFO - [G] 2025-01-07 02:04:05 :: DEBUG :: DebugConsole :: Steamodded Debug Socket started !
INFO - [♥] Applied 9 patches to 'engine/sound_manager.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
INFO - [G] 2025-01-07 02:04:06 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua
INFO - [G] 2025-01-07 02:04:06 :: TRACE :: Loader :: Saving Mod Info: Cryptid
INFO - [G] 2025-01-07 02:04:06 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua
INFO - [G] 2025-01-07 02:04:06 :: TRACE :: Loader :: Saving Mod Info: Talisman
INFO - [G] Loading file Achievements.lua
INFO - [G] Loading file Antimatter.lua
INFO - [G] Loading file Blinds.lua
INFO - [G] Loading file Challenges.lua
INFO - [G] Loading file CodeCards.lua
INFO - [G] Loading file CryptidJokerDisplay.lua
INFO - [G] Warning: CryptidJokerDisplay.lua has no items
INFO - [G] Loading file Decks.lua
INFO - [G] Loading file Enhanced.lua
INFO - [G] Loading file EpicJokers.lua
INFO - [G] Loading file Exotic.lua
INFO - [G] Loading file M.lua
INFO - [G] Loading file Misc.lua
INFO - [G] Loading file MiscJokers.lua
INFO - [G] Loading file Planets.lua
INFO - [G] Loading file Sleeves.lua
INFO - [G] Loading file Spectrals.lua
INFO - [G] Loading file Spooky.lua
INFO - [G] Loading file Stakes.lua
INFO - [G] Loading file Tags.lua
INFO - [G] Loading file Vouchers.lua
INFO - [G] Loading file dummy_https.lua
INFO - [G] Loading file dummy_timerblinds.lua
INFO - [G] Warning: dummy_timerblinds.lua has no items
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Sticker :: Detected duplicate register call on object perishable
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Sticker :: Detected duplicate register call on object pinned
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Sticker :: Detected duplicate register call on object eternal
INFO - [G] 2025-01-07 02:04:06 :: WARN :: Sticker :: Detected duplicate register call on object rental
INFO - [G] 2025-01-07 02:04:06 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms
INFO - [G] 2025-01-07 02:04:06 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.883 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0030] Injected Atlas in 785.442 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0025] Injected Sound in 21.318 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0032] Injected Stake in 1.772 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0008] Injected Rarity in 0.099 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.094 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0391] Injected Center in 2.605 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.010 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0027] Injected Blind in 0.434 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0002] Injected Seal in 0.055 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0004] Injected Suit in 0.066 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0013] Injected Rank in 0.081 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.028 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.083 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0031] Injected Challenge in 0.039 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0028] Injected Tag in 0.777 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0009] Injected Sticker in 0.498 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0009] Injected Shader in 57.738 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0020] Injected Achievement in 0.056 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 3.307 ms
INFO - [G] 2025-01-07 02:04:07 :: INFO :: TIMER :: [0011] Injected Event in 0.015 ms
INFO - [G] LONG DT @ 22: 0.1
INFO - [G] LONG DT @ 22: 0.1
INFO - [G] LONG DT @ 22: 0.08386144
INFO - [G] LONG DT @ 22: 0.070841552
INFO - [G] LONG DT @ 22: 0.0602701216
INFO - [G] LONG DT @ 22: 0.05176605728

View file

@ -1,120 +0,0 @@
INFO - [♥] Lovely 0.6.0
INFO - [♥] Game directory is at "Z:\\run\\media\\vomitblood\\DataDisk1\\SteamLibrary\\steamapps\\common\\Balatro"
INFO - [♥] Writing logs to "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\log"
INFO - [♥] Using mod directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods"
INFO - [♥] Cleaning up dumps directory at "C:\\users\\steamuser\\AppData\\Roaming\\Balatro\\Mods\\lovely\\dump"
INFO - [♥] Initialization complete in 140ms
WARN - [♥] Pattern 'G.ARGS.score_intensity.organ = G.video_organ or G.ARGS.score_intensity.required_score > 0 and math.max(math.min(0.4, 0.1*math.log(G.ARGS.score_intensity.earned_score/(G.ARGS.score_intensity.required_score+1), 5)),0.) or 0' on target 'main.lua' resulted in no matches
WARN - [♥] Pattern 'if type(G.GAME.current_round.current_hand.chips) ~= \'number\' or type(G.GAME.current_round.current_hand.mult) ~= \'number\' then' on target 'main.lua' resulted in no matches
INFO - [♥] Applied 10 patches to 'main.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
WARN - [♥] Pattern 'if not _RELEASE_MODE then' on target 'engine/controller.lua' resulted in no matches
INFO - [♥] Applied 4 patches to 'engine/controller.lua'
INFO - [♥] Applied 13 patches to 'back.lua'
INFO - [♥] Applied 14 patches to 'tag.lua'
INFO - [♥] Applied 2 patches to 'engine/moveable.lua'
INFO - [♥] Applied 2 patches to 'engine/sprite.lua'
INFO - [♥] Applied 2 patches to 'engine/animatedsprite.lua'
WARN - [♥] Pattern 'assembled_string = assembled_string..(type(subpart) == \'string\' and subpart or args.vars[tonumber(subpart[1])] or \'ERROR\')' on target 'functions/misc_functions.lua' resulted in no matches
INFO - [♥] Applied 45 patches to 'functions/misc_functions.lua'
INFO - [♥] Applied 72 patches to 'game.lua'
INFO - [♥] Applied 1 patch to 'globals.lua'
INFO - [♥] Applied 6 patches to 'engine/ui.lua'
WARN - [♥] Pattern '{card_limit = _size, type = \'consumeable\', highlight_limit = 1}' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].chips, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}},' on target 'functions/UI_definitions.lua' resulted in no matches
WARN - [♥] Pattern '{n=G.UIT.T, config={text = G.GAME.hands[handname].mult, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}' on target 'functions/UI_definitions.lua' resulted in no matches
INFO - [♥] Applied 97 patches to 'functions/UI_definitions.lua'
WARN - [♥] Pattern 'ease_to = G.GAME.chips + math.floor(hand_chips * mult) * (e and e.antiscore and -1 or 1),' on target 'functions/state_events.lua' resulted in no matches
INFO - [♥] Applied 98 patches to 'functions/state_events.lua'
WARN - [♥] Pattern 'local cfg = (card and card.ability) or _c[\'config\']' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Regex '(?<indent>[\\t ]*)if G\\.F_NO_ACHIEVEMENTS then return end\\n[\\s\\S][\\s\\S]{16}--\\|LOCAL SETTINGS FILE' on target 'functions/common_events.lua' resulted in no matches
WARN - [♥] Pattern 'func = (function() if eval_func(card) then if not first or first then card:juice_up(0.1, 0.1) end;juice_card_until(card, eval_func, nil, 0.8) end return true end)' on target 'functions/common_events.lua' resulted in no matches
INFO - [♥] Applied 121 patches to 'functions/common_events.lua'
WARN - [♥] Pattern 'G.pack_cards:emplace(v)' on target 'functions/button_callbacks.lua' resulted in no matches
INFO - [♥] Applied 47 patches to 'functions/button_callbacks.lua'
WARN - [♥] Pattern 'if self.ability.name == \'Campfire\' and G.GAME.blind.boss and not (G.GAME.blind.config and G.GAME.blind.config.bonus) and self.ability.x_mult > 1 then' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if k ~= \'focused_ui\' and k ~= \"front\" and k ~= \"back\" and k ~= \"soul_parts\" and k ~= \"center\" and k ~= \'floating_sprite\' and k~= \"shadow\" and k~= \"use_button\" and k ~= \'buy_button\' and k ~= \'buy_and_use_button\' and k~= \"debuff\" and k ~= \'price\' and k~= \'particles\' and k ~= \'h_popup\' then v:draw() end' on target 'card.lua' resulted in no matches
WARN - [♥] Pattern 'if G.GAME.blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end' on target 'card.lua' resulted in no matches
INFO - [♥] Applied 203 patches to 'card.lua'
INFO - [♥] Applied 15 patches to 'cardarea.lua'
INFO - [♥] Applied 32 patches to 'blind.lua'
INFO - [♥] Applied 5 patches to 'engine/text.lua'
INFO - [G] Failed to connect to the debug server
INFO - [G] 2025-01-08 01:06:06 :: DEBUG :: DebugConsole :: Steamodded Debug Socket started !
INFO - [♥] Applied 9 patches to 'engine/sound_manager.lua'
INFO - [♥] Applied 2 patches to 'engine/string_packer.lua'
INFO - [G] 2025-01-08 01:06:07 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua
INFO - [G] 2025-01-08 01:06:07 :: TRACE :: Loader :: Saving Mod Info: Cryptid
INFO - [G] 2025-01-08 01:06:07 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua
INFO - [G] 2025-01-08 01:06:07 :: TRACE :: Loader :: Saving Mod Info: Talisman
INFO - [G] Loading file Achievements.lua
INFO - [G] Loading file Antimatter.lua
INFO - [G] Loading file Blinds.lua
INFO - [G] Loading file Challenges.lua
INFO - [G] Loading file CodeCards.lua
INFO - [G] Loading file CryptidJokerDisplay.lua
INFO - [G] Warning: CryptidJokerDisplay.lua has no items
INFO - [G] Loading file Decks.lua
INFO - [G] Loading file Enhanced.lua
INFO - [G] Loading file EpicJokers.lua
INFO - [G] Loading file Exotic.lua
INFO - [G] Loading file M.lua
INFO - [G] Loading file Misc.lua
INFO - [G] Loading file MiscJokers.lua
INFO - [G] Loading file Planets.lua
INFO - [G] Loading file Sleeves.lua
INFO - [G] Loading file Spectrals.lua
INFO - [G] Loading file Spooky.lua
INFO - [G] Loading file Stakes.lua
INFO - [G] Loading file Tags.lua
INFO - [G] Loading file Vouchers.lua
INFO - [G] Loading file dummy_https.lua
INFO - [G] Loading file dummy_timerblinds.lua
INFO - [G] Warning: dummy_timerblinds.lua has no items
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Sticker :: Detected duplicate register call on object perishable
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Sticker :: Detected duplicate register call on object pinned
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Sticker :: Detected duplicate register call on object eternal
INFO - [G] 2025-01-08 01:06:07 :: WARN :: Sticker :: Detected duplicate register call on object rental
INFO - [G] 2025-01-08 01:06:07 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms
INFO - [G] 2025-01-08 01:06:07 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 1.066 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0030] Injected Atlas in 778.382 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0025] Injected Sound in 19.657 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0032] Injected Stake in 1.566 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0008] Injected Rarity in 0.043 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.077 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0391] Injected Center in 2.198 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.011 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0027] Injected Blind in 0.059 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0002] Injected Seal in 0.049 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0004] Injected Suit in 0.069 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0013] Injected Rank in 0.050 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.064 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.085 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0031] Injected Challenge in 0.036 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0028] Injected Tag in 0.091 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0009] Injected Sticker in 0.107 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0009] Injected Shader in 50.960 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0020] Injected Achievement in 0.067 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 3.045 ms
INFO - [G] 2025-01-08 01:06:08 :: INFO :: TIMER :: [0011] Injected Event in 0.017 ms
INFO - [G] LONG DT @ 6: 0.050069491898674
INFO - [G] LONG DT @ 12: 0.1
INFO - [G] LONG DT @ 12: 0.08280844
INFO - [G] LONG DT @ 12: 0.068812992
INFO - [G] LONG DT @ 12: 0.0575500936
INFO - [G] ERROR LOADING GAME: Card area 'shop_jokers' not instantiated before load
INFO - [G] ERROR LOADING GAME: Card area 'shop_vouchers' not instantiated before load
INFO - [G] ERROR LOADING GAME: Card area 'shop_booster' not instantiated before load

Some files were not shown because too many files have changed in this diff Show more