[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.enabled["Menu"] then if Cryptid.enabled["M Jokers"] then local mcard = {} for k, _ in pairs(Cryptid.M_jokers) do if G.P_CENTERS[k] then mcard[#mcard + 1] = k end end local option = math.random(#mcard) local chosenoption = mcard[option] if chosenoption == "j_cry_biggestm" or chosenoption == "j_cry_reverse" then --These don't render properly; replace these with loopy instead 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_cry_loopy'],{bypass_discovery_center = true, bypass_discovery_ui = true}) else 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[chosenoption],{bypass_discovery_center = true, bypass_discovery_ui = true}) end else 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 end ''' match_indent = true # Make cards in splash screen CCD cards # Requires "Custom Main Menu" config to be enabled [[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.enabled["Menu"] then card:set_ability(get_random_consumable('cry_splash',{"no_grc"},nil,nil,true), true, nil) end ''' match_indent = true # Show Glitched Edition to confirm Cryptid is Active [[patches]] [patches.pattern] target = "game.lua" pattern = "replace_card.states.visible = false" position = "before" payload = "replace_card:set_edition(G.P_CENTERS.e_cry_glitched and 'e_cry_glitched' or 'e_negative',true,true)" 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 [[patches]] [patches.pattern] target = "card.lua" pattern = '''if not v.custom_draw and k ~= 'focused_ui' and k ~= "front" and k ~= "back" and k ~= "soul_parts" and k ~= "center" and k ~= 'floating_sprite' and k~= "shadow" and k~= "use_button" and k ~= 'buy_button' and k ~= 'buy_and_use_button' and k~= "debuff" and k ~= 'price' and k~= 'particles' and k ~= 'h_popup' then v:draw() end''' position = "at" payload = '''if not v.custom_draw and k ~= 'focused_ui' and k ~= "front" and k ~= "back" and k ~= "soul_parts" and k ~= "center" and k ~= 'floating_sprite' and k ~= 'floating_sprite2' and k~= "shadow" and k~= "use_button" and k ~= 'buy_button' and k ~= 'buy_and_use_button' and k~= "debuff" and k ~= 'price' and k~= 'particles' and k ~= 'h_popup' then v:draw() end''' 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 [[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 # 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 and not self.ability.name:find('Standard') 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 if self.ability.eternal then card.ability.eternal = self.ability.eternal end if self.ability.perishable then card.ability.perishable = self.ability.perishable end if self.ability.rental then card.ability.rental = self.ability.rental end if self.pinned then card.pinned = self.pinned end if self.ability.banana then card.ability.banana = self.ability.banana end ''' match_indent = true # catch edition code in standard pack to avoid reapplying edition (HORRIBLE) [[patches]] [patches.regex] target = "card.lua" pattern = '''local edition \= poll_edition\('standard_edition'\.\.G.GAME\.round_resets\.ante, edition_rate, true\)\n\s+card\:set_edition\(edition\)''' position = "at" payload = ''' local edi = self.edition or {} if edi.type and not (G.GAME.modifiers.cry_force_edition and G.GAME.modifiers.cry_force_edition ~= 'random') then card:set_edition({[edi.type] = true}) elseif not G.GAME.modifiers.cry_force_random_edition then local edition = poll_edition('standard_edition'..G.GAME.round_resets.ante, edition_rate, true) card:set_edition(edition) end ''' # Edition + sticker forcing on vouchers (editions are just funny cost increases) [[patches]] [patches.pattern] target = "game.lua" pattern = "G.shop_vouchers:emplace(card)" position = "before" payload = ''' if G.GAME.current_round.cry_voucher_edition then card:set_edition(G.GAME.current_round.cry_voucher_edition, true, true) end if G.GAME.current_round.cry_voucher_stickers then if G.GAME.current_round.cry_voucher_stickers.eternal == true then -- this is dumb but i'm not sure how to call functions from a string card:set_eternal(true) card.ability.eternal = true end if G.GAME.current_round.cry_voucher_stickers.perishable == true then card.ability.perishable = true end if G.GAME.current_round.cry_voucher_stickers.rental == true then card:set_rental(true) card.ability.rental = true end if G.GAME.current_round.cry_voucher_stickers.pinned == true then card.pinned = true end if G.GAME.current_round.cry_voucher_stickers.banana == true then card.ability.banana = true end end ''' match_indent = true # don't forget voucher tags [[patches]] [patches.pattern] target = "tag.lua" pattern = "G.shop_vouchers:emplace(card)" position = "before" payload = ''' if G.GAME.modifiers.cry_force_edition and not G.GAME.modifiers.cry_force_random_edition then card:set_edition(nil, true) elseif G.GAME.modifiers.cry_force_random_edition then local edition = cry_poll_random_edition() card:set_edition(edition, true) end if G.GAME.modifiers.cry_force_sticker == 'eternal' or G.GAME.modifiers.cry_sticker_sheet_plus then card:set_eternal(true) card.ability.eternal = true end if G.GAME.modifiers.cry_force_sticker == 'perishable' or G.GAME.modifiers.cry_sticker_sheet_plus then card:set_perishable(true) card.ability.perishable = true end if G.GAME.modifiers.cry_force_sticker == 'rental' or G.GAME.modifiers.cry_sticker_sheet_plus then card:set_rental(true) card.ability.rental = true end if G.GAME.modifiers.cry_force_sticker == 'pinned' or G.GAME.modifiers.cry_sticker_sheet_plus then card.pinned = true end if G.GAME.modifiers.cry_force_sticker == 'banana' or G.GAME.modifiers.cry_sticker_sheet_plus then card.ability.banana = true end if G.GAME.modifiers.cry_sticker_sheet_plus then for k, v in pairs(SMODS.Stickers) do if v.apply and not v.no_sticker_sheet then v:apply(card, true) end end end ''' match_indent = true # show owned vouchers [[patches]] [patches.pattern] target = "functions/UI_definitions.lua" pattern = "if G.GAME.used_vouchers[v.key] then" position = "after" payload = ''' if not G.GAME.cry_owned_vouchers[v.key] then G.GAME.cry_owned_vouchers[v.key] = G.GAME.used_vouchers[v.key] end end if G.GAME.cry_owned_vouchers[v.key] then ''' match_indent = true # show in voucher menu [[patches]] [patches.pattern] target = "functions/UI_definitions.lua" pattern = "voucher_areas[#voucher_areas]:emplace(card)" position = "before" payload = ''' if not G.GAME.voucher_edition_index then G.GAME.voucher_edition_index = {} end if G.GAME.voucher_edition_index[card.ability.name] then -- i just made it a function so i can look at it less local edition = cry_edition_to_table(G.GAME.voucher_edition_index[card.ability.name]) if edition then card:set_edition(edition, true, true) end end if G.GAME.voucher_sticker_index.eternal[card.ability.name] then card:set_eternal(true) card.ability.eternal = true end if G.GAME.voucher_sticker_index.perishable[card.ability.name] then card:set_perishable(true) card.ability.perish_tally = G.GAME.voucher_sticker_index.perishable[card.ability.name] card.ability.perishable = true if G.GAME.voucher_sticker_index.perishable[card.ability.name] == 0 then card.debuff = true end end if G.GAME.voucher_sticker_index.rental[card.ability.name] then card:set_rental(true) card.ability.rental = true end if G.GAME.voucher_sticker_index.pinned[card.ability.name] then card.pinned = true end if G.GAME.voucher_sticker_index.banana[card.ability.name] then card.ability.banana = true end card.ability.extra = G.GAME.cry_voucher_centers[card.config.center_key].config.extra if card.ability.extra_disp then card.ability.extra_disp = G.GAME.cry_voucher_centers[card.config.center_key].config.extra_disp end ''' match_indent = true # sticker tagging [[patches]] [patches.pattern] target = "card.lua" pattern = "if center_table.name == 'Overstock' or center_table.name == 'Overstock Plus' then" position = "before" payload = ''' if not G.GAME.voucher_edition_index then G.GAME.voucher_edition_index = {} end if self and self.edition then G.GAME.voucher_edition_index[center_table.name] = self.edition.type end if not G.GAME.voucher_sticker_index then G.GAME.voucher_sticker_index = {eternal = {}, perishable = {}, rental = {}, pinned = {}, banana = {}} end if self and self.ability and self.ability.eternal and self.ability.eternal == true then G.GAME.voucher_sticker_index.eternal[center_table.name] = true end if self and self.ability and self.ability.perishable and self.ability.perishable == true then G.GAME.voucher_sticker_index.perishable[center_table.name] = G.GAME.cry_voucher_perishable_rounds end if self and self.ability and self.ability.rental and self.ability.rental == true then G.GAME.voucher_sticker_index.rental[center_table.name] = true end if self and self.pinned and self.pinned == true then G.GAME.voucher_sticker_index.pinned[center_table.name] = true end if self and self.ability and self.ability.banana and self.ability.banana == true then G.GAME.voucher_sticker_index.banana[center_table.name] = true end ''' match_indent = true # apply end of round stuff [[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 = ''' if G.GAME.voucher_sticker_index then if G.GAME.voucher_sticker_index.perishable then for k, v in pairs(G.GAME.voucher_sticker_index.perishable) do if v > 1 then G.GAME.voucher_sticker_index.perishable[k] = v - 1 end if v == 1 then G.GAME.voucher_sticker_index.perishable[k] = v - 1 for kk, vv in pairs(G.P_CENTERS) do if k == vv.name then cry_debuff_voucher(kk) G.GAME.used_vouchers.vv = nil G.GAME.used_vouchers[kk] = nil break end end end end end if G.GAME.voucher_sticker_index.rental then local cumulative_rental = 0 for k, v in pairs(G.GAME.voucher_sticker_index.rental) do cumulative_rental = cumulative_rental + G.GAME.cry_voucher_rental_rate end if cumulative_rental > 0 then G.E_MANAGER:add_event(Event({ trigger = 'immediate', blocking = false, blockable = false, func = (function() ease_dollars(-cumulative_rental) return true end)})) end end if G.GAME.voucher_sticker_index.banana then -- i'm pretty sure unredeem breaks if spectrals are disabled? unsure though local voucher_queue = {} local current_round_voucher=G.GAME.current_round.voucher for k, v in pairs(G.GAME.voucher_sticker_index.banana) do if (pseudorandom('byebyevoucher') < G.GAME.probabilities.normal/G.GAME.cry_voucher_banana_odds) then area = G.play local unredeemed_voucher = '' for kk, vv in pairs(G.P_CENTERS) do if k == vv.name then unredeemed_voucher = kk break end end local card = create_card('Voucher', area, nil, nil, nil, nil, unredeemed_voucher) if G.GAME.voucher_edition_index[card.ability.name] then -- i made this bullshit a function local edition = cry_edition_to_table(G.GAME.voucher_edition_index[card.ability.name]) if edition then card:set_edition(edition, true, true) end end if G.GAME.voucher_sticker_index.eternal[card.ability.name] then card:set_eternal(true) card.ability.eternal = true end if G.GAME.voucher_sticker_index.perishable[card.ability.name] then card:set_perishable(true) card.ability.perish_tally = G.GAME.voucher_sticker_index.perishable[card.ability.name] card.ability.perishable = true if G.GAME.voucher_sticker_index.perishable[card.ability.name] == 0 then card.debuff = true end end if G.GAME.voucher_sticker_index.rental[card.ability.name] then card:set_rental(true) card.ability.rental = true end if G.GAME.voucher_sticker_index.pinned[card.ability.name] then card.pinned = true end if G.GAME.voucher_sticker_index.banana[card.ability.name] then card.ability.banana = true end card:start_materialize() area:emplace(card) card.cost=0 card.shop_voucher=false voucher_queue[#voucher_queue+1] = card end end for k, v in pairs(voucher_queue) do v:unredeem() G.E_MANAGER:add_event(Event({ trigger = 'after', delay = 0, func = function() v:start_dissolve() return true end})) end G.GAME.current_round.voucher=current_round_voucher end end ''' match_indent = true # Affect booster packs [[patches]] [patches.pattern] target = "game.lua" pattern = "G.shop_booster:emplace(card)" position = "before" payload = ''' if G.GAME.modifiers.cry_force_edition and not G.GAME.modifiers.cry_force_random_edition then card:set_edition(nil, true, true) elseif G.GAME.modifiers.cry_force_random_edition then local edition = cry_poll_random_edition() card:set_edition(edition, true, true) end local eternal_perishable_poll = pseudorandom('cry_bpet'..(key_append or '')..G.GAME.round_resets.ante) if (G.GAME.modifiers.cry_force_sticker == 'eternal') or (G.GAME.modifiers.cry_sticker_sheet_plus) or (G.GAME.modifiers.cry_any_stickers and (G.GAME.modifiers.enable_eternals_in_shop and eternal_perishable_poll > 0.8)) then card:set_eternal(true) card.ability.eternal = true end if G.GAME.modifiers.enable_perishables_in_shop and G.GAME.modifiers.cry_any_stickers then -- i don't feel like messing with this, whatever if not G.GAME.modifiers.cry_eternal_perishable_compat and ((eternal_perishable_poll > 0.6) and (eternal_perishable_poll <= 0.8)) then card:set_perishable(true) card.ability.perishable = true end if G.GAME.modifiers.cry_eternal_perishable_compat and pseudorandom('cry_bpper'..(key_append or '')..G.GAME.round_resets.ante) > 0.8 then card:set_perishable(true) card.ability.perishable = true end end if (G.GAME.modifiers.cry_force_sticker == 'perishable') or (G.GAME.modifiers.cry_sticker_sheet_plus) then card:set_perishable(true) card.ability.perishable = true end if (G.GAME.modifiers.cry_force_sticker == 'rental') or (G.GAME.modifiers.cry_sticker_sheet_plus) or (G.GAME.modifiers.cry_any_stickers and (G.GAME.modifiers.enable_rentals_in_shop and pseudorandom('cry_bpssjr'..(key_append or '')..G.GAME.round_resets.ante) > 0.8)) then -- i should really just make this a function? so messy card.ability.rental = true -- do not set_rental here to prevent cost from decreasing end if (G.GAME.modifiers.cry_force_sticker == 'pinned') or (G.GAME.modifiers.cry_sticker_sheet_plus) or (G.GAME.modifiers.cry_any_stickers and (G.GAME.modifiers.cry_enable_pinned_in_shop and pseudorandom('cry_bppin'..(key_append or '')..G.GAME.round_resets.ante) > 0.8)) then card.pinned = true end if G.GAME.modifiers.cry_force_sticker == 'banana' or G.GAME.modifiers.cry_sticker_sheet_plus then card.ability.banana = true end if not G.GAME.modifiers.cry_eternal_perishable_compat and G.GAME.modifiers.enable_banana and G.GAME.modifiers.cry_any_stickers and (pseudorandom('cry_bpbanana'..(key_append or '')..G.GAME.round_resets.ante) > 0.8) and (eternal_perishable_poll <= 0.8) then card.ability.banana = true end if G.GAME.modifiers.cry_eternal_perishable_compat and G.GAME.modifiers.enable_banana and G.GAME.modifiers.cry_any_stickers and (pseudorandom('cry_bpbanana'..(key_append or '')..G.GAME.round_resets.ante) > 0.8) then card.ability.banana = true end if G.GAME.modifiers.cry_sticker_sheet_plus then for k, v in pairs(SMODS.Stickers) do if v.apply and not v.no_sticker_sheet then v:apply(card, true) end end end ''' match_indent = true # world's first actually good multi-patch [[patches]] [patches.pattern] target = "tag.lua" pattern = "card:start_materialize()" position = "before" payload = ''' if G.GAME.modifiers.cry_force_edition and not G.GAME.modifiers.cry_force_random_edition then card:set_edition(nil, true, true) elseif G.GAME.modifiers.cry_force_random_edition then local edition = cry_poll_random_edition() card:set_edition(edition, true, true) 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 # 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' then local rand = math.random(4) play_sound('cry_meow'..rand, 1.26, 0.25) end ''' match_indent = true # 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 GLOBAL_cry_member_count_delay then GLOBAL_cry_member_count_delay = 0 end if (GLOBAL_cry_member_count_delay > 5) or not GLOBAL_cry_member_count then -- it doesn't need to update this frequently? but it also doesn't need to be higher tbh... if update_cry_member_count then update_cry_member_count() end -- i honestly hate nil checks like this, wish there was a shorthand GLOBAL_cry_member_count_delay = 0 else GLOBAL_cry_member_count_delay = GLOBAL_cry_member_count_delay + dt end ''' match_indent = true # call update_cry_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 update_cry_member_count then update_cry_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 [[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.enabled["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 # 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 # 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 # init Cryptid global through lovely # so other mods can add things to memepack pool # 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.enabled = {} Cryptid.memepack = {} Cryptid.aliases = {} Cryptid.food = {} Cryptid.M_jokers = {} Cryptid.Megavouchers = {} function cry_format(...) return ... end ''' 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 = ''' for i = 1, #G.jokers.cards do G.jokers.cards[i]:calculate_joker({cry_creating_card = true, card = card}) end ''' 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 = "functions/state_events.lua" pattern = 'for i = 1, #G.jokers.cards do' position = "before" payload = ''' for i = 1, #G.playing_cards do local CARD = G.playing_cards[i] CARD.cry_debuff_immune = false end ''' match_indent = true # Joker Sell List [[patches]] [patches.pattern] target = "card.lua" pattern = 'self:calculate_joker{selling_self = true}' position = "before" payload = ''' if self.config.center.set == 'Joker' then if G.GAME.jokers_sold then local contained = false for i = 1, #G.GAME.jokers_sold do if self.config.center.key == G.GAME.jokers_sold[i] then contained = true end end if not contained then table.insert(G.GAME.jokers_sold, self.config.center.key) end else G.GAME.jokers_sold = {self.config.center.key} end end ''' 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 # add check for unlock with winning hand [[patches]] [patches.pattern] target = "functions/state_events.lua" pattern = '''check_for_unlock({type = 'win'})''' position = "after" payload = ''' check_for_unlock({type = 'cry_win_with_hand', hand = G.GAME.last_hand_played}) ''' match_indent = true # (scuffed) remove filler from rare tag pool [[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 v.key == 'j_cry_filler' and _append == 'rta' then add = nil end ''' match_indent = true