Compare commits
46 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ff684ed79 | |||
| 8e44deab99 | |||
| 023fa306ff | |||
| 63a48ff597 | |||
| af75973c0b | |||
| d131dadae8 | |||
| dd96176c3d | |||
| f93d8f09e6 | |||
| ed3303e575 | |||
| 93e0a4f6d6 | |||
| b4834d2c9b | |||
| 571eff1e53 | |||
| 91a5163b20 | |||
| 9de61821c5 | |||
| c494379e07 | |||
| 3002fe967f | |||
| 89b072cb45 | |||
| 00abcb0c14 | |||
| a2a238be3a | |||
| 23a77ed39f | |||
| 1c592f3878 | |||
| 0b6aa8afbb | |||
| 7549eb55d9 | |||
| 151023da0e | |||
| cf014cb9b7 | |||
| f1e6007cbd | |||
| f6c6066751 | |||
| 9347fca3cc | |||
| abf64c33d6 | |||
| ff09fc2722 | |||
| a061166e36 | |||
|
|
780814fece | ||
|
|
81695eae8b | ||
|
|
bb5908b042 | ||
|
|
5582920601 | ||
|
|
80b7cd1d47 | ||
|
|
a77fb916c7 | ||
|
|
5383f83425 | ||
|
|
2e661e0b50 | ||
|
|
e9090a2a5d | ||
|
|
e767c7651b | ||
|
|
9d8a6991b1 | ||
|
|
fbe895ba22 | ||
|
|
b7e8ca7cb9 | ||
|
|
767d54d2d8 | ||
|
|
e069cd8f68 |
25 changed files with 1887 additions and 914 deletions
171
.editorconfig
Normal file
171
.editorconfig
Normal file
|
|
@ -0,0 +1,171 @@
|
||||||
|
|
||||||
|
# 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
|
||||||
BIN
assets/1x/default/sleeve_jane_sleeves.png
Normal file
BIN
assets/1x/default/sleeve_jane_sleeves.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
BIN
assets/1x/default/v_jane_jolly_voucher.png
Normal file
BIN
assets/1x/default/v_jane_jolly_voucher.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.2 KiB |
BIN
assets/2x/default/sleeve_jane_sleeves.png
Normal file
BIN
assets/2x/default/sleeve_jane_sleeves.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
BIN
assets/2x/default/v_jane_jolly_voucher.png
Normal file
BIN
assets/2x/default/v_jane_jolly_voucher.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.5 KiB |
151
assets/shaders/moire.fs
Normal file
151
assets/shaders/moire.fs
Normal file
|
|
@ -0,0 +1,151 @@
|
||||||
|
#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
|
||||||
BIN
assets/sounds/e_moire.ogg
Normal file
BIN
assets/sounds/e_moire.ogg
Normal file
Binary file not shown.
BIN
assets/sounds/music_attuned.ogg
Normal file
BIN
assets/sounds/music_attuned.ogg
Normal file
Binary file not shown.
BIN
assets/sounds/music_attuned_sinister.ogg
Normal file
BIN
assets/sounds/music_attuned_sinister.ogg
Normal file
Binary file not shown.
38
lovely.toml
38
lovely.toml
|
|
@ -48,6 +48,7 @@ payload = '''if Jane and (type(G.ARGS.score_intensity.required_score) == "table"
|
||||||
local base = Cryptid and 10 or G.ARGS.score_intensity.required_score
|
local base = Cryptid and 10 or G.ARGS.score_intensity.required_score
|
||||||
local expo = Cryptid and G.ARGS.score_intensity.required_score or 10
|
local expo = Cryptid and G.ARGS.score_intensity.required_score or 10
|
||||||
Jane.sinister = (G.ARGS.score_intensity.earned_score / (big(base) ^ big(expo))):to_number() > 1
|
Jane.sinister = (G.ARGS.score_intensity.earned_score / (big(base) ^ big(expo))):to_number() > 1
|
||||||
|
G.escapey_sinister = Jane.sinister
|
||||||
end'''
|
end'''
|
||||||
match_indent = true
|
match_indent = true
|
||||||
|
|
||||||
|
|
@ -57,10 +58,15 @@ target = "functions/state_events.lua"
|
||||||
pattern = "for _, v in ipairs(SMODS.get_card_areas('playing_cards')) do"
|
pattern = "for _, v in ipairs(SMODS.get_card_areas('playing_cards')) do"
|
||||||
position = "after"
|
position = "after"
|
||||||
payload = '''if v == G.hand and not (G.GAME.blind and G.GAME.blind.name == "The Card" and not G.GAME.blind.disabled) and next(SMODS.find_card("j_jane_survivor")) then
|
payload = '''if v == G.hand and not (G.GAME.blind and G.GAME.blind.name == "The Card" and not G.GAME.blind.disabled) and next(SMODS.find_card("j_jane_survivor")) then
|
||||||
for _, v in ipairs(G.hand.cards) do
|
if Cryptid then
|
||||||
local area = {cards = {v}}
|
for _, v in ipairs(G.hand.cards) do
|
||||||
SMODS.calculate_main_scoring({cardarea = area, full_hand = area.cards, scoring_hand = area.cards, scoring_name = text, poker_hands = poker_hands}, area.cards)
|
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}, nil)
|
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
|
end
|
||||||
else'''
|
else'''
|
||||||
match_indent = true
|
match_indent = true
|
||||||
|
|
@ -122,3 +128,27 @@ pattern = '''hand_chips\*mult\)'''
|
||||||
position = "at"
|
position = "at"
|
||||||
payload = "Jane.get_chipmult_sum(hand_chips, mult))"
|
payload = "Jane.get_chipmult_sum(hand_chips, mult))"
|
||||||
match_indent = true
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '=[SMODS Cryptid "items/spectral.lua"]'
|
||||||
|
pattern = "local _first_dissolve = nil"
|
||||||
|
position = "after"
|
||||||
|
payload = 'deletable_jokers = next(SMODS.find_card("j_jane_saint")) and {} or deletable_jokers'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '=[SMODS Cryptid "items/exotic.lua"]'
|
||||||
|
pattern = "local _first_dissolve = nil"
|
||||||
|
position = "after"
|
||||||
|
payload = 'deletable_jokers = next(SMODS.find_card("j_jane_saint")) and {} or deletable_jokers'
|
||||||
|
match_indent = true
|
||||||
|
|
||||||
|
[[patches]]
|
||||||
|
[patches.pattern]
|
||||||
|
target = '=[SMODS _ "src/utils.lua"]'
|
||||||
|
pattern = "function SMODS.has_enhancement(card, key)"
|
||||||
|
position = "after"
|
||||||
|
payload = "if not card.config then return false end"
|
||||||
|
match_indent = true
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,21 @@
|
||||||
{
|
{
|
||||||
"id": "jane",
|
"id": "jane",
|
||||||
"name": "Almighty",
|
"name": "Almighty",
|
||||||
"author": ["jenwalter666", "Emik"],
|
"author": [
|
||||||
|
"jenwalter666",
|
||||||
|
"Emik"
|
||||||
|
],
|
||||||
"description": "Fork of Jen's almanac that rebalances the mod by heavily toning down on the power creep and cutting out anything deemed not essential. Made out of genuine love for the original mod.",
|
"description": "Fork of Jen's almanac that rebalances the mod by heavily toning down on the power creep and cutting out anything deemed not essential. Made out of genuine love for the original mod.",
|
||||||
"prefix": "jane",
|
"prefix": "jane",
|
||||||
"main_file": "src/main.lua",
|
"main_file": "src/main.lua",
|
||||||
"badge_colour": "3c3cff",
|
"badge_colour": "3c3cff",
|
||||||
"priority": 114,
|
"priority": 114,
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
"Steamodded (>=1.0.0~ALPHA-1304a)",
|
"Steamodded (>=1.0.0~ALPHA-1304a)",
|
||||||
"Bakery (>=0.1.26~*)"
|
"Bakery (>=0.1.26~*)"
|
||||||
],
|
],
|
||||||
"conflicts": ["Jen"],
|
"conflicts": [
|
||||||
"version": "1.0.0"
|
"Jen"
|
||||||
|
],
|
||||||
|
"version": "1.5.19"
|
||||||
}
|
}
|
||||||
1
refs/CardSleeves
Symbolic link
1
refs/CardSleeves
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../../CardSleeves/
|
||||||
641
src/back.lua
641
src/back.lua
|
|
@ -2,12 +2,100 @@ SMODS.Atlas {
|
||||||
px = 71,
|
px = 71,
|
||||||
py = 95,
|
py = 95,
|
||||||
key = "janedecks",
|
key = "janedecks",
|
||||||
path = Jane.config.texture_pack .. "/b_jane_decks.png"
|
path = Jane.config.texture_pack .. "/b_jane_decks.png",
|
||||||
}
|
}
|
||||||
|
|
||||||
local eternal_text = Cryptid and "Absolute" or "Eternal"
|
SMODS.Atlas {
|
||||||
|
px = 73,
|
||||||
|
py = 95,
|
||||||
|
key = "janesleeves",
|
||||||
|
path = Jane.config.texture_pack .. "/sleeve_jane_sleeves.png",
|
||||||
|
}
|
||||||
|
|
||||||
SMODS.Back {
|
local function back(x)
|
||||||
|
local key = x.key
|
||||||
|
local apply = x.apply
|
||||||
|
local calculate = x.calculate
|
||||||
|
|
||||||
|
x.apply = function(...)
|
||||||
|
if apply and G.GAME.selected_sleeve ~= "sleeve_jane_" .. key then
|
||||||
|
return apply(...)
|
||||||
|
end
|
||||||
|
|
||||||
|
Jane.q(function()
|
||||||
|
save_run()
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
x.calculate = function(...)
|
||||||
|
if calculate and G.GAME.selected_sleeve ~= "sleeve_jane_" .. key then
|
||||||
|
return calculate(...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
SMODS.Back(x)
|
||||||
|
local text = x.loc_txt.text
|
||||||
|
local name = x.loc_txt.name:gsub("Deck$", "Sleeve")
|
||||||
|
|
||||||
|
if not CardSleeves then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
G.localization.descriptions.Sleeve = G.localization.descriptions.Sleeve or {}
|
||||||
|
G.localization.descriptions.Sleeve["sleeve_jane_" .. key .. "_alt"] = x.alt_loc_txt
|
||||||
|
|
||||||
|
CardSleeves.Sleeve {
|
||||||
|
key = key,
|
||||||
|
pos = x.pos,
|
||||||
|
atlas = "janesleeves",
|
||||||
|
loc_txt = {name = name, text = text},
|
||||||
|
apply = function(self, ...)
|
||||||
|
-- Game becomes genuinely unplayable if this is allowed.
|
||||||
|
-- if self.get_current_deck_key() == "b_jane_omega" and G.GAME.selected_sleeve == "sleeve_jane_omega" then
|
||||||
|
-- if apply then
|
||||||
|
-- apply(self, ...)
|
||||||
|
-- end
|
||||||
|
-- if x.alt_apply then
|
||||||
|
-- x.alt_apply(self, ...)
|
||||||
|
-- end
|
||||||
|
-- return
|
||||||
|
-- end
|
||||||
|
local a = (self.get_current_deck_key() == "b_jane_" .. key and x.alt_apply or apply)
|
||||||
|
|
||||||
|
if a then
|
||||||
|
a(self, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
Jane.q(function()
|
||||||
|
save_run()
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
calculate = function(self, ...)
|
||||||
|
-- Game becomes genuinely unplayable if this is allowed.
|
||||||
|
-- if self.get_current_deck_key() == "b_jane_omega" and G.GAME.selected_sleeve == "sleeve_jane_omega" then
|
||||||
|
-- if calculate then
|
||||||
|
-- calculate(self, ...)
|
||||||
|
-- end
|
||||||
|
-- if x.alt_calculate then
|
||||||
|
-- x.alt_calculate(self, ...)
|
||||||
|
-- end
|
||||||
|
-- return
|
||||||
|
-- end
|
||||||
|
local c = (self.get_current_deck_key() == "b_jane_" .. key and x.alt_calculate or calculate)
|
||||||
|
|
||||||
|
if c then
|
||||||
|
return c(self, ...)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
loc_vars = function(self, ...)
|
||||||
|
local ret = x.loc_vars and x.loc_vars(self, ...) or {}
|
||||||
|
ret.key = self.get_current_deck_key() == "b_jane_" .. key and self.key .. "_alt" or self.key
|
||||||
|
return ret
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
back {
|
||||||
key = "nitro",
|
key = "nitro",
|
||||||
atlas = "janedecks",
|
atlas = "janedecks",
|
||||||
pos = {x = 1, y = 1},
|
pos = {x = 1, y = 1},
|
||||||
|
|
@ -19,78 +107,113 @@ SMODS.Back {
|
||||||
Cryptid and "set {C:attention}ante {}to the {C:attention}next" or "",
|
Cryptid and "set {C:attention}ante {}to the {C:attention}next" or "",
|
||||||
Cryptid and "{C:attention}triangle number {}and create" or "",
|
Cryptid and "{C:attention}triangle number {}and create" or "",
|
||||||
Cryptid and "an {C:spectral,E:1}Empowered Tag" or "create a {C:dark_edition}Negative {C:spectral,E:1}Soul",
|
Cryptid and "an {C:spectral,E:1}Empowered Tag" or "create a {C:dark_edition}Negative {C:spectral,E:1}Soul",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
alt_loc_txt = {
|
||||||
|
name = "Jolt Sleeve",
|
||||||
|
text = {
|
||||||
|
Cryptid and "{C:attention}Ante number {}scales with {C:attention}square numbers" or "{C:attention}Ante increases twice{} as strong",
|
||||||
|
"After defeating the {C:attention}Small {}or {C:attention}Big Blind{},",
|
||||||
|
Cryptid and "create a {C:spectral,E:1}Empowered Tag" or "create a {C:dark_edition}Negative {C:spectral,E:1}Soul",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
loc_vars = function(_, info_queue, _)
|
||||||
|
if info_queue then
|
||||||
|
info_queue[#info_queue + 1] = Cryptid and G.P_TAGS.tag_cry_empowered or G.P_CENTERS.c_soul
|
||||||
|
end
|
||||||
|
|
||||||
|
return {vars = {}}
|
||||||
|
end,
|
||||||
|
alt_apply = function(_)
|
||||||
|
G.GAME.win_ante = Cryptid and G.GAME.win_ante * G.GAME.win_ante or G.GAME.win_ante * 4 - 1
|
||||||
|
G.GAME.alt_nitro = true
|
||||||
|
G.GAME.nitro = true
|
||||||
|
end,
|
||||||
apply = function(_)
|
apply = function(_)
|
||||||
G.GAME.win_ante = Cryptid and G.GAME.win_ante * (G.GAME.win_ante + 1) / 2 or G.GAME.win_ante * 2 - 1
|
G.GAME.win_ante = Cryptid and G.GAME.win_ante * (G.GAME.win_ante + 1) / 2 or G.GAME.win_ante * 2 - 1
|
||||||
G.GAME.nitro = true
|
G.GAME.nitro = true
|
||||||
end,
|
end,
|
||||||
trigger_effect = function(_, args)
|
alt_calculate = function(_, _, context)
|
||||||
if args.context == "eval" and G.GAME.last_blind and G.GAME.last_blind.boss then
|
if context.end_of_round and not context.individual and not context.repetition and not context.retrigger_joker then
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
Jane.empowered()
|
Jane.empowered()
|
||||||
return true
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
|
calculate = function(_, _, context)
|
||||||
|
if Jane.is_end_of_ante(context) then
|
||||||
|
Jane.q(function()
|
||||||
|
Jane.empowered()
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
Jane.rain_world_jokers = {
|
||||||
|
"j_jane_monk",
|
||||||
|
"j_jane_survivor",
|
||||||
|
"j_jane_hunter",
|
||||||
|
"j_jane_gourmand",
|
||||||
|
"j_jane_artificer",
|
||||||
|
"j_jane_spearmaster",
|
||||||
|
"j_jane_rivulet",
|
||||||
|
"j_jane_saint",
|
||||||
|
"j_jane_rot",
|
||||||
}
|
}
|
||||||
|
|
||||||
local function add_rain_world_joker()
|
local function add_rain_world_joker()
|
||||||
if not G.jokers then
|
if not G.jokers then
|
||||||
return true
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local candidates = {
|
|
||||||
"j_jane_monk",
|
|
||||||
"j_jane_survivor",
|
|
||||||
"j_jane_hunter",
|
|
||||||
"j_jane_gourmand",
|
|
||||||
"j_jane_artificer",
|
|
||||||
"j_jane_spearmaster",
|
|
||||||
"j_jane_rivulet",
|
|
||||||
"j_jane_saint",
|
|
||||||
"j_jane_rot",
|
|
||||||
}
|
|
||||||
|
|
||||||
local unobtained = {}
|
local unobtained = {}
|
||||||
|
|
||||||
for _, v in pairs(candidates) do
|
for _, v in pairs(Jane.rain_world_jokers) do
|
||||||
if not next(SMODS.find_card(v, true)) then
|
if not next(SMODS.find_card(v, true)) then
|
||||||
unobtained[#unobtained + 1] = v
|
unobtained[#unobtained + 1] = v
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local chosen = pseudorandom_element(next(unobtained) and unobtained or candidates, pseudoseed("karma_deck"))
|
local chosen = pseudorandom_element(next(unobtained) and unobtained or Jane.rain_world_jokers,
|
||||||
|
pseudoseed("karma_deck"))
|
||||||
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, chosen, "karma_deck_next")
|
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, chosen, "karma_deck_next")
|
||||||
card:add_to_deck()
|
card:add_to_deck()
|
||||||
card:start_materialize()
|
card:start_materialize()
|
||||||
G.jokers:emplace(card)
|
G.jokers:emplace(card)
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
SMODS.Back {
|
back {
|
||||||
key = "karma",
|
key = "karma",
|
||||||
atlas = "janedecks",
|
atlas = "janedecks",
|
||||||
pos = {x = 3, y = 0},
|
pos = {x = 3, y = 0},
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "Karma Deck",
|
name = "Karma Deck",
|
||||||
text = {
|
text = {
|
||||||
"Start with a {C:legendary}Rain World Joker",
|
"Start with a",
|
||||||
"Create another when",
|
"{C:legendary}Rain World Joker",
|
||||||
"{C:attention}Boss Blind {}is defeated"
|
},
|
||||||
}
|
|
||||||
},
|
},
|
||||||
apply = function(_)
|
alt_loc_txt = {
|
||||||
G.E_MANAGER:add_event(Event({func = add_rain_world_joker}))
|
name = "Ascension Sleeve",
|
||||||
|
text = {
|
||||||
|
"Create a {C:legendary}Rain World Joker",
|
||||||
|
"when {C:attention}Boss Blind {}is defeated",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
alt_apply = function(_)
|
||||||
|
Jane.q(add_rain_world_joker)
|
||||||
end,
|
end,
|
||||||
trigger_effect = function(_, args)
|
apply = function(_)
|
||||||
if args.context == "eval" and G.GAME.last_blind and G.GAME.last_blind.boss then
|
Jane.q(add_rain_world_joker)
|
||||||
|
end,
|
||||||
|
alt_calculate = function(_, _, context)
|
||||||
|
if Jane.is_end_of_ante(context) then
|
||||||
add_rain_world_joker()
|
add_rain_world_joker()
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Back {
|
back {
|
||||||
key = "mysterious",
|
key = "mysterious",
|
||||||
atlas = "janedecks",
|
atlas = "janedecks",
|
||||||
pos = {x = 1, y = 0},
|
pos = {x = 1, y = 0},
|
||||||
|
|
@ -101,34 +224,114 @@ SMODS.Back {
|
||||||
"playing cards are {C:green,E:1}randomized",
|
"playing cards are {C:green,E:1}randomized",
|
||||||
"when they are added",
|
"when they are added",
|
||||||
"to your possession",
|
"to your possession",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
alt_loc_txt = {
|
||||||
|
name = "Sleeve?",
|
||||||
|
text = {"{C:attention}Ante order {}is {C:green,E:1}randomized"},
|
||||||
|
},
|
||||||
|
alt_apply = function(_)
|
||||||
|
G.GAME.mysterious = true
|
||||||
|
G.GAME.alt_mysterious = {}
|
||||||
|
|
||||||
|
for i = G.GAME.round_resets.ante + 1, G.GAME.round_resets.ante + G.GAME.win_ante - 1 do
|
||||||
|
G.GAME.alt_mysterious[#G.GAME.alt_mysterious + 1] = {i}
|
||||||
|
end
|
||||||
|
|
||||||
|
pseudoshuffle(G.GAME.alt_mysterious, pseudoseed("mysterious_deck"))
|
||||||
|
end,
|
||||||
apply = function(_)
|
apply = function(_)
|
||||||
G.GAME.mysterious = true
|
G.GAME.mysterious = true
|
||||||
|
end,
|
||||||
Jane.q(function()
|
alt_calculate = function(_, _, context)
|
||||||
save_run()
|
if context.setting_blind or context.skip_blind then
|
||||||
return true
|
G.GAME.mysterious_init = true
|
||||||
end)
|
end
|
||||||
end
|
end,
|
||||||
|
calculate = function(_, _, context)
|
||||||
|
if context.setting_blind or context.skip_blind then
|
||||||
|
G.GAME.mysterious_init = true
|
||||||
|
end
|
||||||
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Back {
|
local function redeem_omen_globe()
|
||||||
|
G.GAME.used_vouchers.v_omen_globe = true
|
||||||
|
G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1
|
||||||
|
|
||||||
|
Jane.q(function()
|
||||||
|
Card.apply_to_run(nil, G.P_CENTERS.v_omen_globe)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
back {
|
||||||
key = "obsidian",
|
key = "obsidian",
|
||||||
atlas = "janedecks",
|
atlas = "janedecks",
|
||||||
pos = {x = 2, y = 1},
|
pos = {x = 2, y = 1},
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "Obsidian Deck",
|
name = "Obsidian Deck",
|
||||||
text = {
|
text = {
|
||||||
"{C:attention}Hidden{} cards {C:inactive}(ex. {C:spectral}The Soul{C:inactive})",
|
"{C:attention}Hidden{} cards {C:inactive}(ex. {C:spectral}Black Hole{C:inactive})",
|
||||||
"can {C:attention}appear normally{}",
|
"can {C:attention}appear normally{}",
|
||||||
}
|
"Start run with {C:tarot}Omen Globe",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
alt_loc_txt = {
|
||||||
|
name = "Bedrock Sleeve",
|
||||||
|
text = {
|
||||||
|
"{C:attention}Non-hidden {}cards do",
|
||||||
|
"not {C:attention}normally appear",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
loc_vars = function(_, info_queue, _)
|
||||||
|
if info_queue then
|
||||||
|
info_queue[#info_queue + 1] = G.P_CENTERS.v_omen_globe
|
||||||
|
end
|
||||||
|
|
||||||
|
return {vars = {}}
|
||||||
|
end,
|
||||||
|
alt_apply = function(_)
|
||||||
|
G.GAME.alt_obsidian = true
|
||||||
|
G.GAME.obsidian = true
|
||||||
|
redeem_omen_globe()
|
||||||
|
end,
|
||||||
apply = function(_)
|
apply = function(_)
|
||||||
G.GAME.obsidian = true
|
G.GAME.obsidian = true
|
||||||
end
|
redeem_omen_globe()
|
||||||
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local orig_get_current_pool = get_current_pool
|
||||||
|
|
||||||
|
---@diagnostic disable-next-line: lowercase-global
|
||||||
|
function get_current_pool(_type, ...)
|
||||||
|
local pool, pool_key = orig_get_current_pool(_type, ...)
|
||||||
|
|
||||||
|
if not G.GAME.alt_obsidian or not ({
|
||||||
|
Code = true,
|
||||||
|
Chess = true,
|
||||||
|
Tarot = true,
|
||||||
|
Planet = true,
|
||||||
|
Alphabet = true,
|
||||||
|
Spectral = true,
|
||||||
|
jane_tokens = true,
|
||||||
|
})[_type] then
|
||||||
|
return pool, pool_key
|
||||||
|
end
|
||||||
|
|
||||||
|
for k, _ in pairs(pool) do
|
||||||
|
pool[k] = "UNAVAILABLE"
|
||||||
|
end
|
||||||
|
|
||||||
|
for k, v in pairs(G.P_CENTERS) do
|
||||||
|
if type(v) == "table" and (v.name == "Black Hole" or v.name == "The Soul") or v.hidden then
|
||||||
|
pool[#pool + 1] = k
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return pool, pool_key
|
||||||
|
end
|
||||||
|
|
||||||
local function apply_orrery()
|
local function apply_orrery()
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
local orrery = {}
|
local orrery = {}
|
||||||
|
|
@ -141,11 +344,84 @@ local function apply_orrery()
|
||||||
end
|
end
|
||||||
|
|
||||||
save_run()
|
save_run()
|
||||||
return true
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
SMODS.Back {
|
local function rebalance_orrery()
|
||||||
|
local function small(x)
|
||||||
|
return type(x) == "table" and x:to_number() or x
|
||||||
|
end
|
||||||
|
|
||||||
|
local function hand(name, chip, mul, lv, notif, snd, vol, pit, de)
|
||||||
|
local config = {
|
||||||
|
delay = de or 0.3,
|
||||||
|
pitch = pit or 0.8,
|
||||||
|
volume = vol or 0.7,
|
||||||
|
sound = type(snd) == "string" and snd or type(snd) == "nil" and "button",
|
||||||
|
}
|
||||||
|
|
||||||
|
local vals = {
|
||||||
|
level = lv or "?",
|
||||||
|
mult = mul or "?",
|
||||||
|
StatusText = notif,
|
||||||
|
chips = chip or "?",
|
||||||
|
handname = name or "????",
|
||||||
|
}
|
||||||
|
|
||||||
|
update_hand_text(config, vals)
|
||||||
|
end
|
||||||
|
|
||||||
|
local orrery = (G.GAME or {}).orrery
|
||||||
|
|
||||||
|
if not orrery then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local count = 0
|
||||||
|
local hands = {}
|
||||||
|
local inequalities = 0
|
||||||
|
local pools = {chips = 0, level = 0, mult = 0}
|
||||||
|
|
||||||
|
for k, v in pairs(G.GAME.hands) do
|
||||||
|
if orrery[k] and
|
||||||
|
(orrery[k].mult ~= v.mult or
|
||||||
|
orrery[k].chips ~= v.chips or
|
||||||
|
orrery[k].level ~= v.level) then
|
||||||
|
inequalities = inequalities + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
count = count + 1
|
||||||
|
hands[#hands + 1] = v
|
||||||
|
pools.mult = v.mult + pools.mult
|
||||||
|
pools.chips = v.chips + pools.chips
|
||||||
|
pools.level = v.level + pools.level
|
||||||
|
end
|
||||||
|
|
||||||
|
if inequalities == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
pools.chips = pools.chips + inequalities * 150
|
||||||
|
table.sort(hands, function(x, y) return x.order > y.order end)
|
||||||
|
|
||||||
|
for i, v in ipairs(hands) do
|
||||||
|
v.mult = math.floor(pools.mult / count) + (small(pools.mult % count) >= i and 1 or 0)
|
||||||
|
v.chips = math.floor(pools.chips / count) + (small(pools.chips % count) >= i and 1 or 0)
|
||||||
|
v.level = math.floor(pools.level / count) + (small(pools.level % count) >= i and 1 or 0)
|
||||||
|
end
|
||||||
|
|
||||||
|
for k, v in pairs(G.GAME.hands) do
|
||||||
|
orrery[k] = {chips = v.chips, level = v.level, mult = v.mult}
|
||||||
|
end
|
||||||
|
|
||||||
|
hand(localize("k_all_hands"), math.floor(pools.chips / count), math.floor(pools.mult / count),
|
||||||
|
math.floor(pools.level / count))
|
||||||
|
delay(1)
|
||||||
|
update_hand_text({sound = "button", volume = 0.7, pitch = 1.1, delay = 0},
|
||||||
|
{mult = 0, chips = 0, handname = "", level = ""})
|
||||||
|
end
|
||||||
|
|
||||||
|
back {
|
||||||
key = "orrery",
|
key = "orrery",
|
||||||
atlas = "janedecks",
|
atlas = "janedecks",
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
|
|
@ -154,14 +430,60 @@ SMODS.Back {
|
||||||
text = {
|
text = {
|
||||||
"{C:attention}Hand stats {}are",
|
"{C:attention}Hand stats {}are",
|
||||||
"always " .. (Cryptid and "{C:cry_ascendant}" or "{C:attention}") .. "equalized",
|
"always " .. (Cryptid and "{C:cry_ascendant}" or "{C:attention}") .. "equalized",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
alt_loc_txt = {
|
||||||
|
name = "Ephemeris Sleeve",
|
||||||
|
text = {
|
||||||
|
"{C:blue}Hands{}, {C:red}discards{}, and {C:money}money",
|
||||||
|
"are always " .. (Cryptid and "{C:cry_ascendant}" or "{C:attention}") .. "equalized",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
alt_apply = function(_)
|
||||||
|
apply_orrery()
|
||||||
|
end,
|
||||||
apply = function(_)
|
apply = function(_)
|
||||||
apply_orrery()
|
apply_orrery()
|
||||||
end
|
end,
|
||||||
|
calculate = rebalance_orrery,
|
||||||
|
alt_calculate = function(_, _, context)
|
||||||
|
local function small(x)
|
||||||
|
return type(x) == "table" and x:to_number() or x
|
||||||
|
end
|
||||||
|
|
||||||
|
if context.setting_blind or context.skip_blind then
|
||||||
|
G.GAME.alt_orrery = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if not G.GAME.alt_orrery then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local dollars = G.GAME.dollars
|
||||||
|
local hands = G.GAME.current_round.hands_left
|
||||||
|
local discards = G.GAME.current_round.discards_left
|
||||||
|
local sum = hands + discards + dollars
|
||||||
|
local new_dollars = math.floor(sum / 3) - dollars
|
||||||
|
local new_hands = small(math.floor((sum + 2) / 3)) - hands
|
||||||
|
local new_discards = small(math.floor((sum + 1) / 3)) - discards
|
||||||
|
|
||||||
|
if new_dollars ~= 0 then
|
||||||
|
ease_dollars(new_dollars, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
if new_hands ~= 0 then
|
||||||
|
ease_hands_played(new_hands, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
if new_discards ~= 0 then
|
||||||
|
ease_discard(new_discards, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
rebalance_orrery()
|
||||||
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Back {
|
back {
|
||||||
key = "tortoise",
|
key = "tortoise",
|
||||||
atlas = "janedecks",
|
atlas = "janedecks",
|
||||||
pos = {x = 3, y = 1},
|
pos = {x = 3, y = 1},
|
||||||
|
|
@ -170,17 +492,32 @@ SMODS.Back {
|
||||||
text = {
|
text = {
|
||||||
"{C:attention}Ante increases",
|
"{C:attention}Ante increases",
|
||||||
"{C:attention}half{} as strong",
|
"{C:attention}half{} as strong",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
alt_loc_txt = {
|
||||||
|
name = "Sleepy Sleeve",
|
||||||
|
text = {
|
||||||
|
"{C:attention}Ante {}changes",
|
||||||
|
"are {C:attention}inverted",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
alt_apply = function(_)
|
||||||
|
G.GAME.tortoise = true
|
||||||
|
G.GAME.alt_tortoise = true
|
||||||
|
end,
|
||||||
apply = function(_)
|
apply = function(_)
|
||||||
G.GAME.tortoise = true
|
G.GAME.tortoise = true
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
local function apply_weeck()
|
local function apply_weeck()
|
||||||
G.GAME.weeck = true
|
G.GAME.weeck = true
|
||||||
|
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
|
if G.GAME.selected_sleeve == "sleeve_jane_omega" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local new_card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_wee", "weeck")
|
local new_card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_wee", "weeck")
|
||||||
new_card.ability.cry_absolute = true
|
new_card.ability.cry_absolute = true
|
||||||
new_card.ability.eternal = true
|
new_card.ability.eternal = true
|
||||||
|
|
@ -207,29 +544,89 @@ local function apply_weeck()
|
||||||
end
|
end
|
||||||
|
|
||||||
save_run()
|
save_run()
|
||||||
return true
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
SMODS.Back {
|
local function two(x)
|
||||||
|
if type(x) ~= "table" then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
for k, v in pairs(x) do
|
||||||
|
if type(v) == "number" then
|
||||||
|
x[k] = x[k] == 0 and 0 or 2
|
||||||
|
elseif type(v) == "table" then
|
||||||
|
two(v)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local eternal_text = Cryptid and "Absolute" or "Eternal"
|
||||||
|
|
||||||
|
back {
|
||||||
key = "weeck",
|
key = "weeck",
|
||||||
atlas = "janedecks",
|
atlas = "janedecks",
|
||||||
pos = {x = 4, y = 1},
|
pos = {x = 4, y = 1},
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "Weeck",
|
name = "Weeck",
|
||||||
text = {
|
text = Cryptid and {
|
||||||
"Start with an {C:purple,E:1}" .. eternal_text,
|
"Start with an {C:purple,E:1}" .. eternal_text,
|
||||||
"{C:attention}Wee Joker {}and a deck",
|
"{C:attention}Wee Joker {}and a deck",
|
||||||
"containing {C:attention}2 {C:purple,E:1}" .. eternal_text,
|
"containing {C:attention}2 {C:purple,E:1}" .. eternal_text,
|
||||||
"{C:attention}2's {}of {C:attention}each suit",
|
"{C:attention}2's {}of {C:attention}each suit",
|
||||||
}
|
} or {
|
||||||
|
"Start with an {C:purple,E:1}" .. eternal_text,
|
||||||
|
"{C:attention}Wee Joker {}and a deck",
|
||||||
|
"of {C:attention}2 2's {}of {C:attention}each suit",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
alt_loc_txt = {
|
||||||
|
name = "We",
|
||||||
|
text = {
|
||||||
|
"Every stat and",
|
||||||
|
"card number is {C:attention}2",
|
||||||
|
"{C:inactive}(If possible)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
alt_apply = function(_)
|
||||||
|
local p = G.GAME.starting_params
|
||||||
|
p.hands = 2
|
||||||
|
p.dollars = 2
|
||||||
|
p.discards = 2
|
||||||
|
G.GAME.skips = 2
|
||||||
|
p.joker_slots = 2
|
||||||
|
p.reroll_cost = 2
|
||||||
|
G.GAME.sunlevel = 2
|
||||||
|
p.boosters_in_shop = 2
|
||||||
|
p.consumable_slots = 2
|
||||||
|
p.vouchers_in_shop = 2
|
||||||
|
|
||||||
|
for _, v in pairs(G.GAME.hands) do
|
||||||
|
v.mult = 2
|
||||||
|
v.chips = 2
|
||||||
|
v.level = 2
|
||||||
|
end
|
||||||
|
|
||||||
|
apply_weeck()
|
||||||
|
end,
|
||||||
apply = function(_)
|
apply = function(_)
|
||||||
apply_weeck()
|
apply_weeck()
|
||||||
end
|
end,
|
||||||
|
alt_calculate = function(_)
|
||||||
|
if not G.GAME.we then
|
||||||
|
G.GAME.we = true
|
||||||
|
G.hand.config.highlighted_limit = 2
|
||||||
|
G.hand:change_size(2 - G.hand.config.card_limit)
|
||||||
|
end
|
||||||
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Back {
|
local banned_keys = {
|
||||||
|
sleeve_Seen_Seen = true,
|
||||||
|
sleeve_jane_omega = true,
|
||||||
|
}
|
||||||
|
|
||||||
|
back {
|
||||||
key = "omega",
|
key = "omega",
|
||||||
atlas = "janedecks",
|
atlas = "janedecks",
|
||||||
pos = {x = 5, y = 1},
|
pos = {x = 5, y = 1},
|
||||||
|
|
@ -238,31 +635,57 @@ SMODS.Back {
|
||||||
text = {
|
text = {
|
||||||
"Applies the {C:legendary,E:1}upsides",
|
"Applies the {C:legendary,E:1}upsides",
|
||||||
"of {C:attention}every Jane deck",
|
"of {C:attention}every Jane deck",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
|
alt_loc_txt = {
|
||||||
|
name = "Epsilon Sleeve",
|
||||||
|
text = {
|
||||||
|
"Applies {X:red,C:white}all{} effects of",
|
||||||
|
"{C:attention}every deck and sleeve",
|
||||||
|
"{X:black,C:red,E:2,s:2}UNPLAYABLE",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
alt_apply = function(_, ...)
|
||||||
|
if (Bakery_API or {}).create_charm_area then
|
||||||
|
Bakery_API.create_charm_area()
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, v in pairs(G.P_CENTERS) do
|
||||||
|
if v.apply and not banned_keys[v.key] and (v.set == "Back" or v.set == "Sleeve") then
|
||||||
|
v:apply(...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
apply = function(_)
|
apply = function(_)
|
||||||
apply_orrery()
|
apply_orrery()
|
||||||
|
G.GAME.used_vouchers.v_omen_globe = true
|
||||||
|
G.GAME.starting_voucher_count = (G.GAME.starting_voucher_count or 0) + 1
|
||||||
|
|
||||||
G.E_MANAGER:add_event(Event({func = function()
|
Jane.q(function()
|
||||||
local wee = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_wee", "weeck")
|
local wee = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_wee", "weeck")
|
||||||
G.jokers:emplace(wee)
|
G.jokers:emplace(wee)
|
||||||
add_rain_world_joker()
|
add_rain_world_joker()
|
||||||
G.GAME.mysterious = true
|
|
||||||
G.GAME.tortoise = true
|
G.GAME.tortoise = true
|
||||||
G.GAME.obsidian = true
|
G.GAME.obsidian = true
|
||||||
|
G.GAME.mysterious = true
|
||||||
save_run()
|
save_run()
|
||||||
return true
|
end)
|
||||||
end}))
|
|
||||||
end,
|
end,
|
||||||
trigger_effect = function(_, args)
|
alt_calculate = function(_, ...)
|
||||||
|
for _, v in pairs(G.P_CENTERS) do
|
||||||
|
if v.calculate and not banned_keys[v.key] and (v.set == "Back" or v.set == "Sleeve") then
|
||||||
|
v:calculate(...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
calculate = function(_, _, context)
|
||||||
G.GAME.mysterious = nil
|
G.GAME.mysterious = nil
|
||||||
|
|
||||||
if args.context == "eval" and G.GAME.last_blind and G.GAME.last_blind.boss then
|
if Jane.is_end_of_ante(context) then
|
||||||
add_rain_world_joker()
|
add_rain_world_joker()
|
||||||
|
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
Jane.empowered()
|
Jane.empowered()
|
||||||
return true
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
@ -272,15 +695,36 @@ local orig_ante = ease_ante
|
||||||
|
|
||||||
---@diagnostic disable-next-line: lowercase-global
|
---@diagnostic disable-next-line: lowercase-global
|
||||||
function ease_ante(mod)
|
function ease_ante(mod)
|
||||||
local function next_triangle_number(x)
|
local function next_number(x)
|
||||||
|
if G.GAME.alt_nitro then
|
||||||
|
local n = math.sqrt(x) + 1
|
||||||
|
return n * n
|
||||||
|
end
|
||||||
|
|
||||||
local n = (math.sqrt(8 * x + 1) - 1) / 2
|
local n = (math.sqrt(8 * x + 1) - 1) / 2
|
||||||
return (n + 1) * (n + 2) / 2
|
return (n + 1) * (n + 2) / 2
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if G.GAME.alt_mysterious then
|
||||||
|
if not next(G.GAME.alt_mysterious) then
|
||||||
|
G.GAME.alt_mysterious = {}
|
||||||
|
|
||||||
|
for i = G.GAME.round_resets.ante + 1, G.GAME.round_resets.ante + G.GAME.win_ante do
|
||||||
|
G.GAME.alt_mysterious[#G.GAME.alt_mysterious + 1] = {i}
|
||||||
|
end
|
||||||
|
|
||||||
|
pseudoshuffle(G.GAME.alt_mysterious, pseudoseed("mysterious_deck"))
|
||||||
|
end
|
||||||
|
|
||||||
|
local target = G.GAME.alt_mysterious[#G.GAME.alt_mysterious][1]
|
||||||
|
G.GAME.alt_mysterious[#G.GAME.alt_mysterious] = nil
|
||||||
|
mod = target - G.GAME.round_resets.ante
|
||||||
|
end
|
||||||
|
|
||||||
if G.GAME.nitro then
|
if G.GAME.nitro then
|
||||||
mod = Cryptid and
|
mod = Cryptid and
|
||||||
(G.GAME.round_resets.ante < 0 and -G.GAME.round_resets.ante or
|
(G.GAME.round_resets.ante < 0 and -G.GAME.round_resets.ante or
|
||||||
math.ceil(next_triangle_number(G.GAME.round_resets.ante) - G.GAME.round_resets.ante)) or
|
math.ceil(next_number(G.GAME.round_resets.ante) - G.GAME.round_resets.ante)) or
|
||||||
(mod > 0 and mod * 2 or mod)
|
(mod > 0 and mod * 2 or mod)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -295,6 +739,10 @@ function ease_ante(mod)
|
||||||
mod = math.floor(mod / 2) + remainder
|
mod = math.floor(mod / 2) + remainder
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if G.GAME.alt_tortoise then
|
||||||
|
mod = mod * -1
|
||||||
|
end
|
||||||
|
|
||||||
orig_ante(mod)
|
orig_ante(mod)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -307,7 +755,7 @@ function CardArea:emplace(card, location, stay_flipped)
|
||||||
local c = targets[i]
|
local c = targets[i]
|
||||||
c:set_base(pseudorandom_element(G.P_CARDS))
|
c:set_base(pseudorandom_element(G.P_CARDS))
|
||||||
|
|
||||||
if pseudorandom(pseudoseed("chancetime")) > 1 / (#G.P_CENTER_POOLS["Enhanced"]+1) then
|
if pseudorandom(pseudoseed("chancetime")) > 1 / (#G.P_CENTER_POOLS["Enhanced"] + 1) then
|
||||||
c:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"], pseudoseed("spectral_chance")))
|
c:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"], pseudoseed("spectral_chance")))
|
||||||
else
|
else
|
||||||
c:set_ability(G.P_CENTERS["c_base"])
|
c:set_ability(G.P_CENTERS["c_base"])
|
||||||
|
|
@ -338,7 +786,6 @@ function CardArea:emplace(card, location, stay_flipped)
|
||||||
end
|
end
|
||||||
|
|
||||||
c:juice_up(0.3, 0.3)
|
c:juice_up(0.3, 0.3)
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -352,26 +799,23 @@ function CardArea:emplace(card, location, stay_flipped)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
for i = 1, #targets do
|
for i = 1, #targets do
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
trigger = "after",
|
targets[i]:flip()
|
||||||
delay = 0.15,
|
play_sound("card1", 1.15 - (i - 0.999) / (#G.hand.cards - 0.998) * 0.3)
|
||||||
func = function()
|
targets[i]:juice_up(0.3, 0.3)
|
||||||
targets[i]:flip()
|
end, 0.15)
|
||||||
play_sound("card1", 1.15 - (i - 0.999) / (#G.hand.cards - 0.998) * 0.3)
|
|
||||||
targets[i]:juice_up(0.3, 0.3)
|
Jane.q(function()
|
||||||
return true
|
targets[i]:flip()
|
||||||
end
|
play_sound("card1", 1.15 - (i - 0.999) / (#G.hand.cards - 0.998) * 0.3)
|
||||||
}))
|
targets[i]:juice_up(0.3, 0.3)
|
||||||
|
end, 0.15)
|
||||||
end
|
end
|
||||||
|
|
||||||
delay(0.2)
|
delay(0.2)
|
||||||
|
|
||||||
for i = 1, #targets do
|
for i = 1, #targets do
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(go(i), 0.1)
|
||||||
trigger = "after",
|
|
||||||
delay = 0.1,
|
|
||||||
func = go(i)
|
|
||||||
}))
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -396,7 +840,8 @@ function CardArea:emplace(card, location, stay_flipped)
|
||||||
passes = 0
|
passes = 0
|
||||||
pooling = false
|
pooling = false
|
||||||
tries = tries - 1
|
tries = tries - 1
|
||||||
selection = G.P_CENTERS[pseudorandom_element(pool or G.P_CENTER_POOLS.Consumeables, pseudoseed(seed or "jane_rnd_mysterious")).key]
|
local sd = pseudoseed(seed or "jane_rnd_mysterious")
|
||||||
|
selection = G.P_CENTERS[pseudorandom_element(pool or G.P_CENTER_POOLS.Consumeables, sd).key]
|
||||||
|
|
||||||
if ignore_pooling then
|
if ignore_pooling then
|
||||||
pooling = true
|
pooling = true
|
||||||
|
|
@ -425,11 +870,13 @@ function CardArea:emplace(card, location, stay_flipped)
|
||||||
G.deck and
|
G.deck and
|
||||||
G.consumeables and
|
G.consumeables and
|
||||||
(self == G.jokers or self == G.hand or self == G.deck or self == G.consumeables) and
|
(self == G.jokers or self == G.hand or self == G.deck or self == G.consumeables) and
|
||||||
G.GAME.mysterious and card.ability and not
|
G.GAME.mysterious and
|
||||||
|
card.ability and not
|
||||||
card.ability.mysterious_created and not
|
card.ability.mysterious_created and not
|
||||||
card.created_from_split then
|
card.created_from_split then
|
||||||
card.ability.mysterious_created = true
|
card.ability.mysterious_created = true
|
||||||
local cen = card.gc and card:gc()
|
local cen = card.gc and card:gc()
|
||||||
|
|
||||||
if cen then
|
if cen then
|
||||||
if self == G.jokers then
|
if self == G.jokers then
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
|
|
@ -438,11 +885,11 @@ function CardArea:emplace(card, location, stay_flipped)
|
||||||
card:remove_from_deck()
|
card:remove_from_deck()
|
||||||
card.added_to_deck = nil
|
card.added_to_deck = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
card:flip()
|
card:flip()
|
||||||
card:juice_up(0.3, 0.3)
|
card:juice_up(0.3, 0.3)
|
||||||
play_sound("card1", 1, 0.6)
|
play_sound("card1", 1, 0.6)
|
||||||
end
|
end
|
||||||
return true
|
|
||||||
end, 0.75)
|
end, 0.75)
|
||||||
|
|
||||||
delay(0.75)
|
delay(0.75)
|
||||||
|
|
@ -458,7 +905,6 @@ function CardArea:emplace(card, location, stay_flipped)
|
||||||
card:add_to_deck()
|
card:add_to_deck()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return true
|
|
||||||
end, 0.75)
|
end, 0.75)
|
||||||
elseif self == G.consumeables then
|
elseif self == G.consumeables then
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
|
|
@ -472,7 +918,6 @@ function CardArea:emplace(card, location, stay_flipped)
|
||||||
card:juice_up(0.3, 0.3)
|
card:juice_up(0.3, 0.3)
|
||||||
play_sound("card1", 1, 0.6)
|
play_sound("card1", 1, 0.6)
|
||||||
end
|
end
|
||||||
return true
|
|
||||||
end, 0.75)
|
end, 0.75)
|
||||||
|
|
||||||
delay(0.75)
|
delay(0.75)
|
||||||
|
|
@ -482,17 +927,19 @@ function CardArea:emplace(card, location, stay_flipped)
|
||||||
card:flip()
|
card:flip()
|
||||||
card:juice_up(0.3, 0.3)
|
card:juice_up(0.3, 0.3)
|
||||||
play_sound("card3", 1, 0.6)
|
play_sound("card3", 1, 0.6)
|
||||||
card:set_ability(rnd("mysterious_deck_consumable", cen.hidden and {} or {"hidden"}, G.P_CENTER_POOLS[cen.set]))
|
|
||||||
|
card:set_ability(
|
||||||
|
rnd("mysterious_deck_consumable", cen.hidden and {} or {"hidden"},
|
||||||
|
G.P_CENTER_POOLS[cen.set])
|
||||||
|
)
|
||||||
|
|
||||||
if not card.added_to_deck then
|
if not card.added_to_deck then
|
||||||
card:add_to_deck()
|
card:add_to_deck()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
|
||||||
end, 0.75)
|
end, 0.75)
|
||||||
elseif (card.base or {}).value or (card.base or {}).suit then
|
elseif (card.base or {}).value or (card.base or {}).suit then
|
||||||
randomize({card})
|
randomize({card}, not G.GAME.mysterious_init)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -500,10 +947,12 @@ function CardArea:emplace(card, location, stay_flipped)
|
||||||
if card and self then
|
if card and self then
|
||||||
orig_emplace(self, card, location, stay_flipped)
|
orig_emplace(self, card, location, stay_flipped)
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
|
||||||
end)
|
end)
|
||||||
else
|
else
|
||||||
orig_emplace(self, card, location, stay_flipped)
|
orig_emplace(self, card, location, stay_flipped)
|
||||||
|
|
||||||
|
if G.GAME.we then
|
||||||
|
two(card.ability)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ SMODS.Atlas {
|
||||||
frames = 21,
|
frames = 21,
|
||||||
key = "janeblinds",
|
key = "janeblinds",
|
||||||
atlas_table = "ANIMATION_ATLAS",
|
atlas_table = "ANIMATION_ATLAS",
|
||||||
path = Jane.config.texture_pack .. "/bl_jane_blinds.png"
|
path = Jane.config.texture_pack .. "/bl_jane_blinds.png",
|
||||||
}
|
}
|
||||||
|
|
||||||
local final_operations = {
|
local final_operations = {
|
||||||
|
|
@ -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,8 +53,6 @@ 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
|
||||||
|
|
||||||
|
|
@ -62,10 +60,10 @@ local function to_number(x)
|
||||||
return type(x) == "table" and x:to_number() or x
|
return type(x) == "table" and x:to_number() or x
|
||||||
end
|
end
|
||||||
|
|
||||||
SMODS.Blind {
|
SMODS.Blind {
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "The Descending",
|
name = "The Descending",
|
||||||
text = {"Decrease Chip-Mult", "operator by 1 level"}
|
text = {"Decrease Chip-Mult", "operator by 1 level"},
|
||||||
},
|
},
|
||||||
key = "descending",
|
key = "descending",
|
||||||
config = {},
|
config = {},
|
||||||
|
|
@ -100,10 +98,10 @@ SMODS.Blind {
|
||||||
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 = {},
|
||||||
|
|
@ -131,10 +129,10 @@ SMODS.Blind {
|
||||||
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 = {},
|
||||||
|
|
@ -144,9 +142,16 @@ SMODS.Blind {
|
||||||
pos = {x = 0, y = 3},
|
pos = {x = 0, y = 3},
|
||||||
vars = {},
|
vars = {},
|
||||||
dollars = 2,
|
dollars = 2,
|
||||||
debuff_hand = function(_, cards, _, _, _)
|
disable = function(self)
|
||||||
|
self.disabled = true
|
||||||
|
end,
|
||||||
|
debuff_hand = function(self, cards, _, _, _)
|
||||||
|
if self.disabled then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
for _, v in ipairs(cards) do
|
for _, v in ipairs(cards) do
|
||||||
if v:norank() or v:get_id() ~= 2 then
|
if (v:norank() or v:get_id() ~= 2) and (v.ability or {}).aikoyori_letters_stickers ~= "2" then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -154,8 +159,10 @@ SMODS.Blind {
|
||||||
get_loc_debuff_text = function(_)
|
get_loc_debuff_text = function(_)
|
||||||
return "Hand must contain only 2s"
|
return "Hand must contain only 2s"
|
||||||
end,
|
end,
|
||||||
recalc_debuff = function(_, card, _)
|
recalc_debuff = function(self, card, _)
|
||||||
return card:norank() or card:get_id() ~= 2
|
return not self.disabled and
|
||||||
|
(card:norank() or card:get_id() ~= 2) and
|
||||||
|
(card.ability or {}).aikoyori_letters_stickers ~= "2"
|
||||||
end,
|
end,
|
||||||
set_blind = function(self)
|
set_blind = function(self)
|
||||||
if to_number(self.mult) == 0 then
|
if to_number(self.mult) == 0 then
|
||||||
|
|
|
||||||
132
src/booster.lua
132
src/booster.lua
|
|
@ -2,7 +2,7 @@ SMODS.Atlas {
|
||||||
px = 71,
|
px = 71,
|
||||||
py = 95,
|
py = 95,
|
||||||
key = "janebooster",
|
key = "janebooster",
|
||||||
path = Jane.config.texture_pack .. "/p_jane_boosters.png"
|
path = Jane.config.texture_pack .. "/p_jane_boosters.png",
|
||||||
}
|
}
|
||||||
|
|
||||||
for i = 1, 2 do
|
for i = 1, 2 do
|
||||||
|
|
@ -14,7 +14,7 @@ for i = 1, 2 do
|
||||||
"Choose {C:attention}#1#{} of up to",
|
"Choose {C:attention}#1#{} of up to",
|
||||||
"{C:attention}#2# playing cards{} to",
|
"{C:attention}#2# playing cards{} to",
|
||||||
"add to your deck",
|
"add to your deck",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
atlas = "janebooster",
|
atlas = "janebooster",
|
||||||
pos = {x = 6, y = i - 1},
|
pos = {x = 6, y = i - 1},
|
||||||
|
|
@ -35,7 +35,7 @@ for i = 1, 2 do
|
||||||
area = G.pack_cards,
|
area = G.pack_cards,
|
||||||
skip_materialize = true,
|
skip_materialize = true,
|
||||||
soulable = true,
|
soulable = true,
|
||||||
key_append = "sta"
|
key_append = "sta",
|
||||||
}
|
}
|
||||||
end,
|
end,
|
||||||
create_UIBox = function(_)
|
create_UIBox = function(_)
|
||||||
|
|
@ -45,7 +45,7 @@ for i = 1, 2 do
|
||||||
ease_background_colour_blind(G.STATES.STANDARD_PACK)
|
ease_background_colour_blind(G.STATES.STANDARD_PACK)
|
||||||
end,
|
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,7 +54,7 @@ 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
|
||||||
|
|
@ -72,7 +72,7 @@ for i = 1, 2 do
|
||||||
"Choose {C:attention}#1#{} of up to",
|
"Choose {C:attention}#1#{} of up to",
|
||||||
"{C:attention}#2# {C:tarot}Tarot{} cards to",
|
"{C:attention}#2# {C:tarot}Tarot{} cards to",
|
||||||
"be used immediately",
|
"be used immediately",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
atlas = "janebooster",
|
atlas = "janebooster",
|
||||||
pos = {x = 3 + i, y = 1},
|
pos = {x = 3 + i, y = 1},
|
||||||
|
|
@ -109,7 +109,7 @@ for i = 1, 2 do
|
||||||
ease_background_colour_blind(G.STATES.TAROT_PACK)
|
ease_background_colour_blind(G.STATES.TAROT_PACK)
|
||||||
end,
|
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,7 +118,7 @@ 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
|
||||||
|
|
@ -137,7 +137,7 @@ for i = 1, 2 do
|
||||||
"Choose {C:attention}#1#{} of up to",
|
"Choose {C:attention}#1#{} of up to",
|
||||||
"{C:attention}#2# {C:planet}Planet{} cards to",
|
"{C:attention}#2# {C:planet}Planet{} cards to",
|
||||||
"be used immediately",
|
"be used immediately",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
config = {extra = 2, choose = 1},
|
config = {extra = 2, choose = 1},
|
||||||
pos = {x = 3 + i, y = 0},
|
pos = {x = 3 + i, y = 0},
|
||||||
|
|
@ -153,7 +153,7 @@ for i = 1, 2 do
|
||||||
area = G.pack_cards,
|
area = G.pack_cards,
|
||||||
skip_materialize = true,
|
skip_materialize = true,
|
||||||
soulable = true,
|
soulable = true,
|
||||||
key_append = "pl1"
|
key_append = "pl1",
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -190,7 +190,7 @@ for i = 1, 2 do
|
||||||
ease_background_colour_blind(G.STATES.PLANET_PACK)
|
ease_background_colour_blind(G.STATES.PLANET_PACK)
|
||||||
end,
|
end,
|
||||||
particles = function(_)
|
particles = function(_)
|
||||||
G.booster_pack_stars = Particles(1, 1, 0,0, {
|
G.booster_pack_stars = Particles(1, 1, 0, 0, {
|
||||||
fill = true,
|
fill = true,
|
||||||
scale = 0.1,
|
scale = 0.1,
|
||||||
speed = 0.1,
|
speed = 0.1,
|
||||||
|
|
@ -202,7 +202,7 @@ for i = 1, 2 do
|
||||||
colours = {G.C.WHITE, HEX("a7d6e0"), HEX("fddca0")},
|
colours = {G.C.WHITE, HEX("a7d6e0"), HEX("fddca0")},
|
||||||
})
|
})
|
||||||
|
|
||||||
G.booster_pack_meteors = Particles(1, 1, 0,0, {
|
G.booster_pack_meteors = Particles(1, 1, 0, 0, {
|
||||||
speed = 4,
|
speed = 4,
|
||||||
timer = 2,
|
timer = 2,
|
||||||
fill = true,
|
fill = true,
|
||||||
|
|
@ -212,7 +212,7 @@ for i = 1, 2 do
|
||||||
colours = {G.C.WHITE},
|
colours = {G.C.WHITE},
|
||||||
})
|
})
|
||||||
end,
|
end,
|
||||||
set_ability = function (_, card, _, _)
|
set_ability = function(_, card, _, _)
|
||||||
card.ability = card.ability or {}
|
card.ability = card.ability or {}
|
||||||
card.ability.set = "Booster"
|
card.ability.set = "Booster"
|
||||||
card.ability.name = "Mini Celestial Pack"
|
card.ability.name = "Mini Celestial Pack"
|
||||||
|
|
@ -230,7 +230,7 @@ for i = 1, 2 do
|
||||||
"Choose {C:attention}#1#{} of up to",
|
"Choose {C:attention}#1#{} of up to",
|
||||||
"{C:attention}#2# {C:spectral}Spectral{} cards to",
|
"{C:attention}#2# {C:spectral}Spectral{} cards to",
|
||||||
"be used immediately",
|
"be used immediately",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
config = {extra = 1, choose = 1},
|
config = {extra = 1, choose = 1},
|
||||||
pos = {x = 3 + i, y = 2},
|
pos = {x = 3 + i, y = 2},
|
||||||
|
|
@ -256,7 +256,7 @@ for i = 1, 2 do
|
||||||
ease_background_colour_blind(G.STATES.SPECTRAL_PACK)
|
ease_background_colour_blind(G.STATES.SPECTRAL_PACK)
|
||||||
end,
|
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,
|
||||||
|
|
@ -284,7 +284,7 @@ if Cryptid then
|
||||||
"Choose {C:attention}#1#{} of up to",
|
"Choose {C:attention}#1#{} of up to",
|
||||||
"{C:attention}#2# {C:green}Code{} cards to",
|
"{C:attention}#2# {C:green}Code{} cards to",
|
||||||
"be used immediately",
|
"be used immediately",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
pos = {x = 6, y = 2},
|
pos = {x = 6, y = 2},
|
||||||
config = {extra = 2, choose = 1},
|
config = {extra = 2, choose = 1},
|
||||||
|
|
@ -319,7 +319,7 @@ if Cryptid then
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, 2 do
|
for i = 1, 2 do
|
||||||
SMODS.Booster{
|
SMODS.Booster {
|
||||||
key = "minitoken" .. i,
|
key = "minitoken" .. i,
|
||||||
atlas = "janebooster",
|
atlas = "janebooster",
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
|
|
@ -328,7 +328,7 @@ for i = 1, 2 do
|
||||||
"Choose {C:attention}#1#{} of up to",
|
"Choose {C:attention}#1#{} of up to",
|
||||||
"{C:attention}#2# Token {}cards to",
|
"{C:attention}#2# Token {}cards to",
|
||||||
"be used immediately",
|
"be used immediately",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
pos = {x = i - 1, y = 5},
|
pos = {x = i - 1, y = 5},
|
||||||
config = {extra = 2, choose = 1},
|
config = {extra = 2, choose = 1},
|
||||||
|
|
@ -350,35 +350,83 @@ for i = 1, 2 do
|
||||||
{card_limit = size, highlight_limit = 1, type = "consumeable"}
|
{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 = {
|
local t = {
|
||||||
{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.ROOT,
|
||||||
{n = G.UIT.R, config = {align = "cm"}, nodes = {
|
config = {align = "tm", r = 0.15, colour = G.C.CLEAR, padding = 0.15},
|
||||||
{n = G.UIT.C, config = {align = "cm", padding = 0.1}, nodes = {
|
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,
|
||||||
{n = G.UIT.R, config = {align = "cm"}, nodes = {}},
|
config = {align = "cl", colour = G.C.CLEAR, r = 0.15, padding = 0.1, minh = 2, shadow = true},
|
||||||
{n = G.UIT.R, config = {align = "tm"}, nodes = {
|
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 = {
|
n = G.UIT.R,
|
||||||
UIBox_dyn_container({
|
config = {align = "cm"},
|
||||||
{n = G.UIT.C, config = {align = "cm", padding = 0.05, minw = 4}, nodes = {
|
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.C,
|
||||||
{n = G.UIT.R,config = {align = "bm", padding = 0.05}, nodes = {
|
config = {align = "cm", padding = 0.1},
|
||||||
{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})}},
|
nodes = {
|
||||||
{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,
|
||||||
{n = G.UIT.C,config = {align = "tm", padding = 0.05, minw = 2.4}, nodes = {
|
config = {align = "cm", r = 0.2, colour = G.C.CLEAR, shadow = true},
|
||||||
{n = G.UIT.R,config = {minh = 0.2}, nodes = {}},
|
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.O, config = {object = G.pack_cards}}},
|
||||||
{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"}}}}}}}}}}}}
|
}},
|
||||||
|
}},
|
||||||
|
},
|
||||||
|
{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
|
return t
|
||||||
end,
|
end,
|
||||||
ease_background_colour = function(_)
|
ease_background_colour = function(_)
|
||||||
ease_background_colour{new_colour = HEX(i == 1 and "F0C197" or "FD5F55"), special_colour = HEX("000000"), contrast = 5}
|
ease_background_colour {new_colour = HEX(i == 1 and "F0C197" or "FD5F55"), special_colour = HEX("000000"), contrast = 5}
|
||||||
end,
|
end,
|
||||||
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,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
78
src/challenge.lua
Normal file
78
src/challenge.lua
Normal file
|
|
@ -0,0 +1,78 @@
|
||||||
|
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",
|
||||||
|
}
|
||||||
146
src/edition.lua
146
src/edition.lua
|
|
@ -1,39 +1,62 @@
|
||||||
SMODS.Sound({key = "e_jumbo", path = "e_jumbo.ogg"})
|
SMODS.Shader({key = "moire", path = "moire.fs"})
|
||||||
SMODS.Shader({key = "polygloss", path = "polygloss.fs"})
|
SMODS.Shader({key = "polygloss", path = "polygloss.fs"})
|
||||||
|
SMODS.Sound({key = "e_jumbo", path = "e_jumbo.ogg"})
|
||||||
|
SMODS.Sound({key = "e_moire", path = "e_moire.ogg"})
|
||||||
SMODS.Sound({key = "e_polygloss", path = "e_polygloss.ogg"})
|
SMODS.Sound({key = "e_polygloss", path = "e_polygloss.ogg"})
|
||||||
|
|
||||||
|
local function allow_moire()
|
||||||
|
if Cryptid then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, v in pairs(SMODS.find_card("j_jane_saint")) do
|
||||||
|
if v.ability.extra.is_attuned then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_weight(self)
|
||||||
|
return G.GAME.edition_rate * self.weight * (allow_moire() and 1 or 0)
|
||||||
|
end
|
||||||
|
|
||||||
SMODS.Edition({
|
SMODS.Edition({
|
||||||
key = "polygloss",
|
key = "polygloss",
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "Polygloss",
|
name = "Polygloss",
|
||||||
label = "Polygloss",
|
label = "Polygloss",
|
||||||
text = {
|
text = Cryptid and {
|
||||||
"{C:chips}+#1#{}, {X:chips,C:white}x#2#{} & {X:chips,C:dark_edition}^#3#{} Chips",
|
"{C:chips}+#1#{} Chips",
|
||||||
"{C:mult}+#4#{}, {X:mult,C:white}x#5#{} & {X:mult,C:dark_edition}^#6#{} Mult",
|
"{C:mult}+#2#{}, {X:mult,C:white}X#3#{}, & {X:mult,C:dark_edition}^#4#{} Mult",
|
||||||
"Generates {C:money}+$#7#",
|
"{C:money}$#5# {}when scored",
|
||||||
}
|
} or {
|
||||||
|
"{C:chips}+#1#{} Chips",
|
||||||
|
"{C:mult}+#2#{} & {X:mult,C:white}X#3#{} Mult",
|
||||||
|
"{C:money}$#4# {}when scored",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
config = {chips = 1, mult = 1, x_chips = 1.1, x_mult = 1.1, e_chips = 1.01, e_mult = 1.01, p_dollars = 1},
|
config = {
|
||||||
sound = {
|
mult = 2,
|
||||||
sound = "jane_e_polygloss",
|
chips = 12,
|
||||||
per = 1.2,
|
x_mult = 1.2,
|
||||||
vol = 0.4
|
p_dollars = 1,
|
||||||
|
e_mult = Cryptid and 1.02 or nil,
|
||||||
},
|
},
|
||||||
|
sound = {sound = "jane_e_polygloss", per = 1.2, vol = 0.4},
|
||||||
weight = 8,
|
weight = 8,
|
||||||
extra_cost = 2,
|
extra_cost = 4,
|
||||||
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, _, _)
|
||||||
return {vars = {
|
local vars = {self.config.chips}
|
||||||
self.config.chips,
|
vars[#vars + 1] = self.config.mult
|
||||||
self.config.x_chips,
|
vars[#vars + 1] = self.config.x_mult
|
||||||
self.config.e_chips,
|
vars[#vars + 1] = self.config.e_mult
|
||||||
self.config.mult,
|
vars[#vars + 1] = self.config.p_dollars
|
||||||
self.config.x_mult,
|
return {vars = vars}
|
||||||
self.config.e_mult,
|
|
||||||
self.config.p_dollars
|
|
||||||
}}
|
|
||||||
end,
|
end,
|
||||||
calculate = function(_, card, context)
|
calculate = function(_, card, context)
|
||||||
if context.pre_joker then
|
if context.pre_joker then
|
||||||
|
|
@ -45,8 +68,6 @@ SMODS.Edition({
|
||||||
return {
|
return {
|
||||||
e_mult = card.edition.e_mult,
|
e_mult = card.edition.e_mult,
|
||||||
x_mult = card.edition.x_mult,
|
x_mult = card.edition.x_mult,
|
||||||
e_chips = card.edition.e_chips,
|
|
||||||
x_chips = card.edition.x_chips,
|
|
||||||
p_dollars = card.edition.p_dollars,
|
p_dollars = card.edition.p_dollars,
|
||||||
}
|
}
|
||||||
elseif context.main_scoring and context.cardarea == G.play then
|
elseif context.main_scoring and context.cardarea == G.play then
|
||||||
|
|
@ -55,14 +76,21 @@ SMODS.Edition({
|
||||||
chips = card.edition.chips,
|
chips = card.edition.chips,
|
||||||
e_mult = card.edition.e_mult,
|
e_mult = card.edition.e_mult,
|
||||||
x_mult = card.edition.x_mult,
|
x_mult = card.edition.x_mult,
|
||||||
e_chips = card.edition.e_chips,
|
|
||||||
x_chips = card.edition.x_chips,
|
|
||||||
p_dollars = card.edition.p_dollars,
|
p_dollars = card.edition.p_dollars,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
get_weight = get_weight,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local orig_draw_shader = Sprite.draw_shader
|
||||||
|
|
||||||
|
function Sprite:draw_shader(_shader, ...)
|
||||||
|
if _shader ~= "jane_jumbo" then
|
||||||
|
return orig_draw_shader(self, _shader, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local jumbo_modifier = Cryptid and 100 or 2
|
local jumbo_modifier = Cryptid and 100 or 2
|
||||||
|
|
||||||
SMODS.Edition({
|
SMODS.Edition({
|
||||||
|
|
@ -74,18 +102,13 @@ SMODS.Edition({
|
||||||
"All card values are",
|
"All card values are",
|
||||||
"{C:attention}multiplied{} by {C:attention}up to " .. jumbo_modifier,
|
"{C:attention}multiplied{} by {C:attention}up to " .. jumbo_modifier,
|
||||||
"{C:inactive}(If possible)",
|
"{C:inactive}(If possible)",
|
||||||
"{C:inactive,E:1,s:0.7}Whoa, it's huge!!{}"
|
"{C:inactive,E:1,s:0.7}Whoa, it's huge!!{}",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
on_apply = function(card)
|
on_apply = function(card)
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
blocking = false,
|
Jane.resize(card, Jane.config.wee_sizemod)
|
||||||
blockable = false,
|
end, nil, nil, nil, false, false)
|
||||||
func = function()
|
|
||||||
Jane.resize(card, Jane.config.wee_sizemod)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
}))
|
|
||||||
|
|
||||||
local obj = card:gc()
|
local obj = card:gc()
|
||||||
|
|
||||||
|
|
@ -104,14 +127,9 @@ SMODS.Edition({
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
on_remove = function(card)
|
on_remove = function(card)
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
blocking = false,
|
Jane.resize(card, 1 / Jane.config.wee_sizemod)
|
||||||
blockable = false,
|
end, nil, nil, nil, false, false)
|
||||||
func = function()
|
|
||||||
Jane.resize(card, 1 / Jane.config.wee_sizemod)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
}))
|
|
||||||
|
|
||||||
local was_added = card.added_to_deck
|
local was_added = card.added_to_deck
|
||||||
|
|
||||||
|
|
@ -125,18 +143,42 @@ SMODS.Edition({
|
||||||
card:add_to_deck()
|
card:add_to_deck()
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
config = {twos_scored = 0},
|
sound = {sound = "jane_e_jumbo", per = 1, vol = 0.5},
|
||||||
sound = {
|
weight = 4,
|
||||||
sound = "jane_e_jumbo",
|
extra_cost = 5,
|
||||||
per = 1,
|
|
||||||
vol = 0.5
|
|
||||||
},
|
|
||||||
weight = 0.8,
|
|
||||||
in_shop = true,
|
in_shop = true,
|
||||||
shader = false,
|
shader = false,
|
||||||
extra_cost = 12,
|
apply_to_float = false,
|
||||||
|
get_weight = get_weight,
|
||||||
|
})
|
||||||
|
|
||||||
|
SMODS.Edition({
|
||||||
|
key = "moire",
|
||||||
|
loc_txt = {
|
||||||
|
name = "Moire",
|
||||||
|
label = "Moire",
|
||||||
|
text = {
|
||||||
|
"{X:chips,C:dark_edition}^#1#{C:chips} Chips",
|
||||||
|
"{X:mult,C:dark_edition}^#2#{C:mult} Mult",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
config = {e_chips = Cryptid and 0.8 or 0.9, e_mult = Cryptid and 1.2 or 1.1},
|
||||||
|
sound = {sound = "jane_e_moire", per = 1, vol = 0.7},
|
||||||
|
weight = 2,
|
||||||
|
extra_cost = 6,
|
||||||
|
in_shop = true,
|
||||||
|
shader = "moire",
|
||||||
|
in_pool = allow_moire,
|
||||||
apply_to_float = false,
|
apply_to_float = false,
|
||||||
get_weight = function(self)
|
get_weight = function(self)
|
||||||
return G.GAME.edition_rate * self.weight
|
return G.GAME.edition_rate * self.weight
|
||||||
end,
|
end,
|
||||||
|
loc_vars = function(self, _, _)
|
||||||
|
return {vars = {self.config.e_chips, self.config.e_mult}}
|
||||||
|
end,
|
||||||
|
calculate = function(self, _, context)
|
||||||
|
if context.post_joker or context.main_scoring and context.cardarea == G.play then
|
||||||
|
return {e_chips = self.config.e_chips, e_mult = self.config.e_mult}
|
||||||
|
end
|
||||||
|
end,
|
||||||
})
|
})
|
||||||
|
|
|
||||||
215
src/joker.lua
215
src/joker.lua
|
|
@ -46,7 +46,7 @@ local granddad_palette = {
|
||||||
HEX("155fd9"),
|
HEX("155fd9"),
|
||||||
HEX("ff8170"),
|
HEX("ff8170"),
|
||||||
HEX("ffffff"),
|
HEX("ffffff"),
|
||||||
HEX("6c0700")
|
HEX("6c0700"),
|
||||||
}
|
}
|
||||||
|
|
||||||
local function food_jokers_count()
|
local function food_jokers_count()
|
||||||
|
|
@ -70,7 +70,6 @@ local function grand_dad(card)
|
||||||
|
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
card:juice_up(0.5, 0.5)
|
card:juice_up(0.5, 0.5)
|
||||||
return true
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local rnd = math.random(6)
|
local rnd = math.random(6)
|
||||||
|
|
@ -128,6 +127,8 @@ local maxie_quotes = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local maxie_limit = 25
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
key = "maxie",
|
key = "maxie",
|
||||||
atlas = "janemaxie",
|
atlas = "janemaxie",
|
||||||
|
|
@ -136,7 +137,7 @@ SMODS.Joker {
|
||||||
text = {
|
text = {
|
||||||
"{C:attention}+#1# {}booster pack slot#2#",
|
"{C:attention}+#1# {}booster pack slot#2#",
|
||||||
"{C:inactive,s:0.75,E:1}#3#{C:red,s:1.5,E:1}#4#",
|
"{C:inactive,s:0.75,E:1}#3#{C:red,s:1.5,E:1}#4#",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
config = {extra = {choices = Cryptid and 2 or 1}},
|
config = {extra = {choices = Cryptid and 2 or 1}},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
|
|
@ -145,20 +146,25 @@ SMODS.Joker {
|
||||||
cost = 6,
|
cost = 6,
|
||||||
rarity = 2,
|
rarity = 2,
|
||||||
loc_vars = function(_, _, card)
|
loc_vars = function(_, _, card)
|
||||||
return {vars = {
|
return {
|
||||||
card.ability.extra.choices,
|
vars = {
|
||||||
card.ability.extra.choices == 1 and "" or "s",
|
card.ability.extra.choices,
|
||||||
Jane.sinister and "" or pseudorandom_element(maxie_quotes.normal, pseudoseed("MaxieQuotes")),
|
card.ability.extra.choices == 1 and "" or "s",
|
||||||
Jane.sinister and pseudorandom_element(maxie_quotes.scared, pseudoseed("MaxieQuotes")) or "",
|
Jane.sinister and "" or pseudorandom_element(maxie_quotes.normal, pseudoseed("MaxieQuotes")),
|
||||||
}}
|
Jane.sinister and pseudorandom_element(maxie_quotes.scared, pseudoseed("MaxieQuotes")) or "",
|
||||||
|
},
|
||||||
|
}
|
||||||
end,
|
end,
|
||||||
calculate = function(_, card, context)
|
calculate = function(_, card, context)
|
||||||
|
local min = math.min(card.ability.extra.choices, maxie_limit)
|
||||||
|
card.ability.extra.choices = min
|
||||||
|
|
||||||
if context.starting_shop then
|
if context.starting_shop then
|
||||||
for _ = 1, card.ability.extra.choices do
|
for _ = 1, min do
|
||||||
SMODS.add_booster_to_shop()
|
SMODS.add_booster_to_shop()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
function Jane.update_honey()
|
function Jane.update_honey()
|
||||||
|
|
@ -223,7 +229,7 @@ SMODS.Joker {
|
||||||
"#5#{C:attention}#6#",
|
"#5#{C:attention}#6#",
|
||||||
"{C:dark_edition}#7#{}#8#{C:inactive,s:0.75,E:1}#9#",
|
"{C:dark_edition}#7#{}#8#{C:inactive,s:0.75,E:1}#9#",
|
||||||
"{C:inactive,s:0.75,E:1}#10#{C:red,s:1.5,E:1}#11#",
|
"{C:inactive,s:0.75,E:1}#10#{C:red,s:1.5,E:1}#11#",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
config = {extra = {level = "1"}}, -- Strings do not get mutated by other mods
|
config = {extra = {level = "1"}}, -- Strings do not get mutated by other mods
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
|
|
@ -257,19 +263,22 @@ SMODS.Joker {
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return {vars = {
|
return {
|
||||||
is_corrupted and " (" .. level_name(level - 2) .. ")" or "",
|
vars = {
|
||||||
(exclusions or ""):sub(#separator),
|
is_corrupted and " (" .. level_name(level - 2) .. ")" or "",
|
||||||
is_corrupted and "" or " jokers",
|
(exclusions or ""):sub(#separator),
|
||||||
is_corrupted and "jokers " or "",
|
is_corrupted and "" or " jokers",
|
||||||
is_corrupted and (level >= #Jane.rarity_names - 1 and "Cannot be upgraded." or "") or "Getting another ",
|
is_corrupted and "jokers " or "",
|
||||||
is_corrupted and "" or "Honey",
|
is_corrupted and (level >= #Jane.rarity_names - 1 and "Cannot be upgraded." or "") or "Getting another ",
|
||||||
is_corrupted and "" or "corrupts ",
|
is_corrupted and "" or "Honey",
|
||||||
is_corrupted and "" or "this Joker",
|
is_corrupted and "" or "corrupts ",
|
||||||
Jane.sinister and "" or (is_corrupted and "*Her eyes are looking around," or ""),
|
is_corrupted and "" or "this Joker",
|
||||||
Jane.sinister and "" or (is_corrupted and "as if she wants to say something...*" or "Buzzzzz! I'll do my best!"),
|
Jane.sinister and "" or (is_corrupted and "*Her eyes are looking around," or ""),
|
||||||
Jane.sinister and (is_corrupted and "..." or "S-STOP THAT!! YOU'RE FREAKING ME OOOUT!!!") 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,
|
end,
|
||||||
update = function(_, card, _)
|
update = function(_, card, _)
|
||||||
if card.added_to_deck and card.children.center and card.children.floating_sprite then
|
if card.added_to_deck and card.children.center and card.children.floating_sprite then
|
||||||
|
|
@ -322,7 +331,7 @@ local oxy_quotes = {
|
||||||
"...H-how are you doing t-that...?",
|
"...H-how are you doing t-that...?",
|
||||||
"This is... unsettling...",
|
"This is... unsettling...",
|
||||||
"S-... So much power...",
|
"S-... So much power...",
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
function Jane.oxy(card, removed)
|
function Jane.oxy(card, removed)
|
||||||
|
|
@ -347,13 +356,13 @@ function Jane.oxy(card, removed)
|
||||||
nil,
|
nil,
|
||||||
{
|
{
|
||||||
message = (extra.is_corrupted and "+" or "-") .. destroyed_steel,
|
message = (extra.is_corrupted and "+" or "-") .. destroyed_steel,
|
||||||
colour = extra.is_corrupted and G.C.PURPLE or G.C.GREY
|
colour = extra.is_corrupted and G.C.PURPLE or G.C.GREY,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local steel = 1.5
|
local steel = 2
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
key = "oxy",
|
key = "oxy",
|
||||||
|
|
@ -361,22 +370,23 @@ SMODS.Joker {
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "Oxy{C:dark_edition}#1#",
|
name = "Oxy{C:dark_edition}#1#",
|
||||||
text = {
|
text = {
|
||||||
"{C:attention}Scored steel {}cards give",
|
"{C:attention}Scored steel {}cards",
|
||||||
"{X:mult,C:white}x#2#{} {C:mult}Mult {}and {X:chips,C:white}x#2#{} {C:chips}Chips",
|
"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}#3#{}#4#{C:red}#5#{C:attention}#6#",
|
||||||
"{C:dark_edition,E:1}#7#{}#8#",
|
"{C:dark_edition,E:1}#7#{}#8#",
|
||||||
"#9#{C:dark_edition,E:1}#10#",
|
"#9#{C:dark_edition,E:1}#10#",
|
||||||
"{C:inactive,s:0.75,E:1}#11#{C:red,s:1.5,E:1}#12#",
|
"{C:inactive,s:0.75,E:1}#11#{C:red,s:1.5,E:1}#12#",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
config = {extra = {corrupted_steel = 2.5, is_corrupted = false, milestone = 3, progress = 0}},
|
config = {extra = {corrupted_steel = 6, is_corrupted = false, milestone = 3, progress = 0}},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
sinis = {x = 2, y = 0},
|
sinis = {x = 2, y = 0},
|
||||||
soul_pos = {x = 1, y = 0},
|
soul_pos = {x = 1, y = 0},
|
||||||
blueprint_compat = true,
|
blueprint_compat = true,
|
||||||
cost = Cryptid and 8 or 20,
|
cost = Cryptid and 8 or 20,
|
||||||
rarity = Cryptid and 3 or 4,
|
rarity = Cryptid and 3 or 4,
|
||||||
loc_vars = function(_, _, card)
|
loc_vars = function(_, info_queue, card)
|
||||||
|
info_queue[#info_queue + 1] = G.P_CENTERS.m_steel
|
||||||
local ability = card.ability.extra or {}
|
local ability = card.ability.extra or {}
|
||||||
local milestone = ability.milestone
|
local milestone = ability.milestone
|
||||||
local progress = ability.progress
|
local progress = ability.progress
|
||||||
|
|
@ -385,20 +395,25 @@ SMODS.Joker {
|
||||||
local effective = is_corrupted and progress or milestone - progress
|
local effective = is_corrupted and progress or milestone - progress
|
||||||
local plural = effective == 1 and "" or "s"
|
local plural = effective == 1 and "" or "s"
|
||||||
|
|
||||||
return {vars = {
|
return {
|
||||||
is_corrupted and " (Corrupted)" or "",
|
vars = {
|
||||||
amount,
|
is_corrupted and " (Corrupted)" or "",
|
||||||
is_corrupted and "Purifies " or "",
|
amount,
|
||||||
is_corrupted and "in " or "",
|
is_corrupted and "Purifies " or "",
|
||||||
is_corrupted and "" or "Destroying ",
|
is_corrupted and "in " or "",
|
||||||
effective .. (is_corrupted and " round" or " steel card") .. plural,
|
is_corrupted and "" or "Destroying ",
|
||||||
is_corrupted and "" or "corrupts ",
|
effective .. (is_corrupted and " round" or " steel card") .. plural,
|
||||||
is_corrupted and "Destroying steel cards" or "this Joker",
|
is_corrupted and "" or "corrupts ",
|
||||||
is_corrupted and "prolongs the " or "",
|
is_corrupted and "Destroying steel cards" or "this Joker",
|
||||||
is_corrupted and "corruption" or "",
|
is_corrupted and "prolongs the " or "",
|
||||||
Jane.sinister and "" or (is_corrupted and pseudorandom_element(oxy_quotes.normal, pseudoseed("OxyQuotes")) or "We all cut close..."),
|
is_corrupted and "corruption" or "",
|
||||||
Jane.sinister and (is_corrupted and pseudorandom_element(oxy_quotes.scared, pseudoseed("OxyQuotes")) or "WHAT ARE YOU DOING DOWN THERE?!?") 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,
|
end,
|
||||||
update = function(_, card, _)
|
update = function(_, card, _)
|
||||||
if card.added_to_deck and card.children.center and card.children.floating_sprite then
|
if card.added_to_deck and card.children.center and card.children.floating_sprite then
|
||||||
|
|
@ -428,46 +443,38 @@ SMODS.Joker {
|
||||||
nil,
|
nil,
|
||||||
{
|
{
|
||||||
message = extra.is_corrupted and "-1" or "+1",
|
message = extra.is_corrupted and "-1" or "+1",
|
||||||
colour = extra.is_corrupted and G.C.PURPLE or G.C.GREY
|
colour = extra.is_corrupted and G.C.PURPLE or G.C.GREY,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
if not extra.is_corrupting and
|
if not extra.is_corrupting and
|
||||||
((extra.progress >= extra.milestone and not extra.is_corrupted) or
|
((extra.progress >= extra.milestone and not extra.is_corrupted) or
|
||||||
(extra.progress <= 0 and extra.is_corrupted)) then
|
(extra.progress <= 0 and extra.is_corrupted)) then
|
||||||
extra.is_corrupting = true
|
extra.is_corrupting = true
|
||||||
|
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
delay = 0.1,
|
card:flip()
|
||||||
func = function()
|
play_sound("card1")
|
||||||
card:flip()
|
end, 0.1)
|
||||||
play_sound("card1")
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
}))
|
|
||||||
|
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
delay = 1,
|
card:flip()
|
||||||
func = function()
|
card:juice_up(1, 1)
|
||||||
card:flip()
|
play_sound("card1")
|
||||||
card:juice_up(1, 1)
|
play_sound("jane_corrupt_milestone")
|
||||||
play_sound("card1")
|
extra.is_corrupted = not extra.is_corrupted
|
||||||
play_sound("jane_corrupt_milestone")
|
extra.is_corrupting = nil
|
||||||
extra.is_corrupted = not extra.is_corrupted
|
end, 1)
|
||||||
extra.is_corrupting = nil
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
}))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if context.individual and
|
if context.individual and
|
||||||
context.cardarea == G.play and
|
context.cardarea == G.play and
|
||||||
context.other_card.ability.name == "Steel Card" then
|
context.other_card.ability.name == "Steel Card" then
|
||||||
local amount = extra.is_corrupted and extra.corrupted_steel or extra.steel
|
local amount = extra.is_corrupted and extra.corrupted_steel or steel
|
||||||
return {x_chips = amount, x_mult = amount, colour = G.C.PURPLE, card = card}, true
|
return {x_mult = amount, colour = G.C.PURPLE, card = card}, true
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
if Cryptid then
|
if Cryptid then
|
||||||
|
|
@ -475,6 +482,7 @@ if Cryptid then
|
||||||
end
|
end
|
||||||
|
|
||||||
local operator = Cryptid and "^" or "X"
|
local operator = Cryptid and "^" or "X"
|
||||||
|
local operator_prefix = Cryptid and "{X:dark_edition,C:mult}" or "{X:mult,C:white}"
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
key = "betmma",
|
key = "betmma",
|
||||||
|
|
@ -482,12 +490,12 @@ SMODS.Joker {
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "Betmma",
|
name = "Betmma",
|
||||||
text = {
|
text = {
|
||||||
"{X:dark_edition,C:chips}+" .. operator .. "#1#{C:chips} Chips{} for every",
|
operator_prefix .. "+" .. operator .. "#1#{C:mult} Mult{} for every",
|
||||||
"{C:attention}unique Voucher redeemed",
|
"{C:attention}unique Voucher redeemed",
|
||||||
"{C:inactive}(Currently {X:dark_edition,C:chips}" .. operator .. "#2#{C:inactive})",
|
"{C:inactive}(Currently " .. operator_prefix .. operator .. "#2#{C:inactive})",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
config = {big_num_scaler = true, extra = {tet = Cryptid and 0.1 or 0.5}},
|
config = {extra = {tet = Cryptid and 0.25 or 0.5}},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
soul_pos = {x = 1, y = 0},
|
soul_pos = {x = 1, y = 0},
|
||||||
blueprint_compat = true,
|
blueprint_compat = true,
|
||||||
|
|
@ -510,10 +518,10 @@ SMODS.Joker {
|
||||||
card = card,
|
card = card,
|
||||||
colour = G.C.jane_RGB,
|
colour = G.C.jane_RGB,
|
||||||
message = operator .. number_format(num),
|
message = operator .. number_format(num),
|
||||||
[Cryptid and "e_chips" or "x_chips"] = num,
|
[Cryptid and "e_mult" or "x_mult"] = num,
|
||||||
}, true
|
}, true
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
|
|
@ -523,7 +531,7 @@ SMODS.Joker {
|
||||||
text = {
|
text = {
|
||||||
"This Joker has a {C:jane_RGB,E:1}strange",
|
"This Joker has a {C:jane_RGB,E:1}strange",
|
||||||
"{C:jane_RGB,E:1}reaction {}to scored {C:attention}7{}s",
|
"{C:jane_RGB,E:1}reaction {}to scored {C:attention}7{}s",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
config = {},
|
config = {},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
|
|
@ -550,61 +558,47 @@ SMODS.Joker {
|
||||||
if context.other_card and context.other_card:get_id() == 7 and scj(context) then
|
if context.other_card and context.other_card:get_id() == 7 and scj(context) then
|
||||||
grand_dad(card)
|
grand_dad(card)
|
||||||
local palette = granddad_palette[math.random(#granddad_palette)]
|
local palette = granddad_palette[math.random(#granddad_palette)]
|
||||||
local rnd = pseudorandom(pseudoseed("granddad"), 1, Cryptid and 7 or 5)
|
local rnd = pseudorandom(pseudoseed("granddad"), 1, Cryptid and 5 or 4)
|
||||||
|
|
||||||
if rnd == 1 then
|
if rnd == 1 then
|
||||||
return {
|
return {
|
||||||
message = Cryptid and "+777" or "+77",
|
message = Cryptid and "+777" or "+77",
|
||||||
chips = Cryptid and 777 or 77,
|
chips = Cryptid and 777 or 77,
|
||||||
colour = palette,
|
colour = palette,
|
||||||
card = card
|
card = card,
|
||||||
}, true
|
}, true
|
||||||
elseif rnd == 2 then
|
elseif rnd == 2 then
|
||||||
return {
|
return {
|
||||||
message = Cryptid and "+777 Mult" or "+77 Mult",
|
message = Cryptid and "+777 Mult" or "+77 Mult",
|
||||||
mult = Cryptid and 777 or 77,
|
mult = Cryptid and 777 or 77,
|
||||||
colour = palette,
|
colour = palette,
|
||||||
card = card
|
card = card,
|
||||||
}, true
|
}, true
|
||||||
elseif rnd == 3 then
|
elseif rnd == 3 then
|
||||||
return {
|
return {
|
||||||
message = "+$7",
|
message = "+$7",
|
||||||
dollars = 7,
|
dollars = 7,
|
||||||
colour = palette,
|
colour = palette,
|
||||||
card = card
|
card = card,
|
||||||
}, true
|
}, true
|
||||||
elseif rnd == 4 then
|
elseif rnd == 4 then
|
||||||
return {
|
return {
|
||||||
message = Cryptid and "x7" or "x1.77",
|
message = Cryptid and "X7 Mult" or "X1.77 Mult",
|
||||||
x_chips = Cryptid and 7 or 1.77,
|
|
||||||
colour = palette,
|
|
||||||
card = card
|
|
||||||
}, true
|
|
||||||
elseif rnd == 5 then
|
|
||||||
return {
|
|
||||||
message = Cryptid and "x7 Mult" or "x1.77 Mult",
|
|
||||||
x_mult = Cryptid and 7 or 1.77,
|
x_mult = Cryptid and 7 or 1.77,
|
||||||
colour = palette,
|
colour = palette,
|
||||||
card = card
|
card = card,
|
||||||
}, true
|
|
||||||
elseif rnd == 6 then
|
|
||||||
return {
|
|
||||||
message = "^1.77",
|
|
||||||
e_chips = 1.77,
|
|
||||||
colour = palette,
|
|
||||||
card = card
|
|
||||||
}, true
|
}, true
|
||||||
else
|
else
|
||||||
return {
|
return {
|
||||||
message = "^1.77 Mult",
|
message = "^1.77 Mult",
|
||||||
e_mult = 1.77,
|
e_mult = 1.77,
|
||||||
colour = palette,
|
colour = palette,
|
||||||
card = card
|
card = card,
|
||||||
}, true
|
}, true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
|
|
@ -613,29 +607,30 @@ SMODS.Joker {
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "Peppino Spaghetti",
|
name = "Peppino Spaghetti",
|
||||||
text = {
|
text = {
|
||||||
"{X:dark_edition,C:red}" .. operator .. "2^x{C:red} Mult{} for every",
|
operator_prefix .. 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 {X:dark_edition,C:red}" .. operator .. "#1#{C:red} Mult{C:inactive})",
|
"{C:inactive}(Currently " .. operator_prefix .. operator .. "#1#{C:red} Mult{C:inactive})",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
soul_pos = {x = 1, y = 0},
|
soul_pos = {x = 1, y = 0},
|
||||||
|
config = {extra = {base = 2}},
|
||||||
rarity = exotic,
|
rarity = exotic,
|
||||||
blueprint_compat = true,
|
blueprint_compat = true,
|
||||||
cost = Cryptid and 50 or 20,
|
cost = Cryptid and 50 or 20,
|
||||||
loc_vars = function(_, _, _)
|
loc_vars = function(_, _, card)
|
||||||
return {vars = {2 ^ food_jokers_count()}}
|
return {vars = {card.ability.extra.base ^ food_jokers_count()}}
|
||||||
end,
|
end,
|
||||||
calculate = function(_, _, context)
|
calculate = function(_, card, 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 .. 2 ^ count .. " Mult",
|
message = operator .. card.ability.extra.base ^ count .. " Mult",
|
||||||
[Cryptid and "e_mult" or "x_mult"] = 2 ^ count,
|
[Cryptid and "e_mult" or "x_mult"] = card.ability.extra.base ^ count,
|
||||||
}, true
|
}, true
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
184
src/main.lua
184
src/main.lua
|
|
@ -2,7 +2,7 @@ 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"},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -20,8 +20,8 @@ end
|
||||||
|
|
||||||
function Jane.can_use()
|
function Jane.can_use()
|
||||||
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)
|
||||||
|
|
@ -41,7 +41,7 @@ function Jane.card_status_text(
|
||||||
sound,
|
sound,
|
||||||
volume,
|
volume,
|
||||||
pitch,
|
pitch,
|
||||||
trig,
|
trigger,
|
||||||
f
|
f
|
||||||
)
|
)
|
||||||
if (delay or 0) <= 0 then
|
if (delay or 0) <= 0 then
|
||||||
|
|
@ -56,7 +56,7 @@ function Jane.card_status_text(
|
||||||
backdrop_colour = colour or (G.C.FILTER),
|
backdrop_colour = colour or (G.C.FILTER),
|
||||||
align = align or "bm",
|
align = align or "bm",
|
||||||
major = card,
|
major = card,
|
||||||
offset = {x = xoffset or 0, y = yoffset or (-0.05*G.CARD_H)}
|
offset = {x = xoffset or 0, y = yoffset or (-0.05 * G.CARD_H)},
|
||||||
})
|
})
|
||||||
|
|
||||||
if sound then
|
if sound then
|
||||||
|
|
@ -75,10 +75,8 @@ function Jane.card_status_text(
|
||||||
G.ROOM.jiggle = G.ROOM.jiggle + jiggle
|
G.ROOM.jiggle = G.ROOM.jiggle + jiggle
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(
|
||||||
trigger = trig,
|
function()
|
||||||
delay = delay,
|
|
||||||
func = function()
|
|
||||||
if f and type(f) == "function" then
|
if f and type(f) == "function" then
|
||||||
f(card)
|
f(card)
|
||||||
end
|
end
|
||||||
|
|
@ -90,7 +88,7 @@ function Jane.card_status_text(
|
||||||
backdrop_colour = colour or (G.C.FILTER),
|
backdrop_colour = colour or (G.C.FILTER),
|
||||||
align = align or "bm",
|
align = align or "bm",
|
||||||
major = card,
|
major = card,
|
||||||
offset = {x = xoffset or 0, y = yoffset or (-0.05*G.CARD_H)}
|
offset = {x = xoffset or 0, y = yoffset or (-0.05 * G.CARD_H)},
|
||||||
})
|
})
|
||||||
|
|
||||||
if sound then
|
if sound then
|
||||||
|
|
@ -108,17 +106,18 @@ function Jane.card_status_text(
|
||||||
if jiggle then
|
if jiggle then
|
||||||
G.ROOM.jiggle = G.ROOM.jiggle + jiggle
|
G.ROOM.jiggle = G.ROOM.jiggle + jiggle
|
||||||
end
|
end
|
||||||
|
end,
|
||||||
return true
|
delay,
|
||||||
end
|
nil,
|
||||||
}))
|
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 true
|
return
|
||||||
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")
|
||||||
|
|
@ -132,7 +131,7 @@ function Jane.get_chipmult_sum(chips, mult)
|
||||||
mult = mult or 0
|
mult = mult or 0
|
||||||
|
|
||||||
local break_infinity = ((Talisman or {}).config_file or {}).break_infinity
|
local break_infinity = ((Talisman or {}).config_file or {}).break_infinity
|
||||||
local big = (break_infinity == "" or break_infinity == nil) and function (x) return x end or to_big
|
local big = (break_infinity == "" or break_infinity == nil) and function(x) return x end or to_big
|
||||||
local op = Jane.get_operator()
|
local op = Jane.get_operator()
|
||||||
|
|
||||||
if op >= 3 then
|
if op >= 3 then
|
||||||
|
|
@ -153,25 +152,25 @@ function Jane.get_operator()
|
||||||
return math.max(math.min(G.GAME.operator, 3), 1)
|
return math.max(math.min(G.GAME.operator, 3), 1)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Jane.get_small_chipmult_sum(chips, mult)
|
function Jane.hidden(card)
|
||||||
local ret = Jane.get_chipmult_sum()
|
return G.GAME and not G.GAME.obsidian and
|
||||||
return type(ret) == "table" and ret:to_number() or ret
|
(type(card) == "table" and (card.name == "Black Hole" or card.name == "The Soul") or card.hidden)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Jane.hidden(card)
|
function Jane.is_end_of_ante(context, card)
|
||||||
return G.GAME and not
|
return not context.individual and not
|
||||||
G.GAME.obsidian and
|
context.repetition and not
|
||||||
type(card) == 'table' and
|
(card or {}).debuff and
|
||||||
(card.name == "Black Hole" or card.name == "The Soul" or card.hidden)
|
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)
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
func = function()
|
play_sound(sound, per, vol)
|
||||||
play_sound(sound,per,vol)
|
end)
|
||||||
return true
|
|
||||||
end
|
|
||||||
}))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function Jane.resize(card, mod, force_save)
|
function Jane.resize(card, mod, force_save)
|
||||||
|
|
@ -187,20 +186,23 @@ function Jane.resize(card, mod, force_save)
|
||||||
|
|
||||||
if card.area and
|
if card.area and
|
||||||
((G.shop_jokers and card.area == G.shop_jokers) or
|
((G.shop_jokers and card.area == G.shop_jokers) or
|
||||||
(G.shop_booster and card.area == G.shop_booster) or
|
(G.shop_booster and card.area == G.shop_booster) or
|
||||||
(G.shop_vouchers and card.area == G.shop_vouchers)) then
|
(G.shop_vouchers and card.area == G.shop_vouchers)) then
|
||||||
create_shop_card_ui(card)
|
create_shop_card_ui(card)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function Jane.q(fc, de, t, tr, bl, ba)
|
function Jane.q(func, delay, timer, trigger, blockable, blocking)
|
||||||
G.E_MANAGER:add_event(Event({
|
G.E_MANAGER:add_event(Event({
|
||||||
timer = t,
|
delay = delay,
|
||||||
trigger = tr,
|
timer = timer,
|
||||||
delay = de,
|
trigger = (delay and not trigger) and "after" or trigger,
|
||||||
blockable = bl,
|
blocking = blocking,
|
||||||
blocking = ba,
|
blockable = blockable,
|
||||||
func = fc
|
func = function(...)
|
||||||
|
local ret = func(...)
|
||||||
|
return ret == nil and true or ret
|
||||||
|
end,
|
||||||
}))
|
}))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -216,17 +218,6 @@ function Card:nosuit()
|
||||||
return self.ability.name == "Stone Card" or self.config.center.no_suit
|
return self.ability.name == "Stone Card" or self.config.center.no_suit
|
||||||
end
|
end
|
||||||
|
|
||||||
local orig_debuff = Card.set_debuff
|
|
||||||
|
|
||||||
function Card:set_debuff(should_debuff)
|
|
||||||
if should_debuff and ((self.config or {}).center or {}).debuff_immune then
|
|
||||||
Jane.card_status_text(self, "Immune", nil, 0.05 * self.T.h, G.C.RED, nil, 0.6, nil, nil, "bm", "cancel", 1, 0.9)
|
|
||||||
return false
|
|
||||||
else
|
|
||||||
orig_debuff(self, should_debuff)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local orig_menu = Game.main_menu
|
local orig_menu = Game.main_menu
|
||||||
|
|
||||||
function Game:main_menu(change_context)
|
function Game:main_menu(change_context)
|
||||||
|
|
@ -249,80 +240,11 @@ function Game:update(dt)
|
||||||
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 inequalities = 0
|
|
||||||
local pools = {chips = 0, level = 0, mult = 0}
|
|
||||||
|
|
||||||
for k, v in pairs(G.GAME.hands) do
|
|
||||||
if orrery[k] and
|
|
||||||
(orrery[k].mult ~= v.mult or
|
|
||||||
orrery[k].chips ~= v.chips or
|
|
||||||
orrery[k].level ~= v.level) then
|
|
||||||
inequalities = inequalities + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
count = count + 1
|
|
||||||
hands[#hands + 1] = v
|
|
||||||
pools.mult = v.mult + pools.mult
|
|
||||||
pools.chips = v.chips + pools.chips
|
|
||||||
pools.level = v.level + pools.level
|
|
||||||
end
|
|
||||||
|
|
||||||
if inequalities == 0 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
pools.chips = pools.chips + inequalities * 150
|
|
||||||
table.sort(hands, function (x, y) return x.order > y.order end)
|
|
||||||
|
|
||||||
for i, v in ipairs(hands) do
|
|
||||||
v.mult = math.floor(pools.mult / count) + (small(pools.mult % count) >= i and 1 or 0)
|
|
||||||
v.chips = math.floor(pools.chips / count) + (small(pools.chips % count) >= i and 1 or 0)
|
|
||||||
v.level = math.floor(pools.level / count) + (small(pools.level % count) >= i and 1 or 0)
|
|
||||||
end
|
|
||||||
|
|
||||||
for k, v in pairs(G.GAME.hands) do
|
|
||||||
orrery[k] = {chips = v.chips, level = v.level, mult = v.mult}
|
|
||||||
end
|
|
||||||
|
|
||||||
hand(localize("k_all_hands"), math.floor(pools.chips / count), math.floor(pools.mult / count), math.floor(pools.level / count))
|
|
||||||
delay(1)
|
|
||||||
update_hand_text({sound = "button", volume = 0.7, pitch = 1.1, delay = 0}, {mult = 0, chips = 0, handname = "", level = ""})
|
|
||||||
end
|
|
||||||
|
|
||||||
local function hsv(h, s, v)
|
local function hsv(h, s, v)
|
||||||
if s <= 0 then return v, v, v end
|
if s <= 0 then
|
||||||
|
return v, v, v
|
||||||
|
end
|
||||||
|
|
||||||
h = h * 6
|
h = h * 6
|
||||||
local c = v * s
|
local c = v * s
|
||||||
local x = (1 - math.abs((h % 2) - 1)) * c
|
local x = (1 - math.abs((h % 2) - 1)) * c
|
||||||
|
|
@ -346,7 +268,6 @@ function Game:update(dt)
|
||||||
end
|
end
|
||||||
|
|
||||||
orig_update(self, dt)
|
orig_update(self, dt)
|
||||||
|
|
||||||
local ante = G.GAME.round_resets.ante
|
local ante = G.GAME.round_resets.ante
|
||||||
local blind = get_blind_amount((ante >= 1 and ante <= 8) and math.floor(ante) or ante)
|
local blind = get_blind_amount((ante >= 1 and ante <= 8) and math.floor(ante) or ante)
|
||||||
G.P_BLINDS["bl_jane_wee"].mult = 22 / blind
|
G.P_BLINDS["bl_jane_wee"].mult = 22 / blind
|
||||||
|
|
@ -354,8 +275,8 @@ function Game:update(dt)
|
||||||
Jane.update_honey()
|
Jane.update_honey()
|
||||||
|
|
||||||
if not Jane.bans_done then
|
if not Jane.bans_done then
|
||||||
delete_hardbans()
|
|
||||||
Jane.bans_done = true
|
Jane.bans_done = true
|
||||||
|
delete_hardbans()
|
||||||
end
|
end
|
||||||
|
|
||||||
if (G.GAME or {}).banned_keys then
|
if (G.GAME or {}).banned_keys then
|
||||||
|
|
@ -372,18 +293,6 @@ function Game:update(dt)
|
||||||
self.C.jane_RGB_HUE = (self.C.jane_RGB_HUE + 0.5) % 360
|
self.C.jane_RGB_HUE = (self.C.jane_RGB_HUE + 0.5) % 360
|
||||||
G.ARGS.LOC_COLOURS.jane_RGB = self.C.jane_RGB
|
G.ARGS.LOC_COLOURS.jane_RGB = self.C.jane_RGB
|
||||||
end
|
end
|
||||||
|
|
||||||
rebalance_orrery()
|
|
||||||
end
|
|
||||||
|
|
||||||
local orig_card = SMODS.find_card
|
|
||||||
|
|
||||||
---@param key string
|
|
||||||
---@param count_debuffed true?
|
|
||||||
---@return Card[]|table[]
|
|
||||||
--- Returns all cards matching provided `key`.
|
|
||||||
function SMODS.find_card(key, count_debuffed)
|
|
||||||
return orig_card(key == "j_jen_saint" and "j_jane_saint" or key, count_debuffed)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
SMODS.Atlas {
|
SMODS.Atlas {
|
||||||
|
|
@ -404,6 +313,7 @@ for _, v in ipairs({
|
||||||
"back",
|
"back",
|
||||||
"blind",
|
"blind",
|
||||||
"booster",
|
"booster",
|
||||||
|
"challenge",
|
||||||
"edition",
|
"edition",
|
||||||
"joker",
|
"joker",
|
||||||
"slugcat",
|
"slugcat",
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,8 @@
|
||||||
-- 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_whitelist = {
|
local big_num_allowlist = {
|
||||||
j_egg = true,
|
j_egg = true,
|
||||||
j_wee = true,
|
j_wee = true,
|
||||||
j_flash = true,
|
j_flash = true,
|
||||||
|
|
@ -102,7 +101,7 @@ local function is_card_big(joker)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
return big_num_whitelist[center.key or "Nope!"]
|
return big_num_allowlist[center.key or "Nope!"]
|
||||||
end
|
end
|
||||||
|
|
||||||
local function log_random(seed, min, max)
|
local function log_random(seed, min, max)
|
||||||
|
|
@ -114,7 +113,6 @@ local function log_random(seed, min, max)
|
||||||
end
|
end
|
||||||
|
|
||||||
function Jane.misprintize_val(val, override, big)
|
function Jane.misprintize_val(val, override, big)
|
||||||
|
|
||||||
return is_number(val) and check(
|
return is_number(val) and check(
|
||||||
format(
|
format(
|
||||||
val * log_random(
|
val * log_random(
|
||||||
|
|
@ -153,30 +151,30 @@ function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack,
|
||||||
|
|
||||||
tbl[k] = check(
|
tbl[k] = check(
|
||||||
clear and base_values[name][k]
|
clear and base_values[name][k]
|
||||||
or format(
|
or 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
|
||||||
|
|
@ -191,15 +189,15 @@ function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack,
|
||||||
|
|
||||||
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 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
|
||||||
|
|
@ -247,10 +245,11 @@ function Jane.misprintize(card, override, force_reset, stack)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if (not force_reset or G.GAME.modifiers.cry_jkr_misprint_mod) and
|
if (not force_reset or G.GAME.modifiers.cry_jkr_misprint_mod) and
|
||||||
(G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker") and not
|
(G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker") and not
|
||||||
stack or not
|
stack or not
|
||||||
no(card, "immutable", true) then
|
no(card, "immutable", true) then
|
||||||
if card.ability.name == "Ace Aequilibrium" then
|
if card.ability.name == "Ace Aequilibrium" then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
|
||||||
429
src/slugcat.lua
429
src/slugcat.lua
|
|
@ -5,6 +5,36 @@ for i = 1, 8 do
|
||||||
SMODS.Sound({key = "gore" .. i, path = "gore" .. i .. ".ogg"})
|
SMODS.Sound({key = "gore" .. i, path = "gore" .. i .. ".ogg"})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
SMODS.Sound({
|
||||||
|
key = "music_attuned",
|
||||||
|
path = "music_attuned.ogg",
|
||||||
|
volume = 1,
|
||||||
|
select_music_track = function()
|
||||||
|
for _, v in pairs(SMODS.find_card("j_jane_saint")) do
|
||||||
|
if v.ability.extra.is_attuned then
|
||||||
|
return Jane.sinister and -1 / 0 or 10
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return -1 / 0
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
SMODS.Sound({
|
||||||
|
key = "music_attuned_sinister",
|
||||||
|
path = "music_attuned_sinister.ogg",
|
||||||
|
volume = 1,
|
||||||
|
select_music_track = function()
|
||||||
|
for _, v in pairs(SMODS.find_card("j_jane_saint")) do
|
||||||
|
if v.ability.extra.is_attuned then
|
||||||
|
return Jane.sinister and 10 or -1 / 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return -1 / 0
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
for _, v in pairs({
|
for _, v in pairs({
|
||||||
"artificer",
|
"artificer",
|
||||||
"hunter",
|
"hunter",
|
||||||
|
|
@ -20,7 +50,7 @@ for _, v in pairs({
|
||||||
key = "jane" .. v,
|
key = "jane" .. v,
|
||||||
px = 71,
|
px = 71,
|
||||||
py = 95,
|
py = 95,
|
||||||
path = Jane.config.texture_pack .. "/j_jane_" .. v .. ".png"
|
path = Jane.config.texture_pack .. "/j_jane_" .. v .. ".png",
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -34,6 +64,8 @@ SMODS.Rarity {
|
||||||
badge_colour = G.C.JOKER_GREY,
|
badge_colour = G.C.JOKER_GREY,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local monk_limit = 25
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
key = "monk",
|
key = "monk",
|
||||||
atlas = "janemonk",
|
atlas = "janemonk",
|
||||||
|
|
@ -44,7 +76,7 @@ SMODS.Joker {
|
||||||
"cards {C:attention}#1# time#2# {}if",
|
"cards {C:attention}#1# time#2# {}if",
|
||||||
"hand contains {C:attention}#3#",
|
"hand contains {C:attention}#3#",
|
||||||
"or fewer card#4#",
|
"or fewer card#4#",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
config = {extra = {retriggers = 2, requirement = 4}},
|
config = {extra = {retriggers = 2, requirement = 4}},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
|
|
@ -57,12 +89,14 @@ SMODS.Joker {
|
||||||
local retriggers = extra.retriggers
|
local retriggers = extra.retriggers
|
||||||
local requirement = extra.requirement
|
local requirement = extra.requirement
|
||||||
|
|
||||||
return {vars = {
|
return {
|
||||||
retriggers,
|
vars = {
|
||||||
retriggers == 1 and "" or "s",
|
retriggers,
|
||||||
requirement,
|
retriggers == 1 and "" or "s",
|
||||||
requirement == 1 and "" or "s"
|
requirement,
|
||||||
}}
|
requirement == 1 and "" or "s",
|
||||||
|
},
|
||||||
|
}
|
||||||
end,
|
end,
|
||||||
calculate = function(_, card, context)
|
calculate = function(_, card, context)
|
||||||
if not context.repetition or
|
if not context.repetition or
|
||||||
|
|
@ -72,13 +106,16 @@ SMODS.Joker {
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local min = math.min(card.ability.extra.retriggers, monk_limit)
|
||||||
|
card.ability.extra.retriggers = min
|
||||||
|
|
||||||
return {
|
return {
|
||||||
message = localize("k_again_ex"),
|
card = card,
|
||||||
repetitions = card.ability.extra.retriggers,
|
repetitions = min,
|
||||||
colour = G.C.ORANGE,
|
colour = G.C.ORANGE,
|
||||||
card = card
|
message = localize("k_again_ex"),
|
||||||
}, true
|
}, true
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
|
|
@ -88,10 +125,10 @@ SMODS.Joker {
|
||||||
name = "The Survivor",
|
name = "The Survivor",
|
||||||
text = {
|
text = {
|
||||||
"All cards held in hand",
|
"All cards held in hand",
|
||||||
"{C:attention}contribute to scoring {}and",
|
"{C:attention}contribute to scoring" .. (Cryptid and " {}and" or ""),
|
||||||
"are all considered as",
|
Cryptid and "are all considered as" or nil,
|
||||||
"the {C:attention}first played card",
|
Cryptid and "the {C:attention}first played card" or nil,
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
soul_pos = {x = 1, y = 0},
|
soul_pos = {x = 1, y = 0},
|
||||||
|
|
@ -112,29 +149,32 @@ SMODS.Joker {
|
||||||
(Cryptid and "an {C:spectral}Empowered Tag" or "a {C:dark_edition}Negative {C:spectral}Soul") .. " {}after #1#",
|
(Cryptid and "an {C:spectral}Empowered Tag" or "a {C:dark_edition}Negative {C:spectral}Soul") .. " {}after #1#",
|
||||||
"When {C:attention}sold#2#{}, turns#3#",
|
"When {C:attention}sold#2#{}, turns#3#",
|
||||||
"#4#{C:red}The Rot{} without rewards",
|
"#4#{C:red}The Rot{} without rewards",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
config = {extra = {rounds_left = hunter[1]}},
|
config = {extra = {rounds_left = hunter[1]}},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
eternal_compat = false,
|
eternal_compat = false,
|
||||||
perishable_compat = false,
|
perishable_compat = false,
|
||||||
soul_pos = {x = 1, y = 0},
|
soul_pos = {x = 1, y = 0},
|
||||||
cost = Cryptid and 20 or 8,
|
cost = Cryptid and 15 or 8,
|
||||||
rarity = Cryptid and 4 or 3,
|
rarity = Cryptid and epic or 3,
|
||||||
loc_vars = function(_, _, card)
|
loc_vars = function(_, info_queue, card)
|
||||||
local function rounds(amount)
|
local function rounds(amount)
|
||||||
return " round" .. ((math.abs(amount) > 1 or math.abs(amount) == 0) and "s" or "")
|
return " round" .. ((math.abs(amount) > 1 or math.abs(amount) == 0) and "s" or "")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
info_queue[#info_queue + 1] = Cryptid and G.P_CENTERS.c_cry_empowered or G.P_CENTERS.c_soul
|
||||||
local rounds_left = card.ability.extra.rounds_left
|
local rounds_left = card.ability.extra.rounds_left
|
||||||
local sold = rounds_left - hunter[2]
|
local sold = rounds_left - hunter[3]
|
||||||
|
|
||||||
return {vars = {
|
return {
|
||||||
rounds_left .. rounds(rounds_left) .. (rounds_left <= 0 and "...?" or ""),
|
vars = {
|
||||||
sold <= 0 and "" or " after " .. sold .. rounds(sold),
|
rounds_left .. rounds(rounds_left) .. (rounds_left <= 0 and "...?" or ""),
|
||||||
sold <= 0 and " into" or "",
|
sold <= 0 and "" or " after " .. sold .. rounds(sold),
|
||||||
sold <= 0 and "" or "into ",
|
sold <= 0 and " into" or "",
|
||||||
}}
|
sold <= 0 and "" or "into ",
|
||||||
|
},
|
||||||
|
}
|
||||||
end,
|
end,
|
||||||
update = function(_, card, _)
|
update = function(_, card, _)
|
||||||
if card.added_to_deck and card.children.center and card.children.floating_sprite then
|
if card.added_to_deck and card.children.center and card.children.floating_sprite then
|
||||||
|
|
@ -152,6 +192,7 @@ SMODS.Joker {
|
||||||
local function spawn_rot()
|
local function spawn_rot()
|
||||||
card:flip()
|
card:flip()
|
||||||
card:juice_up(2, 0.8)
|
card:juice_up(2, 0.8)
|
||||||
|
card.getting_sliced = true
|
||||||
Jane.card_status_text(card, "Dead!", nil, 0.05 * card.T.h, G.C.BLACK, 2, 0, 0, nil, "bm", "jane_gore6")
|
Jane.card_status_text(card, "Dead!", nil, 0.05 * card.T.h, G.C.BLACK, 2, 0, 0, nil, "bm", "jane_gore6")
|
||||||
|
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
|
|
@ -161,31 +202,26 @@ SMODS.Joker {
|
||||||
card:set_eternal(nil)
|
card:set_eternal(nil)
|
||||||
card2:set_eternal(true)
|
card2:set_eternal(true)
|
||||||
play_sound("jane_gore5")
|
play_sound("jane_gore5")
|
||||||
return true
|
|
||||||
end)
|
end)
|
||||||
end
|
|
||||||
|
|
||||||
local function die()
|
|
||||||
spawn_rot()
|
|
||||||
|
|
||||||
Jane.q(function()
|
|
||||||
Jane.empowered()
|
|
||||||
return true
|
|
||||||
end, 0.1)
|
|
||||||
|
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
card:start_dissolve()
|
card:start_dissolve()
|
||||||
return true
|
|
||||||
end, 1)
|
end, 1)
|
||||||
|
end
|
||||||
|
|
||||||
return true
|
local function die()
|
||||||
|
Jane.q(function()
|
||||||
|
Jane.empowered()
|
||||||
|
end, 0.1)
|
||||||
|
|
||||||
|
spawn_rot()
|
||||||
end
|
end
|
||||||
|
|
||||||
if context.blueprint then
|
if context.blueprint then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
if context.selling_self and card.ability.extra.rounds_left <= hunter[2] then
|
if context.selling_self and card.ability.extra.rounds_left <= hunter[3] then
|
||||||
spawn_rot()
|
spawn_rot()
|
||||||
elseif not context.individual and not context.repetition and not context.retrigger_joker then
|
elseif not context.individual and not context.repetition and not context.retrigger_joker then
|
||||||
if G.GAME.round_resets.hands <= 0 then
|
if G.GAME.round_resets.hands <= 0 then
|
||||||
|
|
@ -194,17 +230,13 @@ SMODS.Joker {
|
||||||
|
|
||||||
if not card.hunter_prep then
|
if not card.hunter_prep then
|
||||||
card.hunter_prep = true
|
card.hunter_prep = true
|
||||||
|
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
Jane.q(function()
|
card.hunter_prep = nil
|
||||||
card.hunter_prep = nil
|
|
||||||
if G.GAME.current_round.hands_left < G.GAME.round_resets.hands then
|
|
||||||
ease_hands_played(G.GAME.round_resets.hands - G.GAME.current_round.hands_left)
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
if G.GAME.current_round.hands_left < G.GAME.round_resets.hands then
|
||||||
end)
|
ease_hands_played(G.GAME.round_resets.hands - G.GAME.current_round.hands_left)
|
||||||
|
end
|
||||||
return true
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -215,7 +247,8 @@ SMODS.Joker {
|
||||||
card.hunter_prep = nil
|
card.hunter_prep = nil
|
||||||
card.ability.extra.rounds_left = card.ability.extra.rounds_left - 1
|
card.ability.extra.rounds_left = card.ability.extra.rounds_left - 1
|
||||||
local rl = card.ability.extra.rounds_left
|
local rl = card.ability.extra.rounds_left
|
||||||
Jane.card_status_text(card, tostring(card.ability.extra.rounds_left), nil, nil, G.C.RED, nil, nil, nil, nil, nil, "generic1")
|
Jane.card_status_text(card, tostring(card.ability.extra.rounds_left), nil, nil, G.C.RED, nil, nil, nil, nil,
|
||||||
|
nil, "generic1")
|
||||||
|
|
||||||
if rl > hunter[2] then
|
if rl > hunter[2] then
|
||||||
card:juice_up(0.6, 0.1)
|
card:juice_up(0.6, 0.1)
|
||||||
|
|
@ -248,10 +281,10 @@ SMODS.Joker {
|
||||||
else
|
else
|
||||||
card:juice_up(2, 0.8)
|
card:juice_up(2, 0.8)
|
||||||
Jane.play_sound("jane_warning_heartbeat")
|
Jane.play_sound("jane_warning_heartbeat")
|
||||||
G.E_MANAGER:add_event(Event({trigger = "after", func = die}))
|
Jane.q(die, 0)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
|
|
@ -264,7 +297,7 @@ SMODS.Joker {
|
||||||
"are {C:attention}multiplied{} by {C:attention}#1#",
|
"are {C:attention}multiplied{} by {C:attention}#1#",
|
||||||
"when they are created",
|
"when they are created",
|
||||||
"{C:inactive}(If possible)",
|
"{C:inactive}(If possible)",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
loc_vars = function(_, _, center)
|
loc_vars = function(_, _, center)
|
||||||
return {vars = {center.ability.modifier}}
|
return {vars = {center.ability.modifier}}
|
||||||
|
|
@ -304,7 +337,7 @@ SMODS.Joker {
|
||||||
text = {
|
text = {
|
||||||
"Grants the {C:green}ability{} to {C:red}destroy",
|
"Grants the {C:green}ability{} to {C:red}destroy",
|
||||||
"selected {C:attention}playing cards",
|
"selected {C:attention}playing cards",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
soul_pos = {x = 1, y = 0},
|
soul_pos = {x = 1, y = 0},
|
||||||
|
|
@ -325,6 +358,8 @@ SMODS.Joker {
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local spearmaster_limit = 25
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
key = "spearmaster",
|
key = "spearmaster",
|
||||||
atlas = "janespearmaster",
|
atlas = "janespearmaster",
|
||||||
|
|
@ -334,12 +369,15 @@ SMODS.Joker {
|
||||||
"You can choose {C:attention}any number of cards",
|
"You can choose {C:attention}any number of cards",
|
||||||
"after opening {C:attention}any Booster Pack",
|
"after opening {C:attention}any Booster Pack",
|
||||||
"{C:attention}Booster Packs{} have {C:green}+#1#{} additional cards",
|
"{C:attention}Booster Packs{} have {C:green}+#1#{} additional cards",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
loc_vars = function(_, _, center)
|
config = {extra = {choices = 1}},
|
||||||
return {vars = {center.ability.extra.extrachoices}}
|
loc_vars = function(_, _, card)
|
||||||
|
return {vars = {card.ability.extra.choices}}
|
||||||
|
end,
|
||||||
|
calculate = function(_, card, _)
|
||||||
|
card.ability.extra.choices = math.min(card.ability.extra.choices, spearmaster_limit)
|
||||||
end,
|
end,
|
||||||
config = {extra = {extrachoices = 1}},
|
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
soul_pos = {x = 1, y = 0},
|
soul_pos = {x = 1, y = 0},
|
||||||
cost = Cryptid and 12 or 20,
|
cost = Cryptid and 12 or 20,
|
||||||
|
|
@ -355,7 +393,7 @@ function Card:open()
|
||||||
|
|
||||||
if next(spearmasters) then
|
if next(spearmasters) then
|
||||||
for _, v in pairs(spearmasters) do
|
for _, v in pairs(spearmasters) do
|
||||||
orig = orig + v.ability.extra.extrachoices
|
orig = orig + v.ability.extra.choices
|
||||||
end
|
end
|
||||||
|
|
||||||
self.config.choose = math.floor(orig)
|
self.config.choose = math.floor(orig)
|
||||||
|
|
@ -364,17 +402,11 @@ function Card:open()
|
||||||
|
|
||||||
orig_open(self)
|
orig_open(self)
|
||||||
|
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
delay = 0.5,
|
if next(spearmasters) then
|
||||||
timer = "REAL",
|
G.GAME.pack_choices = math.floor(self.ability.extra)
|
||||||
func = function()
|
|
||||||
if next(spearmasters) then
|
|
||||||
G.GAME.pack_choices = math.floor(self.ability.extra)
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
}))
|
end, 0.5, "REAL")
|
||||||
end
|
end
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
|
|
@ -385,7 +417,7 @@ SMODS.Joker {
|
||||||
text = {
|
text = {
|
||||||
"Non-{C:dark_edition}editioned{} cards are",
|
"Non-{C:dark_edition}editioned{} cards are",
|
||||||
"{C:attention}given a random {C:dark_edition}Edition",
|
"{C:attention}given a random {C:dark_edition}Edition",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
soul_pos = {x = 1, y = 0},
|
soul_pos = {x = 1, y = 0},
|
||||||
|
|
@ -415,8 +447,7 @@ function Card:draw(layer)
|
||||||
if cen and
|
if cen and
|
||||||
self.facing == "front" and
|
self.facing == "front" and
|
||||||
self.config and
|
self.config and
|
||||||
(self.added_to_deck or
|
(self.added_to_deck or (self.area and self.area == G.hand)) and not
|
||||||
(self.area and self.area == G.hand)) and not
|
|
||||||
self.edition and
|
self.edition and
|
||||||
(self.area == G.consumeables or cen.set ~= "Booster") and
|
(self.area == G.consumeables or cen.set ~= "Booster") and
|
||||||
next(SMODS.find_card("j_jane_rivulet")) then
|
next(SMODS.find_card("j_jane_rivulet")) then
|
||||||
|
|
@ -426,29 +457,19 @@ function Card:draw(layer)
|
||||||
orig_draw(self, layer)
|
orig_draw(self, layer)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local orig_debuff = Card.set_debuff
|
||||||
|
|
||||||
|
function Card:set_debuff(should_debuff)
|
||||||
|
if should_debuff and ((self.config or {}).center or {}).debuff_immune then
|
||||||
|
Jane.card_status_text(self, "Immune", nil, 0.05 * self.T.h, G.C.RED, nil, 0.6, nil, nil, "bm", "cancel", 1, 0.9)
|
||||||
|
return false
|
||||||
|
else
|
||||||
|
orig_debuff(self, should_debuff)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function attunement()
|
local function attunement()
|
||||||
local function polygloss(tbl)
|
return (G.GAME or {}).weeckweeck and 2 or (Cryptid and 1.002 or 1.2)
|
||||||
local sum = 0
|
|
||||||
|
|
||||||
for _, v in pairs(tbl) do
|
|
||||||
if (v.edition or {}).key == "e_jane_polygloss" then
|
|
||||||
sum = sum + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return sum
|
|
||||||
end
|
|
||||||
|
|
||||||
if Cryptid then
|
|
||||||
return 1.001
|
|
||||||
end
|
|
||||||
|
|
||||||
local cards = polygloss(G.playing_cards) + polygloss(G.jokers.cards) + polygloss(G.consumeables.cards)
|
|
||||||
local base = 1.01
|
|
||||||
local round = 100
|
|
||||||
local expo = cards * 2
|
|
||||||
local error_correction = 1e-10
|
|
||||||
return math.floor(base ^ expo * round + error_correction) / round
|
|
||||||
end
|
end
|
||||||
|
|
||||||
SMODS.Joker {
|
SMODS.Joker {
|
||||||
|
|
@ -456,13 +477,16 @@ SMODS.Joker {
|
||||||
atlas = "janesaint",
|
atlas = "janesaint",
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "The Saint{C:jane_RGB}#1#",
|
name = "The Saint{C:jane_RGB}#1#",
|
||||||
text = {
|
text = Cryptid and {
|
||||||
"{C:spectral}#2# {}will {C:attention}not destroy Jokers",
|
"{C:spectral}Analog{}, {C:spectral}Ankh{}, {C:spectral}Gateway{}, and",
|
||||||
"{C:jane_RGB}#3#{}#4#{X:black,C:jane_RGB,s:1.5}#5#{C:spectral}#6#{C:chips}#7#{}#8#{C:mult}#9#",
|
"{C:spectral,s:0.95}Summoning {s:0.95}will {C:attention,s:0.95}not destroy Jokers",
|
||||||
"{C:inactive,s:1.25}#10#{C:attention,s:1.25}#11#{C:inactive,s:1.25}#12#{C:inactive}#13#{C:jane_RGB}#14#" ..
|
"{C:jane_RGB}#2#{}#3#{X:black,C:jane_RGB,s:1.5}#4#{C:spectral}#5#{C:mult}#6#",
|
||||||
(Cryptid and "{C:inactive}" or "{C:inactive,s:0.75}") ..
|
"{C:inactive,s:1.25}#7#{C:attention,s:1.25}#8#{C:inactive,s:1.25}#9#{C:inactive}#10#",
|
||||||
"#15#",
|
} or {
|
||||||
}
|
"{C:spectral}Ankh {}will {C:attention}not destroy Jokers",
|
||||||
|
"{C:jane_RGB}#2#{}#3#{C:dark_edition}#4#{C:spectral}#5#",
|
||||||
|
"{C:inactive,s:1.25}#6#{C:attention,s:1.25}#7#{C:inactive,s:1.25}#8#{C:inactive}#9#",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
config = {extra = {karma = 0, max_karma = Cryptid and 10 or 3}},
|
config = {extra = {karma = 0, max_karma = Cryptid and 10 or 3}},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
|
|
@ -470,31 +494,51 @@ SMODS.Joker {
|
||||||
cost = 20,
|
cost = 20,
|
||||||
rarity = 4,
|
rarity = 4,
|
||||||
blueprint_compat = true,
|
blueprint_compat = true,
|
||||||
loc_vars = function(_, _, card)
|
loc_vars = function(_, info_queue, card)
|
||||||
|
if Cryptid then
|
||||||
|
info_queue[#info_queue + 1] = G.P_CENTERS.c_cry_analog
|
||||||
|
end
|
||||||
|
|
||||||
|
info_queue[#info_queue + 1] = G.P_CENTERS.c_ankh
|
||||||
|
info_queue[#info_queue + 1] = Cryptid and G.P_CENTERS.c_cry_gateway or G.P_CENTERS.c_soul
|
||||||
|
|
||||||
|
if Cryptid then
|
||||||
|
info_queue[#info_queue + 1] = G.P_CENTERS.c_cry_summoning
|
||||||
|
end
|
||||||
|
|
||||||
local extra = card.ability.extra
|
local extra = card.ability.extra
|
||||||
local karma = extra.karma
|
local karma = extra.karma
|
||||||
local max_karma = extra.max_karma
|
local max_karma = extra.max_karma
|
||||||
local attuned = karma >= max_karma
|
local attuned = karma >= max_karma
|
||||||
|
|
||||||
return {vars = {
|
return {
|
||||||
attuned and " (Attuned)" or "",
|
vars = Cryptid and {
|
||||||
Cryptid and "Ankh and Gateway" or "Ankh",
|
attuned and " (Attuned)" or "",
|
||||||
attuned and "" or "Attune ",
|
attuned and "" or "Attune ",
|
||||||
attuned and "" or "after using ",
|
attuned and "" or "after using ",
|
||||||
attuned and (Cryptid and "^^" or "^") .. attunement() or max_karma,
|
attuned and "^^" .. attunement() or max_karma,
|
||||||
attuned and "" or (Cryptid and " Gateways" or " Ankh or Soul Cards"),
|
attuned and "" or " Gateways",
|
||||||
attuned and " Chips " or "",
|
attuned and " Mult" or "",
|
||||||
attuned and "& " or "",
|
attuned and "" or "[",
|
||||||
attuned and "Mult" or "",
|
attuned and "" or karma,
|
||||||
attuned and "" or "[",
|
attuned and "" or " / " .. max_karma .. "]",
|
||||||
attuned and "" or karma,
|
attuned and "(Cannot be debuffed)" or "",
|
||||||
attuned and "" or " / " .. max_karma .. "]",
|
} or {
|
||||||
attuned and "(Cannot be debuffed" .. (Cryptid and "" or ", scales with ") or "",
|
attuned and " (Attuned)" or "",
|
||||||
attuned and (Cryptid and "" or "polygloss") or "",
|
attuned and "" or "Attune ",
|
||||||
attuned and ")" or "",
|
attuned and "Boosts cards with " or "after using ",
|
||||||
}}
|
attuned and "editions" or max_karma,
|
||||||
|
attuned and "" or " Ankh or Soul Cards",
|
||||||
|
attuned and "" or "[",
|
||||||
|
attuned and "" or karma,
|
||||||
|
attuned and "" or " / " .. max_karma .. "]",
|
||||||
|
attuned and "(Cannot be debuffed)" or "",
|
||||||
|
},
|
||||||
|
}
|
||||||
end,
|
end,
|
||||||
update = function(_, card, _)
|
update = function(_, card, _)
|
||||||
|
card.debuff_immune = card.ability.extra.is_attuned
|
||||||
|
|
||||||
if card.added_to_deck and card.children.center and card.children.floating_sprite then
|
if card.added_to_deck and card.children.center and card.children.floating_sprite then
|
||||||
local extra = card.ability.extra
|
local extra = card.ability.extra
|
||||||
card.children.floating_sprite:set_sprite_pos({x = extra.is_attuned and 2 or 1, y = 0})
|
card.children.floating_sprite:set_sprite_pos({x = extra.is_attuned and 2 or 1, y = 0})
|
||||||
|
|
@ -503,46 +547,97 @@ SMODS.Joker {
|
||||||
calculate = function(_, card, context)
|
calculate = function(_, card, context)
|
||||||
local extra = card.ability.extra
|
local extra = card.ability.extra
|
||||||
local max_karma = extra.max_karma
|
local max_karma = extra.max_karma
|
||||||
extra.is_attuned = extra.karma >= max_karma
|
extra.is_attuned = extra.is_attuned and extra.karma >= max_karma
|
||||||
|
|
||||||
|
local function ascend()
|
||||||
|
if extra.is_attuning then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
extra.is_attuning = true
|
||||||
|
|
||||||
|
Jane.card_status_text(
|
||||||
|
card,
|
||||||
|
"!!!",
|
||||||
|
nil,
|
||||||
|
0.05 * card.T.h,
|
||||||
|
G.C.DARK_EDITION,
|
||||||
|
0.6,
|
||||||
|
0.6,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
"bm",
|
||||||
|
"jane_enlightened"
|
||||||
|
)
|
||||||
|
|
||||||
|
Jane.q(function()
|
||||||
|
card:flip()
|
||||||
|
play_sound("card1")
|
||||||
|
end, 0.1)
|
||||||
|
|
||||||
|
Jane.q(function()
|
||||||
|
card:flip()
|
||||||
|
card:juice_up(1, 1)
|
||||||
|
play_sound("card1")
|
||||||
|
extra.is_attuned = true
|
||||||
|
end, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
if extra.is_attuned then
|
||||||
|
card.debuff = false
|
||||||
|
|
||||||
if extra.karma >= max_karma then
|
|
||||||
if card.ability then
|
if card.ability then
|
||||||
card.ability.perishable = false
|
card.ability.perishable = false
|
||||||
card.ability.perish_tally = 1e9
|
card.ability.perish_tally = 1e9
|
||||||
end
|
end
|
||||||
|
|
||||||
card.debuff = false
|
if Cryptid and not context.joker_main then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if not context.joker_main then
|
if not Cryptid and not context.other_joker and (not context.individual or context.cardarea ~= G.play) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local attune = attunement()
|
local attune = attunement()
|
||||||
|
|
||||||
if attune == 1 then
|
local trigger = ({
|
||||||
return
|
e_holo = {mult = 50},
|
||||||
|
e_foil = {chips = 250},
|
||||||
|
e_polychrome = {x_mult = 2.5},
|
||||||
|
e_jane_polygloss = {
|
||||||
|
mult = 10,
|
||||||
|
x_mult = 2,
|
||||||
|
chips = 100,
|
||||||
|
p_dollars = 10,
|
||||||
|
},
|
||||||
|
e_jane_moire = {
|
||||||
|
colour = G.C.jane_RGB,
|
||||||
|
sound = "talisman_eeechip",
|
||||||
|
[Cryptid and "EEchip_mod" or "Echip_mod"] = attune,
|
||||||
|
[Cryptid and "EEmult_mod" or "Emult_mod"] = attune,
|
||||||
|
message = (Cryptid and "^^" or "^") .. attune .. " Chips & Mult",
|
||||||
|
},
|
||||||
|
})[Cryptid and "e_jane_moire" or ((context.other_card or context.other_joker or {}).edition or {}).key]
|
||||||
|
|
||||||
|
if trigger then
|
||||||
|
trigger.card = card
|
||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return trigger
|
||||||
card = card,
|
elseif extra.karma >= max_karma then
|
||||||
colour = G.C.jane_RGB,
|
ascend()
|
||||||
sound = "talisman_eeechip",
|
|
||||||
message = (Cryptid and "^^" or "^") .. attune .. " Chips & Mult",
|
|
||||||
[Cryptid and "EEchip_mod" or "Echip_mod"] = attune,
|
|
||||||
[Cryptid and "EEmult_mod" or "Emult_mod"] = attune,
|
|
||||||
}, true
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if not (not context.blueprint and
|
if not (not context.blueprint and
|
||||||
(not context.retrigger_joker_check and not context.retrigger_joker) and
|
(not context.retrigger_joker_check and not context.retrigger_joker) and
|
||||||
context.using_consumeable and
|
context.using_consumeable and
|
||||||
context.consumeable) then
|
context.consumeable) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local key = context.consumeable:gc().key
|
local key = context.consumeable:gc().key
|
||||||
|
|
||||||
-- TODO: Make ankh not destroy jokers
|
|
||||||
if Cryptid and key ~= "c_cry_gateway" or not Cryptid and (key ~= "c_ankh" and key ~= "c_soul") then
|
if Cryptid and key ~= "c_cry_gateway" or not Cryptid and (key ~= "c_ankh" and key ~= "c_soul") then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
@ -572,40 +667,8 @@ SMODS.Joker {
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
Jane.card_status_text(
|
ascend()
|
||||||
card,
|
end,
|
||||||
"!!!",
|
|
||||||
nil,
|
|
||||||
0.05 * card.T.h,
|
|
||||||
G.C.DARK_EDITION,
|
|
||||||
0.6,
|
|
||||||
0.6,
|
|
||||||
2,
|
|
||||||
2,
|
|
||||||
"bm",
|
|
||||||
"jane_enlightened"
|
|
||||||
)
|
|
||||||
|
|
||||||
G.E_MANAGER:add_event(Event({
|
|
||||||
delay = 0.1,
|
|
||||||
func = function()
|
|
||||||
card:flip()
|
|
||||||
play_sound("card1")
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
}))
|
|
||||||
|
|
||||||
G.E_MANAGER:add_event(Event({
|
|
||||||
delay = 1,
|
|
||||||
func = function()
|
|
||||||
card:flip()
|
|
||||||
card:juice_up(1, 1)
|
|
||||||
play_sound("card1")
|
|
||||||
extra.is_attuned = true
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
}))
|
|
||||||
end
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if Cryptid then
|
if Cryptid then
|
||||||
|
|
@ -622,13 +685,13 @@ SMODS.Joker {
|
||||||
"Clogs up your Joker slots",
|
"Clogs up your Joker slots",
|
||||||
"{C:attention}Duplicates itself{} at the",
|
"{C:attention}Duplicates itself{} at the",
|
||||||
"end of {C:attention}every ante",
|
"end of {C:attention}every ante",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
soul_pos = {x = 1, y = 0},
|
soul_pos = {x = 1, y = 0},
|
||||||
cost = 1,
|
cost = 1,
|
||||||
rarity = "jane_junk",
|
rarity = "jane_junk",
|
||||||
in_pool = function (_, _)
|
in_pool = function(_, _)
|
||||||
for _, v in pairs(SMODS.find_card("j_jane_honey")) do
|
for _, v in pairs(SMODS.find_card("j_jane_honey")) do
|
||||||
if tonumber(v.ability.extra.level) == #Jane.rarity_ids - 1 then
|
if tonumber(v.ability.extra.level) == #Jane.rarity_ids - 1 then
|
||||||
return true
|
return true
|
||||||
|
|
@ -642,17 +705,11 @@ SMODS.Joker {
|
||||||
return G.jokers.config.card_count < G.jokers.config.card_limit
|
return G.jokers.config.card_count < G.jokers.config.card_limit
|
||||||
end
|
end
|
||||||
|
|
||||||
local function is_end_of_ante()
|
|
||||||
return not context.individual and not
|
|
||||||
context.repetition and not
|
|
||||||
card.debuff and
|
|
||||||
context.end_of_round and not
|
|
||||||
context.blueprint and
|
|
||||||
G.GAME.blind.boss and not
|
|
||||||
(G.GAME.blind.config and G.GAME.blind.config.bonus)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function spawn()
|
local function spawn()
|
||||||
|
if card.cloned then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local rot = copy_card(card)
|
local rot = copy_card(card)
|
||||||
rot.cloned = true
|
rot.cloned = true
|
||||||
rot:add_to_deck()
|
rot:add_to_deck()
|
||||||
|
|
@ -660,10 +717,10 @@ SMODS.Joker {
|
||||||
Jane.card_status_text(rot, "...", nil, 0.05 * card.T.h, G.C.BLACK, 3, 0, 0, nil, "bm")
|
Jane.card_status_text(rot, "...", nil, 0.05 * card.T.h, G.C.BLACK, 3, 0, 0, nil, "bm")
|
||||||
end
|
end
|
||||||
|
|
||||||
if has_room() and not card.cloned and is_end_of_ante() then
|
if has_room() and not card.cloned and Jane.is_end_of_ante(context, card) then
|
||||||
spawn()
|
Jane.q(spawn, 0.5)
|
||||||
else
|
else
|
||||||
card.cloned = false
|
card.cloned = false
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
230
src/spectral.lua
230
src/spectral.lua
|
|
@ -2,7 +2,7 @@ SMODS.Atlas {
|
||||||
key = "janertarots",
|
key = "janertarots",
|
||||||
px = 71,
|
px = 71,
|
||||||
py = 95,
|
py = 95,
|
||||||
path = Jane.config.texture_pack .. "/c_jane_reversetarots.png"
|
path = Jane.config.texture_pack .. "/c_jane_reversetarots.png",
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Sound({key = "draw", path = "draw.ogg"})
|
SMODS.Sound({key = "draw", path = "draw.ogg"})
|
||||||
|
|
@ -12,61 +12,51 @@ local function conjure(card, number)
|
||||||
math.ceil(card.ability.extra.spectrals) * number,
|
math.ceil(card.ability.extra.spectrals) * number,
|
||||||
G.consumeables.config.card_limit - #G.consumeables.cards
|
G.consumeables.config.card_limit - #G.consumeables.cards
|
||||||
) do
|
) do
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
trigger = "after",
|
if G.consumeables.config.card_limit <= #G.consumeables.cards then
|
||||||
delay = 0.4,
|
return
|
||||||
func = function()
|
|
||||||
if G.consumeables.config.card_limit <= #G.consumeables.cards then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
play_sound("jane_draw")
|
|
||||||
local spectral = create_card("Spectral", G.consumeables, nil, nil, nil, nil, nil, "pri")
|
|
||||||
spectral:add_to_deck()
|
|
||||||
G.consumeables:emplace(spectral)
|
|
||||||
card:juice_up(0.3, 0.5)
|
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
}))
|
|
||||||
|
play_sound("jane_draw")
|
||||||
|
local spectral = create_card("Spectral", G.consumeables, nil, nil, nil, nil, nil, "pri")
|
||||||
|
spectral:add_to_deck()
|
||||||
|
G.consumeables:emplace(spectral)
|
||||||
|
card:juice_up(0.3, 0.5)
|
||||||
|
end, 0.4)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function createfulldeck(enhancement, edition, amount, emplacement)
|
local function create_full_deck(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
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
delay = 0.1,
|
cards[i] = true
|
||||||
func = function()
|
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
|
||||||
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
|
|
||||||
|
|
||||||
play_sound("card1")
|
|
||||||
table.insert(G.playing_cards, card)
|
|
||||||
card:add_to_deck()
|
|
||||||
|
|
||||||
if emplacement then
|
|
||||||
emplacement:emplace(card)
|
|
||||||
else
|
|
||||||
G.deck:emplace(card)
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
end
|
||||||
}))
|
|
||||||
|
play_sound("card1")
|
||||||
|
table.insert(G.playing_cards, card)
|
||||||
|
card:add_to_deck()
|
||||||
|
|
||||||
|
if emplacement then
|
||||||
|
emplacement:emplace(card)
|
||||||
|
else
|
||||||
|
G.deck:emplace(card)
|
||||||
|
end
|
||||||
|
end, 0.1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -74,13 +64,6 @@ local function createfulldeck(enhancement, edition, amount, emplacement)
|
||||||
if next(cards) then
|
if next(cards) then
|
||||||
playing_card_joker_effects(cards)
|
playing_card_joker_effects(cards)
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
|
||||||
end)
|
|
||||||
|
|
||||||
Jane.q(function()
|
|
||||||
cards = nil
|
|
||||||
return true
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -90,7 +73,7 @@ local function randomize(targets, noanim)
|
||||||
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))
|
||||||
|
|
||||||
|
|
@ -125,16 +108,11 @@ local function randomize(targets, noanim)
|
||||||
for i = 1, #targets do
|
for i = 1, #targets do
|
||||||
local percent = 1.15 - (i - 0.999) / (#G.hand.cards - 0.998) * 0.3
|
local percent = 1.15 - (i - 0.999) / (#G.hand.cards - 0.998) * 0.3
|
||||||
|
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
trigger = "after",
|
targets[i]:flip()
|
||||||
delay = 0.15,
|
play_sound("card1", percent)
|
||||||
func = function()
|
targets[i]:juice_up(0.3, 0.3)
|
||||||
targets[i]:flip()
|
end, 0.15)
|
||||||
play_sound("card1", percent)
|
|
||||||
targets[i]:juice_up(0.3, 0.3)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
}))
|
|
||||||
end
|
end
|
||||||
|
|
||||||
delay(0.2)
|
delay(0.2)
|
||||||
|
|
@ -142,39 +120,34 @@ local function randomize(targets, noanim)
|
||||||
for i = 1, #targets do
|
for i = 1, #targets do
|
||||||
local percent = 0.85 + (i - 0.999) / (#G.hand.cards - 0.998) * 0.3
|
local percent = 0.85 + (i - 0.999) / (#G.hand.cards - 0.998) * 0.3
|
||||||
|
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
trigger = "after",
|
local card = targets[i]
|
||||||
delay = 0.1,
|
card:set_base(pseudorandom_element(G.P_CARDS))
|
||||||
func = function()
|
card:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"]))
|
||||||
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
|
|
||||||
|
|
||||||
seal_type = math.floor(seal_type * #seal_list)
|
|
||||||
card:set_seal(seal_list[seal_type])
|
|
||||||
else
|
|
||||||
card:set_seal()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
card:flip()
|
seal_type = math.floor(seal_type * #seal_list)
|
||||||
play_sound("card3", percent, 0.6)
|
card:set_seal(seal_list[seal_type])
|
||||||
card:juice_up(0.3, 0.3)
|
else
|
||||||
return true
|
card:set_seal()
|
||||||
end
|
end
|
||||||
}))
|
|
||||||
|
card:flip()
|
||||||
|
play_sound("card3", percent, 0.6)
|
||||||
|
card:juice_up(0.3, 0.3)
|
||||||
|
end, 0.1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -189,7 +162,7 @@ SMODS.Consumable {
|
||||||
"{C:green,E:1}Randomises{} all cards in hand",
|
"{C:green,E:1}Randomises{} all cards in hand",
|
||||||
"{C:inactive}(Rank, seal, edition,",
|
"{C:inactive}(Rank, seal, edition,",
|
||||||
"{C:inactive}enhancement, and suit)",
|
"{C:inactive}enhancement, and suit)",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
pos = {x = 0, y = 4},
|
pos = {x = 0, y = 4},
|
||||||
cost = 4,
|
cost = 4,
|
||||||
|
|
@ -197,19 +170,14 @@ SMODS.Consumable {
|
||||||
return Jane.can_use() and #((G.hand or {}).cards or {}) > 0
|
return Jane.can_use() and #((G.hand or {}).cards or {}) > 0
|
||||||
end,
|
end,
|
||||||
use = function(_, card, _, _)
|
use = function(_, card, _, _)
|
||||||
G.E_MANAGER:add_event(Event({
|
Jane.q(function()
|
||||||
trigger = "after",
|
play_sound("tarot1")
|
||||||
delay = 0.4,
|
card:juice_up(0.3, 0.5)
|
||||||
func = function()
|
end, 0.4)
|
||||||
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 {
|
||||||
|
|
@ -220,9 +188,9 @@ SMODS.Consumable {
|
||||||
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},
|
||||||
|
|
@ -238,9 +206,11 @@ SMODS.Consumable {
|
||||||
bulk_use = function(_, card, _, _, number)
|
bulk_use = function(_, card, _, _, number)
|
||||||
conjure(card, number)
|
conjure(card, number)
|
||||||
delay(0.6)
|
delay(0.6)
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local shadows_limit = 25
|
||||||
|
|
||||||
SMODS.Consumable {
|
SMODS.Consumable {
|
||||||
key = "shadows",
|
key = "shadows",
|
||||||
set = "Spectral",
|
set = "Spectral",
|
||||||
|
|
@ -251,17 +221,17 @@ SMODS.Consumable {
|
||||||
"Create {C:attention}#1#{} {C:green}random {C:dark_edition}Negative",
|
"Create {C:attention}#1#{} {C:green}random {C:dark_edition}Negative",
|
||||||
"{C:attention}Perishable {C:attention}Jokers{}, set {C:money}sell",
|
"{C:attention}Perishable {C:attention}Jokers{}, set {C:money}sell",
|
||||||
"{C:money}value {}of {C:attention}all Jokers {}to {C:money}$0",
|
"{C:money}value {}of {C:attention}all Jokers {}to {C:money}$0",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
config = {extra = {shadows = 2}},
|
config = {extra = {shadows = 2}},
|
||||||
pos = {x = 3, y = 4},
|
pos = {x = 3, y = 4},
|
||||||
cost = 4,
|
cost = 4,
|
||||||
loc_vars = function(_, _, center)
|
loc_vars = function(_, _, card)
|
||||||
return {vars = {((center.ability or {}).extra or {}).shadows or 2}}
|
return {vars = {math.min(((card.ability or {}).extra or {}).shadows or 2, shadows_limit)}}
|
||||||
end,
|
end,
|
||||||
can_use = Jane.can_use,
|
can_use = Jane.can_use,
|
||||||
use = function(_, card, _, _)
|
use = function(_, card, _, _)
|
||||||
for _ = 1, card.ability.extra.shadows do
|
for _ = 1, math.min(card.ability.extra.shadows, shadows_limit) do
|
||||||
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
|
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
|
||||||
joker:set_edition({negative = true})
|
joker:set_edition({negative = true})
|
||||||
joker.ability.eternal = false
|
joker.ability.eternal = false
|
||||||
|
|
@ -278,11 +248,13 @@ SMODS.Consumable {
|
||||||
G.jokers.cards[i].extra_cost = 0
|
G.jokers.cards[i].extra_cost = 0
|
||||||
G.jokers.cards[i].cost = 0
|
G.jokers.cards[i].cost = 0
|
||||||
G.jokers.cards[i].sell_cost = 0
|
G.jokers.cards[i].sell_cost = 0
|
||||||
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or G.jokers.cards[i].sell_cost
|
|
||||||
|
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or
|
||||||
|
G.jokers.cards[i].sell_cost
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
bulk_use = function(_, card, _, _, number)
|
bulk_use = function(_, card, _, _, number)
|
||||||
for _ = 1, card.ability.extra.shadows * number do
|
for _ = 1, math.min(card.ability.extra.shadows, 25) * number do
|
||||||
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
|
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
|
||||||
joker.no_forced_edition = true
|
joker.no_forced_edition = true
|
||||||
joker:set_edition({negative = true})
|
joker:set_edition({negative = true})
|
||||||
|
|
@ -301,11 +273,12 @@ SMODS.Consumable {
|
||||||
G.jokers.cards[i].extra_cost = 0
|
G.jokers.cards[i].extra_cost = 0
|
||||||
G.jokers.cards[i].cost = 0
|
G.jokers.cards[i].cost = 0
|
||||||
G.jokers.cards[i].sell_cost = 0
|
G.jokers.cards[i].sell_cost = 0
|
||||||
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or G.jokers.cards[i].sell_cost
|
|
||||||
end
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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 = "rift",
|
||||||
|
|
@ -314,34 +287,21 @@ SMODS.Consumable {
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "Rift",
|
name = "Rift",
|
||||||
text = {
|
text = {
|
||||||
"{C:attention}Reset{} your deck to a",
|
"{C:attention}Reset {}your deck to a",
|
||||||
"{C:attention}standard 52-card deck"
|
"{C:attention}standard 52-card deck",
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
cost = 15,
|
|
||||||
pos = {x = 4, y = 4},
|
pos = {x = 4, y = 4},
|
||||||
|
cost = 4,
|
||||||
can_use = Jane.can_use,
|
can_use = Jane.can_use,
|
||||||
use = function(_, _, _, _)
|
use = function(_, _, _, _)
|
||||||
Jane.q(function()
|
Jane.q(function()
|
||||||
for _, v in pairs(G.playing_cards) do
|
for _, v in pairs(G.playing_cards) do
|
||||||
v:start_dissolve()
|
v:start_dissolve()
|
||||||
end
|
end
|
||||||
|
|
||||||
return true
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local function realdelay(time, queue)
|
delay(2)
|
||||||
G.E_MANAGER:add_event(Event({
|
create_full_deck()
|
||||||
trigger = "after",
|
end,
|
||||||
timer = "REAL",
|
|
||||||
delay = time or 1,
|
|
||||||
func = function()
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
}), queue)
|
|
||||||
end
|
|
||||||
|
|
||||||
realdelay(1)
|
|
||||||
createfulldeck()
|
|
||||||
end
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,30 +1,40 @@
|
||||||
|
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!",
|
||||||
|
"Ouch, I think the joke is on me!",
|
||||||
"I won't take up space, I promise!",
|
"I won't take up space, I promise!",
|
||||||
"Don't ask how I ended up in a tarot!",
|
"Don't ask how I ended up in a tarot!",
|
||||||
"Hee-hee, hoo-hoo!",
|
|
||||||
"Who knew even fortunes could be a circus act?",
|
|
||||||
"Looks like the joke is on the crystal globe!",
|
|
||||||
"It's a little cramped in this tarot...!",
|
|
||||||
"Ouch, I think the joke is on me!",
|
|
||||||
"Looks like the joke is on you!",
|
|
||||||
"I'm not just a clown; I'm the whole circus!",
|
|
||||||
"Seems a little suspicious for a jolly old fella like me to be in this card...",
|
|
||||||
"I can't help if I'm still in this silly old card, break me out!",
|
|
||||||
"Let me tell you, you'd love the show going on in this tarot!",
|
|
||||||
"I'd give you more tickets to JimCon, but I'm fresh out.",
|
|
||||||
"I've heard of a round buffoon that lives in a pretty funky town...",
|
|
||||||
"I can't give four mult if I'm still in this card!",
|
|
||||||
"I'm rooting for you! Even if it means I'll never get out of this card...",
|
|
||||||
"Who knew I'd have access to a great show? That show being you!",
|
|
||||||
"The stakes are only gonna rise here!",
|
"The stakes are only gonna rise here!",
|
||||||
"Juggling is one of my favourite passtimes!",
|
|
||||||
"I wonder what's the deal with pairs?",
|
"I wonder what's the deal with pairs?",
|
||||||
|
"It's a little cramped in this tarot...!",
|
||||||
|
"Juggling is one of my favourite passtimes!",
|
||||||
|
"I'm not just a clown; I'm the whole circus!",
|
||||||
|
"Looks like the joke is on the crystal globe!",
|
||||||
|
"Who knew even fortunes could be a circus act?",
|
||||||
|
"Sometimes, an extra four mult goes a long way!",
|
||||||
|
"I can't give four mult if I'm still in this card!",
|
||||||
|
"You wouldn't say no to a free negative me, would you?",
|
||||||
|
"I'd give you more tickets to JimCon, but I'm fresh out.",
|
||||||
|
"Let me tell you, you'd love the show going on in this tarot!",
|
||||||
|
"Who knew I'd have access to a great show? That show being you!",
|
||||||
|
"I can't help if I'm still in this silly old card, break me out!",
|
||||||
|
"I've heard of a round buffoon that lives in a pretty funky town...",
|
||||||
"You don't need to understand math to enjoy watching the digits climb!",
|
"You don't need to understand math to enjoy watching the digits climb!",
|
||||||
"You should meet my friend Joseph; he's stuck in a Planet card!",
|
"I'm rooting for you! Even if it means I'll never get out of this card...",
|
||||||
"M!",
|
"Seems a little suspicious for a jolly old fella like me to be in this card...",
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Consumable {
|
SMODS.Consumable {
|
||||||
|
|
@ -32,20 +42,41 @@ SMODS.Consumable {
|
||||||
atlas = "janeacc",
|
atlas = "janeacc",
|
||||||
set = "Tarot",
|
set = "Tarot",
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "Joker-in-a-Tarot",
|
name = "#1#-in-a-Tarot",
|
||||||
text = {
|
text = {
|
||||||
"Create a {C:dark_edition}Negative {C:attention}default Joker",
|
"Create a {C:dark_edition}Negative {C:attention}#2#",
|
||||||
"{C:inactive,E:1}#1#{}"
|
"after {C:attention}#3# {}uses {C:inactive}(#4# left)",
|
||||||
}
|
"{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 = 3,
|
cost = 4,
|
||||||
can_use = Jane.can_use,
|
can_use = Jane.can_use,
|
||||||
use = function(_, _, _, _)
|
use = function(_, _, _, _)
|
||||||
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_joker", "jokerfromatarot")
|
local uses = get_uses() + 1
|
||||||
|
|
||||||
|
if uses < required then
|
||||||
|
G.GAME.joker_in_a_tarot = uses
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
G.GAME.joker_in_a_tarot = 0
|
||||||
|
local card = create_card("Joker", G.jokers, nil, nil, nil, nil, j(), "jokerfromatarot")
|
||||||
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
|
||||||
|
|
@ -59,5 +90,12 @@ SMODS.Consumable {
|
||||||
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
|
||||||
|
|
|
||||||
146
src/token.lua
146
src/token.lua
|
|
@ -2,7 +2,7 @@ SMODS.Atlas {
|
||||||
key = "janetokens",
|
key = "janetokens",
|
||||||
px = 71,
|
px = 71,
|
||||||
py = 95,
|
py = 95,
|
||||||
path = Jane.config.texture_pack .. "/c_jane_tokens.png"
|
path = Jane.config.texture_pack .. "/c_jane_tokens.png",
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Sound({key = "e_gilded", path = "e_gilded.ogg"})
|
SMODS.Sound({key = "e_gilded", path = "e_gilded.ogg"})
|
||||||
|
|
@ -12,7 +12,7 @@ SMODS.ConsumableType {
|
||||||
default = "c_jane_token_tag_standard",
|
default = "c_jane_token_tag_standard",
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
collection = "Tokens",
|
collection = "Tokens",
|
||||||
name = "Token"
|
name = "Token",
|
||||||
},
|
},
|
||||||
shop_rate = 0,
|
shop_rate = 0,
|
||||||
collection_rows = {5, 6},
|
collection_rows = {5, 6},
|
||||||
|
|
@ -20,64 +20,75 @@ SMODS.ConsumableType {
|
||||||
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_console", "Console", 5, 0, 7},
|
||||||
|
{"tag_cry_loss", "Loss", 0, 1, 12},
|
||||||
{"tag_cry_loss", "Loss", 0, 1, 12},
|
{"tag_cry_bundle", "Bundle", 1, 1, 10},
|
||||||
{"tag_cry_bundle", "Bundle", 1, 1, 10},
|
{"tag_uncommon", "Uncommon", 2, 1, 3},
|
||||||
{"tag_uncommon", "Uncommon", 2, 1, 3},
|
{"tag_rare", "Rare", 3, 1, 5},
|
||||||
{"tag_rare", "Rare", 3, 1, 5},
|
{"tag_cry_epic", "Epic", 4, 1, 8},
|
||||||
{"tag_cry_epic", "Epic", 4, 1, 8},
|
{"tag_cry_gourmond", "Gourmond", 5, 1, 4},
|
||||||
{"tag_cry_gourmond", "Gourmond", 5, 1, 4},
|
{"tag_double", "Double", 0, 2, 6},
|
||||||
|
{"tag_cry_triple", "Triple", 1, 2, 8},
|
||||||
{"tag_double", "Double", 0, 2, 6},
|
{"tag_cry_quadruple", "Quadruple", 2, 2, 10},
|
||||||
{"tag_cry_triple", "Triple", 1, 2, 8},
|
{"tag_cry_quintuple", "Quintuple", 3, 2, 13},
|
||||||
{"tag_cry_quadruple", "Quadruple", 2, 2, 10},
|
{"tag_skip", "Speed", 4, 2, 7},
|
||||||
{"tag_cry_quintuple", "Quintuple", 3, 2, 13},
|
{"tag_economy", "Economy", 5, 2, 10},
|
||||||
{"tag_skip", "Speed", 4, 2, 7},
|
{"tag_investment", "Investment", 0, 3, 8},
|
||||||
{"tag_economy", "Economy", 5, 2, 10},
|
{"tag_foil", "Foil", 1, 3, 3},
|
||||||
|
{"tag_holo", "Holographic", 2, 3, 4},
|
||||||
{"tag_investment", "Investment", 0, 3, 8},
|
{"tag_polychrome", "Polychrome", 3, 3, 5},
|
||||||
{"tag_foil", "Foil", 1, 3, 3},
|
{"tag_negative", "Negative", 4, 3, 10},
|
||||||
{"tag_holo", "Holographic", 2, 3, 4},
|
{"tag_d_six", "Dice", 0, 4, 2},
|
||||||
{"tag_polychrome", "Polychrome", 3, 3, 5},
|
{"tag_orbital", "Orbital", 1, 4, 6},
|
||||||
{"tag_negative", "Negative", 4, 3, 10},
|
{"tag_top_up", "Top-up", 2, 4, 2},
|
||||||
|
{"tag_cry_bettertop_up", "Top-up+", 3, 4, 3},
|
||||||
{"tag_d_six", "Dice", 0, 4, 2},
|
{"tag_coupon", "Coupon", 4, 4, 10},
|
||||||
{"tag_orbital", "Orbital", 1, 4, 6},
|
{"tag_cry_memory", "Memory", 5, 4, 8},
|
||||||
{"tag_top_up", "Top-up", 2, 4, 2},
|
{"tag_garbage", "Garbage", 0, 5, 6},
|
||||||
{"tag_cry_bettertop_up", "Top-up+", 3, 4, 3},
|
{"tag_handy", "Handy", 1, 5, 8},
|
||||||
{"tag_coupon", "Coupon", 4, 4, 10},
|
{"tag_juggle", "Juggle", 2, 5, 2},
|
||||||
{"tag_cry_memory", "Memory", 5, 4, 8},
|
{"tag_cry_schematic", "Schematic", 3, 5, 10},
|
||||||
|
{"tag_voucher", "Voucher", 4, 5, 5},
|
||||||
{"tag_garbage", "Garbage", 0, 5, 6},
|
{"tag_cry_better_voucher", "Voucher+", 5, 5, 7},
|
||||||
{"tag_handy", "Handy", 1, 5, 8},
|
{"tag_cry_gambler", "Gamble", 0, 6, 10},
|
||||||
{"tag_juggle", "Juggle", 2, 5, 2},
|
{"tag_cry_cat", "Cat", 1, 6, 1},
|
||||||
{"tag_cry_schematic", "Schematic", 3, 5, 10},
|
{"tag_cry_mosaic", "Mosaic", 2, 6, 6},
|
||||||
{"tag_voucher", "Voucher", 4, 5, 5},
|
{"tag_cry_glass", "Fragile", 3, 6, 7},
|
||||||
{"tag_cry_better_voucher", "Voucher+", 5, 5, 7},
|
{"tag_cry_astral", "Astral", 4, 6, 8},
|
||||||
|
{"tag_cry_m", "M", 5, 6, 8},
|
||||||
{"tag_cry_gambler", "Gamble", 0, 6, 10},
|
{"tag_cry_blur", "Blurred", 0, 7, 11},
|
||||||
{"tag_cry_cat", "Cat", 1, 6, 1},
|
{"tag_cry_oversat", "Oversaturated", 1, 7, 12},
|
||||||
{"tag_cry_mosaic", "Mosaic", 2, 6, 6},
|
{"tag_cry_glitched", "Glitched", 2, 7, 13},
|
||||||
{"tag_cry_fragile", "Fragile", 3, 6, 7},
|
{"tag_cry_gold", "Golden", 3, 7, 9},
|
||||||
{"tag_cry_astral", "Astral", 4, 6, 8},
|
{"tag_cry_booster", "Booster", 4, 7, 4},
|
||||||
{"tag_cry_m", "M", 5, 6, 8},
|
{"tag_cry_scope", "Scope", 5, 7, 3},
|
||||||
|
{"tag_cry_banana", "Banana", 0, 8, 4},
|
||||||
{"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 {
|
||||||
|
|
@ -86,30 +97,31 @@ for _, v in pairs({
|
||||||
atlas = "janetokens",
|
atlas = "janetokens",
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = v[2] .. " Token",
|
name = v[2] .. " Token",
|
||||||
text = {
|
text = {"Creates a" .. (vowels[v[2]:sub(1, 1)] and "n" or "") .. " {C:attention}" .. v[2] .. " Tag"},
|
||||||
"Use to create a",
|
|
||||||
"{C:attention}" .. v[2] .. " Tag",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
loc_vars = function(_, info_queue, _)
|
||||||
|
info_queue[#info_queue + 1] = v[1] ~= "tag_cry_cat" and G.P_TAGS[v[1]] or nil
|
||||||
|
return {vars = {}}
|
||||||
|
end,
|
||||||
pos = {x = v[3], y = v[4]},
|
pos = {x = v[3], y = v[4]},
|
||||||
cost = v[5],
|
cost = v[5],
|
||||||
can_stack = true,
|
can_stack = true,
|
||||||
can_divide = true,
|
can_divide = true,
|
||||||
can_use = Jane.can_use,
|
can_use = Jane.can_use,
|
||||||
in_pool = function (_, _)
|
in_pool = function(_, _)
|
||||||
return G.GAME.used_vouchers.v_jane_token_voucher
|
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
|
||||||
add_tag(Tag(v[1]))
|
on_token_use(v[1])
|
||||||
end
|
end
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,31 @@
|
||||||
|
SMODS.Atlas {
|
||||||
|
key = "janejollyvoucher",
|
||||||
|
px = 71,
|
||||||
|
py = 95,
|
||||||
|
path = Jane.config.texture_pack .. "/v_jane_jolly_voucher.png",
|
||||||
|
}
|
||||||
|
|
||||||
SMODS.Atlas {
|
SMODS.Atlas {
|
||||||
key = "janetokenvoucher",
|
key = "janetokenvoucher",
|
||||||
px = 71,
|
px = 71,
|
||||||
py = 95,
|
py = 95,
|
||||||
path = Jane.config.texture_pack .. "/v_jane_token_voucher.png"
|
path = Jane.config.texture_pack .. "/v_jane_token_voucher.png",
|
||||||
|
}
|
||||||
|
|
||||||
|
SMODS.Voucher {
|
||||||
|
key = "jolly_voucher",
|
||||||
|
atlas = "janejollyvoucher",
|
||||||
|
loc_txt = {
|
||||||
|
name = "Jolly Voucher",
|
||||||
|
text = {"{C:attention,T:c_jane_jokerinatarot}Joker-in-a-Tarot {}creates", "{C:attention,T:j_jolly}Jolly Joker {}instead"},
|
||||||
|
},
|
||||||
|
pos = {x = 0, y = 0},
|
||||||
|
cost = 8,
|
||||||
|
loc_vars = function(_, info_queue, _)
|
||||||
|
info_queue[#info_queue + 1] = G.P_CENTERS.c_jane_jokerinatarot
|
||||||
|
info_queue[#info_queue + 1] = G.P_CENTERS.j_jolly
|
||||||
|
return {vars = {}}
|
||||||
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
SMODS.Voucher {
|
SMODS.Voucher {
|
||||||
|
|
@ -10,14 +33,11 @@ SMODS.Voucher {
|
||||||
atlas = "janetokenvoucher",
|
atlas = "janetokenvoucher",
|
||||||
loc_txt = {
|
loc_txt = {
|
||||||
name = "Token Voucher",
|
name = "Token Voucher",
|
||||||
text = {
|
text = {"{C:attention}Tokens {}can appear", "in the shop"},
|
||||||
"{C:attention}Tokens {}can appear",
|
|
||||||
"in the shop",
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
pos = {x = 0, y = 0},
|
pos = {x = 0, y = 0},
|
||||||
cost = 15,
|
cost = 15,
|
||||||
redeem = function (_, _)
|
redeem = function(_, _)
|
||||||
G.GAME['jane_tokens_rate'] = 1.5
|
G.GAME["jane_tokens_rate"] = 1.5
|
||||||
end
|
end,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue