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_DESCRIPTION: Adds unbalanced ideas to Balatro.
--- BADGE_COLOUR: 708b91
--- DEPENDENCIES: [Talisman>=2.0.0-beta8, Steamodded>=1.0.0~ALPHA-1216c]
--- VERSION: 0.5.3a
--- PRIORITY: 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999
--- DEPENDENCIES: [Talisman>=2.0.0-beta8<=2.0.9, Steamodded>=1.0.0~ALPHA-1225a<=1.0.0~ALPHA-1304a]
--- VERSION: 0.5.3c
--- PRIORITY: 2147483647
----------------------------------------------
------------MOD CODE -------------------------
@ -40,7 +40,7 @@ SMODS.Rarity{
SMODS.Rarity{
key = "epic",
loc_txt = {},
badge_colour = HEX('571d91'),
badge_colour = HEX('ef0098'),
default_weight = 0.003,
pools = {["Joker"] = true},
get_weight = function(self, weight, object_type)
@ -56,7 +56,7 @@ SMODS.Rarity{
SMODS.Rarity{
key = "candy",
loc_txt = {},
badge_colour = HEX("e91ff0"),
badge_colour = HEX("e275e6"),
}
SMODS.Rarity{
@ -389,6 +389,44 @@ function cry_edition_to_table(edition) -- look mom i figured it out (this does N
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
function cry_cheapest_boss_reroll()
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:start()
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
local ret = love.thread.getChannel("member_count"):pop()
if ret then
@ -603,7 +641,7 @@ function update_cry_member_count()
end
else
-- Use a fallback value if HTTPS is disabled (you all are awesome)
GLOBAL_cry_member_count = 5624
GLOBAL_cry_member_count = 8830
end
end
-- 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
G.GAME.probabilities.normal = ggpn
end
active_side:cry_double_scale_calc(orig_ability, in_context_scaling)
--Calculate events
if self == G.jokers.cards[#G.jokers.cards] then
for k, v in pairs(SMODS.Events) do
@ -2004,12 +2044,26 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable
center = G.P_CENTERS[center]
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 = (
(_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
if area == "ERROR" then
local ret = (front or center)
if not ret.config then
@ -2212,7 +2266,8 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable
end
end
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
then
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
cry_misprintize(card)
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
G.GAME.cry_pinned_consumeables = G.GAME.cry_pinned_consumeables + 0
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
--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"
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
@ -2494,6 +2554,7 @@ function cry_sanity_check(val)
return val
end
function cry_misprintize(card, override, force_reset, stack)
if Card.no(card, "immutable", true) then force_reset = true end
--infinifusion compat
if card.infinifusion 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
(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 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
if G.GAME.modifiers.cry_jkr_misprint_mod and card.ability.set == "Joker" 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,
['Two Pair'] = 4,
['Three of a Kind'] = G.GAME.used_vouchers.v_cry_hyperspacetether and 3 or nil,
['Straight'] = 5,
['Flush'] = 5,
['Straight'] = next(SMODS.find_card('j_four_fingers')) and 4 or 5,
['Flush'] = next(SMODS.find_card('j_four_fingers')) and 4 or 5,
['Full House'] = 5,
['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,
['Five of a Kind'] = 5,
['Flush House'] = 5,
@ -2714,7 +2775,7 @@ function G.FUNCS.get_poker_hand_info(_cards)
end
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
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
function eval_card(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
if card.ability[k] and v.calculate and type(v.calculate) == "function" then
context.from_playing_card = true

View file

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

View file

@ -182,9 +182,9 @@ local oldserpent = {
order = 9,
boss_colour = HEX("4f6367"),
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
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
return mult, hand_chips, false
end,
@ -270,6 +270,12 @@ local tax = {
atlas = "blinds",
order = 2,
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)
return math.floor(math.min(0.4 * G.GAME.blind.chips, score) + 0.5)
end,
@ -369,9 +375,12 @@ local joke = {
atlas = "blinds",
order = 15,
boss_colour = HEX("00ffaa"),
loc_vars = function(self, info_queue, card)
return { vars = { G.GAME.win_ante or 8 } }
loc_vars = function(self)
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,
collection_loc_vars = function(self)
return { vars = { '8', localize('cry_joke_placeholder') }}
end,
cry_calc_ante_gain = function(self)
if to_big(G.GAME.chips) >= to_big(G.GAME.blind.chips) * 2 then
if G.GAME.round_resets.ante == 1 then
@ -493,6 +502,7 @@ local shackle = {
order = 18,
boss_colour = HEX("010466"),
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
return false
end
@ -1415,6 +1425,7 @@ return {
end
if
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 ~= "The Psychic" or not G.GAME.defeated_blinds["bl_cry_oldarm"])
and (self.name ~= "The Eye" or not G.GAME.defeated_blinds["bl_mouth"])

View file

@ -215,10 +215,18 @@ local payload = {
end,
can_bulk_use = true,
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,
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,
}
local reboot = {
@ -433,14 +441,25 @@ local seed = {
local rigged = {
object_type = "Sticker",
atlas = "sticker",
pos = { x = 5, y = 1 },
pos = { x = 6, y = 1 },
key = "cry_rigged",
no_sticker_sheet = true,
prefix_config = { key = false },
badge_colour = HEX("14b341"),
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["cry_rigged2"].role.draw_major = card
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,
}
@ -457,6 +476,7 @@ local hook = {
cost = 4,
atlas = "code",
order = 14,
no_pool_flag = "beta_deck",
can_use = function(self, card)
return #G.jokers.highlighted == 2
end,
@ -512,7 +532,7 @@ local variable = {
order = 8,
config = { max_highlighted = 2, extra = { enteredrank = "" } },
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,
use = function(self, card, area, copier)
G.GAME.USING_CODE = true
@ -546,7 +566,7 @@ local class = {
order = 16,
config = { max_highlighted = 1, extra = { enteredrank = "" } },
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,
use = function(self, card, area, copier)
G.GAME.USING_CODE = true
@ -819,9 +839,14 @@ local delete = {
if not G.GAME.banned_keys then
G.GAME.banned_keys = {}
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 c = nil
local _p = nil
if G.shop_jokers.highlighted[1] then
_p = not not G.shop_jokers.highlighted[1].base.value
a = G.shop_jokers
c = G.shop_jokers.highlighted[1]
end
@ -843,6 +868,13 @@ local delete = {
check_for_unlock({ type = "what_have_you_done" })
end
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()
end,
}
@ -895,12 +927,50 @@ local machinecode = {
return true
end,
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)
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:add_to_deck()
G.consumeables:emplace(card)
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 = {
object_type = "Consumable",
@ -938,6 +1008,7 @@ local run = {
G.GAME.shop_free = nil
G.GAME.shop_d6ed = nil
G.STATE_COMPLETE = false
G.GAME.current_round.used_packs = {}
return true
end,
}))
@ -1014,6 +1085,7 @@ local rework = {
name = "cry-Rework",
atlas = "code",
order = 25,
no_pool_flag = "beta_deck",
pos = {
x = 3,
y = 3,
@ -1282,6 +1354,7 @@ local ctrl_v = {
G.E_MANAGER:add_event(Event({
func = function()
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()
if Incantation then
card:setQty(1)
@ -1311,6 +1384,7 @@ local ctrl_v = {
G.E_MANAGER:add_event(Event({
func = function()
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()
if Incantation then
card:setQty(1)
@ -1351,29 +1425,33 @@ local inst = {
return #selected_cards == 1
end,
use = function(self, card, area, copier)
local same = 0
for i = 1, #G.deck.cards do
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])
break
end
end
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])
break
end
end
end,
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
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])
break
end
end
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])
break
end
@ -1381,6 +1459,74 @@ local inst = {
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 = {
object_type = "Consumable",
@ -1392,7 +1538,7 @@ local automaton = {
order = 5,
atlas = "code",
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,
can_use = function(self, card)
return #G.consumeables.cards < G.consumeables.config.card_limit or card.area == G.consumeables
@ -1597,6 +1743,28 @@ local CodeJoker = {
"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 = {
@ -1606,13 +1774,13 @@ local copypaste = {
pos = { x = 3, y = 4 },
order = 110,
immune_to_chemach = true,
config = { extra = { odds = 2, ckt = 0 } },
config = { extra = { odds = 2, ckt = 0 } }, -- what is a ckt
rarity = "cry_epic",
cost = 14,
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 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,
atlas = "atlasepic",
@ -1623,7 +1791,7 @@ local copypaste = {
and not context.consumeable.beginning_end
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({
func = function()
local cards = copy_card(context.consumeable)
@ -2208,7 +2376,7 @@ G.FUNCS.variable_apply = function()
{ "J", "Jack" },
{ "Q", "Queen" },
{ "K", "King" },
{ "A", "Ace", "One" },
{ "A", "Ace", "One", "1", "I" },
{ "M" },
{ "nil" },
}
@ -2431,6 +2599,7 @@ G.FUNCS.class_apply = function()
m_gold = { "gold", "money", "yellow" },
m_lucky = { "lucky", "rng" },
m_cry_echo = { "echo", "retrigger", "retriggers" },
m_cry_light = { "light" },
ccd = { "ccd" },
null = { "nil" },
}
@ -2875,6 +3044,7 @@ G.FUNCS.pointer_apply = function()
and not G.GAME.banned_keys[current_card]
then
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()
G.consumeables:emplace(card)
created = true
@ -3046,6 +3216,203 @@ G.FUNCS.pointer_apply = function()
G.GAME.USING_POINTER = false
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
crashes = {
function()
@ -3469,9 +3836,13 @@ crashes = {
blockable = false,
no_delete = true,
func = function()
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)
G.GAME.accel = G.GAME.accel or 1.1
for i = 1, G.GAME.accel do
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
end,
}),
@ -3544,7 +3915,7 @@ local code_cards = {
malware,
seed,
rigged,
hook,
--hook,
hooked,
variable,
class,
@ -3562,8 +3933,11 @@ local code_cards = {
--patch,
ctrl_v,
inst,
encoded,
alttab,
}
if Cryptid.enabled["Misc. Decks"] then
code_cards[#code_cards + 1] = encoded
end
if Cryptid.enabled["Misc."] then
code_cards[#code_cards + 1] = spaghetti
end
@ -4042,8 +4416,9 @@ return {
local gfco = G.FUNCS.can_open
G.FUNCS.can_open = function(e)
if G.GAME.USING_RUN then
e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil
gfco(e)
-- e.config.colour = G.C.UI.BACKGROUND_INACTIVE
-- e.config.button = nil
else
gfco(e)
end
@ -4069,6 +4444,7 @@ return {
trigger = "after",
delay = 0.5,
func = function()
G.GAME.current_round.used_packs = {}
G.cry_runarea:remove()
G.cry_runarea = nil
G.STATE = G.STATES.SELECTING_HAND
@ -4170,7 +4546,12 @@ return {
local results = evaluate_poker_hand_ref(hand)
if G.GAME.cry_exploit_override 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
return results
@ -4210,7 +4591,6 @@ return {
end
local Cardstart_dissolveRef = Card.start_dissolve
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
for i = 1, #G.jokers.cards do
if G.jokers.cards[i].hook_id == self.sort_id then
@ -4219,6 +4599,7 @@ return {
end
end
end
Cardstart_dissolveRef(self,dissolve_colours, silent, dissolve_time_fac, no_juice)
end
end,
items = code_cards,

View file

@ -204,7 +204,7 @@ local glowing = {
trigger_effect = function(self, args)
if args.context == "eval" and G.GAME.last_blind and G.GAME.last_blind.boss then
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_misprintize(card, { min = 1.25, max = 1.25 }, nil, true)
end)
@ -227,9 +227,18 @@ local bountiful = {
name = "cry-Bountiful",
key = "bountiful",
config = { cry_forced_draw_amount = 5 },
pos = { x = 4, y = 2 },
pos = { x = 2, y = 6 },
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 {
name = "Misc. Decks",
@ -247,8 +256,8 @@ return {
G.GAME.modifiers.cry_conveyor = true
end
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_max = self.effect.config.cry_misprint_max
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 = (G.GAME.modifiers.cry_misprint_max or 1) * self.effect.config.cry_misprint_max
end
if self.effect.config.cry_highlight_limit then
G.GAME.modifiers.cry_highlight_limit = self.effect.config.cry_highlight_limit
@ -258,6 +267,7 @@ return {
end
if self.effect.config.cry_beta then
G.GAME.modifiers.cry_beta = true
G.GAME.pool_flags.beta_deck = true
end
if self.effect.config.cry_legendary then
G.E_MANAGER:add_event(Event({
@ -295,6 +305,9 @@ return {
if self.effect.config.cry_forced_draw_amount then
G.GAME.modifiers.cry_forced_draw_amount = self.effect.config.cry_forced_draw_amount
end
if self.effect.config.cry_common_value_quad then
G.GAME.modifiers.cry_common_value_quad = true
end
end
--equilibrium deck patches
local gcp = get_current_pool
@ -312,22 +325,26 @@ return {
and t ~= "Seal"
and t ~= "Stake"
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 = {}
local valid_pools = { "Joker", "Consumeables", "Voucher", "Booster" }
for _, id in ipairs(valid_pools) 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
end
end
end
--[[ this doesn't seem to be working
for k, v in pairs(G.P_CARDS) do
if v.unlocked == true and not center_no(v, "doe", k) then
P_CRY_ITEMS[#P_CRY_ITEMS + 1] = v.key
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
end
end
@ -464,5 +481,6 @@ return {
glowing,
beta,
bountiful,
beige,
},
}

View file

@ -56,6 +56,7 @@ local typed_decks = {
-- todo: work with mod config better here
{ "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, "Golden", "gold", nil, nil, 5, 2, "" },
@ -400,8 +401,7 @@ return {
if center.name == "Fortune Teller"
or center.name == "Shoot the Moon"
or center.name == "Riff-raff"
or center.name == "Business Card"
or center.name == "Riff-raff"
or center.name == "Chaos the Clown"
or center.name == "Dusk"
or center.name == "Mime"

View file

@ -102,12 +102,12 @@ local googol_play = {
blueprint_compat = true,
atlas = "atlasepic",
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 {
vars = {
"" .. (G.GAME and G.GAME.probabilities.normal or 1),
center.ability.extra.odds,
center.ability.extra.Xmult,
cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged),
card.ability.extra.odds,
card.ability.extra.Xmult,
},
}
end,
@ -116,7 +116,7 @@ local googol_play = {
context.cardarea == G.jokers
and not context.before
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
return {
message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.extra.Xmult } }),
@ -135,6 +135,18 @@ local googol_play = {
"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 = {
object_type = "Joker",
@ -271,6 +283,21 @@ local error_joker = {
blueprint_compat = false,
eternal_compat = false,
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)
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
@ -411,13 +438,15 @@ local m = {
local vc = self.calculate
self.calculate = function(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 and reps > 0 then
return {
message = localize("k_again_ex"),
repetitions = reps + (ret and ret.repetitions or 0),
card = card,
}
if context.retrigger_joker_check and context.other_card == card then
local reps = get_m_retriggers(self, card, context)
if reps > 0 then
return {
message = localize("k_again_ex"),
repetitions = reps + (ret and ret.repetitions or 0),
card = card,
}
end
end
return ret, trig
end
@ -474,13 +503,15 @@ local M = {
local vc = self.calculate
self.calculate = function(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 and reps > 0 then
return {
message = localize("k_again_ex"),
repetitions = reps + (ret and ret.repetitions or 0),
card = card,
}
if context.retrigger_joker_check and context.other_card == card then
local reps = get_m_retriggers(self, card, context)
if reps > 0 then
return {
message = localize("k_again_ex"),
repetitions = reps + (ret and ret.repetitions or 0),
card = card,
}
end
end
return ret, trig
end
@ -509,13 +540,13 @@ local boredom = {
order = 32,
cost = 14,
blueprint_compat = true,
loc_vars = function(self, info_queue, center)
return { vars = { "" .. (G.GAME and G.GAME.probabilities.normal or 1), center.ability.extra.odds } }
loc_vars = function(self, info_queue, card)
return { vars = { cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged), card.ability.extra.odds } }
end,
atlas = "atlasepic",
calculate = function(self, card, context)
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 {
message = localize("k_again_ex"),
repetitions = 1,
@ -528,7 +559,7 @@ local boredom = {
if
context.repetition
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
return {
message = localize("k_again_ex"),
@ -771,6 +802,27 @@ local circus = {
"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 = {
object_type = "Joker",
@ -908,8 +960,7 @@ local curse_sob = {
if not from_debuff then
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_obelisk")
card:set_edition("e_negative", true, nil, true)
card.sob = true
card:set_eternal(true)
card.ability.cry_absolute = true
card:add_to_deck()
G.jokers:emplace(card)
return {
@ -931,29 +982,44 @@ local curse_sob = {
"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 = {
object_type = "Joker",
name = "cry-Bonus Joker",
key = "bonusjoker",
pos = { x = 3, y = 2 },
config = { extra = { odds = 8, check = 0 } },
immutable = true,
config = { extra = { odds = 8, check = 0, add = 1 } },
rarity = "cry_epic",
cost = 11,
order = 75,
blueprint_compat = true,
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
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,
atlas = "atlasepic",
calculate = function(self, card, context)
if context.individual and context.cardarea == G.play then
if context.other_card.ability.effect == "Bonus Card" then
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 not context.retrigger_joker
then
@ -962,12 +1028,12 @@ local bonusjoker = {
if not context.blueprint then
card.ability.extra.check = card.ability.extra.check + 1
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
if not context.blueprint then
card.ability.extra.check = card.ability.extra.check + 1
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
return {
extra = { focus = card, message = localize("k_upgrade_ex") },
@ -1015,10 +1081,10 @@ local multjoker = {
cost = 11,
blueprint_compat = true,
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.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,
atlas = "atlasepic",
calculate = function(self, card, context)
@ -1027,7 +1093,7 @@ local multjoker = {
context.other_card.ability.effect == "Mult Card"
and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit
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.E_MANAGER:add_event(Event({
func = function()
@ -1105,7 +1171,11 @@ local goldjoker = {
calc_dollar_bonus = function(self, card)
local bonus = math.max(0, math.floor(0.01 * card.ability.extra.percent * (G.GAME.dollars or 0)))
if bonus > 0 then
return bonus
if G.GAME.dollars > 1e10 then
return 1
else
return bonus
end
end
end,
cry_credits = {
@ -1124,8 +1194,8 @@ local altgoogol = {
object_type = "Joker",
name = "cry-altgoogol",
key = "altgoogol",
config = { extra = { jokers = 2 } },
pos = { x = 4, y = 3 },
immutable = true,
rarity = "cry_epic",
cost = 10,
order = 60,
@ -1133,6 +1203,9 @@ local altgoogol = {
eternal_compat = false,
atlas = "atlasepic",
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)
if context.selling_self and not context.retrigger_joker then
local jokers = {}
@ -1146,7 +1219,7 @@ local altgoogol = {
local spawn = {G.jokers.cards[1]}
G.E_MANAGER:add_event(Event({
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)
card:add_to_deck()
G.jokers:emplace(card)
@ -1214,34 +1287,36 @@ local soccer = {
key = "soccer",
pos = { x = 1, y = 4 },
config = { extra = { holygrail = 1 } },
immutable = true,
rarity = "cry_epic",
order = 58,
cost = 20,
atlas = "atlasepic",
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,
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)
G.jokers.config.card_limit = G.jokers.config.card_limit + card.ability.extra.holygrail
G.consumeables.config.card_limit = G.consumeables.config.card_limit + card.ability.extra.holygrail
G.hand:change_size(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 + holy
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
G.GAME.modifiers.cry_booster_packs = 2
end
G.GAME.modifiers.cry_booster_packs = G.GAME.modifiers.cry_booster_packs + card.ability.extra.holygrail
change_shop_size(card.ability.extra.holygrail)
G.GAME.modifiers.cry_booster_packs = G.GAME.modifiers.cry_booster_packs + holy
change_shop_size(holy)
cry_bonusvouchermod(holy)
end,
remove_from_deck = function(self, card, from_debuff)
G.jokers.config.card_limit = G.jokers.config.card_limit - card.ability.extra.holygrail
G.consumeables.config.card_limit = G.consumeables.config.card_limit - card.ability.extra.holygrail
G.hand:change_size(-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 - holy
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
G.GAME.modifiers.cry_booster_packs = 2
end
G.GAME.modifiers.cry_booster_packs = G.GAME.modifiers.cry_booster_packs - card.ability.extra.holygrail
change_shop_size(card.ability.extra.holygrail * -1)
G.GAME.modifiers.cry_booster_packs = G.GAME.modifiers.cry_booster_packs - holy
change_shop_size(holy * -1)
cry_bonusvouchermod(-1*holy)
end,
cry_credits = {
idea = {
@ -1254,6 +1329,24 @@ local soccer = {
"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 = {
object_type = "Joker",
@ -1261,7 +1354,6 @@ local fleshpanopticon = {
key = "fleshpanopticon",
pos = { x = 0, y = 5 },
config = { extra = { boss_size = 20 } },
immutable = true,
rarity = "cry_epic",
cost = 15,
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 {
name = "Epic Jokers",
init = function()
@ -1364,6 +1504,13 @@ return {
"pi",
"1e9",
"???",
"114",
"leet",
"666",
"eee6",
"21",
"365",
"2024",
}
cry_error_msgs = {
{ string = "rand()", colour = G.C.RARITY["cry_exotic"] },
@ -1378,7 +1525,11 @@ return {
{ string = "ERROR", colour = G.C.UI.TEXT_INACTIVE },
{ string = "Tarots", colour = G.C.SECONDARY_SET.Tarot },
{ 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 = "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
}
@ -1524,5 +1675,6 @@ return {
altgoogol,
soccer,
fleshpanopticon,
spectrogram,
},
}

View file

@ -224,7 +224,6 @@ local redeo = {
}
end,
pos = { x = 3, y = 0 },
immutable = true,
rarity = "cry_exotic",
cost = 50,
order = 506,
@ -441,7 +440,7 @@ local primus = {
}
local big_num_whitelist = {
j_ride_the_bus = true,
j_egg = true,
j_egg = false,
j_runner = true,
j_ice_cream = true,
j_constellation = true,
@ -699,12 +698,11 @@ local aequilibrium = {
config = { extra = { jokers = 2, card = nil } },
rarity = "cry_exotic",
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",
cost = 50,
order = 512,
blueprint_compat = true,
immutable = true,
eternal_compat = true,
perishable_compat = true,
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,
})
end
return { vars = { center.ability.extra.jokers, joker_generated } }
return { vars = { math.floor(math.min(25, center.ability.extra.jokers)), joker_generated } }
end,
calculate = function(self, card, context)
if context.cardarea == G.jokers and context.before and not context.retrigger_joker 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)
newcard:add_to_deck()
G.jokers:emplace(newcard)
@ -732,6 +730,7 @@ local aequilibrium = {
return nil, true
end
end,
--[[
add_to_deck = function(self, card, from_debuff)
if not from_debuff then
if card.ability.extra.card then
@ -801,6 +800,7 @@ local aequilibrium = {
card.ability.extra.card:start_dissolve()
end
end,
]]--
cry_credits = {
idea = {"Elial2"},
art = {"Elial2"},
@ -900,6 +900,28 @@ local gemino = {
cost = 50,
order = 515,
atlas = "atlasexotic",
loc_vars = function(self, info_queue, card)
card.ability.blueprint_compat_ui = card.ability.blueprint_compat_ui or ''; card.ability.blueprint_compat_check = nil
return {
main_end = (card.area and card.area == G.jokers) and {
{n=G.UIT.C, config={align = "bm", minh = 0.4}, nodes={
{n=G.UIT.C, config={ref_table = card, align = "m", colour = G.C.JOKER_GREY, r = 0.05, padding = 0.06, func = 'blueprint_compat'}, nodes={
{n=G.UIT.T, config={ref_table = card.ability, ref_value = 'blueprint_compat_ui',colour = G.C.UI.TEXT_LIGHT, scale = 0.32*0.8}},
}}
}}
} or nil
}
end,
update = function(self, card, front)
if G.STAGE == G.STAGES.RUN then
other_joker = G.jokers.cards[1]
if other_joker and other_joker ~= card and not (Card.no(other_joker, "immutable", true)) then
card.ability.blueprint_compat = 'compatible'
else
card.ability.blueprint_compat = 'incompatible'
end
end
end,
calculate = function(self, card2, context)
if context.end_of_round and not context.repetition and not context.individual then
local check = false

View file

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

View file

@ -956,8 +956,8 @@ local echo = {
atlas = "cry_misc",
pos = { x = 2, y = 0 },
config = { retriggers = 2, extra = 2 },
loc_vars = function(self, info_queue)
return { vars = { self.config.retriggers, G.GAME.probabilities.normal, self.config.extra } }
loc_vars = function(self, info_queue, card)
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,
}
local eclipse = {
@ -969,9 +969,49 @@ local eclipse = {
pos = { x = 4, y = 0 },
config = { mod_conv = "m_cry_echo", max_highlighted = 1 },
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
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 } }
end,
}
@ -1119,11 +1159,18 @@ local meld = {
cost = 4,
atlas = "atlasnotjokers",
can_use = function(self, card)
if #G.jokers.highlighted
+ #G.hand.highlighted
- (G.hand.highlighted[1] and G.hand.highlighted[1] == self and 1 or 0)
== 1 then
if #G.jokers.highlighted == 1 and Card.no(G.jokers.highlighted[1], "dbl") then return false end
if #G.jokers.highlighted + #G.hand.highlighted - (G.hand.highlighted[1] and G.hand.highlighted[1] == self and 1 or 0) == 1 then
if
#G.jokers.highlighted == 1 and
(
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
end
end,
@ -1261,10 +1308,10 @@ local fulldeck = {
object_type = "PokerHand",
key = 'WholeDeck',
visible = false,
chips = 5200,
mult = 520,
l_chips = 520,
l_mult = 52,
chips = 525252525252525252525252525252,
mult = 52525252525252525252525252525,
l_chips = 52525252525252525252525252525,
l_mult = 5252525252525252525252525252,
example = {
{ 'S_A', true },
{ 'H_A', true },
@ -1486,6 +1533,22 @@ local universe = {
end,
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 = {
memepack_atlas,
meme_object_type,
@ -1523,6 +1586,9 @@ local miscitems = {
void,
marsmoons,
universe,
absolute,
light,
seraph,
}
if Cryptid.enabled["M Jokers"] then
miscitems[#miscitems + 1] = jollyeditionshader
@ -1539,7 +1605,7 @@ return {
local total_repetitions = ret and ret.repetitions or 0
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
end
end
@ -1802,6 +1868,13 @@ return {
end
self:dbl_side_flip()
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
function copy_dbl_card(C, c, deck_effects)
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,
atlas = "atlasnotjokers",
order = 1,
loc_vars = function(self, info_queue, center)
return { vars = { "" .. (G.GAME and G.GAME.probabilities.normal or 1), self.config.extra.odds } }
loc_vars = function(self, info_queue, card)
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,
can_use = function(self, card)
return true
end,
use = function(self, card, area, copier)
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(
{ sound = "button", volume = 0.7, pitch = 0.8, delay = 0.3 },
{ handname = localize("k_all_hands"), chips = "...", mult = "...", level = "" }
@ -495,7 +495,7 @@ local planetlua = {
else
for i = 1, number do
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
if quota > 0 then
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
if
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
local value = G.P_CENTERS.v_observatory.config.extra
return {
@ -691,15 +691,15 @@ local nstar = {
})
)
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
return {
message = localize({
type = "variable",
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,

View file

@ -3,7 +3,7 @@ if CardSleeves then
object_type = "Atlas",
key = "atlasSleeves",
path = "atlasSleeves.png",
px = 71,
px = 73,
py = 95,
})
@ -78,18 +78,10 @@ if CardSleeves then
config = { cry_misprint_min = 0.1, cry_misprint_max = 10 },
unlocked = true,
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)
G.GAME.modifiers.cry_misprint_min = self.config.cry_misprint_min
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,
})
@ -132,7 +124,6 @@ if CardSleeves then
name = "CCD Sleeve",
atlas = "atlasSleeves",
pos = { x = 6, y = 0 },
config = { cry_conveyor = true },
unlocked = true,
unlock_condition = { deck = "CCD Deck", stake = 1 },
loc_vars = function(self)

View file

@ -678,10 +678,21 @@ local ritual = {
cost = 5,
atlas = "atlasnotjokers",
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)
local used_consumable = copier or card
for i = 1, #G.hand.highlighted do
local highlighted = G.hand.highlighted[i]
if highlighted ~= card then
G.E_MANAGER:add_event(Event({
func = function()
play_sound("tarot1")
@ -717,6 +728,7 @@ local ritual = {
return true
end,
}))
end
end
end,
}

View file

@ -159,9 +159,15 @@ local choco1 = {
end
end
--create a ghost
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_cry_ghost")
card:add_to_deck()
G.jokers:emplace(card)
if not (SMODS.Mods["jen"] or {}).can_load then
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_cry_ghost")
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
}
local choco2 = {
@ -804,7 +810,7 @@ local ghost = {
no_dbl = true,
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 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({
func = function()
card:start_dissolve()
@ -823,7 +829,7 @@ local ghost = {
return
end
--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
G.jokers.cards[i].ability.cry_possessed = nil
end
@ -840,9 +846,9 @@ local ghost = {
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"}
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,
}
local possessed = {
@ -1218,7 +1224,7 @@ local monopoly_money = {
no_dbl = true,
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 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({
func = function()
context.card:start_dissolve()
@ -1242,8 +1248,8 @@ local monopoly_money = {
return nil, true
end
end,
loc_vars = function(self, info_queue, center)
return { vars = { G.GAME.probabilities.normal or 1, center.ability.extra.fail_rate} }
loc_vars = function(self, info_queue, card)
return { vars = { cry_prob(card.ability.cry_prob, card.ability.extra.fail_rate, card.ability.cry_rigged), card.ability.extra.fail_rate} }
end,
}
local candy_sticks = {

View file

@ -60,18 +60,27 @@ local schematic = {
apply = function(self, tag, context)
if context.type == "store_joker_create" then
local card
card = create_card("Joker", context.area, nil, nil, nil, nil, "j_brainstorm")
create_shop_card_ui(card, "Joker", context.area)
card.states.visible = false
tag:yep("+", G.C.RED, function()
card:start_materialize()
card:set_cost()
return true
end)
if not G.GAME.banned_keys["j_brainstorm"] then
card = create_card("Joker", context.area, nil, nil, nil, nil, "j_brainstorm")
create_shop_card_ui(card, "Joker", context.area)
card.states.visible = false
tag:yep("+", G.C.RED, function()
card:start_materialize()
card:set_cost()
return true
end)
else
tag:nope()
end
tag.triggered = true
return card
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 = {
object_type = "Booster",
@ -143,28 +152,27 @@ local empowered = {
end,
apply = function(self, tag, context)
if context.type == "new_blind_choice" then
if G.STATE ~= G.STATES.SPECTRAL_PACK then
G.GAME.PACK_INTERRUPT = G.STATE
end
tag:yep("+", G.C.SECONDARY_SET.Spectral, function()
local key = "p_cry_empowered"
local card = Card(
G.play.T.x + G.play.T.w / 2 - G.CARD_W * 1.27 / 2,
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 }
)
card.cost = 0
card.from_tag = true
G.FUNCS.use_card({ config = { ref_table = card } })
card:start_materialize()
return true
end)
tag.triggered = true
return true
local lock = tag.ID
G.CONTROLLER.locks[lock] = true
tag:yep('+', G.C.SECONDARY_SET.Spectral,function()
local key = "p_cry_empowered"
local card = Card(G.play.T.x + G.play.T.w/2 - G.CARD_W*1.27/2,
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})
card.cost = 0
card.from_tag = true
G.FUNCS.use_card({config = {ref_table = card}})
if G.GAME.modifiers.cry_force_edition and not G.GAME.modifiers.cry_force_random_edition then
card:set_edition(nil, true, true)
elseif G.GAME.modifiers.cry_force_random_edition then
local edition = cry_poll_random_edition()
card:set_edition(edition, true, true)
end
card:start_materialize()
G.CONTROLLER.locks[lock] = nil
return true
end)
tag.triggered = true
return true
end
end,
in_pool = function()
@ -188,27 +196,18 @@ local gambler = {
if context.type == "immediate" then
if pseudorandom("cry_gambler_tag") < G.GAME.probabilities.normal / tag.config.odds then
local lock = tag.ID
G.CONTROLLER.locks[lock] = true
tag:yep("+", G.C.RARITY.cry_exotic, function()
add_tag(Tag("tag_cry_empowered"))
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.3,
func = function()
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)
G.CONTROLLER.locks[lock] = true
tag:yep('+', G.C.SECONDARY_SET.Spectral,function()
local tag = Tag("tag_cry_empowered")
add_tag(tag)
G.CONTROLLER.locks[lock] = nil
return true
end)
else
tag:nope()
end
tag.triggered = true
return true
tag.triggered = true
return true
end
end,
}
@ -563,8 +562,6 @@ local m_tag = {
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 = {
object_type = "Tag",
atlas = "tag_cry",
@ -956,6 +953,7 @@ return {
and self.key ~= "tag_cry_triple"
and self.key ~= "tag_cry_quadruple"
and self.key ~= "tag_cry_quintuple"
and self.key ~= "tag_ortalab_rewind"
then
G.GAME.cry_last_tag_used = self.key
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",
key = "overstock_multi",
config = { extra = 1 },
@ -226,6 +226,7 @@ local overstock_multi = { --+1 card slot[s] and +1 booster pack slot[s] availabl
return true
end,
}))
cry_bonusvouchermod(math.floor(self.config.extra))
end,
unredeem = function(self)
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
end,
}))
cry_bonusvouchermod(-1*math.floor(self.config.extra))
end,
}
local massproduct = { --All cards and packs in the shop cost $1
@ -495,6 +497,18 @@ local fabric = { --+2 Joker slot[s]
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)
local function asteroglyph_ante()
@ -529,7 +543,19 @@ local asteroglyph = { --Set Ante to 0
return true
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)
local blankcanvas = { --+2 hand size
@ -549,6 +575,18 @@ local blankcanvas = { --+2 hand size
unredeem = function(self)
G.hand:change_size(-1*math.max(1, math.floor(self.config.extra)))
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

View file

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

File diff suppressed because it is too large Load diff

View file

@ -1172,13 +1172,17 @@ return {
},
},
j_cry_macabre = {
name = "Macabre Joker",
name = "悚小丑",
text = {
"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",
"當{C:attention}盲注{}被選擇,",
"摧毀{C:legendary}M小丑{}和{C:attention}快樂小丑{}",
"以外的{C:attention}小丑{}和",
"生成被摧毀卡數量的{C:attention}快樂小丑{}",
--"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 = {

View file

@ -1,7 +1,7 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
# Make the splash screen more jolly
# Requires "Custom Main Menu" config to be enabled
@ -22,12 +22,12 @@ if Cryptid.enabled["Menu"] then
local option = math.random(#mcard)
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
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
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
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
'''
@ -83,9 +83,9 @@ match_indent = true
[[patches]]
[patches.pattern]
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"
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
@ -291,6 +291,7 @@ target = "functions/UI_definitions.lua"
pattern = "voucher_areas[#voucher_areas]:emplace(card)"
position = "before"
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
local edition = cry_edition_to_table(G.GAME.voucher_edition_index[card.ability.name])
if edition then
@ -659,6 +660,7 @@ match_indent = true
# init Cryptid global through lovely
# 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.pattern]
target = "main.lua"
@ -666,11 +668,15 @@ pattern = '''function love.load()'''
position = "before"
payload = '''
Cryptid = {}
Cryptid.enabled = {}
Cryptid.memepack = {}
Cryptid.aliases = {}
Cryptid.food = {}
Cryptid.M_jokers = {}
Cryptid.Megavouchers = {}
function cry_format(...)
return ...
end
'''
match_indent = true
@ -737,3 +743,44 @@ if self.config.center.set == 'Joker' then
end
'''
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]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
## Cryptid Achievements

View file

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

View file

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

View file

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

View file

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

View file

@ -1,7 +1,7 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
# Code UI disables hold R shortcut
[[patches]]
@ -158,9 +158,72 @@ match_indent = true
target = "game.lua"
pattern = '''if self.STATE == self.STATES.SELECTING_HAND then'''
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
# 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.pattern]
target = "game.lua"

View file

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

View file

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

View file

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

View file

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

View file

@ -1,28 +1,17 @@
[manifest]
version = "1.0.0"
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.pattern]
target = "card.lua"
pattern = "elseif self.ability.name == 'Misprint' then"
position = "before"
payload = '''
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})}},
}
'''
target = "functions/common_events.lua"
pattern = "bbbbb"
position = "at"
payload = "aaaaa"
match_indent = true
# Patch get_current_pool to predict for ERROR desc
@ -35,23 +24,3 @@ match_indent = true
# position = "at"
# 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
[[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]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
# Increment Exponentia on Joker XMult
[[patches]]

View file

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

View file

@ -1,7 +1,7 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
# Shine on Oversaturated to make it more noticable
[[patches]]
@ -219,37 +219,8 @@ end
match_indent = true
# 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]]
[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
# I deleted the patches --Jevonn (test)
# calculate wheel fail (for Wheel of Hope)
[[patches]]

View file

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

View file

@ -1,7 +1,7 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
# Lapio softlock mechanic
[[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]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
# Wee Fibonacci rendering
[[patches]]

View file

@ -28,16 +28,22 @@ target = "game.lua"
pattern = '''if G.load_shop_booster then'''
position = "before"
payload = '''
if G.GAME.events.ev_cry_choco10 and not G.load_shop_vouchers then
local card = create_card('Joker', G.jokers, true, nil, nil, nil, nil, 'cry_antique')
cry_misprintize(card)
card.misprint_cost_fac = 50/card.cost
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)
if G.GAME.events.ev_cry_choco10 then
local add = true
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
if v.ability.cry_antique then add = false end
end
if add then
local card = create_card('Joker', G.jokers, true, nil, nil, nil, nil, 'cry_antique')
cry_misprintize(card)
card.misprint_cost_fac = 50/card.cost
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
'''
match_indent = true

View file

@ -1,7 +1,7 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
# Yellow Stake - perishable and rental effects on consumable
@ -151,9 +151,9 @@ match_indent = true
[[patches]]
[patches.pattern]
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"
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

View file

@ -1,7 +1,7 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
# ok it seems i still have to use the dumb fix for pinned, smods please overwrite
[[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
'''
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]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
# Level up modifier
[[patches]]

View file

@ -1,7 +1,7 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = 0
priority = -1
# Remove voucher at start of run (also for Crimson Stake)
[[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
Blind = Moveable:extend()
@ -606,7 +606,7 @@ function Blind:debuff_hand(cards, hand, handname, check)
end
if self.name == 'The Arm' then
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
if not check then
level_up_hand(self.children.animatedSprite, handname, nil, -1)

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = 'af84d6c3467720a23ecaec33b0418eba5566291929fca3634893138f120ee811'
LOVELY_INTEGRITY = 'b7b1bb9e3088ca71ed96c4b7bdaf1ec1c67106c37ba37b8f4aef385f8743a60b'
--class
Card = Moveable:extend()
@ -4171,7 +4171,7 @@ function Card:calculate_joker(context)
}
end
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.E_MANAGER:add_event(Event({
trigger = 'before',
@ -4363,7 +4363,7 @@ function Card:calculate_joker(context)
colour = G.C.MULT
}
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 {
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))),
@ -4473,7 +4473,7 @@ function Card:calculate_joker(context)
Xmult_mod = self.ability.extra.Xmult,
}
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 {
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)
@ -4795,7 +4795,6 @@ function Card:draw(layer)
self.hover_tilt = 1
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
self.ARGS.send_to_shader = self.ARGS.send_to_shader or {}

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = 'e8693aca875516bf9cb3c84fcb6f392131135da095f221f2ef0e6ac727b926df'
LOVELY_INTEGRITY = '0825b896143c8e8c22c2c18adfc937960d407b986f1c18addc68bedde1768967'
--Class
CardArea = Moveable:extend()
@ -32,9 +32,6 @@ function CardArea:init(X, Y, W, H, config)
end
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
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)
@ -326,9 +323,6 @@ function CardArea:draw()
}
end
self.children.area_uibox:draw()
if self == G.jokers then
Cartomancer.add_visibility_controls()
end
end
self:draw_boundingrect()
@ -431,39 +425,15 @@ function CardArea:align_cards()
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
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 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
if card.facing == 'front' then card:flip() end
if not card.states.drag.is then
if fixedX then
card.T.x = fixedX
card.T.y = fixedY
card.T.r = fixedR -- rotation
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
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.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.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
end
end
end
@ -551,18 +521,7 @@ function CardArea:align_cards()
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
if self == G.jokers and G.jokers.cart_jokers_expanded 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
if self.config.type == 'joker' or self.config.type == 'title_2' then
for k, card in ipairs(self.cards) do
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)
@ -653,9 +612,6 @@ function CardArea:draw_card_from(area, stay_flipped, discarded_only)
if area == G.discard then
card.T.r = 0
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)
if (self == G.hand) and 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
Controller = Object:extend()
@ -768,12 +768,6 @@ function Controller:button_release_update(button, dt)
end
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
G.FUNCS.exit_mods()
end
@ -828,7 +822,7 @@ function Controller:key_press_update(key, dt)
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
G.debug_tools = UIBox{
definition = create_UIBox_debug_tools(),
@ -859,8 +853,6 @@ function Controller:key_press_update(key, dt)
add_joker(_card.config.center.key)
_card:set_sprites(_card.config.center)
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
add_joker(_card.config.center.key)
_card:set_sprites(_card.config.center)
@ -912,17 +904,13 @@ function Controller:key_press_update(key, dt)
if key == "space" then
live_test()
end
local debugplus = require("debugplus.core")
debugplus.handleKeys(self, key, dt)
if key == 'v' then
if not G.prof then G.prof = require "engine/profile"; G.prof.start()
else G.prof:stop();
print(G.prof.report()); G.prof = nil end
debugplus.profileMessage()
end
if key == "p" then
G.SETTINGS.perf_mode = not G.SETTINGS.perf_mode
debugplus.togglePerfUI()
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
UIBox = Moveable:extend()
@ -990,7 +990,6 @@ function UIElement:click()
G.NO_MOD_CURSOR_STACK = nil
if self.config.choice then
local chosen_temp = self.config.chosen
local chosen_temp = self.config.chosen
local choices = self.UIBox:get_group(nil, self.config.group)
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\
--As a rule, these contain functions that return a table T representing the definition for a UIBox
G.UIDEF = {}
function create_UIBox_debug_tools()
local debugplus = require("debugplus.core")
debugplus.registerButtons()
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_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.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.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.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={
@ -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 = {"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 = {"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={
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
local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'}
local SUITS_SORTED = Cartomancer.tablecopy(SUITS)
local stones = nil
local rank_name_mapping = {'A','K','Q','J','10',9,8,7,6,5,4,3,2}
@ -1048,7 +1010,6 @@ end
end
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 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={
@ -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.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.R, config={align = "cm", padding = 0.1}, nodes={
@ -2027,11 +1985,11 @@ function create_slider(args)
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 = "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}}
}} or nil
}},
}}
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={
@ -2437,21 +2395,6 @@ function create_UIBox_settings()
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(
{tabs = tabs,
tab_h = 7.05,
@ -3252,8 +3195,8 @@ function create_UIBox_current_hand_row(handname, simple)
(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.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.T, config={text = localize('k_level_prefix')..G.GAME.hands[handname].level, scale = 0.5, colour = G.C.UI.TEXT_DARK}}
{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')..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.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 = {},
}
local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'}
local SUITS_SORTED = Cartomancer.tablecopy(SUITS)
for k, v in ipairs(G.playing_cards) do
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"
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
table.insert(SUITS[v.base.suit], v)
end
for j = 1, 4 do
if SUITS_SORTED[suit_map[j]][1] then
if SUITS[suit_map[j]][1] then
local view_deck = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
6.5*G.CARD_W,
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,
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = view_deck}}
}}
)
for i = 1, #SUITS_SORTED[suit_map[j]] do
local card_string = SUITS_SORTED[suit_map[j]][i]
local card = SUITS[suit_map[j]][card_string]
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
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
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.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={
{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}},
@ -4337,20 +4257,9 @@ function create_UIBox_your_collection_blinds(exit)
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 = {}
for i = min_ante, max_ante do
-- :3
for i = 1, math.min(16, math.max(16, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt)) do
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
ante_amounts[#ante_amounts+1] = {n=G.UIT.R, config={minh = spacing}, nodes={}}
end
@ -6455,13 +6364,6 @@ function UIBox_button(args)
local but_UI_label = {}
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
if k == #args.label and args.focus_args and args.focus_args.set_button_pip then
button_pip ='set_button_pip'
@ -6486,7 +6388,7 @@ function UIBox_button(args)
padding = args.padding or 0,
r = 0.1,
hover = true,
colour = args.ref_table and args.ref_table.colour or args.colour, -- Cartomancer
colour = args.colour,
one_press = args.one_press,
button = (args.button ~= 'nil') and args.button or nil,
choice = args.choice,
@ -6500,6 +6402,6 @@ function UIBox_button(args)
ref_table = args.ref_table,
mid = args.mid
}, nodes=
args.ref_table and args.ref_table.custom_button or but_UI_label -- Cartomancer
but_UI_label
}}}
end

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = 'd7f48a66f05694a22b7aae4c15c27e443dc398089f32ae2891b595f051091e07'
LOVELY_INTEGRITY = 'e36471bd79b456102440b1c69061665aed2f0a92e67cfd840d15eafe4e55be17'
--Moves the tutorial to the next step in queue
--
@ -55,7 +55,7 @@ end
---@param e {}
--**e** Is the UIE that called this function
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.button = nil
else
@ -77,7 +77,7 @@ end
---@param e {}
--**e** Is the UIE that called this function
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.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil
@ -96,7 +96,7 @@ end
---@param e {}
--**e** Is the UIE that called this function
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.button = nil
else
@ -111,7 +111,7 @@ end
---@param e {}
--**e** Is the UIE that called this function
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.button = nil
else
@ -2020,12 +2020,12 @@ G.FUNCS.flame_handler = function(e)
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
_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
_F.intensity = 0
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
_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)
@ -2078,7 +2078,7 @@ end
end
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.button = nil
--e.children[1].children[1].config.shadow = false

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = '2c8ce4c0bac30f3323a4c474be97cee2bdcdd76ecf06cecea0a240c944640f67'
LOVELY_INTEGRITY = 'ab00e08d711a2c3f72976a640fd09ce67bc5a2fbcc3a1d480a50325ec883c75e'
function set_screen_positions()
if G.STAGE == G.STAGES.RUN then
@ -75,7 +75,7 @@ function ease_dollars(mod, instant)
mod = mod or 0
local text = '+'..localize('$')
local col = G.C.MONEY
if mod < 0 then
if to_big(mod) < to_big(0) then
text = '-'..localize('$')
col = G.C.RED
else
@ -120,7 +120,7 @@ function ease_discard(mod, instant, silent)
mod = math.max(-G.GAME.current_round.discards_left, mod)
local text = '+'
local col = G.C.GREEN
if mod < 0 then
if to_big(mod) < to_big(0) then
text = ''
col = G.C.RED
end
@ -159,7 +159,7 @@ function ease_hands_played(mod, instant)
mod = mod or 0
local text = '+'
local col = G.C.GREEN
if mod < 0 then
if to_big(mod) < to_big(0) then
text = ''
col = G.C.RED
end
@ -200,7 +200,7 @@ function ease_ante(mod)
mod = mod or 0
local text = '+'
local col = G.C.IMPORTANT
if mod < 0 then
if to_big(mod) < to_big(0) then
text = '-'
col = G.C.RED
end
@ -235,7 +235,7 @@ function ease_round(mod)
mod = mod or 0
local text = '+'
local col = G.C.IMPORTANT
if mod < 0 then
if to_big(mod) < to_big(0) then
text = ''
col = G.C.RED
end
@ -405,9 +405,6 @@ function draw_card(from, to, percent, dir, sort, card, delay, mute, stay_flipped
if card then
if from then card = from:remove_card(card) 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)
if G.GAME.modifiers.flipped_cards and to == G.hand 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].chips = math.max(G.GAME.hands[hand].chips * (universum_mod)^amount, 1)
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()
play_sound('tarot1')
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
else
G.GAME.current_round.current_hand.hand_level = ' '..localize('k_lvl')..tostring(vals.level)
if type(vals.level) == 'number' then
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[math.min(vals.level, 7)]
if is_number(vals.level) then
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[to_big(math.min(vals.level, 7)):to_number()]
else
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[1]
end
@ -954,12 +951,12 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra)
sound = 'chips1'
amt = amt
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
elseif eval_type == 'mult' then
sound = 'multhit1'--'other1'
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
config.type = 'fade'
config.scale = 0.7
@ -975,14 +972,14 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra)
sound = 'multhit2'
volume = 0.7
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
config.type = 'fade'
config.scale = 0.7
elseif eval_type == 'h_mult' then
sound = 'multhit1'
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
config.type = 'fade'
config.scale = 0.7
@ -1241,7 +1238,7 @@ function add_round_eval_row(config)
end
}))
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
G.E_MANAGER:add_event(Event({
trigger = 'before',delay = 0.38,
@ -1345,7 +1342,7 @@ function change_shop_size(mod)
if not G.GAME.shop then return end
G.GAME.shop.joker_max = G.GAME.shop.joker_max + mod
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
for i = #G.shop_jokers.cards, G.GAME.shop.joker_max+1, -1 do
if G.shop_jokers.cards[i] then
@ -1477,7 +1474,7 @@ function check_for_unlock(args)
end
end
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')
end
end
@ -1514,7 +1511,7 @@ function check_for_unlock(args)
end
end
if args.type == 'upgrade_hand' then
if args.level >= 10 then
if to_big(args.level) >= to_big(10) then
unlock_achievement('retrograde')
end
end
@ -1751,7 +1748,7 @@ function check_for_unlock(args)
end
end
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
unlock_card(card)
end
@ -3123,7 +3120,7 @@ function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, h
elseif _c.set == 'Planet' then
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,
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}
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
--
@ -818,7 +818,7 @@ function modulate_sound(dt)
for k, v in pairs(G.ARGS.ambient_sounds) do
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].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
G.ARGS.push = G.ARGS.push or {}

View file

@ -1,4 +1,4 @@
LOVELY_INTEGRITY = '4e744c84a896d13965c350778ddd9bc20dc5aeec8b4dd69951b460db6f5383cb'
LOVELY_INTEGRITY = '444830d91f018dc97aacd41f468f575ea3ad4eea5095b8d83a79bd7e8a40c1ff'
function win_game()
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
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)})
pitch = pitch + 0.06
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'})
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
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)})
pitch = pitch + 0.06
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
Game = Object:extend()
@ -109,109 +109,7 @@ function Game:start_up()
boot_timer('window init', 'savemanager')
--call the save manager to wait for any save requests
G.SAVE_MANAGER = {
thread = love.thread.newThread([[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")
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]]),
thread = love.thread.newThread('engine/save_manager.lua'),
channel = love.thread.getChannel('save_request')
}
G.SAVE_MANAGER.thread:start(2)
@ -322,7 +220,6 @@ function Game:start_up()
end
end
set_profile_progress()
Cartomancer.load_mod_file('internal/localization.lua', 'localization')
boot_timer('prep stage', 'splash prep',1)
self:splash_screen()
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
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.STATE = new_state or self.STATES.MENU
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'
selected_back = get_deck_from_name(selected_back)
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()
self.GAME.modifiers = self.GAME.modifiers or {}
self.GAME.stake = args.stake or self.GAME.stake or 1
@ -2656,7 +2553,6 @@ function Game:start_run(args)
reset_blinds()
end
Cartomancer.update_tags_visibility()
G.FUNCS.blind_chip_UI_scale(G.hand_text_area.blind_chips)
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.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
G.new_frame = false
@ -2711,7 +2607,7 @@ function Game:update(dt)
if G.STATE ~= G.ACC_state then G.ACC = 0 end
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)
elseif Handy.insta_cash_out.is_skipped then G.ACC = 999
else
@ -2955,6 +2851,7 @@ function Game:update(dt)
if G.FILE_HANDLER.run then
G.SAVE_MANAGER.channel:push({
type = 'save_run',
talisman = Talisman.config_file.break_infinity,
save_table = G.ARGS.save_run,
profile_num = G.SETTINGS.profile})
G.SAVED_GAME = nil
@ -3210,23 +3107,11 @@ love.graphics.pop()
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.setColor(0, 1, 1,1)
local fps = love.timer.getFPS( )
do
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
love.graphics.print("Current FPS: "..fps, 10, 10)
if G.check and G.SETTINGS.perf_mode then
local section_h = 30
@ -3245,10 +3130,6 @@ love.graphics.pop()
end
love.graphics.rectangle('fill', 10+poll_w*kk, 20 + v_off, 5*poll_w, -(vv)*resolution)
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.print(v.label..': '..(string.format("%.2f",1000*(v.average or 0)))..'\n', 10, -section_h + 30 + v_off)
v_off = v_off + section_h

View file

@ -1,148 +1,4 @@
LOVELY_INTEGRITY = 'bb0f108ed0f5fea2a65f1d93362d3d1e1561e17a19a8c7e0d07c0cc4747d3696'
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
LOVELY_INTEGRITY = '7a80102588959caa0bf8986947ac508ff87fd856221043d85aeb54a472571ab0'
--- STEAMODDED CORE
--- MODULE STACKTRACE
@ -1001,10 +857,6 @@ injectStackTrace()
-- --------MOD CORE API STACKTRACE 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 "bit"
require "engine/string_packer"
@ -1150,17 +1002,10 @@ function love.draw()
--Perf monitoring checkpoint
timer_checkpoint(nil, 'draw', true)
G:draw()
do
local console = require("debugplus.console")
console.doConsoleRender()
timer_checkpoint('DebugPlus Console', 'draw')
end
end
function love.keypressed(key)
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])
else
G.CONTROLLER:set_HID_flags('mouse')
@ -1480,10 +1325,6 @@ end
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 {
"src/ui.lua",
"src/index.lua",
@ -3771,7 +3612,9 @@ if Talisman.config_file.break_infinity then
v.s_mult = to_big(v.s_mult)
v.l_chips = to_big(v.l_chips)
v.l_mult = to_big(v.l_mult)
v.level = to_big(v.level)
end
obj.starting_params.dollars = to_big(obj.starting_params.dollars)
return obj
end
@ -3793,6 +3636,11 @@ if Talisman.config_file.break_infinity then
if type(x) == 'table' then return x:floor() end
return mf(x)
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
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
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
function scale_number(number, scale, max, e_switch_point)
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
else
G.GAME.current_round.current_hand.hand_level = ' '..localize('k_lvl')..tostring(vals.level)
if type(vals.level) == 'number' then
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[math.min(vals.level, 7)]
if is_number(vals.level) then
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[to_big(math.min(vals.level, 7)):to_number()]
else
G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[1]
end
@ -4102,135 +3969,145 @@ function Game:update(dt)
Talisman.dollar_update = false
end
end
--scoring coroutine
local oldplay = G.FUNCS.evaluate_play
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)
Talisman.F_NO_COROUTINE = false --easy disabling for bugfixing, since the coroutine can make it hard to see where errors are
if not Talisman.F_NO_COROUTINE then
--scoring coroutine
G.CURRENT_SCORING_CARD = self
G.CARD_CALC_COUNTS = G.CARD_CALC_COUNTS or {}
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}
local oldplay = G.FUNCS.evaluate_play
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
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 = ccj(self, context)
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
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
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
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.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
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
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
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
Talisman.calculating_card = false
Talisman.dollar_update = false
local ccj = Card.calculate_joker
function Card:calculate_joker(context)
--scoring coroutine
G.CURRENT_SCORING_CARD = self
G.CARD_CALC_COUNTS = G.CARD_CALC_COUNTS or {}
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
--[[local ec = eval_card
function eval_card()
@ -4325,7 +4202,7 @@ local edo = ease_dollars
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
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
Talisman.dollar_update = true
else return edo(mod, instant) end
@ -4340,11 +4217,13 @@ function safe_str_unpack(str)
if success then
return result
else
print("Error unpacking string: " .. result)
print("[Talisman] Error unpacking string: " .. result)
print(tostring(str))
return nil
end
else
print("Error loading string: " .. err)
print("[Talisman] Error loading string: " .. err)
print(tostring(str))
return nil
end
end
@ -4373,6 +4252,207 @@ function G.FUNCS.evaluate_round()
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
--[[local callstep=0
function printCallerInfo()
@ -4390,79 +4470,3 @@ function EventManager:add_event(x,y,z)
printCallerInfo()
return emae(self,x,y,z)
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