Buff Maxie, Downshift Artificier, Nerf Hunter and Gourmand

This commit is contained in:
Emik 2026-06-09 15:56:36 +02:00
parent d3629c857e
commit f3381d1046
Signed by: emik
GPG key ID: 6B0CD72A5E503BDF
4 changed files with 149 additions and 89 deletions

View file

@ -11,11 +11,13 @@
"badge_colour": "3c3cff", "badge_colour": "3c3cff",
"priority": 114, "priority": 114,
"dependencies": [ "dependencies": [
"Steamodded (>=1.0.0~ALPHA-1304a)", "Steamodded (>=1.0.0~BETA-1606b)",
"Bakery (>=0.1.26~*)" "Lovely (>=0.6)",
"Bakery (>=3.2.0~*)",
"Roland (>=2.8.0~*)"
], ],
"conflicts": [ "conflicts": [
"Jen" "Jen"
], ],
"version": "1.7.10" "version": "1.7.11"
} }

View file

@ -152,7 +152,6 @@ back {
local rain_world_jokers = { local rain_world_jokers = {
"j_jane_monk", "j_jane_monk",
"j_jane_survivor", "j_jane_survivor",
"j_jane_artificer",
"j_jane_spearmaster", "j_jane_spearmaster",
"j_jane_rivulet", "j_jane_rivulet",
"j_jane_saint", "j_jane_saint",

View file

@ -293,14 +293,19 @@ SMODS.Joker {
}, },
} }
end, end,
calculate = function(_, card, context) calculate = function(self, card, context)
local _ = context.starting_shop and self:add_to_deck(card, false)
end,
add_to_deck = function(_, card, from_debuff)
if from_debuff then
return
end
local min = math.min(card.ability.extra.choices, maxie_limit) local min = math.min(card.ability.extra.choices, maxie_limit)
card.ability.extra.choices = min card.ability.extra.choices = min
if context.starting_shop then for _ = 1, min do
for _ = 1, min do SMODS.add_booster_to_shop()
SMODS.add_booster_to_shop()
end
end end
end, end,
} }
@ -630,7 +635,7 @@ SMODS.Joker {
name = "Betmma", name = "Betmma",
text = { text = {
operator_prefix .. "+" .. operator .. "#1#{C:mult} Mult{} for every", operator_prefix .. "+" .. operator .. "#1#{C:mult} Mult{} for every",
"{C:attention}unique Voucher redeemed", "{C:attention}" .. (Cryptid and "Unique " or "") .. "Voucher{} redeemed",
"{C:inactive}(Currently " .. operator_prefix .. operator .. "#2#{C:inactive})", "{C:inactive}(Currently " .. operator_prefix .. operator .. "#2#{C:inactive})",
}, },
}, },

View file

