Compare commits

...

26 commits
1.11.3 ... main

Author SHA1 Message Date
1b153166ad
Reorder Editions and fix Moire shader 2026-08-12 01:14:19 +02:00
7084ec1f40
Use correct Cryptid check 2026-08-12 00:37:07 +02:00
a06fec5c23
Defer loading 2026-08-11 23:02:39 +02:00
7e674bca9c
Fix Junk rarity 2026-08-06 21:18:13 +02:00
817f1bc59a
Use better organization 2026-08-04 17:50:12 +02:00
1e4920143b
Avoid all uses of update functions 2026-08-04 16:30:31 +02:00
656be9aa38
Trigger missing context 2026-08-03 23:32:33 +02:00
6cf6938a1b
Mark Maxie blueprint incompatible 2026-08-03 23:25:09 +02:00
f22222524d
Ban The Wee from United Sleeve 2026-08-03 20:22:49 +02:00
2e9689b55d
Adjust non-cryptid Saint and Weeck 2026-08-03 20:07:44 +02:00
86b55b5542
Add non-talisman compatibility 2026-07-31 04:26:13 +02:00
4480833d67
Allow Rot to conditionally appear 2026-07-28 00:51:17 +02:00
59d8d3113f
Allow Rot to appear multiple times 2026-07-28 00:37:12 +02:00
d8df2ec945
Specify new compatibilities for The Saint 2026-07-28 00:31:35 +02:00
f348127b85
Purify faster 2026-07-26 22:30:04 +02:00
767916e3c3
Buff Polygloss, remove Peppino, rework 7 GRAND DAD 2026-07-26 22:24:05 +02:00
b84e7bb366
Fix Epsilon Sleeve and The Saint 2026-07-19 22:29:47 +02:00
e86589960a
Fix nil showing up in joker description
This also reverts commit e6fdbd77bf.
2026-07-18 02:32:40 +02:00
e6fdbd77bf
Update .editorconfig 2026-07-17 22:39:53 +02:00
018c4f4194
Fix Maxie-related crash 2026-07-15 15:33:08 +02:00
c697aec6ef
Remove redundant match_indent 2026-07-15 15:23:32 +02:00
be9cad765d
Prevent The Wee from showing up on a deck that gets destroyed by it 2026-07-14 21:21:33 +02:00
601975e364
Inherit edition 2026-07-06 21:30:11 +02:00
74b49855da
Buff Moire 2026-07-06 19:30:26 +02:00
6b1739aa0c
Fix Jumbo Turtle Bean 2026-06-30 13:09:28 +02:00
146cf44fd1
Improve localization, again 2026-06-29 23:21:21 +02:00
11 changed files with 315 additions and 335 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

View file

@ -1,7 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 114 priority = 115
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]
@ -16,9 +16,7 @@ match_indent = true
target = "globals.lua" target = "globals.lua"
pattern = "EDITION = {1,1,1,1}," pattern = "EDITION = {1,1,1,1},"
position = "before" position = "before"
payload = '''jane_RGB = {0,0,0,1}, payload = "jane_RGB = {1,1,1,1},"
jane_RGB_HUE = 0,
almighty = {0,0,1,1},'''
match_indent = true match_indent = true
[[patches]] [[patches]]
@ -47,16 +45,20 @@ payload = '''if Jane and
G.ARGS.score_intensity.required_score:to_number() or G.ARGS.score_intensity.required_score:to_number() or
G.ARGS.score_intensity.required_score) ~= 0 then G.ARGS.score_intensity.required_score) ~= 0 then
local break_infinity = ((Talisman or {}).config_file or {}).break_infinity local break_infinity = ((Talisman or {}).config_file or {}).break_infinity
local small = function (x) return type(x) == "table" and x:to_number() or x end
local big = (break_infinity == "" or break_infinity == nil) and function (x) return x end or to_big local big = (break_infinity == "" or break_infinity == nil) and function (x) return x end or to_big
local base = Cryptid and 2 or G.ARGS.score_intensity.required_score local base = Cryptid and 2 or G.ARGS.score_intensity.required_score
local expo = Cryptid and G.ARGS.score_intensity.required_score or 2 local expo = Cryptid and G.ARGS.score_intensity.required_score or 2
local ratio = (G.ARGS.score_intensity.earned_score / (big(base) ^ big(expo))):to_number() local ratio = G.ARGS.score_intensity.earned_score / (big(base) ^ big(expo))
Jane.sinister = ratio > 1 Jane.sinister = small(ratio) > 1
G.ARGS.score_intensity.ambientSurreal4 = G.ARGS.score_intensity.ambientSurreal4 =
(break_infinity and (break_infinity and
SMODS.Mods.Amulet and SMODS.Mods.Amulet and
G.ARGS.score_intensity.earned_score >= Bakery_API.parse_hyper_e("e10#10##10000")) and 1 or 0 G.ARGS.score_intensity.earned_score >= (SMODS.Mods.Amulet
and Big:new { 1.7976931348623157e308, 1, [1.7975e308] = 1 }
or Bakery_API.parse_hyper_e 'e10#10##100000'
)) and 1 or 0
G.ARGS.score_intensity.ambientSurreal3 = G.ARGS.score_intensity.ambientSurreal3 =
(G.ARGS.score_intensity.ambientSurreal4 == 0 and (G.ARGS.score_intensity.ambientSurreal4 == 0 and
@ -65,14 +67,14 @@ payload = '''if Jane and
G.ARGS.score_intensity.ambientSurreal2 = G.ARGS.score_intensity.ambientSurreal2 =
(G.ARGS.score_intensity.ambientSurreal3 == 0 and (G.ARGS.score_intensity.ambientSurreal3 == 0 and
G.ARGS.score_intensity.ambientSurreal4 == 0 and G.ARGS.score_intensity.ambientSurreal4 == 0 and
(G.ARGS.score_intensity.earned_score / small(G.ARGS.score_intensity.earned_score /
(Cryptid and (Cryptid and
big(G.ARGS.score_intensity.required_score) ^ big(G.ARGS.score_intensity.required_score) ^
big(G.ARGS.score_intensity.required_score) ^ big(G.ARGS.score_intensity.required_score) ^
big(G.ARGS.score_intensity.required_score) or big(G.ARGS.score_intensity.required_score) or
big(2) ^ big(G.ARGS.score_intensity.required_score) big(2) ^ big(G.ARGS.score_intensity.required_score)
) )
):to_number() > 1 ) > 1
) and 1 or 0 ) and 1 or 0
G.ARGS.score_intensity.ambientSurreal1 = G.ARGS.score_intensity.ambientSurreal1 =
@ -158,7 +160,6 @@ target = "functions/state_events.lua"
pattern = '''hand_chips\*mult\)''' pattern = '''hand_chips\*mult\)'''
position = "at" position = "at"
payload = "Jane.get_chipmult_sum(hand_chips, mult))" payload = "Jane.get_chipmult_sum(hand_chips, mult))"
match_indent = true
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]

