486 lines
17 KiB
TOML
486 lines
17 KiB
TOML
[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
|
|
i = 1
|
|
while i <= #G.consumeables.cards do
|
|
G.consumeables.cards[i]:cry_calculate_consumeable_rental()
|
|
G.consumeables.cards[i]:cry_calculate_consumeable_perishable()
|
|
local gone = nil
|
|
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 = {G.hand.cards[i]:get_end_of_round_effect()}"
|
|
position = "after"
|
|
payload = '''
|
|
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
|
|
cry_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 - 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.extra then"
|
|
position = "at"
|
|
payload = "if ((SMODS.has_enhancement(scoring_hand[i], 'm_glass') and not scoring_hand[i].debuff and pseudorandom('glass') < G.GAME.probabilities.normal/scoring_hand[i].ability.extra) or (G.GAME.modifiers.cry_shatter_rate and pseudorandom('cry_shatter') < 1/G.GAME.modifiers.cry_shatter_rate)) and not scoring_hand[i].ability.eternal then"
|
|
match_indent = true
|
|
|
|
|
|
# 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 a.sort_id or 0) < b.T.x + b.T.w/2 - 100*(b.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); cry_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
|
|
[[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 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 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 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
|