Compare commits

..

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

35 changed files with 2161 additions and 4134 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: 27 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 5 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: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 6.7 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

@ -1,15 +1,7 @@
[manifest] [manifest]
version = "1.0.0" version = "1.0.0"
dump_lua = true dump_lua = true
priority = 114 priority = 2147483647
[[patches]]
[patches.pattern]
target = "card.lua"
pattern = "if v ~= chosen_joker then"
position = "at"
payload = "if v ~= chosen_joker and not next(SMODS.find_card('j_jane_saint')) then"
match_indent = true
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]
@ -28,6 +20,7 @@ pattern = "if v.name == 'Black Hole' or v.name == 'The Soul' or v.hidden then"
position = "at" position = "at"
payload = "if Jane.hidden(v) then" payload = "if Jane.hidden(v) then"
match_indent = true match_indent = true
overwrite = false
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]
@ -42,113 +35,29 @@ match_indent = true
target = "functions/misc_functions.lua" target = "functions/misc_functions.lua"
pattern = "local AC = G.SETTINGS.ambient_control" pattern = "local AC = G.SETTINGS.ambient_control"
position = "before" position = "before"
payload = '''if Jane and (type(G.ARGS.score_intensity.required_score) == "table" and G.ARGS.score_intensity.required_score:to_number() or G.ARGS.score_intensity.required_score) ~= 0 then payload = '''if Jane and G.ARGS.score_intensity.required_score ~= 0 then
local break_infinity = ((Talisman or {}).config_file or {}).break_infinity Jane.sinister = (G.ARGS.score_intensity.earned_score / (to_big(10) ^ to_big(G.ARGS.score_intensity.required_score))):to_number() > 1
local big = (break_infinity == "" or break_infinity == nil) and function (x) return x end or to_big
local base = Cryptid and 10 or G.ARGS.score_intensity.required_score
local expo = Cryptid and G.ARGS.score_intensity.required_score or 10
Jane.sinister = (G.ARGS.score_intensity.earned_score / (big(base) ^ big(expo))):to_number() > 1
G.escapey_sinister = Jane.sinister
end''' end'''
match_indent = true match_indent = true
[[patches]] [[patches]]
[patches.pattern] [patches.pattern]
target = "functions/state_events.lua" target = "functions/state_events.lua"
pattern = "for _, v in ipairs(SMODS.get_card_areas('playing_cards')) do" pattern = "scoring_hand = final_scoring_hand"
position = "after"
payload = '''if v == G.hand and not (G.GAME.blind and G.GAME.blind.name == "The Card" and not G.GAME.blind.disabled) and next(SMODS.find_card("j_jane_survivor")) then
if Cryptid then
for _, v in ipairs(G.hand.cards) do
local area = {cards = {v}}
SMODS.calculate_main_scoring({cardarea = area, full_hand = area.cards, scoring_hand = area.cards, scoring_name = text, poker_hands = poker_hands}, area.cards)
SMODS.calculate_main_scoring({cardarea = area, full_hand = area.cards, scoring_hand = area.cards, scoring_name = text, poker_hands = poker_hands}, nil)
end
else
SMODS.calculate_main_scoring({cardarea = G.hand, full_hand = G.hand.cards, scoring_hand = G.hand.cards, scoring_name = text, poker_hands = poker_hands}, G.hand.cards)
SMODS.calculate_main_scoring({cardarea = G.hand, full_hand = G.hand.cards, scoring_hand = G.hand.cards, scoring_name = text, poker_hands = poker_hands}, nil)
end
else'''
match_indent = true
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = "SMODS.calculate_main_scoring({cardarea = v, full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands}, v == G.play and scoring_hand or nil)"
position = "after"
payload = "end"
match_indent = true
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = "-- context.final_scoring_step calculations"
position = "before"
payload = '''if 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
for _, area in ipairs(SMODS.get_card_areas('jokers')) do
for _, _card in ipairs(area.cards) do
local eval = eval_card(_card, {
cardarea = G.jokers,
full_hand = G.hand.cards,
scoring_hand = G.hand.cards,
scoring_name = text,
poker_hands = poker_hands,
edition = true,
pre_joker = true
})
end
end
end'''
match_indent = true
[[patches]]
[patches.pattern]
target = "functions/state_events.lua"
pattern = "SMODS.calculate_context({full_hand = G.play.cards, scoring_hand = scoring_hand, scoring_name = text, poker_hands = poker_hands, final_scoring_step = true})"
position = "after" position = "after"
payload = '''if 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 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
SMODS.calculate_context({full_hand = G.hand.cards, scoring_hand = G.hand.cards, scoring_name = text, poker_hands = poker_hands, final_scoring_step = true}) for _, v in ipairs(G.hand.cards) do
end''' if not v:gc().unhighlightable then
match_indent = true table.insert(scoring_hand, v)
end
[[patches]] end
[patches.pattern]
target = "functions/state_events.lua"
pattern = "-- context.remove_playing_cards calculations"
position = "before"
payload = '''if 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
SMODS.calculate_destroying_cards({ full_hand = G.hand.cards, scoring_hand = G.hand.cards, scoring_name = text, poker_hands = poker_hands, cardarea = G.hand }, cards_destroyed, G.hand)
end''' end'''
match_indent = true match_indent = true
[[patches]] [[patches]]
[patches.regex] [patches.regex]
target = "functions/state_events.lua" target = "functions/state_events.lua"
pattern = '''hand_chips\*mult\)''' pattern = '''hand_chips\*mult'''
position = "at" position = "at"
payload = "Jane.get_chipmult_sum(hand_chips, mult))" payload = "Jane.get_chipmult_sum(hand_chips, mult)"
match_indent = true
[[patches]]
[patches.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 match_indent = true

View file

@ -1,21 +1,16 @@
{ {
"id": "jane", "id": "jane",
"name": "Almighty", "name": "Almighty",
"author": [ "author": ["jenwalter666", "Emik"],
"jenwalter666", "description": "Fork of Jen's almanac that focuses on only including the absolute best parts of the mod, and removing everything else.",
"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.",
"prefix": "jane", "prefix": "jane",
"main_file": "src/main.lua", "main_file": "src/main.lua",
"badge_colour": "3c3cff", "badge_colour": "3c3cff",
"priority": 114, "priority": 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999,
"dependencies": [ "dependencies": [
"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.0"
],
"version": "1.5.19"
} }

View file

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

File diff suppressed because it is too large Load diff

View file

@ -1,16 +1,16 @@
SMODS.Atlas { SMODS.Atlas {
px = 34, px = 34,
py = 34, py = 34,
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 = {
[1] = {"+", "UI_CHIPS"}, [1] = {"+", "UI_CHIPS"},
[2] = {"X", "UI_MULT"}, [2] = {"X", "UI_MULT"},
[3] = {"^", G.C.jane_RGB}, [3] = {"^", G.C.jane_RGB},
} }
local function offset_operator(by) local function offset_operator(by)
@ -22,9 +22,9 @@ local function offset_operator(by)
local previous = Jane.get_operator() local previous = Jane.get_operator()
set(by + previous) set(by + previous)
by = Jane.get_operator() by = Jane.get_operator()
local txt = final_operations[by][1] ---@diagnostic disable-next-line: cast-local-type local txt = final_operations[by][1] ---@diagnostic disable-next-line: cast-local-type
local col = type(final_operations[by][2]) == "table" and final_operations[by][2] or G.C[final_operations[by][2]] local col = type(final_operations[by][2]) == "table" and final_operations[by][2] or G.C[final_operations[by][2]]
Jane.q(function() Jane.q(function()
local changed_text = false local changed_text = false
@ -35,7 +35,7 @@ local function offset_operator(by)
if type(inner) == "table" and if type(inner) == "table" and
type(inner.config) == "table" and type(inner.config) == "table" and
(inner.config.text == final_operations[previous][1] or (inner.config.text == final_operations[previous][1] or
inner.config.text == final_operations[2][1]) and inner.config.text == final_operations[2][1]) and
inner.config.text_drawable then inner.config.text_drawable then
if inner.config.text ~= txt then if inner.config.text ~= txt then
changed_text = true changed_text = true
@ -53,17 +53,15 @@ 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
local function to_number(x) SMODS.Blind {
return type(x) == "table" and x:to_number() or x
end
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 = {},
@ -72,15 +70,14 @@ SMODS.Blind {
atlas = "janeblinds", atlas = "janeblinds",
pos = {x = 0, y = 0}, pos = {x = 0, y = 0},
vars = {}, vars = {},
dollars = 6, dollars = 15,
mult = 0.5,
defeat = function(_) defeat = function(_)
if not Cryptid then if not G.GAME.blind.disabled then
offset_operator(2 - Jane.get_operator())
elseif not G.GAME.blind.disabled then
offset_operator(1) offset_operator(1)
end end
end, end,
disable = function(_) disable = function(self)
offset_operator(1) offset_operator(1)
end, end,
drawn_to_hand = function(_) drawn_to_hand = function(_)
@ -89,19 +86,15 @@ SMODS.Blind {
press_play = function(_) press_play = function(_)
offset_operator(0) offset_operator(0)
end, end,
set_blind = function(self) set_blind = function(_)
if to_number(self.mult) == 0 then
self.chips = math.floor(8 * math.sqrt(get_blind_amount(G.GAME.round_resets.ante)))
end
offset_operator(-1) offset_operator(-1)
end, end,
} }
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 = {},
@ -110,63 +103,50 @@ SMODS.Blind {
atlas = "janeblinds", atlas = "janeblinds",
pos = {x = 0, y = 9}, pos = {x = 0, y = 9},
vars = {}, vars = {},
dollars = 5, dollars = 7,
mult = 2, mult = 2,
debuff_hand = function(_, cards, _, _, _) debuff_hand = function(_, cards, _, _, _)
local numsuits = 0 local numsuits = 0
local checked_suits = {} local checked_suits = {}
for _, card in ipairs(cards) do for _, card in ipairs(cards) do
if not card:nosuit() and not checked_suits[card.base.suit] then if not card:nosuit() and not checked_suits[card.base.suit] then
numsuits = numsuits + 1 numsuits = numsuits + 1
checked_suits[card.base.suit] = true checked_suits[card.base.suit] = true
if numsuits > 1 then if numsuits > 1 then
return true return true
end end
end end
end end
end, end
} }
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) mult = 22 / 300,
self.disabled = true debuff_hand = function(_, cards, _, _, _)
end, for _, v in ipairs(cards) do
debuff_hand = function(self, cards, _, _, _) if v:norank() or v:get_id() ~= 2 then
if self.disabled then return true
return false end
end end
end,
for _, v in ipairs(cards) do get_loc_debuff_text = function(_)
if (v:norank() or v:get_id() ~= 2) and (v.ability or {}).aikoyori_letters_stickers ~= "2" then return "Hand must contain only 2s"
return true end,
end recalc_debuff = function(_, card, _)
end return card:norank() or card:get_id() ~= 2
end, end,
get_loc_debuff_text = function(_)
return "Hand must contain only 2s"
end,
recalc_debuff = function(self, card, _)
return not self.disabled and
(card:norank() or card:get_id() ~= 2) and
(card.ability or {}).aikoyori_letters_stickers ~= "2"
end,
set_blind = function(self)
if to_number(self.mult) == 0 then
self.chips = 22
end
end,
} }

View file

@ -1,51 +1,37 @@
SMODS.Atlas { 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
SMODS.Booster { SMODS.Booster{
key = "ministandard" .. i, key = "ministandard" .. i,
loc_txt = { loc_txt = {
name = "Mini Standard Pack", name = "Mini Standard Pack",
text = { text = {
"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},
weight = 0.4, weight = 0.4,
cost = 2, cost = 2,
config = {extra = 2, choose = 1}, config = {extra = 2, choose = 1},
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(_, _, _)
local edition = poll_edition("standard_edition" .. G.GAME.round_resets.ante, 2, true)
local seal = SMODS.poll_seal({mod = 10})
return {
set = (pseudorandom(pseudoseed("stdset" .. G.GAME.round_resets.ante)) > 0.6) and "Enhanced" or "Base",
edition = edition,
seal = seal,
area = G.pack_cards,
skip_materialize = true,
soulable = true,
key_append = "sta",
}
end,
create_UIBox = function(_)
return create_UIBox_standard_pack()
end,
ease_background_colour = function(_) ease_background_colour = function(_)
ease_background_colour_blind(G.STATES.STANDARD_PACK) ease_background_colour_blind(G.STATES.STANDARD_PACK)
end, end,
create_UIBox = function(_)
return create_UIBox_standard_pack()
end,
particles = function(_) particles = function(_)
G.booster_pack_sparkles = Particles(1, 1, 0, 0, { G.booster_pack_sparkles = Particles(1, 1, 0,0, {
timer = 0.015, timer = 0.015,
scale = 0.3, scale = 0.3,
initialize = true, initialize = true,
@ -54,62 +40,57 @@ for i = 1, 2 do
padding = -1, padding = -1,
attach = G.ROOM_ATTACH, attach = G.ROOM_ATTACH,
colours = {G.C.BLACK, G.C.RED}, colours = {G.C.BLACK, G.C.RED},
fill = true, fill = true
}) })
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,
} create_card = function(_, _, _)
local edition = poll_edition("standard_edition"..G.GAME.round_resets.ante, 2, true)
local seal = SMODS.poll_seal({mod = 10})
return {
set = (pseudorandom(pseudoseed("stdset"..G.GAME.round_resets.ante)) > 0.6) and "Enhanced" or "Base",
edition = edition,
seal = seal,
area = G.pack_cards,
skip_materialize = true,
soulable = true,
key_append = "sta"
}
end,
}
end end
for i = 1, 2 do for i = 1, 2 do
SMODS.Booster { SMODS.Booster{
key = "miniarcana" .. i, key = "miniarcana" .. i,
loc_txt = { loc_txt = {
name = "Mini Arcana Pack", name = "Mini Arcana Pack",
text = { text = {
"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},
weight = 0.4, weight = 0.4,
cost = 2, cost = 2,
config = {extra = 2, choose = 1}, config = {extra = 2, choose = 1},
draw_hand = true, draw_hand = true,
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(_, _, _)
if G.GAME.used_vouchers.v_omen_globe and pseudorandom("omen_globe") > 0.8 then
return {
set = "Spectral",
soulable = true,
key_append = "ar2",
area = G.pack_cards,
skip_materialize = true,
}
end
return {
set = "Tarot",
soulable = true,
key_append = "ar1",
area = G.pack_cards,
skip_materialize = true,
}
end,
create_UIBox = function(_)
return create_UIBox_arcana_pack()
end,
ease_background_colour = function(_) ease_background_colour = function(_)
ease_background_colour_blind(G.STATES.TAROT_PACK) ease_background_colour_blind(G.STATES.TAROT_PACK)
end, end,
create_UIBox = function(_)
return create_UIBox_arcana_pack()
end,
particles = function(_) particles = function(_)
G.booster_pack_sparkles = Particles(1, 1, 0, 0, { G.booster_pack_sparkles = Particles(1, 1, 0,0, {
timer = 0.015, timer = 0.015,
scale = 0.2, scale = 0.2,
initialize = true, initialize = true,
@ -118,146 +99,147 @@ for i = 1, 2 do
padding = -1, padding = -1,
attach = G.ROOM_ATTACH, 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)}, colours = {G.C.WHITE, lighten(G.C.PURPLE, 0.4), lighten(G.C.PURPLE, 0.2), lighten(G.C.GOLD, 0.2)},
fill = true, fill = true
}) })
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
for i = 1, 2 do
SMODS.Booster {
key = "minicelestial" .. i,
atlas = "janebooster",
loc_txt = {
name = "Mini Celestial Pack",
text = {
"Choose {C:attention}#1#{} of up to",
"{C:attention}#2# {C:planet}Planet{} cards to",
"be used immediately",
},
},
config = {extra = 2, choose = 1},
pos = {x = 3 + i, y = 0},
cost = 2,
weight = 0.4,
loc_vars = function(_, _, card)
return {vars = {card.ability.choose, card.ability.extra}}
end,
create_card = function(_, _, index)
if not G.GAME.used_vouchers.v_telescope or index ~= 1 then
return {
set = "Planet",
area = G.pack_cards,
skip_materialize = true,
soulable = true,
key_append = "pl1",
}
end
local planet, hand, tally = nil, nil, 0
for _, v in ipairs(G.handlist) do
if G.GAME.hands[v].visible and G.GAME.hands[v].played > tally then
hand = v
tally = G.GAME.hands[v].played
end
end
if hand then
for _, v in pairs(G.P_CENTER_POOLS.Planet) do
if v.config.hand_type == hand then
planet = v.key
end
end
end
return {
key = planet,
set = "Planet",
soulable = true,
key_append = "pl1",
area = G.pack_cards,
skip_materialize = true,
}
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
for i = 1, 2 do
SMODS.Booster {
key = "minispectral" .. i,
atlas = "janebooster",
loc_txt = {
name = "Mini Spectral Pack",
text = {
"Choose {C:attention}#1#{} of up to",
"{C:attention}#2# {C:spectral}Spectral{} cards to",
"be used immediately",
},
},
config = {extra = 1, choose = 1},
pos = {x = 3 + i, y = 2},
cost = 2,
weight = 0.225,
draw_hand = true,
loc_vars = function(_, _, card)
return {vars = {card.ability.choose, card.ability.extra}}
end,
create_card = function(_, _, _) create_card = function(_, _, _)
if G.GAME.used_vouchers.v_omen_globe and pseudorandom("omen_globe") > 0.8 then
return {
set = "Spectral",
soulable = true,
key_append = "ar2",
area = G.pack_cards,
skip_materialize = true,
}
end
return { return {
soulable = true, set = "Tarot",
set = "Spectral", soulable = true,
key_append = "spe", key_append = "ar1",
area = G.pack_cards, area = G.pack_cards,
skip_materialize = true, skip_materialize = true,
} }
end, end
create_UIBox = function(_) }
return create_UIBox_spectral_pack() end
end,
for i = 1, 2 do
SMODS.Booster{
key = "minicelestial" .. i,
atlas = "janebooster",
loc_txt = {
name = "Mini Celestial Pack",
text = {
"Choose {C:attention}#1#{} of up to",
"{C:attention}#2# {C:planet}Planet{} cards to",
"be used immediately",
}
},
config = {extra = 2, choose = 1},
pos = {x = 3 + i, y = 0},
cost = 2,
weight = 0.4,
loc_vars = function(_, _, card)
return {vars = {card.ability.choose, card.ability.extra}}
end,
ease_background_colour = function(_) ease_background_colour_blind(G.STATES.PLANET_PACK) end,
create_UIBox = function(_) return create_UIBox_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)
if not G.GAME.used_vouchers.v_telescope or index ~= 1 then
return {
set = "Planet",
area = G.pack_cards,
skip_materialize = true,
soulable = true,
key_append = "pl1"
}
end
local planet, hand, tally = nil, nil, 0
for _, v in ipairs(G.handlist) do
if G.GAME.hands[v].visible and G.GAME.hands[v].played > tally then
hand = v
tally = G.GAME.hands[v].played
end
end
if hand then
for _, v in pairs(G.P_CENTER_POOLS.Planet) do
if v.config.hand_type == hand then
planet = v.key
end
end
end
return {
key = planet,
set = "Planet",
soulable = true,
key_append = "pl1",
area = G.pack_cards,
skip_materialize = true,
}
end
}
end
for i = 1, 2 do
SMODS.Booster{
key = "minispectral" .. i,
atlas = "janebooster",
loc_txt = {
name = "Mini Spectral Pack",
text = {
"Choose {C:attention}#1#{} of up to",
"{C:attention}#2# {C:spectral}Spectral{} cards to",
"be used immediately",
}
},
config = {extra = 1, choose = 1},
pos = {x = 3 + i, y = 2},
cost = 2,
weight = 0.225,
draw_hand = true,
loc_vars = function(_, _, card)
return {vars = {card.ability.choose, card.ability.extra}}
end,
ease_background_colour = function(_) ease_background_colour = function(_)
ease_background_colour_blind(G.STATES.SPECTRAL_PACK) ease_background_colour_blind(G.STATES.SPECTRAL_PACK)
end, end,
create_UIBox = function(_)
return create_UIBox_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,
fill = true, fill = true,
speed = 0.2, speed = 0.2,
lifespan = 3, lifespan = 3,
@ -271,163 +253,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 {
soulable = true,
set = "Spectral",
key_append = "spe",
area = G.pack_cards,
skip_materialize = true,
}
end, end,
create_UIBox = function(_) }
local size = SMODS.OPENED_BOOSTER.ability.extra
G.pack_cards = CardArea(
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

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
end ((G.shop_jokers and card.area == G.shop_jokers) or
(G.shop_booster and card.area == G.shop_booster) or
local function get_weight(self) (G.shop_vouchers and card.area == G.shop_vouchers)) then
return G.GAME.edition_rate * self.weight * (allow_moire() and 1 or 0) create_shop_card_ui(card)
end
end end
SMODS.Edition({ SMODS.Edition({
@ -27,158 +26,111 @@ 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:dark_edition,s:0.7,E:2}Shader by : Oiiman"
"{C:chips}+#1#{} Chips", }
"{C:mult}+#2#{} & {X:mult,C:white}X#3#{} Mult",
"{C:money}$#4# {}when scored",
},
}, },
config = { config = {chips = 1, mult = 1, x_chips = 1.1, x_mult = 1.1, e_chips = 1.01, e_mult = 1.01, p_dollars = 1},
mult = 2, sound = {
chips = 12, sound = "jane_e_polygloss",
x_mult = 1.2, per = 1.2,
p_dollars = 1, vol = 0.4
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,
end, self.config.e_mult,
calculate = function(_, card, context) self.config.p_dollars
if context.pre_joker then }}
return {
mult = card.edition.mult,
chips = card.edition.chips,
}
elseif context.post_joker then
return {
e_mult = card.edition.e_mult,
x_mult = card.edition.x_mult,
p_dollars = card.edition.p_dollars,
}
elseif context.main_scoring and context.cardarea == G.play then
return {
mult = card.edition.mult,
chips = card.edition.chips,
e_mult = card.edition.e_mult,
x_mult = card.edition.x_mult,
p_dollars = card.edition.p_dollars,
}
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
end })
local jumbo_modifier = Cryptid and 100 or 2 local jumbo_modifier = Cryptid and 100 or 2
SMODS.Edition({ SMODS.Edition({
key = "jumbo", key = "jumbo",
loc_txt = { loc_txt = {
name = "Jumbo", name = "Jumbo",
label = "Jumbo", label = "Jumbo",
text = { text = {
"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()
if obj.set == "Booster" or obj.jumbo_mod then if obj.set == "Booster" or obj.jumbo_mod then
jumbo_modifier = obj.jumbo_mod or 10 jumbo_modifier = obj.jumbo_mod or 10
end end
if card.added_to_deck then if card.added_to_deck then
card:remove_from_deck() card:remove_from_deck()
end end
Jane.misprintize(card, {min = jumbo_modifier, max = jumbo_modifier}, nil, true) Jane.misprintize(card, {min = jumbo_modifier, max = jumbo_modifier}, nil, true)
if card.added_to_deck then if card.added_to_deck then
card:add_to_deck() card:add_to_deck()
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
if was_added then if was_added then
card:remove_from_deck() card:remove_from_deck()
end end
Jane.misprintize(card, {min = 1 / jumbo_modifier, max = 1 / jumbo_modifier}, nil, true) Jane.misprintize(card, {min = 1 / jumbo_modifier, max = 1 / jumbo_modifier}, nil, true)
if was_added then if was_added then
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",
in_shop = true, per = 1,
shader = false, vol = 0.5
apply_to_float = false, },
get_weight = get_weight, weight = 0.8,
}) in_shop = true,
shader = false,
SMODS.Edition({ extra_cost = 12,
key = "moire", apply_to_float = false,
loc_txt = { get_weight = function(self)
name = "Moire", return G.GAME.edition_rate * self.weight
label = "Moire", end,
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,
get_weight = function(self)
return G.GAME.edition_rate * self.weight
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

@ -1,52 +1,48 @@
for _, v in pairs({"7granddad", "betmma", "honey", "oxy", "maxie", "peppino"}) do for _, v in pairs({"7granddad", "betmma", "oxy", "peppino"}) do
SMODS.Atlas { SMODS.Atlas {
px = 71, px = 71,
py = 95, py = 95,
key = "jane" .. v, key = "jane" .. v,
path = Jane.config.texture_pack .. "/j_jane_" .. v .. ".png", path = Jane.config.texture_pack .. "/j_jane_" .. v .. ".png",
} }
end end
for i = 1, 6 do 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 = {
"j_gros_michel", "j_gros_michel",
"j_egg", "j_egg",
"j_ice_cream", "j_ice_cream",
"j_cavendish", "j_cavendish",
"j_turtle_bean", "j_turtle_bean",
"j_diet_cola", "j_diet_cola",
"j_popcorn", "j_popcorn",
"j_ramen", "j_ramen",
"j_selzer", "j_selzer",
"j_cry_pickle", "j_cry_pickle",
"j_cry_chili_pepper", "j_cry_chili_pepper",
"j_cry_oldcandy", "j_cry_oldcandy",
"j_cry_caramel", "j_cry_caramel",
"j_cry_foodm", "j_cry_foodm",
"j_cry_cotton_candy", "j_cry_cotton_candy",
"j_cry_wrapped", "j_cry_wrapped",
"j_cry_candy_cane", "j_cry_candy_cane",
"j_cry_candy_buttons", "j_cry_candy_buttons",
"j_cry_jawbreaker", "j_cry_jawbreaker",
"j_cry_mellowcreme", "j_cry_mellowcreme",
"j_cry_brittle", "j_cry_brittle",
"j_jane_peppino", "j_jane_peppino",
} }
local granddad_palette = { 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()
@ -54,551 +50,231 @@ local function food_jokers_count()
return 0 return 0
end end
local amount = 0 local amount = 0
for _, v in pairs(food) do for _, v in pairs(food) do
amount = amount + #SMODS.find_card(v) amount = amount + #SMODS.find_card(v)
end end
return amount return amount
end end
local function grand_dad(card) local function grand_dad(card)
if ((Talisman or {}).config_file or {}).disable_anims then Jane.q(function()
return card:juice_up(0.5, 0.5)
end return true
end)
Jane.q(function() local rnd = math.random(6)
card:juice_up(0.5, 0.5) local obj = card.edition or {}
end)
local rnd = math.random(6) Jane.play_sound(
local obj = card.edition or {} "jane_grand" .. rnd,
obj.jane_jumbo and (1 / Jane.config.wee_sizemod) or 1,
0.5
)
Jane.play_sound( Jane.card_status_text(
"jane_grand" .. rnd, card,
obj.jane_jumbo and (1 / Jane.config.wee_sizemod) or 1, rnd == 2 and "Flintstones?!" or rnd == 6 and "Gruhh- Dad!" or "Grand Dad!",
0.5 nil,
) 0.05 * card.T.h,
granddad_palette[math.random(#granddad_palette)],
Jane.card_status_text( 0.6,
card, 0.6,
rnd == 2 and "Flintstones?!" or rnd == 6 and "Gruhh- Dad!" or "Grand Dad!", nil,
nil, nil,
0.05 * card.T.h, "bm"
granddad_palette[math.random(#granddad_palette)], )
0.6,
0.6,
nil,
nil,
"bm"
)
end end
local function voucher_count() local function voucher_count()
if not G.GAME.used_vouchers then if not G.GAME.used_vouchers then
return 0 return 0
end end
local count = 0 local count = 0
for _, v in pairs(G.GAME.used_vouchers) do for _, v in pairs(G.GAME.used_vouchers) do
if v then if v then
count = count + 1 count = count + 1
end end
end end
return count return count
end end
local maxie_quotes = { SMODS.Joker {
normal = { key = "oxy",
"Hey! I hope we can become great friends together!", atlas = "janeoxy",
"Need a paw?", loc_txt = {
"Together as a team!", name = "Oxy",
"Mmm... Milk sounds good right about now.", text = {
"Unlike most other bunnies; I don't like carrots.", "{C:attention}Scored steel{} cards give",
"Mmm... Mac and Cheese...", "{X:mult,C:white}x#1#{} {C:mult}Mult {}& {X:chips,C:white}x#1#{} {C:chips}Chips",
"I am just sitting here.", " ",
}, "{C:inactive,s:0.75,E:1}#2#{C:red,s:1.5,E:1}#3#",
scared = { }
"A-ah! S-stop it, please!! You're scaring me...!", },
"E-eek! B-be careful!!", pos = {x = 0, y = 0},
}, config = {steel = 1.5},
sinis = {x = 2, y = 0},
soul_pos = {x = 1, y = 0},
cost = 10,
rarity = 3,
blueprint_compat = true,
loc_vars = function(_, _, center)
return {vars = {
center.ability.steel,
Jane.sinister and "" or "We all cut close...",
Jane.sinister and "WHAT ARE YOU DOING DOWN THERE?!?" or "",
}}
end,
calculate = function(self, card, context)
if context.individual and
context.cardarea == G.play and
context.other_card.ability.name == "Steel Card" then
return {
x_chips = card.ability.steel,
x_mult = card.ability.steel,
colour = G.C.PURPLE,
card = card
}, true
end
end
} }
local maxie_limit = 25
SMODS.Joker { SMODS.Joker {
key = "maxie", key = "7granddad",
atlas = "janemaxie", loc_txt = {
loc_txt = { name = "7 GRAND DAD",
name = "Maxie", text = {
text = { "This Joker has a {C:jane_RGB,E:1}strange",
"{C:attention}+#1# {}booster pack slot#2#", "{C:jane_RGB,E:1}reaction {}to scored {C:attention}7{}s",
"{C:inactive,s:0.75,E:1}#3#{C:red,s:1.5,E:1}#4#", }
}, },
}, config = {},
config = {extra = {choices = Cryptid and 2 or 1}}, pos = {x = 0, y = 0},
pos = {x = 0, y = 0}, soul_pos = {x = 1, y = 0},
sinis = {x = 2, y = 0}, cost = 12,
soul_pos = {x = 1, y = 0}, rarity = exotic,
cost = 6, atlas = "jane7granddad",
rarity = 2, blueprint_compat = true,
loc_vars = function(_, _, card) loc_vars = function(_, _, center)
return { return {vars = {center.ability.shopslots}}
vars = {
card.ability.extra.choices,
card.ability.extra.choices == 1 and "" or "s",
Jane.sinister and "" or pseudorandom_element(maxie_quotes.normal, pseudoseed("MaxieQuotes")),
Jane.sinister and pseudorandom_element(maxie_quotes.scared, pseudoseed("MaxieQuotes")) or "",
},
}
end, end,
add_to_deck = function(_, card, _)
grand_dad(card)
end,
remove_from_deck = function(_, card, _)
grand_dad(card)
end,
calculate = function(_, card, context) calculate = function(_, card, context)
local min = math.min(card.ability.extra.choices, maxie_limit) if context.cardarea == G.play then
card.ability.extra.choices = min local function scj(c)
return c.cardarea and c.cardarea == G.play and not c.before and not c.after and not c.repetition
end
if context.starting_shop then if context.other_card and context.other_card:get_id() == 7 and scj(context) then
for _ = 1, min do grand_dad(card)
SMODS.add_booster_to_shop() local palette = granddad_palette[math.random(#granddad_palette)]
end local rnd = pseudorandom(pseudoseed("granddad"), 1, Cryptid and 7 or 5)
end
end, if rnd == 1 then
return {
message = "+777",
chips = 777,
colour = palette,
card = card
}, true
elseif rnd == 2 then
return {
message = "+777 Mult",
mult = 777,
colour = palette,
card = card
}, true
elseif rnd == 3 then
return {
message = "+$7",
dollars = 7,
colour = palette,
card = card
}, true
elseif rnd == 4 then
return {
message = "x7",
x_chips = 7,
colour = palette,
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
else
return {
message = "^1.77 Mult",
e_mult = 1.77,
colour = palette,
card = card
}, true
end
end
end
end
} }
function Jane.update_honey() local operator = Cryptid and "^" or "*"
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 = "betmma",
atlas = "janehoney", atlas = "janebetmma",
loc_txt = { loc_txt = {
name = "Honey{C:dark_edition}#1#", name = "Betmma",
text = { text = {
"{C:attention}#2#{}#3#", "{X:dark_edition,C:chips}+" .. operator .. "#1#{C:chips} Chips{} for every",
"#4#cannot appear", "{C:attention}unique Voucher redeemed",
"#5#{C:attention}#6#", "{C:inactive}(Currently {X:dark_edition,C:chips}" .. operator .. "#2#{C:inactive})",
"{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#", },
}, config = {big_num_scaler = true, extra = {tet = 0.1}},
}, pos = {x = 0, y = 0},
config = {extra = {level = "1"}}, -- Strings do not get mutated by other mods soul_pos = {x = 1, y = 0},
pos = {x = 0, y = 0}, cost = 50,
sinis = {x = 2, y = 0}, rarity = exotic,
soul_pos = {x = 1, y = 0}, blueprint_compat = true,
eternal_compat = false,
cost = 8,
rarity = 3,
loc_vars = function(_, _, card)
local level = tonumber(card.ability.extra.level)
local function level_name(i)
local acc = ""
local prefixes = {"super", "hyper", "ultra"}
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 "jokers " or "",
is_corrupted and (level >= #Jane.rarity_names - 1 and "Cannot be upgraded." or "") or "Getting another ",
is_corrupted and "" or "Honey",
is_corrupted and "" or "corrupts ",
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 "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 "",
},
}
end,
update = function(_, card, _)
if card.added_to_deck and card.children.center and card.children.floating_sprite then
local extra = card.ability.extra or {}
local y = tonumber(extra.level) > 1 and 1 or 0
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})
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,
}
if Cryptid then
Cryptid.aliases["honey"] = "j_jane_honey"
end
local orig_rarity = SMODS.poll_rarity
function SMODS.poll_rarity(_pool_key, _rand_key)
local max = 0
for _, v in pairs(SMODS.find_card("j_jane_honey")) do
max = v.debuff and max or math.max(max, v.ability.extra.level)
end
local rarity = orig_rarity(_pool_key, _rand_key)
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
local oxy_quotes = {
normal = {
"YOU WILL LOSE",
"DON'T EVEN TRY",
"WE WILL STOP YOU",
"He glares at the blinds with conviction.",
},
scared = {
"...H-how are you doing t-that...?",
"This is... unsettling...",
"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 {
key = "oxy",
atlas = "janeoxy",
loc_txt = {
name = "Oxy{C:dark_edition}#1#",
text = {
"{C:attention}Scored steel {}cards",
"give {X:mult,C:white}X#2#{} {C:mult}Mult",
"{C:dark_edition,E:1}#3#{}#4#{C:red}#5#{C:attention}#6#",
"{C:dark_edition,E:1}#7#{}#8#",
"#9#{C:dark_edition,E:1}#10#",
"{C:inactive,s:0.75,E:1}#11#{C:red,s:1.5,E:1}#12#",
},
},
config = {extra = {corrupted_steel = 6, is_corrupted = false, milestone = 3, progress = 0}},
pos = {x = 0, y = 0},
sinis = {x = 2, y = 0},
soul_pos = {x = 1, y = 0},
blueprint_compat = true,
cost = Cryptid and 8 or 20,
rarity = Cryptid and 3 or 4,
loc_vars = function(_, info_queue, card)
info_queue[#info_queue + 1] = G.P_CENTERS.m_steel
local ability = card.ability.extra or {}
local milestone = ability.milestone
local progress = ability.progress
local is_corrupted = ability.is_corrupted
local amount = is_corrupted and ability.corrupted_steel or steel
local effective = is_corrupted and progress or milestone - progress
local plural = effective == 1 and "" or "s"
return {
vars = {
is_corrupted and " (Corrupted)" or "",
amount,
is_corrupted and "Purifies " or "",
is_corrupted and "in " or "",
is_corrupted and "" or "Destroying ",
effective .. (is_corrupted and " round" or " steel card") .. plural,
is_corrupted and "" or "corrupts ",
is_corrupted and "Destroying steel cards" or "this Joker",
is_corrupted and "prolongs the " or "",
is_corrupted and "corruption" or "",
Jane.sinister and "" or
(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
"",
},
}
end,
update = function(_, card, _)
if card.added_to_deck and card.children.center and card.children.floating_sprite then
local extra = card.ability.extra or {}
local y = extra.is_corrupted and 1 or 0
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})
end
end,
calculate = function(_, card, context)
local extra = card.ability.extra or {}
Jane.oxy(card, context.removed)
if context.end_of_round and
extra.progress > 0 and not
context.individual and not
context.repetition and not
context.retrigger_joker then
play_sound("jane_corrupt_untick")
extra.progress = extra.progress - 1
card_eval_status_text(
card,
"extra",
nil,
nil,
nil,
{
message = extra.is_corrupted and "-1" or "+1",
colour = extra.is_corrupted and G.C.PURPLE or G.C.GREY,
}
)
end
if not extra.is_corrupting and
((extra.progress >= extra.milestone and not extra.is_corrupted) or
(extra.progress <= 0 and extra.is_corrupted)) then
extra.is_corrupting = true
Jane.q(function()
card:flip()
play_sound("card1")
end, 0.1)
Jane.q(function()
card:flip()
card:juice_up(1, 1)
play_sound("card1")
play_sound("jane_corrupt_milestone")
extra.is_corrupted = not extra.is_corrupted
extra.is_corrupting = nil
end, 1)
end
if context.individual and
context.cardarea == G.play and
context.other_card.ability.name == "Steel Card" then
local amount = extra.is_corrupted and extra.corrupted_steel or steel
return {x_mult = amount, colour = G.C.PURPLE, card = card}, true
end
end,
}
if Cryptid then
Cryptid.aliases["oxy"] = "j_jane_oxy"
end
local operator = Cryptid and "^" or "X"
local operator_prefix = Cryptid and "{X:dark_edition,C:mult}" or "{X:mult,C:white}"
SMODS.Joker {
key = "betmma",
atlas = "janebetmma",
loc_txt = {
name = "Betmma",
text = {
operator_prefix .. "+" .. operator .. "#1#{C:mult} Mult{} for every",
"{C:attention}unique Voucher redeemed",
"{C:inactive}(Currently " .. operator_prefix .. operator .. "#2#{C:inactive})",
},
},
config = {extra = {tet = Cryptid and 0.25 or 0.5}},
pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0},
blueprint_compat = true,
cost = Cryptid and 20 or 8,
rarity = Cryptid and 4 or 3,
loc_vars = function(_, _, center) loc_vars = function(_, _, center)
return {vars = {center.ability.extra.tet, 1 + (voucher_count() * center.ability.extra.tet)}} return {vars = {center.ability.extra.tet, 1 + (voucher_count() * center.ability.extra.tet)}}
end, end,
calculate = function(_, card, context) calculate = function(_, card, context)
if not context.joker_main then if context.cardarea ~= G.jokers or context.before or context.after or not context.scoring_name then
return return
end end
local v = voucher_count() local v = voucher_count()
if v > 0 then if v > 0 then
local num = 1 + (v * card.ability.extra.tet) local num = 1 + (v * card.ability.extra.tet)
return { return {
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 {
key = "7granddad",
loc_txt = {
name = "7 GRAND DAD",
text = {
"This Joker has a {C:jane_RGB,E:1}strange",
"{C:jane_RGB,E:1}reaction {}to scored {C:attention}7{}s",
},
},
config = {},
pos = {x = 0, y = 0},
soul_pos = {x = 1, y = 0},
atlas = "jane7granddad",
blueprint_compat = true,
cost = Cryptid and 49 or 7,
rarity = Cryptid and exotic or 3,
loc_vars = function(_, _, center)
return {vars = {center.ability.shopslots}}
end,
add_to_deck = function(_, card, _)
grand_dad(card)
end,
remove_from_deck = function(_, card, _)
grand_dad(card)
end,
calculate = function(_, card, context)
if context.cardarea == G.play then
local function scj(c)
return c.cardarea and c.cardarea == G.play and not c.before and not c.after and not c.repetition
end
if context.other_card and context.other_card:get_id() == 7 and scj(context) then
grand_dad(card)
local palette = granddad_palette[math.random(#granddad_palette)]
local rnd = pseudorandom(pseudoseed("granddad"), 1, Cryptid and 5 or 4)
if rnd == 1 then
return {
message = Cryptid and "+777" or "+77",
chips = Cryptid and 777 or 77,
colour = palette,
card = card,
}, true
elseif rnd == 2 then
return {
message = Cryptid and "+777 Mult" or "+77 Mult",
mult = Cryptid and 777 or 77,
colour = palette,
card = card,
}, true
elseif rnd == 3 then
return {
message = "+$7",
dollars = 7,
colour = palette,
card = card,
}, true
elseif rnd == 4 then
return {
message = Cryptid and "X7 Mult" or "X1.77 Mult",
x_mult = Cryptid and 7 or 1.77,
colour = palette,
card = card,
}, true
else
return {
message = "^1.77 Mult",
e_mult = 1.77,
colour = palette,
card = card,
}, true
end
end
end
end,
} }
SMODS.Joker { SMODS.Joker {
@ -607,30 +283,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}}, cost = 50,
rarity = exotic, rarity = exotic,
blueprint_compat = true, blueprint_compat = true,
cost = Cryptid and 50 or 20, loc_vars = function(_, _, _)
loc_vars = function(_, _, card) return {vars = {2 ^ food_jokers_count()}}
return {vars = {card.ability.extra.base ^ 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 = "^" .. 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

@ -1,143 +1,139 @@
Jane = { 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"))()
end end
function Jane.can_use() function Jane.canuse()
return not (((G.play and #G.play.cards > 0) or return not (((G.play and #G.play.cards > 0) or
(G.CONTROLLER.locked) or (G.CONTROLLER.locked) or
(G.GAME.STOP_USE and G.GAME.STOP_USE > 0)) and (G.GAME.STOP_USE and G.GAME.STOP_USE > 0)) and
G.STATE ~= G.STATES.HAND_PLAYED and G.STATE ~= G.STATES.HAND_PLAYED and
G.STATE ~= G.STATES.DRAW_TO_HAND and G.STATE ~= G.STATES.DRAW_TO_HAND and
G.STATE ~= G.STATES.PLAY_TAROT) G.STATE ~= G.STATES.PLAY_TAROT)
end end
function Jane.card_status_text( function Jane.card_status_text(
card, card,
text, text,
xoffset, xoffset,
yoffset, yoffset,
colour, colour,
size, size,
delay, delay,
juice, juice,
jiggle, jiggle,
align, align,
sound, sound,
volume, volume,
pitch, pitch,
trigger, trig,
f f
) )
if (delay or 0) <= 0 then if (delay or 0) <= 0 then
if type(f) == "function" then if type(f) == "function" then
f(card) f(card)
end end
attention_text({ attention_text({
text = text, text = text,
scale = size or 1, scale = size or 1,
hold = 0.7, hold = 0.7,
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
play_sound(sound, pitch or (0.9 + (0.2 * math.random())), volume or 1) play_sound(sound, pitch or (0.9 + (0.2 * math.random())), volume or 1)
end end
if juice then if juice then
if type(juice) == "table" then if type(juice) == "table" then
card:juice_up(juice[1], juice[2]) card:juice_up(juice[1], juice[2])
elseif type(juice) == "number" and juice ~= 0 then elseif type(juice) == "number" and juice ~= 0 then
card:juice_up(juice, juice / 6) card:juice_up(juice, juice / 6)
end end
end end
if jiggle then if jiggle then
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,
if f and type(f) == "function" then delay = delay,
f(card) func = function()
end if f and type(f) == "function" then
f(card)
end
attention_text({ attention_text({
text = text, text = text,
scale = size or 1, scale = size or 1,
hold = 0.7 + (delay or 0), hold = 0.7 + (delay or 0),
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
play_sound(sound, pitch or (0.9 + (0.2 * math.random())), volume or 1) play_sound(sound, pitch or (0.9 + (0.2*math.random())), volume or 1)
end end
if juice then if juice then
if type(juice) == "table" then if type(juice) == "table" then
card:juice_up(juice[1], juice[2]) card:juice_up(juice[1], juice[2])
elseif type(juice) == "number" and juice ~= 0 then elseif type(juice) == "number" and juice ~= 0 then
card:juice_up(juice, juice / 6) card:juice_up(juice, juice / 6)
end end
end end
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")
card:set_edition({negative = true}) card:set_edition({negative = true})
card:add_to_deck() card:add_to_deck()
G.consumeables:emplace(card) G.consumeables:emplace(card)
end end
function Jane.get_chipmult_sum(chips, mult) function Jane.get_chipmult_sum(chips, mult)
chips = chips or 0 chips = chips or 0
mult = mult or 0 mult = mult or 0
local break_infinity = ((Talisman or {}).config_file or {}).break_infinity local op, big = Jane.get_operator(), Talisman.config_file.break_infinity == "omeganum" and
local big = (break_infinity == "" or break_infinity == nil) and function(x) return x end or to_big to_big or function (x) return x end
local op = Jane.get_operator()
if op >= 3 then if op >= 3 then
return big(chips) ^ big(mult) return big(chips) ^ big(mult)
elseif op == 2 then elseif op == 2 then
return big(chips) * big(mult) return big(chips) * big(mult)
end end
return big(chips) + big(mult) return big(chips) + big(mult)
@ -153,98 +149,143 @@ function Jane.get_operator()
end end
function Jane.hidden(card) function Jane.hidden(card)
return G.GAME and not G.GAME.obsidian and return G.GAME and not
(type(card) == "table" and (card.name == "Black Hole" or card.name == "The Soul") or card.hidden) G.GAME.obsidian and
end type(card) == 'table' and
(card.name == "Black Hole" or card.name == "The Soul" or card.hidden)
function Jane.is_end_of_ante(context, card)
return not context.individual and not
context.repetition and not
(card or {}).debuff and
context.end_of_round and not
context.blueprint and
G.GAME.blind.boss and not
(G.GAME.blind.config and G.GAME.blind.config.bonus)
end end
function Jane.play_sound(sound, per, vol) function Jane.play_sound(sound, per, vol)
Jane.q(function() G.E_MANAGER:add_event(Event({
play_sound(sound, per, vol) func = function()
end) play_sound(sound,per,vol)
return true
end
}))
end end
function Jane.resize(card, mod, force_save) function Jane.q(fc, de, t, tr, bl, ba)
if force_save or not card.origsize then G.E_MANAGER:add_event(Event({
card.origsize = {w = card.T.w, h = card.T.h} timer = t,
end trigger = tr,
delay = de,
card:hard_set_T(card.T.x, card.T.y, card.T.w * mod, card.T.h * mod) blockable = bl,
remove_all(card.children) blocking = ba,
card.children = {} func = fc
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({
delay = delay,
timer = timer,
trigger = (delay and not trigger) and "after" or trigger,
blocking = blocking,
blockable = blockable,
func = function(...)
local ret = func(...)
return ret == nil and true or ret
end,
}))
end end
function Card:gc() function Card:gc()
return (self.config or {}).center or {} return (self.config or {}).center or {}
end end
function Card:norank() function Card:norank()
return self.ability.name == "Stone Card" or self.config.center.no_rank return self.ability.name == "Stone Card" or self.config.center.no_rank
end end
function Card:nosuit() 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
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 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)
Jane.sinister = nil Jane.sinister = nil
orig_menu(self, change_context) orig_menu(self, change_context)
end end
local orig_update = Game.update local orig_update = Game.update
function Game:update(dt) function Game:update(dt)
local function delete_hardbans() local function delete_hardbans()
if not Jane.config.disable_bans then if not Jane.config.disable_bans then
for _, v in pairs(Jane.config.bans) do for _, v in pairs(Jane.config.bans) do
local e = SMODS.Center:get_obj(v) local e = SMODS.Center:get_obj(v)
if e then if e then
e:delete() e:delete()
end end
end end
end end
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 = {
level = lv or "?",
mult = mul or "?",
StatusText = notif,
chips = chip or "?",
handname = name or "????",
}
update_hand_text(config, vals)
end
local function rebalance_orrery()
local function small(x)
return type(x) == "table" and x:to_number() or x
end
local orrery = (G.GAME or {}).orrery
if not orrery then
return
end
local count = 0
local hands = {}
local pools = {chips = 0, level = 0, mult = 0}
for k, v in pairs(G.GAME.hands) do
if k ~= "cry_WholeDeck" then
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
end
if pools.mult == orrery.mult and pools.chips == orrery.chips and pools.level == orrery.level then
return
end
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
orrery.mult = pools.mult
orrery.chips = pools.chips
orrery.level = pools.level
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) local function hsv(h, s, v)
if s <= 0 then if s <= 0 then return v, v, v end
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
@ -267,60 +308,66 @@ function Game:update(dt)
return r + m, g + m, b + m return r + m, g + m, b + m
end end
orig_update(self, dt) orig_update(self, dt)
local ante = G.GAME.round_resets.ante
local blind = get_blind_amount((ante >= 1 and ante <= 8) and math.floor(ante) or ante)
G.P_BLINDS["bl_jane_wee"].mult = 22 / blind
G.P_BLINDS["bl_jane_descending"].mult = math.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
for _, v in pairs(Jane.config.bans) do for _, v in pairs(Jane.config.bans) do
G.GAME.banned_keys[v] = true G.GAME.banned_keys[v] = true
end end
end end
if G.ARGS.LOC_COLOURS then if G.ARGS.LOC_COLOURS then
local r, g, b = hsv(self.C.jane_RGB_HUE / 360, .5, 1) local r, g, b = hsv(self.C.jane_RGB_HUE / 360, .5, 1)
self.C.jane_RGB[1] = r self.C.jane_RGB[1] = r
self.C.jane_RGB[3] = g self.C.jane_RGB[3] = g
self.C.jane_RGB[2] = b self.C.jane_RGB[2] = b
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 {
px = 34, px = 34,
py = 34, py = 34,
key = "modicon", key = "modicon",
path = "almanac_avatar.png", path = "almanac_avatar.png",
} }
SMODS.Atlas { SMODS.Atlas {
px = 71, px = 71,
py = 95, py = 95,
key = "janeacc", key = "janeacc",
path = Jane.config.texture_pack .. "/c_jane_acc.png", path = Jane.config.texture_pack .. "/c_jane_acc.png",
} }
for _, v in ipairs({ for _, v in ipairs({
"back", "back",
"blind", "blind",
"booster", "booster",
"challenge", "edition",
"edition", "joker",
"joker", "slugcat",
"slugcat", "spectral",
"spectral", "tarot",
"tarot", "token",
"token", "voucher",
"voucher",
}) do }) do
assert(SMODS.load_file("src/" .. v .. ".lua"))() assert(SMODS.load_file("src/" .. v .. ".lua"))()
end end

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,
@ -89,11 +90,6 @@ local function deep_copy(obj, seen)
return res return res
end end
local function format(number, str)
return math.abs(to_big(number)) >= to_big(1e300) and number
or tonumber(str:format((Big and to_number(to_big(number)) or number)))
end
local function is_card_big(joker) local function is_card_big(joker)
local center = joker.config and joker.config.center local center = joker.config and joker.config.center
@ -101,19 +97,24 @@ 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)
math.randomseed(seed) math.randomseed(seed)
local lmin = math.log(min, 2.718281828459045) local lmin = math.log(min, 2.718281828459045)
local lmax = math.log(max, 2.718281828459045) local lmax = math.log(max, 2.718281828459045)
local poll = math.random() * (lmax - lmin) + lmin local poll = math.random() * (lmax - lmin) + lmin
return math.exp(poll) return math.exp(poll)
end end
function Jane.misprintize_val(val, override, big) function Jane.misprintize_val(val, override, big)
return is_number(val) and check( local function format(number, str)
return math.abs(to_big(number)) >= to_big(1e300) and number
or tonumber(str:format((Big and to_number(to_big(number)) or number)))
end
return is_number(val) and check(
format( format(
val * log_random( val * log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante), pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
@ -127,12 +128,12 @@ function Jane.misprintize_val(val, override, big)
end end
function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack, big) function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack, big)
if name and ref_tbl and ref_value then if name and ref_tbl and ref_value then
local tbl = deep_copy(ref_tbl[ref_value]) local tbl = deep_copy(ref_tbl[ref_value])
for k, v in pairs(tbl) do for k, v in pairs(tbl) do
if (type(tbl[k]) ~= "table") or is_number(tbl[k]) then if (type(tbl[k]) ~= "table") or is_number(tbl[k]) then
if is_number(tbl[k]) and not if is_number(tbl[k]) and not
(k == "id") and not (k == "id") and not
(k == "colour") and not (k == "colour") and not
(k == "suit_nominal") and not (k == "suit_nominal") and not
@ -141,171 +142,170 @@ function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack,
(k == "qty") and not (k == "qty") and not
(k == "x_mult" and v == 1 and not tbl.override_x_mult_check) and not (k == "x_mult" and v == 1 and not tbl.override_x_mult_check) and not
(k == "selected_d6_face") then (k == "selected_d6_face") then
if not base_values[name] then if not base_values[name] then
base_values[name] = {} base_values[name] = {}
end end
if not base_values[name][k] then if not base_values[name][k] then
base_values[name][k] = tbl[k] base_values[name][k] = tbl[k]
end end
tbl[k] = check( tbl[k] = check(
clear and base_values[name][k] clear and base_values[name][k]
or format( or cry_format(
(stack and tbl[k] or base_values[name][k]) (stack and tbl[k] or base_values[name][k])
* log_random( * log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante), pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min, override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max override and override.max or G.GAME.modifiers.cry_misprint_max
), ),
"%.2g" "%.2g"
), ),
big big
) )
end end
else else
for _k, _ in pairs(tbl[k]) do for _k, _ in pairs(tbl[k]) do
if is_number(tbl[k][_k]) and not if is_number(tbl[k][_k]) and not
(_k == "id") and not (_k == "id") and not
(k == "perish_tally") and not (k == "perish_tally") and not
(k == "colour") and not (k == "colour") and not
(_k == "suit_nominal") and not (_k == "suit_nominal") and not
(_k == "base_nominal") and not (_k == "base_nominal") and not
(_k == "face_nominal") and not (_k == "face_nominal") and not
(_k == "qty") and not (_k == "qty") and not
(k == "x_mult" and v == 1 and not tbl[k].override_x_mult_check) and not (k == "x_mult" and v == 1 and not tbl[k].override_x_mult_check) and not
(_k == "selected_d6_face") then (_k == "selected_d6_face") then
if not base_values[name] then if not base_values[name] then
base_values[name] = {} base_values[name] = {}
end end
if not base_values[name][k] then if not base_values[name][k] then
base_values[name][k] = {} base_values[name][k] = {}
end end
if not base_values[name][k][_k] then if not base_values[name][k][_k] then
base_values[name][k][_k] = tbl[k][_k] base_values[name][k][_k] = tbl[k][_k]
end end
tbl[k][_k] = check( tbl[k][_k] = check(
clear and base_values[name][k][_k] clear and base_values[name][k][_k]
or format( or cry_format(
(stack and tbl[k][_k] or base_values[name][k][_k]) * (stack and tbl[k][_k] or base_values[name][k][_k]) *
log_random( log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante), pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min, override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max override and override.max or G.GAME.modifiers.cry_misprint_max
), ),
"%.2g" "%.2g"
), ),
big big
) )
end end
end end
end end
end end
ref_tbl[ref_value] = tbl ref_tbl[ref_value] = tbl
end end
end end
function Jane.misprintize(card, override, force_reset, stack) function Jane.misprintize(card, override, force_reset, stack)
local function no(self, m, no_no) local function no(self, m, no_no)
if no_no then if no_no then
if self.infinifusion then if self.infinifusion then
for i = 1, #self.infinifusion do for i = 1, #self.infinifusion do
if G.P_CENTERS[self.infinifusion[i].key][m] or if G.P_CENTERS[self.infinifusion[i].key][m] or
(G.GAME and G.GAME[m] and G.GAME[m][self.infinifusion[i].key]) then (G.GAME and G.GAME[m] and G.GAME[m][self.infinifusion[i].key]) then
return true return true
end end
end end
return false return false
end end
if not self.config then if not self.config then
return G.P_CENTERS[self.key][m] or (G.GAME and G.GAME[m] and G.GAME[m][self.key]) return G.P_CENTERS[self.key][m] or (G.GAME and G.GAME[m] and G.GAME[m][self.key])
end end
return self.config.center[m] or (G.GAME and G.GAME[m] and G.GAME[m][self.config.center_key]) or false return self.config.center[m] or (G.GAME and G.GAME[m] and G.GAME[m][self.config.center_key]) or false
end end
return no(self, "no_" .. m, true) return no(self, "no_" .. m, true)
end end
if no(card, "immutable", true) then if no(card, "immutable", true) then
force_reset = true force_reset = true
end end
if card.infinifusion then if card.infinifusion then
if card.config.center == card.infinifusion_center or card.config.center.key == "j_infus_fused" then if card.config.center == card.infinifusion_center or card.config.center.key == "j_infus_fused" then
---@diagnostic disable-next-line: undefined-global ---@diagnostic disable-next-line: undefined-global
calculate_infinifusion(card, nil, function(i) calculate_infinifusion(card, nil, function(i)
Jane.misprintize(card, override, force_reset, stack) 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
(G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker") and not
stack or not
no(card, "immutable", true) then
if card.ability.name == "Ace Aequilibrium" then
return
end
if (not force_reset or G.GAME.modifiers.cry_jkr_misprint_mod) and if G.GAME.modifiers.cry_jkr_misprint_mod and card.ability.set == "Joker" then
(G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker") and not if not override then
stack or not override = {}
no(card, "immutable", true) then end
if card.ability.name == "Ace Aequilibrium" then
return
end
if G.GAME.modifiers.cry_jkr_misprint_mod and card.ability.set == "Joker" then override.min = override.min or G.GAME.modifiers.cry_misprint_min or 1
if not override then override.max = override.max or G.GAME.modifiers.cry_misprint_max or 1
override = {} override.min = override.min * G.GAME.modifiers.cry_jkr_misprint_mod
end override.max = override.max * G.GAME.modifiers.cry_jkr_misprint_mod
end
override.min = override.min or G.GAME.modifiers.cry_misprint_min or 1 if G.GAME.modifiers.cry_misprint_min or override and override.min then
override.max = override.max or G.GAME.modifiers.cry_misprint_max or 1 Jane.misprintize_tbl(
override.min = override.min * G.GAME.modifiers.cry_jkr_misprint_mod card.config.center_key,
override.max = override.max * G.GAME.modifiers.cry_jkr_misprint_mod card,
end "ability",
nil,
override,
stack,
is_card_big(card)
)
if G.GAME.modifiers.cry_misprint_min or override and override.min then if card.base then
Jane.misprintize_tbl( Jane.misprintize_tbl(
card.config.center_key, card.config.card_key,
card, card,
"ability", "base",
nil, nil,
override, override,
stack, stack,
is_card_big(card) is_card_big(card)
) )
end
end
if card.base then if G.GAME.modifiers.cry_misprint_min then
Jane.misprintize_tbl( card.misprint_cost_fac = 1 /
card.config.card_key,
card,
"base",
nil,
override,
stack,
is_card_big(card)
)
end
end
if G.GAME.modifiers.cry_misprint_min then
card.misprint_cost_fac = 1 /
log_random( log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante), pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min, override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max override and override.max or G.GAME.modifiers.cry_misprint_max
) )
card:set_cost() card:set_cost()
end end
else else
Jane.misprintize_tbl(card.config.center_key, card, "ability", true, nil, nil, is_card_big(card)) Jane.misprintize_tbl(card.config.center_key, card, "ability", true, nil, nil, is_card_big(card))
end end
if card.ability.consumeable then if card.ability.consumeable then
for k, _ in pairs(card.ability.consumeable) do for k, _ in pairs(card.ability.consumeable) do
card.ability.consumeable[k] = deep_copy(card.ability[k]) card.ability.consumeable[k] = deep_copy(card.ability[k])
end end
end end
end end

File diff suppressed because it is too large Load diff

View file

@ -1,307 +1,354 @@
SMODS.Atlas { 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"})
local function conjure(card, number) local function conjure(card, number)
for _ = 1, math.min( for _ = 1, math.min(
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({
if G.consumeables.config.card_limit <= #G.consumeables.cards then trigger = "after",
return delay = 0.4,
end func = function()
if G.consumeables.config.card_limit <= #G.consumeables.cards then
return true
end
play_sound("jane_draw") play_sound("jane_draw")
local spectral = create_card("Spectral", G.consumeables, nil, nil, nil, nil, nil, "pri") local spectral = create_card("Spectral", G.consumeables, nil, nil, nil, nil, nil, "pri")
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({
cards[i] = true delay = 0.1,
G.playing_card = (G.playing_card and G.playing_card + 1) or 1 func = function()
cards[i] = true
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
local card = Card( local card = Card(
G.play.T.x + G.play.T.w / 2, G.play.T.x + G.play.T.w / 2,
G.play.T.y, G.CARD_W, G.CARD_H, G.play.T.y, G.CARD_W, G.CARD_H,
v, v,
enhancement or G.P_CENTERS.c_base, enhancement or G.P_CENTERS.c_base,
{playing_card = G.playing_card} {playing_card = G.playing_card}
) )
if edition then if edition then
card:set_edition(type(edition) == "table" and edition or {[edition] = true}, true, true) card:set_edition(type(edition) == "table" and edition or {[edition] = true}, true, true)
end end
play_sound("card1") play_sound("card1")
table.insert(G.playing_cards, card) table.insert(G.playing_cards, card)
card:add_to_deck() card:add_to_deck()
if emplacement then if emplacement then
emplacement:emplace(card) emplacement:emplace(card)
else else
G.deck:emplace(card) G.deck:emplace(card)
end end
end, 0.1)
end
end
Jane.q(function() return true
if next(cards) then end
playing_card_joker_effects(cards) }))
end end
end) end
Jane.q(function()
if next(cards) then
playing_card_joker_effects(cards)
end
return true
end)
Jane.q(function()
cards = nil
return true
end)
end end
local function randomize(targets, noanim) local function randomize(targets, noanim)
if #targets <= 0 then if #targets <= 0 then
return return
end end
if noanim then if noanim then
for i = 1, #targets do for i=1, #targets do
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( card:set_ability(
pseudorandom(pseudoseed("chancetime")) > 1 / (#G.P_CENTER_POOLS["Enhanced"] + 1) and pseudorandom(pseudoseed("chancetime")) > 1 / (#G.P_CENTER_POOLS["Enhanced"] + 1) and
pseudorandom_element(G.P_CENTER_POOLS["Enhanced"], pseudoseed("spectral_chance")) or pseudorandom_element(G.P_CENTER_POOLS["Enhanced"], pseudoseed("spectral_chance")) or
G.P_CENTERS["c_base"] G.P_CENTERS["c_base"]
) )
local edition_rate = 2 local edition_rate = 2
card:set_edition(poll_edition("standard_edition" .. G.GAME.round_resets.ante, edition_rate, true), true, true) card:set_edition(poll_edition("standard_edition" .. G.GAME.round_resets.ante, edition_rate, true), true, true)
local seal_rate = 10 local seal_rate = 10
local seal_poll = pseudorandom(pseudoseed("stdseal" .. G.GAME.round_resets.ante)) local seal_poll = pseudorandom(pseudoseed("stdseal" .. G.GAME.round_resets.ante))
if seal_poll > 1 - 0.02 * seal_rate then if seal_poll > 1 - 0.02 * seal_rate then
local seal_type = pseudorandom(pseudoseed("stdsealtype" .. G.GAME.round_resets.ante)) local seal_type = pseudorandom(pseudoseed("stdsealtype" .. G.GAME.round_resets.ante))
local seal_list = {} local seal_list = {}
for k, _ in pairs(G.P_SEALS) do for k, _ in pairs(G.P_SEALS) do
table.insert(seal_list, k) table.insert(seal_list, k)
end end
seal_type = math.floor(seal_type * #seal_list) seal_type = math.floor(seal_type * #seal_list)
card:set_seal(seal_list[seal_type], true, true) card:set_seal(seal_list[seal_type], true, true)
else else
card:set_seal(nil, true, true) card:set_seal(nil, true, true)
end end
card:juice_up(0.3, 0.3) card:juice_up(0.3, 0.3)
end end
else else
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({
targets[i]:flip() trigger = "after",
play_sound("card1", percent) delay = 0.15,
targets[i]:juice_up(0.3, 0.3) func = function()
end, 0.15) targets[i]:flip()
end play_sound("card1", percent)
targets[i]:juice_up(0.3, 0.3)
return true
end
}))
end
delay(0.2) delay(0.2)
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({
local card = targets[i] trigger = "after",
card:set_base(pseudorandom_element(G.P_CARDS)) delay = 0.1,
card:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"])) func = function()
local card = targets[i]
card:set_base(pseudorandom_element(G.P_CARDS))
card:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"]))
local edition_rate = 2 local edition_rate = 2
card:set_edition(poll_edition("standard_edition" .. G.GAME.round_resets.ante, edition_rate, true)) card:set_edition(poll_edition("standard_edition" .. G.GAME.round_resets.ante, edition_rate, true))
local seal_rate = 10 local seal_rate = 10
local seal_poll = pseudorandom(pseudoseed("stdseal" .. G.GAME.round_resets.ante)) local seal_poll = pseudorandom(pseudoseed("stdseal" .. G.GAME.round_resets.ante))
if seal_poll > 1 - 0.02 * seal_rate then if seal_poll > 1 - 0.02 * seal_rate then
local seal_type = pseudorandom(pseudoseed("stdsealtype" .. G.GAME.round_resets.ante)) local seal_type = pseudorandom(pseudoseed("stdsealtype" .. G.GAME.round_resets.ante))
local seal_list = {} local seal_list = {}
for k, _ in pairs(G.P_SEALS) do for k, _ in pairs(G.P_SEALS) do
table.insert(seal_list, k) table.insert(seal_list, k)
end end
seal_type = math.floor(seal_type * #seal_list) seal_type = math.floor(seal_type * #seal_list)
card:set_seal(seal_list[seal_type]) card:set_seal(seal_list[seal_type])
else else
card:set_seal() card:set_seal()
end end
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
SMODS.Consumable { SMODS.Consumable {
key = "obfuscation", key = "obfuscation",
atlas = "janeacc", atlas = "janeacc",
set = "Spectral", set = "Spectral",
loc_txt = { loc_txt = {
name = "Obfuscation", name = "Obfuscation",
text = { text = {
"{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,
can_use = function(_, _) can_use = function(_, _)
return Jane.can_use() and #((G.hand or {}).cards or {}) > 0 return Jane.canuse() and #((G.hand or {}).cards or {}) > 0
end, end,
use = function(_, card, _, _) use = function(_, card, _, _)
Jane.q(function() G.E_MANAGER:add_event(Event({
play_sound("tarot1") trigger = "after",
card:juice_up(0.3, 0.5) delay = 0.4,
end, 0.4) func = function()
play_sound("tarot1")
card:juice_up(0.3, 0.5)
return true
end
}))
randomize(G.hand.cards) randomize(G.hand.cards)
delay(0.5) delay(0.5)
end, end
} }
SMODS.Consumable { SMODS.Consumable {
key = "conjure", key = "conjure",
set = "Spectral", set = "Spectral",
atlas = "janeacc", atlas = "janeacc",
loc_txt = { loc_txt = {
name = "Conjure", name = "Conjure",
text = { text = {
"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.canuse,
use = function(_, card, _, _) use = function(_, card, _, _)
conjure(card, 1) conjure(card, 1)
delay(0.6) delay(0.6)
end, end,
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 {
key = "shadows",
set = "Spectral",
atlas = "janeacc",
loc_txt = {
name = "Shadows",
text = {
"Create {C:attention}#1#{} {C:green}random {C:dark_edition}Negative",
"{C:attention}Perishable {C:attention}Jokers{}, set {C:money}sell",
"{C:money}value {}of {C:attention}all Jokers {}to {C:money}$0",
},
},
config = {extra = {shadows = 2}},
pos = {x = 3, y = 4},
cost = 4,
loc_vars = function(_, _, card)
return {vars = {math.min(((card.ability or {}).extra or {}).shadows or 2, shadows_limit)}}
end,
can_use = Jane.can_use,
use = function(_, card, _, _)
for _ = 1, math.min(card.ability.extra.shadows, shadows_limit) do
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
joker:set_edition({negative = true})
joker.ability.eternal = false
joker.ability.perishable = true
joker.ability.perish_tally = 5
joker:add_to_deck()
G.jokers:emplace(joker)
end
delay(0.6)
for i = 1, #G.jokers.cards do
G.jokers.cards[i].base_cost = 0
G.jokers.cards[i].extra_cost = 0
G.jokers.cards[i].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
end
end,
bulk_use = function(_, card, _, _, number)
for _ = 1, math.min(card.ability.extra.shadows, 25) * number do
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
joker.no_forced_edition = true
joker:set_edition({negative = true})
joker.no_forced_edition = nil
joker.ability.eternal = false
joker.ability.perishable = true
joker.ability.perish_tally = 5
joker:add_to_deck()
G.jokers:emplace(joker)
end
delay(0.6)
for i = 1, #G.jokers.cards do
G.jokers.cards[i].base_cost = 0
G.jokers.cards[i].extra_cost = 0
G.jokers.cards[i].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
end
end,
} }
SMODS.Consumable { SMODS.Consumable {
key = "rift", key = "shadows",
atlas = "janeacc", set = "Spectral",
set = "Spectral", atlas = "janeacc",
loc_txt = { loc_txt = {
name = "Rift", name = "Shadows",
text = { text = {
"{C:attention}Reset {}your deck to a", "Create {C:attention}#1#{} {C:green}random {C:dark_edition}Negative",
"{C:attention}standard 52-card deck", "{C:attention}Perishable {C:attention}Jokers{}, set",
}, "{C:money}sell value{} of {C:attention}all Jokers{} to {C:money}$0",
}, }
pos = {x = 4, y = 4}, },
cost = 4, config = {extra = {shadows = 2}},
can_use = Jane.can_use, pos = {x = 3, y = 4},
use = function(_, _, _, _) cost = 4,
Jane.q(function() loc_vars = function(_, _, center)
for _, v in pairs(G.playing_cards) do return {vars = {((center.ability or {}).extra or {}).shadows or 2}}
v:start_dissolve()
end
end)
delay(2)
create_full_deck()
end, end,
can_use = Jane.canuse,
use = function(_, card, _, _)
for _ = 1, card.ability.extra.shadows do
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
joker:set_edition({negative = true})
joker.ability.eternal = false
joker.ability.perishable = true
joker.ability.perish_tally = 5
joker:add_to_deck()
G.jokers:emplace(joker)
end
delay(0.6)
for i = 1, #G.jokers.cards do
G.jokers.cards[i].base_cost = 0
G.jokers.cards[i].extra_cost = 0
G.jokers.cards[i].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
end
end,
bulk_use = function(_, card, _, _, number)
for _ = 1, card.ability.extra.shadows * number do
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
joker.no_forced_edition = true
joker:set_edition({negative = true})
joker.no_forced_edition = nil
joker.ability.eternal = false
joker.ability.perishable = true
joker.ability.perish_tally = 5
joker:add_to_deck()
G.jokers:emplace(joker)
end
delay(0.6)
for i = 1, #G.jokers.cards do
G.jokers.cards[i].base_cost = 0
G.jokers.cards[i].extra_cost = 0
G.jokers.cards[i].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
end
end
}
SMODS.Consumable {
key = "reverse_hanged_man",
atlas = "janertarots",
set = "Spectral",
loc_txt = {
name = "Zen",
text = {
"{C:attention}Reset{} your deck to",
"a {C:attention}standard 52-card deck"
}
},
config = {extra = {destruction = 0.5}},
pos = {x = 7, y = 1},
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.canuse,
use = function(_, _, _, _)
Jane.q(function()
for _, v in pairs(G.playing_cards) do
v:start_dissolve()
end
return true
end)
local function realdelay(time, queue)
G.E_MANAGER:add_event(Event({
trigger = "after",
timer = "REAL",
delay = time or 1,
func = function()
return true
end
}), queue)
end
realdelay(1)
createfulldeck()
end
} }

View file

@ -1,82 +1,51 @@
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!", "You wouldn't say no to a free negative me, would you?",
"Hee-hee, hoo-hoo!", "Sometimes, an extra four mult goes a long way!",
"Looks like the joke is on you!", "I won't take up space, I promise!",
"Ouch, I think the joke is on me!", "Don't ask how I ended up in a tarot!",
"I won't take up space, I promise!", "Hee-hee, hoo-hoo!",
"Don't ask how I ended up in a tarot!", "Who knew even fortunes could be a circus act?",
"The stakes are only gonna rise here!", "Looks like the joke is on the crystal globe!",
"I wonder what's the deal with pairs?", "It's a little cramped in this tarot...!",
"It's a little cramped in this tarot...!", "Ouch, I think the joke is on me!",
"Juggling is one of my favourite passtimes!", "Looks like the joke is on you!",
"I'm not just a clown; I'm the whole circus!", "I'm not just a clown; I'm the whole circus!",
"Looks like the joke is on the crystal globe!", "Seems a little suspicious for a jolly old fella like me to be in this card...",
"Who knew even fortunes could be a circus act?", "I can't help if I'm still in this silly old card, break me out!",
"Sometimes, an extra four mult goes a long way!", "Let me tell you, you'd love the show going on in this tarot!",
"I can't give four mult if I'm still in this card!", "I'd give you more tickets to JimCon, but I'm fresh out.",
"You wouldn't say no to a free negative me, would you?", "I've heard of a round buffoon that lives in a pretty funky town...",
"I'd give you more tickets to JimCon, but I'm fresh out.", "I can't give four mult if I'm still in this card!",
"Let me tell you, you'd love the show going on in this tarot!", "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!", "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!", "The stakes are only gonna rise here!",
"I've heard of a round buffoon that lives in a pretty funky town...", "Juggling is one of my favourite passtimes!",
"You don't need to understand math to enjoy watching the digits climb!", "I wonder what's the deal with pairs?",
"I'm rooting for you! Even if it means I'll never get out of this card...", "You don't need to understand math to enjoy watching the digits climb!",
"Seems a little suspicious for a jolly old fella like me to be in this card...", "You should meet my friend Joseph; he's stuck in a Planet card!",
"M!",
} }
SMODS.Consumable { SMODS.Consumable {
key = "jokerinatarot", key = "jokerinatarot",
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.canuse,
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
@ -85,17 +54,10 @@ SMODS.Consumable {
card.sell_cost_label = card.facing == "back" and "?" or card.sell_cost card.sell_cost_label = card.facing == "back" and "?" or card.sell_cost
card:add_to_deck() card:add_to_deck()
G.jokers:emplace(card) G.jokers:emplace(card)
end, end,
bulk_use = function(self, card, area, copier, number) bulk_use = function(self, card, area, copier, number)
for _ = 1, number do for _ = 1, number do
self:use(card, area, copier) self:use(card, area, copier)
end 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

View file

@ -1,127 +1,86 @@
SMODS.Atlas { 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"})
SMODS.ConsumableType { SMODS.ConsumableType {
key = "jane_tokens", key = "jane_tokens",
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_bundle", "Bundle", 1, 1, 10},
{"tag_cry_loss", "Loss", 0, 1, 12}, {"tag_uncommon", "Uncommon", 2, 1, 3},
{"tag_cry_bundle", "Bundle", 1, 1, 10}, {"tag_rare", "Rare", 3, 1, 5},
{"tag_uncommon", "Uncommon", 2, 1, 3}, {"tag_cry_epic", "Epic", 4, 1, 8},
{"tag_rare", "Rare", 3, 1, 5}, {"tag_foil", "Foil", 1, 3, 3},
{"tag_cry_epic", "Epic", 4, 1, 8}, {"tag_holo", "Holographic", 2, 3, 4},
{"tag_cry_gourmond", "Gourmond", 5, 1, 4}, {"tag_polychrome", "Polychrome", 3, 3, 5},
{"tag_double", "Double", 0, 2, 6}, {"tag_negative", "Negative", 4, 3, 10},
{"tag_cry_triple", "Triple", 1, 2, 8}, {"tag_investment", "Investment", 0, 3, 8},
{"tag_cry_quadruple", "Quadruple", 2, 2, 10}, {"tag_voucher", "Voucher", 4, 5, 5},
{"tag_cry_quintuple", "Quintuple", 3, 2, 13}, {"tag_handy", "Handy", 1, 5, 8},
{"tag_skip", "Speed", 4, 2, 7}, {"tag_garbage", "Garbage", 0, 5, 6},
{"tag_economy", "Economy", 5, 2, 10}, {"tag_coupon", "Coupon", 4, 4, 10},
{"tag_investment", "Investment", 0, 3, 8}, {"tag_juggle", "Juggle", 2, 5, 2},
{"tag_foil", "Foil", 1, 3, 3}, {"tag_d_six", "Dice", 0, 4, 2},
{"tag_holo", "Holographic", 2, 3, 4}, {"tag_top_up", "Top-up", 2, 4, 2},
{"tag_polychrome", "Polychrome", 3, 3, 5}, {"tag_skip", "Speed", 4, 2, 7},
{"tag_negative", "Negative", 4, 3, 10}, {"tag_economy", "Economy", 5, 2, 10},
{"tag_d_six", "Dice", 0, 4, 2}, {"tag_double", "Double", 0, 2, 6},
{"tag_orbital", "Orbital", 1, 4, 6}, {"tag_cry_triple", "Triple", 1, 2, 8},
{"tag_top_up", "Top-up", 2, 4, 2}, {"tag_cry_quadruple", "Quadruple", 2, 2, 10},
{"tag_cry_bettertop_up", "Top-up+", 3, 4, 3}, {"tag_cry_quintuple", "Quintuple", 3, 2, 13},
{"tag_coupon", "Coupon", 4, 4, 10}, {"tag_cry_memory", "Memory", 5, 4, 8}
{"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_cry_better_voucher", "Voucher+", 5, 5, 7},
{"tag_cry_gambler", "Gamble", 0, 6, 10},
{"tag_cry_cat", "Cat", 1, 6, 1},
{"tag_cry_mosaic", "Mosaic", 2, 6, 6},
{"tag_cry_glass", "Fragile", 3, 6, 7},
{"tag_cry_astral", "Astral", 4, 6, 8},
{"tag_cry_m", "M", 5, 6, 8},
{"tag_cry_blur", "Blurred", 0, 7, 11},
{"tag_cry_oversat", "Oversaturated", 1, 7, 12},
{"tag_cry_glitched", "Glitched", 2, 7, 13},
{"tag_cry_gold", "Golden", 3, 7, 9},
{"tag_cry_booster", "Booster", 4, 7, 4},
{"tag_cry_scope", "Scope", 5, 7, 3},
{"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 {
key = "token_" .. v[1], key = "token_" .. v[1],
set = "jane_tokens", set = "jane_tokens",
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",
loc_vars = function(_, info_queue, _) "{C:attention}" .. v[2] .. " Tag",
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, can_divide = true,
can_divide = true, can_use = Jane.canuse,
can_use = Jane.can_use, in_pool = function (_, _)
in_pool = function(_, _) return G.GAME.used_vouchers.v_jane_token_voucher
return G.GAME.used_vouchers.v_jane_token_voucher end,
end, use = function(_, _, _, _)
use = function(_, _, _, _) play_sound("jane_e_gilded", 1.25, 0.4)
play_sound("jane_e_gilded", 1.25, 0.4) add_tag(Tag(v[1]))
on_token_use(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,43 +1,23 @@
SMODS.Atlas { SMODS.Atlas {
key = "janejollyvoucher", key = "janetokenvoucher",
px = 71, px = 71,
py = 95, py = 95,
path = Jane.config.texture_pack .. "/v_jane_jolly_voucher.png", path = Jane.config.texture_pack .. "/v_jane_token_voucher.png"
}
SMODS.Atlas {
key = "janetokenvoucher",
px = 71,
py = 95,
path = Jane.config.texture_pack .. "/v_jane_token_voucher.png",
} }
SMODS.Voucher { SMODS.Voucher {
key = "jolly_voucher", key = "token_voucher",
atlas = "janejollyvoucher", atlas = "janetokenvoucher",
loc_txt = { loc_txt = {
name = "Jolly Voucher", name = "Token Voucher",
text = {"{C:attention,T:c_jane_jokerinatarot}Joker-in-a-Tarot {}creates", "{C:attention,T:j_jolly}Jolly Joker {}instead"}, text = {
}, "{C:attention}Tokens {}can appear",
pos = {x = 0, y = 0}, "in the shop",
cost = 8, }
loc_vars = function(_, info_queue, _) },
info_queue[#info_queue + 1] = G.P_CENTERS.c_jane_jokerinatarot pos = {x = 0, y = 0},
info_queue[#info_queue + 1] = G.P_CENTERS.j_jolly cost = 15,
return {vars = {}} redeem = function (_, _)
end, G.GAME['jane_tokens_rate'] = 1.5
} end
SMODS.Voucher {
key = "token_voucher",
atlas = "janetokenvoucher",
loc_txt = {
name = "Token Voucher",
text = {"{C:attention}Tokens {}can appear", "in the shop"},
},
pos = {x = 0, y = 0},
cost = 15,
redeem = function(_, _)
G.GAME["jane_tokens_rate"] = 1.5
end,
} }