Compare commits

...

41 commits
1.7.14 ... main

Author SHA1 Message Date
bb05a0512b
Nerf Saint 2026-06-26 16:50:28 +02:00
8122036a55
Buff Saint 2026-06-26 14:28:28 +02:00
3cf0a17c45
Simplify Attuned Saint to be a passive ability 2026-06-26 01:58:28 +02:00
67f6ca08f5
Remove outdated info queue 2026-06-24 16:44:44 +02:00
9175f9bb7f
Simplify The Saint 2026-06-24 16:16:48 +02:00
3e679120e0
Tweak number 2026-06-24 01:09:19 +02:00
5931aa264b
Clarify 2026-06-24 01:01:28 +02:00
0b5560d019
Nerf Jumbo playing cards on non-Cryptid 2026-06-24 00:38:40 +02:00
6f7aac1234
Tweak number 2026-06-24 00:14:05 +02:00
7dfc8671e4
Make Gourmand quiet 2026-06-23 23:52:24 +02:00
31669e6b0c
Re-add bonus chips from Jumbo 2026-06-23 22:09:00 +02:00
0f0ec63819
Improve Jumbo hand sorting 2026-06-23 22:03:28 +02:00
4640b21403
Fix Jumbo card size not being applied on reload 2026-06-23 21:56:02 +02:00
5f28cc3d36
Nerf Jumbo sell value 2026-06-23 21:53:56 +02:00
2af1d9be76
Swap Gourmand and Rivulet, but with a twist 2026-06-23 21:43:37 +02:00
65fd36476a
Ban Frozen from appearing via Rivulet 2026-06-23 21:22:12 +02:00
1db153664f
Tweak number 2026-06-23 21:15:05 +02:00
40e8d4086b
Allow Saint to remove Eternal stickers from Frozen cards 2026-06-23 21:05:21 +02:00
ced0a9ab08
Make Saint progression take more effort 2026-06-23 19:10:24 +02:00
d3193af581
Completely Rework Saint, Buff Moire, Fix Artificer 2026-06-23 18:52:55 +02:00
f76e4fe160
Rebalance on Omega Deck 2026-06-22 21:42:49 +02:00
618474b080
Merge branch 'main' of https://git.emik.dev/emik/Jane 2026-06-21 21:16:42 +02:00
ef007afc55
Allow tokens to appear if only its Tier 2 Voucher is obtained 2026-06-21 21:15:24 +02:00
12ae6ff798
Allow tokens to appear if only its Tier 2 Voucher is obtained 2026-06-21 21:11:34 +02:00
2086d386d8
Ban discarding effects 2026-06-21 12:26:26 +02:00
8b00262f22
Add new challenge 2026-06-20 12:20:45 +02:00
cb4262093d
Fix OBOB 2026-06-18 16:22:13 +02:00
e9f1050dc2
Update label aggressively 2026-06-17 13:30:41 +02:00
0e47de546b
Improve localization 2026-06-17 12:43:03 +02:00
70895b77e8
Fix Survivor edgecase, Improve Escapey 2026-06-17 09:47:40 +02:00
050289d7bf
Buff Hunter cost 2026-06-16 23:39:17 +02:00
507f6dbdff
Add ambience 2026-06-15 22:26:29 +02:00
18624dc29f
Increase song priority 2026-06-15 21:06:28 +02:00
0145e774a5
Remove hard dependency 2026-06-15 17:17:22 +02:00
a6e349fb57
Buff Omega 2026-06-12 23:01:47 +02:00
7786ca2a8f
Improve compatibility 2026-06-11 13:49:46 +02:00
7d6288e59f
Tweak numbers 2026-06-10 13:02:13 +02:00
ee984ed5f3
Resize Jumbo 2026-06-10 04:40:49 +02:00
1e2ec5f67c
Hottestfix 2026-06-10 04:06:32 +02:00
fc58d49867
Hotterfix 2026-06-10 04:04:53 +02:00
7d1ff51525
Hotfix 2026-06-10 04:04:16 +02:00
15 changed files with 267 additions and 180 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -42,12 +42,44 @@ match_indent = true
target = "functions/misc_functions.lua" target = "functions/misc_functions.lua"
pattern = "local AC = G.SETTINGS.ambient_control" pattern = "local AC = G.SETTINGS.ambient_control"
position = "before" position = "before"
payload = '''if Jane and (type(G.ARGS.score_intensity.required_score) == "table" and G.ARGS.score_intensity.required_score:to_number() or G.ARGS.score_intensity.required_score) ~= 0 then payload = '''if Jane and
(type(G.ARGS.score_intensity.required_score) == "table" and
G.ARGS.score_intensity.required_score:to_number() or
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 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
Jane.sinister = (G.ARGS.score_intensity.earned_score / (big(base) ^ big(expo))):to_number() > 1 local ratio = (G.ARGS.score_intensity.earned_score / (big(base) ^ big(expo))):to_number()
Jane.sinister = ratio > 1
G.ARGS.score_intensity.ambientSurreal4 =
(break_infinity 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.ambientSurreal3 =
(G.ARGS.score_intensity.ambientSurreal4 == 0 and
number_format(G.ARGS.score_intensity.earned_score):find("#")) and 1 or 0
G.ARGS.score_intensity.ambientSurreal2 =
(G.ARGS.score_intensity.ambientSurreal3 == 0 and
G.ARGS.score_intensity.ambientSurreal4 == 0 and
(G.ARGS.score_intensity.earned_score /
(Cryptid and
big(G.ARGS.score_intensity.required_score) ^
big(G.ARGS.score_intensity.required_score) ^
big(G.ARGS.score_intensity.required_score) or
big(2) ^ big(G.ARGS.score_intensity.required_score)
)
):to_number() > 1
) and 1 or 0
G.ARGS.score_intensity.ambientSurreal1 =
(Jane.sinister and
G.ARGS.score_intensity.ambientSurreal2 == 0 and
G.ARGS.score_intensity.ambientSurreal3 == 0 and
G.ARGS.score_intensity.ambientSurreal4 == 0) and 1 or 0
end''' end'''
match_indent = true match_indent = true
@ -57,7 +89,7 @@ target = "functions/state_events.lua"
pattern = "for _, v in ipairs(SMODS.get_card_areas('playing_cards')) do" pattern = "for _, v in ipairs(SMODS.get_card_areas('playing_cards')) do"
position = "after" position = "after"
payload = '''if v == G.hand and not (G.GAME.blind and G.GAME.blind.name == "The Card" and not G.GAME.blind.disabled) and next(SMODS.find_card("j_jane_survivor")) then payload = '''if v == G.hand and not (G.GAME.blind and G.GAME.blind.name == "The Card" and not G.GAME.blind.disabled) and next(SMODS.find_card("j_jane_survivor")) then
if Cryptid then if Jane.cry then
for _, v in ipairs(G.hand.cards) do for _, v in ipairs(G.hand.cards) do
local area = {cards = {v}} local area = {cards = {v}}
SMODS.calculate_main_scoring({cardarea = area, full_hand = area.cards, scoring_hand = area.cards, scoring_name = text, poker_hands = poker_hands}, area.cards) SMODS.calculate_main_scoring({cardarea = area, full_hand = area.cards, scoring_hand = area.cards, scoring_name = text, poker_hands = poker_hands}, area.cards)
@ -171,7 +203,8 @@ self.jokers = CardArea(
CAI.joker_W+CAI.consumeable_W, CAI.joker_W+CAI.consumeable_W,
CAI.joker_H, CAI.joker_H,
{card_limit = (self.GAME.starting_params.joker_slots + {card_limit = (self.GAME.starting_params.joker_slots +
self.GAME.starting_params.consumable_slots - 1) * self.GAME.starting_params.consumable_slots -
(G.GAME.modifiers.jane_spacious_omega and 0 or 1)) *
(G.GAME.modifiers.alt_jane_spacious and 2 or 1), (G.GAME.modifiers.alt_jane_spacious and 2 or 1),
type = 'joker', type = 'joker',
highlight_limit = 1e100 highlight_limit = 1e100
@ -225,3 +258,16 @@ if G.GAME.modifiers.jane_spacious then
t = {G.jokers, G.vouchers} t = {G.jokers, G.vouchers}
end''' end'''
match_indent = true match_indent = true
[[patches]]
[patches.pattern]
target = "functions/misc_functions.lua"
pattern = "ambientOrgan1 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.6*(G.SETTINGS.SOUND.music_volume + 100)/200*(G.ARGS.score_intensity.organ) end},"
position = "after"
payload = '''
jane_ambientSurreal1 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.6*(G.SETTINGS.SOUND.music_volume + 80)/200*((G.ARGS.score_intensity.ambientSurreal1 or 0) * 1.4) end},
jane_ambientSurreal2 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.6*(G.SETTINGS.SOUND.music_volume + 90)/200*((G.ARGS.score_intensity.ambientSurreal2 or 0) * 1.6) end},
jane_ambientSurreal3 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.6*(G.SETTINGS.SOUND.music_volume + 100)/200*((G.ARGS.score_intensity.ambientSurreal3 or 0) * 1.8) end},
jane_ambientSurreal4 = {volfunc = function(_prev_volume) return _prev_volume*(1 - dt) + dt*0.6*(G.SETTINGS.SOUND.music_volume + 110)/200*((G.ARGS.score_intensity.ambientSurreal4 or 0) * 2) end},
'''
match_indent = true

View file

@ -13,11 +13,10 @@
"dependencies": [ "dependencies": [
"Steamodded (>=1.0.0~BETA-1606b)", "Steamodded (>=1.0.0~BETA-1606b)",
"Lovely (>=0.6)", "Lovely (>=0.6)",
"Bakery (>=3.2.0~*)", "Bakery (>=3.2.0~*)"
"Roland (>=2.8.0~*)"
], ],
"conflicts": [ "conflicts": [
"Jen" "Jen"
], ],
"version": "1.7.14" "version": "1.11.0"
} }

View file

@ -153,7 +153,7 @@ local rain_world_jokers = {
"j_jane_monk", "j_jane_monk",
"j_jane_survivor", "j_jane_survivor",
"j_jane_spearmaster", "j_jane_spearmaster",
"j_jane_rivulet", "j_jane_gourmand",
"j_jane_saint", "j_jane_saint",
} }
@ -631,6 +631,7 @@ back {
text = { text = {
"{C:attention}Joker {}and {C:attention}Consumable", "{C:attention}Joker {}and {C:attention}Consumable",
"slots are {C:attention}combined", "slots are {C:attention}combined",
"{C:attention}-1 {}Slot",
}, },
}, },
alt_loc_txt = { alt_loc_txt = {
@ -689,12 +690,13 @@ back {
apply_orrery() apply_orrery()
G.GAME.modifiers.jane_spacious = true G.GAME.modifiers.jane_spacious = true
G.GAME.used_vouchers.v_omen_globe = true G.GAME.used_vouchers.v_omen_globe = true
G.GAME.modifiers.jane_spacious_omega = true
G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1 G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1
Jane.q(function() Jane.q(function()
add_rain_world_joker()
local wee = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_wee", "weeck") local wee = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_wee", "weeck")
G.jokers:emplace(wee) G.jokers:emplace(wee)
add_rain_world_joker()
G.GAME.tortoise = true G.GAME.tortoise = true
G.GAME.obsidian = true G.GAME.obsidian = true
G.GAME.mysterious = true G.GAME.mysterious = true
@ -713,6 +715,7 @@ back {
end end
end, end,
calculate = function(_, _, context) calculate = function(_, _, context)
rebalance_orrery()
G.GAME.mysterious = nil G.GAME.mysterious = nil
if Jane.is_end_of_ante(context) then if Jane.is_end_of_ante(context) then

View file

@ -10,17 +10,36 @@ local rain_world_jokers = {
"j_jane_rot", "j_jane_rot",
} }
local is_rain_world_joker = {} local is_rain_world_joker, survival = {}, {}
for _, v in pairs(rain_world_jokers) do for _, v in pairs(rain_world_jokers) do
is_rain_world_joker[v] = true is_rain_world_joker[v] = true
end end
Jane.q(function()
for gk, g in pairs(G.localization.descriptions) do
for ck, c in pairs((type(g) == "table" and not ({Back = true, Sleeve = true})[gk]) and g or {}) do
for _, text in pairs((type(c) == "table" and type(c.text) == "table" and G.P_CENTERS[ck]) and c.text or {}) do
if type(text) == "string" and (text:find("discard") or text:find("Discard")) then
survival[#survival + 1] = {id = ck}
break
end
end
end
end
end, nil, nil, nil, nil, false, true)
SMODS.Challenge {
key = "survival",
loc_txt = {name = "Survival"},
jokers = {{id = "j_jane_survivor"}},
rules = {modifiers = {{id = "discards", value = 0}}},
restrictions = {banned_cards = survival},
}
SMODS.Challenge { SMODS.Challenge {
key = "downpour", key = "downpour",
loc_txt = { loc_txt = {name = "Downpour"},
name = "Downpour",
},
rules = {custom = {{id = "jane_downpour1"}, {id = "jane_downpour2"}, {id = "jane_downpour3"}}}, rules = {custom = {{id = "jane_downpour1"}, {id = "jane_downpour2"}, {id = "jane_downpour3"}}},
apply = function(_) apply = function(_)
for _, v in ipairs(rain_world_jokers) do for _, v in ipairs(rain_world_jokers) do

View file

@ -119,12 +119,19 @@ local jumbo = SMODS.Edition({
Jane.misprintize(card, {min = jumbo_modifier, max = jumbo_modifier}, nil, true) Jane.misprintize(card, {min = jumbo_modifier, max = jumbo_modifier}, nil, true)
if (card.ability or {}).bonus and (card.base or {}).nominal then
card.ability.bonus = card.ability.bonus + card.base.nominal
end
if card.added_to_deck then if card.added_to_deck then
card:add_to_deck() card:add_to_deck()
end end
Jane.resize(card, Jane.config.wee_sizemod) Jane.resize(card, Jane.config.wee_sizemod)
end, end,
on_load = function(card)
Jane.resize(card, Jane.config.wee_sizemod)
end,
on_remove = function(card) on_remove = function(card)
if not card.Jane_jumbo then if not card.Jane_jumbo then
return return
@ -139,6 +146,10 @@ local jumbo = SMODS.Edition({
Jane.misprintize(card, {min = 1 / jumbo_modifier, max = 1 / jumbo_modifier}, nil, true) Jane.misprintize(card, {min = 1 / jumbo_modifier, max = 1 / jumbo_modifier}, nil, true)
if (card.ability or {}).bonus and (card.base or {}).nominal then
card.ability.bonus = card.ability.bonus - card.base.nominal
end
if was_added then if was_added then
card:add_to_deck() card:add_to_deck()
end end
@ -147,7 +158,7 @@ local jumbo = SMODS.Edition({
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 = 5,
extra_cost = 5, extra_cost = 2,
in_shop = true, in_shop = true,
shader = false, shader = false,
apply_to_float = false, apply_to_float = false,
@ -160,13 +171,21 @@ function Card:set_ability(...)
local is_jumbo = self.edition and self.edition.jane_jumbo local is_jumbo = self.edition and self.edition.jane_jumbo
if is_jumbo then if is_jumbo then
if Jane.cry then
jumbo.on_remove(self) jumbo.on_remove(self)
else
Jane.resize(self)
end
end end
local ret = orig_set_ability(self, ...) local ret = orig_set_ability(self, ...)
if is_jumbo then if is_jumbo then
if Jane.cry then
jumbo.on_apply(self) jumbo.on_apply(self)
else
Jane.resize(self, Jane.config.wee_sizemod)
end
end end
return ret return ret
@ -184,14 +203,13 @@ SMODS.Edition({
}, },
config = {e_chips = Jane.cry and 0.8 or 0.9, e_mult = Jane.cry and 1.2 or 1.1}, 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}, sound = {sound = "jane_e_moire", per = 1, vol = 0.7},
weight = 2, weight = 1,
extra_cost = 10, extra_cost = 10,
in_shop = true, in_shop = true,
shader = "moire", shader = "moire",
in_pool = allow_moire,
apply_to_float = false, apply_to_float = false,
get_weight = function(self) get_weight = function(self)
return G.GAME.edition_rate * self.weight * (allow_moire() and 1 or 0) return G.GAME.edition_rate * self.weight * (allow_moire() and 20 or 2)
end, end,
loc_vars = function(self, _, _) loc_vars = function(self, _, _)
return {vars = {self.config.e_chips, self.config.e_mult}} return {vars = {self.config.e_chips, self.config.e_mult}}

View file

@ -138,6 +138,20 @@ local escapey_quotes = {
}, },
} }
local function escapey_button_text(card)
if card.debuff then
return "DEBUFFED"
end
for _, v in ipairs(G.consumeables.cards) do
if destructible(v) then
return "CONSUME"
end
end
return "ESCAPE"
end
local esc = SMODS.Joker { local esc = SMODS.Joker {
key = "escapey", key = "escapey",
atlas = "janeescapey", atlas = "janeescapey",
@ -154,7 +168,7 @@ local esc = SMODS.Joker {
"{C:inactive,s:0.75,E:1}#5#{C:red,s:1.5,E:1}#6#", "{C:inactive,s:0.75,E:1}#5#{C:red,s:1.5,E:1}#6#",
}, },
}, },
config = {extra = {money = 2, xmoney = 2, max = Jane.cry and 2000 or 200}}, config = {extra = {money = 2, xmoney = 2, max = 200, escape_label = "ESCAPE"}},
attributes = {"destroy_card", "economy", "tag"}, attributes = {"destroy_card", "economy", "tag"},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
sinis = {x = 2, y = 0}, sinis = {x = 2, y = 0},
@ -175,6 +189,12 @@ local esc = SMODS.Joker {
return {vars = {extra.xmoney, number_format(extra.max), extra.money, normal[1], normal[2], scared}} return {vars = {extra.xmoney, number_format(extra.max), extra.money, normal[1], normal[2], scared}}
end, end,
calculate = function(_, card)
local extra = card.ability.extra
local label = extra.escape_label
extra.escape_label = escapey_button_text(card)
local _ = label ~= extra.escape_label and Bakery_API.rehighlight(card)
end,
Bakery_can_use = function(_, card) Bakery_can_use = function(_, card)
if not Jane.can_use() or card.debuff then if not Jane.can_use() or card.debuff then
return false return false
@ -193,7 +213,7 @@ local esc = SMODS.Joker {
return false return false
end, end,
Bakery_use_button_text = function(_, card) Bakery_use_button_text = function(_, card)
return card.debuff and "DEBUFFED" or "ESCAPE" return card.ability.extra.escape_label
end, end,
Bakery_use_joker = function(self, card) Bakery_use_joker = function(self, card)
if card.debuff then if card.debuff then
@ -235,9 +255,9 @@ local esc = SMODS.Joker {
end end
end end
local scaling = Jane.cry and G.GAME.dollars or math.min(G.GAME.dollars, extra.max) local tag_money = Jane.cry and G.GAME.dollars or math.min(G.GAME.dollars, extra.max)
local tags = scaling * (math.pow(extra.xmoney, xtimes) - 1) local tag_times = Jane.cry and math.pow(extra.xmoney, xtimes) - 1 or xtimes
ease_dollars(math.ceil(times * extra.money + tags)) ease_dollars(math.ceil(times * extra.money + tag_money * tag_times))
end, end,
tag_threshold = 30, tag_threshold = 30,
} }
@ -383,7 +403,7 @@ SMODS.Joker {
cost = 8, cost = 8,
rarity = 3, rarity = 3,
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
local level = tonumber(card.ability.extra.level) local level = tonumber(card.ability.extra.level) or 1
local function level_name(i) local function level_name(i)
local acc = "" local acc = ""
@ -427,12 +447,12 @@ SMODS.Joker {
update = function(_, card, _) update = 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) > 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})
card.children.floating_sprite:set_sprite_pos({x = Jane.sinister and 2 or 1, y = y}) card.children.floating_sprite:set_sprite_pos({x = Jane.sinister and 2 or 1, y = y})
end end
local level = tonumber(card.ability.extra.level) local level = tonumber(card.ability.extra.level) or 1
if not Jane.sinister and level > 2 then if not Jane.sinister and level > 2 then
card:juice_up(0, math.random() * (level - 2) / #Jane.rarity_ids) card:juice_up(0, math.random() * (level - 2) / #Jane.rarity_ids)
@ -450,7 +470,7 @@ function SMODS.poll_rarity(_pool_key, _rand_key)
local max = 0 local max = 0
for _, v in pairs(SMODS.find_card("j_jane_honey")) do for _, v in pairs(SMODS.find_card("j_jane_honey")) do
max = v.debuff and max or math.max(max, tonumber(v.ability.extra.level)) max = v.debuff and max or math.max(max, tonumber(v.ability.extra.level) or 1)
end end
local rarity = orig_rarity(_pool_key, _rand_key) local rarity = orig_rarity(_pool_key, _rand_key)

View file

@ -1,8 +1,8 @@
Jane = { Jane = {
cry = not not G.P_CENTERS.j_cry_m, cry = not not G.P_CENTERS.j_cry_m,
config = { config = {
wee_sizemod = 1.25,
texture_pack = "default", texture_pack = "default",
wee_sizemod = math.sqrt(2),
bans = {"j_cry_crustulum", "c_cry_hammerspace"}, bans = {"j_cry_crustulum", "c_cry_hammerspace"},
}, },
} }
@ -199,13 +199,14 @@ function Jane.resize(card, mod)
end end
end end
function Jane.q(func, delay, timer, trigger, blockable, blocking) function Jane.q(func, delay, timer, trigger, blockable, blocking, no_delete)
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
delay = delay, delay = delay,
timer = timer, timer = timer,
trigger = (delay and not trigger) and "after" or trigger, trigger = (delay and not trigger) and "after" or trigger,
blocking = blocking, blocking = blocking,
blockable = blockable, blockable = blockable,
no_delete = no_delete,
func = function(...) func = function(...)
local ret = func(...) local ret = func(...)
return ret == nil and true or ret return ret == nil and true or ret
@ -213,6 +214,20 @@ function Jane.q(func, delay, timer, trigger, blockable, blocking)
})) }))
end end
if false then
---@type table?
Big = Big
---@type { aliases: { [string]: string } }?
Cryptid = Cryptid
---@type { config_file: { break_infinity: boolean, disable_anims: boolean }? }?
Talisman = Talisman
---@type fun(any): boolean
_G.is_number = _G.is_number
end
local orig_can_highlight = CardArea.can_highlight local orig_can_highlight = CardArea.can_highlight
function CardArea:can_highlight(...) function CardArea:can_highlight(...)
@ -302,7 +317,7 @@ function Game:update(dt)
local ante = G.GAME.round_resets.ante local ante = G.GAME.round_resets.ante
local blind = get_blind_amount((ante >= 1 and ante <= 8) and math.floor(ante) or 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_wee"].mult = 22 / blind
G.P_BLINDS["bl_jane_descending"].mult = math.floor(8 * math.sqrt(blind)) / blind G.P_BLINDS["bl_jane_descending"].mult = math.ceil(8 * math.sqrt(blind)) / blind
Jane.update_honey() Jane.update_honey()
if not Jane.bans_done then if not Jane.bans_done then
@ -349,6 +364,10 @@ SMODS.Atlas {
path = Jane.config.texture_pack .. "/c_jane_acc.png", path = Jane.config.texture_pack .. "/c_jane_acc.png",
} }
for i = 1, 4 do
SMODS.Sound({key = "ambientSurreal" .. i, path = "ambient_surreal" .. i .. ".ogg"})
end
for _, v in ipairs({ for _, v in ipairs({
"back", "back",
"blind", "blind",

View file

@ -137,6 +137,7 @@ function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack,
(k == "h_x_chips" and not Jane.cry) and not (k == "h_x_chips" and not Jane.cry) and not
(k == "id") and not (k == "id") and not
(k == "colour") and not (k == "colour") and not
(k == "nominal") and not
(k == "suit_nominal") and not (k == "suit_nominal") and not
(k == "base_nominal") and not (k == "base_nominal") and not
(k == "face_nominal") and not (k == "face_nominal") and not

View file

@ -12,7 +12,7 @@ SMODS.Sound({
select_music_track = function() select_music_track = function()
for _, v in pairs(SMODS.find_card("j_jane_saint")) do for _, v in pairs(SMODS.find_card("j_jane_saint")) do
if v.ability.extra.is_attuned then if v.ability.extra.is_attuned then
return Jane.sinister and -1 / 0 or 10 return 201
end end
end end
@ -25,9 +25,13 @@ SMODS.Sound({
path = "music_attuned_sinister.ogg", path = "music_attuned_sinister.ogg",
volume = 1, volume = 1,
select_music_track = function() select_music_track = function()
if not Jane.sinister then
return -1 / 0
end
for _, v in pairs(SMODS.find_card("j_jane_saint")) do for _, v in pairs(SMODS.find_card("j_jane_saint")) do
if v.ability.extra.is_attuned then if v.ability.extra.is_attuned then
return Jane.sinister and 10 or -1 / 0 return 202
end end
end end
@ -144,10 +148,9 @@ SMODS.Joker {
loc_txt = { loc_txt = {
name = "The Hunter", name = "The Hunter",
text = { text = {
"{E:1}Succumbs to the", "{E:1}Succumbs to the {X:black,C:white,E:1}Rot{},",
"{X:black,C:white,E:1}Rot{}, creating", (Jane.cry and "creating an {C:spectral}Empowered" or "creating a {C:dark_edition}Negative"),
(Jane.cry and "an {C:spectral}Empowered Tag" or "a {C:dark_edition}Negative {C:spectral}Soul"), (Jane.cry and "{C:spectral}Tag" or "{C:spectral}Soul") .. " {}after #1#",
"after #1#",
}, },
}, },
config = {extra = {rounds_left = hunter[1]}}, config = {extra = {rounds_left = hunter[1]}},
@ -272,22 +275,16 @@ SMODS.Joker {
atlas = "janegourmand", atlas = "janegourmand",
loc_txt = { loc_txt = {
name = "The Gourmand", name = "The Gourmand",
text = { text = {"All cards are {C:dark_edition}Jumbo"},
"Values on {C:attention}consumables",
"are {C:attention}" .. (Jane.cry and "multiplied" or "added") .. "{} by {C:attention}#1#" .. (Jane.cry and "" or "{} when"),
(Jane.cry and "when " or "") .. "they are created",
"{C:inactive}(If possible)",
}, },
},
loc_vars = function(_, _, center)
return {vars = {center.ability.modifier}}
end,
config = {modifier = Jane.cry 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,
cost = 8, cost = 20,
rarity = 3, rarity = 4,
loc_vars = function(_, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS.e_jane_jumbo
end,
} }
local function add_to_consumable_ability_by(n) local function add_to_consumable_ability_by(n)
@ -341,14 +338,14 @@ local orig_set_ability = Card.set_ability
function Card:set_ability(center, initial, delay_sprites) function Card:set_ability(center, initial, delay_sprites)
orig_set_ability(self, center, initial, delay_sprites) orig_set_ability(self, center, initial, delay_sprites)
if next(SMODS.find_card("j_jane_gourmand")) and if next(SMODS.find_card("j_jane_rivulet")) and
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
if Jane.cry then if Jane.cry or not ((SMODS.Mods.Roland or {}).qol or {})[1] then
local mod = 1 local mod = 1
for _, v in pairs(SMODS.find_card("j_jane_gourmand")) do for _, v in pairs(SMODS.find_card("j_jane_rivulet")) do
mod = mod * v.ability.modifier mod = mod * v.ability.modifier
end end
@ -356,7 +353,7 @@ function Card:set_ability(center, initial, delay_sprites)
else else
local mod = 0 local mod = 0
for _, v in pairs(SMODS.find_card("j_jane_gourmand")) do for _, v in pairs(SMODS.find_card("j_jane_rivulet")) do
mod = mod + v.ability.modifier mod = mod + v.ability.modifier
end end
@ -380,10 +377,14 @@ SMODS.Joker {
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}}, config = {extra = {uses = 2}},
eternal_compat = false,
blueprint_compat = false, blueprint_compat = false,
cost = Jane.cry and 50 or 20, cost = Jane.cry and 50 or 7,
rarity = Jane.cry and exotic or 3, rarity = Jane.cry and exotic or 3,
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
card.ability = card.ability or {}
card.ability.extra = card.ability.extra or {}
card.ability.extra.uses = card.ability.extra.uses or 2
local uses = card.ability.extra.uses local uses = card.ability.extra.uses
return {vars = {uses, uses == 1 and "use" or "uses"}} return {vars = {uses, uses == 1 and "use" or "uses"}}
end, end,
@ -515,15 +516,21 @@ SMODS.Joker {
loc_txt = { loc_txt = {
name = "The Rivulet", name = "The Rivulet",
text = { text = {
"Non-{C:dark_edition}editioned{} cards are", "Values on {C:attention}consumables",
"given a random {C:dark_edition}Edition", "are {C:attention}" .. (Jane.cry and "multiplied" or "added") .. "{} by {C:attention}#1#" .. (Jane.cry and "" or "{} when"),
(Jane.cry and "when " or "") .. "they are created",
"{C:inactive}(If possible)",
}, },
}, },
config = {modifier = Jane.cry 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,
cost = 20, cost = 8,
rarity = 4, rarity = 3,
loc_vars = function(_, _, center)
return {vars = {center.ability.modifier}}
end,
} }
local orig_draw = Card.draw local orig_draw = Card.draw
@ -548,11 +555,11 @@ function Card:draw(layer)
if cen and if cen and
self.facing == "front" and self.facing == "front" and
self.config and self.config and
(self.added_to_deck or (self.area and self.area == G.hand)) and not (self.added_to_deck or (self.area and self.area == G.hand)) and
self.edition and not self.edition and
(self.area == G.consumeables or cen.set ~= "Booster") and (self.area == G.consumeables or cen.set ~= "Booster") and
next(SMODS.find_card("j_jane_rivulet")) then next(SMODS.find_card("j_jane_gourmand")) then
self:set_edition(poll_edition("rivulet_edition", nil, true, true)) self:set_edition("e_jane_jumbo", true, true)
end end
orig_draw(self, layer) orig_draw(self, layer)
@ -569,44 +576,28 @@ function Card:set_debuff(should_debuff)
end end
end end
local function attunement()
return (G.GAME or {}).weeckweeck and 2 or (Jane.cry and 1.002 or 1.25)
end
SMODS.Joker { SMODS.Joker {
key = "saint", key = "saint",
atlas = "janesaint", atlas = "janesaint",
loc_txt = { loc_txt = {
name = "The Saint{C:jane_RGB}#1#", name = {"{}", "#1#{C:jane_RGB,s:0.8}#2#", "{C:jane_RGB,s:1.6}#3#"},
text = Jane.cry and { text = {
"{C:attention}Use {}to toggle {X:legendary,C:white}Eternal{} stickers to the left", "{C:attention}Use {}to toggle itself or",
"{C:spectral}Analog{}, {C:spectral}Ankh{}, {C:spectral}Gateway{}, and", "other Jokers to its",
"{C:spectral,s:0.95}Summoning {s:0.95}will {C:attention,s:0.95}not destroy Jokers", "left's {C:legendary}Eternal{} sticker",
"{C:jane_RGB}#2#{}#3#{X:black,C:jane_RGB,s:1.5}#4#{C:spectral}#5#{C:mult}#6#", "{C:attention}#4#{}#5#{C:spectral}#6#{}#7#",
"{C:inactive,s:1.25}#7#{C:attention,s:1.25}#8#{C:inactive,s:1.25}#9#{C:inactive}#10#", "{C:inactive,s:1.25}#8#{C:attention,s:1.25}#9#{C:inactive,s:1.25}#10#",
} or { Jane.cry and "{C:inactive}(Gateway has no downside)" or nil,
"{C:attention}Use {}to toggle {X:legendary,C:white}Eternal{} stickers to the left",
"{C:jane_RGB}#2#{}#3#{C:dark_edition}#4#{C:spectral}#5#",
"{C:inactive,s:1.25}#6#{C:attention,s:1.25}#7#{C:inactive,s:1.25}#8#{C:inactive}#9#",
}, },
}, },
config = {extra = {karma = 0, max_karma = Jane.cry and 10 or 2}}, config = {extra = {changes_editions = false, jokers = Jane.cry and 10 or 1, karma = 0, max_karma = Jane.cry and 10 or 3}},
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, blueprint_compat = true,
loc_vars = function(_, info_queue, card) loc_vars = function(_, info_queue, card)
if Jane.cry then info_queue[#info_queue + 1] = Jane.cry and G.P_CENTERS.c_cry_gateway or nil
info_queue[#info_queue + 1] = G.P_CENTERS.c_cry_analog
end
info_queue[#info_queue + 1] = Jane.cry and G.P_CENTERS.c_ankh or nil
info_queue[#info_queue + 1] = Jane.cry and G.P_CENTERS.c_cry_gateway or G.P_CENTERS.c_soul
if Jane.cry then
info_queue[#info_queue + 1] = G.P_CENTERS.c_cry_summoning
end
local extra = card.ability.extra local extra = card.ability.extra
local karma = extra.karma local karma = extra.karma
@ -614,36 +605,26 @@ SMODS.Joker {
local attuned = karma >= max_karma local attuned = karma >= max_karma
return { return {
vars = Jane.cry and { vars = {
attuned and " (Attuned)" or "", attuned and "" or "The Saint",
attuned and "The" or "",
attuned and "Attuned" or "",
attuned and "" or "Attune ", attuned and "" or "Attune ",
attuned and "" or "after using ", attuned and "" or "at ",
attuned and "^^" .. attunement() or max_karma, attuned and (Jane.cry and "Gateways " or "Spectrals ") or
attuned and "" or " Gateways", max_karma .. (Jane.cry and " Gateways" or " Spectrals"),
attuned and " Mult" or "", attuned and "add Joker slots" or "",
attuned and "" or "[", attuned and "[Currently " or "[",
attuned and "" or karma, attuned and "+" .. karma or karma,
attuned and "" or " / " .. max_karma .. "]", attuned and "]" or " / " .. max_karma .. "]",
attuned and "(Cannot be debuffed)" or "",
} or {
attuned and " (Attuned)" or "",
attuned and "" or "Attune ",
attuned and "Boosts cards with " or "after using ",
attuned and "editions" or max_karma,
attuned and "" or " Ankh or Soul Cards",
attuned and "" or "[",
attuned and "" or karma,
attuned and "" or " / " .. max_karma .. "]",
attuned and "(Cannot be debuffed)" or "",
}, },
} }
end, end,
update = function(_, card, _) update = function(_, card, _)
card.debuff_immune = card.ability.extra.is_attuned if card.edition and card.edition.Roland_frozen then
card:set_edition("e_base")
if card.added_to_deck and card.children.center and card.children.floating_sprite then elseif card.children.floating_sprite then
local extra = card.ability.extra 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 = extra.is_attuned and 2 or 1, y = 0})
end end
end, end,
calculate = function(_, card, context) calculate = function(_, card, context)
@ -685,49 +666,9 @@ SMODS.Joker {
end, 1) end, 1)
end end
if extra.is_attuned then if extra.karma >= max_karma then
card.debuff = false local karma = (extra.is_attuning or extra.is_attuned) and 0 or extra.karma
G.jokers:change_size(karma * extra.jokers)
if card.ability then
card.ability.perishable = false
card.ability.perish_tally = 1e9
end
if Jane.cry and not context.joker_main then
return
end
if not Jane.cry and not context.other_joker and (not context.individual or context.cardarea ~= G.play) then
return
end
local attune = attunement()
local trigger = ({
e_holo = {mult = 50},
e_foil = {chips = 250},
e_polychrome = {x_mult = 2.5},
e_jane_polygloss = {
mult = 10,
x_mult = 2,
chips = 100,
p_dollars = 10,
},
e_jane_moire = {
colour = G.C.jane_RGB,
sound = "talisman_eeechip",
EEchip_mod = Jane.cry and attune or nil,
[Jane.cry and "EEmult_mod" or "Emult_mod"] = attune,
message = (Jane.cry and "^^" or "^") .. attune .. (Jane.cry and " Chips & Mult" or ""),
},
})[Jane.cry and "e_jane_moire" or ((context.other_card or context.other_joker or {}).edition or {}).key]
if trigger then
trigger.card = card
end
return trigger
elseif extra.karma >= max_karma then
ascend() ascend()
end end
@ -738,9 +679,9 @@ SMODS.Joker {
return return
end end
local key = context.consumeable:gc().key local gc = context.consumeable:gc()
if Jane.cry and key ~= "c_cry_gateway" or not Jane.cry and (key ~= "c_ankh" and key ~= "c_soul") then if Jane.cry and gc.key ~= "c_cry_gateway" or not Jane.cry and gc.set ~= "Spectral" then
return return
end end
@ -756,7 +697,7 @@ SMODS.Joker {
{message = "+" .. quota .. " Karma", colour = G.C.PALE_GREEN} {message = "+" .. quota .. " Karma", colour = G.C.PALE_GREEN}
) )
card_eval_status_text( local _ = extra.karma <= max_karma and card_eval_status_text(
card, card,
"extra", "extra",
nil, nil,
@ -769,33 +710,49 @@ SMODS.Joker {
return return
end end
G.jokers:change_size((extra.is_attuned and quota or extra.karma) * extra.jokers)
ascend() ascend()
end, end,
Bakery_can_use = function(_, card) Bakery_can_use = function(_, card)
return not card.debuff and Jane.can_use() return Jane.can_use() and not card.debuff
end, end,
Bakery_use_joker = function(self, card) Bakery_use_joker = function(_, card)
if not self:Bakery_can_use(card) then for joker_index = 1, math.max(card.rank - 1, 1) do
return local joker = G.jokers.cards[joker_index]
end
for k, v in ipairs(G.jokers.cards) do
if card == v then
for i = 1, math.max(k - 1, 1) do
local joker = G.jokers.cards[i]
joker:set_eternal(not joker.ability.eternal) joker:set_eternal(not joker.ability.eternal)
joker:juice_up()
if joker.Roland_frozen_ability then
joker.Roland_frozen_ability.eternal = joker.ability.eternal
end end
return if not card.ability.extra.changes_editions or
not card.ability.extra.is_attuned or
joker.ability.eternal then
joker:juice_up()
goto continue
end end
local edition = 1
for ii, vv in ipairs(joker.edition and G.P_CENTER_POOLS.Edition or {}) do
if vv.key == joker.edition.key then
edition = ii
break
end
end
local next = edition < #G.P_CENTER_POOLS.Edition and edition + 1 or 1
joker:set_edition(G.P_CENTER_POOLS.Edition[next].key)
::continue::
end end
end, end,
} }
if Cryptid and Cryptid.aliases then if Cryptid and Cryptid.aliases then
Cryptid.aliases["saint"] = "j_jane_saint" Cryptid.aliases["saint"] = "j_jane_saint"
Cryptid.aliases["attuned"] = "j_jane_saint"
Cryptid.aliases["the saint"] = "j_jane_saint" Cryptid.aliases["the saint"] = "j_jane_saint"
Cryptid.aliases["the attuned"] = "j_jane_saint"
end end
SMODS.Joker { SMODS.Joker {

View file

@ -183,8 +183,8 @@ SMODS.Consumable {
loc_txt = { loc_txt = {
name = "Shadows", name = "Shadows",
text = { text = {
"Create {C:attention}#1#{} {C:green}random {C:dark_edition}Negative", "Create {C:attention}#1#{} random {C:dark_edition}Negative",
"{C:attention}Perishable {C:attention}Jokers{}, set {C:money}sell", "{C:attention}Perishable Jokers{}, set {C:money}sell",
"{C:money}value {}of {C:attention}all Jokers {}to {C:money}$0", "{C:money}value {}of {C:attention}all Jokers {}to {C:money}$0",
}, },
}, },
@ -255,7 +255,7 @@ SMODS.Consumable {
loc_txt = { loc_txt = {
name = "Obfuscation", name = "Obfuscation",
text = { text = {
"{C:green,E:1}Randomises{} all cards in hand", "{C:green,E:1}Randomizes{} all cards in hand",
"{C:inactive}(Rank, seal, edition,", "{C:inactive}(Rank, seal, edition,",
"{C:inactive}enhancement, and suit)", "{C:inactive}enhancement, and suit)",
}, },
@ -286,8 +286,8 @@ SMODS.Consumable {
loc_txt = { loc_txt = {
name = "Rift", name = "Rift",
text = { text = {
"{C:attention}Reset {}your deck to a", "{C:red}Reset {}your deck to a",
"{C:attention}standard 52-card deck", "standard 52-card deck",
}, },
}, },
pos = {x = 4, y = 4}, pos = {x = 4, y = 4},

View file

@ -100,7 +100,10 @@ for _, v in pairs({
atlas = "janetokens", atlas = "janetokens",
loc_txt = { loc_txt = {
name = v[2] .. " Token", name = v[2] .. " Token",
text = {"Creates a" .. (vowels[v[2]:sub(1, 1)] and "n" or "") .. " {C:attention}" .. v[2] .. " Tag"}, text = {
"Creates a" .. (vowels[v[2]:sub(1, 1)] and "n" or ""),
"{C:attention}" .. v[2] .. " Tag",
},
}, },
loc_vars = function(_, info_queue, _) loc_vars = function(_, info_queue, _)
info_queue[#info_queue + 1] = v[1] ~= "tag_cry_cat" and G.P_TAGS[v[1]] or nil info_queue[#info_queue + 1] = v[1] ~= "tag_cry_cat" and G.P_TAGS[v[1]] or nil
@ -112,7 +115,9 @@ for _, v in pairs({
can_divide = true, can_divide = true,
can_use = Jane.can_use, can_use = Jane.can_use,
in_pool = function(_, _) in_pool = function(_, _)
return G.GAME.used_vouchers.v_jane_token_voucher or G.GAME.modifiers.Roland_alt_swapper_deck return G.GAME.used_vouchers.v_jane_token_voucher or
G.GAME.used_vouchers.v_jane_token_voucher_plus or
G.GAME.modifiers.Roland_alt_swapper_deck
end, end,
use = function(_, _, _, _) use = function(_, _, _, _)
play_sound("jane_e_gilded", 1.25, 0.4) play_sound("jane_e_gilded", 1.25, 0.4)