Add new deck, adjust unlock requirements

This commit is contained in:
Emik 2026-07-05 23:43:13 +02:00
parent fdd4bb8e16
commit 4b76d018c0
Signed by: emik
GPG key ID: 6B0CD72A5E503BDF
20 changed files with 118 additions and 11 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -20,6 +20,17 @@ return {
"{C:Bakery_credit_fg_Roland_bakersdozenbagels,s:0.75}Art: BakersDozenBagels", "{C:Bakery_credit_fg_Roland_bakersdozenbagels,s:0.75}Art: BakersDozenBagels",
}, },
}, },
b_Roland_wish = {
name = "Wish Deck",
text = {
"Redeem a random {C:attention}Voucher",
"after {C:attention}Small {}and {C:attention}Big Blinds",
"{C:attention}Vouchers {}no longer",
"appear in the shop",
--"",
--"{C:Bakery_credit_fg_Roland_bakersdozenbagels,s:0.75}Art: BakersDozenBagels",
},
},
}, },
BakeryCharm = { BakeryCharm = {
BakeryCharm_Roland_cocacola = { BakeryCharm_Roland_cocacola = {
@ -442,6 +453,27 @@ return {
"{C:Bakery_credit_fg_Roland_bakersdozenbagels,s:0.75}Art: BakersDozenBagels", "{C:Bakery_credit_fg_Roland_bakersdozenbagels,s:0.75}Art: BakersDozenBagels",
}, },
}, },
sleeve_Roland_wish = {
name = "Wish Sleeve",
text = {
"A random {C:attention}voucher{} is",
"{C:attention}redeemed {}at the end",
"of {C:attention}Small {}and {C:attention}Big Blinds",
"{C:attention}Vouchers {}no longer",
"appear in the shop",
--"",
--"{C:Bakery_credit_fg_Roland_bakersdozenbagels,s:0.75}Art: BakersDozenBagels",
},
},
sleeve_Roland_wish_alt = {
name = "Miracle Sleeve",
text = {
"All {C:attention}vouchers",
"start {C:attention}redeemed",
--"",
--"{C:Bakery_credit_fg_Roland_bakersdozenbagels,s:0.75}Art: BakersDozenBagels",
},
},
}, },
Spectral = { Spectral = {
c_Roland_afterimage = { c_Roland_afterimage = {

View file

@ -3,7 +3,7 @@
"id": "Roland", "id": "Roland",
"name": "Roland", "name": "Roland",
"prefix": "Roland", "prefix": "Roland",
"version": "2.9.34", "version": "2.9.35",
"badge_colour": "8BE9FD", "badge_colour": "8BE9FD",
"display_name": "Roland", "display_name": "Roland",
"main_file": "src/main.lua", "main_file": "src/main.lua",

View file

@ -8,7 +8,7 @@ end
local back = (function() local back = (function()
local x = 0 local x = 0
---@param tbl SMODS.Back|{is_alt: (fun(self: self): boolean), alt_apply?: fun(self: SMODS.Back|table, back: Back|table), alt_calculate?: fun(self: SMODS.Back|table, back: Back|table, context: CalcContext|table): table?, boolean?} ---@param tbl SMODS.Back|{attributes?: Attributes[], is_alt: (fun(self: self): boolean), alt_apply?: fun(self: SMODS.Back|table, back: Back|table), alt_calculate?: fun(self: SMODS.Back|table, back: Back|table, context: CalcContext|table): table?, boolean?}
return function(tbl) return function(tbl)
local key = tbl.key local key = tbl.key
local apply = tbl.apply local apply = tbl.apply
@ -71,7 +71,7 @@ back {
key = "blossom", key = "blossom",
pronouns = "any_all", pronouns = "any_all",
config = {extra = {alt_times = 4, times = 2}}, config = {extra = {alt_times = 4, times = 2}},
attributes = {"boss_blind"}, attributes = {"passive", "boss_blind"},
loc_vars = function(self, _, _) loc_vars = function(self, _, _)
return {vars = {self.config.extra.alt_times}} return {vars = {self.config.extra.alt_times}}
end, end,
@ -79,13 +79,15 @@ back {
G.GAME.modifiers.Roland_blossom_deck = true G.GAME.modifiers.Roland_blossom_deck = true
end, end,
calculate = function(self, card, context) calculate = function(self, card, context)
if not context.setting_blind then if not context.forcetrigger and not context.setting_blind then
return return
end end
local blinds = G.GAME.round_resets.blind_states local blinds = G.GAME.round_resets.blind_states
if blinds.Small ~= "Current" and blinds.Big ~= "Current" then if not context.forcetrigger and
blinds.Small ~= "Current" and
blinds.Big ~= "Current" then
return return
end end
@ -112,7 +114,7 @@ back {
back { back {
key = "swapper", key = "swapper",
pronouns = "he_him", pronouns = "he_him",
attributes = {"spectral", "tarot"}, attributes = {"passive", "spectral", "tarot"},
apply = function(self) apply = function(self)
local modifiers = G.GAME.modifiers local modifiers = G.GAME.modifiers
modifiers.Roland_swapper_deck = true modifiers.Roland_swapper_deck = true
@ -140,3 +142,66 @@ function create_card(_type, ...)
local has_type = SMODS.ConsumableTypes[_type] local has_type = SMODS.ConsumableTypes[_type]
return orig_create_card(has_type and pseudorandom_element(type, pseudoseed "Roland_alt_swapper_deck") or _type, ...) return orig_create_card(has_type and pseudorandom_element(type, pseudoseed "Roland_alt_swapper_deck") or _type, ...)
end end
local function redeem(key, fast)
if fast then
G.GAME.used_vouchers[key] = true
end
q {
delay = 1,
func = function()
local voucher = SMODS.create_card {key = key, set = "Voucher"}
voucher.T.y = (fast and pseudorandom(pseudoseed "Roland_wish_deck") + 0.5 or 1) * 4.25
voucher.T.x = (fast and pseudorandom(pseudoseed "Roland_wish_deck") + 0.5 or 1) * 9
voucher.cost = 0
voucher:start_materialize()
q {
delay = 1,
front = true,
func = function()
if fast then
play_sound "card1"
voucher:apply_to_run()
voucher:juice_up(0.3, 0.5)
else
voucher:redeem()
end
q {
delay = 1,
func = function()
voucher:start_dissolve()
end,
}
end,
}
end,
}
end
back {
key = "wish",
pronouns = "he_him",
attributes = {"passive", "generation"},
apply = function(self)
G.GAME.modifiers.Roland_no_voucher = true
local _ = self:is_alt() and f(G.P_CENTER_POOLS.Voucher):map "key":each(redeem)
end,
calculate = function(_, _, context)
local _ = (context.forcetrigger or
context.blind_defeated and
not context.repetition and
not G.GAME.blind.boss) and
redeem(get_next_voucher_key())
end,
}
local orig_add_voucher_to_shop = SMODS.add_voucher_to_shop
function SMODS.add_voucher_to_shop(...)
if not G.GAME.modifiers.Roland_no_voucher then
return orig_add_voucher_to_shop(...)
end
end

View file

@ -116,6 +116,9 @@ SMODS.Challenge {
jokers = {{id = "j_Roland_amber"}}, jokers = {{id = "j_Roland_amber"}},
restrictions = amber, restrictions = amber,
pronouns = "they_them", pronouns = "they_them",
unlocked = function()
return G.P_CENTERS.j_Roland_amber and G.P_CENTERS.j_Roland_amber.check_for_unlock()
end,
calculate = function(_, context) calculate = function(_, context)
local function slide(pitch) local function slide(pitch)
q(function() q(function()
@ -155,6 +158,9 @@ SMODS.Challenge {
jokers = {{id = "j_Roland_cerulean"}}, jokers = {{id = "j_Roland_cerulean"}},
restrictions = cerulean, restrictions = cerulean,
pronouns = "she_her", pronouns = "she_her",
unlocked = function()
return G.P_CENTERS.j_Roland_cerulean and G.P_CENTERS.j_Roland_cerulean.check_for_unlock()
end,
calculate = function(_, context) calculate = function(_, context)
if not context.hand_drawn then if not context.hand_drawn then
return return
@ -182,6 +188,9 @@ SMODS.Challenge {
jokers = {{id = "j_Roland_crimson"}}, jokers = {{id = "j_Roland_crimson"}},
restrictions = crimson, restrictions = crimson,
pronouns = "she_her", pronouns = "she_her",
unlocked = function()
return G.P_CENTERS.j_Roland_crimson and G.P_CENTERS.j_Roland_crimson.check_for_unlock()
end,
calculate = function(_, context) calculate = function(_, context)
local _ = context.blind_defeated and f(G.jokers.cards):each(function(v) local _ = context.blind_defeated and f(G.jokers.cards):each(function(v)
v.ability.Roland_crimson_heart_chosen = nil v.ability.Roland_crimson_heart_chosen = nil
@ -242,6 +251,9 @@ SMODS.Challenge {
jokers = {{id = "j_Roland_verdant"}}, jokers = {{id = "j_Roland_verdant"}},
restrictions = verdant, restrictions = verdant,
pronouns = "she_her", pronouns = "she_her",
unlocked = function()
return G.P_CENTERS.j_Roland_verdant and G.P_CENTERS.j_Roland_verdant.check_for_unlock()
end,
calculate = function(_, context) calculate = function(_, context)
if context.setting_blind then if context.setting_blind then
G.GAME.modifiers.Roland_Eternally_Verdant = true G.GAME.modifiers.Roland_Eternally_Verdant = true
@ -265,6 +277,9 @@ SMODS.Challenge {
jokers = {{id = "j_joker"}, {id = "j_Roland_violet"}}, jokers = {{id = "j_joker"}, {id = "j_Roland_violet"}},
restrictions = violet, restrictions = violet,
pronouns = "she_they", pronouns = "she_they",
unlocked = function()
return G.P_CENTERS.j_Roland_violet and G.P_CENTERS.j_Roland_violet.check_for_unlock()
end,
calculate = function(_, context) calculate = function(_, context)
if not context.setting_blind then if not context.setting_blind then
return return

View file

@ -1202,11 +1202,6 @@ joker {
eternal_compat = true, eternal_compat = true,
blueprint_compat = false, blueprint_compat = false,
perishable_compat = true, perishable_compat = true,
check_for_unlock = function(_, args)
return args.type == "modify_deck" and f(G.playing_cards):all(function(v)
return SMODS.has_enhancement(v, "m_stone")
end)
end,
loc_vars = function(_, info_queue, card) loc_vars = function(_, info_queue, card)
local extra = card.ability.extra local extra = card.ability.extra
local _ = card.fake_card or table.insert(info_queue, G.P_CENTERS.m_stone) local _ = card.fake_card or table.insert(info_queue, G.P_CENTERS.m_stone)