fixed gitignore
This commit is contained in:
parent
f35a81d0d2
commit
fcb112ca14
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1 @@
|
||||||
**/lovely*.log
|
**/lovely*.log
|
||||||
lovely/
|
|
49
Cartomancer/lovely/dynamic-ante-display.toml
Normal file
49
Cartomancer/lovely/dynamic-ante-display.toml
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 0
|
||||||
|
|
||||||
|
# Patch dynamic ante display into
|
||||||
|
# function create_UIBox_your_collection_blinds(exit)
|
||||||
|
# this will only work for vanilla, as steamodded overrides this
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "local ante_amounts = {}"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
local min_ante = 1
|
||||||
|
local max_ante = 16
|
||||||
|
local spacing = 1 - 15*0.06
|
||||||
|
if G.GAME and G.GAME.round_resets and G.GAME.round_resets.ante then
|
||||||
|
local current_ante = G.GAME.round_resets.ante
|
||||||
|
|
||||||
|
if current_ante > 8 then
|
||||||
|
min_ante = current_ante - 8 + 1
|
||||||
|
max_ante = current_ante + 8
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "for i = 1, math.min(16, math.max(16, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt)) do"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
for i = min_ante, max_ante do
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "local spacing = 1 - math.min(20, math.max(15, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt))*0.06"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
-- :3
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
26
Cartomancer/lovely/dynamic-hand-align.toml
Normal file
26
Cartomancer/lovely/dynamic-hand-align.toml
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = '''
|
||||||
|
local max_cards = math.max(#self.cards, self.config.temp_limit)'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if max_cards_override then max_cards = max_cards_override end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = '''
|
||||||
|
if self\.config\.type == \'hand\' and [^\n]*then'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
local max_cards_override = (Cartomancer.SETTINGS.dynamic_hand_align and self.config.temp_limit - #self.cards > 5) and #self.cards
|
||||||
|
'''
|
||||||
|
|
30
Cartomancer/lovely/fixed-flames.toml
Normal file
30
Cartomancer/lovely/fixed-flames.toml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
position = "at"
|
||||||
|
pattern = '''
|
||||||
|
(?<value>math\.max\(0\., math\.log\(G\.ARGS\.score_intensity\.earned_score, 5\)-2\))'''
|
||||||
|
payload = "Cartomancer.get_flames_intensity()"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
position = "at"
|
||||||
|
pattern = '''
|
||||||
|
(?<value>\(not G\.video_organ and G\.STATE == G\.STATES\.SPLASH\) and 0 or AC\[k\]\.vol and v\.volfunc\(AC\[k\]\.vol\) or 0)'''
|
||||||
|
payload = "Cartomancer.handle_flames_volume($value)"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = '''_F.timer = _F.timer + G.real_dt*(1 + _F.intensity*0.2)'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
_F.timer = Cartomancer.handle_flames_timer(_F.timer, _F.intensity)'''
|
||||||
|
match_indent = true
|
30
Cartomancer/lovely/hand-sorting.toml
Normal file
30
Cartomancer/lovely/hand-sorting.toml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 0
|
||||||
|
|
||||||
|
# Add no sort button to
|
||||||
|
# create_UIBox_buttons
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''
|
||||||
|
{n=G.UIT.T, config={text = localize('b_sort_hand'), scale = text_scale*0.8, colour = G.C.UI.TEXT_LIGHT}}'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
Cartomancer.SETTINGS.improved_hand_sorting and
|
||||||
|
create_toggle{ col = true, label = localize('b_sort_hand'), label_scale = text_scale*0.8, scale = 0.30, w = 0, shadow = true, ref_table = G.hand, ref_value = 'cart_sorting', callback = function () G.FUNCS.cartomancer_sort_hand_off() end }
|
||||||
|
or'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Set default value of G.hand.cart_sorting
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''
|
||||||
|
function create_UIBox_buttons()'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if G.hand and G.hand.cart_sorting == nil then G.hand.cart_sorting = true end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
28
Cartomancer/lovely/hidden-jokers.toml
Normal file
28
Cartomancer/lovely/hidden-jokers.toml
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "self.children.area_uibox:draw()"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self == G.jokers then
|
||||||
|
Cartomancer.add_visibility_controls()
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "function CardArea:emplace(card, location, stay_flipped)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self == G.jokers then
|
||||||
|
Cartomancer.handle_joker_added(card)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
20
Cartomancer/lovely/keybinds.toml
Normal file
20
Cartomancer/lovely/keybinds.toml
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/controller.lua'
|
||||||
|
pattern = "function Controller:key_press_update(key, dt)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if key == "escape" and Cartomancer.INTERNAL_in_config then
|
||||||
|
Cartomancer.INTERNAL_in_config = false
|
||||||
|
if not Cartomancer.use_smods() then
|
||||||
|
Cartomancer.save_config()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
85
Cartomancer/lovely/limit-deck-size.toml
Normal file
85
Cartomancer/lovely/limit-deck-size.toml
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
# Make all drawn cards visible
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(self, card)"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if self == G.hand and not card.states.visible then
|
||||||
|
card.states.visible = true
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Fix drawing specific card staying invisible
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(to, card)"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if card and to == G.hand and not card.states.visible then
|
||||||
|
card.states.visible = true
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Replace drawing deck pile
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = '''
|
||||||
|
local deck_height = (self.config.deck_height or 0.15)/52
|
||||||
|
for k, card in ipairs(self.cards) do
|
||||||
|
if card.facing == 'front' then card:flip() end
|
||||||
|
|
||||||
|
if not card.states.drag.is then
|
||||||
|
card.T.x = self.T.x + 0.5*(self.T.w - card.T.w) + self.shadow_parrallax.x*deck_height*(#self.cards/(self == G.deck and 1 or 2) - k) + 0.9*self.shuffle_amt*(1 - k*0.01)*(k%2 == 1 and 1 or -0)
|
||||||
|
card.T.y = self.T.y + 0.5*(self.T.h - card.T.h) + self.shadow_parrallax.y*deck_height*(#self.cards/(self == G.deck and 1 or 2) - k)
|
||||||
|
card.T.r = 0 + 0.3*self.shuffle_amt*(1 + k*0.05)*(k%2 == 1 and 1 or -0)
|
||||||
|
card.T.x = card.T.x + card.shadow_parrallax.x/30
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local display_limit
|
||||||
|
if not Cartomancer.SETTINGS.compact_deck_enabled then
|
||||||
|
display_limit = 999999
|
||||||
|
else
|
||||||
|
display_limit = Cartomancer.SETTINGS.compact_deck_visible_cards
|
||||||
|
end
|
||||||
|
|
||||||
|
local deck_height = (self.config.deck_height or 0.15)/52
|
||||||
|
local total_cards = #self.cards <= display_limit and #self.cards or display_limit -- limit height
|
||||||
|
local fixedX, fixedY, fixedR = nil, nil, nil
|
||||||
|
|
||||||
|
for k, card in ipairs(self.cards) do
|
||||||
|
if card.facing == 'front' then card:flip() end
|
||||||
|
|
||||||
|
if not card.states.drag.is then
|
||||||
|
if fixedX then
|
||||||
|
card.T.x = fixedX
|
||||||
|
card.T.y = fixedY
|
||||||
|
card.T.r = fixedR -- rotation
|
||||||
|
card.states.visible = false
|
||||||
|
else
|
||||||
|
card.T.x = self.T.x + 0.5*(self.T.w - card.T.w) + self.shadow_parrallax.x*deck_height*(total_cards/(self == G.deck and 1 or 2) - k) + 0.9*self.shuffle_amt*(1 - k*0.01)*(k%2 == 1 and 1 or -0)
|
||||||
|
card.T.y = self.T.y + 0.5*(self.T.h - card.T.h) + self.shadow_parrallax.y*deck_height*(total_cards/(self == G.deck and 1 or 2) - k)
|
||||||
|
card.T.r = 0 + 0.3*self.shuffle_amt*(1 + k*0.05)*(k%2 == 1 and 1 or -0)
|
||||||
|
card.T.x = card.T.x + card.shadow_parrallax.x/30
|
||||||
|
card.states.visible = true
|
||||||
|
|
||||||
|
if k >= display_limit then
|
||||||
|
fixedX = card.T.x
|
||||||
|
fixedY = card.T.y
|
||||||
|
fixedR = card.T.r
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
15
Cartomancer/lovely/saturn-compat.toml
Normal file
15
Cartomancer/lovely/saturn-compat.toml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'main.lua'
|
||||||
|
pattern = '''assert(load(nfs.read(Saturn.PATH .. "/core/logic/hide_played.lua")))()'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
-- Disabled for Cartomancer deck viewer compatibility.
|
||||||
|
-- assert(load(nfs.read(Saturn.PATH .. "/core/logic/hide_played.lua")))()'''
|
||||||
|
match_indent = true
|
||||||
|
|
15
Cartomancer/lovely/stackable-deck-steamodded-0.9.8.toml
Normal file
15
Cartomancer/lovely/stackable-deck-steamodded-0.9.8.toml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
# Add unique count
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "main.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "modded and {"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
not unplayed_only and Cartomancer.add_unique_count() or nil, -- Cartomancer Steamodded 0.9.8 compatibility'''
|
103
Cartomancer/lovely/stackable-deck-steamodded.toml
Normal file
103
Cartomancer/lovely/stackable-deck-steamodded.toml
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
# If somehow someone still uses version that old - maybe add this pattern too
|
||||||
|
# -- Steamodded<0917b
|
||||||
|
# for k, v in ipairs(G.playing_cards) do
|
||||||
|
# table.insert(SUITS[v.base.suit], v)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '=[SMODS _ "src/overrides.lua"]'
|
||||||
|
match_indent = true
|
||||||
|
pattern = '''
|
||||||
|
for k, v in ipairs(G.playing_cards) do
|
||||||
|
if v.base.suit then table.insert(SUITS[v.base.suit], v) end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
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 {deck_view = true, greyed = true}
|
||||||
|
if greyed then
|
||||||
|
card_string = string.format('%sGreyed', card_string)
|
||||||
|
end
|
||||||
|
|
||||||
|
if greyed and Cartomancer.SETTINGS.deck_view_hide_drawn_cards then
|
||||||
|
-- Ignore this card.
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '=[SMODS _ "src/overrides.lua"]'
|
||||||
|
match_indent = true
|
||||||
|
pattern = 'card_limit = #SUITS[suit_map[j]],'
|
||||||
|
position = "at"
|
||||||
|
payload = 'card_limit = #SUITS_SORTED[suit_map[j]],'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '=[SMODS _ "src/overrides.lua"]'
|
||||||
|
match_indent = true
|
||||||
|
pattern = '''
|
||||||
|
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'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
for i = 1, #SUITS_SORTED[suit_map[j]] do
|
||||||
|
local card_string = SUITS_SORTED[suit_map[j]][i]
|
||||||
|
local card = SUITS[suit_map[j]][card_string]
|
||||||
|
|
||||||
|
card.T.x = view_deck.T.x + view_deck.T.w/2
|
||||||
|
card.T.y = view_deck.T.y
|
||||||
|
card:create_quantity_display()
|
||||||
|
|
||||||
|
card:hard_set_T()
|
||||||
|
view_deck:emplace(card)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '=[SMODS _ "src/overrides.lua"]'
|
||||||
|
match_indent = true
|
||||||
|
pattern = ' modded and {n = G.UIT.R, config = {align = "cm"}, nodes = {'
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
not unplayed_only and Cartomancer.add_unique_count() or nil,
|
||||||
|
modded and {n = G.UIT.R, config = {align = "cm"}, nodes = {'''
|
146
Cartomancer/lovely/stackable-deck-vanilla.toml
Normal file
146
Cartomancer/lovely/stackable-deck-vanilla.toml
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
#
|
||||||
|
# Vanilla patches
|
||||||
|
#
|
||||||
|
|
||||||
|
# Overwrite how suits are added
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "table.insert(SUITS[v.base.suit], v)"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
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 {deck_view = true}
|
||||||
|
if greyed then
|
||||||
|
card_string = card_string .. "Greyed"
|
||||||
|
end
|
||||||
|
|
||||||
|
if greyed and Cartomancer.SETTINGS.deck_view_hide_drawn_cards then
|
||||||
|
-- Ignore this card.
|
||||||
|
elseif not SUITS[v.base.suit][card_string] then
|
||||||
|
table.insert(SUITS_SORTED[v.base.suit], card_string)
|
||||||
|
|
||||||
|
local _scale = 0.7
|
||||||
|
local copy = copy_card(v, nil, _scale)
|
||||||
|
|
||||||
|
copy.greyed = greyed
|
||||||
|
copy.stacked_quantity = 1
|
||||||
|
|
||||||
|
SUITS[v.base.suit][card_string] = copy
|
||||||
|
else
|
||||||
|
local stacked_card = SUITS[v.base.suit][card_string]
|
||||||
|
stacked_card.stacked_quantity = stacked_card.stacked_quantity + 1
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''
|
||||||
|
if SUITS[suit_map[j]][1] then
|
||||||
|
local view_deck = CardArea('''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if SUITS_SORTED[suit_map[j]][1] then
|
||||||
|
local view_deck = CardArea('''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'}"
|
||||||
|
position = "after"
|
||||||
|
payload = "local SUITS_SORTED = Cartomancer.tablecopy(SUITS)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "local suit_tallies = {['Spades'] = 0, ['Hearts'] = 0, ['Clubs'] = 0, ['Diamonds'] = 0}"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
-----------------------------------------------------------
|
||||||
|
-- Add empty card area to view deck to fix a visual issue with missing deck.
|
||||||
|
if not next(deck_tables) then
|
||||||
|
local view_deck = CardArea(
|
||||||
|
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
|
||||||
|
6.5*G.CARD_W,
|
||||||
|
0.6*G.CARD_H,
|
||||||
|
{card_limit = 1, type = 'title', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.7, draw_layers = {'card'}})
|
||||||
|
|
||||||
|
table.insert(
|
||||||
|
deck_tables,
|
||||||
|
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
|
||||||
|
{n=G.UIT.O, config={object = view_deck}}
|
||||||
|
}}
|
||||||
|
)
|
||||||
|
end
|
||||||
|
-----------------------------------------------------------
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "{card_limit = #SUITS[suit_map[j]], type = 'title', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.7, draw_layers = {'card'}})"
|
||||||
|
position = "at"
|
||||||
|
payload = "{card_limit = #SUITS_SORTED[suit_map[j]], type = 'title', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.7, draw_layers = {'card'}})"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Add unique count
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''modded and {n=G.UIT.R, config={align = "cm"}, nodes={'''
|
||||||
|
position = "before"
|
||||||
|
payload = "not unplayed_only and Cartomancer.add_unique_count() or nil,"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Overwrite cards copy and display code
|
||||||
|
|
||||||
|
#Note for self: multi line pattern patches only work with original spacing.
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''
|
||||||
|
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'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
for i = 1, #SUITS_SORTED[suit_map[j]] do
|
||||||
|
local card_string = SUITS_SORTED[suit_map[j]][i]
|
||||||
|
local card = SUITS[suit_map[j]][card_string]
|
||||||
|
|
||||||
|
card.T.x = view_deck.T.x + view_deck.T.w/2
|
||||||
|
card.T.y = view_deck.T.y
|
||||||
|
card:create_quantity_display()
|
||||||
|
|
||||||
|
card:hard_set_T()
|
||||||
|
view_deck:emplace(card)
|
||||||
|
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
14
Cartomancer/lovely/tags.toml
Normal file
14
Cartomancer/lovely/tags.toml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = '''G.FUNCS.blind_chip_UI_scale(G.hand_text_area.blind_chips)'''
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
Cartomancer.update_tags_visibility()'''
|
||||||
|
match_indent = true
|
90
Cartomancer/lovely/vanilla-ui.toml
Normal file
90
Cartomancer/lovely/vanilla-ui.toml
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
|
||||||
|
# Localization
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "boot_timer('prep stage', 'splash prep',1)"
|
||||||
|
position = "before"
|
||||||
|
payload = "Cartomancer.load_mod_file('internal/localization.lua', 'localization')"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Add tab button to settings menu
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
match_indent = true
|
||||||
|
position = "before"
|
||||||
|
pattern = '''local t = create_UIBox_generic_options({back_func = 'options',contents = {create_tabs('''
|
||||||
|
payload = '''
|
||||||
|
local settings_icon = Cartomancer.add_settings_icon()
|
||||||
|
if settings_icon then
|
||||||
|
tabs[#tabs+1] = {
|
||||||
|
colour = G.C.MONEY,
|
||||||
|
custom_button = {settings_icon},
|
||||||
|
tab_definition_function = Cartomancer.config_tab,
|
||||||
|
tab_definition_function_args = ''
|
||||||
|
}
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Use custom button
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
pattern = '''but_UI_label'''
|
||||||
|
payload = '''
|
||||||
|
args.ref_table and args.ref_table.custom_button or but_UI_label -- Cartomancer'''
|
||||||
|
|
||||||
|
# Use custom color
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
pattern = '''colour = args.colour,'''
|
||||||
|
payload = '''
|
||||||
|
colour = args.ref_table and args.ref_table.colour or args.colour, -- Cartomancer'''
|
||||||
|
|
||||||
|
|
||||||
|
# From steamodded for vertical tabs support.
|
||||||
|
# Fix UIElement.config.chosen being overriden if choice=true is set
|
||||||
|
# UIElement:click()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/ui.lua"
|
||||||
|
match_indent = true
|
||||||
|
position = "after"
|
||||||
|
pattern = "if self.config.choice then"
|
||||||
|
payload = " local chosen_temp = self.config.chosen"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/ui.lua"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
pattern = "self.config.chosen = true"
|
||||||
|
payload = "self.config.chosen = chosen_temp or true"
|
||||||
|
|
||||||
|
# Add dynamic label support to UIBox_button
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
match_indent = true
|
||||||
|
position = "before"
|
||||||
|
pattern = "for k, v in ipairs(args.label) do"
|
||||||
|
payload = '''
|
||||||
|
if args.dynamic_label then
|
||||||
|
but_UI_label = {}
|
||||||
|
|
||||||
|
table.insert(but_UI_label, {n=G.UIT.R, config={align = "cm", padding = 0, minw = args.minw, maxw = args.maxw}, nodes={
|
||||||
|
{n=G.UIT.T, config={ref_table = args.dynamic_label, ref_value = 'text', scale = args.scale, colour = args.text_colour, shadow = args.shadow, focus_args = button_pip and args.focus_args or nil, func = button_pip,}}
|
||||||
|
}})
|
||||||
|
end
|
||||||
|
'''
|
58
Cartomancer/lovely/zoom-jokers.toml
Normal file
58
Cartomancer/lovely/zoom-jokers.toml
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 69
|
||||||
|
|
||||||
|
# Replace joker sorting. Needs better mod compat
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "if self.config.type == 'joker' or self.config.type == 'title_2' then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self == G.jokers and G.jokers.cart_jokers_expanded then
|
||||||
|
local align_cards = Cartomancer.expand_G_jokers()
|
||||||
|
|
||||||
|
-- This should work fine without cryptid. But because cryptid's patch is priority=0, it has to be this way
|
||||||
|
if not G.GAME.modifiers.cry_conveyor then
|
||||||
|
table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*(a.pinned and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.pinned and b.sort_id or 0) end)
|
||||||
|
end
|
||||||
|
|
||||||
|
if align_cards then
|
||||||
|
G.jokers:hard_set_cards()
|
||||||
|
end
|
||||||
|
elseif self.config.type == 'joker' or self.config.type == 'title_2' then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Hide all cards that are off-screen
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if not self.states.visible then return end"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self.VT.x < -3 or self.VT.x > G.TILE_W + 2.5 then return end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Add slider ID
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''{n=G.UIT.B, config={w=startval,h=args.h, r = 0.1, colour = args.colour, ref_table = args, refresh_movement = true}},'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
{n=G.UIT.B, config={id = args.id, w=startval,h=args.h, r = 0.1, colour = args.colour, ref_table = args, refresh_movement = true}},
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Hide slider value
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''
|
||||||
|
(?<content>\{n=G\.UIT\.C\, config=\{align = "cm"\, minh = args\.h\,r = 0\.1\, minw = 0\.8\, colour = args\.colour\,shadow = true\}\, nodes=\{
|
||||||
|
[\t ]*\{n=G\.UIT\.T\, config=\{ref_table = args\, ref_value = 'text'\, scale = args\.text_scale\, colour = G\.C\.UI\.TEXT_LIGHT\, decimal_places = args\.decimal_places\}\}
|
||||||
|
[\t ]*\}\})\,'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
not args.hide_val and $content or nil'''
|
300
Cryptid/lovely/Probability.toml
Normal file
300
Cryptid/lovely/Probability.toml
Normal file
|
@ -0,0 +1,300 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 5
|
||||||
|
|
||||||
|
# there's gonna be a lot of this
|
||||||
|
# init all cards with ability.cry_prob
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "self.base_cost = center.cost or 1"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
self.ability.cry_prob = 1
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# define function in lovely
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "function save_run()"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
function cry_prob(owned, den, rigged)
|
||||||
|
prob = G.GAME and G.GAME.probabilities.normal or 1
|
||||||
|
if rigged then
|
||||||
|
return den
|
||||||
|
else
|
||||||
|
if owned then return prob*owned else return prob end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# lucky
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''elseif _c.effect == 'Lucky Card' then loc_vars = {G.GAME.probabilities.normal, cfg.mult, 5, cfg.p_dollars, 15}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif _c.effect == 'Lucky Card' then loc_vars = {cfg.cry_prob and cry_prob(cfg.cry_prob, 15, cfg.cry_rigged) or G.GAME.probabilities.normal, cfg.mult, 5, cfg.p_dollars, 15}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if pseudorandom('lucky_money') < G.GAME.probabilities.normal/15 then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if pseudorandom('lucky_money') < cry_prob(self.ability.cry_prob, 15, self.ability.cry_rigged)/15 then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if pseudorandom('lucky_mult') < G.GAME.probabilities.normal/5 then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if pseudorandom('lucky_mult') < cry_prob(self.ability.cry_prob, 5, self.ability.cry_rigged)/5 then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# glass
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''elseif _c.effect == 'Glass Card' then loc_vars = {cfg.Xmult, G.GAME.probabilities.normal, cfg.extra}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif _c.effect == 'Glass Card' then loc_vars = {cfg.Xmult, cfg.cry_prob and cry_prob(cfg.cry_prob, cfg.extra, cfg.cry_rigged) or G.GAME.probabilities.normal, cfg.extra}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# wow this is a fat line
|
||||||
|
# Yellow Stake - Glass can't destroy Eternals
|
||||||
|
# Glass Stake - Any card can shatter
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''if SMODS.has_enhancement(scoring_hand[i], 'm_glass') and not scoring_hand[i].debuff and pseudorandom('glass') < G.GAME.probabilities.normal/(scoring_hand[i].ability.name == 'Glass Card' and scoring_hand[i].ability.extra or G.P_CENTERS.m_glass.config.extra) then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if (SMODS.has_enhancement(scoring_hand[i], 'm_glass')
|
||||||
|
and not scoring_hand[i].debuff
|
||||||
|
and pseudorandom('glass') < cry_prob(
|
||||||
|
scoring_hand[i].ability.cry_prob,
|
||||||
|
scoring_hand[i].ability.extra or G.P_CENTERS.m_glass.config.extra,
|
||||||
|
scoring_hand[i].ability.cry_rigged
|
||||||
|
) / (scoring_hand[i].ability.name == 'Glass Card'
|
||||||
|
and scoring_hand[i].ability.extra
|
||||||
|
or G.P_CENTERS.m_glass.config.extra)
|
||||||
|
or (G.GAME.modifiers.cry_shatter_rate
|
||||||
|
and pseudorandom('cry_shatter') < 1 / G.GAME.modifiers.cry_shatter_rate))
|
||||||
|
and not scoring_hand[i].ability.eternal then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# wheeeeeeeeeeel
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''elseif _c.name == "The Wheel of Fortune" then loc_vars = {G.GAME.probabilities.normal, cfg.extra}; info_queue[#info_queue+1] = G.P_CENTERS.e_foil; info_queue[#info_queue+1] = G.P_CENTERS.e_holo; info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome;'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif _c.name == "The Wheel of Fortune" then loc_vars = {cfg.cry_prob and cry_prob(cfg.cry_prob, cfg.extra, cfg.cry_rigged) or G.GAME.probabilities.normal, cfg.extra}; info_queue[#info_queue+1] = G.P_CENTERS.e_foil; info_queue[#info_queue+1] = G.P_CENTERS.e_holo; info_queue[#info_queue+1] = G.P_CENTERS.e_polychrome;
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' or pseudorandom('wheel_of_fortune') < G.GAME.probabilities.normal/self.ability.extra then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' or pseudorandom('wheel_of_fortune') < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# ok now onto jonklers
|
||||||
|
|
||||||
|
# space
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''elseif self.ability.name == 'Space Joker' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif self.ability.name == 'Space Joker' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged), self.ability.extra}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if self.ability.name == 'Space Joker' and pseudorandom('space') < G.GAME.probabilities.normal/self.ability.extra then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Space Joker' and pseudorandom('space') < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# 8ball
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''elseif self.ability.name == '8 Ball' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1),self.ability.extra}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif self.ability.name == '8 Ball' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged),self.ability.extra}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if (context.other_card:get_id() == 8) and (pseudorandom('8ball') < G.GAME.probabilities.normal/self.ability.extra) then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if (context.other_card:get_id() == 8) and (pseudorandom('8ball') < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# business
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''elseif self.ability.name == 'Business Card' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif self.ability.name == 'Business Card' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged),self.ability.extra}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''pseudorandom('business') < G.GAME.probabilities.normal/self.ability.extra then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
pseudorandom('business') < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# gros michel + cavendish
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''elseif self.ability.name == 'Gros Michel' then loc_vars = {self.ability.extra.mult, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif self.ability.name == 'Gros Michel' then loc_vars = {self.ability.extra.mult, cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged), self.ability.extra.odds}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''elseif self.ability.name == 'Cavendish' then loc_vars = {self.ability.extra.Xmult, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif self.ability.name == 'Cavendish' then loc_vars = {self.ability.extra.Xmult, cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged), self.ability.extra.odds}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if pseudorandom(self.ability.name == 'Cavendish' and 'cavendish' or 'gros_michel') < G.GAME.probabilities.normal/self.ability.extra.odds then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if pseudorandom(self.ability.name == 'Cavendish' and 'cavendish' or 'gros_michel') < cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged)/self.ability.extra.odds then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# business
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''elseif self.ability.name == 'Business Card' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif self.ability.name == 'Business Card' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged),self.ability.extra}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''pseudorandom('business') < G.GAME.probabilities.normal/self.ability.extra then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
pseudorandom('business') < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# bloodstone
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''elseif self.ability.name == 'Bloodstone' then loc_vars = {''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds, self.ability.extra.Xmult}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif self.ability.name == 'Bloodstone' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged), self.ability.extra.odds, self.ability.extra.Xmult}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''pseudorandom('bloodstone') < G.GAME.probabilities.normal/self.ability.extra.odds then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
pseudorandom('bloodstone') < cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged)/self.ability.extra.odds then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# reserved parking
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''elseif self.ability.name == 'Reserved Parking' then loc_vars = {self.ability.extra.dollars, ''..(G.GAME and G.GAME.probabilities.normal or 1), self.ability.extra.odds}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif self.ability.name == 'Reserved Parking' then loc_vars = {self.ability.extra.dollars, cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged), self.ability.extra.odds}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''pseudorandom('parking') < G.GAME.probabilities.normal/self.ability.extra.odds then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
pseudorandom('parking') < cry_prob(self.ability.cry_prob, self.ability.extra.odds, self.ability.cry_rigged)/self.ability.extra.odds then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# hallucination
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''elseif self.ability.name == 'Hallucination' then loc_vars = {G.GAME.probabilities.normal, self.ability.extra}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif self.ability.name == 'Hallucination' then loc_vars = {cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged), self.ability.extra}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if pseudorandom('halu'..G.GAME.round_resets.ante) < G.GAME.probabilities.normal/self.ability.extra then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if pseudorandom('halu'..G.GAME.round_resets.ante) < cry_prob(self.ability.cry_prob, self.ability.extra, self.ability.cry_rigged)/self.ability.extra then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
38
Cryptid/lovely/achievement.toml
Normal file
38
Cryptid/lovely/achievement.toml
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
## Cryptid Achievements
|
||||||
|
|
||||||
|
# Check to earn some achievements on startup
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''check_for_unlock({type = 'blind_discoveries'})'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if change_context ~= "splash" then
|
||||||
|
if not (G.ACHIEVEMENTS and G.ACHIEVEMENTS['ach_cry_used_crash'] and G.ACHIEVEMENTS['ach_cry_used_crash'].earned) then check_for_unlock({type = 'ach_cry_used_crash'}) end
|
||||||
|
if not (G.ACHIEVEMENTS and G.ACHIEVEMENTS['ach_cry_traffic_jam'] and G.ACHIEVEMENTS['ach_cry_traffic_jam'].earned) then check_for_unlock({type = 'win_challenge_startup'}) end
|
||||||
|
if not (G.ACHIEVEMENTS and G.ACHIEVEMENTS['ach_cry_perfectly_balanced'] and G.ACHIEVEMENTS['ach_cry_perfectly_balanced'].earned) then check_for_unlock({type = 'win_stake_startup'}) end
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Cryptid the Cryptid check
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''new_cards[#new_cards+1] = _card'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''if _card.config.center.key == "c_cryptid" then check_for_unlock({type = "cryptid_the_cryptid"}) end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# WHAT HAVE YOU DONE check
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''local sliced_card = G.jokers.cards[my_pos+1]'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''if sliced_card.config.center.rarity == "cry_exotic" then check_for_unlock({type = "what_have_you_done"}) end'''
|
||||||
|
match_indent = true
|
80
Cryptid/lovely/blind.toml
Normal file
80
Cryptid/lovely/blind.toml
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# The Tax effect
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "func = (function() update_hand_text({delay = 0, immediate = true}, {mult = 0, chips = 0, chip_total = math.floor(hand_chips*mult), level = '', handname = ''});play_sound('button', 0.9, 0.6);return true end)"
|
||||||
|
position = "at"
|
||||||
|
payload = "func = (function() update_hand_text({delay = 0, immediate = true}, {mult = 0, chips = 0, chip_total = G.GAME.blind.cry_cap_score and G.GAME.blind:cry_cap_score(math.floor(hand_chips*mult)) or math.floor(hand_chips*mult), level = '', handname = ''});play_sound('button', 0.9, 0.6);return true end)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "ease_to = G.GAME.chips + math.floor(hand_chips*mult),"
|
||||||
|
position = "at"
|
||||||
|
payload = "ease_to = G.GAME.chips + (G.GAME.blind.cry_cap_score and G.GAME.blind:cry_cap_score(math.floor(hand_chips*mult)) or math.floor(hand_chips*mult)),"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Bunco (Magenta Dagger) and Cryptid (The Tax) compat
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/state_events.lua'
|
||||||
|
pattern = "ease_to = G.GAME.chips + math.floor(hand_chips * mult) * (e and e.antiscore and -1 or 1),"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''ease_to = G.GAME.chips + (G.GAME.blind.cry_cap_score and G.GAME.blind:cry_cap_score(math.floor(hand_chips*mult)) or math.floor(hand_chips*mult)) * (e and e.antiscore and -1 or 1),'''
|
||||||
|
|
||||||
|
# Fix a crash related to undebuffing Jokers at end of round
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if not G.P_CENTERS['e_'..(self.edition.type)].discovered then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if self.edition.type and G.P_CENTERS['e_'..(self.edition.type)] and not G.P_CENTERS['e_'..(self.edition.type)].discovered then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Blocks hands with more than 5 cards with Psychic
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "blind.lua"
|
||||||
|
pattern = "if self.debuff.h_size_ge and #cards < self.debuff.h_size_ge then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if self.name == "The Psychic" and #cards > 5 then
|
||||||
|
self.triggered = true
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Shut the up plz and ty
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "blind.lua"
|
||||||
|
pattern = '''sendWarnMessage(("Blind object %s has debuff_card function, recalc_debuff is preferred"):format(obj.key), obj.set)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
-- sendWarnMessage(("Blind object %s has debuff_card function, recalc_debuff is preferred"):format(obj.key), obj.set)
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# track game overs by blinds on profiles
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''local blind_choice = {config = G.GAME.blind.config.blind or G.P_BLINDS.bl_small}'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
local cry_defeated_by = blind_choice.config.name or "Small Blind"
|
||||||
|
if not G.PROFILES[G.SETTINGS.profile].cry_defeated_by_blind then G.PROFILES[G.SETTINGS.profile].cry_defeated_by_blind = {} end
|
||||||
|
G.PROFILES[G.SETTINGS.profile].cry_defeated_by_blind[cry_defeated_by] = (G.PROFILES[G.SETTINGS.profile].cry_defeated_by_blind[cry_defeated_by] or 0) + 1
|
||||||
|
check_for_unlock({ type = "lose_to_specific_blind", blind = cry_defeated_by, amount = G.PROFILES[G.SETTINGS.profile].cry_defeated_by_blind[cry_defeated_by] })
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
335
Cryptid/lovely/cat.toml
Normal file
335
Cryptid/lovely/cat.toml
Normal file
|
@ -0,0 +1,335 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 1
|
||||||
|
|
||||||
|
# what in ze fuck am i cooking
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = '''tag_sprite.states.collide.can = true'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self.key == 'tag_cry_cat' then tag_sprite.states.click.can = true; tag_sprite.states.drag.can = true end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# m
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = '''tag_sprite.stop_hover = function(_self) _self.hovering = false; Node.stop_hover(_self); _self.hover_tilt = 0 end'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
tag_sprite.click = function(_self)
|
||||||
|
if self.key == 'tag_cry_cat' and self.HUD_tag then
|
||||||
|
for i = 1, #G.GAME.tags do
|
||||||
|
local other_cat = G.GAME.tags[i]
|
||||||
|
if other_cat.key == 'tag_cry_cat' then
|
||||||
|
if not self.ability.level then self.ability.level = 1 end
|
||||||
|
if not other_cat.ability.level then other_cat.ability.level = 1 end -- setting ability just doesn't seem to be working... so you get this
|
||||||
|
if (self.ability.level == other_cat.ability.level) and (other_cat ~= self) and not cry_too_fast_kitty then
|
||||||
|
cry_too_fast_kitty = true
|
||||||
|
local perc = (other_cat.ability.level + 1)/10
|
||||||
|
if perc > 1 then perc = 1 end
|
||||||
|
|
||||||
|
local edition = G.P_CENTER_POOLS.Edition[1]
|
||||||
|
local j = 1
|
||||||
|
while j < other_cat.ability.level + 1 do
|
||||||
|
for i = 2, #G.P_CENTER_POOLS.Edition do
|
||||||
|
j = j + 1
|
||||||
|
if j >= other_cat.ability.level + 1 then
|
||||||
|
edition = G.P_CENTER_POOLS.Edition[i]
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
delay = 0.0,
|
||||||
|
trigger = 'immediate',
|
||||||
|
func = (function()
|
||||||
|
attention_text({
|
||||||
|
text = ""..other_cat.ability.level,
|
||||||
|
colour = G.C.WHITE,
|
||||||
|
scale = 1,
|
||||||
|
hold = 0.3/G.SETTINGS.GAMESPEED,
|
||||||
|
cover = other_cat.HUD_tag,
|
||||||
|
cover_colour = G.C.DARK_EDITION,
|
||||||
|
align = 'cm',
|
||||||
|
})
|
||||||
|
play_sound('generic1', 0.8 + perc/2, 0.6)
|
||||||
|
play_sound('multhit1', 0.9 + perc/2, 0.4)
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
}))
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
delay = 0.0,
|
||||||
|
trigger = 'immediate',
|
||||||
|
func = (function()
|
||||||
|
attention_text({
|
||||||
|
text = "-",
|
||||||
|
colour = G.C.WHITE,
|
||||||
|
scale = 1,
|
||||||
|
hold = 0.3/G.SETTINGS.GAMESPEED,
|
||||||
|
cover = self.HUD_tag,
|
||||||
|
cover_colour = G.C.RED,
|
||||||
|
align = 'cm',
|
||||||
|
})
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
}))
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
func = (function()
|
||||||
|
self.HUD_tag.states.visible = false
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
}))
|
||||||
|
G.E_MANAGER:add_event(Event({ -- i have no idea what this does but i'm not messing with it
|
||||||
|
func = func
|
||||||
|
}))
|
||||||
|
|
||||||
|
other_cat.ability.level = other_cat.ability.level + 1
|
||||||
|
|
||||||
|
if self.ability.shiny then
|
||||||
|
if not Cryptid.shinytagdata[self.key] then
|
||||||
|
Cryptid.shinytagdata[self.key] = true
|
||||||
|
Cryptid.save()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
trigger = 'after',
|
||||||
|
delay = 0.7,
|
||||||
|
func = (function()
|
||||||
|
other_cat:juice_up(0.25, 0.1)
|
||||||
|
other_cat.ability.edshader = edition.shader
|
||||||
|
play_sound(edition.sound.sound, (edition.sound.per or 1)*1.3, (edition.sound.vol or 0.25)*0.6)
|
||||||
|
self:remove()
|
||||||
|
cry_too_fast_kitty = nil
|
||||||
|
return true
|
||||||
|
end)
|
||||||
|
}))
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# tag_sprite draw
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = '''tag_sprite.stop_hover = function(_self) _self.hovering = false; Node.stop_hover(_self); _self.hover_tilt = 0 end'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
tag_sprite.draw = function(_self)
|
||||||
|
if not _self.states.visible then return end
|
||||||
|
|
||||||
|
_self.tilt_var = self.tilt_var or {mx = 0, my = 0, dx = _self.tilt_var.dx or 0, dy = _self.tilt_var.dy or 0, amt = 0}
|
||||||
|
_self.tilt_var.mx, _self.tilt_var.my = G.CONTROLLER.cursor_position.x, G.CONTROLLER.cursor_position.y
|
||||||
|
_self.tilt_var.amt = math.abs(_self.hover_offset.y + _self.hover_offset.x - 10)*0.3
|
||||||
|
|
||||||
|
_self.ARGS.send_to_shader = _self.ARGS.send_to_shader or {}
|
||||||
|
_self.ARGS.send_to_shader[1] = math.min(_self.VT.r*3, 1) + G.TIMERS.REAL/(28) + (_self.juice and _self.juice.r*10 or 0) + _self.tilt_var.amt
|
||||||
|
_self.ARGS.send_to_shader[2] = G.TIMERS.REAL*2
|
||||||
|
|
||||||
|
_self.tilt_var = _self.tilt_var or {}
|
||||||
|
_self.tilt_var.mx, _self.tilt_var.my =G.CONTROLLER.cursor_position.x,G.CONTROLLER.cursor_position.y
|
||||||
|
|
||||||
|
_self.role.draw_major = _self
|
||||||
|
_self:draw_shader('dissolve', 0.1)
|
||||||
|
local ed = _self.config.tag.ability.edshader
|
||||||
|
if ed then
|
||||||
|
if ed == 'foil' or ed == 'cry_noisy' then
|
||||||
|
_self:draw_shader('dissolve')
|
||||||
|
end
|
||||||
|
_self:draw_shader(ed, nil, _self.ARGS.send_to_shader)
|
||||||
|
if ed == 'negative' or ed == 'cry_oversat' then
|
||||||
|
_self:draw_shader('negative_shine', nil, _self.ARGS.send_to_shader)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
_self:draw_shader('dissolve')
|
||||||
|
end
|
||||||
|
add_to_drawhash(_self)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# init tilt_var
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = '''tag_sprite.T.scale = 1'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
tag_sprite.tilt_var = {mx = 0, my = 0, dx = 0, dy = 0, amt = 0}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# make the cat tag meow (can probably do this without injecting?)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = '''play_sound('tarot2', math.random()*0.1 + 0.55, 0.09)'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if self.key == 'tag_cry_cat' and not self.hide_ability then
|
||||||
|
play_sound('cry_meow'..math.random(4), 1.26, 0.12);
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# shiny tags
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = '''local tag_sprite = Sprite(0,0,_size*1,_size*1,G.ASSET_ATLAS[(not self.hide_ability) and G.P_TAGS[self.key].atlas or "tags"], (self.hide_ability) and G.tag_undiscovered.pos or self.pos)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local tagatlas = G.ASSET_ATLAS[(not self.hide_ability) and G.P_TAGS[self.key].atlas or "tags"]
|
||||||
|
if self.ability.shiny and not self.hide_ability then
|
||||||
|
if not G.P_TAGS[self.key].atlas then
|
||||||
|
tagatlas = G.ASSET_ATLAS['cry_shinyv']
|
||||||
|
elseif G.P_TAGS[self.key].atlas == 'cry_tag_cry' then
|
||||||
|
tagatlas = G.ASSET_ATLAS['cry_shinyc']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local tag_sprite = Sprite(0,0,_size*1,_size*1,tagatlas, (self.hide_ability) and G.tag_undiscovered.pos or self.pos)
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# collection
|
||||||
|
# nice pattern match?
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/overrides.lua"]'''
|
||||||
|
pattern = '''
|
||||||
|
opt_callback = 'your_collection_tags_page',
|
||||||
|
focus_args = { snap_to = true, nav = 'wide' },
|
||||||
|
current_option = page,
|
||||||
|
colour = G.C.RED,
|
||||||
|
no_pips = true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
,
|
||||||
|
Cryptid.shinytag_tally() > 0 and create_toggle{ -- tally function runs way too often but whatever
|
||||||
|
label = localize('k_cry_shiny'),
|
||||||
|
w = 0,
|
||||||
|
ref_table = G,
|
||||||
|
ref_value = "showshinytags"
|
||||||
|
} or nil,
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/overrides.lua"]'''
|
||||||
|
pattern = '''
|
||||||
|
if not v.discovered then temp_tag.hide_ability = true end
|
||||||
|
'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.showshinytags then
|
||||||
|
temp_tag.ability.shiny = true
|
||||||
|
if not Cryptid.shinytagdata[temp_tag.key] then
|
||||||
|
temp_tag.hide_ability = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# i can't seem to get the tag page easily
|
||||||
|
# i'm also surprised this doesn't multipatch
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/overrides.lua"]'''
|
||||||
|
pattern = '''
|
||||||
|
local page = args.cycle_config.current_option or 1
|
||||||
|
'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if args then G.cry_current_tagpage = args.cycle_config.current_option end
|
||||||
|
local page = args and args.cycle_config.current_option or G.cry_current_tagpage or 1
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# update collection
|
||||||
|
# scuffed
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''game.lua'''
|
||||||
|
pattern = '''
|
||||||
|
self.E_MANAGER:update(self.real_dt)
|
||||||
|
'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if not G.showshinytags then G.showshinytags = false end
|
||||||
|
if not G.showshinytags_b then G.showshinytags_b = false end
|
||||||
|
|
||||||
|
if G.showshinytags ~= G.showshinytags_b then
|
||||||
|
G.showshinytags_b = G.showshinytags
|
||||||
|
G.FUNCS.your_collection_tags_page()
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# save+loading time
|
||||||
|
|
||||||
|
# cryptidsave stuff
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''game.lua'''
|
||||||
|
pattern = '''
|
||||||
|
if not love.filesystem.getInfo(G.SETTINGS.profile..'/'..'meta.jkr') then love.filesystem.append( G.SETTINGS.profile..'/'..'meta.jkr', 'return {}') end
|
||||||
|
'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if not love.filesystem.getInfo(G.SETTINGS.profile..'/'..'cryptidsave.jkr') then love.filesystem.append( G.SETTINGS.profile..'/'..'cryptidsave.jkr', 'return {}') end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''game.lua'''
|
||||||
|
pattern = '''
|
||||||
|
local meta = STR_UNPACK(get_compressed(G.SETTINGS.profile..'/'..'meta.jkr') or 'return {}')
|
||||||
|
'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
local cryptidsave = STR_UNPACK(get_compressed(G.SETTINGS.profile..'/'..'cryptidsave.jkr') or 'return {}')
|
||||||
|
|
||||||
|
if cryptidsave and cryptidsave.shinytags then
|
||||||
|
Cryptid.shinytagdata = copy_table(cryptidsave.shinytags)
|
||||||
|
else
|
||||||
|
-- populated later when tags actually exist
|
||||||
|
Cryptid.shinytagdata = {}
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''tag.lua'''
|
||||||
|
pattern = '''
|
||||||
|
function Tag:yep(message, _colour, func)
|
||||||
|
'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.shiny then
|
||||||
|
if not Cryptid.shinytagdata[self.key] then
|
||||||
|
Cryptid.shinytagdata[self.key] = true
|
||||||
|
Cryptid.save()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
109
Cryptid/lovely/ccd.toml
Normal file
109
Cryptid/lovely/ccd.toml
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# This is sacrilegious
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "self.GAME.starting_deck_size = #G.playing_cards"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.modifiers.cry_ccd then
|
||||||
|
for k, v in pairs(G.playing_cards) do
|
||||||
|
v:set_ability(Cryptid.random_consumable('cry_ccd',{"no_doe", "no_grc"}, nil, nil, true), true, nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Aura use conditions
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if G.hand and (#G.hand.highlighted == 1) and G.hand.highlighted[1] and (not G.hand.highlighted[1].edition) then return true end"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.area ~= G.hand then
|
||||||
|
return G.hand and (#G.hand.highlighted == 1) and G.hand.highlighted[1] and (not G.hand.highlighted[1].edition)
|
||||||
|
else
|
||||||
|
local idx = 1
|
||||||
|
if G.hand.highlighted[1] == self then
|
||||||
|
local idx = 2
|
||||||
|
end
|
||||||
|
return (#G.hand.highlighted == 2) and (not G.hand.highlighted[idx].edition)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Prevent counting CCD consumables for pack uses
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "if area == G.consumeables then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if area == G.consumeables or area == G.hand then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Fix bugs from removing CCD
|
||||||
|
# This really shouldn't be in the card drawing code, but it doesn't really matter since that's where it crashes anyway lol
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if not self.config.center.discovered and (self.ability.consumeable or self.config.center.unlocked) and not self.config.center.demo and not self.bypass_discovery_center then"
|
||||||
|
position = "before"
|
||||||
|
payload = "if self.ability.set == 'Enhanced' then self.ability.consumeable = nil end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# ui, ui, ui
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''name_from_rows(AUT.name, is_playing_card and G.C.WHITE or nil),'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
AUT.ccd and name_from_rows(AUT.ccd.name, G.C.WHITE) or nil,
|
||||||
|
AUT.ccd and desc_from_rows(AUT.ccd.main) or nil,
|
||||||
|
name_from_rows(AUT.name, is_playing_card and G.C.WHITE or nil),
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# i love patching like five billion things
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''return generate_card_ui(self.config.center, nil, loc_vars, card_type, badges, hide_desc, main_start, main_end, self)'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if card_type ~= 'Default' and card_type ~= 'Enhanced' and self.playing_card then
|
||||||
|
loc_vars = loc_vars or {}
|
||||||
|
loc_vars.ccd = {
|
||||||
|
playing_card = not not self.base.colour, value = self.base.value, suit = self.base.suit, colour = self.base.colour,
|
||||||
|
nominal_chips = self.base.nominal > 0 and self.base.nominal or nil,
|
||||||
|
bonus_chips = (self.ability.bonus + (self.ability.perma_bonus or 0)) > 0 and (self.ability.bonus + (self.ability.perma_bonus or 0)) or nil,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# lalala ok this is a mess
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''local loc_vars = {}'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if specific_vars and specific_vars.ccd then
|
||||||
|
full_UI_table.ccd = {name = {}, main = {}}
|
||||||
|
localize{type = 'other', key = 'playing_card', set = 'Other', nodes = full_UI_table.ccd.name, vars = {localize(specific_vars.ccd.value, 'ranks'), localize(specific_vars.ccd.suit, 'suits_plural'), colours = {specific_vars.ccd.colour}}}
|
||||||
|
full_UI_table.ccd.name = full_UI_table.ccd.name[1]
|
||||||
|
if specific_vars.ccd.nominal_chips then
|
||||||
|
localize{type = 'other', key = 'card_chips', nodes = full_UI_table.ccd.main, vars = {specific_vars.ccd.nominal_chips}}
|
||||||
|
end
|
||||||
|
if specific_vars.ccd.bonus_chips then
|
||||||
|
localize{type = 'other', key = 'card_extra_chips', nodes = full_UI_table.ccd.main, vars = {specific_vars.ccd.bonus_chips}}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
31
Cryptid/lovely/challenges.toml
Normal file
31
Cryptid/lovely/challenges.toml
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Rush Hour - remove tags
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "if type == 'Small' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if type == 'Small' and not G.GAME.modifiers.cry_no_tags then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Rush Hour - remove tags
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "elseif type == 'Big' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "elseif type == 'Big' and not G.GAME.modifiers.cry_no_tags then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Rush Hour - remove tags
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "elseif not run_info then"
|
||||||
|
position = "at"
|
||||||
|
payload = "elseif type == 'Boss' and not run_info then"
|
||||||
|
match_indent = true
|
384
Cryptid/lovely/code.toml
Normal file
384
Cryptid/lovely/code.toml
Normal file
|
@ -0,0 +1,384 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Code UI disables hold R shortcut
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/controller.lua"
|
||||||
|
pattern = 'if key == "r" and not G.SETTINGS.paused then'
|
||||||
|
position = "at"
|
||||||
|
payload = 'if key == "r" and not G.SETTINGS.paused and not (G.GAME and G.GAME.USING_CODE) then'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Payload - cash out UI
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif config.name == 'interest' then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
elseif config.name == 'interest_payload' then
|
||||||
|
table.insert(left_text, {n=G.UIT.T, config={text = num_dollars, scale = 0.8*scale, colour = G.C.SECONDARY_SET.Code, shadow = true, juice = true}})
|
||||||
|
table.insert(left_text,{n=G.UIT.O, config={object = DynaText({string = {" "..localize{type = 'variable', key = 'interest', vars = {G.GAME.interest_amount*config.payload, 5, G.GAME.interest_amount*config.payload*G.GAME.interest_cap/5}}}, colours = {G.C.SECONDARY_SET.Code}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}})
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Payload - cash out
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest and G.GAME.cry_payload then
|
||||||
|
add_round_eval_row({bonus = true, payload = G.GAME.cry_payload, name='interest_payload', pitch = pitch, dollars = G.GAME.interest_amount*G.GAME.cry_payload*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)})
|
||||||
|
pitch = pitch + 0.06
|
||||||
|
if not G.GAME.seeded and not G.GAME.challenge then
|
||||||
|
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
|
||||||
|
G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak = 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
check_for_unlock({type = 'interest_streak'})
|
||||||
|
dollars = dollars + G.GAME.interest_amount*G.GAME.cry_payload*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)
|
||||||
|
G.GAME.cry_payload = nil
|
||||||
|
elseif G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Revert - fix a crash
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "if area and area.cards[1] then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if area and area.cards and area.cards[1] then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Crash - use glitched shader
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "G.SHADERS['CRT']:send('glitch_intensity', 0)--0.1*G.SETTINGS.GRAPHICS.crt/100 + (G.screenwipe_amt) + 1)"
|
||||||
|
position = "at"
|
||||||
|
payload = "G.SHADERS['CRT']:send('glitch_intensity', glitched_intensity or 0)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Semicolon - don't lose
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''G.RESET_JIGGLES = true'''
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.current_round.semicolon then
|
||||||
|
game_over = false
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Semicolon - end screen text
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''localize\('ph_mr_bones'\)..' '\}, colours = \{G.C.FILTER'''
|
||||||
|
position = 'at'
|
||||||
|
# match_indent = true
|
||||||
|
line_prepend = ''
|
||||||
|
payload = '''(G.GAME.current_round.semicolon and ";" or localize('ph_mr_bones'))..' '}, colours = {(G.GAME.current_round.semicolon and G.C.SET.Code or G.C.FILTER)'''
|
||||||
|
|
||||||
|
# Semicolon - polished UI
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''{n=G.UIT.T, config={text = localize('b_cash_out')..": ", scale = 1, colour = G.C.UI.TEXT_LIGHT, shadow = true}},'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''{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}},'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Semicolon - polished UI
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''{n=G.UIT.T, config={text = localize('$')..config.dollars, scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''{n=G.UIT.T, config={text = not G.GAME.current_round.semicolon and localize('$')..config.dollars or ';', scale = 1.2*scale, colour = G.C.WHITE, shadow = true, juice = true}}'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Semicolon - polished UI
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''{n=G.UIT.R, config={id = 'cash_out_button', align = "cm", padding = 0.1, minw = 7, r = 0.15, colour = G.C.ORANGE, shadow = true, hover = true, one_press = true, button = 'cash_out', focus_args = {snap_to = true}}, nodes={'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''{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={'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Semicolon - reset value at start of round
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "G.GAME.blind:set_blind(G.GAME.round_resets.blind)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
G.GAME.current_round.semicolon = false
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Delete - placeholder booster, in the case that all are deleted
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''return center\nend\n\nfunction get_current_pool\(_type, _rarity, _legendary, _append\)'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''if not center then center = G.P_CENTERS['p_buffoon_normal_1'] end '''
|
||||||
|
|
||||||
|
# Delete - banished keys prevent pool stuff, guess we're going for this method after all
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''if v.yes_pool_flag and not G.GAME.pool_flags[v.yes_pool_flag] then add = nil end'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''if G.GAME.cry_banished_keys[v.key] then add = nil end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Delete - multiuse 1
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''if card.area and (not nc or card.area == G.pack_cards) then card.area:remove_card(card) end'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
local cry_muse = false
|
||||||
|
if card.ability.cry_multiuse and not (card.ability.cry_multiuse <= 1) then
|
||||||
|
cry_muse = true
|
||||||
|
dont_dissolve = true
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Delete - multiuse 2
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''if (prev_state == G.STATES.TAROT_PACK or prev_state == G.STATES.PLANET_PACK or'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if cry_muse then
|
||||||
|
card.ability.cry_multiuse = card.ability.cry_multiuse - 1
|
||||||
|
card.ability.extra_value = -1 * math.max(1, math.floor(card.cost/2))
|
||||||
|
card:set_cost()
|
||||||
|
delay(0.4)
|
||||||
|
|
||||||
|
-- i make my own card eval status text :D
|
||||||
|
|
||||||
|
card:juice_up()
|
||||||
|
play_sound('generic1')
|
||||||
|
attention_text({
|
||||||
|
text = format_ui_value(card.ability.cry_multiuse),
|
||||||
|
scale = 1.1,
|
||||||
|
hold = 0.6,
|
||||||
|
major = card,
|
||||||
|
backdrop_colour = G.C.SECONDARY_SET[card.config.center.set],
|
||||||
|
align = 'bm',
|
||||||
|
offset = {x = 0, y = 0.2}
|
||||||
|
})
|
||||||
|
|
||||||
|
delay(0.8)
|
||||||
|
local _area = area ~= G.pack_cards and area or G.consumeables
|
||||||
|
draw_card(G.play, _area, 1, 'up', true, card, nil, true)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Delete - init table to avoid headaches
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''ecto_minus = 1,'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
cry_banished_keys = {},
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Run - don't clear shop
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''if self.shop then self.shop:remove(); self.shop = nil end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if self.shop and not G.GAME.USING_CODE then self.shop:remove(); self.shop = nil end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''ease_background_colour_blind(G.STATES.SHOP)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if not G.GAME.USING_RUN then ease_background_colour_blind(G.STATES.SHOP) end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''if self.STATE == self.STATES.SELECTING_HAND then'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.USING_RUN then
|
||||||
|
if not (self.STATE == self.STATES.STANDARD_PACK or self.STATE == self.STATES.BUFFOON_PACK or self.STATE == self.STATES.PLANET_PACK or self.STATE == self.STATES.TAROT_PACK or self.STATE == self.STATES.SPECTRAL_PACK or self.STATE == self.STATES.SMODS_BOOSTER_OPENED) then -- do you are have stupid
|
||||||
|
self.STATE = self.STATES.SHOP
|
||||||
|
end
|
||||||
|
if G.GAME.blind then G.GAME.blind:change_colour() end -- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||||
|
if G.load_cry_runarea then
|
||||||
|
G.cry_runarea = CardArea(
|
||||||
|
G.discard.T.x,
|
||||||
|
G.discard.T.y,
|
||||||
|
G.discard.T.w,
|
||||||
|
G.discard.T.h,
|
||||||
|
{ type = "discard", card_limit = 1e100 }
|
||||||
|
)
|
||||||
|
G.cry_runarea:load(G.load_cry_runarea)
|
||||||
|
G.load_cry_runarea = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Run - handle packs (this is incredibly invasive)
|
||||||
|
# we can't do "draw from run to hand" because modded packs presumably don't get ovewritten like that
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''for i=1, hand_space do --draw cards from deckL'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''if not G.GAME.USING_RUN then'''
|
||||||
|
match_indent = true
|
||||||
|
# the inconsistency hurts
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''G.FUNCS.draw_from_hand_to_deck()'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if not G.GAME.USING_RUN then
|
||||||
|
G.FUNCS.draw_from_hand_to_deck()
|
||||||
|
else
|
||||||
|
G.FUNCS.draw_from_hand_to_run()
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''end\n\s+G\.FUNCS\.discard_cards_from_highlighted \= function\(e, hook\)'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
else
|
||||||
|
for i = 1, #G.cry_runarea.cards do
|
||||||
|
draw_card(G.cry_runarea,G.hand, i*100/#G.cry_runarea.cards,'up', true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''G.FUNCS.draw_from_deck_to_hand = function(e)'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
G.FUNCS.draw_from_hand_to_run = function(e)
|
||||||
|
local hand_count = #G.hand.cards
|
||||||
|
for i=1, hand_count do --draw cards from deck
|
||||||
|
draw_card(G.hand, G.cry_runarea, i*100/hand_count,'down', nil, nil, 0.08)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''G.shop.alignment.offset.y = -5.3'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if not G.shop then return true end
|
||||||
|
G.shop.alignment.offset.y = -5.3'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Increase highlight limit for consumables
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "{card_limit = self.GAME.starting_params.consumable_slots, type = 'joker', highlight_limit = 1})"
|
||||||
|
position = "at"
|
||||||
|
payload = "{card_limit = self.GAME.starting_params.consumable_slots, type = 'joker', highlight_limit = 1e100})"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Increase highlight limit for jokers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "{card_limit = self.GAME.starting_params.joker_slots, type = 'joker', highlight_limit = 1})"
|
||||||
|
position = "at"
|
||||||
|
payload = "{card_limit = self.GAME.starting_params.joker_slots, type = 'joker', highlight_limit = 1e100})"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Satellite Uplink
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''card = create_card("Planet", G.pack_cards, nil, nil, true, true, nil, 'pl1')'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.used_vouchers.v_cry_satellite_uplink and pseudorandom('cry_satellite_uplink') > 0.8 then
|
||||||
|
card = create_card("Code", G.pack_cards, nil, nil, true, true, nil, 'pl2')
|
||||||
|
else
|
||||||
|
card = create_card("Planet", G.pack_cards, nil, nil, true, true, nil, 'pl1')
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Exploit - reset variables
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''-- TARGET: effects after hand evaluation'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
func = function()
|
||||||
|
G.GAME.cry_exploit_override = nil
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
}))
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Exploit - patch into smods
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/overrides.lua"]'''
|
||||||
|
pattern = '''disp_text = text'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
text = G.GAME.cry_exploit_override or text
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Double Tag makes exact copy of rework tag
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = 'add_tag(Tag(_context.tag.key))'
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local tag = Tag(_context.tag.key)
|
||||||
|
if _context.tag.key == "tag_cry_rework" then
|
||||||
|
tag.ability.rework_edition = _context.tag.ability.rework_edition
|
||||||
|
tag.ability.rework_key = _context.tag.ability.rework_key
|
||||||
|
end
|
||||||
|
add_tag(tag)
|
||||||
|
'''
|
||||||
|
match_indent = true
|
29
Cryptid/lovely/conveyor.toml
Normal file
29
Cryptid/lovely/conveyor.toml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Conveyor Deck - Don't sort cards
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "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)"
|
||||||
|
position = "at"
|
||||||
|
payload = "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 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"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Start of round effects
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "G.GAME.blind:set_blind(G.GAME.round_resets.blind)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.modifiers.cry_conveyor and #G.jokers.cards>0 then
|
||||||
|
local duplicated_joker = copy_card(G.jokers.cards[#G.jokers.cards])
|
||||||
|
duplicated_joker:add_to_deck()
|
||||||
|
G.jokers:emplace(duplicated_joker)
|
||||||
|
G.jokers.cards[1]:start_dissolve()
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
27
Cryptid/lovely/cube.toml
Normal file
27
Cryptid/lovely/cube.toml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Joker Lock
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif v.enhancement_gate then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
elseif v.source_gate then
|
||||||
|
if v.source_gate ~= _append then
|
||||||
|
add = nil
|
||||||
|
else
|
||||||
|
add = true
|
||||||
|
end
|
||||||
|
elseif v.joker_gate then
|
||||||
|
add = nil
|
||||||
|
for kk, vv in pairs(G.jokers.cards) do
|
||||||
|
if vv.ability.name == v.joker_gate then
|
||||||
|
add = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
30
Cryptid/lovely/equilibrium.toml
Normal file
30
Cryptid/lovely/equilibrium.toml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# non-pack scaling in pack slots
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "G.shop_booster.T.y, G.CARD_W*1.27, G.CARD_H*1.27, G.P_CARDS.empty, G.P_CENTERS[G.GAME.current_round.used_packs[i]], {bypass_discovery_center = true, bypass_discovery_ui = true})"
|
||||||
|
position = "at"
|
||||||
|
payload = "G.shop_booster.T.y, G.CARD_W*(G.P_CENTERS[G.GAME.current_round.used_packs[i]].set == 'Booster' and 1.27 or 1), G.CARD_H*(G.P_CENTERS[G.GAME.current_round.used_packs[i]].set == 'Booster' and 1.27 or 1), G.P_CARDS.empty, G.P_CENTERS[G.GAME.current_round.used_packs[i]], {bypass_discovery_center = true, bypass_discovery_ui = true})"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# scaling issues when reclaiming Overstock
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "G.GAME.shop.joker_max*1.02*G.CARD_W,"
|
||||||
|
position = "at"
|
||||||
|
payload = "math.min(G.GAME.shop.joker_max,4)*1.02*G.CARD_W,"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "G.shop_jokers.T.w = G.GAME.shop.joker_max*1.01*G.CARD_W"
|
||||||
|
position = "at"
|
||||||
|
payload = "G.shop_jokers.T.w = math.min(G.GAME.shop.joker_max,4)*1.02*G.CARD_W"
|
||||||
|
match_indent = true
|
199
Cryptid/lovely/lib_gameset.toml
Normal file
199
Cryptid/lovely/lib_gameset.toml
Normal file
|
@ -0,0 +1,199 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Turn Jimbo into Jolly Joker
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card_character.lua"
|
||||||
|
pattern = 'self.children.card.states.visible = false'
|
||||||
|
position = "before"
|
||||||
|
payload = "self.children.card:set_ability(G.P_CENTERS.j_jolly)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card_character.lua"
|
||||||
|
pattern = 'colours = {G.C.RED, G.C.BLUE, G.C.ORANGE},'
|
||||||
|
position = "at"
|
||||||
|
payload = 'colours = {G.C.CRY_EXOTIC, G.C.BLUE, G.C.CRY_JOLLY},'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Make profiles all start with a prefix
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = 'self:load_profile(G.SETTINGS.profile or 1)'
|
||||||
|
position = "before"
|
||||||
|
payload = '''Cryptid.profile_prefix = Jen and "J" or "M"
|
||||||
|
if type(G.SETTINGS.profile) ~= "string" or G.SETTINGS.profile:sub(1, #Cryptid.profile_prefix) ~= Cryptid.profile_prefix then
|
||||||
|
G.SETTINGS.profile = Cryptid.profile_prefix .. "1"
|
||||||
|
end
|
||||||
|
for i = 1, 3 do
|
||||||
|
G.PROFILES[Cryptid.profile_prefix .. i] = {}
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Remove the builtin "P" prefix
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = 'profile_data.name = profile_data.name or ("P".._profile)'
|
||||||
|
position = "at"
|
||||||
|
payload = 'profile_data.name = profile_data.name or (_profile)'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = 'G.PROFILES[G.SETTINGS.profile].name = "P"..G.SETTINGS.profile'
|
||||||
|
position = "at"
|
||||||
|
payload = 'G.PROFILES[G.SETTINGS.profile].name = G.SETTINGS.profile'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Pre-load all profiles in selection menu
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = 'for i = 1, 3 do'
|
||||||
|
position = "after"
|
||||||
|
payload = 'i = Cryptid.profile_prefix .. i'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Gameset sprite in profile screen
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '{n=G.UIT.C, config={align = "cl", minw = rwidth}, nodes={{n=G.UIT.T, config={text = tostring(profile_data.career_stats.c_wins),colour = G.C.RED, shadow = true, scale = 1*scale}}}}'
|
||||||
|
position = "after"
|
||||||
|
payload = ',{n=G.UIT.C, config={align = "cl", minw = rwidth}, nodes={{n=G.UIT.O, config={object = Cryptid.gameset_sprite(1, _profile)}}}}'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Gameset sprite in deck select
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '{n=G.UIT.C, config={align = "cm", minw = 2.5}, nodes={}}'
|
||||||
|
position = "at"
|
||||||
|
payload = '{n=G.UIT.C, config={align = "cm", minw = 0.2}, nodes={}},{n=G.UIT.C, config={align = "cl", minw = rwidth}, nodes={{n=G.UIT.O, config={object = Cryptid.gameset_sprite()}}}}'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Gameset sprite in win screen
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '{n=G.UIT.R, config={align = "cm", minh = 0.4, minw = 0.1}, nodes={}},'
|
||||||
|
position = "at"
|
||||||
|
payload = '{n=G.UIT.R, config={align = "cm", minh = 0.1, minw = 0.1}, nodes={}},'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = 'not show_win_cta and {n=G.UIT.R, config={align = "cm", minh = 0.2, minw = 0.1}, nodes={}} or nil,'
|
||||||
|
position = "at"
|
||||||
|
payload = 'not show_win_cta and {n=G.UIT.R, config={align = "cm", minh = 0.1, minw = 0.1}, nodes={}} or nil,'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "not show_win_cta and UIBox_button({button = 'go_to_menu', label = {localize('b_main_menu')}, minw = 2.5, maxw = 2.5, minh = 1, focus_args = {nav = 'wide'}}) or nil,"
|
||||||
|
position = "after"
|
||||||
|
payload = '{n=G.UIT.R, config={align = "cm", minw = rwidth}, nodes={{n=G.UIT.O, config={object = Cryptid.gameset_sprite()}}}},'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Gameset sprite in lose screen
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "show_lose_cta and"
|
||||||
|
position = "before"
|
||||||
|
payload = '{n=G.UIT.R, config={align = "cm"}, nodes={{n=G.UIT.C, config={align = "cm", minw = rwidth}, nodes={{n=G.UIT.O, config={object = Cryptid.gameset_sprite()}}}},'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "{n=G.UIT.T, config={text = localize('b_main_menu'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}}"
|
||||||
|
position = "after"
|
||||||
|
payload = '}}'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''\{n=G\.UIT\.R, config=\{align = "cm", padding = 0\.1\}, nodes=\{\s+\{n=G\.UIT\.R, config=\{id = 'from_game_over','''
|
||||||
|
position = "at"
|
||||||
|
payload = '''{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
|
||||||
|
{n=G.UIT.R, config={id = 'from_game_over','''
|
||||||
|
|
||||||
|
# Disabled UI
|
||||||
|
# Show disabled tooltip
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "local info_queue = {}"
|
||||||
|
position = "after"
|
||||||
|
payload = '''if _c.cry_disabled or (_c.force_gameset and _c.force_gameset == 'disabled') then
|
||||||
|
if _c.cry_disabled then
|
||||||
|
if _c.cry_disabled.type == "card_dependency" then
|
||||||
|
local name = Cryptid.get_center(_c.cry_disabled.key) and localize{type = 'name_text', set = Cryptid.get_center(_c.cry_disabled.key).set, key = _c.cry_disabled.key} or _c.cry_disabled.key
|
||||||
|
info_queue[#info_queue+1] = {key = 'disabled_card_dependency', set = 'Other', specific_vars = {name}}
|
||||||
|
elseif _c.cry_disabled.type == "mod_dependency" then
|
||||||
|
local name = Cryptid.cross_mod_names[_c.cry_disabled.key] or _c.cry_disabled.key
|
||||||
|
info_queue[#info_queue+1] = {key = 'disabled_mod_dependency', set = 'Other', specific_vars = {name}}
|
||||||
|
elseif _c.cry_disabled.type == "mod_conflict" then
|
||||||
|
local name = SMODS.Mods[_c.cry_disabled.key].name
|
||||||
|
info_queue[#info_queue+1] = {key = 'disabled_mod_conflict', set = 'Other', specific_vars = {name}}
|
||||||
|
else
|
||||||
|
if not (_c.force_gameset and _c.force_gameset ~= 'disabled') then
|
||||||
|
info_queue[#info_queue+1] = {key = 'disabled', set = 'Other'}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
info_queue[#info_queue+1] = {key = 'disabled', set = 'Other'}
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# replace rarity badge with gameset
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "card_type = (debuffed and AUT.card_type ~= 'Enhanced') and localize('k_debuffed') or card_type"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if AUT.card_type == "Back" then
|
||||||
|
card_type = localize('b_deck')
|
||||||
|
end
|
||||||
|
if AUT.card_type == "Tag" then
|
||||||
|
card_type = localize('b_tag')
|
||||||
|
end
|
||||||
|
if AUT.card_type == "Blind" then
|
||||||
|
card_type = localize('b_blind')
|
||||||
|
end
|
||||||
|
if AUT.card_type == "Content Set" then
|
||||||
|
card_type = localize('k_content_set')
|
||||||
|
end
|
||||||
|
if card.gameset_select then
|
||||||
|
card_type = localize('cry_gameset_'..card.config.center.force_gameset)
|
||||||
|
if card_type == "ERROR" then
|
||||||
|
card_type = localize('cry_gameset_custom')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not card.gameset_select and card.config.center and card.config.center.cry_disabled then
|
||||||
|
card_type = localize('cry_gameset_disabled')
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Descriptions for Backs and Blinds in gameset UI
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif _c.set == 'Tag' then"
|
||||||
|
position = "before"
|
||||||
|
payload = "elseif _c.set == 'Back' or _c.set == 'Blind' then localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = specific_vars or {}}"
|
||||||
|
match_indent = true
|
74
Cryptid/lovely/lib_https.toml
Normal file
74
Cryptid/lovely/lib_https.toml
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# hi it's me toneblock and i'm being stupid again! (Game:update inject)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''if G.FILE_HANDLER and G.FILE_HANDLER and G.FILE_HANDLER.update_queued and ('''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if not Cryptid.member_count_delay then Cryptid.member_count_delay = 0 end
|
||||||
|
if (Cryptid.member_count_delay > 5) or not Cryptid.member_count then -- it doesn't need to update this frequently? but it also doesn't need to be higher tbh...
|
||||||
|
if Cryptid.update_member_count then Cryptid.update_member_count() end -- i honestly hate nil checks like this, wish there was a shorthand
|
||||||
|
Cryptid.member_count_delay = 0
|
||||||
|
else
|
||||||
|
Cryptid.member_count_delay = Cryptid.member_count_delay + dt
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# call Cryptid.update_member_count() whenever the collection is opened to ensure it updates properly on title collection if it can (better than running it on loc_vars)
|
||||||
|
# it's not computationally intense at all, so whatever
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''G.FUNCS.your_collection = function(e)'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if Cryptid.update_member_count then Cryptid.update_member_count() end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# notice if https is disabled (by default)
|
||||||
|
# also does some other things since this is patching in the same spot (SDM0 easter egg)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if _c.set == 'Other' then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if _c.name == 'cry-membershipcard' or _c.name == 'cry-membershipcardtwo' then
|
||||||
|
if not Cryptid_config["HTTPS Module"] then
|
||||||
|
if G.localization.descriptions.Other.cry_https_disabled then
|
||||||
|
main_end = {}
|
||||||
|
localize{type = 'other', key = 'cry_https_disabled', nodes = main_end, vars = {}}
|
||||||
|
main_end = main_end[1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if _c.name == 'cry-translucent Joker' then
|
||||||
|
if G.jokers and G.jokers.cards then
|
||||||
|
for k, v in ipairs(G.jokers.cards) do
|
||||||
|
if (v.edition and v.edition.negative) and (G.localization.descriptions.Other.remove_negative)then
|
||||||
|
main_end = {}
|
||||||
|
localize{type = 'other', key = 'remove_negative', nodes = main_end, vars = {}}
|
||||||
|
main_end = main_end[1]
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if _c.name == 'cry-blurred Joker' then
|
||||||
|
if (SMODS.Mods["sdm0sstuff"] or {}).can_load then
|
||||||
|
if G.localization.descriptions.Other.blurred_sdm0 then
|
||||||
|
main_end = {}
|
||||||
|
localize{type = 'other', key = 'blurred_sdm0', nodes = main_end, vars = {}}
|
||||||
|
main_end = main_end[1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
259
Cryptid/lovely/lib_misc.toml
Normal file
259
Cryptid/lovely/lib_misc.toml
Normal file
|
@ -0,0 +1,259 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Make the splash screen more jolly
|
||||||
|
# Requires "Custom Main Menu" config to be enabled
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "SC = Card(G.ROOM.T.w/2 - SC_scale*G.CARD_W/2, 10. + G.ROOM.T.h/2 - SC_scale*G.CARD_H/2, SC_scale*G.CARD_W, SC_scale*G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['j_joker'])"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if ((Cryptid_config and Cryptid_config.menu) or false) then
|
||||||
|
SC = Card(G.ROOM.T.w/2 - SC_scale*G.CARD_W/2, 10. + G.ROOM.T.h/2 - SC_scale*G.CARD_H/2, SC_scale*G.CARD_W, SC_scale*G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['j_jolly'],{bypass_discovery_center = true, bypass_discovery_ui = true})
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Make cards in splash screen CCD cards
|
||||||
|
# Disabling this because it caused fps drops on profiles with nothing discovered
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "if math.random() > 0.8 then card.sprite_facing = 'back'; card.facing = 'back' end"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
--if Cryptid.random_consumable then card:set_ability(Cryptid.random_consumable('cry_splash',{"no_grc"},nil,nil,true), true, nil) end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Show Glitched Edition to confirm Cryptid is Active if custom main menu is enabled
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "replace_card.states.visible = false"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if ((Cryptid_config and Cryptid_config.menu) or false) then
|
||||||
|
replace_card:set_edition(G.P_CENTERS.e_cry_glitched and 'e_cry_glitched' or 'e_negative',true,true)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Patch related crash
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if not initial then G.GAME.blind:debuff_card(self) end"
|
||||||
|
position = "at"
|
||||||
|
payload = "if not initial and G.GAME and G.GAME.blind then G.GAME.blind:debuff_card(self) end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Draw midground layer
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.config.center.soul_pos and (self.config.center.discovered or self.bypass_discovery_center) then"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self.config.center.soul_pos and self.config.center.soul_pos.extra and (self.config.center.discovered or self.bypass_discovery_center) then
|
||||||
|
local scale_mod = 0.07-- + 0.02*math.cos(1.8*G.TIMERS.REAL) + 0.00*math.cos((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--0.05*math.cos(1.219*G.TIMERS.REAL) + 0.00*math.cos((G.TIMERS.REAL)*math.pi*5)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^2
|
||||||
|
self.children.floating_sprite2:draw_shader('dissolve',0, nil, nil, self.children.center,scale_mod, rotate_mod,nil, 0.1--[[ + 0.03*math.cos(1.8*G.TIMERS.REAL)--]],nil, 0.6)
|
||||||
|
self.children.floating_sprite2:draw_shader('dissolve', nil, nil, nil, self.children.center, scale_mod, rotate_mod)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Custom variables in info queue
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end)"
|
||||||
|
position = "after"
|
||||||
|
payload = "if _c.specific_vars then specific_vars = _c.specific_vars end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Fix not all cards returning to hand on big hands
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "{card_limit = 500, type = 'discard'})"
|
||||||
|
position = "at"
|
||||||
|
payload = "{card_limit = 1e308, type = 'discard'})"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# When hand size exceeds deck size, space the cards as if the hand size was equal to the deck size
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "function CardArea:align_cards()"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self.config.type == 'hand' then
|
||||||
|
self.config.temp_limit = math.min(self.config.card_limit, #G.playing_cards)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Crash fix
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "if not G.SAVED_GAME.VERSION or G.SAVED_GAME.VERSION < '0.9.2' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if not G.SAVED_GAME or not G.SAVED_GAME.VERSION or G.SAVED_GAME.VERSION < '0.9.2' then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Register banned bosses for rush hour
|
||||||
|
# Also initializes disabled/enabled cards
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "set_profile_progress()"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
for i = 1, #G.CHALLENGES do
|
||||||
|
if (G.CHALLENGES[i].id == 'c_cry_rush_hour' or G.CHALLENGES[i].id == 'c_cry_rush_hour_ii' or G.CHALLENGES[i].id == 'c_cry_rush_hour_iii') and #G.CHALLENGES[i].restrictions.banned_other == 0 then
|
||||||
|
for k, v in pairs(G.P_BLINDS) do
|
||||||
|
if k ~= "bl_cry_clock" and k ~= "bl_cry_lavender_loop" and v.boss then
|
||||||
|
G.CHALLENGES[i].restrictions.banned_other[#G.CHALLENGES[i].restrictions.banned_other+1] = {id = k, type = 'blind'}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Prevent Jokers from spitting empty messages
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "text = extra.message or text"
|
||||||
|
position = "after"
|
||||||
|
payload = "if not text or text == '' then return end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Add default pool value for Consumeables
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = 'else _pool[#_pool + 1] = "j_joker"'
|
||||||
|
position = "before"
|
||||||
|
payload = '''elseif _type == 'Consumeables' then _pool[#_pool + 1] = "c_ceres"'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# hand size forgiveness if playing negative or antimatter deck (someone please fix)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "function Game:update_draw_to_hand(dt)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.selected_back and (G.GAME.selected_back.name == 'cry--Negative Deck' or G.GAME.selected_back.name == 'cry-Antimatter') and G.hand.config.card_limit <= 0 then -- 'cry--Negative Deck'... sure
|
||||||
|
G.hand.config.card_limit = 1
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# init Cryptid global through lovely
|
||||||
|
# so other mods can add things to obj pools
|
||||||
|
# and define some stub functions so that the game does not immediately crash when talisman isn't loaded
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "main.lua"
|
||||||
|
pattern = '''function love.load()'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
Cryptid = {}
|
||||||
|
Cryptid.aliases = {}
|
||||||
|
function cry_format(...)
|
||||||
|
return ...
|
||||||
|
end
|
||||||
|
|
||||||
|
-- These ones are deprecated, they do not do anything and are just here to prevent crashes
|
||||||
|
Cryptid.memepack = {}
|
||||||
|
Cryptid.food = {}
|
||||||
|
Cryptid.M_jokers = {}
|
||||||
|
Cryptid.Megavouchers = {}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Adds cry_creating_card event
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''
|
||||||
|
check_for_unlock({type = 'have_edition'})
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
SMODS.calculate_context{cry_creating_card = true, card = card}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# plural handler (annoyingly fragile overwrite)
|
||||||
|
# also i pass the whole vars here, even though it's inefficient, just because it looks better
|
||||||
|
# whatever
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = '''
|
||||||
|
assembled_string = assembled_string..(type(subpart) == 'string' and subpart or format_ui_value(args.vars[tonumber(subpart[1])]) or 'ERROR')
|
||||||
|
'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
assembled_string = assembled_string..(type(subpart) == 'string' and subpart or (Cryptid.pluralize and Cryptid.pluralize(subpart[1], args.vars)) or format_ui_value(args.vars[tonumber(subpart[1])]) or 'ERROR')
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# prevent misprint crashing when big
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
for i = self.ability.extra.min, self.ability.extra.max do
|
||||||
|
r_mults[#r_mults+1] = tostring(i)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.extra.max - self.ability.extra.min < 500 then
|
||||||
|
for i = self.ability.extra.min, self.ability.extra.max do
|
||||||
|
r_mults[#r_mults+1] = tostring(i)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
for i = 1, 50 do
|
||||||
|
r_mults[#r_mults+1] = tostring(math.random(self.ability.extra.min, self.ability.extra.max))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# handle banned playing cards
|
||||||
|
# this must patch into pseudorandom_element to not break Steamodded in_pool logic
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "if keep then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME and G.GAME.cry_banned_pcards and G.GAME.cry_banned_pcards[k] then
|
||||||
|
keep = false
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Cross-Mod Content - allow Cryptid to load atlas/sound/shader files from other mods
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/game_object.lua"]'''
|
||||||
|
pattern = "self.full_path = (self.mod and self.mod.path or SMODS.path) .."
|
||||||
|
position = "at"
|
||||||
|
payload = "self.full_path = (self.mod_path or self.mod and self.mod.path or SMODS.path) .."
|
||||||
|
match_indent = true
|
127
Cryptid/lovely/lib_modifiers.toml
Normal file
127
Cryptid/lovely/lib_modifiers.toml
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Apply booster pack edition and stickers to contents - by Jen Walter
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "card.T.x = self.T.x"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
local edi = self.edition or {}
|
||||||
|
if edi.type then
|
||||||
|
if card.ability.name ~= "cry-meteor"
|
||||||
|
and card.ability.name ~= "cry-exoplanet"
|
||||||
|
and card.ability.name ~= "cry-stardust" then
|
||||||
|
card:set_edition({[edi.type] = true})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local stickers = {'eternal', 'perishable', 'rental', 'banana'}
|
||||||
|
for _, v in ipairs(stickers) do
|
||||||
|
if self.ability[v] then
|
||||||
|
card.ability[v] = self.ability[v]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# save ability (to deal with re-misprinting)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "G.vouchers:emplace(card_to_save)"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
card_to_save.ability.extra = self and self.ability.extra or card_to_save.ability.extra
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# patch for stickers in challenge ui
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "if v.eternal then card:set_eternal(true) end"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if v.stickers then
|
||||||
|
for i, _v in ipairs(v.stickers) do
|
||||||
|
SMODS.Stickers[_v]:apply(card, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# same deal for actual game
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "if v.eternal then _joker:set_eternal(true) end"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if v.stickers then
|
||||||
|
for i, _v in ipairs(v.stickers) do
|
||||||
|
SMODS.Stickers[_v]:apply(_joker, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# remove eternal badge
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.eternal then badges[#badges + 1] = 'eternal' end"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if not self.ability.cry_absolute then
|
||||||
|
if self.ability.eternal then badges[#badges + 1] = 'eternal' end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# remove old pinned badge
|
||||||
|
# i am fully aware that these badge removals may break stuff since they are good targets
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.pinned then badges[#badges + 1] = 'pinned_left' end"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
-- if self.pinned then badges[#badges + 1] = 'pinned_left' end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# don't draw old perishable texture
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if self.ability.perishable then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if self.ability.perishable and not layer then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Adds cry_debuff_immune card modifier
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'if self.ability and self.ability.perma_debuff then self.debuff = true end'
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self.cry_debuff_immune then
|
||||||
|
self.debuff = false
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Removes cry_debuff_immune at the end of the round
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/utils.lua"]'''
|
||||||
|
pattern = '-- TARGET: effects after end of round evaluation'
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
card.cry_debuff_immune = false
|
||||||
|
'''
|
||||||
|
match_indent = true
|
101
Cryptid/lovely/lib_ui.toml
Normal file
101
Cryptid/lovely/lib_ui.toml
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Antimatter Deck
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/card_draw.lua"]'''
|
||||||
|
pattern = "self.children.back:draw_shader('dissolve')"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local currentBack = self.params.viewed_back and G.GAME.viewed_back or G.GAME.selected_back
|
||||||
|
if currentBack and currentBack.effect.config.cry_antimatter or currentBack.effect.config.cry_force_edition == 'negative' then
|
||||||
|
self.children.back:draw_shader('negative', nil, self.ARGS.send_to_shader)
|
||||||
|
self.children.center:draw_shader('negative_shine', nil, self.ARGS.send_to_shader)
|
||||||
|
else
|
||||||
|
self.children.back:draw_shader('dissolve')
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# render gameset as sticker
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/card_draw.lua"]'''
|
||||||
|
pattern = "if self.sticker and G.shared_stickers[self.sticker] then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if not Cryptid.shared_gamesets and G.ASSET_ATLAS["cry_gameset"] then
|
||||||
|
Cryptid.shared_gamesets = {
|
||||||
|
modest = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_gameset"], {x = 0,y = 0}),
|
||||||
|
mainline = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_gameset"], {x = 1,y = 0}),
|
||||||
|
madness = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_gameset"], {x = 2,y = 0}),
|
||||||
|
custom = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_gameset"], {x = 3,y = 0}),
|
||||||
|
selected = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_sticker"], {x = 0,y = 4}),
|
||||||
|
}
|
||||||
|
end
|
||||||
|
local gameset_key
|
||||||
|
if self.config.center.force_gameset then
|
||||||
|
gameset_key = self.config.center.force_gameset
|
||||||
|
if gameset_key ~= "disabled" and gameset_key ~= "modest" and gameset_key ~= "mainline" and gameset_key ~= "madness" then
|
||||||
|
gameset_key = "custom"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if self.gameset_select and Cryptid.shared_gamesets[gameset_key] then
|
||||||
|
Cryptid.shared_gamesets[gameset_key].role.draw_major = self
|
||||||
|
Cryptid.shared_gamesets[gameset_key]:draw_shader('dissolve', nil, nil, nil, self.children.center)
|
||||||
|
Cryptid.shared_gamesets[gameset_key]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# make disabled cards visually debuffed
|
||||||
|
# warning: this also patches a lot of extra stuff, but that shouldn't matter
|
||||||
|
# since you shouldn't be able to access them outside of the collection anyway
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/card_draw.lua"]'''
|
||||||
|
pattern = "if self.debuff then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if self.debuff or (Cryptid.gameset and Cryptid.gameset(self) == 'disabled') or (self.config.center.gameset_config and self.config.center.gameset_config[Cryptid.gameset(self)] and self.config.center.gameset_config[Cryptid.gameset(self)].disabled) or (self.config.center.cry_disabled and not self.gameset_select) then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Shine on Oversaturated to make it more noticable
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/card_draw.lua"]'''
|
||||||
|
pattern = "if (self.edition and self.edition.negative) or (self.ability.name == 'Antimatter' and (self.config.center.discovered or self.bypass_discovery_center)) then"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = "if (self.edition and (self.edition.negative or self.edition.cry_oversat)) or (self.ability.name == 'Antimatter' and (self.config.center.discovered or self.bypass_discovery_center)) then"
|
||||||
|
|
||||||
|
# Make description UI always appear if card is highlighted
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/node.lua"
|
||||||
|
pattern = "if self.children.h_popup then"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
if self.children.h_popup and not (self.force_popup and self:force_popup() and Cryptid["force_tooltips"]) then
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Let description tooltips work for any object
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "detailed_tooltip = part.control.T and (G.P_CENTERS[part.control.T] or G.P_TAGS[part.control.T]) or nil,"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = "detailed_tooltip = part.control.T and (Cryptid.get_center(part.control.T) or (G.P_CENTERS[part.control.T] or G.P_TAGS[part.control.T])) or nil,"
|
||||||
|
|
||||||
|
# Remove consumable use UI in the collection
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.highlighted and self.area and self.area.config.type ~= 'shop' then"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = "if self.highlighted and self.area and self.area.config.type ~= 'shop' and not self.area.config.collection then"
|
494
Cryptid/lovely/misc.toml
Normal file
494
Cryptid/lovely/misc.toml
Normal file
|
@ -0,0 +1,494 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Detect if edition comes from copy_card
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = '''new_card:set_edition(other.edition or {}, nil, true)'''
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
new_card.from_copy = true
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Update value of Monsters created via copy_card
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "if not strip_edition then"
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
if new_card.ability.name == "cry-longboi" then new_card:set_ability(new_card.config.center) end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Joker BigNum value support
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
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"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Campfire' and G.GAME.blind.boss and not (G.GAME.blind.config and G.GAME.blind.config.bonus) and to_big(self.ability.x_mult) > to_big(1) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Hit the Road' and self.ability.x_mult > 1 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Hit the Road' and to_big(self.ability.x_mult) > to_big(1) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.x_mult > 1 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if to_big(self.ability.x_mult) > to_big(1) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name ~= 'Seeing Double' and self.ability.x_mult > 1 and (self.ability.type == '' or next(context.poker_hands[self.ability.type])) then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name ~= 'Seeing Double' and to_big(self.ability.x_mult) > to_big(1) and (self.ability.type == '' or next(context.poker_hands[self.ability.type])) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Caino' and self.ability.caino_xmult > 1 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Caino' and to_big(self.ability.caino_xmult) > to_big(1) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.t_mult > 0 and next(context.poker_hands[self.ability.type]) then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if to_big(self.ability.t_mult) > to_big(0) and next(context.poker_hands[self.ability.type]) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.t_chips > 0 and next(context.poker_hands[self.ability.type]) then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if to_big(self.ability.t_chips) > to_big(0) and next(context.poker_hands[self.ability.type]) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Ceremonial Dagger' and self.ability.mult > 0 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Ceremonial Dagger' and to_big(self.ability.mult) > to_big(0) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Castle' and (self.ability.extra.chips > 0) then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Castle' and (to_big(self.ability.extra.chips) > to_big(0)) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Swashbuckler' and self.ability.mult > 0 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Swashbuckler' and to_big(self.ability.mult) > to_big(0) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Spare Trousers' and self.ability.mult > 0 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Spare Trousers' and to_big(self.ability.mult) > to_big(0) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Ride the Bus' and self.ability.mult > 0 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Ride the Bus' and to_big(self.ability.mult) > to_big(0) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Flash Card' and self.ability.mult > 0 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Flash Card' and to_big(self.ability.mult) > to_big(0) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Popcorn' and self.ability.mult > 0 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Popcorn' and to_big(self.ability.mult) > to_big(0) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Green Joker' and self.ability.mult > 0 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Green Joker' and to_big(self.ability.mult) > to_big(0) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Red Card' and self.ability.mult > 0 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'Red Card' and to_big(self.ability.mult) > to_big(0) then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "function localize(args, misc_cat)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if args and args.vars then
|
||||||
|
local reset = {}
|
||||||
|
for i, j in pairs(args.vars) do
|
||||||
|
if type(j) == 'table' then
|
||||||
|
if (j.new and type(j.new) == "function") and ((j.m and j.e) or (j.array and j.sign and (type(j.array) == "table"))) then
|
||||||
|
reset[i] = number_format(j)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for i, j in pairs(reset) do
|
||||||
|
args.vars[i] = j
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Compat UI for Old Blueprint and Gemini
|
||||||
|
|
||||||
|
# I deleted the patches --Jevonn (test)
|
||||||
|
|
||||||
|
# calculate wheel fail (for Wheel of Hope)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Ectoplasm' or self.ability.name == 'Hex' or pseudorandom('wheel_of_fortune') < G.GAME.probabilities.normal/self.ability.extra then"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.name == 'The Wheel of Fortune' then self.cry_wheel_success = true end
|
||||||
|
'''
|
||||||
|
match_indent = false
|
||||||
|
|
||||||
|
# no "Again!" text if a card will shatter
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''if reps[j] ~= 1 then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if reps[j] ~= 1 and (not scoring_hand or not scoring_hand[i] or not scoring_hand[i].will_shatter) then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# m
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if self.ability.consumeable or self.ability.set == 'Joker' or (self.area and self.area == G.pack_cards) then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if true then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Energia - detect blind skips from tag
|
||||||
|
# kitty printer - add cat tag
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''add_tag(_tag.config.ref_table)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
add_tag( next(SMODS.find_card('j_cry_kittyprinter')) and Tag('tag_cry_cat') or _tag.config.ref_table, true)
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Energia - don't add tags from save load
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''add_tag(_tag)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''add_tag(_tag, nil, true)'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Beta Deck - merge slots
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''self.consumeables = CardArea('''
|
||||||
|
position = "before"
|
||||||
|
payload = '''if not G.GAME.modifiers.cry_beta then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''self.discard = CardArea('''
|
||||||
|
position = "before"
|
||||||
|
payload = '''else
|
||||||
|
self.jokers = CardArea(
|
||||||
|
0, 0,
|
||||||
|
CAI.joker_W+CAI.consumeable_W,
|
||||||
|
CAI.joker_H,
|
||||||
|
{card_limit = self.GAME.starting_params.joker_slots+self.GAME.starting_params.consumable_slots-1, type = 'joker', highlight_limit = 1e100})
|
||||||
|
self.consumeables = self.jokers
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''G.consumeables.T.y = 0'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''G.jokers.T.x = G.hand.T.x - 0.1
|
||||||
|
G.jokers.T.y = 0'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Make Perkeo only copy consumables
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if G.consumeables.cards[1] then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''local eligibleJokers = {}
|
||||||
|
for i = 1, #G.consumeables.cards do
|
||||||
|
if G.consumeables.cards[i].ability.consumeable then
|
||||||
|
eligibleJokers[#eligibleJokers + 1] = G.consumeables.cards[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if #eligibleJokers > 0 then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''local card = copy_card(pseudorandom_element(G.consumeables.cards, pseudoseed('perkeo')), nil)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''local card = copy_card(pseudorandom_element(eligibleJokers, pseudoseed('perkeo')), nil)'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# More Beta Deck fixes
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''for i=1, #G.jokers.cards + #G.consumeables.cards do'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
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'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Poker Hand display can have enhancements
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''local card = Card(0,0, 0.5*G.CARD_W, 0.5*G.CARD_H, G.P_CARDS[v[1]], G.P_CENTERS.c_base)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''local card = Card(0,0, 0.5*G.CARD_W, 0.5*G.CARD_H, G.P_CARDS[v[1]], G.P_CENTERS[v[3] or 'c_base'])'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Adds G.GAME.modifiers.cry_forced_draw_amount
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if G.GAME.blind.name == 'The Serpent' and"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# adds oldbp blueprint corruption
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = 'if _pool_size == 0 then'
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.oldbpfactor and G.GAME.oldbpfactor >= 2 then
|
||||||
|
if _type == 'Joker' and (_rarity == nil or type(_rarity) ~= "string") and not _legendary and not (G.GAME.used_jokers["j_blueprint"] and not next(find_joker("Showman"))) then
|
||||||
|
for i = 1, math.floor(G.GAME.oldbpfactor - 1) do
|
||||||
|
_pool[#_pool + 1] = "j_blueprint"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# end of shop decrement
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = 'G.SHOP_SIGN.alignment.offset.y = -15'
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.oldbpfactor then G.GAME.oldbpfactor = math.max(G.GAME.oldbpfactor - G.GAME.oldbpfactor/8, 1) end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Make Loopy reset here so it retriggers everything before resetting regardless of position
|
||||||
|
# Makes Old Blueprint self-destruct after triggering other end of round effects
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''if G.GAME.round_resets.temp_reroll_cost then G.GAME.round_resets.temp_reroll_cost = nil; calculate_reroll_cost(true) end'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
for _, v in pairs(find_joker("cry-loopy")) do
|
||||||
|
if v.ability.extra.retrigger ~= 0 then
|
||||||
|
v.ability.extra.retrigger = 0
|
||||||
|
card_eval_status_text(v, 'extra', nil, nil, nil, {message = localize("k_reset"), colour = G.C.GREEN})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
SMODS.calculate_context{end_of_round2 = true}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# fix crashing from the source
|
||||||
|
# well, not from the real source, but close enough
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = '''update_hand_text({sound = 'button', volume = 0.7, pitch = 0.8, delay = 0.3}, {'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if (not self.ability.orbital_hand) or (not G.GAME.hands[self.ability.orbital_hand]) then
|
||||||
|
local _poker_hands = {}
|
||||||
|
for k, v in pairs(G.GAME.hands) do
|
||||||
|
if v.visible then _poker_hands[#_poker_hands+1] = k end
|
||||||
|
end
|
||||||
|
self.ability.orbital_hand = pseudorandom_element(_poker_hands, pseudoseed('orbital'))
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# kitty printer 2 (for some reason i can't figure out how to not create another object here)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "local _tag = Tag(G.GAME.round_resets.blind_tags[blind_choice], nil, blind_choice)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if next(SMODS.find_card('j_cry_kittyprinter')) then
|
||||||
|
_tag = Tag('tag_cry_cat', nil, blind_choice)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# avoids a game-locking crash related to opened booster being nil
|
||||||
|
# remove this as soon as a fix is done
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "SMODS.OPENED_BOOSTER.config.center:update_pack(dt)"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if not SMODS.OPENED_BOOSTER then
|
||||||
|
G.STATE = G.STATES.SHOP
|
||||||
|
print('Error: SMODS.OPENED_BOOSTER is nil. Game recovered by setting game state to shop.')
|
||||||
|
else
|
||||||
|
SMODS.OPENED_BOOSTER.config.center:update_pack(dt)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Created cards match suits of suit deck
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "card.playing_card = G.playing_card"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.modifiers.cry_force_suit then card:change_suit(G.GAME.modifiers.cry_force_suit) end
|
||||||
|
if G.GAME.modifiers.cry_force_enhancement then card:set_ability(G.P_CENTERS[G.GAME.modifiers.cry_force_enhancement]) end
|
||||||
|
if G.GAME.modifiers.cry_force_edition then card:set_edition({[G.GAME.modifiers.cry_force_edition]=true},true,true) end
|
||||||
|
if G.GAME.modifiers.cry_force_seal then card:set_seal(G.GAME.modifiers.cry_force_seal) end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Remove G.cry_edeck_select on back
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "G.FUNCS.setup_run = function(e)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
G.cry_edeck_select = nil
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Remove G.cry_edeck_select on escape key press
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/controller.lua"
|
||||||
|
pattern = '''if key == "escape" then'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
G.cry_edeck_select = nil
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
# Make vanilla edition tags Nope! if all jokers in shop have editions
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = "local _applied = nil"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if Cryptid.forced_edition() then self:nope() end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
22
Cryptid/lovely/misc_joker.toml
Normal file
22
Cryptid/lovely/misc_joker.toml
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# LeBaron James - Calculate Steel effects when played
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if context.cardarea == G.hand and context.main_scoring then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if (context.cardarea == G.hand or context.cardarea == G.play and next(SMODS.find_card('j_cry_lebaron_james')) and Cryptid.safe_get(SMODS.Ranks,Cryptid.safe_get(card,'base','value') or 'm','key') == 'King') and context.main_scoring then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "ret.playing_card = {}"
|
||||||
|
position = "at"
|
||||||
|
payload = "ret.playing_card = ret.playing_card or {}"
|
||||||
|
match_indent = true
|
||||||
|
|
504
Cryptid/lovely/misprint.toml
Normal file
504
Cryptid/lovely/misprint.toml
Normal file
|
@ -0,0 +1,504 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Randomize poker hands after RNG is set up
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "self.GAME.pseudorandom.hashed_seed = pseudohash(self.GAME.pseudorandom.seed)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.modifiers.cry_misprint_min and not args.savetext then
|
||||||
|
for k, v in pairs(G.GAME.hands) do
|
||||||
|
v.chips = to_big(cry_format(v.chips * Cryptid.log_random(pseudoseed('cry_misprint'),G.GAME.modifiers.cry_misprint_min,G.GAME.modifiers.cry_misprint_max),"%.2g"))
|
||||||
|
v.mult = to_big(cry_format(v.mult * Cryptid.log_random(pseudoseed('cry_misprint'),G.GAME.modifiers.cry_misprint_min,G.GAME.modifiers.cry_misprint_max),"%.2g"))
|
||||||
|
v.l_chips = cry_format(v.l_chips * Cryptid.log_random(pseudoseed('cry_misprint'),G.GAME.modifiers.cry_misprint_min,G.GAME.modifiers.cry_misprint_max),"%.2g")
|
||||||
|
v.l_mult = cry_format(v.l_mult * Cryptid.log_random(pseudoseed('cry_misprint'),G.GAME.modifiers.cry_misprint_min,G.GAME.modifiers.cry_misprint_max),"%.2g")
|
||||||
|
v.s_chips = v.chips
|
||||||
|
v.s_mult = v.mult
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Packs
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "create_shop_card_ui(card, 'Booster', G.shop_booster)"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
Cryptid.misprintize(card)
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Prevent pack softlocks
|
||||||
|
# Off by One Error effect
|
||||||
|
# Booster Tag effect
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "G.GAME.pack_choices = self.ability.choose or self.config.center.config.choose or 1"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
G.GAME.pack_choices = ((self.ability.choose and self.ability.extra) and math.min(math.floor(self.ability.extra), self.ability.choose)) or 1
|
||||||
|
if G.GAME.modifiers.cry_misprint_min then
|
||||||
|
G.GAME.pack_size = self.ability.extra
|
||||||
|
if G.GAME.pack_size < 1 then G.GAME.pack_size = 1 end
|
||||||
|
self.ability.extra = G.GAME.pack_size
|
||||||
|
G.GAME.pack_choices = math.min(math.floor(G.GAME.pack_size), self.ability.choose)
|
||||||
|
--G.GAME.pack_choices = math.min(math.floor(G.GAME.pack_size),cry_format(G.GAME.pack_choices * Cryptid.log_random(pseudoseed('cry_misprint_p'..G.GAME.round_resets.ante),G.GAME.modifiers.cry_misprint_min,G.GAME.modifiers.cry_misprint_max),"%.2f"))
|
||||||
|
end
|
||||||
|
if G.GAME.cry_oboe then
|
||||||
|
self.ability.extra = self.ability.extra + G.GAME.cry_oboe
|
||||||
|
G.GAME.pack_choices = G.GAME.pack_choices + G.GAME.cry_oboe
|
||||||
|
G.GAME.cry_oboe = nil
|
||||||
|
end
|
||||||
|
if G.GAME.boostertag and G.GAME.boostertag > 0 then
|
||||||
|
self.ability.extra = self.ability.extra * 2
|
||||||
|
G.GAME.pack_choices = G.GAME.pack_choices * 2
|
||||||
|
G.GAME.boostertag = math.max(0, G.GAME.boostertag - 1)
|
||||||
|
end
|
||||||
|
self.ability.extra = math.min(self.ability.extra, 1000)
|
||||||
|
G.GAME.pack_choices = math.min(G.GAME.pack_choices, 1000)
|
||||||
|
G.GAME.pack_size = self.ability.extra
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name:find('Arcana') then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.extra < 1 then self.ability.extra = 1 end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Vouchers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '''=[SMODS _ "src/utils.lua"]'''
|
||||||
|
pattern = "create_shop_card_ui(card, 'Voucher', G.shop_vouchers)"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
Cryptid.misprintize(card)
|
||||||
|
if G.GAME.events.ev_cry_choco2 then
|
||||||
|
card.misprint_cost_fac = (card.misprint_cost_fac or 1) * 2
|
||||||
|
card:set_cost()
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = "create_shop_card_ui(card, 'Voucher', G.shop_vouchers)"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
Cryptid.misprintize(card)
|
||||||
|
if G.GAME.events.ev_cry_choco2 then
|
||||||
|
card.misprint_cost_fac = (card.misprint_cost_fac or 1) * 2
|
||||||
|
card:set_cost()
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Fractional Ante Bugs
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "G.GAME.round_resets.ante = G.GAME.round_resets.ante + mod"
|
||||||
|
position = "after"
|
||||||
|
payload = "G.GAME.round_resets.ante = Big and (to_number(math.floor(to_big(G.GAME.round_resets.ante)))) or math.floor(G.GAME.round_resets.ante)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# UI Bugs
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "_size*G.CARD_W,"
|
||||||
|
position = "at"
|
||||||
|
payload = "math.max(1,math.min(_size,5))*G.CARD_W,"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "_size*G.CARD_W*1.1,"
|
||||||
|
position = "at"
|
||||||
|
payload = "math.max(1,math.min(_size,5))*G.CARD_W*1.1,"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "_size*G.CARD_W*1.1 + 0.5,"
|
||||||
|
position = "at"
|
||||||
|
payload = "math.max(1,math.min(_size,5))*G.CARD_W*1.1 + 0.5,"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "{card_limit = _size, type = 'consumeable', highlight_limit = 1})"
|
||||||
|
position = "at"
|
||||||
|
payload = "{card_limit = math.max(1,_size), type = 'consumeable', highlight_limit = 1})"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Death and a CCD Patch
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.consumeable.mod_num >= #G.hand.highlighted and #G.hand.highlighted >= (self.ability.consumeable.min_highlighted or 1) then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if (self.ability.consumeable.mod_num - ((G.GAME.modifiers.cry_consumable_reduce and (self.ability.name ~= 'Death')) and (self.ability.consumeable.mod_num > 1) and 1 or 0)) >= #G.hand.highlighted + (self.area == G.hand and -1 or 0) and #G.hand.highlighted + (self.area == G.hand and -1 or 0) >= 1 then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# mod_num has no limit
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "self.ability.consumeable.mod_num = math.min(5, self.ability.consumeable.max_highlighted)"
|
||||||
|
position = "at"
|
||||||
|
payload = "self.ability.consumeable.mod_num = self.ability.consumeable.max_highlighted"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Infinite Deck
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "self.config.highlighted_limit = config.highlight_limit or 5"
|
||||||
|
position = "at"
|
||||||
|
payload = "self.config.highlighted_limit = config.highlight_limit or G.GAME.modifiers.cry_highlight_limit or 5"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "if #G.hand.highlighted <= 0 or G.GAME.blind.block_play or #G.hand.highlighted > 5 then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if #G.hand.highlighted <= (G.GAME.stamp_mod and 1 or 0) or G.GAME.blind.block_play then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Hieroglyph
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "ease_ante(-center_table.extra)"
|
||||||
|
position = "at"
|
||||||
|
payload = "ease_ante(math.floor(-center_table.extra))"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Get Cryptid to display and work with card selections
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif _c.name == 'Cryptid' then loc_vars = {cfg.extra}"
|
||||||
|
position = "at"
|
||||||
|
payload = '''elseif _c.name == 'Cryptid' then loc_vars = {cfg.extra, cfg.max_highlighted}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'local _card = copy_card(G.hand.highlighted[1], nil, nil, G.playing_card)'
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
for q = 1, #G.hand.highlighted do
|
||||||
|
local _card = copy_card(G.hand.highlighted[q], nil, nil, G.playing_card)
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "new_cards[#new_cards+1] = _card"
|
||||||
|
position = "after"
|
||||||
|
payload = "end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Get seal spectrals to display and work with card selections
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)elseif _c\.set == 'Spectral' then '''
|
||||||
|
position = 'after'
|
||||||
|
# match_indent = true
|
||||||
|
line_prepend = '$indent '
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
if _c.name == 'Talisman' or _c.name == 'Medium' or _c.name == 'Trance' or _c.name == 'Deja Vu' then
|
||||||
|
loc_vars = {cfg.max_highlighted}
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'local conv_card = G.hand.highlighted[1]'
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
for q = 1, #G.hand.highlighted do
|
||||||
|
local conv_card = G.hand.highlighted[q]
|
||||||
|
G.E_MANAGER:add_event(Event({func = function()
|
||||||
|
play_sound('tarot1')
|
||||||
|
used_tarot:juice_up(0.3, 0.5)
|
||||||
|
return true end }))
|
||||||
|
|
||||||
|
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.1,func = function()
|
||||||
|
conv_card:set_seal(self.ability.extra, nil, true)
|
||||||
|
return true end }))
|
||||||
|
end
|
||||||
|
delay(0.5)
|
||||||
|
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.2,func = function() G.hand:unhighlight_all(); return true end }))
|
||||||
|
end--[[
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Aura' then"
|
||||||
|
position = "before"
|
||||||
|
payload = "--]]"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Fractional pricing
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "self.cost = math.max(1, math.floor((self.base_cost + self.extra_cost + 0.5)*(100-G.GAME.discount_percent)/100))"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.set == 'Joker' then
|
||||||
|
self.cost = cry_format(self.cost * G.GAME.cry_shop_joker_price_modifier,'%.2f') end
|
||||||
|
if self.misprint_cost_fac then
|
||||||
|
self.cost = cry_format(self.cost * self.misprint_cost_fac,'%.2f')
|
||||||
|
if not G.GAME.modifiers.cry_misprint_min then self.cost = math.floor(self.cost) end end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# the d in disp stands for disparity (match internal values to display values)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "function Card:apply_to_run(center)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if (self and self.ability and self.ability.extra_disp) then -- redeeming through centers isn't misprinted
|
||||||
|
local self_disp = self.ability.extra_disp
|
||||||
|
local orig_disp = self.config.center.config.extra_disp
|
||||||
|
local self_extra = self.ability.extra
|
||||||
|
local orig_extra = self.config.center.config.extra
|
||||||
|
|
||||||
|
local new_fac = self_disp / orig_disp
|
||||||
|
self.ability.extra = new_fac*orig_extra
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# I LOVE HARDCODING
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "G.hand:change_size(1)"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
G.hand:change_size(center_table.extra)
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# YOU LOVE HARDCODING
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "change_shop_size(1)"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
change_shop_size(center_table.extra)
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# WE ALL LOVE HARDCODING
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if center_table\.name \=\= 'Antimatter' then\n\s+G\.E_MANAGER\:add_event\(Event\(\{func = function\(\)\n\s+if G\.jokers then \n\s+G\.jokers\.config\.card_limit \= G\.jokers\.config\.card_limit \+ 1\n\s+end\n\s+return true end \}\)\)\n\s+end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if center_table.name == 'Antimatter' then
|
||||||
|
G.E_MANAGER:add_event(Event({func = function()
|
||||||
|
if G.jokers then
|
||||||
|
G.jokers.config.card_limit = G.jokers.config.card_limit + center_table.extra
|
||||||
|
end
|
||||||
|
return true end }))
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# AAAA
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if center_table\.name \=\= 'Crystal Ball' then\n\s+G\.E_MANAGER:add_event\(Event\(\{func \= function\(\)\n\s+G\.consumeables\.config\.card_limit \= G.consumeables\.config\.card_limit \+ 1\n\s+return true end }\)\)\n\s+end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if center_table.name == 'Crystal Ball' then
|
||||||
|
G.E_MANAGER:add_event(Event({func = function()
|
||||||
|
G.consumeables.config.card_limit = G.consumeables.config.card_limit + center_table.extra
|
||||||
|
return true end }))
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# anyway how's your day going?
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''elseif _c.name == "Clearance Sale" or _c.name == "Liquidation" then loc_vars = {cfg.extra}'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
elseif _c.name == "Crystal Ball" or _c.name == "Omen Globe" then loc_vars = {cfg.extra}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# doing pretty good myself
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''if _c.name == "Overstock" or _c.name == 'Overstock Plus' then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if _c.name == "Overstock" or _c.name == "Overstock Plus" then loc_vars = {cfg.extra}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# spent the whole day reviving misprinted vouchers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''elseif _c.name == "Blank" or _c.name == "Antimatter" then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
elseif _c.name == "Blank" or _c.name == "Antimatter" then loc_vars = {cfg.extra}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# but whatever, not like i was doing anything anyway
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''UIBox_button({label = {localize('b_reroll_boss'), localize('$')..'10'}, button = "reroll_boss", func = 'reroll_boss_button'}) or nil'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
UIBox_button({label = {localize('b_reroll_boss'), localize('$')..Cryptid.cheapest_boss_reroll()}, button = "reroll_boss", func = 'reroll_boss_button'}) or nil
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# worth it in the end ig, it was bugging me
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''if ((G.GAME.dollars-G.GAME.bankrupt_at) - 10 >= 0) and'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if ((to_big(G.GAME.dollars)-to_big(G.GAME.bankrupt_at)) - to_big(Cryptid.cheapest_boss_reroll()) >= to_big(0)) and
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# see you around
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''if not G.from_boss_tag then ease_dollars(-10) end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if not G.from_boss_tag then ease_dollars(-Cryptid.cheapest_boss_reroll()) end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# hi i'm back and i'm fixing this thing that breaks sometimes for no reason (it really shouldn't)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''v_overstock_norm = {order = 1, discovered = false, unlocked = true , available = true, cost = 10, name = "Overstock", pos = {x=0,y=0}, set = "Voucher", config = {}},'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
v_overstock_norm = {order = 1, discovered = false, unlocked = true , available = true, cost = 10, name = "Overstock", pos = {x=0,y=0}, set = "Voucher", config = {extra = 1}},
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''v_crystal_ball= {order = 9, discovered = false, unlocked = true , available = true, cost = 10, name = "Crystal Ball", pos = {x=2,y=2}, set = "Voucher", config = {extra = 3}},'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
v_crystal_ball= {order = 9, discovered = false, unlocked = true , available = true, cost = 10, name = "Crystal Ball", pos = {x=2,y=2}, set = "Voucher", config = {extra = 1}},
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''v_overstock_plus= {order = 2, discovered = false, unlocked = false, available = true, cost = 10, name = "Overstock Plus", pos = {x=0,y=1}, set = "Voucher", config = {}, requires = {'v_overstock_norm'},unlock_condition = {type = 'c_shop_dollars_spent', extra = 2500}},'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
v_overstock_plus= {order = 2, discovered = false, unlocked = false, available = true, cost = 10, name = "Overstock Plus", pos = {x=0,y=1}, set = "Voucher", config = {extra = 1}, requires = {'v_overstock_norm'},unlock_condition = {type = 'c_shop_dollars_spent', extra = 2500}},
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''v_antimatter= {order = 24, discovered = false, unlocked = false, available = true, cost = 10, name = "Antimatter", pos = {x=7,y=1}, set = "Voucher", config = {extra = 15}, requires = {'v_blank'},unlock_condition = {type = 'blank_redeems', extra = 10}},'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
v_antimatter= {order = 24, discovered = false, unlocked = false, available = true, cost = 10, name = "Antimatter", pos = {x=7,y=1}, set = "Voucher", config = {extra = 1}, requires = {'v_blank'},unlock_condition = {type = 'blank_redeems', extra = 10}},
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# whyyyyyyyyy
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''G.GAME.tarot_rate = 4*center_table.extra'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
G.GAME.tarot_rate = G.GAME.tarot_rate*center_table.extra
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''G.GAME.planet_rate = 4*center_table.extra'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
G.GAME.planet_rate = G.GAME.planet_rate*center_table.extra
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# keep vanilla rates by modifying tycoons
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''v_tarot_tycoon= {order = 18, discovered = false, unlocked = false, available = true,cost = 10, name = "Tarot Tycoon", pos = {x=1,y=1}, set = "Voucher", config = {extra = 32/4, extra_disp = 4}, requires = {'v_tarot_merchant'},unlock_condition = {type = 'c_tarots_bought', extra = 50}},'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
v_tarot_tycoon= {order = 18, discovered = false, unlocked = false, available = true,cost = 10, name = "Tarot Tycoon", pos = {x=1,y=1}, set = "Voucher", config = {extra = 32/9.6, extra_disp = 4}, requires = {'v_tarot_merchant'},unlock_condition = {type = 'c_tarots_bought', extra = 50}},
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''v_planet_tycoon= {order = 20, discovered = false, unlocked = false, available = true,cost = 10, name = "Planet Tycoon", pos = {x=2,y=1}, set = "Voucher", config = {extra = 32/4, extra_disp = 4}, requires = {'v_planet_merchant'},unlock_condition = {type = 'c_planets_bought', extra = 50}},'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
v_planet_tycoon= {order = 20, discovered = false, unlocked = false, available = true,cost = 10, name = "Planet Tycoon", pos = {x=2,y=1}, set = "Voucher", config = {extra = 32/9.6, extra_disp = 4}, requires = {'v_planet_merchant'},unlock_condition = {type = 'c_planets_bought', extra = 50}},
|
||||||
|
'''
|
||||||
|
match_indent = true
|
27
Cryptid/lovely/planet.toml
Normal file
27
Cryptid/lovely/planet.toml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Lapio softlock mechanic
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if (not v.config.softlock or G.GAME.hands[v.config.hand_type].played > 0) then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local softlocked = true
|
||||||
|
if not v.config.softlock then
|
||||||
|
softlocked = false
|
||||||
|
elseif v.config.hand_type then
|
||||||
|
softlocked = G.GAME.hands[v.config.hand_type].played == 0
|
||||||
|
elseif v.config.hand_types then
|
||||||
|
for _, h in pairs(v.config.hand_types) do
|
||||||
|
if G.GAME.hands[h].played > 0 then
|
||||||
|
softlocked = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not softlocked then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
20
Cryptid/lovely/seal.toml
Normal file
20
Cryptid/lovely/seal.toml
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 10
|
||||||
|
|
||||||
|
|
||||||
|
# Call Card:calculate_seal() with destroying_card context
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '(?<indent>[\t ]*)if destroyed then \n'
|
||||||
|
position = 'before'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
60
Cryptid/lovely/spooky.toml
Normal file
60
Cryptid/lovely/spooky.toml
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 10
|
||||||
|
|
||||||
|
# Haunted House - useless skips
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = 'if _tag then'
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''if _tag and not G.GAME.events.ev_cry_choco2 then'''
|
||||||
|
|
||||||
|
# Please Take One jank
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''ease_background_colour_blind(G.STATES.ROUND_EVAL)'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''if G.GAME.events.ev_cry_choco6 and G.round_eval then return true end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Revered Antique - create legendary
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''if G.load_shop_booster then'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.events.ev_cry_choco10 then
|
||||||
|
local add = true
|
||||||
|
for k, v in pairs(G.shop_vouchers.cards) do -- G.load_shop_vouchers is already set to nil here, just do a normal check
|
||||||
|
if v.ability.cry_antique then add = false end
|
||||||
|
end
|
||||||
|
if add then
|
||||||
|
local card = create_card('Joker', G.jokers, true, nil, nil, nil, nil, 'cry_antique')
|
||||||
|
Cryptid.misprintize(card)
|
||||||
|
card.misprint_cost_fac = 50/card.cost
|
||||||
|
card:set_cost()
|
||||||
|
create_shop_card_ui(card, 'Voucher', G.shop_vouchers)
|
||||||
|
card:start_materialize()
|
||||||
|
card.ability.cry_antique = true
|
||||||
|
G.shop_vouchers.config.card_limit = G.shop_vouchers.config.card_limit + 1
|
||||||
|
G.shop_vouchers:emplace(card)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# hackfix for flickering thing
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''if not card then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if cfg and not card then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
476
Cryptid/lovely/stake.toml
Normal file
476
Cryptid/lovely/stake.toml
Normal file
|
@ -0,0 +1,476 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
|
||||||
|
# Yellow Stake - perishable and rental effects on consumable
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if G.GAME.round_resets.ante == G.GAME.win_ante and G.GAME.blind:get_type() == 'Boss' then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
local i = 1
|
||||||
|
while i <= #G.jokers.cards do
|
||||||
|
local gone = G.jokers.cards[i]:calculate_banana()
|
||||||
|
if not gone then i = i + 1 end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Yellow Stake - perishable and rental effects on cards held in hand
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "local effects = {[1] = {playing_card = G.hand.cards[i]:get_end_of_round_effect()}}"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
-- these are already calculated
|
||||||
|
-- does mean this patch is pointless now, but i want to leave it here just so it's clear, maybe remove later
|
||||||
|
-- G.hand.cards[i]:calculate_rental()
|
||||||
|
-- G.hand.cards[i]:calculate_perishable()
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Yellow Stake - perishable and rental effects on cards in deck and discard pile
|
||||||
|
# Double Down
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "G.FUNCS.draw_from_hand_to_discard()"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
local i = 1
|
||||||
|
while i <= #G.hand.cards do
|
||||||
|
local gone = G.hand.cards[i]:calculate_banana()
|
||||||
|
if not gone then i = i + 1 end
|
||||||
|
end
|
||||||
|
for i = 1, #G.discard.cards do
|
||||||
|
G.discard.cards[i]:calculate_perishable()
|
||||||
|
end
|
||||||
|
i = 1
|
||||||
|
while i <= #G.deck.cards do
|
||||||
|
G.deck.cards[i]:calculate_perishable()
|
||||||
|
local gone = G.deck.cards[i]:calculate_banana()
|
||||||
|
if not gone then i = i + 1 end
|
||||||
|
end
|
||||||
|
if G.GAME.used_vouchers.v_cry_double_down then
|
||||||
|
local function update_dbl(area)
|
||||||
|
for i = 1, #area.cards do
|
||||||
|
if area.cards[i].dbl_side then
|
||||||
|
--tweak to do deck effects with on the flip side
|
||||||
|
Cryptid.misprintize(area.cards[i].dbl_side, {min = 1.5, max = 1.5}, nil, true)
|
||||||
|
card_eval_status_text(area.cards[i], "extra", nil, nil, nil, { message = localize("k_upgrade_ex") })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
update_dbl(G.jokers)
|
||||||
|
update_dbl(G.consumeables)
|
||||||
|
update_dbl(G.hand)
|
||||||
|
update_dbl(G.discard)
|
||||||
|
update_dbl(G.deck)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Yellow Stake - Hanged Man can't be used on Eternal cards, Death can't remove Eternal
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
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"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Yellow Stake - Immolate can't be used on Eternal cards
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "for k, v in ipairs(G.hand.cards) do temp_hand[#temp_hand+1] = v end"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
for k, v in ipairs(G.hand.cards) do
|
||||||
|
if not v.ability.eternal then
|
||||||
|
temp_hand[#temp_hand+1] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Yellow Stake - Death can't modify Eternal cards (redundant, but may help if Death can be used on more cards)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if G.hand.highlighted[i] ~= rightmost then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if G.hand.highlighted[i] ~= rightmost and not G.hand.highlighted[i].ability.eternal then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Yellow Stake - Trading Card can't destroy Eternals
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "G.GAME.current_round.discards_used <= 0 and #context.full_hand == 1 then"
|
||||||
|
position = "at"
|
||||||
|
payload = "G.GAME.current_round.discards_used <= 0 and #context.full_hand == 1 and not context.other_card.ability.eternal then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Yellow Stake - Sixth Sense can't destroy Eternals
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Sixth Sense' and #context.full_hand == 1 and context.full_hand[1]:get_id() == 6 and G.GAME.current_round.hands_played == 0 then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if self.ability.name == 'Sixth Sense' and #context.full_hand == 1 and context.full_hand[1]:get_id() == 6 and not context.full_hand[1].ability.eternal and G.GAME.current_round.hands_played == 0 then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Yellow Stake - enhancement tarots don't remove stickers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "perma_bonus = self.ability and self.ability.perma_bonus or 0,"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
eternal = self.ability and self.ability.eternal,
|
||||||
|
perishable = self.ability and self.ability.perishable,
|
||||||
|
perish_tally = self.ability and self.ability.perish_tally,
|
||||||
|
rental = self.ability and self.ability.rental,
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Amber Stake - edit number of booster packs
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "for i = 1, 2 do"
|
||||||
|
position = "at"
|
||||||
|
payload = "for i = 1, G.GAME.modifiers.cry_no_boosters and 0 or G.GAME.modifiers.cry_booster_packs or 2 do"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Quartz Stake - pinned effect applies in every type of slot
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 < b.T.x + b.T.w/2 end)"
|
||||||
|
position = "at"
|
||||||
|
payload = "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)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Quartz Stake - render pinned sticker
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "elseif self.sprite_facing == 'back' then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if self.pinned then
|
||||||
|
G.shared_stickers['pinned'].role.draw_major = self
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Ruby Stake - big blind bosses
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "self.GAME.round_resets.blind_choices.Boss = get_new_boss()"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.modifiers.cry_big_boss_rate and pseudorandom('cry_big_boss') < G.GAME.modifiers.cry_big_boss_rate then
|
||||||
|
self.GAME.round_resets.blind_choices.Big = get_new_boss()
|
||||||
|
elseif G.GAME.modifiers.cry_rush_hour_ii then
|
||||||
|
self.GAME.round_resets.blind_choices.Small = get_new_boss()
|
||||||
|
self.GAME.round_resets.blind_choices.Big = get_new_boss()
|
||||||
|
else
|
||||||
|
self.GAME.round_resets.blind_choices.Big = 'bl_big'
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Ruby Stake - big blind bosses
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "G.GAME.round_resets.blind_choices.Boss = get_new_boss()"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.modifiers.cry_big_boss_rate and pseudorandom('cry_big_boss') < G.GAME.modifiers.cry_big_boss_rate then
|
||||||
|
G.GAME.round_resets.blind_choices.Big = get_new_boss()
|
||||||
|
elseif G.GAME.modifiers.cry_rush_hour_ii then
|
||||||
|
G.GAME.round_resets.blind_choices.Small = get_new_boss()
|
||||||
|
G.GAME.round_resets.blind_choices.Big = get_new_boss()
|
||||||
|
else
|
||||||
|
G.GAME.round_resets.blind_choices.Big = 'bl_big'
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Ruby Stake - big blind doesn't increase ante
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if G.GAME.blind:get_type() == 'Boss' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if G.GAME.blind_on_deck == 'Boss' then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Ruby Stake - smaller showdown blinds don't win
|
||||||
|
# Win on any ante above win_ante
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if G.GAME.round_resets.ante == G.GAME.win_ante and G.GAME.blind:get_type() == 'Boss' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if G.GAME.round_resets.ante >= G.GAME.win_ante and G.GAME.blind_on_deck == 'Boss' then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Rush Hour - mark small blind as defeated
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if G.GAME.round_resets.blind == G.P_BLINDS.bl_small then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if G.GAME.blind_on_deck == 'Small' then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Ruby Stake - mark big blind as defeated
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "elseif G.GAME.round_resets.blind == G.P_BLINDS.bl_big then"
|
||||||
|
position = "at"
|
||||||
|
payload = "elseif G.GAME.blind_on_deck == 'Big' then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Sapphire Stake - ante tax
|
||||||
|
# The Joke boss effect
|
||||||
|
# Save game state for Revert
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "delay(0.4); ease_ante(1); delay(0.4); check_for_unlock({type = 'ante_up', ante = G.GAME.round_resets.ante + 1})"
|
||||||
|
position = "at"
|
||||||
|
payload = "delay(0.4); ease_ante(G.GAME.blind and G.GAME.blind:cry_calc_ante_gain() or 1); Cryptid.apply_ante_tax(); delay(0.4); check_for_unlock({type = 'ante_up', ante = G.GAME.round_resets.ante + 1})"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Emerald Stake - Permanently flipped cards
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "if card.facing == 'back' and self.config.type ~= 'discard' and self.config.type ~= 'deck' and not stay_flipped then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''if card.cry_flipped then card.facing = 'back'; card.sprite_facing = 'back' end
|
||||||
|
if not (card.cry_flipped and (self == G.shop_jokers or self == G.shop_vouchers or self == G.shop_booster)) and card.facing == 'back' and self.config.type ~= 'discard' and self.config.type ~= 'deck' and not stay_flipped then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Emerald Stake - flipped packs
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "create_shop_card_ui(card, 'Booster', G.shop_booster)"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.modifiers.cry_enable_flipped_in_shop and pseudorandom('cry_flip_pack'..G.GAME.round_resets.ante) > 0.7 then
|
||||||
|
card.cry_flipped = true
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Emerald Stake - flipped vouchers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "create_shop_card_ui(card, 'Voucher', G.shop_vouchers)"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.modifiers.cry_enable_flipped_in_shop and pseudorandom('cry_flip_vouch'..G.GAME.round_resets.ante) > 0.7 then
|
||||||
|
card.cry_flipped = true
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Platinum Stake - start with big blind ready to be selected
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "G.GAME.blind_on_deck = 'Small'"
|
||||||
|
position = "at"
|
||||||
|
payload = "G.GAME.blind_on_deck = G.GAME.modifiers.cry_no_small_blind and 'Big' or 'Small'"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Platinum Stake - start with big blind ready to be selected
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "G.GAME.blind_on_deck = 'Small'"
|
||||||
|
position = "at"
|
||||||
|
payload = "G.GAME.blind_on_deck = G.GAME.modifiers.cry_no_small_blind and 'Big' or 'Small'"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Platinum Stake - hide Small Blind
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "G.GAME.round_resets.blind_states.Small = 'Upcoming'"
|
||||||
|
position = "at"
|
||||||
|
payload = "G.GAME.round_resets.blind_states.Small = G.GAME.modifiers.cry_no_small_blind and 'Hide' or 'Upcoming'"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Ember Stake - grant no money on sell
|
||||||
|
# this is NOT ember stake grant no money on sell wtf
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''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'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Ember Stake - give no money for selling
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''ease_dollars(self.sell_cost)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if (not G.GAME.modifiers.cry_no_sell_value) and self.sell_cost ~= 0 then
|
||||||
|
ease_dollars(self.sell_cost)
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Ember Stake - don't play coin sound
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''play_sound('coin2')'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if (not G.GAME.modifiers.cry_no_sell_value) and self.sell_cost ~= 0 then
|
||||||
|
play_sound('coin2')
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Ember Stake - red dissolve for swag points
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''self:start_dissolve({G.C.GOLD})'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if G.GAME.modifiers.cry_no_sell_value or self.sell_cost == 0 then
|
||||||
|
self:start_dissolve({G.C.RED})
|
||||||
|
else
|
||||||
|
self:start_dissolve({G.C.GOLD})
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Ember Stake - remove sell price visually
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''self.sell_cost_label = self.facing == 'back' and '?' or self.sell_cost'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''self.sell_cost_label = (self.facing == 'back' and '?') or (G.GAME.modifiers.cry_no_sell_value and 0) or self.sell_cost'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Dawn Stake - change maximum allowed highlights (i have no idea what this code is meant to be doing?? whatever it is, it doesn't seem to be working -toneblock)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''local cfg = (card and card.ability) or _c['config']'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''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'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Horizon Stake - create random card at start of blind
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''G.GAME.blind:set_blind(G.GAME.round_resets.blind)'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''if G.GAME.modifiers.cry_card_each_round then
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
func = function()
|
||||||
|
local front = pseudorandom_element(G.P_CARDS, pseudoseed('cry_horizon'))
|
||||||
|
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
|
||||||
|
local edition = G.P_CENTERS.c_base
|
||||||
|
local card = Card(G.play.T.x + G.play.T.w/2, G.play.T.y, G.CARD_W, G.CARD_H, front, G.P_CENTERS.c_base, {playing_card = G.playing_card})
|
||||||
|
card:start_materialize()
|
||||||
|
if G.GAME.selected_back.effect.config.cry_force_edition and G.GAME.selected_back.effect.config.cry_force_edition ~= "random" then
|
||||||
|
local edition = {}
|
||||||
|
edition[G.GAME.selected_back.effect.config.cry_force_edition] = true
|
||||||
|
card:set_edition(edition, true, true);
|
||||||
|
end
|
||||||
|
G.play:emplace(card)
|
||||||
|
table.insert(G.playing_cards, card)
|
||||||
|
playing_card_joker_effects({true})
|
||||||
|
return true
|
||||||
|
end}))
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
func = function()
|
||||||
|
G.deck.config.card_limit = G.deck.config.card_limit + 1
|
||||||
|
return true
|
||||||
|
end}))
|
||||||
|
draw_card(G.play,G.deck, 90,'up', nil)
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Blossom Stake - showdown blinds before the winning ante
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''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'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# inject into vanilla calculate_perishable to prevent nil index bug (i don't know where it fails so i'm just patching every part of it...)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if self.ability.perishable and self.ability.perish_tally > 0 then'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''if self.ability.perishable and not self.ability.perish_tally then self.ability.perish_tally = G.GAME.perishable_rounds end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# again in set_debuff
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if self.ability.perishable and self.ability.perish_tally <= 0 then'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''if self.ability.perishable and not self.ability.perish_tally then self.ability.perish_tally = G.GAME.perishable_rounds end'''
|
||||||
|
match_indent = true
|
156
Cryptid/lovely/sticker.toml
Normal file
156
Cryptid/lovely/sticker.toml
Normal file
|
@ -0,0 +1,156 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# initiate variables
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "rental_rate = 3,"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
cry_voucher_perishable_rounds = 8,
|
||||||
|
cry_voucher_rental_rate = 2,
|
||||||
|
cry_consumeable_rental_rate = 2,
|
||||||
|
cry_voucher_banana_odds = 12,
|
||||||
|
cry_consumeable_banana_odds = 4,
|
||||||
|
cry_pinned_consumeables = 0,
|
||||||
|
cry_shop_joker_price_modifier = 1,
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# check for pinned
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "G.GAME.current_round.voucher = get_next_voucher_key()"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.current_round.cry_voucher_stickers.pinned == false then
|
||||||
|
G.GAME.current_round.voucher = get_next_voucher_key()
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# remove stickers if voucher is redeemed
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "self:apply_to_run()"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
G.GAME.current_round.cry_voucher_edition = nil
|
||||||
|
G.GAME.current_round.cry_voucher_stickers = {eternal = false, perishable = false, rental = false, pinned = false, banana = false}
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# consumeable sticker checking
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "local used_tarot = copier or self"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.rental then
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
trigger = 'immediate',
|
||||||
|
blocking = false,
|
||||||
|
blockable = false,
|
||||||
|
func = (function()
|
||||||
|
ease_dollars(-G.GAME.cry_consumeable_rental_rate)
|
||||||
|
return true
|
||||||
|
end)}))
|
||||||
|
end
|
||||||
|
local gone = false
|
||||||
|
if self.ability.banana then
|
||||||
|
if not self.ability.extinct then
|
||||||
|
if (pseudorandom('oops_it_banana') < G.GAME.probabilities.normal/G.GAME.cry_consumeable_banana_odds) then
|
||||||
|
local gone = true
|
||||||
|
self.ability.extinct = true
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
func = function()
|
||||||
|
play_sound('tarot1')
|
||||||
|
self.T.r = -0.2
|
||||||
|
self:juice_up(0.3, 0.4)
|
||||||
|
self.states.drag.is = true
|
||||||
|
self.children.center.pinch.x = true
|
||||||
|
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.3, blockable = false,
|
||||||
|
func = function()
|
||||||
|
if self.area then self.area:remove_card(self) end
|
||||||
|
self:remove()
|
||||||
|
self = nil
|
||||||
|
return true; end}))
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
}))
|
||||||
|
card_eval_status_text(self, 'jokers', nil, nil, nil, {message = localize('k_extinct_ex'), delay = 0.1})
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if gone == false then
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# end the wrap
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "function Card:can_use_consumeable(any_state, skip_check)"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# check for pinned
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "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"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.cry_pinned_consumeables > 0 and not self.pinned then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# pinned consumeable remove, counterpart is in cryptid's create_card
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.queue_negative_removal then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# rental jank
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.rental then self.cost = 1 end"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.rental and (not (self.ability.set == "Planet" and #find_joker('Astronomer') > 0) and self.ability.set ~= "Booster") then self.cost = 1 end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# apply stickers to packs
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "card.ability.booster_pos = i"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
local stickers = Cryptid.next_voucher_stickers(true) -- don't mind the name
|
||||||
|
for k, v in pairs(stickers) do
|
||||||
|
card.ability[k] = v
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
44
Cryptid/lovely/universum.toml
Normal file
44
Cryptid/lovely/universum.toml
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Level up modifier
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "amount = amount or 1"
|
||||||
|
position = "after"
|
||||||
|
payload = "if not next(find_joker('cry-Universum')) then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "G.GAME.hands[hand].mult = math.max(G.GAME.hands[hand].s_mult + G.GAME.hands[hand].l_mult*(G.GAME.hands[hand].level - 1), 1)"
|
||||||
|
position = "at"
|
||||||
|
payload = "G.GAME.hands[hand].mult = math.max(G.GAME.hands[hand].mult + G.GAME.hands[hand].l_mult*amount, 1)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "G.GAME.hands[hand].chips = math.max(G.GAME.hands[hand].s_chips + G.GAME.hands[hand].l_chips*(G.GAME.hands[hand].level - 1), 0)"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
G.GAME.hands[hand].chips = math.max(G.GAME.hands[hand].chips + G.GAME.hands[hand].l_chips*amount, 1)
|
||||||
|
else
|
||||||
|
universum_mod = 1
|
||||||
|
local effects = {}
|
||||||
|
SMODS.calculate_context({cry_universum = true}, effects)
|
||||||
|
for i = 1, #effects do
|
||||||
|
universum_mod = universum_mod * (effects[i] and effects[i].jokers and effects[i].jokers.mod or 1)
|
||||||
|
end
|
||||||
|
G.GAME.hands[hand].level = math.max(0, G.GAME.hands[hand].level + amount)
|
||||||
|
G.GAME.hands[hand].mult = math.max(G.GAME.hands[hand].mult * (universum_mod)^amount, 1)
|
||||||
|
G.GAME.hands[hand].chips = math.max(G.GAME.hands[hand].chips * (universum_mod)^amount, 1)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
61
Cryptid/lovely/very_fair.toml
Normal file
61
Cryptid/lovely/very_fair.toml
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -1
|
||||||
|
|
||||||
|
# Remove voucher at start of run (also for Crimson Stake)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "self.GAME.current_round.voucher = G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_voucher or SMODS.get_next_vouchers()"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if self.GAME.modifiers.cry_no_vouchers then
|
||||||
|
very_fair_quip = pseudorandom_element(G.localization.misc.very_fair_quips, pseudoseed("cry_very_fair"))
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# Remove voucher when defeating boss (also for Crimson Stake)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "G.GAME.current_round.voucher = SMODS.get_next_vouchers()"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if G.GAME.modifiers.cry_no_vouchers then
|
||||||
|
very_fair_quip = pseudorandom_element(G.localization.misc.very_fair_quips, pseudoseed("cry_very_fair"))
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Change empty voucher text on Very Fair Deck
|
||||||
|
# This ain't localized, but that's a vanilla issue anyway
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "{n=G.UIT.T, config={text = 'DEFEAT', scale = 0.6, colour = G.C.WHITE}}"
|
||||||
|
position = "at"
|
||||||
|
payload = "{n=G.UIT.T, config={text = G.GAME.modifiers.cry_no_vouchers and (very_fair_quip[1] or '') or 'DEFEAT', scale = 0.6, colour = G.C.WHITE}}"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "{n=G.UIT.T, config={text = 'BOSS BLIND', scale = 0.4, colour = G.C.WHITE}}"
|
||||||
|
position = "at"
|
||||||
|
payload = "{n=G.UIT.T, config={text = G.GAME.modifiers.cry_no_vouchers and (very_fair_quip[2] or '') or G.GAME.modifiers.cry_voucher_restock_antes and G.GAME.round_resets.ante % G.GAME.modifiers.cry_voucher_restock_antes == 0 and 'TWO BOSS BLINDS' or 'BOSS BLIND', scale = 0.4, colour = G.C.WHITE}}"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "{n=G.UIT.T, config={text = 'TO RESTOCK', scale = 0.4, colour = G.C.WHITE}}"
|
||||||
|
position = "at"
|
||||||
|
payload = "{n=G.UIT.T, config={text = G.GAME.modifiers.cry_no_vouchers and (very_fair_quip[3] or '') or 'TO RESTOCK', scale = 0.4, colour = G.C.WHITE}}"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
118
Steamodded/lovely/achievements.toml
Normal file
118
Steamodded/lovely/achievements.toml
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
## Achievement API
|
||||||
|
|
||||||
|
# fetch_achievements()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)if G\.F_NO_ACHIEVEMENTS then return end[\n\s]*?--\|FROM LOCAL SETTINGS FILE'''
|
||||||
|
position = 'before'
|
||||||
|
# match_indent = true
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
G.SETTINGS.ACHIEVEMENTS_EARNED = G.SETTINGS.ACHIEVEMENTS_EARNED or {}
|
||||||
|
for k, v in pairs(G.ACHIEVEMENTS) do
|
||||||
|
if not v.key then v.key = k end
|
||||||
|
for kk, vv in pairs(G.SETTINGS.ACHIEVEMENTS_EARNED) do
|
||||||
|
if G.ACHIEVEMENTS[kk] and G.ACHIEVEMENTS[kk].mod then
|
||||||
|
G.ACHIEVEMENTS[kk].earned = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# check_for_unlock
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''if G.GAME.challenge then return end'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
fetch_achievements() -- Refreshes achievements
|
||||||
|
for k, v in pairs(G.ACHIEVEMENTS) do
|
||||||
|
if (not v.earned) and (v.unlock_condition and type(v.unlock_condition) == 'function') and v:unlock_condition(args) then
|
||||||
|
unlock_achievement(k)
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# unlock_achievement()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''if G.PROFILES[G.SETTINGS.profile].all_unlocked then return end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''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'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# unlock_achievement() - fix event queue leaking
|
||||||
|
# fixed smods achievements not unlocking due to above comment's memory leak fix
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''local achievement_set = false
|
||||||
|
if G.F_NO_ACHIEVEMENTS then return end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''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'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# create_UIBox_notify_alert
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''local t_s = Sprite(0,0,1.5*(_atlas.px/_atlas.py),1.5,_atlas, _c and _c.pos or {x=3, y=0})'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''if SMODS.Achievements[_achievement] then _c = SMODS.Achievements[_achievement]; _atlas = G.ASSET_ATLAS[_c.atlas] end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# option to allow unlocks and discoveries in seeded runs
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = 'if G\.GAME\.seeded or G\.GAME\.challenge then return end'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'if not SMODS.config.seeded_unlocks and (G.GAME.seeded or G.GAME.challenge) then return end'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/state_events.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = 'if not G.GAME.seeded and not G.GAME.challenge then'
|
||||||
|
payload = 'if (not G.GAME.seeded and not G.GAME.challenge) or SMODS.config.seeded_unlocks then'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = 'if G\.GAME\.seeded then'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'if false then'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = 'if G\.GAME\.challenge then'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'if false then'
|
62
Steamodded/lovely/atlas.toml
Normal file
62
Steamodded/lovely/atlas.toml
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Sprite API
|
||||||
|
|
||||||
|
# get_front_spriteinfo()
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = 'return G.ASSET_ATLAS[_front.atlas] or G.ASSET_ATLAS["cards_"..(G.SETTINGS.colourblind_option and 2 or 1)], _front.pos'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = 'return G.ASSET_ATLAS[G.SETTINGS.colourblind_option and _front.hc_atlas or _front.lc_atlas or {}] or G.ASSET_ATLAS[_front.atlas] or G.ASSET_ATLAS["cards_"..(G.SETTINGS.colourblind_option and 2 or 1)], _front.pos'
|
||||||
|
|
||||||
|
|
||||||
|
# Game:set_render_settings()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = "G:set_render_settings()"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = "SMODS.injectObjects(SMODS.Atlas)"
|
||||||
|
|
||||||
|
|
||||||
|
# create_UIBox_notify_alert()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = 'G.ASSET_ATLAS["icons"]'
|
||||||
|
position = 'after'
|
||||||
|
match_indent = false
|
||||||
|
payload = '''
|
||||||
|
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'''
|
||||||
|
|
||||||
|
## Set ability resizing fix
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/moveable.lua'
|
||||||
|
pattern = '''Node.init(self, args)'''
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''self.original_T = copy_table(self.T)'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
pattern = '''
|
||||||
|
local X, Y, W, H = self.T.x, self.T.y, self.T.w, self.T.h
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
for key, _ in pairs(self.T) do
|
||||||
|
self.T[key] = self.original_T[key]
|
||||||
|
end
|
||||||
|
'''
|
193
Steamodded/lovely/back.toml
Normal file
193
Steamodded/lovely/back.toml
Normal file
|
@ -0,0 +1,193 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Back API
|
||||||
|
|
||||||
|
# Back:init()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = "if not selected_back then selected_back = G.P_CENTERS.b_red end"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = "self.atlas = selected_back.unlocked and selected_back.atlas or nil"
|
||||||
|
|
||||||
|
# Back:change_to()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = "if not new_back then new_back = G.P_CENTERS.b_red end"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = "self.atlas = new_back.unlocked and new_back.atlas or nil"
|
||||||
|
|
||||||
|
# G.FUNCS.change_viewed_back
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = "G.PROFILES[G.SETTINGS.profile].MEMORY.deck = args.to_val"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
for key, val in pairs(G.sticker_card.area.cards) do
|
||||||
|
val.children.back = false
|
||||||
|
val:set_ability(val.config.center, true)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Back:apply_to_run()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = "function Back:apply_to_run()"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local obj = self.effect.center
|
||||||
|
if obj.apply and type(obj.apply) == 'function' then
|
||||||
|
obj:apply(self)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = "if self.effect.config.randomize_rank_suit then"
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
func = function()
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
func = function()
|
||||||
|
save_run()
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
}))
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
}))
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Back:trigger_effect(args)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = "if not args then return end"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local obj = self.effect.center
|
||||||
|
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 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'''
|
||||||
|
|
||||||
|
## Back:generate_UI
|
||||||
|
|
||||||
|
# Localization with `unlock` field in loc_txt, same as for Jokers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = 'if not back_config.unlock_condition then'
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
local localized_by_smods
|
||||||
|
local key_override
|
||||||
|
if back_config.locked_loc_vars and type(back_config.locked_loc_vars) == 'function' then
|
||||||
|
local res = back_config:locked_loc_vars() or {}
|
||||||
|
loc_args = res.vars or {}
|
||||||
|
key_override = res.key
|
||||||
|
end
|
||||||
|
if G.localization.descriptions.Back[key_override or back_config.key].unlock_parsed then
|
||||||
|
localize{type = 'unlocks', key = key_override or back_config.key, set = 'Back', nodes = loc_nodes, vars = loc_args}
|
||||||
|
localized_by_smods = true
|
||||||
|
end
|
||||||
|
if not back_config.unlock_condition then'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = '''localize{type = 'descriptions', key = 'demo_locked', set = "Other", nodes = loc_nodes, vars = loc_args}'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
if not localized_by_smods then
|
||||||
|
localize{type = 'descriptions', key = 'demo_locked', set = "Other", nodes = loc_nodes, vars = loc_args}
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = 'loc_args = {other_name}'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'loc_args = loc_args or {other_name}'
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = 'loc_args = {tostring(back_config.unlock_condition.amount)}'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'loc_args = loc_args or {tostring(back_config.unlock_condition.amount)}'
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = 'loc_args = {other_name, colours = {get_stake_col(back_config.unlock_condition.stake)}}'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'loc_args = loc_args or {other_name, colours = {get_stake_col(back_config.unlock_condition.stake)}}'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = "if name_to_check == 'Blue Deck'*"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local key_override
|
||||||
|
if back_config.loc_vars and type(back_config.loc_vars) == 'function' then
|
||||||
|
local res = back_config:loc_vars() or {}
|
||||||
|
loc_args = res.vars or {}
|
||||||
|
key_override = res.key
|
||||||
|
elseif name_to_check == 'Blue Deck' then loc_args = {effect_config.hands}'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'back.lua'
|
||||||
|
pattern = "key = back_config\\.key"
|
||||||
|
position = 'at'
|
||||||
|
payload = "key = key_override or back_config.key"
|
||||||
|
|
||||||
|
# Back:apply_to_run() - add jokers support to config
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
pattern = '''
|
||||||
|
if self.effect.config.voucher then
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
1584
Steamodded/lovely/better_calc.toml
Normal file
1584
Steamodded/lovely/better_calc.toml
Normal file
File diff suppressed because it is too large
Load diff
467
Steamodded/lovely/blind.toml
Normal file
467
Steamodded/lovely/blind.toml
Normal file
|
@ -0,0 +1,467 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Blind API
|
||||||
|
|
||||||
|
## Set debuffed_by_blind, use it for Matador behavior
|
||||||
|
## Blind:debuff_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = 'card:set_debuff(true)'
|
||||||
|
position = 'after'
|
||||||
|
payload = "if card.debuff then card.debuffed_by_blind = true end"
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = 'card:set_debuff\(true\); return end'
|
||||||
|
position = 'at'
|
||||||
|
payload = """
|
||||||
|
card:set_debuff(true); if card.debuff then card.debuffed_by_blind = true end; return end"""
|
||||||
|
|
||||||
|
## Card:set_debuff()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '''
|
||||||
|
self\.debuff = should_debuff
|
||||||
|
(?<indent>[\t ]*)end
|
||||||
|
'''
|
||||||
|
position = 'after'
|
||||||
|
payload = """if not self.debuff then self.debuffed_by_blind = false end
|
||||||
|
|
||||||
|
"""
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
## Blind functions
|
||||||
|
|
||||||
|
# Blind:set_blind()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "G.GAME.last_blind = G.GAME.last_blind or {}"
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.blind
|
||||||
|
self.children.animatedSprite.atlas = G.ANIMATION_ATLAS[obj.atlas] or G.ANIMATION_ATLAS['blind_chips']'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "if self.name == 'The Eye' and not reset then"
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
if blind then
|
||||||
|
self.in_blind = true
|
||||||
|
end
|
||||||
|
local obj = self.config.blind
|
||||||
|
if not reset and obj.set_blind and type(obj.set_blind) == 'function' then
|
||||||
|
obj:set_blind()
|
||||||
|
elseif self.name == 'The Eye' and not reset then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Blind:disable()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "if self.name == 'The Water' then"
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.blind
|
||||||
|
if obj.disable and type(obj.disable) == 'function' then
|
||||||
|
obj:disable()
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Blind:defeat()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "if self.name == 'The Manacle' and not self.disabled then"
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.blind
|
||||||
|
if obj.defeat and type(obj.defeat) == 'function' then
|
||||||
|
obj:defeat()
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Blind:debuff_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "if self.debuff and not self.disabled and card.area ~= G.jokers then"
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
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
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Blind:stay_flipped()
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "function Blind:stay_flipped(area, card)"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''function Blind:stay_flipped(area, card, from_area)'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "if area == G.hand then"
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.blind
|
||||||
|
if obj.stay_flipped and type(obj.stay_flipped) == 'function' then
|
||||||
|
return obj:stay_flipped(area, card, from_area)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'cardarea.lua'
|
||||||
|
pattern = "local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(self, card)"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(self, card, area)'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(to, card)"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''local stay_flipped = G.GAME and G.GAME.blind and G.GAME.blind:stay_flipped(to, card, from)'''
|
||||||
|
|
||||||
|
# Blind:drawn_to_hand()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if self.name == 'Cerulean Bell' then\n"
|
||||||
|
position = 'before'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.blind
|
||||||
|
if obj.drawn_to_hand and type(obj.drawn_to_hand) == 'function' then
|
||||||
|
obj:drawn_to_hand()
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Blind:debuff_hand()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "if self.debuff then"
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.blind
|
||||||
|
if obj.debuff_hand and type(obj.debuff_hand) == 'function' then
|
||||||
|
return obj:debuff_hand(cards, hand, handname, check)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Blind:modify_hand()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "if self.disabled then return mult, hand_chips, false end"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "function Blind:modify_hand(cards, poker_hands, text, mult, hand_chips)"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''function Blind:modify_hand(cards, poker_hands, text, mult, hand_chips, scoring_hand)'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/state_events.lua'
|
||||||
|
pattern = "mult, hand_chips, modded = G.GAME.blind:modify_hand(G.play.cards, poker_hands, text, mult, hand_chips)"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''mult, hand_chips, modded = G.GAME.blind:modify_hand(G.play.cards, poker_hands, text, mult, hand_chips, scoring_hand)'''
|
||||||
|
|
||||||
|
# Blind:press_play()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = 'if self.name == "The Hook" then'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.blind
|
||||||
|
if obj.press_play and type(obj.press_play) == 'function' then
|
||||||
|
return obj:press_play()
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Blind:get_loc_debuff_text()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = 'function Blind:get_loc_debuff_text()'
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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'''
|
||||||
|
|
||||||
|
# Blind:set_text()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "local loc_target = localize{type = 'raw_descriptions', key = self.config.blind.key, set = 'Blind', vars = loc_vars or self.config.blind.vars}"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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 {}
|
||||||
|
target.vars = res.vars or target.vars
|
||||||
|
target.key = res.key or target.key
|
||||||
|
end
|
||||||
|
local loc_target = localize(target)'''
|
||||||
|
|
||||||
|
# Blind:load()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = 'if G.P_BLINDS[blindTable.config_blind] then'
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
if self.config.blind.atlas then
|
||||||
|
self.children.animatedSprite.atlas = G.ANIMATION_ATLAS[self.config.blind.atlas]
|
||||||
|
end'''
|
||||||
|
|
||||||
|
|
||||||
|
# create_UIBox_blind_choice()
|
||||||
|
# create_UIBox_round_scores_row()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)blind_choice.animation = AnimatedSprite\\(0,0, 1.4, 1.4, (?<atlas>G.ANIMATION_ATLAS\\['blind_chips'\\]), blind_choice.config.pos\\)"
|
||||||
|
position = 'at'
|
||||||
|
root_capture = 'atlas'
|
||||||
|
payload = "G.ANIMATION_ATLAS[blind_choice.config.atlas] or G.ANIMATION_ATLAS['blind_chips']"
|
||||||
|
|
||||||
|
# create_UIBox_your_collection_blinds()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)local temp_blind = AnimatedSprite\\(0,0,1.3,1.3, G.ANIMATION_ATLAS\\['blind_chips'\\], discovered and v.pos or G.b_undiscovered.pos\\)"
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
local s = 1.3
|
||||||
|
if math.ceil(#blind_tab/6) > 6 then
|
||||||
|
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)'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = 'blind_matrix[math.ceil((k-1)/5+0.001)][1+((k-1)%5)] = {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
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,
|
||||||
|
}
|
||||||
|
})'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '[\t ]*\(k==6 or k ==16 or k == 26\) and \{n=G.UIT.B, config=\{h=0.2,w=0.5\}\} or nil,\n[\t ]*\{n=G.UIT.O, config=\{object = temp_blind, focus_with_object = true\}\},\n[\t ]*\(k==5 or k ==15 or k == 25\) and \{n=G.UIT.B, config=\{h=0.2,w=0.5\}\} or nil,\n[\t ]*\}\}'
|
||||||
|
position = 'at'
|
||||||
|
payload = ''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = 'table.sort(blind_tab, function (a, b) return a.order < b.order end)'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
table.sort(blind_tab, function(a, b) return a.order + (a.boss and a.boss.showdown and 1000 or 0) < b.order + (b.boss and b.boss.showdown and 1000 or 0) end)'''
|
||||||
|
|
||||||
|
# add_round_eval_row()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "local blind_sprite = AnimatedSprite(0, 0, 1.2,1.2, G.ANIMATION_ATLAS['blind_chips'], copy_table(G.GAME.blind.pos))"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
local obj = G.GAME.blind.config.blind
|
||||||
|
local blind_sprite = AnimatedSprite(0, 0, 1.2, 1.2, G.ANIMATION_ATLAS[obj.atlas] or G.ANIMATION_ATLAS['blind_chips'], copy_table(G.GAME.blind.pos))'''
|
||||||
|
|
||||||
|
# display blind descriptions in info_queue
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif _c.set == 'Tarot' then"
|
||||||
|
position = "before"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''elseif _c.set == 'Blind' then
|
||||||
|
local coll_loc_vars = (_c.collection_loc_vars and type(_c.collection_loc_vars) == 'function' and _c:collection_loc_vars()) or {}
|
||||||
|
loc_vars = coll_loc_vars.vars or _c.vars
|
||||||
|
localize{type = 'descriptions', key = coll_loc_vars.key or _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars}
|
||||||
|
'''
|
||||||
|
|
||||||
|
# create_UIBox_blind_choice()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = "local loc_target = localize{type = 'raw_descriptions', key = blind_choice.config.key, set = 'Blind', vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')}}"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
local target = {type = 'raw_descriptions', key = blind_choice.config.key, set = 'Blind', vars = {}}
|
||||||
|
if blind_choice.config.name == 'The Ox' then
|
||||||
|
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 {}
|
||||||
|
target.vars = res.vars or target.vars
|
||||||
|
target.key = res.key or target.key
|
||||||
|
end
|
||||||
|
local loc_target = localize(target)'''
|
||||||
|
|
||||||
|
# create_UIBox_blind_popup()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''local loc_target = localize{type = 'raw_descriptions', key = blind.key, set = 'Blind', vars = vars or blind.vars}'''
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
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 {}
|
||||||
|
target.vars = res.vars or target.vars
|
||||||
|
target.key = res.key or target.key
|
||||||
|
end
|
||||||
|
local loc_target = localize(target)'''
|
||||||
|
|
||||||
|
# get_new_boss()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = 'elseif not v.boss.showdown*'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
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'''
|
||||||
|
|
||||||
|
# G.UIDEF.challenge_description_tab
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = "local temp_blind = AnimatedSprite(0,0,1,1, G.ANIMATION_ATLAS['blind_chips'], v.pos)"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = "local temp_blind = AnimatedSprite(0,0,1,1, G.ANIMATION_ATLAS[v.atlas or ''] or G.ANIMATION_ATLAS['blind_chips'], v.pos)"
|
||||||
|
|
||||||
|
## elseif-ify some if chains
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "end\n(?<indent>[\t ]*)if self.name == ['\"](?<ability>.*?)['\"]"
|
||||||
|
position = 'at'
|
||||||
|
payload = "elseif self.name == '$ability'"
|
||||||
|
|
||||||
|
# revert the change for The Pillar
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)elseif self.name == 'The Pillar' and card.ability.played_this_ante then"
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''end
|
||||||
|
if self.name == 'The Pillar' and card.ability.played_this_ante then'''
|
||||||
|
|
||||||
|
# revert the change for The Eye in debuff_hand
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)elseif self.name == 'The Eye' then"
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''end
|
||||||
|
if self.name == 'The Eye' then'''
|
||||||
|
|
||||||
|
# revert the change for The Arm in debuff_hand
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)elseif self.name == 'The Arm' then"
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''end
|
||||||
|
if self.name == 'The Arm' then'''
|
||||||
|
|
||||||
|
# revert the change for Crimson Heart in debuff_card
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = '''(?<indent>[\t ]*)elseif self\.name == 'Crimson Heart' and not self\.disabled'''
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''end
|
||||||
|
if self.name == 'Crimson Heart' and not self.disabled'''
|
172
Steamodded/lovely/blind_ui.toml
Normal file
172
Steamodded/lovely/blind_ui.toml
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Allow blinds to have more than 2 lines
|
||||||
|
|
||||||
|
# create_UIBox_blind_choice()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "if blind_state == 'Select' then blind_state = 'Current' end"
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
local blind_desc_nodes = {}
|
||||||
|
for k, v in ipairs(text_table) do
|
||||||
|
blind_desc_nodes[#blind_desc_nodes+1] = {n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={
|
||||||
|
{n=G.UIT.T, config={text = v or '-', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}}
|
||||||
|
}}
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)text_table\[1\] and \{n=G\.UIT\.R, config=\{align = "cm", minh = 0\.7, padding = 0\.05, minw = 2\.9}, nodes=\{
|
||||||
|
[\t ]* text_table\[1\] and \{n=G\.UIT\.R, config=\{align = "cm", maxw = 2\.8\}, nodes=\{
|
||||||
|
[\t ]* \{n=G\.UIT\.T, config=\{id = blind_choice\.config\.key, ref_table = \{val = ''\}, ref_value = 'val', scale = 0\.32, colour = disabled and G\.C\.UI\.TEXT_INACTIVE or G\.C\.WHITE, shadow = not disabled, func = 'HUD_blind_debuff_prefix'\}\},
|
||||||
|
[\t ]* \{n=G\.UIT\.T, config=\{text = text_table\[1\] or '\-', scale = 0\.32, colour = disabled and G\.C\.UI\.TEXT_INACTIVE or G\.C\.WHITE, shadow = not disabled\}\}
|
||||||
|
[\t ]* \}\} or nil,
|
||||||
|
[\t ]* text_table\[2\] and \{n=G\.UIT\.R, config=\{align = "cm", maxw = 2\.8\}, nodes=\{
|
||||||
|
[\t ]* \{n=G\.UIT\.T, config=\{text = text_table\[2\] or '\-', scale = 0\.32, colour = disabled and G\.C\.UI\.TEXT_INACTIVE or G\.C\.WHITE, shadow = not disabled\}\}
|
||||||
|
[\t ]* \}\} or nil,
|
||||||
|
[\t ]*\}\} or nil,'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
text_table[1] and {n=G.UIT.R, config={align = "cm", minh = 0.7, padding = 0.05, minw = 2.9}, nodes = blind_desc_nodes} or nil,'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
# create_UIBox_HUD_blind()
|
||||||
|
# Padding and contained nodes are set in G.FUNCS.HUD_blind_debuff (overrides.lua)
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)\{n=G\.UIT\.R, config=\{align = "cm", padding = 0\.05\}, nodes=\{
|
||||||
|
[\t ]* \{n=G\.UIT\.R, config=\{align = "cm", minh = 0\.3, maxw = 4\.2\}, nodes=\{
|
||||||
|
[\t ]* \{n=G\.UIT\.T, config=\{ref_table = \{val = ''\}, ref_value = 'val', scale = scale\*0\.9, colour = G\.C\.UI\.TEXT_LIGHT, func = 'HUD_blind_debuff_prefix'\}\},
|
||||||
|
[\t ]* \{n=G\.UIT\.T, config=\{ref_table = G\.GAME\.blind\.loc_debuff_lines, ref_value = 1, scale = scale\*0\.9, colour = G\.C\.UI\.TEXT_LIGHT, id = 'HUD_blind_debuff_1', func = 'HUD_blind_debuff'\}\}
|
||||||
|
[\t ]* \}\},
|
||||||
|
[\t ]* \{n=G\.UIT\.R, config=\{align = "cm", minh = 0\.3, maxw = 4\.2\}, nodes=\{
|
||||||
|
[\t ]* \{n=G\.UIT\.T, config=\{ref_table = G\.GAME\.blind\.loc_debuff_lines, ref_value = 2, scale = scale\*0\.9, colour = G\.C\.UI\.TEXT_LIGHT, id = 'HUD_blind_debuff_2', func = 'HUD_blind_debuff'\}\}
|
||||||
|
[\t ]* \}\},
|
||||||
|
[\t ]*\}\},'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
{n=G.UIT.R, config={align = "cm", id = 'HUD_blind_debuff', func = 'HUD_blind_debuff'}, nodes={}},'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
# Blind:set_text
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "blind.lua"
|
||||||
|
pattern = """
|
||||||
|
(?<indent>[\t ]*)self\\.loc_debuff_lines\\[1\\] = ''
|
||||||
|
[\t ]*self\\.loc_debuff_lines\\[2\\] = ''"""
|
||||||
|
position = 'at'
|
||||||
|
payload = 'EMPTY(self.loc_debuff_lines)'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "blind.lua"
|
||||||
|
pattern = "for k, v in ipairs(loc_target) do"
|
||||||
|
position = 'before'
|
||||||
|
payload = 'EMPTY(self.loc_debuff_lines)'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "blind.lua"
|
||||||
|
pattern = "self.loc_debuff_text = self.loc_debuff_text..v..(k <= #loc_target and ' ' or '')"
|
||||||
|
position = 'after'
|
||||||
|
payload = "self.loc_debuff_lines[k] = v"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "blind.lua"
|
||||||
|
pattern = """
|
||||||
|
(?<indent>[\t ]*)self\\.loc_debuff_lines\\[1\\] = loc_target\\[1\\] or ''
|
||||||
|
[\t ]*self\\.loc_debuff_lines\\[2\\] = loc_target\\[2\\] or ''
|
||||||
|
"""
|
||||||
|
position = 'at'
|
||||||
|
payload = ''
|
||||||
|
|
||||||
|
## Add a box with h=3.64 (magic number equal to the height of HUD_blind)
|
||||||
|
## centered inside 'row_blind'
|
||||||
|
# create_UIBox_HUD
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = """{n=G.UIT.R, config={align = "cm", id = 'row_blind', minw = 1, minh = 3.75}, nodes={}},"""
|
||||||
|
position = 'at'
|
||||||
|
payload = """{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={}}
|
||||||
|
}},"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
## Blind UI's bottom edge is aligned to it
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "config = {major = G.HUD:get_UIE_by_ID('row_blind'), align = 'cm', offset = {x=0,y=-10}, bond = 'Weak'}"
|
||||||
|
position = 'at'
|
||||||
|
payload = "config = {major = G.HUD:get_UIE_by_ID('row_blind_bottom'), align = 'bmi', offset = {x=0,y=-10}, bond = 'Weak'}"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
## Patch G.GAME.blind:juice_up() across all files
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)G\.HUD_blind:get_UIE_by_ID\('HUD_blind_debuff_1'\):juice_up\(0\.3, 0\)
|
||||||
|
[\t ]*G\.HUD_blind:get_UIE_by_ID\('HUD_blind_debuff_2'\):juice_up\(0\.3, 0\)
|
||||||
|
[\t ]*G\.GAME\.blind:juice_up\(\)'''
|
||||||
|
position = 'at'
|
||||||
|
payload = 'SMODS.juice_up_blind()'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)G\.HUD_blind:get_UIE_by_ID\('HUD_blind_debuff_1'\):juice_up\(0\.3, 0\)
|
||||||
|
[\t ]*G\.HUD_blind:get_UIE_by_ID\('HUD_blind_debuff_2'\):juice_up\(0\.3, 0\)
|
||||||
|
[\t ]*G\.GAME\.blind:juice_up\(\)'''
|
||||||
|
position = 'at'
|
||||||
|
payload = 'SMODS.juice_up_blind()'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = '''hand_chips = mod_chips\(0\)(\n.*)*?\n[\t ]*(?<juice>SMODS.juice_up_blind\(\))'''
|
||||||
|
position = 'at'
|
||||||
|
root_capture = 'juice'
|
||||||
|
payload = 'if SMODS.hand_debuff_source then SMODS.hand_debuff_source:juice_up(0.3,0) else SMODS.juice_up_blind() end'
|
||||||
|
times = 1
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = 'G.GAME.blind.children.animatedSprite:juice_up(0.05, 0.02)'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''if SMODS.hand_debuff_source then
|
||||||
|
SMODS.hand_debuff_source:juice_up(0.05, 0.1)
|
||||||
|
else
|
||||||
|
G.GAME.blind.children.animatedSprite:juice_up(0.05, 0.02)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# remove statically added 1 from The Wheel's collection description
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''\(k ==1 and blind\.name == 'The Wheel' and '1' or ''\)\.\.'''
|
||||||
|
position = 'at'
|
||||||
|
payload = ''
|
325
Steamodded/lovely/booster.toml
Normal file
325
Steamodded/lovely/booster.toml
Normal file
|
@ -0,0 +1,325 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
## Booster Pack API
|
||||||
|
|
||||||
|
# Card:open
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
if self.ability.name:find('Arcana') then
|
||||||
|
G.STATE = G.STATES.TAROT_PACK
|
||||||
|
G.GAME.pack_size = self.ability.extra
|
||||||
|
elseif self.ability.name:find('Celestial') then
|
||||||
|
G.STATE = G.STATES.PLANET_PACK
|
||||||
|
G.GAME.pack_size = self.ability.extra
|
||||||
|
elseif self.ability.name:find('Spectral') then
|
||||||
|
G.STATE = G.STATES.SPECTRAL_PACK
|
||||||
|
G.GAME.pack_size = self.ability.extra
|
||||||
|
elseif self.ability.name:find('Standard') then
|
||||||
|
G.STATE = G.STATES.STANDARD_PACK
|
||||||
|
G.GAME.pack_size = self.ability.extra
|
||||||
|
elseif self.ability.name:find('Buffoon') then
|
||||||
|
G.STATE = G.STATES.BUFFOON_PACK
|
||||||
|
G.GAME.pack_size = self.ability.extra
|
||||||
|
end
|
||||||
|
|
||||||
|
G.GAME.pack_choices = self.config.center.config.choose or 1'''
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = """
|
||||||
|
booster_obj = self.config.center
|
||||||
|
if booster_obj and SMODS.Centers[booster_obj.key] then
|
||||||
|
G.STATE = G.STATES.SMODS_BOOSTER_OPENED
|
||||||
|
SMODS.OPENED_BOOSTER = self
|
||||||
|
end
|
||||||
|
G.GAME.pack_choices = self.ability.choose or self.config.center.config.choose or 1
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Card:open
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)if self\.ability\.name:find\('Arcana'\) then[\t\n ]*if G\.GAME\.used_vouchers\.v_omen_globe and pseudorandom\('omen_globe'\) > 0\.8 then''' # Possibly try to target something else
|
||||||
|
position = "at"
|
||||||
|
payload = '''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
|
||||||
|
card = _card_to_spawn
|
||||||
|
else
|
||||||
|
card = SMODS.create_card(_card_to_spawn)
|
||||||
|
end
|
||||||
|
elseif self.ability.name:find('Arcana') then
|
||||||
|
if G.GAME.used_vouchers.v_omen_globe and pseudorandom('omen_globe') > 0.8 then'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
# Game:set_globals
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "globals.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)self\.STATES = \{'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
SMODS_BOOSTER_OPENED = 999,'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
# Game:update
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)if self\.STATE == self\.STATES\.TAROT_PACK then'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if G.STATE == G.STATES.SMODS_BOOSTER_OPENED then
|
||||||
|
SMODS.OPENED_BOOSTER.config.center:update_pack(dt)
|
||||||
|
end
|
||||||
|
|
||||||
|
'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
# G.FUNC.can_skip_booster
|
||||||
|
# TODO customize whether pack can be skipped
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)\(G\.STATE == G\.STATES\.PLANET_PACK or G\.STATE == G\.STATES\.STANDARD_PACK'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''(G.STATE == G.STATES.SMODS_BOOSTER_OPENED or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.STANDARD_PACK'''
|
||||||
|
|
||||||
|
# CardArea:draw()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "(self.config.type == 'deck' and self ~= G.deck) or"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
(self.config.type == 'hand' and state == G.STATES.SMODS_BOOSTER_OPENED) or'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNCS.use_card
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "prev_state == G.STATES.SPECTRAL_PACK or prev_state == G.STATES.STANDARD_PACK or"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
prev_state == G.STATES.SMODS_BOOSTER_OPENED or'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# CardArea:align_cards()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "if self.config.type == 'hand' and (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK) then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if self.config.type == 'hand' and (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"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# CardArea:align_cards()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "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) then"
|
||||||
|
position = "at"
|
||||||
|
payload = "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"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Card:can_use_consumable()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if G.STATE == G.STATES.SELECTING_HAND or G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.PLANET_PACK then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if G.STATE == G.STATES.SELECTING_HAND or 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"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNCS.use_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "if G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.SPECTRAL_PACK then"
|
||||||
|
position = "at"
|
||||||
|
payload = """
|
||||||
|
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"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNC.use_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = 'if area == G.consumeables then'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
if nc and area == G.pack_cards and not select_to then G.pack_cards:remove_card(card); G.consumeables:emplace(card) end'''
|
||||||
|
|
||||||
|
# G.FUNC.use_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''if prev_state == G.STATES.TAROT_PACK then inc_career_stat('c_tarot_reading_used', 1) end'''
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''if prev_state == G.STATES.SMODS_BOOSTER_OPENED and booster_obj.name:find('Arcana') then inc_career_stat('c_tarot_reading_used', 1) end'''
|
||||||
|
|
||||||
|
# G.FUNC.use_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''if prev_state == G.STATES.PLANET_PACK then inc_career_stat('c_planetarium_used', 1) end'''
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''if prev_state == G.STATES.SMODS_BOOSTER_OPENED and booster_obj.name:find('Celestial') then inc_career_stat('c_planetarium_used', 1) end'''
|
||||||
|
|
||||||
|
# G.FUNC.use_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "(G.STATE == G.STATES.BUFFOON_PACK and G.STATES.BUFFOON_PACK) or"
|
||||||
|
position = "before"
|
||||||
|
payload = "(G.STATE == G.STATES.SMODS_BOOSTER_OPENED and G.STATES.SMODS_BOOSTER_OPENED) or"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNC.use_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if not (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK) and"
|
||||||
|
position = "at"
|
||||||
|
payload = "if not (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.SMODS_BOOSTER_OPENED) and"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Card:use_consumeable()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)align = \(G\.STATE[\s\S]*and -0\.2 or 0},'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
align = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.SMODS_BOOSTER_OPENED) and 'tm' or 'cm',
|
||||||
|
offset = {x = 0, y = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == G.STATES.SMODS_BOOSTER_OPENED) and -0.2 or 0},'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
# G.FUNCS.use_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "e.config.ref_table:redeem()"
|
||||||
|
position = "before"
|
||||||
|
payload = "if area == G.pack_cards then e.config.ref_table.cost = 0 end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
## Stopping ease_dollars anim from playing when voucher is free
|
||||||
|
# Card:redeem()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)ease_dollars\(-self\.cost\)\n[\s\S]{8}inc_career_stat\('c_shop_dollars_spent', self\.cost\)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.cost ~= 0 then
|
||||||
|
ease_dollars(-self.cost)
|
||||||
|
inc_career_stat('c_shop_dollars_spent', self.cost)
|
||||||
|
end'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
# Add support for saving consumables
|
||||||
|
# comment
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
pattern = '''
|
||||||
|
if card.ability.consumeable then
|
||||||
|
if (card.area == G.pack_cards and G.pack_cards) then
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
if card.ability.consumeable and card.area == G.pack_cards and booster_obj and booster_obj.select_card and card:selectable_from_pack(booster_obj) 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
|
||||||
|
'''
|
||||||
|
|
||||||
|
# comment
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
if card.ability.consumeable then
|
||||||
|
if nc then
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
if select_to then
|
||||||
|
card:add_to_deck()
|
||||||
|
G[select_to]:emplace(card)
|
||||||
|
if card.config.center.on_select and type(card.config.center.on_select) == 'function' then
|
||||||
|
card.config.center:on_select(card)
|
||||||
|
end
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
# comment
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
pattern = '''
|
||||||
|
for i = 1, #G.GAME.tags do
|
||||||
|
if G.GAME.tags[i]:apply_to_run({type = 'new_blind_choice'}) then break end
|
||||||
|
end
|
||||||
|
|
||||||
|
G.E_MANAGER:add_event(Event({trigger = 'after',delay = 0.2*delayfac,
|
||||||
|
func = function()
|
||||||
|
save_run()
|
||||||
|
return true
|
||||||
|
end}))
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
booster_obj = nil
|
||||||
|
'''
|
||||||
|
# comment
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
pattern = '''
|
||||||
|
G.FUNCS.end_consumeable(e)
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
booster_obj = nil
|
||||||
|
'''
|
||||||
|
|
||||||
|
# G.FUNCS.can_select_card
|
||||||
|
# Support negative-ish on Jokers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = "if e.config.ref_table.ability.set ~= 'Joker' or (e.config.ref_table.edition and e.config.ref_table.edition.negative) or #G.jokers.cards < G.jokers.config.card_limit then"
|
||||||
|
payload = '''local card = e.config.ref_table
|
||||||
|
local card_limit = card.edition and card.edition.card_limit or 0
|
||||||
|
if card.ability.set ~= 'Joker' or #G.jokers.cards < G.jokers.config.card_limit + card_limit then'''
|
25
Steamodded/lovely/calculate_card_added.toml
Normal file
25
Steamodded/lovely/calculate_card_added.toml
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
# Add card_added context
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if G.GAME.blind and G.GAME.blind.in_blind then G.E_MANAGER:add_event(Event({ func = function() G.GAME.blind:set_blind(nil, true, nil); return true end })) end'''
|
||||||
|
position = "after"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
if not from_debuff and G.hand then
|
||||||
|
local is_playing_card = self.ability.set == 'Default' or self.ability.set == 'Enhanced'
|
||||||
|
|
||||||
|
-- TARGET: calculate card_added
|
||||||
|
|
||||||
|
if not is_playing_card then
|
||||||
|
SMODS.calculate_context({card_added = true, card = self})
|
||||||
|
SMODS.enh_cache:clear()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
times = 1
|
63
Steamodded/lovely/can_calculate.toml
Normal file
63
Steamodded/lovely/can_calculate.toml
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''function Card:get_end_of_round_effect(context)
|
||||||
|
if self.debuff then return {} end'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
function Card:get_end_of_round_effect(context)'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''function Card:calculate_dollar_bonus()
|
||||||
|
if self.debuff then return end'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
function Card:calculate_dollar_bonus()
|
||||||
|
if not self:can_calculate() then return end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''function Card:calculate_seal(context)
|
||||||
|
if self.debuff then return nil end'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
function Card:calculate_seal(context)'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''function Card:calculate_joker(context)
|
||||||
|
if self.debuff then return nil end'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
function Card:calculate_joker(context)'''
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if self.ability.set == "Joker" and not self.debuff then'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''if self.ability.set == "Joker" then'''
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if self.debuff then return 0 end'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = ''
|
538
Steamodded/lovely/center.toml
Normal file
538
Steamodded/lovely/center.toml
Normal file
|
@ -0,0 +1,538 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Center API
|
||||||
|
|
||||||
|
# Card:set_ability()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "(?<indent>[\t ]*)if not G\\.OVERLAY_MENU then \n"
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.center
|
||||||
|
if obj.set_ability and type(obj.set_ability) == 'function' then
|
||||||
|
obj:set_ability(self, initial, delay_sprites)
|
||||||
|
end
|
||||||
|
|
||||||
|
'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "self.ability.bonus = (self.ability.bonus or 0) + (center.config.bonus or 0)"
|
||||||
|
position = "after"
|
||||||
|
payload = """
|
||||||
|
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
|
||||||
|
end"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Card:calculate_joker()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''function Card:calculate_joker(context)
|
||||||
|
if self.debuff then return nil end
|
||||||
|
'''
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Card:update()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = 'if G.STAGE == G.STAGES.RUN then'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.center
|
||||||
|
if obj.update and type(obj.update) == 'function' then
|
||||||
|
obj:update(self, dt)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Card:generate_UIBox_ability_table()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "(?<else>else)\n[\t ]*if self.ability.name == 'Loyalty Card' then\n[\t ]*self.ability.loyalty_remaining"
|
||||||
|
root_capture = 'else'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'elseif context.joker_main then'
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = 'return generate_card_ui(self.config.center, nil, loc_vars, card_type, badges, hide_desc, main_start, main_end)'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = 'return generate_card_ui(self.config.center, nil, loc_vars, card_type, badges, hide_desc, main_start, main_end, self)'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "full_UI_table.name = localize{type = 'name', set = _c.set, key = _c.key, nodes = full_UI_table.name}"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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}
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "elseif specific_vars and specific_vars.debuffed then"
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
if specific_vars and specific_vars.sticker then info_queue[#info_queue+1] = {key = string.lower(specific_vars.sticker)..'_sticker', set = 'Other'} end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "(?<indent>[\t ]+)if (?<rest>_c.name == 'Golden Ticket' then)"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
local res = {}
|
||||||
|
if _c.locked_loc_vars and type(_c.locked_loc_vars) == 'function' then
|
||||||
|
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 $rest'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
pattern = "localize{type = 'unlocks', key = 'joker_locked_legendary', set = 'Other', nodes = desc_nodes, vars = loc_vars}"
|
||||||
|
payload = "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}"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
pattern = "localize{type = 'unlocks', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars}"
|
||||||
|
payload = "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}"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
pattern = 'elseif desc_nodes ~= full_UI_table.main then'
|
||||||
|
payload = 'elseif desc_nodes ~= full_UI_table.main and not desc_nodes.name then'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# check_for_unlock()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if not card.unlocked and card.unlock_condition and args.type == 'career_stat' then"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
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
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if(?<a> )not card.unlocked and card.unlock_condition and args.type == 'career_stat' then"
|
||||||
|
position = 'at'
|
||||||
|
root_capture = 'a'
|
||||||
|
payload = ' not custom_check and '
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if(?<a> )not card.unlocked and card.unlock_condition and card.unlock_condition.type == args.type then"
|
||||||
|
position = 'at'
|
||||||
|
root_capture = 'a'
|
||||||
|
payload = ' not custom_check and '
|
||||||
|
|
||||||
|
#Card:use_consumable()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if self.ability.consumeable.mod_conv or self.ability.consumeable.suit_conv then"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.center
|
||||||
|
if obj.use and type(obj.use) == 'function' then
|
||||||
|
obj:use(self, area, copier)
|
||||||
|
return
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Card:can_use_consumable()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if self.ability.name == 'The Hermit' or self.ability.consumeable.hand_type"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.center
|
||||||
|
if obj.can_use and type(obj.can_use) == 'function' then
|
||||||
|
return obj:can_use(self)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# G.UIDEF.card_h_popup()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)(?<if>if AUT.badges.card_type or AUT.badges.force_rarity then)\n[\t ]*(?<rest>.*)\n[\t ]*end"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
local obj = card.config.center
|
||||||
|
$if
|
||||||
|
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
|
||||||
|
$rest
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if obj and obj.set_badges and type(obj.set_badges) == 'function' then
|
||||||
|
obj:set_badges(card, badges)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if AUT.badges then\n([\t ]*.*\n){4}[\t ]*end"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# set_discover_tallies()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if v.set == 'Planet' then(\n[\t ]*.*){15}"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = "[\t ]*tarots = \\{tally = 0, of = 0\\},\n(.*\n){2}"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'at'
|
||||||
|
payload = ''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)for _, v in pairs\\(G.DISCOVER_TALLIES\\) do"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
for _, v in ipairs(SMODS.ConsumableType.ctype_buffer) do
|
||||||
|
G.DISCOVER_TALLIES[v:lower()..'s'] = {tally = 0, of = 0}
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# create_UIBox_your_collection()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)local t = create_UIBox_generic_options\\(\\{ back_func = G.STAGE"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
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 })
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)nodes=\\{\n[\t ]*UIBox_button\\(\\{button = 'your_collection_tarots'(.*\n){3}[\t ]*}"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'nodes = consumable_nodes'
|
||||||
|
|
||||||
|
# Card:apply_to_run()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if center_table.name == 'Overstock'"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
local obj = center or self.config.center
|
||||||
|
if obj.redeem and type(obj.redeem) == 'function' then
|
||||||
|
obj:redeem(card_to_save)
|
||||||
|
return
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# create_card_for_shop()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = "local total_rate = G.GAME.joker_rate + G.GAME.tarot_rate + G.GAME.planet_rate + G.GAME.playing_card_rate + G.GAME.spectral_rate"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
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']
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '(?<indent>[\t ]*)for _, v in ipairs\((?<li>\{\n(.*\n){5}[\t ]*\})\) do'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
-- need to preserve order to leave RNG unchanged
|
||||||
|
local rates = $li
|
||||||
|
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
|
||||||
|
end
|
||||||
|
for _, v in ipairs(rates) do'''
|
||||||
|
|
||||||
|
# create_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "if not forced_key and soulable and (not G.GAME.banned_keys['c_soul']) then"
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
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'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "{bypass_discovery_center = area==G.shop_jokers or area == G.pack_cards or area == G.shop_vouchers or (G.shop_demo and area==G.shop_demo) or area==G.jokers or area==G.consumeables,"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
{bypass_discovery_center = SMODS.bypass_create_card_discovery_center or area==G.shop_jokers or area == G.pack_cards or area == G.shop_vouchers or (G.shop_demo and area==G.shop_demo) or area==G.jokers or area==G.consumeables,'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "bypass_discovery_ui = area==G.shop_jokers or area == G.pack_cards or area==G.shop_vouchers or (G.shop_demo and area==G.shop_demo),"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
bypass_discovery_ui = SMODS.bypass_create_card_discovery_center or area==G.shop_jokers or area == G.pack_cards or area==G.shop_vouchers or (G.shop_demo and area==G.shop_demo),'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "discover = area==G.jokers or area==G.consumeables, "
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
discover = SMODS.bypass_create_card_discover or area==G.jokers or area==G.consumeables, '''
|
||||||
|
|
||||||
|
# Card:add_to_deck()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '(?<indent>[\t ]*)if self.ability.h_size ~= 0 then\n[\t ]*G\.hand:change_size\(self.ability.h_size\)'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
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)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Card:remove_from_deck()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '(?<indent>[\t ]*)if self.ability.h_size ~= 0 then\n[\t ]*G\.hand:change_size\(-self.ability.h_size\)'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
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)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# G.FUNCS.use_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = "if card.area then card.area:remove_card(card) end"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
local nc
|
||||||
|
local select_to = card.area == G.pack_cards and booster_obj and booster_obj.select_card and card:selectable_from_pack(booster_obj)
|
||||||
|
if card.ability.consumeable and not select_to 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
|
||||||
|
end
|
||||||
|
if not card.from_area then card.from_area = card.area end
|
||||||
|
if card.area and (not nc or card.area == G.pack_cards) then card.area:remove_card(card) end'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
pattern = '''
|
||||||
|
if area and area.cards[1] then
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
if nc and not area then G.consumeables:emplace(card) end
|
||||||
|
'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = "else draw_card(G.hand, G.play, 1, 'up', true, card, nil, mute) end"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''elseif not nc then draw_card(G.hand, G.play, 1, 'up', true, card, nil, mute) end'''
|
||||||
|
|
||||||
|
|
||||||
|
# Card:load()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = 'if self.config.center.name == "Half Joker" then'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
local obj = self.config.center
|
||||||
|
if obj.load and type(obj.load) == 'function' then
|
||||||
|
obj:load(self, cardTable, other_card)
|
||||||
|
elseif self.config.center.name == "Half Joker" then'''
|
||||||
|
|
||||||
|
# Card:calculate_dollar_bonus()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = """function Card:calculate_dollar_bonus()
|
||||||
|
if self.debuff then return end"""
|
||||||
|
position = "after"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
|
||||||
|
# no_blueprint check
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = 'if other_joker and other_joker ~= self then'
|
||||||
|
payload = 'if other_joker and other_joker ~= self and not context.no_blueprint then'
|
||||||
|
|
||||||
|
# extract joker loc_vars
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = 'function Card:generate_UIBox_ability_table()'
|
||||||
|
payload = 'function Card:generate_UIBox_ability_table(vars_only)'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
pattern = 'local badges = {}'
|
||||||
|
payload = 'if vars_only then return loc_vars, main_start, main_end end'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
pattern = "elseif _c.set == 'Joker' then"
|
||||||
|
payload = '''
|
||||||
|
if not card then
|
||||||
|
local ability = copy_table(_c.config)
|
||||||
|
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
|
||||||
|
'''
|
21
Steamodded/lovely/challenge.toml
Normal file
21
Steamodded/lovely/challenge.toml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
# function G.UIDEF.challenge_list_page()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "local challenge_unlocked = G.PROFILES[G.SETTINGS.profile].challenges_unlocked and (G.PROFILES[G.SETTINGS.profile].challenges_unlocked >= k)"
|
||||||
|
position = 'after'
|
||||||
|
payload = """
|
||||||
|
if v.unlocked and type(v.unlocked) == 'function' then
|
||||||
|
challenge_unlocked = v:unlocked()
|
||||||
|
elseif type(v.unlocked) == 'boolean' then
|
||||||
|
challenge_unlocked = v.unlocked
|
||||||
|
end
|
||||||
|
challenge_unlocked = challenge_unlocked or G.PROFILES[G.SETTINGS.profile].all_unlocked
|
||||||
|
|
||||||
|
"""
|
||||||
|
match_indent = true
|
65
Steamodded/lovely/compact_cashout.toml
Normal file
65
Steamodded/lovely/compact_cashout.toml
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# End of round money
|
||||||
|
#
|
||||||
|
|
||||||
|
# Hide off screen rows
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if config.name ~= 'bottom' then"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
total_cashout_rows = (total_cashout_rows or 0) + 1
|
||||||
|
if total_cashout_rows > 7 then
|
||||||
|
return
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Reset rows amount
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = 'G\.FUNCS\.evaluate_round = function\(\)'
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
total_cashout_rows = 0'''
|
||||||
|
|
||||||
|
# Add UI row with total rows hidden
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "add_round_eval_row({name = 'bottom', dollars = dollars})"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if total_cashout_rows > 7 then
|
||||||
|
local total_hidden = total_cashout_rows - 7
|
||||||
|
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
trigger = 'before',delay = 0.38,
|
||||||
|
func = function()
|
||||||
|
local hidden = {n=G.UIT.R, config={align = "cm"}, nodes={
|
||||||
|
{n=G.UIT.O, config={object = DynaText({
|
||||||
|
string = {localize{type = 'variable', key = 'cashout_hidden', vars = {total_hidden}}},
|
||||||
|
colours = {G.C.WHITE}, shadow = true, float = false,
|
||||||
|
scale = 0.45,
|
||||||
|
font = G.LANGUAGES['en-us'].font, pop_in = 0
|
||||||
|
})}}
|
||||||
|
}}
|
||||||
|
|
||||||
|
G.round_eval:add_child(hidden, G.round_eval:get_UIE_by_ID('bonus_round_eval'))
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
}))
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
38
Steamodded/lovely/compat_0_9_8.toml
Normal file
38
Steamodded/lovely/compat_0_9_8.toml
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
# fallback for card.ability.name
|
||||||
|
# Card:set_ability()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "self.ability.bonus = (self.ability.bonus or 0) + (center.config.bonus or 0)"
|
||||||
|
position = 'after'
|
||||||
|
payload = "if not self.ability.name then self.ability.name = center.key end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# generate_card_ui()
|
||||||
|
# `card_type` is used to check whether card should be nil; non-recursive calls
|
||||||
|
# to generate_card_ui always have that arg set
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '(?<indent>[\t ]*)function generate_card_ui\([^)]*\)\n'
|
||||||
|
position = "after"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = """
|
||||||
|
if card == nil and card_type then
|
||||||
|
card = SMODS.compat_0_9_8.generate_UIBox_ability_table_card
|
||||||
|
end
|
||||||
|
|
||||||
|
"""
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "for _, v in ipairs(info_queue) do"
|
||||||
|
position = 'before'
|
||||||
|
payload = "SMODS.compat_0_9_8.generate_UIBox_ability_table_card = nil"
|
||||||
|
match_indent = true
|
||||||
|
|
24
Steamodded/lovely/core.toml
Normal file
24
Steamodded/lovely/core.toml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "self.SPEEDFACTOR = 1"
|
||||||
|
position = "after"
|
||||||
|
payload = "initSteamodded()"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.copy]
|
||||||
|
target = "main.lua"
|
||||||
|
position = "append"
|
||||||
|
sources = ["src/core.lua"]
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.module]
|
||||||
|
before = "main.lua"
|
||||||
|
source = "version.lua"
|
||||||
|
name = "SMODS.version"
|
20
Steamodded/lovely/crash_handler.toml
Normal file
20
Steamodded/lovely/crash_handler.toml
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "main.lua"
|
||||||
|
pattern = "function love.errhand(msg)"
|
||||||
|
position = "at"
|
||||||
|
payload = "if false then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.copy]
|
||||||
|
target = "main.lua"
|
||||||
|
position = "prepend"
|
||||||
|
sources = [
|
||||||
|
"src/crash_handler.lua",
|
||||||
|
]
|
218
Steamodded/lovely/deck_skins.toml
Normal file
218
Steamodded/lovely/deck_skins.toml
Normal file
|
@ -0,0 +1,218 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
#========================================================#
|
||||||
|
# Choose any rank for custom deck and use provided atlas #
|
||||||
|
#========================================================#
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = '''if _front and _front.suit and \(_front.value == 'Jack' or _front.value == 'Queen' or _front.value == 'King'\) then([\s\S]*?)end([\s\S]*?)end([\s\S]*?)end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
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 then
|
||||||
|
local deckSkin = SMODS.DeckSkins[collab]
|
||||||
|
if deckSkin then
|
||||||
|
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
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "{n=G.UIT.O, config={object = face_cards}}"
|
||||||
|
position = "at"
|
||||||
|
payload = "{n=G.UIT.O, config={object = G.cdds_cards}}"
|
||||||
|
match_indent = true
|
||||||
|
overwrite = false
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "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}))"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
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'}}),
|
||||||
|
}}
|
||||||
|
)
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
overwrite = false
|
||||||
|
|
||||||
|
#=======================#
|
||||||
|
# Extend custom deck ui #
|
||||||
|
#=======================#
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''local face_cards = CardArea\(([\s\S]*?)\)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local rankCount = 0
|
||||||
|
local lookup = {}
|
||||||
|
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
|
||||||
|
|
||||||
|
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,
|
||||||
|
{card_limit = rankCount, type = 'title', highlight_limit = 0})
|
||||||
|
|
||||||
|
G.cdds_cards.rankCount = rankCount
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''for i = 1, 3 do([\s\S]*?)end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
G.FUNCS.update_collab_cards(current_option, _suit, true)
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''function create_UIBox_customize_deck()([\s\S]*?)end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
function create_UIBox_customize_deck()
|
||||||
|
local suitTabs = {}
|
||||||
|
|
||||||
|
local index = 1
|
||||||
|
for i, suit in ipairs(SMODS.Suit:obj_list(true)) do
|
||||||
|
if G.COLLABS.options[suit.key] then
|
||||||
|
suitTabs[index] = {
|
||||||
|
label = localize(suit.key, 'suits_plural'),
|
||||||
|
tab_definition_function = G.UIDEF.custom_deck_tab,
|
||||||
|
tab_definition_function_args = suit.key
|
||||||
|
}
|
||||||
|
index = index + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if suitTabs[1] then
|
||||||
|
suitTabs[1].chosen = true
|
||||||
|
end
|
||||||
|
|
||||||
|
local t = create_UIBox_generic_options({ back_func = 'options', snap_back = nil, contents = {
|
||||||
|
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
|
||||||
|
create_tabs(
|
||||||
|
{tabs = suitTabs, snap_to_nav = true, no_shoulders = true}
|
||||||
|
)}}}
|
||||||
|
})
|
||||||
|
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
77
Steamodded/lovely/dollar_row.toml
Normal file
77
Steamodded/lovely/dollar_row.toml
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Dollar row patches (API removed)
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if num_dollars > 60 then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if num_dollars > 60 or num_dollars < -60 then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "local dollar_string = localize('$')..num_dollars"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if num_dollars < 0 then --if negative
|
||||||
|
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('$')..format_ui_value(num_dollars)}, colours = {G.C.RED}, 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)
|
||||||
|
play_sound('coin6', 1.3, 0.8)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
}))
|
||||||
|
else --if positive
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "for i = 1, num_dollars or 1 do"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local dollars_to_loop
|
||||||
|
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'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)else\n[\t ]*local dollars_to_loop'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = "$indent"
|
||||||
|
payload = '''
|
||||||
|
--asdf
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "local r = {n=G.UIT.T, config={text = localize('$'), colour = G.C.MONEY, scale = ((num_dollars > 20 and 0.28) or (num_dollars > 9 and 0.43) or 0.58), shadow = true, hover = true, can_collide = false, juice = true}}"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local r
|
||||||
|
if i == 1 and num_dollars < 0 then
|
||||||
|
r = {n=G.UIT.T, config={text = '-', colour = G.C.RED, scale = ((num_dollars < -20 and 0.28) or (num_dollars < -9 and 0.43) or 0.58), shadow = true, hover = true, can_collide = false, juice = true}}
|
||||||
|
play_sound('coin3', 0.9+0.2*math.random(), 0.7 - (num_dollars < -20 and 0.2 or 0))
|
||||||
|
else
|
||||||
|
if num_dollars < 0 then r = {n=G.UIT.T, config={text = localize('$'), colour = G.C.RED, scale = ((num_dollars > 20 and 0.28) or (num_dollars > 9 and 0.43) or 0.58), shadow = true, hover = true, can_collide = false, juice = true}}
|
||||||
|
else r = {n=G.UIT.T, config={text = localize('$'), colour = G.C.MONEY, scale = ((num_dollars > 20 and 0.28) or (num_dollars > 9 and 0.43) or 0.58), shadow = true, hover = true, can_collide = false, juice = true}} end
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
281
Steamodded/lovely/edition.toml
Normal file
281
Steamodded/lovely/edition.toml
Normal file
|
@ -0,0 +1,281 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
# Fix debug mode edition cycling
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "engine/controller.lua"
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)local _edition = \{
|
||||||
|
[\t ]*foil = not _card\.edition,
|
||||||
|
[\t ]*holo = _card\.edition and _card\.edition\.foil,
|
||||||
|
[\t ]*polychrome = _card\.edition and _card\.edition\.holo,
|
||||||
|
[\t ]*negative = _card\.edition and _card\.edition\.polychrome,
|
||||||
|
[\t ]*\}'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local found_index = 1
|
||||||
|
if _card.edition then
|
||||||
|
for i, v in ipairs(G.P_CENTER_POOLS.Edition) do
|
||||||
|
if v.key == _card.edition.key then
|
||||||
|
found_index = i
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
found_index = found_index + 1
|
||||||
|
if found_index > #G.P_CENTER_POOLS.Edition then found_index = found_index - #G.P_CENTER_POOLS.Edition end
|
||||||
|
local _edition = G.P_CENTER_POOLS.Edition[found_index].key'''
|
||||||
|
line_prepend = "$indent"
|
||||||
|
|
||||||
|
|
||||||
|
# Sort P_CENTER_POOLS["Editions"]
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = 'table.sort(self.P_CENTER_POOLS["Enhanced"], function (a, b) return a.order < b.order end)'
|
||||||
|
position = 'after'
|
||||||
|
payload = 'table.sort(self.P_CENTER_POOLS["Edition"], function (a, b) return a.order < b.order end)'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
# generate_card_ui()
|
||||||
|
# Adds tooltips for all editions
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)if v == 'foil' then info_queue\[#info_queue\+1\] = G\.P_CENTERS\['e_foil'\] end
|
||||||
|
[\t ]*if v == 'holographic' then info_queue\[#info_queue\+1\] = G\.P_CENTERS\['e_holo'\] end
|
||||||
|
[\t ]*if v == 'polychrome' then info_queue\[#info_queue\+1\] = G\.P_CENTERS\['e_polychrome'\] end
|
||||||
|
[\t ]*if v == 'negative' then info_queue\[#info_queue\+1\] = G\.P_CENTERS\['e_negative'\] end
|
||||||
|
[\t ]*if v == 'negative_consumable' then info_queue\[#info_queue\+1\] = \{key = 'e_negative_consumable', set = 'Edition', config = \{extra = 1\}\} end'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
v = (v == 'holographic' and 'holo' or v)
|
||||||
|
if v:sub(1,9) == 'negative_' then
|
||||||
|
info_queue[#info_queue+1] = {key = 'e_'..v, set = 'Edition', config = {extra = G.P_CENTERS['e_negative'].config.card_limit}}
|
||||||
|
end
|
||||||
|
if G.P_CENTERS[v] and G.P_CENTERS[v].set == 'Edition' then
|
||||||
|
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
|
||||||
|
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'''
|
||||||
|
line_prepend = "$indent"
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = '''localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = loc_vars}'''
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''localize{type = 'descriptions', key = _c.key, set = _c.set, nodes = desc_nodes, vars = _c.vars or loc_vars}'''
|
||||||
|
|
||||||
|
|
||||||
|
# get_badge_colour()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = 'return G.BADGE_COL[key] or {1, 0, 0, 1}'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
for _, v in ipairs(G.P_CENTER_POOLS.Edition) do
|
||||||
|
G.BADGE_COL[v.key:sub(3)] = v.badge_colour
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Remove prefix from shader key when calling send()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/sprite.lua"
|
||||||
|
pattern = "if _send then G.SHADERS[_shader or 'dissolve']:send(_shader,_send) end"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if _send then
|
||||||
|
G.SHADERS[_shader or 'dissolve']:send((SMODS.Shaders[_shader or 'dissolve'] and SMODS.Shaders[_shader or 'dissolve'].original_key) or _shader,_send)
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Inject change to edition cost in shop
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '(?<indent>[\t ]*)self.ex([a-z._\s=+(0-9)]*)\n([\t ]*)([a-z._\s=+(0-9)]*)or 0\)'
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
for k, v in pairs(G.P_CENTER_POOLS.Edition) do
|
||||||
|
if self.edition[v.key:sub(3)] then
|
||||||
|
if v.extra_cost then
|
||||||
|
self.extra_cost = self.extra_cost + v.extra_cost
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
line_prepend = "$indent"
|
||||||
|
|
||||||
|
## Fix card_limit logic
|
||||||
|
# Card:add_to_deck()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)if self\.edition[A-z\.\:\n\t _(',)~=+\-0-9]*limit \+ 1'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if true then
|
||||||
|
if from_debuff then
|
||||||
|
self.ability.joker_added_to_deck_but_debuffed = nil
|
||||||
|
else
|
||||||
|
if self.edition and self.edition.card_limit then
|
||||||
|
if self.ability.consumeable then
|
||||||
|
G.consumeables.config.card_limit = G.consumeables.config.card_limit + self.edition.card_limit
|
||||||
|
else
|
||||||
|
G.jokers.config.card_limit = G.jokers.config.card_limit + self.edition.card_limit
|
||||||
|
end'''
|
||||||
|
line_prepend = "$indent"
|
||||||
|
# Card:remove_from_deck()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)if self\.edition[A-z\.\:\n\t _(',)~=+\-0-9]*limit \- 1'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if G.jokers then
|
||||||
|
if from_debuff then
|
||||||
|
self.ability.joker_added_to_deck_but_debuffed = true
|
||||||
|
else
|
||||||
|
if self.edition and self.edition.card_limit then
|
||||||
|
if self.ability.consumeable then
|
||||||
|
G.consumeables.config.card_limit = G.consumeables.config.card_limit - self.edition.card_limit
|
||||||
|
elseif self.ability.set == 'Joker' then
|
||||||
|
G.jokers.config.card_limit = G.jokers.config.card_limit - self.edition.card_limit
|
||||||
|
end'''
|
||||||
|
line_prepend = "$indent"
|
||||||
|
# Card:remove()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)if self\.ability\.queue_neg[A-z\.\:\n\t _(',)~=+\-0-9]*limit \- 1'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.joker_added_to_deck_but_debuffed then
|
||||||
|
if self.edition and self.edition.card_limit then
|
||||||
|
if self.ability.consumeable then
|
||||||
|
G.consumeables.config.card_limit = G.consumeables.config.card_limit - self.edition.card_limit
|
||||||
|
elseif self.ability.set == 'Joker' then
|
||||||
|
G.jokers.config.card_limit = G.jokers.config.card_limit - self.edition.card_limit
|
||||||
|
end'''
|
||||||
|
line_prepend = "$indent"
|
||||||
|
# Card:save()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "added_to_deck = self.added_to_deck,"
|
||||||
|
position = "after"
|
||||||
|
payload = "joker_added_to_deck_but_debuffed = self.joker_added_to_deck_but_debuffed,"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
## Negative playing card logic
|
||||||
|
# CardArea:emplace()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "function CardArea:emplace(*"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if not card.debuff and card.edition and card.edition.card_limit and (self == G.hand) then
|
||||||
|
self.config.real_card_limit = (self.config.real_card_limit or self.config.card_limit) + card.edition.card_limit
|
||||||
|
self.config.card_limit = math.max(0, self.config.real_card_limit)
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
# CardArea:remove_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "card:remove_from_area()"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if not card.debuff and card.edition and card.edition.card_limit and (self == G.hand) then
|
||||||
|
self.config.real_card_limit = (self.config.real_card_limit or self.config.card_limit) - card.edition.card_limit
|
||||||
|
self.config.card_limit = math.max(0, self.config.real_card_limit)
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNCS.draw_from_deck_to_hand()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "local hand_space = e or*"
|
||||||
|
position = "at"
|
||||||
|
payload = """local hand_space = e
|
||||||
|
if not hand_space then
|
||||||
|
local limit = G.hand.config.card_limit - #G.hand.cards
|
||||||
|
local n = 0
|
||||||
|
while n < #G.deck.cards do
|
||||||
|
local card = G.deck.cards[#G.deck.cards-n]
|
||||||
|
limit = limit - 1 + (not card.debuff and card.edition and card.edition.card_limit or 0)
|
||||||
|
if limit < 0 then break end
|
||||||
|
n = n + 1
|
||||||
|
end
|
||||||
|
hand_space = n
|
||||||
|
end"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "badges[#badges + 1] = 'negative_consumable'"
|
||||||
|
position = "after"
|
||||||
|
payload = """
|
||||||
|
elseif self.edition.type == 'negative' and (self.ability.set == 'Enhanced' or self.ability.set == 'Default') then
|
||||||
|
badges[#badges + 1] = 'negative_playing_card'"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/sprite.lua"
|
||||||
|
pattern = "love.graphics.setShader( G.SHADERS[_shader or 'dissolve'], G.SHADERS[_shader or 'dissolve'])"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
local p_shader = SMODS.Shader.obj_table[_shader or 'dissolve']
|
||||||
|
if p_shader and type(p_shader.send_vars) == "function" then
|
||||||
|
local sh = G.SHADERS[_shader or 'dissolve']
|
||||||
|
local parent_card = self.role.major and self.role.major:is(Card) and self.role.major
|
||||||
|
local send_vars = p_shader.send_vars(self, parent_card)
|
||||||
|
|
||||||
|
if type(send_vars) == "table" then
|
||||||
|
for key, value in pairs(send_vars) do
|
||||||
|
sh:send(key, value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "if v == 'negative_consumable' then v = 'negative' end"
|
||||||
|
position = "at"
|
||||||
|
payload = '''if v == 'negative_consumable' or v == 'negative_playing_card' then v = 'negative' end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
#
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = '''(?<indent>[\t ]*)(?<edi>local edition = poll_edition\('edi'\.\.\(key_append or ''\)\.\.G\.GAME\.round_resets\.ante\)(\n.*){2})'''
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
if not SMODS.bypass_create_card_edition then
|
||||||
|
$edi
|
||||||
|
end'''
|
327
Steamodded/lovely/enhancement.toml
Normal file
327
Steamodded/lovely/enhancement.toml
Normal file
|
@ -0,0 +1,327 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
## no_rank, no_suit, all_suits
|
||||||
|
|
||||||
|
# Card:get_id()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.effect == 'Stone Card' and not self.vampired then"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = '''if SMODS.has_no_rank(self) and not self.vampired then'''
|
||||||
|
|
||||||
|
# Card:get_chip_bonus()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)if self\.ability\.effect == 'Stone Card' then
|
||||||
|
[\t ]* return self\.ability\.bonus \+ \(self\.ability\.perma_bonus or 0\)
|
||||||
|
[\t ]*end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.ability.effect == 'Stone Card' or self.config.center.replace_base_card then
|
||||||
|
return self.ability.bonus + (self.ability.perma_bonus or 0)
|
||||||
|
end'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
# Card:calculate_joker()
|
||||||
|
# Raised Fist
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if temp_ID >= G.hand.cards[i].base.id and G.hand.cards[i].ability.effect ~= 'Stone Card' then temp_Mult = G.hand.cards[i].base.nominal; temp_ID = G.hand.cards[i].base.id; raised_card = G.hand.cards[i] end"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = """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]
|
||||||
|
end"""
|
||||||
|
# Flower Pot, Seeing Double
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if context.scoring_hand[i].ability.name ~= 'Wild Card' then"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = '''if not SMODS.has_any_suit(context.scoring_hand[i]) then'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if context.scoring_hand[i].ability.name == 'Wild Card' then"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = '''if SMODS.has_any_suit(context.scoring_hand[i]) then'''
|
||||||
|
|
||||||
|
# Card:get_suit()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)if self\.ability\.effect == 'Stone Card' then'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = "at"
|
||||||
|
payload = '''if SMODS.has_no_suit(self) then'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'if self.ability.name == "Wild Card" then'
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = '''if SMODS.has_any_suit(self) then'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'if self.ability.name == "Wild Card" and not self.debuff then'
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = '''if SMODS.has_any_suit(self) and self:can_calculate() then'''
|
||||||
|
|
||||||
|
# check_for_unlock
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if v.ability.name ~= 'Stone Card' and v.base.suit == 'Hearts' then"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = "if not SMODS.has_no_suit(v) and v.base.suit == 'Hearts' then"
|
||||||
|
|
||||||
|
# reset_idol_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "valid_idol_cards[#valid_idol_cards+1] = v"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = """if not SMODS.has_no_suit(v) and not SMODS.has_no_rank(v) then
|
||||||
|
valid_idol_cards[#valid_idol_cards+1] = v
|
||||||
|
end"""
|
||||||
|
|
||||||
|
# reset_mail_rank()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "valid_mail_cards[#valid_mail_cards+1] = v"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = """if not SMODS.has_no_rank(v) then
|
||||||
|
valid_mail_cards[#valid_mail_cards+1] = v
|
||||||
|
end"""
|
||||||
|
|
||||||
|
# reset_castle_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "valid_castle_cards[#valid_castle_cards+1] = v"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = """if not SMODS.has_no_suit(v) then
|
||||||
|
valid_castle_cards[#valid_castle_cards+1] = v
|
||||||
|
end"""
|
||||||
|
|
||||||
|
# G.FUNCS.evaluate_play()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if scoring_hand[i].ability.effect ~= 'Stone Card' then"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = '''if not SMODS.has_no_rank(scoring_hand[i]) then'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = """if not SMODS.has_no_suit(scoring_hand[i]) then
|
||||||
|
G.GAME.cards_played[scoring_hand[i].base.value].suits[scoring_hand[i].base.suit] = true
|
||||||
|
end"""
|
||||||
|
|
||||||
|
# Add the delayed property to sprites that are delayed
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
if delay_sprites then
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
func = function()
|
||||||
|
if not self.REMOVED then
|
||||||
|
self:set_sprites(center)
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
}))
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
if delay_sprites == 'quantum' then
|
||||||
|
elseif delay_sprites then
|
||||||
|
self.ability.delayed = true
|
||||||
|
G.E_MANAGER:add_event(Event({
|
||||||
|
func = function()
|
||||||
|
if not self.REMOVED then
|
||||||
|
self:set_sprites(center)
|
||||||
|
self.ability.delayed = false
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
}))
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Card:generate_UIBox_ability_table()
|
||||||
|
# replaces two consecutive lines
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if (_c.name == 'Stone Card') then full_UI_table.name = true end"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = "if _c.name == 'Stone Card' or _c.replace_base_card then full_UI_table.name = true"
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if (specific_vars.playing_card and (_c.name ~= 'Stone Card')) then"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = "elseif specific_vars.playing_card then"
|
||||||
|
|
||||||
|
|
||||||
|
## Allow cards to function as multiple enhancements (e.g. from jokers)
|
||||||
|
# Calculate extra enhancements when held in hand at end of round
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "local effects = {G.hand.cards[i]:get_end_of_round_effect()}"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local effects = {[1] = {playing_card = G.hand.cards[i]:get_end_of_round_effect()}}
|
||||||
|
local extra_enhancements = SMODS.get_enhancements(G.hand.cards[i], true)
|
||||||
|
local old_ability = copy_table(G.hand.cards[i].ability)
|
||||||
|
local old_center = G.hand.cards[i].config.center
|
||||||
|
local old_center_key = G.hand.cards[i].config.center_key
|
||||||
|
for k, _ in pairs(extra_enhancements) do
|
||||||
|
if G.P_CENTERS[k] then
|
||||||
|
G.hand.cards[i]:set_ability(G.P_CENTERS[k])
|
||||||
|
G.hand.cards[i].ability.extra_enhancement = k
|
||||||
|
effects[#effects+1] = {[1] = {playing_card = G.hand.cards[i]:get_end_of_round_effect()}}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
G.hand.cards[i].ability = old_ability
|
||||||
|
G.hand.cards[i].config.center = old_center
|
||||||
|
G.hand.cards[i].config.center_key = old_center_key
|
||||||
|
G.hand.cards[i]:set_sprites(old_center)
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Prevent blue seal effect on extra enhancements at end of round
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card"
|
||||||
|
pattern = "if self.seal == 'Blue' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if self.extra_enhancement then return ret end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Use the has enhancement function for enhancement gates
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if vv.config.center.key == v.enhancement_gate then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if SMODS.has_enhancement(vv, v.enhancement_gate) then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Glass Card shattering
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if card.ability.name == 'Glass Card' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if SMODS.shatters(card) then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if G.hand.highlighted[i].ability.name == 'Glass Card' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if SMODS.shatters(G.hand.highlighted[i]) then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if scoring_hand[i].ability.name == 'Glass Card' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if SMODS.shatters(scoring_hand[i]) then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "if cards_destroyed[i].ability.name == 'Glass Card' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if cards_destroyed[i].shattered then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Prevent blue seals from applying on quantum enhancement calc
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.seal == 'Blue' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if self.seal == 'Blue' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit and not self.ability.extra_enhancement then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Reset enh cache on game update
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "modulate_sound(dt)"
|
||||||
|
position = "after"
|
||||||
|
payload = "SMODS.enh_cache:clear()"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Invalidate enhancement cache when card changes
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "function Card:set_ability(center, initial, delay_sprites)"
|
||||||
|
position = "after"
|
||||||
|
payload = "SMODS.enh_cache:write(self, nil)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "function Card:set_base(card, initial)"
|
||||||
|
position = "after"
|
||||||
|
payload = "SMODS.enh_cache:write(self, nil)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "function Card:set_seal(_seal, silent, immediate)"
|
||||||
|
position = "after"
|
||||||
|
payload = "SMODS.enh_cache:write(self, nil)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# safeguards an infloop with debuff context
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = 'if not initial then G.GAME.blind:debuff_card(self) end'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'if not initial and delay_sprites ~= "quantum" and G.GAME.blind then G.GAME.blind:debuff_card(self) end'
|
||||||
|
match_indent = true
|
696
Steamodded/lovely/fixes.toml
Normal file
696
Steamodded/lovely/fixes.toml
Normal file
|
@ -0,0 +1,696 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Fixes for either base game code or general mod compatibility
|
||||||
|
|
||||||
|
## Mods assume Game:start_run() is called with non-nil argument
|
||||||
|
# G.FUNCS.start_run()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = "G.FUNCS.start_run = function(e, args)"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = "args = args or {}"
|
||||||
|
|
||||||
|
## Allows running the game without Steam being active
|
||||||
|
# love.load()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'main.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if not \\(st.init and st:init\\(\\)\\) then\n[\t ]*(?<quit>love.event.quit\\(\\))"
|
||||||
|
position = 'at'
|
||||||
|
root_capture = 'quit'
|
||||||
|
payload = 'st = nil'
|
||||||
|
|
||||||
|
|
||||||
|
## Prevents the game from crashing when hitting play with a corrupt/invalid save file
|
||||||
|
# G.FUNCS.can_continue(e)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = "if G.SAVED_GAME ~= nil then G.SAVED_GAME = STR_UNPACK(G.SAVED_GAME) end"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = """
|
||||||
|
if G.SAVED_GAME == nil then
|
||||||
|
e.config.colour = G.C.UI.BACKGROUND_INACTIVE
|
||||||
|
e.config.button = nil
|
||||||
|
return _can_continue
|
||||||
|
end
|
||||||
|
"""
|
||||||
|
|
||||||
|
## Fix loading a blind with $0 reward
|
||||||
|
# Blind:load()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*) G\.HUD_blind\.alignment\.offset\.y = 0
|
||||||
|
[\t ]*end'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
end
|
||||||
|
if G.GAME.blind.name and G.GAME.blind.name ~= '' then
|
||||||
|
G.HUD_blind.alignment.offset.y = 0
|
||||||
|
end'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
## Remove incorrect check for Moveable alignment change
|
||||||
|
# Moveable:align_to_major()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'engine/moveable.lua'
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)if +self\.alignment\.prev_offset\.x == self\.alignment\.offset\.x[\s\S]*?return end
|
||||||
|
'''
|
||||||
|
position = 'at'
|
||||||
|
payload = 'if not self.alignment.type_list then return end'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
## Prevent softlock if booster pack is empty
|
||||||
|
## Crashes the game when you skip too fast on this PR, along with being the culprit for allowing you to skip boosters early
|
||||||
|
# G.FUNCS.can_skip_booster()
|
||||||
|
# [[patches]]
|
||||||
|
# [patches.pattern]
|
||||||
|
# target = 'functions/button_callbacks.lua'
|
||||||
|
# pattern = 'if G.pack_cards and (G.pack_cards.cards[1]) and'
|
||||||
|
# position = 'at'
|
||||||
|
# payload = 'if G.pack_cards and'
|
||||||
|
# match_indent = true
|
||||||
|
|
||||||
|
## Set `G.your_collection.config.collection` to true in all cases
|
||||||
|
# create_UIBox_your_collection_seals()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''\{card_limit = 4, type = 'title', highlight_limit = 0\}'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''{card_limit = 4, type = 'title', highlight_limit = 0, collection = true}'''
|
||||||
|
|
||||||
|
## Save and load Card.unique_val
|
||||||
|
# Card:save()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "bypass_lock = self.bypass_lock,"
|
||||||
|
position = "after"
|
||||||
|
payload = """
|
||||||
|
unique_val = self.unique_val,
|
||||||
|
unique_val__saved_ID = self.ID,
|
||||||
|
ignore_base_shader = self.ignore_base_shader,
|
||||||
|
ignore_shadow = self.ignore_shadow,"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Card:load()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "self.bypass_lock = cardTable.bypass_lock"
|
||||||
|
position = "after"
|
||||||
|
payload = """
|
||||||
|
self.unique_val = cardTable.unique_val or self.unique_val
|
||||||
|
if cardTable.unique_val__saved_ID and G.ID <= cardTable.unique_val__saved_ID then
|
||||||
|
G.ID = cardTable.unique_val__saved_ID + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
self.ignore_base_shader = cardTable.ignore_base_shader or {}
|
||||||
|
self.ignore_shadow = cardTable.ignore_shadow or {}"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
## Vars in card descriptions should use `card.ability` instead of `_c.config` where possible
|
||||||
|
## Allow passing in custom vars
|
||||||
|
# generate_card_ui()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = 'function generate_card_ui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end)'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''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'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "if _c.set == 'Other' then"
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = "local cfg = (card and card.ability) or _c['config']" # string index to make sure the next patch doesn't eat it
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "if _c.name ~= 'Stone Card' and ((specific_vars and specific_vars.bonus_chips) or _c.config.bonus) then"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = "if _c.name ~= 'Stone Card' and ((specific_vars and specific_vars.bonus_chips) or (cfg.bonus ~= 0 and cfg.bonus)) then"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = '_c.config'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'cfg'
|
||||||
|
|
||||||
|
## When overriding with set_ability and card is added to deck, call add / remove effects
|
||||||
|
# Card:set_ability()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "self.config.center = center"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
if delay_sprites == 'quantum' then self.from_quantum = true end
|
||||||
|
if self.added_to_deck and old_center and not self.debuff then
|
||||||
|
self:remove_from_deck()
|
||||||
|
self.added_to_deck = true
|
||||||
|
end
|
||||||
|
if type(center) == 'string' then
|
||||||
|
assert(G.P_CENTERS[center])
|
||||||
|
center = G.P_CENTERS[center]
|
||||||
|
end
|
||||||
|
self.config.center = center
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "if G.consumeables and self.area == G.consumeables then"
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
if self.added_to_deck and old_center and not self.debuff then
|
||||||
|
self.added_to_deck = false
|
||||||
|
self:add_to_deck()
|
||||||
|
end
|
||||||
|
self.from_quantum = nil'''
|
||||||
|
|
||||||
|
|
||||||
|
## set_ability() transfers over old fields
|
||||||
|
# special cases:
|
||||||
|
# extra_value should be transferred
|
||||||
|
# name, effect, set, extra should always be overwritten
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)self\.ability = (\{[\s\S]*?
|
||||||
|
[\t ]*\})
|
||||||
|
'''
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
local new_ability = $2
|
||||||
|
self.ability = self.ability or {}
|
||||||
|
new_ability.extra_value = nil
|
||||||
|
self.ability.extra_value = self.ability.extra_value or 0
|
||||||
|
for k, v in pairs(new_ability) do
|
||||||
|
self.ability[k] = v
|
||||||
|
end
|
||||||
|
-- reset keys do not persist an ability change
|
||||||
|
local reset_keys = {'name', 'effect', 'set', 'extra', 'played_this_ante', 'perma_debuff'}
|
||||||
|
for _, mod in ipairs(SMODS.mod_list) do
|
||||||
|
if mod.set_ability_reset_keys then
|
||||||
|
local keys = mod.set_ability_reset_keys()
|
||||||
|
for _, v in pairs(keys) do table.insert(reset_keys, v) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for _, k in ipairs(reset_keys) do
|
||||||
|
self.ability[k] = new_ability[k]
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
## Fix crash if self.config.card == nil for non-vanilla set_ability() calls
|
||||||
|
# Card:set_ability()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "self.label = center.label or self.config.card.label or self.ability.set"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = "self.label = center.label or self.config.card and self.config.card.label or self.ability.set"
|
||||||
|
|
||||||
|
### Fix Matador
|
||||||
|
|
||||||
|
# These patches have been removed for altering vanilla behavior. Git blame this line to see what they were
|
||||||
|
|
||||||
|
### Fix Crimson Heart
|
||||||
|
|
||||||
|
## Blind:drawn_to_hand()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "if self.name == 'Crimson Heart' and self.prepped and G.jokers.cards\\[1\\] then"
|
||||||
|
position = 'after'
|
||||||
|
payload = """
|
||||||
|
|
||||||
|
local prev_chosen_set = {}
|
||||||
|
local fallback_jokers = {}"""
|
||||||
|
# Fix bad logic if not enough choices for debuff
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)for i = 1, #G\.jokers\.cards do
|
||||||
|
[\t ]*if not G\.jokers\.cards\[i\]\.debuff or #G\.jokers\.cards < 2 then jokers\[#jokers\+1\] = ?G\.jokers\.cards\[i\] end
|
||||||
|
[\t ]*G\.jokers\.cards\[i\]:set_debuff\(false\)
|
||||||
|
[\t ]*end'''
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = """
|
||||||
|
for i = 1, #G.jokers.cards do
|
||||||
|
if G.jokers.cards[i].ability.crimson_heart_chosen then
|
||||||
|
prev_chosen_set[G.jokers.cards[i]] = true
|
||||||
|
G.jokers.cards[i].ability.crimson_heart_chosen = nil
|
||||||
|
if G.jokers.cards[i].debuff then SMODS.recalc_debuff(G.jokers.cards[i]) end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for i = 1, #G.jokers.cards do
|
||||||
|
if not G.jokers.cards[i].debuff then
|
||||||
|
if not prev_chosen_set[G.jokers.cards[i]] then
|
||||||
|
jokers[#jokers+1] = G.jokers.cards[i]
|
||||||
|
end
|
||||||
|
table.insert(fallback_jokers, G.jokers.cards[i])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if #jokers == 0 then jokers = fallback_jokers end"""
|
||||||
|
# Add variable for Crimson Heart's choice
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "_card:set_debuff(true)"
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = """
|
||||||
|
_card.ability.crimson_heart_chosen = true
|
||||||
|
SMODS.recalc_debuff(_card)"""
|
||||||
|
|
||||||
|
## Blind:debuff_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = '''
|
||||||
|
if self\.name == 'Crimson Heart' and not self\.disabled and card\.area == G\.jokers then\s+
|
||||||
|
((?<indent>[\t ]*)return)'''
|
||||||
|
root_capture = '$1'
|
||||||
|
position = "at"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = """
|
||||||
|
if card.ability.crimson_heart_chosen then
|
||||||
|
card:set_debuff(true);
|
||||||
|
if card.debuff then card.debuffed_by_blind = true end
|
||||||
|
return
|
||||||
|
end"""
|
||||||
|
|
||||||
|
## Blind:press_play()
|
||||||
|
# Shouldn't work with Matador
|
||||||
|
# yes it should
|
||||||
|
|
||||||
|
## Blind:disable()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "elseif self.name == 'The Water' then"
|
||||||
|
position = 'at'
|
||||||
|
payload = """
|
||||||
|
elseif self.name == 'Crimson Heart' then
|
||||||
|
for _, v in ipairs(G.jokers.cards) do
|
||||||
|
v.ability.crimson_heart_chosen = nil
|
||||||
|
end
|
||||||
|
elseif self.name == 'The Water' then"""
|
||||||
|
|
||||||
|
## Blind:defeat()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = "elseif self.name == 'The Manacle' and not self.disabled then"
|
||||||
|
position = 'at'
|
||||||
|
payload = """
|
||||||
|
elseif self.name == 'Crimson Heart' then
|
||||||
|
for _, v in ipairs(G.jokers.cards) do
|
||||||
|
v.ability.crimson_heart_chosen = nil
|
||||||
|
end
|
||||||
|
elseif self.name == 'The Manacle' and not self.disabled then"""
|
||||||
|
|
||||||
|
|
||||||
|
## Fix Manacle's unnecessary card draw after positive G.hand:change_size()
|
||||||
|
# Blind:disable()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'blind.lua'
|
||||||
|
pattern = 'G\.hand:change_size\(1\)(\s+G\.FUNCS\.draw_from_deck_to_hand\(1\))'
|
||||||
|
root_capture = '$1'
|
||||||
|
position = 'at'
|
||||||
|
payload = ""
|
||||||
|
|
||||||
|
#
|
||||||
|
# Money scaling fix
|
||||||
|
#
|
||||||
|
|
||||||
|
## create_UIBox_HUD
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''
|
||||||
|
string = \{\{ref_table = G\.GAME\, ref_value = 'dollars'\, prefix = localize\('\$'\)\}\}\,'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
scale_function = function ()
|
||||||
|
return scale_number(G.GAME.dollars, 2.2 * scale, 99999, 1000000)
|
||||||
|
end,'''
|
||||||
|
|
||||||
|
## DynaText:update_text
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/text.lua"
|
||||||
|
pattern = 'self.config.H = 0'
|
||||||
|
position = "after"
|
||||||
|
payload = "self.scale = self.config.scale_function and self.config.scale_function() or self.scale"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Fix gold stake legendary infloop
|
||||||
|
# Do not try to roll for jokers that are not in_pool
|
||||||
|
#
|
||||||
|
|
||||||
|
# generate_starting_seed()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = '''if win_ante and (win_ante >= 8) then'''
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
payload = '''if win_ante and (win_ante >= 8) or (v.in_pool and type(v.in_pool) == 'function' and not v:in_pool()) then'''
|
||||||
|
|
||||||
|
#
|
||||||
|
# Fix G.GAME.blind:set_blind(nil, true, nil)
|
||||||
|
# being called when not in blind.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Card:add_to_deck
|
||||||
|
# Card:remove_from_deck
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'if G\.GAME\.blind then'
|
||||||
|
position = "at"
|
||||||
|
payload = "if G.GAME.blind and G.GAME.blind.in_blind and not self.from_quantum then"
|
||||||
|
|
||||||
|
# end_round()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/state_events.lua"
|
||||||
|
pattern = "local game_over = true"
|
||||||
|
position = "before"
|
||||||
|
payload = "G.GAME.blind.in_blind = false"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure new param is loaded
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "blind.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "function Blind:load(blindTable)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
self.in_blind = blindTable.in_blind'''
|
||||||
|
|
||||||
|
# Make sure new param is saved
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "blind.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "local blindTable = {"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
in_blind = self.in_blind,'''
|
||||||
|
|
||||||
|
# Cartomancer and astronomer unlock when *actually all* Tarot/Planet cards are discovered
|
||||||
|
# check_for_unlock()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "if card.unlock_condition.tarot_count <= args.tarot_count then"
|
||||||
|
position = "at"
|
||||||
|
payload = 'if #G.P_CENTER_POOLS.Tarot <= args.tarot_count then'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "if card.unlock_condition.planet_count <= args.planet_count then"
|
||||||
|
position = "at"
|
||||||
|
payload = 'if #G.P_CENTER_POOLS.Planet <= args.planet_count then'
|
||||||
|
|
||||||
|
# wtf
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/animatedsprite.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "for _, v in pairs(G.ANIMATIONS) do"
|
||||||
|
position = "at"
|
||||||
|
payload = 'for k, v in pairs(G.ANIMATIONS) do'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/animatedsprite.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "for _, v in pairs(G.I.SPRITE) do"
|
||||||
|
position = "at"
|
||||||
|
payload = 'for k, v in pairs(G.I.SPRITE) do'
|
||||||
|
|
||||||
|
## Make vanilla enhancement jokers work with extra enhancements
|
||||||
|
|
||||||
|
# Steel Joker
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "if v.config.center == G.P_CENTERS.m_steel then self.ability.steel_tally = self.ability.steel_tally+1 end"
|
||||||
|
position = "at"
|
||||||
|
payload = "if SMODS.has_enhancement(v, 'm_steel') then self.ability.steel_tally = self.ability.steel_tally+1 end"
|
||||||
|
|
||||||
|
# Stone Joker
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "if v.config.center == G.P_CENTERS.m_stone then self.ability.stone_tally = self.ability.stone_tally+1 end"
|
||||||
|
position = "at"
|
||||||
|
payload = "if SMODS.has_enhancement(v, 'm_stone') then self.ability.stone_tally = self.ability.stone_tally+1 end"
|
||||||
|
|
||||||
|
# Golden Ticket
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "context.other_card.ability.name == 'Gold Card' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "SMODS.has_enhancement(context.other_card, 'm_gold') then"
|
||||||
|
|
||||||
|
# Golden Ticket Unlock
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "if args.cards[j].ability.name == 'Gold Card' then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if SMODS.has_enhancement(args.cards[j], 'm_gold') then"
|
||||||
|
|
||||||
|
# Glass Joker
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "if val.ability.name == 'Glass Card' then shattered_glass = shattered_glass + 1 end"
|
||||||
|
position = "at"
|
||||||
|
payload = "if SMODS.has_enhancement(val, 'm_glass') then shattered_glass = shattered_glass + 1 end"
|
||||||
|
|
||||||
|
# Driver's License
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
match_indent = true
|
||||||
|
pattern = "if v.config.center ~= G.P_CENTERS.c_base then self.ability.driver_tally = self.ability.driver_tally+1 end"
|
||||||
|
position = "at"
|
||||||
|
payload = "if next(SMODS.get_enhancements(v)) then self.ability.driver_tally = self.ability.driver_tally+1 end"
|
||||||
|
# Basegame fix for the reroll vouchers redeem function when only the center but no card object exists
|
||||||
|
|
||||||
|
# Card:apply_to_run
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = """G.GAME.round_resets.reroll_cost = G.GAME.round_resets.reroll_cost - self.ability.extra"""
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = """G.GAME.round_resets.reroll_cost = G.GAME.round_resets.reroll_cost - center_table.extra"""
|
||||||
|
|
||||||
|
# Card:apply_to_run
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = """G.GAME.current_round.reroll_cost = math.max(0, G.GAME.current_round.reroll_cost - self.ability.extra)"""
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = """G.GAME.current_round.reroll_cost = math.max(0, G.GAME.current_round.reroll_cost - center_table.extra)"""
|
||||||
|
|
||||||
|
|
||||||
|
# Fix booster skip issues maybe?
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "if G.pack_cards and (G.pack_cards.cards[1]) and"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if G.pack_cards and (not (G.GAME.STOP_USE and G.GAME.STOP_USE > 0)) and
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Due to STOP_USE being used we can remove this dumb check
|
||||||
|
# could probably remove the rest of it since it serves no purpose otherwise, but whatever
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''and \(G\.hand\.cards\[1\] or \(G\.hand\.config\.card_limit <= 0\)\)'''
|
||||||
|
position = "at"
|
||||||
|
payload = ''' '''
|
||||||
|
|
||||||
|
# Fix prng calls on collection advancing seeds
|
||||||
|
# Keep vanilla behaviour for to-do list
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "if key == 'seed' then return math.random() end"
|
||||||
|
position = "after"
|
||||||
|
payload = """
|
||||||
|
if G.SETTINGS.paused and key ~= 'to_do' then return math.random() end
|
||||||
|
"""
|
||||||
|
overwrite = true
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Fixes Steam API not loading on unix
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'main.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
pattern = '--To control when steam communication happens, make sure to send updates to steam as little as possible'
|
||||||
|
payload = '''local cwd = NFS.getWorkingDirectory()
|
||||||
|
NFS.setWorkingDirectory(love.filesystem.getSourceBaseDirectory())
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'main.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
pattern = '--Set up the render window and the stage for the splash screen, then enter the gameloop with :update'
|
||||||
|
payload = '''NFS.setWorkingDirectory(cwd)
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "main.lua"
|
||||||
|
pattern = '''if os == 'OS X' or os == 'Windows' then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if os == 'OS X' or os == 'Windows' or os == 'Linux' then'''
|
||||||
|
overwrite = true
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "main.lua"
|
||||||
|
pattern = '''if os == 'OS X' then'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''if os == 'OS X' or os == 'Linux' then'''
|
||||||
|
overwrite = true
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "main.lua"
|
||||||
|
pattern = "st = require 'luasteam'"
|
||||||
|
position = "at"
|
||||||
|
payload = """local success, _st = pcall(require, 'luasteam')
|
||||||
|
if success then st = _st else sendWarnMessage(_st, "LuaSteam"); st = {} end"""
|
||||||
|
overwrite = true
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# copy_card edition config
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
pattern = 'new_card:set_edition(other.edition or {}, nil, true)'
|
||||||
|
payload = '''for k,v in pairs(other.edition or {}) do
|
||||||
|
if type(v) == 'table' then
|
||||||
|
new_card.edition[k] = copy_table(v)
|
||||||
|
else
|
||||||
|
new_card.edition[k] = v
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# fix Smeared Joker compat issues with modded suits
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if next(find_joker('Smeared Joker')) and (self.base.suit == 'Hearts' or self.base.suit == 'Diamonds') == (suit == 'Hearts' or suit == 'Diamonds') then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if next(find_joker('Smeared Joker')) and SMODS.smeared_check(self, suit) then"
|
||||||
|
overwrite = true
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# fix Seeing Double compat issues with modded suits
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = """local suits = {
|
||||||
|
['Hearts'] = 0,
|
||||||
|
['Diamonds'] = 0,
|
||||||
|
['Spades'] = 0,
|
||||||
|
['Clubs'] = 0
|
||||||
|
}
|
||||||
|
for i = 1, #context.scoring_hand do
|
||||||
|
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
|
||||||
|
if context.scoring_hand[i]:is_suit('Clubs') then suits["Clubs"] = suits["Clubs"] + 1 end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for i = 1, #context.scoring_hand do
|
||||||
|
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
|
||||||
|
elseif context.scoring_hand[i]:is_suit('Hearts') and suits["Hearts"] == 0 then suits["Hearts"] = suits["Hearts"] + 1 end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if (suits["Hearts"] > 0 or
|
||||||
|
suits["Diamonds"] > 0 or
|
||||||
|
suits["Spades"] > 0) and
|
||||||
|
suits["Clubs"] > 0 then
|
||||||
|
return {
|
||||||
|
message = localize{type='variable',key='a_xmult',vars={self.ability.extra}},
|
||||||
|
Xmult_mod = self.ability.extra
|
||||||
|
}
|
||||||
|
end"""
|
||||||
|
position = "at"
|
||||||
|
payload = """if SMODS.seeing_double_check(context.scoring_hand, 'Clubs') then
|
||||||
|
return {
|
||||||
|
message = localize{type='variable',key='a_xmult',vars={self.ability.extra}},
|
||||||
|
Xmult_mod = self.ability.extra
|
||||||
|
}
|
||||||
|
end"""
|
||||||
|
overwrite = true
|
||||||
|
match_indent = true
|
16
Steamodded/lovely/gradient.toml
Normal file
16
Steamodded/lovely/gradient.toml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
# Game:update
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "self.C.EDITION[2] = 0.7+0.2*(1+math.sin(self.TIMERS.REAL*1.5 + 6))"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
for _,v in pairs(SMODS.Gradients) do
|
||||||
|
v:update(dt)
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
364
Steamodded/lovely/joker_retriggers.toml
Normal file
364
Steamodded/lovely/joker_retriggers.toml
Normal file
|
@ -0,0 +1,364 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
|
||||||
|
# Luchador
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''[ \t]*G\.GAME\.blind:disable\(\)
|
||||||
|
(?<indent>[ \t]*)end'''
|
||||||
|
position = "at"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = ''' G.GAME.blind:disable()
|
||||||
|
return nil, true
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Diet Cola
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*return true
|
||||||
|
[ \t]*end\)
|
||||||
|
[ \t]*\}\)\)
|
||||||
|
(?<indent>[ \t]*)end
|
||||||
|
'''
|
||||||
|
position = "at"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = ''' return true
|
||||||
|
end)
|
||||||
|
}))
|
||||||
|
return nil, true
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Invisible Joker
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''[ \t]*if card\.ability\.invis_rounds then card\.ability\.invis_rounds = 0 end
|
||||||
|
[ \t]*card:add_to_deck\(\)
|
||||||
|
(?<indent>[ \t]*)G\.jokers:emplace\(card\)'''
|
||||||
|
position = "after"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Campfire
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''localize\('k_upgrade_ex'\)\}\); return true
|
||||||
|
[ \t]*end\}\)\)
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)return'''
|
||||||
|
position = "at"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''localize('k_upgrade_ex')}); return true
|
||||||
|
end}))
|
||||||
|
end
|
||||||
|
if self.ability.name == 'Campfire' and not context.blueprint then return nil, true end'''
|
||||||
|
|
||||||
|
# Flash Card
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''[ \t]*G\.C\.MULT\}\)
|
||||||
|
[ \t]*return true
|
||||||
|
[ \t]*end\)\}\)\)
|
||||||
|
(?<indent>[ \t]*)end'''
|
||||||
|
position = "at"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''G.C.MULT})
|
||||||
|
return true
|
||||||
|
end)}))
|
||||||
|
end
|
||||||
|
if self.ability.name == 'Flash Card' and not context.blueprint then return nil, true end'''
|
||||||
|
|
||||||
|
# Perkeo
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''[ \t]*card_eval_status_text\(context\.blueprint_card or self, 'extra', nil, nil, nil, \{message = localize\('k_duplicated_ex'\)\}\)
|
||||||
|
(?<indent>[ \t]*)end'''
|
||||||
|
position = "at"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = ''' card_eval_status_text(context.blueprint_card or self, 'extra', nil, nil, nil, {message = localize('k_duplicated_ex')})
|
||||||
|
return nil, true
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Throwback
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
[ \t]*return
|
||||||
|
(?<indent>[ \t]*)elseif context\.skipping_booster'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Red Card
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
[ \t]*return
|
||||||
|
(?<indent>[ \t]*)elseif context\.playing_card_added'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Hologram
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)elseif context\.first_hand_drawn'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Certificate
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)if self\.ability\.name == 'DNA' and not context\.blueprint'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Chicot
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)if self\.ability\.name == 'Madness' '''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Madness
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)if self\.ability\.name == 'Burglar' '''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Burglar
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)if self\.ability\.name == 'Riff-raff' '''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Riff-raff
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)if self\.ability\.name == 'Cartomancer' '''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Cartomancer
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)if self\.ability\.name == 'Ceremonial Dagger' and not context.blueprint'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Ceremonial Dagger
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)if self\.ability\.name == 'Marble Joker' '''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Marble Joker
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
[ \t]*return
|
||||||
|
(?<indent>[ \t]*)elseif context.destroying_card'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Caino
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''[ \t]*func = function\(\) card_eval_status_text\(self, 'extra', nil, nil, nil, \{message = localize\{type = 'variable', key = 'a_xmult', vars = \{self\.ability\.caino_xmult\}\}\}\); return true
|
||||||
|
(?<indent>[ \t]*)end\}\)\)'''
|
||||||
|
position = "after"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Glass Joker
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''glass_cards\}\}\}\)
|
||||||
|
[ \t]*return true
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)\}\)\)'''
|
||||||
|
position = "after"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
[ \t]*return
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)if self\.ability\.name == 'Fortune Teller' and not context\.blueprint'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Fortune Teller
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)if self\.ability\.name == 'Constellation' and not context\.blueprint'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Constellation
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
[ \t]*return
|
||||||
|
(?<indent>[ \t]*)elseif context.debuffed_hand'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "nil, true"
|
||||||
|
|
||||||
|
# Burnt Joker
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
(?<indent>[ \t]*)elseif context.discard'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Faceless Joker
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
[ \t]*end
|
||||||
|
[ \t]*end
|
||||||
|
[ \t]*return
|
||||||
|
(?<indent>[ \t]*)elseif context.end_of_round'''
|
||||||
|
position = "before"
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = "nil, true"
|
||||||
|
|
||||||
|
# Yorick
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "self.ability.yorick_discards = self.ability.yorick_discards - 1"
|
||||||
|
position = "after"
|
||||||
|
match_indent = true
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
# Hallucination
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "card_eval_status_text(self, 'extra', nil, nil, nil, {message = localize('k_plus_tarot'), colour = G.C.PURPLE})"
|
||||||
|
position = "after"
|
||||||
|
match_indent = true
|
||||||
|
payload = "return nil, true"
|
||||||
|
|
||||||
|
## Change card returns
|
||||||
|
# Ramen
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
message = localize('k_eaten_ex'),
|
||||||
|
colour = G.C.FILTER'''
|
||||||
|
position = "before"
|
||||||
|
match_indent = true
|
||||||
|
payload = "card = self,"
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''message = localize{type='variable',key='a_xmult_minus',vars={self.ability.extra}},'''
|
||||||
|
position = "before"
|
||||||
|
match_indent = true
|
||||||
|
payload = "card = self,"
|
||||||
|
|
||||||
|
# Yorick
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
delay = 0.2,
|
||||||
|
message = localize{type='variable',key='a_xmult',vars={self.ability.x_mult}},'''
|
||||||
|
position = "before"
|
||||||
|
match_indent = true
|
||||||
|
payload = "card = self,"
|
||||||
|
|
||||||
|
# To Do List
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''message = localize('$')..self.ability.extra.dollars,
|
||||||
|
dollars = self.ability.extra.dollars,'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''message = localize('$')..self.ability.extra.dollars,'''
|
||||||
|
|
||||||
|
# Matador
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''message = localize('$')..self.ability.extra,
|
||||||
|
dollars = self.ability.extra,'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''message = localize('$')..self.ability.extra,'''
|
73
Steamodded/lovely/joker_size.toml
Normal file
73
Steamodded/lovely/joker_size.toml
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
if center.name == "Wee Joker" and (center.discovered or self.bypass_discovery_center) then
|
||||||
|
H = H*0.7
|
||||||
|
W = W*0.7
|
||||||
|
self.T.h = H
|
||||||
|
self.T.w = W
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
self.VT.h = self.T.H
|
||||||
|
self.VT.w = self.T.w
|
||||||
|
'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
match_indent = true
|
82
Steamodded/lovely/keybind.toml
Normal file
82
Steamodded/lovely/keybind.toml
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
# Check all registered keybinds
|
||||||
|
# inserted inside Controller:key_press_update
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/controller.lua'
|
||||||
|
pattern = "if not _RELEASE_MODE then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
for _, keybind in pairs(SMODS.Keybinds) do
|
||||||
|
if keybind.action and keybind.key_pressed == key 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
|
||||||
|
execute = false
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if execute then
|
||||||
|
keybind:action()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Controller:key_release_update
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/controller.lua'
|
||||||
|
pattern = "function Controller:key_release_update(key, dt)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'engine/controller.lua'
|
||||||
|
pattern = 'if key == "r"'
|
||||||
|
position = 'before'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
59
Steamodded/lovely/language.toml
Normal file
59
Steamodded/lovely/language.toml
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Language API
|
||||||
|
|
||||||
|
# Game:set_language()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = "if not (love.filesystem.read('localization/'..G.SETTINGS.language..'.lua')) or G.F_ENGLISH_ONLY then"
|
||||||
|
position = 'at'
|
||||||
|
payload = 'if false then'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = "local localization = love.filesystem.getInfo('localization/'..G.SETTINGS.language..'.lua')"
|
||||||
|
position = 'at'
|
||||||
|
payload = "local localization = love.filesystem.getInfo('localization/'..G.SETTINGS.language..'.lua') or love.filesystem.getInfo('localization/en-us.lua')"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = "self.localization = assert(loadstring(love.filesystem.read('localization/'..G.SETTINGS.language..'.lua')))()"
|
||||||
|
position = 'at'
|
||||||
|
payload = """self.localization = assert(loadstring(love.filesystem.read('localization/'..G.SETTINGS.language..'.lua') or love.filesystem.read('localization/en-us.lua'), '=[localization "'..G.SETTINGS.language..'.lua"]'))()"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = "self.LANG = self.LANGUAGES[self.SETTINGS.language] or self.LANGUAGES['en-us']"
|
||||||
|
position = 'at'
|
||||||
|
payload = "self.LANG = self.LANGUAGES[self.SETTINGS.real_language or self.SETTINGS.language] or self.LANGUAGES['en-us']"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNCS.change_lang
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = "G.SETTINGS.language = lang.key"
|
||||||
|
position = 'at'
|
||||||
|
payload = """G.SETTINGS.language = lang.loc_key or lang.key
|
||||||
|
G.SETTINGS.real_language = lang.key"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNCS.warn_lang (wtf)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = 'if (_infotip_object.config.set ~= e.config.ref_table.label) and (not G.F_NO_ACHIEVEMENTS) then'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'if (_infotip_object.config.set ~= e.config.ref_table.label) then'
|
||||||
|
match_indent = true
|
34
Steamodded/lovely/libs.toml
Normal file
34
Steamodded/lovely/libs.toml
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.module]
|
||||||
|
source = "libs/json/json.lua"
|
||||||
|
before = "main.lua"
|
||||||
|
name = "json"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.module]
|
||||||
|
source = "libs/nativefs/nativefs.lua"
|
||||||
|
before = "main.lua"
|
||||||
|
name = "nativefs"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.module]
|
||||||
|
source = "libs/https/luajit-curl.lua"
|
||||||
|
before = "main.lua"
|
||||||
|
name = "luajit-curl"
|
||||||
|
|
||||||
|
[[patches]] # Ensure the thread can also load this
|
||||||
|
[patches.module]
|
||||||
|
source = "libs/https/luajit-curl.lua"
|
||||||
|
before = '=[SMODS _ "smods-https-thread.lua"]'
|
||||||
|
name = "luajit-curl"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.module]
|
||||||
|
source = "libs/https/smods-https.lua"
|
||||||
|
before = "main.lua"
|
||||||
|
name = "SMODS.https"
|
27
Steamodded/lovely/loader.toml
Normal file
27
Steamodded/lovely/loader.toml
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
### Supporting code for loader.lua
|
||||||
|
|
||||||
|
## Save discovered, unlocked states
|
||||||
|
# Game:init_item_prototypes()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = "meta.alerted = meta.alerted or {}"
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
for _, t in ipairs{
|
||||||
|
G.P_CENTERS,
|
||||||
|
G.P_BLINDS,
|
||||||
|
G.P_TAGS,
|
||||||
|
G.P_SEALS,
|
||||||
|
} do
|
||||||
|
for k, v in pairs(t) do
|
||||||
|
SMODS._save_d_u(v)
|
||||||
|
v._discovered_unlocked_overwritten = true
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
60
Steamodded/lovely/menu.toml
Normal file
60
Steamodded/lovely/menu.toml
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''local main_menu = nil'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''local mods = nil'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''main_menu = UIBox_button{ label = {localize('b_main_menu')}, button = "go_to_menu", minw = 5}'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''mods = UIBox_button{ id = "mods_button", label = {localize('b_mods')}, button = "mods_button", minw = 5}'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''G.ARGS.set_alerts_alertables[11].should_alert = alert_booster'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''table.insert(G.ARGS.set_alerts_alertables, {id = 'mods_button', alert_uibox_name = 'mods_button_alert', should_alert = SMODS.mod_button_alert})'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''main_menu,'''
|
||||||
|
position = "after"
|
||||||
|
payload = '''mods,'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = '''self.ASSET_ATLAS[self.asset_atli[i].name].image = love.graphics.newImage(self.asset_atli[i].path, {mipmaps = true, dpiscale = self.SETTINGS.GRAPHICS.texture_scaling})'''
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
local mipmap_level = SMODS.config.graphics_mipmap_level_options[SMODS.config.graphics_mipmap_level]
|
||||||
|
if mipmap_level and mipmap_level > 0 then
|
||||||
|
self.ASSET_ATLAS[self.asset_atli[i].name].image:setMipmapFilter('linear', mipmap_level)
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''create_option_cycle({w = 4,scale = 0.8, label = localize("b_set_CRT_bloom"),options = localize('ml_bloom_opt'), opt_callback = 'change_crt_bloom', current_option = G.SETTINGS.GRAPHICS.bloom}),'''
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
create_option_cycle({label = localize('b_graphics_mipmap_level'),scale = 0.8, options = SMODS.config.graphics_mipmap_level_options, opt_callback = 'SMODS_change_mipmap', current_option = SMODS.config.graphics_mipmap_level}),'''
|
||||||
|
match_indent = true
|
||||||
|
|
72
Steamodded/lovely/mod.toml
Normal file
72
Steamodded/lovely/mod.toml
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
### Per-mod functions
|
||||||
|
|
||||||
|
# end_round()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/state_events.lua'
|
||||||
|
pattern = '''(?<indent>[\t ]*)reset_castle_card\(\)'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
for _, mod in ipairs(SMODS.mod_list) do
|
||||||
|
if mod.reset_game_globals and type(mod.reset_game_globals) == 'function' then
|
||||||
|
mod.reset_game_globals(false)
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Game:start_run()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = '''(?<indent>[\t ]*)reset_castle_card\(\)'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
for _, mod in ipairs(SMODS.mod_list) do
|
||||||
|
if mod.reset_game_globals and type(mod.reset_game_globals) == 'function' then
|
||||||
|
mod.reset_game_globals(true)
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Card:set_debuff()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "function Card:set_debuff(should_debuff)"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
for _, mod in ipairs(SMODS.mod_list) do
|
||||||
|
if mod.set_debuff and type(mod.set_debuff) == 'function' then
|
||||||
|
local res = mod.set_debuff(self)
|
||||||
|
if res == 'prevent_debuff' then
|
||||||
|
if self.debuff then
|
||||||
|
self.debuff = false
|
||||||
|
if self.area == G.jokers then self:add_to_deck(true) end
|
||||||
|
self.debuffed_by_blind = false
|
||||||
|
end
|
||||||
|
return
|
||||||
|
end
|
||||||
|
should_debuff = should_debuff or res
|
||||||
|
end
|
||||||
|
end
|
||||||
|
for k, v in pairs(self.ability.debuff_sources or {}) do
|
||||||
|
if v == 'prevent_debuff' then
|
||||||
|
if self.debuff then
|
||||||
|
self.debuff = false
|
||||||
|
if self.area == G.jokers then self:add_to_deck(true) end
|
||||||
|
end
|
||||||
|
self.debuffed_by_blind = false
|
||||||
|
return
|
||||||
|
end
|
||||||
|
should_debuff = should_debuff or v
|
||||||
|
end
|
||||||
|
|
||||||
|
'''
|
171
Steamodded/lovely/number_formatting.toml
Normal file
171
Steamodded/lovely/number_formatting.toml
Normal file
|
@ -0,0 +1,171 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
#
|
||||||
|
# Use number_format for...
|
||||||
|
#
|
||||||
|
|
||||||
|
# DynaText
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "engine/text.lua"
|
||||||
|
pattern = 'tostring\((?<param>v\.ref_table and v\.ref_table\[v\.ref_value\] or v\.string)\)'
|
||||||
|
position = "at"
|
||||||
|
payload = "format_ui_value($param)"
|
||||||
|
|
||||||
|
# Cash Out
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''
|
||||||
|
localize\('\$'\)\.\.config\.dollars'''
|
||||||
|
position = "at"
|
||||||
|
payload = "localize('$')..format_ui_value(config.dollars)"
|
||||||
|
|
||||||
|
# End of round money
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''
|
||||||
|
localize\('\$'\)\.\.num_dollars\}'''
|
||||||
|
position = "at"
|
||||||
|
payload = "localize('$')..format_ui_value(num_dollars)}"
|
||||||
|
|
||||||
|
# Tooltip numbers
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = '(?<param>args\.vars\[tonumber\(subpart\[1\]\)\])'
|
||||||
|
position = "at"
|
||||||
|
payload = 'format_ui_value($param)'
|
||||||
|
|
||||||
|
# Poker Hand chips
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "{n=G.UIT.T, config={text = G.GAME.hands[handname].chips, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}},"
|
||||||
|
position = "at"
|
||||||
|
payload = "{n=G.UIT.T, config={text = number_format(G.GAME.hands[handname].chips, 1000000), scale = 0.45, colour = G.C.UI.TEXT_LIGHT}},"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Poker Hand mult
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "{n=G.UIT.T, config={text = G.GAME.hands[handname].mult, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}"
|
||||||
|
position = "at"
|
||||||
|
payload = "{n=G.UIT.T, config={text = number_format(G.GAME.hands[handname].mult, 1000000), scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Continue Run - Money
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = 'tostring\(saved_game\.GAME\.dollars\)'
|
||||||
|
position = "at"
|
||||||
|
payload = "format_ui_value(saved_game.GAME.dollars)"
|
||||||
|
|
||||||
|
# Continue Run - Best Hand - bigger size
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = 'scale_number\(saved_game\.GAME\.round_scores\.hand\.amt\, 0\.8\*scale\)'
|
||||||
|
position = "at"
|
||||||
|
payload = "scale_number(saved_game.GAME.round_scores.hand.amt, 0.8*scale, 100000000000)"
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Custom sci notation switch point
|
||||||
|
#
|
||||||
|
|
||||||
|
## number_format
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'function number_format(num)'
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
function number_format(num, e_switch_point)
|
||||||
|
if type(num) ~= 'number' then return num end
|
||||||
|
|
||||||
|
local sign = (num >= 0 and "") or "-"
|
||||||
|
num = math.abs(num)'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'num >= G\.E_SWITCH_POINT'
|
||||||
|
position = "at"
|
||||||
|
payload = "num >= (e_switch_point or G.E_SWITCH_POINT)"
|
||||||
|
|
||||||
|
# 1. Fix floating point error (1.000e92 instead of 10.000e91)
|
||||||
|
# 2. Lower precision with higher numbers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = '''
|
||||||
|
return string.format("%.3f",x/(10^fac))..'e'..fac'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if num == math.huge then
|
||||||
|
return sign.."naneinf"
|
||||||
|
end
|
||||||
|
|
||||||
|
local mantissa = round_number(x/(10^fac), 3)
|
||||||
|
if mantissa >= 10 then
|
||||||
|
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))'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Remove trailing zeroes
|
||||||
|
# E.g. X1.5 being displayed as X1.50
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = '''
|
||||||
|
return string.format(num ~= math.floor(num) and (num >= 100 and "%.0f" or num >= 10 and "%.1f" or "%.2f") or "%.0f", num):reverse():gsub("(%d%d%d)", "%1,"):gsub(",$", ""):reverse()'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
else
|
||||||
|
formatted = string.format("%.0f", num)
|
||||||
|
end
|
||||||
|
return sign..(formatted:reverse():gsub("(%d%d%d)", "%1,"):gsub(",$", ""):reverse())'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
## scale_number
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = 'function scale_number(number, scale, max)'
|
||||||
|
position = "at"
|
||||||
|
payload = 'function scale_number(number, scale, max, e_switch_point)'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = 'number >= G\.E_SWITCH_POINT'
|
||||||
|
position = "at"
|
||||||
|
payload = "math.abs(number) >= (e_switch_point or G.E_SWITCH_POINT)"
|
||||||
|
|
337
Steamodded/lovely/perma_bonus.toml
Normal file
337
Steamodded/lovely/perma_bonus.toml
Normal file
|
@ -0,0 +1,337 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
### Permanent card values implementations
|
||||||
|
## Adapted from AMM (https://github.com/AutumnMood924/AutumnMoodMechanics)
|
||||||
|
|
||||||
|
# generate_card_ui(): mult card special case
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if _c.effect == 'Mult Card' then loc_vars = {cfg.mult}"
|
||||||
|
position = "at"
|
||||||
|
payload = "if _c.effect == 'Mult Card' then loc_vars = {SMODS.signed(cfg.mult + (specific_vars and specific_vars.bonus_mult or 0))}"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# generate_card_ui(): gold card special case
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif _c.effect == 'Gold Card' then loc_vars = {cfg.h_dollars}"
|
||||||
|
position = "at"
|
||||||
|
payload = "elseif _c.effect == 'Gold Card' then loc_vars = {specific_vars and SMODS.signed_dollars(specific_vars.total_h_dollars) or cfg.h_dollars and SMODS.signed_dollars(cfg.h_dollars) or 0}"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# generate_card_ui(): stone card special case
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif _c.effect == 'Stone Card' then loc_vars = {((specific_vars and specific_vars.bonus_chips) or cfg.bonus)}"
|
||||||
|
position = "at"
|
||||||
|
payload = "elseif _c.effect == 'Stone Card' then loc_vars = {((specific_vars and SMODS.signed(specific_vars.bonus_chips)) or cfg.bonus and SMODS.signed(cfg.bonus) or 0)}"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# generate_card_ui(): show permanent bonuses on default playing cards
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif _c.set == 'Enhanced' then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if specific_vars and specific_vars.bonus_x_chips then
|
||||||
|
localize{type = 'other', key = 'card_x_chips', nodes = desc_nodes, vars = {specific_vars.bonus_x_chips}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_mult then
|
||||||
|
localize{type = 'other', key = 'card_extra_mult', nodes = desc_nodes, vars = {SMODS.signed(specific_vars.bonus_mult)}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_x_mult then
|
||||||
|
localize{type = 'other', key = 'card_x_mult', nodes = desc_nodes, vars = {specific_vars.bonus_x_mult}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_h_chips then
|
||||||
|
localize{type = 'other', key = 'card_extra_h_chips', nodes = desc_nodes, vars = {SMODS.signed(specific_vars.bonus_h_chips)}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_h_x_chips then
|
||||||
|
localize{type = 'other', key = 'card_h_x_chips', nodes = desc_nodes, vars = {specific_vars.bonus_h_x_chips}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_h_mult then
|
||||||
|
localize{type = 'other', key = 'card_extra_h_mult', nodes = desc_nodes, vars = {SMODS.signed(specific_vars.bonus_h_mult)}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_h_x_mult then
|
||||||
|
localize{type = 'other', key = 'card_h_x_mult', nodes = desc_nodes, vars = {specific_vars.bonus_h_x_mult}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_p_dollars then
|
||||||
|
localize{type = 'other', key = 'card_extra_p_dollars', nodes = desc_nodes, vars = {SMODS.signed_dollars(specific_vars.bonus_p_dollars)}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_h_dollars then
|
||||||
|
localize{type = 'other', key = 'card_extra_h_dollars', nodes = desc_nodes, vars = {SMODS.signed_dollars(specific_vars.bonus_h_dollars)}}
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
overwrite = false
|
||||||
|
|
||||||
|
# generate_card_ui(): signed(extra_chips)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "localize{type = 'other', key = 'card_extra_chips', nodes = desc_nodes, vars = {specific_vars.bonus_chips}}"
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = "localize{type = 'other', key = 'card_extra_chips', nodes = desc_nodes, vars = {SMODS.signed(specific_vars.bonus_chips)}}"
|
||||||
|
|
||||||
|
# generate_card_ui(): signed(extra_chips)
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "localize{type = 'other', key = 'card_extra_chips', nodes = desc_nodes, vars = {((specific_vars and specific_vars.bonus_chips) or cfg.bonus)}}"
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = "localize{type = 'other', key = 'card_extra_chips', nodes = desc_nodes, vars = {SMODS.signed((specific_vars and specific_vars.bonus_chips) or cfg.bonus)}}"
|
||||||
|
|
||||||
|
# generate_card_ui(): show permanent bonuses on enhanced playing cards
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif _c.set == 'Booster' then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if specific_vars and specific_vars.bonus_x_chips then
|
||||||
|
localize{type = 'other', key = 'card_x_chips', nodes = desc_nodes, vars = {specific_vars.bonus_x_chips}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_mult and _c.effect ~= 'Mult Card' then
|
||||||
|
localize{type = 'other', key = 'card_extra_mult', nodes = desc_nodes, vars = {SMODS.signed(specific_vars.bonus_mult)}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_x_mult then
|
||||||
|
localize{type = 'other', key = 'card_x_mult', nodes = desc_nodes, vars = {specific_vars.bonus_x_mult}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_h_chips then
|
||||||
|
localize{type = 'other', key = 'card_extra_h_chips', nodes = desc_nodes, vars = {SMODS.signed(specific_vars.bonus_h_chips)}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_h_x_chips then
|
||||||
|
localize{type = 'other', key = 'card_h_x_chips', nodes = desc_nodes, vars = {specific_vars.bonus_h_x_chips}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_h_mult then
|
||||||
|
localize{type = 'other', key = 'card_extra_h_mult', nodes = desc_nodes, vars = {SMODS.signed(specific_vars.bonus_h_mult)}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_h_x_mult then
|
||||||
|
localize{type = 'other', key = 'card_h_x_mult', nodes = desc_nodes, vars = {specific_vars.bonus_h_x_mult}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_p_dollars then
|
||||||
|
localize{type = 'other', key = 'card_extra_p_dollars', nodes = desc_nodes, vars = {SMODS.signed_dollars(specific_vars.bonus_p_dollars)}}
|
||||||
|
end
|
||||||
|
if specific_vars and specific_vars.bonus_h_dollars and _c.effect ~= 'Gold Card' then
|
||||||
|
localize{type = 'other', key = 'card_extra_h_dollars', nodes = desc_nodes, vars = {SMODS.signed_dollars(specific_vars.bonus_h_dollars)}}
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
overwrite = false
|
||||||
|
|
||||||
|
# generate_UIBox_ability_table(): prime locals for easier boolean magic
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "loc_vars = { playing_card = not not self.base.colour, value = self.base.value, suit = self.base.suit, colour = self.base.colour,"
|
||||||
|
position = "before"
|
||||||
|
payload = '''local bonus_chips = self.ability.bonus + (self.ability.perma_bonus or 0)
|
||||||
|
local total_h_dollars = self:get_h_dollars()'''
|
||||||
|
match_indent = true
|
||||||
|
overwrite = false
|
||||||
|
|
||||||
|
# generate_UIBox_ability_table(): prime specific_vars for playing cards
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "bonus_chips = (self.ability.bonus + (self.ability.perma_bonus or 0)) > 0 and (self.ability.bonus + (self.ability.perma_bonus or 0)) or nil,"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
bonus_x_chips = self.ability.perma_x_chips ~= 0 and (self.ability.perma_x_chips + 1) or nil,
|
||||||
|
bonus_mult = self.ability.perma_mult ~= 0 and self.ability.perma_mult or nil,
|
||||||
|
bonus_x_mult = self.ability.perma_x_mult ~= 0 and (self.ability.perma_x_mult + 1) or nil,
|
||||||
|
bonus_h_chips = self.ability.perma_h_chips ~= 0 and self.ability.perma_h_chips or nil,
|
||||||
|
bonus_h_x_chips = self.ability.perma_h_x_chips ~= 0 and (self.ability.perma_h_x_chips + 1) or nil,
|
||||||
|
bonus_h_mult = self.ability.perma_h_mult ~= 0 and self.ability.perma_h_mult or nil,
|
||||||
|
bonus_h_x_mult = self.ability.perma_h_x_mult ~= 0 and (self.ability.perma_h_x_mult + 1) or nil,
|
||||||
|
bonus_p_dollars = self.ability.perma_p_dollars ~= 0 and self.ability.perma_p_dollars or nil,
|
||||||
|
bonus_h_dollars = self.ability.perma_h_dollars ~= 0 and self.ability.perma_h_dollars or nil,
|
||||||
|
total_h_dollars = total_h_dollars ~= 0 and total_h_dollars or nil,
|
||||||
|
bonus_chips = bonus_chips ~= 0 and bonus_chips or nil,'''
|
||||||
|
match_indent = true
|
||||||
|
overwrite = false
|
||||||
|
|
||||||
|
# set_ability: set defaults for temporary bonuses
|
||||||
|
# Also add conformance with SMODS documentation.
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "x_mult = center.config.Xmult or 1,"
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
x_mult = center.config.Xmult or center.config.x_mult or 1,
|
||||||
|
h_chips = center.config.h_chips or 0,
|
||||||
|
x_chips = center.config.x_chips or 1,
|
||||||
|
h_x_chips = center.config.h_x_chips or 1,
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
overwrite = false
|
||||||
|
|
||||||
|
# set_ability: set defaults for permanent bonuses
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "perma_bonus = self.ability and self.ability.perma_bonus or 0,"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
perma_x_chips = self.ability and self.ability.perma_x_chips or 0,
|
||||||
|
perma_mult = self.ability and self.ability.perma_mult or 0,
|
||||||
|
perma_x_mult = self.ability and self.ability.perma_x_mult or 0,
|
||||||
|
perma_h_chips = self.ability and self.ability.perma_h_chips or 0,
|
||||||
|
perma_h_x_chips = self.ability and self.ability.perma_h_x_chips or 0,
|
||||||
|
perma_h_mult = self.ability and self.ability.perma_hmult or 0,
|
||||||
|
perma_h_x_mult = self.ability and self.ability.perma_h_x_mult or 0,
|
||||||
|
perma_p_dollars = self.ability and self.ability.perma_p_dollars or 0,
|
||||||
|
perma_h_dollars = self.ability and self.ability.perma_h_dollars or 0,
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
overwrite = false
|
||||||
|
|
||||||
|
# Card:get_chip_mult
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if self.ability.effect == "Lucky Card" then
|
||||||
|
if pseudorandom('lucky_mult') < G.GAME.probabilities.normal/5 then
|
||||||
|
self.lucky_trigger = true
|
||||||
|
return self.ability.mult
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return self.ability.mult
|
||||||
|
end'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''local ret = self.ability.perma_mult or 0
|
||||||
|
if self.ability.effect == "Lucky Card" then
|
||||||
|
if pseudorandom('lucky_mult') < G.GAME.probabilities.normal/5 then
|
||||||
|
self.lucky_trigger = true
|
||||||
|
ret = ret + self.ability.mult
|
||||||
|
end
|
||||||
|
else
|
||||||
|
ret = ret + self.ability.mult
|
||||||
|
end
|
||||||
|
-- TARGET: get_chip_mult
|
||||||
|
return ret'''
|
||||||
|
|
||||||
|
# Card:get_chip_x_mult
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''if self.ability.x_mult <= 1 then return 0 end
|
||||||
|
return self.ability.x_mult'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''local ret = SMODS.multiplicative_stacking(self.ability.x_mult or 1, self.ability.perma_x_mult or 0)
|
||||||
|
-- TARGET: get_chip_x_mult
|
||||||
|
return ret
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Card:get_chip_h_mult
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'return self.ability.h_mult'
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''local ret = (self.ability.h_mult or 0) + (self.ability.perma_h_mult or 0)
|
||||||
|
-- TARGET: get_chip_h_mult
|
||||||
|
return ret
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Card:get_chip_h_x_mult
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'return self.ability.h_x_mult'
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''local ret = SMODS.multiplicative_stacking(self.ability.h_x_mult or 1, self.ability.perma_h_x_mult or 0)
|
||||||
|
-- TARGET: get_chip_h_x_mult
|
||||||
|
return ret
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Card:get_chip_x_bonus
|
||||||
|
# Card:get_chip_h_bonus
|
||||||
|
# Card:get_chip_h_x_bonus
|
||||||
|
# Card:get_h_dollars
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'function Card:get_edition()'
|
||||||
|
position = "before"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
function Card:get_chip_x_bonus()
|
||||||
|
if self.debuff then return 0 end
|
||||||
|
local ret = SMODS.multiplicative_stacking(self.ability.x_chips or 1, self.ability.perma_x_chips or 0)
|
||||||
|
-- TARGET: get_chip_x_bonus
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
function Card:get_chip_h_bonus()
|
||||||
|
if self.debuff then return 0 end
|
||||||
|
local ret = (self.ability.h_chips or 0) + (self.ability.perma_h_chips or 0)
|
||||||
|
-- TARGET: get_chip_h_bonus
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
function Card:get_chip_h_x_bonus()
|
||||||
|
if self.debuff then return 0 end
|
||||||
|
local ret = SMODS.multiplicative_stacking(self.ability.h_x_chips or 1, self.ability.perma_h_x_chips or 0)
|
||||||
|
-- TARGET: get_chip_h_x_bonus
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
function Card:get_h_dollars()
|
||||||
|
if self.debuff then return 0 end
|
||||||
|
local ret = (self.ability.h_dollars or 0) + (self.ability.perma_h_dollars or 0)
|
||||||
|
-- TARGET: get_h_dollars
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Card:get_p_dollars
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''end
|
||||||
|
if ret > 0 then
|
||||||
|
G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + ret'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''elseif self.ability.p_dollars < 0 then
|
||||||
|
ret = ret + self.ability.p_dollars
|
||||||
|
end
|
||||||
|
ret = ret + (self.ability.perma_p_dollars) or 0
|
||||||
|
-- TARGET: get_p_dollars
|
||||||
|
if ret ~= 0 then
|
||||||
|
G.GAME.dollar_buffer = (G.GAME.dollar_buffer or 0) + ret'''
|
||||||
|
|
||||||
|
# Card:get_end_of_round_effect
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
if self.ability.h_dollars > 0 then
|
||||||
|
ret.h_dollars = self.ability.h_dollars
|
||||||
|
ret.card = self
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local h_dollars = self:get_h_dollars()
|
||||||
|
if h_dollars ~= 0 then
|
||||||
|
ret.h_dollars = h_dollars
|
||||||
|
ret.card = self
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
times = 1
|
302
Steamodded/lovely/playing_card.toml
Normal file
302
Steamodded/lovely/playing_card.toml
Normal file
|
@ -0,0 +1,302 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Playing Card API
|
||||||
|
|
||||||
|
# Game:init_game_object()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = 'function Game:init_game_object()'
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local cards_played = {}
|
||||||
|
for _,v in ipairs(SMODS.Rank.obj_buffer) do
|
||||||
|
cards_played[v] = { suits = {}, total = 0 }
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = '(?<indent>[\t ]*)cards_played = \{\n(.*\n){13}[\t ]*\},'
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
cards_played = cards_played,
|
||||||
|
disabled_suits = {},
|
||||||
|
disabled_ranks = {},'''
|
||||||
|
|
||||||
|
# Game:start_run()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = 'local _ = nil'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "if self.GAME.starting_params.erratic_suits_and_ranks then _, k = pseudorandom_element(G.P_CARDS, pseudoseed('erratic')) end"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''if self.GAME.starting_params.erratic_suits_and_ranks then
|
||||||
|
v, k = pseudorandom_element(G.P_CARDS, pseudoseed('erratic'), {starting_deck = true})
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = 'local _r, _s = string.sub(k, 3, 3), string.sub(k, 1, 1)'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = 'local _r, _s = SMODS.Ranks[v.value].card_key, SMODS.Suits[v.suit].card_key'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "if self.GAME.starting_params.no_faces and (_r == 'K' or _r == 'Q' or _r == 'J') then keep = false end"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
if self.GAME.starting_params.no_faces and SMODS.Ranks[v.value].face then keep = false end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "if keep then card_protos[#card_protos+1] = {s=_s,r=_r,e=_e,d=_d,g=_g} end"
|
||||||
|
position = "after"
|
||||||
|
payload = "::continue::"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# loc_colour()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = 'return G.ARGS.LOC_COLOURS[_c] or _default or G.C.UI.TEXT_DARK'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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.Gradient.obj_buffer) do
|
||||||
|
G.ARGS.LOC_COLOURS[v:lower()] = SMODS.Gradients[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'''
|
||||||
|
|
||||||
|
# get_flush()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = '(?<indent>[\t ]*)local suits = \{\n[\t ]*"Spades",\n[\t ]*"Hearts",\n[\t ]*"Clubs",\n[\t ]*"Diamonds"\n[\t ]*\}\n[\t ]*if #hand > 5 or (?<restcond>#hand < \(5 - \(four_fingers and 1 or 0\)\) then return ret else)'
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
local suits = SMODS.Suit.obj_buffer
|
||||||
|
if $restcond'''
|
||||||
|
|
||||||
|
# get_X_same()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = 'local vals = {{},{},{},{},{},{},{},{},{},{},{},{},{},{}}'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local vals = {}
|
||||||
|
for i = 1, SMODS.Rank.max_id.value do
|
||||||
|
vals[i] = {}
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = 'function get_X_same(num, hand)'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''function get_X_same(num, hand, or_more)'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = 'if #curr == num then'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''if or_more and (#curr >= num) or (#curr == num) then'''
|
||||||
|
|
||||||
|
# Card:get_nominal()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'function Card:get_nominal\(mod\)\n([\t ]+.*\n)*end'
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Card:set_base()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if self.base.value == '2' then self.base.nominal = 2; self.base.id = 2(\n[\t ]+elseif .*)*"
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
local rank = SMODS.Ranks[self.base.value] or {}
|
||||||
|
self.base.nominal = rank.nominal or 0
|
||||||
|
self.base.face_nominal = rank.face_nominal or 0
|
||||||
|
self.base.id = rank.id'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if self.base.suit == 'Diamonds' then self.base.suit_nominal = 0.01; self.base.suit_nominal_original = suit_base_nominal_original or 0.001 (\n[\t ]+elseif .*)*"
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
local suit = SMODS.Suits[self.base.suit] or {}
|
||||||
|
self.base.suit_nominal = suit.suit_nominal or 0
|
||||||
|
self.base.suit_nominal_original = suit_base_nominal_original or suit.suit_nominal or 0'''
|
||||||
|
|
||||||
|
# Card:change_suit()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)local new_code = [\\s\\S]*?local new_val = [\\s\\S]*?local new_card = G.P_CARDS\\[new_code..new_val\\]"
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
local new_code = SMODS.Suits[new_suit].card_key
|
||||||
|
local new_val = SMODS.Ranks[self.base.value].card_key
|
||||||
|
local new_card = G.P_CARDS[new_code..'_'..new_val]'''
|
||||||
|
|
||||||
|
# Card:is_face()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)if id == 11 or id == 12 or id == 13 or next\\(find_joker\\(\"Pareidolia\"\\)\\) then"
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
local rank = SMODS.Ranks[self.base.value]
|
||||||
|
if not id then return end
|
||||||
|
if (id > 0 and rank and rank.face) or next(find_joker("Pareidolia")) then'''
|
||||||
|
|
||||||
|
|
||||||
|
# tally_sprite()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '(?<start>[\t ]*local t_s = Sprite\(0,0,0.5,0.5,)G.ASSET_ATLAS\[.*?\](?<rest>.*?\))'
|
||||||
|
position = 'at'
|
||||||
|
payload = '$start G.ASSET_ATLAS[suit and SMODS.Suits[suit][G.SETTINGS.colourblind_option and "hc_ui_atlas" or "lc_ui_atlas"]] or G.ASSET_ATLAS[("ui_"..(G.SETTINGS.colourblind_option and "2" or "1"))]$rest'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = 'function tally_sprite(pos, value, tooltip)'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = 'function tally_sprite(pos, value, tooltip, suit)'
|
||||||
|
|
||||||
|
# G.UIDEF.challenge_description_tab()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = "(?<indent>[\t ]*)local SUITS = \\{(\n.*){5}\n[\t ]*local suit_map = \\{'S', 'H', 'C', 'D'\\}"
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = 'local _r, _s = string.sub(k, 3, 3), string.sub(k, 1, 1)'
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = 'local _r, _s = SMODS.Ranks[v.value].card_key, SMODS.Suits[v.suit].card_key'
|
||||||
|
|
||||||
|
# TODO there may need to be a way to let in_pool know what challenge is being displayed
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = 'local keep, _e, _d, _g = true, nil, nil, nil'
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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, rank = v.value}) then
|
||||||
|
keep = false
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '(?<indent>[\t ]*)for j = 1, 4 do\n[\t ]*(?<mid>if SUITS\[suit_map\[j\]\]\[1\] then\n[\t ]*table.sort.*(\n.*)*?)\n[\t ]*0\.42\*G.CARD_H,'
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
local num_suits = 0
|
||||||
|
for j = 1, #suit_map do
|
||||||
|
if SUITS[suit_map[j]][1] then num_suits = num_suits + 1 end
|
||||||
|
end
|
||||||
|
for j = 1, #suit_map do
|
||||||
|
$mid
|
||||||
|
(0.42 - (num_suits <= 4 and 0 or num_suits >= 8 and 0.28 or 0.07 * (num_suits - 4))) * G.CARD_H,'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = '--Fill all remaining info if this is the main desc'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''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
|
||||||
|
end
|
||||||
|
|
||||||
|
'''
|
60
Steamodded/lovely/poker_hand.toml
Normal file
60
Steamodded/lovely/poker_hand.toml
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
### Poker Hand API
|
||||||
|
|
||||||
|
# evaluate_poker_hand()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "local parts = {"
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
for _,v in ipairs(SMODS.PokerHand.obj_buffer) do
|
||||||
|
results[v] = {}
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "if next(parts._5) and next(parts._flush) then"
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "return results"
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
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
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
185
Steamodded/lovely/pool.toml
Normal file
185
Steamodded/lovely/pool.toml
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Functions that affect random selection from pools
|
||||||
|
|
||||||
|
# pseudorandom_element()
|
||||||
|
# TODO special cases for now
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "function pseudorandom_element(_t, seed)"
|
||||||
|
position = "at"
|
||||||
|
payload = """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
|
||||||
|
"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "keys[#keys+1] = {k = k,v = v}"
|
||||||
|
position = "at"
|
||||||
|
payload = """
|
||||||
|
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, 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
|
||||||
|
if keep then
|
||||||
|
keys[#keys+1] = {k = k,v = v}
|
||||||
|
end"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# fixes pseudorandom_element on an empty list
|
||||||
|
# nil, nil is returned in that case
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "local key = keys[math.random(#keys)].k"
|
||||||
|
position = "before"
|
||||||
|
payload = "if #keys == 0 then return nil, nil end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
## get_current_pool()
|
||||||
|
|
||||||
|
# Centers
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "else _starting_pool, _pool_key = G.P_CENTER_POOLS[_type], _type..(_append or '')"
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
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 '')'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "if _type == 'Tarot' or _type == 'Tarot_Planet' then _pool[#_pool + 1] = \"c_strength\""
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
elseif _type == 'Tarot' or _type == 'Tarot_Planet' then _pool[#_pool + 1] = "c_strength"'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "if v.name == 'Black Hole' or v.name == 'The Soul' then"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = "if v.name == 'Black Hole' or v.name == 'The Soul' or v.hidden then"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "if _type == 'Enhanced' then"
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
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 })
|
||||||
|
end
|
||||||
|
pool_opts = pool_opts or {}
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = 'elseif not (G.GAME.used_jokers[v.key] and not next(find_joker("Showman"))) and'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''elseif not (G.GAME.used_jokers[v.key] and not pool_opts.allow_duplicates and not next(find_joker("Showman"))) and'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "if add and not G.GAME.banned_keys[v.key] then"
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
if v.in_pool and type(v.in_pool) == 'function' then
|
||||||
|
add = in_pool and (add or pool_opts.override_base_checks)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
## G.GAME.used_jokers now checks keys, not names
|
||||||
|
# Card:set_ability()
|
||||||
|
# Remove the old center from `used_jokers` if set_ability overrides
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "self.config.center = center"
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
if old_center and not next(SMODS.find_card(old_center.key, true)) then
|
||||||
|
G.GAME.used_jokers[old_center.key] = nil
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)for k, v in pairs\(G\.P_CENTERS\) do
|
||||||
|
[\t ]*if v\.name == self\.ability\.name then
|
||||||
|
[\t ]*G\.GAME\.used_jokers\[k\] = true
|
||||||
|
[\t ]*end
|
||||||
|
[\t ]*end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if self.config.center.key then
|
||||||
|
G.GAME.used_jokers[self.config.center.key] = true
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
line_prepend = "$indent"
|
||||||
|
# Card:remove()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)for k, v in pairs\(G\.P_CENTERS\) do
|
||||||
|
[\t ]*if v\.name == self\.ability\.name then
|
||||||
|
[\t ]*if not next\(find_joker\(self\.ability\.name, true\)\) then
|
||||||
|
[\t ]*G\.GAME\.used_jokers\[k\] = nil
|
||||||
|
[\t ]*end
|
||||||
|
[\t ]*end
|
||||||
|
[\t ]*end'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
if not next(SMODS.find_card(self.config.center.key, true)) then
|
||||||
|
G.GAME.used_jokers[self.config.center.key] = nil
|
||||||
|
end'''
|
||||||
|
line_prepend = "$indent"
|
61
Steamodded/lovely/rarity.toml
Normal file
61
Steamodded/lovely/rarity.toml
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Rarity API
|
||||||
|
|
||||||
|
# get_badge_colour
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = 'return G.BADGE_COL[key] or {1, 0, 0, 1}'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
for k, v in pairs(SMODS.Rarity.obj_buffer) do
|
||||||
|
G.BADGE_COL[k] = G.C.RARITY[v]
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# G.UIDEF.card_h_popup
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "if AUT.card_type == 'Joker' or (AUT.badges and AUT.badges.force_rarity) then card_type = ({localize('k_common'), localize('k_uncommon'), localize('k_rare'), localize('k_legendary')})[card.config.center.rarity] end"
|
||||||
|
position = "at"
|
||||||
|
payload = "if AUT.card_type == 'Joker' or (AUT.badges and AUT.badges.force_rarity) then card_type = SMODS.Rarity:get_rarity_badge(card.config.center.rarity) end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Game:update
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "self.C.EDITION[2] = 0.7+0.2*(1+math.sin(self.TIMERS.REAL*1.5 + 6))"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
for k, v in pairs(SMODS.Rarities) do
|
||||||
|
if v.gradient and type(v.gradient) == "function" then v:gradient(dt) end
|
||||||
|
end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# get_current_pool
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)local rarity = _rarity or pseudorandom\('rarity'\.\.G\.GAME\.round_resets\.ante\.\.\(_append or ''\)\) \n[\s\S]{12}rarity = \(_legendary and 4\) or \(rarity > 0\.95 and 3\) or \(rarity > 0\.7 and 2\) or 1'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
_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 ''))
|
||||||
|
'''
|
||||||
|
|
||||||
|
## Ensure that other cards set to string rarity work the same as set for int rarity
|
||||||
|
# Card:calculate_joker
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Baseball Card' and context.other_joker.config.center.rarity == 2 and self ~= context.other_joker then"
|
||||||
|
position = "at"
|
||||||
|
payload = '''if self.ability.name == 'Baseball Card' and (context.other_joker.config.center.rarity == 2 or context.other_joker.config.center.rarity == "Uncommon") and self ~= context.other_joker then'''
|
||||||
|
match_indent = true
|
224
Steamodded/lovely/seal.toml
Normal file
224
Steamodded/lovely/seal.toml
Normal file
|
@ -0,0 +1,224 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Seal API
|
||||||
|
# Card:open()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)local seal_rate = 10
|
||||||
|
[\n\t ]*local seal_poll = pseudorandom\(pseudoseed\('stdseal'..G.GAME.round_resets.ante\)\)
|
||||||
|
[\n\t ]*if seal_poll > 1 - 0.02\*seal_rate then
|
||||||
|
[\n\t ]*local seal_type = pseudorandom\(pseudoseed\('stdsealtype'..G.GAME.round_resets.ante\)\)
|
||||||
|
[\n\t ]*if seal_type > 0.75 then card:set_seal\('Red'\)
|
||||||
|
[\n\t ]*elseif seal_type > 0.5 then card:set_seal\('Blue'\)
|
||||||
|
[\n\t ]*elseif seal_type > 0.25 then card:set_seal\('Gold'\)
|
||||||
|
[\n\t ]*else card:set_seal\('Purple'\)
|
||||||
|
[\n\t ]*end
|
||||||
|
[\n\t ]*end'''
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
card:set_seal(SMODS.poll_seal({mod = 10}))'''
|
||||||
|
|
||||||
|
# Card:calculate_joker()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)local seal_type = pseudorandom\(pseudoseed\('certsl'\)\)
|
||||||
|
[\n\t ]*if seal_type > 0.75 then _card:set_seal\('Red', true\)
|
||||||
|
[\n\t ]*elseif seal_type > 0.5 then _card:set_seal\('Blue', true\)
|
||||||
|
[\n\t ]*elseif seal_type > 0.25 then _card:set_seal\('Gold', true\)
|
||||||
|
[\n\t ]*else _card:set_seal\('Purple', true\)
|
||||||
|
[\n\t ]*end'''
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''_card:set_seal(SMODS.poll_seal({guaranteed = true, type_key = 'certsl'}))'''
|
||||||
|
|
||||||
|
# get_badge_colour()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = 'return G.BADGE_COL[key] or {1, 0, 0, 1}'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
for k, v in pairs(SMODS.Seals) do
|
||||||
|
G.BADGE_COL[k:lower()..'_seal'] = v.badge_colour
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Card:calculate_seal()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'function Card:calculate_seal\(context\)\n(?<indent>[\t ]*)if self.debuff then return nil end'
|
||||||
|
position = 'after'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
if not o.card then o.card = self end
|
||||||
|
return o
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Card:update()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = 'if G.STAGE == G.STAGES.RUN then'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
local obj = G.P_SEALS[self.seal] or {}
|
||||||
|
if obj.update and type(obj.update) == 'function' then
|
||||||
|
obj:update(self, dt)
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Card:get_p_dollars()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)if (?<cond>self\.seal == 'Gold' then\n)'''
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
local obj = G.P_SEALS[self.seal] or {}
|
||||||
|
if obj.get_p_dollars and type(obj.get_p_dollars) == 'function' then
|
||||||
|
ret = ret + obj:get_p_dollars(self)
|
||||||
|
elseif $cond'''
|
||||||
|
|
||||||
|
# generate_card_ui()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "if v == 'gold_seal'*"
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
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'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = "if v == 'purple_seal'*"
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
payload = 'end'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''\{key = (?<badge>'.*?_seal'), set = 'Other'\}'''
|
||||||
|
payload = '''G.P_SEALS[$badge] or G.P_SEALS[SMODS.Seal.badge_to_key[$badge] or '']'''
|
||||||
|
|
||||||
|
# Card:update_alert()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "function Card:update_alert()"
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
if self.ability.set == 'Default' and self.config.center and self.config.center.key == 'c_base' and self.seal then
|
||||||
|
if G.P_SEALS[self.seal].alerted and self.children.alert then
|
||||||
|
self.children.alert:remove()
|
||||||
|
self.children.alert = nil
|
||||||
|
elseif not G.P_SEALS[self.seal].alerted and not self.children.alert and G.P_SEALS[self.seal].discovered then
|
||||||
|
self.children.alert = UIBox{
|
||||||
|
definition = create_UIBox_card_alert(),
|
||||||
|
config = {align="tli",
|
||||||
|
offset = {x = 0.1, y = 0.1},
|
||||||
|
parent = self}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# Card:hover()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "G:save_progress()"
|
||||||
|
match_indent = false
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
elseif self.children.alert and self.seal and not G.P_SEALS[self.seal].alerted then
|
||||||
|
G.P_SEALS[self.seal].alerted = true
|
||||||
|
G:save_progress()'''
|
||||||
|
|
||||||
|
# Game:init_item_prototypes()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'game.lua'
|
||||||
|
pattern = '''(?<indent>[\t ]*)Gold =[ {A-z=1-4,"}\n]*},[\n\t ]*}'''
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
Red = {order = 1, discovered = false, set = "Seal"},
|
||||||
|
Blue = {order = 2, discovered = false, set = "Seal"},
|
||||||
|
Gold = {order = 3, discovered = false, set = "Seal"},
|
||||||
|
Purple = {order = 4, discovered = false, set = "Seal"},
|
||||||
|
}
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Card:set_seal()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '''G.CONTROLLER.locks.seal = true'''
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''local sound = G.P_SEALS[_seal].sound or {sound = 'gold_seal', per = 1.2, vol = 0.4}'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '''play_sound('gold_seal', 1.2, 0.4)'''
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''play_sound(sound.sound, sound.per, sound.vol)'''
|
||||||
|
## Populate Seal Ability Table
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '''self.seal = _seal'''
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = '''new_card:set_seal(other.seal, true)'''
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
237
Steamodded/lovely/shop.toml
Normal file
237
Steamodded/lovely/shop.toml
Normal file
|
@ -0,0 +1,237 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
# Set defaults
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
pattern = '''
|
||||||
|
erratic_suits_and_ranks = false,
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
boosters_in_shop = 2,
|
||||||
|
vouchers_in_shop = 1,
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Allow booster count to be controlled by G.GAME.modifiers.extra_boosters
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
for i = 1, 2 do
|
||||||
|
G.GAME.current_round.used_packs = G.GAME.current_round.used_packs or {}
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
for i=1, G.GAME.starting_params.boosters_in_shop + (G.GAME.modifiers.extra_boosters or 0) do
|
||||||
|
G.GAME.current_round.used_packs = G.GAME.current_round.used_packs or {}
|
||||||
|
'''
|
||||||
|
# Custom deck functionality
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'back.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
pattern = '''
|
||||||
|
if self.effect.config.no_interest then
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
if self.effect.config.boosters_in_shop then
|
||||||
|
G.GAME.starting_params.boosters_in_shop = self.effect.config.boosters_in_shop
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Allow voucher count to be controlled by G.GAME.modifiers.extra_vouchers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
if G.GAME.current_round.voucher and G.P_CENTERS[G.GAME.current_round.voucher] then
|
||||||
|
local card = Card(G.shop_vouchers.T.x + G.shop_vouchers.T.w/2,
|
||||||
|
G.shop_vouchers.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS[G.GAME.current_round.voucher],{bypass_discovery_center = true, bypass_discovery_ui = true})
|
||||||
|
card.shop_voucher = true
|
||||||
|
create_shop_card_ui(card, 'Voucher', G.shop_vouchers)
|
||||||
|
card:start_materialize()
|
||||||
|
G.shop_vouchers:emplace(card)
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
local vouchers_to_spawn = 0
|
||||||
|
for _,_ in pairs(G.GAME.current_round.voucher.spawn) do vouchers_to_spawn = vouchers_to_spawn + 1 end
|
||||||
|
if vouchers_to_spawn < G.GAME.starting_params.vouchers_in_shop + (G.GAME.modifiers.extra_vouchers or 0) then
|
||||||
|
SMODS.get_next_vouchers(G.GAME.current_round.voucher)
|
||||||
|
end
|
||||||
|
for _, key in ipairs(G.GAME.current_round.voucher or {}) do
|
||||||
|
if G.P_CENTERS[key] and G.GAME.current_round.voucher.spawn[key] then
|
||||||
|
SMODS.add_voucher_to_shop(key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
# Modify generating vouchers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/state_events.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
G.GAME.current_round.voucher = get_next_voucher_key()
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
G.GAME.current_round.voucher = SMODS.get_next_vouchers()
|
||||||
|
'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
self.GAME.current_round.voucher = G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_voucher or get_next_voucher_key()
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
local forced_voucher = (G.SETTINGS.tutorial_progress or {}).forced_voucher
|
||||||
|
self.GAME.current_round.voucher = forced_voucher and {forced_voucher, spawn = {[forced_voucher] = true }} or SMODS.get_next_vouchers()
|
||||||
|
'''
|
||||||
|
# Stop redeeming vouchers deleting the table of vouchers
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
if self.shop_voucher then G.GAME.current_round.voucher = nil end
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
if self.shop_voucher then G.GAME.current_round.voucher.spawn[self.config.center_key] = false end
|
||||||
|
if self.from_tag then G.GAME.current_round.voucher.spawn[G.GAME.current_round.voucher[1]] = false end
|
||||||
|
'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
G.GAME.current_round.voucher = nil
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
--G.GAME.current_round.voucher = nil
|
||||||
|
'''
|
||||||
|
# Add voucher restock message
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
if (G.shop_vouchers and G.shop_vouchers.cards and (G.shop_vouchers.cards[1] or G.GAME.current_round.voucher)) then
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
if (G.shop_vouchers and G.shop_vouchers.cards and G.shop_vouchers.cards[1]) then
|
||||||
|
'''
|
||||||
|
# Maintain voucher tag jank interaction
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'tag.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
pattern = '''
|
||||||
|
create_shop_card_ui(card, 'Voucher', G.shop_vouchers)
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
card.from_tag = true
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Free Rerolls
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/state_events.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
local chaos = find_joker('Chaos the Clown')
|
||||||
|
G.GAME.current_round.free_rerolls = #chaos
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
G.GAME.current_round.free_rerolls = G.GAME.round_resets.free_rerolls
|
||||||
|
'''
|
||||||
|
# G.GAME.round_resets.free_rerolls
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'game.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
pattern = '''
|
||||||
|
reroll_cost = 1,
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
free_rerolls = 0,
|
||||||
|
'''
|
||||||
|
# Adjust Chaos the Clown
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
G.GAME.current_round.free_rerolls = G.GAME.current_round.free_rerolls + 1
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
SMODS.change_free_rerolls(1)
|
||||||
|
'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = '''
|
||||||
|
G.GAME.current_round.free_rerolls = G.GAME.current_round.free_rerolls - 1
|
||||||
|
'''
|
||||||
|
payload = '''
|
||||||
|
SMODS.change_free_rerolls(-1)
|
||||||
|
'''
|
||||||
|
|
||||||
|
## Shop Card Area Width
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''G.GAME.shop.joker_max*1.02*G.CARD_W,'''
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''math.min(G.GAME.shop.joker_max*1.02*G.CARD_W,4.08*G.CARD_W),'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
pattern = '''G.shop_jokers.T.w = G.GAME.shop.joker_max*1.01*G.CARD_W'''
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''G.shop_jokers.T.w = math.min(G.GAME.shop.joker_max*1.02*G.CARD_W,4.08*G.CARD_W)'''
|
||||||
|
|
||||||
|
# for some reason shop_voucher is not saved/loaded so... that's what's gonna happen
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''ability = self.ability,'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
shop_voucher = self.shop_voucher,
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# water is wet
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = '''self.ability = cardTable.ability'''
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
self.shop_voucher = cardTable.shop_voucher
|
||||||
|
'''
|
||||||
|
match_indent = true
|
167
Steamodded/lovely/sound.toml
Normal file
167
Steamodded/lovely/sound.toml
Normal file
|
@ -0,0 +1,167 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
#modulate_sound()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = 'G.SOUND_MANAGER.channel:push(G.ARGS.push)'
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
SMODS.previous_track = SMODS.previous_track or ''
|
||||||
|
local in_sync = (SMODS.Sounds[desired_track] or {}).sync
|
||||||
|
local out_sync = (SMODS.Sounds[SMODS.previous_track] or {}).sync
|
||||||
|
local should_sync = true
|
||||||
|
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
|
||||||
|
then
|
||||||
|
G.ARGS.push.type = 'restart_music'
|
||||||
|
G.SOUND_MANAGER.channel:push(G.ARGS.push)
|
||||||
|
end
|
||||||
|
SMODS.previous_track = desired_track'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = 'G.ARGS.push.ambient_control = G.SETTINGS.ambient_control'
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
pattern = "(G.STATE == G.STATES.SPLASH and '') or"
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
payload = 'SMODS.Sound:get_current_music() or'
|
||||||
|
|
||||||
|
# PLAY_SOUND
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/sound_manager.lua'
|
||||||
|
pattern = '''local s = {sound = love.audio.newSource("resources/sounds/"..args.sound_code..'.ogg', should_stream and "stream" or 'static')}'''
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
local c = SMODS_Sounds[args.sound_code]
|
||||||
|
local s = c and
|
||||||
|
{sound = love.audio.newSource(love.sound.newDecoder(c.data), c.should_stream and 'stream' or 'static'), per = c.per, vol = c.vol } or
|
||||||
|
{sound = love.audio.newSource("resources/sounds/"..args.sound_code..'.ogg', should_stream and "stream" or 'static')}'''
|
||||||
|
|
||||||
|
# pass in custom sounds
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/sound_manager.lua'
|
||||||
|
pattern = "DISABLE_SFX = false"
|
||||||
|
match_indent = true
|
||||||
|
position = 'after'
|
||||||
|
payload = '''
|
||||||
|
SMODS_Sounds = {}
|
||||||
|
'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/sound_manager.lua'
|
||||||
|
pattern = "elseif request.type == 'stop' then"
|
||||||
|
match_indent = true
|
||||||
|
position = 'before'
|
||||||
|
payload = '''
|
||||||
|
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] = {}
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/sound_manager.lua'
|
||||||
|
pattern = "s.original_pitch = args.per or 1"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = 's.original_pitch = ((args.type ~= "sound") and s.per) or args.per or 1'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/sound_manager.lua'
|
||||||
|
pattern = "s.original_volume = args.vol or 1"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = 's.original_volume = ((args.type ~= "sound") and s.vol) or args.vol or 1'
|
||||||
|
|
||||||
|
# don't crash RESTART_MUSIC
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/sound_manager.lua'
|
||||||
|
pattern = "RESTART_MUSIC()"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = 'RESTART_MUSIC(request)'
|
||||||
|
|
||||||
|
# fix looping for music of different length
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'engine/sound_manager.lua'
|
||||||
|
pattern = """(?<indent>[\t ]*)function MODULATE\\(args\\)(\n.*){9}"""
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'at'
|
||||||
|
payload = """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
|
||||||
|
"""
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/sound_manager.lua'
|
||||||
|
pattern = "for _, s in pairs(v) do"
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
payload = """current_track = args.desired_track
|
||||||
|
for _, s in pairs(v) do"""
|
||||||
|
|
||||||
|
# [[patches]]
|
||||||
|
# [patches.pattern]
|
||||||
|
# target = 'engine/sound_manager.lua'
|
||||||
|
# pattern = 'if s.sound and not s.sound:isPlaying() then'
|
||||||
|
# match_indent = true
|
||||||
|
# position = 'at'
|
||||||
|
# payload = '''if s.sound and s.sound:isPlaying() then
|
||||||
|
# s.sound:stop()
|
||||||
|
# elseif s.sound and not s.sound:isPlaying() then'''
|
190
Steamodded/lovely/stake.toml
Normal file
190
Steamodded/lovely/stake.toml
Normal file
|
@ -0,0 +1,190 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
# Fix areas where highest stake is hardcoded as Gold Stake
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "if G.PROFILES[G.SETTINGS.profile].all_unlocked then max_stake = 8 end"
|
||||||
|
position = "at"
|
||||||
|
payload = "if G.PROFILES[G.SETTINGS.profile].all_unlocked then max_stake = #G.P_CENTER_POOLS['Stake'] end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "for i = 1, math.min(max_stake+1, 8) do"
|
||||||
|
position = "at"
|
||||||
|
payload = "for i = 1, math.min(max_stake+1, #G.P_CENTER_POOLS['Stake']) do"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "if G.GAME.stake >= 8 then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if G.GAME.stake >= #G.P_CENTER_POOLS['Stake'] then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Stake modifier API
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "if self.GAME.stake >= 2 then"
|
||||||
|
position = "before"
|
||||||
|
payload = "if false then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "if self.GAME.stake >= 8 then self.GAME.modifiers.enable_rentals_in_shop = true end"
|
||||||
|
position = "after"
|
||||||
|
payload = "end SMODS.setup_stake(self.GAME.stake)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Stake shininess API
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = "if _stake == 8 then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if G.P_CENTER_POOLS['Stake'][_stake].shiny then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Override stake listing to make room for our recursive version
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "for i = G.GAME.stake-1, 2, -1 do"
|
||||||
|
position = "before"
|
||||||
|
payload = "if false then"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = 'other_col = {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.L_BLACK}, nodes=stake_desc_rows}'
|
||||||
|
position = "before"
|
||||||
|
payload = "end SMODS.applied_stakes_UI(G.GAME.stake, stake_desc_rows)"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Set win stake to that specified in unlocked stake
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'for i = 1, G.GAME.stake do'
|
||||||
|
position = "at"
|
||||||
|
payload = '''for i = 1,
|
||||||
|
(G.P_CENTER_POOLS["Stake"][G.GAME.stake].unlocked_stake) and
|
||||||
|
(G.P_STAKES[G.P_CENTER_POOLS["Stake"][G.GAME.stake].unlocked_stake].stake_level-1) or (G.GAME.stake-1)
|
||||||
|
do'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Stake Sprites
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'local stake_sprite = Sprite(0,0,_scale*1,_scale*1,G.ASSET_ATLAS["chips"], G.P_CENTER_POOLS.Stake[_stake].pos)'
|
||||||
|
position = "at"
|
||||||
|
payload = 'local stake_sprite = Sprite(0,0,_scale*1,_scale*1,G.ASSET_ATLAS[G.P_CENTER_POOLS.Stake[_stake].atlas], G.P_CENTER_POOLS.Stake[_stake].pos)'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Achievements and unlocks
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = 'if highest_win >= 2 then'
|
||||||
|
position = "at"
|
||||||
|
payload = 'if highest_win >= G.P_STAKES["stake_red"].stake_level then'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = 'if highest_win >= 4 then'
|
||||||
|
position = "at"
|
||||||
|
payload = 'if highest_win >= G.P_STAKES["stake_black"].stake_level then'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = 'if highest_win >= 8 then'
|
||||||
|
position = "at"
|
||||||
|
payload = 'if highest_win >= G.P_STAKES["stake_gold"].stake_level then'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# get_blind_amount
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'function get_blind_amount(ante)'
|
||||||
|
position = "after"
|
||||||
|
payload = '''if G.GAME.modifiers.scaling and G.GAME.modifiers.scaling > 3 then return SMODS.get_blind_amount(ante) end'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# set_joker_usage
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] = {count = 1, order = v.config.center.order, wins = {}, losses = {}}'
|
||||||
|
position = "at"
|
||||||
|
payload = 'G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] = {count = 1, order = v.config.center.order, wins = {}, losses = {}, wins_by_key = {}, losses_by_key = {}}'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# set_joker_win
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] = G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] or {count = 1, order = v.config.center.order, wins = {}, losses = {}}'
|
||||||
|
position = "at"
|
||||||
|
payload = 'G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] = G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key] or {count = 1, order = v.config.center.order, wins = {}, losses = {}, wins_by_key = {}, losses_by_key = {}}'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
#set_joker_win
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins[G.GAME.stake] = (G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins[G.GAME.stake] or 0) + 1'
|
||||||
|
position = "after"
|
||||||
|
payload = 'G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins_by_key[SMODS.stake_from_index(G.GAME.stake)] = (G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].wins_by_key[SMODS.stake_from_index(G.GAME.stake)] or 0) + 1'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
#set_joker_loss
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses[G.GAME.stake] = (G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses[G.GAME.stake] or 0) + 1'
|
||||||
|
position = "after"
|
||||||
|
payload = 'G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses_by_key[SMODS.stake_from_index(G.GAME.stake)] = (G.PROFILES[G.SETTINGS.profile].joker_usage[v.config.center_key].losses_by_key[SMODS.stake_from_index(G.GAME.stake)] or 0) + 1'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# set_deck_usage
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] = {count = 1, order = G.GAME.selected_back.effect.center.order, wins = {}, losses = {}}'
|
||||||
|
position = "at"
|
||||||
|
payload = 'G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] = {count = 1, order = G.GAME.selected_back.effect.center.order, wins = {}, losses = {}, wins_by_key = {}, losses_by_key = {}}'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# set_deck_loss
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/misc_functions.lua"
|
||||||
|
pattern = 'if not G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] = {count = 1, order = G.GAME.selected_back.effect.center.order, wins = {}, losses = {}} end'
|
||||||
|
position = "at"
|
||||||
|
payload = 'if not G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] then G.PROFILES[G.SETTINGS.profile].deck_usage[deck_key] = {count = 1, order = G.GAME.selected_back.effect.center.order, wins = {}, losses = {}, wins_by_key = {}, losses_by_key = {}} end'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.UIDEF.viewed_stake_option
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = 'G.viewed_stake = math.min(max_stake+1, G.viewed_stake)'
|
||||||
|
position = "after"
|
||||||
|
payload = '''if G.viewed_stake > #G.P_CENTER_POOLS.Stake then G.viewed_stake = #G.P_CENTER_POOLS.Stake end'''
|
||||||
|
match_indent = true
|
111
Steamodded/lovely/sticker.toml
Normal file
111
Steamodded/lovely/sticker.toml
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Sticker API
|
||||||
|
|
||||||
|
# generate_UIBox_ability_table()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.sticker or ((self.sticker_run and self.sticker_run~='NONE') and G.SETTINGS.run_stake_stickers) then loc_vars = loc_vars or {}; loc_vars.sticker=(self.sticker or self.sticker_run) end"
|
||||||
|
position = "before"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
for k, v in ipairs(SMODS.Sticker.obj_buffer) do
|
||||||
|
if self.ability[v] and not SMODS.Stickers[v].hide_badge then
|
||||||
|
badges[#badges+1] = v
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
|
||||||
|
# generate_card_ui()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if v == 'eternal' then*"
|
||||||
|
match_indent = true
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
local sticker = SMODS.Stickers[v]
|
||||||
|
if sticker then
|
||||||
|
local t = { key = v, set = 'Other' }
|
||||||
|
local res = {}
|
||||||
|
if sticker.loc_vars and type(sticker.loc_vars) == 'function' then
|
||||||
|
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'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if v == 'rental' then*"
|
||||||
|
match_indent = true
|
||||||
|
position = "after"
|
||||||
|
payload = '''end'''
|
||||||
|
|
||||||
|
# create_card()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if card.ability.consumeable and not skip_materialize then card:start_materialize() end"
|
||||||
|
position = "after"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
for k, v in ipairs(SMODS.Sticker.obj_buffer) do
|
||||||
|
local sticker = SMODS.Stickers[v]
|
||||||
|
if sticker.should_apply and type(sticker.should_apply) == 'function' and sticker:should_apply(card, center, area) then
|
||||||
|
sticker:apply(card, true)
|
||||||
|
end
|
||||||
|
end'''
|
||||||
|
|
||||||
|
## Remove base game sticker rolls if one is added
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if G.GAME.modifiers.enable_eternals_in_shop and eternal_perishable_poll > 0.7 then"
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''if G.GAME.modifiers.enable_eternals_in_shop and eternal_perishable_poll > 0.7 and not SMODS.Stickers["eternal"].should_apply then'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif G.GAME.modifiers.enable_perishables_in_shop and ((eternal_perishable_poll > 0.4) and (eternal_perishable_poll <= 0.7)) then"
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''elseif G.GAME.modifiers.enable_perishables_in_shop and ((eternal_perishable_poll > 0.4) and (eternal_perishable_poll <= 0.7)) and not SMODS.Stickers["perishable"].should_apply then'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if G.GAME.modifiers.enable_rentals_in_shop and pseudorandom((area == G.pack_cards and 'packssjr' or 'ssjr')..G.GAME.round_resets.ante) > 0.7 then"
|
||||||
|
position = "at"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''if G.GAME.modifiers.enable_rentals_in_shop and pseudorandom((area == G.pack_cards and 'packssjr' or 'ssjr')..G.GAME.round_resets.ante) > 0.7 and not SMODS.Stickers["rental"].should_apply then'''
|
||||||
|
|
||||||
|
# get_badge_colour()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = 'return G.BADGE_COL[key] or {1, 0, 0, 1}'
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
for k, v in pairs(SMODS.Stickers) do
|
||||||
|
G.BADGE_COL[k] = v.badge_colour
|
||||||
|
end'''
|
||||||
|
|
||||||
|
## Remove Pinned effect when in Sticker collections
|
||||||
|
# CardArea:aling_cards
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'cardarea.lua'
|
||||||
|
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)'''
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''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)'''
|
139
Steamodded/lovely/tag.toml
Normal file
139
Steamodded/lovely/tag.toml
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Tag API
|
||||||
|
# Tag:apply_to_run()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = "function Tag:apply_to_run(_context)"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Tag:set_ability()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = "function Tag:set_ability()"
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
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
|
||||||
|
'''
|
||||||
|
|
||||||
|
# create_UIBox_your_collection_tags()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = "(?<indent>[\t ]*)local tag_matrix = \\{(\n.*){6}"
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
local tag_matrix = {}
|
||||||
|
local counter = 0
|
||||||
|
local tag_tab = {}
|
||||||
|
local tag_pool = {}
|
||||||
|
if G.ACTIVE_MOD_UI then
|
||||||
|
for k, v in pairs(G.P_TAGS) do
|
||||||
|
if v.mod and G.ACTIVE_MOD_UI.id == v.mod.id then tag_pool[k] = v end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
tag_pool = G.P_TAGS
|
||||||
|
end
|
||||||
|
for k, v in pairs(tag_pool) do
|
||||||
|
counter = counter + 1
|
||||||
|
tag_tab[#tag_tab+1] = v
|
||||||
|
end
|
||||||
|
for i = 1, math.ceil(counter / 6) do
|
||||||
|
table.insert(tag_matrix, {})
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)v\.children\.alert\.states\.collide\.can = false\n[\s\S]{8}end\n[\s\S]{8}return true\n[\s\S]{4}end\)\n[\s\S]{2}\}\)\)\n{3}'''
|
||||||
|
position = 'after'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''
|
||||||
|
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]})
|
||||||
|
end'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''(?<indent>[\t ]*)\{\n[\s\S]{10}\{n=G\.UIT\.R, config=\{align = "cm"\}, nodes=tag_matrix\[1\]},[\s\S]*tag_matrix\[4\]\},\n[\s\S]{8}\}'''
|
||||||
|
position = 'at'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
payload = '''table_nodes'''
|
||||||
|
|
||||||
|
# Tag:generate_UI()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = 'G.ASSET_ATLAS\["tags"\]'
|
||||||
|
position = 'at'
|
||||||
|
payload = 'G.ASSET_ATLAS[(not self.hide_ability) and G.P_TAGS[self.key].atlas or "tags"]'
|
||||||
|
|
||||||
|
# Tag:get_uibox_table()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = '''function Tag:get_uibox_table(tag_sprite)'''
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''function Tag:get_uibox_table(tag_sprite, vars_only)'''
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "tag.lua"
|
||||||
|
pattern = '''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))'''
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''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)'''
|
||||||
|
|
||||||
|
# generate_card_ui()
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "elseif _c.set == 'Tag' then"
|
||||||
|
position = "after"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''specific_vars = specific_vars or Tag.get_uibox_table({ name = _c.name, config = _c.config, ability = { orbital_hand = '['..localize('k_poker_hand')..']' }}, nil, true)
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Prevent Boss Tag from crashing when triggered at a bad time
|
||||||
|
# by quietly rerolling it if blind select UI is not there
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "G.FUNCS.reroll_boss = function(e)"
|
||||||
|
position = "after"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''if not G.blind_select_opts then
|
||||||
|
G.GAME.round_resets.boss_rerolled = true
|
||||||
|
if not G.from_boss_tag then ease_dollars(-10) 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'''
|
30
Steamodded/lovely/threads.toml
Normal file
30
Steamodded/lovely/threads.toml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
# Necessary to kill threads which lets us restart the game.
|
||||||
|
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -5
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/save_manager.lua"
|
||||||
|
pattern = "if request then"
|
||||||
|
position = "after"
|
||||||
|
payload = "if request.type == 'kill' then return end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/http_manager.lua"
|
||||||
|
pattern = "if request then"
|
||||||
|
position = "after"
|
||||||
|
payload = "if request.type == 'kill' then return end"
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/sound_manager.lua"
|
||||||
|
pattern = "if request then"
|
||||||
|
position = "after"
|
||||||
|
payload = "if request.type == 'kill' then return end"
|
||||||
|
match_indent = true
|
251
Steamodded/lovely/ui.toml
Normal file
251
Steamodded/lovely/ui.toml
Normal file
|
@ -0,0 +1,251 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
### Addition Tab
|
||||||
|
|
||||||
|
## Decks tab
|
||||||
|
# create_UIBox_your_collection_decks()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''G.GAME.viewed_back = Back(G.P_CENTERS.b_red)'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local deck_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Back)
|
||||||
|
G.GAME.viewed_back = Back(G.ACTIVE_MOD_UI and deck_pool[1] or G.P_CENTERS.b_red)'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# create_UIBox_your_collection_decks()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''(?<indent>[\t ]*)for k, v in ipairs\(G\.P_CENTER_POOLS\.Back\) do\n[\s\S]{4}ordered_names\[#ordered_names\+1\] = v\.name\n[\s\S]{2}end'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
for k, v in ipairs(deck_pool) do
|
||||||
|
ordered_names[#ordered_names+1] = v.key
|
||||||
|
end'''
|
||||||
|
line_prepend = '$indent'
|
||||||
|
|
||||||
|
# create_UIBox_your_collection_decks()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/UI_definitions.lua"
|
||||||
|
pattern = '''local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = {'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''local t = create_UIBox_generic_options({ back_func = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id or 'your_collection', contents = {'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNCS.your_collection_deck_page
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = '''G.GAME.viewed_back:change_to(G.P_CENTER_POOLS.Back[args.to_key])'''
|
||||||
|
position = "at"
|
||||||
|
payload = '''
|
||||||
|
local deck_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Back)
|
||||||
|
G.GAME.viewed_back:change_to(deck_pool[args.to_key])'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# create_UIBox_your_collection()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''(?<indent>[\t ]*)UIBox_button\(\{button = 'your_collection_blinds', label = \{localize\('b_blinds'\)\}, count = G\.DISCOVER_TALLIES\.blinds, minw = 5, minh = 2.0, id = 'your_collection_blinds', focus_args = \{snap_to = true\}\}\),'''
|
||||||
|
position = 'after'
|
||||||
|
payload = '''UIBox_button({button = 'your_collection_other_gameobjects', label = {localize('k_other')}, minw = 5, id = 'your_collection_other_gameobjects', focus_args = {snap_to = true}}),'''
|
||||||
|
|
||||||
|
# Fix UIElement.config.chosen being overriden if choice=true is set
|
||||||
|
# UIElement:click()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/ui.lua"
|
||||||
|
match_indent = true
|
||||||
|
position = "after"
|
||||||
|
pattern = "if self.config.choice then"
|
||||||
|
payload = " local chosen_temp = self.config.chosen"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "engine/ui.lua"
|
||||||
|
match_indent = true
|
||||||
|
position = "at"
|
||||||
|
pattern = "self.config.chosen = true"
|
||||||
|
payload = "self.config.chosen = chosen_temp or true"
|
||||||
|
|
||||||
|
# Escape from mod menu saves config
|
||||||
|
# Needs to be before all checks
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/controller.lua'
|
||||||
|
pattern = "function Controller:key_press_update(key, dt)"
|
||||||
|
position = "after"
|
||||||
|
payload = '''
|
||||||
|
if key == "escape" and G.ACTIVE_MOD_UI then
|
||||||
|
G.FUNCS.exit_mods()
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
position = 'before'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
pattern = '''
|
||||||
|
(?<indent>[\t ]*)return \{n=G\.UIT\.ROOT, config = \{align = 'cm', colour = G\.C\.CLEAR\}, nodes=\{
|
||||||
|
[\t ]*\{n=G\.UIT\.C,'''
|
||||||
|
payload = '''
|
||||||
|
local cols
|
||||||
|
if #info_boxes <= 3 then
|
||||||
|
cols = 1
|
||||||
|
elseif #info_boxes <= 10 then
|
||||||
|
cols = 2
|
||||||
|
elseif #info_boxes <= 24 then
|
||||||
|
cols = 3
|
||||||
|
else
|
||||||
|
cols = 4
|
||||||
|
end
|
||||||
|
local nodes_per_col = math.ceil(#info_boxes/cols)
|
||||||
|
local info_cols = {}
|
||||||
|
for i = 0, cols-1 do
|
||||||
|
local col = {}
|
||||||
|
for j = 1, nodes_per_col do
|
||||||
|
local info_box = info_boxes[i*nodes_per_col+j]
|
||||||
|
if info_box then
|
||||||
|
table.insert(col, info_box)
|
||||||
|
else break end
|
||||||
|
end
|
||||||
|
table.insert(info_cols, {n=G.UIT.C, config = {align="cm"}, nodes = col})
|
||||||
|
end
|
||||||
|
info_boxes = {{n=G.UIT.R, config = {align="cm", padding = 0.05, card_pos = card.T.x }, nodes = info_cols}}
|
||||||
|
'''
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = "config = {offset = {x=-0.03,y=0}, align = 'cl', parent = e}"
|
||||||
|
payload = """config = (not e.config.ref_table or not e.config.ref_table[1].config.card_pos or e.config.ref_table[1].config.card_pos > G.ROOM.T.w*0.4) and
|
||||||
|
{offset = {x=-0.03,y=0}, align = 'cl', parent = e} or
|
||||||
|
{offset = {x=0.03,y=0}, align = 'cr', parent = e}"""
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'tag.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = "_self.config.h_popup_config ={align = 'cl', offset = {x=-0.1,y=0},parent = _self}"
|
||||||
|
payload = """_self.config.h_popup_config = (_self.T.x > G.ROOM.T.w*0.4) and
|
||||||
|
{align = 'cl', offset = {x=-0.1,y=0},parent = _self} or
|
||||||
|
{align = 'cr', offset = {x=0.1,y=0},parent = _self}"""
|
||||||
|
|
||||||
|
# desc_from_rows
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
position = 'at'
|
||||||
|
pattern = 'colour = empty and G\.C\.CLEAR or G\.C\.UI\.BACKGROUND_WHITE'
|
||||||
|
payload = 'colour = desc_nodes.background_colour or empty and G.C.CLEAR or G.C.UI.BACKGROUND_WHITE'
|
||||||
|
|
||||||
|
# info_tip_from_rows
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
position = 'at'
|
||||||
|
pattern = 'padding = 0\.05, colour = G\.C\.WHITE\}'
|
||||||
|
payload = 'padding = 0.05, colour = desc_nodes.background_colour or G.C.WHITE}'
|
||||||
|
|
||||||
|
# localize
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
position = 'after'
|
||||||
|
pattern = '\(part\.control\.C and loc_colour\(part\.control\.C\)\)'
|
||||||
|
payload = ' or args.text_colour'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
position = 'at'
|
||||||
|
pattern = 'loc_colour\(part\.control\.C or nil, args\.default_col\)'
|
||||||
|
payload = 'not part.control.C and args.text_colour or loc_colour(part.control.C or nil, args.default_col)'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
position = 'after'
|
||||||
|
pattern = 'part\.control\.s and tonumber\(part\.control\.s\)'
|
||||||
|
payload = ' or args.scale '
|
||||||
|
|
||||||
|
# set_discover_tallies()
|
||||||
|
# exclude no_collection objects
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = "if not v.omit then"
|
||||||
|
payload = "if not v.omit and not v.no_collection then"
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
line_prepend = '$indent'
|
||||||
|
position = 'at'
|
||||||
|
pattern = '(?<indent>[\t ]*)(?<start>for _, v in pairs\(G\.P_[BT].*)(?<rest>(\n.*){7})'
|
||||||
|
payload = '''$start
|
||||||
|
if not v.no_collection then
|
||||||
|
$rest
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
#set_alerts()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/common_events.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = "if v.discovered and not v.alerted then"
|
||||||
|
payload = "if v.discovered and not v.alerted and not v.no_collection then"
|
||||||
|
|
||||||
|
## Description controls
|
||||||
|
# localize
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = 'final_line[#final_line+1] = {n=G.UIT.O, config={'
|
||||||
|
payload = '''
|
||||||
|
final_line[#final_line+1] = {n=G.UIT.C, config={align = "m", colour = part.control.B and args.vars.colours[tonumber(part.control.B)] or part.control.X and loc_colour(part.control.X) or nil, r = 0.05, padding = 0.03, res = 0.15}, nodes={}}
|
||||||
|
final_line[#final_line].nodes[1] = {n=G.UIT.O, config={
|
||||||
|
'''
|
||||||
|
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = 'elseif part.control.X then'
|
||||||
|
payload = 'elseif part.control.X or part.control.B then'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
position = 'at'
|
||||||
|
pattern = 'colour = loc_colour\(part.control.X\)'
|
||||||
|
payload = 'colour = part.control.B and args.vars.colours[tonumber(part.control.B)] or loc_colour(part.control.X)'
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/misc_functions.lua'
|
||||||
|
match_indent = true
|
||||||
|
position = 'at'
|
||||||
|
pattern = 'colour = loc_colour(part.control.C or nil),'
|
||||||
|
payload = 'colour = part.control.V and args.vars.colours[tonumber(part.control.V)] or loc_colour(part.control.C or nil),'
|
130
Steamodded/lovely/ui_elements.toml
Normal file
130
Steamodded/lovely/ui_elements.toml
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = -10
|
||||||
|
|
||||||
|
## colour argument fix
|
||||||
|
# create_tabs()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''tab_buttons[#tab_buttons+1] = UIBox_button({id = 'tab_but_'..(v.label or ''), ref_table = v, button = 'change_tab', label = {v.label}, minh = 0.8*args.scale, minw = 2.5*args.scale, col = true, choice = true, scale = args.text_scale, chosen = v.chosen, func = v.func, focus_args = {type = 'none'}})'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''tab_buttons[#tab_buttons+1] = UIBox_button({id = 'tab_but_'..(v.label or ''), ref_table = v, button = 'change_tab', label = {v.label}, minh = 0.8*args.scale, minw = 2.5*args.scale, col = true, choice = true, scale = args.text_scale, chosen = v.chosen, func = v.func, colour = args.colour, focus_args = {type = 'none'}})'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# UIElement:draw_self()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'engine/ui.lua'
|
||||||
|
pattern = '''love.graphics.polygon("fill", get_chosen_triangle_from_rect(self.layered_parallax.x, self.layered_parallax.y, self.VT.w*G.TILESIZE, self.VT.h*G.TILESIZE, self.config.chosen == 'vert'))'''
|
||||||
|
position = 'before'
|
||||||
|
payload = '''love.graphics.setColor(self.config.colour)'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
|
||||||
|
## multiple text input fix
|
||||||
|
# create_text_input()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''args.current_prompt_text = '''''
|
||||||
|
position = 'after'
|
||||||
|
payload = '''args.id = args.id or "text_input"'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''ui_letters[#ui_letters+1] = {n=G.UIT.T, config={ref_table = args, ref_value = 'current_prompt_text', scale = args.text_scale, colour = lighten(copy_table(args.colour), 0.4), id = 'prompt'}}'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''ui_letters[#ui_letters+1] = {n=G.UIT.T, config={ref_table = args, ref_value = 'current_prompt_text', scale = args.text_scale, colour = lighten(copy_table(args.colour), 0.4), id = args.id..'_prompt'}}'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''ui_letters[i] = {n=G.UIT.T, config={ref_table = text.letters, ref_value = i, scale = args.text_scale, colour = G.C.UI.TEXT_LIGHT, id = 'letter_'..i}}'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''ui_letters[i] = {n=G.UIT.T, config={ref_table = text.letters, ref_value = i, scale = args.text_scale, colour = G.C.UI.TEXT_LIGHT, id = args.id..'_letter_'..i}}'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''ui_letters[#ui_letters+1] = {n=G.UIT.B, config={r = 0.03,w=0.1, h=0.4, colour = position_text_colour, id = 'position', func = 'flash'}}'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''ui_letters[#ui_letters+1] = {n=G.UIT.B, config={r = 0.03,w=0.1, h=0.4, colour = position_text_colour, id = args.id..'_position', func = 'flash'}}'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''{n=G.UIT.C, config={align = "cm", draw_layer = 1, colour = G.C.CLEAR}, nodes = {'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''{n=G.UIT.C, config={align = "cm", colour = G.C.CLEAR}, nodes = {'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/UI_definitions.lua'
|
||||||
|
pattern = '''{n=G.UIT.C, config={id = 'text_input', align = "cm", padding = 0.05, r = 0.1, draw_layer = 2, hover = true, colour = args.colour,minw = args.w, min_h = args.h, button = 'select_text_input', shadow = true}, nodes={'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''{n=G.UIT.C, config={id = args.id, align = "cm", padding = 0.05, r = 0.1, hover = true, colour = args.colour,minw = args.w, min_h = args.h, button = 'select_text_input', shadow = true}, nodes={'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNCS.select_text_input
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = '''G.CONTROLLER.text_input_hook = e.children[1].children[1]'''
|
||||||
|
position = 'after'
|
||||||
|
payload = '''G.CONTROLLER.text_input_id = e.config.id'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNCS.paste_seed
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = '''G.CONTROLLER.text_input_hook = e.UIBox:get_UIE_by_ID('text_input').children[1].children[1]'''
|
||||||
|
position = 'after'
|
||||||
|
payload = """G.CONTROLLER.text_input_id = 'text_input'"""
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# G.FUNCS.flash
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = '''if G.CONTROLLER.text_input_hook then'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''if G.CONTROLLER.text_input_hook and G.CONTROLLER.text_input_id == e.config.id:sub(1,string.len(G.CONTROLLER.text_input_id)) then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# TRANSPOSE_TEXT_INPUT()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = '''if hook.children[i].config.id == 'position' then'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''if hook.children[i].config.id == G.CONTROLLER.text_input_id..'_position' then'''
|
||||||
|
match_indent = true
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = '''local real_letter = hook.children[position_child+dir].config.id:sub(1, 7) == 'letter_' and hook.children[position_child+dir].config.text ~= '''''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''local real_letter = hook.children[position_child+dir].config.id:sub(1, 8+string.len(G.CONTROLLER.text_input_id)) == G.CONTROLLER.text_input_id..'_letter_' and hook.children[position_child+dir].config.text ~= '''''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# GET_TEXT_FROM_INPUT()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = '''if hook.children[i].config and hook.children[i].config.id:sub(1, 7) == 'letter_' and hook.children[i].config.text ~= '' then'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''if hook.children[i].config and hook.children[i].config.id:sub(1, 8+string.len(G.CONTROLLER.text_input_id)) == G.CONTROLLER.text_input_id..'_letter_' and hook.children[i].config.text ~= '' then'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# remove hardcoded shop selection limit
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "cardarea.lua"
|
||||||
|
pattern = "if self.highlighted[1] then"
|
||||||
|
position = "at"
|
||||||
|
payload = "if #self.highlighted >= self.config.highlighted_limit then"
|
||||||
|
match_indent = true
|
90
UnStable-main/lovely/Card.toml
Normal file
90
UnStable-main/lovely/Card.toml
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 0
|
||||||
|
|
||||||
|
# Fix the nominal sorting (Suit for high ranks)
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '''if mod == 'suit' (.*)'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
if mod == 'suit' then mult = 30000 end'''
|
||||||
|
|
||||||
|
# Fix the nominal sorting (For low ranks)
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '''return 10\*self.base.nominal\*rank_mult(.*)'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''
|
||||||
|
--Temporary fix so the card with the lowest nominal can still be sorted properly
|
||||||
|
local nominal = self.base.nominal
|
||||||
|
|
||||||
|
if self.base.value == 'unstb_???' then
|
||||||
|
nominal = 0.3
|
||||||
|
elseif nominal < 0.4 then
|
||||||
|
nominal = 0.31 + nominal*0.1
|
||||||
|
end
|
||||||
|
|
||||||
|
--Hardcode this so it's sorted properly
|
||||||
|
if self.base.value == 'unstb_161' then
|
||||||
|
nominal = 30
|
||||||
|
end
|
||||||
|
|
||||||
|
return 10*(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'''
|
||||||
|
|
||||||
|
|
||||||
|
# Adds ability text for decimal ranks
|
||||||
|
# function generate_card_ui()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "if main_end then"
|
||||||
|
position = "before"
|
||||||
|
match_indent = true
|
||||||
|
payload = """
|
||||||
|
local isCollection = (card and card.area and card.area.config.collection) or false
|
||||||
|
if not isCollection and (_c.set == 'Default' or _c.set == 'Enhanced') and card and card.base and card.base.value and SMODS.Ranks[card.base.value].is_decimal and not card.config.center.no_rank and not card.debuff then
|
||||||
|
local rank_act = SMODS.Ranks[card.base.value].rank_act or {'0', '0', '0'}
|
||||||
|
if rank_act[3] then
|
||||||
|
localize{type = 'other', key = 'decimal_rank_ability', nodes = desc_nodes, vars = {rank_act[1], rank_act[2], rank_act[3]}}
|
||||||
|
else
|
||||||
|
localize{type = 'other', key = 'decimal_rank_ability_2', nodes = desc_nodes, vars = {rank_act[1], rank_act[2]}}
|
||||||
|
end
|
||||||
|
end"""
|
||||||
|
|
||||||
|
# Adds 'No Chips' text for certain ranks
|
||||||
|
# function generate_card_ui()
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = "functions/common_events.lua"
|
||||||
|
pattern = "specific_vars.nominal_chips then \n(.*)"
|
||||||
|
position = "at"
|
||||||
|
payload = """
|
||||||
|
specific_vars.nominal_chips or (specific_vars.value == 'unstb_0' or specific_vars.value == 'unstb_???') then
|
||||||
|
if (specific_vars.value == 'unstb_0' or specific_vars.value == 'unstb_???') and not specific_vars.nominal_chips then
|
||||||
|
localize{type = 'other', key = 'no_chip', nodes = desc_nodes, vars = {}}
|
||||||
|
else
|
||||||
|
localize{type = 'other', key = 'card_chips', nodes = desc_nodes, vars = {specific_vars.nominal_chips}}
|
||||||
|
end
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Ranks unlocks from Booster Pack
|
||||||
|
# function generate_card_ui()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "functions/button_callbacks.lua"
|
||||||
|
pattern = "elseif card.ability.set == 'Enhanced' or card.ability.set == 'Default' then "
|
||||||
|
position = "after"
|
||||||
|
match_indent = true
|
||||||
|
payload = """
|
||||||
|
if G.STATE == G.STATES.STANDARD_PACK or G.STATE == G.STATES.SMODS_BOOSTER_OPENED then
|
||||||
|
local rank = card.base.value
|
||||||
|
--Check if it's UnStable rank, if so then flips the flag
|
||||||
|
if rank:find('unstb_') then
|
||||||
|
setPoolRankFlagEnable(rank, true);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
"""
|
21
UnStable-main/lovely/Consumable.toml
Normal file
21
UnStable-main/lovely/Consumable.toml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 0
|
||||||
|
|
||||||
|
# Auxiliary Cards undiscovered sprite, based on Polyminoes undiscovered sprite from Bunco
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = '''local shared_sprite = (self.ability.set == 'Edition' or self.ability.set == 'Joker') and G.shared_undiscovered_joker or G.shared_undiscovered_tarot'''
|
||||||
|
position = 'after'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
if not G.shared_undiscovered_auxiliary then G.shared_undiscovered_auxiliary = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS['unstb_auxiliary_undiscovered'], {x = 1, y = 0}) end
|
||||||
|
|
||||||
|
if self.ability.set == 'Auxiliary' then
|
||||||
|
shared_sprite = G.shared_undiscovered_auxiliary
|
||||||
|
end
|
||||||
|
|
||||||
|
'''
|
16
UnStable-main/lovely/Deck.toml
Normal file
16
UnStable-main/lovely/Deck.toml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 0
|
||||||
|
|
||||||
|
# Adds rank blacklist functionality for deck
|
||||||
|
# function generate_card_ui()
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "game.lua"
|
||||||
|
pattern = "if self.GAME.starting_params.no_faces and SMODS.Ranks[v.value].face then keep = false end"
|
||||||
|
position = "before"
|
||||||
|
match_indent = true
|
||||||
|
payload = """
|
||||||
|
if self.GAME.starting_params.blacklisted_ranks and self.GAME.starting_params.blacklisted_ranks[v.value] then keep = false end
|
||||||
|
"""
|
39
UnStable-main/lovely/Enhancement.toml
Normal file
39
UnStable-main/lovely/Enhancement.toml
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 0
|
||||||
|
|
||||||
|
# Adds triggers for destroyable enhancement after-play
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/state_events.lua'
|
||||||
|
pattern = '''-- context.remove_playing_cards calculations'''
|
||||||
|
position = 'before'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
for i=1, #scoring_hand do
|
||||||
|
if scoring_hand[i].config.center.after_play and not scoring_hand[i].debuff and not unstb_global.table_has_value(cards_destroyed, scoring_hand[i]) then
|
||||||
|
local effect = scoring_hand[i].config.center:after_play(scoring_hand[i], {scoring_hand = scoring_hand})
|
||||||
|
if effect and effect.to_destroy then
|
||||||
|
cards_destroyed[#cards_destroyed+1] = scoring_hand[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
|
||||||
|
# Enhancement Discard Overrides
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'functions/state_events.lua'
|
||||||
|
pattern = "draw_card(G.hand, G.discard, i*100/highlighted_count, 'down', false, G.hand.highlighted[i])"
|
||||||
|
position = 'at'
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
|
||||||
|
if G.hand.highlighted[i].config.center.discard_override and not G.hand.highlighted[i].debuff then
|
||||||
|
G.hand.highlighted[i].config.center:discard_override(G.hand.highlighted[i], {delay = i*100/highlighted_count})
|
||||||
|
else
|
||||||
|
draw_card(G.hand, G.discard, i*100/highlighted_count, 'down', false, G.hand.highlighted[i])
|
||||||
|
end
|
||||||
|
|
||||||
|
'''
|
82
UnStable-main/lovely/Joker.toml
Normal file
82
UnStable-main/lovely/Joker.toml
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 0
|
||||||
|
|
||||||
|
# Blueprint Compat Jokers Part 1
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "elseif self.ability.name == 'Blueprint' then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
elseif self.config.center.key == 'j_unstb_plagiarism' then
|
||||||
|
self.ability.blueprint_compat_ui_l = self.ability.blueprint_compat_ui_l or '';
|
||||||
|
self.ability.blueprint_compat_check_l = nil
|
||||||
|
|
||||||
|
self.ability.blueprint_compat_ui_r = self.ability.blueprint_compat_ui_r or '';
|
||||||
|
self.ability.blueprint_compat_check_r = nil
|
||||||
|
|
||||||
|
main_end = (self.area and self.area == G.jokers) and {
|
||||||
|
{n=G.UIT.C, config={align = "bm", minh = 0.4, padding = 0.06}, nodes={
|
||||||
|
{n=G.UIT.R, config={ref_table = self, align = "m", colour = G.C.JOKER_GREY, r = 0.05, padding = 0.06, func = 'blueprint_compat_dside_l'}, nodes={
|
||||||
|
{n=G.UIT.T, config={ref_table = self.ability, ref_value = 'blueprint_compat_ui_l',colour = G.C.UI.TEXT_LIGHT, scale = 0.32*0.8}},
|
||||||
|
}},
|
||||||
|
|
||||||
|
{n=G.UIT.R, config={ref_table = self, align = "m", colour = G.C.JOKER_GREY, r = 0.05, padding = 0.06, func = 'blueprint_compat_dside_r'}, nodes={
|
||||||
|
{n=G.UIT.T, config={ref_table = self.ability, ref_value = 'blueprint_compat_ui_r',colour = G.C.UI.TEXT_LIGHT, scale = 0.32*0.8}},
|
||||||
|
}}
|
||||||
|
}}
|
||||||
|
} or nil
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Blueprint Compat Jokers Part 2
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = "card.lua"
|
||||||
|
pattern = "if self.ability.name == 'Blueprint' or self.ability.name == 'Brainstorm' then"
|
||||||
|
position = "before"
|
||||||
|
payload = '''
|
||||||
|
if self.config.center.key == 'j_unstb_plagiarism' then
|
||||||
|
local other_joker_l = nil
|
||||||
|
local other_joker_r = nil
|
||||||
|
|
||||||
|
for i = 1, #G.jokers.cards do
|
||||||
|
if G.jokers.cards[i] == self then
|
||||||
|
other_joker_l = G.jokers.cards[i-1]
|
||||||
|
other_joker_r = G.jokers.cards[i+1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if other_joker_l and other_joker_l ~= self and other_joker_l.config.center.blueprint_compat then
|
||||||
|
self.ability.blueprint_compat_l = 'compatible'
|
||||||
|
else
|
||||||
|
self.ability.blueprint_compat_l = 'incompatible'
|
||||||
|
end
|
||||||
|
|
||||||
|
if other_joker_r and other_joker_r ~= self and other_joker_r.config.center.blueprint_compat then
|
||||||
|
self.ability.blueprint_compat_r = 'compatible'
|
||||||
|
else
|
||||||
|
self.ability.blueprint_compat_r = 'incompatible'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
'''
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
# Adds support for Virtual Money (used for IC Card)
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = '''G.GAME.dollars[ ]*-[ ]*G.GAME.bankrupt_at'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''G.GAME.dollars + (G.GAME.virtual_dollars or 0) - G.GAME.bankrupt_at'''
|
||||||
|
|
||||||
|
# Adds support for Virtual Money (used for IC Card)
|
||||||
|
# (Talisman Variant)
|
||||||
|
[[patches]]
|
||||||
|
[patches.regex]
|
||||||
|
target = 'functions/button_callbacks.lua'
|
||||||
|
pattern = '''to_big\(G.GAME.dollars\)[ ]*-[ ]*to_big\(G.GAME.bankrupt_at\)'''
|
||||||
|
position = 'at'
|
||||||
|
payload = '''to_big(G.GAME.dollars) + to_big(G.GAME.virtual_dollars or 0) - to_big(G.GAME.bankrupt_at)'''
|
15
UnStable-main/lovely/Seal.toml
Normal file
15
UnStable-main/lovely/Seal.toml
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
[manifest]
|
||||||
|
version = "1.0.0"
|
||||||
|
dump_lua = true
|
||||||
|
priority = 0
|
||||||
|
|
||||||
|
# Shiny Seal
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = 'card.lua'
|
||||||
|
pattern = "if self.seal == 'Gold' then G.shared_seals[self.seal]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) end"
|
||||||
|
position = "before"
|
||||||
|
match_indent = true
|
||||||
|
payload = '''
|
||||||
|
if SMODS.Seals[self.seal] and SMODS.Seals[self.seal].shiny then G.shared_seals[self.seal]:draw_shader('voucher', nil, self.ARGS.send_to_shader, nil, self.children.center) end
|
||||||
|
'''
|
0
lovely/hello
Normal file
0
lovely/hello
Normal file
Loading…
Reference in a new issue