updated cryptid + smods
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
**/lovely*.log
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"])
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||

|
||||
|
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 178 KiB After Width: | Height: | Size: 202 KiB |
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 140 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 127 KiB After Width: | Height: | Size: 210 KiB |
Before Width: | Height: | Size: 171 KiB After Width: | Height: | Size: 174 KiB |
Before Width: | Height: | Size: 157 KiB After Width: | Height: | Size: 116 KiB |
Before Width: | Height: | Size: 320 KiB After Width: | Height: | Size: 333 KiB |
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 170 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 100 KiB |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 11 KiB |
|
@ -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",
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
## Cryptid Achievements
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# The Tax effect
|
||||
[[patches]]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# This is sacrilegious
|
||||
[[patches]]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# what in ze fuck am i cooking
|
||||
[[patches]]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# Rush Hour - remove tags
|
||||
[[patches]]
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# Don't sort cards
|
||||
[[patches]]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# Joker Lock
|
||||
[[patches]]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# Show edition on Edition Decks
|
||||
[[patches]]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# non-pack scaling in pack slots
|
||||
[[patches]]
|
||||
|
|
|
@ -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
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# Increment Exponentia on Joker XMult
|
||||
[[patches]]
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# 3-layer drawing for Gateway
|
||||
[[patches]]
|
||||
|
|
|
@ -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]]
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# Lapio softlock mechanic
|
||||
[[patches]]
|
||||
|
|
288
Cryptid/lovely/Probability.toml
Normal 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
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# Wee Fibonacci rendering
|
||||
[[patches]]
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
[manifest]
|
||||
version = "1.0.0"
|
||||
dump_lua = true
|
||||
priority = 0
|
||||
priority = -1
|
||||
|
||||
# Level up modifier
|
||||
[[patches]]
|
||||
|
|
|
@ -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
|
@ -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
|
Before Width: | Height: | Size: 766 B |
Before Width: | Height: | Size: 978 B |
|
@ -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
|
|
@ -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"'''
|
|
@ -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 '
|
|
@ -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
|
|
@ -1 +0,0 @@
|
|||
return "1.0.0~ALPHA-1220a-STEAMODDED"
|
|
@ -1 +1 @@
|
|||
return {["disable_anims"]=false,["score_opt_id"]=3,["break_infinity"]="omeganum",}
|
||||
return {["disable_anims"]=true,["score_opt_id"]=3,["break_infinity"]="omeganum",}
|
|
@ -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)
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
102
lovely/dump/engine/save_manager.lua
Normal 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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 {}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|