Compare commits

...

59 commits
0.1.7 ... main

Author SHA1 Message Date
6ff684ed79
Add new Karma Deck; moving old to Ascension Sleeve; moving old to challenge 2025-12-28 16:22:39 +01:00
8e44deab99
Remove xchips, buff Betmma and Saint, nerf Oxy 2025-10-10 01:14:35 +02:00
023fa306ff
Require 2 uses of Joker in a Tarot from start 2025-08-19 18:28:21 +02:00
63a48ff597
Remove if statement 2025-08-06 00:47:16 +02:00
af75973c0b
Fix moire never appearing in non-cryptid 2025-08-06 00:46:47 +02:00
d131dadae8
Increase odds for jumbo and moire to appear 2025-08-06 00:42:17 +02:00
dd96176c3d
Buff non-cryptid joker-in-a-tarot 2025-07-28 21:45:11 +02:00
f93d8f09e6
Display uses left in Cryptid 2025-07-20 10:06:30 +02:00
ed3303e575
Use escape hatch 2025-06-24 14:32:54 +02:00
93e0a4f6d6
Heavily nerf joker-in-a-tarot 2025-06-24 13:51:14 +02:00
b4834d2c9b
Fix capitalization 2025-05-15 02:21:21 +02:00
571eff1e53
Nerf survivor in non-cryptid to promote more interesting play 2025-05-12 16:59:49 +02:00
91a5163b20
Fix Saint mechanics and Wee phrasing in non-cryptid 2025-05-11 02:49:34 +02:00
9de61821c5
Update .editorconfig 2025-05-02 23:42:40 +02:00
c494379e07
Only apply this to attuned saint 2025-05-02 02:31:48 +02:00
3002fe967f
Fix saint debuff and rot lag 2025-05-02 02:25:38 +02:00
89b072cb45
Include other spectrals 2025-04-29 13:21:52 +02:00
00abcb0c14
Decrease price of Hunter in Cryptid 2025-04-26 21:43:44 +02:00
a2a238be3a
Hunter is now Epic 2025-04-25 03:47:38 +02:00
23a77ed39f
Rebalance on Ephemeris Sleeve 2025-04-25 01:57:52 +02:00
1c592f3878
Add dedicated sleeve sprites 2025-04-25 01:37:47 +02:00
0b6aa8afbb
Negate boolean 2025-04-24 21:32:42 +02:00
7549eb55d9
Add new voucher 2025-04-24 05:02:01 +02:00
151023da0e
Improve We 2025-04-18 23:03:27 +02:00
cf014cb9b7
Add music, make compatible with latest Cryptid 2025-04-18 22:38:37 +02:00
f1e6007cbd
Allow The Wee to be disabled 2025-04-18 00:41:38 +02:00
f6c6066751
Remove redundant print statement 2025-04-17 23:10:12 +02:00
9347fca3cc
Increase potency of Bedrock Sleeve 2025-04-17 17:20:13 +02:00
abf64c33d6
Add doubled deck-sleeve combos, I regret nothing 2025-04-17 01:47:15 +02:00
ff09fc2722
Add 2-sticker as exception to debuffs in The Wee 2025-04-14 15:29:32 +02:00
a061166e36
Add sleeves for each deck 2025-04-13 19:40:06 +02:00
Emik
780814fece
Make moire only trigger when scored 2025-04-13 03:33:26 +02:00
Emik
81695eae8b
Prevent crash from Cryptid's edition deck on Jumbo 2025-04-11 17:23:32 +02:00
Emik
bb5908b042
Nerf non-cryptid saint and moire 2025-04-10 11:32:51 +02:00
Emik
5582920601
Clamp Maxie, The Monk, The Spearmaster, and Shadows to 25 2025-04-10 00:29:47 +02:00
Emik
80b7cd1d47
Fix cryptid token 2025-04-09 20:13:51 +02:00
Emik
a77fb916c7
Fix repetition warning on non-cryptid 2025-04-09 20:09:37 +02:00
Emik
5383f83425
Re-add Orbital Token, fix other token bug, change Moire 2025-04-08 19:57:27 +02:00
Emik
2e661e0b50
Add Moire 2025-04-08 15:02:52 +02:00
Emik
e9090a2a5d
Rephrase and refactor tokens 2025-04-07 17:01:57 +02:00
Emik
e767c7651b
Buff obsidian deck, nerf Betmma, improve localization 2025-04-07 13:43:06 +02:00
Emik
9d8a6991b1
Buff saint and nerf polygloss on non-cryptid 2025-04-07 02:36:57 +02:00
Emik
fbe895ba22
Adjust prices of consumables, remove Orbital Token 2025-04-06 12:40:59 +02:00
Emik
b7e8ca7cb9
Fix non-corrupted oxy 2025-04-05 20:03:02 +02:00
Emik
767d54d2d8
Fix The Hunter description lying to you 2025-04-05 03:40:13 +02:00
Emik
e069cd8f68
Fix The Rot cloning indefinitely, reformat 2025-04-04 22:06:36 +02:00
Emik
bafb18d0c9
Add tons of new content (not jokers) 2025-04-03 00:36:54 +02:00
Emik
d0a9cdfe72
Mark The Hunter incompatible with perishable 2025-04-01 23:09:09 +02:00
Emik
3c98e2cbca
Reset operator appropriately 2025-03-31 16:45:51 +02:00
Emik
98265a1bbe
Fix 2 joker effects 2025-03-30 03:20:45 +02:00
Emik
a879fa12b2
Completely rewrite Honey 2025-03-29 20:40:30 +01:00
Emik
9f5eedb704
Fix non-cryptid formatting 2025-03-28 21:51:34 +01:00
Emik
8c4ce9bb00
Fix index error 2025-03-28 16:39:53 +01:00
Emik
43113e16e2
Do not run check outside of in-game 2025-03-28 16:25:38 +01:00
Emik
39d429e56d
Use more intuitive logic for merging jokers 2025-03-28 16:23:54 +01:00
Emik
0cea7728fe
Move code back into the update function 2025-03-28 16:14:33 +01:00
Emik
0838c558b6
Bump The Wee to ante 2 minimum 2025-03-28 03:31:02 +01:00
Emik
78b5b64f4c
Make text smaller 2025-03-28 00:10:58 +01:00
Emik
0140ff7e79
Delay sprite change 2025-03-28 00:03:44 +01:00
29 changed files with 2527 additions and 975 deletions