@ -125,9 +125,9 @@ SMODS.Joker {
name = "The Survivor", name = "The Survivor",
text = { text = {
"All cards held in hand", "All cards held in hand",
"{C:attention}contribute to scoring" .. (Cryptid and " {}and" or ""), "also {C:attention}score" .. (Cryptid and " {}and" or ""),
Cryptid and "are all considered as" or nil, Cryptid and "considered as the" or nil,
Cryptid and "the {C:attention}first played card" or nil, Cryptid and "{C:attention}first {}played card" or nil,
}, },
}, },
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
@ -144,11 +144,10 @@ SMODS.Joker {
loc_txt = { loc_txt = {
name = "The Hunter", name = "The Hunter",
text = { text = {
"{C:blue}Provides infinite hands", "{E:1}Succumbs to the",
"{C:red,s,E:1}Succumbs to the Rot {}and creates", "{X:black,C:white,E:1}Rot{}, creating",
(Cryptid and "an {C:spectral}Empowered Tag" or "a {C:dark_edition}Negative {C:spectral}Soul") .. " {}after #1#", (Cryptid and "an {C:spectral}Empowered Tag" or "a {C:dark_edition}Negative {C:spectral}Soul"),
"When {C:attention}sold#2#{}, turns#3#", "after #1#",
"#4#{C:red}The Rot{} without rewards",
}, },
}, },
config = {extra = {rounds_left = hunter[1]}}, config = {extra = {rounds_left = hunter[1]}},
@ -164,6 +163,7 @@ SMODS.Joker {
return " round" .. ((math.abs(amount) > 1 or math.abs(amount) == 0) and "s" or "") return " round" .. ((math.abs(amount) > 1 or math.abs(amount) == 0) and "s" or "")
end end
info_queue[#info_queue + 1] = G.P_CENTERS.j_jane_rot
info_queue[#info_queue + 1] = Cryptid and G.P_CENTERS.c_cry_empowered or G.P_CENTERS.c_soul info_queue[#info_queue + 1] = Cryptid and G.P_CENTERS.c_cry_empowered or G.P_CENTERS.c_soul
local rounds_left = card.ability.extra.rounds_left local rounds_left = card.ability.extra.rounds_left
local sold = rounds_left - hunter[5] local sold = rounds_left - hunter[5]
@ -218,72 +218,51 @@ SMODS.Joker {
spawn_rot() spawn_rot()
end end
if context.blueprint then if context.blueprint or
context.individual or
context.repetition or
context.retrigger_joker or
not context.end_of_round then
return return
end end
if context.selling_self and card.ability.extra.rounds_left <= hunter[5] then card.ability.extra.rounds_left = card.ability.extra.rounds_left - 1
spawn_rot() local rl = card.ability.extra.rounds_left
elseif not context.individual and not context.repetition and not context.retrigger_joker then Jane.card_status_text(card, tostring(card.ability.extra.rounds_left), nil, nil, G.C.RED, nil, nil, nil, nil,
if G.GAME.round_resets.hands <= 0 then nil, "generic1")
G.GAME.round_resets.hands = 1
if rl > hunter[2] then
card:juice_up(0.6, 0.1)
elseif rl > hunter[3] then
if rl == hunter[2] then
Jane.play_sound("jane_gore1")
end end
if not card.hunter_prep then card:juice_up(0.6, 0.1)
card.hunter_prep = true elseif rl > hunter[4] then
if rl == hunter[3] then
Jane.q(function() Jane.play_sound("jane_gore3")
card.hunter_prep = nil
if G.GAME.current_round.hands_left < G.GAME.round_resets.hands then
ease_hands_played(G.GAME.round_resets.hands - G.GAME.current_round.hands_left)
end
end)
end end
if not context.end_of_round then card:juice_up(0.6, 0.1)
return elseif rl > hunter[5] then
if rl == hunter[4] then
Jane.play_sound("jane_gore8")
end end
card.hunter_prep = nil card:juice_up(0.6, 0.1)
card.ability.extra.rounds_left = card.ability.extra.rounds_left - 1 Jane.play_sound("jane_warning_heartbeat")
local rl = card.ability.extra.rounds_left elseif rl > 0 then
Jane.card_status_text(card, tostring(card.ability.extra.rounds_left), nil, nil, G.C.RED, nil, nil, nil, nil, if rl == hunter[5] then
nil, "generic1") Jane.play_sound("jane_gore4")
if rl > hunter[2] then
card:juice_up(0.6, 0.1)
elseif rl > hunter[3] then
if rl == hunter[2] then
Jane.play_sound("jane_gore1")
end
card:juice_up(0.6, 0.1)
elseif rl > hunter[4] then
if rl == hunter[3] then
Jane.play_sound("jane_gore3")
end
card:juice_up(0.6, 0.1)
elseif rl > hunter[5] then
if rl == hunter[4] then
Jane.play_sound("jane_gore8")
end
card:juice_up(0.6, 0.1)
Jane.play_sound("jane_warning_heartbeat")
elseif rl > 0 then
if rl == hunter[5] then
Jane.play_sound("jane_gore4")
end
card:juice_up(1.8, 0.3)
Jane.play_sound("jane_warning_heartbeat")
else
card:juice_up(2, 0.8)
Jane.play_sound("jane_warning_heartbeat")
Jane.q(die, 0)
end end
card:juice_up(1.8, 0.3)
Jane.play_sound("jane_warning_heartbeat")
else
card:juice_up(2, 0.8)
Jane.play_sound("jane_warning_heartbeat")
Jane.q(die, 0)
end end
end, end,
} }
@ -295,15 +274,15 @@ SMODS.Joker {
name = "The Gourmand", name = "The Gourmand",
text = { text = {
"Values on {C:attention}consumables", "Values on {C:attention}consumables",
"are {C:attention}multiplied{} by {C:attention}#1#", "are {C:attention}" .. (Cryptid and "multiplied" or "added") .. "{} by {C:attention}#1#" .. (Cryptid and "" or "{} when"),
"when they are created", (Cryptid and "when " or "") .. "they are created",
"{C:inactive}(If possible)", "{C:inactive}(If possible)",
}, },
}, },
loc_vars = function(_, _, center) loc_vars = function(_, _, center)
return {vars = {center.ability.modifier}} return {vars = {center.ability.modifier}}
end, end,
config = {modifier = 2}, config = {modifier = Cryptid and 2 or 1},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
blueprint_compat = false, blueprint_compat = false,
@ -311,6 +290,51 @@ SMODS.Joker {
rarity = 3, rarity = 3,
} }
local function add_to_consumable_ability_by(n)
local f = SMODS.Mods.Roland.qol[1]
local function new(v)
return type(v) == "number" and v + n or type(v) == "table" and f(v):map(new):table() or v
end
---@param card Card
return function(card)
local ability = card.ability or {}
local function go(key)
---@type { [string]: number }|number
local value = ability[key]
--print(key)
if not value then
return
end
if type(value) == "number" then
ability[key] = value + n
return
end
if type(value) ~= "table" then
return
end
local new_value = f(value):map(new):table()
f(new_value):each(function(v, k)
ability[k] = v
end)
ability[key] = new_value
end
local center_key = (card.config or {}).center_key
if center_key and center_key:sub(1, 2) == "c_" then
f {"extra", "consumeable"}:each(go)
end
end
end
local orig_set_ability = Card.set_ability local orig_set_ability = Card.set_ability
---@diagnostic disable-next-line: duplicate-set-field ---@diagnostic disable-next-line: duplicate-set-field
@ -321,13 +345,23 @@ function Card:set_ability(center, initial, delay_sprites)
self.gc and self.gc and
self:gc().key ~= "c_base" and self:gc().key ~= "c_base" and
string.sub(self:gc().key, 1, 2) == "c_" then string.sub(self:gc().key, 1, 2) == "c_" then
local mod = 1 if Cryptid then
local mod = 1
for _, v in pairs(SMODS.find_card("j_jane_gourmand")) do for _, v in pairs(SMODS.find_card("j_jane_gourmand")) do
mod = mod * v.ability.modifier mod = mod * v.ability.modifier
end
Jane.misprintize(self, {min = mod, max = mod}, nil, true)
else
local mod = 0
for _, v in pairs(SMODS.find_card("j_jane_gourmand")) do
mod = mod + v.ability.modifier
end
add_to_consumable_ability_by(mod)(self)
end end
Jane.misprintize(self, {min = mod, max = mod}, nil, true)
end end
end end
@ -337,20 +371,27 @@ SMODS.Joker {
loc_txt = { loc_txt = {
name = "The Artificer", name = "The Artificer",
text = { text = {
"Grants the {C:green}ability{} to {C:red}destroy", "Use to {C:red}destroy",
"selected {C:attention}playing cards", "selected {C:attention}playing cards",
not Cryptid and "{C:red,E:1}Self-destructs" or nil,
not Cryptid and "after {C:attention}#1# #2#" or nil,
}, },
}, },
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
config = {extra = {uses = 2}},
blueprint_compat = false, blueprint_compat = false,
cost = Cryptid and 50 or 20, cost = Cryptid and 50 or 20,
rarity = exotic, rarity = Cryptid and exotic or 3,
loc_vars = function(_, _, card)
local uses = card.ability.extra.uses
return {vars = {uses, uses == 1 and "use" or "uses"}}
end,
Bakery_use_button_text = function(_, _) return "DESTROY" end, Bakery_use_button_text = function(_, _) return "DESTROY" end,
Bakery_can_use = function(_, card) Bakery_can_use = function(_, card)
return not card.debuff and Jane.can_use() and next(G.hand.highlighted) return not card.debuff and Jane.can_use() and next(G.hand.highlighted)
end, end,
Bakery_use_joker = function(_, _) Bakery_use_joker = function(_, card)
for _, v in pairs(SMODS.find_card("j_jane_oxy")) do for _, v in pairs(SMODS.find_card("j_jane_oxy")) do
Jane.oxy(v, G.hand.highlighted) Jane.oxy(v, G.hand.highlighted)
end end
@ -358,6 +399,17 @@ SMODS.Joker {
for _, v in pairs(G.hand.highlighted) do for _, v in pairs(G.hand.highlighted) do
v:start_dissolve() v:start_dissolve()
end end
if Cryptid then
return
end
card.ability.extra.uses = card.ability.extra.uses - 1
local _ = card.ability.extra.uses <= 0 and card:start_dissolve()
local _ = card.ability.extra.uses == 1 and juice_card_until(card, function()
return card.area == G.jokers
end, true)
end, end,
} }
@ -369,9 +421,11 @@ SMODS.Joker {
loc_txt = { loc_txt = {
name = "The Spearmaster", name = "The Spearmaster",
text = { text = {
"You can choose {C:attention}any number of cards", "You can choose {C:attention}any",
"after opening {C:attention}any Booster Pack", "number of cards",
"{C:attention}Booster Packs{} have {C:green}+#1#{} additional cards", "in {C:attention}Booster Packs",
"{C:attention}Booster Packs{} have",
"{C:green}+#1#{} additional cards",
}, },
}, },
config = {extra = {choices = 1}}, config = {extra = {choices = 1}},
@ -462,7 +516,7 @@ SMODS.Joker {
name = "The Rivulet", name = "The Rivulet",
text = { text = {
"Non-{C:dark_edition}editioned{} cards are", "Non-{C:dark_edition}editioned{} cards are",
"{C:attention}given a random {C:dark_edition}Edition", "given a random {C:dark_edition}Edition",
}, },
}, },
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},