├── items ├── backs │ ├── sleeves │ │ ├── scarred.lua │ │ ├── nirvana.lua │ │ ├── grilled.lua │ │ ├── nuclear.lua │ │ └── professional.lua │ ├── nirvana.lua │ ├── professional.lua │ ├── scarred.lua │ ├── sixth_finger.lua │ ├── grilled.lua │ └── nuclear.lua ├── handtypes │ ├── parts │ │ ├── _6.lua │ │ └── s_straight.lua │ ├── 6oak.lua │ ├── three_pair.lua │ ├── double_triple.lua │ ├── s_flush.lua │ ├── s_straight.lua │ ├── f_6oak.lua │ ├── f_three_pair.lua │ ├── f_double_triple.lua │ ├── house_party.lua │ ├── f_party.lua │ └── s_straight_f.lua ├── challenges │ ├── feast.lua │ ├── thought.lua │ ├── 52_commandments.lua │ ├── biggest_loser.lua │ ├── overgrowth.lua │ ├── square.lua │ ├── drain.lua │ ├── love_and_war.lua │ ├── speedrun.lua │ ├── greedy.lua │ ├── despite_everything.lua │ ├── target_practice.lua │ ├── picky.lua │ ├── crusaders.lua │ ├── coexist.lua │ ├── fashion.lua │ └── all_stars.lua ├── modifiers │ └── posted.lua ├── jokers │ ├── virus.lua │ ├── stop_sign.lua │ ├── change.lua │ ├── whos_on_first.lua │ ├── boar_bank.lua │ ├── rock_candy.lua │ ├── slifer.lua │ ├── perspective.lua │ ├── joker template.lua │ ├── war.lua │ ├── blue_tang.lua │ ├── soil.lua │ ├── go_fish.lua │ ├── screaming.lua │ ├── joker+.lua │ ├── cheat_day.lua │ ├── maurice.lua │ ├── wild_buddy.lua │ ├── galifianakis.lua │ ├── chekhov.lua │ ├── loony.lua │ ├── lazy.lua │ ├── schrodinger.lua │ ├── high_dive.lua │ ├── gambler.lua │ ├── golden_rings.lua │ ├── celestial_deity.lua │ ├── severed_floor.lua │ ├── sleuth.lua │ ├── slippery_slope.lua │ ├── bell_curve.lua │ ├── gangster_love.lua │ ├── loaded_gun.lua │ ├── trashman.lua │ ├── microwave.lua │ ├── bear.lua │ ├── nicholson.lua │ ├── spam.lua │ ├── guillotine.lua │ ├── space_cowboy.lua │ ├── chef.lua │ ├── old_man_jimbo.lua │ ├── hypeman.lua │ ├── review.lua │ ├── hamill.lua │ ├── fog.lua │ ├── pngoker.lua │ ├── sisillyan.lua │ ├── occam.lua │ ├── rud.lua │ ├── smoker.lua │ ├── crowned.lua │ ├── conveyor_belt.lua │ ├── messiah.lua │ ├── space_race.lua │ ├── werewolf.lua │ ├── paperclip.lua │ ├── bankrupt.lua │ ├── salt_circle.lua │ ├── marco_polo.lua │ ├── tar_pit.lua │ ├── normal.lua │ ├── secret_society.lua │ ├── welder.lua │ ├── leftovers.lua │ ├── romero.lua │ ├── detective.lua │ ├── four_leaf_clover.lua │ ├── hedonist.lua │ ├── hopscotch.lua │ ├── prince.lua │ ├── hugo.lua │ ├── brown.lua │ ├── refrigerator.lua │ ├── harmony.lua │ ├── trick_or_treat.lua │ ├── unpleasant_gradient.lua │ ├── minimalist.lua │ ├── teddy_bear.lua │ ├── letter.lua │ ├── prospector.lua │ ├── bullseye.lua │ ├── honorable.lua │ ├── random_encounter.lua │ ├── employee.lua │ ├── leto.lua │ ├── memory_game.lua │ ├── group_chat.lua │ ├── jestcoin.lua │ ├── clown_car.lua │ └── coupon.lua ├── vouchers │ ├── guardian.lua │ ├── multitask.lua │ ├── workaholic.lua │ ├── best_dressed.lua │ ├── launch_code.lua │ └── warp_drive.lua ├── consumables │ ├── aeon.lua │ ├── doppelganger.lua │ ├── immortality.lua │ ├── corot.lua │ └── wasp.lua ├── blinds │ ├── bird.lua │ ├── flame.lua │ ├── envy.lua │ ├── grinder.lua │ ├── hurdle.lua │ ├── spring.lua │ ├── rule.lua │ ├── rot.lua │ └── cheat.lua ├── tags │ ├── ram.lua │ ├── lion.lua │ ├── crab.lua │ └── maiden.lua └── boosters │ ├── horoscope_jumbo_1.lua │ ├── horoscope_normal_1.lua │ ├── horoscope_normal_2.lua │ └── horoscope_mega_1.lua ├── .gitattributes ├── assets ├── Banner.png ├── 1x │ ├── Blinds.png │ ├── Jokers.png │ ├── Tags.png │ ├── 4d_joker.png │ ├── Boosters.png │ ├── Sleeves.png │ ├── Vouchers.png │ ├── modicon.png │ ├── Consumables.png │ ├── Modifiers.png │ ├── Poker Hands.png │ ├── Maximus_Logo.png │ └── placeholders.png ├── 2x │ ├── Blinds.png │ ├── Tags.png │ ├── jokers.png │ ├── 4d_joker.png │ ├── Sleeves.png │ ├── Vouchers.png │ ├── boosters.png │ ├── modicon.png │ ├── Consumables.png │ ├── Modifiers.png │ ├── Poker Hands.png │ ├── Maximus_Logo.png │ └── placeholders.png └── sounds │ ├── hey.ogg │ ├── perfect.ogg │ ├── clown horn.ogg │ ├── eggsplosion.ogg │ ├── i'm a joker.ogg │ ├── spirit beh.ogg │ ├── spirit miss.ogg │ ├── spirit ough.ogg │ └── spirit pow.ogg ├── config.lua ├── lovely ├── psychic.toml ├── severed_floor.toml ├── coupon.toml ├── maurice.toml ├── honorable.toml ├── virus.toml ├── eggsplosion.toml ├── stop_sign.toml ├── cashout.toml └── posted.toml ├── .gitignore ├── .vscode └── toml.code-snippets ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── Maximus.json ├── LICENSE └── README.md /items/backs/sleeves/scarred.lua: -------------------------------------------------------------------------------- 1 | -- Dummy file -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /assets/Banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/Banner.png -------------------------------------------------------------------------------- /assets/1x/Blinds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/Blinds.png -------------------------------------------------------------------------------- /assets/1x/Jokers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/Jokers.png -------------------------------------------------------------------------------- /assets/1x/Tags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/Tags.png -------------------------------------------------------------------------------- /assets/2x/Blinds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/Blinds.png -------------------------------------------------------------------------------- /assets/2x/Tags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/Tags.png -------------------------------------------------------------------------------- /assets/2x/jokers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/jokers.png -------------------------------------------------------------------------------- /assets/1x/4d_joker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/4d_joker.png -------------------------------------------------------------------------------- /assets/1x/Boosters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/Boosters.png -------------------------------------------------------------------------------- /assets/1x/Sleeves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/Sleeves.png -------------------------------------------------------------------------------- /assets/1x/Vouchers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/Vouchers.png -------------------------------------------------------------------------------- /assets/1x/modicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/modicon.png -------------------------------------------------------------------------------- /assets/2x/4d_joker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/4d_joker.png -------------------------------------------------------------------------------- /assets/2x/Sleeves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/Sleeves.png -------------------------------------------------------------------------------- /assets/2x/Vouchers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/Vouchers.png -------------------------------------------------------------------------------- /assets/2x/boosters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/boosters.png -------------------------------------------------------------------------------- /assets/2x/modicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/modicon.png -------------------------------------------------------------------------------- /assets/sounds/hey.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/sounds/hey.ogg -------------------------------------------------------------------------------- /assets/1x/Consumables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/Consumables.png -------------------------------------------------------------------------------- /assets/1x/Modifiers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/Modifiers.png -------------------------------------------------------------------------------- /assets/1x/Poker Hands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/Poker Hands.png -------------------------------------------------------------------------------- /assets/2x/Consumables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/Consumables.png -------------------------------------------------------------------------------- /assets/2x/Modifiers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/Modifiers.png -------------------------------------------------------------------------------- /assets/2x/Poker Hands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/Poker Hands.png -------------------------------------------------------------------------------- /assets/sounds/perfect.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/sounds/perfect.ogg -------------------------------------------------------------------------------- /assets/1x/Maximus_Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/Maximus_Logo.png -------------------------------------------------------------------------------- /assets/1x/placeholders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/1x/placeholders.png -------------------------------------------------------------------------------- /assets/2x/Maximus_Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/Maximus_Logo.png -------------------------------------------------------------------------------- /assets/2x/placeholders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/2x/placeholders.png -------------------------------------------------------------------------------- /assets/sounds/clown horn.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/sounds/clown horn.ogg -------------------------------------------------------------------------------- /assets/sounds/eggsplosion.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/sounds/eggsplosion.ogg -------------------------------------------------------------------------------- /assets/sounds/i'm a joker.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/sounds/i'm a joker.ogg -------------------------------------------------------------------------------- /assets/sounds/spirit beh.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/sounds/spirit beh.ogg -------------------------------------------------------------------------------- /assets/sounds/spirit miss.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/sounds/spirit miss.ogg -------------------------------------------------------------------------------- /assets/sounds/spirit ough.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/sounds/spirit ough.ogg -------------------------------------------------------------------------------- /assets/sounds/spirit pow.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/the-Astra/Maximus/HEAD/assets/sounds/spirit pow.ogg -------------------------------------------------------------------------------- /items/handtypes/parts/_6.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHandPart { 2 | key = '6', 3 | func = function(hand) 4 | return get_X_same(6, hand) 5 | end 6 | } 7 | -------------------------------------------------------------------------------- /config.lua: -------------------------------------------------------------------------------- 1 | return { 2 | four_d_ticks = true, 3 | menu = true, 4 | horoscopes = true, 5 | new_handtypes = true, 6 | only_maximus_jokers = false, 7 | } 8 | -------------------------------------------------------------------------------- /items/challenges/feast.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'feast', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_feast' } 6 | } 7 | }, 8 | deck = { 9 | type = 'Challenge Deck' 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /items/modifiers/posted.lua: -------------------------------------------------------------------------------- 1 | SMODS.Sticker { 2 | key = "posted", 3 | badge_colour = HEX 'fda200', 4 | pos = { x = 10, y = 10 }, 5 | rate = 0, 6 | default_compat = false, 7 | apply = function(self, card, val) 8 | card.ability[self.key] = val 9 | end 10 | } 11 | -------------------------------------------------------------------------------- /items/handtypes/parts/s_straight.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHandPart { 2 | key = 's_straight', 3 | func = function(hand) 4 | if G.STAGE == G.STAGES.RUN and G.hand.config.highlighted_limit >= 6 then 5 | return get_straight(hand, SMODS.four_fingers('straight') + 1, SMODS.shortcut(), SMODS.wrap_around_straight()) 6 | end 7 | end 8 | } 9 | -------------------------------------------------------------------------------- /items/jokers/virus.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'virus', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 3 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = false, 15 | cost = 6 16 | } 17 | -------------------------------------------------------------------------------- /items/jokers/stop_sign.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'stop_sign', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 1, 6 | y = 6 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 3, 14 | blueprint_compat = true, 15 | cost = 8 16 | } 17 | -------------------------------------------------------------------------------- /items/jokers/change.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'change', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 16 7 | }, 8 | rarity = 2, 9 | mxms_credits = { 10 | art = { "Maxiss02" }, 11 | code = { "theAstra" }, 12 | idea = { "pinkzigzagoon" } 13 | }, 14 | blueprint_compat = false, 15 | cost = 5 16 | } 17 | -------------------------------------------------------------------------------- /items/jokers/whos_on_first.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'whos_on_first', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 5, 6 | y = 13 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = false, 15 | cost = 4 16 | } 17 | -------------------------------------------------------------------------------- /items/challenges/thought.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'thought', 3 | rules = {}, 4 | jokers = { 5 | { id = 'j_mxms_schrodinger', eternal = true, edition = 'negative' }, 6 | { id = 'j_mxms_occam', eternal = true }, 7 | { id = 'j_mxms_chekhov', eternal = true }, 8 | }, 9 | deck = { 10 | type = 'Challenge Deck' 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /items/jokers/boar_bank.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'boar_bank', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 7, 6 | y = 17 7 | }, 8 | rarity = 1, 9 | mxms_credits = { 10 | art = { "pinkzigzagoon" }, 11 | code = { "theAstra" }, 12 | idea = { "pinkzigzagoon" } 13 | }, 14 | blueprint_compat = false, 15 | cost = 5 16 | } 17 | -------------------------------------------------------------------------------- /lovely/psychic.toml: -------------------------------------------------------------------------------- 1 | [manifest] 2 | version = "1.0.0" 3 | dump_lua = true 4 | priority = 1 5 | 6 | [[patches]] 7 | [patches.pattern] 8 | target = "blind.lua" 9 | pattern = ''' 10 | if self.debuff.h_size_ge and #cards < self.debuff.h_size_ge then 11 | ''' 12 | position = "at" 13 | payload = ''' 14 | if self.debuff.h_size_ge and #cards ~= self.debuff.h_size_ge then 15 | ''' 16 | match_indent = true 17 | times = 1 -------------------------------------------------------------------------------- /items/challenges/52_commandments.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = '52_commandments', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_X_blind_size', value = 2 } 6 | } 7 | }, 8 | jokers = { 9 | { id = 'j_mxms_hammer_and_chisel', eternal = true } 10 | }, 11 | deck = { 12 | type = 'Challenge Deck', 13 | enhancement = 'm_stone' 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.psd 2 | /assets/Joker sprites 3 | /.code-workspace 4 | /assets/Voucher Sprites 5 | /assets/Planet Sprites 6 | /assets/Blind sprites 7 | /assets/Consumable Sprites 8 | /assets/Modifier sprites 9 | /assets/Pack Sprites 10 | /assets/Tag Sprites 11 | /assets/Modifier sprites 12 | Maximus.code-workspace 13 | /assets/Modifier sprites 14 | /assets/Sleeve sprites 15 | .luarc.json 16 | .lovelyignore 17 | /assets/raw 18 | -------------------------------------------------------------------------------- /items/challenges/biggest_loser.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'biggest_loser', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_biggest_loser' } 6 | } 7 | }, 8 | jokers = { 9 | { id = 'j_mxms_stop_sign', edition = 'negative', eternal = true }, 10 | { id = 'j_mxms_impractical_joker', edition = 'negative', eternal = true, mxms_posted = true } 11 | }, 12 | deck = { 13 | type = 'Challenge Deck' 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /items/challenges/overgrowth.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'overgrowth', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_X_blind_scale', value = 8 } 6 | } 7 | }, 8 | jokers = { 9 | { id = 'j_mxms_soil', edition = 'negative', eternal = true } 10 | }, 11 | deck = { 12 | type = 'Challenge Deck' 13 | }, 14 | apply = function(self) 15 | G.GAME.modifiers.scaling = G.GAME.modifiers.mxms_X_blind_scale 16 | end 17 | } 18 | -------------------------------------------------------------------------------- /items/vouchers/guardian.lua: -------------------------------------------------------------------------------- 1 | SMODS.Voucher { 2 | key = 'guardian', 3 | atlas = 'Vouchers', 4 | pos = { 5 | x = 2, 6 | y = 1 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | requires = { 'v_mxms_shield' }, 14 | redeem = function(self, card, from_debuff) 15 | G.GAME.mxms_v_destroy_reduction = G.GAME.mxms_v_destroy_reduction + 1 16 | end 17 | } 18 | -------------------------------------------------------------------------------- /items/backs/nirvana.lua: -------------------------------------------------------------------------------- 1 | SMODS.Back { 2 | key = 'nirvana', 3 | atlas = 'Modifiers', 4 | pos = { 5 | x = 1, 6 | y = 0 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | apply = function(self, back) 14 | --Change shop prices 15 | G.GAME.mxms_shop_price_multiplier = 1.5 16 | 17 | -- Change reroll starting price 18 | G.GAME.starting_params.reroll_cost = 0 19 | end 20 | } 21 | -------------------------------------------------------------------------------- /items/jokers/rock_candy.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'rock_candy', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 14 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "PsyAlola" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = false, 15 | cost = 5, 16 | pools = { 17 | Food = true 18 | }, 19 | loc_vars = function(self, info_queue, card) 20 | info_queue[#info_queue + 1] = G.P_CENTERS.m_stone 21 | end 22 | } 23 | -------------------------------------------------------------------------------- /items/handtypes/6oak.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = '6oak', 3 | mult = 18, 4 | chips = 180, 5 | l_mult = 4, 6 | l_chips = 40, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 2 }, 9 | example = { 10 | 11 | { 'S_K', true }, 12 | { 'D_K', true }, 13 | { 'C_K', true }, 14 | { 'H_K', true }, 15 | { 'S_K', true }, 16 | { 'D_K', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | return next(parts.mxms_6) and parts.mxms_6 or {} 22 | end 23 | } 24 | -------------------------------------------------------------------------------- /items/handtypes/three_pair.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = 'three_pair', 3 | mult = 4, 4 | chips = 30, 5 | l_mult = 1, 6 | l_chips = 25, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 0 }, 9 | example = { 10 | 11 | { 'S_K', true }, 12 | { 'D_K', true }, 13 | { 'S_9', true }, 14 | { 'D_9', true }, 15 | { 'S_6', true }, 16 | { 'D_6', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | return #parts._2 >= 3 and parts._all_pairs or {} 22 | end 23 | } 24 | -------------------------------------------------------------------------------- /lovely/severed_floor.toml: -------------------------------------------------------------------------------- 1 | [manifest] 2 | version = "1.0.0" 3 | dump_lua = true 4 | priority = 1 5 | 6 | # Prevent reset function calls if stop sign is in hand 7 | [[patches]] 8 | [patches.pattern] 9 | target = "functions/button_callbacks.lua" 10 | pattern = ''' 11 | G.STATE = G.STATES.SHOP 12 | ''' 13 | position = "at" 14 | payload = ''' 15 | G.STATE = next(SMODS.find_card('j_mxms_severed_floor')) and G.STATES.BLIND_SELECT or G.STATES.SHOP 16 | if next(SMODS.find_card('j_mxms_severed_floor')) then 17 | G.CONTROLLER.locks.toggle_shop = nil 18 | end 19 | ''' 20 | match_indent = true -------------------------------------------------------------------------------- /.vscode/toml.code-snippets: -------------------------------------------------------------------------------- 1 | { 2 | "Simple patch skeleton": { 3 | "prefix": "patch", 4 | "body": [ 5 | "[[patches]]", 6 | "[patches.pattern]", 7 | "target = '''$1'''", 8 | "pattern = '''", 9 | "$2", 10 | "'''", 11 | "position = '''$3'''", 12 | "payload = '''", 13 | "$4", 14 | "'''", 15 | "match_indent = true", 16 | "times = 1", 17 | ], 18 | "description": "Shortcut for a simple lovely patch skeleton" 19 | }, 20 | } -------------------------------------------------------------------------------- /items/handtypes/double_triple.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = 'double_triple', 3 | mult = 6, 4 | chips = 60, 5 | l_mult = 2, 6 | l_chips = 35, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 1 }, 9 | example = { 10 | 11 | { 'S_K', true }, 12 | { 'D_K', true }, 13 | { 'C_K', true }, 14 | { 'S_9', true }, 15 | { 'D_9', true }, 16 | { 'C_9', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | return #parts._3 >= 2 and parts._all_pairs or {} 22 | end 23 | } 24 | -------------------------------------------------------------------------------- /items/handtypes/s_flush.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = 's_flush', 3 | mult = 6, 4 | chips = 55, 5 | l_mult = 2, 6 | l_chips = 25, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 4 }, 9 | example = { 10 | 11 | { 'S_A', true }, 12 | { 'S_K', true }, 13 | { 'S_J', true }, 14 | { 'S_8', true }, 15 | { 'S_6', true }, 16 | { 'S_2', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | return next(parts.mxms_s_flush) and parts.mxms_s_flush or {} 22 | end 23 | } 24 | -------------------------------------------------------------------------------- /items/handtypes/s_straight.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = 's_straight', 3 | mult = 6, 4 | chips = 50, 5 | l_mult = 3, 6 | l_chips = 50, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 3 }, 9 | example = { 10 | 11 | { 'S_A', true }, 12 | { 'D_K', true }, 13 | { 'C_Q', true }, 14 | { 'H_J', true }, 15 | { 'S_T', true }, 16 | { 'D_9', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | return next(parts.mxms_s_straight) and parts.mxms_s_straight or {} 22 | end 23 | } 24 | -------------------------------------------------------------------------------- /lovely/coupon.toml: -------------------------------------------------------------------------------- 1 | [manifest] 2 | version = "1.0.0" 3 | dump_lua = true 4 | priority = 1 5 | 6 | # Modify card shop creation 7 | [[patches]] 8 | [patches.pattern] 9 | target = "functions/UI_definitions.lua" 10 | pattern = ''' 11 | if polled_rate > check_rate and polled_rate <= check_rate + v.val then 12 | local card = create_card(v.type, area, nil, nil, nil, nil, nil, 'sho') 13 | ''' 14 | position = "after" 15 | payload = ''' 16 | if card.ability.set == 'Joker' then 17 | SMODS.calculate_context({mxms_joker_cost_check = true, card = card}) 18 | end 19 | ''' 20 | match_indent = true 21 | times = 1 -------------------------------------------------------------------------------- /items/challenges/square.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'square', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_highlight_limit', value = 4 } 6 | } 7 | }, 8 | jokers = {}, 9 | restrictions = { 10 | banned_other = { 11 | { id = 'bl_psychic', type = 'blind' } 12 | } 13 | }, 14 | deck = { 15 | type = 'Challenge Deck' 16 | }, 17 | apply = function(self) 18 | SMODS.change_play_limit(self.GAME.modifiers.mxms_highlight_limit - 5) 19 | SMODS.change_discard_limit(self.GAME.modifiers.mxms_highlight_limit - 5) 20 | end 21 | } 22 | -------------------------------------------------------------------------------- /items/vouchers/multitask.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.horoscopes then 2 | SMODS.Voucher { 3 | key = 'multitask', 4 | atlas = 'Vouchers', 5 | pos = { 6 | x = 3, 7 | y = 0 8 | }, 9 | mxms_credits = { 10 | art = { "Maxiss02" }, 11 | code = { "theAstra" }, 12 | idea = { "Maxiss02" } 13 | }, 14 | redeem = function(self, card, from_debuff) 15 | G.mxms_horoscope.config.card_limit = G.mxms_horoscope.config.card_limit + 1 16 | end 17 | } 18 | else 19 | sendDebugMessage("Multitask not loaded; Horoscopes Disabled", 'Maximus') 20 | end 21 | -------------------------------------------------------------------------------- /items/challenges/drain.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'drain', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_hand_decay', value = "Flush" } 6 | } 7 | }, 8 | jokers = { 9 | { id = 'j_smeared', eternal = true }, 10 | { id = 'j_mxms_faded', eternal = true } 11 | }, 12 | vouchers = { 13 | { id = 'v_telescope' } 14 | }, 15 | deck = { 16 | type = 'Challenge Deck' 17 | }, 18 | calculate = function(self, context) 19 | if context.ante_end then 20 | SMODS.smart_level_up_hand(nil, G.GAME.modifiers.mxms_hand_decay, nil, -5) 21 | end 22 | end 23 | } 24 | -------------------------------------------------------------------------------- /items/handtypes/f_6oak.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = 'f_6oak', 3 | mult = 22, 4 | chips = 220, 5 | l_mult = 5, 6 | l_chips = 50, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 10 }, 9 | example = { 10 | 11 | { 'S_K', true }, 12 | { 'S_K', true }, 13 | { 'S_K', true }, 14 | { 'S_K', true }, 15 | { 'S_K', true }, 16 | { 'S_K', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | return next(parts.mxms_6) and next(parts.mxms_s_flush) 22 | and { SMODS.merge_lists(parts.mxms_6, parts.mxms_s_flush) } or {} 23 | end 24 | } 25 | -------------------------------------------------------------------------------- /items/handtypes/f_three_pair.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = 'f_three_pair', 3 | mult = 14, 4 | chips = 150, 5 | l_mult = 3, 6 | l_chips = 30, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 6 }, 9 | example = { 10 | 11 | { 'S_K', true }, 12 | { 'S_K', true }, 13 | { 'S_9', true }, 14 | { 'S_9', true }, 15 | { 'S_6', true }, 16 | { 'S_6', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | return #parts._2 == 3 and next(parts.mxms_s_flush) and 22 | { SMODS.merge_lists(parts._all_pairs, parts.mxms_s_flush) } or {} 23 | end 24 | } 25 | -------------------------------------------------------------------------------- /items/jokers/slifer.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'slifer', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 5, 6 | y = 10 7 | }, 8 | rarity = 3, 9 | mxms_credits = { 10 | art = { "anerdymous" }, 11 | code = { "theAstra" }, 12 | idea = { "anerdymous" } 13 | }, 14 | blueprint_compat = true, 15 | cost = 8, 16 | calculate = function(self, card, context) 17 | local stg = card.ability.extra 18 | 19 | if context.joker_main and #G.hand.cards > 0 then 20 | return { 21 | x_mult = #G.hand.cards > 0 and #G.hand.cards or 1 22 | } 23 | end 24 | end 25 | } 26 | -------------------------------------------------------------------------------- /items/handtypes/f_double_triple.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = 'f_double_triple', 3 | mult = 16, 4 | chips = 170, 5 | l_mult = 4, 6 | l_chips = 50, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 7 }, 9 | example = { 10 | 11 | { 'S_K', true }, 12 | { 'S_K', true }, 13 | { 'S_K', true }, 14 | { 'S_9', true }, 15 | { 'S_9', true }, 16 | { 'S_9', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | return #parts._3 >= 2 and next(parts.mxms_s_flush) 22 | and { SMODS.merge_lists(parts._all_pairs, parts.mxms_s_flush) } or {} 23 | end 24 | } 25 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG] " 5 | labels: bug 6 | assignees: the-Astra 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Additional context** 27 | Add any other context about the problem here. 28 | -------------------------------------------------------------------------------- /items/jokers/perspective.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'perspective', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 8, 6 | y = 0 7 | }, 8 | rarity = 1, 9 | mxms_credits = { 10 | art = { "Maxiss02" }, 11 | code = { "theAstra" }, 12 | idea = { "Maxiss02" } 13 | }, 14 | blueprint_compat = false, 15 | cost = 3 16 | } 17 | 18 | -- Change Full House to not interfere with Perspective 19 | SMODS.PokerHand:take_ownership('Full House', { 20 | evaluate = function(parts, hand) 21 | if #parts._3 < 1 or #parts._2 < 2 or #hand < 5 then return {} end 22 | return parts._all_pairs 23 | end 24 | }, 25 | true) 26 | -------------------------------------------------------------------------------- /items/vouchers/workaholic.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.horoscopes then 2 | SMODS.Voucher { 3 | key = 'workaholic', 4 | atlas = 'Vouchers', 5 | pos = { 6 | x = 3, 7 | y = 1 8 | }, 9 | mxms_credits = { 10 | art = { "Maxiss02" }, 11 | code = { "theAstra" }, 12 | idea = { "Maxiss02" } 13 | }, 14 | requires = { 'v_mxms_multitask' }, 15 | redeem = function(self, card, from_debuff) 16 | G.mxms_horoscope.config.card_limit = G.mxms_horoscope.config.card_limit + 1 17 | end 18 | } 19 | else 20 | sendDebugMessage("Workaholic not loaded; Horoscopes Disabled", 'Maximus') 21 | end 22 | -------------------------------------------------------------------------------- /items/handtypes/house_party.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = 'house_party', 3 | mult = 8, 4 | chips = 70, 5 | l_mult = 3, 6 | l_chips = 40, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 5 }, 9 | example = { 10 | 11 | { 'S_A', true }, 12 | { 'D_A', true }, 13 | { 'C_A', true }, 14 | { 'H_A', true }, 15 | { 'S_T', true }, 16 | { 'D_T', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | if #parts._4 < 1 or #parts._2 < 2 then return {} end 22 | return #hand >= 6 and next(parts._2) and next(parts._4) and 23 | { SMODS.merge_lists(parts._all_pairs) } or {} 24 | end 25 | } 26 | -------------------------------------------------------------------------------- /items/challenges/love_and_war.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'love_and_war', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_deck_size_req', value = 1 } 6 | } 7 | }, 8 | jokers = { 9 | { id = 'j_mxms_war', edition = 'negative', eternal = true } 10 | }, 11 | deck = { 12 | type = 'Challenge Deck' 13 | }, 14 | calculate = function(self, context) 15 | if context.end_of_round and G.GAME.round_resets.ante == G.GAME.win_ante and G.GAME.blind:get_type() == 'Boss' then 16 | if #G.GAME.playing_cards ~= G.GAME.modifiers.mxms_deck_size_req then 17 | Maximus.force_game_over() 18 | end 19 | end 20 | end 21 | } 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: "[FQ] " 5 | labels: enhancement 6 | assignees: the-Astra 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /items/jokers/joker template.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'template', 3 | atlas = 'Placeholder', 4 | pos = { 5 | x = 0, 6 | y = 0 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | } 12 | }, 13 | mxms_credits = { 14 | art = { "Maxiss02" }, 15 | code = { "theAstra" }, 16 | idea = { "Maxiss02" } 17 | }, 18 | blueprint_compat = true, 19 | cost = 4, 20 | loc_vars = function(self, info_queue, card) 21 | local stg = card.ability.extra 22 | return { 23 | vars = {} 24 | } 25 | end, 26 | calculate = function(self, card, context) 27 | local stg = card.ability.extra 28 | end 29 | } 30 | -------------------------------------------------------------------------------- /items/consumables/aeon.lua: -------------------------------------------------------------------------------- 1 | SMODS.Consumable { 2 | key = 'aeon', 3 | set = 'Tarot', 4 | atlas = 'Consumables', 5 | pos = { 6 | x = 0, 7 | y = 4 8 | }, 9 | config = { 10 | max_highlighted = 2, 11 | mod_conv = 'm_mxms_footprint' 12 | }, 13 | cost = 4, 14 | loc_vars = function(self, info_queue, card) 15 | info_queue[#info_queue + 1] = G.P_CENTERS['m_mxms_footprint'] 16 | return { vars = { card.ability.max_highlighted, localize { type = 'name_text', set = 'Enhanced', key = card.ability.mod_conv } } } 17 | end, 18 | mxms_credits = { 19 | art = { "SadCube" }, 20 | code = { "theAstra" }, 21 | idea = { "pinkzigzagoon" } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /items/jokers/war.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'war', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 0 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = false, 15 | cost = 8, 16 | add_to_deck = function(self, card, from_debuff) 17 | G.GAME.mxms_war_mod = G.GAME.mxms_war_mod * 2 18 | end, 19 | remove_from_deck = function(self, card, from_debuff) 20 | G.GAME.mxms_war_mod = G.GAME.mxms_war_mod / 2 21 | end 22 | } 23 | 24 | SMODS.JimboQuip { 25 | key = 'lq_war', 26 | type = 'loss', 27 | extra = { center = 'j_mxms_war' } 28 | } 29 | -------------------------------------------------------------------------------- /items/backs/professional.lua: -------------------------------------------------------------------------------- 1 | SMODS.Back { 2 | key = 'professional', 3 | atlas = 'Modifiers', 4 | pos = { 5 | x = 3, 6 | y = 0 7 | }, 8 | mxms_credits = { 9 | art = { "pinkzigzagoon" }, 10 | code = { "theAstra" }, 11 | idea = { "pinkzigzagoon" } 12 | }, 13 | apply = function(self, back) 14 | --Disable skipping 15 | G.GAME.modifiers.disable_blind_skips = true 16 | 17 | -- Change blind size 18 | G.GAME.starting_params.ante_scaling = 1.25 19 | 20 | -- Ban some Jokers that rely on skipping 21 | G.GAME.banned_keys[#G.GAME.banned_keys + 1] = 'j_throwback' 22 | G.GAME.banned_keys[#G.GAME.banned_keys + 1] = 'j_mxms_hopscotch' 23 | end 24 | } 25 | -------------------------------------------------------------------------------- /items/handtypes/f_party.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = 'f_party', 3 | mult = 16, 4 | chips = 180, 5 | l_mult = 4, 6 | l_chips = 50, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 9 }, 9 | example = { 10 | 11 | { 'S_A', true }, 12 | { 'S_A', true }, 13 | { 'S_A', true }, 14 | { 'S_A', true }, 15 | { 'S_T', true }, 16 | { 'S_T', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | if #parts._4 < 1 or #parts._2 < 2 then return {} end 22 | return #hand >= 6 and next(parts._2) and next(parts._4) and next(parts.mxms_s_flush) 23 | and { SMODS.merge_lists(parts._all_pairs, parts.mxms_s_flush) } or {} 24 | end 25 | } 26 | -------------------------------------------------------------------------------- /items/challenges/speedrun.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'speedrun', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_speedrun' }, 6 | { id = 'mxms_disable_blind_skips' }, 7 | { id = 'mxms_win_ante', value = 4 }, 8 | } 9 | }, 10 | jokers = { 11 | { id = 'j_mxms_4d' }, 12 | }, 13 | deck = { 14 | type = 'Challenge Deck' 15 | }, 16 | calculate = function(self, context) 17 | if context.four_d_death then 18 | Maximus.force_game_over() 19 | end 20 | end, 21 | apply = function(self) 22 | G.GAME.modifiers.disable_blind_skips = true 23 | G.GAME.win_ante = 4 24 | Maximus_config.four_d_ticks = true 25 | end 26 | } 27 | -------------------------------------------------------------------------------- /lovely/maurice.toml: -------------------------------------------------------------------------------- 1 | [manifest] 2 | version = "1.0.0" 3 | dump_lua = true 4 | priority = 1 5 | 6 | # Make Wild cards go back to deck after play 7 | [[patches]] 8 | [patches.pattern] 9 | target = "functions/state_events.lua" 10 | pattern = ''' 11 | draw_card(G.play,G.discard, it*100/play_count,'down', false, v) 12 | ''' 13 | position = "at" 14 | payload = ''' 15 | if next(SMODS.find_card('j_mxms_maurice')) and SMODS.has_enhancement(v, 'm_wild') then 16 | draw_card(G.play,G.deck, it*100/play_count,'down', false, v) 17 | SMODS.calculate_effect({message = localize('k_saved_ex'), sound = 'mxms_joker'}, SMODS.find_card('j_mxms_maurice')[1]) 18 | else 19 | draw_card(G.play,G.discard, it*100/play_count,'down', false, v) 20 | end 21 | ''' 22 | match_indent = true 23 | times = 1 24 | -------------------------------------------------------------------------------- /items/challenges/greedy.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'greedy', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_greedy' }, 6 | { id = 'mxms_greedy2' }, 7 | }, 8 | modifiers = { 9 | { id = 'dollars', value = 10 } 10 | } 11 | }, 12 | jokers = { 13 | { id = 'j_delayed_grat' }, 14 | { id = 'j_mxms_trick_or_treat', eternal = true }, 15 | }, 16 | deck = { 17 | type = 'Challenge Deck' 18 | }, 19 | calculate = function(self, context) 20 | if context.skipping_booster then 21 | Maximus.force_game_over() 22 | end 23 | 24 | if context.ending_shop and #G.shop_booster.cards > 0 then 25 | Maximus.force_game_over() 26 | end 27 | end 28 | } 29 | -------------------------------------------------------------------------------- /items/jokers/blue_tang.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'blue_tang', 3 | atlas = 'Placeholder', 4 | pos = { 5 | x = 0, 6 | y = 0 7 | }, 8 | rarity = 1, 9 | mxms_credits = { 10 | art = { "pinkzigzagoon" }, 11 | code = { "theAstra" }, 12 | idea = { "pinkzigzagoon" } 13 | }, 14 | blueprint_compat = true, 15 | cost = 4, 16 | calculate = function(self, card, context) 17 | if context.prevent_tag_trigger and 18 | (context.other_context.type == 'store_joker_create' or 19 | context.other_context.type == 'store_joker_modify') and 20 | card ~= G.jokers.cards[#G.jokers.cards] then 21 | return { 22 | prevent_trigger = true 23 | } 24 | end 25 | end, 26 | } 27 | -------------------------------------------------------------------------------- /items/jokers/soil.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'soil', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 0, 6 | y = 6 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 3, 14 | blueprint_compat = false, 15 | cost = 8, 16 | calc_scaling = function(self, card, other_card, initial, scalar_value, args) 17 | local stg = card.ability.extra 18 | if args.operation == '+' or args.operation == 'X' then 19 | return { 20 | message = localize('k_mxms_doubled_ex'), 21 | override_scalar_value = { 22 | value = scalar_value * 2 23 | } 24 | } 25 | end 26 | end 27 | } 28 | -------------------------------------------------------------------------------- /items/jokers/go_fish.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'go_fish', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 8, 6 | y = 4 7 | }, 8 | rarity = 1, 9 | mxms_credits = { 10 | art = { "Maxiss02" }, 11 | code = { "theAstra" }, 12 | idea = { "Maxiss02" } 13 | }, 14 | blueprint_compat = true, 15 | cost = 4, 16 | loc_vars = function(self, info_queue, card) 17 | return { 18 | vars = { localize(G.GAME.current_round.mxms_go_fish.rank, 'ranks'), G.GAME.current_round.mxms_go_fish.mult } 19 | } 20 | end, 21 | calculate = function(self, card, context) 22 | if context.joker_main then 23 | return { 24 | mult = G.GAME.current_round.mxms_go_fish.mult 25 | } 26 | end 27 | end 28 | } 29 | -------------------------------------------------------------------------------- /Maximus.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "Maximus", 3 | "name": "Maximus", 4 | "display_name": "Maximus", 5 | "author": ["theAstra", "Maxiss02"], 6 | "description": "Maximus is a Vanilla+ mod that strives to preserve the Vanilla feel of the game (for the most part, looking at you Nuclear deck) while innovating on newer ideas to keep things fresh! Join the Discord: https://discord.gg/GvCCcryM48", 7 | "prefix": "mxms", 8 | "main_file": "main.lua", 9 | "priority": 0, 10 | "badge_colour": "f51bbc", 11 | "badge_text_colour": "f8a100", 12 | "version": "1.2.4c", 13 | "git_owner": "the-Astra", 14 | "git_repo": "Maximus", 15 | "mod_path": "Mods/Maximus-main", 16 | "download_suffix": "Maximus-main.zip", 17 | "dependencies": [ 18 | "Steamodded (>=1.0.0~BETA-1016c)", 19 | "Lovely (>=0.7.1)" 20 | ], 21 | "provides": [ 22 | "OTMAPI (1.0.0)" 23 | ] 24 | } -------------------------------------------------------------------------------- /items/blinds/bird.lua: -------------------------------------------------------------------------------- 1 | SMODS.Blind { 2 | key = 'bird', 3 | boss = { 4 | min = 4, 5 | max = 10 6 | }, 7 | atlas = 'Blinds', 8 | pos = { 9 | x = 0, 10 | y = 8 11 | }, 12 | config = { 13 | extra = { 14 | hands_removed = 0 15 | } 16 | }, 17 | mxms_credits = { 18 | art = { "pinkzigzagoon" }, 19 | code = { "theAstra" }, 20 | idea = { "pinkzigzagoon" } 21 | }, 22 | boss_colour = HEX('BFFF3A'), 23 | modify_hand = function(self, cards, poker_hands, text, mult, hand_chips) 24 | self.triggered = true 25 | return math.max(mult - (G.GAME.hands[text].l_mult * 2), G.GAME.hands[text].s_mult), 26 | math.max(hand_chips - (G.GAME.hands[text].l_chips * 2), G.GAME.hands[text].s_chips), 27 | true 28 | end 29 | } 30 | -------------------------------------------------------------------------------- /items/challenges/despite_everything.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'despite', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_ante_sell' } 6 | } 7 | }, 8 | jokers = { 9 | { id = 'j_joker', edition = 'negative', eternal = true } 10 | }, 11 | deck = { 12 | type = 'Challenge Deck' 13 | }, 14 | calculate = function(self, context) 15 | if context.ante_end then 16 | for k, v in pairs(G.jokers.cards) do 17 | if not (v.ability and v.ability.eternal) then 18 | v:sell_card() 19 | end 20 | end 21 | 22 | for k, v in pairs(G.consumeables.cards) do 23 | if not (v.ability and v.ability.eternal) then 24 | v:sell_card() 25 | end 26 | end 27 | end 28 | end 29 | } 30 | -------------------------------------------------------------------------------- /items/jokers/screaming.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'screaming', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 7, 6 | y = 14 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "pinkzigzagoon" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = false, 15 | cost = 4 16 | } 17 | 18 | local cgi = Card.get_id 19 | Card.get_id = function(self) 20 | local ret = cgi(self) 21 | local rank = SMODS.Ranks[self.base.value] 22 | if (type(ret) == 'number' and ret > 0 and rank and rank.face or next(find_joker("Pareidolia"))) 23 | and next(SMODS.find_card('j_mxms_screaming')) then 24 | ret = 14 25 | end 26 | return ret 27 | end 28 | 29 | SMODS.JimboQuip { 30 | key = 'wq_screaming', 31 | type = 'loss', 32 | extra = { center = 'j_mxms_screaming' } 33 | } -------------------------------------------------------------------------------- /items/blinds/flame.lua: -------------------------------------------------------------------------------- 1 | SMODS.Blind { 2 | key = 'flame', 3 | boss = { 4 | min = 6, 5 | max = 10 6 | }, 7 | atlas = 'Blinds', 8 | pos = { 9 | x = 0, 10 | y = 3 11 | }, 12 | mxms_credits = { 13 | art = { "Maxiss02" }, 14 | code = { "theAstra" }, 15 | idea = { "theAstra" } 16 | }, 17 | boss_colour = HEX('E87250'), 18 | calculate = function(self, card, context) 19 | if context.destroy_card and context.cardarea == G.play then 20 | G.E_MANAGER:add_event(Event({ 21 | func = function() 22 | self.triggered = true 23 | SMODS.juice_up_blind() 24 | return true; 25 | end 26 | })) 27 | return { 28 | remove = true 29 | } 30 | end 31 | end 32 | } 33 | -------------------------------------------------------------------------------- /items/jokers/joker+.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'joker_plus', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 1 7 | }, 8 | rarity = 3, 9 | config = { 10 | extra = { 11 | mult = 5 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 5, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.mult } 25 | } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | if context.joker_main then 30 | return { 31 | mult = stg.mult 32 | } 33 | end 34 | end 35 | } 36 | -------------------------------------------------------------------------------- /items/jokers/cheat_day.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.horoscopes then 2 | SMODS.Joker { 3 | key = 'cheat_day', 4 | atlas = 'Jokers', 5 | pos = { 6 | x = 0, 7 | y = 11 8 | }, 9 | mxms_credits = { 10 | art = { "Maxiss02" }, 11 | code = { "theAstra" }, 12 | idea = { "Maxiss02" } 13 | }, 14 | rarity = 2, 15 | blueprint_compat = false, 16 | cost = 4, 17 | calculate = function(self, card, context) 18 | if context.mxms_failed_horoscope and not context.blueprint then 19 | SMODS.calculate_effect( 20 | { message = localize('k_saved_ex'), colour = Maximus.C.HOROSCOPE, sound = 'tarot1' }, card) 21 | end 22 | end 23 | } 24 | else 25 | sendDebugMessage("Cheat Day not loaded; Horoscopes Disabled", 'Maximus') 26 | end 27 | -------------------------------------------------------------------------------- /items/jokers/maurice.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'maurice', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 5, 6 | y = 17 7 | }, 8 | mxms_credits = { 9 | art = { "anerdymous" }, 10 | code = { "theAstra" }, 11 | idea = { "anerdymous" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = false, 15 | cost = 6, 16 | loc_vars = function(self, info_queue, card) 17 | info_queue[#info_queue + 1] = G.P_CENTERS.m_wild 18 | end, 19 | calculate = function(self, card, context) 20 | local stg = card.ability.extra 21 | 22 | if context.discard_from_play and SMODS.has_enhancement(context.card, 'm_wild') then 23 | return { 24 | draw_to = 'deck', 25 | message = localize('k_saved_ex'), 26 | sound = 'mxms_joker' 27 | } 28 | end 29 | end 30 | } 31 | -------------------------------------------------------------------------------- /items/jokers/wild_buddy.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'wild_buddy', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 2, 6 | y = 13 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | Xmult = 2 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "pinkzigzagoon" }, 16 | code = { "theAstra" }, 17 | idea = { "pinkzigzagoon" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 4, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.Xmult } 25 | } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | 30 | if context.joker_main and not G.GAME.blind.boss then 31 | return { 32 | x_mult = stg.Xmult 33 | } 34 | end 35 | end 36 | } 37 | -------------------------------------------------------------------------------- /items/jokers/galifianakis.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'galifianakis', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 1, 6 | y = 7 7 | }, 8 | soul_pos = { 9 | x = 1, 10 | y = 8 11 | }, 12 | rarity = 4, 13 | unlocked = false, 14 | unlock_condition = { 15 | type = '', 16 | extra = '', 17 | hidden = true 18 | }, 19 | mxms_credits = { 20 | art = { "Maxiss02" }, 21 | code = { "theAstra" }, 22 | idea = { "theAstra" } 23 | }, 24 | blueprint_compat = true, 25 | cost = 20, 26 | calculate = function(self, card, context) 27 | if context.before then 28 | if not context.scoring_hand[#context.scoring_hand].edition then 29 | card:juice_up(0.3, 0.4) 30 | context.scoring_hand[#context.scoring_hand]:set_edition({ negative = true }, true) 31 | end 32 | end 33 | end 34 | } 35 | -------------------------------------------------------------------------------- /items/consumables/doppelganger.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.horoscopes then 2 | SMODS.Consumable { 3 | key = 'doppelganger', 4 | set = 'Spectral', 5 | atlas = 'Consumables', 6 | pos = { 7 | x = 0, 8 | y = 3 9 | }, 10 | cost = 4, 11 | use = function(self, card, area, copier) 12 | for k, v in pairs(G.mxms_horoscope.cards) do 13 | v.config.center:succeed(v) 14 | end 15 | end, 16 | mxms_credits = { 17 | art = { "Maxiss02" }, 18 | code = { "theAstra" }, 19 | idea = { "Maxiss02" } 20 | }, 21 | can_use = function(self, card) 22 | if #G.mxms_horoscope.cards >= 1 then 23 | return true 24 | end 25 | return false 26 | end 27 | } 28 | else 29 | sendDebugMessage("Doppelganger not loaded; Horoscopes Disabled", 'Maximus') 30 | end 31 | -------------------------------------------------------------------------------- /items/jokers/chekhov.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'chekhov', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 1, 6 | y = 10 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 3, 14 | blueprint_compat = true, 15 | cost = 6, 16 | calculate = function(self, card, context) 17 | if context.joker_main and G.P_BLINDS[G.GAME.round_resets.blind_choices.Boss].boss.showdown then 18 | return { 19 | Xmult_mod = G.GAME.round_resets.blind_ante, 20 | message = 'x' .. G.GAME.round_resets.blind_ante, 21 | colour = G.C.MULT, 22 | card = card 23 | } 24 | end 25 | end, 26 | in_pool = function(self, args) 27 | if G.GAME.round_resets.blind_ante <= 4 then 28 | return true 29 | end 30 | 31 | return false 32 | end 33 | } 34 | -------------------------------------------------------------------------------- /items/jokers/loony.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'loony', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 2, 6 | y = 4 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | mult = 10, 12 | type = 'High Card' 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "Maxiss02" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 3, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | return { 25 | vars = { stg.mult, localize(stg.type, 'poker_hands') } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | if context.joker_main and context.scoring_name == 'High Card' then 31 | return { 32 | mult = stg.mult 33 | } 34 | end 35 | end 36 | } 37 | -------------------------------------------------------------------------------- /items/jokers/lazy.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'lazy', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 4 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | chips = 40, 12 | type = 'High Card' 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "Maxiss02" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 3, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | return { 25 | vars = { stg.chips, localize(stg.type, 'poker_hands') } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | if context.joker_main and context.scoring_name == 'High Card' then 31 | return { 32 | chips = stg.chips 33 | } 34 | end 35 | end 36 | } 37 | -------------------------------------------------------------------------------- /items/jokers/schrodinger.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'schrodinger', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 0, 6 | y = 10 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 3, 14 | blueprint_compat = false, 15 | cost = 6, 16 | calculate = function(self, card, context) 17 | if context.retrigger_joker_check and not context.retrigger_joker and context.other_card.ability then 18 | return { 19 | message = localize('k_again_ex'), 20 | repetitions = 1, 21 | card = card 22 | } 23 | end 24 | end 25 | } 26 | 27 | local ccj = Card.calculate_joker 28 | function Card:calculate_joker(context) 29 | if next(SMODS.find_card('j_mxms_schrodinger')) and self.ability.name ~= 'j_mxms_schrodinger' and pseudorandom('schro') < 0.5 then return end 30 | return ccj(self, context) 31 | end 32 | -------------------------------------------------------------------------------- /items/backs/scarred.lua: -------------------------------------------------------------------------------- 1 | SMODS.Back { 2 | key = 'scarred', 3 | mxms_credits = { 4 | art = { "pinkzigzagoon" }, 5 | code = { "theAstra" }, 6 | idea = { "theAstra" } 7 | }, 8 | apply = function(self, back) 9 | local legendary_keys = { 10 | 'j_mxms_ledger', 11 | 'j_mxms_galifianakis', 12 | 'j_mxms_romero', 13 | 'j_mxms_leto', 14 | 'j_mxms_nicholson', 15 | 'j_mxms_phoenix', 16 | 'j_mxms_hamill', 17 | 'j_mxms_hugo', 18 | } 19 | 20 | G.E_MANAGER:add_event(Event({ 21 | trigger = 'after', 22 | func = function() 23 | SMODS.add_card({ 24 | key = pseudorandom_element(legendary_keys, pseudoseed('mxms_scarred')), 25 | no_edition = true, 26 | skip_materialize = false 27 | }) 28 | return true; 29 | end 30 | })) 31 | end 32 | } 33 | -------------------------------------------------------------------------------- /items/tags/ram.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.horoscopes then 2 | SMODS.Tag { 3 | key = 'ram', 4 | atlas = 'Tags', 5 | pos = { 6 | x = 1, 7 | y = 0 8 | }, 9 | min_ante = 2, 10 | mxms_credits = { 11 | art = { "Maxiss02" }, 12 | code = { "theAstra" }, 13 | idea = { "Maxiss02" } 14 | }, 15 | apply = function(self, tag, context) 16 | if context.type == 'start_apply_horoscopes' and not G.GAME.mxms_aries_bonus then 17 | G.GAME.mxms_aries_bonus = true 18 | tag:yep("+", Maximus.C.SET.Horoscope, function() 19 | return true 20 | end) 21 | tag.triggered = true 22 | return true 23 | end 24 | end, 25 | in_pool = function(self, args) 26 | return false 27 | end 28 | } 29 | else 30 | sendDebugMessage("Ram Tag not loaded; Horoscopes Disabled", 'Maximus') 31 | end 32 | -------------------------------------------------------------------------------- /items/challenges/target_practice.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'target_practice', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_bullseye_requirement', value = 500 }, 6 | { id = 'mxms_bullseye_requirement2'}, 7 | } 8 | }, 9 | jokers = { 10 | { id = 'j_mr_bones', edition = 'negative' }, 11 | { id = 'j_mxms_bullseye', edition = 'negative', eternal = true } 12 | }, 13 | deck = { 14 | type = 'Challenge Deck' 15 | }, 16 | calculate = function(self, context) 17 | if context.end_of_round and G.GAME.round_resets.ante == G.GAME.win_ante and G.GAME.blind:get_type() == 'Boss' then 18 | if next(SMODS.find_card('j_mxms_bullseye')) 19 | and G.GAME.modifiers.mxms_bullseye_requirement > SMODS.find_card('j_mxms_bullseye')[1].ability.extra.chips 20 | or not next(SMODS.find_card('j_mxms_bullseye')) then 21 | Maximus.force_game_over() 22 | end 23 | end 24 | end 25 | } 26 | -------------------------------------------------------------------------------- /items/jokers/high_dive.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'high_dive', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 2, 6 | y = 10 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = 1 11 | }, 12 | mxms_credits = { 13 | art = { "pinkzigzagoon" }, 14 | code = { "theAstra" }, 15 | idea = { "pinkzigzagoon" } 16 | }, 17 | blueprint_compat = true, 18 | cost = 5, 19 | calculate = function(self, card, context) 20 | local stg = card.ability.extra 21 | 22 | if context.modify_scoring_hand and G.GAME.last_hand_played == 'High Card' then 23 | return { 24 | add_to_hand = true 25 | } 26 | end 27 | 28 | if context.repetition and context.cardarea == G.play and context.scoring_name == "High Card" then 29 | return { 30 | message = localize('k_again_ex'), 31 | repetitions = stg, 32 | card = card 33 | } 34 | end 35 | end 36 | } 37 | -------------------------------------------------------------------------------- /items/tags/lion.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.horoscopes then 2 | SMODS.Tag { 3 | key = 'lion', 4 | atlas = 'Tags', 5 | pos = { 6 | x = 3, 7 | y = 0 8 | }, 9 | min_ante = 2, 10 | mxms_credits = { 11 | art = { "Maxiss02" }, 12 | code = { "theAstra" }, 13 | idea = { "Maxiss02" } 14 | }, 15 | apply = function(self, tag, context) 16 | if context.type == 'start_apply_horoscopes' then 17 | tag:yep("+", Maximus.C.SET.Horoscope, function() 18 | G.GAME.mxms_leo_bonus = G.GAME.mxms_leo_bonus + 3 19 | G.hand:change_size(3) 20 | return true 21 | end) 22 | tag.triggered = true 23 | return true 24 | end 25 | end, 26 | in_pool = function(self, args) 27 | return false 28 | end 29 | } 30 | else 31 | sendDebugMessage("Lion Tag not loaded; Horoscopes Disabled", 'Maximus') 32 | end 33 | -------------------------------------------------------------------------------- /items/jokers/gambler.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'gambler', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 1, 6 | y = 3 7 | }, 8 | rarity = 1, 9 | mxms_credits = { 10 | art = { "Maxiss02" }, 11 | code = { "theAstra" }, 12 | idea = { "Maxiss02" } 13 | }, 14 | blueprint_compat = false, 15 | cost = 7, 16 | add_to_deck = function(self, card, from_debuff) 17 | G.GAME.mxms_gambler_mod = G.GAME.mxms_gambler_mod * 2 18 | G.GAME.interest_cap = G.GAME.interest_cap * 2 19 | end, 20 | remove_from_deck = function(self, card, from_debuff) 21 | G.GAME.mxms_gambler_mod = G.GAME.mxms_gambler_mod / 2 22 | G.GAME.interest_cap = G.GAME.interest_cap / 2 23 | end 24 | } 25 | 26 | SMODS.JimboQuip { 27 | key = 'lq_gambler', 28 | type = 'loss', 29 | extra = { center = 'j_mxms_gambler' } 30 | } 31 | 32 | SMODS.JimboQuip { 33 | key = 'wq_gambler', 34 | type = 'win', 35 | extra = { 36 | center = 'j_mxms_gambler', 37 | times = 2 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /items/jokers/golden_rings.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'golden_rings', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 6, 6 | y = 14 7 | }, 8 | mxms_credits = { 9 | art = { "pinkzigzagoon" }, 10 | code = { "theAstra" }, 11 | idea = { "pinkzigzagoon" } 12 | }, 13 | rarity = 1, 14 | blueprint_compat = false, 15 | cost = 5 16 | } 17 | 18 | local gf = get_flush 19 | 20 | function get_flush(hand) 21 | if next(SMODS.find_card('j_mxms_golden_rings')) then 22 | local all_enhanced = true 23 | local rings_ret = {} 24 | local rings_table = {} 25 | for i = 1, #hand do 26 | if not next(SMODS.get_enhancements(hand[i])) then all_enhanced = false end 27 | rings_table[#rings_table + 1] = hand[i] 28 | end 29 | if all_enhanced and #hand >= (5 - (next(find_joker('Four Fingers')) and 1 or 0)) then 30 | table.insert(rings_ret, rings_table) 31 | return rings_ret 32 | end 33 | end 34 | 35 | return gf(hand) 36 | end 37 | -------------------------------------------------------------------------------- /items/challenges/picky.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'picky', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_picky' }, 6 | { id = 'mxms_picky2' }, 7 | } 8 | }, 9 | jokers = {}, 10 | deck = { 11 | type = 'Challenge Deck' 12 | }, 13 | calculate = function(self, context) 14 | if context.setting_blind and #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit then 15 | G.GAME.joker_buffer = G.GAME.joker_buffer + 1 16 | G.E_MANAGER:add_event(Event({ 17 | func = function() 18 | local new_card = SMODS.add_card({ 19 | set = 'Joker', 20 | key = 'j_mxms_four_course_meal', 21 | key_append = 'picky' 22 | }) 23 | new_card:juice_up(0.3, 0.4) 24 | G.GAME.joker_buffer = G.GAME.joker_buffer - 1 25 | return true; 26 | end 27 | })) 28 | end 29 | end 30 | } 31 | -------------------------------------------------------------------------------- /items/jokers/celestial_deity.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'celestial_deity', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 6, 6 | y = 12 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | extra_levels = 1 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "theAstra" } 18 | }, 19 | blueprint_compat = false, 20 | cost = 7, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.extra_levels } 25 | } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | 30 | if context.using_consumeable and context.consumeable.ability.set == 'Planet' and context.consumeable.ability.consumeable.hand_type then 31 | SMODS.smart_level_up_hand(card, context.consumeable.ability.consumeable.hand_type, nil, stg.extra_levels) 32 | end 33 | end, 34 | } 35 | -------------------------------------------------------------------------------- /items/jokers/severed_floor.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'severed_floor', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 0, 6 | y = 14 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | money = 20, 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "pinkzigzagoon" }, 16 | code = { "theAstra" }, 17 | idea = { "pinkzigzagoon" } 18 | }, 19 | blueprint_compat = false, 20 | cost = 6, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.money } 25 | } 26 | end, 27 | calc_dollar_bonus = function(self, card) 28 | return card.ability.extra.money 29 | end 30 | } 31 | 32 | local ccsc = Card.can_sell_card 33 | Card.can_sell_card = function(self, context) 34 | local ret = ccsc(self, context) 35 | if self.config.center_key == 'j_mxms_severed_floor' and G.STATE == G.STATES.ROUND_EVAL then 36 | ret = false 37 | end 38 | return ret 39 | end 40 | -------------------------------------------------------------------------------- /items/jokers/sleuth.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'sleuth', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 0, 6 | y = 5 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | slots = 1 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = false, 20 | cost = 6, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.slots } 25 | } 26 | end, 27 | add_to_deck = function(self, card, from_debuff) 28 | local stg = card.ability.extra 29 | change_shop_size(stg.slots) 30 | end, 31 | 32 | remove_from_deck = function(self, card, from_debuff) 33 | local stg = card.ability.extra 34 | change_shop_size(-stg.slots) 35 | end 36 | } 37 | 38 | SMODS.JimboQuip { 39 | key = 'lq_sleuth', 40 | type = 'loss', 41 | extra = { center = 'j_mxms_sleuth' } 42 | } 43 | -------------------------------------------------------------------------------- /items/jokers/slippery_slope.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'slippery_slope', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 11 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = true, 15 | cost = 6, 16 | calculate = function(self, card, context) 17 | if context.joker_main then 18 | for k, v in pairs(context.poker_hands) do 19 | if k ~= context.scoring_name and SMODS.PokerHands[k] and next(v) then 20 | SMODS.calculate_effect({ message = localize(k, 'poker_hands'), colour = G.C.ATTENTION }, 21 | context.blueprint_card or card) 22 | SMODS.calculate_effect({ chips = SMODS.PokerHands[k].chips }, context.blueprint_card or card) 23 | SMODS.calculate_effect({ mult = SMODS.PokerHands[k].mult }, context.blueprint_card or card) 24 | end 25 | end 26 | end 27 | end 28 | } 29 | -------------------------------------------------------------------------------- /lovely/honorable.toml: -------------------------------------------------------------------------------- 1 | [manifest] 2 | version = "1.0.0" 3 | dump_lua = true 4 | priority = 1 5 | 6 | # Give Judgement its own context 7 | [[patches]] 8 | [patches.pattern] 9 | target = "card.lua" 10 | pattern = ''' 11 | if self.ability.name == 'Judgement' or self.ability.name == 'The Soul' then 12 | G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function() 13 | play_sound('timpani') 14 | local card = create_card('Joker', G.jokers, self.ability.name == 'The Soul', nil, nil, nil, nil, self.ability.name == 'Judgement' and 'jud' or 'sou') 15 | card:add_to_deck() 16 | G.jokers:emplace(card) 17 | if self.ability.name == 'The Soul' then check_for_unlock{type = 'spawn_legendary'} end 18 | used_tarot:juice_up(0.3, 0.5) 19 | ''' 20 | position = "after" 21 | payload = ''' 22 | if self.ability.name == 'Judgement' and next(SMODS.find_card('j_mxms_honorable')) then 23 | delay(0.6) 24 | SMODS.calculate_context({mxms_judgement_used = true, card = card}) 25 | end 26 | ''' 27 | match_indent = true 28 | times = 1 -------------------------------------------------------------------------------- /items/jokers/bell_curve.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'bell_curve', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 8, 6 | y = 3 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | Xmult = 3 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 7, 21 | loc_vars = function(self, info_queue, card) 22 | local calc = 3 23 | if G.playing_cards ~= nil then 24 | calc = 2 * math.exp(-(((#G.playing_cards - 52) ^ 2) / 250)) + 1 25 | end 26 | return { 27 | vars = { calc } 28 | } 29 | end, 30 | calculate = function(self, card, context) 31 | local stg = card.ability.extra 32 | if context.joker_main then 33 | stg.Xmult = 2 * math.exp(-(((#G.playing_cards - 52) ^ 2) / 250)) + 1 34 | return { 35 | x_mult = stg.Xmult, 36 | } 37 | end 38 | end 39 | } 40 | -------------------------------------------------------------------------------- /items/blinds/envy.lua: -------------------------------------------------------------------------------- 1 | SMODS.Blind { 2 | key = 'envy', 3 | boss = { 4 | min = 5, 5 | max = 10 6 | }, 7 | atlas = 'Blinds', 8 | pos = { 9 | x = 0, 10 | y = 2 11 | }, 12 | mxms_credits = { 13 | art = { "Maxiss02" }, 14 | code = { "theAstra" }, 15 | idea = { "theAstra" } 16 | }, 17 | boss_colour = HEX('4CCAA9'), 18 | calculate = function(self, card, context) 19 | if context.post_trigger and context.cardarea == G.jokers and context.other_ret 20 | and not (context.other_context.end_of_round or context.other_context.setting_blind) 21 | and not G.GAME.blind.disabled then 22 | G.E_MANAGER:add_event(Event({ 23 | trigger = 'after', 24 | delay = 0.1, 25 | func = function() 26 | SMODS.juice_up_blind() 27 | return true; 28 | end 29 | })) 30 | delay(0.23) 31 | ease_dollars(-1) 32 | self.triggered = true 33 | end 34 | end 35 | } 36 | -------------------------------------------------------------------------------- /items/backs/sixth_finger.lua: -------------------------------------------------------------------------------- 1 | SMODS.Back { 2 | key = 'sixth_finger', 3 | atlas = 'Modifiers', 4 | pos = { 5 | x = 0, 6 | y = 0 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | apply = function(self, back) 14 | --Change limits 15 | G.E_MANAGER:add_event(Event({ 16 | func = function() 17 | SMODS.change_play_limit(1) 18 | SMODS.change_discard_limit(1) 19 | return true; 20 | end 21 | })) 22 | 23 | if Maximus_config.new_handtypes then 24 | -- Make non-secret hands visible 25 | G.GAME.hands.mxms_three_pair.visible = true 26 | G.GAME.hands.mxms_double_triple.visible = true 27 | G.GAME.hands.mxms_s_straight.visible = true 28 | G.GAME.hands.mxms_s_flush.visible = true 29 | G.GAME.hands.mxms_house_party.visible = true 30 | G.GAME.hands.mxms_s_straight_f.visible = true 31 | end 32 | end 33 | } 34 | -------------------------------------------------------------------------------- /items/backs/sleeves/nirvana.lua: -------------------------------------------------------------------------------- 1 | CardSleeves.Sleeve { 2 | key = "nirvana", 3 | atlas = "Sleeves", 4 | pos = { 5 | x = 1, 6 | y = 0 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | loc_vars = function(self, info_queue, card) 14 | local key 15 | if self.get_current_deck_key() == 'b_mxms_nirvana' then 16 | key = self.key .. '_alt' 17 | else 18 | key = self.key 19 | end 20 | return { key = key } 21 | end, 22 | apply = function(self, sleeve) 23 | if self.get_current_deck_key() == 'b_mxms_nirvana' then 24 | -- If on Nirvana deck, give 2 extra free rerolls 25 | SMODS.change_free_rerolls(2) 26 | calculate_reroll_cost(true) 27 | else 28 | --Change shop prices 29 | G.GAME.mxms_shop_price_multiplier = 1.5 30 | 31 | -- Change reroll starting price 32 | G.GAME.starting_params.reroll_cost = 0 33 | end 34 | end 35 | } 36 | -------------------------------------------------------------------------------- /items/jokers/gangster_love.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'gangster_love', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 17 7 | }, 8 | mxms_credits = { 9 | art = { "anerdymous" }, 10 | code = { "theAstra" }, 11 | idea = { "anerdymous" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = false, 15 | cost = 4, 16 | calculate = function(self, card, context) 17 | if context.before and next(context.poker_hands['Flush']) and not context.blueprint then 18 | for k, v in pairs(context.scoring_hand) do 19 | SMODS.change_base(v, "Hearts", nil) 20 | G.E_MANAGER:add_event(Event({ 21 | func = function() 22 | v:juice_up(0.3, 0.4) 23 | return true 24 | end 25 | })) 26 | end 27 | return { 28 | message = localize('k_mxms_love_ex'), 29 | colour = G.C.HEARTS, 30 | sound = 'mxms_joker' 31 | } 32 | end 33 | end 34 | } 35 | -------------------------------------------------------------------------------- /items/jokers/loaded_gun.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'loaded_gun', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 0, 6 | y = 4 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | Xmult = 1.5 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 8, 21 | enhancement_gate = 'm_steel', 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | info_queue[#info_queue + 1] = G.P_CENTERS.m_steel 25 | return { vars = { stg.Xmult } } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | if context.individual and context.cardarea == G.play and SMODS.has_enhancement(context.other_card, 'm_steel') then 30 | return { 31 | x_mult = stg.Xmult, 32 | colour = G.C.MULT, 33 | card = card 34 | } 35 | end 36 | end 37 | } 38 | -------------------------------------------------------------------------------- /items/jokers/trashman.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'trashman', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 1, 6 | y = 15 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | money = 1 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "pinkzigzagoon" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 5, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.money } 25 | } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | 30 | if context.individual and context.cardarea == 'unscored' then 31 | return { 32 | dollars = stg.money, 33 | message_card = context.other_card 34 | } 35 | end 36 | end 37 | } 38 | 39 | SMODS.JimboQuip { 40 | key = 'lq_trashman', 41 | type = 'loss', 42 | extra = { center = 'j_mxms_trashman' } 43 | } 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 the-Astra 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /items/jokers/microwave.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'microwave', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 0 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = true, 15 | eternal_compat = false, 16 | cost = 6, 17 | calculate = function(self, card, context) 18 | -- Thank you to theonegoodali from the Balatro Discord for helping me with this conditional 19 | if context.retrigger_joker_check and not context.retrigger_joker and (context.other_card.config.center.pools and context.other_card.config.center.pools.Food) 20 | and context.other_card.config.center_key ~= "j_mxms_leftovers" then 21 | return { 22 | message = localize('k_again_ex'), 23 | repetitions = 1, 24 | card = card 25 | } 26 | end 27 | end 28 | } 29 | 30 | SMODS.JimboQuip { 31 | key = 'wq_microwave', 32 | type = 'win', 33 | extra = { center = 'j_mxms_microwave' } 34 | } 35 | -------------------------------------------------------------------------------- /items/jokers/bear.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'bear', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 8, 6 | y = 14 7 | }, 8 | rarity = 1, 9 | blueprint_compat = true, 10 | cost = 4, 11 | config = { 12 | extra = { 13 | gain = 0.5 14 | } 15 | }, 16 | mxms_credits = { 17 | art = { "Maxiss02" }, 18 | code = { "theAstra" }, 19 | idea = { "anerdymous" } 20 | }, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | local xmult = 1 24 | 25 | if to_big(G.GAME.dollars) < to_big(0) then 26 | xmult = xmult + (math.abs(G.GAME.dollars) * stg.gain) 27 | end 28 | 29 | return { 30 | vars = { stg.gain, xmult } 31 | } 32 | end, 33 | calculate = function(self, card, context) 34 | local stg = card.ability.extra 35 | 36 | if context.joker_main and to_big(G.GAME.dollars) < to_big(0) then 37 | return { 38 | x_mult = 1 + math.abs(G.GAME.dollars) * stg.gain 39 | } 40 | end 41 | end 42 | } 43 | -------------------------------------------------------------------------------- /items/tags/crab.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.horoscopes then 2 | SMODS.Tag { 3 | key = 'crab', 4 | atlas = 'Tags', 5 | pos = { 6 | x = 2, 7 | y = 0 8 | }, 9 | min_ante = 2, 10 | mxms_credits = { 11 | art = { "Maxiss02" }, 12 | code = { "theAstra" }, 13 | idea = { "Maxiss02" } 14 | }, 15 | apply = function(self, tag, context) 16 | if context.type == 'start_apply_horoscopes' then 17 | tag:yep("+", Maximus.C.SET.Horoscope, function() 18 | G.GAME.mxms_cancer_bonus = G.GAME.mxms_cancer_bonus + 2 19 | G.GAME.round_resets.hands = G.GAME.round_resets.hands + 2 20 | ease_hands_played(2) 21 | return true 22 | end) 23 | tag.triggered = true 24 | return true 25 | end 26 | end, 27 | in_pool = function(self, args) 28 | return false 29 | end 30 | } 31 | else 32 | sendDebugMessage("Crab Tag not loaded; Horoscopes Disabled", 'Maximus') 33 | end 34 | -------------------------------------------------------------------------------- /items/tags/maiden.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.horoscopes then 2 | SMODS.Tag { 3 | key = 'maiden', 4 | atlas = 'Tags', 5 | pos = { 6 | x = 4, 7 | y = 0 8 | }, 9 | min_ante = 2, 10 | mxms_credits = { 11 | art = { "Maxiss02" }, 12 | code = { "theAstra" }, 13 | idea = { "Maxiss02" } 14 | }, 15 | apply = function(self, tag, context) 16 | if context.type == 'start_apply_horoscopes' then 17 | tag:yep("+", Maximus.C.SET.Horoscope, function() 18 | G.GAME.mxms_virgo_bonus = G.GAME.mxms_virgo_bonus + 3 19 | G.GAME.round_resets.discards = G.GAME.round_resets.discards + 3 20 | ease_discard(3) 21 | return true 22 | end) 23 | tag.triggered = true 24 | return true 25 | end 26 | end, 27 | in_pool = function(self, args) 28 | return false 29 | end 30 | } 31 | else 32 | sendDebugMessage("Maiden Tag not loaded; Horoscopes Disabled", 'Maximus') 33 | end 34 | -------------------------------------------------------------------------------- /lovely/virus.toml: -------------------------------------------------------------------------------- 1 | [manifest] 2 | version = "1.0.0" 3 | dump_lua = true 4 | priority = 1 5 | 6 | # Apply Virus search in get_flush 7 | [[patches]] 8 | [patches.pattern] 9 | target = "functions/misc_functions.lua" 10 | pattern = ''' 11 | local suits = SMODS.Suit.obj_buffer 12 | ''' 13 | position = "before" 14 | payload = ''' 15 | local virus = next(SMODS.find_card('j_mxms_virus')) 16 | ''' 17 | match_indent = true 18 | times = 1 19 | 20 | [[patches]] 21 | [patches.pattern] 22 | target = "functions/misc_functions.lua" 23 | pattern = ''' 24 | if #hand < four_fingers then return ret else 25 | ''' 26 | position = "at" 27 | payload = ''' 28 | if #hand < four_fingers and not (virus and #hand >= 2) then return ret else 29 | ''' 30 | match_indent = true 31 | times = 1 32 | 33 | [[patches]] 34 | [patches.pattern] 35 | target = "functions/misc_functions.lua" 36 | pattern = ''' 37 | if flush_count >= four_fingers then 38 | table.insert(ret, t) 39 | return ret 40 | ''' 41 | position = "after" 42 | payload = ''' 43 | elseif virus and flush_count == #hand and flush_count >= 2 then 44 | table.insert(ret, t) 45 | return ret 46 | ''' 47 | match_indent = true 48 | times = 1 -------------------------------------------------------------------------------- /items/handtypes/s_straight_f.lua: -------------------------------------------------------------------------------- 1 | SMODS.PokerHand { 2 | key = 's_straight_f', 3 | mult = 20, 4 | chips = 200, 5 | l_mult = 5, 6 | l_chips = 55, 7 | atlas = 'poker_hands', 8 | pos = { x = 0, y = 8 }, 9 | example = { 10 | 11 | { 'S_A', true }, 12 | { 'S_K', true }, 13 | { 'S_Q', true }, 14 | { 'S_J', true }, 15 | { 'S_T', true }, 16 | { 'S_9', true } 17 | 18 | }, 19 | visible = false, 20 | evaluate = function(parts, hand) 21 | return next(parts.mxms_s_straight) and next(parts.mxms_s_flush) 22 | and { SMODS.merge_lists(parts.mxms_s_straight, parts.mxms_s_flush) } or {} 23 | end, 24 | modify_display_text = function(self, cards, scoring_hand) 25 | local royal = true 26 | for i = 1, #scoring_hand do 27 | local rank = SMODS.Ranks[scoring_hand[i].base.value] 28 | royal = royal and (rank.key == 'Ace' or rank.key == '10' or rank.key == '9' or rank.face) 29 | end 30 | if royal then 31 | return 'mxms_super_royal' 32 | else 33 | return 'mxms_s_straight_f' 34 | end 35 | end 36 | } 37 | -------------------------------------------------------------------------------- /items/jokers/nicholson.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'nicholson', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 7 7 | }, 8 | soul_pos = { 9 | x = 4, 10 | y = 8 11 | }, 12 | config = { 13 | extra = { 14 | reps = 1 15 | } 16 | }, 17 | rarity = 4, 18 | unlocked = false, 19 | unlock_condition = { 20 | type = '', 21 | extra = '', 22 | hidden = true 23 | }, 24 | mxms_credits = { 25 | art = { "Maxiss02" }, 26 | code = { "theAstra" }, 27 | idea = { "9mmPeter" } 28 | }, 29 | blueprint_compat = true, 30 | cost = 20, 31 | calculate = function(self, card, context) 32 | local stg = card.ability.extra 33 | 34 | if context.other_card and context.other_card.edition and 35 | (context.repetition and context.cardarea == G.play or 36 | context.retrigger_joker_check and not context.retrigger_joker) then 37 | return { 38 | message = localize('k_again_ex'), 39 | repetitions = stg.reps, 40 | card = card 41 | } 42 | end 43 | end 44 | } 45 | -------------------------------------------------------------------------------- /lovely/eggsplosion.toml: -------------------------------------------------------------------------------- 1 | [manifest] 2 | version = "1.0.0" 3 | dump_lua = true 4 | priority = 1 5 | 6 | # Change egg to have chance to explode when retriggered by Microwave 7 | [[patches]] 8 | [patches.pattern] 9 | target = "card.lua" 10 | pattern = ''' 11 | SMODS.scale_card(self, { 12 | ref_table = self.ability, 13 | ref_value = "extra_value", 14 | scalar_value = "extra", 15 | scaling_message = { 16 | message = localize('k_val_up'), 17 | colour = G.C.MONEY 18 | } 19 | }) 20 | self:set_cost() 21 | ''' 22 | position = "after" 23 | payload = ''' 24 | if next(SMODS.find_card('j_mxms_microwave')) and pseudorandom('eggsplode' .. G.GAME.round_resets.ante, 1, 20) == 1 then 25 | G.E_MANAGER:add_event(Event({ 26 | func = function() 27 | play_sound('mxms_eggsplosion') 28 | ease_dollars(self.sell_cost) 29 | self:start_dissolve({G.C.ORANGE}, nil, 1.6) 30 | 31 | check_for_unlock({ type = "eggsplosion" }) 32 | return true; 33 | end 34 | })) 35 | return { 36 | message = localize('k_mxms_exploded_el'), 37 | colour = G.C.MONEY 38 | } 39 | end 40 | ''' 41 | match_indent = true 42 | times = 1 -------------------------------------------------------------------------------- /items/jokers/spam.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'spam', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 7, 6 | y = 12 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | hands = 0 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = false, 20 | cost = 4, 21 | add_to_deck = function(self, card, from_debuff) 22 | local stg = card.ability.extra 23 | 24 | if G.hand.config.card_limit - 1 > 0 then 25 | stg.hands = G.hand.config.card_limit - 1 26 | G.hand:change_size(-stg.hands) 27 | G.GAME.round_resets.hands = G.GAME.round_resets.hands + stg.hands 28 | ease_hands_played(stg.hands) 29 | end 30 | end, 31 | remove_from_deck = function(self, card, from_debuff) 32 | local stg = card.ability.extra 33 | if stg.hands > 0 then 34 | G.hand:change_size(stg.hands) 35 | G.GAME.round_resets.hands = G.GAME.round_resets.hands - stg.hands 36 | ease_hands_played(-stg.hands) 37 | end 38 | end 39 | } 40 | -------------------------------------------------------------------------------- /items/jokers/guillotine.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'guillotine', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 2, 6 | y = 5 7 | }, 8 | rarity = 3, 9 | mxms_credits = { 10 | art = { "Maxiss02" }, 11 | code = { "theAstra" }, 12 | idea = { "Maxiss02" } 13 | }, 14 | blueprint_compat = false, 15 | cost = 9, 16 | calculate = function(self, card, context) 17 | if context.before and not context.blueprint then 18 | for i = 1, #context.scoring_hand do 19 | if context.scoring_hand[i]:get_id() > 10 and not context.scoring_hand[i].debuff then 20 | G.E_MANAGER:add_event(Event({ 21 | trigger = 'before', 22 | delay = 0.50, 23 | func = function() 24 | play_sound('slice1') 25 | SMODS.change_base(context.scoring_hand[i], nil, '10') 26 | context.scoring_hand[i]:juice_up(0.3, 0.3) 27 | return true 28 | end 29 | })) 30 | end 31 | end 32 | end 33 | end 34 | } 35 | -------------------------------------------------------------------------------- /items/jokers/space_cowboy.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'space_cowboy', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 17 7 | }, 8 | mxms_credits = { 9 | art = { "anerdymous" }, 10 | code = { "theAstra" }, 11 | idea = { "anerdymous" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = true, 15 | cost = 5, 16 | calculate = function(self, card, context) 17 | if context.end_of_round and not context.individual and not context.repetition 18 | and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then 19 | G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 20 | G.E_MANAGER:add_event(Event({ 21 | func = function() 22 | SMODS.add_card({ set = 'Planet' }) 23 | G.GAME.consumeable_buffer = G.GAME.consumeable_buffer - 1 24 | return true; 25 | end 26 | })) 27 | return { 28 | message = localize('k_plus_planet'), 29 | colour = G.C.SECONDARY_SET.Planet, 30 | sound = 'mxms_joker' 31 | } 32 | end 33 | end 34 | } 35 | -------------------------------------------------------------------------------- /items/boosters/horoscope_jumbo_1.lua: -------------------------------------------------------------------------------- 1 | SMODS.Booster { 2 | key = "horoscope_jumbo_1", 3 | kind = "Horoscope", 4 | atlas = "Boosters", 5 | group_key = "k_mxms_zodiac_pack", 6 | pos = { 7 | x = 2, 8 | y = 0 9 | }, 10 | config = { 11 | extra = 4, 12 | choose = 1 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" } 17 | }, 18 | cost = 6, 19 | weight = 0.48, 20 | select_card = 'mxms_horoscope', 21 | create_card = function(self, card) 22 | return create_card("Horoscope", G.pack_cards, nil, nil, true, true, nil, "mxms_zodiac") 23 | end, 24 | ease_background_colour = function(self) 25 | ease_colour(G.C.DYN_UI.MAIN, Maximus.C.SET.Horoscope) 26 | ease_background_colour({ new_colour = Maximus.C.SET.Horoscope, special_colour = G.C.BLACK, contrast = 2 }) 27 | end, 28 | loc_vars = function(self, info_queue, card) 29 | return { vars = { math.min(card.ability.choose + (G.GAME.modifiers.booster_choice_mod or 0), math.max(1, card.ability.extra + (G.GAME.modifiers.booster_size_mod or 0))), math.max(1, card.ability.extra + (G.GAME.modifiers.booster_size_mod or 0)) } } 30 | end 31 | } 32 | -------------------------------------------------------------------------------- /items/boosters/horoscope_normal_1.lua: -------------------------------------------------------------------------------- 1 | SMODS.Booster { 2 | key = "horoscope_normal_1", 3 | kind = "Horoscope", 4 | atlas = "Boosters", 5 | group_key = "k_mxms_zodiac_pack", 6 | pos = { 7 | x = 0, 8 | y = 0 9 | }, 10 | config = { 11 | extra = 2, 12 | choose = 1 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" } 17 | }, 18 | cost = 4, 19 | weight = 0.96, 20 | select_card = 'mxms_horoscope', 21 | create_card = function(self, card) 22 | return create_card("Horoscope", G.pack_cards, nil, nil, true, true, nil, "mxms_zodiac") 23 | end, 24 | ease_background_colour = function(self) 25 | ease_colour(G.C.DYN_UI.MAIN, Maximus.C.SET.Horoscope) 26 | ease_background_colour({ new_colour = Maximus.C.SET.Horoscope, special_colour = G.C.BLACK, contrast = 2 }) 27 | end, 28 | loc_vars = function(self, info_queue, card) 29 | return { vars = { math.min(card.ability.choose + (G.GAME.modifiers.booster_choice_mod or 0), math.max(1, card.ability.extra + (G.GAME.modifiers.booster_size_mod or 0))), math.max(1, card.ability.extra + (G.GAME.modifiers.booster_size_mod or 0)) } } 30 | end 31 | } 32 | -------------------------------------------------------------------------------- /items/boosters/horoscope_normal_2.lua: -------------------------------------------------------------------------------- 1 | SMODS.Booster { 2 | key = "horoscope_normal_2", 3 | kind = "Horoscope", 4 | atlas = "Boosters", 5 | group_key = "k_mxms_zodiac_pack", 6 | pos = { 7 | x = 1, 8 | y = 0 9 | }, 10 | config = { 11 | extra = 2, 12 | choose = 1 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" } 17 | }, 18 | cost = 4, 19 | weight = 0.96, 20 | select_card = 'mxms_horoscope', 21 | create_card = function(self, card) 22 | return create_card("Horoscope", G.pack_cards, nil, nil, true, true, nil, "mxms_zodiac") 23 | end, 24 | ease_background_colour = function(self) 25 | ease_colour(G.C.DYN_UI.MAIN, Maximus.C.SET.Horoscope) 26 | ease_background_colour({ new_colour = Maximus.C.SET.Horoscope, special_colour = G.C.BLACK, contrast = 2 }) 27 | end, 28 | loc_vars = function(self, info_queue, card) 29 | return { vars = { math.min(card.ability.choose + (G.GAME.modifiers.booster_choice_mod or 0), math.max(1, card.ability.extra + (G.GAME.modifiers.booster_size_mod or 0))), math.max(1, card.ability.extra + (G.GAME.modifiers.booster_size_mod or 0)) } } 30 | end 31 | } 32 | -------------------------------------------------------------------------------- /items/jokers/chef.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'chef', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 0, 6 | y = 2 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 1, 14 | blueprint_compat = true, 15 | cost = 5, 16 | calculate = function(self, card, context) 17 | if context.setting_blind and #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit then 18 | G.GAME.joker_buffer = G.GAME.joker_buffer + 1 19 | G.E_MANAGER:add_event(Event({ 20 | func = function() 21 | SMODS.add_card({ 22 | set = 'Food', 23 | }) 24 | card:juice_up(0.3, 0.4) 25 | G.GAME.joker_buffer = G.GAME.joker_buffer - 1 26 | return true; 27 | end 28 | })) 29 | end 30 | end 31 | } 32 | 33 | SMODS.JimboQuip { 34 | key = 'lq_chef', 35 | type = 'loss', 36 | extra = { center = 'j_mxms_chef' } 37 | } 38 | 39 | SMODS.JimboQuip { 40 | key = 'wq_chef', 41 | type = 'win', 42 | extra = { center = 'j_mxms_chef' } 43 | } 44 | -------------------------------------------------------------------------------- /items/jokers/old_man_jimbo.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'old_man_jimbo', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 2, 6 | y = 1 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | gain = 0.5 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 6, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { vars = { stg.gain } } 24 | end, 25 | calculate = function(self, card, context) 26 | local stg = card.ability.extra 27 | if context.joker_main then 28 | return { 29 | x_mult = 1 + (stg.gain * G.GAME.current_round.hands_left) 30 | } 31 | end 32 | end 33 | } 34 | 35 | SMODS.JimboQuip { 36 | key = 'lq_old_man_jimbo', 37 | type = 'loss', 38 | extra = { 39 | center = 'j_mxms_old_man_jimbo', 40 | times = 30, 41 | delay = 0.2 42 | } 43 | } 44 | 45 | SMODS.JimboQuip { 46 | key = 'wq_old_man_jimbo', 47 | type = 'win', 48 | extra = { center = 'j_mxms_old_man_jimbo' } 49 | } 50 | -------------------------------------------------------------------------------- /items/jokers/hypeman.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'hypeman', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 6, 6 | y = 9 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | dollars = 1 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = false, 20 | cost = 6, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.dollars } 25 | } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | 30 | if context.setting_ability and string.sub(context.new, 1, 2) == 'm_' then 31 | ease_dollars(stg.dollars) 32 | return { 33 | message = localize('$') .. stg.dollars, 34 | colour = G.C.GOLD, 35 | sound = 'mxms_hey' 36 | } 37 | end 38 | end, 39 | } 40 | 41 | SMODS.JimboQuip { 42 | key = 'wq_hypeman', 43 | type = 'win', 44 | extra = { 45 | center = 'j_mxms_hypeman', 46 | sound = 'mxms_hey' 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /items/jokers/review.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'review', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 7, 6 | y = 9 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | reps = 1 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = false, 20 | cost = 6, 21 | calculate = function(self, card, context) 22 | local stg = card.ability.extra 23 | if context.repetition and context.cardarea == G.play then 24 | if context.other_card:get_id() == 6 or 25 | context.other_card:get_id() == 7 or 26 | context.other_card:get_id() == 8 or 27 | context.other_card:get_id() == 9 or 28 | context.other_card:get_id() == 10 then 29 | return { 30 | message = localize('k_again_ex'), 31 | repetitions = stg.reps, 32 | card = card 33 | } 34 | end 35 | end 36 | end 37 | } 38 | 39 | SMODS.JimboQuip { 40 | key = 'lq_review', 41 | type = 'loss', 42 | extra = { center = 'j_mxms_review' } 43 | } -------------------------------------------------------------------------------- /items/backs/sleeves/grilled.lua: -------------------------------------------------------------------------------- 1 | CardSleeves.Sleeve { 2 | key = "grilled", 3 | atlas = "Sleeves", 4 | pos = { 5 | x = 1, 6 | y = 1 7 | }, 8 | mxms_credits = { 9 | art = { "pinkzigzagoon" }, 10 | code = { "theAstra" }, 11 | idea = { "pinkzigzagoon" } 12 | }, 13 | loc_vars = function(self, info_queue, card) 14 | local key 15 | if self.get_current_deck_key() == 'b_mxms_grilled' then 16 | key = self.key .. '_alt' 17 | else 18 | key = self.key 19 | end 20 | return { key = key } 21 | end, 22 | apply = function(self, sleeve) 23 | -- Some hooks for these modifiers are in backs/grilled.lua 24 | if self.get_current_deck_key() == 'b_mxms_grilled' then 25 | -- If on Grilled Deck, apply face card Xmult modifier 26 | G.GAME.modifiers.mxms_face_card_xmult = true 27 | else 28 | G.GAME.modifiers.mxms_even_card_mult = true 29 | end 30 | end 31 | } 32 | 33 | local cgcxm = Card.get_chip_x_mult 34 | function Card:get_chip_x_mult(context) 35 | local ret = cgcxm(self, context) 36 | if G.GAME.modifiers.mxms_face_card_xmult and self:is_face() then 37 | ret = ret + 1.25 38 | end 39 | return ret 40 | end 41 | -------------------------------------------------------------------------------- /items/jokers/hamill.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'hamill', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 5, 6 | y = 7 7 | }, 8 | soul_pos = { 9 | x = 5, 10 | y = 8 11 | }, 12 | rarity = 4, 13 | unlocked = false, 14 | unlock_condition = { 15 | type = '', 16 | extra = '', 17 | hidden = true 18 | }, 19 | blueprint_compat = true, 20 | cost = 20, 21 | config = { 22 | extra = { 23 | levels = 1 24 | } 25 | }, 26 | mxms_credits = { 27 | art = { "Maxiss02" }, 28 | code = { "theAstra" }, 29 | idea = { "anerdymous" } 30 | }, 31 | loc_vars = function(self, info_queue, card) 32 | local stg = card.ability.extra 33 | local hand = localize(Maximus.get_most_played_hand(), 'poker_hands') 34 | 35 | return { vars = { stg.levels, hand } } 36 | end, 37 | calculate = function(self, card, context) 38 | local stg = card.ability.extra 39 | local most_played_hand = Maximus.get_most_played_hand() 40 | if context.before and context.scoring_name == most_played_hand then 41 | SMODS.smart_level_up_hand(context.blueprint_card or card, most_played_hand, nil, stg.levels) 42 | end 43 | end 44 | } 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Banner](https://github.com/user-attachments/assets/fa66aa30-60b8-44f9-9d41-5a452ca08b49) 2 | Maximus is a Vanilla+ mod that strives to preserve the Vanilla feel of the game (for the most part, looking at you Nuclear deck) while innovating on newer ideas to keep things fresh! 3 | 4 | Maximus currently adds the following: 5 | - 152 Jokers 6 | - 7 Decks 7 | - 16 Achievements 8 | - 12 Horoscope Cards 9 | - 3 Spectral Cards 10 | - 11 Planet Cards 11 | - 10 Boss Blinds 12 | - 16 Challenges 13 | - 8 Vouchers 14 | - AND MORE!!! 15 | 16 | Mods with Maximus cross-mod support/content: 17 | - [Talisman](https://github.com/SpectralPack/Talisman) 18 | - [CardSleeves](https://github.com/larswijn/CardSleeves) 19 | - [TheFamily](https://github.com/SleepyG11/TheFamilyBalatro) 20 | - [JokerDisplay](https://github.com/nh6574/JokerDisplay) 21 | - [Revo's Vault](https://github.com/Cdrvo/Revos-Vault---Balatro-Mod) 22 | - [NotVanilla](https://github.com/YouhWithAnH/NotVanilla) 23 | 24 | ### [Official Discord](https://discord.gg/GvCCcryM48) 25 | Join to keep up to date with development, contributions, or just to chat with people who also enjoy the mod! 26 | 27 | ### [How to install](https://github.com/Steamodded/smods/wiki) 28 | Follow this guide and unzip the latest release of Maximus into the newly created "Mods" folder 29 | 30 | -------------------------------------------------------------------------------- /items/blinds/grinder.lua: -------------------------------------------------------------------------------- 1 | SMODS.Blind { --The Grinder 2 | key = 'grinder', 3 | boss = { 4 | min = 3, 5 | max = 10 6 | }, 7 | atlas = 'Blinds', 8 | pos = { 9 | x = 0, 10 | y = 1 11 | }, 12 | mxms_credits = { 13 | art = { "Maxiss02" }, 14 | code = { "theAstra" }, 15 | idea = { "Maxiss02" } 16 | }, 17 | boss_colour = HEX('D9638D'), 18 | after_scoring = function(self) 19 | for k, v in ipairs(G.play.cards) do 20 | if (v.ability.set == 'Enhanced' or v.seal or v.edition) and not v.seal ~= 'mxms_black' then 21 | G.E_MANAGER:add_event(Event({ 22 | trigger = 'after', 23 | delay = 0.5, 24 | func = function() 25 | v:set_ability(G.P_CENTERS.c_base) 26 | v:set_seal(nil, nil, true) 27 | v:set_edition(nil, true) 28 | v:juice_up(0.3, 0.4) 29 | play_sound('tarot2') 30 | self.triggered = true 31 | return true 32 | end 33 | })) 34 | SMODS.calculate_effect({ message = "Grinded" }, v) 35 | end 36 | end 37 | end 38 | } 39 | -------------------------------------------------------------------------------- /items/challenges/crusaders.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'crusaders', 3 | rules = {}, 4 | jokers = {}, 5 | vouchers = { 6 | { id = 'v_tarot_merchant' } 7 | }, 8 | restrictions = { 9 | banned_cards = { 10 | { id = 'v_magic_trick' }, 11 | { id = 'v_illusion' }, 12 | { id = 'p_standard_normal_1', ids = { 13 | 'p_standard_normal_1', 'p_standard_normal_2', 14 | 'p_standard_normal_3', 'p_standard_normal_4', 15 | 'p_standard_jumbo_1', 'p_standard_jumbo_2', 16 | 'p_standard_mega_1', 'p_standard_mega_2' } 17 | }, 18 | { id = 'j_dna' }, 19 | { id = 'j_certificate' }, 20 | { id = 'j_marble' }, 21 | { id = 'j_mxms_rock_slide' }, 22 | { id = 'j_mxms_leto' }, 23 | { id = 'c_cryptid' }, 24 | { id = 'c_grim' }, 25 | { id = 'c_familiar' }, 26 | { id = 'c_incantation' }, 27 | } 28 | }, 29 | deck = { 30 | type = 'Challenge Deck', 31 | cards = { 32 | { s = "D", r = "K" }, 33 | { s = "D", r = "K" }, 34 | { s = "D", r = "K" }, 35 | { s = "D", r = "K" }, 36 | { s = "D", r = "K" } 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /items/jokers/fog.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'fog', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 0, 6 | y = 9 7 | }, 8 | mxms_credits = { 9 | art = { "pinkzigzagoon" }, 10 | code = { "theAstra" }, 11 | idea = { "pinkzigzagoon" } 12 | }, 13 | blueprint_compat = false, 14 | cost = 5, 15 | rarity = 2 16 | } 17 | 18 | -- Change 4oaK and 2P to work with Fog 19 | SMODS.PokerHand:take_ownership('Four of a Kind', { 20 | evaluate = function(parts, hand) 21 | if #parts._2 == 2 and next(SMODS.find_card('j_mxms_fog')) then 22 | local pair_1 = parts._2[1] 23 | local pair_2 = parts._2[2] 24 | if math.abs(pair_1[1]:get_id() - pair_2[2]:get_id()) == 1 or (pair_1[1]:get_id() == 14 and pair_2[1]:get_id() == 2) then 25 | return parts._all_pairs 26 | end 27 | end 28 | return parts._4 29 | end 30 | }, 31 | true) 32 | 33 | SMODS.PokerHand:take_ownership('Two Pair', { 34 | evaluate = function(parts, hand) 35 | if next(parts._4) and next(SMODS.find_card('j_mxms_fog')) then return parts._4 end 36 | if #parts._2 < 2 then return {} end 37 | return parts._all_pairs 38 | end 39 | }, 40 | true) 41 | -------------------------------------------------------------------------------- /items/jokers/pngoker.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'pngoker', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 10 7 | }, 8 | mxms_credits = { 9 | art = { "anerdymous" }, 10 | code = { "theAstra" }, 11 | idea = { "anerdymous" } 12 | }, 13 | rarity = 3, 14 | blueprint_compat = false, 15 | cost = 6, 16 | loc_vars = function(self, info_queue, card) 17 | info_queue[#info_queue + 1] = G.P_CENTERS.m_glass 18 | end, 19 | calculate = function(self, card, context) 20 | if context.before and G.GAME.current_round.hands_played == 0 then 21 | for k, v in pairs(context.scoring_hand) do 22 | v:set_ability(G.P_CENTERS.m_glass, nil, true) 23 | G.E_MANAGER:add_event(Event({ 24 | func = function() 25 | v:juice_up() 26 | return true 27 | end 28 | })) 29 | end 30 | return { 31 | message = localize('k_mxms_glassed'), 32 | colour = G.C.FILTER, 33 | card = card 34 | } 35 | end 36 | end 37 | } 38 | 39 | SMODS.JimboQuip { 40 | key = 'wq_pngoker', 41 | type = 'loss', 42 | extra = { center = 'j_mxms_pngoker' } 43 | } -------------------------------------------------------------------------------- /items/vouchers/best_dressed.lua: -------------------------------------------------------------------------------- 1 | SMODS.Voucher { 2 | key = 'best_dressed', 3 | atlas = 'Vouchers', 4 | pos = { 5 | x = 1, 6 | y = 1 7 | }, 8 | config = { 9 | extra = 0.2 10 | }, 11 | mxms_credits = { 12 | art = { "Maxiss02" }, 13 | code = { "theAstra" }, 14 | idea = { "Maxiss02" } 15 | }, 16 | requires = { 'v_mxms_sharp_suit' }, 17 | loc_vars = function(self, info_queue, card) 18 | local stg = card.ability.extra 19 | return { 20 | vars = { stg } 21 | } 22 | end, 23 | calculate = function(self, card, context) 24 | local stg = card.ability.extra 25 | if context.other_consumeable and context.other_consumeable.ability.set == 'Tarot' and context.other_consumeable.ability.consumeable.suit_conv then 26 | local suit_tally = 0 27 | for i = 1, #context.scoring_hand do 28 | if context.scoring_hand[i]:is_suit(context.other_consumeable.ability.consumeable.suit_conv, false) then 29 | suit_tally = suit_tally + 1 30 | end 31 | end 32 | if suit_tally > 0 then 33 | return { 34 | x_mult = stg * suit_tally + 1 35 | } 36 | end 37 | end 38 | end 39 | } 40 | -------------------------------------------------------------------------------- /items/blinds/hurdle.lua: -------------------------------------------------------------------------------- 1 | SMODS.Blind { 2 | key = 'hurdle', 3 | boss = { 4 | min = 1, 5 | max = 10 6 | }, 7 | atlas = 'Blinds', 8 | pos = { 9 | x = 0, 10 | y = 6 11 | }, 12 | mxms_credits = { 13 | art = { "pinkzigzagoon" }, 14 | code = { "theAstra" }, 15 | idea = { "pinkzigzagoon" } 16 | }, 17 | boss_colour = HEX('EE6672'), 18 | calculate = function(self, card, context) 19 | if context.before and not G.GAME.blind.disabled then 20 | local first_card = context.scoring_hand[1] 21 | if first_card then 22 | first_card.debuffed_by_blind = true 23 | first_card:set_debuff(true) 24 | self.triggered = true 25 | end 26 | end 27 | end, 28 | disable = function(self) 29 | for k, v in pairs(G.playing_cards) do 30 | if v.debuffed_by_blind then 31 | v:set_debuff(); v.debuffed_by_blind = nil 32 | end 33 | end 34 | self.triggered = false 35 | end, 36 | defeat = function(self) 37 | for k, v in pairs(G.playing_cards) do 38 | if v.debuffed_by_blind then 39 | v:set_debuff(); v.debuffed_by_blind = nil 40 | end 41 | end 42 | self.triggered = false 43 | end 44 | } 45 | -------------------------------------------------------------------------------- /items/backs/grilled.lua: -------------------------------------------------------------------------------- 1 | SMODS.Back { 2 | key = 'grilled', 3 | atlas = 'Modifiers', 4 | pos = { 5 | x = 4, 6 | y = 0 7 | }, 8 | mxms_credits = { 9 | art = { "pinkzigzagoon" }, 10 | code = { "theAstra" }, 11 | idea = { "pinkzigzagoon" } 12 | }, 13 | apply = function(self, back) 14 | --Change card scoring 15 | G.GAME.modifiers.mxms_even_card_mult = true 16 | end 17 | } 18 | 19 | local cgcb = Card.get_chip_bonus 20 | function Card:get_chip_bonus() 21 | local ret = cgcb(self) 22 | if G.GAME.modifiers.mxms_even_card_mult and self:get_id() % 2 == 0 and self:get_id() ~= 14 and not self:is_face() then 23 | ret = ret - self.base.nominal 24 | elseif G.GAME.modifiers.mxms_face_card_xmult and self:is_face() then 25 | ret = ret - self.base.nominal 26 | end 27 | return ret 28 | end 29 | 30 | local cgcm = Card.get_chip_mult 31 | function Card:get_chip_mult() 32 | local ret = cgcm(self) 33 | if G.GAME.modifiers.mxms_even_card_mult and self:get_id() % 2 == 0 and self:get_id() ~= 14 and not self:is_face() then 34 | if not (self.ability.effect == 'Stone Card' and not next(SMODS.find_card('j_mxms_hammer_and_chisel'))) or not self.config.center.replace_base_card then 35 | ret = ret + self.base.nominal 36 | end 37 | end 38 | return ret 39 | end 40 | -------------------------------------------------------------------------------- /items/jokers/sisillyan.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'sisillyan', 3 | atlas = 'Placeholder', 4 | pos = { 5 | x = 2, 6 | y = 0 7 | }, 8 | rarity = 3, 9 | config = { 10 | extra = { 11 | Xmult = 10, 12 | prob = 1, 13 | odds = 10 14 | } 15 | }, 16 | mxms_credits = { 17 | art = { "anerdymous" }, 18 | code = { "theAstra" }, 19 | idea = { "anerdymous" } 20 | }, 21 | blueprint_compat = true, 22 | cost = 6, 23 | loc_vars = function(self, info_queue, card) 24 | local stg = card.ability.extra 25 | return { 26 | vars = { stg.Xmult, SMODS.get_probability_vars(card, stg.prob, stg.odds) } 27 | } 28 | end, 29 | calculate = function(self, card, context) 30 | local stg = card.ability.extra 31 | 32 | if context.joker_main then 33 | return { 34 | x_mult = stg.Xmult 35 | } 36 | end 37 | 38 | if context.after and not context.blueprint and SMODS.pseudorandom_probability(card, 'sisilly', stg.prob, stg.odds) then 39 | G.E_MANAGER:add_event(Event({ 40 | func = function() 41 | Maximus.force_game_over() 42 | return true; 43 | end 44 | })) 45 | end 46 | end 47 | } 48 | -------------------------------------------------------------------------------- /items/blinds/spring.lua: -------------------------------------------------------------------------------- 1 | SMODS.Blind { 2 | key = 'spring', 3 | boss = { 4 | min = 1, 5 | max = 10 6 | }, 7 | atlas = 'Blinds', 8 | pos = { 9 | x = 0, 10 | y = 7 11 | }, 12 | config = { 13 | extra = { 14 | hands_removed = 0 15 | } 16 | }, 17 | mxms_credits = { 18 | art = { "pinkzigzagoon" }, 19 | code = { "theAstra" }, 20 | idea = { "pinkzigzagoon" } 21 | }, 22 | boss_colour = HEX('BDB087'), 23 | set_blind = function(self) 24 | self.config.extra.hands_removed = 0 25 | end, 26 | after_scoring = function(self) 27 | G.E_MANAGER:add_event(Event({ 28 | func = function() 29 | SMODS.juice_up_blind() 30 | G.hand:change_size(-1) 31 | self.config.extra.hands_removed = self.config.extra.hands_removed + 1 32 | self.triggered = true 33 | return true; 34 | end 35 | })) 36 | end, 37 | disable = function(self) 38 | G.hand:change_size(self.config.extra.hands_removed) 39 | G.FUNCS.draw_from_deck_to_hand(self.config.extra.hands_removed) 40 | end, 41 | defeat = function(self) 42 | if not G.GAME.blind.disabled then 43 | G.hand:change_size(self.config.extra.hands_removed) 44 | end 45 | end 46 | } 47 | -------------------------------------------------------------------------------- /items/challenges/coexist.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'coexist', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_coexist' }, 6 | { id = 'mxms_coexist2' }, 7 | } 8 | }, 9 | jokers = { 10 | { id = 'j_mxms_zombie' }, 11 | }, 12 | deck = { 13 | type = 'Challenge Deck' 14 | }, 15 | calculate = function(self, context) 16 | if (context.selling_card and context.card.config.center_key == 'j_mxms_zombie') 17 | or (context.card_added and context.card.config.center_key == 'j_mxms_zombie') 18 | or (context.setting_ability and context.new == 'j_mxms_zombie') then 19 | G.E_MANAGER:add_event(Event({ 20 | func = function() 21 | local zombies = 0 22 | for k, v in pairs(G.jokers.cards) do 23 | if v.config.center_key == 'j_mxms_zombie' then 24 | zombies = zombies + 1 25 | end 26 | end 27 | if context.selling_card then zombies = zombies - 1 end 28 | if zombies <= 0 or zombies == G.jokers.config.card_limit then 29 | Maximus.force_game_over() 30 | end 31 | return true; 32 | end 33 | })) 34 | end 35 | end 36 | } 37 | -------------------------------------------------------------------------------- /items/backs/sleeves/nuclear.lua: -------------------------------------------------------------------------------- 1 | CardSleeves.Sleeve { 2 | key = "nuclear", 3 | atlas = "Sleeves", 4 | pos = { 5 | x = 2, 6 | y = 0 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | loc_vars = function(self, info_queue, card) 14 | local key 15 | if self.get_current_deck_key() == 'b_mxms_nuclear' then 16 | key = self.key .. '_alt' 17 | else 18 | key = self.key 19 | end 20 | return { key = key } 21 | end, 22 | apply = function(self, sleeve) 23 | if self.get_current_deck_key() == 'b_mxms_nuclear' then 24 | --If on Nuclear Deck, add an extra joker slot 25 | G.GAME.starting_params.joker_slots = G.GAME.starting_params.joker_slots + 1 26 | else 27 | --Change blind scaling 28 | G.GAME.modifiers.mxms_nuclear_size = true 29 | --Change scoring calc method 30 | G.E_MANAGER:add_event(Event({ 31 | func = function() 32 | SMODS.set_scoring_calculation('exponent') 33 | return true; 34 | end 35 | })) 36 | --Change joker slots 37 | G.GAME.starting_params.joker_slots = G.GAME.starting_params.joker_slots - 4 38 | end 39 | end 40 | } 41 | -------------------------------------------------------------------------------- /items/jokers/occam.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'occam', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 8, 6 | y = 9 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 3, 14 | blueprint_compat = true, 15 | cost = 6, 16 | loc_vars = function(self, info_queue, card) 17 | return { vars = { (G.hand and G.hand.config.highlighted_limit or 5) + 1 } } 18 | end, 19 | calculate = function(self, card, context) 20 | if context.before then 21 | for k, v in pairs(context.full_hand) do 22 | G.E_MANAGER:add_event(Event({ 23 | func = function() 24 | v:juice_up() 25 | return true; 26 | end 27 | })) 28 | SMODS.calculate_effect({ message = '-X1', colour = G.C.MULT }, card) 29 | end 30 | end 31 | 32 | if context.joker_main and #context.full_hand < G.hand.config.highlighted_limit then 33 | return { 34 | x_mult = G.hand.config.highlighted_limit - #context.full_hand + 1 35 | } 36 | end 37 | 38 | if context.after then 39 | return { 40 | message = localize('k_reset') 41 | } 42 | end 43 | end 44 | } 45 | -------------------------------------------------------------------------------- /items/vouchers/launch_code.lua: -------------------------------------------------------------------------------- 1 | SMODS.Voucher { 2 | key = 'launch_code', 3 | atlas = 'Vouchers', 4 | pos = { 5 | x = 0, 6 | y = 0 7 | }, 8 | config = { 9 | extra = { 10 | ante_mod = 1, 11 | val_mod = 1 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | loc_vars = function(self, info_queue, card) 20 | local stg = card.ability.extra 21 | return { 22 | vars = { stg.ante_mod, stg.val_mod } 23 | } 24 | end, 25 | redeem = function(self, card, from_debuff) 26 | local stg = card.ability.extra 27 | ease_ante(stg.ante_mod) 28 | G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante 29 | G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante + stg.ante_mod 30 | 31 | G.GAME.round_resets.hands = G.GAME.round_resets.hands + stg.val_mod 32 | ease_hands_played(stg.val_mod) 33 | 34 | G.GAME.round_resets.discards = G.GAME.round_resets.discards + stg.val_mod 35 | ease_discard(stg.val_mod) 36 | end, 37 | in_pool = function(self, args) 38 | if G.GAME.round_resets.ante == G.GAME.win_ante then 39 | return false 40 | end 41 | 42 | return true 43 | end 44 | } 45 | -------------------------------------------------------------------------------- /items/jokers/rud.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'rud', 3 | atlas = 'Placeholder', 4 | pos = { 5 | x = 1, 6 | y = 0 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | Xmult = 5 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "theAstra" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 6, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.Xmult } 25 | } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | 30 | if context.final_scoring_step and G.GAME.current_round.hands_left == 0 31 | and SMODS.calculate_round_score() + to_big(G.GAME.chips) < to_big(G.GAME.blind.chips) then 32 | return { 33 | Xmult = stg.Xmult, 34 | func = function() 35 | G.E_MANAGER:add_event(Event({ 36 | func = function() 37 | card:start_dissolve() 38 | play_sound('mxms_eggsplosion') 39 | return true; 40 | end 41 | })) 42 | end 43 | } 44 | end 45 | end 46 | } 47 | -------------------------------------------------------------------------------- /items/jokers/smoker.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'smoker', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 11 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | chips = 0 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "anerdymous" }, 16 | code = { "theAstra" }, 17 | idea = { "anerdymous" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 4, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.chips } 25 | } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | 30 | if context.joker_main then 31 | return { 32 | chips = stg.chips 33 | } 34 | end 35 | 36 | if context.scoring_name == 'High Card' and context.individual and context.cardarea == G.play and not context.blueprint then 37 | stg.temp_gain = context.other_card:get_chip_bonus() 38 | SMODS.scale_card(card, { 39 | ref_table = stg, 40 | ref_value = "chips", 41 | scalar_value = "temp_gain", 42 | message_colour = G.C.CHIPS 43 | }) 44 | stg.temp_gain = nil 45 | return nil, true 46 | end 47 | end 48 | } 49 | -------------------------------------------------------------------------------- /items/jokers/crowned.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'crowned', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 10 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | Xmult = 6 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | concept = { "Maxiss02" } 18 | }, 19 | blueprint_compat = true, 20 | unlocked = false, 21 | cost = 2, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | return { 25 | vars = { stg.Xmult } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | if context.joker_main then 31 | return { 32 | x_mult = stg.Xmult 33 | } 34 | end 35 | end, 36 | in_pool = function(self, args) 37 | return false 38 | end, 39 | check_for_unlock = function(self, args) 40 | return next(SMODS.find_card('j_mxms_crowned')) 41 | end 42 | } 43 | 44 | SMODS.JimboQuip { 45 | key = 'lq_crowned', 46 | type = 'loss', 47 | extra = { 48 | center = 'j_mxms_crowned', 49 | times = 1 50 | } 51 | } 52 | 53 | SMODS.JimboQuip { 54 | key = 'wq_crowned', 55 | type = 'win', 56 | extra = { center = 'j_mxms_crowned' } 57 | } 58 | -------------------------------------------------------------------------------- /items/jokers/conveyor_belt.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'conveyor_belt', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 8, 6 | y = 12 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | chips = 0, 12 | mult = 0 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "theAstra" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 4, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | return { 25 | vars = { stg.chips, stg.mult } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | 31 | if context.joker_main and to_big(stg.chips) > to_big(0) and to_big(stg.mult) > to_big(0) then 32 | SMODS.calculate_effect({ chips = to_number(stg.chips) }, context.blueprint_card or card) 33 | SMODS.calculate_effect({ mult = to_number(stg.mult) }, context.blueprint_card or card) 34 | end 35 | 36 | if context.after and not context.blueprint then 37 | stg.chips = hand_chips * 0.15 38 | stg.mult = mult * 0.15 39 | return { 40 | message = localize('k_mxms_pushed_ex'), 41 | colour = G.C.ATTENTION 42 | } 43 | end 44 | end 45 | } 46 | -------------------------------------------------------------------------------- /items/backs/nuclear.lua: -------------------------------------------------------------------------------- 1 | SMODS.Back { 2 | key = 'nuclear', 3 | atlas = 'Modifiers', 4 | pos = { 5 | x = 2, 6 | y = 0 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | apply = function(self, back) 14 | --Change blind scaling 15 | G.GAME.modifiers.mxms_nuclear_size = true 16 | 17 | --Change scoring calc method 18 | G.E_MANAGER:add_event(Event({ 19 | func = function() 20 | SMODS.set_scoring_calculation('exponent') 21 | return true; 22 | end 23 | })) 24 | 25 | --Change joker slots 26 | G.GAME.starting_params.joker_slots = G.GAME.starting_params.joker_slots - 4 27 | 28 | -- Following values for mid-run deck applying (crossmod) 29 | if G.jokers then 30 | G.jokers:change_size(-4) 31 | end 32 | end 33 | } 34 | 35 | local cashs = check_and_set_high_score 36 | function check_and_set_high_score(score, amt) 37 | if G.GAME.modifiers.mxms_nuclear_size then 38 | if not amt or type(amt) ~= 'number' then return end 39 | if G.GAME.round_scores[score] and math.floor(amt) > (G.GAME.round_scores[score].amt or 0) then 40 | G.GAME.round_scores[score].amt = math.floor(amt) 41 | end 42 | return 43 | end 44 | cashs(score, amt) 45 | end 46 | -------------------------------------------------------------------------------- /items/boosters/horoscope_mega_1.lua: -------------------------------------------------------------------------------- 1 | SMODS.Booster { 2 | key = "horoscope_mega_1", 3 | kind = "Horoscope", 4 | atlas = "Boosters", 5 | group_key = "k_mxms_zodiac_pack", 6 | pos = { 7 | x = 3, 8 | y = 0 9 | }, 10 | config = { 11 | extra = 4, 12 | choose = 2 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" } 17 | }, 18 | cost = 8, 19 | weight = 0.12, 20 | select_card = 'mxms_horoscope', 21 | create_card = function(self, card) 22 | return create_card("Horoscope", G.pack_cards, nil, nil, true, true, nil, "mxms_zodiac") 23 | end, 24 | ease_background_colour = function(self) 25 | ease_colour(G.C.DYN_UI.MAIN, Maximus.C.SET.Horoscope) 26 | ease_background_colour({ new_colour = Maximus.C.SET.Horoscope, special_colour = G.C.BLACK, contrast = 2 }) 27 | end, 28 | loc_vars = function(self, info_queue, card) 29 | return { vars = { math.min(card.ability.choose + (G.GAME.modifiers.booster_choice_mod or 0), math.max(1, card.ability.extra + (G.GAME.modifiers.booster_size_mod or 0))), math.max(1, card.ability.extra + (G.GAME.modifiers.booster_size_mod or 0)) } } 30 | end, 31 | in_pool = function(self, args) 32 | if G.mxms_horoscope and G.mxms_horoscope.config.highlighted_limit > 1 then 33 | return true 34 | end 35 | 36 | return false 37 | end 38 | } 39 | -------------------------------------------------------------------------------- /items/vouchers/warp_drive.lua: -------------------------------------------------------------------------------- 1 | SMODS.Voucher { 2 | key = 'warp_drive', 3 | atlas = 'Vouchers', 4 | pos = { 5 | x = 0, 6 | y = 1 7 | }, 8 | config = { 9 | extra = { 10 | ante_mod = 1, 11 | val_mod = 2 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | requires = { 'v_mxms_launch_code' }, 20 | loc_vars = function(self, info_queue, card) 21 | local stg = card.ability.extra 22 | return { 23 | vars = { stg.ante_mod, stg.val_mod } 24 | } 25 | end, 26 | redeem = function(self, card) 27 | local stg = card.ability.extra 28 | ease_ante(stg.ante_mod) 29 | G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante 30 | G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante + stg.ante_mod 31 | 32 | G.GAME.round_resets.hands = G.GAME.round_resets.hands + stg.val_mod 33 | ease_hands_played(stg.val_mod) 34 | 35 | G.GAME.round_resets.discards = G.GAME.round_resets.discards + stg.val_mod 36 | ease_discard(stg.val_mod) 37 | end, 38 | in_pool = function(self, args) 39 | if G.GAME.round_resets.ante == G.GAME.win_ante then 40 | return false 41 | end 42 | 43 | return true 44 | end 45 | } 46 | -------------------------------------------------------------------------------- /items/jokers/messiah.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'messiah', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 0, 6 | y = 13 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | mult = 0, 12 | gain = 5 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "theAstra" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 4, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | info_queue[#info_queue + 1] = G.P_CENTERS['c_sun'] 25 | return { 26 | vars = { stg.gain, stg.mult } 27 | } 28 | end, 29 | calculate = function(self, card, context) 30 | local stg = card.ability.extra 31 | 32 | if context.using_consumeable and context.consumeable.config.center_key == 'c_sun' and not context.blueprint then 33 | SMODS.scale_card(card, { 34 | ref_table = stg, 35 | ref_value = "mult", 36 | scalar_value = "gain", 37 | message_key = 'a_mult', 38 | message_colour = G.C.MULT 39 | }) 40 | return nil, true 41 | end 42 | 43 | if context.joker_main and stg.mult > 0 then 44 | return { 45 | mult = stg.mult 46 | } 47 | end 48 | end 49 | } 50 | -------------------------------------------------------------------------------- /items/jokers/space_race.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'space_race', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 5 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 3, 14 | blueprint_compat = true, 15 | cost = 7, 16 | calculate = function(self, card, context) 17 | if context.cardarea == G.jokers and context.before then 18 | local hand_is_highest = false 19 | 20 | local level, highest = to_big(0), {} 21 | 22 | for k, v in pairs(G.GAME.hands) do 23 | if v.visible and to_big(v.level) > level then 24 | level = to_big(v.level) 25 | highest = { k } 26 | elseif v.visible and to_big(v.level) == level then 27 | highest[#highest + 1] = k 28 | end 29 | end 30 | 31 | for i = 1, #highest do 32 | if context.scoring_name == highest[i] then 33 | hand_is_highest = true 34 | end 35 | end 36 | 37 | if not hand_is_highest then 38 | return { 39 | card = card, 40 | level_up = true, 41 | message = localize('k_level_up_ex') 42 | } 43 | end 44 | end 45 | end 46 | } 47 | -------------------------------------------------------------------------------- /items/jokers/werewolf.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'werewolf', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 0, 6 | y = 15 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | mult = 0, 12 | gain = 5 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "anerdymous" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 4, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | info_queue[#info_queue + 1] = G.P_CENTERS['c_moon'] 25 | return { 26 | vars = { stg.gain, stg.mult } 27 | } 28 | end, 29 | calculate = function(self, card, context) 30 | local stg = card.ability.extra 31 | 32 | if context.using_consumeable and context.consumeable.config.center_key == 'c_moon' and not context.blueprint then 33 | SMODS.scale_card(card, { 34 | ref_table = stg, 35 | ref_value = "mult", 36 | scalar_value = "gain", 37 | message_key = 'a_mult', 38 | message_colour = G.C.MULT 39 | }) 40 | return nil, true 41 | end 42 | 43 | if context.joker_main and stg.mult > 0 then 44 | return { 45 | mult = stg.mult 46 | } 47 | end 48 | end 49 | } 50 | -------------------------------------------------------------------------------- /items/jokers/paperclip.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'paperclip', 3 | atlas = 'Placeholder', 4 | pos = { 5 | x = 0, 6 | y = 0 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | gain = 1 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "pinkzigzagoon" }, 16 | code = { "theAstra" }, 17 | idea = { "pinkzigzagoon" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 4, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.gain } 25 | } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | 30 | if context.pre_reroll then 31 | stg.temp_gain = stg.gain * #G.shop_jokers.cards 32 | if stg.temp_gain > 0 then 33 | SMODS.scale_card(card, { 34 | ref_table = card.ability, 35 | ref_value = 'extra_value', 36 | scalar_table = stg, 37 | scalar_value = 'temp_gain', 38 | scaling_message = { 39 | message = localize('k_val_up'), 40 | colour = G.C.MONEY 41 | } 42 | }) 43 | card:set_cost() 44 | return nil, true 45 | end 46 | end 47 | end 48 | } 49 | -------------------------------------------------------------------------------- /items/jokers/bankrupt.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'bankrupt', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 6, 6 | y = 16 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | gain = 10, 12 | mult = 0 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "anerdymous" }, 19 | reference = { "Wheel of Fortune" } 20 | }, 21 | blueprint_compat = true, 22 | cost = 4, 23 | loc_vars = function(self, info_queue, card) 24 | local stg = card.ability.extra 25 | info_queue[#info_queue + 1] = G.P_CENTERS.c_wheel_of_fortune 26 | return { 27 | vars = { stg.gain, stg.mult } 28 | } 29 | end, 30 | calculate = function(self, card, context) 31 | local stg = card.ability.extra 32 | 33 | if context.pseudorandom_result and not context.result and context.identifier == 'wheel_of_fortune' and not context.blueprint then 34 | SMODS.scale_card(card, { 35 | ref_table = stg, 36 | ref_value = "mult", 37 | scalar_value = "gain", 38 | message_key = "a_mult" 39 | }) 40 | return nil, true 41 | end 42 | 43 | if context.joker_main then 44 | return { 45 | mult = stg.mult 46 | } 47 | end 48 | end 49 | } 50 | -------------------------------------------------------------------------------- /items/jokers/salt_circle.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'salt_circle', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 4 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | gain = 30 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 5, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { G.GAME.consumeable_usage_total and G.GAME.consumeable_usage_total.spectral * stg.gain or 0, stg.gain } 25 | } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | if context.joker_main and G.GAME.consumeable_usage_total and G.GAME.consumeable_usage_total.spectral > 0 then 30 | return { 31 | chips = G.GAME.consumeable_usage_total.spectral * stg.gain 32 | } 33 | end 34 | 35 | if not context.blueprint and context.using_consumeable and context.consumeable.ability.set == "Spectral" then 36 | return { 37 | message = localize { type = 'variable', key = 'a_chips', vars = { G.GAME.consumeable_usage_total.spectral * stg.gain } }, 38 | colour = G.C.CHIPS 39 | } 40 | end 41 | end 42 | } 43 | -------------------------------------------------------------------------------- /items/jokers/marco_polo.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'marco_polo', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 7, 6 | y = 4 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | base_mult = 12, 12 | dMult = 3 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "Maxiss02" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 3, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | return { vars = { stg.base_mult, stg.dMult } } 25 | end, 26 | calculate = function(self, card, context) 27 | local stg = card.ability.extra 28 | if context.joker_main then 29 | local position = 0 30 | for i = 0, #G.jokers.cards do 31 | if G.jokers.cards[i] == card then 32 | position = i 33 | end 34 | end 35 | 36 | local mult = stg.base_mult - (stg.dMult * (math.abs(position - G.GAME.current_round.mxms_marco_polo_pos))) 37 | 38 | if mult < 0 then 39 | mult = 0 40 | end 41 | 42 | return { 43 | mult = mult 44 | } 45 | end 46 | end 47 | } 48 | 49 | SMODS.JimboQuip { 50 | key = 'lq_marco_polo', 51 | type = 'loss', 52 | extra = { center = 'j_mxms_marco_polo' } 53 | } -------------------------------------------------------------------------------- /lovely/stop_sign.toml: -------------------------------------------------------------------------------- 1 | [manifest] 2 | version = "1.0.0" 3 | dump_lua = true 4 | priority = 1 5 | 6 | # Prevent reset function calls if stop sign is in hand 7 | [[patches]] 8 | [patches.pattern] 9 | target = "functions/state_events.lua" 10 | pattern = ''' 11 | reset_idol_card() 12 | reset_mail_rank() 13 | reset_ancient_card() 14 | reset_castle_card() 15 | for _, mod in ipairs(SMODS.mod_list) do 16 | if mod.reset_game_globals and type(mod.reset_game_globals) == 'function' then 17 | mod.reset_game_globals(false) 18 | end 19 | end 20 | ''' 21 | position = "at" 22 | payload = ''' 23 | if not next(SMODS.find_card('j_mxms_stop_sign')) then 24 | reset_idol_card() 25 | reset_mail_rank() 26 | reset_ancient_card() 27 | reset_castle_card() 28 | for _, mod in ipairs(SMODS.mod_list) do 29 | if mod.reset_game_globals and type(mod.reset_game_globals) == 'function' then 30 | mod.reset_game_globals(false) 31 | end 32 | end 33 | end 34 | ''' 35 | match_indent = true 36 | 37 | 38 | # Hook into To Do List 39 | [[patches]] 40 | [patches.pattern] 41 | target = "card.lua" 42 | pattern = ''' 43 | if self.ability.name == 'To Do List' and not context.blueprint then 44 | ''' 45 | position = "at" 46 | payload = ''' 47 | if self.ability.name == 'To Do List' and not context.blueprint and (not next(SMODS.find_card('j_mxms_stop_sign')) and G.GAME.round ~= 1) then 48 | ''' 49 | match_indent = true 50 | times = 1 -------------------------------------------------------------------------------- /items/challenges/fashion.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'fashion', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_random_suit_debuff' } 6 | } 7 | }, 8 | jokers = {}, 9 | restrictions = { 10 | banned_other = { 11 | { id = 'bl_club', type = 'blind' }, 12 | { id = 'bl_goad', type = 'blind' }, 13 | { id = 'bl_head', type = 'blind' }, 14 | { id = 'bl_window', type = 'blind' } 15 | } 16 | }, 17 | deck = { 18 | type = 'Challenge Deck' 19 | }, 20 | calculate = function(self, context) 21 | if context.setting_blind then 22 | local suits = { 'Clubs', 'Spades', 'Hearts', 'Diamonds' } 23 | G.GAME.modifiers.mxms_random_suit_debuff = pseudorandom_element(suits, 24 | pseudoseed('fashion' .. G.GAME.round_resets.ante)) 25 | for _, v in ipairs(G.playing_cards) do 26 | self:debuff_card(v) 27 | end 28 | end 29 | end 30 | } 31 | 32 | local bdc = Blind.debuff_card 33 | function Blind:debuff_card(card, from_blind) 34 | bdc(self, card, from_blind) 35 | if G.GAME.modifiers.mxms_random_suit_debuff and card.area ~= G.jokers then 36 | if card:is_suit(G.GAME.modifiers.mxms_random_suit_debuff, true) then 37 | card:set_debuff(true) 38 | if card.debuff then card.debuffed_by_blind = true end 39 | return 40 | end 41 | end 42 | end 43 | -------------------------------------------------------------------------------- /items/jokers/tar_pit.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'tar_pit', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 1, 6 | y = 16 7 | }, 8 | rarity = 2, 9 | mxms_credits = { 10 | art = { "Maxiss02" }, 11 | code = { "theAstra" }, 12 | idea = { "pinkzigzagoon" } 13 | }, 14 | blueprint_compat = true, 15 | cost = 5, 16 | loc_vars = function(self, info_queue, card) 17 | info_queue[#info_queue + 1] = G.P_SEALS['mxms_black'] 18 | 19 | return { 20 | vars = { 21 | colours = { 22 | G.C.BLACK, 23 | G.C.WHITE 24 | } 25 | } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | if context.before then 30 | for k, v in pairs(context.scoring_hand) do 31 | if v.seal and v.seal ~= 'mxms_black' then 32 | v:set_seal('mxms_black') 33 | G.E_MANAGER:add_event(Event({ 34 | trigger = 'before', 35 | delay = 0.50, 36 | func = function() 37 | play_sound('card1') 38 | card:juice_up(0.3, 0.3) 39 | v:juice_up(0.3, 0.3) 40 | return true 41 | end 42 | })) 43 | end 44 | end 45 | end 46 | end 47 | } 48 | -------------------------------------------------------------------------------- /items/jokers/normal.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'normal', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 1 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | config = { 14 | extra = { 15 | mult = 2, 16 | chips = 15 17 | } 18 | }, 19 | discovered = true, 20 | order = 2, 21 | rarity = 1, 22 | blueprint_compat = true, 23 | cost = 3, 24 | loc_vars = function(self, info_queue, card) 25 | local stg = card.ability.extra 26 | return { vars = { stg.mult, stg.chips } } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | if card.area ~= G.title_top and context.individual and context.cardarea == G.play then 31 | if not context.other_card.edition and not context.other_card.seal and not next(SMODS.get_enhancements(context.other_card)) then 32 | return { 33 | mult = stg.mult, 34 | chips = stg.chips, 35 | card = card 36 | } 37 | end 38 | end 39 | end, 40 | } 41 | 42 | SMODS.JimboQuip { 43 | key = 'lq_normal', 44 | type = 'loss', 45 | extra = { center = 'j_mxms_normal' } 46 | } 47 | 48 | SMODS.JimboQuip { 49 | key = 'wq_normal', 50 | type = 'win', 51 | extra = { center = 'j_mxms_normal' } 52 | } 53 | -------------------------------------------------------------------------------- /items/jokers/secret_society.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'secret_society', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 2 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | blueprint_compat = false, 14 | cost = 5, 15 | rarity = 2, 16 | loc_vars = function(self, info_queue, card) 17 | local nom_sum = Maximus.get_nominal_sum() 18 | return { 19 | vars = { 20 | nom_sum - SMODS.Ranks['Ace'].nominal, 21 | (nom_sum - SMODS.Ranks['Ace'].nominal) * 2, 22 | nom_sum - SMODS.Ranks['2'].nominal, 23 | (nom_sum - SMODS.Ranks['2'].nominal) * 2 24 | } 25 | } 26 | end, 27 | } 28 | 29 | local gcb = Card.get_chip_bonus 30 | function Card:get_chip_bonus() 31 | if next(SMODS.find_card('j_mxms_secret_society')) and not self.config.center.replace_base_card and not self.ability.extra_enhancement then 32 | return ((Maximus.get_nominal_sum() - self.base.nominal) * 2) + self.ability.bonus + 33 | (self.ability.perma_bonus or 0) 34 | end 35 | return gcb(self) 36 | end 37 | 38 | SMODS.JimboQuip { 39 | key = 'lq_secret_society', 40 | type = 'loss', 41 | extra = { center = 'j_mxms_secret_society' } 42 | } 43 | 44 | SMODS.JimboQuip { 45 | key = 'wq_secret_society', 46 | type = 'win', 47 | extra = { center = 'j_mxms_secret_society' } 48 | } -------------------------------------------------------------------------------- /items/jokers/welder.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'welder', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 6, 6 | y = 15 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | Xmult = 0.1 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "pinkzigzagoon" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 6, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | info_queue[#info_queue + 1] = G.P_CENTERS.m_steel 24 | return { 25 | vars = { stg.Xmult } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | 31 | if context.individual and not context.end_of_round and context.cardarea == G.hand and SMODS.has_enhancement(context.other_card, 'm_steel') then 32 | context.other_card.ability.h_x_mult = context.other_card.ability.h_x_mult + stg.Xmult 33 | return { 34 | message = localize('k_upgrade_ex'), 35 | message_card = context.other_card 36 | } 37 | end 38 | end, 39 | in_pool = function(self, args) 40 | for k, v in pairs(G.playing_cards) do 41 | if SMODS.has_enhancement(v, 'm_steel') then 42 | return true 43 | end 44 | end 45 | 46 | return false 47 | end 48 | } 49 | -------------------------------------------------------------------------------- /items/jokers/leftovers.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'leftovers', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 1, 6 | y = 2 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | blueprint_compat = false, 14 | eternal_compat = false, 15 | cost = 4, 16 | pools = { 17 | Food = true 18 | }, 19 | rarity = 1, 20 | calculate = function(self, card, context) 21 | local stg = card.ability.extra 22 | 23 | if context.joker_type_destroyed and context.card.config.center.pools.Food and context.card.config.center_key ~= 'j_mxms_leftovers' then 24 | local respawn_key = context.card.config.center_key 25 | G.E_MANAGER:add_event(Event({ 26 | func = function() 27 | SMODS.add_card { 28 | key = respawn_key, 29 | key_append = 'lefto' 30 | } 31 | return true; 32 | end 33 | })) 34 | 35 | SMODS.destroy_cards(card, nil, nil, true) 36 | 37 | return { 38 | message = localize('k_mxms_saved_later_ex'), 39 | colour = G.C.FILTER, 40 | sound = 'tarot1' 41 | } 42 | end 43 | end, 44 | } 45 | 46 | SMODS.JimboQuip { 47 | key = 'lq_leftovers', 48 | type = 'loss', 49 | extra = { center = 'j_mxms_leftovers' } 50 | } -------------------------------------------------------------------------------- /items/jokers/romero.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'romero', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 7 7 | }, 8 | soul_pos = { 9 | x = 3, 10 | y = 8 11 | }, 12 | rarity = 4, 13 | config = { 14 | extra = { 15 | Xmult = 1, 16 | gain = 0.1 17 | } 18 | }, 19 | unlocked = false, 20 | unlock_condition = { 21 | type = '', 22 | extra = '', 23 | hidden = true 24 | }, 25 | mxms_credits = { 26 | art = { "Maxiss02" }, 27 | code = { "theAstra" }, 28 | idea = { "PsyAlola" } 29 | }, 30 | blueprint_compat = true, 31 | cost = 20, 32 | loc_vars = function(self, info_queue, card) 33 | local stg = card.ability.extra 34 | return { 35 | vars = { stg.Xmult, stg.gain } 36 | } 37 | end, 38 | calculate = function(self, card, context) 39 | local stg = card.ability.extra 40 | 41 | if context.joker_main and stg.Xmult >= 1 then 42 | return { 43 | x_mult = stg.Xmult 44 | } 45 | end 46 | 47 | if context.card_added and context.card.ability.set == 'Joker' then 48 | SMODS.scale_card(card, { 49 | ref_table = stg, 50 | ref_value = "Xmult", 51 | scalar_value = "gain", 52 | message_colour = G.C.ATTENTION 53 | }) 54 | return nil, true 55 | end 56 | end 57 | } 58 | -------------------------------------------------------------------------------- /items/jokers/detective.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'detective', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 15 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | size = 3 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "anerdymous" } 18 | }, 19 | blueprint_compat = false, 20 | cost = 4, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | 24 | return { vars = { stg.size } } 25 | end, 26 | add_to_deck = function(self, card, from_debuff) 27 | local stg = card.ability.extra 28 | 29 | G.hand:change_size(stg.size) 30 | end, 31 | remove_from_deck = function(self, card, from_debuff) 32 | local stg = card.ability.extra 33 | 34 | G.hand:change_size(-stg.size) 35 | end, 36 | calculate = function(self, card, context) 37 | local stg = card.ability.extra 38 | 39 | if context.draw_individual and context.num_drawn <= stg.size and not context.to_booster then 40 | return { 41 | stay_flipped = true 42 | } 43 | end 44 | end, 45 | } 46 | 47 | SMODS.JimboQuip { 48 | key = 'lq_detective', 49 | type = 'loss', 50 | extra = { center = 'j_mxms_detective' } 51 | } 52 | 53 | SMODS.JimboQuip { 54 | key = 'wq_detective', 55 | type = 'win', 56 | extra = { center = 'j_mxms_detective' } 57 | } 58 | -------------------------------------------------------------------------------- /items/jokers/four_leaf_clover.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'four_leaf_clover', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 7, 6 | y = 2 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = false, 15 | cost = 7, 16 | calculate = function(self, card, context) 17 | if context.before and not context.blueprint and #context.scoring_hand == 4 then 18 | -- Code derived from Midas Mask 19 | for k, v in ipairs(context.scoring_hand) do 20 | if not v.debuff then 21 | v:set_ability(G.P_CENTERS.m_lucky, nil, true) 22 | G.E_MANAGER:add_event(Event({ 23 | func = function() 24 | v:juice_up(0.3, 0.4) 25 | return true 26 | end 27 | })) 28 | end 29 | end 30 | 31 | return { 32 | message = localize('k_mxms_lucky'), 33 | colour = G.C.GREEN, 34 | card = card 35 | } 36 | end 37 | end 38 | } 39 | 40 | SMODS.JimboQuip { 41 | key = 'lq_four_leaf_clover', 42 | type = 'loss', 43 | extra = { center = 'j_mxms_four_leaf_clover' } 44 | } 45 | 46 | SMODS.JimboQuip { 47 | key = 'wq_four_leaf_clover', 48 | type = 'win', 49 | extra = { center = 'j_mxms_four_leaf_clover' } 50 | } -------------------------------------------------------------------------------- /lovely/cashout.toml: -------------------------------------------------------------------------------- 1 | [manifest] 2 | version = "1.0.0" 3 | dump_lua = true 4 | priority = 1 5 | 6 | # Patch as final end of round money adding event 7 | [[patches]] 8 | [patches.pattern] 9 | target = "functions/state_events.lua" 10 | pattern = ''' 11 | dollars = dollars + G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) 12 | end 13 | ''' 14 | position = "after" 15 | payload = ''' 16 | 17 | if next(SMODS.find_card('j_mxms_change')) then 18 | local dollar_remainder = dollars % to_big(5) 19 | if dollar_remainder ~= to_big(0) then 20 | add_round_eval_row({bonus = true, name='joker'..i, pitch = pitch, dollars = 5 - dollar_remainder, card = SMODS.find_card('j_mxms_change')[1]}) 21 | pitch = pitch + 0.06 22 | i = i + 1 23 | dollars = dollars + (5 - dollar_remainder) 24 | end 25 | end 26 | 27 | local boars = SMODS.find_card('j_mxms_boar_bank') 28 | if next(boars) then 29 | for k, v in ipairs(boars) do 30 | local half = dollars / 2 31 | dollars = half 32 | v.ability.extra_value = v.ability.extra_value + half 33 | v:set_cost() 34 | SMODS.calculate_effect({message = localize('k_mxms_halved'), colour = G.C.RED, sound = 'slice1'}, v) 35 | add_round_eval_row({bonus = true, name='joker'..i, pitch = pitch, dollars = -half, card = v}) 36 | pitch = pitch + 0.06 37 | i = i + 1 38 | end 39 | end 40 | ''' 41 | match_indent = false 42 | times = 1 -------------------------------------------------------------------------------- /lovely/posted.toml: -------------------------------------------------------------------------------- 1 | [manifest] 2 | version = "1.0.0" 3 | dump_lua = true 4 | priority = 1 5 | 6 | 7 | [[patches]] 8 | [patches.pattern] 9 | target = "game.lua" 10 | pattern = "if v.pinned then _joker.pinned = true end" 11 | position = "after" 12 | payload = "if v.mxms_posted then _joker.ability.mxms_posted = true end" 13 | match_indent = true 14 | times = 1 15 | 16 | 17 | [[patches]] 18 | [patches.pattern] 19 | target = "cardarea.lua" 20 | 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)" 21 | position = "at" 22 | payload = "table.sort(self.cards, function (a, b) return a.T.x + a.T.w/2 - 100*((a.pinned and not a.ignore_pinned or b.ability.mxms_posted and not b.ignore_posted) and a.sort_id or 0) < b.T.x + b.T.w/2 - 100*((b.pinned and not b.ignore_pinned or a.ability.mxms_posted and not a.ignore_posted) and b.sort_id or 0) end)" 23 | match_indent = true 24 | times = 1 25 | 26 | 27 | [[patches]] 28 | [patches.pattern] 29 | target = '''=[SMODS _ "src/ui.lua"]''' 30 | pattern = "card.ignore_pinned = true" 31 | position = "after" 32 | payload = "card.ignore_posted = true" 33 | match_indent = true 34 | times = 1 35 | 36 | 37 | [[patches]] 38 | [patches.pattern] 39 | target = "functions/UI_definitions.lua" 40 | pattern = "if v.pinned then card.pinned = true end" 41 | position = "after" 42 | payload = "if v.mxms_posted then card.ability.mxms_posted = true end" 43 | match_indent = true 44 | times = 1 -------------------------------------------------------------------------------- /items/jokers/hedonist.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'hedonist', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 6, 6 | y = 5 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | Xmult = 1, 12 | gain = 0.25 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "Maxiss02" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 7, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | return { 25 | vars = { stg.Xmult, stg.gain } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | if context.joker_main and stg.Xmult > 1 then 31 | return { 32 | x_mult = stg.Xmult 33 | } 34 | end 35 | 36 | if context.ending_shop and #G.shop_vouchers.cards == 0 and #G.shop_booster.cards == 0 and #G.shop_jokers.cards == 0 and not context.blueprint then 37 | SMODS.scale_card(card, { 38 | ref_table = stg, 39 | ref_value = "Xmult", 40 | scalar_value = "gain", 41 | message_key = 'a_mult', 42 | message_colour = G.C.MULT 43 | }) 44 | return nil, true 45 | end 46 | end 47 | } 48 | SMODS.JimboQuip { 49 | key = 'lq_hedonist', 50 | type = 'loss', 51 | extra = { center = 'j_mxms_hedonist' } 52 | } -------------------------------------------------------------------------------- /items/jokers/hopscotch.lua: -------------------------------------------------------------------------------- 1 | ---@diagnostic disable: undefined-field 2 | SMODS.Joker { 3 | key = 'hopscotch', 4 | atlas = 'Jokers', 5 | pos = { 6 | x = 3, 7 | y = 2 8 | }, 9 | config = { 10 | extra = { 11 | prob = 1, 12 | odds = 3 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "Maxiss02" } 19 | }, 20 | rarity = 1, 21 | blueprint_compat = false, 22 | cost = 5, 23 | loc_vars = function(self, info_queue, card) 24 | local stg = card.ability.extra 25 | return { 26 | vars = { SMODS.get_probability_vars(card, stg.prob, stg.odds, 'hopscotch') } 27 | } 28 | end, 29 | calculate = function(self, card, context) 30 | local stg = card.ability.extra 31 | if context.setting_blind and G.GAME.round_resets.blind_tag and not context.blueprint then 32 | if SMODS.pseudorandom_probability(card, 'hopscotch', stg.prob, stg.odds) then 33 | play_sound('generic1') 34 | card:juice_up(0.3, 0.4) 35 | add_tag(G.GAME.round_resets.blind_tag) 36 | G.GAME.mxms_skip_tag = '' 37 | else 38 | return { 39 | sound = 'tarot2', 40 | card = card, 41 | message = localize('k_nope_ex'), 42 | colour = G.C.SET.Tarot 43 | } 44 | end 45 | end 46 | end 47 | } 48 | -------------------------------------------------------------------------------- /items/jokers/prince.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'prince', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 12 7 | }, 8 | rarity = 3, 9 | config = { 10 | extra = { 11 | Xmult = 2 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "theAstra" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 7, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | info_queue[#info_queue + 1] = G.P_CENTERS.e_polychrome 24 | return { 25 | vars = { stg.Xmult } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | 31 | if context.individual and context.cardarea == G.hand and not context.end_of_round then 32 | if context.other_card.edition and context.other_card.edition.polychrome and context.other_card:is_face() then 33 | return { 34 | x_mult = stg.Xmult, 35 | card = card 36 | } 37 | end 38 | end 39 | end, 40 | in_pool = function(self, args) 41 | if G.playing_cards then 42 | for k, v in pairs(G.playing_cards) do 43 | if v.edition and v.edition.polychrome and v:is_face() then 44 | return true 45 | end 46 | end 47 | end 48 | 49 | return false 50 | end 51 | } 52 | -------------------------------------------------------------------------------- /items/jokers/hugo.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'hugo', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 2, 6 | y = 7 7 | }, 8 | soul_pos = { 9 | x = 2, 10 | y = 8 11 | }, 12 | rarity = 4, 13 | unlocked = false, 14 | unlock_condition = { 15 | type = '', 16 | extra = '', 17 | hidden = true 18 | }, 19 | config = { 20 | extra = { 21 | prob = 1, 22 | odds = 4 23 | } 24 | }, 25 | mxms_credits = { 26 | art = { "Maxiss02" }, 27 | code = { "theAstra" }, 28 | idea = { "Maxiss02" } 29 | }, 30 | blueprint_compat = false, 31 | cost = 20, 32 | loc_vars = function(self, info_queue, card) 33 | local stg = card.ability.extra 34 | return { 35 | vars = { SMODS.get_probability_vars(card, stg.prob, stg.odds, 'hugo') } 36 | } 37 | end 38 | } 39 | 40 | local gfsb = G.FUNCS.select_blind 41 | G.FUNCS.select_blind = function(e) 42 | local hugos = SMODS.find_card('j_mxms_hugo') 43 | if next(hugos) and G.GAME.blind_on_deck ~= 'Boss' then 44 | for k, v in pairs(hugos) do 45 | if SMODS.pseudorandom_probability(v, 'hugo', v.ability.extra.prob, v.ability.extra.odds) then 46 | delay(0.2) 47 | SMODS.calculate_effect({ message = localize('k_skipped_cap') }, v) 48 | delay(0.2) 49 | G.FUNCS.skip_blind(e) 50 | return 51 | end 52 | end 53 | end 54 | gfsb(e) 55 | end 56 | -------------------------------------------------------------------------------- /items/blinds/rule.lua: -------------------------------------------------------------------------------- 1 | SMODS.Blind { 2 | key = 'rule', 3 | boss = { 4 | min = 4, 5 | max = 10 6 | }, 7 | atlas = 'Blinds', 8 | pos = { 9 | x = 0, 10 | y = 4 11 | }, 12 | mxms_credits = { 13 | art = { "Maxiss02" }, 14 | code = { "theAstra" }, 15 | idea = { "theAstra" } 16 | }, 17 | boss_colour = HEX('EABEDB'), 18 | recalc_debuff = function(self, card, from_blind) 19 | if card.ability.set == 'Default' and not card.edition and not card.seal then 20 | card.debuffed_by_blind = true 21 | self.triggered = true 22 | return true 23 | else 24 | card.debuffed_by_blind = false 25 | return false 26 | end 27 | end, 28 | disable = function(self) 29 | for k, v in pairs(G.playing_cards) do 30 | if v.debuffed_by_blind then 31 | v:set_debuff(); v.debuffed_by_blind = nil 32 | end 33 | end 34 | self.triggered = false 35 | end, 36 | defeat = function(self) 37 | for k, v in pairs(G.playing_cards) do 38 | if v.debuffed_by_blind then 39 | v:set_debuff(); v.debuffed_by_blind = nil 40 | end 41 | end 42 | self.triggered = false 43 | end, 44 | in_pool = function(self, args) 45 | if not (G.GAME.bosses_used['bl_mxms_cheat'] > 0) and self.boss.min <= math.max(1, G.GAME.round_resets.ante) then 46 | return true 47 | end 48 | 49 | return false 50 | end 51 | } 52 | -------------------------------------------------------------------------------- /items/jokers/brown.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'brown', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 2, 6 | y = 17 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | gain = 0.5, 12 | Xmult = 1 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "anerdymous" }, 17 | code = { "theAstra" }, 18 | idea = { "anerdymous" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 4, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | 25 | if G.hand then 26 | if G.GAME.starting_params.hand_size - G.hand.config.card_limit < 0 then 27 | stg.Xmult = 1 28 | else 29 | stg.Xmult = stg.gain * (G.GAME.starting_params.hand_size - G.hand.config.card_limit) + 1 30 | end 31 | end 32 | 33 | return { 34 | vars = { stg.gain, G.GAME.starting_params.hand_size or 8, stg.Xmult } 35 | } 36 | end, 37 | calculate = function(self, card, context) 38 | local stg = card.ability.extra 39 | 40 | if context.joker_main and stg.Xmult > 1 then 41 | if G.GAME.starting_params.hand_size - G.hand.config.card_limit < 0 then 42 | stg.Xmult = 1 43 | else 44 | stg.Xmult = stg.gain * (G.GAME.starting_params.hand_size - G.hand.config.card_limit) + 1 45 | end 46 | return { 47 | x_mult = stg.Xmult 48 | } 49 | end 50 | end 51 | } 52 | -------------------------------------------------------------------------------- /items/jokers/refrigerator.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { -- Refrigerator 2 | key = 'refrigerator', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 2, 6 | y = 2 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = false, 15 | cost = 6, 16 | calculate = function(self, card, context) 17 | if context.mod_probability and context.trigger_obj.config and (context.trigger_obj.config.center and context.trigger_obj.config.center.pools and context.trigger_obj.config.center.pools.Food) then 18 | if context.trigger_obj.config.center_key == 'j_mxms_fortune_cookie' then 19 | return { 20 | numerator = context.numerator 21 | } 22 | end 23 | return { 24 | denominator = context.denominator 25 | } 26 | end 27 | end, 28 | calc_scaling = function(self, card, other_card, initial, scalar_value, args) 29 | if args.operation == '-' and (other_card.config.center.pools and other_card.config.center.pools.Food) then 30 | return { 31 | override_scalar_value = { 32 | value = scalar_value * 0.5 33 | }, 34 | message = localize('k_mxms_preserved_ex'), 35 | } 36 | end 37 | end 38 | } 39 | 40 | SMODS.JimboQuip { 41 | key = 'lq_refrigerator', 42 | type = 'loss', 43 | extra = { center = 'j_mxms_refrigerator' } 44 | } 45 | -------------------------------------------------------------------------------- /items/jokers/harmony.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'harmony', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 5, 6 | y = 1 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | mult = 16 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 3, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.mult } 25 | } 26 | end, 27 | calculate = function(self, card, context) 28 | local stg = card.ability.extra 29 | if context.joker_main then 30 | local ranks = {} 31 | 32 | for i = 1, #context.scoring_hand do 33 | local unique = true 34 | for j = 1, #ranks do 35 | if ranks[j] == context.scoring_hand[i]:get_id() then 36 | unique = false 37 | end 38 | end 39 | if #ranks == 0 or unique then 40 | ranks[#ranks + 1] = context.scoring_hand[i]:get_id() 41 | end 42 | end 43 | 44 | if #ranks >= 3 then 45 | return { 46 | mult = stg.mult 47 | } 48 | end 49 | end 50 | end 51 | } 52 | 53 | SMODS.JimboQuip { 54 | key = 'lq_harmony', 55 | type = 'loss', 56 | extra = { center = 'j_mxms_harmony' } 57 | } 58 | -------------------------------------------------------------------------------- /items/jokers/trick_or_treat.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'trick_or_treat', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 7, 6 | y = 1 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | extra_choices = 1 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "Maxiss02" } 18 | }, 19 | blueprint_compat = false, 20 | cost = 6, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | return { 24 | vars = { stg.extra_choices } 25 | } 26 | end, 27 | add_to_deck = function(self, card, from_debuff) 28 | local stg = card.ability.extra 29 | G.GAME.modifiers.booster_choice_mod = G.GAME.modifiers.booster_choice_mod or 0 30 | G.GAME.modifiers.booster_choice_mod = G.GAME.modifiers.booster_choice_mod + stg.extra_choices 31 | end, 32 | remove_from_deck = function(self, card, from_debuff) 33 | local stg = card.ability.extra 34 | G.GAME.modifiers.booster_choice_mod = G.GAME.modifiers.booster_choice_mod - stg.extra_choices 35 | end, 36 | calculate = function(self, card, context) 37 | if context.open_booster then 38 | G.E_MANAGER:add_event(Event({ 39 | trigger = 'before', 40 | delay = 0.0, 41 | func = (function() 42 | card:juice_up(0.3, 0.4) 43 | return true 44 | end) 45 | })) 46 | end 47 | end 48 | } 49 | -------------------------------------------------------------------------------- /items/jokers/unpleasant_gradient.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'unpleasant_gradient', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 5, 6 | y = 3 7 | }, 8 | mxms_credits = { 9 | art = { "Maxiss02" }, 10 | code = { "theAstra" }, 11 | idea = { "Maxiss02" } 12 | }, 13 | rarity = 2, 14 | blueprint_compat = false, 15 | cost = 5, 16 | calculate = function(self, card, context) 17 | if context.before and not context.blueprint and #context.scoring_hand == 4 then 18 | -- Code derived from Sigil 19 | for i = 1, #context.scoring_hand do 20 | if i == 1 then 21 | SMODS.change_base(context.scoring_hand[i], "Clubs", nil) 22 | elseif i == 2 then 23 | SMODS.change_base(context.scoring_hand[i], "Hearts", nil) 24 | elseif i == 3 then 25 | SMODS.change_base(context.scoring_hand[i], "Diamonds", nil) 26 | elseif i == 4 then 27 | SMODS.change_base(context.scoring_hand[i], "Spades", nil) 28 | end 29 | G.E_MANAGER:add_event(Event({ 30 | func = function() 31 | context.scoring_hand[i]:juice_up(0.3, 0.4) 32 | return true 33 | end 34 | })) 35 | end 36 | return { 37 | message = localize('k_mxms_unpleasant'), 38 | colour = G.C.PURPLE, 39 | card = card 40 | } 41 | end 42 | end 43 | } 44 | -------------------------------------------------------------------------------- /items/jokers/minimalist.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'minimalist', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 5, 6 | y = 6 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | chips = 90, 12 | base_chips = 90, 13 | dChips = 15 14 | } 15 | }, 16 | mxms_credits = { 17 | art = { "pinkzigzagoon" }, 18 | code = { "theAstra" }, 19 | idea = { "pinkzigzagoon" } 20 | }, 21 | blueprint_compat = true, 22 | cost = 4, 23 | loc_vars = function(self, info_queue, card) 24 | local stg = card.ability.extra 25 | 26 | stg.chips = stg.base_chips 27 | if G.playing_cards then 28 | for k, v in pairs(G.playing_cards) do 29 | if next(SMODS.get_enhancements(v)) and stg.chips > 0 then 30 | stg.chips = stg.chips - stg.dChips 31 | end 32 | end 33 | end 34 | 35 | return { 36 | vars = { stg.base_chips, stg.chips, stg.dChips } 37 | } 38 | end, 39 | calculate = function(self, card, context) 40 | local stg = card.ability.extra 41 | 42 | if context.joker_main then 43 | stg.chips = stg.base_chips 44 | for k, v in pairs(G.playing_cards) do 45 | if next(SMODS.get_enhancements(v)) and stg.chips > 0 then 46 | stg.chips = stg.chips - stg.dChips 47 | end 48 | end 49 | 50 | return { 51 | chips = stg.chips 52 | } 53 | end 54 | end 55 | } 56 | -------------------------------------------------------------------------------- /items/backs/sleeves/professional.lua: -------------------------------------------------------------------------------- 1 | CardSleeves.Sleeve { 2 | key = "professional", 3 | atlas = "Sleeves", 4 | pos = { 5 | x = 4, 6 | y = 0 7 | }, 8 | mxms_credits = { 9 | art = { "pinkzigzagoon" }, 10 | code = { "theAstra" }, 11 | idea = { "pinkzigzagoon" } 12 | }, 13 | loc_vars = function(self, info_queue, card) 14 | local key 15 | if self.get_current_deck_key() == 'b_mxms_professional' then 16 | key = self.key .. '_alt' 17 | else 18 | key = self.key 19 | end 20 | return { key = key, vars = { colours = { G.C.HAND_LEVELS[2] } } } 21 | end, 22 | apply = function(self, sleeve) 23 | if self.get_current_deck_key() == 'b_mxms_professional' then 24 | -- If on Professional Deck, +1 level for each hand type 25 | G.E_MANAGER:add_event(Event({ 26 | func = function() 27 | for k, v in pairs(G.GAME.hands) do 28 | level_up_hand(self, k, true) 29 | end 30 | return true; 31 | end 32 | })) 33 | else 34 | -- Disable skipping 35 | G.GAME.modifiers.disable_blind_skips = true 36 | 37 | -- Change blind size 38 | G.GAME.starting_params.ante_scaling = 1.25 39 | 40 | -- Ban some Jokers that rely on skipping 41 | G.GAME.banned_keys[#G.GAME.banned_keys + 1] = 'j_throwback' 42 | G.GAME.banned_keys[#G.GAME.banned_keys + 1] = 'j_mxms_hopscotch' 43 | end 44 | end 45 | } 46 | -------------------------------------------------------------------------------- /items/jokers/teddy_bear.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'teddy_bear', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 5, 6 | y = 14 7 | }, 8 | rarity = 1, 9 | mxms_credits = { 10 | art = { "pinkzigzagoon" }, 11 | code = { "theAstra" }, 12 | idea = { "pinkzigzagoon" } 13 | }, 14 | blueprint_compat = true, 15 | cost = 4, 16 | calculate = function(self, card, context) 17 | if context.before and G.GAME.current_round.hands_left == 0 18 | and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then 19 | G.GAME.consumeable_buffer = G.GAME.consumeable_buffer + 1 20 | G.E_MANAGER:add_event(Event({ 21 | trigger = 'before', 22 | delay = 0.0, 23 | func = (function() 24 | if G.GAME.last_hand_played then 25 | local _planet = 0 26 | for k, v in pairs(G.P_CENTER_POOLS.Planet) do 27 | if v.config.hand_type == G.GAME.last_hand_played then 28 | _planet = v.key 29 | end 30 | end 31 | SMODS.add_card({ key = _planet }) 32 | G.GAME.consumeable_buffer = 0 33 | end 34 | return true 35 | end) 36 | })) 37 | SMODS.calculate_effect({ message = localize('k_plus_planet'), colour = G.C.SECONDARY_SET.Planet }, context.blueprint_card or card) 38 | end 39 | end 40 | } 41 | -------------------------------------------------------------------------------- /items/jokers/letter.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.horoscopes then 2 | SMODS.Joker { 3 | key = 'letter', 4 | atlas = 'Jokers', 5 | pos = { 6 | x = 1, 7 | y = 11 8 | }, 9 | mxms_credits = { 10 | art = { "Maxiss02" }, 11 | code = { "theAstra" }, 12 | idea = { "Maxiss02" } 13 | }, 14 | rarity = 2, 15 | blueprint_compat = true, 16 | cost = 4, 17 | calculate = function(self, card, context) 18 | if context.mxms_beat_horoscope and #G.mxms_horoscope.cards + G.GAME.mxms_horoscope_buffer < G.mxms_horoscope.config.card_limit + 1 then 19 | G.GAME.mxms_horoscope_buffer = G.GAME.mxms_horoscope_buffer + 1 20 | G.E_MANAGER:add_event(Event({ 21 | func = function() 22 | SMODS.add_card({ 23 | set = 'Horoscope', 24 | area = G.mxms_horoscope, 25 | key_append = 'lor', 26 | discover = true 27 | }) 28 | G.GAME.mxms_horoscope_buffer = G.GAME.mxms_horoscope_buffer - 1 29 | return true; 30 | end 31 | })) 32 | SMODS.calculate_effect({ message = localize('k_mxms_plus_horoscope'), colour = Maximus.C.HOROSCOPE }, 33 | context.blueprint_card or card) 34 | end 35 | end 36 | } 37 | else 38 | sendDebugMessage("Letter of Recommendation not loaded; Horoscopes Disabled", 'Maximus') 39 | end 40 | -------------------------------------------------------------------------------- /items/jokers/prospector.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'prospector', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 7, 6 | y = 15 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | dollars = 1 12 | } 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" }, 17 | idea = { "pinkzigzagoon" } 18 | }, 19 | blueprint_compat = true, 20 | cost = 6, 21 | loc_vars = function(self, info_queue, card) 22 | local stg = card.ability.extra 23 | info_queue[#info_queue + 1] = G.P_CENTERS.m_gold 24 | return { 25 | vars = { stg.dollars } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | 31 | if context.individual and context.end_of_round and context.cardarea == G.hand and SMODS.has_enhancement(context.other_card, 'm_gold') then 32 | context.other_card.ability.h_dollars = context.other_card.ability.h_dollars + stg.dollars 33 | return { 34 | message = localize('k_upgrade_ex'), 35 | message_card = context.other_card 36 | } 37 | end 38 | end, 39 | in_pool = function(self, args) 40 | for k, v in pairs(G.playing_cards) do 41 | if SMODS.has_enhancement(v, 'm_gold') then 42 | return true 43 | end 44 | end 45 | 46 | return false 47 | end 48 | } 49 | 50 | SMODS.JimboQuip { 51 | key = 'wq_prospector', 52 | type = 'win', 53 | extra = { center = 'j_mxms_prospector' } 54 | } -------------------------------------------------------------------------------- /items/jokers/bullseye.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'bullseye', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 5, 6 | y = 2 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | chips = 0, 12 | base_gain = 100 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "Maxiss02" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 5, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | local gain = stg.base_gain * G.GAME.round 25 | if gain < stg.base_gain then 26 | gain = stg.base_gain 27 | end 28 | return { 29 | vars = { gain, stg.chips } 30 | } 31 | end, 32 | calculate = function(self, card, context) 33 | local stg = card.ability.extra 34 | if context.joker_main and stg.chips > 0 then 35 | return { 36 | chips = stg.chips 37 | } 38 | end 39 | 40 | if context.end_of_round and not context.repetition and not context.individual and not context.blueprint and 41 | to_big(G.GAME.blind.chips) == to_big(G.GAME.chips) then 42 | stg.temp_gain = stg.base_gain * G.GAME.round 43 | SMODS.scale_card(card, { 44 | ref_table = stg, 45 | ref_value = "chips", 46 | scalar_value = "temp_gain", 47 | message_colour = G.C.CHIPS 48 | }) 49 | stg.temp_gain = nil 50 | return nil, true 51 | end 52 | end 53 | } 54 | -------------------------------------------------------------------------------- /items/jokers/honorable.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'honorable', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 2, 6 | y = 15 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | mult = 0, 12 | gain = 10 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "pinkzigzaoon" }, 17 | code = { "theAstra" }, 18 | idea = { "anerdymous" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 4, 22 | loc_vars = function(self, info_queue, card) 23 | info_queue[#info_queue + 1] = G.P_CENTERS.c_judgement 24 | local stg = card.ability.extra 25 | return { 26 | vars = { stg.gain, stg.mult } 27 | } 28 | end, 29 | calculate = function(self, card, context) 30 | local stg = card.ability.extra 31 | 32 | if context.mxms_judgement_used and not context.blueprint then 33 | G.E_MANAGER:add_event(Event({ 34 | func = function() 35 | context.card:start_dissolve() 36 | return true; 37 | end 38 | })) 39 | SMODS.scale_card(card, { 40 | ref_table = stg, 41 | ref_value = "mult", 42 | scalar_value = "gain" 43 | }) 44 | return nil, true 45 | end 46 | 47 | if context.joker_main and stg.mult > 0 then 48 | return { 49 | mult = stg.mult 50 | } 51 | end 52 | end 53 | } 54 | 55 | SMODS.JimboQuip { 56 | key = 'lq_honorable', 57 | type = 'loss', 58 | extra = { center = 'j_mxms_honorable' } 59 | } -------------------------------------------------------------------------------- /items/jokers/random_encounter.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'random_encounter', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 6, 6 | y = 3 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | prob = 1, 12 | odds = 4, 13 | mult = 1 14 | } 15 | }, 16 | mxms_credits = { 17 | art = { "Maxiss02" }, 18 | code = { "theAstra" }, 19 | idea = { "Maxiss02" } 20 | }, 21 | blueprint_compat = true, 22 | cost = 5, 23 | loc_vars = function(self, info_queue, card) 24 | local stg = card.ability.extra 25 | local prob, odds = SMODS.get_probability_vars(card, stg.prob, stg.odds, 'rand_enc') 26 | return { 27 | vars = { prob, odds, stg.mult } 28 | } 29 | end, 30 | calculate = function(self, card, context) 31 | local stg = card.ability.extra 32 | if context.individual and context.cardarea == G.play then 33 | if SMODS.pseudorandom_probability(card, 'rand_enc', stg.prob, stg.odds) then 34 | context.other_card.ability.perma_mult = context.other_card.ability.perma_mult or 0 35 | context.other_card.ability.perma_mult = context.other_card.ability.perma_mult + stg.mult 36 | return { 37 | message = localize('k_mxms_r_mult_ex'), 38 | colour = G.C.MULT, 39 | card = card 40 | } 41 | end 42 | end 43 | end 44 | } 45 | 46 | SMODS.JimboQuip { 47 | key = 'wq_random_encounter', 48 | type = 'win', 49 | extra = { center = 'j_mxms_random_encounter' } 50 | } 51 | -------------------------------------------------------------------------------- /items/jokers/employee.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.horoscopes then 2 | SMODS.Joker { 3 | key = 'employee', 4 | atlas = 'Jokers', 5 | pos = { 6 | x = 2, 7 | y = 11 8 | }, 9 | rarity = 2, 10 | config = { 11 | extra = { 12 | dollars = 5 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "Maxiss02" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 7, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | return { 25 | vars = { stg.dollars } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | 31 | if context.end_of_round and not context.individual and not context.repetition then 32 | for k, v in pairs(G.mxms_horoscope.cards) do 33 | (context.blueprint_card or card):juice_up(0.3, 0.4) 34 | SMODS.calculate_effect({ dollars = stg.dollars }, v) 35 | end 36 | end 37 | end 38 | } 39 | 40 | SMODS.JimboQuip { 41 | key = 'lq_employee', 42 | type = 'loss', 43 | extra = { center = 'j_mxms_employee' } 44 | } 45 | 46 | SMODS.JimboQuip { 47 | key = 'wq_employee', 48 | type = 'win', 49 | extra = { center = 'j_mxms_employee' } 50 | } 51 | else 52 | sendDebugMessage("Employee not loaded; Horoscopes Disabled", 'Maximus') 53 | end 54 | -------------------------------------------------------------------------------- /items/jokers/leto.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'leto', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 6, 6 | y = 7 7 | }, 8 | soul_pos = { 9 | x = 6, 10 | y = 8 11 | }, 12 | rarity = 4, 13 | unlocked = false, 14 | unlock_condition = { 15 | type = '', 16 | extra = '', 17 | hidden = true 18 | }, 19 | blueprint_compat = true, 20 | cost = 20, 21 | mxms_credits = { 22 | art = { "Maxiss02" }, 23 | code = { "theAstra" }, 24 | idea = { "anerdymous" } 25 | }, 26 | calculate = function(self, card, context) 27 | if context.first_hand_drawn then 28 | local cen_pool = {} 29 | for k, v in pairs(G.P_CENTER_POOLS["Enhanced"]) do 30 | if v.key ~= 'm_stone' then 31 | cen_pool[#cen_pool + 1] = v.key 32 | end 33 | end 34 | 35 | local _card = SMODS.add_card({ 36 | set = 'Playing Card', 37 | rank = 'Queen', 38 | enhancement = pseudorandom_element(cen_pool, pseudoseed('leto_enh')), 39 | key_append = 'leto' 40 | }) 41 | 42 | G.E_MANAGER:add_event(Event({ 43 | func = function() 44 | _card:start_materialize() 45 | G.GAME.blind:debuff_card(_card) 46 | G.hand:sort(); 47 | (context.blueprint_card or card):juice_up() 48 | return true 49 | end 50 | })) 51 | 52 | playing_card_joker_effects({ _card }) 53 | 54 | return nil, true 55 | end 56 | end 57 | } 58 | -------------------------------------------------------------------------------- /items/blinds/rot.lua: -------------------------------------------------------------------------------- 1 | SMODS.Blind { 2 | key = 'rot', 3 | boss = { 4 | min = 1, 5 | max = 10 6 | }, 7 | atlas = 'Blinds', 8 | pos = { 9 | x = 0, 10 | y = 0 11 | }, 12 | mxms_credits = { 13 | art = { "Maxiss02" }, 14 | code = { "theAstra" }, 15 | idea = { "Maxiss02" } 16 | }, 17 | boss_colour = HEX('A2CA4C'), 18 | set_blind = function(self) 19 | for i = 1, #G.playing_cards / 4 do 20 | local card = G.playing_cards[pseudorandom(pseudoseed('rotcard' .. i), 1, #G.playing_cards)] 21 | local j = 1 22 | while card.debuffed_by_blind do 23 | card = G.playing_cards[pseudorandom(pseudoseed('rotcard_reroll' .. j), 1, #G.playing_cards)] 24 | j = j + 1 25 | end 26 | card.debuffed_by_blind = true 27 | self.triggered = true 28 | card:set_debuff(true) 29 | end 30 | end, 31 | recalc_debuff = function(self, card, from_blind) 32 | if card.debuffed_by_blind then 33 | return true 34 | else 35 | return false 36 | end 37 | end, 38 | disable = function(self) 39 | for k, v in pairs(G.playing_cards) do 40 | if v.debuffed_by_blind then 41 | v:set_debuff(); v.debuffed_by_blind = nil 42 | end 43 | end 44 | self.triggered = false 45 | end, 46 | defeat = function(self) 47 | for k, v in pairs(G.playing_cards) do 48 | if v.debuffed_by_blind then 49 | v:set_debuff(); v.debuffed_by_blind = nil 50 | end 51 | end 52 | self.triggered = false 53 | end 54 | } 55 | -------------------------------------------------------------------------------- /items/jokers/memory_game.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'memory_game', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 3, 6 | y = 9 7 | }, 8 | mxms_credits = { 9 | art = { "pinkzigzagoon" }, 10 | code = { "theAstra" }, 11 | idea = { "pinkzigzagoon" } 12 | }, 13 | rarity = 1, 14 | blueprint_compat = false, 15 | cost = 5, 16 | calculate = function(self, card, context) 17 | if context.before and context.scoring_name == "Pair" and not context.blueprint then 18 | play_sound('tarot1') 19 | card:juice_up(0.3, 0.5) 20 | 21 | delay(0.2) 22 | 23 | for i = 1, 2 do 24 | local percent = 1.15 - (i - 0.999) / (#context.scoring_hand - 0.998) * 0.3 25 | context.scoring_hand[i]:flip(); 26 | play_sound('card1', percent); 27 | context.scoring_hand[i]:juice_up(0.3, 0.3); 28 | end 29 | 30 | delay(0.2) 31 | 32 | copy_card(context.scoring_hand[2], context.scoring_hand[1]) 33 | 34 | for i = 1, 2 do 35 | local percent = 0.85 - (i - 0.999) / (#context.scoring_hand - 0.998) * 0.3 36 | G.E_MANAGER:add_event(Event({ 37 | trigger = 'after', 38 | delay = 0.15, 39 | func = function() 40 | context.scoring_hand[i]:flip(); 41 | play_sound('card1', percent); 42 | context.scoring_hand[i]:juice_up(0.3, 0.3); 43 | return true 44 | end 45 | })) 46 | end 47 | delay(0.5) 48 | end 49 | end 50 | } 51 | -------------------------------------------------------------------------------- /items/blinds/cheat.lua: -------------------------------------------------------------------------------- 1 | SMODS.Blind { 2 | key = 'cheat', 3 | boss = { 4 | min = 4, 5 | max = 10 6 | }, 7 | atlas = 'Blinds', 8 | pos = { 9 | x = 0, 10 | y = 5 11 | }, 12 | mxms_credits = { 13 | art = { "Maxiss02" }, 14 | code = { "theAstra" }, 15 | idea = { "theAstra" } 16 | }, 17 | boss_colour = HEX('4E4C76'), 18 | recalc_debuff = function(self, card, from_blind) 19 | if card.ability.set == 'Enhanced' or 20 | card.edition and (card.ability.set == 'Enhanced' or card.ability.set == 'Default') or 21 | card.seal and (card.ability.set == 'Enhanced' or card.ability.set == 'Default') then 22 | self.triggered = true 23 | card.debuffed_by_blind = true 24 | return true 25 | else 26 | card.debuffed_by_blind = false 27 | return false 28 | end 29 | end, 30 | disable = function(self) 31 | for k, v in pairs(G.playing_cards) do 32 | if v.debuffed_by_blind then 33 | v:set_debuff(); v.debuffed_by_blind = nil 34 | end 35 | end 36 | self.triggered = false 37 | end, 38 | defeat = function(self) 39 | for k, v in pairs(G.playing_cards) do 40 | if v.debuffed_by_blind then 41 | v:set_debuff(); v.debuffed_by_blind = nil 42 | end 43 | end 44 | self.triggered = false 45 | end, 46 | in_pool = function(self, args) 47 | if not (G.GAME.bosses_used['bl_mxms_rule'] > 0) and self.boss.min <= math.max(1, G.GAME.round_resets.ante) then 48 | return true 49 | end 50 | 51 | return false 52 | end 53 | } 54 | -------------------------------------------------------------------------------- /items/jokers/group_chat.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'group_chat', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 4, 6 | y = 6 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | chips = 0, 12 | gain = 2 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "pinkzigzagoon" }, 17 | code = { "theAstra" }, 18 | idea = { "pinkzigzagoon" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 3, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | return { 25 | vars = { stg.chips, stg.gain } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | if context.joker_main and stg.chips > 0 then 31 | return { 32 | chips = stg.chips 33 | } 34 | end 35 | end, 36 | calc_scaling = function(self, card, other_card, initial, scalar_value, args) 37 | local stg = card.ability.extra 38 | if args.operation == '+' and other_card.config.center_key ~= 'j_mxms_group_chat' or args.operation == 'X' then 39 | SMODS.scale_card(card, { 40 | ref_table = stg, 41 | ref_value = "chips", 42 | scalar_value = "gain", 43 | message_colour = G.C.CHIPS 44 | }) 45 | return nil, true 46 | end 47 | end, 48 | set_ability = function(self, card, inital, delay_sprites) 49 | local W = card.T.w 50 | W = W * (66 / 71) 51 | card.children.center.scale.x = card.children.center.scale.x * (66 / 71) 52 | card.T.w = W 53 | end 54 | } 55 | -------------------------------------------------------------------------------- /items/jokers/jestcoin.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'jestcoin', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 2, 6 | y = 16 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | money = 2, 12 | prob = 1, 13 | odds = 3 14 | } 15 | }, 16 | mxms_credits = { 17 | art = { "Maxiss02" }, 18 | code = { "theAstra" }, 19 | idea = { "anerdymous" } 20 | }, 21 | blueprint_compat = false, 22 | cost = 4, 23 | loc_vars = function(self, info_queue, card) 24 | local stg = card.ability.extra 25 | return { 26 | vars = { stg.money, SMODS.get_probability_vars(card, stg.prob, stg.odds, 'jestcoin')} 27 | } 28 | end, 29 | calc_dollar_bonus = function(self, card) 30 | local stg = card.ability.extra 31 | 32 | if SMODS.pseudorandom_probability(card, 'jestcoin', stg.prob, stg.odds) then 33 | G.E_MANAGER:add_event(Event({ 34 | func = function() 35 | ease_dollars(-G.GAME.dollars, true) 36 | return true; 37 | end 38 | })) 39 | SMODS.calculate_effect({ message = localize('k_mxms_crashed_ex'), colour = G.C.RED }, card) 40 | stg.money = 2 41 | SMODS.calculate_effect({ message = localize('k_reset'), colour = G.C.ATTENTION }, card) 42 | else 43 | local cashout = stg.money 44 | stg.money = stg.money ^ 2 45 | SMODS.calculate_effect({ message = localize('k_upgrade_ex'), colour = G.C.MONEY }, card) 46 | SMODS.calculate_context({ mxms_scaling_card = true }) 47 | return cashout 48 | end 49 | end 50 | } 51 | -------------------------------------------------------------------------------- /items/challenges/all_stars.lua: -------------------------------------------------------------------------------- 1 | SMODS.Challenge { 2 | key = 'all_stars', 3 | rules = { 4 | custom = { 5 | { id = 'mxms_all_rare' } 6 | } 7 | }, 8 | jokers = {}, 9 | restrictions = { 10 | banned_cards = { 11 | { id = 'p_standard_normal_1', ids = { 12 | 'p_standard_normal_1', 'p_standard_normal_2', 13 | 'p_standard_normal_3', 'p_standard_normal_4', 14 | 'p_standard_jumbo_1', 'p_standard_jumbo_2', 15 | 'p_standard_mega_1', 'p_standard_mega_2' } 16 | }, 17 | { id = 'p_arcana_normal_1', ids = { 18 | 'p_arcana_normal_1', 'p_arcana_normal_2', 19 | 'p_arcana_normal_3', 'p_arcana_normal_4', 20 | 'p_arcana_jumbo_1', 'p_arcana_jumbo_2', 21 | 'p_arcana_mega_1', 'p_arcana_mega_2' } 22 | }, 23 | { id = 'p_celestial_normal_1', ids = { 24 | 'p_celestial_normal_1', 'p_celestial_normal_2', 25 | 'p_celestial_normal_3', 'p_celestial_normal_4', 26 | 'p_celestial_jumbo_1', 'p_celestial_jumbo_2', 27 | 'p_celestial_mega_1', 'p_celestial_mega_2' } 28 | }, 29 | { id = 'p_buffoon_normal_1', ids = { 30 | 'p_buffoon_normal_1', 'p_buffoon_normal_2', 31 | 'p_buffoon_jumbo_1', 'p_buffoon_mega_1' } 32 | }, 33 | { id = 'p_mxms_horoscope_normal_1', ids = { 34 | 'p_mxms_horoscope_normal_1', 'p_mxms_horoscope_normal_2', 35 | 'p_mxms_horoscope_jumbo_1', 'p_mxms_horoscope_mega_1' } 36 | }, 37 | } 38 | }, 39 | deck = { 40 | type = 'Challenge Deck' 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /items/consumables/immortality.lua: -------------------------------------------------------------------------------- 1 | SMODS.Consumable { 2 | key = 'immortality', 3 | set = 'Spectral', 4 | atlas = 'Consumables', 5 | pos = { 6 | x = 1, 7 | y = 3 8 | }, 9 | config = { 10 | extra = 'mxms_black' 11 | }, 12 | cost = 4, 13 | loc_vars = function(self, info_queue, card) 14 | info_queue[#info_queue + 1] = G.P_SEALS['mxms_black'] 15 | 16 | return { 17 | vars = { 18 | colours = { 19 | G.C.BLACK, 20 | G.C.WHITE 21 | } 22 | } 23 | } 24 | end, 25 | mxms_credits = { 26 | art = { "Maxiss02" }, 27 | code = { "theAstra" }, 28 | idea = { "pinkzigzagoon" } 29 | }, 30 | use = function(self, card, area, copier) 31 | local conv_card = G.hand.highlighted[1] 32 | G.E_MANAGER:add_event(Event({ 33 | func = function() 34 | play_sound('tarot1') 35 | card:juice_up(0.3, 0.5) 36 | return true 37 | end 38 | })) 39 | 40 | G.E_MANAGER:add_event(Event({ 41 | trigger = 'after', 42 | delay = 0.1, 43 | func = function() 44 | conv_card:set_seal(card.ability.extra, nil, true) 45 | return true 46 | end 47 | })) 48 | 49 | delay(0.5) 50 | G.E_MANAGER:add_event(Event({ 51 | trigger = 'after', 52 | delay = 0.2, 53 | func = function() 54 | G.hand:unhighlight_all(); return true 55 | end 56 | })) 57 | end, 58 | can_use = function(self, card) 59 | return #G.hand.highlighted == 1 60 | end 61 | } 62 | -------------------------------------------------------------------------------- /items/jokers/clown_car.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'clown_car', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 0, 6 | y = 3 7 | }, 8 | rarity = 2, 9 | config = { 10 | extra = { 11 | mult = 0, 12 | gain = 2 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "Maxiss02" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 7, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | return { 25 | vars = { stg.mult, stg.gain } 26 | } 27 | end, 28 | calculate = function(self, card, context) 29 | local stg = card.ability.extra 30 | if context.joker_main and stg.mult > 0 then 31 | return { 32 | mult = stg.mult, 33 | } 34 | end 35 | 36 | if context.card_added and context.card.ability.set == 'Joker' then 37 | SMODS.scale_card(card, { 38 | ref_table = stg, 39 | ref_value = "mult", 40 | scalar_value = "gain", 41 | message_colour = G.C.ATTENTION 42 | }) 43 | return nil, true 44 | end 45 | end 46 | } 47 | 48 | SMODS.JimboQuip { 49 | key = 'lq_clown_car', 50 | type = 'loss', 51 | extra = { 52 | center = 'j_mxms_clown_car', 53 | times = 1 54 | } 55 | } 56 | 57 | SMODS.JimboQuip { 58 | key = 'wq_clown_car', 59 | type = 'win', 60 | extra = { 61 | center = 'j_mxms_clown_car', 62 | times = 2, 63 | sound = 'mxms_clown_horn', 64 | delay = 0.25, 65 | juice = {0.6, 0.6} 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /items/jokers/coupon.lua: -------------------------------------------------------------------------------- 1 | SMODS.Joker { 2 | key = 'coupon', 3 | atlas = 'Jokers', 4 | pos = { 5 | x = 1, 6 | y = 4 7 | }, 8 | rarity = 1, 9 | config = { 10 | extra = { 11 | prob = 1, 12 | odds = 10 13 | } 14 | }, 15 | mxms_credits = { 16 | art = { "Maxiss02" }, 17 | code = { "theAstra" }, 18 | idea = { "Maxiss02" } 19 | }, 20 | blueprint_compat = true, 21 | cost = 5, 22 | loc_vars = function(self, info_queue, card) 23 | local stg = card.ability.extra 24 | return { 25 | vars = { SMODS.get_probability_vars(card, stg.prob, stg.odds, 'cou') } 26 | } 27 | end, 28 | pixel_size = { w = 53 }, 29 | calculate = function(self, card, context) 30 | local stg = card.ability.extra 31 | 32 | if context.mxms_joker_cost_check and context.card.cost ~= 0 then 33 | if SMODS.pseudorandom_probability(card, 'cou', stg.prob, stg.odds) then 34 | G.E_MANAGER:add_event(Event({ 35 | func = function() 36 | context.card.cost = 0 37 | context.card:juice_up() 38 | return true 39 | end 40 | })) 41 | return { 42 | message = localize('k_mxms_free_ex'), 43 | colour = G.C.MONEY, 44 | sound = 'coin1' 45 | } 46 | else 47 | return { 48 | message = localize('k_nope_ex'), 49 | colour = G.C.SET.Tarot, 50 | sound = 'tarot2' 51 | } 52 | end 53 | end 54 | end, 55 | } 56 | -------------------------------------------------------------------------------- /items/consumables/corot.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.new_handtypes then 2 | SMODS.Consumable { 3 | key = 'corot', 4 | set = 'Planet', 5 | atlas = 'Consumables', 6 | pos = { 7 | x = 4, 8 | y = 0 9 | }, 10 | config = { 11 | hand_type = 'mxms_s_flush', 12 | mxms_exoplanet = true, 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" } 17 | }, 18 | cost = 4, 19 | loc_vars = function(self, info_queue, center) 20 | return { 21 | vars = 22 | { 23 | G.GAME.hands[center.ability.hand_type].level, 24 | localize(center.ability.hand_type, "poker_hands"), 25 | G.GAME.hands[center.ability.hand_type].l_mult, 26 | G.GAME.hands[center.ability.hand_type].l_chips, 27 | colours = { 28 | (G.GAME.hands[center.ability.hand_type].level == 1 and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[math.min(7, G.GAME.hands[center.ability.hand_type].level)]) 29 | } 30 | }, 31 | } 32 | end, 33 | in_pool = function(self, args) 34 | if (G.GAME and G.GAME.starting_params.play_limit >= 6) then 35 | return true 36 | end 37 | 38 | return false 39 | end, 40 | set_card_type_badge = function(self, card, badges) 41 | badges[#badges + 1] = create_badge(localize('k_mxms_exoplanet'), get_type_colour(card.config.center, card), 42 | nil, 1.2) 43 | end 44 | } 45 | else 46 | sendDebugMessage("Corot not loaded; New Handtypes Disabled", 'Maximus') 47 | end 48 | -------------------------------------------------------------------------------- /items/consumables/wasp.lua: -------------------------------------------------------------------------------- 1 | if Maximus_config.new_handtypes then 2 | SMODS.Consumable { 3 | key = 'wasp', 4 | set = 'Planet', 5 | atlas = 'Consumables', 6 | pos = { 7 | x = 1, 8 | y = 0 9 | }, 10 | config = { 11 | hand_type = 'mxms_double_triple', 12 | mxms_exoplanet = true, 13 | }, 14 | mxms_credits = { 15 | art = { "Maxiss02" }, 16 | code = { "theAstra" } 17 | }, 18 | cost = 4, 19 | loc_vars = function(self, info_queue, center) 20 | return { 21 | vars = 22 | { 23 | G.GAME.hands[center.ability.hand_type].level, 24 | localize(center.ability.hand_type, "poker_hands"), 25 | G.GAME.hands[center.ability.hand_type].l_mult, 26 | G.GAME.hands[center.ability.hand_type].l_chips, 27 | colours = { 28 | (G.GAME.hands[center.ability.hand_type].level == 1 and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[math.min(7, G.GAME.hands[center.ability.hand_type].level)]) 29 | } 30 | }, 31 | } 32 | end, 33 | in_pool = function(self, args) 34 | if (G.GAME and G.GAME.starting_params.play_limit >= 6) then 35 | return true 36 | end 37 | 38 | return false 39 | end, 40 | set_card_type_badge = function(self, card, badges) 41 | badges[#badges + 1] = create_badge(localize('k_mxms_exoplanet'), get_type_colour(card.config.center, card), 42 | nil, 1.2) 43 | end 44 | } 45 | else 46 | sendDebugMessage("Wasp not loaded; New Handtypes Disabled", 'Maximus') 47 | end 48 | --------------------------------------------------------------------------------