balatro-mods/DebugPlus/core.lua
2025-01-19 15:01:49 +08:00

467 lines
17 KiB
Lua

local logger = require("debugplus.logger")
local util = require("debugplus.util")
local global = {}
local enhancements = nil
local seals = nil
local suits = nil
local ranks = nil
local saveStateKeys = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}
local log = logger.log
local function getSeals()
if seals then
return seals
end
seals = {"None"}
for i, v in pairs(G.P_SEALS) do
seals[v.order + 1] = i
end
return seals
end
local function getEnhancements()
if enhancements then
return enhancements
end
enhancements = {"c_base"}
for k, v in pairs(G.P_CENTER_POOLS["Enhanced"]) do
enhancements[v.order] = v.key
end
return enhancements
end
local function getSuits()
if suits then
return suits
end
suits = {}
for k, v in pairs(G.C.SUITS) do
table.insert(suits, k)
end
return suits
end
local function getRanks()
if ranks then
return ranks
end
ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"} -- No built in api for this, yippe
if SMODS and SMODS.Ranks then
for k, v in pairs(SMODS.Ranks) do
if not util.hasValue(ranks, v.key) then
table.insert(ranks, v.key)
end
end
end
return ranks
end
function global.handleKeys(controller, key, dt)
if controller.hovering.target and controller.hovering.target:is(Card) then
local _card = controller.hovering.target
if key == 'w' then
if _card.playing_card then
for i, v in ipairs(getEnhancements()) do
if _card.config.center == G.P_CENTERS[v] then
local _next = i + 1
if _next > #enhancements then
_card:set_ability(G.P_CENTERS[enhancements[1]], nil, true)
else
_card:set_ability(G.P_CENTERS[enhancements[_next]], nil, true)
end
break
end
end
end
end
if key == "e" then
if _card.playing_card then
for i, v in ipairs(getSeals()) do
if (_card:get_seal(true) or "None") == v then
local _next = i + 1
if _next > #seals then
_next = 1
end
if _next == 1 then
_card:set_seal(nil, true)
else
_card:set_seal(seals[_next], true)
end
break
end
end
end
end
if key == "a" then
if _card.ability.set == 'Joker' then
_card.ability.eternal = not _card.ability.eternal
end
end
if key == "s" then
if _card.ability.set == 'Joker' then
_card.ability.perishable = not _card.ability.perishable
_card.ability.perish_tally = G.GAME.perishable_rounds
end
end
if key == "d" then
if _card.ability.set == 'Joker' then
_card.ability.rental = not _card.ability.rental
_card:set_cost()
end
end
if key == "f" then
if _card.ability.set == 'Joker' or _card.playing_card or _card.area then
_card.ability.couponed = not _card.ability.couponed
_card:set_cost()
end
end
if key == "c" then
local _area
if _card.ability.set == 'Joker' then
_area = G.jokers
elseif _card.playing_card then
if G.hand and G.hand.config.card_count ~= 0 then
_area = G.hand
else
_area = G.deck
end
elseif _card.ability.consumeable then
_area = G.consumeables
end
if _area == nil then
return log("Error: Trying to dup card without an area")
end
local new_card = copy_card(_card, nil, nil, _card.playing_card)
new_card:add_to_deck()
if _card.playing_card then
table.insert(G.playing_cards, new_card)
end
_area:emplace(new_card)
end
if key == "r" then
if _card.ability.name == "Glass Card" then
_card.shattered = true
end
_card:remove()
if _card.playing_card then
for j = 1, #G.jokers.cards do
eval_card(G.jokers.cards[j], {
cardarea = G.jokers,
remove_playing_cards = true,
removed = {_card}
})
end
end
end
if key == 'up' then
if _card.playing_card then
for i, v in ipairs(getRanks()) do
if _card.base.value == v then
local _next = i + 1
if _next > #ranks then
local new_card
for i, c in pairs(G.P_CARDS) do
if c.value == ranks[1] and c.suit == _card.base.suit then
new_card = c
break
end
end
if not new_card then
log("Error: Could not find card with rank", ranks[1], "and suit", _card.base.suit)
return
end
_card:set_base(new_card)
G.GAME.blind:debuff_card(_card)
else
local new_card
for i, c in pairs(G.P_CARDS) do
if c.value == ranks[_next] and c.suit == _card.base.suit then
new_card = c
break
end
end
if not new_card then
log("Error: Could not find card with rank", ranks[_next], "and suit", _card.base.suit)
return
end
_card:set_base(new_card)
G.GAME.blind:debuff_card(_card)
end
break
end
end
end
end
if key == 'down' then
if _card.playing_card then
for i, v in ipairs(getRanks()) do
if _card.base.value == v then
local _next = i - 1
if _next < 1 then
local new_card
for i, c in pairs(G.P_CARDS) do
if c.value == ranks[#ranks] and c.suit == _card.base.suit then
new_card = c
break
end
end
if not new_card then
log("Error: Could not find card with rank", ranks[#ranks], "and suit", _card.base.suit)
return
end
_card:set_base(new_card)
G.GAME.blind:debuff_card(_card)
else
local new_card
for i, c in pairs(G.P_CARDS) do
if c.value == ranks[_next] and c.suit == _card.base.suit then
new_card = c
break
end
end
if not new_card then
log("Error: Could not find card with rank", ranks[_next], "and suit", _card.base.suit)
return
end
_card:set_base(new_card)
G.GAME.blind:debuff_card(_card)
end
break
end
end
end
end
if key == 'right' then
if _card.playing_card then
for i, v in ipairs(getSuits()) do
if _card.base.suit == v then
local _next = i + 1
if _next > #suits then
_card:change_suit(suits[1])
else
_card:change_suit(suits[_next])
end
break
end
end
end
end
if key == 'left' then
if _card.playing_card then
for i, v in ipairs(getSuits()) do
if _card.base.suit == v then
local _next = i - 1
if _next < 1 then
_card:change_suit(suits[#suits])
else
_card:change_suit(suits[_next])
end
break
end
end
end
end
end
local _element = controller.hovering.target
if _element and _element.config and _element.config.tag then
local _tag = _element.config.tag
if key == "2" then
G.P_TAGS[_tag.key].unlocked = true
G.P_TAGS[_tag.key].discovered = true
G.P_TAGS[_tag.key].alerted = true
_tag.hide_ability = false
set_discover_tallies()
G:save_progress()
_element:set_sprite_pos(_tag.pos)
end
if key == "3" or key == "c" then
if G.STAGE == G.STAGES.RUN then
add_tag(Tag(_tag.key, false, 'Big'))
end
end
if key == "r" then
_element.config.tag:remove()
end
end
if _element and _element.config and _element.config.blind then
local _blind = _element.config.blind
if key == "2" then
G.P_BLINDS[_blind.key].unlocked = true
G.P_BLINDS[_blind.key].discovered = true
G.P_BLINDS[_blind.key].alerted = true
if _element.set_sprite_pos then -- vanilla
_element:set_sprite_pos(_blind.pos)
else -- SMODS
_element.children.center:set_sprite_pos(_blind.pos)
end
set_discover_tallies()
G:save_progress()
end
if key == "3" then
if G.STATE == G.STATES.BLIND_SELECT then
local par = G.blind_select_opts.boss.parent
G.GAME.round_resets.blind_choices.Boss = _blind.key
G.blind_select_opts.boss:remove()
G.blind_select_opts.boss = UIBox {
T = {par.T.x, 0, 0, 0},
definition = {
n = G.UIT.ROOT,
config = {
align = "cm",
colour = G.C.CLEAR
},
nodes = {UIBox_dyn_container({create_UIBox_blind_choice('Boss')}, false,
get_blind_main_colour('Boss'), mix_colours(G.C.BLACK, get_blind_main_colour('Boss'), 0.8))}
},
config = {
align = "bmi",
offset = {
x = 0,
y = G.ROOM.T.y + 9
},
major = par,
xy_bond = 'Weak'
}
}
par.config.object = G.blind_select_opts.boss
par.config.object:recalculate()
G.blind_select_opts.boss.parent = par
G.blind_select_opts.boss.alignment.offset.y = 0
for i = 1, #G.GAME.tags do
if G.GAME.tags[i]:apply_to_run({
type = 'new_blind_choice'
}) then
break
end
end
end
end
end
if key == "1" or key == "2" then -- Reload any tooltips when unlocking/discovering stuff
if _element.stop_hover and _element.hover then
_element:stop_hover()
_element:hover()
end
end
if key == "m" then
G.FUNCS.change_pixel_smoothing({
to_key = G.SETTINGS.GRAPHICS.texture_scaling
})
log("Reloaded Atlases")
end
for i, v in ipairs(saveStateKeys) do
if key == v and love.keyboard.isDown("z") then
if G.STAGE == G.STAGES.RUN then
if not (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.STANDARD_PACK or G.STATE == G.STATES.BUFFOON_PACK or
G.STATE == G.STATES.SMODS_BOOSTER_OPENED) then
save_run()
end
compress_and_save(G.SETTINGS.profile .. '/' .. 'debugsave' .. v .. '.jkr', G.ARGS.save_run)
log("Saved to slot", v)
end
end
if key == v and love.keyboard.isDown("x") then
G:delete_run()
G.SAVED_GAME = get_compressed(G.SETTINGS.profile .. '/' .. 'debugsave' .. v .. '.jkr')
if G.SAVED_GAME ~= nil then
G.SAVED_GAME = STR_UNPACK(G.SAVED_GAME)
end
G:start_run({
savetext = G.SAVED_GAME
})
log("Loaded slot", v)
end
end
end
function global.registerButtons()
G.FUNCS.DT_win_blind = function()
if G.STATE ~= G.STATES.SELECTING_HAND then
return
end
G.GAME.chips = G.GAME.blind.chips
G.STATE = G.STATES.HAND_PLAYED
G.STATE_COMPLETE = true
end_round()
end
G.FUNCS.DT_double_tag = function()
if G.STAGE == G.STAGES.RUN then
add_tag(Tag('tag_double', false, 'Big'))
end
end
end
function global.togglePerfUI()
if G.F_ENABLE_PERF_OVERLAY == G.SETTINGS.perf_mode then -- first time run
G.SETTINGS.perf_mode = true
end
G.F_ENABLE_PERF_OVERLAY = G.SETTINGS.perf_mode
if G.F_ENABLE_PERF_OVERLAY then
if not silent then
log("Enabled profiler overlay. Press 'p' again to disable it.")
end
else
if not silent then
log("Disabled profiler overlay.")
end
end
end
function global.profileMessage()
if G.prof then
log("Enabled performance profiler. Press 'v' again to disable it.")
else
log("Disabled performance profiler. Check console for results.")
end
end
function global.handleSpawn(controller, _card)
if _card.ability.set == 'Voucher' and G.shop_vouchers then
local center = _card.config.center
G.shop_vouchers.config.card_limit = G.shop_vouchers.config.card_limit + 1
local card = Card(G.shop_vouchers.T.x + G.shop_vouchers.T.w / 2, G.shop_vouchers.T.y, G.CARD_W, G.CARD_H,
G.P_CARDS.empty, center, {
bypass_discovery_center = true,
bypass_discovery_ui = true
})
create_shop_card_ui(card, 'Voucher', G.shop_vouchers)
G.shop_vouchers:emplace(card)
end
if _card.ability.set == 'Booster' and G.shop_booster then
local center = _card.config.center
G.shop_booster.config.card_limit = G.shop_booster.config.card_limit + 1
local card = Card(G.shop_booster.T.x + G.shop_booster.T.w / 2, G.shop_booster.T.y, G.CARD_W * 1.27,
G.CARD_H * 1.27, G.P_CARDS.empty, center, {
bypass_discovery_center = true,
bypass_discovery_ui = true
})
create_shop_card_ui(card, 'Booster', G.shop_booster)
card.ability.booster_pos = G.shop_booster.config.card_limit
G.shop_booster:emplace(card)
end
end
function global.isOkayToHandleDebugForKey(key)
if not require("debugplus.config").getValue("ctrlKeybinds") then return true end
for k,v in ipairs({"tab", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}) do -- Keys that ignore the ctrl option (tab menu + collection keys + save state keys)
if key == v then return true end
end
if util.isCtrlDown() then return true end
end
return global