Rebalance new cards

This commit is contained in:
Emik 2026-10-03 22:29:43 +02:00
parent 5d90c1b11d
commit 9474e85826
Signed by: emik
GPG key ID: 6B0CD72A5E503BDF
4 changed files with 147 additions and 82 deletions

View file

@ -207,7 +207,7 @@ vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords
vec4 tex = Texel(texture, texture_coords); vec4 tex = Texel(texture, texture_coords);
vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba;
// Dummy, doesn't do anything but at least it makes the shader useable // Doesn't do anything it makes the shader useable
if (uv.x > uv.x * 2.){ if (uv.x > uv.x * 2.){
uv = polygloss; uv = polygloss;
} }

View file

@ -16,5 +16,5 @@
"Bakery (>=3.0.0~*)" "Bakery (>=3.0.0~*)"
], ],
"conflicts": [], "conflicts": [],
"version": "1.12.2" "version": "1.12.3"
} }

View file

@ -126,7 +126,7 @@ SMODS.Edition({
"{X:dark_edition,C:white}^#2#{} Mult", "{X:dark_edition,C:white}^#2#{} Mult",
}, },
}, },
config = {e_chips = 0.8, e_mult = 1.2}, config = {e_chips = 0.75, e_mult = 1.25},
sound = {sound = "jane_e_moire", per = 1, vol = 0.7}, sound = {sound = "jane_e_moire", per = 1, vol = 0.7},
weight = 0, weight = 0,
extra_cost = 10, extra_cost = 10,

View file

