Skip to content

Commit fa920f0

Browse files
CopilotFilPag
andcommitted
Add new upstream features: Bloodstone joker, Judgement consumable, updated localization
Co-authored-by: FilPag <1493826+FilPag@users.noreply.github.com>
1 parent 2540033 commit fa920f0

File tree

3 files changed

+180
-23
lines changed

3 files changed

+180
-23
lines changed

localization/en-us.lua

Lines changed: 73 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
return {
22
descriptions = {
3+
Tag = {
4+
tag_mp_sandbox_rare = {
5+
name = "Gambling Tag",
6+
text = {
7+
"{C:green}#1# in #2#{} chance",
8+
"Shop has a free",
9+
"{C:red}Rare Joker{}",
10+
},
11+
},
12+
},
313
Joker = {
414
j_broken = {
515
name = "BROKEN",
@@ -15,6 +25,7 @@ return {
1525
"{C:chips}+#1#{} Chips for every {C:red,E:1}life{}",
1626
"less than your {X:purple,C:white}Nemesis{}",
1727
"{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)",
28+
"{C:inactive}(Stake-dependent)",
1829
},
1930
},
2031
j_mp_skip_off = {
@@ -78,7 +89,6 @@ return {
7889
"your {X:purple,C:white}Nemesis'{} highest ",
7990
"sell cost {C:attention}Joker{}",
8091
"{C:inactive}(Currently {C:attention}#2#{C:inactive}/#3# rounds)",
81-
"{C:inactive,s:0.8}(Does not copy Joker state)",
8292
},
8393
},
8494
j_mp_pizza = {
@@ -105,6 +115,25 @@ return {
105115
"{C:attention}#1#{} additional time",
106116
},
107117
},
118+
j_mp_cloud_9 = {
119+
name = "Cloud 9",
120+
text = {
121+
"Earn {C:money}$1{} for each {C:attention}9{} in deck",
122+
"(max {C:money}$4{}), then {C:money}$#1#{} for each",
123+
"additional {C:attention}9{} at end of round",
124+
"{C:inactive}(Currently {C:money}$#2#{}{C:inactive})",
125+
},
126+
},
127+
j_mp_bloodstone = {
128+
name = "Bloodstone",
129+
text = {
130+
"{C:green}#1# in #2#{} chance for",
131+
"played cards with",
132+
"{C:hearts}Heart{} suit to give",
133+
"{X:mult,C:white} X#3# {} Mult when scored",
134+
"{C:inactive}(Includes experimental variance){}",
135+
},
136+
},
108137
},
109138
Planet = {
110139
c_mp_asteroid = {
@@ -161,6 +190,7 @@ return {
161190
},
162191
challenge_names = {
163192
c_mp_standard = "Standard",
193+
c_mp_sandbox = "Sandbox",
164194
c_mp_badlatro = "Badlatro",
165195
c_mp_tournament = "Tournament",
166196
c_mp_weekly = "Weekly",
@@ -184,6 +214,7 @@ return {
184214
b_lobby_options = "LOBBY OPTIONS",
185215
b_copy_clipboard = "Copy to clipboard",
186216
b_view_code = "VIEW CODE",
217+
b_copy_code = "COPY CODE",
187218
b_leave = "LEAVE",
188219
b_opts_cb_money = "Give comeback $ on life loss",
189220
b_opts_no_gold_on_loss = "Don't get blind rewards on round loss",
@@ -208,6 +239,19 @@ return {
208239
b_view_nemesis_deck = "View Decks",
209240
b_toggle_jokers = "Toggle Jokers",
210241
b_skip_tutorial = "Skip Tutorial",
242+
k_yes = "Yes",
243+
k_no = "No",
244+
k_has_multiplayer_content = "Has Multiplayer Content",
245+
k_forces_lobby_options = "Forces Lobby Options",
246+
k_forces_gamemode = "Forces Gamemode",
247+
k_values_are_modifiable = "* Values are modifiable",
248+
k_rulesets = "Rulesets",
249+
k_gamemodes = "Gamemodes",
250+
k_competitive = "Competitive",
251+
k_other = "Other",
252+
k_battle = "Battle",
253+
k_challenge = "Challenge",
254+
k_info = "Info",
211255
k_continue_singleplayer_tooltip = "This will overwrite your current singleplayer run",
212256
k_enemy_score = "Current Enemy score",
213257
k_enemy_hands = "Enemy hands left: ",
@@ -234,7 +278,8 @@ return {
234278
k_warning_unlock_profile = "The profile you are playing on is not fully unlocked. If this is a ranked/tournament game, please create a new profile and hit unlock all in the profile settings",
235279
k_warning_nemesis_unlock = "Your opponent is playing on a profile that is not fully unlocked. Please instruct them to create a new profile and hit unlock all in the profile settings",
236280
k_warning_no_order = "One player has The Order integration enabled while the other does not. This will cause the seeds to differ.",
237-
k_warning_cheating = "If you are seeing this, your opponent may be cheating. If this is a ranked game, please send the message '%s' and then open a support ticket in #support",
281+
k_warning_cheating1 = "If you are seeing this, your opponent may be cheating.",
282+
k_warning_cheating2 = "If this is a ranked game, please send the message '%s' and then open a support ticket in #support",
238283
k_message1 = "Hold on, my mom made pizza pops",
239284
k_message2 = "One sec, i gotta grab my slow cooker pork roast",
240285
k_message3 = "One moment, getting a call from my mom",
@@ -252,40 +297,39 @@ return {
252297
k_opts_pvp_timer = "Timer",
253298
k_opts_showdown_starting_antes = "Showdown Starts at Ante",
254299
k_opts_pvp_timer_increment = "Timer Increment",
300+
k_opts_pvp_countdown_seconds = "PvP Countdown Seconds",
255301
k_bl_life = "Life",
256302
k_bl_or = "or",
257303
k_bl_death = "Death",
258304
k_bl_mostchips = "Most chips wins",
259305
k_current_seed = "Current seed: ",
260306
k_random = "Random",
307+
k_standard = "Standard",
308+
k_sandbox = "Steph's Sandbox",
309+
k_sandbox_description = "Like normal mode but someone gave the cards coffee and they're\nfeeling chatty.",
261310
k_vanilla = "Vanilla",
262-
k_vanilla_description = "The vanilla ruleset, no Multiplayer cards, no modifications to base game content. This ruleset includes Multiplayer features like the timer",
311+
k_vanilla_description = "This ruleset removes all Multiplayer content,\nallowing you to play the game as originally designed.\n\nThis ruleset still includes Multiplayer features like the timer.\n\n(Disableable in Lobby Options)",
263312
k_blitz = "Blitz",
264-
k_blitz_description = "The blitz ruleset, includes Multiplayer cards and changes to the base game to fit the Multiplayer meta. This ruleset includes cards and features that encourage fast play and using time as a resource.",
313+
k_blitz_description = "This ruleset includes cards and features that encourage fast play and\nusing time as a resource.\n\nSome cards are balanced in this ruleset to better fit the Multiplayer meta:\n- Hanging Chad is reworked\n- Justice is removed\n- Glass is reworked\n\n(See the bans and reworks tabs for more info)",
265314
k_traditional = "Traditional",
266-
k_traditional_description = "The traditional ruleset, includes Multiplayer cards and changes to the base game to fit the Multiplayer meta. This ruleset removes aspects of Multiplayer that use time as a resource, allowing you to play a more traditional and methodical game.",
315+
k_traditional_description = "This ruleset removes the aspects of Multiplayer that use time as a resource.\n\nThis ruleset allows you to play with the Multiplayer content,\nwhile still allowing for a methodical game.\n\nSome cards are balanced in this ruleset to better fit the Multiplayer meta:\n- Hanging Chad is reworked\n- Justice is removed\n- Glass is reworked\n\n(See the bans and reworks tabs for more info)",
267316
k_majorleague = "Major League",
268-
k_majorleague_description = "The major league ruleset, it follows the rules for Major League Balatro.",
317+
k_majorleague_description = "This is the official ruleset for Major League Balatro.\n\nThis ruleset is the same as the Vanilla ruleset with a few exceptions:\n- You must have The Order Integration disabled\n- The timer is set to 180 seconds\n- The first time the timer hits 0 seconds you will not lose a life",
269318
k_minorleague = "Minor League",
270-
k_minorleague_description = "The minor league ruleset, it follows the rules for Minor League Balatro.",
319+
k_minorleague_description = "This is the official ruleset for Minor League Balatro.\n\nThis ruleset is the same as the Vanilla ruleset with a few exceptions:\n- You must have The Order Integration enabled\n- The timer is set to 180 seconds\n- The first time the timer hits 0 seconds you will not lose a life",
271320
k_ranked = "Ranked",
272-
k_ranked_description = "The ranked ruleset, this ruleset is the same as Blitz right now, but also forces the correct gamemode, lobby options, and The Order integration.",
273-
k_weekly = "Weekly",
274-
k_weekly_description = "A special ruleset that changes weekly or bi-weekly. I guess you'll have to find out what it is! Currently: ",
275-
k_tournament = "Tournament",
276-
k_tournament_description = "The tournament ruleset, this is the same as the standard ruleset but doesn't allow changing the lobby options.",
321+
k_ranked_description = "This is the official ruleset for playing Ranked Balatro Multiplayer.\n\nThis ruleset is the same as the Blitz ruleset with a few exceptions:\n- You must have The Order Integration enabled\n- You must be on the recommended Steamodded version",
277322
k_badlatro = "Badlatro",
278-
k_badlatro_description = "A weekly ruleset designed by @dr_monty_the_snek on the discord server that has been added to the mod permanently.",
323+
k_badlatro_description = "A weekly ruleset designed by @dr_monty_the_snek on the discord server\nthat has been added to the mod permanently.\n\nThis ruleset bans 48 jokers, consumables, tags, etc.",
279324
k_attrition = "Attrition",
280-
k_attrition_description = "Every boss blind is a Nemesis blind. No time to prepare. This gamemode forces you to be battle-ready from the start.",
325+
k_attrition_description = "After the first ante, every boss blind is a Nemesis blind. No time to prepare. This gamemode forces you to be battle-ready from the start.",
281326
k_showdown = "Showdown",
282327
k_showdown_description = "After the first 2 antes, every blind is a Nemesis blind. This gamemode gives you time to prepare before battle.",
283328
k_survival = "Survival",
284329
k_survival_description = "The player who beats the farthest blind wins. No Nemesis blinds. This gamemode is a test of your ability to gradually build-up to the highest scoring Vanilla hands.",
285-
k_coop = "Co-op",
286-
k_coop_description = "The vanilla ruleset, but with no banned blinds.",
287-
k_coopSurvival = "Co-op Survival",
288-
k_coopSurvival_description = "Work together with your friends to beat the farthest blind possible. No Nemesis blinds. This gamemode is a test of your ability to gradually build-up to the highest scoring Vanilla hands.",
330+
k_weekly = "Weekly",
331+
k_weekly_description = "A special ruleset that changes weekly or bi-weekly. I guess you'll have to find out what it is! Currently: ",
332+
k_weekly_smallworld = "Small World",
289333
k_oops_ex = "Oops!",
290334
k_asteroids = "Asteroids",
291335
k_amount_short = "Amt.",
@@ -299,8 +343,11 @@ return {
299343
k_the_order_credit = "*Credit to @MathIsFun_",
300344
k_the_order_integration_desc = "This will patch card creation to not be ante-based and use a single pool for every type/rarity",
301345
k_requires_restart = "*Requires a restart to take effect",
346+
k_new_weekly_ruleset = "A new weekly ruleset is available!",
347+
k_currently_colon = "Currently: ",
348+
k_sync_locally = "Sync locally (Restarts game)",
302349
k_bans = "Bans",
303-
k_reworks = "Additions/Reworks",
350+
k_reworks = "Reworks",
304351
k_ruleset_disabled_the_order_required = "The Order is Required",
305352
k_ruleset_disabled_the_order_banned = "The Order is Banned",
306353
k_ruleset_not_found = "Unknown ruleset",
@@ -315,8 +362,7 @@ return {
315362
"you like it consider",
316363
},
317364
ml_lobby_info = { "Lobby", "Info" },
318-
loc_ready_pvp = "Ready for PvP",
319-
loc_ready_boss = "Ready for Boss",
365+
loc_ready = "Ready for PvP",
320366
loc_selecting = "Selecting a Blind",
321367
loc_shop = "Shopping",
322368
loc_playing = "Playing ",
@@ -330,10 +376,14 @@ return {
330376
a_mp_skips_tied = { "Tied" },
331377
k_banned_objs = "Banned #1#",
332378
k_no_banned_objs = "No Banned #1#",
333-
k_reworked_objs = "Added/Reworked #1#",
334-
k_no_reworked_objs = "No Added/Reworked #1#",
379+
k_reworked_objs = "Reworked #1#",
380+
k_no_reworked_objs = "No Reworked #1#",
335381
k_ruleset_disabled_smods_version = "SMODS Version #1# Required",
336382
k_failed_to_join_lobby = "Failed to join lobby: #1#",
383+
k_ante_number = "Ante #1#",
384+
k_ante_range = "Ante #1#-#2#", -- For example, "Ante 1-2"
385+
k_ante_min = "Ante #1#+", -- For example, "Ante 2+"
386+
k_credits_list = "#1# and many more!" -- #1# gets replaced with a list of names
337387
},
338388
v_text = {
339389
ch_c_hanging_chad_rework = { "{C:attention}Hanging Chad{} is {C:dark_edition}reworked" },

objects/consumables/judgement.lua

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
-- gotta redefine the logic
2+
MP.ReworkCenter({
3+
key = "c_judgement",
4+
ruleset = MP.UTILS.get_standard_rulesets(),
5+
silent = true,
6+
use = function(self, card, area, copier)
7+
local _card = copier or card
8+
G.E_MANAGER:add_event(Event({trigger = 'after', delay = 0.4, func = function()
9+
play_sound('timpani')
10+
if MP.INTEGRATIONS.TheOrder then -- this only matters if order exists
11+
local done = false
12+
while not done do -- AHHH we have to do so much boilerplate
13+
done = true
14+
15+
local card = { stickers = { eternal = false, perishable = false, rental = false } }
16+
local rarity = SMODS.poll_rarity("Joker", 'rarity0')
17+
local str_rarity = rarity
18+
if type(rarity) == 'number' then
19+
str_rarity = ({'Common', 'Uncommon', 'Rare', 'Legendary'})[rarity] -- kill me now
20+
end
21+
local _pool = get_current_pool('Joker', str_rarity, nil, '')
22+
local _pool_key = 'Joker'..rarity..'0'
23+
24+
center = pseudorandom_element(_pool, pseudoseed(_pool_key))
25+
local it = 1
26+
while center == 'UNAVAILABLE' do
27+
it = it + 1
28+
center = pseudorandom_element(_pool, pseudoseed(_pool_key))
29+
end
30+
31+
card.key = center
32+
33+
local eternal_perishable_poll = pseudorandom(center..'etperpoll0')
34+
local rental_poll = pseudorandom(center..'ssjr0')
35+
36+
if G.GAME.modifiers.enable_eternals_in_shop
37+
and eternal_perishable_poll > 0.7
38+
and G.P_CENTERS[center].eternal_compat then
39+
card.stickers.eternal = true
40+
done = false
41+
end
42+
43+
if G.GAME.modifiers.enable_perishables_in_shop
44+
and ((eternal_perishable_poll > 0.4) and (eternal_perishable_poll <= 0.7))
45+
and G.P_CENTERS[center].perishable_compat then
46+
card.stickers.perishable = true
47+
done = false
48+
end
49+
50+
if G.GAME.modifiers.enable_rentals_in_shop
51+
and rental_poll > 0.7 then
52+
card.stickers.rental = true
53+
done = false
54+
end
55+
56+
if done then
57+
table.insert(G.GAME.MP_joker_overrides, 1, card) -- start, so it gets created immediately
58+
else
59+
table.insert(G.GAME.MP_joker_overrides, card) -- end
60+
end
61+
end
62+
end
63+
64+
65+
G.MP_JUDGEMENT_OVERRIDE = true
66+
local joker = create_card('Joker', G.jokers, nil, nil, nil, nil, nil, 'jud') -- just call create card since override will kick in
67+
G.MP_JUDGEMENT_OVERRIDE = nil
68+
joker:add_to_deck()
69+
G.jokers:emplace(joker)
70+
_card:juice_up(0.3, 0.5)
71+
72+
return true
73+
end}))
74+
delay(0.6)
75+
end,
76+
})

objects/jokers/bloodstone.lua

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
-- this is kinda strange but we can just override the logic for pvp only rather than re-implementing it again, bc if we don't return anything, it'll run the normal logic
2+
MP.ReworkCenter({
3+
key = "j_bloodstone",
4+
ruleset = MP.UTILS.get_standard_rulesets(),
5+
silent = true,
6+
calculate = function(self, card, context)
7+
if MP.is_pvp_boss() then
8+
if not context.blueprint then
9+
if context.before then
10+
G.GAME.round_resets.mp_bloodstone = G.GAME.round_resets.mp_bloodstone or {}
11+
G.GAME.round_resets.mp_bloodstone[MP.order_round_based(true)] = G.GAME.round_resets.mp_bloodstone[MP.order_round_based(true)] or {}
12+
G.GAME.round_resets.mp_bsindex = 0
13+
end
14+
end
15+
if context.individual and context.cardarea == G.play then
16+
if context.other_card:is_suit("Hearts") then
17+
local stored_queue = G.GAME.round_resets.mp_bloodstone[MP.order_round_based(true)]
18+
G.GAME.round_resets.mp_bsindex = G.GAME.round_resets.mp_bsindex + 1 -- increment before indexing
19+
stored_queue[G.GAME.round_resets.mp_bsindex] = stored_queue[G.GAME.round_resets.mp_bsindex] or pseudorandom('bloodstone'..MP.order_round_based(true))
20+
if stored_queue[G.GAME.round_resets.mp_bsindex] < G.GAME.probabilities.normal/card.ability.extra.odds then
21+
return {
22+
x_mult = card.ability.extra.Xmult,
23+
card = card
24+
}
25+
end
26+
return nil, true -- prevents normal logic from triggering
27+
end
28+
end
29+
end
30+
end,
31+
})

0 commit comments

Comments
 (0)