the cutting room mirror

Balatro

This article has a talk page!
view on tcrf.net

Unused Graphics#

An unused Joker present in the files of an older pre-v1.0 version, drawn by Lumpy Touch. It was given the name "Chaos Theory" in the Lumpy Touch short revealing this information,2 however this name was most likely made-up as the Joker never actually had a name, nor was it ever implemented.3

An unused deck. It's unknown what its ability would be.

There are two unused stakes, a yellow stake and a Joker one. The Joker one was never supposed to be in the game, since LocalThunk made it for fun,4 however nothing has been said about the yellow stake so far.

Developer Comments#

Card.lua#

if self.added_to_deck then --Need to override if adding negative to an existing joker
                if self.ability.consumeable then
                    G.consumeables.config.card_limit = G.consumeables.config.card_limit + 1
                else
                    G.jokers.config.card_limit = G.jokers.config.card_limit + 1
                end
if self.config.center.unlocked == false and not self.bypass_lock then --For everyting that is locked
        card_type = "Locked"
        if self.area and self.area == G.shop_demo then loc_vars = {}; no_badge = true end
    elseif card_type == 'Undiscovered' and not self.bypass_discovery_ui then -- Any Joker or tarot/planet/voucher that is not yet discovered
elseif self.ability.set == 'Joker' then -- all remaining jokers
if self.ability.name == 'Ankh' then 
        --Need to check for edgecases - if there are max Jokers and all are eternal OR there is a max of 1 joker this isn't possible already
        --If there are max Jokers and exactly 1 is not eternal, that joker cannot be the one selected
        --otherwise, the selected joker can be totally random and all other non-eternal jokers can be removed
if self.ability.name == 'Ankh' then
            --if there is at least one joker
            for k, v in pairs(G.jokers.cards) do
                if v.ability.set == 'Joker' and G.jokers.config.card_limit > 1 then 
                    return true
                end
    --if this is the focused card
    if self.states.focus.is and not self.children.focused_ui then
        self.children.focused_ui = G.UIDEF.card_focus_ui(self)
    end
    --Draw the shadow
    if not self.no_shadow and G.SETTINGS.GRAPHICS.shadows == 'On' and((layer == 'shadow' or layer == 'both') and (self.ability.effect ~= 'Glass Card' and not self.greyed) and ((self.area and self.area ~= G.discard and self.area.config.type ~= 'deck') or not self.area or self.states.drag.is)) then
        self.shadow_height = 0*(0.08 + 0.4*math.sqrt(self.velocity.x^2)) + ((((self.highlighted and self.area == G.play) or self.states.drag.is) and 0.35) or (self.area and self.area.config.type == 'title_2') and 0.04 or 0.1)
        G.shared_shadow:draw_shader('dissolve', self.shadow_height)
    end

Debug Mode#

Setting _RELEASE_MODE = false in conf.lua enables debug mode. Afterwards, hold Tab ↹ to access the debug menu.5

The debug mode provides functions, including:

  • Changing editions (even on playing card)
  • +$10
  • Spawning/discovering/unlocking jokers/consumables
  • Giving hands/discards
  • Forcing a win/loss
  • Increase ante/round
  • +10 chips/mult
  • X10/X2 mult
  • Reroll the boss blind
  • Test functions for Jimbo and the game's background

(Source: Drogobo)

Unused Challenge#

Found commented out in challenges.lua is an unused challenge that tests all of the possible game modifiers (such as which Jokers/cards you start with and which ones are banned).