@ -233,7 +233,7 @@ SMODS.Consumable {
set = "jane_omegaconsumable", set = "jane_omegaconsumable",
loc_txt = { loc_txt = {
name = "Ankh {C:dark_edition}Omega", name = "Ankh {C:dark_edition}Omega",
text = {"Create {C:attention}4{} copies of", "a {C:attention}selected Joker"}, text = {"Create {C:attention}3{} copies of", "a {C:attention}selected Joker"},
}, },
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
@ -242,35 +242,35 @@ SMODS.Consumable {
hidden = true, hidden = true,
atlas = "janeomegaspectrals", atlas = "janeomegaspectrals",
can_use = function() can_use = function()
return Jane.can_use() and ((G.jokers or {}).highlighted or {})[1] return Jane.can_use() and
G.jokers.highlighted[1] and
#G.jokers.cards + 3 <= G.jokers.config.card_limit
end, end,
use = function(self, card, area, copier) use = function(self, card, area, copier)
self:bulk_use(card, area, copier, 1) self:bulk_use(card, area, copier, 1)
end, end,
bulk_use = function(_, _, _, _, number) bulk_use = function(_, _, _, _, number)
local joker = ((G.jokers or {}).highlighted or {})[1] local joker = G.jokers.highlighted[1]
if not joker then if not joker then
return return
end end
for _ = 1, 4 * number do for _ = 1, 3 * number do
SMODS.copy_card(joker):start_materialize() SMODS.copy_card(joker):start_materialize()
end end
end, end,
} }
local editions = {"jane_crystal", "jane_moire"}
SMODS.Consumable { SMODS.Consumable {
key = "aura_omega", key = "aura_omega",
set = "jane_omegaconsumable", set = "jane_omegaconsumable",
loc_txt = { loc_txt = {
name = "Aura {C:dark_edition}Omega", name = "Aura {C:dark_edition}Omega",
text = { text = {
"Apply {C:dark_edition}Crystal {}or {C:dark_edition}Moire", "Apply {C:dark_edition}Crystal {}to all",
"to all {C:attention}selected Jokers", "{C:attention}selected Jokers {}and",
"and {C:attention}playing cards", "{C:attention}playing cards",
}, },
}, },
pos = {x = 0, y = 1}, pos = {x = 0, y = 1},
@ -281,21 +281,36 @@ SMODS.Consumable {
atlas = "janeomegaspectrals", atlas = "janeomegaspectrals",
loc_vars = function(_, info_queue) loc_vars = function(_, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_crystal info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_crystal
info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_moire
end, end,
can_use = function() can_use = function()
return Jane.can_use() and (next(G.jokers.highlighted) or next(G.hand.highlighted)) if not Jane.can_use() then
end, return false
use = function() end
for _, v in ipairs(G.jokers.highlighted) do for _, v in ipairs(G.jokers.highlighted) do
if not v.edition then if not v.edition then
v:set_edition({[editions[pseudorandom("auraexrandom", 1, #editions)]] = true}) return true
end end
end end
for _, v in ipairs(G.hand.highlighted) do for _, v in ipairs(G.hand.highlighted) do
if not v.edition then if not v.edition then
v:set_edition({[editions[pseudorandom("auraexrandom", 1, #editions)]] = true}) return true
end
end
return false
end,
use = function()
for _, v in ipairs(G.jokers.highlighted) do
if not v.edition then
v:set_edition({jane_crystal = true})
end
end
for _, v in ipairs(G.hand.highlighted) do
if not v.edition then
v:set_edition({jane_crystal = true})
end end
end end
end, end,
@ -346,6 +361,7 @@ for _, v in ipairs({
text = { text = {
"Apply a {C:attention}" .. v.s .. " Seal{} to", "Apply a {C:attention}" .. v.s .. " Seal{} to",
"{C:attention}all playing cards", "{C:attention}all playing cards",
"{C:inactive}(Can override seals)",
}, },
}, },
pos = {x = 0, y = v.y}, pos = {x = 0, y = v.y},
@ -363,7 +379,7 @@ for _, v in ipairs({
card:set_seal(v.s, i > 50, i > 50) card:set_seal(v.s, i > 50, i > 50)
end end
for _, card in pairs(G.deck.cards) do for _, card in pairs(G.playing_cards) do
card:set_seal(v.s, true, true) card:set_seal(v.s, true, true)
end end
end, end,
@ -387,7 +403,17 @@ SMODS.Consumable {
info_queue[#info_queue + 1] = G.P_CENTERS.e_negative info_queue[#info_queue + 1] = G.P_CENTERS.e_negative
end, end,
can_use = function() can_use = function()
return Jane.can_use() and next(G.jokers.cards) if not Jane.can_use() then
return false
end
for _, v in ipairs(G.jokers.cards) do
if not v.edition then
return true
end
end
return false
end, end,
use = function() use = function()
for k, v in ipairs(G.jokers.cards) do for k, v in ipairs(G.jokers.cards) do
@ -467,8 +493,8 @@ SMODS.Consumable {
loc_txt = { loc_txt = {
name = "Hex {C:dark_edition}Omega", name = "Hex {C:dark_edition}Omega",
text = { text = {
"Apply {C:dark_edition,E:1}Crystal {}or", "Apply {C:dark_edition,E:1}Moire {}to",
"{C:dark_edition,E:1}Moire {}to all {C:attention}Jokers", "all {C:attention}Jokers",
}, },
}, },
pos = {x = 0, y = 7}, pos = {x = 0, y = 7},
@ -478,16 +504,25 @@ SMODS.Consumable {
hidden = true, hidden = true,
atlas = "janeomegaspectrals", atlas = "janeomegaspectrals",
loc_vars = function(_, info_queue) loc_vars = function(_, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_crystal
info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_moire info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_moire
end, end,
can_use = function() can_use = function()
return Jane.can_use() and next(G.jokers.cards) if not Jane.can_use() then
return false
end
for _, v in ipairs(G.jokers.cards) do
if not v.edition then
return true
end
end
return false
end, end,
use = function() use = function()
for _, v in ipairs(G.jokers.cards) do for _, v in ipairs(G.jokers.cards) do
if not v.edition then if not v.edition then
v:set_edition({[editions[pseudorandom("hexexrandom", 1, #editions)]] = true}) v:set_edition({jane_moire = true})
end end
end end
end, end,
@ -499,9 +534,10 @@ SMODS.Consumable {
loc_txt = { loc_txt = {
name = "Immolate {C:dark_edition}Omega", name = "Immolate {C:dark_edition}Omega",
text = { text = {
"{C:red}Destroys{} {C:attention}selected playing cards", "{C:money}Sells{} all cards {C:attention}in hand",
"Each card destroyed multiplies", "Each card {C:money}sold {}multiplies",
"{C:money}money{} by its {C:attention}rank", "{C:money}money{} by its {C:attention}rank",
not Jane.cry and "{C:inactive}(Max of {C:money}$#1#{C:inactive} each)" or nil,
}, },
}, },
pos = {x = 0, y = 8}, pos = {x = 0, y = 8},
@ -510,15 +546,23 @@ SMODS.Consumable {
soul_rate = 0, soul_rate = 0,
hidden = true, hidden = true,
atlas = "janeomegaspectrals", atlas = "janeomegaspectrals",
can_use = function() loc_vars = function(_, info_queue)
return Jane.can_use() and next(G.hand.highlighted) return {vars = {2000}}
end, end,
use = function(self, card, area, copier) can_use = function()
for _, v in pairs(G.hand.highlighted) do return Jane.can_use() and next(G.hand.cards)
ease_dollars((v:norank() and 1 or v:get_id()) * G.GAME.dollars - G.GAME.dollars) end,
end use = function()
---@diagnostic disable-next-line: deprecated
local copy = {unpack(G.hand.cards)}
SMODS.destroy_cards(G.hand.highlighted) for _, v in pairs(copy) do
Jane.q(function()
v:sell_card()
local amount = (v:norank() and 1 or v:get_id()) * G.GAME.dollars - G.GAME.dollars
ease_dollars(Jane.cry and amount or math.min(amount, 2000))
end)
end
end, end,
} }
@ -567,9 +611,10 @@ SMODS.Consumable {
loc_txt = { loc_txt = {
name = "Ouija {C:dark_edition}Omega", name = "Ouija {C:dark_edition}Omega",
text = { text = {
"{C:attention}Playing cards {}whose rank", "{C:attention}Playing cards {}whose",
"does not match any of the", "rank doesn't match any",
"{C:attention}selected cards {}will be {C:money}sold", "of the {C:attention}selected cards",
"will be {C:red}destroyed",
}, },
}, },
pos = {x = 0, y = 11}, pos = {x = 0, y = 11},
@ -586,6 +631,8 @@ SMODS.Consumable {
return return
end end
local destroy = {}
for _, c in pairs(G.playing_cards) do for _, c in pairs(G.playing_cards) do
local safe = c.highlighted local safe = c.highlighted
@ -600,9 +647,11 @@ SMODS.Consumable {
end end
if not safe then if not safe then
c:sell_card() destroy[#destroy + 1] = c
end end
end end
SMODS.destroy_cards(destroy)
end, end,
} }
@ -612,9 +661,10 @@ SMODS.Consumable {
loc_txt = { loc_txt = {
name = "Sigil {C:dark_edition}Omega", name = "Sigil {C:dark_edition}Omega",
text = { text = {
"{C:attention}Playing cards {}whose suit", "{C:attention}Playing cards {}whose",
"does not match any of the", "suit doesn't match any",
"{C:attention}selected {C:attention}cards {}will be {C:money}sold", "of the {C:attention}selected cards",
"will be {C:red}destroyed",
}, },
}, },
pos = {x = 0, y = 12}, pos = {x = 0, y = 12},
@ -626,6 +676,8 @@ SMODS.Consumable {
return Jane.can_use() and next(G.hand.highlighted) return Jane.can_use() and next(G.hand.highlighted)
end, end,
use = function() use = function()
local destroy = {}
if not next(G.hand.highlighted) then if not next(G.hand.highlighted) then
return return
end end
@ -645,9 +697,11 @@ SMODS.Consumable {
end end
if not safe then if not safe then
c:sell_card() destroy[#destroy + 1] = c
end end
end end
SMODS.destroy_cards(destroy)
end, end,
} }
@ -677,7 +731,7 @@ SMODS.Consumable {
end, end,
use = function(self) use = function(self)
for _, v in ipairs(self.jokers()) do for _, v in ipairs(self.jokers()) do
SMODS.add_card {key = v.key, set = "Joker"} SMODS.add_card({key = v.key, set = "Joker"})
end end
end, end,
jokers = function() jokers = function()
@ -704,7 +758,7 @@ SMODS.Consumable {
name = "The Fool {C:dark_edition}Omega", name = "The Fool {C:dark_edition}Omega",
text = { text = {
"Create {C:attention}2{} random", "Create {C:attention}2{} random",
"{C:red,E:1}Omega{} cards", "{C:jane_RGB,E:1}Omega{} cards",
}, },
}, },
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
@ -715,25 +769,17 @@ SMODS.Consumable {
atlas = "janeomegatarots", atlas = "janeomegatarots",
can_use = Jane.can_use, can_use = Jane.can_use,
use = function() use = function()
local omega_consumables = {
"pluto", "mercury", "uranus", "venus", "saturn", "jupiter", "earth", "mars", "neptune", "planet_x", "ceres",
"eris", "black_hole", "ankh", "aura", "cryptid", "deja_vu", "medium", "talisman", "trance", "ectoplasm",
"familiar", "grim", "hex", "immolate", "incantation", "ouija", "sigil", "wraith", "fool", "magician",
"empress", "hierophant", "lovers", "chariot", "justice", "devil", "tower", "high_priestess", "emperor",
"hermit", "wheel_of_fortune", "star", "moon", "sun", "world", "soul",
}
for _ = 1, 2 do for _ = 1, 2 do
if G.consumeables.config.card_limit > #G.consumeables.cards then if G.consumeables.config.card_limit > #G.consumeables.cards then
local key = "c_jane_" .. pseudorandom_element(omega_consumables, pseudoseed("fool_omega")) .. "_omega" local orig = G.GAME.banned_keys.c_jane_soul_omega
SMODS.add_card({key = key, set = "jane_omegaconsumable"}) G.GAME.banned_keys.c_jane_soul_omega = true
SMODS.add_card({set = "jane_omegaconsumable"})
G.GAME.banned_keys.c_jane_soul_omega = orig
end end
end end
end, end,
} }
local omega_copyamount = 10
for _, v in ipairs({ for _, v in ipairs({
{ {
b = "magician", b = "magician",
@ -816,8 +862,7 @@ for _, v in ipairs({
text = { text = {
"Enhance {C:attention}selected playing", "Enhance {C:attention}selected playing",
"{C:attention}cards {}to {C:attention}" .. v.c .. "{} cards,", "{C:attention}cards {}to {C:attention}" .. v.c .. "{} cards,",
"{C:red}Destroy{} all other cards", "{C:attention}Duplicate {}each card {C:attention}10 times",
"{C:attention}Duplicate {}each card {C:attention}" .. omega_copyamount .. " times",
}, },
}, },
pos = {x = 0, y = v.omega}, pos = {x = 0, y = v.omega},
@ -871,17 +916,17 @@ for _, v in ipairs({
end, 0.15, nil, "after") end, 0.15, nil, "after")
end end
for _, c in ipairs(G.playing_cards) do -- Removing all other cards is too strong.
if not c.highlighted then -- for _, c in ipairs(G.playing_cards) do
SMODS.destroy_cards({c}) -- if not c.highlighted then
end -- SMODS.destroy_cards({c})
end -- end
-- end
delay(1) delay(1)
Jane.q(function() Jane.q(function()
for _, h in ipairs(to_copy) do for _, h in ipairs(to_copy) do
for _ = 1, omega_copyamount do for _ = 1, 10 do
SMODS.copy_card(h):start_materialize() SMODS.copy_card(h):start_materialize()
end end
end end
@ -973,8 +1018,9 @@ SMODS.Consumable {
loc_txt = { loc_txt = {
name = "The Hermit {C:dark_edition}Omega", name = "The Hermit {C:dark_edition}Omega",
text = { text = {
"Gain {X:money,C:dark_edition,s:1.25}+$^2", "Gain {X:money,C:dark_edition}+$^2",
"{C:inactive,s:0.75}(+$#1#)", "{C:inactive}(Currently {C:money}+$#1#{C:inactive})",
not Jane.cry and "{C:inactive}(Max of {C:money}$#2#{C:inactive})" or nil,
}, },
}, },
pos = {x = 0, y = 9}, pos = {x = 0, y = 9},
@ -984,11 +1030,15 @@ SMODS.Consumable {
hidden = true, hidden = true,
atlas = "janeomegatarots", atlas = "janeomegatarots",
can_use = Jane.can_use, can_use = Jane.can_use,
loc_vars = function() loc_vars = function(self)
return {vars = {((G.GAME or {}).dollars or 0) ^ 2}} return {vars = {self.money(), 20000}}
end, end,
use = function() use = function(self)
ease_dollars(G.GAME.dollars ^ 2) ease_dollars(self.money())
end,
money = function()
return not (G.GAME or {}).dollars and 0 or
(Jane.cry and G.GAME.dollars ^ 2 or math.min(G.GAME.dollars ^ 2, 20000))
end, end,
} }
@ -1000,7 +1050,7 @@ SMODS.Consumable {
text = { text = {
"Create {C:dark_edition,E:1}50 {C:attention}consumables", "Create {C:dark_edition,E:1}50 {C:attention}consumables",
"{C:inactive}(Adds a temporary Showman)", "{C:inactive}(Adds a temporary Showman)",
"{C:inactive}(Does not require room)", "{C:inactive}(Doesn't require room)",
}, },
}, },
pos = {x = 0, y = 10}, pos = {x = 0, y = 10},
@ -1031,7 +1081,8 @@ for _, vv in pairs({
name = "The " .. string.upper(string.sub(vv.b, 1, 1)) .. string.sub(vv.b, 2, string.len(vv.b)) .. " {C:dark_edition}Omega", name = "The " .. string.upper(string.sub(vv.b, 1, 1)) .. string.sub(vv.b, 2, string.len(vv.b)) .. " {C:dark_edition}Omega",
text = { text = {
"Convert {C:attention}all {C:" .. string.lower(vv.s) .. "}" .. vv.s, "Convert {C:attention}all {C:" .. string.lower(vv.s) .. "}" .. vv.s,
"to {C:dark_edition,E:1}Crystal {}or {C:dark_edition,E:1}Moire", "to {C:dark_edition,E:1}Crystal{}, {C:dark_edition,E:1}Moire{},",
"or {C:dark_edition,E:1}Polygloss",
}, },
}, },
pos = {x = 0, y = vv.o}, pos = {x = 0, y = vv.o},
@ -1043,13 +1094,28 @@ for _, vv in pairs({
loc_vars = function(_, info_queue) loc_vars = function(_, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_crystal info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_crystal
info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_moire info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_moire
info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_polygloss
end,
can_use = function()
if not Jane.can_use() then
return false
end
for _, v in ipairs(G.playing_cards) do
if v:is_suit(vv.s) and not v.edition and not v:nosuit() then
return true
end
end
return false
end, end,
can_use = Jane.can_use,
use = function() use = function()
local editions = {"jane_crystal", "jane_moire", "jane_polygloss"}
play_sound("jane_pop") play_sound("jane_pop")
for _, v in ipairs(G.playing_cards) do for _, v in ipairs(G.playing_cards) do
if v:is_suit(vv.s) and not v:nosuit() then if v:is_suit(vv.s) and not v.edition and not v:nosuit() then
if v.area == G.hand then if v.area == G.hand then
Jane.q(function() Jane.q(function()
v:set_edition({[editions[pseudorandom("auraexrandom", 1, #editions)]] = true}) v:set_edition({[editions[pseudorandom("auraexrandom", 1, #editions)]] = true})
@ -1066,7 +1132,7 @@ for _, vv in pairs({
end end
local function obfuscated_text(length) local function obfuscated_text(length)
local chars = "ABCDEFGHIJKLMNOPQRSTU,VWXYZ abcdefghijklmnopq,rstuvwxyz0123456789+-?!,$%[]()" local chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-?!,$%[]()"
local ret = "" local ret = ""
for _ = 0, length do for _ = 0, length do
@ -1115,19 +1181,20 @@ SMODS.Consumable {
end end
Jane.q(function() Jane.q(function()
SMODS.destroy_cards(G.jokers.cards, {bypass_eternal = true})
G.jokers:change_size(1 - G.jokers.config.card_limit)
G.GAME.banned_keys.j_Bakery_Lua = nil G.GAME.banned_keys.j_Bakery_Lua = nil
SMODS.destroy_cards(G.jokers.cards, {bypass_eternal = true})
G.jokers:change_size(1 - G.jokers.config.card_limits.base)
SMODS.add_card { SMODS.add_card {
set = "Joker", set = "Joker",
no_edition = true,
key = "j_Bakery_Lua", key = "j_Bakery_Lua",
force_stickers = {"eternal", "rental"}, force_stickers = {"eternal", "rental"},
} }
play_sound("jane_enchant", 0.75, 1)
G.GAME.banned_keys.j_Bakery_Lua = true G.GAME.banned_keys.j_Bakery_Lua = true
G.GAME.banned_keys.c_jane_soul_omega = true G.GAME.banned_keys.c_jane_soul_omega = true
play_sound("jane_enchant", 0.75, 1)
end, 0.75, "REAL", "after") end, 0.75, "REAL", "after")
end, end,
} }
@ -1150,9 +1217,7 @@ end
function create_card(...) function create_card(...)
local card = orig_create_card(...) local card = orig_create_card(...)
if not card.gc or if G.STATE ~= G.STATES.SMODS_BOOSTER_OPENED or not card.gc then
G.STATE == G.STATES.MENU or
G.STATE ~= G.STATES.SHOP and card:gc().set ~= "Spectral" then
return card return card
end end