From 8cc1ec0a2caa0fe629465f1a4fde89c9a9b45a6a Mon Sep 17 00:00:00 2001 From: Vomitblood Date: Tue, 11 Feb 2025 01:31:20 +0800 Subject: [PATCH] 10/02/2025 working --- Talisman/config.lua | 2 +- lovely/dump/back.lua | 43 +- lovely/dump/blind.lua | 72 +- lovely/dump/card.lua | 371 +++---- lovely/dump/cardarea.lua | 14 +- lovely/dump/engine/controller.lua | 48 +- lovely/dump/engine/sound_manager.lua | 30 +- lovely/dump/functions/UI_definitions.lua | 247 +++-- lovely/dump/functions/button_callbacks.lua | 104 +- lovely/dump/functions/common_events.lua | 454 +++++--- lovely/dump/functions/misc_functions.lua | 249 +++-- lovely/dump/functions/state_events.lua | 1135 +++----------------- lovely/dump/game.lua | 37 +- lovely/dump/main.lua | 479 ++++----- lovely/dump/tag.lua | 29 +- lovely/log/lovely-2025.01.19-16.12.21.log | 128 +++ lovely/log/lovely-2025.01.19-23.45.43.log | 128 +++ lovely/log/lovely-2025.01.20-20.46.32.log | 128 +++ lovely/log/lovely-2025.01.20-20.47.45.log | 128 +++ lovely/log/lovely-2025.01.22-01.21.54.log | 128 +++ lovely/log/lovely-2025.01.26-23.01.38.log | 229 ++++ lovely/log/lovely-2025.01.26-23.02.32.log | 128 +++ lovely/log/lovely-2025.02.11-01.14.44.log | 139 +++ lovely/log/lovely-2025.02.11-01.21.30.log | 199 ++++ lovely/log/lovely-2025.02.11-01.21.59.log | 326 ++++++ lovely/log/lovely-2025.02.11-01.23.18.log | 326 ++++++ lovely/log/lovely-2025.02.11-01.24.59.log | 298 +++++ lovely/log/lovely-2025.02.11-01.26.34.log | 298 +++++ lovely/log/lovely-2025.02.11-01.27.22.log | 132 +++ lovely/log/lovely-2025.02.11-01.28.56.log | 298 +++++ 30 files changed, 4327 insertions(+), 2000 deletions(-) create mode 100644 lovely/log/lovely-2025.01.19-16.12.21.log create mode 100644 lovely/log/lovely-2025.01.19-23.45.43.log create mode 100644 lovely/log/lovely-2025.01.20-20.46.32.log create mode 100644 lovely/log/lovely-2025.01.20-20.47.45.log create mode 100644 lovely/log/lovely-2025.01.22-01.21.54.log create mode 100644 lovely/log/lovely-2025.01.26-23.01.38.log create mode 100644 lovely/log/lovely-2025.01.26-23.02.32.log create mode 100644 lovely/log/lovely-2025.02.11-01.14.44.log create mode 100644 lovely/log/lovely-2025.02.11-01.21.30.log create mode 100644 lovely/log/lovely-2025.02.11-01.21.59.log create mode 100644 lovely/log/lovely-2025.02.11-01.23.18.log create mode 100644 lovely/log/lovely-2025.02.11-01.24.59.log create mode 100644 lovely/log/lovely-2025.02.11-01.26.34.log create mode 100644 lovely/log/lovely-2025.02.11-01.27.22.log create mode 100644 lovely/log/lovely-2025.02.11-01.28.56.log diff --git a/Talisman/config.lua b/Talisman/config.lua index 5cdb68f..0f706ea 100644 --- a/Talisman/config.lua +++ b/Talisman/config.lua @@ -1 +1 @@ -return {["disable_anims"]=true,["score_opt_id"]=3,["break_infinity"]="omeganum",} \ No newline at end of file +return {["disable_anims"]=false,["score_opt_id"]=3,["break_infinity"]="omeganum",} \ No newline at end of file diff --git a/lovely/dump/back.lua b/lovely/dump/back.lua index 997b2bc..11de902 100644 --- a/lovely/dump/back.lua +++ b/lovely/dump/back.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = 'd3c881055f5938773f6b44e7c8b207117963612b2eaf889f5b7ef8b61e1143cd' +LOVELY_INTEGRITY = 'cd00b45ad63b1eaa00d4924a1eed9a6a330e531d1440767ad8b6703f1eec6dbf' --Class Back = Object:extend() @@ -130,9 +130,16 @@ end function Back:trigger_effect(args) if not args then return end local obj = self.effect.center - if obj.trigger_effect and type(obj.trigger_effect) == 'function' then + if type(obj.calculate) == 'function' then + local o = {obj:calculate(self, args)} + if next(o) ~= nil then return unpack(o) end + elseif type(obj.trigger_effect) == 'function' then + -- kept for compatibility local o = {obj:trigger_effect(args)} - if o then return unpack(o) end + if next(o) ~= nil then + sendWarnMessage(('Found `trigger_effect` function on SMODS.Back object "%s". This field is deprecated; please use `calculate` instead.'):format(obj.key), 'Back') + return unpack(o) + end end if self.name == 'Anaglyph Deck' and args.context == 'eval' and G.GAME.last_blind and G.GAME.last_blind.boss then @@ -201,14 +208,33 @@ end function Back:apply_to_run() local obj = self.effect.center if obj.apply and type(obj.apply) == 'function' then - obj:apply() + obj:apply(self) end + if self.effect.config.jokers then + delay(0.4) + G.E_MANAGER:add_event(Event({ + func = function() + for k, v in ipairs(self.effect.config.jokers) do + local card = create_card('Joker', G.jokers, nil, nil, nil, nil, v, 'deck') + card:add_to_deck() + G.jokers:emplace(card) + card:start_materialize() + end + return true + end + })) + end if self.effect.config.voucher then G.GAME.used_vouchers[self.effect.config.voucher] = true G.GAME.cry_owned_vouchers[self.effect.config.voucher] = true G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1 - Card.apply_to_run(nil, G.P_CENTERS[self.effect.config.voucher]) + G.E_MANAGER:add_event(Event({ + func = function() + Card.apply_to_run(nil, G.P_CENTERS[self.effect.config.voucher]) + return true + end + })) end if self.effect.config.hands then G.GAME.starting_params.hands = G.GAME.starting_params.hands + self.effect.config.hands @@ -266,7 +292,12 @@ function Back:apply_to_run() G.GAME.used_vouchers[v ] = true G.GAME.cry_owned_vouchers[v ] = true G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1 - Card.apply_to_run(nil, G.P_CENTERS[v]) + G.E_MANAGER:add_event(Event({ + func = function() + Card.apply_to_run(nil, G.P_CENTERS[v]) + return true + end + })) end end if self.name == 'Checkered Deck' then diff --git a/lovely/dump/blind.lua b/lovely/dump/blind.lua index cfb9e88..3559228 100644 --- a/lovely/dump/blind.lua +++ b/lovely/dump/blind.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = 'e8cd6ceef85971448b1b28bb95d2a4b68928ef66a2261cc19c1e9c7de9c6d3b8' +LOVELY_INTEGRITY = 'ceaf7d365cb8eac62c7dcf3be1ef07cc6b0dac3977bde52960496d7f844a668d' --class Blind = Moveable:extend() @@ -58,12 +58,14 @@ function Blind:set_text() if self.name == 'The Ox' then loc_vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')} end + local target = {type = 'raw_descriptions', key = self.config.blind.key, set = 'Blind', vars = loc_vars or self.config.blind.vars} local obj = self.config.blind if obj.loc_vars and type(obj.loc_vars) == 'function' then - local res = obj:loc_vars() or {} - loc_vars = res.vars or {} + local res = obj:loc_vars() or {} + target.vars = res.vars or target.vars + target.key = res.key or target.key end - local loc_target = localize{type = 'raw_descriptions', key = self.config.blind.key, set = 'Blind', vars = loc_vars or self.config.blind.vars} + local loc_target = localize(target) if loc_target then self.loc_name = self.name == '' and self.name or localize{type ='name_text', key = self.config.blind.key, set = 'Blind'} self.loc_debuff_text = '' @@ -218,10 +220,10 @@ function Blind:set_blind(blind, reset, silent) if blind then self.in_blind = true end - local obj = self.config.blind - if obj.set_blind and type(obj.set_blind) == 'function' then - obj:set_blind() - end + local obj = self.config.blind + if obj.set_blind and type(obj.set_blind) == 'function' then + obj:set_blind() + end end --add new debuffs for _, v in ipairs(G.playing_cards) do @@ -287,10 +289,10 @@ function Blind:alert_debuff(first) end function Blind:get_loc_debuff_text() - local obj = self.config.blind - if obj.get_loc_debuff_text and type(obj.get_loc_debuff_text) == 'function' then - return obj:get_loc_debuff_text() - end + local obj = self.config.blind + if obj.get_loc_debuff_text and type(obj.get_loc_debuff_text) == 'function' then + return obj:get_loc_debuff_text() + end local disp_text = (self.config.blind.name == 'The Wheel' and G.GAME.probabilities.normal or '')..self.loc_debuff_text if (self.config.blind.name == 'The Mouth') and self.only_hand then disp_text = disp_text..' ['..localize(self.only_hand, 'poker_hands')..']' end return disp_text @@ -363,7 +365,7 @@ function Blind:defeat(silent) end local obj = self.config.blind if obj.defeat and type(obj.defeat) == 'function' then - obj:defeat() + obj:defeat() end if self.name == 'Crimson Heart' then for _, v in ipairs(G.jokers.cards) do @@ -392,7 +394,7 @@ function Blind:disable() end local obj = self.config.blind if obj.disable and type(obj.disable) == 'function' then - obj:disable() + obj:disable() end if self.name == 'Crimson Heart' then for _, v in ipairs(G.jokers.cards) do @@ -504,7 +506,7 @@ function Blind:press_play() if self.disabled then return end local obj = self.config.blind if obj.press_play and type(obj.press_play) == 'function' then - return obj:press_play() + return obj:press_play() end if self.name == "The Hook" then G.E_MANAGER:add_event(Event({ func = function() @@ -554,7 +556,7 @@ function Blind:modify_hand(cards, poker_hands, text, mult, hand_chips) if self.disabled then return mult, hand_chips, false end local obj = self.config.blind if obj.modify_hand and type(obj.modify_hand) == 'function' then - return obj:modify_hand(cards, poker_hands, text, mult, hand_chips) + return obj:modify_hand(cards, poker_hands, text, mult, hand_chips) end if self.name == "The Flint" then self.triggered = true @@ -567,7 +569,7 @@ function Blind:debuff_hand(cards, hand, handname, check) if self.disabled then return end local obj = self.config.blind if obj.debuff_hand and type(obj.debuff_hand) == 'function' then - return obj:debuff_hand(cards, hand, handname, check) + return obj:debuff_hand(cards, hand, handname, check) end if self.debuff then self.triggered = false @@ -628,7 +630,7 @@ function Blind:drawn_to_hand() if not self.disabled then local obj = self.config.blind if obj.drawn_to_hand and type(obj.drawn_to_hand) == 'function' then - obj:drawn_to_hand() + obj:drawn_to_hand() end if self.name == 'Cerulean Bell' then local any_forced = nil for k, v in ipairs(G.hand.cards) do @@ -679,7 +681,7 @@ function Blind:stay_flipped(area, card) if not self.disabled then local obj = self.config.blind if obj.stay_flipped and type(obj.stay_flipped) == 'function' then - return obj:stay_flipped(area, card) + return obj:stay_flipped(area, card) end if area == G.hand then if self.name == 'The Wheel' and pseudorandom(pseudoseed('wheel')) < G.GAME.probabilities.normal/7 then @@ -701,22 +703,22 @@ end function Blind:debuff_card(card, from_blind) local obj = self.config.blind if not self.disabled and obj.recalc_debuff and type(obj.recalc_debuff) == 'function' then - if obj:recalc_debuff(card, from_blind) then - card:set_debuff(true) - if card.debuff then card.debuffed_by_blind = true end - else - card:set_debuff(false) - end - return + if obj:recalc_debuff(card, from_blind) then + card:set_debuff(true) + if card.debuff then card.debuffed_by_blind = true end + else + card:set_debuff(false) + end + return elseif not self.disabled and obj.debuff_card and type(obj.debuff_card) == 'function' then - sendWarnMessage(("Blind object %s has debuff_card function, recalc_debuff is preferred"):format(obj.key), obj.set) - if obj:debuff_card(card, from_blind) then - card:set_debuff(true) - if card.debuff then card.debuffed_by_blind = true end - else - card:set_debuff(false) - end - return + sendWarnMessage(("Blind object %s has debuff_card function, recalc_debuff is preferred"):format(obj.key), obj.set) + if obj:debuff_card(card, from_blind) then + card:set_debuff(true) + if card.debuff then card.debuffed_by_blind = true end + else + card:set_debuff(false) + end + return end if self.debuff and not self.disabled and card.area ~= G.jokers then if self.debuff.suit and card:is_suit(self.debuff.suit, true) then @@ -838,7 +840,7 @@ function Blind:load(blindTable) if G.P_BLINDS[blindTable.config_blind] then if self.config.blind.atlas then - self.children.animatedSprite.atlas = G.ANIMATION_ATLAS[self.config.blind.atlas] + self.children.animatedSprite.atlas = G.ANIMATION_ATLAS[self.config.blind.atlas] end self.blind_set = true self.children.animatedSprite.states.visible = true diff --git a/lovely/dump/card.lua b/lovely/dump/card.lua index 815d1af..2799ded 100644 --- a/lovely/dump/card.lua +++ b/lovely/dump/card.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = '68c2ebd87be76547897e6d6962d4d584197f285bae1b2b46c4916611b072fcd7' +LOVELY_INTEGRITY = 'af84d6c3467720a23ecaec33b0418eba5566291929fca3634893138f120ee811' --class Card = Moveable:extend() @@ -46,9 +46,9 @@ function Card:init(X, Y, W, H, card, center, params) self:set_base(card, true) self.discard_pos = { - r = 3.6*(math.random()-0.5), - x = math.random(), - y = math.random() + r = 0, + x = 0, + y = 0, } self.facing = 'front' @@ -178,8 +178,8 @@ function Card:set_sprites(_center, _front) self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS["Tarot"], G.c_locked.pos) elseif not self.params.bypass_discovery_center and (_center.set == 'Edition' or _center.set == 'Joker' or _center.consumeable or _center.set == 'Voucher' or _center.set == 'Booster') and not _center.discovered then self.children.center = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS[(_center.undiscovered and (_center.undiscovered[G.SETTINGS.colourblind_option and 'hc_atlas' or 'lc_atlas'] or _center.undiscovered.atlas)) - or (SMODS.UndiscoveredSprites[_center.set] and (SMODS.UndiscoveredSprites[_center.set][G.SETTINGS.colourblind_option and 'hc_atlas' or 'lc_atlas'] or SMODS.UndiscoveredSprites[_center.set].atlas)) - or _center.set] or G.ASSET_ATLAS["Joker"], + or (SMODS.UndiscoveredSprites[_center.set] and (SMODS.UndiscoveredSprites[_center.set][G.SETTINGS.colourblind_option and 'hc_atlas' or 'lc_atlas'] or SMODS.UndiscoveredSprites[_center.set].atlas)) + or _center.set] or G.ASSET_ATLAS["Joker"], (_center.undiscovered and _center.undiscovered.pos) or (SMODS.UndiscoveredSprites[_center.set] and SMODS.UndiscoveredSprites[_center.set].pos) or (_center.set == 'Joker' and G.j_undiscovered.pos) or (_center.set == 'Edition' and G.j_undiscovered.pos) or @@ -227,6 +227,12 @@ function Card:set_sprites(_center, _front) if _center.name == 'Square Joker' and (_center.discovered or self.bypass_discovery_center) then self.children.center.scale.y = self.children.center.scale.x end + if _center.pixel_size and _center.pixel_size.h and (_center.discovered or self.bypass_discovery_center) then + self.children.center.scale.y = self.children.center.scale.y*(_center.pixel_size.h/95) + end + if _center.pixel_size and _center.pixel_size.w and (_center.discovered or self.bypass_discovery_center) then + self.children.center.scale.x = self.children.center.scale.x*(_center.pixel_size.w/71) + end end if _center.soul_pos then @@ -237,7 +243,7 @@ function Card:set_sprites(_center, _front) end if _center.set_sprites and type(_center.set_sprites) == 'function' then - _center:set_sprites(self, _front) + _center:set_sprites(self, _front) end if true then self.children.back = Sprite(self.T.x, self.T.y, self.T.w, self.T.h, G.ASSET_ATLAS[(G.GAME.viewed_back or G.GAME.selected_back) and ((G.GAME.viewed_back or G.GAME.selected_back)[G.SETTINGS.colourblind_option and 'hc_atlas' or 'lc_atlas'] or (G.GAME.viewed_back or G.GAME.selected_back).atlas) or 'centers'], self.params.bypass_back or (self.playing_card and G.GAME[self.back].pos or G.P_CENTERS['b_red'].pos)) @@ -341,6 +347,20 @@ function Card:set_ability(center, initial, delay_sprites) self.T.h = H self.T.w = W end + if center.display_size and center.display_size.h and (center.discovered or self.bypass_discovery_center) then + H = H*(center.display_size.h/95) + self.T.h = H + elseif center.pixel_size and center.pixel_size.h and (center.discovered or self.bypass_discovery_center) then + H = H*(center.pixel_size.h/95) + self.T.h = H + end + if center.display_size and center.display_size.w and (center.discovered or self.bypass_discovery_center) then + W = W*(center.display_size.w/71) + self.T.w = W + elseif center.pixel_size and center.pixel_size.w and (center.discovered or self.bypass_discovery_center) then + W = W*(center.pixel_size.w/71) + self.T.w = W + end if delay_sprites then G.E_MANAGER:add_event(Event({ @@ -414,13 +434,13 @@ function Card:set_ability(center, initial, delay_sprites) self.ability.bonus = (self.ability.bonus or 0) + (center.config.bonus or 0) if not self.ability.name then self.ability.name = center.key end for k, v in pairs(center.config) do - if k ~= 'bonus' then - if type(v) == 'table' then - self.ability[k] = copy_table(v) - else - self.ability[k] = v - end - end + if k ~= 'bonus' then + if type(v) == 'table' then + self.ability[k] = copy_table(v) + else + self.ability[k] = v + end + end end if center.consumeable then @@ -473,12 +493,12 @@ function Card:set_ability(center, initial, delay_sprites) local obj = self.config.center if obj.set_ability and type(obj.set_ability) == 'function' then - obj:set_ability(self, initial, delay_sprites) + obj:set_ability(self, initial, delay_sprites) end if not G.OVERLAY_MENU then if self.config.center.key then - G.GAME.used_jokers[self.config.center.key] = true + G.GAME.used_jokers[self.config.center.key] = true end end @@ -608,6 +628,14 @@ function Card:set_seal(_seal, silent, immediate) self.seal = nil if _seal then self.seal = _seal + self.ability.seal = {} + for k, v in pairs(G.P_SEALS[_seal].config or {}) do + if type(v) == 'table' then + self.ability.seal[k] = copy_table(v) + else + self.ability.seal[k] = v + end + end if not silent then G.CONTROLLER.locks.seal = true local sound = G.P_SEALS[_seal].sound or {sound = 'gold_seal', per = 1.2, vol = 0.4} @@ -750,7 +778,7 @@ function Card:add_to_deck(from_debuff) end local obj = self.config.center if obj and obj.add_to_deck and type(obj.add_to_deck) == 'function' then - obj:add_to_deck(self, from_debuff) + obj:add_to_deck(self, from_debuff) end if self.ability.h_size ~= 0 then G.hand:change_size(self.ability.h_size) end @@ -817,7 +845,7 @@ function Card:remove_from_deck(from_debuff) self.added_to_deck = false local obj = self.config.center if obj and obj.remove_from_deck and type(obj.remove_from_deck) == 'function' then - obj:remove_from_deck(self, from_debuff) + obj:remove_from_deck(self, from_debuff) end if self.ability.h_size ~= 0 then G.hand:change_size(-self.ability.h_size) end @@ -880,7 +908,7 @@ function Card:generate_UIBox_unlock_table(hidden) return generate_card_ui(self.config.center, nil, loc_vars, 'Locked') end -function Card:generate_UIBox_ability_table() +function Card:generate_UIBox_ability_table(vars_only) local card_type, hide_desc = self.ability.set or "None", nil local loc_vars = nil local main_start, main_end = nil,nil @@ -1118,6 +1146,7 @@ function Card:generate_UIBox_ability_table() elseif self.ability.name == 'Perkeo' then loc_vars = {self.ability.extra} end end + if vars_only then return loc_vars, main_start, main_end end local badges = {} if (card_type ~= 'Locked' and card_type ~= 'Undiscovered' and card_type ~= 'Default') or self.debuff then badges.card_type = card_type @@ -1164,21 +1193,21 @@ end end function Card:get_nominal(mod) - local mult = 1 - local rank_mult = 1 - if mod == 'suit' then mult = 10000 end - if self.ability.effect == 'Stone Card' or (self.config.center.no_suit and self.config.center.no_rank) then - mult = -10000 - elseif self.config.center.no_suit then - mult = 0 - elseif self.config.center.no_rank then - rank_mult = 0 - end - return 10*self.base.nominal*rank_mult + self.base.suit_nominal*mult + (self.base.suit_nominal_original or 0)*0.0001*mult + 10*self.base.face_nominal*rank_mult + 0.000001*self.unique_val + local mult = 1 + local rank_mult = 1 + if mod == 'suit' then mult = 10000 end + if self.ability.effect == 'Stone Card' or (self.config.center.no_suit and self.config.center.no_rank) then + mult = -10000 + elseif self.config.center.no_suit then + mult = 0 + elseif self.config.center.no_rank then + rank_mult = 0 + end + return 10*self.base.nominal*rank_mult + self.base.suit_nominal*mult + (self.base.suit_nominal_original or 0)*0.0001*mult + 10*self.base.face_nominal*rank_mult + 0.000001*self.unique_val end function Card:get_id() - if (self.ability.effect == 'Stone Card' or self.config.center.no_rank) and not self.vampired then + if SMODS.has_no_rank(self) and not self.vampired then return -math.random(100, 1000000) end return self.base.id @@ -1242,9 +1271,6 @@ function Card:get_edition() if self.debuff then return end if self.edition then local ret = {card = self} - if self.edition.p_dollars then - ret.p_dollars_mod = self.edition.p_dollars - end if self.edition.x_mult then ret.x_mult_mod = self.edition.x_mult end @@ -1265,7 +1291,7 @@ function Card:get_end_of_round_effect(context) ret.h_dollars = self.ability.h_dollars ret.card = self end - if self.seal == 'Blue' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then + if self.seal == 'Blue' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit and not self.ability.extra_enhancement then local card_type = 'Planet' G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 G.E_MANAGER:add_event(Event({ @@ -1369,8 +1395,8 @@ function Card:use_consumeable(area, copier) local obj = self.config.center if obj.use and type(obj.use) == 'function' then - obj:use(self, area, copier) - return + obj:use(self, area, copier) + return end if self.ability.consumeable.mod_conv or self.ability.consumeable.suit_conv then G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() play_sound('tarot1') @@ -1572,7 +1598,7 @@ function Card:use_consumeable(area, copier) func = function() for i=#G.hand.highlighted, 1, -1 do local card = G.hand.highlighted[i] - if card.ability.name == 'Glass Card' then + if SMODS.has_enhancement(card, 'm_glass') then card:shatter() else card:start_dissolve(nil, i == #G.hand.highlighted) @@ -1591,7 +1617,7 @@ function Card:use_consumeable(area, copier) func = function() for i=#destroyed_cards, 1, -1 do local card = destroyed_cards[i] - if card.ability.name == 'Glass Card' then + if SMODS.has_enhancement(card, 'm_glass') then card:shatter() else card:start_dissolve(nil, i ~= #destroyed_cards) @@ -1649,7 +1675,7 @@ function Card:use_consumeable(area, copier) func = function() for i=#destroyed_cards, 1, -1 do local card = destroyed_cards[i] - if card.ability.name == 'Glass Card' then + if SMODS.has_enhancement(card, 'm_glass') then card:shatter() else card:start_dissolve(nil, i == #destroyed_cards) @@ -1660,9 +1686,7 @@ function Card:use_consumeable(area, copier) ease_dollars(self.ability.extra.dollars) end delay(0.3) - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({remove_playing_cards = true, removed = destroyed_cards}) - end + SMODS.calculate_context({ remove_playing_cards = true, removed = destroyed_cards }) end if self.ability.name == 'The Fool' then G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() @@ -1826,19 +1850,9 @@ function Card:can_use_consumeable(any_state, skip_check) end if G.STATE ~= G.STATES.HAND_PLAYED and G.STATE ~= G.STATES.DRAW_TO_HAND and G.STATE ~= G.STATES.PLAY_TAROT or any_state then - if self.ability.name == "The Hanged Man" then - for i = 1, #G.hand.highlighted do - if G.hand.highlighted[i].ability.eternal then return false end - end - end - if self.ability.name == "Death" then - local rightmost = G.hand.highlighted[1] - for i=1, #G.hand.highlighted-1 do if G.hand.highlighted[i].T.x > rightmost.T.x then rightmost = G.hand.highlighted[i] end end - for i=1, #G.hand.highlighted do if G.hand.highlighted[i].ability.eternal and rightmost ~= G.hand.highlighted[i] then return false end end - end local obj = self.config.center if obj.can_use and type(obj.can_use) == 'function' then - return obj:can_use(self) + return obj:can_use(self) end if self.ability.name == 'The Hermit' or self.ability.consumeable.hand_type or self.ability.name == 'Temperance' or self.ability.name == 'Black Hole' then return true end @@ -1917,18 +1931,8 @@ function Card:sell_card() if self.children.use_button then self.children.use_button:remove(); self.children.use_button = nil end if self.children.sell_button then self.children.sell_button:remove(); self.children.sell_button = nil end - if self.config.center.set == 'Joker' then - if G.GAME.jokers_sold then - local contained = false - for i = 1, #G.GAME.jokers_sold do - if self.config.center.key == G.GAME.jokers_sold[i] then contained = true end - end - if not contained then table.insert(G.GAME.jokers_sold, self.config.center.key) end - else - G.GAME.jokers_sold = {self.config.center.key} - end - end - self:calculate_joker{selling_self = true} + local eval, post = eval_card(self, {selling_self = true}) + SMODS.trigger_effects({eval, post}, self) G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2,func = function() if not G.GAME.modifiers.cry_no_sell_value then play_sound('coin2') end @@ -1986,15 +1990,14 @@ end function Card:calculate_dollar_bonus() if self.debuff then return end + local obj = self.config.center + if obj.calc_dollar_bonus and type(obj.calc_dollar_bonus) == 'function' then + return obj:calc_dollar_bonus(self) + end if self.ability.set == "Joker" then if self.ability.name == 'Golden Joker' then return self.ability.extra end - --asdf - local obj = self.config.center - if obj.calc_dollar_bonus and type(obj.calc_dollar_bonus) == 'function' then - return obj:calc_dollar_bonus(self) - end if self.ability.name == 'Cloud 9' and self.ability.nine_tally and self.ability.nine_tally > 0 then return self.ability.extra*(self.ability.nine_tally) end @@ -2026,7 +2029,6 @@ function Card:open() end self.states.hover.can = false - if self.ability.extra < 1 then self.ability.extra = 1 end booster_obj = self.config.center if booster_obj and SMODS.Centers[booster_obj.key] then G.STATE = G.STATES.SMODS_BOOSTER_OPENED @@ -2088,7 +2090,6 @@ function Card:open() for i = 1, _size do local card = nil - if self.ability.extra < 1 then self.ability.extra = 1 end if booster_obj.create_card and type(booster_obj.create_card) == "function" then local _card_to_spawn = booster_obj:create_card(self, i) if type((_card_to_spawn or {}).is) == 'function' and _card_to_spawn:is(Card) then @@ -2186,9 +2187,7 @@ end end end})) - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({open_booster = true, card = self}) - end + SMODS.calculate_context({open_booster = true, card = self}) if G.GAME.modifiers.inflation then G.GAME.inflation = G.GAME.inflation + 1 @@ -2252,9 +2251,7 @@ function Card:redeem() self:apply_to_run() delay(0.6) - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({buying_card = true, card = self}) - end + SMODS.calculate_context({buying_card = true, card = self}) if G.GAME.modifiers.inflation then G.GAME.inflation = G.GAME.inflation + 1 G.E_MANAGER:add_event(Event({func = function() @@ -2278,50 +2275,17 @@ function Card:redeem() end function Card:apply_to_run(center) +local card_to_save = self and copy_card(self) or Card(0, 0, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) +card_to_save.VT.x, card_to_save.VT.y = G.vouchers.T.x, G.vouchers.T.y +G.vouchers:emplace(card_to_save) local center_table = { name = center and center.name or self and self.ability.name, 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 } - if not G.GAME.voucher_edition_index then G.GAME.voucher_edition_index = {} end - if self and self.edition then - G.GAME.voucher_edition_index[center_table.name] = self.edition.type - end - if not G.GAME.voucher_sticker_index then G.GAME.voucher_sticker_index = {eternal = {}, perishable = {}, rental = {}, pinned = {}, banana = {}} end - if self and self.ability and self.ability.eternal and self.ability.eternal == true then - G.GAME.voucher_sticker_index.eternal[center_table.name] = true - end - if self and self.ability and self.ability.perishable and self.ability.perishable == true then - G.GAME.voucher_sticker_index.perishable[center_table.name] = G.GAME.cry_voucher_perishable_rounds - end - if self and self.ability and self.ability.rental and self.ability.rental == true then - G.GAME.voucher_sticker_index.rental[center_table.name] = true - end - if self and self.pinned and self.pinned == true then - G.GAME.voucher_sticker_index.pinned[center_table.name] = true - end - if self and self.ability and self.ability.banana and self.ability.banana == true then - G.GAME.voucher_sticker_index.banana[center_table.name] = true - end - if not center_table.extra then center_table.extra = center and center.config.extra end -- catch - if self and self.ability and self.ability.extra_disp then - local up = false - if center_table.name == 'Tarot Tycoon' or center_table.name == 'Planet Tycoon' then - up = true - end - local og_extra = 9.6/4 - local og_disp = 2 - if up == true then - og_extra = 32/4 - og_disp = 4 - end - local misprint_diff = self.ability.extra_disp / og_disp - G.GAME.cry_voucher_centers[self.config.center_key].config.extra = og_extra*misprint_diff - center_table.extra = og_extra*misprint_diff - end local obj = center or self.config.center if obj.redeem and type(obj.redeem) == 'function' then - obj:redeem(self) - return + obj:redeem(card_to_save) + return end if center_table.name == 'Overstock' or center_table.name == 'Overstock Plus' then G.E_MANAGER:add_event(Event({func = function() change_shop_size(center_table.extra) @@ -2685,7 +2649,10 @@ function Card:calculate_seal(context) if self.debuff then return nil end local obj = G.P_SEALS[self.seal] or {} if obj.calculate and type(obj.calculate) == 'function' then local o = obj:calculate(self, context) - if o then return o end + if o then + if not o.card then o.card = self end + return o + end end if context.repetition then if self.seal == 'Red' then @@ -2696,7 +2663,7 @@ function Card:calculate_seal(context) } end end - if context.discard then + if context.discard and context.other_card == self then if self.seal == 'Purple' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 G.E_MANAGER:add_event(Event({ @@ -2710,6 +2677,7 @@ function Card:calculate_seal(context) return true end)})) card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_tarot'), colour = G.C.PURPLE}) + return nil, true end end end @@ -2736,48 +2704,29 @@ function Card:calculate_perishable() end function Card:calculate_joker(context) -for k, v in pairs(SMODS.Stickers) do - if self.ability[v.key] then - if v.calculate and type(v.calculate) == 'function' then - local override_card = v:calculate(self, context) - if override_card then return override_card end - end - end -end if self.debuff then return nil end local obj = self.config.center if self.ability.set ~= "Enhanced" and obj.calculate and type(obj.calculate) == 'function' then - local o, t = obj:calculate(self, context) - if o or t then return o, t end + local o, t = obj:calculate(self, context) + if o or t then return o, t end end - if self.ability.set == "Planet" and not self.debuff then - if context.joker_main then - if G.GAME.used_vouchers.v_observatory and self.ability.consumeable.hand_type == context.scoring_name then - return { - message = localize{type = 'variable', key = 'a_xmult', vars = {G.GAME.cry_voucher_centers['v_observatory'].config.extra}}, - Xmult_mod = G.GAME.cry_voucher_centers['v_observatory'].config.extra - } - end - end - end if self.ability.set == "Joker" and not self.debuff then if self.ability.name == "Blueprint" then local other_joker = nil for i = 1, #G.jokers.cards do if G.jokers.cards[i] == self then other_joker = G.jokers.cards[i+1] end end - if other_joker and other_joker ~= self then + if other_joker and other_joker ~= self and not context.no_blueprint then context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1 - context.copy_depth = (context.copy_depth and (context.copy_depth + 1)) or 1 context.blueprint_card = context.blueprint_card or self if context.blueprint > #G.jokers.cards + 1 then return end - context.no_callback = true - local other_joker_ret, trig = other_joker:calculate_joker(context) + local other_joker_ret = other_joker:calculate_joker(context) + context.blueprint = nil + local eff_card = context.blueprint_card or self + context.blueprint_card = nil if other_joker_ret then - other_joker_ret.card = context.blueprint_card or self - context.no_callback = not (context.copy_depth <= 1) - context.copy_depth = context.copy_depth - 1; + other_joker_ret.card = eff_card other_joker_ret.colour = G.C.BLUE return other_joker_ret end @@ -2785,17 +2734,16 @@ end end if self.ability.name == "Brainstorm" then local other_joker = G.jokers.cards[1] - if other_joker and other_joker ~= self then + if other_joker and other_joker ~= self and not context.no_blueprint then context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1 - context.copy_depth = (context.copy_depth and (context.copy_depth + 1)) or 1 context.blueprint_card = context.blueprint_card or self if context.blueprint > #G.jokers.cards + 1 then return end - context.no_callback = true - local other_joker_ret, trig = other_joker:calculate_joker(context) + local other_joker_ret = other_joker:calculate_joker(context) + context.blueprint = nil + local eff_card = context.blueprint_card or self + context.blueprint_card = nil if other_joker_ret then - other_joker_ret.card = context.blueprint_card or self - context.no_callback = not (context.copy_depth <= 1) - context.copy_depth = context.copy_depth - 1; + other_joker_ret.card = eff_card other_joker_ret.colour = G.C.RED return other_joker_ret end @@ -2816,6 +2764,7 @@ end return true end)})) card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_tarot'), colour = G.C.PURPLE}) + return nil, true end end elseif context.buying_card then @@ -3184,7 +3133,7 @@ end if self.ability.name == 'Glass Joker' and not context.blueprint and context.consumeable.ability.name == 'The Hanged Man' then local shattered_glass = 0 for k, val in ipairs(G.hand.highlighted) do - if val.ability.name == 'Glass Card' then shattered_glass = shattered_glass + 1 end + if SMODS.has_enhancement(val, 'm_glass') then shattered_glass = shattered_glass + 1 end end if shattered_glass > 0 then self.ability.x_mult = self.ability.x_mult + self.ability.extra*shattered_glass @@ -3215,7 +3164,6 @@ end if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) else G.GAME.dollar_buffer = 0 end return { message = localize('$')..self.ability.extra, - dollars = self.ability.extra, colour = G.C.MONEY } end @@ -3248,6 +3196,7 @@ end end })) return { + card = self, message = localize('k_eaten_ex'), colour = G.C.FILTER } @@ -3255,6 +3204,7 @@ end self.ability.x_mult = self.ability.x_mult - self.ability.extra return { delay = 0.2, + card = self, message = localize{type='variable',key='a_xmult_minus',vars={self.ability.extra}}, colour = G.C.RED } @@ -3265,6 +3215,7 @@ end self.ability.yorick_discards = self.ability.extra.discards self.ability.x_mult = self.ability.x_mult + self.ability.extra.xmult return { + card = self, delay = 0.2, message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}}, colour = G.C.RED @@ -3395,6 +3346,7 @@ end end })) return { + card = self, message = localize('k_eaten_ex'), colour = G.C.FILTER } @@ -3624,7 +3576,7 @@ end } end if self.ability.name == 'Golden Ticket' and - context.other_card.ability.name == 'Gold Card' then + SMODS.has_enhancement(context.other_card, 'm_gold') then G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + self.ability.extra if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) else G.GAME.dollar_buffer = 0 end return { @@ -3797,7 +3749,7 @@ end local temp_Mult, temp_ID = 15, 15 local raised_card = nil for i=1, #G.hand.cards do - if temp_ID >= G.hand.cards[i].base.id and (G.hand.cards[i].ability.effect ~= 'Stone Card' and not G.hand.cards[i].config.center.no_rank) then + if temp_ID >= G.hand.cards[i].base.id and not SMODS.has_no_rank(G.hand.cards[i]) then temp_Mult = G.hand.cards[i].base.nominal temp_ID = G.hand.cards[i].base.id raised_card = G.hand.cards[i] @@ -3974,7 +3926,6 @@ end if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) else G.GAME.dollar_buffer = 0 end return { message = localize('$')..self.ability.extra.dollars, - dollars = self.ability.extra.dollars, colour = G.C.MONEY } end @@ -4203,7 +4154,6 @@ end if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({func = (function() G.GAME.dollar_buffer = 0; return true end)})) else G.GAME.dollar_buffer = 0 end return { message = localize('$')..self.ability.extra, - dollars = self.ability.extra, colour = G.C.MONEY } end @@ -4292,7 +4242,7 @@ end ['Clubs'] = 0 } for i = 1, #context.scoring_hand do - if context.scoring_hand[i].ability.name ~= 'Wild Card' and not context.scoring_hand[i].config.center.any_suit then + if not SMODS.has_any_suit(context.scoring_hand[i]) then if context.scoring_hand[i]:is_suit('Hearts', true) and suits["Hearts"] == 0 then suits["Hearts"] = suits["Hearts"] + 1 elseif context.scoring_hand[i]:is_suit('Diamonds', true) and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 1 elseif context.scoring_hand[i]:is_suit('Spades', true) and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 1 @@ -4300,7 +4250,7 @@ end end end for i = 1, #context.scoring_hand do - if context.scoring_hand[i].ability.name == 'Wild Card' or context.scoring_hand[i].config.center.any_suit then + if SMODS.has_any_suit(context.scoring_hand[i]) then if context.scoring_hand[i]:is_suit('Hearts') and suits["Hearts"] == 0 then suits["Hearts"] = suits["Hearts"] + 1 elseif context.scoring_hand[i]:is_suit('Diamonds') and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 1 elseif context.scoring_hand[i]:is_suit('Spades') and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 1 @@ -4325,7 +4275,7 @@ end ['Clubs'] = 0 } for i = 1, #context.scoring_hand do - if context.scoring_hand[i].ability.name ~= 'Wild Card' and not context.scoring_hand[i].config.center.any_suit then + if not SMODS.has_any_suit(context.scoring_hand[i]) then if context.scoring_hand[i]:is_suit('Hearts') then suits["Hearts"] = suits["Hearts"] + 1 end if context.scoring_hand[i]:is_suit('Diamonds') then suits["Diamonds"] = suits["Diamonds"] + 1 end if context.scoring_hand[i]:is_suit('Spades') then suits["Spades"] = suits["Spades"] + 1 end @@ -4333,7 +4283,7 @@ end end end for i = 1, #context.scoring_hand do - if context.scoring_hand[i].ability.name == 'Wild Card' or context.scoring_hand[i].config.center.any_suit then + if SMODS.has_any_suit(context.scoring_hand[i]) then if context.scoring_hand[i]:is_suit('Clubs') and suits["Clubs"] == 0 then suits["Clubs"] = suits["Clubs"] + 1 elseif context.scoring_hand[i]:is_suit('Diamonds') and suits["Diamonds"] == 0 then suits["Diamonds"] = suits["Diamonds"] + 1 elseif context.scoring_hand[i]:is_suit('Spades') and suits["Spades"] == 0 then suits["Spades"] = suits["Spades"] + 1 @@ -4543,10 +4493,10 @@ end function Card:is_suit(suit, bypass_debuff, flush_calc) if flush_calc then - if self.ability.effect == 'Stone Card' or self.config.center.no_suit then + if SMODS.has_no_suit(self) then return false end - if (self.ability.name == 'Wild Card' or self.config.center.any_suit) and not self.debuff then + if SMODS.has_any_suit(self) and not self.debuff then return true end if next(find_joker('Smeared Joker')) and (self.base.suit == 'Hearts' or self.base.suit == 'Diamonds') == (suit == 'Hearts' or suit == 'Diamonds') then @@ -4555,10 +4505,10 @@ function Card:is_suit(suit, bypass_debuff, flush_calc) return self.base.suit == suit else if self.debuff and not bypass_debuff then return end - if self.ability.effect == 'Stone Card' or self.config.center.no_suit then + if SMODS.has_no_suit(self) then return false end - if self.ability.name == 'Wild Card' or self.config.center.any_suit then + if SMODS.has_any_suit(self) then return true end if next(find_joker('Smeared Joker')) and (self.base.suit == 'Hearts' or self.base.suit == 'Diamonds') == (suit == 'Hearts' or suit == 'Diamonds') then @@ -4636,7 +4586,7 @@ function Card:update(dt) end local obj = self.config.center if obj.update and type(obj.update) == 'function' then - obj:update(self, dt) + obj:update(self, dt) end local obj = G.P_SEALS[self.seal] or {} if obj.update and type(obj.update) == 'function' then @@ -4670,13 +4620,13 @@ function Card:update(dt) if self.ability.name == "Driver's License" then self.ability.driver_tally = 0 for k, v in pairs(G.playing_cards) do - if v.config.center ~= G.P_CENTERS.c_base then self.ability.driver_tally = self.ability.driver_tally+1 end + if next(SMODS.get_enhancements(v)) then self.ability.driver_tally = self.ability.driver_tally+1 end end end if self.ability.name == "Steel Joker" then self.ability.steel_tally = 0 for k, v in pairs(G.playing_cards) do - if v.config.center == G.P_CENTERS.m_steel then self.ability.steel_tally = self.ability.steel_tally+1 end + if SMODS.has_enhancement(v, 'm_steel') then self.ability.steel_tally = self.ability.steel_tally+1 end end end if self.ability.name == "Cloud 9" then @@ -4688,7 +4638,7 @@ function Card:update(dt) if self.ability.name == "Stone Joker" then self.ability.stone_tally = 0 for k, v in pairs(G.playing_cards) do - if v.config.center == G.P_CENTERS.m_stone then self.ability.stone_tally = self.ability.stone_tally+1 end + if SMODS.has_enhancement(v, 'm_stone') then self.ability.stone_tally = self.ability.stone_tally+1 end end end if self.ability.name == "Joker Stencil" then @@ -4942,6 +4892,9 @@ function Card:draw(layer) if (self.config.center.undiscovered and not self.config.center.undiscovered.no_overlay) or not( SMODS.UndiscoveredSprites[self.ability.set] and SMODS.UndiscoveredSprites[self.ability.set].no_overlay) then shared_sprite:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod) else + if SMODS.UndiscoveredSprites[self.ability.set] and SMODS.UndiscoveredSprites[self.ability.set].overlay_sprite then + SMODS.UndiscoveredSprites[self.ability.set].overlay_sprite:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod) + end end end @@ -4953,21 +4906,21 @@ function Card:draw(layer) local center = self.config.center if center.draw and type(center.draw) == 'function' then - center:draw(self, layer) + center:draw(self, layer) end if center.set == 'Default' or center.set == 'Enhanced' and not center.replace_base_card then - if not center.no_suit then - local suit = SMODS.Suits[self.base.suit] or {} - if suit.draw and type(suit.draw) == 'function' then - suit:draw(self, layer) - end - end - if not center.no_rank then - local rank = SMODS.Ranks[self.base.value] or {} - if rank.draw and type(rank.draw) == 'function' then - rank:draw(self, layer) - end - end + if not center.no_suit then + local suit = SMODS.Suits[self.base.suit] or {} + if suit.draw and type(suit.draw) == 'function' then + suit:draw(self, layer) + end + end + if not center.no_rank then + local rank = SMODS.Ranks[self.base.value] or {} + if rank.draw and type(rank.draw) == 'function' then + rank:draw(self, layer) + end + end end --If the card has any edition/seal, add that here if true then @@ -4999,7 +4952,7 @@ function Card:draw(layer) end local seal = G.P_SEALS[self.seal or {}] or {} if type(seal.draw) == 'function' then - seal:draw(self, layer) + seal:draw(self, layer) elseif self.seal then G.shared_seals[self.seal].role.draw_major = self G.shared_seals[self.seal]:draw_shader('dissolve', nil, nil, nil, self.children.center) @@ -5030,6 +4983,17 @@ function Card:draw(layer) G.shared_stickers[self.sticker_run]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) end + for k, v in pairs(SMODS.Stickers) do + if self.ability[v.key] then + if v and v.draw and type(v.draw) == 'function' then + v:draw(self, layer) + else + G.shared_stickers[v.key].role.draw_major = self + G.shared_stickers[v.key]:draw_shader('dissolve', nil, nil, nil, self.children.center) + G.shared_stickers[v.key]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) + end + end + end if self.ability.name == 'The Soul' and (self.config.center.discovered or self.bypass_discovery_center) then local scale_mod = 0.05 + 0.05*math.sin(1.8*G.TIMERS.REAL) + 0.07*math.sin((G.TIMERS.REAL - math.floor(G.TIMERS.REAL))*math.pi*14)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^3 local rotate_mod = 0.1*math.sin(1.219*G.TIMERS.REAL) + 0.07*math.sin((G.TIMERS.REAL)*math.pi*5)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^2 @@ -5051,15 +5015,6 @@ function Card:draw(layer) self.children.floating_sprite.role.draw_major = self self.children.floating_sprite:draw_shader('dissolve',0, nil, nil, self.children.center,scale_mod, rotate_mod,nil, 0.1 + 0.03*math.sin(1.8*G.TIMERS.REAL),nil, 0.6) self.children.floating_sprite:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod) - if self.edition then - for k, v in pairs(G.P_CENTER_POOLS.Edition) do - if v.apply_to_float then - if self.edition[v.key:sub(3)] then - self.children.floating_sprite:draw_shader(v.shader, nil, nil, nil, self.children.center, scale_mod, rotate_mod) - end - end - end - end end if self.config.center.soul_pos and (self.config.center.discovered or self.bypass_discovery_center) then @@ -5109,17 +5064,6 @@ function Card:draw(layer) G.shared_stickers['pinned']:draw_shader('dissolve', nil, nil, nil, self.children.center) G.shared_stickers['pinned']:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) end - for k, v in pairs(SMODS.Stickers) do - if self.ability[v.key] then - if v and v.draw and type(v.draw) == 'function' then - v:draw(self, layer) - else - G.shared_stickers[v.key].role.draw_major = self - G.shared_stickers[v.key]:draw_shader('dissolve', nil, nil, nil, self.children.center) - G.shared_stickers[v.key]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) - end - end - end elseif self.sprite_facing == 'back' then local overlay = G.C.WHITE if self.area and self.area.config.type == 'deck' and self.rank > 3 then @@ -5180,7 +5124,7 @@ function Card:draw(layer) end for k, v in pairs(self.children) do - 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 + 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 end if (layer == 'card' or layer == 'both') and self.area == G.hand then @@ -5293,7 +5237,7 @@ function Card:load(cardTable, other_card) local W = G.CARD_W local obj = self.config.center if obj.load and type(obj.load) == 'function' then - obj:load(self, cardTable, other_card) + obj:load(self, cardTable, other_card) elseif self.config.center.name == "Half Joker" then self.T.h = H*scale/1.7*scale self.T.w = W*scale @@ -5338,6 +5282,16 @@ function Card:load(cardTable, other_card) self.T.h = H*scale self.T.w = W*scale end + if self.config.center.display_size and self.config.center.display_size.h then + self.T.h = H*(self.config.center.display_size.h/95) + elseif self.config.center.pixel_size and self.config.center.pixel_size.h then + self.T.h = H*(self.config.center.pixel_size.h/95) + end + if self.config.center.display_size and self.config.center.display_size.w then + self.T.w = W*(self.config.center.display_size.w/71) + elseif self.config.center.pixel_size and self.config.center.pixel_size.w then + self.T.w = W*(self.config.center.pixel_size.w/71) + end self.VT.h = self.T.H self.VT.w = self.T.w @@ -5389,9 +5343,6 @@ function Card:remove() if self.area then self.area:remove_card(self) end self:remove_from_deck() - if self.ability.consumeable and self.pinned and (G.GAME.cry_pinned_consumeables > 0) then - G.GAME.cry_pinned_consumeables = G.GAME.cry_pinned_consumeables - 1 - end if self.ability.joker_added_to_deck_but_debuffed then if self.edition and self.edition.card_limit then if self.ability.consumeable then diff --git a/lovely/dump/cardarea.lua b/lovely/dump/cardarea.lua index a72a292..343cc8d 100644 --- a/lovely/dump/cardarea.lua +++ b/lovely/dump/cardarea.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = 'a7d11253f7999a0561fd7f99f774f750e8b3702d5f496f16eaf5274a4813bd49' +LOVELY_INTEGRITY = 'e8693aca875516bf9cb3c84fcb6f392131135da095f221f2ef0e6ac727b926df' --Class CardArea = Moveable:extend() @@ -490,7 +490,7 @@ function CardArea:align_cards() card.T.x = card.T.x + card.shadow_parrallax.x/30 end end - table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*((a.pinned and not a.ignore_pinned) and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*((b.pinned and not b.ignore_pinned) and b.sort_id or 0) end) + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end) end if self.config.type == 'hand' and not (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.SMODS_BOOSTER_OPENED) then @@ -506,7 +506,7 @@ function CardArea:align_cards() card.T.x = card.T.x + card.shadow_parrallax.x/30 end end - table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*((a.pinned and not a.ignore_pinned) and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*((b.pinned and not b.ignore_pinned) and b.sort_id or 0) end) + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end) end if self.config.type == 'title' or (self.config.type == 'voucher' and #self.cards == 1) then for k, card in ipairs(self.cards) do @@ -520,7 +520,7 @@ function CardArea:align_cards() card.T.x = card.T.x + card.shadow_parrallax.x/30 end end - table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*((a.pinned and not a.ignore_pinned) and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*((b.pinned and not b.ignore_pinned) and b.sort_id or 0) end) + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end) end if self.config.type == 'voucher' and #self.cards > 1 then local self_w = math.max(self.T.w, 3.2) @@ -549,7 +549,7 @@ function CardArea:align_cards() card.T.x = card.T.x + card.shadow_parrallax.x/30 end end - table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*((a.pinned and not a.ignore_pinned) and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*((b.pinned and not b.ignore_pinned) and b.sort_id or 0) end) + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end) end if self == G.jokers and G.jokers.cart_jokers_expanded then local align_cards = Cartomancer.expand_G_jokers() @@ -581,7 +581,7 @@ function CardArea:align_cards() card.T.x = card.T.x + card.shadow_parrallax.x/30 end end - 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 + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*((a.pinned and not a.ignore_pinned) and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*((b.pinned and not b.ignore_pinned) and b.sort_id or 0) end) end if self.config.type == 'consumeable'then for k, card in ipairs(self.cards) do @@ -597,7 +597,7 @@ function CardArea:align_cards() card.T.x = card.T.x + card.shadow_parrallax.x/30 end end - table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*((a.pinned and not a.ignore_pinned) and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*((b.pinned and not b.ignore_pinned) and b.sort_id or 0) end) + table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end) end for k, card in ipairs(self.cards) do card.rank = k diff --git a/lovely/dump/engine/controller.lua b/lovely/dump/engine/controller.lua index dd203fa..3af61ba 100644 --- a/lovely/dump/engine/controller.lua +++ b/lovely/dump/engine/controller.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = '2550ee40d7ac8df7273f766f9ca41eae9c54302c74f10249ada15b3fe2d6121c' +LOVELY_INTEGRITY = 'd36e3953c2739cd4ea15794fb5e4031a2dac09fc33baadd0a2820e4726891304' ---@class Controller Controller = Object:extend() @@ -815,7 +815,7 @@ function Controller:key_press_update(key, dt) for _, keybind in pairs(SMODS.Keybinds) do - if keybind.action and keybind.key_pressed == key then + if keybind.action and keybind.key_pressed == key and keybind.event == 'pressed' then local execute = true for _, other_key in pairs(keybind.held_keys) do if not self.held_keys[other_key] then @@ -824,7 +824,7 @@ function Controller:key_press_update(key, dt) end end if execute then - keybind.action(self) + keybind:action() end end end @@ -931,14 +931,26 @@ function Controller:key_hold_update(key, dt) if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end --self.frame_buttonpress = true if self.held_key_times[key] then - 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" and not G.SETTINGS.paused and not (G.GAME and G.GAME.USING_CODE) then + for _, keybind in pairs(SMODS.Keybinds) do + if keybind.key_pressed == key and keybind.event == 'held' and keybind.held_duration then + if self.held_key_times[key] > keybind.held_duration 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.held_key_times[key] = nil + end + else + self.held_key_times[key] = self.held_key_times[key] + dt + end + end +end +if key == "r" and not G.SETTINGS.paused and not (G.GAME and G.GAME.USING_CODE) then if self.held_key_times[key] > 0.7 then if not G.GAME.won and not G.GAME.seeded and not G.GAME.challenge then G.PROFILES[G.SETTINGS.profile].high_scores.current_streak.amt = 0 @@ -964,6 +976,20 @@ elseif key == "r" and not G.SETTINGS.paused and not (G.GAME and G.GAME.USING_COD end function Controller:key_release_update(key, dt) +for _, keybind in pairs(SMODS.Keybinds) do + if keybind.action and keybind.key_pressed == key and keybind.event == 'released' 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() + end + end +end if ((self.locked) and not G.SETTINGS.paused) or (self.locks.frame) or (self.frame_buttonpress) then return end self.frame_buttonpress = true if key == "a" and self.held_keys["g"] and not _RELEASE_MODE then diff --git a/lovely/dump/engine/sound_manager.lua b/lovely/dump/engine/sound_manager.lua index 9f5816b..9447dcc 100644 --- a/lovely/dump/engine/sound_manager.lua +++ b/lovely/dump/engine/sound_manager.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = '72872b3b4770af870f29bca0a9c04f8e62103c150ae3d5e6600706da63ac8e0b' +LOVELY_INTEGRITY = 'a89ca7b9273fee523938c932a6467dfa383c8e44b527c8da74869b0ae75efe92' require "love.audio" require "love.sound" @@ -111,12 +111,12 @@ function SET_SFX(s, args) end function MODULATE(args) - if args.desired_track ~= '' then - local sound = ((SOURCES[current_track or {}] or {})[1] or {}).sound - if not sound or not sound:isPlaying() then - RESTART_MUSIC(args) - end - end + if args.desired_track ~= '' then + local sound = ((SOURCES[current_track or {}] or {})[1] or {}).sound + if not sound or not sound:isPlaying() then + RESTART_MUSIC(args) + end + end for k, v in pairs(SOURCES) do local i=1 @@ -196,14 +196,14 @@ function SET_SFX(s, args) if false then elseif request.type == 'sound' then PLAY_SOUND(request) elseif request.type == 'sound_source' then - SMODS_Sounds[request.sound_code] = { - sound_code = request.sound_code, - data = request.data, - sound = sound, - per = request.per, - vol = request.vol, - } - SOURCES[request.sound_code] = {} + SMODS_Sounds[request.sound_code] = { + sound_code = request.sound_code, + data = request.data, + sound = sound, + per = request.per, + vol = request.vol, + } + SOURCES[request.sound_code] = {} elseif request.type == 'stop' then STOP_AUDIO() elseif request.type == 'modulate' then diff --git a/lovely/dump/functions/UI_definitions.lua b/lovely/dump/functions/UI_definitions.lua index f68d60a..4c8c8bc 100644 --- a/lovely/dump/functions/UI_definitions.lua +++ b/lovely/dump/functions/UI_definitions.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = '6dc6391935253a5dba5a3febb135e71775ed356629edd2463e2d01e436702ddd' +LOVELY_INTEGRITY = '6732b4a403b7b8feb5e2decf7325ea96cac23686fd99e992f1aa1c26a7881bbe' --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 @@ -187,10 +187,10 @@ function create_UIBox_notify_alert(_achievement, _type) _type == 'Voucher' and G.ASSET_ATLAS["Voucher"] or _type == 'Back' and G.ASSET_ATLAS["centers"] or G.ASSET_ATLAS["icons"] - local _smods_atlas = _c and ((G.SETTINGS.colourblind_option and _c.hc_atlas or _c.lc_atlas) or _c.atlas) - if _smods_atlas then - _atlas = G.ASSET_ATLAS[_smods_atlas] or _atlas - end + local _smods_atlas = _c and ((G.SETTINGS.colourblind_option and _c.hc_atlas or _c.lc_atlas) or _c.atlas) + if _smods_atlas then + _atlas = G.ASSET_ATLAS[_smods_atlas] or _atlas + end if SMODS.Achievements[_achievement] then _c = SMODS.Achievements[_achievement]; _atlas = G.ASSET_ATLAS[_c.atlas] end local t_s = Sprite(0,0,1.5*(_atlas.px/_atlas.py),1.5,_atlas, _c and _c.pos or {x=3, y=0}) @@ -299,6 +299,15 @@ function G.UIDEF.use_and_sell_buttons(card) }}, }} end + if card.ability.consumeable and booster_obj and booster_obj.select_card then + if (card.area == G.pack_cards and G.pack_cards) then + return {n=G.UIT.ROOT, config = {padding = 0, colour = G.C.CLEAR}, nodes={ + {n=G.UIT.R, config={ref_table = card, r = 0.08, padding = 0.1, align = "bm", minw = 0.5*card.T.w - 0.15, maxw = 0.9*card.T.w - 0.15, minh = 0.3*card.T.h, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'use_card', func = 'can_select_from_booster'}, nodes={ + {n=G.UIT.T, config={text = localize('b_select'),colour = G.C.UI.TEXT_LIGHT, scale = 0.45, shadow = true}} + }}, + }} + end + end if card.ability.consumeable then if (card.area == G.pack_cards and G.pack_cards) then return { @@ -809,7 +818,7 @@ end G.GAME.spectral_rate = G.GAME.spectral_rate or 0 local total_rate = G.GAME.joker_rate + G.GAME.playing_card_rate for _,v in ipairs(SMODS.ConsumableType.ctype_buffer) do - total_rate = total_rate + G.GAME[v:lower()..'_rate'] + total_rate = total_rate + G.GAME[v:lower()..'_rate'] end local polled_rate = pseudorandom(pseudoseed('cdt'..G.GAME.round_resets.ante))*total_rate local check_rate = 0 @@ -822,9 +831,9 @@ end {type = 'Spectral', val = G.GAME.spectral_rate}, } for _, v in ipairs(SMODS.ConsumableType.ctype_buffer) do - if not (v == 'Tarot' or v == 'Planet' or v == 'Spectral') then - table.insert(rates, { type = v, val = G.GAME[v:lower()..'_rate'] }) - end + if not (v == 'Tarot' or v == 'Planet' or v == 'Spectral') then + table.insert(rates, { type = v, val = G.GAME[v:lower()..'_rate'] }) + end end for _, v in ipairs(rates) do if polled_rate > check_rate and polled_rate <= check_rate + v.val then @@ -1158,19 +1167,19 @@ end local obj = card.config.center if AUT.badges.card_type or AUT.badges.force_rarity then - if obj and (obj.set_card_type_badge or obj.type and obj.type.set_card_type_badge) then - if obj.type and type(obj.type.set_card_type_badge) == 'function' then - obj.type:set_card_type_badge(obj, card, badges) - end - if type(obj.set_card_type_badge) == 'function' then - obj:set_card_type_badge(card, badges) - end - else - badges[#badges + 1] = create_badge(((card.ability.name == 'Pluto' or card.ability.name == 'Ceres' or card.ability.name == 'Eris') and localize('k_dwarf_planet')) or (card.ability.name == 'Planet X' and localize('k_planet_q') or card_type),card_type_colour, nil, 1.2) - end + if obj and (obj.set_card_type_badge or obj.type and obj.type.set_card_type_badge) then + if obj.type and type(obj.type.set_card_type_badge) == 'function' then + obj.type:set_card_type_badge(obj, card, badges) + end + if type(obj.set_card_type_badge) == 'function' then + obj:set_card_type_badge(card, badges) + end + else + badges[#badges + 1] = create_badge(((card.ability.name == 'Pluto' or card.ability.name == 'Ceres' or card.ability.name == 'Eris') and localize('k_dwarf_planet')) or (card.ability.name == 'Planet X' and localize('k_planet_q') or card_type),card_type_colour, nil, 1.2) + end end if obj and obj.set_badges and type(obj.set_badges) == 'function' then - obj:set_badges(card, badges) + obj:set_badges(card, badges) end local function is_bad_badge(string) local bad_badges = {'cry_pinned_booster', 'cry_pinned_voucher', 'cry_pinned_consumeable'} @@ -1185,15 +1194,15 @@ end if not is_bad_badge(v) then badges[#badges + 1] = create_badge(localize(v, "labels"), get_badge_colour(v)) end end end if AUT.card_type ~= 'Locked' and AUT.card_type ~= 'Undiscovered' then - SMODS.create_mod_badges(card.config.center, badges) - if card.base then - SMODS.create_mod_badges(SMODS.Ranks[card.base.value], badges) - SMODS.create_mod_badges(SMODS.Suits[card.base.suit], badges) - end - if card.config and card.config.tag then - SMODS.create_mod_badges(SMODS.Tags[card.config.tag.key], badges) - end - badges.mod_set = nil + SMODS.create_mod_badges(card.config.center, badges) + if card.base then + SMODS.create_mod_badges(SMODS.Ranks[card.base.value], badges) + SMODS.create_mod_badges(SMODS.Suits[card.base.suit], badges) + end + if card.config and card.config.tag then + SMODS.create_mod_badges(SMODS.Tags[card.config.tag.key], badges) + end + badges.mod_set = nil end -- if AUT.badges then @@ -1530,7 +1539,7 @@ function create_UIBox_HUD() {n=G.UIT.R, config={align = "cm", colour = G.C.DYN_UI.BOSS_DARK, r=0.1, minh = 30, padding = 0.08}, nodes={ {n=G.UIT.R, config={align = "cm", minh = 0.3}, nodes={}}, {n=G.UIT.R, config={align = "cm", id = 'row_blind', minw = 1, minh = 3.75}, nodes={ - {n=G.UIT.B, config={w=0, h=3.64, id = 'row_blind_bottom'}, nodes={}} + {n=G.UIT.B, config={w=0, h=3.64, id = 'row_blind_bottom'}, nodes={}} }}, contents.dollars_chips, contents.hand, @@ -1670,16 +1679,17 @@ function create_UIBox_blind_choice(type, run_info) }} end G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante - local loc_vars = nil + local target = {type = 'raw_descriptions', key = blind_choice.config.key, set = 'Blind', vars = {}} if blind_choice.config.name == 'The Ox' then - loc_vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')} + target.vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')} end local obj = blind_choice.config if obj.loc_vars and _G['type'](obj.loc_vars) == 'function' then - local res = obj:loc_vars() or {} - loc_vars = res.vars or {} + local res = obj:loc_vars() or {} + target.vars = res.vars or target.vars + target.key = res.key or target.key end - local loc_target = localize{type = 'raw_descriptions', key = blind_choice.config.key, set = 'Blind', vars = loc_vars or blind_choice.config.vars} + local loc_target = localize(target) local loc_name = localize{type = 'name_text', key = blind_choice.config.key, set = 'Blind'} local text_table = loc_target local blind_col = get_blind_main_colour(type) @@ -2701,27 +2711,46 @@ function G.UIDEF.custom_deck_tab(_suit) local rankCount = 0 local lookup = {} -local options = G.COLLABS.options[_suit] -for i = 2, #options do - local skin = SMODS.DeckSkins[options[i]] - for j = 1, #skin.ranks do - if not lookup[skin.ranks[j]] then - lookup[skin.ranks[j]] = true - rankCount = rankCount + 1 +for i, s in ipairs(SMODS.Suit:obj_list(true)) do + local options = G.COLLABS.options[s.key] + for i = 1, #options do + local skin = SMODS.DeckSkins[options[i]] + if skin.palettes and not (skin.display_ranks or skin.ranks) then + for _, p in ipairs(skin.palettes) do + local p_ranks = p.display_ranks or p.ranks + for j = 1, #p_ranks do + if not lookup[p_ranks[j]] then + lookup[p_ranks[j]] = true + rankCount = rankCount + 1 + end + end + end + elseif not skin.palettes and (skin.display_ranks or skin.ranks) then + local ranks = skin.display_ranks or skin.ranks + for j = 1, #ranks do + if not lookup[skin.ranks[j]] then + lookup[skin.ranks[j]] = true + rankCount = rankCount + 1 + end + end end + end end -local face_cards = CardArea( +G.cdds_cards = CardArea( 0,0, math.min(math.max(rankCount*G.CARD_W*0.6, 4*G.CARD_W), 10*G.CARD_W), - 1.4*G.CARD_H, + 1.4*G.CARD_H, {card_limit = rankCount, type = 'title', highlight_limit = 0}) +G.cdds_cards.rankCount = rankCount + + table.insert(t, {n=G.UIT.R, config={align = "cm", colour = G.C.BLACK, r = 0.1, padding = 0.07, no_fill = true}, nodes={ - {n=G.UIT.O, config={object = face_cards}} + {n=G.UIT.O, config={object = G.cdds_cards}} }} ) @@ -2743,26 +2772,25 @@ local face_cards = CardArea( create_option_cycle({options = loc_options, w = 5.5, cycle_shoulders = true, curr_suit = _suit, opt_callback = 'change_collab', current_option = current_option, colour = G.C.RED, focus_args = {snap_to = true, nav = 'wide'}}), }} ) - table.insert(t, create_toggle({label = localize('b_high_contrast_cards'), ref_table = G.SETTINGS, ref_value = 'colourblind_option', callback = G.FUNCS.refresh_contrast_mode})) + local deckskin_key = G.COLLABS.options[_suit][current_option] + + local palette_loc_options = SMODS.DeckSkin.get_palette_loc_options(deckskin_key, _suit) + + local selected_palette = 1 + for i, v in ipairs(G.COLLABS.colour_palettes[deckskin_key]) do + if G.SETTINGS.colour_palettes[_suit] == v then + selected_palette = i + end + end + + table.insert(t, + {n=G.UIT.R, config={align = "cm", id = 'palette_selector'}, nodes={ + create_option_cycle({options = palette_loc_options, w = 5.5, cycle_shoulders = false, curr_suit = _suit, curr_skin = deckskin_key, opt_callback = 'change_colour_palette', current_option = selected_palette, colour = G.C.ORANGE, focus_args = {snap_to = true, nav = 'wide'}}), + }} + ) local faces = {'K','Q','J'} - local rank = SMODS.Ranks['2'] -local cards = {} -local smodSuit = SMODS.Suits[_suit] -repeat - if lookup[rank.key] then - local card_code = smodSuit.card_key .. '_' .. rank.card_key - local card = Card(0,0, G.CARD_W*1.2, G.CARD_H*1.2, G.P_CARDS[card_code], G.P_CENTERS.c_base) - card.no_ui = true - - cards[#cards + 1] = card - end - rank = SMODS.Ranks[rank.next[1]] -until rank == SMODS.Ranks['2'] - -for i = #cards, 1, -1 do - face_cards:emplace(cards[i]) -end + G.FUNCS.update_collab_cards(current_option, _suit, true) return {n=G.UIT.ROOT, config={align = "cm", padding = 0, colour = G.C.CLEAR, r = 0.1, minw = 7, minh = 4.2}, nodes=t} @@ -3746,12 +3774,12 @@ function create_UIBox_your_collection() })) local consumable_nodes = {} if #SMODS.ConsumableType.ctype_buffer <= 3 then - for _, key in ipairs(SMODS.ConsumableType.ctype_buffer) do - local id = 'your_collection_'..key:lower()..'s' - consumable_nodes[#consumable_nodes+1] = UIBox_button({button = id, label = {localize('b_'..key:lower()..'_cards')}, count = G.DISCOVER_TALLIES[key:lower()..'s'], minw = 4, id = id, colour = G.C.SECONDARY_SET[key]}) - end + for _, key in ipairs(SMODS.ConsumableType.ctype_buffer) do + local id = 'your_collection_'..key:lower()..'s' + consumable_nodes[#consumable_nodes+1] = UIBox_button({button = id, label = {localize('b_'..key:lower()..'_cards')}, count = G.DISCOVER_TALLIES[key:lower()..'s'], minw = 4, id = id, colour = G.C.SECONDARY_SET[key]}) + end else - consumable_nodes[#consumable_nodes+1] = UIBox_button({ button = 'your_collection_consumables', label = {localize('b_stat_consumables'), localize{ type = 'variable', key = 'c_types', vars = {#SMODS.ConsumableType.ctype_buffer} } }, count = G.DISCOVER_TALLIES['consumeables'], minw = 4, minh = 4, id = 'your_collection_consumables', colour = G.C.FILTER }) + consumable_nodes[#consumable_nodes+1] = UIBox_button({ button = 'your_collection_consumables', label = {localize('b_stat_consumables'), localize{ type = 'variable', key = 'c_types', vars = {#SMODS.ConsumableType.ctype_buffer} } }, count = G.DISCOVER_TALLIES['consumeables'], minw = 4, minh = 4, id = 'your_collection_consumables', colour = G.C.FILTER }) end local t = create_UIBox_generic_options({ back_func = G.STAGE == G.STAGES.RUN and 'options' or 'exit_overlay_menu', contents = { {n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={ @@ -3795,16 +3823,14 @@ function create_UIBox_your_collection_jokers() ) end - local joker_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Joker) local joker_options = {} - 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)))) + for i = 1, math.ceil(#G.P_CENTER_POOLS.Joker/(5*#G.your_collection)) do + table.insert(joker_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Joker/(5*#G.your_collection)))) end for i = 1, 5 do for j = 1, #G.your_collection do - local center = joker_pool[i+(j-1)*5] - if not center then break end + local center = G.P_CENTER_POOLS["Joker"][i+(j-1)*5] local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) card.sticker = get_joker_win_sticker(center) G.your_collection[j]:emplace(card) @@ -3813,7 +3839,7 @@ function create_UIBox_your_collection_jokers() INIT_COLLECTION_CARD_ALERTS() - local t = create_UIBox_generic_options({ back_func = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id or 'your_collection', contents = { + local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { {n=G.UIT.R, config={align = "cm", r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, {n=G.UIT.R, config={align = "cm"}, nodes={ create_option_cycle({options = joker_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_joker_page', current_option = 1, colour = G.C.RED, no_pips = true, focus_args = {snap_to = true, nav = 'wide'}}) @@ -3881,16 +3907,14 @@ function create_UIBox_your_collection_boosters() ) end - local booster_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Booster) local booster_options = {} - for i = 1, math.ceil(#booster_pool/8) do - table.insert(booster_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#booster_pool/8))) + for i = 1, math.ceil(#G.P_CENTER_POOLS.Booster/8) do + table.insert(booster_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Booster/8))) end for j = 1, #G.your_collection do for i = 1, 4 do - local center = booster_pool[i+(j-1)*4] - if not center then break end + local center = G.P_CENTER_POOLS["Booster"][i+(j-1)*4] local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W*1.27, G.CARD_H*1.27, nil, center) card:start_materialize(nil, i>1 or j>1) G.your_collection[j]:emplace(card) @@ -4003,16 +4027,14 @@ function create_UIBox_your_collection_vouchers(exit) ) end - local voucher_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Voucher) local voucher_options = {} - 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)))) + for i = 1, math.ceil(#G.P_CENTER_POOLS.Voucher/(4*#G.your_collection)) do + table.insert(voucher_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Voucher/(4*#G.your_collection)))) end for i = 1, 4 do for j = 1, #G.your_collection do - local center = voucher_pool[i+(j-1)*4] - if not center then break end + local center = G.P_CENTER_POOLS["Voucher"][i+(j-1)*4] local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center) card.ability.order = i+(j-1)*4 card:start_materialize(nil, i>1 or j>1) @@ -4022,7 +4044,7 @@ function create_UIBox_your_collection_vouchers(exit) INIT_COLLECTION_CARD_ALERTS() - 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 = { + local t = create_UIBox_generic_options({ back_func = exit or 'your_collection', contents = { {n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}, {n=G.UIT.R, config={align = "cm"}, nodes={ create_option_cycle({options = voucher_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_voucher_page', focus_args = {snap_to = true, nav = 'wide'}, current_option = 1, colour = G.C.RED, no_pips = true}) @@ -4175,11 +4197,11 @@ function create_UIBox_your_collection_tags() tag_pool = G.P_TAGS end for k, v in pairs(tag_pool) do - counter = counter + 1 - tag_tab[#tag_tab+1] = v + counter = counter + 1 + tag_tab[#tag_tab+1] = v end for i = 1, math.ceil(counter / 6) do - table.insert(tag_matrix, {}) + table.insert(tag_matrix, {}) end table.sort(tag_tab, function (a, b) return a.order < b.order end) @@ -4215,7 +4237,7 @@ function create_UIBox_your_collection_tags() local table_nodes = {} for i = 1, math.ceil(counter / 6) do - table.insert(table_nodes, {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[i]}) + table.insert(table_nodes, {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[i]}) end local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = { {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK, padding = 0.1, emboss = 0.05}, nodes={ {n=G.UIT.C, config={align = "cm"}, nodes={ @@ -4243,7 +4265,7 @@ function create_UIBox_your_collection_blinds(exit) local s = 1.3 if math.ceil(#blind_tab/6) > 6 then - s = s * 6/math.ceil(#blind_tab/6) + s = s * 6/math.ceil(#blind_tab/6) end local temp_blind = AnimatedSprite(0,0,s,s, G.ANIMATION_ATLAS[discovered and v.atlas or 'blind_chips'], discovered and v.pos or G.b_undiscovered.pos) temp_blind:define_draw_steps({ @@ -4290,13 +4312,13 @@ function create_UIBox_your_collection_blinds(exit) local blinds_per_row = math.ceil(#blind_tab / 6) local row = math.ceil((k - 1) / blinds_per_row + 0.001) table.insert(blind_matrix[row], { - n = G.UIT.C, - config = { align = "cm", padding = 0.1 }, - nodes = { - ((k - blinds_per_row) % (2 * blinds_per_row) == 1) and { n = G.UIT.B, config = { h = 0.2, w = 0.5 } } or nil, - { n = G.UIT.O, config = { object = temp_blind, focus_with_object = true } }, - ((k - blinds_per_row) % (2 * blinds_per_row) == 0) and { n = G.UIT.B, config = { h = 0.2, w = 0.5 } } or nil, - } + n = G.UIT.C, + config = { align = "cm", padding = 0.1 }, + nodes = { + ((k - blinds_per_row) % (2 * blinds_per_row) == 1) and { n = G.UIT.B, config = { h = 0.2, w = 0.5 } } or nil, + { n = G.UIT.O, config = { object = temp_blind, focus_with_object = true } }, + ((k - blinds_per_row) % (2 * blinds_per_row) == 0) and { n = G.UIT.B, config = { h = 0.2, w = 0.5 } } or nil, + } }) end @@ -4347,7 +4369,7 @@ function create_UIBox_your_collection_blinds(exit) end local extras = nil - 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 = { + local t = create_UIBox_generic_options({ back_func = exit or 'your_collection', contents = { {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK, padding = 0.1, emboss = 0.05}, nodes={ {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.L_BLACK, padding = 0.1, force_focus = true, focus_args = {nav = 'tall'}}, nodes={ {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ @@ -4379,12 +4401,13 @@ function create_UIBox_blind_popup(blind, discovered, vars) local blind_text = {} local _dollars = blind.dollars - local loc_vars = nil + local target = {type = 'raw_descriptions', key = blind.key, set = 'Blind', vars = vars or blind.vars} if blind.collection_loc_vars and type(blind.collection_loc_vars) == 'function' then - local res = blind:collection_loc_vars() or {} - loc_vars = res.vars + local res = blind:collection_loc_vars() or {} + target.vars = res.vars or target.vars + target.key = res.key or target.key end - local loc_target = localize{type = 'raw_descriptions', key = blind.key, set = 'Blind', vars = loc_vars or vars or blind.vars} + local loc_target = localize(target) local loc_name = localize{type = 'name_text', key = blind.key, set = 'Blind'} if discovered then @@ -5923,9 +5946,9 @@ function G.UIDEF.challenge_description_tab(args) local SUITS = {} local suit_map = {} for i = #SMODS.Suit.obj_buffer, 1, -1 do - local suit = SMODS.Suits[SMODS.Suit.obj_buffer[i]] - SUITS[suit.card_key] = {} - suit_map[#suit_map+1] = suit.card_key + local suit = SMODS.Suits[SMODS.Suit.obj_buffer[i]] + SUITS[suit.card_key] = {} + suit_map[#suit_map+1] = suit.card_key end local card_protos = nil local _de = nil @@ -5942,11 +5965,11 @@ function G.UIDEF.challenge_description_tab(args) for k, v in pairs(G.P_CARDS) do local _r, _s = SMODS.Ranks[v.value].card_key, SMODS.Suits[v.suit].card_key local keep, _e, _d, _g = true, nil, nil, nil - if type(SMODS.Ranks[v.value].in_pool) == 'function' and not SMODS.Ranks[v.value]:in_pool({initial_deck = true}) then - keep = false + if type(SMODS.Ranks[v.value].in_pool) == 'function' and not SMODS.Ranks[v.value]:in_pool({initial_deck = true, suit = v.suit}) then + keep = false end - if type(SMODS.Suits[v.suit].in_pool) == 'function' and not SMODS.Suits[v.suit]:in_pool({initial_deck = true}) then - keep = false + if type(SMODS.Suits[v.suit].in_pool) == 'function' and not SMODS.Suits[v.suit]:in_pool({initial_deck = true, rank = v.value}) then + keep = false end if _de then if _de.yes_ranks and not _de.yes_ranks[_r] then keep = false end @@ -5970,15 +5993,15 @@ function G.UIDEF.challenge_description_tab(args) local num_suits = 0 for j = 1, #suit_map do - if SUITS[suit_map[j]][1] then num_suits = num_suits + 1 end + if SUITS[suit_map[j]][1] then num_suits = num_suits + 1 end end for j = 1, #suit_map do - if SUITS[suit_map[j]][1] then + if SUITS[suit_map[j]][1] then table.sort(SUITS[suit_map[j]], function(a,b) return a:get_nominal() > b:get_nominal() end ) local view_deck = CardArea( 0,0, 5.5*G.CARD_W, - (0.42 - (num_suits <= 4 and 0 or num_suits >= 8 and 0.28 or 0.07 * (num_suits - 4))) * G.CARD_H, + (0.42 - (num_suits <= 4 and 0 or num_suits >= 8 and 0.28 or 0.07 * (num_suits - 4))) * G.CARD_H, {card_limit = #SUITS[suit_map[j]], type = 'title_2', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.5, draw_layers = {'card'}}) table.insert(deck_tables, {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ diff --git a/lovely/dump/functions/button_callbacks.lua b/lovely/dump/functions/button_callbacks.lua index 3351466..bb48dfb 100644 --- a/lovely/dump/functions/button_callbacks.lua +++ b/lovely/dump/functions/button_callbacks.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = '8857de192c196c2108ac03f2ec1ec6974c1d8c7ef54d7b5fbb92ce6db79734e0' +LOVELY_INTEGRITY = 'd7f48a66f05694a22b7aae4c15c27e443dc398089f32ae2891b595f051091e07' --Moves the tutorial to the next step in queue -- @@ -615,10 +615,9 @@ G.FUNCS.your_collection_joker_page = function(args) c = nil end end - local joker_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Joker) for i = 1, 5 do for j = 1, #G.your_collection do - local center = joker_pool[i+(j-1)*5 + (5*#G.your_collection*(args.cycle_config.current_option - 1))] + local center = G.P_CENTER_POOLS["Joker"][i+(j-1)*5 + (5*#G.your_collection*(args.cycle_config.current_option - 1))] if not center then break end local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) card.sticker = get_joker_win_sticker(center) @@ -681,7 +680,6 @@ end ---@param args {cycle_config: table} --**cycle_config** Is the config table from the original option cycle UIE G.FUNCS.your_collection_booster_page = function(args) -local booster_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Booster) if not args or not args.cycle_config then return end for j = 1, #G.your_collection do for i = #G.your_collection[j].cards,1, -1 do @@ -693,7 +691,7 @@ local booster_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Booster) for j = 1, #G.your_collection do for i = 1, 4 do - local center = booster_pool[i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))] + local center = G.P_CENTER_POOLS["Booster"][i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))] if not center then break end local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W*1.27, G.CARD_H*1.27, nil, center) card:start_materialize(nil, i>1 or j>1) @@ -708,7 +706,6 @@ end ---@param args {cycle_config: table} --**cycle_config** Is the config table from the original option cycle UIE G.FUNCS.your_collection_voucher_page = function(args) -local voucher_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Voucher) if not args or not args.cycle_config then return end for j = 1, #G.your_collection do for i = #G.your_collection[j].cards,1, -1 do @@ -719,7 +716,7 @@ local voucher_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Voucher) end for i = 1, 4 do for j = 1, #G.your_collection do - local center = voucher_pool[i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))] + local center = G.P_CENTER_POOLS["Voucher"][i+(j-1)*4 + (8*(args.cycle_config.current_option - 1))] if not center then break end local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center) card:start_materialize(nil, i>1 or j>1) @@ -1797,7 +1794,8 @@ G.FUNCS.change_lang = function(e) if not lang or lang == G.LANG then G.FUNCS.exit_overlay_menu() else - G.SETTINGS.language = lang.key + G.SETTINGS.language = lang.loc_key or lang.key + G.SETTINGS.real_language = lang.key G:set_language() G.E_MANAGER:clear_queue() G.FUNCS.wipe_on() @@ -2136,8 +2134,8 @@ end end G.FUNCS.can_skip_booster = function(e) - if G.pack_cards and (G.pack_cards.cards[1]) and -(G.STATE == G.STATES.SMODS_BOOSTER_OPENED or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.STANDARD_PACK or G.STATE == G.STATES.BUFFOON_PACK or (G.hand and (G.hand.cards[1] or (G.hand.config.card_limit <= 0)))) then + if G.pack_cards and (not (G.GAME.STOP_USE and G.GAME.STOP_USE > 0)) and +(G.STATE == G.STATES.SMODS_BOOSTER_OPENED or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.STANDARD_PACK or G.STATE == G.STATES.BUFFOON_PACK or (G.hand )) then e.config.colour = G.C.GREY e.config.button = 'skip_booster' else @@ -2218,33 +2216,33 @@ end local nc if card.ability.consumeable then local obj = card.config.center - if obj.keep_on_use and type(obj.keep_on_use) == 'function' then - nc = obj:keep_on_use(card) - end + if obj.keep_on_use and type(obj.keep_on_use) == 'function' then + nc = obj:keep_on_use(card) + end end - if not nc and card.area then card.area:remove_card(card) end + if card.area and (not nc or card.area == G.pack_cards) then card.area:remove_card(card) end - if card.ability.consumeable then - if G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.SMODS_BOOSTER_OPENED then + if booster_obj and booster_obj.select_card then + local area = type(booster_obj.select_card) == 'table' and (booster_obj.select_card[e.config.ref_table.ability.set] or nil) or booster_obj.select_card + G[area]:emplace(card) + play_sound('card1', 0.8, 0.6) + play_sound('generic1') + dont_dissolve = true + delay_fac = 0.2 + elseif card.ability.consumeable then + if nc then + if area then area:remove_from_highlighted(card) end + play_sound('cardSlide2', nil, 0.3) + dont_dissolve = true + end + if (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.SMODS_BOOSTER_OPENED) then card.T.x = G.hand.T.x + G.hand.T.w/2 - card.T.w/2 card.T.y = G.hand.T.y + G.hand.T.h/2 - card.T.h/2 - 0.5 discover_card(card.config.center) - elseif nc then - area:remove_from_highlighted(card) - play_sound('cardSlide2', nil, 0.3) - dont_dissolve = true - else draw_card(G.hand, G.play, 1, 'up', true, card, nil, mute) end + elseif not nc then draw_card(G.hand, G.play, 1, 'up', true, card, nil, mute) end delay(0.2) e.config.ref_table:use_consumeable(area) - if card.edition and card.edition.key then - local ed = SMODS.Centers[card.edition.key] - if ed.calculate and type(ed.calculate) == 'function' then - ed:calculate(card, {from_consumable = true}) - end - end - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({using_consumeable = true, consumeable = card}) - end + SMODS.calculate_context({using_consumeable = true, consumeable = card, area = card.from_area}) elseif card.ability.set == 'Enhanced' or card.ability.set == 'Default' then G.playing_card = (G.playing_card and G.playing_card + 1) or 1 G.deck:emplace(card) @@ -2295,6 +2293,8 @@ end prev_state == G.STATES.SPECTRAL_PACK or prev_state == G.STATES.STANDARD_PACK or prev_state == G.STATES.SMODS_BOOSTER_OPENED or prev_state == G.STATES.BUFFOON_PACK) and G.booster_pack then + if nc and area == G.pack_cards then G.pack_cards:remove_card(card); G.consumeables:emplace(card) end + booster_obj = nil if area == G.consumeables or area == G.hand then G.booster_pack.alignment.offset.y = G.booster_pack.alignment.offset.py G.booster_pack.alignment.offset.py = nil @@ -2346,11 +2346,7 @@ end G.FUNCS.sell_card = function(e) local card = e.config.ref_table card:sell_card() - for i = 1, #G.jokers.cards do - if G.jokers.cards[i] ~= card then - G.jokers.cards[i]:calculate_joker({selling_card = true, card = card}) - end - end + SMODS.calculate_context({selling_card = true, card = card}) end G.FUNCS.can_confirm_contest_name = function(e) @@ -2442,6 +2438,7 @@ G.FUNCS.buy_from_shop = function(e) trigger = 'after', delay = 0.1, func = function() + c1.from_area = c1.area c1.area:remove_card(c1) c1:add_to_deck() if c1.children.price then c1.children.price:remove() end @@ -2462,7 +2459,11 @@ G.FUNCS.buy_from_shop = function(e) else G.jokers:emplace(c1) end - G.E_MANAGER:add_event(Event({func = function() c1:calculate_joker({buying_card = true, card = c1}) return true end})) + G.E_MANAGER:add_event(Event({func = function() + local eval, post = eval_card(c1, {buying_card = true, card = c1}) + SMODS.trigger_effects({eval, post}, c1) + return true + end})) end --Tallies for unlocks G.GAME.round_scores.cards_purchased.amt = G.GAME.round_scores.cards_purchased.amt + 1 @@ -2476,9 +2477,7 @@ G.FUNCS.buy_from_shop = function(e) G.GAME.current_round.jokers_purchased = G.GAME.current_round.jokers_purchased + 1 end - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({buying_card = true, card = c1}) - end + SMODS.calculate_context({buying_card = true, card = c1}) if G.GAME.modifiers.inflation then G.GAME.inflation = G.GAME.inflation + 1 @@ -2510,9 +2509,7 @@ end stop_use() G.CONTROLLER.locks.toggle_shop = true if G.shop then - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({ending_shop = true}) - end + SMODS.calculate_context({ending_shop = true}) G.E_MANAGER:add_event(Event({ trigger = 'immediate', func = function() @@ -2585,9 +2582,8 @@ end end G.FUNCS.skip_booster = function(e) - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({skipping_booster = true}) - end + booster_obj = nil + SMODS.calculate_context({skipping_booster = true}) G.FUNCS.end_consumeable(e) end @@ -2795,9 +2791,7 @@ end trigger = 'immediate', func = function() delay(0.3) - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({skip_blind = true}) - end + SMODS.calculate_context({skip_blind = true}) save_run() for i = 1, #G.GAME.tags do G.GAME.tags[i]:apply_to_run({type = 'immediate'}) @@ -2828,6 +2822,16 @@ end end G.FUNCS.reroll_boss = function(e) + if not G.blind_select_opts then + G.GAME.round_resets.boss_rerolled = true + if not G.from_boss_tag then ease_dollars(-cry_cheapest_boss_reroll()) end + G.from_boss_tag = nil + G.GAME.round_resets.blind_choices.Boss = get_new_boss() + for i = 1, #G.GAME.tags do + if G.GAME.tags[i]:apply_to_run({type = 'new_blind_choice'}) then break end + end + return true + end stop_use() G.GAME.round_resets.boss_rerolled = true if not G.from_boss_tag then ease_dollars(-cry_cheapest_boss_reroll()) end @@ -2927,9 +2931,7 @@ end G.CONTROLLER.interrupt.focus = false G.CONTROLLER.locks.shop_reroll = false G.CONTROLLER:recall_cardarea_focus('shop_jokers') - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({reroll_shop = true}) - end + SMODS.calculate_context({reroll_shop = true}) return true end })) diff --git a/lovely/dump/functions/common_events.lua b/lovely/dump/functions/common_events.lua index 00353ff..6c6400a 100644 --- a/lovely/dump/functions/common_events.lua +++ b/lovely/dump/functions/common_events.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = '438a59ab63623d723f338cbbdf5d809c59e9a912c1f610047af5dade5f53ac5f' +LOVELY_INTEGRITY = '2c8ce4c0bac30f3323a4c474be97cee2bdcdd76ecf06cecea0a240c944640f67' function set_screen_positions() if G.STAGE == G.STAGES.RUN then @@ -597,39 +597,57 @@ function update_hand_text(config, vals) end function eval_card(card, context) - local enhancement_calculated = false - local center = card.config.center + if card.ability.set ~= 'Joker' and card.debuff then return {}, {} end context = context or {} local ret = {} if context.repetition_only then - if card.ability.set == 'Enhanced' and center.calculate and type(center.calculate) == 'function' then - center:calculate(card, context, ret) - enhancement_calculated = true + if card.ability.set == 'Enhanced' then + local enhancement = card:calculate_enhancement(context) + if enhancement then + ret.enhancement = enhancement + end end - local seals = card:calculate_seal(context) - if seals then - ret.seals = seals + if card.edition then + local edition = card:calculate_edition(context) + if edition then + ret.edition = edition + end end + if card.seal then + local seals = card:calculate_seal(context) + if seals then + ret.seals = seals + end + end + for k,v in pairs(SMODS.Stickers) do + local sticker = card:calculate_sticker(context, k) + if sticker then + ret[v] = sticker + end + end + + -- TARGET: evaluate your own repetition effects return ret end - if context.cardarea == G.play then + if context.cardarea == G.play and context.main_scoring then + ret.playing_card = {} local chips = card:get_chip_bonus() - if chips > 0 then - ret.chips = chips + if chips ~= 0 then + ret.playing_card.chips = chips end - + local mult = card:get_chip_mult() - if mult > 0 then - ret.mult = mult + if mult ~= 0 then + ret.playing_card.mult = mult end - + local x_mult = card:get_chip_x_mult(context) if x_mult > 0 then - ret.x_mult = x_mult + ret.playing_card.x_mult = x_mult end - + local x_chips = card:get_chip_x_bonus() if x_chips > 0 then ret.x_chips = x_chips @@ -676,76 +694,95 @@ function eval_card(card, context) end local p_dollars = card:get_p_dollars() if p_dollars > 0 then - ret.p_dollars = p_dollars - end - - if card.ability.set == 'Enhanced' and center.calculate and type(center.calculate) == 'function' then - center:calculate(card, context, ret) - enhancement_calculated = true + ret.playing_card.p_dollars = p_dollars end + + -- TARGET: main scoring on played cards + local jokers = card:calculate_joker(context) if jokers then ret.jokers = jokers end - - local edition = card:get_edition(context) + + local edition = card:calculate_edition(context) if edition then ret.edition = edition end end - - if context.cardarea == G.hand then - local h_mult = card:get_chip_h_mult() - if h_mult > 0 then - ret.h_mult = h_mult + if context.end_of_round and context.cardarea == G.hand and context.playing_card_end_of_round then + local end_of_round = card:get_end_of_round_effect(context) + if end_of_round then + ret.end_of_round = end_of_round end + end + if context.cardarea == G.hand and context.main_scoring then + ret.playing_card = {} + local h_mult = card:get_chip_h_mult() + if h_mult ~= 0 then + ret.playing_card.h_mult = h_mult + end + local h_x_mult = card:get_chip_h_x_mult() if h_x_mult > 0 then - ret.x_mult = h_x_mult + ret.playing_card.x_mult = h_x_mult end + + -- TARGET: main scoring on held cards - if card.ability.set == 'Enhanced' and center.calculate and type(center.calculate) == 'function' then - center:calculate(card, context, ret) - enhancement_calculated = true - end local jokers = card:calculate_joker(context) if jokers then ret.jokers = jokers end end - if card.edition and card.edition.key then - local ed = SMODS.Centers[card.edition.key] - if ed.calculate and type(ed.calculate) == 'function' then - context.from_playing_card = true - ed:calculate(card, context) - context.from_playing_card = nil + if card.ability.set == 'Enhanced' then + local enhancement = card:calculate_enhancement(context) + if enhancement then + ret.enhancement = enhancement end end - if not enhancement_calculated and card.ability.set == 'Enhanced' and center.calculate and type(center.calculate) == 'function' then - center:calculate(card, context, ret) - enhancement_calculated = true - end - local seals = card:calculate_seal(context) - if seals then - ret.seals = seals - end - if context.cardarea == G.jokers or context.card == G.consumeables then - local jokers = nil - if context.edition then - jokers = card:get_edition(context) - elseif context.other_joker then - jokers = context.other_joker:calculate_joker(context) - else - jokers = card:calculate_joker(context) + if card.edition then + local edition = card:calculate_edition(context) + if edition then + ret.edition = edition end - if jokers then + end + if card.seal and not card.ability.extra_enhancement then + local seals = card:calculate_seal(context) + if seals then + ret.seals = seals + end + end + for k,v in pairs(SMODS.Stickers) do + local sticker = card:calculate_sticker(context, k) + if sticker then + ret[v] = sticker + end + end + + -- TARGET: evaluate your own general effects + local post_trig = {} + local areas = SMODS.get_card_areas('jokers') + local area_set = {} + for _,v in ipairs(areas) do area_set[v] = true end + if card.area and area_set[card.area] then + local jokers, triggered = card:calculate_joker(context) + if jokers or triggered then ret.jokers = jokers + if not (context.retrigger_joker_check or context.retrigger_joker) then + local retriggers = SMODS.calculate_retriggers(card, context, ret) + if next(retriggers) then + ret.retriggers = retriggers + end + end + if not context.post_trigger and not context.retrigger_joker_check and SMODS.optional_features.post_trigger then + SMODS.calculate_context({blueprint_card = context.blueprint_card, post_trigger = true, other_card = card, other_context = context, other_ret = ret}, post_trig) + end end end - - return ret + + return ret, post_trig end function set_alerts() @@ -753,7 +790,7 @@ function set_alerts() G.REFRESH_ALERTS = nil local alert_joker, alert_voucher, alert_tarot, alert_planet, alert_spectral, alert_blind, alert_edition, alert_tag, alert_seal, alert_booster = false,false,false,false,false,false,false,false,false,false for k, v in pairs(G.P_CENTERS) do - if v.discovered and not v.alerted then + if v.discovered and not v.alerted and not v.no_collection then if v.set == 'Voucher' then alert_voucher = true end if v.set == 'Tarot' then alert_tarot = true end if v.set == 'Planet' then alert_planet = true end @@ -764,17 +801,17 @@ function set_alerts() end end for k, v in pairs(G.P_BLINDS) do - if v.discovered and not v.alerted then + if v.discovered and not v.alerted and not v.no_collection then alert_blind = true end end for k, v in pairs(G.P_TAGS) do - if v.discovered and not v.alerted then + if v.discovered and not v.alerted and not v.no_collection then alert_tag = true end end for k, v in pairs(G.P_SEALS) do - if v.discovered and not v.alerted then + if v.discovered and not v.alerted and not v.no_collection then alert_seal = true end end @@ -885,7 +922,14 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra) local y_off = 0.15*G.CARD_H if card.area == G.jokers or card.area == G.consumeables then y_off = 0.05*card.T.h - elseif card.area == G.hand then + elseif card == G.deck then + y_off = -0.05*G.CARD_H + card_aligned = 'tm' + elseif card.area == G.discard or card.area == G.vouchers then + y_off = card.area == G.discard and -0.35*G.CARD_H or -0.65*G.CARD_H + card = G.deck.cards[1] or G.deck + card_aligned = 'tm' + elseif card.area == G.hand or card.area == G.deck then y_off = -0.05*G.CARD_H card_aligned = 'tm' elseif card.area == G.play then @@ -910,27 +954,35 @@ 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',vars={amt}} + text = localize{type='variable',key='a_chips'..(amt<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',vars={amt}} + text = localize{type='variable',key='a_mult'..(amt<0 and '_minus' or ''),vars={math.abs(amt)}} colour = G.C.MULT config.type = 'fade' config.scale = 0.7 + elseif eval_type == 'x_chips' then + sound = 'xchips' + volume = 0.7 + amt = amt + text = localize{type='variable',key='a_xchips'..(amt<0 and '_minus' or ''),vars={math.abs(amt)}} + colour = G.C.BLUE + config.type = 'fade' + config.scale = 0.7 elseif (eval_type == 'x_mult') or (eval_type == 'h_x_mult') then sound = 'multhit2' volume = 0.7 amt = amt - text = localize{type='variable',key='a_xmult',vars={amt}} + text = localize{type='variable',key='a_xmult'..(amt<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',vars={amt}} + text = localize{type='variable',key='a_mult'..(amt<0 and '_minus' or ''),vars={math.abs(amt)}} colour = G.C.MULT config.type = 'fade' config.scale = 0.7 @@ -1013,6 +1065,9 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra) colour = G.C.DARK_EDITION end volume = extra.edition and 0.3 or sound == 'multhit2' and 0.7 or 1 + sound = extra.sound or sound + percent = extra.pitch or percent + volume = extra.volume or volume delay = extra.delay or 0.75 amt = 1 text = extra.message or text @@ -1020,7 +1075,7 @@ function card_eval_status_text(card, eval_type, amt, percent, dir, extra) if not extra.edition and (extra.mult_mod or extra.Xmult_mod) then colour = G.C.MULT end - if extra.chip_mod then + if extra.chip_mod or extra.Xchip_mod then config.type = 'fall' colour = G.C.CHIPS config.scale = 0.7 @@ -1187,15 +1242,13 @@ function add_round_eval_row(config) })) local dollar_row = 0 if num_dollars > 60 or num_dollars < -60 then - local dollar_string if num_dollars < 0 then --if negative - dollar_string = '-'..localize('$')..(num_dollars*-1) G.E_MANAGER:add_event(Event({ trigger = 'before',delay = 0.38, func = function() G.round_eval:add_child( {n=G.UIT.R, config={align = "cm", id = 'dollar_row_'..(dollar_row+1)..'_'..config.name}, nodes={ - {n=G.UIT.O, config={object = DynaText({string = {localize('$')..(num_dollars*-1)}, colours = {G.C.MONEY}, shadow = true, pop_in = 0, scale = 0.65, float = true})}} + {n=G.UIT.O, config={object = DynaText({string = {'-'..localize('$')..format_ui_value(-num_dollars)}, colours = {G.C.MONEY}, shadow = true, pop_in = 0, scale = 0.65, float = true})}} }}, G.round_eval:get_UIE_by_ID('dollar_'..config.name)) play_sound('coin3', 0.9+0.2*math.random(), 0.7) @@ -1204,7 +1257,6 @@ function add_round_eval_row(config) end })) else --if positive - dollar_string = localize('$')..num_dollars G.E_MANAGER:add_event(Event({ trigger = 'before',delay = 0.38, func = function() @@ -1222,7 +1274,7 @@ function add_round_eval_row(config) --asdf end else local dollars_to_loop - if num_dollars < 0 then dollars_to_loop = num_dollars*-1 else dollars_to_loop = num_dollars end + if num_dollars < 0 then dollars_to_loop = (num_dollars*-1)+1 else dollars_to_loop = num_dollars end for i = 1, dollars_to_loop do G.E_MANAGER:add_event(Event({ trigger = 'before',delay = 0.18 - ((num_dollars > 20 and 0.13) or (num_dollars > 9 and 0.1) or 0), @@ -1264,7 +1316,7 @@ function add_round_eval_row(config) definition = {n=G.UIT.ROOT, config={align = 'cm', colour = G.C.CLEAR}, nodes={ {n=G.UIT.R, config={id = 'cash_out_button', align = "cm", padding = 0.1, minw = 7, r = 0.15, colour = G.GAME.current_round.semicolon and G.C.SET.Code or G.C.ORANGE, shadow = true, hover = true, one_press = true, button = 'cash_out', focus_args = {snap_to = true}}, nodes={ {n=G.UIT.T, config={text = G.GAME.current_round.semicolon and localize('k_end_blind') or (localize('b_cash_out')..": "), scale = 1, colour = G.C.UI.TEXT_LIGHT, shadow = true}}, - {n=G.UIT.T, config={text = not G.GAME.current_round.semicolon and localize('$')..format_ui_value(config.dollars) or ';', scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}} + {n=G.UIT.T, config={text = localize('$')..format_ui_value(config.dollars), scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}} }},}}, config = { align = 'tmi', @@ -1514,9 +1566,9 @@ function check_for_unlock(args) local custom_check if not card.unlocked and card.check_for_unlock and type(card.check_for_unlock) == 'function' then - ret = card:check_for_unlock(args) - if ret then unlock_card(card) end - custom_check = true + ret = card:check_for_unlock(args) + if ret then unlock_card(card) end + custom_check = true end if not custom_check and not card.unlocked and card.unlock_condition and args.type == 'career_stat' then if args.statname == card.unlock_condition.type and G.PROFILES[G.SETTINGS.profile].career_stats[args.statname] >= card.unlock_condition.extra then ret = true @@ -1549,12 +1601,12 @@ function check_for_unlock(args) if args.type == 'play_all_hearts' then local played = true for k, v in ipairs(G.deck.cards) do - if (v.ability.name ~= 'Stone Card' and not v.config.center.no_suit) and v.base.suit == 'Hearts' then + if not SMODS.has_no_suit(v) and v.base.suit == 'Hearts' then played = false end end for k, v in ipairs(G.hand.cards) do - if (v.ability.name ~= 'Stone Card' and not v.config.center.no_suit) and v.base.suit == 'Hearts' then + if not SMODS.has_no_suit(v) and v.base.suit == 'Hearts' then played = false end end @@ -1751,7 +1803,7 @@ function check_for_unlock(args) if card.name == 'Golden Ticket' then local tally = 0 for j = 1, #args.cards do - if args.cards[j].ability.name == 'Gold Card' then + if SMODS.has_enhancement(args.cards[j], 'm_gold') then tally = tally+1 end end @@ -1834,7 +1886,7 @@ end function unlock_card(card) if card.unlocked == false then - if not SMODS.seeded_unlocks and (G.GAME.seeded or G.GAME.challenge) then return end + if not SMODS.config.seeded_unlocks and (G.GAME.seeded or G.GAME.challenge) then return end if card.unlocked or card.wip then return end G:save_notify(card) card.unlocked = true @@ -1889,7 +1941,8 @@ function fetch_achievements() G.ACHIEVEMENTS[kk].earned = true end end - end if G.F_NO_ACHIEVEMENTS then return end + end + if G.F_NO_ACHIEVEMENTS then return end --|FROM LOCAL SETTINGS FILE --|------------------------------------------------------- @@ -1924,15 +1977,32 @@ function fetch_achievements() end function unlock_achievement(achievement_name) - if G.PROFILES[G.SETTINGS.profile].all_unlocked and (G.ACHIEVEMENTS and G.ACHIEVEMENTS[achievement_name] and not G.ACHIEVEMENTS[achievement_name].bypass_all_unlocked and SMODS.config.achievements < 3) or (SMODS.config.achievements < 3 and (G.GAME.seeded or G.GAME.challenge)) then return end + if G.PROFILES[G.SETTINGS.profile].all_unlocked and (G.ACHIEVEMENTS and G.ACHIEVEMENTS[achievement_name] and not G.ACHIEVEMENTS[achievement_name].bypass_all_unlocked and SMODS.config.achievements < 3) or (SMODS.config.achievements < 3 and (G.GAME.seeded or G.GAME.challenge)) then return true end G.E_MANAGER:add_event(Event({ no_delete = true, blockable = false, blocking = false, func = function() if G.STATE ~= G.STATES.HAND_PLAYED then - if G.PROFILES[G.SETTINGS.profile].all_unlocked and (G.ACHIEVEMENTS and G.ACHIEVEMENTS[achievement_name] and not G.ACHIEVEMENTS[achievement_name].bypass_all_unlocked and SMODS.config.achievements < 3) or (SMODS.config.achievements < 3 and (G.GAME.seeded or G.GAME.challenge)) then return end + if G.PROFILES[G.SETTINGS.profile].all_unlocked and (G.ACHIEVEMENTS and G.ACHIEVEMENTS[achievement_name] and not G.ACHIEVEMENTS[achievement_name].bypass_all_unlocked and SMODS.config.achievements < 3) or (SMODS.config.achievements < 3 and (G.GAME.seeded or G.GAME.challenge)) then return true end local achievement_set = false + if not G.ACHIEVEMENTS then fetch_achievements() end + G.SETTINGS.ACHIEVEMENTS_EARNED[achievement_name] = true + G:save_progress() + + if G.ACHIEVEMENTS[achievement_name] and G.ACHIEVEMENTS[achievement_name].mod then + if not G.ACHIEVEMENTS[achievement_name].earned then + --|THIS IS THE FIRST TIME THIS ACHIEVEMENT HAS BEEN EARNED + achievement_set = true + G.FILE_HANDLER.force = true + end + G.ACHIEVEMENTS[achievement_name].earned = true + end + + if achievement_set then + notify_alert(achievement_name) + return true + end if G.F_NO_ACHIEVEMENTS and not (G.ACHIEVEMENTS[achievement_name] or {}).mod then return true end --|LOCAL SETTINGS FILE @@ -2092,7 +2162,7 @@ function create_unlock_overlay(key) end function discover_card(card) - if not SMODS.seeded_unlocks and (G.GAME.seeded or G.GAME.challenge) then return end + if not SMODS.config.seeded_unlocks and (G.GAME.seeded or G.GAME.challenge) then return end card = card or {} if card.discovered or card.wip then return end if card and not card.discovered then @@ -2186,18 +2256,19 @@ function get_current_pool(_type, _rarity, _legendary, _append) if _type == 'Joker' then _rarity = (_legendary and 4) or (type(_rarity) == "number" and ((_rarity > 0.95 and 3) or (_rarity > 0.7 and 2) or 1)) or _rarity +_rarity = ({Common = 1, Uncommon = 2, Rare = 3, Legendary = 4})[_rarity] or _rarity local rarity = _rarity or SMODS.poll_rarity("Joker", 'rarity'..G.GAME.round_resets.ante..(_append or '')) _starting_pool, _pool_key = G.P_JOKER_RARITY_POOLS[rarity], 'Joker'..rarity..((not _legendary and _append) or '') elseif SMODS.ObjectTypes[_type] and SMODS.ObjectTypes[_type].rarities then - local rarities = SMODS.ObjectTypes[_type].rarities - local rarity - if _legendary and rarities.legendary then - rarity = rarities.legendary.key - else - rarity = _rarity or SMODS.poll_rarity(_type, 'rarity_'.._type..G.GAME.round_resets.ante..(_append or '')) - end - _starting_pool, _pool_key = SMODS.ObjectTypes[_type].rarity_pools[rarity], _type..rarity..(_append or '') + local rarities = SMODS.ObjectTypes[_type].rarities + local rarity + if _legendary and rarities.legendary then + rarity = rarities.legendary.key + else + rarity = _rarity or SMODS.poll_rarity(_type, 'rarity_'.._type..G.GAME.round_resets.ante..(_append or '')) + end + _starting_pool, _pool_key = SMODS.ObjectTypes[_type].rarity_pools[rarity], _type..rarity..(_append or '') else _starting_pool, _pool_key = G.P_CENTER_POOLS[_type], _type..(_append or '') end @@ -2206,7 +2277,7 @@ local rarity = _rarity or SMODS.poll_rarity("Joker", 'rarity'..G.GAME.round_rese local add = nil local in_pool, pool_opts if v.in_pool and type(v.in_pool) == 'function' then - in_pool, pool_opts = v:in_pool({ source = _append }) + in_pool, pool_opts = v:in_pool({ source = _append }) end pool_opts = pool_opts or {} if _type == 'Enhanced' then @@ -2271,7 +2342,7 @@ local rarity = _rarity or SMODS.poll_rarity("Joker", 'rarity'..G.GAME.round_rese elseif v.enhancement_gate then add = nil for kk, vv in pairs(G.playing_cards) do - if vv.config.center.key == v.enhancement_gate then + if SMODS.has_enhancement(vv, v.enhancement_gate) then add = true end end @@ -2287,7 +2358,7 @@ local rarity = _rarity or SMODS.poll_rarity("Joker", 'rarity'..G.GAME.round_rese if v.yes_pool_flag and not G.GAME.pool_flags[v.yes_pool_flag] then add = nil end if v.in_pool and type(v.in_pool) == 'function' then - add = in_pool and (add or pool_opts.override_base_checks) + add = in_pool and (add or pool_opts.override_base_checks) end if add and not G.GAME.banned_keys[v.key] then _pool[#_pool + 1] = v.key @@ -2308,7 +2379,7 @@ local rarity = _rarity or SMODS.poll_rarity("Joker", 'rarity'..G.GAME.round_rese if _pool_size == 0 then _pool = EMPTY(G.ARGS.TEMP_POOL) if SMODS.ObjectTypes[_type] and SMODS.ObjectTypes[_type].default and G.P_CENTERS[SMODS.ObjectTypes[_type].default] then - _pool[#_pool+1] = SMODS.ObjectTypes[_type].default + _pool[#_pool+1] = SMODS.ObjectTypes[_type].default elseif _type == 'Tarot' or _type == 'Tarot_Planet' then _pool[#_pool + 1] = "c_strength" elseif _type == 'Planet' then _pool[#_pool + 1] = "c_pluto" elseif _type == 'Spectral' then _pool[#_pool + 1] = "c_incantation" @@ -2358,13 +2429,13 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable --should pool be skipped with a forced key if not forced_key and soulable and (not G.GAME.banned_keys['c_soul']) then - for _, v in ipairs(SMODS.Consumable.legendaries) do - if (_type == v.type.key or _type == v.soul_set) and not (G.GAME.used_jokers[v.key] and not next(find_joker("Showman")) and not v.can_repeat_soul) and (not v.in_pool or (type(v.in_pool) ~= "function") or v:in_pool()) then - if pseudorandom('soul_'..v.key.._type..G.GAME.round_resets.ante) > (1 - v.soul_rate) then - forced_key = v.key - end - end - end + for _, v in ipairs(SMODS.Consumable.legendaries) do + if (_type == v.type.key or _type == v.soul_set) and not (G.GAME.used_jokers[v.key] and not next(find_joker("Showman")) and not v.can_repeat_soul) and (not v.in_pool or (type(v.in_pool) ~= "function") or v:in_pool()) then + if pseudorandom('soul_'..v.key.._type..G.GAME.round_resets.ante) > (1 - v.soul_rate) then + forced_key = v.key + end + end + end if (_type == 'Tarot' or _type == 'Spectral' or _type == 'Tarot_Planet') and not (G.GAME.used_jokers['c_soul'] and not next(find_joker("Showman"))) then if pseudorandom('soul_'.._type..G.GAME.round_resets.ante) > 0.997 then @@ -2436,10 +2507,10 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable card:set_edition(edition) check_for_unlock({type = 'have_edition'}) end - end for i = 1, #G.jokers.cards do G.jokers.cards[i]:calculate_joker({cry_creating_card = true, card = card}) end + end return card end @@ -2463,6 +2534,15 @@ function copy_card(other, new_card, card_scale, playing_card, strip_edition) end check_for_unlock({type = 'have_edition'}) new_card:set_seal(other.seal, true) + if other.seal then + for k, v in pairs(other.ability.seal or {}) do + if type(v) == 'table' then + new_card.ability.seal[k] = copy_table(v) + else + new_card.ability.seal[k] = v + end + end + end if other.params then new_card.params = other.params new_card.params.playing_card = playing_card @@ -2566,7 +2646,7 @@ function reset_idol_card() local valid_idol_cards = {} for k, v in ipairs(G.playing_cards) do if v.ability.effect ~= 'Stone Card' then - if (not v.config.center.no_suit) and (not v.config.center.no_rank) then + if not SMODS.has_no_suit(v) and not SMODS.has_no_rank(v) then valid_idol_cards[#valid_idol_cards+1] = v end end @@ -2584,7 +2664,7 @@ function reset_mail_rank() local valid_mail_cards = {} for k, v in ipairs(G.playing_cards) do if v.ability.effect ~= 'Stone Card' then - if not v.config.center.no_rank then + if not SMODS.has_no_rank(v) then valid_mail_cards[#valid_mail_cards+1] = v end end @@ -2610,7 +2690,7 @@ function reset_castle_card() local valid_castle_cards = {} for k, v in ipairs(G.playing_cards) do if v.ability.effect ~= 'Stone Card' then - if not v.config.center.no_suit then + if not SMODS.has_no_suit(v) then valid_castle_cards[#valid_castle_cards+1] = v end end @@ -2657,16 +2737,16 @@ function get_new_boss() if not v.boss then elseif v.in_pool and type(v.in_pool) == 'function' then - local res, options = v:in_pool() - if - ( - ((G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2) == - (v.boss.showdown or false) - ) or - (options or {}).ignore_showdown_check - then - eligible_bosses[k] = res and true or nil - end + local res, options = v:in_pool() + if + ( + ((G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2) == + (v.boss.showdown or false) + ) or + (options or {}).ignore_showdown_check + then + eligible_bosses[k] = res and true or nil + end elseif not v.boss.showdown and (v.boss.min <= math.max(1, G.GAME.round_resets.ante) and ((math.max(1, G.GAME.round_resets.ante))%G.GAME.win_ante ~= 0 or G.GAME.round_resets.ante < 2)) then eligible_bosses[k] = true elseif v.boss.showdown and (((G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2) or G.GAME.modifiers.cry_big_showdown ) then @@ -2712,12 +2792,11 @@ function get_type_colour(_c, card) end function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end, card) - if _c.specific_vars then specific_vars = _c.specific_vars end if card == nil and card_type then card = SMODS.compat_0_9_8.generate_UIBox_ability_table_card end -if _c.specific_vars then specific_vars = _c.specific_vars end + if _c.specific_vars then specific_vars = _c.specific_vars end local first_pass = nil if not full_UI_table then first_pass = true @@ -2757,7 +2836,7 @@ if _c.specific_vars then specific_vars = _c.specific_vars end else if not _c.generate_ui or type(_c.generate_ui) ~= 'function' then - full_UI_table.name = localize{type = 'name', set = _c.set, key = _c.key, nodes = full_UI_table.name} + full_UI_table.name = localize{type = 'name', set = _c.set, key = _c.key, nodes = full_UI_table.name} end end full_UI_table.card_type = card_type or _c.set @@ -2768,6 +2847,15 @@ if _c.specific_vars then specific_vars = _c.specific_vars end desc_nodes[#desc_nodes+1] = main_start end + local cfg = (card and card.ability) or _c['config'] + if cfg and G.GAME.modifiers.cry_consumable_reduce and cfg.max_highlighted and (cfg.max_highlighted > 1) then + local new_table = {} + for i0, j0 in pairs(cfg) do + new_table[i0] = j0 + end + new_table.max_highlighted = new_table.max_highlighted - 1 + cfg = new_table + end if _c.name == 'cry-membershipcard' or _c.name == 'cry-membershipcardtwo' then if not Cryptid.enabled["HTTPS Module"] then if G.localization.descriptions.Other.cry_https_disabled then @@ -2798,7 +2886,6 @@ if _c.specific_vars then specific_vars = _c.specific_vars end end end end - local cfg = (card and card.ability) or _c['config'] if _c.set == 'Other' then localize{type = 'other', key = _c.key, nodes = desc_nodes, vars = specific_vars or _c.vars} elseif card_type == 'Locked' then @@ -2806,11 +2893,15 @@ if _c.specific_vars then specific_vars = _c.specific_vars end elseif _c.demo and specific_vars then localize{type = 'other', key = 'demo_shop_locked', nodes = desc_nodes, vars = loc_vars} elseif _c.demo then localize{type = 'other', key = 'demo_locked', nodes = desc_nodes, vars = loc_vars} else + local res = {} if _c.locked_loc_vars and type(_c.locked_loc_vars) == 'function' then - local res = _c:locked_loc_vars(info_queue) or {} - loc_vars = res.vars or {} - specific_vars = specific_vars or {} - specific_vars.not_hidden = res.not_hidden or specific_vars.not_hidden + local _card = _c.create_fake_card and _c:create_fake_card() + res = _c:locked_loc_vars(info_queue, _card) or {} + loc_vars = res.vars or {} + specific_vars = specific_vars or {} + specific_vars.not_hidden = res.not_hidden or specific_vars.not_hidden + if res.main_start then desc_nodes[#desc_nodes+1] = res.main_start end + main_end = res.main_end or main_end elseif _c.name == 'Golden Ticket' then elseif _c.name == 'Mr. Bones' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_losses} elseif _c.name == 'Acrobat' then loc_vars = {_c.unlock_condition.extra, G.PROFILES[G.SETTINGS.profile].career_stats.c_hands_played} @@ -2871,21 +2962,31 @@ if _c.specific_vars then specific_vars = _c.specific_vars end end if _c.rarity and _c.rarity == 4 and specific_vars and not specific_vars.not_hidden then - localize{type = 'unlocks', key = 'joker_locked_legendary', set = 'Other', nodes = desc_nodes, vars = loc_vars} + localize{type = 'unlocks', key = res.key or 'joker_locked_legendary', set = res.set or 'Other', nodes = desc_nodes, vars = loc_vars, text_colour = res.text_colour, scale = res.scale} else - localize{type = 'unlocks', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + localize{type = 'unlocks', key = res.key or _c.key, set = res.set or _c.set, nodes = desc_nodes, vars = loc_vars, text_colour = res.text_colour, scale = res.scale} end end elseif hide_desc then localize{type = 'other', key = 'undiscovered_'..(string.lower(_c.set)), set = _c.set, nodes = desc_nodes} elseif _c.generate_ui and type(_c.generate_ui) == 'function' then - _c:generate_ui(info_queue, card, desc_nodes, specific_vars, full_UI_table) - if specific_vars and specific_vars.pinned then info_queue[#info_queue+1] = {key = 'pinned_left', set = 'Other'} end + _c:generate_ui(info_queue, card, desc_nodes, specific_vars, full_UI_table) + if specific_vars and specific_vars.pinned then info_queue[#info_queue+1] = {key = 'pinned_left', set = 'Other'} end if specific_vars and specific_vars.sticker then info_queue[#info_queue+1] = {key = string.lower(specific_vars.sticker)..'_sticker', set = 'Other'} end elseif specific_vars and specific_vars.debuffed then localize{type = 'other', key = 'debuffed_'..(specific_vars.playing_card and 'playing_card' or 'default'), nodes = desc_nodes} elseif _c.set == 'Joker' then + if not card then + local ability = copy_table(cfg) + ability.set = 'Joker' + ability.name = _c.name + local ret = {Card.generate_UIBox_ability_table({ ability = ability, config = { center = _c }, bypass_lock = true}, true)} + specific_vars = ret[1] + if ret[2] then desc_nodes[#desc_nodes+1] = ret[2] end + main_end = ret[3] + end + if _c.name == 'Stone Joker' or _c.name == 'Marble Joker' then info_queue[#info_queue+1] = G.P_CENTERS.m_stone elseif _c.name == 'Steel Joker' then info_queue[#info_queue+1] = G.P_CENTERS.m_steel elseif _c.name == 'Glass Joker' then info_queue[#info_queue+1] = G.P_CENTERS.m_glass @@ -2910,6 +3011,7 @@ if _c.specific_vars then specific_vars = _c.specific_vars end if specific_vars and specific_vars.sticker then info_queue[#info_queue+1] = {key = string.lower(specific_vars.sticker)..'_sticker', set = 'Other'} end localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = specific_vars or {}} elseif _c.set == 'Tag' then + specific_vars = specific_vars or Tag.get_uibox_table({ name = _c.name, config = _c.config, ability = { orbital_hand = '['..localize('k_poker_hand')..']' }}, nil, true) if _c.name == 'Negative Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_negative elseif _c.name == 'Foil Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_foil elseif _c.name == 'Holographic Tag' then info_queue[#info_queue+1] = G.P_CENTERS.e_holo @@ -2922,7 +3024,7 @@ if _c.specific_vars then specific_vars = _c.specific_vars end end localize{type = 'descriptions', key = _c.key, set = 'Tag', nodes = desc_nodes, vars = specific_vars or {}} elseif _c.set == 'Voucher' then - if _c.name == "Overstock" or _c.name == "Overstock Plus" then loc_vars = {cfg.extra} + if _c.name == "Overstock" or _c.name == "Overstock Plus" then loc_vars = {_c.config.extra} elseif _c.name == "Tarot Merchant" or _c.name == "Tarot Tycoon" then loc_vars = {cfg.extra_disp} elseif _c.name == "Planet Merchant" or _c.name == "Planet Tycoon" then loc_vars = {cfg.extra_disp} elseif _c.name == "Hone" or _c.name == "Glow Up" then loc_vars = {cfg.extra} @@ -2930,18 +3032,17 @@ if _c.specific_vars then specific_vars = _c.specific_vars end elseif _c.name == "Grabber" or _c.name == "Nacho Tong" then loc_vars = {cfg.extra} elseif _c.name == "Wasteful" or _c.name == "Recyclomancy" then loc_vars = {cfg.extra} elseif _c.name == "Seed Money" or _c.name == "Money Tree" then loc_vars = {cfg.extra/5} - elseif _c.name == "Blank" or _c.name == "Antimatter" then loc_vars = {cfg.extra} + elseif _c.name == "Blank" or _c.name == "Antimatter" then loc_vars = {_c.config.extra} elseif _c.name == "Hieroglyph" or _c.name == "Petroglyph" then loc_vars = {cfg.extra} elseif _c.name == "Director's Cut" or _c.name == "Retcon" then loc_vars = {cfg.extra} elseif _c.name == "Paint Brush" or _c.name == "Palette" then loc_vars = {cfg.extra} elseif _c.name == "Telescope" or _c.name == "Observatory" then loc_vars = {cfg.extra} elseif _c.name == "Clearance Sale" or _c.name == "Liquidation" then loc_vars = {cfg.extra} - elseif _c.name == "Crystal Ball" or _c.name == "Omen Globe" then loc_vars = {cfg.extra} end - localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = _c.vars or loc_vars} elseif _c.set == 'Edition' then loc_vars = {cfg.extra} - localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = _c.vars or loc_vars} elseif _c.set == 'Default' and specific_vars then if specific_vars.nominal_chips then localize{type = 'other', key = 'card_chips', nodes = desc_nodes, vars = {specific_vars.nominal_chips}} @@ -2961,7 +3062,7 @@ if _c.specific_vars then specific_vars = _c.specific_vars end elseif _c.effect == 'Gold Card' then loc_vars = {cfg.h_dollars} elseif _c.effect == 'Lucky Card' then loc_vars = {G.GAME.probabilities.normal, cfg.mult, 5, cfg.p_dollars, 15} end - localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = _c.vars or loc_vars} if _c.name ~= 'Stone Card' and ((specific_vars and specific_vars.bonus_chips) or (cfg.bonus ~= 0 and cfg.bonus)) then localize{type = 'other', key = 'card_extra_chips', nodes = desc_nodes, vars = {((specific_vars and specific_vars.bonus_chips) or cfg.bonus)}} end @@ -2988,16 +3089,16 @@ if _c.specific_vars then specific_vars = _c.specific_vars end localize{type = 'other', key = desc_override, nodes = desc_nodes, vars = loc_vars} elseif _c.set == 'Spectral' then if _c.name == 'Talisman' or _c.name == 'Medium' or _c.name == 'Trance' or _c.name == 'Deja Vu' then - loc_vars = {cfg.max_highlighted} + loc_vars = {_c.config.max_highlighted} end if _c.name == 'Familiar' or _c.name == 'Grim' or _c.name == 'Incantation' then loc_vars = {cfg.extra} elseif _c.name == 'Immolate' then loc_vars = {cfg.extra.destroy, cfg.extra.dollars} elseif _c.name == 'Hex' then info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome - elseif _c.name == 'Talisman' then info_queue[#info_queue+1] = {key = 'gold_seal', set = 'Other'} - elseif _c.name == 'Deja Vu' then info_queue[#info_queue+1] = {key = 'red_seal', set = 'Other'} - elseif _c.name == 'Trance' then info_queue[#info_queue+1] = {key = 'blue_seal', set = 'Other'} - elseif _c.name == 'Medium' then info_queue[#info_queue+1] = {key = 'purple_seal', set = 'Other'} + elseif _c.name == 'Talisman' then info_queue[#info_queue+1] = G.P_SEALS['gold_seal'] or G.P_SEALS[SMODS.Seal.badge_to_key['gold_seal'] or ''] + elseif _c.name == 'Deja Vu' then info_queue[#info_queue+1] = G.P_SEALS['red_seal'] or G.P_SEALS[SMODS.Seal.badge_to_key['red_seal'] or ''] + elseif _c.name == 'Trance' then info_queue[#info_queue+1] = G.P_SEALS['blue_seal'] or G.P_SEALS[SMODS.Seal.badge_to_key['blue_seal'] or ''] + elseif _c.name == 'Medium' then info_queue[#info_queue+1] = G.P_SEALS['purple_seal'] or G.P_SEALS[SMODS.Seal.badge_to_key['purple_seal'] or ''] elseif _c.name == 'Ankh' then if G.jokers and G.jokers.cards then for k, v in ipairs(G.jokers.cards) do @@ -3010,7 +3111,7 @@ if _c.specific_vars then specific_vars = _c.specific_vars end end end end - elseif _c.name == 'Cryptid' then loc_vars = {cfg.extra, cfg.max_highlighted} + elseif _c.name == 'Cryptid' then loc_vars = {cfg.extra} end if _c.name == 'Ectoplasm' then info_queue[#info_queue+1] = G.P_CENTERS.e_negative; loc_vars = {G.GAME.ecto_minus or 1} end if _c.name == 'Aura' then @@ -3018,13 +3119,13 @@ if _c.specific_vars then specific_vars = _c.specific_vars end info_queue[#info_queue+1] = G.P_CENTERS.e_holo info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome end - localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = _c.vars or loc_vars} 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)])} } - localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = _c.vars or loc_vars} elseif _c.set == 'Tarot' then if _c.name == "The Fool" then local fool_c = G.GAME.last_tarot_planet and G.P_CENTERS[G.GAME.last_tarot_planet] or nil @@ -3072,7 +3173,7 @@ if _c.specific_vars then specific_vars = _c.specific_vars end elseif _c.name == "Judgement" then elseif _c.name == "The World" then loc_vars = {cfg.max_highlighted, localize(cfg.suit_conv, 'suits_plural'), colours = {G.C.SUITS[cfg.suit_conv]}} end - localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars} + localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = _c.vars or loc_vars} end if main_end then @@ -3080,18 +3181,18 @@ if _c.specific_vars then specific_vars = _c.specific_vars end end if card_type == 'Default' or card_type == 'Enhanced' and not _c.replace_base_card and card and card.base then - if not _c.no_suit then - local suit = SMODS.Suits[card.base.suit] or {} - if suit.loc_vars and type(suit.loc_vars) == 'function' then - suit:loc_vars(info_queue, card) - end - end - if not _c.no_rank then - local rank = SMODS.Ranks[card.base.value] or {} - if rank.loc_vars and type(rank.loc_vars) == 'function' then - rank:loc_vars(info_queue, card) - end - end + if not _c.no_suit then + local suit = SMODS.Suits[card.base.suit] or {} + if suit.loc_vars and type(suit.loc_vars) == 'function' then + suit:loc_vars(info_queue, card) + end + end + if not _c.no_rank then + local rank = SMODS.Ranks[card.base.value] or {} + if rank.loc_vars and type(rank.loc_vars) == 'function' then + rank:loc_vars(info_queue, card) + end + end end --Fill all remaining info if this is the main desc @@ -3114,25 +3215,23 @@ if _c.specific_vars then specific_vars = _c.specific_vars end info_queue[#info_queue + 1] = G.P_CENTERS[v] end if G.P_CENTERS['e_'..v] and G.P_CENTERS['e_'..v].set == 'Edition' then - info_queue[#info_queue + 1] = G.P_CENTERS['e_'..v] + local t = {key = 'e_'..v, set = 'Edition', config = {}} + info_queue[#info_queue + 1] = t + if G.P_CENTERS['e_'..v].loc_vars and type(G.P_CENTERS['e_'..v].loc_vars) == 'function' then + local res = G.P_CENTERS['e_'..v]:loc_vars(info_queue, card) or {} + t.vars = res.vars + t.key = res.key or t.key + t.set = res.set or t.set + end end - if v == 'cry_pinned_booster' then info_queue[#info_queue+1] = {key = 'cry_pinned_booster', set = 'Other'} end - if v == 'cry_pinned_voucher' then info_queue[#info_queue+1] = {key = 'cry_pinned_voucher', set = 'Other'} end - if v == 'cry_pinned_consumeable' then info_queue[#info_queue+1] = {key = 'cry_pinned_consumeable', set = 'Other'} end - local seal = SMODS.Seals[v] or SMODS.Seal.badge_to_key[v] and SMODS.Seals[SMODS.Seal.badge_to_key[v]] - if seal and seal.generate_ui ~= 0 then - local t = { key = v, set = 'Other' } - info_queue[#info_queue+1] = t - if seal.loc_vars and type(seal.loc_vars) == 'function' then - local res = seal:loc_vars(info_queue, card) or {} - t.vars = res.vars - t.key = res.key or t.key - end + local seal = G.P_SEALS[v] or G.P_SEALS[SMODS.Seal.badge_to_key[v] or ''] + if seal then + info_queue[#info_queue+1] = seal else - if v == 'gold_seal' then info_queue[#info_queue+1] = {key = 'gold_seal', set = 'Other'} end - if v == 'blue_seal' then info_queue[#info_queue+1] = {key = 'blue_seal', set = 'Other'} end - if v == 'red_seal' then info_queue[#info_queue+1] = {key = 'red_seal', set = 'Other'} end - if v == 'purple_seal' then info_queue[#info_queue+1] = {key = 'purple_seal', set = 'Other'} end + if v == 'gold_seal' then info_queue[#info_queue+1] = G.P_SEALS['gold_seal'] or G.P_SEALS[SMODS.Seal.badge_to_key['gold_seal'] or ''] end + if v == 'blue_seal' then info_queue[#info_queue+1] = G.P_SEALS['blue_seal'] or G.P_SEALS[SMODS.Seal.badge_to_key['blue_seal'] or ''] end + if v == 'red_seal' then info_queue[#info_queue+1] = G.P_SEALS['red_seal'] or G.P_SEALS[SMODS.Seal.badge_to_key['red_seal'] or ''] end + if v == 'purple_seal' then info_queue[#info_queue+1] = G.P_SEALS['purple_seal'] or G.P_SEALS[SMODS.Seal.badge_to_key['purple_seal'] or ''] end end local sticker = SMODS.Stickers[v] if sticker then @@ -3142,6 +3241,7 @@ if _c.specific_vars then specific_vars = _c.specific_vars end res = sticker:loc_vars(info_queue, card) or {} t.vars = res.vars or {} t.key = res.key or t.key + t.set = res.set or t.set end info_queue[#info_queue+1] = t else diff --git a/lovely/dump/functions/misc_functions.lua b/lovely/dump/functions/misc_functions.lua index 287df59..d4bb369 100644 --- a/lovely/dump/functions/misc_functions.lua +++ b/lovely/dump/functions/misc_functions.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = '3b2e5120d569763446e3bfe099ac89fa7ef4750a6936e9b65da90e4121f5aa22' +LOVELY_INTEGRITY = '7af2e0e0690a3e982bc378e0f2810cf02634e614841ab27a2036b576c0fdc825' --Updates all display information for all displays for a given screenmode. Returns the key for the resolution option cycle -- @@ -254,30 +254,30 @@ end function pseudorandom_element(_t, seed, args) -- TODO special cases for now - -- Preserves reverse nominal order for Suits, nominal+face_nominal order for Ranks - -- for vanilla RNG - if _t == SMODS.Suits then - _t = SMODS.Suit:obj_list(true) - end - if _t == SMODS.Ranks then - _t = SMODS.Rank:obj_list() - end + -- Preserves reverse nominal order for Suits, nominal+face_nominal order for Ranks + -- for vanilla RNG + if _t == SMODS.Suits then + _t = SMODS.Suit:obj_list(true) + end + if _t == SMODS.Ranks then + _t = SMODS.Rank:obj_list() + end if seed then math.randomseed(seed) end local keys = {} for k, v in pairs(_t) do local keep = true local in_pool_func = - args and args.in_pool - or type(v) == 'table' and type(v.in_pool) == 'function' and v.in_pool - or _t == G.P_CARDS and function(c) - --Handles special case for Erratic Deck - local initial_deck = args and args.starting_deck or false - - return not ( - type(SMODS.Ranks[c.value].in_pool) == 'function' and not SMODS.Ranks[c.value]:in_pool({initial_deck = initial_deck}) - or type(SMODS.Suits[c.suit].in_pool) == 'function' and not SMODS.Suits[c.suit]:in_pool({initial_deck = initial_deck}) - ) - end + args and args.in_pool + or type(v) == 'table' and type(v.in_pool) == 'function' and v.in_pool + or _t == G.P_CARDS and function(c) + --Handles special case for Erratic Deck + local initial_deck = args and args.starting_deck or false + + return not ( + type(SMODS.Ranks[c.value].in_pool) == 'function' and not SMODS.Ranks[c.value]:in_pool({initial_deck = initial_deck, suit = c.suit}) + or type(SMODS.Suits[c.suit].in_pool) == 'function' and not SMODS.Suits[c.suit]:in_pool({initial_deck = initial_deck, rank = c.value}) + ) + end if in_pool_func then keep = in_pool_func(v, args) end @@ -422,7 +422,7 @@ function evaluate_poker_hand(hand) } for _,v in ipairs(SMODS.PokerHand.obj_buffer) do - results[v] = {} + results[v] = {} end local parts = { _5 = get_X_same(5,hand), @@ -435,9 +435,9 @@ function evaluate_poker_hand(hand) } for _,_hand in pairs(SMODS.PokerHands) do - if _hand.atomic_part and type(_hand.atomic_part) == 'function' then - parts[_hand.key] = _hand.atomic_part(hand) - end + if _hand.atomic_part and type(_hand.atomic_part) == 'function' then + parts[_hand.key] = _hand.atomic_part(hand) + end end if next(parts._5) and next(parts._flush) then results["Flush Five"] = parts._5 @@ -555,25 +555,25 @@ function evaluate_poker_hand(hand) end for _,_hand in pairs(SMODS.PokerHands) do - if _hand.composite and type(_hand.composite) == 'function' then - local other_hands - results[_hand.key], other_hands = _hand.composite(parts) - results[_hand.key] = results[_hand.key] or {} - if other_hands and type(other_hands) == 'table' then - for k, v in pairs(other_hands) do - results[k] = v - end - end - else - results[_hand.key] = parts[_hand.key] - end + if _hand.composite and type(_hand.composite) == 'function' then + local other_hands + results[_hand.key], other_hands = _hand.composite(parts) + results[_hand.key] = results[_hand.key] or {} + if other_hands and type(other_hands) == 'table' then + for k, v in pairs(other_hands) do + results[k] = v + end + end + else + results[_hand.key] = parts[_hand.key] + end end results.top = nil for _, v in ipairs(G.handlist) do - if not results.top and results[v] then - results.top = results[v] - break - end + if not results.top and results[v] then + results.top = results[v] + break + end end return results end @@ -646,7 +646,7 @@ end function get_X_same(num, hand, or_more) local vals = {} for i = 1, SMODS.Rank.max_id.value do - vals[i] = {} + vals[i] = {} end for i=#hand, 1, -1 do local curr = {} @@ -833,25 +833,25 @@ function modulate_sound(dt) G.ARGS.push.overlay_menu = not (not G.OVERLAY_MENU) G.ARGS.push.ambient_control = G.SETTINGS.ambient_control if SMODS.remove_replace_sound and SMODS.remove_replace_sound ~= desired_track then - SMODS.Sound.replace_sounds[SMODS.remove_replace_sound] = nil - SMODS.remove_replace_sound = nil + SMODS.Sound.replace_sounds[SMODS.remove_replace_sound] = nil + SMODS.remove_replace_sound = nil end local replace_sound = SMODS.Sound.replace_sounds[desired_track] if replace_sound then - local replaced_track = desired_track - desired_track = replace_sound.key - G.ARGS.push.desired_track = desired_track - if SMODS.previous_track ~= desired_track then - if replace_sound.times > 0 then replace_sound.times = replace_sound.times - 1 end - if replace_sound.times == 0 then SMODS.remove_replace_sound = replaced_track end - end + local replaced_track = desired_track + desired_track = replace_sound.key + G.ARGS.push.desired_track = desired_track + if SMODS.previous_track ~= desired_track then + if replace_sound.times > 0 then replace_sound.times = replace_sound.times - 1 end + if replace_sound.times == 0 then SMODS.remove_replace_sound = replaced_track end + end end local stop_sound = SMODS.Sound.stop_sounds[desired_track] if SMODS.Sound.stop_sounds[desired_track] then - if SMODS.previous_track ~= '' and stop_sound > 0 then stop_sound = stop_sound - 1 end - SMODS.Sound.stop_sounds[desired_track] = stop_sound ~= 0 and stop_sound or nil - SMODS.previous_track = '' - return + if SMODS.previous_track ~= '' and stop_sound > 0 then stop_sound = stop_sound - 1 end + SMODS.Sound.stop_sounds[desired_track] = stop_sound ~= 0 and stop_sound or nil + SMODS.previous_track = '' + return end if G.F_SOUND_THREAD then @@ -863,11 +863,11 @@ function modulate_sound(dt) if (type(in_sync) == 'table' and not in_sync[SMODS.previous_track]) or in_sync == false then should_sync = false end if (type(out_sync) == 'table' and not out_sync[desired_track]) or out_sync == false then should_sync = false end if - SMODS.previous_track and SMODS.previous_track ~= desired_track and - not should_sync + SMODS.previous_track and SMODS.previous_track ~= desired_track and + not should_sync then - G.ARGS.push.type = 'restart_music' - G.SOUND_MANAGER.channel:push(G.ARGS.push) + G.ARGS.push.type = 'restart_music' + G.SOUND_MANAGER.channel:push(G.ARGS.push) end SMODS.previous_track = desired_track else @@ -1070,21 +1070,21 @@ function number_format(num, e_switch_point) local mantissa = round_number(x/(10^fac), 3) if mantissa >= 10 then - mantissa = mantissa / 10 - fac = fac + 1 + mantissa = mantissa / 10 + fac = fac + 1 end return sign..(string.format(fac >= 100 and "%.1fe%i" or fac >= 10 and "%.2fe%i" or "%.3fe%i", mantissa, fac)) end local formatted if num ~= math.floor(num) and num < 100 then - formatted = string.format(num >= 10 and "%.1f" or "%.2f", num) - if formatted:sub(-1) == "0" then - formatted = formatted:gsub("%.?0+$", "") - end - -- Return already to avoid comas being added - if num < 0.01 then return tostring(num) end + formatted = string.format(num >= 10 and "%.1f" or "%.2f", num) + if formatted:sub(-1) == "0" then + formatted = formatted:gsub("%.?0+$", "") + end + -- Return already to avoid comas being added + if num < 0.01 then return tostring(num) end else - formatted = string.format("%.0f", num) + formatted = string.format("%.0f", num) end return sign..(formatted:reverse():gsub("(%d%d%d)", "%1,"):gsub(",$", ""):reverse()) end @@ -1435,14 +1435,14 @@ function set_discover_tallies() total = {tally = 0, of = 0}, } for _, v in ipairs(SMODS.ConsumableType.ctype_buffer) do - G.DISCOVER_TALLIES[v:lower()..'s'] = {tally = 0, of = 0} + G.DISCOVER_TALLIES[v:lower()..'s'] = {tally = 0, of = 0} end for _, v in pairs(G.DISCOVER_TALLIES) do v.tally = 0 v.of = 0 end for _, v in pairs(G.P_CENTERS) do - if not v.omit then + if not v.omit and not v.no_collection then if v.set and ((v.set == 'Joker') or v.consumeable or (v.set == 'Edition') or (v.set == 'Voucher') or (v.set == 'Back') or (v.set == 'Booster')) then G.DISCOVER_TALLIES.total.of = G.DISCOVER_TALLIES.total.of+1 if v.discovered then @@ -1468,10 +1468,10 @@ function set_discover_tallies() end local tally = G.DISCOVER_TALLIES[v.set:lower()..'s'] if tally then - tally.of = tally.of + 1 - if v.discovered then - tally.tally = tally.tally + 1 - end + tally.of = tally.of + 1 + if v.discovered then + tally.tally = tally.tally + 1 + end end end if v.set and v.set == 'Voucher' then @@ -1495,6 +1495,8 @@ function set_discover_tallies() end end for _, v in pairs(G.P_BLINDS) do + if not v.no_collection then + G.DISCOVER_TALLIES.total.of = G.DISCOVER_TALLIES.total.of+1 G.DISCOVER_TALLIES.blinds.of = G.DISCOVER_TALLIES.blinds.of+1 if v.discovered then @@ -1502,7 +1504,11 @@ function set_discover_tallies() G.DISCOVER_TALLIES.total.tally = G.DISCOVER_TALLIES.total.tally+1 end end + end + for _, v in pairs(G.P_TAGS) do + if not v.no_collection then + G.DISCOVER_TALLIES.total.of = G.DISCOVER_TALLIES.total.of+1 G.DISCOVER_TALLIES.tags.of = G.DISCOVER_TALLIES.tags.of+1 if v.discovered then @@ -1510,6 +1516,8 @@ function set_discover_tallies() G.DISCOVER_TALLIES.total.tally = G.DISCOVER_TALLIES.total.tally+1 end end + end + G.PROFILES[G.SETTINGS.profile].high_scores.collection.amt = G.DISCOVER_TALLIES.total.tally G.PROFILES[G.SETTINGS.profile].high_scores.collection.tot = G.DISCOVER_TALLIES.total.of G.PROFILES[G.SETTINGS.profile].progress.discovered = copy_table(G.DISCOVER_TALLIES.total) @@ -1635,15 +1643,15 @@ function loc_colour(_c, _default) legendary = G.C.RARITY[4], enhanced = G.C.SECONDARY_SET.Enhanced } - for _, v in ipairs(SMODS.Rarity.obj_buffer) do - G.ARGS.LOC_COLOURS[v:lower()] = G.C.RARITY[v] - end - for _, v in ipairs(SMODS.ConsumableType.ctype_buffer) do - G.ARGS.LOC_COLOURS[v:lower()] = G.C.SECONDARY_SET[v] - end - for _, v in ipairs(SMODS.Suit.obj_buffer) do - G.ARGS.LOC_COLOURS[v:lower()] = G.C.SUITS[v] - end + for _, v in ipairs(SMODS.Rarity.obj_buffer) do + G.ARGS.LOC_COLOURS[v:lower()] = G.C.RARITY[v] + end + for _, v in ipairs(SMODS.ConsumableType.ctype_buffer) do + G.ARGS.LOC_COLOURS[v:lower()] = G.C.SECONDARY_SET[v] + end + for _, v in ipairs(SMODS.Suit.obj_buffer) do + G.ARGS.LOC_COLOURS[v:lower()] = G.C.SUITS[v] + end return G.ARGS.LOC_COLOURS[_c] or _default or G.C.UI.TEXT_DARK end @@ -1976,24 +1984,73 @@ end function get_front_spriteinfo(_front) if _front and _front.suit and G.SETTINGS.CUSTOM_DECK and G.SETTINGS.CUSTOM_DECK.Collabs then local collab = G.SETTINGS.CUSTOM_DECK.Collabs[_front.suit] - if collab and collab ~= 'default' then + if collab then local deckSkin = SMODS.DeckSkins[collab] if deckSkin then - local hasRank = false - for i = 1, #deckSkin.ranks do - if deckSkin.ranks[i] == _front.value then hasRank = true break end - end - if hasRank then - local atlas = G.ASSET_ATLAS[G.SETTINGS.colourblind_option and deckSkin.hc_atlas or deckSkin.lc_atlas] - if atlas then - if deckSkin.posStyle == 'collab' then - return atlas, G.COLLABS.pos[_front.value] - elseif deckSkin.posStyle == 'suit' then - return atlas, { x = _front.pos.x, y = 0} - elseif deckSkin.posStyle == 'deck' then - return atlas, _front.pos + if deckSkin.outdated then + local hasRank = false + for i = 1, #deckSkin.ranks do + if deckSkin.ranks[i] == _front.value then hasRank = true break end + end + if hasRank then + local atlas = G.ASSET_ATLAS[G.SETTINGS.colour_palettes[_front.suit] == 'hc' and deckSkin.hc_atlas or deckSkin.lc_atlas] + if atlas then + if deckSkin.pos_style == 'collab' then + return atlas, G.COLLABS.pos[_front.value] + elseif deckSkin.pos_style == 'suit' then + return atlas, { x = _front.pos.x, y = 0} + elseif deckSkin.pos_style == 'deck' then + return atlas, _front.pos + elseif deckSkin.pos_style == 'ranks' or nil then + for i, rank in ipairs(deckSkin.ranks) do + if rank == _front.value then + return atlas, { x = i - 1, y = 0} + end + end + end end end + return G.ASSET_ATLAS[G.SETTINGS.colour_palettes[_front.suit] == 'hc' and _front.hc_atlas or _front.lc_atlas or {}] or G.ASSET_ATLAS[_front.atlas] or G.ASSET_ATLAS["cards_"..(G.SETTINGS.colour_palettes[_front.suit] == 'hc' and 2 or 1)], _front.pos + else + local palette = deckSkin.palette_map and deckSkin.palette_map[G.SETTINGS.colour_palettes[_front.suit] or ''] or (deckSkin.palettes or {})[1] + local hasRank = false + for i = 1, #palette.ranks do + if palette.ranks[i] == _front.value then hasRank = true break end + end + if hasRank then + local atlas = G.ASSET_ATLAS[palette.atlas] + if type(palette.pos_style) == "table" then + if palette.pos_style[_front.value] then + if palette.pos_style[_front.value].atlas then + atlas = G.ASSET_ATLAS[palette.pos_style[_front.value].atlas] + end + if palette.pos_style[_front.value].pos then + return atlas, palette.pos_style[_front.value].pos + end + elseif palette.pos_style.fallback_style then + if palette.pos_style.fallback_style == 'collab' then + return atlas, G.COLLABS.pos[_front.value] + elseif palette.pos_style.fallback_style == 'suit' then + return atlas, { x = _front.pos.x, y = 0} + elseif palette.pos_style.fallback_style == 'deck' then + return atlas, _front.pos + end + end + elseif palette.pos_style == 'collab' then + return atlas, G.COLLABS.pos[_front.value] + elseif palette.pos_style == 'suit' then + return atlas, { x = _front.pos.x, y = 0} + elseif palette.pos_style == 'deck' then + return atlas, _front.pos + elseif palette.pos_style == 'ranks' or nil then + for i, rank in ipairs(palette.ranks) do + if rank == _front.value then + return atlas, { x = i - 1, y = 0} + end + end + end + end + return G.ASSET_ATLAS[palette.hc_default and _front.hc_atlas or _front.lc_atlas or {}] or G.ASSET_ATLAS[_front.atlas] or G.ASSET_ATLAS["cards_"..(palette.hc_default and 2 or 1)], _front.pos end end end diff --git a/lovely/dump/functions/state_events.lua b/lovely/dump/functions/state_events.lua index efe3b58..cbb1e7e 100644 --- a/lovely/dump/functions/state_events.lua +++ b/lovely/dump/functions/state_events.lua @@ -1,7 +1,7 @@ -LOVELY_INTEGRITY = 'b4654caa2a691eb71616565578a811b620a40e430e1f2ea8525b31ba25c1f8e1' +LOVELY_INTEGRITY = '4e744c84a896d13965c350778ddd9bc20dc5aeec8b4dd69951b460db6f5383cb' function win_game() - if not G.GAME.seeded and not G.GAME.challenge then + if (not G.GAME.seeded and not G.GAME.challenge) or SMODS.config.seeded_unlocks then set_joker_win() set_deck_win() @@ -70,7 +70,7 @@ function win_game() end) })) - if not G.GAME.seeded and not G.GAME.challenge then + if (not G.GAME.seeded and not G.GAME.challenge) or SMODS.config.seeded_unlocks then G.PROFILES[G.SETTINGS.profile].stake = math.max(G.PROFILES[G.SETTINGS.profile].stake or 1, (G.GAME.stake or 1)+1) end G:save_progress() @@ -103,24 +103,11 @@ G.GAME.cry_exploit_override = nil if to_big(G.GAME.chips) >= to_big(G.GAME.blind.chips) then game_over = false end - for i = 1, #G.playing_cards do - local CARD = G.playing_cards[i] - CARD.cry_debuff_immune = false - end - for i = 1, #G.jokers.cards do - local eval = nil - eval = G.jokers.cards[i]:calculate_joker({end_of_round = true, game_over = game_over, callback = function(card, eval) - if eval then - if eval.saved then - game_over = false - end - card_eval_status_text(card, 'jokers', nil, nil, nil, eval) - end - end}) - - G.jokers.cards[i]:calculate_rental() - G.jokers.cards[i]:calculate_perishable() - end + -- context.end_of_round calculations + SMODS.saved = false + SMODS.calculate_context({end_of_round = true, game_over = game_over }) + if SMODS.saved then game_over = false end + -- TARGET: main end_of_round evaluation if G.GAME.voucher_sticker_index then if G.GAME.voucher_sticker_index.perishable then for k, v in pairs(G.GAME.voucher_sticker_index.perishable) do @@ -290,91 +277,10 @@ G.GAME.cry_exploit_override = nil end) })) end - if scoring_hand then - local unscoring_hand = {} - for i = 1, #G.play.cards do - local is_scoring = false - for j = 1, #scoring_hand do - if G.play.cards[i] == scoring_hand[j] then - is_scoring = true - end - end - if not is_scoring then - unscoring_hand[#unscoring_hand+1] = G.play.cards[i] - end - end - for i = 1, #unscoring_hand do - unscoring_hand[i]:calculate_seal{unscoring = true} - end + for _,v in ipairs(SMODS.get_card_areas('playing_cards', 'end_of_round')) do + SMODS.calculate_end_of_round_effects({ cardarea = v, end_of_round = true }) end - for i=1, #G.hand.cards do - --Check for hand doubling - local reps = {1} - local j = 1 - while j <= #reps do - local percent = (i-0.999)/(#G.hand.cards-0.998) + (j-1)*0.1 - if reps[j] ~= 1 then card_eval_status_text((reps[j].jokers or reps[j].seals).card, 'jokers', nil, nil, nil, (reps[j].jokers or reps[j].seals)) end - - --calculate the hand effects - local effects = {G.hand.cards[i]:get_end_of_round_effect()} - G.hand.cards[i]:calculate_rental() - G.hand.cards[i]:calculate_perishable() - for k=1, #G.jokers.cards do - --calculate the joker individual card effects - local eval = G.jokers.cards[k]:calculate_joker({cardarea = G.hand, other_card = G.hand.cards[i], individual = true, end_of_round = true, callback = function(card, eval, retrigger) - if eval then - table.insert(effects, eval) -effects[#effects].from_retrigger = retrigger -end end, no_retrigger_anim = true}) - end - - if reps[j] == 1 then - --Check for hand doubling - --From Red seal - local eval = eval_card(G.hand.cards[i], {end_of_round = true,cardarea = G.hand, repetition = true, repetition_only = true}) - if next(eval) and (next(effects[1]) or #effects > 1) then - for h = 1, eval.seals.repetitions do - reps[#reps+1] = eval - end - end - - --from Jokers - for j=1, #G.jokers.cards do - --calculate the joker effects - local eval = eval_card(G.jokers.cards[j], {cardarea = G.hand, other_card = G.hand.cards[i], repetition = true, end_of_round = true, card_effects = effects, callback = function(card, ret) eval = {jokers = ret} - if next(eval) then - for h = 1, eval.jokers.repetitions do - reps[#reps+1] = eval - end - end end}) - end - end - - for ii = 1, #effects do - --if this effect came from a joker - if effects[ii].card and not Talisman.config_file.disable_anims then - G.E_MANAGER:add_event(Event({ - trigger = 'immediate', - func = (function() effects[ii].card:juice_up(0.7);return true end) - })) - end - - --If dollars - if effects[ii].h_dollars then - ease_dollars(effects[ii].h_dollars) - card_eval_status_text(G.hand.cards[i], 'dollars', effects[ii].h_dollars, percent) - end - - --Any extras - if effects[ii].extra then - card_eval_status_text(G.hand.cards[i], 'extra', nil, percent, nil, effects[ii].extra) - end - end - j = j + 1 - end - end - delay(0.3) local i = 1 @@ -560,13 +466,9 @@ function new_round() end G.GAME.current_round.semicolon = false - for i = 1, #G.playing_cards do - local CARD = G.playing_cards[i] - CARD.cry_debuff_immune = false - end - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({setting_blind = true, blind = G.GAME.round_resets.blind}) - end + SMODS.calculate_context({setting_blind = true, blind = G.GAME.round_resets.blind}) + + -- TARGET: setting_blind effects delay(0.4) G.E_MANAGER:add_event(Event({ @@ -604,9 +506,6 @@ G.FUNCS.draw_from_deck_to_hand = function(e) end hand_space = n end - if G.GAME.modifiers.cry_forced_draw_amount and (G.GAME.current_round.hands_played > 0 or G.GAME.current_round.discards_used > 0) then - hand_space = math.min(#G.deck.cards, G.GAME.modifiers.cry_forced_draw_amount) - end if G.GAME.blind.name == 'The Serpent' and not G.GAME.blind.disabled and (G.GAME.current_round.hands_played > 0 or @@ -638,36 +537,28 @@ G.FUNCS.discard_cards_from_highlighted = function(e, hook) update_hand_text({immediate = true, nopulse = true, delay = 0}, {mult = 0, chips = 0, level = '', handname = ''}) table.sort(G.hand.highlighted, function(a,b) return a.T.x < b.T.x end) inc_career_stat('c_cards_discarded', highlighted_count) - for i = 1, #G.hand.cards do - eval_card(G.hand.cards[i], {pre_discard = true, full_hand = G.hand.highlighted, hook = hook}) - end - for j = 1, #G.jokers.cards do - G.jokers.cards[j]:calculate_joker({pre_discard = true, full_hand = G.hand.highlighted, hook = hook}) - end + SMODS.calculate_context({pre_discard = true, full_hand = G.hand.highlighted, hook = hook}) + + -- TARGET: pre_discard local cards = {} local destroyed_cards = {} for i=1, highlighted_count do + G.hand.highlighted[i]:calculate_seal({discard = true}) local removed = false - local eval = nil - eval = eval_card(G.hand.highlighted[i], {discard = true, full_hand = G.hand.highlighted}) - if eval and eval.remove then - removed = true - card_eval_status_text(G.hand.highlighted[i], 'jokers', nil, 1, nil, eval) - end - for j = 1, #G.jokers.cards do - local eval = nil - eval = G.jokers.cards[j]:calculate_joker({discard = true, other_card = G.hand.highlighted[i], full_hand = G.hand.highlighted, callback = function(card, eval) - if eval then - if eval.remove then removed = true end - card_eval_status_text(card, 'jokers', nil, 1, nil, eval) + local effects = {} + SMODS.calculate_context({discard = true, other_card = G.hand.highlighted[i], full_hand = G.hand.highlighted}, effects) + SMODS.trigger_effects(effects) + for _, eval in pairs(effects) do + if type(eval) == 'table' then + for key, eval2 in pairs(eval) do + if key == 'remove' or (type(eval2) == 'table' and eval2.remove) then removed = true end + end end - end}) - end table.insert(cards, G.hand.highlighted[i]) if removed then destroyed_cards[#destroyed_cards + 1] = G.hand.highlighted[i] - if G.hand.highlighted[i].ability.name == 'Glass Card' then + if SMODS.has_enhancement(G.hand.highlighted[i], 'm_glass') then G.hand.highlighted[i]:shatter() else G.hand.highlighted[i]:start_dissolve() @@ -678,11 +569,12 @@ G.FUNCS.discard_cards_from_highlighted = function(e, hook) end end - if destroyed_cards[1] then - for j=1, #G.jokers.cards do - eval_card(G.jokers.cards[j], {cardarea = G.jokers, remove_playing_cards = true, removed = destroyed_cards}) - end + -- context.remove_playing_cards from discard + if destroyed_cards[1] then + SMODS.calculate_context({remove_playing_cards = true, removed = destroyed_cards}) end + + -- TARGET: effects after cards destroyed in discard G.GAME.round_scores.cards_discarded.amt = G.GAME.round_scores.cards_discarded.amt + #cards check_for_unlock({type = 'discard_custom', cards = cards}) @@ -842,7 +734,7 @@ G.FUNCS.evaluate_play = function(e) if next(find_joker('Splash')) then scoring_hand[i] = G.play.cards[i] else - if G.play.cards[i].ability.effect == 'Stone Card' or G.play.cards[i].config.center.always_scores then + if SMODS.always_scores(G.play.cards[i]) then local inside = false for j=1, #scoring_hand do if scoring_hand[j] == G.play.cards[i] then @@ -863,8 +755,8 @@ G.FUNCS.evaluate_play = function(e) highlight_card(scoring_hand[i],(i-0.999)/5,'up') end - local percent = 0.3 - local percent_delta = 0.08 + percent = 0.3 + percent_delta = 0.08 if G.GAME.current_round.current_hand.handname ~= disp_text then delay(0.3) end update_hand_text({sound = G.GAME.current_round.current_hand.handname ~= disp_text and 'button' or nil, volume = 0.4, immediate = true, nopulse = nil, @@ -884,18 +776,10 @@ G.FUNCS.evaluate_play = function(e) end local hand_text_set = false - for i=1, #G.jokers.cards do - --calculate the joker effects - local effects = eval_card(G.jokers.cards[i], {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, before = true, callback = function(card, ret) effects = {jokers = ret} - if effects.jokers then - card_eval_status_text(card, 'jokers', nil, percent, nil, effects.jokers) - percent = percent + percent_delta - if effects.jokers.level_up then - level_up_hand(card, text) - end - end - end}) - end + -- context.before calculations + SMODS.calculate_context({full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, before = true}) + + -- TARGET: effects before scoring starts mult = mod_mult(cry_ascend(G.GAME.hands[text].mult)) hand_chips = mod_chips(cry_ascend(G.GAME.hands[text].chips)) @@ -905,848 +789,95 @@ G.FUNCS.evaluate_play = function(e) mult, hand_chips, modded = G.GAME.blind:modify_hand(G.play.cards, poker_hands, text, mult, hand_chips) mult, hand_chips = mod_mult(mult), mod_chips(hand_chips) if modded then update_hand_text({sound = 'chips2', modded = modded}, {chips = hand_chips, mult = mult}) end - for i=1, #scoring_hand do - --add cards played to list - if scoring_hand[i].ability.effect ~= 'Stone Card' and not scoring_hand[i].config.center.no_rank then - G.GAME.cards_played[scoring_hand[i].base.value].total = G.GAME.cards_played[scoring_hand[i].base.value].total + 1 - if not scoring_hand[i].config.center.no_suit then - G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true - end - end - --if card is debuffed - if scoring_hand[i].debuff then - G.GAME.blind.triggered = true - G.E_MANAGER:add_event(Event({ - trigger = 'immediate', - func = (function() SMODS.juice_up_blind();return true end) - })) - card_eval_status_text(scoring_hand[i], 'debuff') - else - --Check for play doubling - local reps = {1} - - --From Red seal - local eval = eval_card(scoring_hand[i], {repetition_only = true,cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, repetition = true}) - if next(eval) then - for h = 1, eval.seals.repetitions do - reps[#reps+1] = eval - end - end - --From jokers - for j=1, #G.jokers.cards do - --calculate the joker effects - local eval = eval_card(G.jokers.cards[j], {cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = scoring_hand[i], repetition = true, callback = function(card, ret) eval = {jokers = ret} - if next(eval) and eval.jokers then - if not eval.jokers.repetitions then eval.jokers.repetitions = 0 end - for h = 1, eval.jokers.repetitions do - reps[#reps+1] = eval - end - end end}) - end - --From edition - if scoring_hand[i].edition and scoring_hand[i].edition.key then - local ed = SMODS.Centers[scoring_hand[i].edition.key] - if ed.config and ed.config.retriggers then - for h = 1, ed.config.retriggers do - reps[#reps+1] = {seals = { - message = localize("k_again_ex"), - card = scoring_hand[i] - }} - end - end - if ed.calculate and type(ed.calculate) == 'function' then - local check = ed:calculate(scoring_hand[i], {retrigger_edition_check = true, cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = scoring_hand[i], repetition = true}) - if check and type(check) == 'table' and next(check) then - for j = 1, check.repetitions do - reps[#reps+1] = {seals = check} - end - end - end - end - for j=1,#reps do - percent = percent + percent_delta - if reps[j] ~= 1 and (not scoring_hand or not scoring_hand[i] or not scoring_hand[i].will_shatter) then - card_eval_status_text((reps[j].jokers or reps[j].seals).card, 'jokers', nil, nil, nil, (reps[j].jokers or reps[j].seals)) - end - - --calculate the hand effects - local effects = {eval_card(scoring_hand[i], {cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, poker_hand = text})} - for k=1, #G.jokers.cards do - --calculate the joker individual card effects - local eval = G.jokers.cards[k]:calculate_joker({cardarea = G.play, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = scoring_hand[i], individual = true, callback = function(card, eval, retrigger) - if eval then - table.insert(effects, eval) -effects[#effects].from_retrigger = retrigger -end end, no_retrigger_anim = true}) - - end - scoring_hand[i].lucky_trigger = nil - - for ii = 1, #effects do - --If chips added, do chip add event and add the chips to the total - if effects[ii].chips then - if effects[ii].card then juice_card(effects[ii].card) end - hand_chips = mod_chips(hand_chips + effects[ii].chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(scoring_hand[i], 'chips', effects[ii].chips, percent) - end - - --If mult added, do mult add event and add the mult to the total - if effects[ii].mult then - if effects[ii].card then juice_card(effects[ii].card) end - mult = mod_mult(mult + effects[ii].mult) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(scoring_hand[i], 'mult', effects[ii].mult, percent) - end - - --If play dollars added, add dollars to total - if effects[ii].p_dollars then - if effects[ii].card then juice_card(effects[ii].card) end - ease_dollars(effects[ii].p_dollars) - card_eval_status_text(scoring_hand[i], 'dollars', effects[ii].p_dollars, percent) - end - - --If dollars added, add dollars to total - if effects[ii].dollars then - if effects[ii].card then juice_card(effects[ii].card) end - ease_dollars(effects[ii].dollars) - card_eval_status_text(scoring_hand[i], 'dollars', effects[ii].dollars, percent) - end - - --Any extra effects - if effects[ii].extra then - if effects[ii].card then juice_card(effects[ii].card) end - local extras = {mult = false, hand_chips = false} - if effects[ii].extra.mult_mod then mult =mod_mult( mult + effects[ii].extra.mult_mod);extras.mult = true end - if effects[ii].extra.chip_mod then hand_chips = mod_chips(hand_chips + effects[ii].extra.chip_mod);extras.hand_chips = true end - if effects[ii].extra.swap then - local old_mult = mult - mult = mod_mult(hand_chips) - hand_chips = mod_chips(old_mult) - extras.hand_chips = true; extras.mult = true - end - if effects[ii].extra.func then effects[ii].extra.func() end - update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult}) - card_eval_status_text(scoring_hand[i], 'extra', nil, percent, nil, effects[ii].extra) - end - - if effects[ii].seals then - if effects[ii].seals.chips then - if effects[ii].card then juice_card(effects[ii].card) end - hand_chips = mod_chips(hand_chips + effects[ii].seals.chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(scoring_hand[i], 'chips', effects[ii].seals.chips, percent) - end - - if effects[ii].seals.mult then - if effects[ii].card then juice_card(effects[ii].card) end - mult = mod_mult(mult + effects[ii].seals.mult) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(scoring_hand[i], 'mult', effects[ii].seals.mult, percent) - end - - if effects[ii].seals.p_dollars then - if effects[ii].card then juice_card(effects[ii].card) end - ease_dollars(effects[ii].seals.p_dollars) - card_eval_status_text(scoring_hand[i], 'dollars', effects[ii].seals.p_dollars, percent) - end - - if effects[ii].seals.dollars then - if effects[ii].card then juice_card(effects[ii].card) end - ease_dollars(effects[ii].seals.dollars) - card_eval_status_text(scoring_hand[i], 'dollars', effects[ii].seals.dollars, percent) - end - - if effects[ii].seals.x_mult then - if effects[ii].card then juice_card(effects[ii].card) end - mult = mod_mult(mult*effects[ii].seals.x_mult) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(scoring_hand[i], 'x_mult', effects[ii].seals.x_mult, percent) - end - - if effects[ii].seals.func then - effects[ii].seals.func() - end - end - - --If x_mult added, do mult add event and mult the mult to the total - if effects[ii].x_mult then - if effects[ii].card then juice_card(effects[ii].card) end - mult = mod_mult(mult*effects[ii].x_mult) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(scoring_hand[i], 'x_mult', effects[ii].x_mult, percent) - if next(find_joker("cry-Exponentia")) then - for _, v in pairs(find_joker("cry-Exponentia")) do - local old = v.ability.extra.Emult - v.ability.extra.Emult = v.ability.extra.Emult + v.ability.extra.Emult_mod - card_eval_status_text(v, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_powmult',vars={number_format(to_big(v.ability.extra.Emult))}}}) - exponentia_scale_mod(v, v.ability.extra.Emult_mod, old, v.ability.extra.Emult) - end - end - end - - if effects[ii].x_chips then - mod_percent = true - if effects[ii].card then juice_card(effects[ii].card) end - hand_chips = mod_chips(hand_chips*effects[ii].x_chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(scoring_hand[i], 'x_chips', effects[ii].x_chips, percent) - end - if effects[ii].e_chips then - mod_percent = true - if effects[ii].card then juice_card(effects[ii].card) end - hand_chips = mod_chips(hand_chips^effects[ii].e_chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(scoring_hand[i], 'e_chips', effects[ii].e_chips, percent) - end - if effects[ii].ee_chips then - mod_percent = true - if effects[ii].card then juice_card(effects[ii].card) end - hand_chips = mod_chips(hand_chips:arrow(2, effects[ii].ee_chips)) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(scoring_hand[i], 'ee_chips', effects[ii].ee_chips, percent) - end - if effects[ii].eee_chips then - mod_percent = true - if effects[ii].card then juice_card(effects[ii].card) end - hand_chips = mod_chips(hand_chips:arrow(3, effects[ii].eee_chips)) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(scoring_hand[i], 'eee_chips', effects[ii].eee_chips, percent) - end - if effects[ii].hyper_chips and type(effects[ii].hyper_chips) == 'table' then - mod_percent = true - if effects[ii].card then juice_card(effects[ii].card) end - hand_chips = mod_chips(hand_chips:arrow(effects[ii].hyper_chips[1], effects[ii].hyper_chips[2])) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(scoring_hand[i], 'hyper_chips', effects[ii].hyper_chips, percent) - end - if effects[ii].e_mult then - mod_percent = true - if effects[ii].card then juice_card(effects[ii].card) end - mult = mod_mult(mult^effects[ii].e_mult) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(scoring_hand[i], 'e_mult', effects[ii].e_mult, percent) - end - if effects[ii].ee_mult then - mod_percent = true - if effects[ii].card then juice_card(effects[ii].card) end - mult = mod_mult(mult:arrow(2, effects[ii].ee_mult)) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(scoring_hand[i], 'ee_mult', effects[ii].ee_mult, percent) - end - if effects[ii].eee_mult then - mod_percent = true - if effects[ii].card then juice_card(effects[ii].card) end - mult = mod_mult(mult:arrow(3, effects[ii].eee_mult)) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(scoring_hand[i], 'eee_mult', effects[ii].eee_mult, percent) - end - if effects[ii].hyper_mult and type(effects[ii].hyper_mult) == 'table' then - mod_percent = true - if effects[ii].card then juice_card(effects[ii].card) end - mult = mod_mult(mult:arrow(effects[ii].hyper_mult[1], effects[ii].hyper_mult[2])) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(scoring_hand[i], 'hyper_mult', effects[ii].hyper_mult, percent) - end - - --calculate the card edition effects - if effects[ii].edition then - if effects[ii].edition.chip_mod then - hand_chips = mod_chips(hand_chips + effects[ii].edition.chip_mod) - local key_switch = (effects[ii].edition.chip_mod > 0 and 'a_chips' or 'a_chips_minus') - card_eval_status_text(scoring_hand[i], 'extra', nil, percent, nil, { - message = localize{type='variable', key=key_switch, vars={math.abs(effects[ii].edition.chip_mod)}}, - chip_mod = true, - colour = G.C.DARK_EDITION, - edition = true - }) - update_hand_text({delay = 0}, {chips = hand_chips}) - end - if effects[ii].edition.mult_mod then - mult = mult + effects[ii].edition.mult_mod - card_eval_status_text(scoring_hand[i], 'extra', nil, percent, nil, { - message = localize{type='variable', key='a_mult', vars={effects[ii].edition.mult_mod}}, - mult_mod = true, - colour = G.C.DARK_EDITION, - edition = true - }) - update_hand_text({delay = 0}, {mult = mult}) - end - if effects[ii].edition.x_mult_mod then - mult = mult * effects[ii].edition.x_mult_mod - card_eval_status_text(scoring_hand[i], 'extra', nil, percent, nil, { - message = localize{type='variable', key='a_xmult', vars={effects[ii].edition.x_mult_mod}}, - x_mult_mod = true, - colour = G.C.DARK_EDITION, - edition = true - }) - update_hand_text({delay = 0}, {mult = mult}) - end - if scoring_hand and scoring_hand[i] and scoring_hand[i].edition then - local trg = scoring_hand[i] - local edi = trg.edition - if edi.x_chips then - hand_chips = mod_chips(hand_chips * edi.x_chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = 'X'.. edi.x_chips ..' Chips', - edition = true, - x_chips = true}) - end - if edi.e_chips then - hand_chips = mod_chips(hand_chips ^ edi.e_chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^'.. edi.e_chips ..' Chips', - edition = true, - e_chips = true}) - end - if edi.ee_chips then - hand_chips = mod_chips(hand_chips:arrow(2, edi.ee_chips)) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^^'.. edi.ee_chips ..' Chips', - edition = true, - ee_chips = true}) - end - if edi.eee_chips then - hand_chips = mod_chips(hand_chips:arrow(3, edi.eee_chips)) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^^^'.. edi.eee_chips ..' Chips', - edition = true, - eee_chips = true}) - end - if edi.hyper_chips and type(edi.hyper_chips) == 'table' then - hand_chips = mod_chips(hand_chips:arrow(edi.hyper_chips[1], edi.hyper_chips[2])) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = (edi.hyper_chips[1] > 5 and ('{' .. edi.hyper_chips[1] .. '}') or string.rep('^', edi.hyper_chips[1])) .. edi.hyper_chips[2] ..' Chips', - edition = true, - eee_chips = true}) - end - if edi.e_mult then - mult = mod_mult(mult ^ edi.e_mult) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^'.. edi.e_mult ..' Mult', - edition = true, - e_mult = true}) - end - if edi.ee_mult then - mult = mod_mult(mult:arrow(2, edi.ee_mult)) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^^'.. edi.ee_mult ..' Mult', - edition = true, - ee_mult = true}) - end - if edi.eee_mult then - mult = mod_mult(mult:arrow(3, edi.eee_mult)) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^^^'.. edi.eee_mult ..' Mult', - edition = true, - eee_mult = true}) - end - if edi.hyper_mult and type(edi.hyper_mult) == 'table' then - mult = mod_mult(mult:arrow(edi.hyper_mult[1], edi.hyper_mult[2])) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = (edi.hyper_mult[1] > 5 and ('{' .. edi.hyper_mult[1] .. '}') or string.rep('^', edi.hyper_mult[1])) .. edi.hyper_mult[2] ..' Mult', - edition = true, - hyper_mult = true}) - end - end - if effects[ii].edition.p_dollars_mod then - if effects[ii].card then juice_card(effects[ii].card) end - ease_dollars(effects[ii].edition.p_dollars_mod) - card_eval_status_text(scoring_hand[i], 'dollars', effects[ii].edition.p_dollars_mod, percent) - end - if not effects[ii].edition then - hand_chips = mod_chips(hand_chips + (effects[ii].edition.chip_mod or 0)) - mult = mult + (effects[ii].edition.mult_mod or 0) - mult = mod_mult(mult*(effects[ii].edition.x_mult_mod or 1)) - update_hand_text({delay = 0}, { - chips = effects[ii].edition.chip_mod and hand_chips or nil, - mult = (effects[ii].edition.mult_mod or effects[ii].edition.x_mult_mod) and mult or nil, - }) - card_eval_status_text(scoring_hand[i], 'extra', nil, percent, nil, { - message = (effects[ii].edition.chip_mod and localize{type='variable',key='a_chips',vars={effects[ii].edition.chip_mod}}) or - (effects[ii].edition.mult_mod and localize{type='variable',key='a_mult',vars={effects[ii].edition.mult_mod}}) or - (effects[ii].edition.x_mult_mod and localize{type='variable',key='a_xmult',vars={effects[ii].edition.x_mult_mod}}), - chip_mod = effects[ii].edition.chip_mod, - mult_mod = effects[ii].edition.mult_mod, - x_mult_mod = effects[ii].edition.x_mult_mod, - colour = G.C.DARK_EDITION, - edition = true})end - if (effects and effects[ii] and effects[ii].edition and effects[ii].edition.x_mult_mod or edition_effects and edition_effects.jokers and edition_effects.jokers.x_mult_mod) and next(find_joker("cry-Exponentia")) then - for _, v in pairs(find_joker("cry-Exponentia")) do - local old = v.ability.extra.Emult - v.ability.extra.Emult = v.ability.extra.Emult + v.ability.extra.Emult_mod - card_eval_status_text(v, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_powmult',vars={number_format(to_big(v.ability.extra.Emult))}}}) - exponentia_scale_mod(v, v.ability.extra.Emult_mod, old, v.ability.extra.Emult) - end - end - end - if effects[ii].from_retrigger then - card_eval_status_text(effects[ii].from_retrigger.card, 'jokers', nil, nil, nil, effects[ii].from_retrigger) - end - -end - end - end - end - delay(0.3) - local mod_percent = false - if scoring_hand then - local unscoring_hand = {} - for i = 1, #G.play.cards do - local is_scoring = false - for j = 1, #scoring_hand do - if G.play.cards[i] == scoring_hand[j] then - is_scoring = true - end - end - if not is_scoring then - unscoring_hand[#unscoring_hand+1] = G.play.cards[i] - end - end - for i = 1, #unscoring_hand do - unscoring_hand[i]:calculate_seal{unscoring = true} - end - end - for i=1, #G.hand.cards do - if mod_percent then percent = percent + percent_delta end - mod_percent = false - - --Check for hand doubling - local reps = {1} - local j = 1 - while j <= #reps do - if reps[j] ~= 1 and (not scoring_hand or not scoring_hand[i] or not scoring_hand[i].will_shatter) then - card_eval_status_text((reps[j].jokers or reps[j].seals).card, 'jokers', nil, nil, nil, (reps[j].jokers or reps[j].seals)) - percent = percent + percent_delta - end - - --calculate the hand effects - local effects = {eval_card(G.hand.cards[i], {cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands})} - - for k=1, #G.jokers.cards do - --calculate the joker individual card effects - local eval = G.jokers.cards[k]:calculate_joker({cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = G.hand.cards[i], individual = true, callback = function(card, eval, retrigger) - if eval then - mod_percent = true - table.insert(effects, eval) -effects[#effects].from_retrigger = retrigger -end end, no_retrigger_anim = true}) - - end - - if reps[j] == 1 then - --Check for hand doubling - - --From Red seal - local eval = eval_card(G.hand.cards[i], {repetition_only = true,cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, repetition = true, card_effects = effects}) - if next(eval) and (next(effects[1]) or #effects > 1) then - for h = 1, eval.seals.repetitions do - reps[#reps+1] = eval - end - end - - --From Joker - for j=1, #G.jokers.cards do - --calculate the joker effects - local eval = eval_card(G.jokers.cards[j], {cardarea = G.hand, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_card = G.hand.cards[i], repetition = true, card_effects = effects, callback = function(card, ret) eval = {jokers = ret} - if next(eval) then - for h = 1, eval.jokers.repetitions do - reps[#reps+1] = eval - end - end end}) - end - end - - for ii = 1, #effects do - --if this effect came from a joker - if effects[ii].card and not Talisman.config_file.disable_anims then - mod_percent = true - G.E_MANAGER:add_event(Event({ - trigger = 'immediate', - func = (function() effects[ii].card:juice_up(0.7);return true end) - })) - end - - --If hold mult added, do hold mult add event and add the mult to the total - - --If dollars added, add dollars to total - if effects[ii].dollars then - ease_dollars(effects[ii].dollars) - card_eval_status_text(G.hand.cards[i], 'dollars', effects[ii].dollars, percent) - end - - if effects[ii].h_mult then - mod_percent = true - mult = mod_mult(mult + effects[ii].h_mult) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(G.hand.cards[i], 'h_mult', effects[ii].h_mult, percent) - end - if effects[ii].h_chips then - if effects[ii].card then juice_card(effects[ii].card) end - hand_chips = mod_chips(hand_chips + effects[ii].h_chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(effects[ii].card, 'chips', effects[ii].h_chips, percent) - end - - if effects[ii].x_mult then - mod_percent = true - mult = mod_mult(mult*effects[ii].x_mult) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(G.hand.cards[i], 'x_mult', effects[ii].x_mult, percent) - if next(find_joker("cry-Exponentia")) then - for _, v in pairs(find_joker("cry-Exponentia")) do - local old = v.ability.extra.Emult - v.ability.extra.Emult = v.ability.extra.Emult + v.ability.extra.Emult_mod - card_eval_status_text(v, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_powmult',vars={number_format(to_big(v.ability.extra.Emult))}}}) - exponentia_scale_mod(v, v.ability.extra.Emult_mod, old, v.ability.extra.Emult) - end - end - end - - if effects[ii].x_chips then - mod_percent = true - hand_chips = mod_chips(hand_chips*effects[ii].x_chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(G.hand.cards[i], 'x_chips', effects[ii].x_chips, percent) - end - if effects[ii].e_chips then - mod_percent = true - hand_chips = mod_chips(hand_chips^effects[ii].e_chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(G.hand.cards[i], 'e_chips', effects[ii].e_chips, percent) - end - if effects[ii].ee_chips then - mod_percent = true - hand_chips = mod_chips(hand_chips:arrow(2, effects[ii].ee_chips)) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(G.hand.cards[i], 'ee_chips', effects[ii].ee_chips, percent) - end - if effects[ii].eee_chips then - mod_percent = true - hand_chips = mod_chips(hand_chips:arrow(3, effects[ii].eee_chips)) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(G.hand.cards[i], 'eee_chips', effects[ii].eee_chips, percent) - end - if effects[ii].hyper_chips and type(effects[ii].hyper_chips) == 'table' then - mod_percent = true - hand_chips = mod_chips(hand_chips:arrow(effects[ii].hyper_chips[1], effects[ii].hyper_chips[2])) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(G.hand.cards[i], 'hyper_chips', effects[ii].hyper_chips, percent) - end - if effects[ii].e_mult then - mod_percent = true - mult = mod_mult(mult^effects[ii].e_mult) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(G.hand.cards[i], 'e_mult', effects[ii].e_mult, percent) - end - if effects[ii].ee_mult then - mod_percent = true - mult = mod_mult(mult:arrow(2, effects[ii].ee_mult)) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(G.hand.cards[i], 'ee_mult', effects[ii].ee_mult, percent) - end - if effects[ii].eee_mult then - mod_percent = true - mult = mod_mult(mult:arrow(3, effects[ii].eee_mult)) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(G.hand.cards[i], 'eee_mult', effects[ii].eee_mult, percent) - end - if effects[ii].hyper_mult and type(effects[ii].hyper_mult) == 'table' then - mod_percent = true - mult = mod_mult(mult:arrow(effects[ii].hyper_mult[1], effects[ii].hyper_mult[2])) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(G.hand.cards[i], 'hyper_mult', effects[ii].hyper_mult, percent) - end - - if effects[ii].message then - mod_percent = true - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(G.hand.cards[i], 'extra', nil, percent, nil, effects[ii]) - end - if effects[ii].from_retrigger then - card_eval_status_text(effects[ii].from_retrigger.card, 'jokers', nil, nil, nil, effects[ii].from_retrigger) - end - -end - j = j +1 - end - end + for _, v in ipairs(SMODS.get_card_areas('playing_cards')) do + SMODS.calculate_main_scoring({cardarea = v, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands}, v == G.play and scoring_hand or nil) + delay(0.3) + end + --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- --Joker Effects --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- percent = percent + percent_delta - local numcards = #G.jokers.cards + #G.consumeables.cards - if G.GAME.modifiers.cry_beta then numcards = #G.jokers.cards end - for i=1, numcards do - local _card = G.jokers.cards[i] or G.consumeables.cards[i - #G.jokers.cards] - --calculate the joker edition effects - local edition_effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true}) - if not edition_effects then edition_effects = {} end - if edition_effects.jokers then - edition_effects.jokers.edition = true - if edition_effects.jokers.p_dollars_mod then - ease_dollars(edition_effects.jokers.p_dollars_mod) - card_eval_status_text(_card, 'dollars', edition_effects.jokers.p_dollars_mod, percent) - end - if edition_effects.jokers.chip_mod then - hand_chips = mod_chips(hand_chips + edition_effects.jokers.chip_mod) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(_card, 'jokers', nil, percent, nil, { - message = localize{type='variable',key='a_chips',vars={edition_effects.jokers.chip_mod}}, - chip_mod = edition_effects.jokers.chip_mod, - colour = G.C.EDITION, - edition = true}) - if (effects and effects[ii] and effects[ii].edition and effects[ii].edition.x_mult_mod or edition_effects and edition_effects.jokers and edition_effects.jokers.x_mult_mod) and next(find_joker("cry-Exponentia")) then - for _, v in pairs(find_joker("cry-Exponentia")) do - local old = v.ability.extra.Emult - v.ability.extra.Emult = v.ability.extra.Emult + v.ability.extra.Emult_mod - card_eval_status_text(v, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_powmult',vars={number_format(to_big(v.ability.extra.Emult))}}}) - exponentia_scale_mod(v, v.ability.extra.Emult_mod, old, v.ability.extra.Emult) - end - end - end - if edition_effects.jokers.mult_mod then - mult = mod_mult(mult + edition_effects.jokers.mult_mod) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(_card, 'jokers', nil, percent, nil, { - message = localize{type='variable',key='a_mult',vars={edition_effects.jokers.mult_mod}}, - mult_mod = edition_effects.jokers.mult_mod, - colour = G.C.DARK_EDITION, - edition = true}) - if (effects and effects[ii] and effects[ii].edition and effects[ii].edition.x_mult_mod or edition_effects and edition_effects.jokers and edition_effects.jokers.x_mult_mod) and next(find_joker("cry-Exponentia")) then - for _, v in pairs(find_joker("cry-Exponentia")) do - local old = v.ability.extra.Emult - v.ability.extra.Emult = v.ability.extra.Emult + v.ability.extra.Emult_mod - card_eval_status_text(v, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_powmult',vars={number_format(to_big(v.ability.extra.Emult))}}}) - exponentia_scale_mod(v, v.ability.extra.Emult_mod, old, v.ability.extra.Emult) - end - end - end - percent = percent+percent_delta - end + for _, area in ipairs(SMODS.get_card_areas('jokers')) do for _, _card in ipairs(area.cards) do + local effects = {} + -- remove base game joker edition calc + local eval = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true, pre_joker = true}) + if eval.edition then effects[#effects+1] = eval end + - --calculate the joker effects - local effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, joker_main = true, callback = function(_card, ret) effects = {jokers = ret} - - --Any Joker effects - if effects.jokers then - local extras = {mult = false, hand_chips = false} - if effects.jokers.mult_mod then mult = mod_mult(mult + effects.jokers.mult_mod);extras.mult = true end - if effects.jokers.chip_mod then hand_chips = mod_chips(hand_chips + effects.jokers.chip_mod);extras.hand_chips = true end - if effects.jokers.Xmult_mod then mult = mod_mult(mult*effects.jokers.Xmult_mod);extras.mult = true end - if effects.jokers.Emult_mod then mult = mod_mult(mult^effects.jokers.Emult_mod);extras.mult = true end - if effects.jokers.EEmult_mod then mult = mod_mult(mult:arrow(2, effects.jokers.EEmult_mod));extras.mult = true end - if effects.jokers.EEEmult_mod then mult = mod_mult(mult:arrow(3, effects.jokers.EEEmult_mod));extras.mult = true end - if effects.jokers.hypermult_mod and type(effects.jokers.hypermult_mod) == 'table' then mult = mod_mult(mult:arrow(effects.jokers.hypermult_mod[1], effects.jokers.hypermult_mod[2]));extras.mult = true end - if effects.jokers.Xchip_mod then hand_chips = mod_chips(hand_chips*effects.jokers.Xchip_mod);extras.hand_chips = true end - if effects.jokers.Echip_mod then hand_chips = mod_chips(hand_chips^effects.jokers.Echip_mod);extras.hand_chips = true end - if effects.jokers.EEchip_mod then hand_chips = mod_chips(hand_chips:arrow(2, effects.jokers.EEchip_mod));extras.hand_chips = true end - if effects.jokers.EEEchip_mod then hand_chips = mod_chips(hand_chips:arrow(3, effects.jokers.EEEchip_mod));extras.hand_chips = true end - if effects.jokers.hyperchip_mod and type(effects.jokers.hyperchip_mod) == 'table' then hand_chips = mod_chips(hand_chips:arrow(effects.jokers.hyperchip_mod[1], effects.jokers.hyperchip_mod[2]));extras.hand_chips = true end - update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult}) - card_eval_status_text(_card, 'jokers', nil, percent, nil, effects.jokers) - if effects.jokers.Xmult_mod and effects.jokers.Xmult_mod ~= 1 and next(find_joker("cry-Exponentia")) then - for _, v in pairs(find_joker("cry-Exponentia")) do - local old = v.ability.extra.Emult - v.ability.extra.Emult = v.ability.extra.Emult + v.ability.extra.Emult_mod - card_eval_status_text(v, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_powmult',vars={number_format(to_big(v.ability.extra.Emult))}}}) - exponentia_scale_mod(v, v.ability.extra.Emult_mod, old, v.ability.extra.Emult) + -- Calculate context.joker_main + local joker_eval, post = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, joker_main = true}) + if next(joker_eval) then + if joker_eval.edition then joker_eval.edition = {} end + table.insert(effects, joker_eval) + for _, v in ipairs(post) do effects[#effects+1] = v end + if joker_eval.retriggers then + for rt = 1, #joker_eval.retriggers do + local rt_eval, rt_post = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, joker_main = true, retrigger_joker = true}) + table.insert(effects, {joker_eval.retriggers[rt]}) + table.insert(effects, rt_eval) + for _, v in ipairs(rt_post) do effects[#effects+1] = v end end end - percent = percent+percent_delta end - end}) - --Joker on Joker effects - for _, v in ipairs(G.jokers.cards) do - local effect = v:calculate_joker({full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_joker = _card, callback = function(v, effect) - if effect then - local extras = {mult = false, hand_chips = false} - if effect.mult_mod then mult = mod_mult(mult + effect.mult_mod);extras.mult = true end - if effect.chip_mod then hand_chips = mod_chips(hand_chips + effect.chip_mod);extras.hand_chips = true end - if effect.Xmult_mod then mult = mod_mult(mult*effect.Xmult_mod);extras.mult = true end - if effect.Emult_mod then mult = mod_mult(mult^effect.Emult_mod);extras.mult = true end - if effect.EEmult_mod then mult = mod_mult(mult:arrow(2, effect.EEmult_mod));extras.mult = true end - if effect.EEEmult_mod then mult = mod_mult(mult:arrow(3, effect.EEEmult_mod));extras.mult = true end - if effect.hypermult_mod and type(effect.hypermult_mod) == 'table' then mult = mod_mult(mult:arrow(effect.hypermult_mod[1], effect.hypermult_mod[2]));extras.mult = true end - if effect.Xchip_mod then hand_chips = mod_chips(hand_chips*effect.Xchip_mod);extras.hand_chips = true end - if effect.Echip_mod then hand_chips = mod_chips(hand_chips^effect.Echip_mod);extras.hand_chips = true end - if effect.EEchip_mod then hand_chips = mod_chips(hand_chips:arrow(2, effect.EEchip_mod));extras.hand_chips = true end - if effect.EEEchip_mod then hand_chips = mod_chips(hand_chips:arrow(3, effect.EEEchip_mod));extras.hand_chips = true end - if effect.hyperchip_mod and type(effect.hyperchip_mod) == 'table' then hand_chips = mod_chips(hand_chips:arrow(effect.hyperchip_mod[1], effect.hyperchip_mod[2]));extras.hand_chips = true end - if extras.mult or extras.hand_chips then update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult}) end - if extras.mult or extras.hand_chips then card_eval_status_text(v, 'jokers', nil, percent, nil, effect) end - if effects.Xmult_mod and next(find_joker("cry-Exponentia")) then - for _, v in pairs(find_joker("cry-Exponentia")) do - local old = v.ability.extra.Emult - v.ability.extra.Emult = v.ability.extra.Emult + v.ability.extra.Emult_mod - card_eval_status_text(v, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_powmult',vars={number_format(to_big(v.ability.extra.Emult))}}}) - exponentia_scale_mod(v, v.ability.extra.Emult_mod, old, v.ability.extra.Emult) - end - end - if effect.Xmult_mod and effect.Xmult_mod ~= 1 and next(find_joker("cry-Exponentia")) then - for _, v in pairs(find_joker("cry-Exponentia")) do - local old = v.ability.extra.Emult - v.ability.extra.Emult = v.ability.extra.Emult + v.ability.extra.Emult_mod - card_eval_status_text(v, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_powmult',vars={number_format(to_big(v.ability.extra.Emult))}}}) - exponentia_scale_mod(v, v.ability.extra.Emult_mod, old, v.ability.extra.Emult) - end - end - percent = percent+percent_delta - end end}) end if edition_effects.jokers then - if edition_effects.jokers.x_mult_mod then - mult = mod_mult(mult*edition_effects.jokers.x_mult_mod) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(_card, 'jokers', nil, percent, nil, { - message = localize{type='variable',key='a_xmult',vars={edition_effects.jokers.x_mult_mod}}, - x_mult_mod = edition_effects.jokers.x_mult_mod, - colour = G.C.EDITION, - edition = true}) - end - if G.jokers.cards and G.jokers.cards[i] and G.jokers.cards[i].edition then - local trg = G.jokers.cards[i] - local edi = trg.edition - if edi.x_chips then - hand_chips = mod_chips(hand_chips * edi.x_chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = 'X'.. edi.x_chips ..' Chips', - edition = true, - x_chips = true}) - end - if edi.e_chips then - hand_chips = mod_chips(hand_chips ^ edi.e_chips) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^'.. edi.e_chips ..' Chips', - edition = true, - e_chips = true}) - end - if edi.ee_chips then - hand_chips = mod_chips(hand_chips:arrow(2, edi.ee_chips)) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^^'.. edi.ee_chips ..' Chips', - edition = true, - ee_chips = true}) - end - if edi.eee_chips then - hand_chips = mod_chips(hand_chips:arrow(3, edi.eee_chips)) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^^^'.. edi.eee_chips ..' Chips', - edition = true, - eee_chips = true}) - end - if edi.hyper_chips and type(edi.hyper_chips) == 'table' then - hand_chips = mod_chips(hand_chips:arrow(edi.hyper_chips[1], edi.hyper_chips[2])) - update_hand_text({delay = 0}, {chips = hand_chips}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = (edi.hyper_chips[1] > 5 and ('{' .. edi.hyper_chips[1] .. '}') or string.rep('^', edi.hyper_chips[1])) .. edi.hyper_chips[2] ..' Chips', - edition = true, - eee_chips = true}) - end - if edi.e_mult then - mult = mod_mult(mult ^ edi.e_mult) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^'.. edi.e_mult ..' Mult', - edition = true, - e_mult = true}) - end - if edi.ee_mult then - mult = mod_mult(mult:arrow(2, edi.ee_mult)) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^^'.. edi.ee_mult ..' Mult', - edition = true, - ee_mult = true}) - end - if edi.eee_mult then - mult = mod_mult(mult:arrow(3, edi.eee_mult)) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = '^^^'.. edi.eee_mult ..' Mult', - edition = true, - eee_mult = true}) - end - if edi.hyper_mult and type(edi.hyper_mult) == 'table' then - mult = mod_mult(mult:arrow(edi.hyper_mult[1], edi.hyper_mult[2])) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(trg, 'extra', nil, percent, nil, - {message = (edi.hyper_mult[1] > 5 and ('{' .. edi.hyper_mult[1] .. '}') or string.rep('^', edi.hyper_mult[1])) .. edi.hyper_mult[2] ..' Mult', - edition = true, - hyper_mult = true}) - end - end - edition_effects.jokers.x_mult_mod = nil - if edition_effects.jokers.x_mult_mod then - mult = mod_mult(mult*edition_effects.jokers.x_mult_mod) - update_hand_text({delay = 0}, {mult = mult}) - card_eval_status_text(_card, 'jokers', nil, percent, nil, { - message = localize{type='variable',key='a_xmult',vars={edition_effects.jokers.x_mult_mod}}, - x_mult_mod = edition_effects.jokers.x_mult_mod, - colour = G.C.EDITION, - edition = true}) - if (effects and effects[ii] and effects[ii].edition and effects[ii].edition.x_mult_mod or edition_effects and edition_effects.jokers and edition_effects.jokers.x_mult_mod) and next(find_joker("cry-Exponentia")) then - for _, v in pairs(find_joker("cry-Exponentia")) do - local old = v.ability.extra.Emult - v.ability.extra.Emult = v.ability.extra.Emult + v.ability.extra.Emult_mod - card_eval_status_text(v, 'extra', nil, nil, nil, {message = localize{type='variable',key='a_powmult',vars={number_format(to_big(v.ability.extra.Emult))}}}) - exponentia_scale_mod(v, v.ability.extra.Emult_mod, old, v.ability.extra.Emult) + -- Calculate context.other_joker effects + for _, _area in ipairs(SMODS.get_card_areas('jokers')) do + for _, _joker in ipairs(_area.cards) do + local other_key = 'other_unknown' + if _card.ability.set == 'Joker' then other_key = 'other_joker' end + if _card.ability.consumeable then other_key = 'other_consumeable' end + if _card.ability.set == 'Voucher' then other_key = 'other_voucher' end + -- TARGET: add context.other_something identifier to your cards + local joker_eval,post = eval_card(_joker, {full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, [other_key] = _card, other_main = _card }) + if next(joker_eval) then + if joker_eval.edition then joker_eval.edition = {} end + joker_eval.jokers.juice_card = _joker + table.insert(effects, joker_eval) + for _, v in ipairs(post) do effects[#effects+1] = v end + if joker_eval.retriggers then + for rt = 1, #joker_eval.retriggers do + local rt_eval, rt_post = eval_card(_card, {full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, [other_key] = _card, retrigger_joker = true}) + table.insert(effects, {joker_eval.retriggers[rt]}) + table.insert(effects, rt_eval) + for _, v in ipairs(rt_post) do effects[#effects+1] = v end end end + end end - percent = percent+percent_delta end - end + -- calculate edition multipliers + local eval = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true, post_joker = true}) + if eval.edition then effects[#effects+1] = eval end + + SMODS.trigger_effects(effects, _card) + local deck_effect = G.GAME.selected_back:trigger_effect({full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, other_joker = _card.ability.set == 'Joker' and _card or false, other_consumeable = _card.ability.set ~= 'Joker' and _card or false}) + if deck_effect then SMODS.calculate_effect(deck_effect, G.deck.cards[1] or G.deck) end + end end + + -- context.final_scoring_step calculations + SMODS.calculate_context({full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, final_scoring_step = true}) + + -- TARGET: effects before deck final_scoring_step local nu_chip, nu_mult = G.GAME.selected_back:trigger_effect{context = 'final_scoring_step', chips = hand_chips, mult = mult} mult = mod_mult(nu_mult or mult) hand_chips = mod_chips(nu_chip or hand_chips) local cards_destroyed = {} - for i=1, #scoring_hand do - local destroyed = nil - --un-highlight all cards - highlight_card(scoring_hand[i],(i-0.999)/(#scoring_hand-0.998),'down') - - for j = 1, #G.jokers.cards do - destroyed = G.jokers.cards[j]:calculate_joker({destroying_card = scoring_hand[i], full_hand = G.play.cards, callback = function(card, ret) if ret then destroyed=true end end}) - if destroyed then break end - end - - 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 - destroyed = true - end - - if scoring_hand[i].will_shatter then destroyed = true end - if scoring_hand[i]:calculate_seal({destroying_card = scoring_hand[i], full_hand = G.play.cards}) and not scoring_hand[i].ability.eternal then - destroyed = true - end - - if destroyed then - if scoring_hand[i].ability.name == 'Glass Card' then - scoring_hand[i].shattered = true - else - scoring_hand[i].destroyed = true - end - cards_destroyed[#cards_destroyed+1] = scoring_hand[i] - end + for _,v in ipairs(SMODS.get_card_areas('playing_cards', 'destroying_cards')) do + SMODS.calculate_destroying_cards({ full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, cardarea = v }, cards_destroyed, v == G.play and scoring_hand or nil) end - for j=1, #G.jokers.cards do - eval_card(G.jokers.cards[j], {cardarea = G.jokers, remove_playing_cards = true, removed = cards_destroyed}) + + -- context.remove_playing_cards calculations + if cards_destroyed[1] then + SMODS.calculate_context({scoring_hand = scoring_hand, remove_playing_cards = true, removed = cards_destroyed}) end + + -- TARGET: effects when cards are removed + + local glass_shattered = {} for k, v in ipairs(cards_destroyed) do @@ -1758,8 +889,7 @@ end for i=1, #cards_destroyed do G.E_MANAGER:add_event(Event({ func = function() - if cards_destroyed[i].will_shatter then return true end - if cards_destroyed[i].ability.name == 'Glass Card' then + if SMODS.has_enhancement(cards_destroyed[i], 'm_glass') then cards_destroyed[i]:shatter() else cards_destroyed[i]:start_dissolve() @@ -1786,17 +916,10 @@ end --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- --Joker Debuff Effects --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- - for i=1, #G.jokers.cards do - - --calculate the joker effects - local effects = eval_card(G.jokers.cards[i], {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, debuffed_hand = true, callback = function(card, ret) effects = {jokers = ret} - - --Any Joker effects - if effects.jokers then - card_eval_status_text(card, 'jokers', nil, percent, nil, effects.jokers) - percent = percent+percent_delta - end - end}) end + -- context.debuffed_hand calculations + SMODS.calculate_context({full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, debuffed_hand = true}) + + -- TARGET: effects after hand debuffed by blind end G.E_MANAGER:add_event(Event({ trigger = 'after',delay = 0.4, @@ -1841,17 +964,11 @@ end })) delay(0.3) - for i=1, #G.jokers.cards do - --calculate the joker after hand played effects - local effects = eval_card(G.jokers.cards[i], {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, after = true, callback = function(card, ret) effects = {jokers = ret} - if effects.jokers then - card_eval_status_text(card, 'jokers', nil, percent, nil, effects.jokers) - percent = percent + percent_delta - end - end + -- context.after calculations + SMODS.calculate_context({full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, after = true}) + + -- TARGET: effects after hand evaluation - }) end - G.E_MANAGER:add_event(Event({ trigger = 'immediate', func = (function() @@ -1951,16 +1068,18 @@ G.FUNCS.evaluate_round = function() pitch = pitch + 0.06 dollars = dollars + G.GAME.current_round.discards_left*(G.GAME.modifiers.money_per_discard) end - for i = 1, #G.playing_cards do - local CARD = G.playing_cards[i] - CARD.cry_debuff_immune = false - end - for i = 1, #G.jokers.cards do - local ret = G.jokers.cards[i]:calculate_dollar_bonus() - if ret then - add_round_eval_row({dollars = ret, bonus = true, name='joker'..i, pitch = pitch, card = G.jokers.cards[i]}) - pitch = pitch + 0.06 - dollars = dollars + ret + local i = 0 + for _, area in ipairs(SMODS.get_card_areas('jokers')) do + for _, _card in ipairs(area.cards) do + local ret = _card:calculate_dollar_bonus() + + -- TARGET: calc_dollar_bonus per card + if ret then + i = i+1 + add_round_eval_row({dollars = ret, bonus = true, name='joker'..i, pitch = pitch, card = _card}) + pitch = pitch + 0.06 + dollars = dollars + ret + end end end for i = 1, #G.GAME.tags do @@ -1987,7 +1106,7 @@ G.FUNCS.evaluate_round = function() elseif G.GAME.dollars >= 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 then + if (not G.GAME.seeded and not G.GAME.challenge) or SMODS.config.seeded_unlocks then if G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) == G.GAME.interest_amount*G.GAME.interest_cap/5 then G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak = G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak + 1 else diff --git a/lovely/dump/game.lua b/lovely/dump/game.lua index 3d37b7b..3c0b2d8 100644 --- a/lovely/dump/game.lua +++ b/lovely/dump/game.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = '1f28fb4cd208cf3d7ee40ad59534c6cc25dbf6d4335f376d30f1e4b080e388b7' +LOVELY_INTEGRITY = '4af0a05e5998e1bbb1bd6610b6f3d87c6fea5c42d526b7d7d6bd3d6bf983044e' --Class Game = Object:extend() @@ -1114,7 +1114,7 @@ function Game:set_language() end end - self.LANG = self.LANGUAGES[self.SETTINGS.language] or self.LANGUAGES['en-us'] + self.LANG = self.LANGUAGES[self.SETTINGS.real_language or self.SETTINGS.language] or self.LANGUAGES['en-us'] local localization = love.filesystem.getInfo('localization/'..G.SETTINGS.language..'.lua') or love.filesystem.getInfo('localization/en-us.lua') if localization ~= nil then @@ -2013,10 +2013,10 @@ function Game:demo_cta() --True if main menu is accessed from the splash screen, end function Game:init_game_object() - local cards_played = {} - for _,v in ipairs(SMODS.Rank.obj_buffer) do - cards_played[v] = { suits = {}, total = 0 } - end + local cards_played = {} + for _,v in ipairs(SMODS.Rank.obj_buffer) do + cards_played[v] = { suits = {}, total = 0 } + end local bosses_used = {} for k, v in pairs(G.P_BLINDS) do if v.boss then bosses_used[k] = 0 end @@ -2151,9 +2151,9 @@ function Game:init_game_object() shop = { joker_max = 2, }, - cards_played = cards_played, - disabled_suits = {}, - disabled_ranks = {}, + cards_played = cards_played, + disabled_suits = {}, + disabled_ranks = {}, hands = { ["Flush Five"] = {visible = false, order = 1, mult = 16, chips = 160, s_mult = 16, s_chips = 160, level = 1, l_mult = 3, l_chips = 50, played = 0, played_this_round = 0, example = {{'S_A', true},{'S_A', true},{'S_A', true},{'S_A', true},{'S_A', true}}}, ["Flush House"] = {visible = false, order = 2, mult = 14, chips = 140, s_mult = 14, s_chips = 140, level = 1, l_mult = 4, l_chips = 40, played = 0, played_this_round = 0, example = {{'D_7', true},{'D_7', true},{'D_7', true},{'D_4', true},{'D_4', true}}}, @@ -2451,6 +2451,11 @@ function Game:start_run(args) 0, 0, CAI.discard_W,CAI.discard_H, {card_limit = 1e308, type = 'discard'}) + self.vouchers = CardArea( + G.discard.T.x, G.discard.T.y, + G.discard.T.w, G.discard.T.h, + { type = "discard", card_limit = 1e308 } + ) self.deck = CardArea( 0, 0, CAI.deck_W,CAI.deck_H, @@ -2541,9 +2546,9 @@ function Game:start_run(args) if not card_protos then card_protos = {} for k, v in pairs(self.P_CARDS) do - if type(SMODS.Ranks[v.value].in_pool) == 'function' and not SMODS.Ranks[v.value]:in_pool({initial_deck = true}) - or type(SMODS.Suits[v.suit].in_pool) == 'function' and not SMODS.Suits[v.suit]:in_pool({initial_deck = true}) then - goto continue + if type(SMODS.Ranks[v.value].in_pool) == 'function' and not SMODS.Ranks[v.value]:in_pool({initial_deck = true, suit = v.suit}) + or type(SMODS.Suits[v.suit].in_pool) == 'function' and not SMODS.Suits[v.suit]:in_pool({initial_deck = true, rank = v.value}) then + goto continue end local _ = nil if self.GAME.starting_params.erratic_suits_and_ranks then @@ -3575,13 +3580,9 @@ end if G.GAME.current_round.hands_played == 0 and G.GAME.current_round.discards_used == 0 and G.GAME.facing_blind then - for i = 1, #G.hand.cards do - eval_card(G.hand.cards[i], {first_hand_drawn = true}) + SMODS.calculate_context({first_hand_drawn = true}) end - for i = 1, #G.jokers.cards do - G.jokers.cards[i]:calculate_joker({first_hand_drawn = true}) - end - end + SMODS.calculate_context({hand_drawn = true}) G.E_MANAGER:add_event(Event({ trigger = 'immediate', diff --git a/lovely/dump/main.lua b/lovely/dump/main.lua index 967a0ed..9ca8190 100644 --- a/lovely/dump/main.lua +++ b/lovely/dump/main.lua @@ -1,4 +1,148 @@ -LOVELY_INTEGRITY = '99fc88fd391f4645cfa6f1f6b39e3ef72258ab69c56792fe9d6f119d8aab9a88' +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 --- STEAMODDED CORE --- MODULE STACKTRACE @@ -500,7 +644,7 @@ function getDebugInfoForCrash() local versionFile = love.filesystem.read("version.jkr") if versionFile then version = versionFile:match("[^\n]*") .. " (best guess)" - else + else version = "???" end end @@ -511,18 +655,18 @@ function getDebugInfoForCrash() modded_version = reqVersion else modded_version = "???" - end + end end - + local info = "Additional Context:\nBalatro Version: " .. version .. "\nModded Version: " .. (modded_version) local major, minor, revision, codename = love.getVersion() info = info .. string.format("\nLÖVE Version: %d.%d.%d", major, minor, revision) - local lovely_success, lovely = pcall(require, "lovely") if lovely_success then info = info .. "\nLovely Version: " .. lovely.version end + info = info .. "\nPlatform: " .. (love.system.getOS() or "???") if SMODS and SMODS.Mods then local mod_strings = "" local lovely_strings = "" @@ -856,150 +1000,6 @@ injectStackTrace() -- ---------------------------------------------- -- --------MOD CORE API STACKTRACE END----------- - -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 - if (love.system.getOS() == 'OS X' ) and (jit.arch == 'arm64' or jit.arch == 'arm') then jit.off() end do local logger = require("debugplus.logger") @@ -1099,17 +1099,21 @@ function love.load() G:start_up() --Steam integration local os = love.system.getOS() - if os == 'OS X' or os == 'Windows' then + if os == 'OS X' or os == 'Windows' or os == 'Linux' then local st = nil --To control when steam communication happens, make sure to send updates to steam as little as possible - if os == 'OS X' then + local cwd = NFS.getWorkingDirectory() + NFS.setWorkingDirectory(love.filesystem.getSourceBaseDirectory()) + if os == 'OS X' or os == 'Linux' then local dir = love.filesystem.getSourceBaseDirectory() local old_cpath = package.cpath package.cpath = package.cpath .. ';' .. dir .. '/?.so' - st = require 'luasteam' + local success, _st = pcall(require, 'luasteam') + if success then st = _st else sendWarnMessage(_st); st = {} end package.cpath = old_cpath else - st = require 'luasteam' + local success, _st = pcall(require, 'luasteam') + if success then st = _st else sendWarnMessage(_st); st = {} end end st.send_control = { @@ -1120,6 +1124,7 @@ function love.load() if not (st.init and st:init()) then st = nil end + NFS.setWorkingDirectory(cwd) --Set up the render window and the stage for the splash screen, then enter the gameloop with :update G.STEAM = st else @@ -1410,6 +1415,88 @@ function love.resize(w, h) G.CANVAS:setFilter('linear', 'linear') end +--- STEAMODDED CORE +--- MODULE CORE + +SMODS = {} +MODDED_VERSION = require'SMODS.version' +SMODS.id = 'Steamodded' +SMODS.version = MODDED_VERSION:gsub('%-STEAMODDED', '') +SMODS.can_load = true +SMODS.meta_mod = true +SMODS.config_file = 'config.lua' + +-- Include lovely and nativefs modules +local nativefs = require "nativefs" +local lovely = require "lovely" +local json = require "json" + +local lovely_mod_dir = lovely.mod_dir:gsub("/$", "") +NFS = nativefs +-- make lovely_mod_dir an absolute path. +-- respects symlink/.. combos +NFS.setWorkingDirectory(lovely_mod_dir) +lovely_mod_dir = NFS.getWorkingDirectory() +-- make sure NFS behaves the same as love.filesystem +NFS.setWorkingDirectory(love.filesystem.getSaveDirectory()) + +JSON = json + +local function set_mods_dir() + local love_dirs = { + love.filesystem.getSaveDirectory(), + love.filesystem.getSourceBaseDirectory() + } + for _, love_dir in ipairs(love_dirs) do + if lovely_mod_dir:sub(1, #love_dir) == love_dir then + -- relative path from love_dir + SMODS.MODS_DIR = lovely_mod_dir:sub(#love_dir+2) + NFS.setWorkingDirectory(love_dir) + return + end + end + SMODS.MODS_DIR = lovely_mod_dir +end +set_mods_dir() + +local function find_self(directory, target_filename, target_line, depth) + depth = depth or 1 + if depth > 3 then return end + for _, filename in ipairs(NFS.getDirectoryItems(directory)) do + local file_path = directory .. "/" .. filename + local file_type = NFS.getInfo(file_path).type + if file_type == 'directory' or file_type == 'symlink' then + local f = find_self(file_path, target_filename, target_line, depth+1) + if f then return f end + elseif filename == target_filename then + local first_line = NFS.read(file_path):match('^(.-)\n') + if first_line == target_line then + -- use parent directory + return directory:match('^(.+/)') + end + end + end +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", + "src/utils.lua", + "src/overrides.lua", + "src/game_object.lua", + "src/logging.lua", + "src/compat_0_9_8.lua", + "src/loader.lua", +} do + assert(load(NFS.read(SMODS.path..path), ('=[SMODS _ "%s"]'):format(path)))() +end + Handy = setmetatable({ last_clicked_area = nil, last_clicked_card = nil, @@ -3585,92 +3672,6 @@ Handy.UI.get_config_tab = function(_tab) return result end ---- STEAMODDED CORE ---- MODULE CORE - -SMODS = {} -MODDED_VERSION = require'SMODS.version' -SMODS.id = 'Steamodded' -SMODS.version = MODDED_VERSION:gsub('%-STEAMODDED', '') -SMODS.can_load = true -SMODS.meta_mod = true - --- Include lovely and nativefs modules -local nativefs = require "nativefs" -local lovely = require "lovely" -local json = require "json" - -local lovely_mod_dir = lovely.mod_dir:gsub("/$", "") -NFS = nativefs --- make lovely_mod_dir an absolute path. --- respects symlink/.. combos -NFS.setWorkingDirectory(lovely_mod_dir) -lovely_mod_dir = NFS.getWorkingDirectory() --- make sure NFS behaves the same as love.filesystem -NFS.setWorkingDirectory(love.filesystem.getSaveDirectory()) - -JSON = json - -local function set_mods_dir() - local love_dirs = { - love.filesystem.getSaveDirectory(), - love.filesystem.getSourceBaseDirectory() - } - for _, love_dir in ipairs(love_dirs) do - if lovely_mod_dir:sub(1, #love_dir) == love_dir then - -- relative path from love_dir - SMODS.MODS_DIR = lovely_mod_dir:sub(#love_dir+2) - if nfs_success then - -- make sure NFS behaves the same as love.filesystem. - -- not perfect: NFS won't read from both getSaveDirectory() - -- and getSourceBaseDirectory() - NFS.setWorkingDirectory(love_dir) - end - return - end - end - SMODS.MODS_DIR = lovely_mod_dir -end -set_mods_dir() - -local function find_self(directory, target_filename, target_line, depth) - depth = depth or 1 - if depth > 3 then return end - for _, filename in ipairs(NFS.getDirectoryItems(directory)) do - local file_path = directory .. "/" .. filename - local file_type = NFS.getInfo(file_path).type - if file_type == 'directory' or file_type == 'symlink' then - local f = find_self(file_path, target_filename, target_line, depth+1) - if f then return f end - elseif filename == target_filename then - local first_line = NFS.read(file_path):match('^(.-)\n') - if first_line == target_line then - -- use parent directory - return directory:match('^(.+/)') - end - end - end -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", - "src/utils.lua", - "src/overrides.lua", - "src/game_object.lua", - "src/logging.lua", - "src/compat_0_9_8.lua", - "src/loader.lua", -} do - assert(load(NFS.read(SMODS.path..path), ('=[SMODS _ "%s"]'):format(path)))() -end - local lovely = require("lovely") local nativefs = require("nativefs") diff --git a/lovely/dump/tag.lua b/lovely/dump/tag.lua index 1ea5084..efb65d6 100644 --- a/lovely/dump/tag.lua +++ b/lovely/dump/tag.lua @@ -1,4 +1,4 @@ -LOVELY_INTEGRITY = 'd16a678af46c656e33c88a0349859985655ad1ef28db3eae950262607bda3372' +LOVELY_INTEGRITY = '1051baf1f570241c507e107aff5fffefe3df969645f0fe53ec0856cd5ac0a760' --Class Tag = Object:extend() @@ -103,11 +103,11 @@ function Tag:yep(message, _colour, func) end function Tag:set_ability() - local obj = SMODS.Tags[self.key] - local res - if obj and obj.set_ability and type(obj.set_ability) == 'function' then - obj:set_ability(self) - end + local obj = SMODS.Tags[self.key] + local res + if obj and obj.set_ability and type(obj.set_ability) == 'function' then + obj:set_ability(self) + end if self.name == 'Orbital Tag' then if G.orbital_hand then self.ability.orbital_hand = G.orbital_hand @@ -120,13 +120,13 @@ function Tag:set_ability() end function Tag:apply_to_run(_context) - if self.triggered then return end - local obj = SMODS.Tags[self.key] - local res - if obj and obj.apply and type(obj.apply) == 'function' then - res = obj:apply(self, _context) - end - if res then return res end + if self.triggered then return end + local obj = SMODS.Tags[self.key] + local res + if obj and obj.apply and type(obj.apply) == 'function' then + res = obj:apply(self, _context) + end + if res then return res end if not self.triggered and self.config.type == _context.type then if _context.type == 'eval' then if self.name == 'Investment Tag' and @@ -723,7 +723,7 @@ function Tag:generate_UI(_size) return tag_sprite_tab, tag_sprite end -function Tag:get_uibox_table(tag_sprite) +function Tag:get_uibox_table(tag_sprite, vars_only) tag_sprite = tag_sprite or self.tag_sprite local name_to_check, loc_vars = self.name, {} if name_to_check == 'Uncommon Tag' then @@ -742,6 +742,7 @@ function Tag:get_uibox_table(tag_sprite) } elseif name_to_check == "cry-Cat Tag" then loc_vars = {self.ability.level or 1} end + if vars_only then return loc_vars end tag_sprite.ability_UIBox_table = generate_card_ui(G.P_TAGS[self.key], nil, loc_vars, (self.hide_ability) and 'Undiscovered' or 'Tag', nil, (self.hide_ability), nil, nil, self) return tag_sprite end diff --git a/lovely/log/lovely-2025.01.19-16.12.21.log b/lovely/log/lovely-2025.01.19-16.12.21.log new file mode 100644 index 0000000..dfa9954 --- /dev/null +++ b/lovely/log/lovely-2025.01.19-16.12.21.log @@ -0,0 +1,128 @@ +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 139ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 30 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 12 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 46 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 82 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 118 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 '(?[\\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 124 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 53 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 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 206 patches to 'card.lua' +INFO - [♥] Applied 20 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-01-19 16:12:26 :: 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-19 16:12:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-01-19 16:12:27 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-01-19 16:12:27 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-01-19 16:12:27 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-01-19 16:12:27 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-01-19 16:12:27 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-01-19 16:12:27 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.719 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0032] Injected Atlas in 781.765 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0025] Injected Sound in 20.566 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0032] Injected Stake in 0.626 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0008] Injected Rarity in 0.026 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.068 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0392] Injected Center in 1.969 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.012 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0027] Injected Blind in 0.061 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0002] Injected Seal in 0.072 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0004] Injected Suit in 0.114 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0013] Injected Rank in 0.082 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.040 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.081 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0031] Injected Challenge in 0.175 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0028] Injected Tag in 0.233 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0009] Injected Sticker in 0.811 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0009] Injected Shader in 56.200 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0020] Injected Achievement in 0.073 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 6.984 ms +INFO - [G] 2025-01-19 16:12:28 :: INFO :: TIMER :: [0011] Injected Event in 0.015 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews diff --git a/lovely/log/lovely-2025.01.19-23.45.43.log b/lovely/log/lovely-2025.01.19-23.45.43.log new file mode 100644 index 0000000..0e655c7 --- /dev/null +++ b/lovely/log/lovely-2025.01.19-23.45.43.log @@ -0,0 +1,128 @@ +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 132ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 30 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 12 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 46 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 82 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 118 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 '(?[\\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 124 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 53 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 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 206 patches to 'card.lua' +INFO - [♥] Applied 20 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-01-19 23:45:44 :: 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-19 23:45:45 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-01-19 23:45:45 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-01-19 23:45:45 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-01-19 23:45:45 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-01-19 23:45:45 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-01-19 23:45:45 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-01-19 23:45:45 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.681 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0032] Injected Atlas in 784.764 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0025] Injected Sound in 19.919 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0032] Injected Stake in 0.748 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0008] Injected Rarity in 0.023 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.072 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0392] Injected Center in 1.766 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.018 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0027] Injected Blind in 0.050 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0002] Injected Seal in 0.054 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0004] Injected Suit in 0.079 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0013] Injected Rank in 0.094 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.045 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.178 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0031] Injected Challenge in 0.188 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0028] Injected Tag in 0.241 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0009] Injected Sticker in 1.077 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0009] Injected Shader in 56.128 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0020] Injected Achievement in 0.092 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 6.203 ms +INFO - [G] 2025-01-19 23:45:46 :: INFO :: TIMER :: [0011] Injected Event in 0.013 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews diff --git a/lovely/log/lovely-2025.01.20-20.46.32.log b/lovely/log/lovely-2025.01.20-20.46.32.log new file mode 100644 index 0000000..e976f60 --- /dev/null +++ b/lovely/log/lovely-2025.01.20-20.46.32.log @@ -0,0 +1,128 @@ +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 152ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 30 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 12 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 46 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 82 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 118 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 '(?[\\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 124 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 53 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 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 206 patches to 'card.lua' +INFO - [♥] Applied 20 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-01-20 20:46:35 :: 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-20 20:46:36 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-01-20 20:46:36 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-01-20 20:46:36 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-01-20 20:46:36 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-01-20 20:46:36 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-01-20 20:46:36 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-01-20 20:46:36 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 1.464 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0032] Injected Atlas in 845.405 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0025] Injected Sound in 114.390 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0032] Injected Stake in 0.611 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0008] Injected Rarity in 0.023 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.057 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0392] Injected Center in 1.980 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.010 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0027] Injected Blind in 0.039 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0002] Injected Seal in 0.038 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0004] Injected Suit in 0.058 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0013] Injected Rank in 0.041 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.025 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.102 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0031] Injected Challenge in 0.157 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0028] Injected Tag in 0.178 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0009] Injected Sticker in 0.587 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0009] Injected Shader in 104.318 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0020] Injected Achievement in 0.080 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 23.693 ms +INFO - [G] 2025-01-20 20:46:37 :: INFO :: TIMER :: [0011] Injected Event in 0.033 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews diff --git a/lovely/log/lovely-2025.01.20-20.47.45.log b/lovely/log/lovely-2025.01.20-20.47.45.log new file mode 100644 index 0000000..2be2c6a --- /dev/null +++ b/lovely/log/lovely-2025.01.20-20.47.45.log @@ -0,0 +1,128 @@ +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 158ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 30 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 12 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 46 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 82 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 118 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 '(?[\\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 124 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 53 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 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 206 patches to 'card.lua' +INFO - [♥] Applied 20 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-01-20 20:47:48 :: 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-20 20:47:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-01-20 20:47:48 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-01-20 20:47:48 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-01-20 20:47:48 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-01-20 20:47:49 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.706 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0032] Injected Atlas in 808.787 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0025] Injected Sound in 22.145 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0032] Injected Stake in 0.423 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0008] Injected Rarity in 0.020 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.059 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0392] Injected Center in 1.763 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.012 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0027] Injected Blind in 0.042 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0002] Injected Seal in 0.278 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0004] Injected Suit in 0.063 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0013] Injected Rank in 0.066 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.029 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.107 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0031] Injected Challenge in 0.035 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0028] Injected Tag in 0.071 ms +INFO - [G] 2025-01-20 20:47:49 :: INFO :: TIMER :: [0009] Injected Sticker in 0.295 ms +INFO - [G] 2025-01-20 20:47:50 :: INFO :: TIMER :: [0009] Injected Shader in 93.768 ms +INFO - [G] 2025-01-20 20:47:50 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms +INFO - [G] 2025-01-20 20:47:50 :: INFO :: TIMER :: [0020] Injected Achievement in 0.108 ms +INFO - [G] 2025-01-20 20:47:50 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 6.442 ms +INFO - [G] 2025-01-20 20:47:50 :: INFO :: TIMER :: [0011] Injected Event in 0.013 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews diff --git a/lovely/log/lovely-2025.01.22-01.21.54.log b/lovely/log/lovely-2025.01.22-01.21.54.log new file mode 100644 index 0000000..83c8621 --- /dev/null +++ b/lovely/log/lovely-2025.01.22-01.21.54.log @@ -0,0 +1,128 @@ +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 319ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 30 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 12 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 46 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 82 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 118 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 '(?[\\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 124 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 53 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 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 206 patches to 'card.lua' +INFO - [♥] Applied 20 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-01-22 01:21:58 :: 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-22 01:22:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-01-22 01:22:00 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-01-22 01:22:00 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-01-22 01:22:00 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-01-22 01:22:00 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-01-22 01:22:00 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-01-22 01:22:00 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 1.183 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0032] Injected Atlas in 1022.137 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0025] Injected Sound in 497.088 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0032] Injected Stake in 0.475 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0008] Injected Rarity in 0.028 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.066 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0392] Injected Center in 1.674 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.009 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0027] Injected Blind in 0.047 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0002] Injected Seal in 0.052 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0004] Injected Suit in 0.056 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0013] Injected Rank in 0.076 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.026 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.107 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0031] Injected Challenge in 0.123 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0028] Injected Tag in 0.237 ms +INFO - [G] 2025-01-22 01:22:02 :: INFO :: TIMER :: [0009] Injected Sticker in 0.817 ms +INFO - [G] 2025-01-22 01:22:03 :: INFO :: TIMER :: [0009] Injected Shader in 850.893 ms +INFO - [G] 2025-01-22 01:22:03 :: INFO :: TIMER :: [0000] Injected Keybind in 0.002 ms +INFO - [G] 2025-01-22 01:22:03 :: INFO :: TIMER :: [0020] Injected Achievement in 0.085 ms +INFO - [G] 2025-01-22 01:22:03 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 11.235 ms +INFO - [G] 2025-01-22 01:22:03 :: INFO :: TIMER :: [0011] Injected Event in 0.016 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews diff --git a/lovely/log/lovely-2025.01.26-23.01.38.log b/lovely/log/lovely-2025.01.26-23.01.38.log new file mode 100644 index 0000000..fbb003d --- /dev/null +++ b/lovely/log/lovely-2025.01.26-23.01.38.log @@ -0,0 +1,229 @@ +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 157ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 30 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 12 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 46 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 82 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 118 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 '(?[\\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 124 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 53 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 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 206 patches to 'card.lua' +INFO - [♥] Applied 20 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-01-26 23:01:40 :: 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-26 23:01:41 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-01-26 23:01:41 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-01-26 23:01:41 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-01-26 23:01:41 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-01-26 23:01:41 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-01-26 23:01:41 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-01-26 23:01:41 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 1.248 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0032] Injected Atlas in 1076.432 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0025] Injected Sound in 119.396 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0032] Injected Stake in 0.497 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0008] Injected Rarity in 0.045 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.050 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0392] Injected Center in 1.968 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.018 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0027] Injected Blind in 0.045 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0002] Injected Seal in 0.038 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0004] Injected Suit in 0.068 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0013] Injected Rank in 0.054 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.029 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.115 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0031] Injected Challenge in 0.033 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0028] Injected Tag in 0.168 ms +INFO - [G] 2025-01-26 23:01:42 :: INFO :: TIMER :: [0009] Injected Sticker in 0.848 ms +INFO - [G] 2025-01-26 23:01:43 :: INFO :: TIMER :: [0009] Injected Shader in 167.743 ms +INFO - [G] 2025-01-26 23:01:43 :: INFO :: TIMER :: [0000] Injected Keybind in 0.002 ms +INFO - [G] 2025-01-26 23:01:43 :: INFO :: TIMER :: [0020] Injected Achievement in 0.080 ms +INFO - [G] 2025-01-26 23:01:43 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 8.242 ms +INFO - [G] 2025-01-26 23:01:43 :: INFO :: TIMER :: [0011] Injected Event in 0.020 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews +INFO - [G] line not found +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-01-26 23:02:11 :: ERROR :: StackTrace :: Oops! The game crashed +[SMODS Cryptid "Cryptid.lua"]:120: attempt to index field 'events' (a nil value) +Stack Traceback +=============== +(1) Lua upvalue 'orig' at file 'main.lua:612' + Local variables: + msg = string: "[SMODS Cryptid \"Cryptid.lua\"]:120: attempt to index field 'events' (a nil value)" + (*temporary) = Lua function '?' (defined at line 31 of chunk [SMODS _ "src/logging.lua"]) + (*temporary) = string: "Oops! The game crashed\ +" +(2) Lua local 'handler' at file 'console.lua:551' (from lovely module debugplus.console) + Local variables: + msg = string: "[SMODS Cryptid \"Cryptid.lua\"]:120: attempt to index field 'events' (a nil value)" +(3) LÖVE metamethod at file 'boot.lua:352' + Local variables: + errhand = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) + handler = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) +(4) Lua method 'update_round_eval' at file 'Cryptid.lua:120' (from mod with id Cryptid) + Local variables: + self = table: 0x04e04dc8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x09fb7138 (more...)} + dt = number: 0 + (*temporary) = nil + (*temporary) = C function: next + (*temporary) = table: 0x06be00a0 {unlock:table: 0x06be00c8, other:table: 0x06be0540, tutorial:table: 0x06be0118 (more...)} + (*temporary) = number: nan + (*temporary) = string: "achievement" + (*temporary) = table: 0x06be0518 {} + (*temporary) = boolean: false + (*temporary) = number: 1 + (*temporary) = string: "attempt to index field 'events' (a nil value)" +(5) Lua upvalue 'gameUpdateRef' at file 'game.lua:2804' + Local variables: + self = table: 0x04e04dc8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x09fb7138 (more...)} + dt = number: 0 + http_resp = nil +(6) Lua upvalue 'upd' at Steamodded file 'src/ui.lua:81' + Local variables: + self = table: 0x04e04dc8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x09fb7138 (more...)} + dt = number: 0.00610519 +(7) Lua upvalue 'upd' at file 'main.lua:4093' + Local variables: + self = table: 0x04e04dc8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x09fb7138 (more...)} + dt = number: 0.00610519 +(8) Lua upvalue 'upd' at file 'Items/Blinds.lua:1310' (from mod with id Cryptid) + Local variables: + self = table: 0x04e04dc8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x09fb7138 (more...)} + dt = number: 0.00610519 +(9) Lua upvalue 'upd' at file 'Items/CodeCards.lua:4106' (from mod with id Cryptid) + Local variables: + self = table: 0x04e04dc8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x09fb7138 (more...)} + dt = number: 0.00610519 +(10) Lua upvalue 'upd' at file 'Items/Decks.lua:429' (from mod with id Cryptid) + Local variables: + self = table: 0x04e04dc8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x09fb7138 (more...)} + dt = number: 0.00610519 +(11) Lua upvalue 'upd' at file 'Items/MiscJokers.lua:6658' (from mod with id Cryptid) + Local variables: + self = table: 0x04e04dc8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x09fb7138 (more...)} + dt = number: 0.00610519 +(12) Lua method 'update' at file 'Cryptid.lua:2948' (from mod with id Cryptid) + Local variables: + self = table: 0x04e04dc8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x09fb7138 (more...)} + dt = number: 0.00610519 +(13) Lua upvalue 'love_update_ref' at file 'main.lua:1141' + Local variables: + dt = number: 0.00610519 +(14) Lua upvalue 'oldupd' at file 'main.lua:2951' + Local variables: + dt = number: 0.00610519 +(15) Lua field 'update' at file 'main.lua:4120' + Local variables: + dt = number: 0.00610519 +(16) Lua function '?' at file 'main.lua:1079' (best guess) +(17) global C function 'xpcall' +(18) LÖVE function at file 'boot.lua:377' (best guess) + Local variables: + func = Lua function '?' (defined at line 1050 of chunk main.lua) + inerror = boolean: true + deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"]) + earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"]) + +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-01-26 23:02:11 :: INFO :: StackTrace :: Additional Context: +Balatro Version: 1.0.1n-FULL +Modded Version: 1.0.0~ALPHA-1220a-STEAMODDED +LÖVE Version: 11.5.0 +Lovely Version: 0.6.0 +Steamodded Mods: + 1: J Cursor by Jie65535, MarioMak967 [ID: JCursor] + 2: Cryptid by MathIsFun_, Cryptid and Balatro Discords [ID: Cryptid, Priority: 1e+299, Version: 0.5.3a, Uses Lovely] + 3: Talisman by MathIsFun_, Mathguy24, jenwalter666, cg-223 [ID: Talisman, Version: 2.0.2, Uses Lovely] + Break Infinity: omeganum + 4: Cartomancer by stupxd aka stupid [ID: cartomancer, Priority: 69, Version: 4.10, Uses Lovely] + 5: Handy by SleepyG11 [ID: Handy, Version: 1.1.5, Uses Lovely] + 6: Incantation by jenwalter666, MathIsFun_ [ID: incantation, Priority: 9e+301, Version: 0.5.10, Uses Lovely] + 7: DebugPlus by WilsontheWolf [ID: DebugPlus, Version: 1.3.0, Uses Lovely] +Lovely Mods: diff --git a/lovely/log/lovely-2025.01.26-23.02.32.log b/lovely/log/lovely-2025.01.26-23.02.32.log new file mode 100644 index 0000000..ae9dc23 --- /dev/null +++ b/lovely/log/lovely-2025.01.26-23.02.32.log @@ -0,0 +1,128 @@ +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 +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 30 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 12 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 46 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 82 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 118 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 '(?[\\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 124 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 53 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 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 206 patches to 'card.lua' +INFO - [♥] Applied 20 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-01-26 23:02:34 :: 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-26 23:02:35 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-01-26 23:02:35 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-01-26 23:02:35 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-01-26 23:02:35 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-01-26 23:02:35 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-01-26 23:02:35 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-01-26 23:02:35 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.747 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0032] Injected Atlas in 784.647 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0025] Injected Sound in 22.166 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0032] Injected Stake in 0.705 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0008] Injected Rarity in 0.030 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.065 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0392] Injected Center in 2.035 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.081 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0027] Injected Blind in 0.153 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0002] Injected Seal in 0.065 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0004] Injected Suit in 0.085 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0013] Injected Rank in 0.226 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.030 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.101 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0031] Injected Challenge in 0.036 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0028] Injected Tag in 0.059 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0009] Injected Sticker in 0.098 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0009] Injected Shader in 109.877 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0020] Injected Achievement in 0.076 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 6.699 ms +INFO - [G] 2025-01-26 23:02:36 :: INFO :: TIMER :: [0011] Injected Event in 0.013 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews diff --git a/lovely/log/lovely-2025.02.11-01.14.44.log b/lovely/log/lovely-2025.02.11-01.14.44.log new file mode 100644 index 0000000..cdc2ce1 --- /dev/null +++ b/lovely/log/lovely-2025.02.11-01.14.44.log @@ -0,0 +1,139 @@ +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 233ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 30 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 12 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 46 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 83 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 118 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 100 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 '(?[\\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 126 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 55 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 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 +WARN - [♥] Pattern 'elseif self.ability.name == \'Blueprint\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.name == \'Blueprint\' or self.ability.name == \'Brainstorm\' then' on target 'card.lua' resulted in no matches +INFO - [♥] Applied 210 patches to 'card.lua' +INFO - [♥] Applied 20 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-02-11 01:14:47 :: 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-02-11 01:14:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-02-11 01:14:48 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-02-11 01:14:48 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:14:48 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:14:48 :: DEBUG :: DefaultLogger :: JCursor loaded! +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Mod UnStable was unable to load: Missing Dependencies: 1: Steamodded (>=1.0.0~ALPHA-1318b) + + +INFO - [G] 2025-02-11 01:14:48 :: TRACE :: Loader :: Mod UnStableEX was unable to load: Missing Dependencies: 1: Steamodded (>=1.0.0~ALPHA-1307d) +2: UnStable + + +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-02-11 01:14:48 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-02-11 01:14:48 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-02-11 01:14:48 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 1.196 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0032] Injected Atlas in 849.797 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0025] Injected Sound in 209.452 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0032] Injected Stake in 0.878 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0008] Injected Rarity in 0.026 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.067 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0392] Injected Center in 2.221 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.010 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0027] Injected Blind in 0.052 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0002] Injected Seal in 0.046 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0004] Injected Suit in 0.100 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0013] Injected Rank in 0.080 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.031 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.084 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0031] Injected Challenge in 0.038 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0028] Injected Tag in 0.052 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0009] Injected Sticker in 0.117 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0009] Injected Shader in 56.258 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0020] Injected Achievement in 0.066 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 7.994 ms +INFO - [G] 2025-02-11 01:14:49 :: INFO :: TIMER :: [0011] Injected Event in 0.014 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews diff --git a/lovely/log/lovely-2025.02.11-01.21.30.log b/lovely/log/lovely-2025.02.11-01.21.30.log new file mode 100644 index 0000000..42e3bbc --- /dev/null +++ b/lovely/log/lovely-2025.02.11-01.21.30.log @@ -0,0 +1,199 @@ +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 135ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 35 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 13 patches to 'engine/controller.lua' +INFO - [♥] Applied 15 patches to 'back.lua' +INFO - [♥] Applied 15 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 48 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 85 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 110 patches to 'functions/UI_definitions.lua' +WARN - [♥] Pattern '--calculate the card edition effects\nif effects[ii].edition then\n hand_chips = mod_chips(hand_chips + (effects[ii].edition.chip_mod or 0))\n mult = mult + (effects[ii].edition.mult_mod or 0)\n mult = mod_mult(mult*(effects[ii].edition.x_mult_mod or 1))\n update_hand_text({delay = 0}, {\n chips = effects[ii].edition.chip_mod and hand_chips or nil,\n mult = (effects[ii].edition.mult_mod or effects[ii].edition.x_mult_mod) and mult or nil,\n })\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, {\n message = (effects[ii].edition.chip_mod and localize{type=\'variable\',key=\'a_chips\',vars={effects[ii].edition.chip_mod}}) or\n (effects[ii].edition.mult_mod and localize{type=\'variable\',key=\'a_mult\',vars={effects[ii].edition.mult_mod}}) or\n (effects[ii].edition.x_mult_mod and localize{type=\'variable\',key=\'a_xmult\',vars={effects[ii].edition.x_mult_mod}}),\n chip_mod = effects[ii].edition.chip_mod,\n mult_mod = effects[ii].edition.mult_mod,\n x_mult_mod = effects[ii].edition.x_mult_mod,\n colour = G.C.DARK_EDITION,\n edition = true})\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern ' scoring_hand[i].lucky_trigger = nil\n\n for ii = 1, #effects do\n --If chips added, do chip add event and add the chips to the total\n if effects[ii].chips then \n if effects[ii].card then juice_card(effects[ii].card) end\n hand_chips = mod_chips(hand_chips + effects[ii].chips)\n update_hand_text({delay = 0}, {chips = hand_chips})\n card_eval_status_text(scoring_hand[i], \'chips\', effects[ii].chips, percent)\n end\n\n --If mult added, do mult add event and add the mult to the total\n if effects[ii].mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult + effects[ii].mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'mult\', effects[ii].mult, percent)\n end\n\n --If play dollars added, add dollars to total\n if effects[ii].p_dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].p_dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].p_dollars, percent)\n end\n\n --If dollars added, add dollars to total\n if effects[ii].dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].dollars, percent)\n end\n\n --Any extra effects\n if effects[ii].extra then \n if effects[ii].card then juice_card(effects[ii].card) end\n local extras = {mult = false, hand_chips = false}\n if effects[ii].extra.mult_mod then mult =mod_mult( mult + effects[ii].extra.mult_mod);extras.mult = true end\n if effects[ii].extra.chip_mod then hand_chips = mod_chips(hand_chips + effects[ii].extra.chip_mod);extras.hand_chips = true end\n if effects[ii].extra.swap then \n local old_mult = mult\n mult = mod_mult(hand_chips)\n hand_chips = mod_chips(old_mult)\n extras.hand_chips = true; extras.mult = true\n end\n if effects[ii].extra.func then effects[ii].extra.func() end\n update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult})\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, effects[ii].extra)\n end\n\n --If x_mult added, do mult add event and mult the mult to the total\n if effects[ii].x_mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult*effects[ii].x_mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)\n end\n\n\n end\n end\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local percent = (i-0.999)/(#G.hand.cards-0.998) + (j-1)*0.1' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.effect ~= \'Stone Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i = 1, #G.jokers.cards do' on target 'functions/state_events.lua' resulted in no matches +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 +WARN - [♥] Pattern 'card_eval_status_text(_card, \'jokers\', nil, percent, nil, effects.jokers)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(G.hand.cards[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.hand.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if reps[j] ~= 1 then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if destroyed then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if cards_destroyed[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local edition_effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.jokers.cards + #G.consumeables.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local hand_space = e or math.min(#G.deck.cards, G.hand.config.card_limit - #G.hand.cards)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] 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' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].card then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects.jokers.Xmult_mod then mult = mod_mult(mult*effects.jokers.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effect.Xmult_mod then mult = mod_mult(mult*effect.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].message then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern '--calculate the card edition effects' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].edition.p_dollars_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if edition_effects.jokers.x_mult_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if destroyed then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Regex '(?[\\t ]*)if destroyed then \\n' on target 'functions/state_events.lua' resulted in no matches +INFO - [♥] Applied 62 patches to 'functions/state_events.lua' +WARN - [♥] Pattern 'function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end)' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern '{n=G.UIT.T, config={text = localize(\'$\')..config.dollars, scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \'Cryptid\' then loc_vars = {_c.config.extra}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \"Clearance Sale\" or _c.name == \"Liquidation\" then loc_vars = {_c.config.extra}' 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 - [♥] Pattern 'if v == \'negative_consumable\' then info_queue[#info_queue+1] = {key = \'e_negative_consumable\', set = \'Edition\', config = {extra = 1}} end' 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 141 patches to 'functions/common_events.lua' +WARN - [♥] Pattern 'if card.area and (not nc or card.area == G.pack_cards) then card.area:remove_card(card) end\n' on target 'functions/button_callbacks.lua' resulted in no matches +INFO - [♥] Applied 65 patches to 'functions/button_callbacks.lua' +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 center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'self:calculate_joker{selling_self = true}' on target 'card.lua' resulted in no matches +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 self.ability.name:find(\'Arcana\') then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Regex 'message = localize\\{type = \'variable\', key = \'a_xmult\', vars = \\{G.P_CENTERS.v_observatory.config.extra}},\\n\\s+Xmult_mod = G.P_CENTERS.v_observatory.config.extra' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.name == \'The Hermit\' or self.ability.consumeable.hand_type or self.ability.name == \'Temperance\' or self.ability.name == \'Black Hole\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.queue_negative_removal then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 +WARN - [♥] Pattern 'elseif self.ability.name == \'Blueprint\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.name == \'Blueprint\' or self.ability.name == \'Brainstorm\' then' on target 'card.lua' resulted in no matches +INFO - [♥] Applied 227 patches to 'card.lua' +WARN - [♥] Pattern '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)' on target 'cardarea.lua' resulted in no matches +INFO - [♥] Applied 19 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-02-11 01:21:33 :: 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-02-11 01:21:34 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-02-11 01:21:34 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-02-11 01:21:34 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-02-11 01:21:34 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:21:34 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: JCursor loaded! +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnStable] - Starting Unstable +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Spades with the type suit_black +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Clubs with the type suit_black +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Hearts with the type suit_red +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Diamonds with the type suit_red +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Starting UnstableEX +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_??? +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_e +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_0 +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_161 +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_r2 +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_13 +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_12 +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_11 +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_21 +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_Pi +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_25 +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_0.5 +INFO - [G] 2025-02-11 01:21:34 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_1 +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-02-11 01:21:34 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-02-11 01:21:34 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-02-11 01:21:34 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.729 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0065] Injected Atlas in 1309.479 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0029] Injected Sound in 19.334 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0032] Injected Stake in 0.852 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0008] Injected Rarity in 0.027 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0008] Injected ObjectType in 0.055 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0527] Injected Center in 2.581 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0012] Injected Undiscovered Sprite in 0.032 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0027] Injected Blind in 0.083 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0012] Injected Seal in 0.296 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0004] Injected Suit in 0.185 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0026] Injected Rank in 0.202 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0020] Injected DeckSkin in 0.186 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.293 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0031] Injected Challenge in 0.638 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0028] Injected Tag in 0.636 ms +INFO - [G] 2025-02-11 01:21:35 :: INFO :: TIMER :: [0009] Injected Sticker in 0.306 ms +INFO - [G] 2025-02-11 01:21:36 :: INFO :: TIMER :: [0009] Injected Shader in 50.625 ms +INFO - [G] 2025-02-11 01:21:36 :: INFO :: TIMER :: [0001] Injected Keybind in 0.005 ms +INFO - [G] 2025-02-11 01:21:36 :: INFO :: TIMER :: [0020] Injected Achievement in 0.104 ms +INFO - [G] 2025-02-11 01:21:36 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 12.730 ms +INFO - [G] 2025-02-11 01:21:36 :: INFO :: TIMER :: [0011] Injected Event in 0.014 ms +INFO - [G] 2025-02-11 01:21:36 :: DEBUG :: DefaultLogger :: [UnStable] - Initialize Remaining Previous Rank Data +INFO - [G] 2025-02-11 01:21:36 :: DEBUG :: DefaultLogger :: [UnStable] - Start initializing localization-independent info +INFO - [G] 2025-02-11 01:21:36 :: DEBUG :: DefaultLogger :: [UnStable] - Finished initializing localization-independent info +INFO - [G] 2025-02-11 01:21:36 :: DEBUG :: DefaultLogger :: [UnstableEX] - Inject new nominal code override for Cryptid +INFO - [G] 2025-02-11 01:21:36 :: DEBUG :: DefaultLogger :: [UnstableEX] - Inject Blind effects for Cryptid +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews diff --git a/lovely/log/lovely-2025.02.11-01.21.59.log b/lovely/log/lovely-2025.02.11-01.21.59.log new file mode 100644 index 0000000..bb95ea5 --- /dev/null +++ b/lovely/log/lovely-2025.02.11-01.21.59.log @@ -0,0 +1,326 @@ +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 125ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 35 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 13 patches to 'engine/controller.lua' +INFO - [♥] Applied 15 patches to 'back.lua' +INFO - [♥] Applied 15 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 48 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 85 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 110 patches to 'functions/UI_definitions.lua' +WARN - [♥] Pattern '--calculate the card edition effects\nif effects[ii].edition then\n hand_chips = mod_chips(hand_chips + (effects[ii].edition.chip_mod or 0))\n mult = mult + (effects[ii].edition.mult_mod or 0)\n mult = mod_mult(mult*(effects[ii].edition.x_mult_mod or 1))\n update_hand_text({delay = 0}, {\n chips = effects[ii].edition.chip_mod and hand_chips or nil,\n mult = (effects[ii].edition.mult_mod or effects[ii].edition.x_mult_mod) and mult or nil,\n })\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, {\n message = (effects[ii].edition.chip_mod and localize{type=\'variable\',key=\'a_chips\',vars={effects[ii].edition.chip_mod}}) or\n (effects[ii].edition.mult_mod and localize{type=\'variable\',key=\'a_mult\',vars={effects[ii].edition.mult_mod}}) or\n (effects[ii].edition.x_mult_mod and localize{type=\'variable\',key=\'a_xmult\',vars={effects[ii].edition.x_mult_mod}}),\n chip_mod = effects[ii].edition.chip_mod,\n mult_mod = effects[ii].edition.mult_mod,\n x_mult_mod = effects[ii].edition.x_mult_mod,\n colour = G.C.DARK_EDITION,\n edition = true})\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern ' scoring_hand[i].lucky_trigger = nil\n\n for ii = 1, #effects do\n --If chips added, do chip add event and add the chips to the total\n if effects[ii].chips then \n if effects[ii].card then juice_card(effects[ii].card) end\n hand_chips = mod_chips(hand_chips + effects[ii].chips)\n update_hand_text({delay = 0}, {chips = hand_chips})\n card_eval_status_text(scoring_hand[i], \'chips\', effects[ii].chips, percent)\n end\n\n --If mult added, do mult add event and add the mult to the total\n if effects[ii].mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult + effects[ii].mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'mult\', effects[ii].mult, percent)\n end\n\n --If play dollars added, add dollars to total\n if effects[ii].p_dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].p_dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].p_dollars, percent)\n end\n\n --If dollars added, add dollars to total\n if effects[ii].dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].dollars, percent)\n end\n\n --Any extra effects\n if effects[ii].extra then \n if effects[ii].card then juice_card(effects[ii].card) end\n local extras = {mult = false, hand_chips = false}\n if effects[ii].extra.mult_mod then mult =mod_mult( mult + effects[ii].extra.mult_mod);extras.mult = true end\n if effects[ii].extra.chip_mod then hand_chips = mod_chips(hand_chips + effects[ii].extra.chip_mod);extras.hand_chips = true end\n if effects[ii].extra.swap then \n local old_mult = mult\n mult = mod_mult(hand_chips)\n hand_chips = mod_chips(old_mult)\n extras.hand_chips = true; extras.mult = true\n end\n if effects[ii].extra.func then effects[ii].extra.func() end\n update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult})\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, effects[ii].extra)\n end\n\n --If x_mult added, do mult add event and mult the mult to the total\n if effects[ii].x_mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult*effects[ii].x_mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)\n end\n\n\n end\n end\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local percent = (i-0.999)/(#G.hand.cards-0.998) + (j-1)*0.1' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.effect ~= \'Stone Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i = 1, #G.jokers.cards do' on target 'functions/state_events.lua' resulted in no matches +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 +WARN - [♥] Pattern 'card_eval_status_text(_card, \'jokers\', nil, percent, nil, effects.jokers)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(G.hand.cards[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.hand.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if reps[j] ~= 1 then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if destroyed then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if cards_destroyed[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local edition_effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.jokers.cards + #G.consumeables.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local hand_space = e or math.min(#G.deck.cards, G.hand.config.card_limit - #G.hand.cards)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] 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' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].card then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects.jokers.Xmult_mod then mult = mod_mult(mult*effects.jokers.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effect.Xmult_mod then mult = mod_mult(mult*effect.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].message then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern '--calculate the card edition effects' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].edition.p_dollars_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if edition_effects.jokers.x_mult_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if destroyed then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Regex '(?[\\t ]*)if destroyed then \\n' on target 'functions/state_events.lua' resulted in no matches +INFO - [♥] Applied 62 patches to 'functions/state_events.lua' +WARN - [♥] Pattern 'function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end)' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern '{n=G.UIT.T, config={text = localize(\'$\')..config.dollars, scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \'Cryptid\' then loc_vars = {_c.config.extra}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \"Clearance Sale\" or _c.name == \"Liquidation\" then loc_vars = {_c.config.extra}' 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 - [♥] Pattern 'if v == \'negative_consumable\' then info_queue[#info_queue+1] = {key = \'e_negative_consumable\', set = \'Edition\', config = {extra = 1}} end' 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 141 patches to 'functions/common_events.lua' +WARN - [♥] Pattern 'if card.area and (not nc or card.area == G.pack_cards) then card.area:remove_card(card) end\n' on target 'functions/button_callbacks.lua' resulted in no matches +INFO - [♥] Applied 65 patches to 'functions/button_callbacks.lua' +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 center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'self:calculate_joker{selling_self = true}' on target 'card.lua' resulted in no matches +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 self.ability.name:find(\'Arcana\') then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Regex 'message = localize\\{type = \'variable\', key = \'a_xmult\', vars = \\{G.P_CENTERS.v_observatory.config.extra}},\\n\\s+Xmult_mod = G.P_CENTERS.v_observatory.config.extra' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.name == \'The Hermit\' or self.ability.consumeable.hand_type or self.ability.name == \'Temperance\' or self.ability.name == \'Black Hole\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.queue_negative_removal then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 +WARN - [♥] Pattern 'elseif self.ability.name == \'Blueprint\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.name == \'Blueprint\' or self.ability.name == \'Brainstorm\' then' on target 'card.lua' resulted in no matches +INFO - [♥] Applied 227 patches to 'card.lua' +WARN - [♥] Pattern '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)' on target 'cardarea.lua' resulted in no matches +INFO - [♥] Applied 19 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-02-11 01:22:02 :: 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-02-11 01:22:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-02-11 01:22:03 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-02-11 01:22:03 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-02-11 01:22:03 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:22:03 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: JCursor loaded! +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnStable] - Starting Unstable +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Spades with the type suit_black +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Clubs with the type suit_black +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Hearts with the type suit_red +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Diamonds with the type suit_red +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Starting UnstableEX +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_??? +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_e +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_0 +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_161 +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_r2 +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_13 +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_12 +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_11 +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_21 +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_Pi +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_25 +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_0.5 +INFO - [G] 2025-02-11 01:22:03 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_1 +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-02-11 01:22:03 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-02-11 01:22:03 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-02-11 01:22:03 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.791 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0065] Injected Atlas in 1323.703 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0029] Injected Sound in 18.386 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0032] Injected Stake in 0.674 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0008] Injected Rarity in 0.040 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0008] Injected ObjectType in 0.068 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0527] Injected Center in 3.509 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0012] Injected Undiscovered Sprite in 0.023 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0027] Injected Blind in 0.044 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0012] Injected Seal in 0.402 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0004] Injected Suit in 0.155 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0026] Injected Rank in 0.223 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0020] Injected DeckSkin in 0.118 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.125 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0031] Injected Challenge in 0.057 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0028] Injected Tag in 0.058 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0009] Injected Sticker in 0.210 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0009] Injected Shader in 118.781 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0001] Injected Keybind in 0.005 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0020] Injected Achievement in 0.080 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 11.917 ms +INFO - [G] 2025-02-11 01:22:05 :: INFO :: TIMER :: [0011] Injected Event in 0.013 ms +INFO - [G] 2025-02-11 01:22:05 :: DEBUG :: DefaultLogger :: [UnStable] - Initialize Remaining Previous Rank Data +INFO - [G] 2025-02-11 01:22:05 :: DEBUG :: DefaultLogger :: [UnStable] - Start initializing localization-independent info +INFO - [G] 2025-02-11 01:22:05 :: DEBUG :: DefaultLogger :: [UnStable] - Finished initializing localization-independent info +INFO - [G] 2025-02-11 01:22:05 :: DEBUG :: DefaultLogger :: [UnstableEX] - Inject new nominal code override for Cryptid +INFO - [G] 2025-02-11 01:22:05 :: DEBUG :: DefaultLogger :: [UnstableEX] - Inject Blind effects for Cryptid +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews +INFO - [G] line not found +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-02-11 01:23:05 :: ERROR :: StackTrace :: Oops! The game crashed +[SMODS _ "src/utils.lua"]:1344: bad argument #1 to 'ipairs' (table expected, got nil) +Stack Traceback +=============== +(1) Lua upvalue 'orig' at file 'main.lua:756' + Local variables: + msg = string: "[SMODS _ \"src/utils.lua\"]:1344: bad argument #1 to 'ipairs' (table expected, got nil)" + (*temporary) = Lua function '?' (defined at line 31 of chunk [SMODS _ "src/logging.lua"]) + (*temporary) = string: "Oops! The game crashed\ +" +(2) Lua local 'handler' at file 'console.lua:551' (from lovely module debugplus.console) + Local variables: + msg = string: "[SMODS _ \"src/utils.lua\"]:1344: bad argument #1 to 'ipairs' (table expected, got nil)" +(3) LÖVE function at file 'boot.lua:352' (best guess) + Local variables: + errhand = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) + handler = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) +(4) global C function 'ipairs' +(5) Lua field 'calculate_context' at Steamodded file 'src/utils.lua:1344' + Local variables: + context = table: 0x087d2c40 {main_eval:true, buying_card:true, cardarea:table: 0x08951050, card:table: 0x0ab94cd0 (more...)} + return_table = nil + (for generator) = C function: builtin#6 + (for state) = table: 0x087d2d50 {1:table: 0x08951050, 2:table: 0x08969998, 3:table: 0x0882bdc8} + (for control) = number: 1 + _ = number: 1 + area = table: 0x08951050 {click_offset:table: 0x085b4790, children:table: 0x08d7dcb8, shuffle_amt:0 (more...)} + (for generator) = C function: builtin#6 + (for state) = table: 0x092b1000 {1:table: 0x0ab94cd0} + (for control) = number: 1 + _ = number: 1 + _card = table: 0x0ab94cd0 {added_to_deck:true, from_area:table: 0x13fe29d0, click_offset:table: 0x08c21190 (more...)} + eval = table: 0x087d2d98 {} + post = nil + effects = table: 0x087d36c8 {1:table: 0x087d2d98} +(6) Lua field 'func' at file 'functions/button_callbacks.lua:2487' +(7) Lua method 'handle' at file 'engine/event.lua:55' + Local variables: + self = table: 0x0bab9118 {start_timer:true, timer:TOTAL, blockable:true, trigger:after, func:function: 0x0bab90f0 (more...)} + _results = table: 0x0a0dda10 {blocking:true, pause_skip:false, time_done:true, completed:false} +(8) Lua method 'update' at file 'engine/event.lua:182' + Local variables: + self = table: 0x0a0dfdd8 {queue_last_processed:59.533333333331, queues:table: 0x0a0dfe00, queue_dt:0.016666666666667 (more...)} + dt = number: 0.00607273 + forced = nil + (for generator) = C function: next + (for state) = table: 0x0a0dfe00 {unlock:table: 0x0a0dfe28, other:table: 0x0a0e02a0, tutorial:table: 0x0a0dfe78 (more...)} + (for control) = number: nan + k = string: "base" + v = table: 0x0a0dfe50 {1:table: 0x09eeb660, 2:table: 0x0bab9118, 3:table: 0x089b3e68} + blocked = boolean: false + i = number: 2 + results = table: 0x0a0dda10 {blocking:true, pause_skip:false, time_done:true, completed:false} +(9) Lua upvalue 'gameUpdateRef' at file 'game.lua:2740' + Local variables: + self = table: 0x042376f8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x0861f7f0 (more...)} + dt = number: 0.00607273 + http_resp = nil +(10) Lua upvalue 'upd' at Steamodded file 'src/ui.lua:84' + Local variables: + self = table: 0x042376f8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x0861f7f0 (more...)} + dt = number: 0.00607273 +(11) Lua upvalue 'upd' at file 'main.lua:4094' + Local variables: + self = table: 0x042376f8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x0861f7f0 (more...)} + dt = number: 0.00607273 +(12) Lua upvalue 'upd' at file 'Items/Blinds.lua:1310' (from mod with id Cryptid) + Local variables: + self = table: 0x042376f8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x0861f7f0 (more...)} + dt = number: 0.00607273 +(13) Lua upvalue 'upd' at file 'Items/CodeCards.lua:4106' (from mod with id Cryptid) + Local variables: + self = table: 0x042376f8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x0861f7f0 (more...)} + dt = number: 0.00607273 +(14) Lua upvalue 'upd' at file 'Items/Decks.lua:429' (from mod with id Cryptid) + Local variables: + self = table: 0x042376f8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x0861f7f0 (more...)} + dt = number: 0.00607273 +(15) Lua upvalue 'upd' at file 'Items/MiscJokers.lua:6658' (from mod with id Cryptid) + Local variables: + self = table: 0x042376f8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x0861f7f0 (more...)} + dt = number: 0.00607273 +(16) Lua method 'update' at file 'Cryptid.lua:2948' (from mod with id Cryptid) + Local variables: + self = table: 0x042376f8 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x0861f7f0 (more...)} + dt = number: 0.00607273 +(17) Lua upvalue 'love_update_ref' at file 'main.lua:1146' + Local variables: + dt = number: 0.00607273 +(18) Lua upvalue 'oldupd' at file 'main.lua:3038' + Local variables: + dt = number: 0.00607273 +(19) Lua field 'update' at file 'main.lua:4121' + Local variables: + dt = number: 0.00607273 +(20) Lua function '?' at file 'main.lua:1079' (best guess) +(21) global C function 'xpcall' +(22) LÖVE function at file 'boot.lua:377' (best guess) + Local variables: + func = Lua function '?' (defined at line 1050 of chunk main.lua) + inerror = boolean: true + deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"]) + earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"]) + +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-02-11 01:23:05 :: INFO :: StackTrace :: Additional Context: +Balatro Version: 1.0.1n-FULL +Modded Version: 1.0.0~ALPHA-1410b-STEAMODDED +LÖVE Version: 11.5.0 +Lovely Version: 0.6.0 +Platform: Windows +Steamodded Mods: + 1: J Cursor by Jie65535, MarioMak967 [ID: JCursor] + 2: Cryptid by MathIsFun_, Cryptid and Balatro Discords [ID: Cryptid, Priority: 1e+299, Version: 0.5.3a, Uses Lovely] + 3: UnStableEX by Kirbio [ID: UnStableEX, Priority: 99999, Version: 0.2.2a] + 4: UnStable by Kirbio, RamChops Games [ID: UnStable, Priority: 777, Version: 1.1.2a, Uses Lovely] + 5: Talisman by MathIsFun_, Mathguy24, jenwalter666, cg-223 [ID: Talisman, Version: 2.0.2, Uses Lovely] + Break Infinity: omeganum + 6: Cartomancer by stupxd aka stupid [ID: cartomancer, Priority: 69, Version: 4.10, Uses Lovely] + 7: Handy by SleepyG11 [ID: Handy, Version: 1.1.5, Uses Lovely] + 8: Incantation by jenwalter666, MathIsFun_ [ID: incantation, Priority: 9e+301, Version: 0.5.10, Uses Lovely] + 9: DebugPlus by WilsontheWolf [ID: DebugPlus, Version: 1.3.0, Uses Lovely] +Lovely Mods: diff --git a/lovely/log/lovely-2025.02.11-01.23.18.log b/lovely/log/lovely-2025.02.11-01.23.18.log new file mode 100644 index 0000000..cfc3ab5 --- /dev/null +++ b/lovely/log/lovely-2025.02.11-01.23.18.log @@ -0,0 +1,326 @@ +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 145ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 35 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 13 patches to 'engine/controller.lua' +INFO - [♥] Applied 15 patches to 'back.lua' +INFO - [♥] Applied 15 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 48 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 85 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 110 patches to 'functions/UI_definitions.lua' +WARN - [♥] Pattern '--calculate the card edition effects\nif effects[ii].edition then\n hand_chips = mod_chips(hand_chips + (effects[ii].edition.chip_mod or 0))\n mult = mult + (effects[ii].edition.mult_mod or 0)\n mult = mod_mult(mult*(effects[ii].edition.x_mult_mod or 1))\n update_hand_text({delay = 0}, {\n chips = effects[ii].edition.chip_mod and hand_chips or nil,\n mult = (effects[ii].edition.mult_mod or effects[ii].edition.x_mult_mod) and mult or nil,\n })\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, {\n message = (effects[ii].edition.chip_mod and localize{type=\'variable\',key=\'a_chips\',vars={effects[ii].edition.chip_mod}}) or\n (effects[ii].edition.mult_mod and localize{type=\'variable\',key=\'a_mult\',vars={effects[ii].edition.mult_mod}}) or\n (effects[ii].edition.x_mult_mod and localize{type=\'variable\',key=\'a_xmult\',vars={effects[ii].edition.x_mult_mod}}),\n chip_mod = effects[ii].edition.chip_mod,\n mult_mod = effects[ii].edition.mult_mod,\n x_mult_mod = effects[ii].edition.x_mult_mod,\n colour = G.C.DARK_EDITION,\n edition = true})\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern ' scoring_hand[i].lucky_trigger = nil\n\n for ii = 1, #effects do\n --If chips added, do chip add event and add the chips to the total\n if effects[ii].chips then \n if effects[ii].card then juice_card(effects[ii].card) end\n hand_chips = mod_chips(hand_chips + effects[ii].chips)\n update_hand_text({delay = 0}, {chips = hand_chips})\n card_eval_status_text(scoring_hand[i], \'chips\', effects[ii].chips, percent)\n end\n\n --If mult added, do mult add event and add the mult to the total\n if effects[ii].mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult + effects[ii].mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'mult\', effects[ii].mult, percent)\n end\n\n --If play dollars added, add dollars to total\n if effects[ii].p_dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].p_dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].p_dollars, percent)\n end\n\n --If dollars added, add dollars to total\n if effects[ii].dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].dollars, percent)\n end\n\n --Any extra effects\n if effects[ii].extra then \n if effects[ii].card then juice_card(effects[ii].card) end\n local extras = {mult = false, hand_chips = false}\n if effects[ii].extra.mult_mod then mult =mod_mult( mult + effects[ii].extra.mult_mod);extras.mult = true end\n if effects[ii].extra.chip_mod then hand_chips = mod_chips(hand_chips + effects[ii].extra.chip_mod);extras.hand_chips = true end\n if effects[ii].extra.swap then \n local old_mult = mult\n mult = mod_mult(hand_chips)\n hand_chips = mod_chips(old_mult)\n extras.hand_chips = true; extras.mult = true\n end\n if effects[ii].extra.func then effects[ii].extra.func() end\n update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult})\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, effects[ii].extra)\n end\n\n --If x_mult added, do mult add event and mult the mult to the total\n if effects[ii].x_mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult*effects[ii].x_mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)\n end\n\n\n end\n end\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local percent = (i-0.999)/(#G.hand.cards-0.998) + (j-1)*0.1' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.effect ~= \'Stone Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i = 1, #G.jokers.cards do' on target 'functions/state_events.lua' resulted in no matches +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 +WARN - [♥] Pattern 'card_eval_status_text(_card, \'jokers\', nil, percent, nil, effects.jokers)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(G.hand.cards[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.hand.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if reps[j] ~= 1 then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if destroyed then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if cards_destroyed[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local edition_effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.jokers.cards + #G.consumeables.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local hand_space = e or math.min(#G.deck.cards, G.hand.config.card_limit - #G.hand.cards)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] 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' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].card then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects.jokers.Xmult_mod then mult = mod_mult(mult*effects.jokers.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effect.Xmult_mod then mult = mod_mult(mult*effect.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].message then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern '--calculate the card edition effects' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].edition.p_dollars_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if edition_effects.jokers.x_mult_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if destroyed then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Regex '(?[\\t ]*)if destroyed then \\n' on target 'functions/state_events.lua' resulted in no matches +INFO - [♥] Applied 62 patches to 'functions/state_events.lua' +WARN - [♥] Pattern 'function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end)' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern '{n=G.UIT.T, config={text = localize(\'$\')..config.dollars, scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \'Cryptid\' then loc_vars = {_c.config.extra}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \"Clearance Sale\" or _c.name == \"Liquidation\" then loc_vars = {_c.config.extra}' 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 - [♥] Pattern 'if v == \'negative_consumable\' then info_queue[#info_queue+1] = {key = \'e_negative_consumable\', set = \'Edition\', config = {extra = 1}} end' 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 141 patches to 'functions/common_events.lua' +WARN - [♥] Pattern 'if card.area and (not nc or card.area == G.pack_cards) then card.area:remove_card(card) end\n' on target 'functions/button_callbacks.lua' resulted in no matches +INFO - [♥] Applied 65 patches to 'functions/button_callbacks.lua' +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 center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'self:calculate_joker{selling_self = true}' on target 'card.lua' resulted in no matches +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 self.ability.name:find(\'Arcana\') then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Regex 'message = localize\\{type = \'variable\', key = \'a_xmult\', vars = \\{G.P_CENTERS.v_observatory.config.extra}},\\n\\s+Xmult_mod = G.P_CENTERS.v_observatory.config.extra' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.name == \'The Hermit\' or self.ability.consumeable.hand_type or self.ability.name == \'Temperance\' or self.ability.name == \'Black Hole\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.queue_negative_removal then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 +WARN - [♥] Pattern 'elseif self.ability.name == \'Blueprint\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.name == \'Blueprint\' or self.ability.name == \'Brainstorm\' then' on target 'card.lua' resulted in no matches +INFO - [♥] Applied 227 patches to 'card.lua' +WARN - [♥] Pattern '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)' on target 'cardarea.lua' resulted in no matches +INFO - [♥] Applied 19 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-02-11 01:23:22 :: 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-02-11 01:23:23 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-02-11 01:23:23 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-02-11 01:23:23 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-02-11 01:23:23 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:23:23 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: JCursor loaded! +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnStable] - Starting Unstable +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Spades with the type suit_black +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Clubs with the type suit_black +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Hearts with the type suit_red +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [Unstable_Suit] - Registering suit: Diamonds with the type suit_red +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Starting UnstableEX +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_??? +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_e +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_0 +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_161 +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_r2 +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_13 +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_12 +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_11 +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_21 +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_Pi +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_25 +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_0.5 +INFO - [G] 2025-02-11 01:23:23 :: DEBUG :: DefaultLogger :: [UnstableEX] - Injecting the graphic for rank unstb_1 +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-02-11 01:23:23 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-02-11 01:23:23 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-02-11 01:23:23 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.723 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0065] Injected Atlas in 1293.110 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0029] Injected Sound in 18.756 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0032] Injected Stake in 0.799 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0008] Injected Rarity in 0.018 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0008] Injected ObjectType in 0.075 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0527] Injected Center in 2.810 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0012] Injected Undiscovered Sprite in 0.009 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0027] Injected Blind in 0.040 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0012] Injected Seal in 0.351 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0004] Injected Suit in 0.139 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0026] Injected Rank in 0.107 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0020] Injected DeckSkin in 0.178 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.105 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0031] Injected Challenge in 0.068 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0028] Injected Tag in 0.075 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0009] Injected Sticker in 0.118 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0009] Injected Shader in 52.104 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0001] Injected Keybind in 0.019 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0020] Injected Achievement in 0.067 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 12.056 ms +INFO - [G] 2025-02-11 01:23:24 :: INFO :: TIMER :: [0011] Injected Event in 0.012 ms +INFO - [G] 2025-02-11 01:23:24 :: DEBUG :: DefaultLogger :: [UnStable] - Initialize Remaining Previous Rank Data +INFO - [G] 2025-02-11 01:23:24 :: DEBUG :: DefaultLogger :: [UnStable] - Start initializing localization-independent info +INFO - [G] 2025-02-11 01:23:24 :: DEBUG :: DefaultLogger :: [UnStable] - Finished initializing localization-independent info +INFO - [G] 2025-02-11 01:23:24 :: DEBUG :: DefaultLogger :: [UnstableEX] - Inject new nominal code override for Cryptid +INFO - [G] 2025-02-11 01:23:24 :: DEBUG :: DefaultLogger :: [UnstableEX] - Inject Blind effects for Cryptid +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews +INFO - [G] line not found +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-02-11 01:24:19 :: ERROR :: StackTrace :: Oops! The game crashed +[SMODS _ "src/utils.lua"]:1344: bad argument #1 to 'ipairs' (table expected, got nil) +Stack Traceback +=============== +(1) Lua upvalue 'orig' at file 'main.lua:756' + Local variables: + msg = string: "[SMODS _ \"src/utils.lua\"]:1344: bad argument #1 to 'ipairs' (table expected, got nil)" + (*temporary) = Lua function '?' (defined at line 31 of chunk [SMODS _ "src/logging.lua"]) + (*temporary) = string: "Oops! The game crashed\ +" +(2) Lua local 'handler' at file 'console.lua:551' (from lovely module debugplus.console) + Local variables: + msg = string: "[SMODS _ \"src/utils.lua\"]:1344: bad argument #1 to 'ipairs' (table expected, got nil)" +(3) LÖVE function at file 'boot.lua:352' (best guess) + Local variables: + errhand = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) + handler = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) +(4) global C function 'ipairs' +(5) Lua field 'calculate_context' at Steamodded file 'src/utils.lua:1344' + Local variables: + context = table: 0x08849928 {main_eval:true, buying_card:true, cardarea:table: 0x097683b0, card:table: 0x087620f0 (more...)} + return_table = nil + (for generator) = C function: builtin#6 + (for state) = table: 0x046227c8 {1:table: 0x097683b0, 2:table: 0x06749e98, 3:table: 0x067f2050} + (for control) = number: 1 + _ = number: 1 + area = table: 0x097683b0 {click_offset:table: 0x099e1010, children:table: 0x099e1180, shuffle_amt:0 (more...)} + (for generator) = C function: builtin#6 + (for state) = table: 0x099e1158 {1:table: 0x087620f0} + (for control) = number: 1 + _ = number: 1 + _card = table: 0x087620f0 {added_to_deck:true, from_area:table: 0x0a793f10, click_offset:table: 0x08762498 (more...)} + eval = table: 0x04622810 {} + post = nil + effects = table: 0x04fb4280 {1:table: 0x04622810} +(6) Lua field 'func' at file 'functions/button_callbacks.lua:2487' +(7) Lua method 'handle' at file 'engine/event.lua:55' + Local variables: + self = table: 0x0a783800 {start_timer:true, timer:TOTAL, blockable:true, trigger:after, func:function: 0x10b8a300 (more...)} + _results = table: 0x14613508 {blocking:true, pause_skip:false, time_done:true, completed:false} +(8) Lua method 'update' at file 'engine/event.lua:182' + Local variables: + self = table: 0x0a0c6d40 {queue_last_processed:54.716666666665, queues:table: 0x0a0c6d68, queue_dt:0.016666666666667 (more...)} + dt = number: 0.00607149 + forced = nil + (for generator) = C function: next + (for state) = table: 0x0a0c6d68 {unlock:table: 0x0a0c6d90, other:table: 0x0a0c7208, tutorial:table: 0x0a0c6de0 (more...)} + (for control) = number: nan + k = string: "base" + v = table: 0x0a0c6db8 {1:table: 0x08fe8578, 2:table: 0x0a783800, 3:table: 0x0db7e358} + blocked = boolean: false + i = number: 2 + results = table: 0x14613508 {blocking:true, pause_skip:false, time_done:true, completed:false} +(9) Lua upvalue 'gameUpdateRef' at file 'game.lua:2740' + Local variables: + self = table: 0x042273c0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x13e72bd0 (more...)} + dt = number: 0.00607149 + http_resp = nil +(10) Lua upvalue 'upd' at Steamodded file 'src/ui.lua:84' + Local variables: + self = table: 0x042273c0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x13e72bd0 (more...)} + dt = number: 0.00607149 +(11) Lua upvalue 'upd' at file 'main.lua:4094' + Local variables: + self = table: 0x042273c0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x13e72bd0 (more...)} + dt = number: 0.00607149 +(12) Lua upvalue 'upd' at file 'Items/Blinds.lua:1310' (from mod with id Cryptid) + Local variables: + self = table: 0x042273c0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x13e72bd0 (more...)} + dt = number: 0.00607149 +(13) Lua upvalue 'upd' at file 'Items/CodeCards.lua:4106' (from mod with id Cryptid) + Local variables: + self = table: 0x042273c0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x13e72bd0 (more...)} + dt = number: 0.00607149 +(14) Lua upvalue 'upd' at file 'Items/Decks.lua:429' (from mod with id Cryptid) + Local variables: + self = table: 0x042273c0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x13e72bd0 (more...)} + dt = number: 0.00607149 +(15) Lua upvalue 'upd' at file 'Items/MiscJokers.lua:6658' (from mod with id Cryptid) + Local variables: + self = table: 0x042273c0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x13e72bd0 (more...)} + dt = number: 0.00607149 +(16) Lua method 'update' at file 'Cryptid.lua:2948' (from mod with id Cryptid) + Local variables: + self = table: 0x042273c0 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x13e72bd0 (more...)} + dt = number: 0.00607149 +(17) Lua upvalue 'love_update_ref' at file 'main.lua:1146' + Local variables: + dt = number: 0.00607149 +(18) Lua upvalue 'oldupd' at file 'main.lua:3038' + Local variables: + dt = number: 0.00607149 +(19) Lua field 'update' at file 'main.lua:4121' + Local variables: + dt = number: 0.00607149 +(20) Lua function '?' at file 'main.lua:1079' (best guess) +(21) global C function 'xpcall' +(22) LÖVE function at file 'boot.lua:377' (best guess) + Local variables: + func = Lua function '?' (defined at line 1050 of chunk main.lua) + inerror = boolean: true + deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"]) + earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"]) + +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-02-11 01:24:19 :: INFO :: StackTrace :: Additional Context: +Balatro Version: 1.0.1n-FULL +Modded Version: 1.0.0~ALPHA-1410b-STEAMODDED +LÖVE Version: 11.5.0 +Lovely Version: 0.6.0 +Platform: Windows +Steamodded Mods: + 1: J Cursor by Jie65535, MarioMak967 [ID: JCursor] + 2: Cryptid by MathIsFun_, Cryptid and Balatro Discords [ID: Cryptid, Priority: 1e+299, Version: 0.5.3a, Uses Lovely] + 3: UnStableEX by Kirbio [ID: UnStableEX, Priority: 99999, Version: 0.2.2a] + 4: UnStable by Kirbio, RamChops Games [ID: UnStable, Priority: 777, Version: 1.1.2a, Uses Lovely] + 5: Talisman by MathIsFun_, Mathguy24, jenwalter666, cg-223 [ID: Talisman, Version: 2.0.2, Uses Lovely] + Break Infinity: omeganum + 6: Cartomancer by stupxd aka stupid [ID: cartomancer, Priority: 69, Version: 4.10, Uses Lovely] + 7: Handy by SleepyG11 [ID: Handy, Version: 1.1.5, Uses Lovely] + 8: Incantation by jenwalter666, MathIsFun_ [ID: incantation, Priority: 9e+301, Version: 0.5.10, Uses Lovely] + 9: DebugPlus by WilsontheWolf [ID: DebugPlus, Version: 1.3.0, Uses Lovely] +Lovely Mods: diff --git a/lovely/log/lovely-2025.02.11-01.24.59.log b/lovely/log/lovely-2025.02.11-01.24.59.log new file mode 100644 index 0000000..fc3d893 --- /dev/null +++ b/lovely/log/lovely-2025.02.11-01.24.59.log @@ -0,0 +1,298 @@ +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 134ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 35 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 13 patches to 'engine/controller.lua' +INFO - [♥] Applied 15 patches to 'back.lua' +INFO - [♥] Applied 15 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 48 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 84 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 110 patches to 'functions/UI_definitions.lua' +WARN - [♥] Pattern '--calculate the card edition effects\nif effects[ii].edition then\n hand_chips = mod_chips(hand_chips + (effects[ii].edition.chip_mod or 0))\n mult = mult + (effects[ii].edition.mult_mod or 0)\n mult = mod_mult(mult*(effects[ii].edition.x_mult_mod or 1))\n update_hand_text({delay = 0}, {\n chips = effects[ii].edition.chip_mod and hand_chips or nil,\n mult = (effects[ii].edition.mult_mod or effects[ii].edition.x_mult_mod) and mult or nil,\n })\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, {\n message = (effects[ii].edition.chip_mod and localize{type=\'variable\',key=\'a_chips\',vars={effects[ii].edition.chip_mod}}) or\n (effects[ii].edition.mult_mod and localize{type=\'variable\',key=\'a_mult\',vars={effects[ii].edition.mult_mod}}) or\n (effects[ii].edition.x_mult_mod and localize{type=\'variable\',key=\'a_xmult\',vars={effects[ii].edition.x_mult_mod}}),\n chip_mod = effects[ii].edition.chip_mod,\n mult_mod = effects[ii].edition.mult_mod,\n x_mult_mod = effects[ii].edition.x_mult_mod,\n colour = G.C.DARK_EDITION,\n edition = true})\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern ' scoring_hand[i].lucky_trigger = nil\n\n for ii = 1, #effects do\n --If chips added, do chip add event and add the chips to the total\n if effects[ii].chips then \n if effects[ii].card then juice_card(effects[ii].card) end\n hand_chips = mod_chips(hand_chips + effects[ii].chips)\n update_hand_text({delay = 0}, {chips = hand_chips})\n card_eval_status_text(scoring_hand[i], \'chips\', effects[ii].chips, percent)\n end\n\n --If mult added, do mult add event and add the mult to the total\n if effects[ii].mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult + effects[ii].mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'mult\', effects[ii].mult, percent)\n end\n\n --If play dollars added, add dollars to total\n if effects[ii].p_dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].p_dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].p_dollars, percent)\n end\n\n --If dollars added, add dollars to total\n if effects[ii].dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].dollars, percent)\n end\n\n --Any extra effects\n if effects[ii].extra then \n if effects[ii].card then juice_card(effects[ii].card) end\n local extras = {mult = false, hand_chips = false}\n if effects[ii].extra.mult_mod then mult =mod_mult( mult + effects[ii].extra.mult_mod);extras.mult = true end\n if effects[ii].extra.chip_mod then hand_chips = mod_chips(hand_chips + effects[ii].extra.chip_mod);extras.hand_chips = true end\n if effects[ii].extra.swap then \n local old_mult = mult\n mult = mod_mult(hand_chips)\n hand_chips = mod_chips(old_mult)\n extras.hand_chips = true; extras.mult = true\n end\n if effects[ii].extra.func then effects[ii].extra.func() end\n update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult})\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, effects[ii].extra)\n end\n\n --If x_mult added, do mult add event and mult the mult to the total\n if effects[ii].x_mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult*effects[ii].x_mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)\n end\n\n\n end\n end\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local percent = (i-0.999)/(#G.hand.cards-0.998) + (j-1)*0.1' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.effect ~= \'Stone Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i = 1, #G.jokers.cards do' on target 'functions/state_events.lua' resulted in no matches +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 +WARN - [♥] Pattern 'card_eval_status_text(_card, \'jokers\', nil, percent, nil, effects.jokers)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(G.hand.cards[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.hand.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if reps[j] ~= 1 then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if destroyed then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if cards_destroyed[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local edition_effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.jokers.cards + #G.consumeables.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local hand_space = e or math.min(#G.deck.cards, G.hand.config.card_limit - #G.hand.cards)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] 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' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].card then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects.jokers.Xmult_mod then mult = mod_mult(mult*effects.jokers.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effect.Xmult_mod then mult = mod_mult(mult*effect.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].message then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern '--calculate the card edition effects' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].edition.p_dollars_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if edition_effects.jokers.x_mult_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Regex '(?[\\t ]*)if destroyed then \\n' on target 'functions/state_events.lua' resulted in no matches +INFO - [♥] Applied 61 patches to 'functions/state_events.lua' +WARN - [♥] Pattern 'function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end)' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern '{n=G.UIT.T, config={text = localize(\'$\')..config.dollars, scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \'Cryptid\' then loc_vars = {_c.config.extra}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \"Clearance Sale\" or _c.name == \"Liquidation\" then loc_vars = {_c.config.extra}' 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 - [♥] Pattern 'if v == \'negative_consumable\' then info_queue[#info_queue+1] = {key = \'e_negative_consumable\', set = \'Edition\', config = {extra = 1}} end' 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 139 patches to 'functions/common_events.lua' +WARN - [♥] Pattern 'if card.area and (not nc or card.area == G.pack_cards) then card.area:remove_card(card) end\n' on target 'functions/button_callbacks.lua' resulted in no matches +INFO - [♥] Applied 63 patches to 'functions/button_callbacks.lua' +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 center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'self:calculate_joker{selling_self = true}' on target 'card.lua' resulted in no matches +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 self.ability.name:find(\'Arcana\') then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Regex 'message = localize\\{type = \'variable\', key = \'a_xmult\', vars = \\{G.P_CENTERS.v_observatory.config.extra}},\\n\\s+Xmult_mod = G.P_CENTERS.v_observatory.config.extra' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.name == \'The Hermit\' or self.ability.consumeable.hand_type or self.ability.name == \'Temperance\' or self.ability.name == \'Black Hole\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.queue_negative_removal then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 223 patches to 'card.lua' +WARN - [♥] Pattern '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)' on target 'cardarea.lua' resulted in no matches +INFO - [♥] Applied 19 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-02-11 01:25:02 :: 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-02-11 01:25:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-02-11 01:25:03 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-02-11 01:25:03 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-02-11 01:25:03 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-02-11 01:25:03 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-02-11 01:25:03 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-02-11 01:25:03 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.861 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0032] Injected Atlas in 791.179 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0026] Injected Sound in 17.836 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0032] Injected Stake in 0.832 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0008] Injected Rarity in 0.038 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.052 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0393] Injected Center in 2.042 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.009 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0027] Injected Blind in 0.051 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0006] Injected Seal in 0.295 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0004] Injected Suit in 0.102 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0013] Injected Rank in 0.064 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0020] Injected DeckSkin in 0.148 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.097 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0031] Injected Challenge in 0.034 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0028] Injected Tag in 0.111 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0009] Injected Sticker in 0.156 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0009] Injected Shader in 55.077 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0001] Injected Keybind in 0.005 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0020] Injected Achievement in 0.068 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 6.540 ms +INFO - [G] 2025-02-11 01:25:04 :: INFO :: TIMER :: [0011] Injected Event in 0.014 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews +INFO - [G] ERROR LOADING GAME: Card area 'shop_booster' 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_jokers' not instantiated before load +INFO - [G] line not found +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-02-11 01:25:13 :: ERROR :: StackTrace :: Oops! The game crashed +[SMODS _ "src/utils.lua"]:1344: bad argument #1 to 'ipairs' (table expected, got nil) +Stack Traceback +=============== +(1) Lua upvalue 'orig' at file 'main.lua:756' + Local variables: + msg = string: "[SMODS _ \"src/utils.lua\"]:1344: bad argument #1 to 'ipairs' (table expected, got nil)" + (*temporary) = Lua function '?' (defined at line 31 of chunk [SMODS _ "src/logging.lua"]) + (*temporary) = string: "Oops! The game crashed\ +" +(2) Lua local 'handler' at file 'console.lua:551' (from lovely module debugplus.console) + Local variables: + msg = string: "[SMODS _ \"src/utils.lua\"]:1344: bad argument #1 to 'ipairs' (table expected, got nil)" +(3) LÖVE function at file 'boot.lua:352' (best guess) + Local variables: + errhand = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) + handler = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) +(4) global C function 'ipairs' +(5) Lua field 'calculate_context' at Steamodded file 'src/utils.lua:1344' + Local variables: + context = table: 0x0607fda0 {main_eval:true, buying_card:true, cardarea:table: 0x14235fe8, card:table: 0x04360488 (more...)} + return_table = nil + (for generator) = C function: builtin#6 + (for state) = table: 0x0607fe30 {1:table: 0x14235fe8, 2:table: 0x14222340, 3:table: 0x1969f1d8} + (for control) = number: 1 + _ = number: 1 + area = table: 0x14235fe8 {click_offset:table: 0x14236358, children:table: 0x0450f6b0, shuffle_amt:0 (more...)} + (for generator) = C function: builtin#6 + (for state) = table: 0x0450f688 {1:table: 0x04360488} + (for control) = number: 1 + _ = number: 1 + _card = table: 0x04360488 {added_to_deck:true, from_area:table: 0x0628ccf8, click_offset:table: 0x1bdd8720 (more...)} + eval = table: 0x0607fe78 {} + post = nil + effects = table: 0x13aaac08 {1:table: 0x0607fe78} +(6) Lua field 'func' at file 'functions/button_callbacks.lua:2480' +(7) Lua method 'handle' at file 'engine/event.lua:55' + Local variables: + self = table: 0x044e9e20 {start_timer:true, timer:TOTAL, blockable:true, trigger:after, func:function: 0x044e9df8 (more...)} + _results = table: 0x0419aa68 {blocking:true, pause_skip:false, time_done:true, completed:false} +(8) Lua method 'update' at file 'engine/event.lua:182' + Local variables: + self = table: 0x09c988e8 {queue_last_processed:9.1833333333334, queues:table: 0x09c98910, queue_dt:0.016666666666667 (more...)} + dt = number: 0.00606218 + forced = nil + (for generator) = C function: next + (for state) = table: 0x09c98910 {unlock:table: 0x09c98938, other:table: 0x09c98db0, tutorial:table: 0x09c98988 (more...)} + (for control) = number: nan + k = string: "base" + v = table: 0x09c98960 {1:table: 0x13acfe10, 2:table: 0x044e9e20, 3:table: 0x0bdff4c8} + blocked = boolean: false + i = number: 2 + results = table: 0x0419aa68 {blocking:true, pause_skip:false, time_done:true, completed:false} +(9) Lua upvalue 'gameUpdateRef' at file 'game.lua:2739' + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06408c98 (more...)} + dt = number: 0.00606218 + http_resp = nil +(10) Lua upvalue 'upd' at Steamodded file 'src/ui.lua:84' + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06408c98 (more...)} + dt = number: 0.00606218 +(11) Lua upvalue 'upd' at file 'main.lua:4094' + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06408c98 (more...)} + dt = number: 0.00606218 +(12) Lua upvalue 'upd' at file 'Items/Blinds.lua:1310' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06408c98 (more...)} + dt = number: 0.00606218 +(13) Lua upvalue 'upd' at file 'Items/CodeCards.lua:4106' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06408c98 (more...)} + dt = number: 0.00606218 +(14) Lua upvalue 'upd' at file 'Items/Decks.lua:429' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06408c98 (more...)} + dt = number: 0.00606218 +(15) Lua upvalue 'upd' at file 'Items/MiscJokers.lua:6658' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06408c98 (more...)} + dt = number: 0.00606218 +(16) Lua method 'update' at file 'Cryptid.lua:2948' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x06408c98 (more...)} + dt = number: 0.00606218 +(17) Lua upvalue 'love_update_ref' at file 'main.lua:1146' + Local variables: + dt = number: 0.00606218 +(18) Lua upvalue 'oldupd' at file 'main.lua:3038' + Local variables: + dt = number: 0.00606218 +(19) Lua field 'update' at file 'main.lua:4121' + Local variables: + dt = number: 0.00606218 +(20) Lua function '?' at file 'main.lua:1079' (best guess) +(21) global C function 'xpcall' +(22) LÖVE function at file 'boot.lua:377' (best guess) + Local variables: + func = Lua function '?' (defined at line 1050 of chunk main.lua) + inerror = boolean: true + deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"]) + earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"]) + +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-02-11 01:25:13 :: INFO :: StackTrace :: Additional Context: +Balatro Version: 1.0.1n-FULL +Modded Version: 1.0.0~ALPHA-1410b-STEAMODDED +LÖVE Version: 11.5.0 +Lovely Version: 0.6.0 +Platform: Windows +Steamodded Mods: + 1: J Cursor by Jie65535, MarioMak967 [ID: JCursor] + 2: Cryptid by MathIsFun_, Cryptid and Balatro Discords [ID: Cryptid, Priority: 1e+299, Version: 0.5.3a, Uses Lovely] + 3: Talisman by MathIsFun_, Mathguy24, jenwalter666, cg-223 [ID: Talisman, Version: 2.0.2, Uses Lovely] + Break Infinity: omeganum + 4: Cartomancer by stupxd aka stupid [ID: cartomancer, Priority: 69, Version: 4.10, Uses Lovely] + 5: Handy by SleepyG11 [ID: Handy, Version: 1.1.5, Uses Lovely] + 6: Incantation by jenwalter666, MathIsFun_ [ID: incantation, Priority: 9e+301, Version: 0.5.10, Uses Lovely] + 7: DebugPlus by WilsontheWolf [ID: DebugPlus, Version: 1.3.0, Uses Lovely] +Lovely Mods: diff --git a/lovely/log/lovely-2025.02.11-01.26.34.log b/lovely/log/lovely-2025.02.11-01.26.34.log new file mode 100644 index 0000000..d375a2e --- /dev/null +++ b/lovely/log/lovely-2025.02.11-01.26.34.log @@ -0,0 +1,298 @@ +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 172ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 35 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 13 patches to 'engine/controller.lua' +INFO - [♥] Applied 15 patches to 'back.lua' +INFO - [♥] Applied 15 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 48 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 84 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 110 patches to 'functions/UI_definitions.lua' +WARN - [♥] Pattern '--calculate the card edition effects\nif effects[ii].edition then\n hand_chips = mod_chips(hand_chips + (effects[ii].edition.chip_mod or 0))\n mult = mult + (effects[ii].edition.mult_mod or 0)\n mult = mod_mult(mult*(effects[ii].edition.x_mult_mod or 1))\n update_hand_text({delay = 0}, {\n chips = effects[ii].edition.chip_mod and hand_chips or nil,\n mult = (effects[ii].edition.mult_mod or effects[ii].edition.x_mult_mod) and mult or nil,\n })\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, {\n message = (effects[ii].edition.chip_mod and localize{type=\'variable\',key=\'a_chips\',vars={effects[ii].edition.chip_mod}}) or\n (effects[ii].edition.mult_mod and localize{type=\'variable\',key=\'a_mult\',vars={effects[ii].edition.mult_mod}}) or\n (effects[ii].edition.x_mult_mod and localize{type=\'variable\',key=\'a_xmult\',vars={effects[ii].edition.x_mult_mod}}),\n chip_mod = effects[ii].edition.chip_mod,\n mult_mod = effects[ii].edition.mult_mod,\n x_mult_mod = effects[ii].edition.x_mult_mod,\n colour = G.C.DARK_EDITION,\n edition = true})\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern ' scoring_hand[i].lucky_trigger = nil\n\n for ii = 1, #effects do\n --If chips added, do chip add event and add the chips to the total\n if effects[ii].chips then \n if effects[ii].card then juice_card(effects[ii].card) end\n hand_chips = mod_chips(hand_chips + effects[ii].chips)\n update_hand_text({delay = 0}, {chips = hand_chips})\n card_eval_status_text(scoring_hand[i], \'chips\', effects[ii].chips, percent)\n end\n\n --If mult added, do mult add event and add the mult to the total\n if effects[ii].mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult + effects[ii].mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'mult\', effects[ii].mult, percent)\n end\n\n --If play dollars added, add dollars to total\n if effects[ii].p_dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].p_dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].p_dollars, percent)\n end\n\n --If dollars added, add dollars to total\n if effects[ii].dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].dollars, percent)\n end\n\n --Any extra effects\n if effects[ii].extra then \n if effects[ii].card then juice_card(effects[ii].card) end\n local extras = {mult = false, hand_chips = false}\n if effects[ii].extra.mult_mod then mult =mod_mult( mult + effects[ii].extra.mult_mod);extras.mult = true end\n if effects[ii].extra.chip_mod then hand_chips = mod_chips(hand_chips + effects[ii].extra.chip_mod);extras.hand_chips = true end\n if effects[ii].extra.swap then \n local old_mult = mult\n mult = mod_mult(hand_chips)\n hand_chips = mod_chips(old_mult)\n extras.hand_chips = true; extras.mult = true\n end\n if effects[ii].extra.func then effects[ii].extra.func() end\n update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult})\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, effects[ii].extra)\n end\n\n --If x_mult added, do mult add event and mult the mult to the total\n if effects[ii].x_mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult*effects[ii].x_mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)\n end\n\n\n end\n end\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local percent = (i-0.999)/(#G.hand.cards-0.998) + (j-1)*0.1' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.effect ~= \'Stone Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i = 1, #G.jokers.cards do' on target 'functions/state_events.lua' resulted in no matches +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 +WARN - [♥] Pattern 'card_eval_status_text(_card, \'jokers\', nil, percent, nil, effects.jokers)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(G.hand.cards[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.hand.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if reps[j] ~= 1 then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if destroyed then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if cards_destroyed[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local edition_effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.jokers.cards + #G.consumeables.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local hand_space = e or math.min(#G.deck.cards, G.hand.config.card_limit - #G.hand.cards)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] 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' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].card then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects.jokers.Xmult_mod then mult = mod_mult(mult*effects.jokers.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effect.Xmult_mod then mult = mod_mult(mult*effect.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].message then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern '--calculate the card edition effects' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].edition.p_dollars_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if edition_effects.jokers.x_mult_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Regex '(?[\\t ]*)if destroyed then \\n' on target 'functions/state_events.lua' resulted in no matches +INFO - [♥] Applied 61 patches to 'functions/state_events.lua' +WARN - [♥] Pattern 'function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end)' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern '{n=G.UIT.T, config={text = localize(\'$\')..config.dollars, scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \'Cryptid\' then loc_vars = {_c.config.extra}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \"Clearance Sale\" or _c.name == \"Liquidation\" then loc_vars = {_c.config.extra}' 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 - [♥] Pattern 'if v == \'negative_consumable\' then info_queue[#info_queue+1] = {key = \'e_negative_consumable\', set = \'Edition\', config = {extra = 1}} end' 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 139 patches to 'functions/common_events.lua' +WARN - [♥] Pattern 'if card.area and (not nc or card.area == G.pack_cards) then card.area:remove_card(card) end\n' on target 'functions/button_callbacks.lua' resulted in no matches +INFO - [♥] Applied 63 patches to 'functions/button_callbacks.lua' +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 center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'self:calculate_joker{selling_self = true}' on target 'card.lua' resulted in no matches +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 self.ability.name:find(\'Arcana\') then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Regex 'message = localize\\{type = \'variable\', key = \'a_xmult\', vars = \\{G.P_CENTERS.v_observatory.config.extra}},\\n\\s+Xmult_mod = G.P_CENTERS.v_observatory.config.extra' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.name == \'The Hermit\' or self.ability.consumeable.hand_type or self.ability.name == \'Temperance\' or self.ability.name == \'Black Hole\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.queue_negative_removal then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 223 patches to 'card.lua' +WARN - [♥] Pattern '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)' on target 'cardarea.lua' resulted in no matches +INFO - [♥] Applied 19 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-02-11 01:26:37 :: 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-02-11 01:26:38 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-02-11 01:26:38 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-02-11 01:26:38 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-02-11 01:26:38 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-02-11 01:26:38 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-02-11 01:26:38 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-02-11 01:26:38 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.719 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0032] Injected Atlas in 781.089 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0026] Injected Sound in 17.477 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0032] Injected Stake in 0.616 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0008] Injected Rarity in 0.040 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.043 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0393] Injected Center in 1.956 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.009 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0027] Injected Blind in 0.093 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0006] Injected Seal in 0.181 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0004] Injected Suit in 0.071 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0013] Injected Rank in 0.059 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0020] Injected DeckSkin in 0.280 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.122 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0031] Injected Challenge in 0.190 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0028] Injected Tag in 0.339 ms +INFO - [G] 2025-02-11 01:26:39 :: INFO :: TIMER :: [0009] Injected Sticker in 0.682 ms +INFO - [G] 2025-02-11 01:26:40 :: INFO :: TIMER :: [0009] Injected Shader in 802.807 ms +INFO - [G] 2025-02-11 01:26:40 :: INFO :: TIMER :: [0001] Injected Keybind in 0.027 ms +INFO - [G] 2025-02-11 01:26:40 :: INFO :: TIMER :: [0020] Injected Achievement in 0.069 ms +INFO - [G] 2025-02-11 01:26:40 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 6.255 ms +INFO - [G] 2025-02-11 01:26:40 :: INFO :: TIMER :: [0011] Injected Event in 0.009 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews +INFO - [G] ERROR LOADING GAME: Card area 'shop_booster' 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_jokers' not instantiated before load +INFO - [G] line not found +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-02-11 01:26:56 :: ERROR :: StackTrace :: Oops! The game crashed +[SMODS _ "src/utils.lua"]:1344: bad argument #1 to 'ipairs' (table expected, got nil) +Stack Traceback +=============== +(1) Lua upvalue 'orig' at file 'main.lua:756' + Local variables: + msg = string: "[SMODS _ \"src/utils.lua\"]:1344: bad argument #1 to 'ipairs' (table expected, got nil)" + (*temporary) = Lua function '?' (defined at line 31 of chunk [SMODS _ "src/logging.lua"]) + (*temporary) = string: "Oops! The game crashed\ +" +(2) Lua local 'handler' at file 'console.lua:551' (from lovely module debugplus.console) + Local variables: + msg = string: "[SMODS _ \"src/utils.lua\"]:1344: bad argument #1 to 'ipairs' (table expected, got nil)" +(3) LÖVE function at file 'boot.lua:352' (best guess) + Local variables: + errhand = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) + handler = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) +(4) global C function 'ipairs' +(5) Lua field 'calculate_context' at Steamodded file 'src/utils.lua:1344' + Local variables: + context = table: 0x0edc71a0 {main_eval:true, buying_card:true, cardarea:table: 0x144fe080, card:table: 0x0bee5fa8 (more...)} + return_table = nil + (for generator) = C function: builtin#6 + (for state) = table: 0x0edc7268 {1:table: 0x144fe080, 2:table: 0x1aab2a88, 3:table: 0x14533560} + (for control) = number: 1 + _ = number: 1 + area = table: 0x144fe080 {click_offset:table: 0x14588450, children:table: 0x13ddc268, shuffle_amt:0 (more...)} + (for generator) = C function: builtin#6 + (for state) = table: 0x04661b28 {1:table: 0x0bee5fa8} + (for control) = number: 1 + _ = number: 1 + _card = table: 0x0bee5fa8 {added_to_deck:true, from_area:table: 0x0449ef68, click_offset:table: 0x04fbf8a0 (more...)} + eval = table: 0x0edc72b0 {} + post = nil + effects = table: 0x0bed8b18 {1:table: 0x0edc72b0} +(6) Lua field 'func' at file 'functions/button_callbacks.lua:2480' +(7) Lua method 'handle' at file 'engine/event.lua:55' + Local variables: + self = table: 0x09cb36e0 {start_timer:true, timer:TOTAL, blockable:true, trigger:after, func:function: 0x09cb36b8 (more...)} + _results = table: 0x050450d0 {blocking:true, pause_skip:false, time_done:true, completed:false} +(8) Lua method 'update' at file 'engine/event.lua:182' + Local variables: + self = table: 0x0b018a58 {queue_last_processed:15.633333333334, queues:table: 0x0b018a80, queue_dt:0.016666666666667 (more...)} + dt = number: 0.00608305 + forced = nil + (for generator) = C function: next + (for state) = table: 0x0b018a80 {unlock:table: 0x0b018aa8, other:table: 0x0b018f20, tutorial:table: 0x0b018af8 (more...)} + (for control) = number: nan + k = string: "base" + v = table: 0x0b018ad0 {1:table: 0x144f0dc0, 2:table: 0x09cb36e0, 3:table: 0x0edc7178} + blocked = boolean: false + i = number: 2 + results = table: 0x050450d0 {blocking:true, pause_skip:false, time_done:true, completed:false} +(9) Lua upvalue 'gameUpdateRef' at file 'game.lua:2739' + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x1170d808 (more...)} + dt = number: 0.00608305 + http_resp = nil +(10) Lua upvalue 'upd' at Steamodded file 'src/ui.lua:84' + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x1170d808 (more...)} + dt = number: 0.00608305 +(11) Lua upvalue 'upd' at file 'main.lua:4094' + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x1170d808 (more...)} + dt = number: 0.00608305 +(12) Lua upvalue 'upd' at file 'Items/Blinds.lua:1310' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x1170d808 (more...)} + dt = number: 0.00608305 +(13) Lua upvalue 'upd' at file 'Items/CodeCards.lua:4106' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x1170d808 (more...)} + dt = number: 0.00608305 +(14) Lua upvalue 'upd' at file 'Items/Decks.lua:429' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x1170d808 (more...)} + dt = number: 0.00608305 +(15) Lua upvalue 'upd' at file 'Items/MiscJokers.lua:6658' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x1170d808 (more...)} + dt = number: 0.00608305 +(16) Lua method 'update' at file 'Cryptid.lua:2948' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x1170d808 (more...)} + dt = number: 0.00608305 +(17) Lua upvalue 'love_update_ref' at file 'main.lua:1146' + Local variables: + dt = number: 0.00608305 +(18) Lua upvalue 'oldupd' at file 'main.lua:3038' + Local variables: + dt = number: 0.00608305 +(19) Lua field 'update' at file 'main.lua:4121' + Local variables: + dt = number: 0.00608305 +(20) Lua function '?' at file 'main.lua:1079' (best guess) +(21) global C function 'xpcall' +(22) LÖVE function at file 'boot.lua:377' (best guess) + Local variables: + func = Lua function '?' (defined at line 1050 of chunk main.lua) + inerror = boolean: true + deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"]) + earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"]) + +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-02-11 01:26:56 :: INFO :: StackTrace :: Additional Context: +Balatro Version: 1.0.1n-FULL +Modded Version: 1.0.0~ALPHA-1410b-STEAMODDED +LÖVE Version: 11.5.0 +Lovely Version: 0.6.0 +Platform: Windows +Steamodded Mods: + 1: J Cursor by Jie65535, MarioMak967 [ID: JCursor] + 2: Cryptid by MathIsFun_, Cryptid and Balatro Discords [ID: Cryptid, Priority: 1e+299, Version: 0.5.3a, Uses Lovely] + 3: Talisman by MathIsFun_, Mathguy24, jenwalter666, cg-223 [ID: Talisman, Version: 2.0.2, Uses Lovely] + Break Infinity: omeganum + 4: Cartomancer by stupxd aka stupid [ID: cartomancer, Priority: 69, Version: 4.10, Uses Lovely] + 5: Handy by SleepyG11 [ID: Handy, Version: 1.1.5, Uses Lovely] + 6: Incantation by jenwalter666, MathIsFun_ [ID: incantation, Priority: 9e+301, Version: 0.5.10, Uses Lovely] + 7: DebugPlus by WilsontheWolf [ID: DebugPlus, Version: 1.3.0, Uses Lovely] +Lovely Mods: diff --git a/lovely/log/lovely-2025.02.11-01.27.22.log b/lovely/log/lovely-2025.02.11-01.27.22.log new file mode 100644 index 0000000..1591e49 --- /dev/null +++ b/lovely/log/lovely-2025.02.11-01.27.22.log @@ -0,0 +1,132 @@ +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 133ms +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 30 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 12 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 46 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 82 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 118 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 '(?[\\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 124 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 53 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 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 206 patches to 'card.lua' +INFO - [♥] Applied 20 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-02-11 01:27:26 :: 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-02-11 01:27:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-02-11 01:27:27 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-02-11 01:27:27 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-02-11 01:27:27 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-02-11 01:27:27 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-02-11 01:27:27 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-02-11 01:27:27 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.767 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0032] Injected Atlas in 784.495 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0025] Injected Sound in 20.943 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0032] Injected Stake in 0.580 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0008] Injected Rarity in 0.045 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.058 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0392] Injected Center in 2.721 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.026 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0027] Injected Blind in 0.048 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0002] Injected Seal in 0.060 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0004] Injected Suit in 0.060 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0013] Injected Rank in 0.062 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0016] Injected DeckSkin in 0.030 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.138 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0031] Injected Challenge in 0.128 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0028] Injected Tag in 0.254 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0009] Injected Sticker in 0.852 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0009] Injected Shader in 125.826 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0000] Injected Keybind in 0.001 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0020] Injected Achievement in 0.133 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 6.643 ms +INFO - [G] 2025-02-11 01:27:28 :: INFO :: TIMER :: [0011] Injected Event in 0.018 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews +INFO - [G] ERROR LOADING GAME: Card area 'shop_booster' not instantiated before load +INFO - [G] ERROR LOADING GAME: Card area 'shop_vouchers' not instantiated before load +INFO - [G] ERROR LOADING GAME: Card area 'vouchers' not instantiated before load +INFO - [G] ERROR LOADING GAME: Card area 'shop_jokers' not instantiated before load diff --git a/lovely/log/lovely-2025.02.11-01.28.56.log b/lovely/log/lovely-2025.02.11-01.28.56.log new file mode 100644 index 0000000..2747cc7 --- /dev/null +++ b/lovely/log/lovely-2025.02.11-01.28.56.log @@ -0,0 +1,298 @@ +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 +INFO - [♥] Applied 1 patch to 'conf.lua' +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 +WARN - [♥] Pattern 'modded and {' on target 'main.lua' resulted in no matches +INFO - [♥] Applied 35 patches to 'main.lua' +INFO - [♥] Applied 2 patches to 'engine/string_packer.lua' +INFO - [♥] Applied 13 patches to 'engine/controller.lua' +INFO - [♥] Applied 15 patches to 'back.lua' +INFO - [♥] Applied 15 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 48 patches to 'functions/misc_functions.lua' +INFO - [♥] Applied 84 patches to 'game.lua' +INFO - [♥] Applied 1 patch to 'globals.lua' +WARN - [♥] Pattern 'self.config.chosen = true' on target 'engine/ui.lua' resulted in no matches +INFO - [♥] Applied 7 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 110 patches to 'functions/UI_definitions.lua' +WARN - [♥] Pattern '--calculate the card edition effects\nif effects[ii].edition then\n hand_chips = mod_chips(hand_chips + (effects[ii].edition.chip_mod or 0))\n mult = mult + (effects[ii].edition.mult_mod or 0)\n mult = mod_mult(mult*(effects[ii].edition.x_mult_mod or 1))\n update_hand_text({delay = 0}, {\n chips = effects[ii].edition.chip_mod and hand_chips or nil,\n mult = (effects[ii].edition.mult_mod or effects[ii].edition.x_mult_mod) and mult or nil,\n })\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, {\n message = (effects[ii].edition.chip_mod and localize{type=\'variable\',key=\'a_chips\',vars={effects[ii].edition.chip_mod}}) or\n (effects[ii].edition.mult_mod and localize{type=\'variable\',key=\'a_mult\',vars={effects[ii].edition.mult_mod}}) or\n (effects[ii].edition.x_mult_mod and localize{type=\'variable\',key=\'a_xmult\',vars={effects[ii].edition.x_mult_mod}}),\n chip_mod = effects[ii].edition.chip_mod,\n mult_mod = effects[ii].edition.mult_mod,\n x_mult_mod = effects[ii].edition.x_mult_mod,\n colour = G.C.DARK_EDITION,\n edition = true})\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern ' scoring_hand[i].lucky_trigger = nil\n\n for ii = 1, #effects do\n --If chips added, do chip add event and add the chips to the total\n if effects[ii].chips then \n if effects[ii].card then juice_card(effects[ii].card) end\n hand_chips = mod_chips(hand_chips + effects[ii].chips)\n update_hand_text({delay = 0}, {chips = hand_chips})\n card_eval_status_text(scoring_hand[i], \'chips\', effects[ii].chips, percent)\n end\n\n --If mult added, do mult add event and add the mult to the total\n if effects[ii].mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult + effects[ii].mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'mult\', effects[ii].mult, percent)\n end\n\n --If play dollars added, add dollars to total\n if effects[ii].p_dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].p_dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].p_dollars, percent)\n end\n\n --If dollars added, add dollars to total\n if effects[ii].dollars then \n if effects[ii].card then juice_card(effects[ii].card) end\n ease_dollars(effects[ii].dollars)\n card_eval_status_text(scoring_hand[i], \'dollars\', effects[ii].dollars, percent)\n end\n\n --Any extra effects\n if effects[ii].extra then \n if effects[ii].card then juice_card(effects[ii].card) end\n local extras = {mult = false, hand_chips = false}\n if effects[ii].extra.mult_mod then mult =mod_mult( mult + effects[ii].extra.mult_mod);extras.mult = true end\n if effects[ii].extra.chip_mod then hand_chips = mod_chips(hand_chips + effects[ii].extra.chip_mod);extras.hand_chips = true end\n if effects[ii].extra.swap then \n local old_mult = mult\n mult = mod_mult(hand_chips)\n hand_chips = mod_chips(old_mult)\n extras.hand_chips = true; extras.mult = true\n end\n if effects[ii].extra.func then effects[ii].extra.func() end\n update_hand_text({delay = 0}, {chips = extras.hand_chips and hand_chips, mult = extras.mult and mult})\n card_eval_status_text(scoring_hand[i], \'extra\', nil, percent, nil, effects[ii].extra)\n end\n\n --If x_mult added, do mult add event and mult the mult to the total\n if effects[ii].x_mult then \n if effects[ii].card then juice_card(effects[ii].card) end\n mult = mod_mult(mult*effects[ii].x_mult)\n update_hand_text({delay = 0}, {mult = mult})\n card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)\n end\n\n\n end\n end\nend\n' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local percent = (i-0.999)/(#G.hand.cards-0.998) + (j-1)*0.1' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.effect ~= \'Stone Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if scoring_hand[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i = 1, #G.jokers.cards do' on target 'functions/state_events.lua' resulted in no matches +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 +WARN - [♥] Pattern 'card_eval_status_text(_card, \'jokers\', nil, percent, nil, effects.jokers)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if extras.mult or extras.hand_chips then card_eval_status_text(v, \'jokers\', nil, percent, nil, effect) end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(scoring_hand[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'card_eval_status_text(G.hand.cards[i], \'x_mult\', effects[ii].x_mult, percent)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.hand.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if reps[j] ~= 1 then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if destroyed then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if cards_destroyed[i].ability.name == \'Glass Card\' then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local edition_effects = eval_card(_card, {cardarea = G.jokers, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, edition = true})' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'for i=1, #G.jokers.cards + #G.consumeables.cards do' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local hand_space = e or math.min(#G.deck.cards, G.hand.config.card_limit - #G.hand.cards)' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'local effects = {G.hand.cards[i]:get_end_of_round_effect()}' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] 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' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].card then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects.jokers.Xmult_mod then mult = mod_mult(mult*effects.jokers.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effect.Xmult_mod then mult = mod_mult(mult*effect.Xmult_mod);extras.mult = true end' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].message then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern '--calculate the card edition effects' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if effects[ii].edition.p_dollars_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Pattern 'if edition_effects.jokers.x_mult_mod then' on target 'functions/state_events.lua' resulted in no matches +WARN - [♥] Regex '(?[\\t ]*)if destroyed then \\n' on target 'functions/state_events.lua' resulted in no matches +INFO - [♥] Applied 61 patches to 'functions/state_events.lua' +WARN - [♥] Pattern 'function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end)' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern '{n=G.UIT.T, config={text = localize(\'$\')..config.dollars, scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \'Cryptid\' then loc_vars = {_c.config.extra}' on target 'functions/common_events.lua' resulted in no matches +WARN - [♥] Pattern 'elseif _c.name == \"Clearance Sale\" or _c.name == \"Liquidation\" then loc_vars = {_c.config.extra}' 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 - [♥] Pattern 'if v == \'negative_consumable\' then info_queue[#info_queue+1] = {key = \'e_negative_consumable\', set = \'Edition\', config = {extra = 1}} end' 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 139 patches to 'functions/common_events.lua' +WARN - [♥] Pattern 'if card.area and (not nc or card.area == G.pack_cards) then card.area:remove_card(card) end\n' on target 'functions/button_callbacks.lua' resulted in no matches +INFO - [♥] Applied 63 patches to 'functions/button_callbacks.lua' +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 center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'self:calculate_joker{selling_self = true}' on target 'card.lua' resulted in no matches +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 self.ability.name:find(\'Arcana\') then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if center_table.name == \'Overstock\' or center_table.name == \'Overstock Plus\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Regex 'message = localize\\{type = \'variable\', key = \'a_xmult\', vars = \\{G.P_CENTERS.v_observatory.config.extra}},\\n\\s+Xmult_mod = G.P_CENTERS.v_observatory.config.extra' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.name == \'The Hermit\' or self.ability.consumeable.hand_type or self.ability.name == \'Temperance\' or self.ability.name == \'Black Hole\' then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'if self.ability.queue_negative_removal then' on target 'card.lua' resulted in no matches +WARN - [♥] Pattern 'Xmult_mod = G.P_CENTERS.v_observatory.config.extra' 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 223 patches to 'card.lua' +WARN - [♥] Pattern '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)' on target 'cardarea.lua' resulted in no matches +INFO - [♥] Applied 19 patches to 'cardarea.lua' +INFO - [♥] Applied 32 patches to 'blind.lua' +INFO - [♥] Applied 5 patches to 'engine/text.lua' +INFO - [G] Totally applied 4 replacements to overrides.lua +INFO - [G] Failed to connect to the debug server +INFO - [G] 2025-02-11 01:29:00 :: 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-02-11 01:29:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): mod.lua +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Saving Mod Info: cartomancer +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): Cryptid.lua +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Saving Mod Info: Cryptid +INFO - [G] 2025-02-11 01:29:00 :: INFO :: DefaultLogger :: Valid JSON file found +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded.lua +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Saving Mod Info: Handy +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): Incantation.lua +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Saving Mod Info: incantation +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): JCursor.lua +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Saving Mod Info: JCursor +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Processing Mod file (Legacy header): steamodded_metadata.lua +INFO - [G] 2025-02-11 01:29:00 :: TRACE :: Loader :: Saving Mod Info: Talisman +INFO - [G] 2025-02-11 01:29:00 :: DEBUG :: DefaultLogger :: JCursor loaded! +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] Warning: dummy_https.lua has no items +INFO - [G] Loading file dummy_timerblinds.lua +INFO - [G] Warning: dummy_timerblinds.lua has no items +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_modicon +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_placeholders +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasepic +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasone +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlastwo +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasthree +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasspooky +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasexotic +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_atlasnotjokers +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_tag_cry +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Atlas :: Detected duplicate register call on object cry_misc +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Sticker :: Detected duplicate register call on object perishable +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Sticker :: Detected duplicate register call on object pinned +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Sticker :: Detected duplicate register call on object eternal +INFO - [G] 2025-02-11 01:29:01 :: WARN :: Sticker :: Detected duplicate register call on object rental +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0000] Injected Language in 0.001 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 0.706 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0032] Injected Atlas in 799.965 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0026] Injected Sound in 18.012 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0032] Injected Stake in 0.745 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0008] Injected Rarity in 0.020 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0007] Injected ObjectType in 0.061 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0393] Injected Center in 2.240 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0011] Injected Undiscovered Sprite in 0.027 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0027] Injected Blind in 0.051 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0006] Injected Seal in 0.167 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0004] Injected Suit in 0.076 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0013] Injected Rank in 0.067 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0020] Injected DeckSkin in 0.127 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0016] Injected PokerHand in 0.094 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0031] Injected Challenge in 0.150 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0028] Injected Tag in 0.049 ms +INFO - [G] 2025-02-11 01:29:01 :: INFO :: TIMER :: [0009] Injected Sticker in 0.114 ms +INFO - [G] 2025-02-11 01:29:02 :: INFO :: TIMER :: [0009] Injected Shader in 117.972 ms +INFO - [G] 2025-02-11 01:29:02 :: INFO :: TIMER :: [0001] Injected Keybind in 0.005 ms +INFO - [G] 2025-02-11 01:29:02 :: INFO :: TIMER :: [0020] Injected Achievement in 0.076 ms +INFO - [G] 2025-02-11 01:29:02 :: INFO :: TIMER :: [0000] Injected [INTERNAL] in 6.732 ms +INFO - [G] 2025-02-11 01:29:02 :: INFO :: TIMER :: [0011] Injected Event in 0.012 ms +INFO - [G] [DebugPlus] Press [/] to toggle console and press [shift] + [/] to toggle new log previews +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 +INFO - [G] line not found +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-02-11 01:29:28 :: ERROR :: StackTrace :: Oops! The game crashed +[SMODS _ "src/utils.lua"]:1344: bad argument #1 to 'ipairs' (table expected, got nil) +Stack Traceback +=============== +(1) Lua upvalue 'orig' at file 'main.lua:756' + Local variables: + msg = string: "[SMODS _ \"src/utils.lua\"]:1344: bad argument #1 to 'ipairs' (table expected, got nil)" + (*temporary) = Lua function '?' (defined at line 31 of chunk [SMODS _ "src/logging.lua"]) + (*temporary) = string: "Oops! The game crashed\ +" +(2) Lua local 'handler' at file 'console.lua:551' (from lovely module debugplus.console) + Local variables: + msg = string: "[SMODS _ \"src/utils.lua\"]:1344: bad argument #1 to 'ipairs' (table expected, got nil)" +(3) LÖVE function at file 'boot.lua:352' (best guess) + Local variables: + errhand = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) + handler = Lua function '(LÖVE Function)' (defined at line 550 of chunk [lovely debugplus.console "console.lua"]) +(4) global C function 'ipairs' +(5) Lua field 'calculate_context' at Steamodded file 'src/utils.lua:1344' + Local variables: + context = table: 0x14195988 {main_eval:true, buying_card:true, cardarea:table: 0x066b4d48, card:table: 0x1410dd58 (more...)} + return_table = nil + (for generator) = C function: builtin#6 + (for state) = table: 0x14193d18 {1:table: 0x066b4d48, 2:table: 0x064ab010, 3:table: 0x09ccc760} + (for control) = number: 1 + _ = number: 1 + area = table: 0x066b4d48 {click_offset:table: 0x066b50f0, children:table: 0x062f0980, shuffle_amt:0 (more...)} + (for generator) = C function: builtin#6 + (for state) = table: 0x062f0958 {1:table: 0x062f09a8, 2:table: 0x1410dd58} + (for control) = number: 1 + _ = number: 1 + _card = table: 0x062f09a8 {click_offset:table: 0x062f0cf0, children:table: 0x066c9318, ambient_tilt:0.2 (more...)} + eval = table: 0x14195a50 {} + post = nil + effects = table: 0x13e0eed8 {1:table: 0x14195a50} +(6) Lua field 'func' at file 'functions/button_callbacks.lua:2480' +(7) Lua method 'handle' at file 'engine/event.lua:55' + Local variables: + self = table: 0x0607fe28 {start_timer:true, timer:TOTAL, blockable:true, trigger:after, func:function: 0x0607fe00 (more...)} + _results = table: 0x04540d98 {blocking:true, pause_skip:false, time_done:true, completed:false} +(8) Lua method 'update' at file 'engine/event.lua:182' + Local variables: + self = table: 0x0b015908 {queue_last_processed:22.1, queues:table: 0x0b015930, queue_dt:0.016666666666667 (more...)} + dt = number: 0.00607317 + forced = nil + (for generator) = C function: next + (for state) = table: 0x0b015930 {unlock:table: 0x0b015958, other:table: 0x0b015dd0, tutorial:table: 0x0b0159a8 (more...)} + (for control) = number: nan + k = string: "base" + v = table: 0x0b015980 {1:table: 0x062f05b0, 2:table: 0x0607fe28, 3:table: 0x14193cf0} + blocked = boolean: false + i = number: 2 + results = table: 0x04540d98 {blocking:true, pause_skip:false, time_done:true, completed:false} +(9) Lua upvalue 'gameUpdateRef' at file 'game.lua:2739' + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x066dd1c0 (more...)} + dt = number: 0.00607317 + http_resp = nil +(10) Lua upvalue 'upd' at Steamodded file 'src/ui.lua:84' + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x066dd1c0 (more...)} + dt = number: 0.00607317 +(11) Lua upvalue 'upd' at file 'main.lua:4094' + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x066dd1c0 (more...)} + dt = number: 0.00607317 +(12) Lua upvalue 'upd' at file 'Items/Blinds.lua:1310' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x066dd1c0 (more...)} + dt = number: 0.00607317 +(13) Lua upvalue 'upd' at file 'Items/CodeCards.lua:4106' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x066dd1c0 (more...)} + dt = number: 0.00607317 +(14) Lua upvalue 'upd' at file 'Items/Decks.lua:429' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x066dd1c0 (more...)} + dt = number: 0.00607317 +(15) Lua upvalue 'upd' at file 'Items/MiscJokers.lua:6658' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x066dd1c0 (more...)} + dt = number: 0.00607317 +(16) Lua method 'update' at file 'Cryptid.lua:2948' (from mod with id Cryptid) + Local variables: + self = table: 0x04237730 {F_GUIDE:false, F_CRASH_REPORTS:false, F_QUIT_BUTTON:true, HUD_tags:table: 0x066dd1c0 (more...)} + dt = number: 0.00607317 +(17) Lua upvalue 'love_update_ref' at file 'main.lua:1146' + Local variables: + dt = number: 0.00607317 +(18) Lua upvalue 'oldupd' at file 'main.lua:3038' + Local variables: + dt = number: 0.00607317 +(19) Lua field 'update' at file 'main.lua:4121' + Local variables: + dt = number: 0.00607317 +(20) Lua function '?' at file 'main.lua:1079' (best guess) +(21) global C function 'xpcall' +(22) LÖVE function at file 'boot.lua:377' (best guess) + Local variables: + func = Lua function '?' (defined at line 1050 of chunk main.lua) + inerror = boolean: true + deferErrhand = Lua function '(LÖVE Function)' (defined at line 348 of chunk [love "boot.lua"]) + earlyinit = Lua function '(LÖVE Function)' (defined at line 355 of chunk [love "boot.lua"]) + +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] file not found: main.lua: No such file or directory +INFO - [G] 2025-02-11 01:29:28 :: INFO :: StackTrace :: Additional Context: +Balatro Version: 1.0.1n-FULL +Modded Version: 1.0.0~ALPHA-1410b-STEAMODDED +LÖVE Version: 11.5.0 +Lovely Version: 0.6.0 +Platform: Windows +Steamodded Mods: + 1: J Cursor by Jie65535, MarioMak967 [ID: JCursor] + 2: Cryptid by MathIsFun_, Cryptid and Balatro Discords [ID: Cryptid, Priority: 1e+299, Version: 0.5.3a, Uses Lovely] + 3: Talisman by MathIsFun_, Mathguy24, jenwalter666, cg-223 [ID: Talisman, Version: 2.0.2, Uses Lovely] + Break Infinity: omeganum + 4: Cartomancer by stupxd aka stupid [ID: cartomancer, Priority: 69, Version: 4.10, Uses Lovely] + 5: Handy by SleepyG11 [ID: Handy, Version: 1.1.5, Uses Lovely] + 6: Incantation by jenwalter666, MathIsFun_ [ID: incantation, Priority: 9e+301, Version: 0.5.10, Uses Lovely] + 7: DebugPlus by WilsontheWolf [ID: DebugPlus, Version: 1.3.0, Uses Lovely] +Lovely Mods: