Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
393e6ba
First classes and override target functions defined
AllUniversal Oct 15, 2025
7349f9f
Further patch/override targets identified
AllUniversal Oct 15, 2025
c39f930
Fixed incorrect logic
AllUniversal Oct 15, 2025
3066b16
`BlindTree.create_data` first iteration and some refactoring + more
AllUniversal Oct 16, 2025
b78d5a3
Merge remote-tracking branch 'upstream/main' into BalaTree
AllUniversal Oct 16, 2025
0687907
Added `evaluate_round` callback because I'll separate that from defea…
AllUniversal Oct 16, 2025
6be47b0
WIP `SMODS.CanvasContainer` and `SMODS.CanvasContainerUIE`
AllUniversal Oct 20, 2025
611f754
`SMODS.GameState` wip stuff and more
AllUniversal Oct 22, 2025
98b822b
Merge remote-tracking branch 'upstream/main' into BalaTree
AllUniversal Oct 28, 2025
4b5b96b
`SMODS.BLIND_TREE` save and load stuff + some callback functionality …
AllUniversal Oct 30, 2025
c22aaca
Merge remote-tracking branch 'upstream/main' into BalaTree
AllUniversal Oct 30, 2025
32eae55
Added `Blind:is_type()` and related + new `SMODS.get_new_blind()` fun…
AllUniversal Oct 31, 2025
7cb7917
Changed state functions to use a stack instead of a queue
AllUniversal Nov 1, 2025
e2b6366
Moved SMODS states `BOOSTER_OPENED` and `REDEEM_VOUCHER` into their o…
AllUniversal Nov 1, 2025
99e8f90
Moved a bunch of State stuff from base game / patches to `State:on_en…
AllUniversal Nov 1, 2025
897b45d
Added new `enter_blind_tree` callback
AllUniversal Nov 1, 2025
cc44e54
Merge remote-tracking branch 'upstream/main' into BalaTree
AllUniversal Nov 25, 2025
06d18c3
Rebranded to AntePath™️
AllUniversal Nov 25, 2025
0142d27
Merge remote-tracking branch 'upstream/main' into BalaTree
AllUniversal Dec 19, 2025
08ed9fe
Merge remote-tracking branch 'upstream/main' into BalaTree
AllUniversal Jan 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
97 changes: 58 additions & 39 deletions lovely/blind.toml
Original file line number Diff line number Diff line change
Expand Up @@ -390,44 +390,6 @@ if blind.collection_loc_vars and type(blind.collection_loc_vars) == 'function' t
end
local loc_target = localize(target)'''

# get_new_boss()
[[patches]]
[patches.pattern]
target = 'functions/common_events.lua'
pattern = '''
if not v.boss then

elseif not v.boss.showdown and (v.boss.min <= math.max(1, G.GAME.round_resets.ante) and ((math.max(1, G.GAME.round_resets.ante))%G.GAME.win_ante ~= 0 or G.GAME.round_resets.ante < 2)) then
eligible_bosses[k] = true
elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then
eligible_bosses[k] = true
end
'''
match_indent = true
position = 'at'
payload = '''
local res, options = SMODS.add_to_pool(v)
options = options or {}
if not v.boss then

elseif options.ignore_showdown_check then
eligible_bosses[k] = res and true or nil
elseif v.in_pool and type(v.in_pool) == 'function' then
if
(
((G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2) ==
(v.boss.showdown or false)
)
then
eligible_bosses[k] = res and true or nil
end
elseif not v.boss.showdown and (v.boss.min <= math.max(1, G.GAME.round_resets.ante) and ((math.max(1, G.GAME.round_resets.ante))%G.GAME.win_ante ~= 0 or G.GAME.round_resets.ante < 2)) then
eligible_bosses[k] = res and true or nil
elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then
eligible_bosses[k] = res and true or nil
end
'''

# G.UIDEF.challenge_description_tab
[[patches]]
[patches.pattern]
Expand Down Expand Up @@ -515,4 +477,61 @@ pattern = "local blindTable = {"
position = "after"
payload = '''
effect = self.effect,
'''
'''
### Account for changed Blind:get_type() function
# Blind.set_blind : Use new Blind:is_types()
[[patches]]
[patches.pattern]
target = "blind.lua"
match_indent = true
pattern = "if G.GAME.modifiers.no_blind_reward and G.GAME.modifiers.no_blind_reward[self:get_type()] then self.dollars = 0 end"
position = "at"
payload = '''if G.GAME.modifiers.no_blind_reward and self:is_types(G.GAME.modifiers.no_blind_reward) then self.dollars = 0 end'''
# game.lua : Game:start_run() : account for "Showdown" type with "no_reward" rule
[[patches]]
[patches.pattern]
target = "game.lua"
match_indent = true
pattern = "self.GAME.modifiers.no_blind_reward.Boss = true"
position = "after"
payload = '''self.GAME.modifiers.no_blind_reward.Showdown = true'''
# card.lua : Card:generate_UIBox_ability_table()
[[patches]]
[patches.pattern]
target = "game.lua"
match_indent = true
pattern = "local disableable = G.GAME.blind and ((not G.GAME.blind.disabled) and (G.GAME.blind:get_type() == 'Boss'))"
position = "at"
payload = '''local disableable = G.GAME.blind and ((not G.GAME.blind.disabled) and (G.GAME.blind:is_type("Boss")))'''
# card.lua : Card:calculate_joker() : Luchador !-- could be taken ownership of instead
[[patches]]
[patches.pattern]
target = "game.lua"
match_indent = true
pattern = "if G.GAME.blind and ((not G.GAME.blind.disabled) and (G.GAME.blind:get_type() == 'Boss')) then "
position = "at"
payload = '''if G.GAME.blind and ((not G.GAME.blind.disabled) and (G.GAME.blind:is_type("Boss"))) then '''
# functions/button_callbacks.lua : G.FUNCS.HUD_blind_reward()
[[patches]]
[patches.pattern]
target = "functions/button_callbacks.lua"
match_indent = true
pattern = "if G.GAME.modifiers.no_blind_reward and (G.GAME.blind and G.GAME.modifiers.no_blind_reward[G.GAME.blind:get_type()]) then"
position = "at"
payload = '''
if G.GAME.modifiers.no_blind_reward and (G.GAME.blind and blind:is_types(G.GAME.modifiers.no_blind_reward)) then
'''
# functions/state_events.lua : end_round()
[[patches]]
[patches.regex]
target = "functions/state_events.lua"
pattern = '''G\.GAME\.blind:get_type\(\) == 'Boss' '''
position = "at"
payload = '''G.GAME.blind:is_type("Boss") '''
# game.lua : Game:init_game_object()
[[patches]]
[patches.regex]
target = "game.lua"
pattern = '''if v.boss then bosses_used[k] = 0 end'''
position = "at"
payload = '''if SMODS.get_blind_types(blind_obj).Boss then bosses_used[k] = 0 end'''
28 changes: 28 additions & 0 deletions lovely/blind_tree.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = -5

# Game:start_run()
[[patches]]
[patches.pattern]
target = 'game.lua'
match_indent = true
position = 'at'
pattern = '''
self:prep_stage(G.STAGES.RUN, saveTable and saveTable.STATE or G.STATES.BLIND_SELECT)
'''
payload = '''
self:prep_stage(G.STAGES.RUN, saveTable and saveTable.STATE or SMODS.STATES.BLIND_SELECT)
'''
[[patches]]
[patches.pattern]
target = 'game.lua'
match_indent = true
position = 'at'
pattern = '''
self:prep_stage(G.STAGES.RUN, saveTable and saveTable.STATE or G.STATES.BLIND_SELECT)
'''
payload = '''
self:prep_stage(G.STAGES.RUN, saveTable and saveTable.STATE or SMODS.STATES.BLIND_SELECT)
'''
56 changes: 15 additions & 41 deletions lovely/booster.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ 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
G.STATE = SMODS.STATES.BOOSTER_OPENED
SMODS.OPENED_BOOSTER = self
end
G.GAME.pack_choices = math.min((self.ability.choose or self.config.center.config.choose or 1) + (G.GAME.modifiers.booster_choice_mod or 0), self.ability.extra and math.max(1, self.ability.extra + (G.GAME.modifiers.booster_size_mod or 0)) or self.config.center.extra and math.max(1, self.config.center.extra + (G.GAME.modifiers.booster_size_mod or 0)) or 1)
Expand Down Expand Up @@ -71,40 +71,14 @@ 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,
SMODS_REDEEM_VOUCHER = 998,'''
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'''
payload = '''(G.STATE == SMODS.STATES.BOOSTER_OPENED or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.STANDARD_PACK'''

# CardArea:draw()
[[patches]]
Expand All @@ -113,7 +87,7 @@ 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'''
(self.config.type == 'hand' and state == SMODS.STATES.BOOSTER_OPENED) or'''
match_indent = true

# G.FUNCS.use_card
Expand All @@ -123,7 +97,7 @@ 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'''
prev_state == SMODS.STATES.BOOSTER_OPENED or'''
match_indent = true

# CardArea:align_cards()
Expand All @@ -132,7 +106,7 @@ match_indent = true
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"
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 == SMODS.STATES.BOOSTER_OPENED) then"
match_indent = true

# CardArea:align_cards()
Expand All @@ -141,7 +115,7 @@ match_indent = true
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"
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 == SMODS.STATES.BOOSTER_OPENED) then"
match_indent = true

# Card:can_use_consumable()
Expand All @@ -150,7 +124,7 @@ match_indent = true
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"
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 == SMODS.STATES.BOOSTER_OPENED then"
match_indent = true

# G.FUNCS.use_card()
Expand All @@ -165,7 +139,7 @@ if nc then
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"""
if (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.PLANET_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == SMODS.STATES.BOOSTER_OPENED) then"""
match_indent = true

# G.FUNC.use_card()
Expand All @@ -185,7 +159,7 @@ 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'''
payload = '''if prev_state == SMODS.STATES.BOOSTER_OPENED and booster_obj.name:find('Arcana') then inc_career_stat('c_tarot_reading_used', 1) end'''

# G.FUNC.use_card()
[[patches]]
Expand All @@ -194,15 +168,15 @@ 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'''
payload = '''if prev_state == SMODS.STATES.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"
payload = "(G.STATE == SMODS.STATES.BOOSTER_OPENED and SMODS.STATES.BOOSTER_OPENED) or"
match_indent = true

# G.FUNC.use_card()
Expand All @@ -211,7 +185,7 @@ match_indent = true
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"
payload = "if not (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == SMODS.STATES.BOOSTER_OPENED) and"
match_indent = true

# Card:use_consumeable()
Expand All @@ -221,8 +195,8 @@ 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},'''
align = (G.STATE == G.STATES.TAROT_PACK or G.STATE == G.STATES.SPECTRAL_PACK or G.STATE == SMODS.STATES.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 == SMODS.STATES.BOOSTER_OPENED) and -0.2 or 0},'''
line_prepend = '$indent'

# G.FUNCS.use_card()
Expand Down Expand Up @@ -349,7 +323,7 @@ target = 'card.lua'
match_indent = true
position = 'after'
pattern = '''if self.shop_voucher then G.GAME.current_round.voucher = nil end'''
payload = '''G.STATE = G.STATES.SMODS_REDEEM_VOUCHER'''
payload = '''G.STATE = SMODS.STATES.REDEEM_VOUCHER'''

# G.FUNCS.use_card()
# Consumables in areas other than the consumable don't count
Expand Down
44 changes: 1 addition & 43 deletions lovely/compact_cashout.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,46 +20,4 @@ payload = '''
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

match_indent = true
2 changes: 1 addition & 1 deletion lovely/fixes.toml
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ target = 'functions/misc_functions.lua'
pattern = "function save_run()"
position = "after"
payload = """ 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.BUFFOON_PACK or G.STATE == G.STATES.STANDARD_PACK or G.STATE == G.STATES.SMODS_BOOSTER_OPENED then return end"""
or G.STATE == G.STATES.BUFFOON_PACK or G.STATE == G.STATES.STANDARD_PACK or G.STATE == SMODS.STATES.BOOSTER_OPENED then return end"""
match_indent = true

## Set `G.your_collection.config.collection` to true in all cases
Expand Down
31 changes: 31 additions & 0 deletions lovely/game_state.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
[manifest]
version = "1.0.0"
dump_lua = true
priority = -10


# game.lua : Game:update() : inject SMODS.GameStates
[[patches]]
[patches.pattern]
target = 'game.lua'
pattern = '''
if self.STATE == self.STATES.MENU then
self:update_menu(dt)
end
'''
position = 'after'
match_indent = true
payload = '''
if SMODS.GameStates[self.STATE] then
SMODS.GameStates[self.STATE]:update(dt)
end
'''

# functions/button_callbacks.lua : G.FUNCS.use_card() : update logic
[[patches]]
[patches.pattern]
target = 'functions/button_callbacks.lua'
pattern = '''if card.ability.set == 'Booster' and not nosave and G.STATE == G.STATES.SHOP then'''
position = 'at'
match_indent = true
payload = '''if card.ability.set == 'Booster' and not nosave and G.STATE == SMODS.STATES.SHOP then'''
Loading