Compare commits

...

3 commits
2.2.9 ... main

Author SHA1 Message Date
918ebbc30b
Shorten text 2026-04-27 16:59:01 +02:00
8bcd0e074d
Add Invisible Tag 2026-04-27 16:55:58 +02:00
f23dad31cc
Add attributes, buff fat phone, buff temple 2026-04-26 20:38:32 +02:00
21 changed files with 96 additions and 21 deletions

BIN
assets/1x/tag.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 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: 79 KiB

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 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: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

BIN
assets/2x/tag.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 611 B

View file

@ -29,7 +29,7 @@ return {
BakeryCharm_Roland_fat = { BakeryCharm_Roland_fat = {
name = "fat i phone", name = "fat i phone",
text = { text = {
-- "{C:attention}+#1# Booster Pack {}slots", "{C:attention}+#1# Booster Pack {}slots",
"All {C:attention}Booster Packs {}are {C:attention}Mega", "All {C:attention}Booster Packs {}are {C:attention}Mega",
"{C:inactive}(Whenever applicable)", "{C:inactive}(Whenever applicable)",
}, },
@ -381,6 +381,12 @@ return {
}, },
}, },
}, },
Tag = {
tag_Roland_invisible = {
name = "Invisible Tag",
text = {"{C:attention}Duplicate {}a random Joker", "{C:inactive}(Must have room)"},
},
},
}, },
misc = { misc = {
challenge_names = { challenge_names = {

View file

@ -6,7 +6,7 @@
"author": [ "author": [
"Emik" "Emik"
], ],
"version": "2.2.9", "version": "2.2.12",
"badge_colour": "8BE9FD", "badge_colour": "8BE9FD",
"main_file": "src/main.lua", "main_file": "src/main.lua",
"badge_text_colour": "44475A", "badge_text_colour": "44475A",

View file

@ -74,6 +74,7 @@ back {
key = "blossom", key = "blossom",
pronouns = "any_all", pronouns = "any_all",
config = {extra = {times = 2}}, config = {extra = {times = 2}},
attributes = {"boss_blind"},
loc_vars = function(self, _, _) loc_vars = function(self, _, _)
return {vars = {self.config.extra.times, self.config.extra.alt_times}} return {vars = {self.config.extra.times, self.config.extra.alt_times}}
end, end,
@ -113,12 +114,13 @@ back {
back { back {
key = "swapper", key = "swapper",
pronouns = "he_him", pronouns = "he_him",
attributes = {"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
modifiers.Roland_alt_swapper_deck = modifiers.Roland_alt_swapper_deck or self:is_alt() modifiers.Roland_alt_swapper_deck = modifiers.Roland_alt_swapper_deck or self:is_alt()
end, end,
calculate = function() end, calculate = f().noop,
} }
local swapper = {Spectral = "Tarot", Tarot = "Spectral"} local swapper = {Spectral = "Tarot", Tarot = "Spectral"}

View file

@ -79,6 +79,7 @@ end
charm { charm {
key = "wii", key = "wii",
pronouns = "they_them", pronouns = "they_them",
attributes = {"skip"},
calculate = function(_, card, context) calculate = function(_, card, context)
if not context.skip_blind then if not context.skip_blind then
return return
@ -116,16 +117,17 @@ end
charm { charm {
key = "fat", key = "fat",
pronouns = "he_they", pronouns = "he_they",
-- config = {extra = {mod = 1}}, attributes = {"passive"},
-- loc_vars = function(_, _, card) config = {extra = {mod = 1}},
-- return {vars = {card.ability.extra.mod}} loc_vars = function(_, _, card)
-- end, return {vars = {card.ability.extra.mod}}
-- equip = function(_, card) end,
-- SMODS.change_booster_limit(card.ability.extra.mod) equip = function(_, card)
-- end, SMODS.change_booster_limit(card.ability.extra.mod)
-- unequip = function(card) end,
-- SMODS.change_booster_limit(-card.ability.extra.mod) unequip = function(card)
-- end, SMODS.change_booster_limit(-card.ability.extra.mod)
end,
} }
local orig_init = Card.init local orig_init = Card.init
@ -160,6 +162,7 @@ end
charm { charm {
key = "cocacola", key = "cocacola",
pronouns = "he_they", pronouns = "he_they",
attributes = {"passive", "tarot", "spectral"},
equip = function() equip = function()
f(G.consumeables.cards):each(add_to_consumable_ability_by(1)) f(G.consumeables.cards):each(add_to_consumable_ability_by(1))
end, end,
@ -184,6 +187,7 @@ charm {
key = "hand", key = "hand",
pronouns = "he_him", pronouns = "he_him",
config = {extra = {hands = -2, hand_size = 5}}, config = {extra = {hands = -2, hand_size = 5}},
attributes = {"hands", "hand_size", "passive"},
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
local extra = card.ability.extra local extra = card.ability.extra
return {vars = {extra.hand_size, extra.hands}} return {vars = {extra.hand_size, extra.hands}}

View file

@ -80,6 +80,7 @@ SMODS.Edition {
key = "frozen", key = "frozen",
shader = "frozen", shader = "frozen",
sound = {sound = "Roland_frozen", per = 1, vol = 0.8}, sound = {sound = "Roland_frozen", per = 1, vol = 0.8},
attributes = {"passive", "scaling"},
weight = 8, weight = 8,
extra_cost = 4, extra_cost = 4,
in_shop = true, in_shop = true,

View file

@ -12,7 +12,7 @@ local joker = (function()
return ret return ret
end end
---@param tbl SMODS.Joker|{artist?: string, sinis?: boolean|{x: number, y: number}, soul_pos?: boolean|{x: number, y: number}} ---@param tbl SMODS.Joker|{artist?: string, sinis?: boolean|{x: number, y: number}, soul_pos?: boolean|{x: number, y: number}, attributes?: Attributes[]}
return function(tbl) return function(tbl)
tbl.pos = inc() tbl.pos = inc()
tbl.atlas = "joker" tbl.atlas = "joker"
@ -104,6 +104,7 @@ joker {
key = "escapey", key = "escapey",
pronouns = "they_them", pronouns = "they_them",
config = {extra = {hands = 2}}, config = {extra = {hands = 2}},
attributes = {"destroy_card", "tarot", "planet", "spectral", "tag"},
cost = 4, cost = 4,
rarity = 2, rarity = 2,
sinis = true, sinis = true,
@ -247,6 +248,7 @@ joker {
blueprint_compat = true, blueprint_compat = true,
perishable_compat = true, perishable_compat = true,
config = {extra = {chips = 30}}, config = {extra = {chips = 30}},
attributes = {"chips"},
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
return {vars = {card.ability.extra.chips}} return {vars = {card.ability.extra.chips}}
end, end,
@ -261,6 +263,7 @@ joker {
pronouns = "she_her", pronouns = "she_her",
artist = "char", artist = "char",
config = {extra = {xmult = 4, requirement = 4}}, config = {extra = {xmult = 4, requirement = 4}},
attributes = {"xmult"},
cost = G.P_CENTERS.j_mr_bones.cost - 1, cost = G.P_CENTERS.j_mr_bones.cost - 1,
rarity = 2, rarity = 2,
eternal_compat = false, eternal_compat = false,
@ -295,6 +298,7 @@ joker {
key = "phytoestrogens", key = "phytoestrogens",
pronouns = "she_her", pronouns = "she_her",
config = {extra = {xmult = 0.25}}, config = {extra = {xmult = 0.25}},
attributes = {"mult", "xmult"},
cost = 8, cost = 8,
rarity = 3, rarity = 3,
eternal_compat = true, eternal_compat = true,
@ -318,6 +322,7 @@ joker {
pronouns = "it_its", pronouns = "it_its",
artist = "char", artist = "char",
config = {extra = {price = 4, hand_name = "Four of a Kind"}}, config = {extra = {price = 4, hand_name = "Four of a Kind"}},
attributes = {"sell_value", "scaling", "economy", "hand_type"},
cost = 4, cost = 4,
rarity = 1, rarity = 1,
eternal_compat = true, eternal_compat = true,
@ -346,6 +351,7 @@ joker {
pronouns = "it_its", pronouns = "it_its",
artist = "char", artist = "char",
config = {extra = {mult_gain = 4, hand_name = "Four of a Kind", mult = 0}}, config = {extra = {mult_gain = 4, hand_name = "Four of a Kind", mult = 0}},
attributes = {"mult", "scaling", "hand_type"},
cost = 4, cost = 4,
rarity = 2, rarity = 2,
eternal_compat = true, eternal_compat = true,
@ -376,6 +382,7 @@ joker {
pronouns = "it_its", pronouns = "it_its",
artist = "char", artist = "char",
config = {extra = {times = 4, hand_name = "Four of a Kind"}}, config = {extra = {times = 4, hand_name = "Four of a Kind"}},
attributes = {"generation", "hand_type"},
cost = 8, cost = 8,
rarity = 3, rarity = 3,
eternal_compat = false, eternal_compat = false,
@ -429,6 +436,7 @@ joker {
key = "sunny", key = "sunny",
pronouns = "they_them", pronouns = "they_them",
artist = "char", artist = "char",
attributes = {"food", "on_sell"},
cost = 2, cost = 2,
rarity = 1, rarity = 1,
eternal_compat = false, eternal_compat = false,
@ -488,6 +496,7 @@ joker {
joker { joker {
key = "hardboiled", key = "hardboiled",
pronouns = "they_them", pronouns = "they_them",
attributes = {"food", "editions", "modify_card", "on_sell"},
cost = 5, cost = 5,
rarity = 2, rarity = 2,
eternal_compat = false, eternal_compat = false,
@ -511,6 +520,7 @@ joker {
joker { joker {
key = "basket", key = "basket",
pronouns = "they_them", pronouns = "they_them",
attributes = {"food", "generation", "on_sell"},
cost = 8, cost = 8,
rarity = 3, rarity = 3,
eternal_compat = false, eternal_compat = false,
@ -536,6 +546,7 @@ joker {
key = "sapling", key = "sapling",
pronouns = "they_them", pronouns = "they_them",
artist = "char", artist = "char",
attributes = {"mult", "suit"},
cost = 4, cost = 4,
rarity = 1, rarity = 1,
config = {extra = {mult = 15, suits = 3}}, config = {extra = {mult = 15, suits = 3}},
@ -569,6 +580,7 @@ joker {
key = "yard", key = "yard",
pronouns = "he_him", pronouns = "he_him",
config = {extra = {money = 2}}, config = {extra = {money = 2}},
attributes = {"economy"},
cost = 4, cost = 4,
rarity = 1, rarity = 1,
eternal_compat = true, eternal_compat = true,
@ -586,6 +598,7 @@ joker {
joker { joker {
key = "suitable", key = "suitable",
pronouns = "she_they", pronouns = "she_they",
attributes = {"suit", "passive", "hearts", "diamonds", "spades", "clubs"},
cost = 4, cost = 4,
rarity = 2, rarity = 2,
eternal_compat = true, eternal_compat = true,
@ -638,6 +651,7 @@ joker {
key = "misfortune", key = "misfortune",
pronouns = "she_they", pronouns = "she_they",
artist = "char", artist = "char",
attributes = {"discard", "generation", "seals"},
cost = 6, cost = 6,
rarity = 2, rarity = 2,
eternal_compat = true, eternal_compat = true,
@ -657,7 +671,8 @@ joker {
joker { joker {
key = "temple", key = "temple",
pronouns = "any_all", pronouns = "any_all",
config = {extra = {xmult = 1.5}}, config = {extra = {xmult = 2}},
attributes = {"xmult", "enhancements"},
cost = 6, cost = 6,
rarity = 2, rarity = 2,
eternal_compat = true, eternal_compat = true,
@ -684,6 +699,7 @@ joker {
key = "jokersr", key = "jokersr",
pronouns = "he_him", pronouns = "he_him",
config = {extra = {xmult = 1.25}}, config = {extra = {xmult = 1.25}},
attributes = {"xmult"},
cost = 2, cost = 2,
rarity = 2, rarity = 2,
eternal_compat = true, eternal_compat = true,
@ -701,6 +717,7 @@ joker {
joker { joker {
key = "bulldozer", key = "bulldozer",
pronouns = "it_its", pronouns = "it_its",
attributes = {"xmult"},
cost = 6, cost = 6,
rarity = 2, rarity = 2,
eternal_compat = true, eternal_compat = true,
@ -739,6 +756,7 @@ joker {
key = "martingale", key = "martingale",
pronouns = "he_him", pronouns = "he_him",
config = {extra = {odds = 2}}, config = {extra = {odds = 2}},
attributes = {"xmult", "chance"},
cost = 8, cost = 8,
rarity = 2, rarity = 2,
eternal_compat = true, eternal_compat = true,
@ -787,6 +805,7 @@ joker {
cost = 7, cost = 7,
rarity = 3, rarity = 3,
config = {extra = {probability = 1, probability_mult = 2, reset = 1}}, config = {extra = {probability = 1, probability_mult = 2, reset = 1}},
attributes = {"hands", "mod_chance", "scaling"},
eternal_compat = true, eternal_compat = true,
blueprint_compat = false, blueprint_compat = false,
perishable_compat = true, perishable_compat = true,
@ -821,6 +840,7 @@ joker {
key = "nilly", key = "nilly",
pronouns = "any_all", pronouns = "any_all",
config = {extra = {flipped = false}}, config = {extra = {flipped = false}},
attributes = {"xmult"},
cost = 0, cost = 0,
rarity = 3, rarity = 3,
eternal_compat = true, eternal_compat = true,
@ -867,6 +887,7 @@ joker {
cost = 10, cost = 10,
rarity = 3, rarity = 3,
config = {extra = {repetitions = 1}}, config = {extra = {repetitions = 1}},
attributes = {"retrigger", "editions"},
eternal_compat = true, eternal_compat = true,
blueprint_compat = true, blueprint_compat = true,
perishable_compat = true, perishable_compat = true,

View file

@ -23,6 +23,7 @@ local function protect_ev(fun)
return fun return fun
end end
---@alias Attributes "mult"|"chips"|"xmult"|"xchips"|"score"|"xscore"|"blindsize"|"xblindsize"|"balance"|"swap"|"retrigger"|"scaling"|"reset"|"suit"|"diamonds"|"hearts"|"spades"|"clubs"|"hand_type"|"rank"|"ace"|"two"|"three"|"four"|"five"|"six"|"seven"|"eight"|"nine"|"ten"|"jack"|"queen"|"king"|"face"|"economy"|"generation"|"destroy_card"|"hands"|"discard"|"hand_size"|"chance"|"joker_slot"|"mod_chance"|"copying"|"full_deck"|"passive"|"joker"|"tarot"|"planet"|"spectral"|"enhancements"|"seals"|"editions"|"tag"|"skip"|"modify_card"|"perma_bonus"|"prevents_death"|"boss_blind"|"reroll"|"on_sell"|"sell_value"|"food"|"space"
if false then if false then
-- This allows for better type inference. -- This allows for better type inference.
SMODS.Mods.Roland.config = require "config" SMODS.Mods.Roland.config = require "config"

View file

@ -1,7 +1,7 @@
local qol = assert(SMODS.load_file "src/lib/shared.lua")() or require "lib.shared" local qol = assert(SMODS.load_file "src/lib/shared.lua")() or require "lib.shared"
local f, q = unpack(qol) local f, q = unpack(qol)
f {"challenge", "spectral", "edition", "tweaks", "blind", "charm", "joker", "back", "seal"}:each(function(v) f {"challenge", "spectral", "edition", "tweaks", "blind", "charm", "joker", "back", "seal", "tag"}:each(function(v)
assert(SMODS.load_file("src/" .. v .. ".lua"))(qol) assert(SMODS.load_file("src/" .. v .. ".lua"))(qol)
end) end)

View file

@ -11,6 +11,7 @@ SMODS.Seal {
key = "glass", key = "glass",
atlas = "seal", atlas = "seal",
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
attributes = {"destroy_card", "tag"},
badge_colour = HEX "a6a6a6ff", badge_colour = HEX "a6a6a6ff",
pronouns = "he_him", pronouns = "he_him",
calculate = function(_, card, context) calculate = function(_, card, context)

View file

@ -38,6 +38,7 @@ spectral {
key = "afterimage", key = "afterimage",
pronouns = "he_they", pronouns = "he_they",
artist = "aster", artist = "aster",
attributes = {"editions", "modify_card", "hand_size", "spectral"},
config = {extra = {amount = 1, hand = -2}}, config = {extra = {amount = 1, hand = -2}},
loc_vars = function(_, info_queue, card) loc_vars = function(_, info_queue, card)
table.insert(info_queue, {key = "e_negative_playing_card", set = "Edition", config = {extra = 1}}) table.insert(info_queue, {key = "e_negative_playing_card", set = "Edition", config = {extra = 1}})
@ -69,6 +70,7 @@ spectral {
spectral { spectral {
key = "coolheaded", key = "coolheaded",
config = {extra = {amount = 1}}, config = {extra = {amount = 1}},
attributes = {"editions", "modify_card", "spectral"},
loc_vars = function(_, info_queue, card) loc_vars = function(_, info_queue, card)
table.insert(info_queue, G.P_CENTERS.e_Roland_frozen) table.insert(info_queue, G.P_CENTERS.e_Roland_frozen)
return {vars = {card.ability.extra.amount}} return {vars = {card.ability.extra.amount}}
@ -94,6 +96,7 @@ spectral {
key = "dual", key = "dual",
pronouns = "they_them", pronouns = "they_them",
config = {extra = {amount = 2}}, config = {extra = {amount = 2}},
attributes = {"seal", "modify_card", "spectral"},
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
return {vars = {card.ability.extra.amount}} return {vars = {card.ability.extra.amount}}
end, end,
@ -124,6 +127,7 @@ spectral {
key = "mirror", key = "mirror",
pronouns = "he_him", pronouns = "he_him",
config = {extra = {amount = 1}}, config = {extra = {amount = 1}},
attributes = {"seal", "modify_card", "spectral"},
loc_vars = function(_, info_queue, card) loc_vars = function(_, info_queue, card)
table.insert(info_queue, G.P_SEALS.Roland_glass) table.insert(info_queue, G.P_SEALS.Roland_glass)
return {vars = {card.ability.extra.amount}} return {vars = {card.ability.extra.amount}}
@ -145,6 +149,7 @@ local void = spectral {
soul_rate = 0.003, soul_rate = 0.003,
soul_set = "Spectral", soul_set = "Spectral",
config = {extra = {amount = 2}}, config = {extra = {amount = 2}},
attributes = {"destroy_card", "generation", "spectral"},
loc_vars = function(_, info_queue, card) loc_vars = function(_, info_queue, card)
table.insert(info_queue, {key = "e_negative_consumable", set = "Edition", config = {extra = 1}}) table.insert(info_queue, {key = "e_negative_consumable", set = "Edition", config = {extra = 1}})
table.insert(info_queue, G.P_CENTERS.c_cryptid) table.insert(info_queue, G.P_CENTERS.c_cryptid)

34
src/tag.lua Normal file
View file

@ -0,0 +1,34 @@
SMODS.Atlas {
px = 34,
py = 34,
key = "tag",
path = "tag.png",
}
SMODS.Tag {
key = "invisible",
atlas = "tag",
min_ante = 2,
pos = {x = 0, y = 0},
apply = function(_, tag)
local modifiers = G.GAME.modifiers
if tag.triggered or
not next(G.jokers.cards) or
#G.jokers.cards + (modifiers.Roland_invisible or 0) >= G.jokers.config.card_limit then
return
end
tag.triggered = true
modifiers.Roland_invisible = (modifiers.Roland_invisible or 0) + 1
tag:yep("!", G.C.GREY, function()
local copied = pseudorandom_element(G.jokers.cards, pseudoseed "Roland_invisible")
local copy = copy_card(copied)
G.jokers:emplace(copy)
copy:add_to_deck()
modifiers.Roland_invisible = (modifiers.Roland_invisible or 0) - 1
return true
end)
end,
}

View file

@ -114,7 +114,7 @@ end
local orig_get_blind_amount = get_blind_amount local orig_get_blind_amount = get_blind_amount
---@param ante number ---@param ante number
---@return number ---@return table|number
local function blind(ante) local function blind(ante)
return ante == 39 and 1e294 or (_G["to_number"] or f().id)(orig_get_blind_amount(ante)) return ante == 39 and 1e294 or (_G["to_number"] or f().id)(orig_get_blind_amount(ante))
end end
@ -135,12 +135,12 @@ function get_blind_amount(ante, ...)
end end
--- @type { constants?: { TEN: table }, new: (fun(self: self, arr?: number[], sign?: number, noNormalize?: boolean): table), pow: (fun(x: number, y: number): number) } --- @type { constants?: { TEN: table }, new: (fun(self: self, arr?: number[], sign?: number, noNormalize?: boolean): table), pow: (fun(x: number, y: number): number) }
local big, rem = _G["Big"], (ante % loop) + 1 local big, rem = _G["Big"], tonumber(blind((ante % loop) + 1))
return ante / 15 >= loop and big:new(f(blind(ante - (loop * 15))):map(f().const(10)):table()) or return ante / 15 >= loop and big:new(f(blind(ante - (loop * 15))):map(f().const(10)):table()) or
(ante / 9 >= loop and big:new(f(ante / loop - 8):map(f().const(10)):concat {blind(rem)}:table()) or (ante / 9 >= loop and big:new(f(ante / loop - 8):map(f().const(10)):concat {rem}:table()) or
(ante / 2 >= loop and big:new {blind(rem), ante / loop} or (ante / 2 >= loop and big:new {rem, ante / loop} or
(big.constants and big.constants.TEN or big:new {10}):pow(blind(rem)))) (big.constants and big.constants.TEN or big:new {10}):pow(rem)))
end end
q(function() q(function()