Compare commits

..

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

29 changed files with 978 additions and 2526 deletions

View file

@ -1,171 +0,0 @@
# see https://github.com/CppCXY/EmmyLuaCodeStyle
[*.lua]
# [basic]
# optional space/tab
indent_style = space
# if indent_style is space, this is valid
indent_size = 4
# if indent_style is tab, this is valid
tab_width = 4
# none/single/double
quote_style = double
continuation_indent = 4
## extend option
# continuation_indent.before_block = 4
# continuation_indent.in_expr = 4
# continuation_indent.in_table = 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
# 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
# none/ comma / semicolon / only_kv_colon
table_separator_style = none
#optional keep/never/always/smart
trailing_table_separator = smart
# keep/remove/remove_table_only/remove_string_only
call_arg_parentheses = keep
detect_end_of_line = false
# this will check text end with new line
insert_final_newline = true
# [space]
space_around_table_field_list = false
space_before_attribute = false
space_before_function_open_parenthesis = false
space_before_function_call_open_parenthesis = false
space_before_closure_open_parenthesis = false
# optional always/only_string/only_table/none
# or true/false
space_before_function_call_single_arg = always
## extend option
## always/keep/none
# space_before_function_call_single_arg.table = always
## always/keep/none
# space_before_function_call_single_arg.string = always
space_before_open_square_bracket = false
space_inside_function_call_parentheses = false
space_inside_function_param_list_parentheses = false
space_inside_square_brackets = false
# like t[#t+1] = 1
space_around_table_append_operator = false
ignore_spaces_inside_function_call = false
# detail number or 'keep'
space_before_inline_comment = 1
# convert '---' to '--- ' or '--' to '-- '
space_after_comment_dash = false
# [operator space]
space_around_math_operator = true
# space_around_math_operator.exponent = false
space_after_comma = true
space_after_comma_in_for_statement = true
# true/false or none/always/no_space_asym
space_around_concat_operator = true
space_around_logical_operator = true
# true/false or none/always/no_space_asym
space_around_assign_operator = true
# [align]
align_call_args = false
align_function_params = true
# true/false or always
align_continuous_assign_statement = true
align_continuous_rect_table_field = true
align_continuous_line_space = 2
align_if_branch = false
# option none / always / contain_curly/
align_array_table = true
align_continuous_similar_call_args = false
align_continuous_inline_comment = true
# option none / always / only_call_stmt
align_chain_expr = none
# [indent]
never_indent_before_if_condition = false
never_indent_comment_on_if_branch = false
keep_indents_on_empty_lines = false
allow_non_indented_comments = false
# [line space]
# The following configuration supports four expressions
# keep
# fixed(n)
# min(n)
# max(n)
# for eg. min(2)
line_space_after_if_statement = fixed(2)
line_space_after_do_statement = fixed(2)
line_space_after_while_statement = fixed(2)
line_space_after_repeat_statement = fixed(2)
line_space_after_for_statement = fixed(2)
line_space_after_local_or_assign_statement = max(2)
line_space_after_function_statement = fixed(2)
line_space_after_expression_statement = max(2)
line_space_after_comment = fixed(1)
line_space_around_block = fixed(1)
# [line break]
break_all_list_when_line_exceed = false
auto_collapse_lines = false
break_before_braces = false
# [preference]
ignore_space_after_colon = false
remove_call_expression_list_finish_comma = true
# keep / always / same_line / replace_with_newline / never
end_statement_with_semicolon = replace_with_newline

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

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

View file

@ -1,151 +0,0 @@
#if defined(VERTEX) || __VERSION__ > 100 || defined(GL_FRAGMENT_PRECISION_HIGH)
#define MY_HIGHP_OR_MEDIUMP highp
#else
#define MY_HIGHP_OR_MEDIUMP mediump
#endif
extern MY_HIGHP_OR_MEDIUMP vec2 moire;
extern MY_HIGHP_OR_MEDIUMP number dissolve;
extern MY_HIGHP_OR_MEDIUMP number time;
extern MY_HIGHP_OR_MEDIUMP vec4 texture_details;
extern MY_HIGHP_OR_MEDIUMP vec2 image_details;
extern bool shadow;
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1;
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2;
vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
{
if (dissolve < 0.001) {
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, shadow ? tex.a*0.3: tex.a);
}
float adjusted_dissolve = (dissolve*dissolve*(3.-2.*dissolve))*1.02 - 0.01; //Adjusting 0.0-1.0 to fall to -0.1 - 1.1 scale so the mask does not pause at extreme values
float t = time * 10.0 + 2003.;
vec2 floored_uv = (floor((uv*texture_details.ba)))/max(texture_details.b, texture_details.a);
vec2 uv_scaled_centered = (floored_uv - 0.5) * 2.3 * max(texture_details.b, texture_details.a);
vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324));
vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532));
vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000));
float field = (1.+ (
cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) +
cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.;
vec2 borders = vec2(0.2, 0.8);
float res = (.5 + .5* cos( (adjusted_dissolve) / 82.612 + ( field + -.5 ) *3.14))
- (floored_uv.x > borders.y ? (floored_uv.x - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.y > borders.y ? (floored_uv.y - borders.y)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.x < borders.x ? (borders.x - floored_uv.x)*(5. + 5.*dissolve) : 0.)*(dissolve)
- (floored_uv.y < borders.x ? (borders.x - floored_uv.y)*(5. + 5.*dissolve) : 0.)*(dissolve);
if (tex.a > 0.01 && burn_colour_1.a > 0.01 && !shadow && res < adjusted_dissolve + 0.8*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
if (!shadow && res < adjusted_dissolve + 0.5*(0.5-abs(adjusted_dissolve-0.5)) && res > adjusted_dissolve) {
tex.rgba = burn_colour_1.rgba;
} else if (burn_colour_2.a > 0.01) {
tex.rgba = burn_colour_2.rgba;
}
}
return vec4(shadow ? vec3(0.,0.,0.) : tex.xyz, res > adjusted_dissolve ? (shadow ? tex.a*0.3: tex.a) : .0);
}
number hue(number s, number t, number h)
{
number hs = mod(h, 1.)*6.;
if (hs < 1.) return (t-s) * hs + s;
if (hs < 3.) return t;
if (hs < 4.) return (t-s) * (4.-hs) + s;
return s;
}
vec4 RGB(vec4 c)
{
if (c.y < 0.0001)
return vec4(vec3(c.z), c.a);
number t = (c.z < .5) ? c.y*c.z + c.z : -c.y*c.z + (c.y+c.z);
number s = 2.0 * c.z - t;
return vec4(hue(s,t,c.x + 1./3.), hue(s,t,c.x), hue(s,t,c.x - 1./3.), c.w);
}
vec4 HSL(vec4 c)
{
number low = min(c.r, min(c.g, c.b));
number high = max(c.r, max(c.g, c.b));
number delta = high - low;
number sum = high+low;
vec4 hsl = vec4(.0, .0, .5 * sum, c.a);
if (delta == .0)
return hsl;
hsl.y = (hsl.z < .5) ? delta / sum : delta / (2.0 - sum);
if (high == c.r)
hsl.x = (c.g - c.b) / delta;
else if (high == c.g)
hsl.x = (c.b - c.r) / delta + 2.0;
else
hsl.x = (c.r - c.g) / delta + 4.0;
hsl.x = mod(hsl.x / 6., 1.);
return hsl;
}
vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords )
{
vec4 tex = Texel(texture, texture_coords);
vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba;
number low = min(tex.r, min(tex.g, tex.b));
number high = max(tex.r, max(tex.g, tex.b));
number delta = high - low;
number saturation_fac = 1. - max(0., 0.05*(1.1-delta));
vec4 hsl = HSL(vec4(tex.r*saturation_fac, tex.g*saturation_fac, tex.b, tex.a));
float t = moire.y*2.221 + mod(time,1.);
vec2 floored_uv = (floor((uv*texture_details.ba)))/texture_details.ba;
vec2 uv_scaled_centered = (floored_uv - 0.5) * 50.;
vec2 field_part1 = uv_scaled_centered + 50.*vec2(sin(-t / 143.6340), cos(-t / 99.4324));
vec2 field_part2 = uv_scaled_centered + 50.*vec2(cos( t / 53.1532), cos( t / 61.4532));
vec2 field_part3 = uv_scaled_centered + 50.*vec2(sin(-t / 87.53218), sin(-t / 49.0000));
float field = (1.+ (
cos(length(field_part1) / 19.483) + sin(length(field_part2) / 33.155) * cos(field_part2.y / 15.73) +
cos(length(field_part3) / 27.193) * sin(field_part3.x / 21.92) ))/2.;
float res = (.5 + .5* cos( (moire.x) * 2.612 + ( field + -.5 ) *3.14));
hsl.x = length(field_part2);
hsl.z = sin(hsl.z/2.5 - res/4. + sin(moire.y)/8. + 0.5)/1.4;
tex.rgb = RGB(hsl).rgb;
if (tex[3] < 0.7)
tex[3] = tex[3]/3.;
return dissolve_mask(tex*colour, texture_coords, uv);
}
extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos;
extern MY_HIGHP_OR_MEDIUMP float hovering;
extern MY_HIGHP_OR_MEDIUMP float screen_scale;
#ifdef VERTEX
vec4 position( mat4 transform_projection, vec4 vertex_position )
{
if (hovering <= 0.){
return transform_projection * vertex_position;
}
float mid_dist = length(vertex_position.xy - 0.5*love_ScreenSize.xy)/length(love_ScreenSize.xy);
vec2 mouse_offset = (vertex_position.xy - mouse_screen_pos.xy)/screen_scale;
float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -mid_dist);
return transform_projection * vertex_position + vec4(0.,0.,0.,scale);
}
#endif

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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 base = Cryptid and 10 or G.ARGS.score_intensity.required_score
local expo = Cryptid and G.ARGS.score_intensity.required_score or 10 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 Jane.sinister = (G.ARGS.score_intensity.earned_score / (big(base) ^ big(expo))):to_number() > 1
G.escapey_sinister = Jane.sinister
end''' end'''
match_indent = true match_indent = true
@ -58,16 +57,11 @@ 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
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)
SMODS.calculate_main_scoring({cardarea = area, full_hand = area.cards, scoring_hand = area.cards, scoring_name = text, poker_hands = poker_hands}, nil) SMODS.calculate_main_scoring({cardarea = area, full_hand = area.cards, scoring_hand = area.cards, scoring_name = text, poker_hands = poker_hands}, nil)
end 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''' else'''
match_indent = true match_indent = true
@ -128,27 +122,3 @@ pattern = '''hand_chips\*mult\)'''
position = "at" position = "at"
payload = "Jane.get_chipmult_sum(hand_chips, mult))" payload = "Jane.get_chipmult_sum(hand_chips, mult))"
match_indent = true 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

@ -1,10 +1,7 @@
{ {
"id": "jane", "id": "jane",
"name": "Almighty", "name": "Almighty",
"author": [ "author": ["jenwalter666", "Emik"],
"jenwalter666",
"Emik"
],
"description": "Fork of Jen's almanac that rebalances the mod by heavily toning down on the power creep and cutting out anything deemed not essential. Made out of genuine love for the original mod.", "description": "Fork of Jen's almanac that rebalances the mod by heavily toning down on the power creep and cutting out anything deemed not essential. Made out of genuine love for the original mod.",
"prefix": "jane", "prefix": "jane",
"main_file": "src/main.lua", "main_file": "src/main.lua",
@ -14,8 +11,6 @@
"Steamodded (>=1.0.0~ALPHA-1304a)", "Steamodded (>=1.0.0~ALPHA-1304a)",
"Bakery (>=0.1.26~*)" "Bakery (>=0.1.26~*)"
], ],
"conflicts": [ "conflicts": ["Jen"],
"Jen" "version": "0.1.9"
],
"version": "1.5.19"
} }

View file

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

View file