View file

@ -9,7 +9,7 @@
"prefix": "jane", "prefix": "jane",
"main_file": "src/main.lua", "main_file": "src/main.lua",
"badge_colour": "3c3cff", "badge_colour": "3c3cff",
"priority": 114, "priority": 115,
"dependencies": [ "dependencies": [
"Steamodded (>=1.0.0~BETA-1606b)", "Steamodded (>=1.0.0~BETA-1606b)",
"Lovely (>=0.6)", "Lovely (>=0.6)",
@ -18,5 +18,5 @@
"conflicts": [ "conflicts": [
"Jen" "Jen"
], ],
"version": "1.11.3" "version": "1.11.28"
} }

View file

@ -527,8 +527,11 @@ local function apply_weeck()
for _, v in pairs(G.playing_cards) do for _, v in pairs(G.playing_cards) do
if v.base.id == 2 then if v.base.id == 2 then
if Jane.cry then
v.ability.cry_absolute = true v.ability.cry_absolute = true
v.ability.eternal = true v.ability.eternal = true
end
add[#add + 1] = v add[#add + 1] = v
else else
v:start_dissolve(nil, true) v:start_dissolve(nil, true)
@ -539,7 +542,7 @@ local function apply_weeck()
local dupe = copy_card(v) local dupe = copy_card(v)
dupe:start_materialize() dupe:start_materialize()
dupe:add_to_deck() dupe:add_to_deck()
G.hand:emplace(dupe) G.deck:emplace(dupe)
G.playing_card = (G.playing_card and G.playing_card + 1) or 1 G.playing_card = (G.playing_card and G.playing_card + 1) or 1
table.insert(G.playing_cards, dupe) table.insert(G.playing_cards, dupe)
end end
@ -713,6 +716,8 @@ back {
end end
end end
end end
G.hand.config.card_limit = math.max(G.hand.config.card_limit or 12, 12)
end, end,
calculate = function(_, _, context) calculate = function(_, _, context)
rebalance_orrery() rebalance_orrery()

View file

@ -108,6 +108,10 @@ SMODS.Blind {
pos = {x = 0, y = 3}, pos = {x = 0, y = 3},
vars = {}, vars = {},
dollars = Jane.cry and 2 or 5, dollars = Jane.cry and 2 or 5,
in_pool = function()
return (G.GAME or {}).selected_sleeve ~= "sleeve_Bakery_United" and
((((G.GAME or {}).selected_back or {}).effect or {}).center or {}).key ~= "b_Bakery_LoneStar"
end,
disable = function(self) disable = function(self)
self.disabled = true self.disabled = true
end, end,

View file

@ -4,18 +4,10 @@ SMODS.Sound({key = "e_jumbo", path = "e_jumbo.ogg"})
SMODS.Sound({key = "e_moire", path = "e_moire.ogg"}) SMODS.Sound({key = "e_moire", path = "e_moire.ogg"})
SMODS.Sound({key = "e_polygloss", path = "e_polygloss.ogg"}) SMODS.Sound({key = "e_polygloss", path = "e_polygloss.ogg"})
local function allow_moire()
for _, v in pairs(SMODS.find_card("j_jane_saint")) do
if v.ability.extra.is_attuned then
return true
end
end
return false
end
local function get_weight(self) local function get_weight(self)
return G.GAME.edition_rate * self.weight return self.weight *
G.GAME.edition_rate *
(next(SMODS.find_card "j_jane_saint") and 10 or 1)
end end
SMODS.Edition({ SMODS.Edition({
@ -25,7 +17,7 @@ SMODS.Edition({
label = "Polygloss", label = "Polygloss",
text = Jane.cry and { text = Jane.cry and {
"{C:chips}+#1#{} Chips", "{C:chips}+#1#{} Chips",
"{C:mult}+#2#{}, {X:mult,C:white}X#3#{}, & {X:mult,C:dark_edition}^#4#{} Mult", "{C:mult}+#2#{}, {X:mult,C:white}X#3#{}, & {X:dark_edition,C:white}^#4#{} Mult",
"{C:money}$#5# {}when scored", "{C:money}$#5# {}when scored",
} or { } or {
"{C:chips}+#1#{} Chips", "{C:chips}+#1#{} Chips",
@ -35,7 +27,7 @@ SMODS.Edition({
}, },
config = { config = {
mult = 2, mult = 2,
chips = 12, chips = 22,
x_mult = 1.2, x_mult = 1.2,
p_dollars = 1, p_dollars = 1,
e_mult = Jane.cry and 1.02 or nil, e_mult = Jane.cry and 1.02 or nil,
@ -44,7 +36,7 @@ SMODS.Edition({
weight = 10, weight = 10,
extra_cost = 2, extra_cost = 2,
in_shop = true, in_shop = true,
shader = "polygloss", shader = "jane_polygloss",
apply_to_float = false, apply_to_float = false,
loc_vars = function(self, _, _) loc_vars = function(self, _, _)
local vars = {self.config.chips} local vars = {self.config.chips}
@ -79,13 +71,46 @@ SMODS.Edition({
get_weight = get_weight, get_weight = get_weight,
}) })
local orig_draw_shader = Sprite.draw_shader local moire = SMODS.Edition({
key = "moire",
function Sprite:draw_shader(_shader, ...) loc_txt = {
if _shader ~= "jane_jumbo" then name = "Moire",
return orig_draw_shader(self, _shader, ...) label = "Moire",
text = {
"{X:dark_edition,C:white}^#1#{} Chips",
"{X:dark_edition,C:white}^#2#{} Mult",
},
},
config = {e_chips = 0.8, e_mult = 1.2},
sound = {sound = "jane_e_moire", per = 1, vol = 0.7},
weight = 1,
extra_cost = 10,
in_shop = true,
shader = "jane_moire",
apply_to_float = false,
get_weight = get_weight,
loc_vars = function(self, _, _)
return {vars = {self.config.e_chips, self.config.e_mult}}
end,
calculate = function(self, card, context)
if not context.post_joker and (not context.main_scoring or context.cardarea ~= G.play) then
return
end end
end
return {
extra = {
card = card,
colour = G.C.jane_RGB,
e_chips = self.config.e_chips,
extra = {
card = card,
colour = G.C.jane_RGB,
e_mult = self.config.e_mult,
},
},
}
end,
})
local jumbo_modifier = Jane.cry and 100 or 2 local jumbo_modifier = Jane.cry and 100 or 2
@ -108,16 +133,13 @@ local jumbo = SMODS.Edition({
card.Jane_jumbo = true card.Jane_jumbo = true
local obj = card:gc() local obj = card:gc()
local modifier = (obj.set == "Booster" or obj.jumbo_mod) and (obj.jumbo_mod or 2) or jumbo_modifier
if obj.set == "Booster" or obj.jumbo_mod then
jumbo_modifier = obj.jumbo_mod or 2
end
if card.added_to_deck then if card.added_to_deck then
card:remove_from_deck() card:remove_from_deck()
end end
Jane.misprintize(card, {min = jumbo_modifier, max = jumbo_modifier}, nil, true) Jane.misprintize(card, {min = modifier, max = modifier}, nil, true)
if (card.ability or {}).bonus and (card.base or {}).nominal then if (card.ability or {}).bonus and (card.base or {}).nominal then
card.ability.bonus = card.ability.bonus + card.base.nominal card.ability.bonus = card.ability.bonus + card.base.nominal
@ -127,6 +149,11 @@ local jumbo = SMODS.Edition({
card:add_to_deck() card:add_to_deck()
end end
if ({j_turtle_bean = true, j_mp_turtle_bean = true})[obj.key] then
G.hand:change_size(card.ability.extra.h_size)
card.ability.extra.h_mod = 1
end
Jane.resize(card, Jane.config.wee_sizemod) Jane.resize(card, Jane.config.wee_sizemod)
end, end,
on_load = function(card) on_load = function(card)
@ -154,11 +181,22 @@ local jumbo = SMODS.Edition({
card:add_to_deck() card:add_to_deck()
end end
if ({j_turtle_bean = true, j_mp_turtle_bean = true})[card.config.center.key] then
G.hand:change_size(-card.ability.extra.h_size)
card.ability.extra.h_mod = jumbo_modifier
end
Jane.resize(card) Jane.resize(card)
end, end,
calculate = function(_, card, context)
if context.selling_self and ({j_turtle_bean = true, j_mp_turtle_bean = true})[card.config.center.key] then
G.hand:change_size(-card.ability.extra.h_size)
card.ability.extra.h_mod = jumbo_modifier
end
end,
sound = {sound = "jane_e_jumbo", per = 1, vol = 0.5}, sound = {sound = "jane_e_jumbo", per = 1, vol = 0.5},
weight = 5, weight = 6,
extra_cost = 2, extra_cost = 5,
in_shop = true, in_shop = true,
shader = false, shader = false,
apply_to_float = false, apply_to_float = false,
@ -191,32 +229,16 @@ function Card:set_ability(...)
return ret return ret
end end
SMODS.Edition({ local orig_draw_shader = Sprite.draw_shader
key = "moire",
loc_txt = { function Sprite:draw_shader(_shader, ...)
name = "Moire", if _shader == "jane_jumbo" then
label = "Moire", return
text = {
"{X:chips,C:dark_edition}^#1#{C:chips} Chips",
"{X:mult,C:dark_edition}^#2#{C:mult} Mult",
},
},
config = {e_chips = Jane.cry and 0.8 or 0.9, e_mult = Jane.cry and 1.2 or 1.1},
sound = {sound = "jane_e_moire", per = 1, vol = 0.7},
weight = 1,
extra_cost = 10,
in_shop = true,
shader = "moire",
apply_to_float = false,
get_weight = function(self)
return G.GAME.edition_rate * self.weight * (allow_moire() and 20 or 2)
end,
loc_vars = function(self, _, _)
return {vars = {self.config.e_chips, self.config.e_mult}}
end,
calculate = function(self, _, context)
if context.post_joker or context.main_scoring and context.cardarea == G.play then
return {e_chips = self.config.e_chips, e_mult = self.config.e_mult}
end end
end,
}) if _shader == "jane_moire" then
G.P_CENTERS.j_jane_saint:draw()
end
return orig_draw_shader(self, _shader, ...)
end

View file

@ -1,4 +1,4 @@
for _, v in pairs({"7granddad", "betmma", "escapey", "honey", "oxy", "maxie", Jane.cry and "peppino" or nil}) do for _, v in pairs({"7granddad", "betmma", "escapey", "honey", "oxy", "maxie"}) do
SMODS.Atlas { SMODS.Atlas {
px = 71, px = 71,
py = 95, py = 95,
@ -15,63 +15,12 @@ SMODS.Sound({key = "corrupt_milestone", path = "corrupt_milestone.ogg"})
SMODS.Sound({key = "corrupt_untick", path = "corrupt_untick.ogg"}) SMODS.Sound({key = "corrupt_untick", path = "corrupt_untick.ogg"})
SMODS.Sound({key = "corrupt_tick", path = "corrupt_tick.ogg"}) SMODS.Sound({key = "corrupt_tick", path = "corrupt_tick.ogg"})
local exotic = Jane.cry and "cry_exotic" or 4 local granddad_palette = {HEX("155fd9"), HEX("ff8170"), HEX("ffffff"), HEX("6c0700")}
local food = {
"j_gros_michel",
"j_egg",
"j_ice_cream",
"j_cavendish",
"j_turtle_bean",
"j_diet_cola",
"j_popcorn",
"j_ramen",
"j_selzer",
"j_cry_pickle",
"j_cry_chili_pepper",
"j_cry_oldcandy",
"j_cry_caramel",
"j_cry_foodm",
"j_cry_cotton_candy",
"j_cry_wrapped",
"j_cry_candy_cane",
"j_cry_candy_buttons",
"j_cry_jawbreaker",
"j_cry_mellowcreme",
"j_cry_brittle",
}
local granddad_palette = {
HEX("155fd9"),
HEX("ff8170"),
HEX("ffffff"),
HEX("6c0700"),
}
local function destructible(card) local function destructible(card)
return card.ability.consumeable and not card.highlighted and not (card.ability or {}).eternal return card.ability.consumeable and not card.highlighted and not (card.ability or {}).eternal
end end
local function food_jokers_count()
if not G.jokers or not next(G.jokers.cards) then
return 0
end
local amount = 0
if G.jokers.cards[1] and G.jokers.cards[1].has_attribute then
for _, v in pairs(G.jokers.cards) do
amount = amount + (v:has_attribute "food" and 1 or 0)
end
else
for _, v in pairs(food) do
amount = amount + #SMODS.find_card(v)
end
end
return amount
end
local function grand_dad(card) local function grand_dad(card)
if ((Talisman or {}).config_file or {}).disable_anims then if ((Talisman or {}).config_file or {}).disable_anims then
return return
@ -181,8 +130,8 @@ local esc = SMODS.Joker {
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
local extra = card.ability.extra local extra = card.ability.extra
local normal = Jane.sinister and "" or local normal = Jane.sinister and {"", ""} or
pseudorandom_element(escapey_quotes.normal, pseudoseed "EscapeyQuotes") or "" pseudorandom_element(escapey_quotes.normal, pseudoseed "EscapeyQuotes") or {"", ""}
local scared = not Jane.sinister and "" or local scared = not Jane.sinister and "" or
pseudorandom_element(escapey_quotes.scared, pseudoseed "EscapeyQuotes") or "" pseudorandom_element(escapey_quotes.scared, pseudoseed "EscapeyQuotes") or ""
@ -300,7 +249,7 @@ SMODS.Joker {
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
sinis = {x = 2, y = 0}, sinis = {x = 2, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
blueprint_compat = true, blueprint_compat = false,
cost = 6, cost = 6,
rarity = 2, rarity = 2,
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
@ -317,7 +266,7 @@ SMODS.Joker {
local _ = context.starting_shop and self:add_to_deck(card, false) local _ = context.starting_shop and self:add_to_deck(card, false)
end, end,
add_to_deck = function(_, card, from_debuff) add_to_deck = function(_, card, from_debuff)
if from_debuff then if from_debuff or G.STATE ~= G.STATES.SHOP and G.STATE ~= G.STATES.SMODS_BOOSTER_OPENED then
return return
end end
@ -330,9 +279,9 @@ SMODS.Joker {
end, end,
} }
function Jane.update_honey() function Jane.check_honey()
if not G.GAME then if not G.GAME then
return return true
end end
local honey = SMODS.find_card("j_jane_honey") local honey = SMODS.find_card("j_jane_honey")
@ -402,6 +351,7 @@ SMODS.Joker {
blueprint_compat = false, blueprint_compat = false,
cost = 8, cost = 8,
rarity = 3, rarity = 3,
add_to_deck = Jane.check_honey,
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
local level = tonumber(card.ability.extra.level) or 1 local level = tonumber(card.ability.extra.level) or 1
@ -444,8 +394,10 @@ SMODS.Joker {
}, },
} }
end, end,
update = function(_, card, _) draw = function(_, card)
if card.added_to_deck and card.children.center and card.children.floating_sprite then if card.added_to_deck and
card.children.center and
card.children.floating_sprite then
local extra = card.ability.extra or {} local extra = card.ability.extra or {}
local y = (tonumber(extra.level) or 1) > 1 and 1 or 0 local y = (tonumber(extra.level) or 1) > 1 and 1 or 0
card.children.center:set_sprite_pos({x = 0, y = y}) card.children.center:set_sprite_pos({x = 0, y = y})
@ -535,7 +487,7 @@ SMODS.Joker {
name = "Oxy{C:dark_edition}#1#", name = "Oxy{C:dark_edition}#1#",
text = { text = {
"{C:attention}Scored steel {}cards", "{C:attention}Scored steel {}cards",
"give {X:mult,C:white}X#2#{} {C:mult}Mult", "give {X:mult,C:white}X#2#{} {}Mult",
"{C:dark_edition,E:1}#3#{}#4#{C:red}#5#{C:attention}#6#", "{C:dark_edition,E:1}#3#{}#4#{C:red}#5#{C:attention}#6#",
"{C:dark_edition,E:1}#7#{}#8#", "{C:dark_edition,E:1}#7#{}#8#",
"#9#{C:dark_edition,E:1}#10#", "#9#{C:dark_edition,E:1}#10#",
@ -566,7 +518,7 @@ SMODS.Joker {
is_corrupted and "Purifies " or "", is_corrupted and "Purifies " or "",
is_corrupted and "in " or "", is_corrupted and "in " or "",
is_corrupted and "" or "Destroying ", is_corrupted and "" or "Destroying ",
effective .. (is_corrupted and " ante" or " steel card") .. plural, effective .. (is_corrupted and " round" or " steel card") .. plural,
is_corrupted and "" or "corrupts ", is_corrupted and "" or "corrupts ",
is_corrupted and "Destroying steel cards" or "this Joker", is_corrupted and "Destroying steel cards" or "this Joker",
is_corrupted and "prolongs the " or "", is_corrupted and "prolongs the " or "",
@ -579,7 +531,7 @@ SMODS.Joker {
}, },
} }
end, end,
update = function(_, card, _) draw = function(_, card)
if card.added_to_deck and card.children.center and card.children.floating_sprite then if card.added_to_deck and card.children.center and card.children.floating_sprite then
local extra = card.ability.extra or {} local extra = card.ability.extra or {}
local y = extra.is_corrupted and 1 or 0 local y = extra.is_corrupted and 1 or 0
@ -591,7 +543,7 @@ SMODS.Joker {
local extra = card.ability.extra or {} local extra = card.ability.extra or {}
Jane.oxy(card, context.removed) Jane.oxy(card, context.removed)
if context.ante_end and context.ante_change and if context.end_of_round and
extra.progress > 0 and not extra.progress > 0 and not
context.individual and not context.individual and not
context.repetition and not context.repetition and not
@ -646,7 +598,7 @@ if Cryptid and Cryptid.aliases then
end end
local operator = Jane.cry and "^" or "X" local operator = Jane.cry and "^" or "X"
local operator_prefix = Jane.cry and "{X:dark_edition,C:mult}" or "{X:mult,C:white}" local operator_prefix = Jane.cry and "{X:dark_edition,C:white}" or "{X:mult,C:white}"
SMODS.Joker { SMODS.Joker {
key = "betmma", key = "betmma",
@ -654,7 +606,7 @@ SMODS.Joker {
loc_txt = { loc_txt = {
name = "Betmma", name = "Betmma",
text = { text = {
operator_prefix .. "+" .. operator .. "#1#{C:mult} Mult{} for every", operator_prefix .. "+" .. operator .. "#1#{} Mult for every",
"{C:attention}" .. (Jane.cry and "Unique " or "") .. "Voucher{} redeemed", "{C:attention}" .. (Jane.cry and "Unique " or "") .. "Voucher{} redeemed",
"{C:inactive}(Currently " .. operator_prefix .. operator .. "#2#{C:inactive})", "{C:inactive}(Currently " .. operator_prefix .. operator .. "#2#{C:inactive})",
}, },
@ -681,17 +633,12 @@ SMODS.Joker {
return { return {
card = card, card = card,
colour = Jane.cry and G.C.jane_RGB or nil, colour = Jane.cry and G.C.jane_RGB or nil,
message = Jane.cry and (operator .. number_format(num)) or nil, [Jane.cry and "emult" or "xmult"] = num,
[Jane.cry and "e_mult" or "x_mult"] = num,
}, true }, true
end end
end, end,
} }
if not Jane.cry then
return
end
SMODS.Joker { SMODS.Joker {
key = "7granddad", key = "7granddad",
loc_txt = { loc_txt = {
@ -701,98 +648,69 @@ SMODS.Joker {
"{C:jane_RGB,E:1}reaction {}to scored {C:attention}7{}s", "{C:jane_RGB,E:1}reaction {}to scored {C:attention}7{}s",
}, },
}, },
config = {}, config = {extra = {}},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
atlas = "jane7granddad", atlas = "jane7granddad",
blueprint_compat = true, blueprint_compat = true,
cost = Jane.cry and 49 or 7, cost = 7,
rarity = Jane.cry and exotic or 3, rarity = 3,
loc_vars = function(_, _, center)
return {vars = {center.ability.shopslots}}
end,
add_to_deck = function(_, card, _) add_to_deck = function(_, card, _)
grand_dad(card) grand_dad(card)
end, end,
remove_from_deck = function(_, card, _) remove_from_deck = function(_, card, _)
grand_dad(card) grand_dad(card)
end, end,
draw = function()
G.P_CENTERS.j_jane_saint:draw()
end,
calculate = function(_, card, context) calculate = function(_, card, context)
if context.cardarea == G.play then if context.cardarea ~= G.play or
local function scj(c) not context.individual or
return c.cardarea and c.cardarea == G.play and not c.before and not c.after and not c.repetition not context.other_card or
context.other_card:get_id() ~= 7 then
return
end end
if context.other_card and context.other_card:get_id() == 7 and scj(context) then
grand_dad(card)
local palette = granddad_palette[math.random(#granddad_palette)] local palette = granddad_palette[math.random(#granddad_palette)]
local rnd = pseudorandom(pseudoseed("granddad"), 1, Jane.cry and 5 or 4) local cycle = ((card.ability.extra.cycle or -1) + 1) % 5
cycle = cycle == 2 and not Jane.cry and 3 or cycle
card.ability.extra.cycle = cycle
if rnd == 1 then if cycle == (Jane.cry and 2 or 3) then
grand_dad(card)
end
if cycle == 0 then
return { return {
message = Jane.cry and "+777" or "+77", chips = 177,
chips = Jane.cry and 777 or 77,
colour = palette, colour = palette,
card = card, card = card,
}, true }, true
elseif rnd == 2 then elseif cycle == 1 then
return { return {
message = Jane.cry and "+777 Mult" or "+77 Mult",
mult = Jane.cry and 777 or 77,
colour = palette,
card = card,
}, true
elseif rnd == 3 then
return {
message = "+$7",
dollars = 7, dollars = 7,
colour = palette, colour = palette,
card = card, card = card,
}, true }, true
elseif rnd == 4 then elseif cycle == 2 then
return { return {
message = Jane.cry and "X7 Mult" or "X1.77 Mult", emult = 1.17,
x_mult = Jane.cry and 7 or 1.77,
colour = palette, colour = palette,
card = card, card = card,
}, true }, true
else elseif cycle == 3 then
return { return {
message = "^1.77 Mult", xmult = 1.77,
e_mult = 1.77, colour = palette,
card = card,
}, true
elseif cycle == 4 then
return {
mult = 77,
colour = palette, colour = palette,
card = card, card = card,
}, true }, true
end
end
end
end,
}
SMODS.Joker {
key = "peppino",
atlas = "janepeppino",
loc_txt = {
name = "Peppino Spaghetti",
text = {
operator_prefix .. operator .. "2{C:mult} Mult{} per {C:attention}Food Joker",
"{C:inactive}(Currently " .. operator_prefix .. operator .. "#1#{C:mult} Mult{C:inactive})",
},
},
pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0},
config = {extra = {base = 2}},
cost = Jane.cry and 20 or 8,
rarity = Jane.cry and 4 or 3,
blueprint_compat = true,
loc_vars = function(_, _, card)
return {vars = {card.ability.extra.base ^ food_jokers_count()}}
end,
calculate = function(_, card, context)
local count = food_jokers_count()
if context.joker_main and count > 0 then
return {[Jane.cry and "e_mult" or "x_mult"] = card.ability.extra.base ^ count}
end end
end, end,
} }
@ -805,5 +723,6 @@ function localize(args, misc_cat, ...)
j_jane_oxy = "Oxy", j_jane_oxy = "Oxy",
j_jane_honey = "Honey", j_jane_honey = "Honey",
j_jane_saint = "The Saint", j_jane_saint = "The Saint",
c_jokerinatarot = "Joker in a Tarot",
})[type(args) == "table" and args.type == "name_text" and args.key] or orig_localize(args, misc_cat, ...) })[type(args) == "table" and args.type == "name_text" and args.key] or orig_localize(args, misc_cat, ...)
end end

View file

@ -1,5 +1,5 @@
Jane = { Jane = {
cry = not not G.P_CENTERS.j_cry_m, cry = SMODS.Mods.Cryptid and not SMODS.Mods.Cryptid.disabled,
config = { config = {
texture_pack = "default", texture_pack = "default",
wee_sizemod = math.sqrt(2), wee_sizemod = math.sqrt(2),
@ -7,7 +7,7 @@ Jane = {
}, },
} }
Jane.rarity_ids = Jane.cry and {1, 2, 3, "cry_epic", 4, "cry_exotic", "jane_junk"} or {1, 2, 3, 4, "jane_junk"} Jane.rarity_ids = Jane.cry and {1, 2, 3, "cry_epic", 4, "cry_exotic", "jane_junk"} or {1, 2, 3, "jane_junk"}
Jane.rarity_names = Jane.cry and {"Common", "Uncommon", "Rare", "Epic", "Legendary", "Exotic", "Junk"} or Jane.rarity_names = Jane.cry and {"Common", "Uncommon", "Rare", "Epic", "Legendary", "Exotic", "Junk"} or
{"Common", "Uncommon", "Rare", "Legendary", "Junk"} {"Common", "Uncommon", "Rare", "Legendary", "Junk"}
@ -155,6 +155,33 @@ function Jane.hidden(card)
(type(card) == "table" and (card.name == "Black Hole" or card.name == "The Soul") or card.hidden) (type(card) == "table" and (card.name == "Black Hole" or card.name == "The Soul") or card.hidden)
end end
function Jane.hsv(h, s, v)
if s <= 0 then
return v, v, v
end
h = h * 6
local c = v * s
local x = (1 - math.abs((h % 2) - 1)) * c
local m, r, g, b = (v - c), 0, 0, 0
if h < 1 then
r, g, b = c, x, 0
elseif h < 2 then
r, g, b = x, c, 0
elseif h < 3 then
r, g, b = 0, c, x
elseif h < 4 then
r, g, b = 0, x, c
elseif h < 5 then
r, g, b = x, 0, c
else
r, g, b = c, 0, x
end
return r + m, g + m, b + m
end
function Jane.is_end_of_ante(context, card) function Jane.is_end_of_ante(context, card)
return not context.individual and not return not context.individual and not
context.repetition and not context.repetition and not
@ -271,74 +298,16 @@ function Game:main_menu(change_context)
orig_menu(self, change_context) orig_menu(self, change_context)
end end
local orig_update = Game.update local orig_start_run = Game.start_run
function Game:update(dt) function Game:start_run(...)
local function delete_hardbans() orig_start_run(self, ...)
if not Jane.config.disable_bans then
if self.GAME.banned_keys then
for _, v in pairs(Jane.config.bans) do for _, v in pairs(Jane.config.bans) do
local e = SMODS.Center:get_obj(v) self.GAME.banned_keys[v] = true
if e then
e:delete()
end end
end end
end
end
local function hsv(h, s, v)
if s <= 0 then
return v, v, v
end
h = h * 6
local c = v * s
local x = (1 - math.abs((h % 2) - 1)) * c
local m, r, g, b = (v - c), 0, 0, 0
if h < 1 then
r, g, b = c, x, 0
elseif h < 2 then
r, g, b = x, c, 0
elseif h < 3 then
r, g, b = 0, c, x
elseif h < 4 then
r, g, b = 0, x, c
elseif h < 5 then
r, g, b = x, 0, c
else
r, g, b = c, 0, x
end
return r + m, g + m, b + m
end
orig_update(self, dt)
local ante = G.GAME.round_resets.ante
local blind = get_blind_amount((ante >= 1 and ante <= 8) and math.floor(ante) or ante)
G.P_BLINDS["bl_jane_wee"].mult = 22 / blind
G.P_BLINDS["bl_jane_descending"].mult = math.ceil(8 * math.sqrt(blind)) / blind
Jane.update_honey()
if not Jane.bans_done then
Jane.bans_done = true
delete_hardbans()
end
if (G.GAME or {}).banned_keys then
for _, v in pairs(Jane.config.bans) do
G.GAME.banned_keys[v] = true
end
end
if G.ARGS.LOC_COLOURS then
local r, g, b = hsv(self.C.jane_RGB_HUE / 360, .5, 1)
self.C.jane_RGB[1] = r
self.C.jane_RGB[3] = g
self.C.jane_RGB[2] = b
self.C.jane_RGB_HUE = (self.C.jane_RGB_HUE + 0.5) % 360
G.ARGS.LOC_COLOURS.jane_RGB = self.C.jane_RGB
end
end end
local orig_draw_card = draw_card local orig_draw_card = draw_card
@ -350,6 +319,20 @@ function draw_card(a, b, c, d, e, f, ...)
end end
end end
local orig_reset_blinds = reset_blinds
---@diagnostic disable-next-line: lowercase-global
function reset_blinds(...)
orig_reset_blinds(...)
local ante = G.GAME.round_resets.ante
local blind = get_blind_amount((ante >= 1 and ante <= 8) and math.floor(ante) or ante)
G.P_BLINDS["bl_jane_wee"].mult = 22 / blind
G.P_BLINDS["bl_jane_descending"].mult = math.ceil(8 * math.sqrt(blind)) / blind
end
loc_colour()
G.ARGS.LOC_COLOURS.jane_RGB = G.C.jane_RGB
SMODS.Atlas { SMODS.Atlas {
px = 34, px = 34,
py = 34, py = 34,

View file

@ -127,6 +127,8 @@ function Jane.misprintize_val(val, override, big)
end end
function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack, big) function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack, big)
local is_number = _G.is_number or function(x) return type(x) == "number" end
if name and ref_tbl and ref_value then if name and ref_tbl and ref_value then
local tbl = deep_copy(ref_tbl[ref_value]) local tbl = deep_copy(ref_tbl[ref_value])

View file

@ -63,9 +63,25 @@ local exotic = Jane.cry and "cry_exotic" or 4
SMODS.Rarity { SMODS.Rarity {
key = "junk", key = "junk",
default_weight = 1e-9, default_weight = 0,
pools = {Joker = true},
loc_txt = {name = "Junk"}, loc_txt = {name = "Junk"},
badge_colour = G.C.JOKER_GREY, badge_colour = G.C.JOKER_GREY,
get_weight = function()
local rarity = 0.05
if next(SMODS.find_card("j_jane_rot")) then
return rarity
end
for _, v in pairs(SMODS.find_card("j_jane_honey")) do
if tonumber(v.ability.extra.level) == #Jane.rarity_ids - 1 then
return rarity
end
end
return 0
end,
} }
local monk_limit = 25 local monk_limit = 25
@ -180,7 +196,7 @@ SMODS.Joker {
}, },
} }
end, end,
update = function(_, card, _) draw = function(_, card)
if card.added_to_deck and card.children.center and card.children.floating_sprite then if card.added_to_deck and card.children.center and card.children.floating_sprite then
for k, v in ipairs(hunter) do for k, v in ipairs(hunter) do
if card.ability.extra.rounds_left <= v then if card.ability.extra.rounds_left <= v then
@ -200,11 +216,12 @@ SMODS.Joker {
Jane.card_status_text(card, "Dead!", nil, 0.05 * card.T.h, G.C.BLACK, 2, 0, 0, nil, "bm", "jane_gore6") Jane.card_status_text(card, "Dead!", nil, 0.05 * card.T.h, G.C.BLACK, 2, 0, 0, nil, "bm", "jane_gore6")
Jane.q(function() Jane.q(function()
local card2 = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_jane_rot", "hunter_rot_death") local rot = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_jane_rot", "hunter_rot_death")
card2:add_to_deck() rot:add_to_deck()
G.jokers:emplace(card2) G.jokers:emplace(rot)
card:set_eternal(nil) card:set_eternal(nil)
card2:set_eternal(true) rot:set_eternal(true)
rot:set_edition(card.edition)
play_sound("jane_gore5") play_sound("jane_gore5")
end) end)
@ -282,8 +299,10 @@ SMODS.Joker {
blueprint_compat = false, blueprint_compat = false,
cost = 20, cost = 20,
rarity = 4, rarity = 4,
loc_vars = function(_, info_queue) loc_vars = function(_, info_queue, card)
info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_jumbo info_queue[#info_queue + 1] =
(not card.edition or not card.edition.e_jane_jumbo) and
G.P_CENTERS.e_jane_jumbo or nil
end, end,
} }
@ -393,14 +412,14 @@ SMODS.Joker {
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(_, card) Bakery_use_joker = function(_, card)
for _, v in pairs(SMODS.find_card("j_jane_oxy")) do local removed = {unpack(G.hand.highlighted)}
Jane.oxy(v, G.hand.highlighted)
end
for _, v in pairs(G.hand.highlighted) do for _, v in pairs(removed) do
v:start_dissolve() v:start_dissolve()
end end
SMODS.calculate_context {remove_playing_cards = true, removed = removed}
if Jane.cry then if Jane.cry then
return return
end end
@ -569,7 +588,7 @@ local orig_debuff = Card.set_debuff
function Card:set_debuff(should_debuff) function Card:set_debuff(should_debuff)
if should_debuff and ((self.config or {}).center or {}).debuff_immune then if should_debuff and ((self.config or {}).center or {}).debuff_immune then
Jane.card_status_text(self, "Immune", nil, 0.05 * self.T.h, G.C.RED, nil, 0.6, nil, nil, "bm", "cancel", 1, 0.9) Jane.card_status_text(self, "Immune!", nil, 0.05 * self.T.h, G.C.RED, nil, 0.6, nil, nil, "bm", "cancel", 1, 0.9)
return false return false
else else
orig_debuff(self, should_debuff) orig_debuff(self, should_debuff)
@ -585,24 +604,25 @@ SMODS.Joker {
"{C:attention}Use {}to toggle itself or", "{C:attention}Use {}to toggle itself or",
"other Jokers to its", "other Jokers to its",
"left's {C:legendary}Eternal{} sticker", "left's {C:legendary}Eternal{} sticker",
"{C:attention}#4#{}#5#{C:spectral}#6#{}#7#", "{C:attention}#4#{}#5#{C:spectral}#6#{C:planet}#7#{}#8#",
"{C:inactive,s:1.25}#8#{C:attention,s:1.25}#9#{C:inactive,s:1.25}#10#", "{C:inactive,s:1.25}#9#{C:attention,s:1.25}#10#{C:inactive,s:1.25}#11#",
Jane.cry and "{C:inactive}(Gateway has no downside)" or nil, Jane.cry and "{C:inactive}(Gateway has no downside)" or nil,
}, },
}, },
config = {extra = {changes_editions = false, jokers = Jane.cry and 10 or 1, karma = 0, max_karma = Jane.cry and 10 or 3}}, config = {extra = {changes_editions = false, jokers = 1, karma = -10}},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
cost = 20, cost = 20,
rarity = 4, rarity = 4,
blueprint_compat = true, debuff_immune = true,
loc_vars = function(_, info_queue, card) eternal_compat = true,
blueprint_compat = false,
perishable_compat = true,
loc_vars = function(self, info_queue, card)
info_queue[#info_queue + 1] = Jane.cry and G.P_CENTERS.c_cry_gateway or nil info_queue[#info_queue + 1] = Jane.cry and G.P_CENTERS.c_cry_gateway or nil
local extra = card.ability.extra local extra = card.ability.extra
local karma = extra.karma local attuned = extra.karma >= 0
local max_karma = extra.max_karma
local attuned = karma >= max_karma
return { return {
vars = { vars = {
@ -612,25 +632,30 @@ SMODS.Joker {
attuned and "" or "Attune ", attuned and "" or "Attune ",
attuned and "" or "at ", attuned and "" or "at ",
attuned and (Jane.cry and "Gateways " or "Spectrals ") or attuned and (Jane.cry and "Gateways " or "Spectrals ") or
max_karma .. (Jane.cry and " Gateways" or " Spectrals"), (Jane.cry and -self.config.extra.karma .. " Gateways" or ""),
(attuned or Jane.cry) and "" or -self.config.extra.karma .. " Planets",
attuned and "add Joker slots" or "", attuned and "add Joker slots" or "",
attuned and "[Currently " or "[", attuned and "[Currently " or "[",
attuned and "+" .. karma or karma, attuned and "+" .. extra.karma or extra.karma - self.config.extra.karma,
attuned and "]" or " / " .. max_karma .. "]", attuned and "]" or " / " .. -self.config.extra.karma .. "]",
}, },
} }
end, end,
update = function(_, card, _) draw = function(_, card)
if card.edition and card.edition.Roland_frozen then local rgb = G.C.jane_RGB
card:set_edition("e_base") rgb[1], rgb[2], rgb[3] = Jane.hsv(1 - (G.TIMERS.REAL / 3 % 1), math.sin(G.TIMERS.REAL) / 10 + 0.6, 1)
elseif card.children.floating_sprite then
local _ = card and
card.children.floating_sprite and
card.children.floating_sprite:set_sprite_pos({x = card.ability.extra.is_attuned and 2 or 1, y = 0}) card.children.floating_sprite:set_sprite_pos({x = card.ability.extra.is_attuned and 2 or 1, y = 0})
end
end, end,
calculate = function(_, card, context) calculate = function(self, card, context)
if card.edition and card.edition.Roland_frozen then
card:set_edition("e_base", true)
end
local extra = card.ability.extra local extra = card.ability.extra
local max_karma = extra.max_karma extra.is_attuned = extra.is_attuned and extra.karma >= 0
extra.is_attuned = extra.is_attuned and extra.karma >= max_karma
local function ascend() local function ascend()
if extra.is_attuning then if extra.is_attuning then
@ -664,10 +689,15 @@ SMODS.Joker {
play_sound("card1") play_sound("card1")
extra.is_attuned = true extra.is_attuned = true
end, 1) end, 1)
Jane.q(function()
extra.karma = Jane.cry and extra.karma + extra.jokers or extra.jokers
G.jokers:change_size(extra.jokers)
end, 1)
end end
if extra.karma >= max_karma then if extra.karma >= 0 then
local karma = (extra.is_attuning or extra.is_attuned) and 0 or extra.karma local karma = extra.is_attuning and 0 or (extra.is_attuned and 1 or extra.karma)
G.jokers:change_size(karma * extra.jokers) G.jokers:change_size(karma * extra.jokers)
ascend() ascend()
end end
@ -681,7 +711,8 @@ SMODS.Joker {
local gc = context.consumeable:gc() local gc = context.consumeable:gc()
if Jane.cry and gc.key ~= "c_cry_gateway" or not Jane.cry and gc.set ~= "Spectral" then if Jane.cry and gc.key ~= "c_cry_gateway" or
not Jane.cry and gc.set ~= (extra.karma > 0 and "Spectral" or "Planet") then
return return
end end
@ -697,22 +728,41 @@ SMODS.Joker {
{message = "+" .. quota .. " Karma", colour = G.C.PALE_GREEN} {message = "+" .. quota .. " Karma", colour = G.C.PALE_GREEN}
) )
local _ = extra.karma <= max_karma and card_eval_status_text( local _ = extra.karma <= 0 and card_eval_status_text(
card, card,
"extra", "extra",
nil, nil,
nil, nil,
nil, nil,
{message = extra.karma .. " / " .. max_karma, colour = G.C.GREEN} {
message = (extra.karma - self.config.extra.karma) ..
" / " ..
-self.config.extra.karma,
colour = G.C.GREEN,
}
) )
if extra.karma < max_karma then if extra.karma < 0 then
return return
end end
G.jokers:change_size((extra.is_attuned and quota or extra.karma) * extra.jokers) G.jokers:change_size((extra.is_attuned and quota or (Jane.cry and extra.karma or 0)) * extra.jokers)
ascend() ascend()
end, end,
add_to_deck = function(_, card)
local extra = card.ability.extra
local _ = extra.karma > 0 and
(extra.is_attuning or extra.is_attuned) and
G.jokers:change_size(extra.karma * extra.jokers)
end,
remove_from_deck = function(_, card)
local extra = card.ability.extra
local _ = extra.karma > 0 and
(extra.is_attuning or extra.is_attuned) and
G.jokers:change_size(-extra.karma * extra.jokers)
end,
Bakery_can_use = function(_, card) Bakery_can_use = function(_, card)
return Jane.can_use() and not card.debuff return Jane.can_use() and not card.debuff
end, end,
@ -768,16 +818,10 @@ SMODS.Joker {
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
blueprint_compat = true, blueprint_compat = true,
cost = 1, cost = 2,
rarity = "jane_junk", rarity = "jane_junk",
in_pool = function(_, _) in_pool = function()
for _, v in pairs(SMODS.find_card("j_jane_honey")) do return true, {allow_duplicates = true}
if tonumber(v.ability.extra.level) == #Jane.rarity_ids - 1 then
return true
end
end
return not not next(SMODS.find_card("j_jane_rot"))
end, end,
calculate = Jane.cry and function(_, card, context) calculate = Jane.cry and function(_, card, context)
local function has_room() local function has_room()