{[[{
        name = 'TEST',
        id = 'c_test_1',
        rules = {
            custom = {
                --{id = 'no_reward'},
                {id = 'no_reward_specific', value = 'Big'},
                {id = 'no_extra_hand_money'},
                {id = 'no_interest'},
                {id = 'daily'},
                {id = 'set_seed', value = 'SEEDEEDS'},
            },
            modifiers = {
                {id = 'dollars', value = 100},
                {id = 'discards', value = 1},
                {id = 'hands', value = 6},
                {id = 'reroll_cost', value = 10},
                {id = 'joker_slots', value = 8},
                {id = 'consumable_slots', value = 3},
                {id = 'hand_size', value = 5},
            }
        },
        jokers = {
            {id = 'j_egg'},
            {id = 'j_egg'},
            {id = 'j_egg'},
            {id = 'j_egg'},
            {id = 'j_egg', edition = 'foil', eternal = true}
        },
        consumeables = {
            {id = 'c_sigil'}
        },
        vouchers = {
            {id = 'v_hieroglyph'},
        },
        deck = {
            --enhancement = 'm_glass',
            --edition = 'foil',
            --gold_seal = true,
            --yes_ranks = {['3'] = true,T = true},
            --no_ranks = {['4'] = true},
            --yes_suits = {S=true},
            --no_suits = {D=true},
            cards = {{s='D',r='2',e='m_glass',},{s='D',r='3',e='m_glass',},{s='D',r='4',e='m_glass',},{s='D',r='5',e='m_glass',},{s='D',r='6',e='m_glass',},{s='D',r='7',e='m_glass',},{s='D',r='8',e='m_glass',},{s='D',r='9',e='m_glass',},{s='D',r='T',e='m_glass',},{s='D',r='J',e='m_glass',},{s='D',r='Q',e='m_glass',},{s='D',r='K',e='m_glass',},{s='D',r='A',e='m_glass',},{s='C',r='2',e='m_glass',},{s='C',r='3',e='m_glass',},{s='C',r='4',e='m_glass',},{s='C',r='5',e='m_glass',},{s='C',r='6',e='m_glass',},{s='C',r='7',e='m_glass',},{s='C',r='8',e='m_glass',},{s='C',r='9',e='m_glass',},{s='C',r='T',e='m_glass',},{s='C',r='J',e='m_glass',},{s='C',r='Q',e='m_glass',},{s='C',r='K',e='m_glass',},{s='C',r='A',e='m_glass',},{s='H',r='2',e='m_glass',},{s='H',r='3',e='m_glass',},{s='H',r='4',e='m_glass',},{s='H',r='5',e='m_glass',},{s='H',r='6',e='m_glass',},{s='H',r='7',e='m_glass',},{s='H',r='8',e='m_glass',},{s='H',r='9',e='m_glass',},{s='H',r='T',e='m_glass',},{s='H',r='J',e='m_glass',},{s='H',r='Q',e='m_glass',},{s='H',r='K',e='m_glass',},{s='H',r='A',e='m_glass',},{s='S',r='2',e='m_glass',},{s='S',r='3',e='m_glass',},{s='S',r='4',e='m_glass',},{s='S',r='5',e='m_glass',},{s='S',r='6',e='m_glass',},{s='S',r='7',e='m_glass',},{s='S',r='8',e='m_glass',},{s='S',r='9',e='m_glass',},{s='S',r='T',e='m_glass',},{s='S',r='J',e='m_glass',},{s='S',r='Q',e='m_glass',},{s='S',r='K',e='m_glass',},{s='S',r='A',e='m_glass',},},
            type = 'Challenge Deck'
        },
        restrictions = {
            banned_cards = {
                {id = 'j_joker'},
                {id = 'j_egg'},
            },
            banned_tags = {
                {id = 'tag_garbage'},
                {id = 'tag_handy'},
            },
            banned_other = {
                {id = 'bl_wall', type = 'blind'}
            }
        }
    },]]}

(Source: Original TCRF research)

Commented Out Music Code#

Found within test_functions.lua is an older, unused version of the code which determines what music to play. The unused one is noticeably longer.

Unused

Used

{video = 'A1', _s = 2.5, _e = 13.9, track = 'music1'},
        {video = '_A2', _s = 0.4, _e = 3.15},
        {video = 'A3', _s = 0.2, _e = 2.25},
        {video = 'A4', _s = 3.4, _e = 8.2},
        {video = '_B1', _s = 0.15, _e = 4.4},
        {video = 'B3', _s = 2.7, _e = 5.3},
        {video = 'B4', _s = 21.5, _e = 27.6},
        {video = '_C1', _s = 0.25, _e = 3.2, track = 'music4'},
        {video = 'C2', _s = 1.4, _e = 4.4},
        {video = 'C3', _s = 1.9, _e = 4.3, track = 'music3'},
        {video = 'C4a', _s = 1.3, _e = 4.5, track = 'music2'},
        {video = '_C5', _s = 0.1, _e = 3.4, track = 'music1'},
        {video = 'C4b', _s = 0.15, _e = 3.5},
        {video = 'D4', _s = 0.3, _e = 3.7, track = 'music4'},
        {video = 'D3', _s = 1.6, _e = 4.8, track = 'music1'},
        {video = 'D1', _s = 1.4, _e = 3.5, track = 'music4'},
        {video = 'D5', _s = 1.0, _e = 3.8, track = 'music1'},
        {video = 'E1', _s = 3, _e = 6.55},
        {video = 'E2', _s = 0., _e = 4.1},
        {video = 'E3', _s = 3.5, _e = 7.5},
        {video = 'E4', _s = 4, _e = 7.2},
        {video = 'E5', _s = 5.9, _e = 9.2, track = 'music1'},
        {video = 'F1', _s = 4.2, _e = 8.1},
        {video_organ = 0.1, video = 'F5', _s = 2.25, _e = 5.4},
        {video_organ = 0.05, video = 'F6', _s = 0, _e = 2.3},
        {video_organ = 0.2, video = 'F2', _s = 0.2, _e = 1.6},
        {video_organ = 0.4, video = 'F3', _s = 2.6, _e = 4.2},    ]]--
{video = 'A3', _s = 0.1, _e = 4.65, track = 'music1'},
        {video = 'E1', _s = 3.69, _e = 6.55},
        {video = 'C3', _s = 1.9, _e = 4.3, track = 'music3'},
        {video = 'E5', _s = 5.9, _e = 9.2, track = 'music1'},
        {video = 'C4a', _s = 1.3, _e = 4.5, track = 'music2'},
        {video = 'E4', _s = 4, _e = 7.2, track = 'music1'},
        {video = 'D4', _s = 0.3, _e = 3.2, track = 'music4'},
        {video = 'C2', _s = 2.0, _e = 4.4, track = 'music1'},
        {video = 'B3', _s = 2.7, _e = 5.3},
        {video = 'B4', _s = 21.5, _e = 24.8},
        {video = 'D5', _s = 1.2, _e = 3.8, track = 'music1'},
        {video_organ = 0.1,video = 'E2', _s = 1.5, _e = 4.1},
        {video_organ = 0.2,video = 'E3', _s = 3.5, _e = 7.5},
        {video_organ = 0.4, video = 'D3', _s = 1.9, _e = 4.3, track = 'music1'},