@ -2,100 +2,12 @@ SMODS.Atlas {
px = 71, px = 71,
py = 95, py = 95,
key = "janedecks", key = "janedecks",
path = Jane.config.texture_pack .. "/b_jane_decks.png", path = Jane.config.texture_pack .. "/b_jane_decks.png"
} }
SMODS.Atlas { local eternal_text = Cryptid and "Absolute" or "Eternal"
px = 73,
py = 95,
key = "janesleeves",
path = Jane.config.texture_pack .. "/sleeve_jane_sleeves.png",
}
local function back(x) SMODS.Back {
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 {
key = "nitro", key = "nitro",
atlas = "janedecks", atlas = "janedecks",
pos = {x = 1, y = 1}, pos = {x = 1, y = 1},
@ -107,232 +19,50 @@ back {
Cryptid and "set {C:attention}ante {}to the {C:attention}next" or "", Cryptid and "set {C:attention}ante {}to the {C:attention}next" or "",
Cryptid and "{C:attention}triangle number {}and create" or "", Cryptid and "{C:attention}triangle number {}and create" or "",
Cryptid and "an {C:spectral,E:1}Empowered Tag" or "create a {C:dark_edition}Negative {C:spectral,E:1}Soul", 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
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(_) 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.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 G.GAME.nitro = true
end, end,
alt_calculate = function(_, _, context) trigger_effect = function(_, args)
if context.end_of_round and not context.individual and not context.repetition and not context.retrigger_joker then if args.context == "eval" and G.GAME.last_blind and G.GAME.last_blind.boss then
Jane.q(function() Jane.q(function()
Jane.empowered() Jane.empowered()
return true
end) end)
end end
end,
calculate = function(_, _, context)
if Jane.is_end_of_ante(context) then
Jane.q(function()
Jane.empowered()
end)
end end
end,
} }
Jane.rain_world_jokers = { SMODS.Back {
"j_jane_monk", key = 'obsidian',
"j_jane_survivor", atlas = 'janedecks',
"j_jane_hunter",
"j_jane_gourmand",
"j_jane_artificer",
"j_jane_spearmaster",
"j_jane_rivulet",
"j_jane_saint",
"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
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 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)
end
back {
key = "karma",
atlas = "janedecks",
pos = {x = 3, y = 0},
loc_txt = {
name = "Karma Deck",
text = {
"Start with a",
"{C:legendary}Rain World Joker",
},
},
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)
end,
alt_calculate = function(_, _, context)
if Jane.is_end_of_ante(context) then
add_rain_world_joker()
end
end,
}
back {
key = "mysterious",
atlas = "janedecks",
pos = {x = 1, y = 0},
loc_txt = {
name = "Mysterious Deck",
text = {
"Jokers, consumables, and",
"playing cards are {C:green,E:1}randomized",
"when they are added",
"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
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 {
key = "obsidian",
atlas = "janedecks",
pos = {x = 2, y = 1}, pos = {x = 2, y = 1},
loc_txt = { loc_txt = {
name = "Obsidian Deck", name = 'Obsidian Deck',
text = { text = {
"{C:attention}Hidden{} cards {C:inactive}(ex. {C:spectral}Black Hole{C:inactive})", '{C:attention}Hidden{} cards {C:inactive}(ex. {C:spectral}The Soul{C:inactive})',
"can {C:attention}appear normally{}", 'can {C:attention}appear normally{}',
"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
end
return {vars = {}}
end,
alt_apply = function(_)
G.GAME.alt_obsidian = true
G.GAME.obsidian = true
redeem_omen_globe()
end,
apply = function(_) apply = function(_)
G.GAME.obsidian = true G.GAME.obsidian = true
redeem_omen_globe() end
end,
} }
local orig_get_current_pool = get_current_pool SMODS.Back {
key = "orrery",
---@diagnostic disable-next-line: lowercase-global atlas = "janedecks",
function get_current_pool(_type, ...) pos = {x = 0, y = 0},
local pool, pool_key = orig_get_current_pool(_type, ...) loc_txt = {
name = "Orrery Deck",
if not G.GAME.alt_obsidian or not ({ text = {
Code = true, "{C:attention}Hand stats {}are",
Chess = true, "always " .. (Cryptid and "{C:cry_ascendant}" or "{C:attention}") .. "equalized",
Tarot = true, }
Planet = true, },
Alphabet = true, apply = function(_)
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() Jane.q(function()
local orrery = {} local orrery = {}
G.GAME.orrery = orrery G.GAME.orrery = orrery
@ -344,146 +74,13 @@ local function apply_orrery()
end end
save_run() save_run()
end) return true
end end
)
local function rebalance_orrery()
local function small(x)
return type(x) == "table" and x:to_number() or x
end 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 = { SMODS.Back {
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 {
key = "orrery",
atlas = "janedecks",
pos = {x = 0, y = 0},
loc_txt = {
name = "Orrery Deck",
text = {
"{C:attention}Hand stats {}are",
"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 {
key = "tortoise", key = "tortoise",
atlas = "janedecks", atlas = "janedecks",
pos = {x = 3, y = 1}, pos = {x = 3, y = 1},
@ -492,32 +89,30 @@ back {
text = { text = {
"{C:attention}Ante increases", "{C:attention}Ante increases",
"{C:attention}half{} as strong", "{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(_) apply = function(_)
G.GAME.tortoise = true G.GAME.tortoise = true
end, end
} }
local function apply_weeck() SMODS.Back {
key = "weeck",
atlas = "janedecks",
pos = {x = 4, y = 1},
loc_txt = {
name = "Weeck",
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",
}
},
apply = function(_)
G.GAME.weeck = true G.GAME.weeck = true
Jane.q(function() 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") local new_card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_wee", "weeck")
new_card.ability.cry_absolute = true new_card.ability.cry_absolute = true
new_card.ability.eternal = true new_card.ability.eternal = true
@ -544,187 +139,24 @@ local function apply_weeck()
end end
save_run() save_run()
return true
end) end)
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 {
key = "weeck",
atlas = "janedecks",
pos = {x = 4, y = 1},
loc_txt = {
name = "Weeck",
text = Cryptid and {
"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 {
key = "omega",
atlas = "janedecks",
pos = {x = 5, y = 1},
loc_txt = {
name = "Omega Deck",
text = {
"Applies the {C:legendary,E:1}upsides",
"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()
local wee = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_wee", "weeck")
G.jokers:emplace(wee)
add_rain_world_joker()
G.GAME.tortoise = true
G.GAME.obsidian = true
G.GAME.mysterious = true
save_run()
end)
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)
G.GAME.mysterious = nil
if Jane.is_end_of_ante(context) then
add_rain_world_joker()
Jane.q(function()
Jane.empowered()
end)
end
end,
} }
local orig_ante = ease_ante local orig_ante = ease_ante
---@diagnostic disable-next-line: lowercase-global ---@diagnostic disable-next-line: lowercase-global
function ease_ante(mod) function ease_ante(mod)
local function next_number(x) local function next_triangle_number(x)
if G.GAME.alt_nitro then
local n = math.sqrt(x) + 1
return n * n
end
local n = (math.sqrt(8 * x + 1) - 1) / 2 local n = (math.sqrt(8 * x + 1) - 1) / 2
return (n + 1) * (n + 2) / 2 return (n + 1) * (n + 2) / 2
end 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 if G.GAME.nitro then
mod = Cryptid and mod = Cryptid and
(G.GAME.round_resets.ante < 0 and -G.GAME.round_resets.ante or (G.GAME.round_resets.ante < 0 and -G.GAME.round_resets.ante
math.ceil(next_number(G.GAME.round_resets.ante) - G.GAME.round_resets.ante)) or or math.ceil(next_triangle_number(G.GAME.round_resets.ante) - G.GAME.round_resets.ante)) or
(mod > 0 and mod * 2 or mod) (mod > 0 and mod * 2 or mod)
end end
@ -739,220 +171,5 @@ function ease_ante(mod)
mod = math.floor(mod / 2) + remainder mod = math.floor(mod / 2) + remainder
end end
if G.GAME.alt_tortoise then
mod = mod * -1
end
orig_ante(mod) orig_ante(mod)
end end
local orig_emplace = CardArea.emplace
function CardArea:emplace(card, location, stay_flipped)
local function randomize(targets, noanim)
local function go(i)
return function()
local c = targets[i]
c:set_base(pseudorandom_element(G.P_CARDS))
if pseudorandom(pseudoseed("chancetime")) > 1 / (#G.P_CENTER_POOLS["Enhanced"] + 1) then
c:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"], pseudoseed("spectral_chance")))
else
c:set_ability(G.P_CENTERS["c_base"])
end
local edition_rate = 2
c:set_edition(poll_edition("standard_edition" .. G.GAME.round_resets.ante, edition_rate, true))
local seal_rate = 10
local seal_poll = pseudorandom(pseudoseed("stdseal" .. G.GAME.round_resets.ante))
if seal_poll > 1 - 0.02 * seal_rate then
local seal_type = pseudorandom(pseudoseed("stdsealtype" .. G.GAME.round_resets.ante))
local seal_list = {}
for k, _ in pairs(G.P_SEALS) do
table.insert(seal_list, k)
end
seal_type = math.floor(seal_type * #seal_list)
c:set_seal(seal_list[seal_type])
else
c:set_seal()
end
if noanim then
c:flip()
play_sound("card3", 0.85 + (i - 0.999) / (#G.hand.cards - 0.998) * 0.3, 0.6)
end
c:juice_up(0.3, 0.3)
end
end
if #targets <= 0 then
return
end
if noanim then
for i = 1, #targets do
go(i)
end
else
for i = 1, #targets do
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)
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)
end
delay(0.2)
for i = 1, #targets do
Jane.q(go(i), 0.1)
end
end
end
local function rnd(seed, excluded_flags, pool, ignore_pooling, attempts)
excluded_flags = excluded_flags or {}
local selection = "n/a"
local passes = 0
local tries = attempts or 500
local pooling = false
if (SMODS.Mods.jane or {}).can_load and (G.GAME or {}).obsidian then
for k, v in ipairs(excluded_flags) do
if v == "hidden" then
table.remove(excluded_flags, k)
break
end
end
end
while true do
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]
if ignore_pooling then
pooling = true
else
if selection.in_pool and selection:in_pool() then
pooling = true
elseif not selection.in_pool then
pooling = true
end
end
for _, v in pairs(excluded_flags) do
if not selection[v] then
passes = passes + 1
end
end
if (pooling and passes >= #excluded_flags) or tries <= 0 then
return selection
end
end
end
if G.jokers and
G.hand and
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
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()
if card then
if card.added_to_deck then
card:remove_from_deck()
card.added_to_deck = nil
end
card:flip()
card:juice_up(0.3, 0.3)
play_sound("card1", 1, 0.6)
end
end, 0.75)
delay(0.75)
Jane.q(function()
if card then
card:flip()
card:juice_up(0.3, 0.3)
play_sound("card3", 1, 0.6)
card:set_ability(rnd("mysterious_deck_joker", {"no_mysterious"}, G.P_CENTER_POOLS.Joker))
if not card.added_to_deck then
card:add_to_deck()
end
end
end, 0.75)
elseif self == G.consumeables then
Jane.q(function()
if card then
if card.added_to_deck then
card:remove_from_deck()
card.added_to_deck = nil
end
card:flip()
card:juice_up(0.3, 0.3)
play_sound("card1", 1, 0.6)
end
end, 0.75)
delay(0.75)
Jane.q(function()
if card then
card:flip()
card:juice_up(0.3, 0.3)
play_sound("card3", 1, 0.6)
card:set_ability(
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
end, 0.75)
elseif (card.base or {}).value or (card.base or {}).suit then
randomize({card}, not G.GAME.mysterious_init)
end
end
Jane.q(function()
if card and self then
orig_emplace(self, card, location, stay_flipped)
end
end)
else
orig_emplace(self, card, location, stay_flipped)
if G.GAME.we then
two(card.ability)
end
end
end

View file

@ -4,7 +4,7 @@ SMODS.Atlas {
frames = 21, frames = 21,
key = "janeblinds", key = "janeblinds",
atlas_table = "ANIMATION_ATLAS", atlas_table = "ANIMATION_ATLAS",
path = Jane.config.texture_pack .. "/bl_jane_blinds.png", path = Jane.config.texture_pack .. "/bl_jane_blinds.png"
} }
local final_operations = { local final_operations = {
@ -53,6 +53,8 @@ local function offset_operator(by)
if changed_text then if changed_text then
play_sound("button", 1.1, 0.65) play_sound("button", 1.1, 0.65)
end end
return true
end) end)
end end
@ -63,7 +65,7 @@ end
SMODS.Blind { SMODS.Blind {
loc_txt = { loc_txt = {
name = "The Descending", name = "The Descending",
text = {"Decrease Chip-Mult", "operator by 1 level"}, text = {"Decrease Chip-Mult", "operator by 1 level"}
}, },
key = "descending", key = "descending",
config = {}, config = {},
@ -75,7 +77,8 @@ SMODS.Blind {
dollars = 6, dollars = 6,
defeat = function(_) defeat = function(_)
if not Cryptid then if not Cryptid then
offset_operator(2 - Jane.get_operator()) G.GAME.operator = 2
offset_operator(0)
elseif not G.GAME.blind.disabled then elseif not G.GAME.blind.disabled then
offset_operator(1) offset_operator(1)
end end
@ -101,7 +104,7 @@ SMODS.Blind {
SMODS.Blind { SMODS.Blind {
loc_txt = { loc_txt = {
name = "The Insignia", name = "The Insignia",
text = {"Hand must contain", "only one suit"}, text = {"Hand must contain", "only one suit"}
}, },
key = "insignia", key = "insignia",
config = {}, config = {},
@ -132,26 +135,19 @@ SMODS.Blind {
SMODS.Blind { SMODS.Blind {
loc_txt = { loc_txt = {
name = "The Wee", name = "The Wee",
text = {"Only 2s can be played"}, text = {"Only 2s can be played"}
}, },
key = "wee", key = "wee",
config = {}, config = {},
boss = {min = 2, max = 10, no_orb = true, hardcore = true}, boss = {min = 1, max = 10, no_orb = true, hardcore = true},
boss_colour = HEX("7F3F3F"), boss_colour = HEX("7F3F3F"),
atlas = "janeblinds", atlas = "janeblinds",
pos = {x = 0, y = 3}, pos = {x = 0, y = 3},
vars = {}, vars = {},
dollars = 2, dollars = 2,
disable = function(self) debuff_hand = function(_, cards, _, _, _)
self.disabled = true
end,
debuff_hand = function(self, cards, _, _, _)
if self.disabled then
return false
end
for _, v in ipairs(cards) do 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 return true
end end
end end
@ -159,10 +155,8 @@ SMODS.Blind {
get_loc_debuff_text = function(_) get_loc_debuff_text = function(_)
return "Hand must contain only 2s" return "Hand must contain only 2s"
end, end,
recalc_debuff = function(self, card, _) recalc_debuff = function(_, card, _)
return not self.disabled and return card:norank() or card:get_id() ~= 2
(card:norank() or card:get_id() ~= 2) and
(card.ability or {}).aikoyori_letters_stickers ~= "2"
end, end,
set_blind = function(self) set_blind = function(self)
if to_number(self.mult) == 0 then if to_number(self.mult) == 0 then

View file

@ -2,7 +2,7 @@ SMODS.Atlas {
px = 71, px = 71,
py = 95, py = 95,
key = "janebooster", key = "janebooster",
path = Jane.config.texture_pack .. "/p_jane_boosters.png", path = Jane.config.texture_pack .. "/p_jane_boosters.png"
} }
for i = 1, 2 do for i = 1, 2 do
@ -14,7 +14,7 @@ for i = 1, 2 do
"Choose {C:attention}#1#{} of up to", "Choose {C:attention}#1#{} of up to",
"{C:attention}#2# playing cards{} to", "{C:attention}#2# playing cards{} to",
"add to your deck", "add to your deck",
}, }
}, },
atlas = "janebooster", atlas = "janebooster",
pos = {x = 6, y = i - 1}, pos = {x = 6, y = i - 1},
@ -24,6 +24,28 @@ for i = 1, 2 do
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
return {vars = {card.ability.choose, card.ability.extra}} return {vars = {card.ability.choose, card.ability.extra}}
end, end,
ease_background_colour = function(_)
ease_background_colour_blind(G.STATES.STANDARD_PACK)
end,
create_UIBox = function(_)
return create_UIBox_standard_pack()
end,
particles = function(_)
G.booster_pack_sparkles = Particles(1, 1, 0,0, {
timer = 0.015,
scale = 0.3,
initialize = true,
lifespan = 3,
speed = 0.2,
padding = -1,
attach = G.ROOM_ATTACH,
colours = {G.C.BLACK, G.C.RED},
fill = true
})
G.booster_pack_sparkles.fade_alpha = 1
G.booster_pack_sparkles:fade(1, 0)
end,
create_card = function(_, _, _) create_card = function(_, _, _)
local edition = poll_edition("standard_edition"..G.GAME.round_resets.ante, 2, true) local edition = poll_edition("standard_edition"..G.GAME.round_resets.ante, 2, true)
local seal = SMODS.poll_seal({mod = 10}) local seal = SMODS.poll_seal({mod = 10})
@ -35,31 +57,9 @@ for i = 1, 2 do
area = G.pack_cards, area = G.pack_cards,
skip_materialize = true, skip_materialize = true,
soulable = true, soulable = true,
key_append = "sta", key_append = "sta"
} }
end, end,
create_UIBox = function(_)
return create_UIBox_standard_pack()
end,
ease_background_colour = function(_)
ease_background_colour_blind(G.STATES.STANDARD_PACK)
end,
particles = function(_)
G.booster_pack_sparkles = Particles(1, 1, 0, 0, {
timer = 0.015,
scale = 0.3,
initialize = true,
lifespan = 3,
speed = 0.2,
padding = -1,
attach = G.ROOM_ATTACH,
colours = {G.C.BLACK, G.C.RED},
fill = true,
})
G.booster_pack_sparkles.fade_alpha = 1
G.booster_pack_sparkles:fade(1, 0)
end,
} }
end end
@ -72,7 +72,7 @@ for i = 1, 2 do
"Choose {C:attention}#1#{} of up to", "Choose {C:attention}#1#{} of up to",
"{C:attention}#2# {C:tarot}Tarot{} cards to", "{C:attention}#2# {C:tarot}Tarot{} cards to",
"be used immediately", "be used immediately",
}, }
}, },
atlas = "janebooster", atlas = "janebooster",
pos = {x = 3 + i, y = 1}, pos = {x = 3 + i, y = 1},
@ -83,6 +83,28 @@ for i = 1, 2 do
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
return {vars = {card.ability.choose, card.ability.extra}} return {vars = {card.ability.choose, card.ability.extra}}
end, end,
ease_background_colour = function(_)
ease_background_colour_blind(G.STATES.TAROT_PACK)
end,
create_UIBox = function(_)
return create_UIBox_arcana_pack()
end,
particles = function(_)
G.booster_pack_sparkles = Particles(1, 1, 0,0, {
timer = 0.015,
scale = 0.2,
initialize = true,
lifespan = 1,
speed = 1.1,
padding = -1,
attach = G.ROOM_ATTACH,
colours = {G.C.WHITE, lighten(G.C.PURPLE, 0.4), lighten(G.C.PURPLE, 0.2), lighten(G.C.GOLD, 0.2)},
fill = true
})
G.booster_pack_sparkles.fade_alpha = 1
G.booster_pack_sparkles:fade(1, 0)
end,
create_card = function(_, _, _) create_card = function(_, _, _)
if G.GAME.used_vouchers.v_omen_globe and pseudorandom("omen_globe") > 0.8 then if G.GAME.used_vouchers.v_omen_globe and pseudorandom("omen_globe") > 0.8 then
return { return {
@ -101,29 +123,7 @@ for i = 1, 2 do
area = G.pack_cards, area = G.pack_cards,
skip_materialize = true, skip_materialize = true,
} }
end, end
create_UIBox = function(_)
return create_UIBox_arcana_pack()
end,
ease_background_colour = function(_)
ease_background_colour_blind(G.STATES.TAROT_PACK)
end,
particles = function(_)
G.booster_pack_sparkles = Particles(1, 1, 0, 0, {
timer = 0.015,
scale = 0.2,
initialize = true,
lifespan = 1,
speed = 1.1,
padding = -1,
attach = G.ROOM_ATTACH,
colours = {G.C.WHITE, lighten(G.C.PURPLE, 0.4), lighten(G.C.PURPLE, 0.2), lighten(G.C.GOLD, 0.2)},
fill = true,
})
G.booster_pack_sparkles.fade_alpha = 1
G.booster_pack_sparkles:fade(1, 0)
end,
} }
end end
@ -137,7 +137,7 @@ for i = 1, 2 do
"Choose {C:attention}#1#{} of up to", "Choose {C:attention}#1#{} of up to",
"{C:attention}#2# {C:planet}Planet{} cards to", "{C:attention}#2# {C:planet}Planet{} cards to",
"be used immediately", "be used immediately",
}, }
}, },
config = {extra = 2, choose = 1}, config = {extra = 2, choose = 1},
pos = {x = 3 + i, y = 0}, pos = {x = 3 + i, y = 0},
@ -146,6 +146,36 @@ for i = 1, 2 do
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
return {vars = {card.ability.choose, card.ability.extra}} return {vars = {card.ability.choose, card.ability.extra}}
end, end,
ease_background_colour = function(_) ease_background_colour_blind(G.STATES.PLANET_PACK) end,
create_UIBox = function(_) return create_UIBox_celestial_pack() end,
set_ability = function (_, card, _, delay_sprites)
card.ability = card.ability or {}
card.ability.set = "Booster"
card.ability.name = "Mini Celestial Pack"
end,
particles = function(_)
G.booster_pack_stars = Particles(1, 1, 0,0, {
fill = true,
scale = 0.1,
speed = 0.1,
timer = 0.07,
padding = -4,
lifespan = 15,
initialize = true,
attach = G.ROOM_ATTACH,
colours = {G.C.WHITE, HEX("a7d6e0"), HEX("fddca0")},
})
G.booster_pack_meteors = Particles(1, 1, 0,0, {
speed = 4,
timer = 2,
fill = true,
scale = 0.05,
lifespan = 1.5,
attach = G.ROOM_ATTACH,
colours = {G.C.WHITE},
})
end,
create_card = function(_, _, index) create_card = function(_, _, index)
if not G.GAME.used_vouchers.v_telescope or index ~= 1 then if not G.GAME.used_vouchers.v_telescope or index ~= 1 then
return { return {
@ -153,7 +183,7 @@ for i = 1, 2 do
area = G.pack_cards, area = G.pack_cards,
skip_materialize = true, skip_materialize = true,
soulable = true, soulable = true,
key_append = "pl1", key_append = "pl1"
} }
end end
@ -182,41 +212,7 @@ for i = 1, 2 do
area = G.pack_cards, area = G.pack_cards,
skip_materialize = true, skip_materialize = true,
} }
end, end
create_UIBox = function(_)
return create_UIBox_celestial_pack()
end,
ease_background_colour = function(_)
ease_background_colour_blind(G.STATES.PLANET_PACK)
end,
particles = function(_)
G.booster_pack_stars = Particles(1, 1, 0, 0, {
fill = true,
scale = 0.1,
speed = 0.1,
timer = 0.07,
padding = -4,
lifespan = 15,
initialize = true,
attach = G.ROOM_ATTACH,
colours = {G.C.WHITE, HEX("a7d6e0"), HEX("fddca0")},
})
G.booster_pack_meteors = Particles(1, 1, 0, 0, {
speed = 4,
timer = 2,
fill = true,
scale = 0.05,
lifespan = 1.5,
attach = G.ROOM_ATTACH,
colours = {G.C.WHITE},
})
end,
set_ability = function(_, card, _, _)
card.ability = card.ability or {}
card.ability.set = "Booster"
card.ability.name = "Mini Celestial Pack"
end,
} }
end end
@ -230,7 +226,7 @@ for i = 1, 2 do
"Choose {C:attention}#1#{} of up to", "Choose {C:attention}#1#{} of up to",
"{C:attention}#2# {C:spectral}Spectral{} cards to", "{C:attention}#2# {C:spectral}Spectral{} cards to",
"be used immediately", "be used immediately",
}, }
}, },
config = {extra = 1, choose = 1}, config = {extra = 1, choose = 1},
pos = {x = 3 + i, y = 2}, pos = {x = 3 + i, y = 2},
@ -240,21 +236,12 @@ for i = 1, 2 do
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
return {vars = {card.ability.choose, card.ability.extra}} return {vars = {card.ability.choose, card.ability.extra}}
end, end,
create_card = function(_, _, _) ease_background_colour = function(_)
return { ease_background_colour_blind(G.STATES.SPECTRAL_PACK)
soulable = true,
set = "Spectral",
key_append = "spe",
area = G.pack_cards,
skip_materialize = true,
}
end, end,
create_UIBox = function(_) create_UIBox = function(_)
return create_UIBox_spectral_pack() return create_UIBox_spectral_pack()
end, end,
ease_background_colour = function(_)
ease_background_colour_blind(G.STATES.SPECTRAL_PACK)
end,
particles = function(_) particles = function(_)
G.booster_pack_sparkles = Particles(1, 1, 0,0, { G.booster_pack_sparkles = Particles(1, 1, 0,0, {
scale = 0.1, scale = 0.1,
@ -271,163 +258,14 @@ for i = 1, 2 do
G.booster_pack_sparkles.fade_alpha = 1 G.booster_pack_sparkles.fade_alpha = 1
G.booster_pack_sparkles:fade(1, 0) G.booster_pack_sparkles:fade(1, 0)
end, end,
}
end
if Cryptid then
SMODS.Booster {
atlas = "janebooster",
key = "minicode",
loc_txt = {
name = "Mini Code Pack",
text = {
"Choose {C:attention}#1#{} of up to",
"{C:attention}#2# {C:green}Code{} cards to",
"be used immediately",
},
},
pos = {x = 6, y = 2},
config = {extra = 2, choose = 1},
cost = 2,
weight = 0.24,
create_card = function(_, _)
return create_card("Code", G.pack_cards, nil, nil, true, true, nil, "cry_program_3")
end,
ease_background_colour = function(_)
ease_colour(G.C.DYN_UI.MAIN, G.C.SET.Code)
ease_background_colour({new_colour = G.C.SET.Code, special_colour = G.C.BLACK, contrast = 2})
end,
loc_vars = function(self, _, card)
return {
vars = {
card and card.ability.choose or self.config.choose,
card and card.ability.extra or self.config.extra,
},
}
end,
cry_digital_hallucinations = {
colour = HEX("14b341"),
loc_key = "cry_plus_code",
create = function()
local ccard = create_card("Code", G.consumeables, nil, nil, nil, nil, nil, "diha")
ccard:set_edition({negative = true}, true)
ccard:add_to_deck()
G.consumeables:emplace(ccard)
end,
},
}
end
for i = 1, 2 do
SMODS.Booster {
key = "minitoken" .. i,
atlas = "janebooster",
loc_txt = {
name = "Mini Token Pack",
text = {
"Choose {C:attention}#1#{} of up to",
"{C:attention}#2# Token {}cards to",
"be used immediately",
},
},
pos = {x = i - 1, y = 5},
config = {extra = 2, choose = 1},
cost = 2,
weight = 0.2,
loc_vars = function(_, _, card)
return {vars = {card.ability.choose, card.ability.extra}}
end,
create_card = function(_, _, _) create_card = function(_, _, _)
return create_card("jane_tokens", G.pack_cards, nil, nil, true, true, nil, "jane_tokens" .. i) return {
end, soulable = true,
create_UIBox = function(_) set = "Spectral",
local size = SMODS.OPENED_BOOSTER.ability.extra key_append = "spe",
area = G.pack_cards,
G.pack_cards = CardArea( skip_materialize = true,
G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y,
math.max(1, math.min(size, 5)) * G.CARD_W * 1.1,
1.05 * G.CARD_H,
{card_limit = size, highlight_limit = 1, type = "consumeable"}
)
local t = {
n = G.UIT.ROOT,
config = {align = "tm", r = 0.15, colour = G.C.CLEAR, padding = 0.15},
nodes = {
{
n = G.UIT.R,
config = {align = "cl", colour = G.C.CLEAR, r = 0.15, padding = 0.1, minh = 2, shadow = true},
nodes = {
{
n = G.UIT.R,
config = {align = "cm"},
nodes = {
{
n = G.UIT.C,
config = {align = "cm", padding = 0.1},
nodes = {
{
n = G.UIT.C,
config = {align = "cm", r = 0.2, colour = G.C.CLEAR, shadow = true},
nodes = {
{n = G.UIT.O, config = {object = G.pack_cards}}},
}},
}},
},
{n = G.UIT.R, config = {align = "cm"}, nodes = {}},
{
n = G.UIT.R,
config = {align = "tm"},
nodes = {
{n = G.UIT.C, config = {align = "tm", padding = 0.05, minw = 2.4}, nodes = {}},
{
n = G.UIT.C,
config = {align = "tm", padding = 0.05},
nodes = {
UIBox_dyn_container({
{
n = G.UIT.C,
config = {align = "cm", padding = 0.05, minw = 4},
nodes = {
{
n = G.UIT.R,
config = {align = "bm", padding = 0.05},
nodes = {
{n = G.UIT.O, config = {object = DynaText({string = {"Token Pack"}, colours = {G.C.WHITE}, shadow = true, rotate = true, bump = true, spacing = 2, scale = 0.7, maxw = 4, pop_in = 0.5})}}},
},
{
n = G.UIT.R,
config = {align = "bm", padding = 0.05},
nodes = {
{n = G.UIT.O, config = {object = DynaText({string = {localize("k_choose") .. " "}, colours = {G.C.WHITE}, shadow = true, rotate = true, bump = true, spacing = 2, scale = 0.5, pop_in = 0.7})}},
{n = G.UIT.O, config = {object = DynaText({string = {{ref_table = G.GAME, ref_value = "pack_choices"}}, colours = {G.C.WHITE}, shadow = true, rotate = true, bump = true, spacing = 2, scale = 0.5, pop_in = 0.7})}}},
}},
},
})},
},
{
n = G.UIT.C,
config = {align = "tm", padding = 0.05, minw = 2.4},
nodes = {
{n = G.UIT.R, config = {minh = 0.2}, nodes = {}},
{
n = G.UIT.R,
config = {align = "tm", padding = 0.2, minh = 1.2, minw = 1.8, r = 0.15, colour = G.C.GREY, one_press = true, button = "skip_booster", hover = true, shadow = true, func = "can_skip_booster"},
nodes = {
{n = G.UIT.T, config = {text = localize("b_skip"), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = "y", orientation = "bm"}, func = "set_button_pip"}}},
}},
}},
}},
}},
} }
return t
end,
ease_background_colour = function(_)
ease_background_colour {new_colour = HEX(i == 1 and "F0C197" or "FD5F55"), special_colour = HEX("000000"), contrast = 5}
end,
in_pool = function(_, _)
return G.GAME.used_vouchers.v_jane_token_voucher
end, end,
} }
end end

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,25 +1,24 @@
SMODS.Shader({key = "moire", path = "moire.fs"})
SMODS.Shader({key = "polygloss", path = "polygloss.fs"})
SMODS.Sound({key = "e_jumbo", path = "e_jumbo.ogg"}) SMODS.Sound({key = "e_jumbo", path = "e_jumbo.ogg"})
SMODS.Sound({key = "e_moire", path = "e_moire.ogg"}) SMODS.Shader({key = "polygloss", path = "polygloss.fs"})
SMODS.Sound({key = "e_polygloss", path = "e_polygloss.ogg"}) SMODS.Sound({key = "e_polygloss", path = "e_polygloss.ogg"})
local function allow_moire() local function resize(card, mod, force_save)
if Cryptid then if force_save or not card.origsize then
return true card.origsize = {w = card.T.w, h = card.T.h}
end end
for _, v in pairs(SMODS.find_card("j_jane_saint")) do card:hard_set_T(card.T.x, card.T.y, card.T.w * mod, card.T.h * mod)
if v.ability.extra.is_attuned then remove_all(card.children)
return true card.children = {}
end card.children.shadow = Moveable(0, 0, 0, 0)
end card:set_sprites(card.config.center, card.base.id and card.config.card)
return false if card.area and
((G.shop_jokers and card.area == G.shop_jokers) or
(G.shop_booster and card.area == G.shop_booster) or
(G.shop_vouchers and card.area == G.shop_vouchers)) then
create_shop_card_ui(card)
end end
local function get_weight(self)
return G.GAME.edition_rate * self.weight * (allow_moire() and 1 or 0)
end end
SMODS.Edition({ SMODS.Edition({
@ -27,36 +26,33 @@ SMODS.Edition({
loc_txt = { loc_txt = {
name = "Polygloss", name = "Polygloss",
label = "Polygloss", label = "Polygloss",
text = Cryptid and { text = {
"{C:chips}+#1#{} Chips", "{C:chips}+#1#{}, {X:chips,C:white}x#2#{} & {X:chips,C:dark_edition}^#3#{} Chips",
"{C:mult}+#2#{}, {X:mult,C:white}X#3#{}, & {X:mult,C:dark_edition}^#4#{} Mult", "{C:mult}+#4#{}, {X:mult,C:white}x#5#{} & {X:mult,C:dark_edition}^#6#{} Mult",
"{C:money}$#5# {}when scored", "Generates {C:money}+$#7#",
} or { }
"{C:chips}+#1#{} Chips",
"{C:mult}+#2#{} & {X:mult,C:white}X#3#{} Mult",
"{C:money}$#4# {}when scored",
}, },
config = {chips = 1, mult = 1, x_chips = 1.1, x_mult = 1.1, e_chips = 1.01, e_mult = 1.01, p_dollars = 1},
sound = {
sound = "jane_e_polygloss",
per = 1.2,
vol = 0.4
}, },
config = {
mult = 2,
chips = 12,
x_mult = 1.2,
p_dollars = 1,
e_mult = Cryptid and 1.02 or nil,
},
sound = {sound = "jane_e_polygloss", per = 1.2, vol = 0.4},
weight = 8, weight = 8,
extra_cost = 4, extra_cost = 2,
in_shop = true, in_shop = true,
shader = "polygloss", shader = "polygloss",
apply_to_float = false, apply_to_float = false,
loc_vars = function(self, _, _) loc_vars = function(self)
local vars = {self.config.chips} return {vars = {
vars[#vars + 1] = self.config.mult self.config.chips,
vars[#vars + 1] = self.config.x_mult self.config.x_chips,
vars[#vars + 1] = self.config.e_mult self.config.e_chips,
vars[#vars + 1] = self.config.p_dollars self.config.mult,
return {vars = vars} self.config.x_mult,
self.config.e_mult,
self.config.p_dollars
}}
end, end,
calculate = function(_, card, context) calculate = function(_, card, context)
if context.pre_joker then if context.pre_joker then
@ -68,6 +64,8 @@ SMODS.Edition({
return { return {
e_mult = card.edition.e_mult, e_mult = card.edition.e_mult,
x_mult = card.edition.x_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, p_dollars = card.edition.p_dollars,
} }
elseif context.main_scoring and context.cardarea == G.play then elseif context.main_scoring and context.cardarea == G.play then
@ -76,21 +74,14 @@ SMODS.Edition({
chips = card.edition.chips, chips = card.edition.chips,
e_mult = card.edition.e_mult, e_mult = card.edition.e_mult,
x_mult = card.edition.x_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, p_dollars = card.edition.p_dollars,
} }
end end
end, end,
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 local jumbo_modifier = Cryptid and 100 or 2
SMODS.Edition({ SMODS.Edition({
@ -102,13 +93,18 @@ SMODS.Edition({
"All card values are", "All card values are",
"{C:attention}multiplied{} by {C:attention}up to " .. jumbo_modifier, "{C:attention}multiplied{} by {C:attention}up to " .. jumbo_modifier,
"{C:inactive}(If possible)", "{C:inactive}(If possible)",
"{C:inactive,E:1,s:0.7}Whoa, it's huge!!{}", "{C:inactive,E:1,s:0.7}Whoa, it's huge!!{}"
}, }
}, },
on_apply = function(card) on_apply = function(card)
Jane.q(function() G.E_MANAGER:add_event(Event({
Jane.resize(card, Jane.config.wee_sizemod) blocking = false,
end, nil, nil, nil, false, false) blockable = false,
func = function()
resize(card, Jane.config.wee_sizemod)
return true
end
}))
local obj = card:gc() local obj = card:gc()
@ -127,9 +123,14 @@ SMODS.Edition({
end end
end, end,
on_remove = function(card) on_remove = function(card)
Jane.q(function() G.E_MANAGER:add_event(Event({
Jane.resize(card, 1 / Jane.config.wee_sizemod) blocking = false,
end, nil, nil, nil, false, false) blockable = false,
func = function()
resize(card, 1 / Jane.config.wee_sizemod)
return true
end
}))
local was_added = card.added_to_deck local was_added = card.added_to_deck
@ -143,42 +144,18 @@ SMODS.Edition({
card:add_to_deck() card:add_to_deck()
end end
end, end,
sound = {sound = "jane_e_jumbo", per = 1, vol = 0.5}, config = {twos_scored = 0},
weight = 4, sound = {
extra_cost = 5, sound = "jane_e_jumbo",
per = 1,
vol = 0.5
},
weight = 0.8,
in_shop = true, in_shop = true,
shader = false, shader = false,
apply_to_float = false, extra_cost = 12,
get_weight = get_weight,
})
SMODS.Edition({
key = "moire",
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",
},
},
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,
extra_cost = 6,
in_shop = true,
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 return G.GAME.edition_rate * self.weight
end, end,
loc_vars = function(self, _, _)
return {vars = {self.config.e_chips, self.config.e_mult}}
end,
calculate = function(self, _, context)
if context.post_joker or context.main_scoring and context.cardarea == G.play then
return {e_chips = self.config.e_chips, e_mult = self.config.e_mult}
end
end,
}) })

View file

@ -11,10 +11,6 @@ for i = 1, 6 do
SMODS.Sound({key = "grand" .. i, path = "grand_dad" .. i .. ".ogg"}) SMODS.Sound({key = "grand" .. i, path = "grand_dad" .. i .. ".ogg"})
end end
SMODS.Sound({key = "corrupt_milestone", path = "corrupt_milestone.ogg"})
SMODS.Sound({key = "corrupt_untick", path = "corrupt_untick.ogg"})
SMODS.Sound({key = "corrupt_tick", path = "corrupt_tick.ogg"})
local exotic = Cryptid and "cry_exotic" or 4 local exotic = Cryptid and "cry_exotic" or 4
local food = { local food = {
@ -46,7 +42,7 @@ local granddad_palette = {
HEX("155fd9"), HEX("155fd9"),
HEX("ff8170"), HEX("ff8170"),
HEX("ffffff"), HEX("ffffff"),
HEX("6c0700"), HEX("6c0700")
} }
local function food_jokers_count() local function food_jokers_count()
@ -70,6 +66,7 @@ local function grand_dad(card)
Jane.q(function() Jane.q(function()
card:juice_up(0.5, 0.5) card:juice_up(0.5, 0.5)
return true
end) end)
local rnd = math.random(6) local rnd = math.random(6)
@ -127,8 +124,6 @@ local maxie_quotes = {
}, },
} }
local maxie_limit = 25
SMODS.Joker { SMODS.Joker {
key = "maxie", key = "maxie",
atlas = "janemaxie", atlas = "janemaxie",
@ -137,7 +132,7 @@ SMODS.Joker {
text = { text = {
"{C:attention}+#1# {}booster pack slot#2#", "{C:attention}+#1# {}booster pack slot#2#",
"{C:inactive,s:0.75,E:1}#3#{C:red,s:1.5,E:1}#4#", "{C:inactive,s:0.75,E:1}#3#{C:red,s:1.5,E:1}#4#",
}, }
}, },
config = {extra = {choices = Cryptid and 2 or 1}}, config = {extra = {choices = Cryptid and 2 or 1}},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
@ -146,153 +141,77 @@ SMODS.Joker {
cost = 6, cost = 6,
rarity = 2, rarity = 2,
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
return { return {vars = {
vars = {
card.ability.extra.choices, card.ability.extra.choices,
card.ability.extra.choices == 1 and "" or "s", card.ability.extra.choices == 1 and "" or "s",
Jane.sinister and "" or pseudorandom_element(maxie_quotes.normal, pseudoseed("MaxieQuotes")), Jane.sinister and "" or pseudorandom_element(maxie_quotes.normal, pseudoseed("MaxieQuotes")),
Jane.sinister and pseudorandom_element(maxie_quotes.scared, pseudoseed("MaxieQuotes")) or "", Jane.sinister and pseudorandom_element(maxie_quotes.scared, pseudoseed("MaxieQuotes")) or "",
}, }}
}
end, end,
calculate = function(_, card, context) calculate = function(_, card, context)
local min = math.min(card.ability.extra.choices, maxie_limit)
card.ability.extra.choices = min
if context.starting_shop then if context.starting_shop then
for _ = 1, min do for _ = 1, card.ability.extra.choices do
SMODS.add_booster_to_shop() SMODS.add_booster_to_shop()
end end
end end
end, end
} }
function Jane.update_honey()
if not G.GAME then
return
end
local honey = SMODS.find_card("j_jane_honey")
local mergeable = {}
local max = 1
for _, v in pairs(honey) do
local level = tonumber(v.ability.extra.level) or 1
max = math.max(max, level)
if not mergeable[level] then
mergeable[level] = v
elseif level == 1 then
mergeable[0] = v
end
end
for i = math.min(max, #Jane.rarity_ids - 2), 1, -1 do
if not mergeable[i] then
goto continue
end
local skip = true
for j = i - 1, i == 1 and 0 or 1, -1 do
if not mergeable[j] then
break
end
skip = j > 1
end
if skip then
goto continue
end
for j = i - 1, i == 1 and 0 or 1, -1 do
mergeable[i].sell_cost = mergeable[i].sell_cost + mergeable[j].sell_cost
mergeable[j].ability.extra.level = "-1"
mergeable[j]:start_dissolve()
end
mergeable[i].ability.extra.level = tostring(tonumber(mergeable[i].ability.extra.level) + 1)
play_sound("jane_corrupt_milestone", 0.9 ^ (tonumber(mergeable[i].ability.extra.level) - 2))
::continue::
end
end
SMODS.Joker { SMODS.Joker {
key = "honey", key = "honey",
atlas = "janehoney", atlas = "janehoney",
loc_txt = { loc_txt = {
name = "Honey{C:dark_edition}#1#", name = "Honey{C:dark_edition}#1#",
text = { text = {
"{C:attention}#2#{}#3#", "{C:attention}Common#2#{}#3#",
"#4#cannot appear", "#4#cannot appear",
"#5#{C:attention}#6#", "#5#{C:attention}#6#",
"{C:dark_edition}#7#{}#8#{C:inactive,s:0.75,E:1}#9#", "{C:dark_edition}#7#{}#8#{C:inactive,s:0.75,E:1}#9#",
"{C:inactive,s:0.75,E:1}#10#{C:red,s:1.5,E:1}#11#", "{C:inactive,s:0.75,E:1}#10#{C:red,s:1.5,E:1}#11#",
}
}, },
}, config = {extra = {is_corrupted = false}},
config = {extra = {level = "1"}}, -- Strings do not get mutated by other mods
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
sinis = {x = 2, y = 0}, sinis = {x = 2, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
eternal_compat = false,
cost = 8, cost = 8,
rarity = 3, rarity = 3,
add_to_deck = function(_, _, _)
local honey = SMODS.find_card("j_jane_honey")
for _, v in ipairs(honey) do
if not v.ability.extra.is_corrupted and v ~= honey[#honey] then
v.sell_cost = v.sell_cost + honey[#honey].sell_cost
v.ability.extra.is_corrupted = true
honey[#honey]:start_dissolve()
honey[#honey] = nil
end
end
end,
loc_vars = function(_, _, card) loc_vars = function(_, _, card)
local level = tonumber(card.ability.extra.level) local is_corrupted = card.ability.extra.is_corrupted
local function level_name(i) return {vars = {
local acc = "" is_corrupted and " (Corrupted)" or "",
local prefixes = {"super", "hyper", "ultra"} is_corrupted and " and Uncommon" or "",
while i > 0 do
acc = prefixes[((i - 1) % 3) + 1] .. acc
i = math.floor(i / 3)
end
return #acc == 0 and "Corrupted" or acc:gsub("^%l", string.upper) .. "corrupted"
end
local is_corrupted = level > 1
local exclusions = is_corrupted and "" or Jane.rarity_names[level]
local separator = level == 2 and " " or (is_corrupted and ", " or "")
if is_corrupted then
for i = 1, level do
exclusions = exclusions .. separator .. (i == level and "and " or "") .. Jane.rarity_names[i]
end
end
return {
vars = {
is_corrupted and " (" .. level_name(level - 2) .. ")" or "",
(exclusions or ""):sub(#separator),
is_corrupted and "" or " jokers", is_corrupted and "" or " jokers",
is_corrupted and "jokers " or "", is_corrupted and "jokers " or "",
is_corrupted and (level >= #Jane.rarity_names - 1 and "Cannot be upgraded." or "") or "Getting another ", is_corrupted and "" or "Getting another ",
is_corrupted and "" or "Honey", is_corrupted and "" or "Honey",
is_corrupted and "" or "corrupts ", is_corrupted and "" or "corrupts ",
is_corrupted and "" or "this Joker", is_corrupted and "" or "this Joker",
Jane.sinister and "" or (is_corrupted and "*Her eyes are looking around," or ""), Jane.sinister and "" or (is_corrupted and "*Her eyes are looking around," or ""),
Jane.sinister and "" or Jane.sinister and "" or (is_corrupted and "as if she wants to say something...*" or "Buzzzzz! I'll do my best!"),
(is_corrupted and "as if she wants to say something...*" or "Buzzzzz! I'll do my best!"),
Jane.sinister and (is_corrupted and "..." or "S-STOP THAT!! YOU'RE FREAKING ME OOOUT!!!") or "", Jane.sinister and (is_corrupted and "..." or "S-STOP THAT!! YOU'RE FREAKING ME OOOUT!!!") or "",
}, }}
}
end, end,
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 = extra.is_corrupted 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)
if not Jane.sinister and level > 2 then
card:juice_up(0, math.random() * (level - 2) / #Jane.rarity_ids)
end
end, end,
} }
@ -303,21 +222,14 @@ end
local orig_rarity = SMODS.poll_rarity local orig_rarity = SMODS.poll_rarity
function SMODS.poll_rarity(_pool_key, _rand_key) function SMODS.poll_rarity(_pool_key, _rand_key)
local max = 0 local is_corrupted
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, v.ability.extra.level) is_corrupted = is_corrupted or v.ability.extra.is_corrupted
end end
local rarity = orig_rarity(_pool_key, _rand_key) local rarity = orig_rarity(_pool_key, _rand_key)
return (is_corrupted and (rarity == 1 or rarity == 2)) and 3 or ((is_corrupted ~= nil and rarity == 1) and 2 or rarity)
for i = 1, max do
if rarity == Jane.rarity_ids[i] then
return Jane.rarity_ids[max + 1] or Jane.rarity_ids[#Jane.rarity_ids]
end
end
return rarity
end end
local oxy_quotes = { local oxy_quotes = {
@ -331,38 +243,8 @@ local oxy_quotes = {
"...H-how are you doing t-that...?", "...H-how are you doing t-that...?",
"This is... unsettling...", "This is... unsettling...",
"S-... So much power...", "S-... So much power...",
},
} }
function Jane.oxy(card, removed)
local extra = card.ability.extra or {}
local destroyed_steel = 0
for _, v in pairs(removed or {}) do
if (v.ability or {}).name == "Steel Card" then
destroyed_steel = destroyed_steel + 1
end
end
if destroyed_steel > 0 then
extra.progress = extra.progress + destroyed_steel
play_sound("jane_corrupt_tick")
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{
message = (extra.is_corrupted and "+" or "-") .. destroyed_steel,
colour = extra.is_corrupted and G.C.PURPLE or G.C.GREY,
} }
)
end
end
local steel = 2
SMODS.Joker { SMODS.Joker {
key = "oxy", key = "oxy",
@ -370,33 +252,31 @@ SMODS.Joker {
loc_txt = { loc_txt = {
name = "Oxy{C:dark_edition}#1#", name = "Oxy{C:dark_edition}#1#",
text = { text = {
"{C:attention}Scored steel {}cards", "{C:attention}Scored steel {}cards give",
"give {X:mult,C:white}X#2#{} {C:mult}Mult", "{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}#3#{}#4#{C:red}#5#{C:attention}#6#",
"{C:dark_edition,E:1}#7#{}#8#", "{C:dark_edition,E:1}#7#{}#8#",
"#9#{C:dark_edition,E:1}#10#", "#9#{C:dark_edition,E:1}#10#",
"{C:inactive,s:0.75,E:1}#11#{C:red,s:1.5,E:1}#12#", "{C:inactive,s:0.75,E:1}#11#{C:red,s:1.5,E:1}#12#",
}
}, },
}, config = {extra = {corrupted_steel = 2.5, is_corrupted = false, milestone = 3, progress = 0, steel = 1.5}},
config = {extra = {corrupted_steel = 6, is_corrupted = false, milestone = 3, progress = 0}},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
sinis = {x = 2, y = 0}, sinis = {x = 2, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
blueprint_compat = true, blueprint_compat = true,
cost = Cryptid and 8 or 20, cost = Cryptid and 8 or 20,
rarity = Cryptid and 3 or 4, rarity = Cryptid and 3 or 4,
loc_vars = function(_, info_queue, card) loc_vars = function(_, _, card)
info_queue[#info_queue + 1] = G.P_CENTERS.m_steel
local ability = card.ability.extra or {} local ability = card.ability.extra or {}
local milestone = ability.milestone local milestone = ability.milestone
local progress = ability.progress local progress = ability.progress
local is_corrupted = ability.is_corrupted local is_corrupted = ability.is_corrupted
local amount = is_corrupted and ability.corrupted_steel or steel local amount = is_corrupted and ability.corrupted_steel or ability.steel
local effective = is_corrupted and progress or milestone - progress local effective = is_corrupted and progress or milestone - progress
local plural = effective == 1 and "" or "s" local plural = effective == 1 and "" or "s"
return { return {vars = {
vars = {
is_corrupted and " (Corrupted)" or "", is_corrupted and " (Corrupted)" or "",
amount, amount,
is_corrupted and "Purifies " or "", is_corrupted and "Purifies " or "",
@ -407,13 +287,9 @@ SMODS.Joker {
is_corrupted and "Destroying steel cards" or "this Joker", is_corrupted and "Destroying steel cards" or "this Joker",
is_corrupted and "prolongs the " or "", is_corrupted and "prolongs the " or "",
is_corrupted and "corruption" or "", is_corrupted and "corruption" or "",
Jane.sinister and "" or Jane.sinister and "" or (is_corrupted and pseudorandom_element(oxy_quotes.normal, pseudoseed("OxyQuotes")) or "We all cut close..."),
(is_corrupted and pseudorandom_element(oxy_quotes.normal, pseudoseed("OxyQuotes")) or "We all cut close..."), Jane.sinister and (is_corrupted and pseudorandom_element(oxy_quotes.scared, pseudoseed("OxyQuotes")) or "WHAT ARE YOU DOING DOWN THERE?!?") or "",
Jane.sinister and }}
(is_corrupted and pseudorandom_element(oxy_quotes.scared, pseudoseed("OxyQuotes")) or "WHAT ARE YOU DOING DOWN THERE?!?") or
"",
},
}
end, end,
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
@ -425,14 +301,35 @@ SMODS.Joker {
end, end,
calculate = function(_, card, context) calculate = function(_, card, context)
local extra = card.ability.extra or {} local extra = card.ability.extra or {}
Jane.oxy(card, context.removed) local destroyed_steel = 0
for _, v in pairs(context.removed or {}) do
if (v.ability or {}).name == "Steel Card" then
destroyed_steel = destroyed_steel + 1
end
end
if destroyed_steel > 0 then
extra.progress = extra.progress + destroyed_steel
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{
message = (extra.is_corrupted and "+" or "-") .. destroyed_steel,
colour = extra.is_corrupted and G.C.PURPLE or G.C.GREY
}
)
end
if context.end_of_round and if context.end_of_round and
extra.progress > 0 and not extra.progress > 0 and not
context.individual and not context.individual and not
context.repetition and not context.repetition and not
context.retrigger_joker then context.retrigger_joker then
play_sound("jane_corrupt_untick")
extra.progress = extra.progress - 1 extra.progress = extra.progress - 1
card_eval_status_text( card_eval_status_text(
@ -443,7 +340,7 @@ SMODS.Joker {
nil, nil,
{ {
message = extra.is_corrupted and "-1" or "+1", message = extra.is_corrupted and "-1" or "+1",
colour = extra.is_corrupted and G.C.PURPLE or G.C.GREY, colour = extra.is_corrupted and G.C.PURPLE or G.C.GREY
} }
) )
end end
@ -453,28 +350,35 @@ SMODS.Joker {
(extra.progress <= 0 and extra.is_corrupted)) then (extra.progress <= 0 and extra.is_corrupted)) then
extra.is_corrupting = true extra.is_corrupting = true
Jane.q(function() G.E_MANAGER:add_event(Event({
delay = 0.1,
func = function()
card:flip() card:flip()
play_sound("card1") 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:flip()
card:juice_up(1, 1) card:juice_up(1, 1)
play_sound("card1") play_sound("card1")
play_sound("jane_corrupt_milestone")
extra.is_corrupted = not extra.is_corrupted extra.is_corrupted = not extra.is_corrupted
extra.is_corrupting = nil extra.is_corrupting = nil
end, 1) return true
end
}))
end end
if context.individual and if context.individual and
context.cardarea == G.play and context.cardarea == G.play and
context.other_card.ability.name == "Steel Card" then context.other_card.ability.name == "Steel Card" then
local amount = extra.is_corrupted and extra.corrupted_steel or steel local amount = extra.is_corrupted and extra.corrupted_steel or extra.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 end
end,
} }
if Cryptid then if Cryptid then
@ -482,7 +386,6 @@ if Cryptid then
end end
local operator = Cryptid and "^" or "X" local operator = Cryptid and "^" or "X"
local operator_prefix = Cryptid and "{X:dark_edition,C:mult}" or "{X:mult,C:white}"
SMODS.Joker { SMODS.Joker {
key = "betmma", key = "betmma",
@ -490,12 +393,12 @@ SMODS.Joker {
loc_txt = { loc_txt = {
name = "Betmma", name = "Betmma",
text = { 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: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 = {big_num_scaler = true, extra = {tet = Cryptid and 0.1 or 0.5}},
config = {extra = {tet = Cryptid and 0.25 or 0.5}},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
blueprint_compat = true, blueprint_compat = true,
@ -518,10 +421,10 @@ SMODS.Joker {
card = card, card = card,
colour = G.C.jane_RGB, colour = G.C.jane_RGB,
message = operator .. number_format(num), message = operator .. number_format(num),
[Cryptid and "e_mult" or "x_mult"] = num, [Cryptid and "Echips_mod" or "Xchips_mod"] = num,
}, true }, true
end end
end, end
} }
SMODS.Joker { SMODS.Joker {
@ -531,14 +434,14 @@ SMODS.Joker {
text = { text = {
"This Joker has a {C:jane_RGB,E:1}strange", "This Joker has a {C:jane_RGB,E:1}strange",
"{C:jane_RGB,E:1}reaction {}to scored {C:attention}7{}s", "{C:jane_RGB,E:1}reaction {}to scored {C:attention}7{}s",
}, }
}, },
config = {}, config = {},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
atlas = "jane7granddad", atlas = "jane7granddad",
blueprint_compat = true, blueprint_compat = true,
cost = Cryptid and 49 or 7, cost = Cryptid and 50 or 8,
rarity = Cryptid and exotic or 3, rarity = Cryptid and exotic or 3,
loc_vars = function(_, _, center) loc_vars = function(_, _, center)
return {vars = {center.ability.shopslots}} return {vars = {center.ability.shopslots}}
@ -558,47 +461,61 @@ SMODS.Joker {
if context.other_card and context.other_card:get_id() == 7 and scj(context) then if context.other_card and context.other_card:get_id() == 7 and scj(context) then
grand_dad(card) grand_dad(card)
local palette = granddad_palette[math.random(#granddad_palette)] local palette = granddad_palette[math.random(#granddad_palette)]
local rnd = pseudorandom(pseudoseed("granddad"), 1, Cryptid and 5 or 4) local rnd = pseudorandom(pseudoseed("granddad"), 1, Cryptid and 7 or 5)
if rnd == 1 then if rnd == 1 then
return { return {
message = Cryptid and "+777" or "+77", message = "+777",
chips = Cryptid and 777 or 77, chips = 777,
colour = palette, colour = palette,
card = card, card = card
}, true }, true
elseif rnd == 2 then elseif rnd == 2 then
return { return {
message = Cryptid and "+777 Mult" or "+77 Mult", message = "+777 Mult",
mult = Cryptid and 777 or 77, mult = 777,
colour = palette, colour = palette,
card = card, card = card
}, true }, true
elseif rnd == 3 then elseif rnd == 3 then
return { return {
message = "+$7", message = "+$7",
dollars = 7, dollars = 7,
colour = palette, colour = palette,
card = card, card = card
}, true }, true
elseif rnd == 4 then elseif rnd == 4 then
return { return {
message = Cryptid and "X7 Mult" or "X1.77 Mult", message = "x7",
x_mult = Cryptid and 7 or 1.77, x_chips = 7,
colour = palette, colour = palette,
card = card, card = card
}, true
elseif rnd == 5 then
return {
message = "x7 Mult",
x_mult = 7,
colour = palette,
card = card
}, true
elseif rnd == 6 then
return {
message = "^1.77",
e_chips = 1.77,
colour = palette,
card = card
}, true }, true
else else
return { return {
message = "^1.77 Mult", message = "^1.77 Mult",
e_mult = 1.77, e_mult = 1.77,
colour = palette, colour = palette,
card = card, card = card
}, true }, true
end end
end end
end end
end, end
} }
SMODS.Joker { SMODS.Joker {
@ -607,30 +524,29 @@ SMODS.Joker {
loc_txt = { loc_txt = {
name = "Peppino Spaghetti", name = "Peppino Spaghetti",
text = { 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", "{C:attention}food or Peppino Joker",
"in your possession", "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}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
config = {extra = {base = 2}},
rarity = exotic, rarity = exotic,
blueprint_compat = true, blueprint_compat = true,
cost = Cryptid and 50 or 20, cost = Cryptid and 50 or 20,
loc_vars = function(_, _, card) loc_vars = function(_, _, _)
return {vars = {card.ability.extra.base ^ food_jokers_count()}} return {vars = {2 ^ food_jokers_count()}}
end, end,
calculate = function(_, card, context) calculate = function(_, _, context)
local count = food_jokers_count() local count = food_jokers_count()
if context.joker_main and count > 0 then if context.joker_main and count > 0 then
return { return {
colour = G.C.DARK_EDITION, colour = G.C.DARK_EDITION,
message = operator .. card.ability.extra.base ^ count .. " Mult", message = operator .. 2 ^ count .. " Mult",
[Cryptid and "e_mult" or "x_mult"] = card.ability.extra.base ^ count, [Cryptid and "Emult_mod" or "Xmult_mod"] = 2 ^ count,
}, true }, true
end end
end, end
} }

View file

@ -2,17 +2,13 @@ Jane = {
config = { config = {
wee_sizemod = 1.25, wee_sizemod = 1.25,
texture_pack = "default", texture_pack = "default",
bans = {"j_cry_crustulum", "c_cry_hammerspace"}, bans = {"j_cry_crustulum", "c_cry_hammerspace"}
}, },
} }
Jane.misprintize = (Cryptid or {}).misprintize Jane.misprintize = (Cryptid or {}).misprintize
Jane.misprintize_tbl = (Cryptid or {}).misprintize_tbl Jane.misprintize_tbl = (Cryptid or {}).misprintize_tbl
Jane.misprinitze_val = (Cryptid or {}).misprintize_val Jane.misprinitze_val = (Cryptid or {}).misprintize_val
Jane.rarity_ids = Cryptid and {1, 2, 3, "cry_epic", 4, "cry_exotic", "jane_junk"} or {1, 2, 3, 4, "jane_junk"}
Jane.rarity_names = Cryptid and {"Common", "Uncommon", "Rare", "Epic", "Legendary", "Exotic", "Junk"} or
{"Common", "Uncommon", "Rare", "Legendary", "Junk"}
if not Jane.misprintize then if not Jane.misprintize then
assert(SMODS.load_file("src/misprintize.lua"))() assert(SMODS.load_file("src/misprintize.lua"))()
@ -41,7 +37,7 @@ function Jane.card_status_text(
sound, sound,
volume, volume,
pitch, pitch,
trigger, trig,
f f
) )
if (delay or 0) <= 0 then if (delay or 0) <= 0 then
@ -56,7 +52,7 @@ function Jane.card_status_text(
backdrop_colour = colour or (G.C.FILTER), backdrop_colour = colour or (G.C.FILTER),
align = align or "bm", align = align or "bm",
major = card, major = card,
offset = {x = xoffset or 0, y = yoffset or (-0.05 * G.CARD_H)}, offset = {x = xoffset or 0, y = yoffset or (-0.05*G.CARD_H)}
}) })
if sound then if sound then
@ -75,8 +71,10 @@ function Jane.card_status_text(
G.ROOM.jiggle = G.ROOM.jiggle + jiggle G.ROOM.jiggle = G.ROOM.jiggle + jiggle
end end
else else
Jane.q( G.E_MANAGER:add_event(Event({
function() trigger = trig,
delay = delay,
func = function()
if f and type(f) == "function" then if f and type(f) == "function" then
f(card) f(card)
end end
@ -88,7 +86,7 @@ function Jane.card_status_text(
backdrop_colour = colour or (G.C.FILTER), backdrop_colour = colour or (G.C.FILTER),
align = align or "bm", align = align or "bm",
major = card, major = card,
offset = {x = xoffset or 0, y = yoffset or (-0.05 * G.CARD_H)}, offset = {x = xoffset or 0, y = yoffset or (-0.05*G.CARD_H)}
}) })
if sound then if sound then
@ -106,18 +104,17 @@ function Jane.card_status_text(
if jiggle then if jiggle then
G.ROOM.jiggle = G.ROOM.jiggle + jiggle G.ROOM.jiggle = G.ROOM.jiggle + jiggle
end end
end,
delay, return true
nil, end
trigger }))
)
end end
end end
function Jane.empowered() function Jane.empowered()
if Cryptid then if Cryptid then
add_tag(Tag("tag_cry_empowered")) add_tag(Tag("tag_cry_empowered"))
return return true
end end
local card = create_card("Spectral", G.consumeables, nil, nil, nil, nil, "c_soul", "acceleration_soul") local card = create_card("Spectral", G.consumeables, nil, nil, nil, nil, "c_soul", "acceleration_soul")
@ -152,57 +149,35 @@ function Jane.get_operator()
return math.max(math.min(G.GAME.operator, 3), 1) return math.max(math.min(G.GAME.operator, 3), 1)
end end
function Jane.hidden(card) function Jane.get_small_chipmult_sum(chips, mult)
return G.GAME and not G.GAME.obsidian and local ret = Jane.get_chipmult_sum()
(type(card) == "table" and (card.name == "Black Hole" or card.name == "The Soul") or card.hidden) return type(ret) == "table" and ret:to_number() or ret
end end
function Jane.is_end_of_ante(context, card) function Jane.hidden(card)
return not context.individual and not return G.GAME and not
context.repetition and not G.GAME.obsidian and
(card or {}).debuff and type(card) == 'table' and
context.end_of_round and not (card.name == "Black Hole" or card.name == "The Soul" or card.hidden)
context.blueprint and
G.GAME.blind.boss and not
(G.GAME.blind.config and G.GAME.blind.config.bonus)
end end
function Jane.play_sound(sound, per, vol) function Jane.play_sound(sound, per, vol)
Jane.q(function()
play_sound(sound, per, vol)
end)
end
function Jane.resize(card, mod, force_save)
if force_save or not card.origsize then
card.origsize = {w = card.T.w, h = card.T.h}
end
card:hard_set_T(card.T.x, card.T.y, card.T.w * mod, card.T.h * mod)
remove_all(card.children)
card.children = {}
card.children.shadow = Moveable(0, 0, 0, 0)
card:set_sprites(card.config.center, card.base.id and card.config.card)
if card.area and
((G.shop_jokers and card.area == G.shop_jokers) or
(G.shop_booster and card.area == G.shop_booster) or
(G.shop_vouchers and card.area == G.shop_vouchers)) then
create_shop_card_ui(card)
end
end
function Jane.q(func, delay, timer, trigger, blockable, blocking)
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
delay = delay, func = function()
timer = timer, play_sound(sound,per,vol)
trigger = (delay and not trigger) and "after" or trigger, return true
blocking = blocking, end
blockable = blockable, }))
func = function(...) end
local ret = func(...)
return ret == nil and true or ret function Jane.q(fc, de, t, tr, bl, ba)
end, G.E_MANAGER:add_event(Event({
timer = t,
trigger = tr,
delay = de,
blockable = bl,
blocking = ba,
func = fc
})) }))
end end
@ -218,6 +193,17 @@ function Card:nosuit()
return self.ability.name == "Stone Card" or self.config.center.no_suit return self.ability.name == "Stone Card" or self.config.center.no_suit
end 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 local orig_menu = Game.main_menu
function Game:main_menu(change_context) function Game:main_menu(change_context)
@ -240,11 +226,80 @@ function Game:update(dt)
end end
end end
local function hsv(h, s, v) local function hand(name, chip, mul, lv, notif, snd, vol, pit, de)
if s <= 0 then local config = {
return v, v, v 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 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 h = h * 6
local c = v * s local c = v * s
local x = (1 - math.abs((h % 2) - 1)) * c local x = (1 - math.abs((h % 2) - 1)) * c
@ -268,15 +323,15 @@ function Game:update(dt)
end end
orig_update(self, dt) orig_update(self, 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.floor(8 * math.sqrt(blind)) / blind
Jane.update_honey()
if not Jane.bans_done then if not Jane.bans_done then
Jane.bans_done = true
delete_hardbans() delete_hardbans()
Jane.bans_done = true
end end
if (G.GAME or {}).banned_keys then if (G.GAME or {}).banned_keys then
@ -293,6 +348,18 @@ function Game:update(dt)
self.C.jane_RGB_HUE = (self.C.jane_RGB_HUE + 0.5) % 360 self.C.jane_RGB_HUE = (self.C.jane_RGB_HUE + 0.5) % 360
G.ARGS.LOC_COLOURS.jane_RGB = self.C.jane_RGB G.ARGS.LOC_COLOURS.jane_RGB = self.C.jane_RGB
end 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 end
SMODS.Atlas { SMODS.Atlas {
@ -313,7 +380,6 @@ for _, v in ipairs({
"back", "back",
"blind", "blind",
"booster", "booster",
"challenge",
"edition", "edition",
"joker", "joker",
"slugcat", "slugcat",

View file

@ -1,8 +1,9 @@
-- The following code is slightly adapted from -- The following code is slightly adapted from
-- https://github.com/MathIsFun0/Cryptid/blob/main/lib/misprintize.lua -- https://github.com/MathIsFun0/Cryptid/blob/main/lib/misprintize.lua
local base_values = {} local base_values = {}
local big_num_allowlist = { local big_num_whitelist = {
j_egg = true, j_egg = true,
j_wee = true, j_wee = true,
j_flash = true, j_flash = true,
@ -101,7 +102,7 @@ local function is_card_big(joker)
return false return false
end end
return big_num_allowlist[center.key or "Nope!"] return big_num_whitelist[center.key or "Nope!"]
end end
local function log_random(seed, min, max) local function log_random(seed, min, max)
@ -113,6 +114,7 @@ local function log_random(seed, min, max)
end end
function Jane.misprintize_val(val, override, big) function Jane.misprintize_val(val, override, big)
return is_number(val) and check( return is_number(val) and check(
format( format(
val * log_random( val * log_random(
@ -245,7 +247,6 @@ function Jane.misprintize(card, override, force_reset, stack)
end) end)
end end
end end
if (not force_reset or G.GAME.modifiers.cry_jkr_misprint_mod) and if (not force_reset or G.GAME.modifiers.cry_jkr_misprint_mod) and
(G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker") and not (G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker") and not
stack or not stack or not

View file

@ -5,36 +5,6 @@ for i = 1, 8 do
SMODS.Sound({key = "gore" .. i, path = "gore" .. i .. ".ogg"}) SMODS.Sound({key = "gore" .. i, path = "gore" .. i .. ".ogg"})
end 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({ for _, v in pairs({
"artificer", "artificer",
"hunter", "hunter",
@ -50,7 +20,7 @@ for _, v in pairs({
key = "jane" .. v, key = "jane" .. v,
px = 71, px = 71,
py = 95, py = 95,
path = Jane.config.texture_pack .. "/j_jane_" .. v .. ".png", path = Jane.config.texture_pack .. "/j_jane_" .. v .. ".png"
} }
end end
@ -59,13 +29,10 @@ local exotic = Cryptid and "cry_exotic" or 4
SMODS.Rarity { SMODS.Rarity {
key = "junk", key = "junk",
default_weight = 1e-9,
loc_txt = {name = "Junk"}, loc_txt = {name = "Junk"},
badge_colour = G.C.JOKER_GREY, badge_colour = G.C.JOKER_GREY,
} }
local monk_limit = 25
SMODS.Joker { SMODS.Joker {
key = "monk", key = "monk",
atlas = "janemonk", atlas = "janemonk",
@ -76,7 +43,7 @@ SMODS.Joker {
"cards {C:attention}#1# time#2# {}if", "cards {C:attention}#1# time#2# {}if",
"hand contains {C:attention}#3#", "hand contains {C:attention}#3#",
"or fewer card#4#", "or fewer card#4#",
}, }
}, },
config = {extra = {retriggers = 2, requirement = 4}}, config = {extra = {retriggers = 2, requirement = 4}},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
@ -89,14 +56,12 @@ SMODS.Joker {
local retriggers = extra.retriggers local retriggers = extra.retriggers
local requirement = extra.requirement local requirement = extra.requirement
return { return {vars = {
vars = {
retriggers, retriggers,
retriggers == 1 and "" or "s", retriggers == 1 and "" or "s",
requirement, requirement,
requirement == 1 and "" or "s", requirement == 1 and "" or "s"
}, }}
}
end, end,
calculate = function(_, card, context) calculate = function(_, card, context)
if not context.repetition or if not context.repetition or
@ -106,16 +71,13 @@ SMODS.Joker {
return return
end end
local min = math.min(card.ability.extra.retriggers, monk_limit)
card.ability.extra.retriggers = min
return { return {
card = card,
repetitions = min,
colour = G.C.ORANGE,
message = localize("k_again_ex"), message = localize("k_again_ex"),
repetitions = card.ability.extra.retriggers,
colour = G.C.ORANGE,
card = card
}, true }, true
end, end
} }
SMODS.Joker { SMODS.Joker {
@ -125,10 +87,10 @@ SMODS.Joker {
name = "The Survivor", name = "The Survivor",
text = { text = {
"All cards held in hand", "All cards held in hand",
"{C:attention}contribute to scoring" .. (Cryptid and " {}and" or ""), "{C:attention}contribute to scoring {}and",
Cryptid and "are all considered as" or nil, "are all considered as",
Cryptid and "the {C:attention}first played card" or nil, "the {C:attention}first played card",
}, }
}, },
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
@ -136,7 +98,7 @@ SMODS.Joker {
rarity = 4, rarity = 4,
} }
local hunter = {5, 4, 3, 2, 1} local hunter = {7, 5, 3, 2, 1}
SMODS.Joker { SMODS.Joker {
key = "hunter", key = "hunter",
@ -149,32 +111,28 @@ SMODS.Joker {
(Cryptid and "an {C:spectral}Empowered Tag" or "a {C:dark_edition}Negative {C:spectral}Soul") .. " {}after #1#", (Cryptid and "an {C:spectral}Empowered Tag" or "a {C:dark_edition}Negative {C:spectral}Soul") .. " {}after #1#",
"When {C:attention}sold#2#{}, turns#3#", "When {C:attention}sold#2#{}, turns#3#",
"#4#{C:red}The Rot{} without rewards", "#4#{C:red}The Rot{} without rewards",
}, }
}, },
config = {extra = {rounds_left = hunter[1]}}, config = {extra = {rounds_left = hunter[1]}},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
eternal_compat = false, eternal_compat = false,
perishable_compat = false,
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
cost = Cryptid and 15 or 8, cost = Cryptid and 20 or 8,
rarity = Cryptid and epic or 3, rarity = Cryptid and 4 or 3,
loc_vars = function(_, info_queue, card) loc_vars = function(_, _, card)
local function rounds(amount) local function rounds(amount)
return " round" .. ((math.abs(amount) > 1 or math.abs(amount) == 0) and "s" or "") return " round" .. ((math.abs(amount) > 1 or math.abs(amount) == 0) and "s" or "")
end end
info_queue[#info_queue + 1] = Cryptid and G.P_CENTERS.c_cry_empowered or G.P_CENTERS.c_soul
local rounds_left = card.ability.extra.rounds_left local rounds_left = card.ability.extra.rounds_left
local sold = rounds_left - hunter[3] local sold = rounds_left - hunter[2]
return { return {vars = {
vars = {
rounds_left .. rounds(rounds_left) .. (rounds_left <= 0 and "...?" or ""), rounds_left .. rounds(rounds_left) .. (rounds_left <= 0 and "...?" or ""),
sold <= 0 and "" or " after " .. sold .. rounds(sold), sold <= 0 and "" or " after " .. sold .. rounds(sold),
sold <= 0 and " into" or "", sold <= 0 and " into" or "",
sold <= 0 and "" or "into ", sold <= 0 and "" or "into ",
}, }}
}
end, end,
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
@ -192,7 +150,6 @@ SMODS.Joker {
local function spawn_rot() local function spawn_rot()
card:flip() card:flip()
card:juice_up(2, 0.8) 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.card_status_text(card, "Dead!", nil, 0.05 * card.T.h, G.C.BLACK, 2, 0, 0, nil, "bm", "jane_gore6")
Jane.q(function() Jane.q(function()
@ -202,26 +159,31 @@ SMODS.Joker {
card:set_eternal(nil) card:set_eternal(nil)
card2:set_eternal(true) card2:set_eternal(true)
play_sound("jane_gore5") play_sound("jane_gore5")
return true
end) end)
Jane.q(function()
card:start_dissolve()
end, 1)
end end
local function die() local function die()
spawn_rot()
Jane.q(function() Jane.q(function()
Jane.empowered() Jane.empowered()
return true
end, 0.1) end, 0.1)
spawn_rot() Jane.q(function()
card:start_dissolve()
return true
end, 1)
return true
end end
if context.blueprint then if context.blueprint then
return return
end end
if context.selling_self and card.ability.extra.rounds_left <= hunter[3] then if context.selling_self and card.ability.extra.rounds_left <= hunter[2] then
spawn_rot() spawn_rot()
elseif not context.individual and not context.repetition and not context.retrigger_joker then elseif not context.individual and not context.repetition and not context.retrigger_joker then
if G.GAME.round_resets.hands <= 0 then if G.GAME.round_resets.hands <= 0 then
@ -230,13 +192,17 @@ SMODS.Joker {
if not card.hunter_prep then if not card.hunter_prep then
card.hunter_prep = true card.hunter_prep = true
Jane.q(function()
Jane.q(function() Jane.q(function()
card.hunter_prep = nil card.hunter_prep = nil
if G.GAME.current_round.hands_left < G.GAME.round_resets.hands then 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) ease_hands_played(G.GAME.round_resets.hands - G.GAME.current_round.hands_left)
end end
return true
end)
return true
end) end)
end end
@ -247,8 +213,7 @@ SMODS.Joker {
card.hunter_prep = nil card.hunter_prep = nil
card.ability.extra.rounds_left = card.ability.extra.rounds_left - 1 card.ability.extra.rounds_left = card.ability.extra.rounds_left - 1
local rl = card.ability.extra.rounds_left local rl = card.ability.extra.rounds_left
Jane.card_status_text(card, tostring(card.ability.extra.rounds_left), nil, nil, G.C.RED, nil, nil, nil, nil, Jane.card_status_text(card, tostring(card.ability.extra.rounds_left), nil, nil, G.C.RED, nil, nil, nil, nil, nil, "generic1")
nil, "generic1")
if rl > hunter[2] then if rl > hunter[2] then
card:juice_up(0.6, 0.1) card:juice_up(0.6, 0.1)
@ -281,10 +246,10 @@ SMODS.Joker {
else else
card:juice_up(2, 0.8) card:juice_up(2, 0.8)
Jane.play_sound("jane_warning_heartbeat") Jane.play_sound("jane_warning_heartbeat")
Jane.q(die, 0) G.E_MANAGER:add_event(Event({trigger = "after", func = die}))
end
end end
end end
end,
} }
SMODS.Joker { SMODS.Joker {
@ -297,7 +262,7 @@ SMODS.Joker {
"are {C:attention}multiplied{} by {C:attention}#1#", "are {C:attention}multiplied{} by {C:attention}#1#",
"when they are created", "when they are created",
"{C:inactive}(If possible)", "{C:inactive}(If possible)",
}, }
}, },
loc_vars = function(_, _, center) loc_vars = function(_, _, center)
return {vars = {center.ability.modifier}} return {vars = {center.ability.modifier}}
@ -337,7 +302,7 @@ SMODS.Joker {
text = { text = {
"Grants the {C:green}ability{} to {C:red}destroy", "Grants the {C:green}ability{} to {C:red}destroy",
"selected {C:attention}playing cards", "selected {C:attention}playing cards",
}, }
}, },
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
@ -348,18 +313,12 @@ SMODS.Joker {
return not card.debuff and Jane.can_use() and next(G.hand.highlighted) return not card.debuff and Jane.can_use() and next(G.hand.highlighted)
end, end,
Bakery_use_joker = function(_, _) Bakery_use_joker = function(_, _)
for _, v in pairs(SMODS.find_card("j_jane_oxy")) do
Jane.oxy(v, G.hand.highlighted)
end
for _, v in pairs(G.hand.highlighted) do for _, v in pairs(G.hand.highlighted) do
v:start_dissolve() v:start_dissolve()
end end
end, end,
} }
local spearmaster_limit = 25
SMODS.Joker { SMODS.Joker {
key = "spearmaster", key = "spearmaster",
atlas = "janespearmaster", atlas = "janespearmaster",
@ -369,15 +328,12 @@ SMODS.Joker {
"You can choose {C:attention}any number of cards", "You can choose {C:attention}any number of cards",
"after opening {C:attention}any Booster Pack", "after opening {C:attention}any Booster Pack",
"{C:attention}Booster Packs{} have {C:green}+#1#{} additional cards", "{C:attention}Booster Packs{} have {C:green}+#1#{} additional cards",
}
}, },
}, loc_vars = function(_, _, center)
config = {extra = {choices = 1}}, return {vars = {center.ability.extra.extrachoices}}
loc_vars = function(_, _, card)
return {vars = {card.ability.extra.choices}}
end,
calculate = function(_, card, _)
card.ability.extra.choices = math.min(card.ability.extra.choices, spearmaster_limit)
end, end,
config = {extra = {extrachoices = 1}},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
cost = Cryptid and 12 or 20, cost = Cryptid and 12 or 20,
@ -393,7 +349,7 @@ function Card:open()
if next(spearmasters) then if next(spearmasters) then
for _, v in pairs(spearmasters) do for _, v in pairs(spearmasters) do
orig = orig + v.ability.extra.choices orig = orig + v.ability.extra.extrachoices
end end
self.config.choose = math.floor(orig) self.config.choose = math.floor(orig)
@ -402,11 +358,17 @@ function Card:open()
orig_open(self) orig_open(self)
Jane.q(function() G.E_MANAGER:add_event(Event({
delay = 0.5,
timer = "REAL",
func = function()
if next(spearmasters) then if next(spearmasters) then
G.GAME.pack_choices = math.floor(self.ability.extra) G.GAME.pack_choices = math.floor(self.ability.extra)
end end
end, 0.5, "REAL")
return true
end
}))
end end
SMODS.Joker { SMODS.Joker {
@ -417,7 +379,7 @@ SMODS.Joker {
text = { text = {
"Non-{C:dark_edition}editioned{} cards are", "Non-{C:dark_edition}editioned{} cards are",
"{C:attention}given a random {C:dark_edition}Edition", "{C:attention}given a random {C:dark_edition}Edition",
}, }
}, },
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
@ -447,7 +409,8 @@ 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 not
self.edition and 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_rivulet")) then
@ -457,19 +420,29 @@ function Card:draw(layer)
orig_draw(self, layer) orig_draw(self, layer)
end 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() local function attunement()
return (G.GAME or {}).weeckweeck and 2 or (Cryptid and 1.002 or 1.2) local function polygloss(tbl)
local sum = 0
for _, v in pairs(tbl) do
if (v.edition or {}).key == "e_jane_polygloss" then
sum = sum + 1
end
end
return sum
end
if Cryptid then
return 1.001
end
local cards = polygloss(G.playing_cards) + polygloss(G.jokers.cards) + polygloss(G.consumeables.cards)
local base = 1.01
local round = 100
local expo = cards * 2
local error_correction = 1e-10
return math.floor(base ^ expo * round + error_correction) / round
end end
SMODS.Joker { SMODS.Joker {
@ -477,16 +450,13 @@ SMODS.Joker {
atlas = "janesaint", atlas = "janesaint",
loc_txt = { loc_txt = {
name = "The Saint{C:jane_RGB}#1#", name = "The Saint{C:jane_RGB}#1#",
text = Cryptid and { text = {
"{C:spectral}Analog{}, {C:spectral}Ankh{}, {C:spectral}Gateway{}, and", "{C:spectral}#2# {}will {C:attention}not destroy Jokers",
"{C:spectral,s:0.95}Summoning {s:0.95}will {C:attention,s:0.95}not destroy Jokers", "{C:jane_RGB}#3#{}#4#{X:black,C:jane_RGB,s:1.5}#5#{C:spectral}#6#{C:chips}#7#{}#8#{C:mult}#9#",
"{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}#10#{C:attention,s:1.25}#11#{C:inactive,s:1.25}#12#{C:inactive}#13#{C:jane_RGB}#14#" ..
"{C:inactive,s:1.25}#7#{C:attention,s:1.25}#8#{C:inactive,s:1.25}#9#{C:inactive}#10#", (Cryptid and "{C:inactive}" or "{C:inactive,s:0.75}") ..
} or { "#15#",
"{C:spectral}Ankh {}will {C:attention}not destroy Jokers", }
"{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 = Cryptid and 10 or 3}}, config = {extra = {karma = 0, max_karma = Cryptid and 10 or 3}},
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
@ -494,51 +464,31 @@ SMODS.Joker {
cost = 20, cost = 20,
rarity = 4, rarity = 4,
blueprint_compat = true, blueprint_compat = true,
loc_vars = function(_, info_queue, card) loc_vars = function(_, _, 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 extra = card.ability.extra
local karma = extra.karma local karma = extra.karma
local max_karma = extra.max_karma local max_karma = extra.max_karma
local attuned = karma >= max_karma local attuned = karma >= max_karma
return { return {vars = {
vars = Cryptid and {
attuned and " (Attuned)" or "", attuned and " (Attuned)" or "",
Cryptid and "Ankh and Gateway" or "Ankh",
attuned and "" or "Attune ", attuned and "" or "Attune ",
attuned and "" or "after using ", attuned and "" or "after using ",
attuned and "^^" .. attunement() or max_karma, attuned and (Cryptid and "^^" or "^") .. attunement() or max_karma,
attuned and "" or " Gateways", attuned and "" or (Cryptid and " Gateways" or " Ankh or Soul Cards"),
attuned and " Chips " or "",
attuned and "& " or "",
attuned and "Mult" or "", attuned and "Mult" or "",
attuned and "" or "[", attuned and "" or "[",
attuned and "" or karma, attuned and "" or karma,
attuned and "" or " / " .. max_karma .. "]", attuned and "" or " / " .. max_karma .. "]",
attuned and "(Cannot be debuffed)" or "", attuned and "(Cannot be debuffed" .. (Cryptid and "" or ", scales with ") or "",
} or { attuned and (Cryptid and "" or "polygloss") or "",
attuned and " (Attuned)" or "", attuned and ")" 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.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 local extra = card.ability.extra
card.children.floating_sprite:set_sprite_pos({x = 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})
@ -547,86 +497,34 @@ SMODS.Joker {
calculate = function(_, card, context) calculate = function(_, card, context)
local extra = card.ability.extra local extra = card.ability.extra
local max_karma = extra.max_karma local max_karma = extra.max_karma
extra.is_attuned = extra.is_attuned and extra.karma >= max_karma extra.is_attuned = 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
if extra.is_attuned then
card.debuff = false
if extra.karma >= max_karma then
if card.ability then if card.ability then
card.ability.perishable = false card.ability.perishable = false
card.ability.perish_tally = 1e9 card.ability.perish_tally = 1e9
end end
if Cryptid and not context.joker_main then card.debuff = false
return
end
if not Cryptid and not context.other_joker and (not context.individual or context.cardarea ~= G.play) then if not context.joker_main then
return return
end end
local attune = attunement() local attune = attunement()
local trigger = ({ if attune == 1 then
e_holo = {mult = 50}, return
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",
[Cryptid and "EEchip_mod" or "Echip_mod"] = attune,
[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]
if trigger then
trigger.card = card
end end
return trigger return {
elseif extra.karma >= max_karma then card = card,
ascend() colour = G.C.jane_RGB,
sound = "talisman_eeechip",
message = "^^" .. attune .. " Chips & Mult",
[Cryptid and "EEchip_mod" or "Echip_mod"] = attune,
[Cryptid and "EEmult_mod" or "Emult_mod"] = attune,
}, true
end end
if not (not context.blueprint and if not (not context.blueprint and
@ -638,6 +536,7 @@ SMODS.Joker {
local key = context.consumeable:gc().key local key = context.consumeable:gc().key
-- TODO: Make ankh not destroy jokers
if Cryptid and key ~= "c_cry_gateway" or not Cryptid and (key ~= "c_ankh" and key ~= "c_soul") then if Cryptid and key ~= "c_cry_gateway" or not Cryptid and (key ~= "c_ankh" and key ~= "c_soul") then
return return
end end
@ -667,8 +566,40 @@ SMODS.Joker {
return return
end end
ascend() Jane.card_status_text(
end, 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
} }
if Cryptid then if Cryptid then
@ -685,19 +616,13 @@ SMODS.Joker {
"Clogs up your Joker slots", "Clogs up your Joker slots",
"{C:attention}Duplicates itself{} at the", "{C:attention}Duplicates itself{} at the",
"end of {C:attention}every ante", "end of {C:attention}every ante",
}, }
}, },
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0}, soul_pos = {x = 1, y = 0},
cost = 1, cost = 1,
rarity = "jane_junk", rarity = "jane_junk",
in_pool = function (_, _) in_pool = function (_, _)
for _, v in pairs(SMODS.find_card("j_jane_honey")) do
if tonumber(v.ability.extra.level) == #Jane.rarity_ids - 1 then
return true
end
end
return not not next(SMODS.find_card("j_jane_rot")) return not not next(SMODS.find_card("j_jane_rot"))
end, end,
calculate = function(_, card, context) calculate = function(_, card, context)
@ -705,11 +630,17 @@ SMODS.Joker {
return G.jokers.config.card_count < G.jokers.config.card_limit return G.jokers.config.card_count < G.jokers.config.card_limit
end end
local function spawn() local function is_end_of_ante()
if card.cloned then return not context.individual and not
return 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 end
local function spawn()
local rot = copy_card(card) local rot = copy_card(card)
rot.cloned = true rot.cloned = true
rot:add_to_deck() rot:add_to_deck()
@ -717,10 +648,10 @@ SMODS.Joker {
Jane.card_status_text(rot, "...", nil, 0.05 * card.T.h, G.C.BLACK, 3, 0, 0, nil, "bm") Jane.card_status_text(rot, "...", nil, 0.05 * card.T.h, G.C.BLACK, 3, 0, 0, nil, "bm")
end 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) spawn()
else else
card.cloned = false card.cloned = false
end end
end, end
} }

View file

@ -2,7 +2,7 @@ SMODS.Atlas {
key = "janertarots", key = "janertarots",
px = 71, px = 71,
py = 95, py = 95,
path = Jane.config.texture_pack .. "/c_jane_reversetarots.png", path = Jane.config.texture_pack .. "/c_jane_reversetarots.png"
} }
SMODS.Sound({key = "draw", path = "draw.ogg"}) SMODS.Sound({key = "draw", path = "draw.ogg"})
@ -12,9 +12,12 @@ local function conjure(card, number)
math.ceil(card.ability.extra.spectrals) * number, math.ceil(card.ability.extra.spectrals) * number,
G.consumeables.config.card_limit - #G.consumeables.cards G.consumeables.config.card_limit - #G.consumeables.cards
) do ) 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 if G.consumeables.config.card_limit <= #G.consumeables.cards then
return return true
end end
play_sound("jane_draw") play_sound("jane_draw")
@ -22,16 +25,20 @@ local function conjure(card, number)
spectral:add_to_deck() spectral:add_to_deck()
G.consumeables:emplace(spectral) G.consumeables:emplace(spectral)
card:juice_up(0.3, 0.5) card:juice_up(0.3, 0.5)
end, 0.4) return true
end
}))
end end
end end
local function create_full_deck(enhancement, edition, amount, emplacement) local function createfulldeck(enhancement, edition, amount, emplacement)
local cards = {} local cards = {}
for _, v in pairs(G.P_CARDS) do for _, v in pairs(G.P_CARDS) do
for i = 1, amount or 1 do for i = 1, (amount or 1) do
Jane.q(function() G.E_MANAGER:add_event(Event({
delay = 0.1,
func = function()
cards[i] = true cards[i] = true
G.playing_card = (G.playing_card and G.playing_card + 1) or 1 G.playing_card = (G.playing_card and G.playing_card + 1) or 1
@ -56,7 +63,10 @@ local function create_full_deck(enhancement, edition, amount, emplacement)
else else
G.deck:emplace(card) G.deck:emplace(card)
end end
end, 0.1)
return true
end
}))
end end
end end
@ -64,6 +74,13 @@ local function create_full_deck(enhancement, edition, amount, emplacement)
if next(cards) then if next(cards) then
playing_card_joker_effects(cards) playing_card_joker_effects(cards)
end end
return true
end)
Jane.q(function()
cards = nil
return true
end) end)
end end
@ -108,11 +125,16 @@ local function randomize(targets, noanim)
for i = 1, #targets do for i = 1, #targets do
local percent = 1.15 - (i - 0.999) / (#G.hand.cards - 0.998) * 0.3 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() targets[i]:flip()
play_sound("card1", percent) play_sound("card1", percent)
targets[i]:juice_up(0.3, 0.3) targets[i]:juice_up(0.3, 0.3)
end, 0.15) return true
end
}))
end end
delay(0.2) delay(0.2)
@ -120,7 +142,10 @@ local function randomize(targets, noanim)
for i = 1, #targets do for i = 1, #targets do
local percent = 0.85 + (i - 0.999) / (#G.hand.cards - 0.998) * 0.3 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] local card = targets[i]
card:set_base(pseudorandom_element(G.P_CARDS)) card:set_base(pseudorandom_element(G.P_CARDS))
card:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"])) card:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"]))
@ -147,7 +172,9 @@ local function randomize(targets, noanim)
card:flip() card:flip()
play_sound("card3", percent, 0.6) play_sound("card3", percent, 0.6)
card:juice_up(0.3, 0.3) card:juice_up(0.3, 0.3)
end, 0.1) return true
end
}))
end end
end end
end end
@ -162,7 +189,7 @@ SMODS.Consumable {
"{C:green,E:1}Randomises{} all cards in hand", "{C:green,E:1}Randomises{} all cards in hand",
"{C:inactive}(Rank, seal, edition,", "{C:inactive}(Rank, seal, edition,",
"{C:inactive}enhancement, and suit)", "{C:inactive}enhancement, and suit)",
}, }
}, },
pos = {x = 0, y = 4}, pos = {x = 0, y = 4},
cost = 4, cost = 4,
@ -170,14 +197,19 @@ SMODS.Consumable {
return Jane.can_use() and #((G.hand or {}).cards or {}) > 0 return Jane.can_use() and #((G.hand or {}).cards or {}) > 0
end, end,
use = function(_, card, _, _) use = function(_, card, _, _)
Jane.q(function() G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.4,
func = function()
play_sound("tarot1") play_sound("tarot1")
card:juice_up(0.3, 0.5) card:juice_up(0.3, 0.5)
end, 0.4) return true
end
}))
randomize(G.hand.cards) randomize(G.hand.cards)
delay(0.5) delay(0.5)
end, end
} }
SMODS.Consumable { SMODS.Consumable {
@ -190,12 +222,12 @@ SMODS.Consumable {
"Creates {C:attention}#1#", "Creates {C:attention}#1#",
"{C:spectral}Spectral{} cards", "{C:spectral}Spectral{} cards",
"{C:inactive}(Must have room)", "{C:inactive}(Must have room)",
}, }
}, },
config = {extra = {spectrals = 2}}, config = {extra = {spectrals = 2}},
pos = {x = 2, y = 4}, pos = {x = 2, y = 4},
cost = 4, cost = 4,
loc_vars = function(_, _, center) loc_vars = function(self, info_queue, center)
return {vars = {math.ceil(center.ability.extra.spectrals)}} return {vars = {math.ceil(center.ability.extra.spectrals)}}
end, end,
can_use = Jane.can_use, can_use = Jane.can_use,
@ -206,11 +238,9 @@ SMODS.Consumable {
bulk_use = function(_, card, _, _, number) bulk_use = function(_, card, _, _, number)
conjure(card, number) conjure(card, number)
delay(0.6) delay(0.6)
end, end
} }
local shadows_limit = 25
SMODS.Consumable { SMODS.Consumable {
key = "shadows", key = "shadows",
set = "Spectral", set = "Spectral",
@ -219,19 +249,19 @@ SMODS.Consumable {
name = "Shadows", name = "Shadows",
text = { text = {
"Create {C:attention}#1#{} {C:green}random {C:dark_edition}Negative", "Create {C:attention}#1#{} {C:green}random {C:dark_edition}Negative",
"{C:attention}Perishable {C:attention}Jokers{}, set {C:money}sell", "{C:attention}Perishable {C:attention}Jokers{}, set",
"{C:money}value {}of {C:attention}all Jokers {}to {C:money}$0", "{C:money}sell value{} of {C:attention}all Jokers{} to {C:money}$0",
}, }
}, },
config = {extra = {shadows = 2}}, config = {extra = {shadows = 2}},
pos = {x = 3, y = 4}, pos = {x = 3, y = 4},
cost = 4, cost = 4,
loc_vars = function(_, _, card) loc_vars = function(_, _, center)
return {vars = {math.min(((card.ability or {}).extra or {}).shadows or 2, shadows_limit)}} return {vars = {((center.ability or {}).extra or {}).shadows or 2}}
end, end,
can_use = Jane.can_use, can_use = Jane.can_use,
use = function(_, card, _, _) use = function(_, card, _, _)
for _ = 1, math.min(card.ability.extra.shadows, shadows_limit) do for _ = 1, card.ability.extra.shadows do
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom") local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
joker:set_edition({negative = true}) joker:set_edition({negative = true})
joker.ability.eternal = false joker.ability.eternal = false
@ -248,13 +278,11 @@ SMODS.Consumable {
G.jokers.cards[i].extra_cost = 0 G.jokers.cards[i].extra_cost = 0
G.jokers.cards[i].cost = 0 G.jokers.cards[i].cost = 0
G.jokers.cards[i].sell_cost = 0 G.jokers.cards[i].sell_cost = 0
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or G.jokers.cards[i].sell_cost
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or
G.jokers.cards[i].sell_cost
end end
end, end,
bulk_use = function(_, card, _, _, number) bulk_use = function(_, card, _, _, number)
for _ = 1, math.min(card.ability.extra.shadows, 25) * number do for _ = 1, card.ability.extra.shadows * number do
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom") local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
joker.no_forced_edition = true joker.no_forced_edition = true
joker:set_edition({negative = true}) joker:set_edition({negative = true})
@ -273,35 +301,54 @@ SMODS.Consumable {
G.jokers.cards[i].extra_cost = 0 G.jokers.cards[i].extra_cost = 0
G.jokers.cards[i].cost = 0 G.jokers.cards[i].cost = 0
G.jokers.cards[i].sell_cost = 0 G.jokers.cards[i].sell_cost = 0
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or G.jokers.cards[i].sell_cost
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or end
G.jokers.cards[i].sell_cost
end end
end,
} }
SMODS.Consumable { SMODS.Consumable {
key = "rift", key = "reverse_hanged_man",
atlas = "janeacc", atlas = "janertarots",
set = "Spectral", set = "Spectral",
loc_txt = { loc_txt = {
name = "Rift", name = "Zen",
text = { text = {
"{C:attention}Reset {}your deck to a", "{C:attention}Reset{} your deck to",
"{C:attention}standard 52-card deck", "a {C:attention}standard 52-card deck"
}
}, },
}, config = {extra = {destruction = 0.5}},
pos = {x = 4, y = 4}, pos = {x = 7, y = 1},
cost = 4, cost = 15,
loc_vars = function(_, _, center)
return {vars = {
math.min(100, center.ability.extra.destruction * 100),
math.ceil(#(G.playing_cards or {}) * center.ability.extra.destruction)
}}
end,
can_use = Jane.can_use, can_use = Jane.can_use,
use = function(_, _, _, _) use = function(_, _, _, _)
Jane.q(function() Jane.q(function()
for _, v in pairs(G.playing_cards) do for _, v in pairs(G.playing_cards) do
v:start_dissolve() v:start_dissolve()
end end
return true
end) end)
delay(2) local function realdelay(time, queue)
create_full_deck() G.E_MANAGER:add_event(Event({
end, trigger = "after",
timer = "REAL",
delay = time or 1,
func = function()
return true
end
}), queue)
end
realdelay(1)
createfulldeck()
end
} }

View file

@ -1,40 +1,30 @@
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 = { local blurbs = {
"M!",
"Hey! Pick me!", "Hey! Pick me!",
"Hee-hee, hoo-hoo!", "You wouldn't say no to a free negative me, would you?",
"Looks like the joke is on you!", "Sometimes, an extra four mult goes a long way!",
"Ouch, I think the joke is on me!",
"I won't take up space, I promise!", "I won't take up space, I promise!",
"Don't ask how I ended up in a tarot!", "Don't ask how I ended up in a tarot!",
"The stakes are only gonna rise here!", "Hee-hee, hoo-hoo!",
"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!",
"Who knew even fortunes could be a circus act?", "Who knew even fortunes could be a circus act?",
"Sometimes, an extra four mult goes a long way!", "Looks like the joke is on the crystal globe!",
"I can't give four mult if I'm still in this card!", "It's a little cramped in this tarot...!",
"You wouldn't say no to a free negative me, would you?", "Ouch, I think the joke is on me!",
"I'd give you more tickets to JimCon, but I'm fresh out.", "Looks like the joke is on you!",
"Let me tell you, you'd love the show going on in this tarot!", "I'm not just a clown; I'm the whole circus!",
"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...",
"Seems a little suspicious for a jolly old fella like me to be in this card...", "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!",
"You should meet my friend Joseph; he's stuck in a Planet card!",
"M!",
} }
SMODS.Consumable { SMODS.Consumable {
@ -42,41 +32,20 @@ SMODS.Consumable {
atlas = "janeacc", atlas = "janeacc",
set = "Tarot", set = "Tarot",
loc_txt = { loc_txt = {
name = "#1#-in-a-Tarot", name = "Joker-in-a-Tarot",
text = { text = {
"Create a {C:dark_edition}Negative {C:attention}#2#", "Create a {C:dark_edition}Negative {C:attention}default Joker",
"after {C:attention}#3# {}uses {C:inactive}(#4# left)", "{C:inactive,E:1}#1#{}"
"{C:inactive,E:1}#5#{}", }
}, },
}, loc_vars = function(_, _, _)
loc_vars = function(_, info_queue, card) return {vars = {blurbs[math.random(#blurbs)]}}
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}}
end, end,
pos = {x = 0, y = 1}, pos = {x = 0, y = 1},
cost = 4, cost = 3,
can_use = Jane.can_use, can_use = Jane.can_use,
use = function(_, _, _, _) use = function(_, _, _, _)
local uses = get_uses() + 1 local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_joker", "jokerfromatarot")
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")
card:set_edition({negative = true}, true) card:set_edition({negative = true}, true)
card.cost = 1 card.cost = 1
card.base_cost = 1 card.base_cost = 1
@ -90,12 +59,5 @@ SMODS.Consumable {
for _ = 1, number do for _ = 1, number do
self:use(card, area, copier) self:use(card, area, copier)
end 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 end
}

View file

@ -2,7 +2,7 @@ SMODS.Atlas {
key = "janetokens", key = "janetokens",
px = 71, px = 71,
py = 95, py = 95,
path = Jane.config.texture_pack .. "/c_jane_tokens.png", path = Jane.config.texture_pack .. "/c_jane_tokens.png"
} }
SMODS.Sound({key = "e_gilded", path = "e_gilded.ogg"}) SMODS.Sound({key = "e_gilded", path = "e_gilded.ogg"})
@ -12,83 +12,43 @@ SMODS.ConsumableType {
default = "c_jane_token_tag_standard", default = "c_jane_token_tag_standard",
loc_txt = { loc_txt = {
collection = "Tokens", collection = "Tokens",
name = "Token", name = "Token"
}, },
shop_rate = 0, shop_rate = 0,
collection_rows = {5, 6}, collection_rows = {6, 6},
primary_colour = G.C.CHIPS, primary_colour = G.C.CHIPS,
secondary_colour = G.C.VOUCHER, secondary_colour = G.C.VOUCHER,
} }
local function on_token_use(id)
local t = Tag(id)
if id == "tag_orbital" then
local hands = {}
for k, v in pairs(G.GAME.hands) do
if v.visible then
hands[#hands + 1] = k
end
end
t.ability.orbital_hand = pseudorandom_element(hands, pseudoseed("jane_token_orbital"))
end
add_tag(t)
end
local vowels = {A = true, E = true, I = true, O = true, U = true}
for _, v in pairs({ for _, v in pairs({
{"tag_standard", "Standard", 0, 0, 3}, {"tag_standard", "Standard", 0, 0, 3},
{"tag_charm", "Charm", 1, 0, 5}, {"tag_charm", "Charm", 1, 0, 5},
{"tag_meteor", "Meteor", 2, 0, 5}, {"tag_meteor", "Meteor", 2, 0, 5},
{"tag_ethereal", "Ethereal", 3, 0, 5}, {"tag_ethereal", "Ethereal", 3, 0, 5},
{"tag_buffoon", "Buffoon", 4, 0, 8}, {"tag_buffoon", "Buffoon", 4, 0, 8},
{"tag_cry_console", "Console", 5, 0, 7},
{"tag_cry_loss", "Loss", 0, 1, 12},
{"tag_cry_bundle", "Bundle", 1, 1, 10}, {"tag_cry_bundle", "Bundle", 1, 1, 10},
{"tag_uncommon", "Uncommon", 2, 1, 3}, {"tag_uncommon", "Uncommon", 2, 1, 3},
{"tag_rare", "Rare", 3, 1, 5}, {"tag_rare", "Rare", 3, 1, 5},
{"tag_cry_epic", "Epic", 4, 1, 8}, {"tag_cry_epic", "Epic", 4, 1, 8},
{"tag_cry_gourmond", "Gourmond", 5, 1, 4},
{"tag_double", "Double", 0, 2, 6},
{"tag_cry_triple", "Triple", 1, 2, 8},
{"tag_cry_quadruple", "Quadruple", 2, 2, 10},
{"tag_cry_quintuple", "Quintuple", 3, 2, 13},
{"tag_skip", "Speed", 4, 2, 7},
{"tag_economy", "Economy", 5, 2, 10},
{"tag_investment", "Investment", 0, 3, 8},
{"tag_foil", "Foil", 1, 3, 3}, {"tag_foil", "Foil", 1, 3, 3},
{"tag_holo", "Holographic", 2, 3, 4}, {"tag_holo", "Holographic", 2, 3, 4},
{"tag_polychrome", "Polychrome", 3, 3, 5}, {"tag_polychrome", "Polychrome", 3, 3, 5},
{"tag_negative", "Negative", 4, 3, 10}, {"tag_negative", "Negative", 4, 3, 10},
{"tag_d_six", "Dice", 0, 4, 2}, {"tag_investment", "Investment", 0, 3, 8},
{"tag_orbital", "Orbital", 1, 4, 6},
{"tag_top_up", "Top-up", 2, 4, 2},
{"tag_cry_bettertop_up", "Top-up+", 3, 4, 3},
{"tag_coupon", "Coupon", 4, 4, 10},
{"tag_cry_memory", "Memory", 5, 4, 8},
{"tag_garbage", "Garbage", 0, 5, 6},
{"tag_handy", "Handy", 1, 5, 8},
{"tag_juggle", "Juggle", 2, 5, 2},
{"tag_cry_schematic", "Schematic", 3, 5, 10},
{"tag_voucher", "Voucher", 4, 5, 5}, {"tag_voucher", "Voucher", 4, 5, 5},
{"tag_cry_better_voucher", "Voucher+", 5, 5, 7}, {"tag_handy", "Handy", 1, 5, 8},
{"tag_cry_gambler", "Gamble", 0, 6, 10}, {"tag_garbage", "Garbage", 0, 5, 6},
{"tag_cry_cat", "Cat", 1, 6, 1}, {"tag_coupon", "Coupon", 4, 4, 10},
{"tag_cry_mosaic", "Mosaic", 2, 6, 6}, {"tag_juggle", "Juggle", 2, 5, 2},
{"tag_cry_glass", "Fragile", 3, 6, 7}, {"tag_d_six", "Dice", 0, 4, 2},
{"tag_cry_astral", "Astral", 4, 6, 8}, {"tag_top_up", "Top-up", 2, 4, 2},
{"tag_cry_m", "M", 5, 6, 8}, {"tag_skip", "Speed", 4, 2, 7},
{"tag_cry_blur", "Blurred", 0, 7, 11}, {"tag_economy", "Economy", 5, 2, 10},
{"tag_cry_oversat", "Oversaturated", 1, 7, 12}, {"tag_double", "Double", 0, 2, 6},
{"tag_cry_glitched", "Glitched", 2, 7, 13}, {"tag_cry_triple", "Triple", 1, 2, 8},
{"tag_cry_gold", "Golden", 3, 7, 9}, {"tag_cry_quadruple", "Quadruple", 2, 2, 10},
{"tag_cry_booster", "Booster", 4, 7, 4}, {"tag_cry_quintuple", "Quintuple", 3, 2, 13},
{"tag_cry_scope", "Scope", 5, 7, 3}, {"tag_cry_memory", "Memory", 5, 4, 8}
{"tag_cry_banana", "Banana", 0, 8, 4},
}) do }) do
if Cryptid or v[1]:sub(1, 7) ~= "tag_cry" then if Cryptid or v[1]:sub(1, 7) ~= "tag_cry" then
SMODS.Consumable { SMODS.Consumable {
@ -97,12 +57,11 @@ 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 = {
"Use to create a",
"{C:attention}" .. v[2] .. " Tag",
},
}, },
loc_vars = function(_, info_queue, _)
info_queue[#info_queue + 1] = v[1] ~= "tag_cry_cat" and G.P_TAGS[v[1]] or nil
return {vars = {}}
end,
pos = {x = v[3], y = v[4]}, pos = {x = v[3], y = v[4]},
cost = v[5], cost = v[5],
can_stack = true, can_stack = true,
@ -113,15 +72,15 @@ for _, v in pairs({
end, end,
use = function(_, _, _, _) use = function(_, _, _, _)
play_sound("jane_e_gilded", 1.25, 0.4) play_sound("jane_e_gilded", 1.25, 0.4)
on_token_use(v[1]) add_tag(Tag(v[1]))
end, end,
bulk_use = function(_, _, _, _, number) bulk_use = function(_, _, _, _, number)
play_sound("jane_e_gilded", 1.25, 0.4) play_sound("jane_e_gilded", 1.25, 0.4)
for _ = 1, number do for _ = 1, number do
on_token_use(v[1]) add_tag(Tag(v[1]))
end
end end
end,
} }
end end
end end

View file

@ -1,31 +1,8 @@
SMODS.Atlas {
key = "janejollyvoucher",
px = 71,
py = 95,
path = Jane.config.texture_pack .. "/v_jane_jolly_voucher.png",
}
SMODS.Atlas { SMODS.Atlas {
key = "janetokenvoucher", key = "janetokenvoucher",
px = 71, px = 71,
py = 95, py = 95,
path = Jane.config.texture_pack .. "/v_jane_token_voucher.png", 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 { SMODS.Voucher {
@ -33,11 +10,14 @@ SMODS.Voucher {
atlas = "janetokenvoucher", atlas = "janetokenvoucher",
loc_txt = { loc_txt = {
name = "Token Voucher", name = "Token Voucher",
text = {"{C:attention}Tokens {}can appear", "in the shop"}, text = {
"{C:attention}Tokens {}can appear",
"in the shop",
}
}, },
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
cost = 15, cost = 15,
redeem = function (_, _) redeem = function (_, _)
G.GAME["jane_tokens_rate"] = 1.5 G.GAME['jane_tokens_rate'] = 1.5
end, end
} }