Compare commits

..

No commits in common. "main" and "1.1.4" have entirely different histories.
main ... 1.1.4

20 changed files with 576 additions and 1038 deletions

View file

@ -20,11 +20,11 @@ continuation_indent = 4
# this mean utf8 length , if this is 'unset' then the line width is no longer checked
# this option decides when to chopdown the code
max_line_length = 120
max_line_length = lf
# optional crlf/lf/cr/auto, if it is 'auto', in windows it is crlf other platforms are lf
# in neovim the value 'auto' is not a valid option, please use 'unset'
end_of_line = lf
end_of_line = auto
# none/ comma / semicolon / only_kv_colon
table_separator_style = none

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

View file

@ -48,7 +48,6 @@ payload = '''if Jane and (type(G.ARGS.score_intensity.required_score) == "table"
local base = Cryptid and 10 or G.ARGS.score_intensity.required_score
local expo = Cryptid and G.ARGS.score_intensity.required_score or 10
Jane.sinister = (G.ARGS.score_intensity.earned_score / (big(base) ^ big(expo))):to_number() > 1
G.escapey_sinister = Jane.sinister
end'''
match_indent = true
@ -58,16 +57,11 @@ target = "functions/state_events.lua"
pattern = "for _, v in ipairs(SMODS.get_card_areas('playing_cards')) do"
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
if Cryptid then
for _, v in ipairs(G.hand.cards) do
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}, nil)
end
else
SMODS.calculate_main_scoring({cardarea = G.hand, full_hand = G.hand.cards, scoring_hand = G.hand.cards, scoring_name = text, poker_hands = poker_hands}, G.hand.cards)
SMODS.calculate_main_scoring({cardarea = G.hand, full_hand = G.hand.cards, scoring_hand = G.hand.cards, scoring_name = text, poker_hands = poker_hands}, nil)
end
else'''
match_indent = true
@ -128,27 +122,3 @@ pattern = '''hand_chips\*mult\)'''
position = "at"
payload = "Jane.get_chipmult_sum(hand_chips, mult))"
match_indent = true
[[patches]]
[patches.pattern]
target = '=[SMODS Cryptid "items/spectral.lua"]'
pattern = "local _first_dissolve = nil"
position = "after"
payload = 'deletable_jokers = next(SMODS.find_card("j_jane_saint")) and {} or deletable_jokers'
match_indent = true
[[patches]]
[patches.pattern]
target = '=[SMODS Cryptid "items/exotic.lua"]'
pattern = "local _first_dissolve = nil"
position = "after"
payload = 'deletable_jokers = next(SMODS.find_card("j_jane_saint")) and {} or deletable_jokers'
match_indent = true
[[patches]]
[patches.pattern]
target = '=[SMODS _ "src/utils.lua"]'
pattern = "function SMODS.has_enhancement(card, key)"
position = "after"
payload = "if not card.config then return false end"
match_indent = true

View file

@ -17,5 +17,5 @@
"conflicts": [
"Jen"
],
"version": "1.5.19"
"version": "1.1.4"
}

View file

@ -1 +0,0 @@
../../CardSleeves/

View file

@ -5,97 +5,9 @@ SMODS.Atlas {
path = Jane.config.texture_pack .. "/b_jane_decks.png",
}
SMODS.Atlas {
px = 73,
py = 95,
key = "janesleeves",
path = Jane.config.texture_pack .. "/sleeve_jane_sleeves.png",
}
local eternal_text = Cryptid and "Absolute" or "Eternal"
local function back(x)
local key = x.key
local apply = x.apply
local calculate = x.calculate
x.apply = function(...)
if apply and G.GAME.selected_sleeve ~= "sleeve_jane_" .. key then
return apply(...)
end
Jane.q(function()
save_run()
end)
end
x.calculate = function(...)
if calculate and G.GAME.selected_sleeve ~= "sleeve_jane_" .. key then
return calculate(...)
end
end
SMODS.Back(x)
local text = x.loc_txt.text
local name = x.loc_txt.name:gsub("Deck$", "Sleeve")
if not CardSleeves then
return
end
G.localization.descriptions.Sleeve = G.localization.descriptions.Sleeve or {}
G.localization.descriptions.Sleeve["sleeve_jane_" .. key .. "_alt"] = x.alt_loc_txt
CardSleeves.Sleeve {
key = key,
pos = x.pos,
atlas = "janesleeves",
loc_txt = {name = name, text = text},
apply = function(self, ...)
-- Game becomes genuinely unplayable if this is allowed.
-- if self.get_current_deck_key() == "b_jane_omega" and G.GAME.selected_sleeve == "sleeve_jane_omega" then
-- if apply then
-- apply(self, ...)
-- end
-- if x.alt_apply then
-- x.alt_apply(self, ...)
-- end
-- return
-- end
local a = (self.get_current_deck_key() == "b_jane_" .. key and x.alt_apply or apply)
if a then
a(self, ...)
end
Jane.q(function()
save_run()
end)
end,
calculate = function(self, ...)
-- Game becomes genuinely unplayable if this is allowed.
-- if self.get_current_deck_key() == "b_jane_omega" and G.GAME.selected_sleeve == "sleeve_jane_omega" then
-- if calculate then
-- calculate(self, ...)
-- end
-- if x.alt_calculate then
-- x.alt_calculate(self, ...)
-- end
-- return
-- end
local c = (self.get_current_deck_key() == "b_jane_" .. key and x.alt_calculate or calculate)
if c then
return c(self, ...)
end
end,
loc_vars = function(self, ...)
local ret = x.loc_vars and x.loc_vars(self, ...) or {}
ret.key = self.get_current_deck_key() == "b_jane_" .. key and self.key .. "_alt" or self.key
return ret
end,
}
end
back {
SMODS.Back {
key = "nitro",
atlas = "janedecks",
pos = {x = 1, y = 1},
@ -109,47 +21,33 @@ back {
Cryptid and "an {C:spectral,E:1}Empowered Tag" or "create a {C:dark_edition}Negative {C:spectral,E:1}Soul",
},
},
alt_loc_txt = {
name = "Jolt Sleeve",
text = {
Cryptid and "{C:attention}Ante number {}scales with {C:attention}square numbers" or "{C:attention}Ante increases twice{} as strong",
"After defeating the {C:attention}Small {}or {C:attention}Big Blind{},",
Cryptid and "create a {C:spectral,E:1}Empowered Tag" or "create a {C:dark_edition}Negative {C:spectral,E:1}Soul",
},
},
loc_vars = function(_, info_queue, _)
if info_queue then
info_queue[#info_queue + 1] = Cryptid and G.P_TAGS.tag_cry_empowered or G.P_CENTERS.c_soul
info_queue[#info_queue + 1] = Cryptid and G.P_CENTERS.c_cry_empowered or G.P_CENTERS.c_soul
end
return {vars = {}}
end,
alt_apply = function(_)
G.GAME.win_ante = Cryptid and G.GAME.win_ante * G.GAME.win_ante or G.GAME.win_ante * 4 - 1
G.GAME.alt_nitro = true
G.GAME.nitro = true
end,
apply = function(_)
G.GAME.win_ante = Cryptid and G.GAME.win_ante * (G.GAME.win_ante + 1) / 2 or G.GAME.win_ante * 2 - 1
G.GAME.nitro = true
end,
alt_calculate = function(_, _, context)
if context.end_of_round and not context.individual and not context.repetition and not context.retrigger_joker then
Jane.q(function()
Jane.empowered()
end)
end
end,
calculate = function(_, _, context)
if Jane.is_end_of_ante(context) then
trigger_effect = function(_, args)
if args.context == "eval" and G.GAME.last_blind and G.GAME.last_blind.boss then
Jane.q(function()
Jane.empowered()
return true
end)
end
end,
}
Jane.rain_world_jokers = {
local function add_rain_world_joker()
if not G.jokers then
return true
end
local candidates = {
"j_jane_monk",
"j_jane_survivor",
"j_jane_hunter",
@ -161,59 +59,45 @@ Jane.rain_world_jokers = {
"j_jane_rot",
}
local function add_rain_world_joker()
if not G.jokers then
return
end
local unobtained = {}
for _, v in pairs(Jane.rain_world_jokers) do
for _, v in pairs(candidates) do
if not next(SMODS.find_card(v, true)) then
unobtained[#unobtained + 1] = v
end
end
local chosen = pseudorandom_element(next(unobtained) and unobtained or Jane.rain_world_jokers,
pseudoseed("karma_deck"))
local chosen = pseudorandom_element(next(unobtained) and unobtained or candidates, pseudoseed("karma_deck"))
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, chosen, "karma_deck_next")
card:add_to_deck()
card:start_materialize()
G.jokers:emplace(card)
return true
end
back {
SMODS.Back {
key = "karma",
atlas = "janedecks",
pos = {x = 3, y = 0},
loc_txt = {
name = "Karma Deck",
text = {
"Start with a",
"{C:legendary}Rain World Joker",
"Start with a {C:legendary}Rain World Joker",
"Create another when",
"{C:attention}Boss Blind {}is defeated",
},
},
alt_loc_txt = {
name = "Ascension Sleeve",
text = {
"Create a {C:legendary}Rain World Joker",
"when {C:attention}Boss Blind {}is defeated",
},
},
alt_apply = function(_)
Jane.q(add_rain_world_joker)
end,
apply = function(_)
Jane.q(add_rain_world_joker)
G.E_MANAGER:add_event(Event({func = add_rain_world_joker}))
end,
alt_calculate = function(_, _, context)
if Jane.is_end_of_ante(context) then
trigger_effect = function(_, args)
if args.context == "eval" and G.GAME.last_blind and G.GAME.last_blind.boss then
add_rain_world_joker()
end
end,
}
back {
SMODS.Back {
key = "mysterious",
atlas = "janedecks",
pos = {x = 1, y = 0},
@ -226,45 +110,17 @@ back {
"to your possession",
},
},
alt_loc_txt = {
name = "Sleeve?",
text = {"{C:attention}Ante order {}is {C:green,E:1}randomized"},
},
alt_apply = function(_)
G.GAME.mysterious = true
G.GAME.alt_mysterious = {}
for i = G.GAME.round_resets.ante + 1, G.GAME.round_resets.ante + G.GAME.win_ante - 1 do
G.GAME.alt_mysterious[#G.GAME.alt_mysterious + 1] = {i}
end
pseudoshuffle(G.GAME.alt_mysterious, pseudoseed("mysterious_deck"))
end,
apply = function(_)
G.GAME.mysterious = true
end,
alt_calculate = function(_, _, context)
if context.setting_blind or context.skip_blind then
G.GAME.mysterious_init = true
end
end,
calculate = function(_, _, context)
if context.setting_blind or context.skip_blind then
G.GAME.mysterious_init = true
end
Jane.q(function()
save_run()
return true
end)
end,
}
local function redeem_omen_globe()
G.GAME.used_vouchers.v_omen_globe = true
G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1
Jane.q(function()
Card.apply_to_run(nil, G.P_CENTERS.v_omen_globe)
end)
end
back {
SMODS.Back {
key = "obsidian",
atlas = "janedecks",
pos = {x = 2, y = 1},
@ -276,13 +132,6 @@ back {
"Start run with {C:tarot}Omen Globe",
},
},
alt_loc_txt = {
name = "Bedrock Sleeve",
text = {
"{C:attention}Non-hidden {}cards do",
"not {C:attention}normally appear",
},
},
loc_vars = function(_, info_queue, _)
if info_queue then
info_queue[#info_queue + 1] = G.P_CENTERS.v_omen_globe
@ -290,48 +139,18 @@ back {
return {vars = {}}
end,
alt_apply = function(_)
G.GAME.alt_obsidian = true
G.GAME.obsidian = true
redeem_omen_globe()
end,
apply = function(_)
G.GAME.obsidian = true
redeem_omen_globe()
G.GAME.used_vouchers.v_omen_globe = true
G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1
Jane.q(function()
Card.apply_to_run(nil, G.P_CENTERS.v_omen_globe)
return true
end)
end,
}
local orig_get_current_pool = get_current_pool
---@diagnostic disable-next-line: lowercase-global
function get_current_pool(_type, ...)
local pool, pool_key = orig_get_current_pool(_type, ...)
if not G.GAME.alt_obsidian or not ({
Code = true,
Chess = true,
Tarot = true,
Planet = true,
Alphabet = true,
Spectral = true,
jane_tokens = true,
})[_type] then
return pool, pool_key
end
for k, _ in pairs(pool) do
pool[k] = "UNAVAILABLE"
end
for k, v in pairs(G.P_CENTERS) do
if type(v) == "table" and (v.name == "Black Hole" or v.name == "The Soul") or v.hidden then
pool[#pool + 1] = k
end
end
return pool, pool_key
end
local function apply_orrery()
Jane.q(function()
local orrery = {}
@ -344,84 +163,11 @@ local function apply_orrery()
end
save_run()
return true
end)
end
local function rebalance_orrery()
local function small(x)
return type(x) == "table" and x:to_number() or x
end
local function hand(name, chip, mul, lv, notif, snd, vol, pit, de)
local config = {
delay = de or 0.3,
pitch = pit or 0.8,
volume = vol or 0.7,
sound = type(snd) == "string" and snd or type(snd) == "nil" and "button",
}
local vals = {
level = lv or "?",
mult = mul or "?",
StatusText = notif,
chips = chip or "?",
handname = name or "????",
}
update_hand_text(config, vals)
end
local orrery = (G.GAME or {}).orrery
if not orrery then
return
end
local count = 0
local hands = {}
local inequalities = 0
local pools = {chips = 0, level = 0, mult = 0}
for k, v in pairs(G.GAME.hands) do
if orrery[k] and
(orrery[k].mult ~= v.mult or
orrery[k].chips ~= v.chips or
orrery[k].level ~= v.level) then
inequalities = inequalities + 1
end
count = count + 1
hands[#hands + 1] = v
pools.mult = v.mult + pools.mult
pools.chips = v.chips + pools.chips
pools.level = v.level + pools.level
end
if inequalities == 0 then
return
end
pools.chips = pools.chips + inequalities * 150
table.sort(hands, function(x, y) return x.order > y.order end)
for i, v in ipairs(hands) do
v.mult = math.floor(pools.mult / count) + (small(pools.mult % count) >= i and 1 or 0)
v.chips = math.floor(pools.chips / count) + (small(pools.chips % count) >= i and 1 or 0)
v.level = math.floor(pools.level / count) + (small(pools.level % count) >= i and 1 or 0)
end
for k, v in pairs(G.GAME.hands) do
orrery[k] = {chips = v.chips, level = v.level, mult = v.mult}
end
hand(localize("k_all_hands"), math.floor(pools.chips / count), math.floor(pools.mult / count),
math.floor(pools.level / count))
delay(1)
update_hand_text({sound = "button", volume = 0.7, pitch = 1.1, delay = 0},
{mult = 0, chips = 0, handname = "", level = ""})
end
back {
SMODS.Back {
key = "orrery",
atlas = "janedecks",
pos = {x = 0, y = 0},
@ -432,58 +178,12 @@ back {
"always " .. (Cryptid and "{C:cry_ascendant}" or "{C:attention}") .. "equalized",
},
},
alt_loc_txt = {
name = "Ephemeris Sleeve",
text = {
"{C:blue}Hands{}, {C:red}discards{}, and {C:money}money",
"are always " .. (Cryptid and "{C:cry_ascendant}" or "{C:attention}") .. "equalized",
},
},
alt_apply = function(_)
apply_orrery()
end,
apply = function(_)
apply_orrery()
end,
calculate = rebalance_orrery,
alt_calculate = function(_, _, context)
local function small(x)
return type(x) == "table" and x:to_number() or x
end
if context.setting_blind or context.skip_blind then
G.GAME.alt_orrery = true
end
if not G.GAME.alt_orrery then
return
end
local dollars = G.GAME.dollars
local hands = G.GAME.current_round.hands_left
local discards = G.GAME.current_round.discards_left
local sum = hands + discards + dollars
local new_dollars = math.floor(sum / 3) - dollars
local new_hands = small(math.floor((sum + 2) / 3)) - hands
local new_discards = small(math.floor((sum + 1) / 3)) - discards
if new_dollars ~= 0 then
ease_dollars(new_dollars, true)
end
if new_hands ~= 0 then
ease_hands_played(new_hands, true)
end
if new_discards ~= 0 then
ease_discard(new_discards, true)
end
rebalance_orrery()
end,
}
back {
SMODS.Back {
key = "tortoise",
atlas = "janedecks",
pos = {x = 3, y = 1},
@ -494,17 +194,6 @@ back {
"{C:attention}half{} as strong",
},
},
alt_loc_txt = {
name = "Sleepy Sleeve",
text = {
"{C:attention}Ante {}changes",
"are {C:attention}inverted",
},
},
alt_apply = function(_)
G.GAME.tortoise = true
G.GAME.alt_tortoise = true
end,
apply = function(_)
G.GAME.tortoise = true
end,
@ -514,10 +203,6 @@ local function apply_weeck()
G.GAME.weeck = true
Jane.q(function()
if G.GAME.selected_sleeve == "sleeve_jane_omega" then
return
end
local new_card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_wee", "weeck")
new_card.ability.cry_absolute = true
new_card.ability.eternal = true
@ -544,89 +229,29 @@ local function apply_weeck()
end
save_run()
return true
end)
end
local function two(x)
if type(x) ~= "table" then
return
end
for k, v in pairs(x) do
if type(v) == "number" then
x[k] = x[k] == 0 and 0 or 2
elseif type(v) == "table" then
two(v)
end
end
end
local eternal_text = Cryptid and "Absolute" or "Eternal"
back {
SMODS.Back {
key = "weeck",
atlas = "janedecks",
pos = {x = 4, y = 1},
loc_txt = {
name = "Weeck",
text = Cryptid and {
text = {
"Start with an {C:purple,E:1}" .. eternal_text,
"{C:attention}Wee Joker {}and a deck",
"containing {C:attention}2 {C:purple,E:1}" .. eternal_text,
"{C:attention}2's {}of {C:attention}each suit",
} or {
"Start with an {C:purple,E:1}" .. eternal_text,
"{C:attention}Wee Joker {}and a deck",
"of {C:attention}2 2's {}of {C:attention}each suit",
},
},
alt_loc_txt = {
name = "We",
text = {
"Every stat and",
"card number is {C:attention}2",
"{C:inactive}(If possible)",
},
},
alt_apply = function(_)
local p = G.GAME.starting_params
p.hands = 2
p.dollars = 2
p.discards = 2
G.GAME.skips = 2
p.joker_slots = 2
p.reroll_cost = 2
G.GAME.sunlevel = 2
p.boosters_in_shop = 2
p.consumable_slots = 2
p.vouchers_in_shop = 2
for _, v in pairs(G.GAME.hands) do
v.mult = 2
v.chips = 2
v.level = 2
end
apply_weeck()
end,
apply = function(_)
apply_weeck()
end,
alt_calculate = function(_)
if not G.GAME.we then
G.GAME.we = true
G.hand.config.highlighted_limit = 2
G.hand:change_size(2 - G.hand.config.card_limit)
end
end,
}
local banned_keys = {
sleeve_Seen_Seen = true,
sleeve_jane_omega = true,
}
back {
SMODS.Back {
key = "omega",
atlas = "janedecks",
pos = {x = 5, y = 1},
@ -637,31 +262,13 @@ back {
"of {C:attention}every Jane deck",
},
},
alt_loc_txt = {
name = "Epsilon Sleeve",
text = {
"Applies {X:red,C:white}all{} effects of",
"{C:attention}every deck and sleeve",
"{X:black,C:red,E:2,s:2}UNPLAYABLE",
},
},
alt_apply = function(_, ...)
if (Bakery_API or {}).create_charm_area then
Bakery_API.create_charm_area()
end
for _, v in pairs(G.P_CENTERS) do
if v.apply and not banned_keys[v.key] and (v.set == "Back" or v.set == "Sleeve") then
v:apply(...)
end
end
end,
apply = function(_)
apply_orrery()
G.GAME.used_vouchers.v_omen_globe = true
G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1
Jane.q(function()
G.E_MANAGER:add_event(Event({
func = function()
local wee = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_wee", "weeck")
G.jokers:emplace(wee)
add_rain_world_joker()
@ -669,23 +276,19 @@ back {
G.GAME.obsidian = true
G.GAME.mysterious = true
save_run()
end)
return true
end,
alt_calculate = function(_, ...)
for _, v in pairs(G.P_CENTERS) do
if v.calculate and not banned_keys[v.key] and (v.set == "Back" or v.set == "Sleeve") then
v:calculate(...)
end
end
}))
end,
calculate = function(_, _, context)
trigger_effect = function(_, args)
G.GAME.mysterious = nil
if Jane.is_end_of_ante(context) then
if args.context == "eval" and G.GAME.last_blind and G.GAME.last_blind.boss then
add_rain_world_joker()
Jane.q(function()
Jane.empowered()
return true
end)
end
end,
@ -695,36 +298,15 @@ local orig_ante = ease_ante
---@diagnostic disable-next-line: lowercase-global
function ease_ante(mod)
local function next_number(x)
if G.GAME.alt_nitro then
local n = math.sqrt(x) + 1
return n * n
end
local function next_triangle_number(x)
local n = (math.sqrt(8 * x + 1) - 1) / 2
return (n + 1) * (n + 2) / 2
end
if G.GAME.alt_mysterious then
if not next(G.GAME.alt_mysterious) then
G.GAME.alt_mysterious = {}
for i = G.GAME.round_resets.ante + 1, G.GAME.round_resets.ante + G.GAME.win_ante do
G.GAME.alt_mysterious[#G.GAME.alt_mysterious + 1] = {i}
end
pseudoshuffle(G.GAME.alt_mysterious, pseudoseed("mysterious_deck"))
end
local target = G.GAME.alt_mysterious[#G.GAME.alt_mysterious][1]
G.GAME.alt_mysterious[#G.GAME.alt_mysterious] = nil
mod = target - G.GAME.round_resets.ante
end
if G.GAME.nitro then
mod = Cryptid and
(G.GAME.round_resets.ante < 0 and -G.GAME.round_resets.ante or
math.ceil(next_number(G.GAME.round_resets.ante) - G.GAME.round_resets.ante)) or
math.ceil(next_triangle_number(G.GAME.round_resets.ante) - G.GAME.round_resets.ante)) or
(mod > 0 and mod * 2 or mod)
end
@ -739,10 +321,6 @@ function ease_ante(mod)
mod = math.floor(mod / 2) + remainder
end
if G.GAME.alt_tortoise then
mod = mod * -1
end
orig_ante(mod)
end
@ -786,6 +364,7 @@ function CardArea:emplace(card, location, stay_flipped)
end
c:juice_up(0.3, 0.3)
return true
end
end
@ -799,23 +378,26 @@ function CardArea:emplace(card, location, stay_flipped)
end
else
for i = 1, #targets do
Jane.q(function()
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.15,
func = function()
targets[i]:flip()
play_sound("card1", 1.15 - (i - 0.999) / (#G.hand.cards - 0.998) * 0.3)
targets[i]:juice_up(0.3, 0.3)
end, 0.15)
Jane.q(function()
targets[i]:flip()
play_sound("card1", 1.15 - (i - 0.999) / (#G.hand.cards - 0.998) * 0.3)
targets[i]:juice_up(0.3, 0.3)
end, 0.15)
return true
end,
}))
end
delay(0.2)
for i = 1, #targets do
Jane.q(go(i), 0.1)
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.1,
func = go(i),
}))
end
end
end
@ -840,8 +422,9 @@ function CardArea:emplace(card, location, stay_flipped)
passes = 0
pooling = false
tries = tries - 1
local sd = pseudoseed(seed or "jane_rnd_mysterious")
selection = G.P_CENTERS[pseudorandom_element(pool or G.P_CENTER_POOLS.Consumeables, sd).key]
selection = G.P_CENTERS
[pseudorandom_element(pool or G.P_CENTER_POOLS.Consumeables, pseudoseed(seed or "jane_rnd_mysterious")).key]
if ignore_pooling then
pooling = true
@ -870,13 +453,11 @@ function CardArea:emplace(card, location, stay_flipped)
G.deck and
G.consumeables and
(self == G.jokers or self == G.hand or self == G.deck or self == G.consumeables) and
G.GAME.mysterious and
card.ability and not
G.GAME.mysterious and card.ability and not
card.ability.mysterious_created and not
card.created_from_split then
card.ability.mysterious_created = true
local cen = card.gc and card:gc()
if cen then
if self == G.jokers then
Jane.q(function()
@ -890,6 +471,8 @@ function CardArea:emplace(card, location, stay_flipped)
card:juice_up(0.3, 0.3)
play_sound("card1", 1, 0.6)
end
return true
end, 0.75)
delay(0.75)
@ -905,6 +488,8 @@ function CardArea:emplace(card, location, stay_flipped)
card:add_to_deck()
end
end
return true
end, 0.75)
elseif self == G.consumeables then
Jane.q(function()
@ -918,6 +503,8 @@ function CardArea:emplace(card, location, stay_flipped)
card:juice_up(0.3, 0.3)
play_sound("card1", 1, 0.6)
end
return true
end, 0.75)
delay(0.75)
@ -929,17 +516,18 @@ function CardArea:emplace(card, location, stay_flipped)
play_sound("card3", 1, 0.6)
card:set_ability(
rnd("mysterious_deck_consumable", cen.hidden and {} or {"hidden"},
G.P_CENTER_POOLS[cen.set])
rnd("mysterious_deck_consumable", cen.hidden and {} or {"hidden"}, G.P_CENTER_POOLS[cen.set])
)
if not card.added_to_deck then
card:add_to_deck()
end
end
return true
end, 0.75)
elseif (card.base or {}).value or (card.base or {}).suit then
randomize({card}, not G.GAME.mysterious_init)
randomize({card})
end
end
@ -947,12 +535,10 @@ function CardArea:emplace(card, location, stay_flipped)
if card and self then
orig_emplace(self, card, location, stay_flipped)
end
return true
end)
else
orig_emplace(self, card, location, stay_flipped)
if G.GAME.we then
two(card.ability)
end
end
end

View file

@ -53,6 +53,8 @@ local function offset_operator(by)
if changed_text then
play_sound("button", 1.1, 0.65)
end
return true
end)
end
@ -142,16 +144,9 @@ SMODS.Blind {
pos = {x = 0, y = 3},
vars = {},
dollars = 2,
disable = function(self)
self.disabled = true
end,
debuff_hand = function(self, cards, _, _, _)
if self.disabled then
return false
end
debuff_hand = function(_, cards, _, _, _)
for _, v in ipairs(cards) do
if (v:norank() or v:get_id() ~= 2) and (v.ability or {}).aikoyori_letters_stickers ~= "2" then
if v:norank() or v:get_id() ~= 2 then
return true
end
end
@ -159,10 +154,8 @@ SMODS.Blind {
get_loc_debuff_text = function(_)
return "Hand must contain only 2s"
end,
recalc_debuff = function(self, card, _)
return not self.disabled and
(card:norank() or card:get_id() ~= 2) and
(card.ability or {}).aikoyori_letters_stickers ~= "2"
recalc_debuff = function(_, card, _)
return card:norank() or card:get_id() ~= 2
end,
set_blind = function(self)
if to_number(self.mult) == 0 then

View file

@ -1,78 +0,0 @@
local is_rain_world_joker = {}
for _, v in pairs(Jane.rain_world_jokers) do
is_rain_world_joker[v] = true
end
SMODS.Challenge {
key = "downpour",
loc_txt = {
name = "Downpour",
},
rules = {custom = {
{id = "jane_downpour1"},
{id = "jane_downpour2"},
{id = "jane_downpour3"},
{id = "jane_downpour4"},
}},
apply = function(_)
G.GAME.win_ante = 16
for _, v in ipairs(Jane.rain_world_jokers) do
Jane.q(function()
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, v, "karma_deck_next")
card:add_to_deck()
card:start_materialize()
G.jokers:emplace(card)
play_sound("timpani")
end, 0.2)
end
end,
calculate = function(_, context)
local function l()
if G.STAGE == G.STAGES.RUN then
G.STATE = G.STATES.GAME_OVER
G.STATE_COMPLETE = false
end
end
if not Jane.is_end_of_ante(context) then
return
end
local destructible_jokers = {}
for _, v in pairs(G.jokers.cards) do
if is_rain_world_joker[v.config.center.key] and not ((v.ability or {}).eternal or (v.ability or {}).cry_absolute) then
destructible_jokers[#destructible_jokers + 1] = v
end
end
if not next(destructible_jokers) then
return l()
end
local chosen = pseudorandom_element(destructible_jokers, pseudoseed("karma_deck"))
if chosen then
chosen.getting_sliced = true
chosen:start_dissolve()
end
end,
}
G.localization.misc.v_text["ch_c_jane_downpour1"] = {
"Start with all {C:legendary}Rain World Jokers",
}
G.localization.misc.v_text["ch_c_jane_downpour2"] = {
"Destroy a random {C:legendary}Rain World Joker {}when",
}
G.localization.misc.v_text["ch_c_jane_downpour3"] = {
"{C:attention}Boss Blind {}is defeated, or {C:red}lose",
}
G.localization.misc.v_text["ch_c_jane_downpour4"] = {
"Win on {C:attention}Ante 16",
}

View file

@ -1,8 +1,12 @@
SMODS.Shader({key = "moire", path = "moire.fs"})
SMODS.Shader({key = "polygloss", path = "polygloss.fs"})
SMODS.Shader({key = "moire", path = "moire.fs"})
SMODS.Sound({key = "e_jumbo", path = "e_jumbo.ogg"})
SMODS.Sound({key = "e_moire", path = "e_moire.ogg"})
SMODS.Sound({key = "e_polygloss", path = "e_polygloss.ogg"})
SMODS.Sound({key = "e_moire", path = "e_moire.ogg"})
local function get_weight(self)
return G.GAME.edition_rate * self.weight
end
local function allow_moire()
if Cryptid then
@ -10,7 +14,7 @@ local function allow_moire()
end
for _, v in pairs(SMODS.find_card("j_jane_saint")) do
if v.ability.extra.is_attuned then
if v.is_attuned then
return true
end
end
@ -18,31 +22,29 @@ local function allow_moire()
return false
end
local function get_weight(self)
return G.GAME.edition_rate * self.weight * (allow_moire() and 1 or 0)
end
SMODS.Edition({
key = "polygloss",
loc_txt = {
name = "Polygloss",
label = "Polygloss",
text = Cryptid and {
"{C:chips}+#1#{} Chips",
"{C:mult}+#2#{}, {X:mult,C:white}X#3#{}, & {X:mult,C:dark_edition}^#4#{} Mult",
"{C:money}$#5# {}when scored",
"{C:chips}+#1#{}, {X:chips,C:white}x#2#{} & {X:chips,C:dark_edition}^#3#{} Chips",
"{C:mult}+#4#{}, {X:mult,C:white}x#5#{} & {X:mult,C:dark_edition}^#6#{} Mult",
"{C:money}$#7# {}when scored",
} or {
"{C:chips}+#1#{} Chips",
"{C:mult}+#2#{} & {X:mult,C:white}X#3#{} Mult",
"{C:money}$#4# {}when scored",
"{C:chips}+#1#{} & {X:chips,C:white}x#2#{}",
"{C:mult}+#3#{} & {X:mult,C:white}x#4#{}",
"{C:money}$#5# {}when scored",
},
},
config = {
mult = 2,
chips = 12,
x_mult = 1.2,
mult = 1,
chips = 1,
x_mult = 1.1,
x_chips = 1.1,
p_dollars = 1,
e_mult = Cryptid and 1.02 or nil,
e_chips = Cryptid and 1.01 or nil,
e_mult = Cryptid and 1.01 or nil,
},
sound = {sound = "jane_e_polygloss", per = 1.2, vol = 0.4},
weight = 8,
@ -51,7 +53,8 @@ SMODS.Edition({
shader = "polygloss",
apply_to_float = false,
loc_vars = function(self, _, _)
local vars = {self.config.chips}
local vars = {self.config.chips, self.config.x_chips}
vars[#vars + 1] = self.config.e_chips
vars[#vars + 1] = self.config.mult
vars[#vars + 1] = self.config.x_mult
vars[#vars + 1] = self.config.e_mult
@ -68,6 +71,8 @@ SMODS.Edition({
return {
e_mult = card.edition.e_mult,
x_mult = card.edition.x_mult,
e_chips = card.edition.e_chips,
x_chips = card.edition.x_chips,
p_dollars = card.edition.p_dollars,
}
elseif context.main_scoring and context.cardarea == G.play then
@ -76,6 +81,8 @@ SMODS.Edition({
chips = card.edition.chips,
e_mult = card.edition.e_mult,
x_mult = card.edition.x_mult,
e_chips = card.edition.e_chips,
x_chips = card.edition.x_chips,
p_dollars = card.edition.p_dollars,
}
end
@ -83,14 +90,6 @@ SMODS.Edition({
get_weight = get_weight,
})
local orig_draw_shader = Sprite.draw_shader
function Sprite:draw_shader(_shader, ...)
if _shader ~= "jane_jumbo" then
return orig_draw_shader(self, _shader, ...)
end
end
local jumbo_modifier = Cryptid and 100 or 2
SMODS.Edition({
@ -106,9 +105,14 @@ SMODS.Edition({
},
},
on_apply = function(card)
Jane.q(function()
G.E_MANAGER:add_event(Event({
blocking = false,
blockable = false,
func = function()
Jane.resize(card, Jane.config.wee_sizemod)
end, nil, nil, nil, false, false)
return true
end,
}))
local obj = card:gc()
@ -127,9 +131,14 @@ SMODS.Edition({
end
end,
on_remove = function(card)
Jane.q(function()
G.E_MANAGER:add_event(Event({
blocking = false,
blockable = false,
func = function()
Jane.resize(card, 1 / Jane.config.wee_sizemod)
end, nil, nil, nil, false, false)
return true
end,
}))
local was_added = card.added_to_deck
@ -144,10 +153,10 @@ SMODS.Edition({
end
end,
sound = {sound = "jane_e_jumbo", per = 1, vol = 0.5},
weight = 4,
extra_cost = 5,
weight = 3,
in_shop = true,
shader = false,
extra_cost = 5,
apply_to_float = false,
get_weight = get_weight,
})
@ -157,14 +166,11 @@ SMODS.Edition({
loc_txt = {
name = "Moire",
label = "Moire",
text = {
"{X:chips,C:dark_edition}^#1#{C:chips} Chips",
"{X:mult,C:dark_edition}^#2#{C:mult} Mult",
},
text = {"{X:chips,C:dark_edition}^#1#{C:chips} Chips{}, {X:mult,C:dark_edition}^#2#{C:mult} Mult"},
},
config = {e_chips = Cryptid and 0.8 or 0.9, e_mult = Cryptid and 1.2 or 1.1},
sound = {sound = "jane_e_moire", per = 1, vol = 0.7},
weight = 2,
weight = 1,
extra_cost = 6,
in_shop = true,
shader = "moire",
@ -177,7 +183,7 @@ SMODS.Edition({
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
if context.post_joker or context.main_scoring then
return {e_chips = self.config.e_chips, e_mult = self.config.e_mult}
end
end,

View file

@ -70,6 +70,7 @@ local function grand_dad(card)
Jane.q(function()
card:juice_up(0.5, 0.5)
return true
end)
local rnd = math.random(6)
@ -362,7 +363,7 @@ function Jane.oxy(card, removed)
end
end
local steel = 2
local steel = 1.5
SMODS.Joker {
key = "oxy",
@ -370,15 +371,15 @@ SMODS.Joker {
loc_txt = {
name = "Oxy{C:dark_edition}#1#",
text = {
"{C:attention}Scored steel {}cards",
"give {X:mult,C:white}X#2#{} {C:mult}Mult",
"{C:attention}Scored steel {}cards give",
"{X:mult,C:white}x#2#{} {C:mult}Mult {}and {X:chips,C:white}x#2#{} {C:chips}Chips",
"{C:dark_edition,E:1}#3#{}#4#{C:red}#5#{C:attention}#6#",
"{C:dark_edition,E:1}#7#{}#8#",
"#9#{C:dark_edition,E:1}#10#",
"{C:inactive,s:0.75,E:1}#11#{C:red,s:1.5,E:1}#12#",
},
},
config = {extra = {corrupted_steel = 6, is_corrupted = false, milestone = 3, progress = 0}},
config = {extra = {corrupted_steel = 2.5, is_corrupted = false, milestone = 3, progress = 0}},
pos = {x = 0, y = 0},
sinis = {x = 2, y = 0},
soul_pos = {x = 1, y = 0},
@ -453,26 +454,34 @@ SMODS.Joker {
(extra.progress <= 0 and extra.is_corrupted)) then
extra.is_corrupting = true
Jane.q(function()
G.E_MANAGER:add_event(Event({
delay = 0.1,
func = function()
card:flip()
play_sound("card1")
end, 0.1)
return true
end,
}))
Jane.q(function()
G.E_MANAGER:add_event(Event({
delay = 1,
func = function()
card:flip()
card:juice_up(1, 1)
play_sound("card1")
play_sound("jane_corrupt_milestone")
extra.is_corrupted = not extra.is_corrupted
extra.is_corrupting = nil
end, 1)
return true
end,
}))
end
if context.individual and
context.cardarea == G.play and
context.other_card.ability.name == "Steel Card" then
local amount = extra.is_corrupted and extra.corrupted_steel or steel
return {x_mult = amount, colour = G.C.PURPLE, card = card}, true
return {x_chips = amount, x_mult = amount, colour = G.C.PURPLE, card = card}, true
end
end,
}
@ -482,7 +491,6 @@ if Cryptid then
end
local operator = Cryptid and "^" or "X"
local operator_prefix = Cryptid and "{X:dark_edition,C:mult}" or "{X:mult,C:white}"
SMODS.Joker {
key = "betmma",
@ -490,12 +498,12 @@ SMODS.Joker {
loc_txt = {
name = "Betmma",
text = {
operator_prefix .. "+" .. operator .. "#1#{C:mult} Mult{} for every",
"{X:dark_edition,C:chips}+" .. operator .. "#1#{C:chips} Chips{} for every",
"{C:attention}unique Voucher redeemed",
"{C:inactive}(Currently " .. operator_prefix .. operator .. "#2#{C:inactive})",
"{C:inactive}(Currently {X:dark_edition,C:chips}" .. operator .. "#2#{C:inactive})",
},
},
config = {extra = {tet = Cryptid and 0.25 or 0.5}},
config = {extra = {tet = Cryptid and 0.1 or 0.25}},
pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0},
blueprint_compat = true,
@ -518,7 +526,7 @@ SMODS.Joker {
card = card,
colour = G.C.jane_RGB,
message = operator .. number_format(num),
[Cryptid and "e_mult" or "x_mult"] = num,
[Cryptid and "e_chips" or "x_chips"] = num,
}, true
end
end,
@ -558,7 +566,7 @@ SMODS.Joker {
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 rnd = pseudorandom(pseudoseed("granddad"), 1, Cryptid and 5 or 4)
local rnd = pseudorandom(pseudoseed("granddad"), 1, Cryptid and 7 or 5)
if rnd == 1 then
return {
@ -583,11 +591,25 @@ SMODS.Joker {
}, true
elseif rnd == 4 then
return {
message = Cryptid and "X7 Mult" or "X1.77 Mult",
message = Cryptid and "x7" or "x1.77",
x_chips = Cryptid and 7 or 1.77,
colour = palette,
card = card,
}, true
elseif rnd == 5 then
return {
message = Cryptid and "x7 Mult" or "x1.77 Mult",
x_mult = Cryptid and 7 or 1.77,
colour = palette,
card = card,
}, true
elseif rnd == 6 then
return {
message = "^1.77",
e_chips = 1.77,
colour = palette,
card = card,
}, true
else
return {
message = "^1.77 Mult",
@ -607,10 +629,10 @@ SMODS.Joker {
loc_txt = {
name = "Peppino Spaghetti",
text = {
operator_prefix .. operator .. "2^x{C:red} Mult{} for every",
"{X:dark_edition,C:red}" .. operator .. "2^x{C:red} Mult{} for every",
"{C:attention}food or Peppino Joker",
"in your possession",
"{C:inactive}(Currently " .. operator_prefix .. operator .. "#1#{C:red} Mult{C:inactive})",
"{C:inactive}(Currently {X:dark_edition,C:red}" .. operator .. "#1#{C:red} Mult{C:inactive})",
},
},
pos = {x = 0, y = 0},

View file

@ -41,7 +41,7 @@ function Jane.card_status_text(
sound,
volume,
pitch,
trigger,
trig,
f
)
if (delay or 0) <= 0 then
@ -75,8 +75,10 @@ function Jane.card_status_text(
G.ROOM.jiggle = G.ROOM.jiggle + jiggle
end
else
Jane.q(
function()
G.E_MANAGER:add_event(Event({
trigger = trig,
delay = delay,
func = function()
if f and type(f) == "function" then
f(card)
end
@ -106,18 +108,17 @@ function Jane.card_status_text(
if jiggle then
G.ROOM.jiggle = G.ROOM.jiggle + jiggle
end
return true
end,
delay,
nil,
trigger
)
}))
end
end
function Jane.empowered()
if Cryptid then
add_tag(Tag("tag_cry_empowered"))
return
return true
end
local card = create_card("Spectral", G.consumeables, nil, nil, nil, nil, "c_soul", "acceleration_soul")
@ -152,25 +153,25 @@ function Jane.get_operator()
return math.max(math.min(G.GAME.operator, 3), 1)
end
function Jane.hidden(card)
return G.GAME and not G.GAME.obsidian and
(type(card) == "table" and (card.name == "Black Hole" or card.name == "The Soul") or card.hidden)
function Jane.get_small_chipmult_sum(chips, mult)
local ret = Jane.get_chipmult_sum()
return type(ret) == "table" and ret:to_number() or ret
end
function Jane.is_end_of_ante(context, card)
return not context.individual and not
context.repetition and not
(card or {}).debuff and
context.end_of_round and not
context.blueprint and
G.GAME.blind.boss and not
(G.GAME.blind.config and G.GAME.blind.config.bonus)
function Jane.hidden(card)
return G.GAME and not
G.GAME.obsidian and
type(card) == "table" and
(card.name == "Black Hole" or card.name == "The Soul" or card.hidden)
end
function Jane.play_sound(sound, per, vol)
Jane.q(function()
G.E_MANAGER:add_event(Event({
func = function()
play_sound(sound, per, vol)
end)
return true
end,
}))
end
function Jane.resize(card, mod, force_save)
@ -192,17 +193,14 @@ function Jane.resize(card, mod, force_save)
end
end
function Jane.q(func, delay, timer, trigger, blockable, blocking)
function Jane.q(fc, de, t, tr, bl, ba)
G.E_MANAGER:add_event(Event({
delay = delay,
timer = timer,
trigger = (delay and not trigger) and "after" or trigger,
blocking = blocking,
blockable = blockable,
func = function(...)
local ret = func(...)
return ret == nil and true or ret
end,
timer = t,
trigger = tr,
delay = de,
blockable = bl,
blocking = ba,
func = fc,
}))
end
@ -218,6 +216,17 @@ function Card:nosuit()
return self.ability.name == "Stone Card" or self.config.center.no_suit
end
local orig_debuff = Card.set_debuff
function Card:set_debuff(should_debuff)
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)
return false
else
orig_debuff(self, should_debuff)
end
end
local orig_menu = Game.main_menu
function Game:main_menu(change_context)
@ -240,11 +249,83 @@ function Game:update(dt)
end
end
local function hsv(h, s, v)
if s <= 0 then
return v, v, v
local function hand(name, chip, mul, lv, notif, snd, vol, pit, de)
local config = {
delay = de or 0.3,
pitch = pit or 0.8,
volume = vol or 0.7,
sound = type(snd) == "string" and snd or type(snd) == "nil" and "button",
}
local vals = {
level = lv or "?",
mult = mul or "?",
StatusText = notif,
chips = chip or "?",
handname = name or "????",
}
update_hand_text(config, vals)
end
local function rebalance_orrery()
local function small(x)
return type(x) == "table" and x:to_number() or x
end
local orrery = (G.GAME or {}).orrery
if not orrery then
return
end
local count = 0
local hands = {}
local inequalities = 0
local pools = {chips = 0, level = 0, mult = 0}
for k, v in pairs(G.GAME.hands) do
if orrery[k] and
(orrery[k].mult ~= v.mult or
orrery[k].chips ~= v.chips or
orrery[k].level ~= v.level) then
inequalities = inequalities + 1
end
count = count + 1
hands[#hands + 1] = v
pools.mult = v.mult + pools.mult
pools.chips = v.chips + pools.chips
pools.level = v.level + pools.level
end
if inequalities == 0 then
return
end
pools.chips = pools.chips + inequalities * 150
table.sort(hands, function(x, y) return x.order > y.order end)
for i, v in ipairs(hands) do
v.mult = math.floor(pools.mult / count) + (small(pools.mult % count) >= i and 1 or 0)
v.chips = math.floor(pools.chips / count) + (small(pools.chips % count) >= i and 1 or 0)
v.level = math.floor(pools.level / count) + (small(pools.level % count) >= i and 1 or 0)
end
for k, v in pairs(G.GAME.hands) do
orrery[k] = {chips = v.chips, level = v.level, mult = v.mult}
end
hand(localize("k_all_hands"), math.floor(pools.chips / count), math.floor(pools.mult / count),
math.floor(pools.level / count))
delay(1)
update_hand_text({sound = "button", volume = 0.7, pitch = 1.1, delay = 0},
{mult = 0, chips = 0, handname = "", level = ""})
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
@ -268,6 +349,7 @@ function Game:update(dt)
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
@ -275,8 +357,8 @@ function Game:update(dt)
Jane.update_honey()
if not Jane.bans_done then
Jane.bans_done = true
delete_hardbans()
Jane.bans_done = true
end
if (G.GAME or {}).banned_keys then
@ -293,6 +375,18 @@ function Game:update(dt)
self.C.jane_RGB_HUE = (self.C.jane_RGB_HUE + 0.5) % 360
G.ARGS.LOC_COLOURS.jane_RGB = self.C.jane_RGB
end
rebalance_orrery()
end
local orig_card = SMODS.find_card
---@param key string
---@param count_debuffed true?
---@return Card[]|table[]
--- Returns all cards matching provided `key`.
function SMODS.find_card(key, count_debuffed)
return orig_card(key == "j_jen_saint" and "j_jane_saint" or key, count_debuffed)
end
SMODS.Atlas {
@ -313,7 +407,6 @@ for _, v in ipairs({
"back",
"blind",
"booster",
"challenge",
"edition",
"joker",
"slugcat",

View file

@ -5,36 +5,6 @@ for i = 1, 8 do
SMODS.Sound({key = "gore" .. i, path = "gore" .. i .. ".ogg"})
end
SMODS.Sound({
key = "music_attuned",
path = "music_attuned.ogg",
volume = 1,
select_music_track = function()
for _, v in pairs(SMODS.find_card("j_jane_saint")) do
if v.ability.extra.is_attuned then
return Jane.sinister and -1 / 0 or 10
end
end
return -1 / 0
end,
})
SMODS.Sound({
key = "music_attuned_sinister",
path = "music_attuned_sinister.ogg",
volume = 1,
select_music_track = function()
for _, v in pairs(SMODS.find_card("j_jane_saint")) do
if v.ability.extra.is_attuned then
return Jane.sinister and 10 or -1 / 0
end
end
return -1 / 0
end,
})
for _, v in pairs({
"artificer",
"hunter",
@ -125,9 +95,9 @@ SMODS.Joker {
name = "The Survivor",
text = {
"All cards held in hand",
"{C:attention}contribute to scoring" .. (Cryptid and " {}and" or ""),
Cryptid and "are all considered as" or nil,
Cryptid and "the {C:attention}first played card" or nil,
"{C:attention}contribute to scoring {}and",
"are all considered as",
"the {C:attention}first played card",
},
},
pos = {x = 0, y = 0},
@ -156,8 +126,8 @@ SMODS.Joker {
eternal_compat = false,
perishable_compat = false,
soul_pos = {x = 1, y = 0},
cost = Cryptid and 15 or 8,
rarity = Cryptid and epic or 3,
cost = Cryptid and 20 or 8,
rarity = Cryptid and 4 or 3,
loc_vars = function(_, info_queue, card)
local function rounds(amount)
return " round" .. ((math.abs(amount) > 1 or math.abs(amount) == 0) and "s" or "")
@ -192,7 +162,6 @@ SMODS.Joker {
local function spawn_rot()
card:flip()
card:juice_up(2, 0.8)
card.getting_sliced = true
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()
@ -202,19 +171,24 @@ SMODS.Joker {
card:set_eternal(nil)
card2:set_eternal(true)
play_sound("jane_gore5")
return true
end)
Jane.q(function()
card:start_dissolve()
end, 1)
end
local function die()
spawn_rot()
Jane.q(function()
Jane.empowered()
return true
end, 0.1)
spawn_rot()
Jane.q(function()
card:start_dissolve()
return true
end, 1)
return true
end
if context.blueprint then
@ -230,13 +204,17 @@ SMODS.Joker {
if not card.hunter_prep then
card.hunter_prep = true
Jane.q(function()
Jane.q(function()
card.hunter_prep = nil
if G.GAME.current_round.hands_left < G.GAME.round_resets.hands then
ease_hands_played(G.GAME.round_resets.hands - G.GAME.current_round.hands_left)
end
return true
end)
return true
end)
end
@ -281,7 +259,7 @@ SMODS.Joker {
else
card:juice_up(2, 0.8)
Jane.play_sound("jane_warning_heartbeat")
Jane.q(die, 0)
G.E_MANAGER:add_event(Event({trigger = "after", func = die}))
end
end
end,
@ -402,11 +380,17 @@ function Card:open()
orig_open(self)
Jane.q(function()
G.E_MANAGER:add_event(Event({
delay = 0.5,
timer = "REAL",
func = function()
if next(spearmasters) then
G.GAME.pack_choices = math.floor(self.ability.extra)
end
end, 0.5, "REAL")
return true
end,
}))
end
SMODS.Joker {
@ -457,20 +441,7 @@ function Card:draw(layer)
orig_draw(self, layer)
end
local orig_debuff = Card.set_debuff
function Card:set_debuff(should_debuff)
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)
return false
else
orig_debuff(self, should_debuff)
end
end
local function attunement()
return (G.GAME or {}).weeckweeck and 2 or (Cryptid and 1.002 or 1.2)
end
local attune = Cryptid and 1.001 or 1.2
SMODS.Joker {
key = "saint",
@ -478,10 +449,9 @@ SMODS.Joker {
loc_txt = {
name = "The Saint{C:jane_RGB}#1#",
text = Cryptid and {
"{C:spectral}Analog{}, {C:spectral}Ankh{}, {C:spectral}Gateway{}, and",
"{C:spectral,s:0.95}Summoning {s:0.95}will {C:attention,s:0.95}not destroy Jokers",
"{C:jane_RGB}#2#{}#3#{X:black,C:jane_RGB,s:1.5}#4#{C:spectral}#5#{C:mult}#6#",
"{C:inactive,s:1.25}#7#{C:attention,s:1.25}#8#{C:inactive,s:1.25}#9#{C:inactive}#10#",
"{C:spectral}Ankh and Gateway {}will {C:attention}not destroy Jokers",
"{C:jane_RGB}#2#{}#3#{X:black,C:jane_RGB,s:1.5}#4#{C:spectral}#5#{C:chips}#6#{}#7#{C:mult}#8#",
"{C:inactive,s:1.25}#9#{C:attention,s:1.25}#10#{C:inactive,s:1.25}#11#{C:inactive}#12#",
} or {
"{C:spectral}Ankh {}will {C:attention}not destroy Jokers",
"{C:jane_RGB}#2#{}#3#{C:dark_edition}#4#{C:spectral}#5#",
@ -495,17 +465,8 @@ SMODS.Joker {
rarity = 4,
blueprint_compat = true,
loc_vars = function(_, info_queue, card)
if Cryptid then
info_queue[#info_queue + 1] = G.P_CENTERS.c_cry_analog
end
info_queue[#info_queue + 1] = G.P_CENTERS.c_ankh
info_queue[#info_queue + 1] = Cryptid and G.P_CENTERS.c_cry_gateway or G.P_CENTERS.c_soul
if Cryptid then
info_queue[#info_queue + 1] = G.P_CENTERS.c_cry_summoning
end
local extra = card.ability.extra
local karma = extra.karma
local max_karma = extra.max_karma
@ -516,8 +477,10 @@ SMODS.Joker {
attuned and " (Attuned)" or "",
attuned and "" or "Attune ",
attuned and "" or "after using ",
attuned and "^^" .. attunement() or max_karma,
attuned and "^^" .. attune or max_karma,
attuned and "" or " Gateways",
attuned and " Chips " or "",
attuned and "& " or "",
attuned and "Mult" or "",
attuned and "" or "[",
attuned and "" or karma,
@ -526,7 +489,7 @@ SMODS.Joker {
} or {
attuned and " (Attuned)" or "",
attuned and "" or "Attune ",
attuned and "Boosts cards with " or "after using ",
attuned and "Fires on cards with " or "after using ",
attuned and "editions" or max_karma,
attuned and "" or " Ankh or Soul Cards",
attuned and "" or "[",
@ -537,8 +500,6 @@ SMODS.Joker {
}
end,
update = function(_, card, _)
card.debuff_immune = card.ability.extra.is_attuned
if card.added_to_deck and card.children.center and card.children.floating_sprite then
local extra = card.ability.extra
card.children.floating_sprite:set_sprite_pos({x = extra.is_attuned and 2 or 1, y = 0})
@ -547,41 +508,7 @@ SMODS.Joker {
calculate = function(_, card, context)
local extra = card.ability.extra
local max_karma = extra.max_karma
extra.is_attuned = extra.is_attuned and extra.karma >= max_karma
local function ascend()
if extra.is_attuning then
return
end
extra.is_attuning = true
Jane.card_status_text(
card,
"!!!",
nil,
0.05 * card.T.h,
G.C.DARK_EDITION,
0.6,
0.6,
2,
2,
"bm",
"jane_enlightened"
)
Jane.q(function()
card:flip()
play_sound("card1")
end, 0.1)
Jane.q(function()
card:flip()
card:juice_up(1, 1)
play_sound("card1")
extra.is_attuned = true
end, 1)
end
extra.is_attuned = extra.karma >= max_karma
if extra.is_attuned then
card.debuff = false
@ -591,24 +518,19 @@ SMODS.Joker {
card.ability.perish_tally = 1e9
end
if Cryptid and not context.joker_main then
if ({[false] = context.cardarea ~= G.play or context.repetition, [true] = not context.joker_main})[not not Cryptid] then
return
end
if not Cryptid 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_holo = {mult_mod = 50},
e_foil = {chip_mod = 250},
e_polychrome = {xmult_mod = 2.5},
e_jane_polygloss = {
mult = 10,
chips = 10,
x_mult = 2,
chips = 100,
x_chips = 2,
p_dollars = 10,
},
e_jane_moire = {
@ -618,15 +540,13 @@ SMODS.Joker {
[Cryptid and "EEmult_mod" or "Emult_mod"] = attune,
message = (Cryptid and "^^" or "^") .. attune .. " Chips & Mult",
},
})[Cryptid and "e_jane_moire" or ((context.other_card or context.other_joker or {}).edition or {}).key]
})[Cryptid and "e_jane_moire" or ((context.other_card or {}).edition or {}).key]
if trigger then
trigger.card = card
end
return trigger
elseif extra.karma >= max_karma then
ascend()
end
if not (not context.blueprint and
@ -667,7 +587,39 @@ SMODS.Joker {
return
end
ascend()
Jane.card_status_text(
card,
"!!!",
nil,
0.05 * card.T.h,
G.C.DARK_EDITION,
0.6,
0.6,
2,
2,
"bm",
"jane_enlightened"
)
G.E_MANAGER:add_event(Event({
delay = 0.1,
func = function()
card:flip()
play_sound("card1")
return true
end,
}))
G.E_MANAGER:add_event(Event({
delay = 1,
func = function()
card:flip()
card:juice_up(1, 1)
play_sound("card1")
extra.is_attuned = true
return true
end,
}))
end,
}
@ -705,22 +657,32 @@ SMODS.Joker {
return G.jokers.config.card_count < G.jokers.config.card_limit
end
local function spawn()
if card.cloned then
return
local function is_end_of_ante()
return not context.individual and not
context.repetition and not
card.debuff and
context.end_of_round and not
context.blueprint and
G.GAME.blind.boss and not
(G.GAME.blind.config and G.GAME.blind.config.bonus)
end
local function spawn()
local rot = copy_card(card)
rot.cloned = true
rot:add_to_deck()
G.jokers:emplace(rot)
Jane.card_status_text(rot, "...", nil, 0.05 * card.T.h, G.C.BLACK, 3, 0, 0, nil, "bm")
return true
end
if has_room() and not card.cloned and Jane.is_end_of_ante(context, card) then
if has_room() and not card.cloned and is_end_of_ante() then
Jane.q(spawn, 0.5)
else
Jane.q(function()
card.cloned = false
return true
end, 5)
end
end,
}

View file

@ -12,9 +12,12 @@ local function conjure(card, number)
math.ceil(card.ability.extra.spectrals) * number,
G.consumeables.config.card_limit - #G.consumeables.cards
) do
Jane.q(function()
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.4,
func = function()
if G.consumeables.config.card_limit <= #G.consumeables.cards then
return
return true
end
play_sound("jane_draw")
@ -22,7 +25,9 @@ local function conjure(card, number)
spectral:add_to_deck()
G.consumeables:emplace(spectral)
card:juice_up(0.3, 0.5)
end, 0.4)
return true
end,
}))
end
end
@ -30,8 +35,10 @@ local function create_full_deck(enhancement, edition, amount, emplacement)
local cards = {}
for _, v in pairs(G.P_CARDS) do
for i = 1, amount or 1 do
Jane.q(function()
for i = 1, (amount or 1) do
G.E_MANAGER:add_event(Event({
delay = 0.1,
func = function()
cards[i] = true
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
@ -56,7 +63,10 @@ local function create_full_deck(enhancement, edition, amount, emplacement)
else
G.deck:emplace(card)
end
end, 0.1)
return true
end,
}))
end
end
@ -64,6 +74,13 @@ local function create_full_deck(enhancement, edition, amount, emplacement)
if next(cards) then
playing_card_joker_effects(cards)
end
return true
end)
Jane.q(function()
cards = nil
return true
end)
end
@ -108,11 +125,16 @@ local function randomize(targets, noanim)
for i = 1, #targets do
local percent = 1.15 - (i - 0.999) / (#G.hand.cards - 0.998) * 0.3
Jane.q(function()
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.15,
func = function()
targets[i]:flip()
play_sound("card1", percent)
targets[i]:juice_up(0.3, 0.3)
end, 0.15)
return true
end,
}))
end
delay(0.2)
@ -120,7 +142,10 @@ local function randomize(targets, noanim)
for i = 1, #targets do
local percent = 0.85 + (i - 0.999) / (#G.hand.cards - 0.998) * 0.3
Jane.q(function()
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.1,
func = function()
local card = targets[i]
card:set_base(pseudorandom_element(G.P_CARDS))
card:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"]))
@ -147,7 +172,9 @@ local function randomize(targets, noanim)
card:flip()
play_sound("card3", percent, 0.6)
card:juice_up(0.3, 0.3)
end, 0.1)
return true
end,
}))
end
end
end
@ -170,10 +197,15 @@ SMODS.Consumable {
return Jane.can_use() and #((G.hand or {}).cards or {}) > 0
end,
use = function(_, card, _, _)
Jane.q(function()
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.4,
func = function()
play_sound("tarot1")
card:juice_up(0.3, 0.5)
end, 0.4)
return true
end,
}))
randomize(G.hand.cards)
delay(0.5)
@ -299,9 +331,22 @@ SMODS.Consumable {
for _, v in pairs(G.playing_cards) do
v:start_dissolve()
end
return true
end)
delay(2)
local function realdelay(time, queue)
G.E_MANAGER:add_event(Event({
trigger = "after",
timer = "REAL",
delay = time or 1,
func = function()
return true
end,
}), queue)
end
realdelay(1)
create_full_deck()
end,
}

View file

@ -1,40 +1,29 @@
local function j()
return G.GAME.used_vouchers.v_jane_jolly_voucher and "j_jolly" or "j_joker"
end
local required = 2
local function get_uses()
G.GAME.joker_in_a_tarot = G.GAME.joker_in_a_tarot or 0
return G.GAME.joker_in_a_tarot
end
local blurbs = {
"M!",
"Hey! Pick me!",
"Hee-hee, hoo-hoo!",
"Looks like the joke is on you!",
"Ouch, I think the joke is on me!",
"You wouldn't say no to a free negative me, would you?",
"Sometimes, an extra four mult goes a long way!",
"I won't take up space, I promise!",
"Don't ask how I ended up in a tarot!",
"The stakes are only gonna rise here!",
"I wonder what's the deal with pairs?",
"It's a little cramped in this tarot...!",
"Juggling is one of my favourite passtimes!",
"I'm not just a clown; I'm the whole circus!",
"Looks like the joke is on the crystal globe!",
"Hee-hee, hoo-hoo!",
"Who knew even fortunes could be a circus act?",
"Sometimes, an extra four mult goes a long way!",
"I can't give four mult if I'm still in this card!",
"You wouldn't say no to a free negative me, would you?",
"I'd give you more tickets to JimCon, but I'm fresh out.",
"Let me tell you, you'd love the show going on in this tarot!",
"Who knew I'd have access to a great show? That show being you!",
"I can't help if I'm still in this silly old card, break me out!",
"I've heard of a round buffoon that lives in a pretty funky town...",
"You don't need to understand math to enjoy watching the digits climb!",
"I'm rooting for you! Even if it means I'll never get out of this card...",
"Looks like the joke is on the crystal globe!",
"It's a little cramped in this tarot...!",
"Ouch, I think the joke is on me!",
"Looks like the joke is on you!",
"I'm not just a clown; I'm the whole circus!",
"Seems a little suspicious for a jolly old fella like me to be in this card...",
"I can't help if I'm still in this silly old card, break me out!",
"Let me tell you, you'd love the show going on in this tarot!",
"I'd give you more tickets to JimCon, but I'm fresh out.",
"I've heard of a round buffoon that lives in a pretty funky town...",
"I can't give four mult if I'm still in this card!",
"I'm rooting for you! Even if it means I'll never get out of this card...",
"Who knew I'd have access to a great show? That show being you!",
"The stakes are only gonna rise here!",
"Juggling is one of my favourite passtimes!",
"I wonder what's the deal with pairs?",
"You don't need to understand math to enjoy watching the digits climb!",
"M!",
}
SMODS.Consumable {
@ -42,41 +31,22 @@ SMODS.Consumable {
atlas = "janeacc",
set = "Tarot",
loc_txt = {
name = "#1#-in-a-Tarot",
name = "Joker-in-a-Tarot",
text = {
"Create a {C:dark_edition}Negative {C:attention}#2#",
"after {C:attention}#3# {}uses {C:inactive}(#4# left)",
"{C:inactive,E:1}#5#{}",
"Create a {C:dark_edition}Negative {C:attention}default Joker",
"{C:inactive,E:1}#1#{}",
},
},
loc_vars = function(_, info_queue, card)
info_queue[#info_queue + 1] = G.P_CENTERS[j()]
local is_jolly = G.GAME.used_vouchers.v_jane_jolly_voucher
card.blurb = not card.fake_card and
(card.blurb or pseudorandom_element(blurbs, pseudoseed("jokerinatarotblurbs"))) or ""
if is_jolly then
card.blurb = card.blurb:gsub("four", "eight")
end
local desc = is_jolly and "Jolly Joker" or "default Joker"
local name = is_jolly and "Jolly" or "Joker"
return {vars = {name, desc, required, required - get_uses(), card.blurb}}
info_queue[#info_queue + 1] = G.P_CENTERS.j_joker
card.blurb = card.blurb or pseudorandom_element(blurbs, pseudoseed("jokerinatarotblurbs"))
return {vars = {card.blurb}}
end,
pos = {x = 0, y = 1},
cost = 4,
can_use = Jane.can_use,
use = function(_, _, _, _)
local uses = get_uses() + 1
if uses < required then
G.GAME.joker_in_a_tarot = uses
return
end
G.GAME.joker_in_a_tarot = 0
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, j(), "jokerfromatarot")
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_joker", "jokerfromatarot")
card:set_edition({negative = true}, true)
card.cost = 1
card.base_cost = 1
@ -92,10 +62,3 @@ SMODS.Consumable {
end
end,
}
if Cryptid then
Cryptid.aliases["joker in a tarot"] = "c_jane_jokerinatarot"
Cryptid.aliases["joker-in-a-tarot"] = "c_jane_jokerinatarot"
Cryptid.aliases["jolly in a tarot"] = "c_jane_jokerinatarot"
Cryptid.aliases["jolly-in-a-tarot"] = "c_jane_jokerinatarot"
end

View file

@ -1,10 +1,3 @@
SMODS.Atlas {
key = "janejollyvoucher",
px = 71,
py = 95,
path = Jane.config.texture_pack .. "/v_jane_jolly_voucher.png",
}
SMODS.Atlas {
key = "janetokenvoucher",
px = 71,
@ -12,22 +5,6 @@ SMODS.Atlas {
path = Jane.config.texture_pack .. "/v_jane_token_voucher.png",
}
SMODS.Voucher {
key = "jolly_voucher",
atlas = "janejollyvoucher",
loc_txt = {
name = "Jolly Voucher",
text = {"{C:attention,T:c_jane_jokerinatarot}Joker-in-a-Tarot {}creates", "{C:attention,T:j_jolly}Jolly Joker {}instead"},
},
pos = {x = 0, y = 0},
cost = 8,
loc_vars = function(_, info_queue, _)
info_queue[#info_queue + 1] = G.P_CENTERS.c_jane_jokerinatarot
info_queue[#info_queue + 1] = G.P_CENTERS.j_jolly
return {vars = {}}
end,
}
SMODS.Voucher {
key = "token_voucher",
atlas = "janetokenvoucher",