Gameplay Mechanic Oddities#

Negative Ante#

Watch on YouTube

Through exceptional circumstances and quick reflexes, it is possible to reach Ante -1.

Normally the game supplies substitutes when cards it would otherwise spawn are not allowed in the current state of the game. For example, absent the effects of Showman, if a shop would offer multiple identical Jokers, then each duplicate will be swapped with a different card to ensure that the shop's offerings are unique. Vouchers work the same way: when the shop offers multiple vouchers (through the player's use of the Voucher Tag), they will be unique. However, the logic that checks for duplication runs only when each voucher spawns, and vouchers spawn one by one with a short delay in between. If the player very quickly purchases a voucher before the next one spawns, they can purchase both a voucher and its upgraded version from the same shop. In practice, this maneuver is only possible when the game is set to a very slow speed through the game's settings.

For seeds where skipping the Small Blind of Ante 1 provides a Voucher Tag and the game calls for Hieroglyph twice, the player can skip the Small Blind, complete the Big Blind as usual, and immediately purchase Hieroglyph from the shop before the second voucher spawns. The second voucher, which the duplication logic would ordinarily substitute for something else, is now seen as unique and is offered to the player as an upgraded version of the Hieroglyph (Petroglyph). The effect of Hieroglyph and Petroglyph combined reduces the Ante by 2, allowing the player to play the Boss Blind on Ante -1.

The chip requirements for Ante -1 are the same as Ante 0 (100/150/200 for the Small/Big/Boss Blinds). Only the Boss Blind of Ante -1 can be played.

Ante -1 can only be reached with the Yellow Deck since no other arrangement can provide the player enough money to purchase two vouchers from their first shop.6

The seed used in the video is D97VRMNE.

Revisional Differences#

v1.0.1c#

Joker Changes#

  • The league of the Sinful Jokers (Greedy ♢, Lusty ♡, Wrathful ♠, and Gluttonous ♣) were changed to only give +3 Mult instead of +4 Mult.
  • Banner was changed to only give +30 Chips instead of +40 Chips per remaining discard.
  • Hiker was buffed to give +5 Chips permanently instead of +4 Chips permanently.

Pre-1.0.1c

v1.0.1c

Balatro-1.0-MadJoker.png

+20 Mult if played
hand contains
a Four of a Kind

Balatro-1.0.1c-MadJoker.png

+10 Mult if played
hand contains
a Two Pair

Pre-1.0.1c

v1.0.1c

Balatro-1.0-CleverJoker.png

+150 Chips if played
hand contains
a Four of a Kind

Balatro-1.0.1c-CleverJoker.png

+80 Chips if played
hand contains
a Two Pair
  • Mad Joker and Clever Joker were changed to apply to played hands containing a Two Pair instead of a Four of a Kind. The graphics, as well as the respective amount of Chips and Mult, were changed accordingly. The corners of the second and third cards appearing on the bottom of the jokers were touched up as well.

Pre-1.0.1c

v1.0.1c

Balatro-1.0-8Ball.png

Create a Planet card
if played hand contains
2 or more 8s

Balatro-1.0.1c-8Ball.png

1 in 4 chance for each
played 8 to create a
Tarot card when scored
  • 8 Ball's effect was completely redone, and as such its graphic's color was changed from blue to purple in accordance with the effect overhaul.

Tarot & Planet Card Changes#

  • Magician changed from being only able to select 1 card to turn into a Lucky Card to being able to select 2 cards to turn into Lucky Cards.
  • Saturn's +Mult count increased from +2 Mult to +3 Mult.
  • Neptune's +Mult count increased from +3 Mult to +4 Mult.
  • Ceres' +Mult count increased from +3 Mult to +4 Mult.
  • Eris' +Chip count increased from +40 Chips to +50 Chips.

v1.0.1e#

References#


  1. Balatro (Steam)↩︎
  2. Lumpy Touch Short about the two Jokers he designed↩︎
  3. LocalThunk deconfirming the "Chaos Theory" name↩︎
  4. LocalThunk saying they made the Joker Stake for fun↩︎
  5. Balatro's secret debug menu - Drogobo↩︎
  6. Balatro Wiki section on Ante -1 mentioning that the Yellow Desk must be used↩︎