171
.editorconfig Normal file
View 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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

151
assets/shaders/moire.fs Normal file
View 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

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/sounds/e_moire.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

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

View file

@ -1,16 +1,21 @@
{
"id": "jane",
"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.",
"prefix": "jane",
"main_file": "src/main.lua",
"badge_colour": "3c3cff",
"priority": 114,
"priority": 114,
"dependencies": [
"Steamodded (>=1.0.0~ALPHA-1304a)",
"Bakery (>=0.1.26~*)"
],
"conflicts": ["Jen"],
"version": "0.1.7"
"conflicts": [
"Jen"
],
"version": "1.5.19"
}

1
refs/CardSleeves Symbolic link
View file

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

File diff suppressed because it is too large Load diff

View file

@ -4,7 +4,7 @@ SMODS.Atlas {
frames = 21,
key = "janeblinds",
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 = {
@ -35,7 +35,7 @@ local function offset_operator(by)
if type(inner) == "table" and
type(inner.config) == "table" and
(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
if inner.config.text ~= txt then
changed_text = true
@ -53,8 +53,6 @@ local function offset_operator(by)
if changed_text then
play_sound("button", 1.1, 0.65)
end
return true
end)
end
@ -62,10 +60,10 @@ local function to_number(x)
return type(x) == "table" and x:to_number() or x
end
SMODS.Blind {
SMODS.Blind {
loc_txt = {
name = "The Descending",
text = {"Decrease Chip-Mult", "operator by 1 level"}
text = {"Decrease Chip-Mult", "operator by 1 level"},
},
key = "descending",
config = {},
@ -77,8 +75,7 @@ SMODS.Blind {
dollars = 6,
defeat = function(_)
if not Cryptid then
G.GAME.operator = 2
offset_operator(0)
offset_operator(2 - Jane.get_operator())
elseif not G.GAME.blind.disabled then
offset_operator(1)
end
@ -101,10 +98,10 @@ SMODS.Blind {
end,
}
SMODS.Blind {
SMODS.Blind {
loc_txt = {
name = "The Insignia",
text = {"Hand must contain", "only one suit"}
text = {"Hand must contain", "only one suit"},
},
key = "insignia",
config = {},
@ -132,22 +129,29 @@ SMODS.Blind {
end,
}
SMODS.Blind {
SMODS.Blind {
loc_txt = {
name = "The Wee",
text = {"Only 2s can be played"}
text = {"Only 2s can be played"},
},
key = "wee",
config = {},
boss = {min = 1, max = 10, no_orb = true, hardcore = true},
boss = {min = 2, max = 10, no_orb = true, hardcore = true},
boss_colour = HEX("7F3F3F"),
atlas = "janeblinds",
pos = {x = 0, y = 3},
vars = {},
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
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
end
end
@ -155,8 +159,10 @@ SMODS.Blind {
get_loc_debuff_text = function(_)
return "Hand must contain only 2s"
end,
recalc_debuff = function(_, card, _)
return card:norank() or card:get_id() ~= 2
recalc_debuff = function(self, card, _)
return not self.disabled and
(card:norank() or card:get_id() ~= 2) and
(card.ability or {}).aikoyori_letters_stickers ~= "2"
end,
set_blind = function(self)
if to_number(self.mult) == 0 then

View file

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

78
src/challenge.lua Normal file
View 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",
}

View file

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

View file

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

View file

@ -2,13 +2,17 @@ Jane = {
config = {
wee_sizemod = 1.25,
texture_pack = "default",
bans = {"j_cry_crustulum", "c_cry_hammerspace"}
bans = {"j_cry_crustulum", "c_cry_hammerspace"},
},
}
Jane.misprintize = (Cryptid or {}).misprintize
Jane.misprintize_tbl = (Cryptid or {}).misprintize_tbl
Jane.misprinitze_val = (Cryptid or {}).misprintize_val
Jane.rarity_ids = Cryptid and {1, 2, 3, "cry_epic", 4, "cry_exotic", "jane_junk"} or {1, 2, 3, 4, "jane_junk"}
Jane.rarity_names = Cryptid and {"Common", "Uncommon", "Rare", "Epic", "Legendary", "Exotic", "Junk"} or
{"Common", "Uncommon", "Rare", "Legendary", "Junk"}
if not Jane.misprintize then
assert(SMODS.load_file("src/misprintize.lua"))()
@ -16,8 +20,8 @@ end
function Jane.can_use()
return not (((G.play and #G.play.cards > 0) or
(G.CONTROLLER.locked) or
(G.GAME.STOP_USE and G.GAME.STOP_USE > 0)) and
(G.CONTROLLER.locked) or
(G.GAME.STOP_USE and G.GAME.STOP_USE > 0)) and
G.STATE ~= G.STATES.HAND_PLAYED and
G.STATE ~= G.STATES.DRAW_TO_HAND and
G.STATE ~= G.STATES.PLAY_TAROT)
@ -37,7 +41,7 @@ function Jane.card_status_text(
sound,
volume,
pitch,
trig,
trigger,
f
)
if (delay or 0) <= 0 then
@ -52,7 +56,7 @@ function Jane.card_status_text(
backdrop_colour = colour or (G.C.FILTER),
align = align or "bm",
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
@ -71,10 +75,8 @@ function Jane.card_status_text(
G.ROOM.jiggle = G.ROOM.jiggle + jiggle
end
else
G.E_MANAGER:add_event(Event({
trigger = trig,
delay = delay,
func = function()
Jane.q(
function()
if f and type(f) == "function" then
f(card)
end
@ -86,11 +88,11 @@ function Jane.card_status_text(
backdrop_colour = colour or (G.C.FILTER),
align = align or "bm",
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
play_sound(sound, pitch or (0.9 + (0.2*math.random())), volume or 1)
play_sound(sound, pitch or (0.9 + (0.2 * math.random())), volume or 1)
end
if juice then
@ -104,17 +106,18 @@ function Jane.card_status_text(
if jiggle then
G.ROOM.jiggle = G.ROOM.jiggle + jiggle
end
return true
end
}))
end,
delay,
nil,
trigger
)
end
end
function Jane.empowered()
if Cryptid then
add_tag(Tag("tag_cry_empowered"))
return true
return
end
local card = create_card("Spectral", G.consumeables, nil, nil, nil, nil, "c_soul", "acceleration_soul")
@ -128,7 +131,7 @@ function Jane.get_chipmult_sum(chips, mult)
mult = mult or 0
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()
if op >= 3 then
@ -149,35 +152,57 @@ function Jane.get_operator()
return math.max(math.min(G.GAME.operator, 3), 1)
end
function Jane.get_small_chipmult_sum(chips, mult)
local ret = Jane.get_chipmult_sum()
return type(ret) == "table" and ret:to_number() or ret
function Jane.hidden(card)
return G.GAME and not G.GAME.obsidian and
(type(card) == "table" and (card.name == "Black Hole" or card.name == "The Soul") or card.hidden)
end
function Jane.hidden(card)
return G.GAME and not
G.GAME.obsidian and
type(card) == 'table' and
(card.name == "Black Hole" or card.name == "The Soul" or card.hidden)
function Jane.is_end_of_ante(context, card)
return not context.individual and not
context.repetition and not
(card or {}).debuff and
context.end_of_round and not
context.blueprint and
G.GAME.blind.boss and not
(G.GAME.blind.config and G.GAME.blind.config.bonus)
end
function Jane.play_sound(sound, per, vol)
G.E_MANAGER:add_event(Event({
func = function()
play_sound(sound,per,vol)
return true
end
}))
Jane.q(function()
play_sound(sound, per, vol)
end)
end
function Jane.q(fc, de, t, tr, bl, ba)
function Jane.resize(card, mod, force_save)
if force_save or not card.origsize then
card.origsize = {w = card.T.w, h = card.T.h}
end
card:hard_set_T(card.T.x, card.T.y, card.T.w * mod, card.T.h * mod)
remove_all(card.children)
card.children = {}
card.children.shadow = Moveable(0, 0, 0, 0)
card:set_sprites(card.config.center, card.base.id and card.config.card)
if card.area and
((G.shop_jokers and card.area == G.shop_jokers) or
(G.shop_booster and card.area == G.shop_booster) or
(G.shop_vouchers and card.area == G.shop_vouchers)) then
create_shop_card_ui(card)
end
end
function Jane.q(func, delay, timer, trigger, blockable, blocking)
G.E_MANAGER:add_event(Event({
timer = t,
trigger = tr,
delay = de,
blockable = bl,
blocking = ba,
func = fc
delay = delay,
timer = timer,
trigger = (delay and not trigger) and "after" or trigger,
blocking = blocking,
blockable = blockable,
func = function(...)
local ret = func(...)
return ret == nil and true or ret
end,
}))
end
@ -193,17 +218,6 @@ function Card:nosuit()
return self.ability.name == "Stone Card" or self.config.center.no_suit
end
local orig_debuff = Card.set_debuff
function Card:set_debuff(should_debuff)
if should_debuff and ((self.config or {}).center or {}).debuff_immune then
Jane.card_status_text(self, "Immune", nil, 0.05 * self.T.h, G.C.RED, nil, 0.6, nil, nil, "bm", "cancel", 1, 0.9)
return false
else
orig_debuff(self, should_debuff)
end
end
local orig_menu = Game.main_menu
function Game:main_menu(change_context)
@ -226,80 +240,11 @@ function Game:update(dt)
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)
if s <= 0 then return v, v, v end
if s <= 0 then
return v, v, v
end
h = h * 6
local c = v * s
local x = (1 - math.abs((h % 2) - 1)) * c
@ -323,15 +268,15 @@ function Game:update(dt)
end
orig_update(self, dt)
local ante = G.GAME.round_resets.ante
local blind = get_blind_amount((ante >= 1 and ante <= 8) and math.floor(ante) or ante)
G.P_BLINDS["bl_jane_wee"].mult = 22 / blind
G.P_BLINDS["bl_jane_descending"].mult = math.floor(8 * math.sqrt(blind)) / blind
Jane.update_honey()
if not Jane.bans_done then
delete_hardbans()
Jane.bans_done = true
delete_hardbans()
end
if (G.GAME or {}).banned_keys then
@ -348,18 +293,6 @@ function Game:update(dt)
self.C.jane_RGB_HUE = (self.C.jane_RGB_HUE + 0.5) % 360
G.ARGS.LOC_COLOURS.jane_RGB = self.C.jane_RGB
end
rebalance_orrery()
end
local orig_card = SMODS.find_card
---@param key string
---@param count_debuffed true?
---@return Card[]|table[]
--- Returns all cards matching provided `key`.
function SMODS.find_card(key, count_debuffed)
return orig_card(key == "j_jen_saint" and "j_jane_saint" or key, count_debuffed)
end
SMODS.Atlas {
@ -380,6 +313,7 @@ for _, v in ipairs({
"back",
"blind",
"booster",
"challenge",
"edition",
"joker",
"slugcat",

View file

@ -1,9 +1,8 @@
-- The following code is slightly adapted from
-- https://github.com/MathIsFun0/Cryptid/blob/main/lib/misprintize.lua
local base_values = {}
local big_num_whitelist = {
local big_num_allowlist = {
j_egg = true,
j_wee = true,
j_flash = true,
@ -102,7 +101,7 @@ local function is_card_big(joker)
return false
end
return big_num_whitelist[center.key or "Nope!"]
return big_num_allowlist[center.key or "Nope!"]
end
local function log_random(seed, min, max)
@ -114,7 +113,6 @@ local function log_random(seed, min, max)
end
function Jane.misprintize_val(val, override, big)
return is_number(val) and check(
format(
val * log_random(
@ -153,30 +151,30 @@ function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack,
tbl[k] = check(
clear and base_values[name][k]
or format(
(stack and tbl[k] or base_values[name][k])
* log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max
),
"%.2g"
or format(
(stack and tbl[k] or base_values[name][k])
* log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max
),
"%.2g"
),
big
)
end
else
for _k, _ in pairs(tbl[k]) do
if is_number(tbl[k][_k]) and not
(_k == "id") and not
(k == "perish_tally") and not
(k == "colour") and not
(_k == "suit_nominal") and not
(_k == "base_nominal") and not
(_k == "face_nominal") and not
(_k == "qty") and not
(k == "x_mult" and v == 1 and not tbl[k].override_x_mult_check) and not
(_k == "selected_d6_face") then
(_k == "id") and not
(k == "perish_tally") and not
(k == "colour") and not
(_k == "suit_nominal") and not
(_k == "base_nominal") and not
(_k == "face_nominal") and not
(_k == "qty") and not
(k == "x_mult" and v == 1 and not tbl[k].override_x_mult_check) and not
(_k == "selected_d6_face") then
if not base_values[name] then
base_values[name] = {}
end
@ -191,15 +189,15 @@ function Jane.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack,
tbl[k][_k] = check(
clear and base_values[name][k][_k]
or format(
(stack and tbl[k][_k] or base_values[name][k][_k]) *
log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max
),
"%.2g"
or format(
(stack and tbl[k][_k] or base_values[name][k][_k]) *
log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max
),
"%.2g"
),
big
)
end
@ -247,10 +245,11 @@ function Jane.misprintize(card, override, force_reset, stack)
end)
end
end
if (not force_reset or G.GAME.modifiers.cry_jkr_misprint_mod) and
(G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker") and not
stack or not
no(card, "immutable", true) then
no(card, "immutable", true) then
if card.ability.name == "Ace Aequilibrium" then
return
end

View file

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

View file

@ -2,7 +2,7 @@ SMODS.Atlas {
key = "janertarots",
px = 71,
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"})
@ -12,61 +12,51 @@ local function conjure(card, number)
math.ceil(card.ability.extra.spectrals) * number,
G.consumeables.config.card_limit - #G.consumeables.cards
) do
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.4,
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
Jane.q(function()
if G.consumeables.config.card_limit <= #G.consumeables.cards then
return
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
local function createfulldeck(enhancement, edition, amount, emplacement)
local function create_full_deck(enhancement, edition, amount, emplacement)
local cards = {}
for _, v in pairs(G.P_CARDS) do
for i = 1, (amount or 1) do
G.E_MANAGER:add_event(Event({
delay = 0.1,
func = function()
cards[i] = true
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
for i = 1, amount or 1 do
Jane.q(function()
cards[i] = true
G.playing_card = (G.playing_card and G.playing_card + 1) or 1
local card = Card(
G.play.T.x + G.play.T.w / 2,
G.play.T.y, G.CARD_W, G.CARD_H,
v,
enhancement or G.P_CENTERS.c_base,
{playing_card = G.playing_card}
)
local card = Card(
G.play.T.x + G.play.T.w / 2,
G.play.T.y, G.CARD_W, G.CARD_H,
v,
enhancement or G.P_CENTERS.c_base,
{playing_card = G.playing_card}
)
if edition then
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
if edition then
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
end, 0.1)
end
end
@ -74,13 +64,6 @@ local function createfulldeck(enhancement, edition, amount, emplacement)
if next(cards) then
playing_card_joker_effects(cards)
end
return true
end)
Jane.q(function()
cards = nil
return true
end)
end
@ -90,7 +73,7 @@ local function randomize(targets, noanim)
end
if noanim then
for i=1, #targets do
for i = 1, #targets do
local card = targets[i]
card:set_base(pseudorandom_element(G.P_CARDS))
@ -125,16 +108,11 @@ local function randomize(targets, noanim)
for i = 1, #targets do
local percent = 1.15 - (i - 0.999) / (#G.hand.cards - 0.998) * 0.3
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.15,
func = function()
targets[i]:flip()
play_sound("card1", percent)
targets[i]:juice_up(0.3, 0.3)
return true
end
}))
Jane.q(function()
targets[i]:flip()
play_sound("card1", percent)
targets[i]:juice_up(0.3, 0.3)
end, 0.15)
end
delay(0.2)
@ -142,39 +120,34 @@ local function randomize(targets, noanim)
for i = 1, #targets do
local percent = 0.85 + (i - 0.999) / (#G.hand.cards - 0.998) * 0.3
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.1,
func = function()
local card = targets[i]
card:set_base(pseudorandom_element(G.P_CARDS))
card:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"]))
Jane.q(function()
local card = targets[i]
card:set_base(pseudorandom_element(G.P_CARDS))
card:set_ability(pseudorandom_element(G.P_CENTER_POOLS["Enhanced"]))
local edition_rate = 2
card:set_edition(poll_edition("standard_edition" .. G.GAME.round_resets.ante, edition_rate, true))
local seal_rate = 10
local seal_poll = pseudorandom(pseudoseed("stdseal" .. G.GAME.round_resets.ante))
local edition_rate = 2
card:set_edition(poll_edition("standard_edition" .. G.GAME.round_resets.ante, edition_rate, true))
local seal_rate = 10
local seal_poll = pseudorandom(pseudoseed("stdseal" .. G.GAME.round_resets.ante))
if seal_poll > 1 - 0.02 * seal_rate then
local seal_type = pseudorandom(pseudoseed("stdsealtype" .. G.GAME.round_resets.ante))
local seal_list = {}
if seal_poll > 1 - 0.02 * seal_rate then
local seal_type = pseudorandom(pseudoseed("stdsealtype" .. G.GAME.round_resets.ante))
local seal_list = {}
for k, _ in pairs(G.P_SEALS) do
table.insert(seal_list, k)
end
seal_type = math.floor(seal_type * #seal_list)
card:set_seal(seal_list[seal_type])
else
card:set_seal()
for k, _ in pairs(G.P_SEALS) do
table.insert(seal_list, k)
end
card:flip()
play_sound("card3", percent, 0.6)
card:juice_up(0.3, 0.3)
return true
seal_type = math.floor(seal_type * #seal_list)
card:set_seal(seal_list[seal_type])
else
card:set_seal()
end
}))
card:flip()
play_sound("card3", percent, 0.6)
card:juice_up(0.3, 0.3)
end, 0.1)
end
end
end
@ -189,7 +162,7 @@ SMODS.Consumable {
"{C:green,E:1}Randomises{} all cards in hand",
"{C:inactive}(Rank, seal, edition,",
"{C:inactive}enhancement, and suit)",
}
},
},
pos = {x = 0, y = 4},
cost = 4,
@ -197,19 +170,14 @@ SMODS.Consumable {
return Jane.can_use() and #((G.hand or {}).cards or {}) > 0
end,
use = function(_, card, _, _)
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.4,
func = function()
play_sound("tarot1")
card:juice_up(0.3, 0.5)
return true
end
}))
Jane.q(function()
play_sound("tarot1")
card:juice_up(0.3, 0.5)
end, 0.4)
randomize(G.hand.cards)
delay(0.5)
end
end,
}
SMODS.Consumable {
@ -220,14 +188,14 @@ SMODS.Consumable {
name = "Conjure",
text = {
"Creates {C:attention}#1#",
"{C:spectral}Spectral{} cards",
"{C:spectral}Spectral {}cards",
"{C:inactive}(Must have room)",
}
},
},
config = {extra = {spectrals = 2}},
pos = {x = 2, y = 4},
cost = 4,
loc_vars = function(self, info_queue, center)
loc_vars = function(_, _, center)
return {vars = {math.ceil(center.ability.extra.spectrals)}}
end,
can_use = Jane.can_use,
@ -238,9 +206,11 @@ SMODS.Consumable {
bulk_use = function(_, card, _, _, number)
conjure(card, number)
delay(0.6)
end
end,
}
local shadows_limit = 25
SMODS.Consumable {
key = "shadows",
set = "Spectral",
@ -249,19 +219,19 @@ SMODS.Consumable {
name = "Shadows",
text = {
"Create {C:attention}#1#{} {C:green}random {C:dark_edition}Negative",
"{C:attention}Perishable {C:attention}Jokers{}, set",
"{C:money}sell value{} of {C:attention}all Jokers{} to {C:money}$0",
}
"{C:attention}Perishable {C:attention}Jokers{}, set {C:money}sell",
"{C:money}value {}of {C:attention}all Jokers {}to {C:money}$0",
},
},
config = {extra = {shadows = 2}},
pos = {x = 3, y = 4},
cost = 4,
loc_vars = function(_, _, center)
return {vars = {((center.ability or {}).extra or {}).shadows or 2}}
loc_vars = function(_, _, card)
return {vars = {math.min(((card.ability or {}).extra or {}).shadows or 2, shadows_limit)}}
end,
can_use = Jane.can_use,
use = function(_, card, _, _)
for _ = 1, 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")
joker:set_edition({negative = true})
joker.ability.eternal = false
@ -278,11 +248,13 @@ SMODS.Consumable {
G.jokers.cards[i].extra_cost = 0
G.jokers.cards[i].cost = 0
G.jokers.cards[i].sell_cost = 0
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or G.jokers.cards[i].sell_cost
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or
G.jokers.cards[i].sell_cost
end
end,
bulk_use = function(_, card, _, _, number)
for _ = 1, card.ability.extra.shadows * number do
for _ = 1, math.min(card.ability.extra.shadows, 25) * number do
local joker = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "phantom")
joker.no_forced_edition = true
joker:set_edition({negative = true})
@ -301,54 +273,35 @@ SMODS.Consumable {
G.jokers.cards[i].extra_cost = 0
G.jokers.cards[i].cost = 0
G.jokers.cards[i].sell_cost = 0
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or G.jokers.cards[i].sell_cost
G.jokers.cards[i].sell_cost_label = G.jokers.cards[i].facing == "back" and "?" or
G.jokers.cards[i].sell_cost
end
end
end,
}
SMODS.Consumable {
key = "reverse_hanged_man",
atlas = "janertarots",
key = "rift",
atlas = "janeacc",
set = "Spectral",
loc_txt = {
name = "Zen",
name = "Rift",
text = {
"{C:attention}Reset{} your deck to",
"a {C:attention}standard 52-card deck"
}
"{C:attention}Reset {}your deck to a",
"{C:attention}standard 52-card deck",
},
},
config = {extra = {destruction = 0.5}},
pos = {x = 7, y = 1},
cost = 15,
loc_vars = function(_, _, center)
return {vars = {
math.min(100, center.ability.extra.destruction * 100),
math.ceil(#(G.playing_cards or {}) * center.ability.extra.destruction)
}}
end,
pos = {x = 4, y = 4},
cost = 4,
can_use = Jane.can_use,
use = function(_, _, _, _)
Jane.q(function()
for _, v in pairs(G.playing_cards) do
v:start_dissolve()
end
return true
end)
local function realdelay(time, queue)
G.E_MANAGER:add_event(Event({
trigger = "after",
timer = "REAL",
delay = time or 1,
func = function()
return true
end
}), queue)
end
realdelay(1)
createfulldeck()
end
delay(2)
create_full_deck()
end,
}

View file

@ -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 = {
"M!",
"Hey! Pick me!",
"You wouldn't say no to a free negative me, would you?",
"Sometimes, an extra four mult goes a long way!",
"Hee-hee, hoo-hoo!",
"Looks like the joke is on you!",
"Ouch, I think the joke is on me!",
"I won't take up space, I promise!",
"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!",
"Juggling is one of my favourite passtimes!",
"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 should meet my friend Joseph; he's stuck in a Planet card!",
"M!",
"I'm rooting for you! Even if it means I'll never get out of this card...",
"Seems a little suspicious for a jolly old fella like me to be in this card...",
}
SMODS.Consumable {
@ -32,20 +42,41 @@ SMODS.Consumable {
atlas = "janeacc",
set = "Tarot",
loc_txt = {
name = "Joker-in-a-Tarot",
name = "#1#-in-a-Tarot",
text = {
"Create a {C:dark_edition}Negative {C:attention}default Joker",
"{C:inactive,E:1}#1#{}"
}
"Create a {C:dark_edition}Negative {C:attention}#2#",
"after {C:attention}#3# {}uses {C:inactive}(#4# left)",
"{C:inactive,E:1}#5#{}",
},
},
loc_vars = function(_, _, _)
return {vars = {blurbs[math.random(#blurbs)]}}
loc_vars = function(_, info_queue, card)
info_queue[#info_queue + 1] = G.P_CENTERS[j()]
local is_jolly = G.GAME.used_vouchers.v_jane_jolly_voucher
card.blurb = not card.fake_card and
(card.blurb or pseudorandom_element(blurbs, pseudoseed("jokerinatarotblurbs"))) or ""
if is_jolly then
card.blurb = card.blurb:gsub("four", "eight")
end
local desc = is_jolly and "Jolly Joker" or "default Joker"
local name = is_jolly and "Jolly" or "Joker"
return {vars = {name, desc, required, required - get_uses(), card.blurb}}
end,
pos = {x = 0, y = 1},
cost = 3,
cost = 4,
can_use = Jane.can_use,
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.cost = 1
card.base_cost = 1
@ -59,5 +90,12 @@ SMODS.Consumable {
for _ = 1, number do
self:use(card, area, copier)
end
end
end,
}
if Cryptid then
Cryptid.aliases["joker in a tarot"] = "c_jane_jokerinatarot"
Cryptid.aliases["joker-in-a-tarot"] = "c_jane_jokerinatarot"
Cryptid.aliases["jolly in a tarot"] = "c_jane_jokerinatarot"
Cryptid.aliases["jolly-in-a-tarot"] = "c_jane_jokerinatarot"
end

View file

@ -2,7 +2,7 @@ SMODS.Atlas {
key = "janetokens",
px = 71,
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"})
@ -12,43 +12,83 @@ SMODS.ConsumableType {
default = "c_jane_token_tag_standard",
loc_txt = {
collection = "Tokens",
name = "Token"
name = "Token",
},
shop_rate = 0,
collection_rows = {6, 6},
collection_rows = {5, 6},
primary_colour = G.C.CHIPS,
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({
{"tag_standard", "Standard", 0, 0, 3},
{"tag_charm", "Charm", 1, 0, 5},
{"tag_meteor", "Meteor", 2, 0, 5},
{"tag_ethereal", "Ethereal", 3, 0, 5},
{"tag_buffoon", "Buffoon", 4, 0, 8},
{"tag_cry_bundle", "Bundle", 1, 1, 10},
{"tag_uncommon", "Uncommon", 2, 1, 3},
{"tag_rare", "Rare", 3, 1, 5},
{"tag_cry_epic", "Epic", 4, 1, 8},
{"tag_foil", "Foil", 1, 3, 3},
{"tag_holo", "Holographic", 2, 3, 4},
{"tag_polychrome", "Polychrome", 3, 3, 5},
{"tag_negative", "Negative", 4, 3, 10},
{"tag_investment", "Investment", 0, 3, 8},
{"tag_voucher", "Voucher", 4, 5, 5},
{"tag_handy", "Handy", 1, 5, 8},
{"tag_garbage", "Garbage", 0, 5, 6},
{"tag_coupon", "Coupon", 4, 4, 10},
{"tag_juggle", "Juggle", 2, 5, 2},
{"tag_d_six", "Dice", 0, 4, 2},
{"tag_top_up", "Top-up", 2, 4, 2},
{"tag_skip", "Speed", 4, 2, 7},
{"tag_economy", "Economy", 5, 2, 10},
{"tag_double", "Double", 0, 2, 6},
{"tag_cry_triple", "Triple", 1, 2, 8},
{"tag_cry_quadruple", "Quadruple", 2, 2, 10},
{"tag_cry_quintuple", "Quintuple", 3, 2, 13},
{"tag_cry_memory", "Memory", 5, 4, 8}
{"tag_standard", "Standard", 0, 0, 3},
{"tag_charm", "Charm", 1, 0, 5},
{"tag_meteor", "Meteor", 2, 0, 5},
{"tag_ethereal", "Ethereal", 3, 0, 5},
{"tag_buffoon", "Buffoon", 4, 0, 8},
{"tag_cry_console", "Console", 5, 0, 7},
{"tag_cry_loss", "Loss", 0, 1, 12},
{"tag_cry_bundle", "Bundle", 1, 1, 10},
{"tag_uncommon", "Uncommon", 2, 1, 3},
{"tag_rare", "Rare", 3, 1, 5},
{"tag_cry_epic", "Epic", 4, 1, 8},
{"tag_cry_gourmond", "Gourmond", 5, 1, 4},
{"tag_double", "Double", 0, 2, 6},
{"tag_cry_triple", "Triple", 1, 2, 8},
{"tag_cry_quadruple", "Quadruple", 2, 2, 10},
{"tag_cry_quintuple", "Quintuple", 3, 2, 13},
{"tag_skip", "Speed", 4, 2, 7},
{"tag_economy", "Economy", 5, 2, 10},
{"tag_investment", "Investment", 0, 3, 8},
{"tag_foil", "Foil", 1, 3, 3},
{"tag_holo", "Holographic", 2, 3, 4},
{"tag_polychrome", "Polychrome", 3, 3, 5},
{"tag_negative", "Negative", 4, 3, 10},
{"tag_d_six", "Dice", 0, 4, 2},
{"tag_orbital", "Orbital", 1, 4, 6},
{"tag_top_up", "Top-up", 2, 4, 2},
{"tag_cry_bettertop_up", "Top-up+", 3, 4, 3},
{"tag_coupon", "Coupon", 4, 4, 10},
{"tag_cry_memory", "Memory", 5, 4, 8},
{"tag_garbage", "Garbage", 0, 5, 6},
{"tag_handy", "Handy", 1, 5, 8},
{"tag_juggle", "Juggle", 2, 5, 2},
{"tag_cry_schematic", "Schematic", 3, 5, 10},
{"tag_voucher", "Voucher", 4, 5, 5},
{"tag_cry_better_voucher", "Voucher+", 5, 5, 7},
{"tag_cry_gambler", "Gamble", 0, 6, 10},
{"tag_cry_cat", "Cat", 1, 6, 1},
{"tag_cry_mosaic", "Mosaic", 2, 6, 6},
{"tag_cry_glass", "Fragile", 3, 6, 7},
{"tag_cry_astral", "Astral", 4, 6, 8},
{"tag_cry_m", "M", 5, 6, 8},
{"tag_cry_blur", "Blurred", 0, 7, 11},
{"tag_cry_oversat", "Oversaturated", 1, 7, 12},
{"tag_cry_glitched", "Glitched", 2, 7, 13},
{"tag_cry_gold", "Golden", 3, 7, 9},
{"tag_cry_booster", "Booster", 4, 7, 4},
{"tag_cry_scope", "Scope", 5, 7, 3},
{"tag_cry_banana", "Banana", 0, 8, 4},
}) do
if Cryptid or v[1]:sub(1, 7) ~= "tag_cry" then
SMODS.Consumable {
@ -57,30 +97,31 @@ for _, v in pairs({
atlas = "janetokens",
loc_txt = {
name = v[2] .. " Token",
text = {
"Use to create a",
"{C:attention}" .. v[2] .. " Tag",
},
text = {"Creates a" .. (vowels[v[2]:sub(1, 1)] and "n" or "") .. " {C:attention}" .. v[2] .. " Tag"},
},
loc_vars = function(_, info_queue, _)
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]},
cost = v[5],
can_stack = true,
can_divide = true,
can_use = Jane.can_use,
in_pool = function (_, _)
in_pool = function(_, _)
return G.GAME.used_vouchers.v_jane_token_voucher
end,
use = function(_, _, _, _)
play_sound("jane_e_gilded", 1.25, 0.4)
add_tag(Tag(v[1]))
on_token_use(v[1])
end,
bulk_use = function(_, _, _, _, number)
play_sound("jane_e_gilded", 1.25, 0.4)
for _ = 1, number do
add_tag(Tag(v[1]))
on_token_use(v[1])
end
end
end,
}
end
end

View file

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