updated cryptid, smods and talisman

This commit is contained in:
Vomitblood 2025-09-07 00:12:02 +08:00
parent 05714498d6
commit e449b45387
235 changed files with 43460 additions and 15135 deletions

2
Cryptid/.gitignore vendored
View file

@ -2,3 +2,5 @@
.vscode/*
.luarc.json
.lovelyignore
.idea/*
*.diff

View file

@ -9,13 +9,16 @@
"priority": 114,
"badge_colour": "708b91",
"badge_text_colour": "FFFFFF",
"version": "0.5.5b",
"version": "0.5.12a",
"dependencies": [
"Talisman (>=2.0.9)",
"Steamodded (>=1.0.0~BETA-0314c)"
"Talisman (>=2.2.0a)",
"Steamodded (>=1.0.0~BETA-0827)"
],
"conflicts": [
"Saturn",
"AntePreview (>= 2.0.0~0c16a) (<<3.0.0)"
"AntePreview (>= 2.0.0~0c16a) (<<3.0.0)",
"Cartomancer (<= 4.11)"
],
"provides": [
"Cryptlib"
]
}

View file

@ -8,19 +8,23 @@ if not Cryptid then
end
local mod_path = "" .. SMODS.current_mod.path -- this path changes when each mod is loaded, but the local variable will retain Cryptid's path
Cryptid.path = mod_path
Cryptid_config = SMODS.current_mod.config
Cryptid_config = SMODS.current_mod.config or {} --is this nil check needed? idk but i saw crash reports related to this
-- Lovely Patch Target, toggles being able to change gameset config. Here for mod support
Cryptid_config.gameset_toggle = true
-- Enable optional features
SMODS.current_mod.optional_features = {
retrigger_joker = true,
post_trigger = true,
quantum_enhancements = false,
-- Here are some other ones Steamodded has
-- Cryptid doesn't use them YET, but these should be uncommented if Cryptid uses them
-- These ones add new card areas that Steamodded will calculate through
-- Might already be useful for sticker calc
-- Cryptid uses cardarea deck now
cardareas = {
--deck = true,
deck = true,
discard = true, -- used by scorch
},
}
@ -124,7 +128,7 @@ end
-- either in [Mod]/Cryptid.lua or [Mod]/Cryptid/*.lua
for _, mod in pairs(SMODS.Mods) do
-- Note: Crashes with lone lua files
if mod.path and mod.id ~= "Cryptid" then
if not mod.disabled and mod.path and mod.id ~= "Cryptid" then
local path = mod.path
local files = NFS.getDirectoryItems(path)
for _, file in ipairs(files) do
@ -182,6 +186,74 @@ function SMODS.injectItems(...)
end
end
end
if G.PROFILES[G.SETTINGS.profile].all_unlocked then
G.PROFILES[G.SETTINGS.profile].cry_none = (Cryptid.enabled("set_cry_poker_hand_stuff") == true)
end
G.P_CENTERS.j_stencil.immutable = true
G.P_CENTERS.j_four_fingers.immutable = true
G.P_CENTERS.j_mime.immutable = true
G.P_CENTERS.j_ceremonial.immutable = true
G.P_CENTERS.j_marble.immutable = true
G.P_CENTERS.j_dusk.immutable = true
G.P_CENTERS.j_raised_fist.immutable = true
G.P_CENTERS.j_chaos.immutable = true
G.P_CENTERS.j_hack.immutable = true
G.P_CENTERS.j_pareidolia.immutable = true
G.P_CENTERS.j_supernova.immutable = true
G.P_CENTERS.j_space.immutable = true
G.P_CENTERS.j_dna.immutable = true
G.P_CENTERS.j_splash.immutable = true
G.P_CENTERS.j_sixth_sense.immutable = true
G.P_CENTERS.j_superposition.immutable = true
G.P_CENTERS.j_seance.immutable = true
G.P_CENTERS.j_riff_raff.immutable = true
G.P_CENTERS.j_shortcut.immutable = true
G.P_CENTERS.j_midas_mask.immutable = true
G.P_CENTERS.j_luchador.immutable = true
G.P_CENTERS.j_fortune_teller.immutable = true
G.P_CENTERS.j_diet_cola.immutable = true
G.P_CENTERS.j_mr_bones.immutable = true
G.P_CENTERS.j_sock_and_buskin.immutable = true
G.P_CENTERS.j_swashbuckler.immutable = true
G.P_CENTERS.j_certificate.immutable = true
G.P_CENTERS.j_smeared.immutable = true
G.P_CENTERS.j_ring_master.immutable = true
G.P_CENTERS.j_blueprint.immutable = true
G.P_CENTERS.j_oops.immutable = true
G.P_CENTERS.j_invisible.immutable = true
G.P_CENTERS.j_brainstorm.immutable = true
G.P_CENTERS.j_shoot_the_moon.immutable = true
G.P_CENTERS.j_cartomancer.immutable = true
G.P_CENTERS.j_astronomer.immutable = true
G.P_CENTERS.j_burnt.immutable = true
G.P_CENTERS.j_chicot.immutable = true
G.P_CENTERS.j_perkeo.immutable = true
G.P_CENTERS.j_hanging_chad.misprintize_caps = { extra = 40 }
G.P_CENTERS.c_high_priestess.misprintize_caps = { planets = 100 }
G.P_CENTERS.c_emperor.misprintize_caps = { tarots = 100 }
G.P_CENTERS.c_familiar.misprintize_caps = { extra = 100 }
G.P_CENTERS.c_grim.misprintize_caps = { extra = 100 }
G.P_CENTERS.c_incantation.misprintize_caps = { extra = 100 }
G.P_CENTERS.c_immolate.misprintize_caps = { destroy = 1e300 }
G.P_CENTERS.c_cryptid.misprintize_caps = { extra = 100, max_highlighted = 100 }
G.P_CENTERS.c_immolate.misprintize_caps = { destroy = 1e300 }
Cryptid.inject_pointer_aliases()
--this has to be here because the colors dont exist earlier then this
Cryptid.circus_rarities["rare"] = { rarity = 3, base_mult = 2, order = 1, colour = G.C.RARITY.Rare }
Cryptid.circus_rarities["epic"] = { rarity = "cry_epic", base_mult = 3, order = 2, colour = G.C.RARITY.cry_epic }
Cryptid.circus_rarities["legendary"] = { rarity = 4, base_mult = 4, order = 3, colour = G.C.RARITY.Legendary }
Cryptid.circus_rarities["exotic"] =
{ rarity = "cry_exotic", base_mult = 20, order = 4, colour = G.C.RARITY.cry_exotic }
Cryptid.reload_localization()
end
local old_repitions = SMODS.calculate_repetitions
SMODS.calculate_repetitions = function(card, context, reps)
local reps = old_repitions(card, context, reps)
reps = reps or { 1 }
return reps
end
local cryptidConfigTab = function()

View file

@ -2,7 +2,7 @@
# Cryptid
An unbalanced Balatro mod.
Note: Cryptid requires [Steamodded **1.0.0~BETA-0314c**](https://github.com/Steamopollys/Steamodded/archive/refs/heads/main.zip) and [Talisman](https://github.com/MathIsFun0/Talisman/releases/latest).
Note: Cryptid requires [Steamodded](https://github.com/Steamodded/smods/releases/latest) and [Talisman](https://github.com/SpectralPack/Talisman/releases/latest).
Cryptid currently adds:
@ -11,7 +11,7 @@ Cryptid currently adds:
![image](https://github.com/user-attachments/assets/2441010d-1f0d-4b3f-80f7-de45e071ad06)
### [Official Discord](https://discord.gg/cryptid)
### [Official Discord](https://discord.gg/eUf9Ur6RyB)
### [Mac Video Installation Guide](https://youtu.be/l5ni7fHgwTE?si=GAN5t5-y_IuEv8uA)
### [Not Mac Video Installation Guide](https://www.youtube.com/watch?v=aUr0gXE77rk)
@ -23,11 +23,8 @@ Cryptid currently adds:
> *My game is crashing on startup/something doesn't appear to be loading!*
Make sure everything is properly installed.
For Talisman, the folder that contains Talisman should be named `Talisman`. If you've downloaded the source code from GitHub (by clicking on [Code] and then [Download ZIP]), the folder within the ZIP may be called `Talisman-main`, which will cause a problem. Simply rename the folder(s) so that the `-main` part of the name is removed, so that the folder is just called `Talisman`.
Whenever you are manually updating Talisman or Cryptid, or any other mod for that matter, it's a good approach to instead delete the contents of the folder, then install the contents of the folder from the ZIP into the existing folder to avoid having to constantly rename the folder over and over.
For automatic updates, try using the [automatic update script](https://discord.com/channels/1264429948970733782/1268911536638787625).
It could also be that Steamodded is out of date, sometimes mods may use features of a new version that's absent in an older version, but don't change the version that they ask for.
You can grab the latest Steamodded by [clicking here](https://github.com/Steamopollys/Steamodded/archive/refs/heads/main.zip).
> *I can't see any new jokers/content!*
@ -40,12 +37,12 @@ If they show up red, that means there's a problem. Hover over the mod icon (whic
> *There's some content in the mod I don't like! Is there any way to remove them?*
You can disable some features of the mod by opening your Settings, going over to the Spectral Pack tab, clicking [Cryptid], then checking/unchecking what you want.
You can also enable/disable certain music tracks. If you're a streamer, consider disabling the Jimball music for your safety!
You can disable some features of the mod by opening your Mods, clicking [Cryptid], going over to the Config tab, and clicking Thematic Sets. There, you can toggle various Cryptid additions on or off as you see fit.
You can also enable/disable certain music tracks in the Music tab. If you're a streamer, consider disabling the Jimball music for your safety!
> *I'm hitting infinity very often, is there any way to raise the limit of the scoring system?*
Talisman may be configured to be on **BigNum** mode, which has a maximum limit of ee308. You can make the limit virtually disappear by changing it to **OmegaNum**, which can handle e10##1000. You can configure it the same way; going into Settings, then the Spectral Pack tab, then Talisman. Be careful; if you have a saved run that was on a different number system, you won't be able to load it (unless if you switch back)!
Talisman may be configured to be on **BigNum** mode, which has a maximum limit of ee308. You can make the limit virtually disappear by changing it to **OmegaNum**, which can handle e10##1000. You can configure it by going into Mods, then clicking Talisman, and changing the Score Limit under Config. Be careful; if you have a saved run that was on a different number system, you won't be able to load it (unless if you switch back)!
> *I've experienced a crash/bug!*

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 135 KiB

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 KiB

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 211 KiB

After

Width:  |  Height:  |  Size: 210 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 247 KiB

After

Width:  |  Height:  |  Size: 268 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -12,6 +12,9 @@ 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;
extern MY_HIGHP_OR_MEDIUMP vec2 mouse_screen_pos;
extern MY_HIGHP_OR_MEDIUMP float hovering;
extern MY_HIGHP_OR_MEDIUMP float screen_scale;
vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
{
@ -94,20 +97,144 @@ vec4 HSL(vec4 c)
return hsl;
}
vec4 RGBtoHSV(vec4 rgb)
{
vec4 hsv;
float minVal = min(min(rgb.r, rgb.g), rgb.b);
float maxVal = max(max(rgb.r, rgb.g), rgb.b);
float delta = maxVal - minVal;
// Value
hsv.z = maxVal;
// Saturation
if (maxVal != 0.0)
hsv.y = delta / maxVal;
else {
// r = g = b = 0, s = 0, v is undefined
hsv.y = 0.0;
hsv.x = -1.0;
return hsv;
}
// Hue
if (rgb.r == maxVal)
hsv.x = (rgb.g - rgb.b) / delta; // between yellow & magenta
else if (rgb.g == maxVal)
hsv.x = 2.0 + (rgb.b - rgb.r) / delta; // between cyan & yellow
else
hsv.x = 4.0 + (rgb.r - rgb.g) / delta; // between magenta & cyan
hsv.x = hsv.x * (1.0 / 6.0);
if (hsv.x < 0.0)
hsv.x += 1.0;
// Alpha
hsv.w = rgb.a;
return hsv;
}
vec4 HSVtoRGB(vec4 hsv) {
vec4 rgb;
float h = hsv.x * 6.0;
float c = hsv.z * hsv.y;
float x = c * (1.0 - abs(mod(h, 2.0) - 1.0));
float m = hsv.z - c;
if (h < 1.0) {
rgb = vec4(c, x, 0.0, hsv.a);
} else if (h < 2.0) {
rgb = vec4(x, c, 0.0, hsv.a);
} else if (h < 3.0) {
rgb = vec4(0.0, c, x, hsv.a);
} else if (h < 4.0) {
rgb = vec4(0.0, x, c, hsv.a);
} else if (h < 5.0) {
rgb = vec4(x, 0.0, c, hsv.a);
} else {
rgb = vec4(c, 0.0, x, hsv.a);
}
rgb.rgb += m;
return rgb;
}
float bitxor(float val1, float val2)
{
float outp = 0.;
for(float i = 1.; i < 9.; i++) outp += floor(mod(mod(floor(val1*pow(2.,-i)),pow(2.,i))+mod(floor(val2*pow(2.,-i)),pow(2.,i)),2.))*pow(2.,i);
return outp/256.;
}
float mod2(float val1, float mod1)
{
val1 /= mod1;
val1 -= floor(val1);
return(mod1 * val1);
}
#define PI 3.14159265358979323846
float rand(vec2 c){
return fract(sin(dot(c.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
float noise(vec2 p, float freq ){
float unit = 1./freq;
vec2 ij = floor(p/unit);
vec2 xy = mod(p,unit)/unit;
//xy = 3.*xy*xy-2.*xy*xy*xy;
xy = .5*(1.-cos(PI*xy));
float a = rand((ij+vec2(0.,0.)));
float b = rand((ij+vec2(1.,0.)));
float c = rand((ij+vec2(0.,1.)));
float d = rand((ij+vec2(1.,1.)));
float x1 = mix(a, b, xy.x);
float x2 = mix(c, d, xy.x);
return mix(x1, x2, xy.y);
}
float pNoise(vec2 p, int res){
float persistance = .5;
float n = 0.;
float normK = 0.;
float f = 4.;
float amp = 1.;
int iCount = 0;
for (int i = 0; i<50; i++){
n+=amp*noise(p, f);
f*=2.;
normK+=amp;
amp*=persistance;
if (iCount == res) break;
iCount++;
}
float nf = n/normK;
return nf*nf*nf*nf;
}
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;
// Dummy, doesn't do anything but at least it makes the shader useable
if (uv.x > uv.x * 2.){
uv = astral;
}
float mod = astral.r * 1.0;
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, tex.g, tex.b, tex.a));
vec4 hsl = HSL(vec4(tex.r*saturation_fac, tex.g*saturation_fac, tex.b, tex.a));
float t = astral.y*2.221 + mod(time,1.);
float t = astral.y*2.221 + time;
vec2 floored_uv = (floor((uv*texture_details.ba)))/texture_details.ba;
vec2 uv_scaled_centered = (floored_uv - 0.5) * 50.;
@ -119,22 +246,48 @@ vec4 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords
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( (astral.x) * 2.612 + ( field + -.5 ) *3.14));
hsl.x = .8;
hsl.y = hsl.y * 0.8;
hsl.z = hsl.z * 0.2 + 0.6 * sin(hsl.z/2.5 - res/4. + sin(astral.y)/8. + 0.5)/1.4;
vec4 pixel = Texel(texture, texture_coords);
float cx = uv_scaled_centered.x * 1.;
float cy = uv_scaled_centered.y * 1.;
vec4 hsl = HSL(vec4(tex.r, tex.g, tex.b, tex.a));
// |y| = 50, |x| = 50
tex.rgb = RGB(hsl).rgb;
if (tex[3] < 0.7)
tex[3] = tex[3]/3.;
vec2 mouse_offset = (screen_coords.xy - mouse_screen_pos.xy)/screen_scale;
float scaled_uvy = (uv.y +mouse_offset.y -0.5)*5.*1.338;
float scaled_uvx = (uv.x +mouse_offset.x -0.5)*5.;
float norm_uv = sqrt(scaled_uvx*scaled_uvx + scaled_uvy*scaled_uvy);
pixel = vec4(pixel.rgb * 0.0 + tex.rgb * tex.a, pixel.a);
float res = (.5 + .5* cos( (astral.x) * 2.612 + ( field + -.5 ) *3.14));
vec4 textp = RGB(hsl);
tex.rgb = textp.rgb;
float stars = ((pNoise(uv*10. + t/15.0, 10)*pNoise(uv*10. + t/15.0, 10)+1.5)/1.+0.15 + ((pNoise(uv*12. + t/15.0, 10)+1.2)/1.+0.3))/2.2+0.05 + 0.007*norm_uv * 1.1;
float clusters = (pNoise(uv*10.0-t/15.0, 10)+1.5)/1.5-0.25 + 0.007*norm_uv;
float super_clusters = (pNoise(uv/15.0, 10)+0.1)/2.+0.3 - 0.008*norm_uv;
clusters *= clusters * clusters * clusters * 0.4;
stars *= stars * stars;
super_clusters *= super_clusters * super_clusters;
colour.rgb = vec3(0.6, 0.45, 1.) * (((clusters + stars + super_clusters)+0.1)) * 0.285;
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 )
{
@ -146,6 +299,6 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
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);
return transform_projection * vertex_position + vec4(0.,0.,0.,scale);
}
#endif

View file

@ -179,6 +179,6 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
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);
return transform_projection * vertex_position + vec4(0.,0.,0.,scale);
}
#endif

View file

@ -104,6 +104,6 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
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);
return transform_projection * vertex_position + vec4(0.,0.,0.,scale);
}
#endif

View file

@ -139,6 +139,6 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
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);
return transform_projection * vertex_position + vec4(0.,0.,0.,scale);
}
#endif

View file

@ -0,0 +1,282 @@
#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 glitched_b;
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 RGBtoHSV(vec4 rgb)
{
vec4 hsv;
float minVal = min(min(rgb.r, rgb.g), rgb.b);
float maxVal = max(max(rgb.r, rgb.g), rgb.b);
float delta = maxVal - minVal;
// Value
hsv.z = maxVal;
// Saturation
if (maxVal != 0.0)
hsv.y = delta / maxVal;
else {
// r = g = b = 0, s = 0, v is undefined
hsv.y = 0.0;
hsv.x = -1.0;
return hsv;
}
// Hue
if (rgb.r == maxVal)
hsv.x = (rgb.g - rgb.b) / delta; // between yellow & magenta
else if (rgb.g == maxVal)
hsv.x = 2.0 + (rgb.b - rgb.r) / delta; // between cyan & yellow
else
hsv.x = 4.0 + (rgb.r - rgb.g) / delta; // between magenta & cyan
hsv.x = hsv.x * (1.0 / 6.0);
if (hsv.x < 0.0)
hsv.x += 1.0;
// Alpha
hsv.w = rgb.a;
return hsv;
}
vec4 HSVtoRGB(vec4 hsv) {
vec4 rgb;
float h = hsv.x * 6.0;
float c = hsv.z * hsv.y;
float x = c * (1.0 - abs(mod(h, 2.0) - 1.0));
float m = hsv.z - c;
if (h < 1.0) {
rgb = vec4(c, x, 0.0, hsv.a);
} else if (h < 2.0) {
rgb = vec4(x, c, 0.0, hsv.a);
} else if (h < 3.0) {
rgb = vec4(0.0, c, x, hsv.a);
} else if (h < 4.0) {
rgb = vec4(0.0, x, c, hsv.a);
} else if (h < 5.0) {
rgb = vec4(x, 0.0, c, hsv.a);
} else {
rgb = vec4(c, 0.0, x, hsv.a);
}
rgb.rgb += m;
return rgb;
}
float bitxor(float val1, float val2)
{
float outp = 0.;
for(float i = 1.; i < 9.; i++) outp += floor(mod(mod(floor(val1*pow(2.,-i)),pow(2.,i))+mod(floor(val2*pow(2.,-i)),pow(2.,i)),2.))*pow(2.,i);
return outp/256.;
}
float mod2(float val1, float mod1)
{
val1 /= mod1;
val1 -= floor(val1);
return(mod1 * val1);
}
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;
// Dummy, doesn't do anything but at least it makes the shader useable
if (uv.x > uv.x * 2.){
uv = glitched_b;
}
float mod = glitched_b.r * 1.0;
number low = min(tex.r, min(tex.g, tex.b));
number high = max(tex.r, max(tex.g, tex.b));
number delta = high - low;
//vec4 hsl = HSL(vec4(tex.r, tex.g, tex.b, tex.a));
float t = glitched_b.y*2.221 + time;
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.;
vec4 pixel = Texel(texture, texture_coords);
float cx = uv_scaled_centered.x * 1.;
float cy = uv_scaled_centered.y * 1.;
float randnum = mod2(floor(4.*t), 256.)*mod2(floor(4.*t), 27.);
randnum = mod2(bitxor(pow(randnum, 3.) - randnum + 3., 7. + floor(randnum/11.)), 256.);
randnum = mod2(randnum*123.54,0.1)*10.;
vec4 hsl = HSL(vec4(tex.r, tex.g, tex.b, tex.a));
float xorscale = 10.;
// |y| = 50, |x| = 50
float mbx;
float mby;
float offx;
float offy;
float rmasksum = -1.;
float rectmask = 1.;
t = floor(t/4.);
for(float i = 0.; i < 5.; i++)
{
randnum = bitxor(255.*randnum + mod2(t,81.), pow(randnum*(16.-i), 2.));
mbx = (cx - 25.*sin(100./randnum)) * (1. + 2.*(floor(cos(177./randnum + 1.))));
mby = (cy - 25.*cos(113./randnum + 1.)) * (1. + 2.*(floor(sin(221./randnum))));
offx = bitxor(255.*randnum, pow(255.*randnum,5.) - 255.*randnum);
offy = bitxor(255.*randnum, pow(255.*randnum,5.) + 255.*randnum);
offx /= 10.;
offy /= 10.;
rectmask = (-mbx + abs(abs(mbx) + offx) - offx) - (mby - abs(abs(mby) - offy) + offy);
rmasksum *= -1. * min(0., max(-1., 5. - pow(rectmask, 2.)));
}
float laddermask = pow(sin((23.-20.*randnum*randnum)*pow(sin(sin(cy*randnum) + pow(sin(cy*randnum),2.)),2.)),2.) * rmasksum;
hsl.x += floor(randnum + 0.1) * rmasksum * 4. * randnum * (1. - laddermask);// * bitxor(cx * xorscale, cy * xorscale)/4;
hsl.y += laddermask * (1. + 2. * rmasksum);
hsl.z += floor(randnum + 0.2) * (1. + rmasksum) * (1. - 1.5*hsl.z) * 0.1;
tex.rgb = RGB(hsl).rgb;
pixel = vec4(pixel.rgb * 0.0 + tex.rgb * tex.a, pixel.a);
float res = (.5 + .5* cos( (glitched_b.x) * 2.612 + ( field + -.5 ) *3.14));
vec4 textp = RGB(hsl);
tex.rgb = textp.rgb;
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

View file

@ -109,6 +109,6 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
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);
return transform_projection * vertex_position + vec4(0.,0.,0.,scale);
}
#endif

View file

@ -130,6 +130,6 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
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);
return transform_projection * vertex_position + vec4(0.,0.,0.,scale);
}
#endif

View file

@ -145,6 +145,6 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
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);
return transform_projection * vertex_position + vec4(0.,0.,0.,scale);
}
#endif

View file

@ -88,6 +88,6 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
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);
return transform_projection * vertex_position + vec4(0.,0.,0.,scale);
}
#endif

View file

@ -222,6 +222,6 @@ vec4 position( mat4 transform_projection, vec4 vertex_position )
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);
return transform_projection * vertex_position + vec4(0.,0.,0.,scale);
}
#endif

View file

@ -0,0 +1,157 @@
#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 ultrafoil;
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;
vec2 adjusted_uv = uv - vec2(0.5, 0.5);
adjusted_uv.x = adjusted_uv.x*texture_details.b/texture_details.a;
number low = min(tex.r, min(tex.g, tex.b));
number high = max(tex.r, max(tex.g, tex.b));
number delta = min(high, max(0.5, 1. - low));
/*
//number fac = max(min(2.*sin((length(90.*adjusted_uv) + ultrafoil.r*2.) + 3.*(1.+0.8*cos(length(113.1121*adjusted_uv) - ultrafoil.r*3.121))) - 1. - max(5.-length(90.*adjusted_uv), 0.), 1.), 0.);
number fac = 0.8 + 0.5*sin(23.*uv.x+.37*uv.y + ultrafoil.r*12. + cos(ultrafoil.r*5.3 + uv.y*4.2 - uv.x*4.));
number fac2 = 0.25 + 0.25*sin(20.*uv.x+.6*uv.y + ultrafoil.r*5. - cos(ultrafoil.r*2.3 + uv.y*8.2));
number fac3 = 0.5 + 0.2*sin(32.*uv.x+.26*uv.y + ultrafoil.r*6.111 + sin(ultrafoil.r*5.3 + uv.y*3.2));
number fac4 = 0.25 + 0.1*sin(10.*uv.x+.32*uv.y + ultrafoil.r*8.111 + sin(ultrafoil.r*1.3 + uv.y*13.2));
number fac5 = sin(0.5*16.*uv.x+.16*uv.y + ultrafoil.r*12. + cos(ultrafoil.r*5.3 + uv.y*4.2 - uv.x*4.));
number maxfac = max(max(fac, max(fac2, max(fac3, max(fac4, 0.0)))) + 2.2*(fac+fac2+fac3+fac4), 0.);
vec3 facv = vec3(
fac+fac2,
max(fac4+fac5,fac2+fac3),
fac+fac3+fac5
);*/
vec3 fac = vec3(0.0);
fac += vec3(0.2,0.4,0.7)*(sin(4.0*uv.x + ultrafoil.r*4.0 + cos(ultrafoil.r*5.3))+.5);
fac += vec3(0.5,0.1,0.7)*(sin(6.0*uv.x + ultrafoil.r*6.3 + cos(ultrafoil.r*2.))+.5);
fac += max(vec3(0.7,0.2,0.2)*(1.-pow(uv.x*10.0-10.0 + ultrafoil.r*2.3,2.)), vec3(0.));
fac += max(vec3(0.5,0.3,0.6)*(1.-pow(uv.x*40.0-40.0 + ultrafoil.r*15.3,2.)), vec3(0.));
fac += max(vec3(0.7,0.2,0.2)*(1.-pow(uv.x*10.0-20.0 + ultrafoil.r*3.7,2.)), vec3(0.));
fac += max(vec3(0.5,0.3,0.6)*(1.-pow(uv.x*40.0-50.0 + ultrafoil.r*11.8,2.)), vec3(0.));
fac += sqrt(uv.y*0.2);
tex.rgb *= vec3(0.5,0.7,1.0);
tex.rgb += tex.rgb*fac*0.5;
//tex.a = min(tex.a, 0.3*tex.a + 0.9*min(0.5, maxfac*0.1));
return dissolve_mask(tex, 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.

View file

@ -1,14 +1,14 @@
return {
["Cryptid"] = {
["jimball_music"] = true,
["code_music"] = true,
["exotic_music"] = true,
["big_music"] = true,
["alt_bg_music"] = true,
["jimball_music"] = true, -- plays funkytown when jimball
["code_music"] = true, -- plays code music when code pack
["exotic_music"] = true, -- plays exotic music when exotic joker
["big_music"] = true, -- plays music when sufficiently high score
["alt_bg_music"] = true, -- plays alternate title screen music based on gameset
},
["family_mode"] = false,
["experimental"] = false,
["force_tooltips"] = true,
["HTTPS"] = true,
["menu"] = true,
["family_mode"] = false, -- removes f*ck
["experimental"] = false, -- experimental stuff
["force_tooltips"] = true, -- i don't actually know what this does
["HTTPS"] = true, -- your internet connection
["menu"] = true, -- i don't know what this does either
}

View file

@ -423,6 +423,38 @@ local pin = {
end
end,
}
local technically_positive = {
object_type = "Achievement",
key = "technically_positive",
order = 23,
bypass_all_unlocked = true,
atlas = "cry_achievements",
--reset_on_startup = true,
unlock_condition = function(self, args)
if args.type == "modify_jokers" then
for i = 1, #G.jokers.cards do
if
G.jokers.cards[i].config.center.key == "j_cry_negative"
and (G.jokers.cards[i].edition and G.jokers.cards[i].edition.negative)
then
return true
end
end
end
end,
}
-- local stoned = {
-- object_type = "Achievement",
-- key = "stoned",
-- order = 24,
-- bypass_all_unlocked = true,
-- atlas = "cry_achievements",
-- --reset_on_startup = true,
-- unlock_condition = function(self, args)
-- end,
-- }
-- TODO: Add new Achievements.
-- Current Ideas (Normal):
@ -477,6 +509,7 @@ local achievement_objects = {
home_realtor,
traffic_jam,
perfectly_balanced,
technically_positive,
--pin, Needs to be screened
}
return { name = "Achievements", items = achievement_objects }

View file

@ -11,6 +11,7 @@ local oldox = {
boss = {
min = 2,
max = 10,
yes_orb = true,
},
atlas = "nostalgia",
order = 4,
@ -36,6 +37,7 @@ local oldhouse = {
boss = {
min = 3,
max = 10,
yes_orb = true,
},
atlas = "nostalgia",
order = 5,
@ -64,6 +66,7 @@ local oldarm = {
boss = {
min = 3,
max = 10,
yes_orb = true,
},
atlas = "nostalgia",
order = 6,
@ -92,6 +95,7 @@ local oldfish = {
boss = {
min = 2,
max = 10,
yes_orb = true,
},
atlas = "nostalgia",
order = 7,
@ -117,6 +121,7 @@ local oldmanacle = {
boss = {
min = 1,
max = 10,
yes_orb = true,
},
atlas = "nostalgia",
order = 8,
@ -142,6 +147,7 @@ local oldserpent = {
boss = {
min = 5,
max = 10,
yes_orb = true,
},
atlas = "nostalgia",
order = 9,
@ -167,6 +173,7 @@ local oldpillar = {
boss = {
min = 3,
max = 10,
yes_orb = true,
},
atlas = "nostalgia",
order = 10,
@ -195,6 +202,7 @@ local oldflint = {
boss = {
min = 3,
max = 10,
yes_orb = true,
},
atlas = "nostalgia",
order = 11,
@ -223,6 +231,7 @@ local oldmark = {
boss = {
min = 4,
max = 10,
yes_orb = true,
},
atlas = "nostalgia",
order = 12,
@ -249,14 +258,15 @@ local tax = {
key = "tax",
pos = { x = 0, y = 0 },
boss = {
min = 1,
min = 2,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 2,
boss_colour = HEX("40ff40"),
loc_vars = function(self, info_queue, card)
return { vars = { 0.4 * get_blind_amount(G.GAME.round_resets.ante) * 2 * G.GAME.starting_params.ante_scaling } } -- no bignum?
return { vars = { 0.4 * get_blind_amount(G.GAME.round_resets.ante) * 2 * G.GAME.starting_params.ante_scaling } }
end,
preview_ui = function(self)
local value = self:loc_vars().vars[1]
@ -283,8 +293,14 @@ local tax = {
collection_loc_vars = function(self)
return { vars = { localize("cry_tax_placeholder") } }
end,
cry_cap_score = function(self, score)
return math.floor(math.min(0.4 * G.GAME.blind.chips, score) + 0.5)
set_blind = function(self, reset, silent)
SMODS.set_scoring_calculation("cry_tax")
end,
defeat = function(self, silent)
SMODS.set_scoring_calculation("multiply")
end,
disable = function(self, silent)
SMODS.set_scoring_calculation("multiply")
end,
in_pool = function()
return G.GAME.round_resets.hands >= 3
@ -303,6 +319,7 @@ local box = {
boss = {
min = 1,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 13,
@ -327,8 +344,9 @@ local clock = {
pos = { x = 0, y = 1 },
mult = 0,
boss = {
min = 1,
min = 2,
max = 10,
yes_orb = true,
},
config = {
tw_bl = {
@ -348,8 +366,10 @@ local clock = {
cry_ante_base_mod = function(self, dt)
if G.SETTINGS.paused then
return 0
elseif G.GAME.round == 0 and G.GAME.skips == 0 then
return 0
else
return 0.1 * (dt * math.min(G.SETTINGS.GAMESPEED, 4) / 4) / 3
return 0.1 * ((dt * (G.GAME.modifiers.cry_rush_hour_iii or 1)) * math.min(G.SETTINGS.GAMESPEED, 4) / 4) / 3
end
end,
}
@ -366,6 +386,7 @@ local trick = {
boss = {
min = 1,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 14,
@ -402,6 +423,7 @@ local joke = {
boss = {
min = 1,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 15,
@ -449,6 +471,7 @@ local hammer = {
boss = {
min = 2,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 19,
@ -457,6 +480,7 @@ local hammer = {
if card.area ~= G.jokers and not G.GAME.blind.disabled then
if
not SMODS.has_no_rank(card)
and not SMODS.has_enhancement(card, "m_cry_abstract")
and (
card.base.value == "3"
or card.base.value == "5"
@ -484,6 +508,7 @@ local magic = {
boss = {
min = 2,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 20,
@ -492,6 +517,7 @@ local magic = {
if card.area ~= G.jokers and not G.GAME.blind.disabled then
if
not SMODS.has_no_rank(card)
and not SMODS.has_enhancement(card, "m_cry_abstract")
and (
card.base.value == "2"
or card.base.value == "4"
@ -519,6 +545,7 @@ local windmill = {
boss = {
min = 4,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 16,
@ -543,6 +570,7 @@ local striker = {
boss = {
min = 4,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 1,
@ -567,6 +595,7 @@ local shackle = {
boss = {
min = 1,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 18,
@ -601,6 +630,7 @@ local pin = {
boss = {
min = 4,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 17,
@ -617,10 +647,10 @@ local pin = {
(card.area == G.jokers)
and not G.GAME.blind.disabled
and (
card.config.center.rarity ~= 3
and card.config.center.rarity ~= 2
and card.config.center.rarity ~= 1
and card.config.center.rarity ~= 5
card.config.center.rarity == 4
or card.config.center.rarity == "cry_epic"
or card.config.center.rarity == "cry_exotic"
or Cryptid.pin_debuff[card.config.center.rarity]
)
then
return true
@ -640,10 +670,11 @@ local scorch = {
object_type = "Blind",
name = "cry-scorch",
key = "scorch",
pos = { x = 0, y = 18 }, -- use Trick as placeholder icon
pos = { x = 0, y = 18 },
boss = {
min = 1,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 21,
@ -659,11 +690,11 @@ local scorch = {
and (context.cardarea == G.play or context.cardarea == "unscored")
and not G.GAME.blind.disabled
then
return { remove = not context.destroy_card.ability.eternal }
return { remove = not SMODS.is_eternal(context.destroying_card) }
end
if context.discard and not G.GAME.blind.disabled then
for i, card in ipairs(G.hand.highlighted) do
return { remove = not card.ability.eternal }
return { remove = not SMODS.is_eternal(card) }
end
end
end,
@ -675,6 +706,285 @@ local scorch = {
end
end,
}
-- +0.25X blind requirements
-- for every $5 you have when selected
local greed = {
dependencies = {
items = {
"set_cry_blind",
},
},
config = {
money_factor = 5,
blind_mod = 0.25,
max_scale = 5000,
},
object_type = "Blind",
name = "cry-greed",
key = "greed",
pos = { x = 0, y = 19 }, -- use Tax as placeholder icon
boss = {
min = 1,
max = 10,
yes_orb = true,
},
atlas = "blinds",
order = 22,
boss_colour = HEX("C19030"),
mult = 1,
loc_vars = function(self, info_queue, card)
return {
vars = {
number_format(5),
number_format(lenient_bignum((get_blind_amount(G.GAME.round_resets.ante) * 0.25))),
},
}
end,
collection_loc_vars = function(self)
return {
vars = {
number_format(5),
"(" .. number_format(0.25) .. "X base)",
},
}
end,
set_blind = function(self, reset, silent)
if to_big(G.GAME.dollars) > to_big(0) then
if to_big(G.GAME.dollars) < to_big(5000) then
G.GAME.blind.chips = -- go my equations
((get_blind_amount(G.GAME.round_resets.ante) * G.GAME.starting_params.ante_scaling) + (math.floor(
G.GAME.dollars / 5
) * (get_blind_amount(G.GAME.round_resets.ante) * 0.25)))
else
G.GAME.blind.chips = -- set cap at $5000
(
(get_blind_amount(G.GAME.round_resets.ante) * G.GAME.starting_params.ante_scaling)
+ (
math.floor(5000 / 5) -- 1000 extra increments
* (get_blind_amount(G.GAME.round_resets.ante) * 0.25)
)
)
end
G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
end
end,
disable = function(self, silent)
G.GAME.blind.chips = get_blind_amount(G.GAME.round_resets.ante) * G.GAME.starting_params.ante_scaling
G.GAME.blind.chip_text = number_format(G.GAME.blind.chips)
end,
}
--Fasten all jokers after hand or discard
--After defeat, open a baneful buffoon pack containing:
---4 cursed jokers (can overflow)
---a "unique consumeable" that will banish the rightmost joker
--Only after that, are jokers unfastened
local decision = {
dependencies = {
items = {
"set_cry_blind",
"set_cry_cursed",
},
},
mult = 2,
object_type = "Blind",
name = "cry-Decision",
key = "decision",
pos = { x = 0, y = 20 },
dollars = 5,
boss = {
min = 4,
max = 666666,
yes_orb = true,
},
atlas = "blinds",
order = 23,
boss_colour = HEX("474931"),
get_loc_debuff_text = function(self)
return localize("cry_blind_baneful_pack")
end,
calculate = function(self, blind, context)
if context.discard and not G.GAME.blind.disabled and not G.GAME.cry_fastened then
--visual cue to wiggle all jokers
G.GAME.cry_fastened = true
if G.jokers.cards then
G.GAME.blind:wiggle()
G.GAME.blind.triggered = true
for i, v in pairs(G.jokers.cards) do
v:juice_up(0, 0.25)
end
end
end
end,
cry_before_play = function(self)
if not G.GAME.blind.disabled and not G.GAME.cry_fastened then
--visual cue to wiggle all jokers
G.GAME.cry_fastened = true
if G.jokers.cards then
G.GAME.blind:wiggle()
G.GAME.blind.triggered = true
for i, v in pairs(G.jokers.cards) do
v:juice_up(0, 0.25)
end
end
end
end,
cry_before_cash = function(self)
--Always fasten if before cash context (gaming chair, debug mode)
G.GAME.cry_fastened = true
G.GAME.blind:wiggle()
G.GAME.blind.triggered = true
G.GAME.cry_make_a_decision = true
G.E_MANAGER:add_event(Event({
trigger = "before",
func = function()
local key = "p_cry_baneful_1"
local card = Card(
G.play.T.x + G.play.T.w / 2 - G.CARD_W * 1.27 / 2,
G.play.T.y + G.play.T.h / 2 - G.CARD_H * 1.27 / 2,
G.CARD_W * 1.27,
G.CARD_H * 1.27,
G.P_CARDS.empty,
G.P_CENTERS[key],
{ bypass_discovery_center = true, bypass_discovery_ui = true }
)
card.cost = 0
card.from_tag = true
G.FUNCS.use_card({ config = { ref_table = card } })
card:start_materialize()
pack_opened = true
return true
end,
}))
end,
disable = function(self, silent)
G.GAME.cry_fastened = nil
end,
defeat = function(self, silent)
G.GAME.cry_fastened = nil
end,
}
local repulsor = {
dependencies = {
items = {
"set_cry_blind",
},
},
mult = 2,
object_type = "Blind",
name = "cry-repulsor",
key = "repulsor",
pos = { x = 0, y = 0 },
dollars = 5,
boss = {
min = 4,
max = 666666,
yes_orb = true,
},
atlas = "blinds_two",
order = 24,
boss_colour = HEX("7c5798"),
calculate = function(self, blind, context)
if not G.GAME.blind.disabled then
if context.before then
for i, v in pairs(G.jokers.cards) do
if v ~= G.jokers.cards[1] and v ~= G.jokers.cards[#G.jokers.cards] then
if not v.debuff then
G.GAME.blind.triggered = true
v.debuff = true
v.debuff_from_repulsor = true
end
end
end
end
if context.retrigger_joker_check and not context.retrigger_joker then
if context.other_card == G.jokers.cards[1] or context.other_card == G.jokers.cards[#G.jokers.cards] then
return {
repetitions = 1,
}
end
end
if context.after then
for i, v in pairs(G.jokers.cards) do
if v.debuff_from_repulsor then
v.debuff = nil
v.debuff_from_repulsor = true
end
end
end
end
end,
}
local chromatic = {
dependencies = {
items = {
"set_cry_blind",
},
},
mult = 2,
object_type = "Blind",
name = "cry-chromatic",
key = "chromatic",
pos = { x = 0, y = 1 },
dollars = 5,
boss = {
min = 1,
max = 666666,
yes_orb = true,
},
atlas = "blinds_two",
order = 25,
boss_colour = HEX("a34f98"),
cry_modify_score = function(self, score)
if math.floor(G.GAME.current_round.hands_played + 1) % 2 == 1 then
return score * -1
else
return score
end
end,
}
local landlord = {
dependencies = {
items = {
"set_cry_blind",
},
},
mult = 2,
object_type = "Blind",
name = "cry-landlord",
key = "landlord",
pos = { x = 0, y = 2 },
dollars = 5,
boss = {
min = 4,
max = 666666,
yes_orb = true,
},
atlas = "blinds_two",
order = 26,
boss_colour = HEX("c89f13"),
debuff_hand = function(self, cards, hand, handname, check)
G.GAME.blind.triggered = false
local jokers = {}
for i, v in pairs(G.jokers.cards) do
if not v.ability.rental then
jokers[#jokers + 1] = v
end
end
if #jokers > 0 then
G.GAME.blind.triggered = true
if not check then
local joker = pseudorandom_element(jokers, pseudoseed("cry_landlord"))
joker:set_rental(true)
joker:juice_up()
G.GAME.blind:wiggle()
end
end
end,
}
--It seems Showdown blind order is seperate from normal blind collection order? convenient for me at least
--Nvm they changed it
local lavender_loop = {
@ -694,6 +1004,7 @@ local lavender_loop = {
min = 3,
max = 10,
showdown = true,
yes_orb = true,
},
atlas = "blinds",
order = 91,
@ -708,22 +1019,20 @@ local lavender_loop = {
G.GAME.cry_ach_conditions.patience_virtue_earnable = nil
end,
cry_round_base_mod = function(self, dt)
local aaa = 4 * (G.GAME.modifiers.cry_rush_hour_iii or 1)
if
G.GAME.cry_ach_conditions.patience_virtue_timer > 0
and G.GAME.cry_ach_conditions.patience_virtue_earnable ~= true
then
G.GAME.cry_ach_conditions.patience_virtue_timer = G.GAME.cry_ach_conditions.patience_virtue_timer
- dt
* (G.GAME.modifiers.cry_rush_hour_iii and 0.5 or 1)
* (G.SETTINGS.paused and 0 or 1)
* G.SETTINGS.GAMESPEED
- dt * (G.SETTINGS.paused and 0 or 1) * G.SETTINGS.GAMESPEED
elseif G.GAME.current_round.hands_played == 0 then
G.GAME.cry_ach_conditions.patience_virtue_earnable = true
end
if G.SETTINGS.paused or G.STATE == G.STATES.HAND_PLAYED then
return 1
else
return 1.25 ^ (dt / (1.5 / math.min(G.SETTINGS.GAMESPEED, 4) * 4))
return 1.25 ^ (dt / (1.5 / math.min(G.SETTINGS.GAMESPEED, 4) * aaa))
end
end,
}
@ -748,7 +1057,7 @@ local tornado = {
order = 94,
boss_colour = HEX("3dd9ca"),
loc_vars = function(self)
return { vars = { "" .. ((Cryptid.safe_get(G.GAME, "probabilities", "normal") or 1) * 2), 3 } }
return { vars = { SMODS.get_probability_vars(self, 2, 3, "Turquoise Tornado") } }
end,
set_blind = function(self, reset, silent)
if not reset then
@ -759,12 +1068,12 @@ local tornado = {
return #Cryptid.advanced_find_joker("Oops! All 6s", nil, nil, { "eternal" }, nil) == 0
end,
collection_loc_vars = function(self)
return { vars = { "" .. ((Cryptid.safe_get(G.GAME, "probabilities", "normal") or 1) * 2), 3 } }
return { vars = { SMODS.get_probability_vars(self, 2, 3, "Turquoise Tornado") } }
end,
debuff_hand = function(self, cards, hand, handname, check)
if
not check
and (pseudorandom(pseudoseed("tornado")) < ((G.GAME.probabilities.normal * 2) / 3))
and SMODS.pseudorandom_probability(self, "tornado", 2, 3, "Turquoise Tornado")
and not G.GAME.blind.disabled
then
--check for guarantee
@ -797,26 +1106,33 @@ local vermillion_virus = {
min = 3,
max = 10,
showdown = true,
yes_orb = true,
},
atlas = "blinds",
order = 90,
boss_colour = HEX("f65d34"),
cry_before_play = function(self)
if G.jokers.cards[1] then
local idx = pseudorandom(pseudoseed("cry_vermillion_virus"), 1, #G.jokers.cards)
if G.jokers.cards[idx] then
if G.jokers.cards[idx].config.center.immune_to_vermillion then
card_eval_status_text(
G.jokers.cards[idx],
"extra",
nil,
nil,
nil,
{ message = localize("k_nope_ex"), colour = G.C.JOKER_GREY }
)
else
local eligible_cards = {}
local idx
--Check for eligible cards (not eternal and not immune)
for i = 1, #G.jokers.cards do
if not G.jokers.cards[i].config.center.immune_to_vermillion and not SMODS.is_eternal(G.jokers.cards[i]) then
eligible_cards[#eligible_cards + 1] = G.jokers.cards[i]
end
end
if #eligible_cards ~= 0 then
--Choose 1 eligible card and get the position of it
local option = pseudorandom_element(eligible_cards, pseudoseed("cry_vermillion_virus"))
for i = 1, #G.jokers.cards do
if G.jokers.cards[i] == option then
idx = i
break
end
end
if idx and G.jokers.cards[idx] then
_card = create_card("Joker", G.jokers, nil, nil, nil, nil, nil, "cry_vermillion_virus_gen")
G.jokers.cards[idx]:remove_from_deck()
G.jokers.cards[idx]:start_dissolve()
--G.jokers.cards[idx]:remove_from_deck()
_card:add_to_deck()
_card:start_materialize()
G.jokers.cards[idx] = _card
@ -825,7 +1141,6 @@ local vermillion_virus = {
G.jokers:align_cards()
end
end
end
end,
}
local sapphire_stamp = {
@ -843,18 +1158,22 @@ local sapphire_stamp = {
min = 3,
max = 10,
showdown = true,
yes_orb = true,
},
atlas = "blinds",
order = 92,
boss_colour = HEX("4057d6"),
cry_before_play = function(self)
if #G.hand.highlighted > 0 then
local idx = pseudorandom(pseudoseed("cry_sapphire_stamp"), 1, #G.hand.highlighted)
G.hand:remove_from_highlighted(G.hand.highlighted[idx])
end
end,
set_blind = function(self, reset, silent)
if not reset then
G.GAME.stamp_mod = true
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit + 1
SMODS.change_play_limit(1)
SMODS.change_discard_limit(1)
end
end,
defeat = function(self, silent)
@ -862,7 +1181,8 @@ local sapphire_stamp = {
G.GAME.stamp_mod = nil
end
if not G.GAME.blind.disabled then
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit - 1
SMODS.change_play_limit(-1)
SMODS.change_discard_limit(-1)
end
end,
disable = function(self, silent)
@ -870,7 +1190,8 @@ local sapphire_stamp = {
G.GAME.stamp_mod = nil
end
if not G.GAME.blind.disabled then
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit - 1
SMODS.change_play_limit(-1)
SMODS.change_discard_limit(-1)
end
end,
}
@ -1233,7 +1554,7 @@ local obsidian_orb = {
if area == G.hand then
if
s.name == "The Wheel"
and pseudorandom(pseudoseed("ObsidianOrb")) < G.GAME.probabilities.normal / 7
and SMODS.pseudorandom_probability(self, "ObsidianOrb", 1, 7, "Obsidian Orb")
then
return true
end
@ -1348,6 +1669,21 @@ local obsidian_orb = {
end
end
end,
cry_before_cash = function(self)
local decision_made = false
for k, _ in pairs(G.GAME.defeated_blinds) do
s = G.P_BLINDS[k]
if s.cry_before_cash then
decision_made = true
s:cry_before_cash()
end
end
if not decision_made then
G.GAME.cry_make_a_decision = nil
G.STATE = G.STATES.ROUND_EVAL
G.STATE_COMPLETE = false
end
end,
get_loc_debuff_text = function(self)
if not G.GAME.blind.debuff_boss then
return localize("cry_debuff_obsidian_orb")
@ -1406,6 +1742,7 @@ local trophy = {
end
end,
}
local items_togo = {
oldox,
oldhouse,
@ -1427,6 +1764,8 @@ local items_togo = {
shackle,
pin,
scorch,
greed,
repulsor,
vermillion_virus,
tornado,
sapphire_stamp,
@ -1434,5 +1773,8 @@ local items_togo = {
clock,
lavender_loop,
trophy,
decision,
chromatic,
landlord,
}
return { name = "Blinds", items = items_togo }

View file

@ -51,7 +51,9 @@ local ballin = {
key = "ballin",
order = 1,
rules = {
custom = {},
custom = {
{ id = "cry_force_enhancement", value = "m_stone" },
},
modifiers = {
{ id = "joker_slots", value = 3 },
},
@ -66,20 +68,6 @@ local ballin = {
restrictions = {
banned_cards = {
{ id = "j_vampire" },
{ id = "c_magician" },
{ id = "c_empress" },
{ id = "c_heirophant" },
{ id = "c_lovers" },
{ id = "c_chariot" },
{ id = "c_justice" },
{ id = "c_devil" },
{ id = "c_tower" },
{ id = "c_cry_seraph" },
{ id = "c_familiar" },
{ id = "c_grim" },
{ id = "c_incantation" },
{ id = "c_cry_eclipse" },
{ id = "c_cry_class" },
},
banned_other = {},
},
@ -128,10 +116,6 @@ local rush_hour_ii = {
{ id = "j_diet_cola" },
{ id = "v_directors_cut" },
{ id = "v_retcon" },
{ id = "j_cry_pickle" },
{ id = "v_cry_copies" },
{ id = "v_cry_tag_printer" },
{ id = "v_cry_clone_machine" },
},
banned_other = {},
},
@ -145,7 +129,7 @@ local rush_hour_iii = {
custom = {
{ id = "cry_rush_hour" },
{ id = "cry_rush_hour_ii" },
{ id = "cry_rush_hour_iii" },
{ id = "cry_rush_hour_iii", value = 2 },
{ id = "cry_no_tags" },
},
modifiers = {},
@ -222,10 +206,6 @@ local rush_hour_iii = {
{ id = "j_diet_cola" },
{ id = "v_directors_cut" },
{ id = "v_retcon" },
{ id = "j_cry_pickle" },
{ id = "v_cry_copies" },
{ id = "v_cry_tag_printer" },
{ id = "v_cry_clone_machine" },
},
banned_other = {},
},
@ -506,61 +486,18 @@ function Game:start_run(args)
if G.GAME.modifiers.cry_no_consumables then
G.GAME.joker_rate = 1e300
end
for i, v in pairs(G.handlist) do
if v == "cry_Declare0" then
d0 = true
end
end
if not d0 then
table.insert(G.handlist, 1, "cry_Declare0")
table.insert(G.handlist, 1, "cry_Declare1")
table.insert(G.handlist, 1, "cry_Declare2")
end
Cryptid.base_values = {}
end
--Add banned cards when specific features/mods are enabled here
--TODO other mods
if (SMODS.Mods["jen"] or {}).can_load then
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_chance" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_token_tag_cry_bundle" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_magician" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_empress" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_heirophant" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_lovers" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_chariot" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_justice" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_devil" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_tower" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_star" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_moon" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_sun" }
ballin.restrictions.banned_cards[#ballin.restrictions.banned_cards + 1] = { id = "c_jen_reverse_world" }
rng.restrictions.banned_cards[#rng.restrictions.banned_cards + 1] = { id = "c_jen_jokerinatarot" }
rng.restrictions.banned_cards[#rng.restrictions.banned_cards + 1] = { id = "c_jen_token_tag_uncommon" }
rng.restrictions.banned_cards[#rng.restrictions.banned_cards + 1] = { id = "c_jen_token_tag_rare" }
rng.restrictions.banned_cards[#rng.restrictions.banned_cards + 1] = { id = "c_jen_token_tag_top_up" }
rng.restrictions.banned_cards[#rng.restrictions.banned_cards + 1] = { id = "c_jen_token_tag_cry_epic" }
rng.restrictions.banned_cards[#rng.restrictions.banned_cards + 1] = { id = "c_jen_wraith_ex" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "j_jen_shikigami" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_token_tag_charm" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_token_tag_meteor" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_token_tag_buffoon" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_token_tag_ethereal" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_token_tag_cry_bundle" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_magician" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_empress" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_heirophant" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_lovers" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_chariot" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_justice" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_devil" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_tower" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] =
{ id = "c_jen_reverse_high_priestess" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_emperor" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_death" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_star" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_moon" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_sun" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_world" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_reverse_judgement" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_mischief" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_wonder" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_familiar_ex" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_grim_ex" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_incantation_ex" }
onlycard.restrictions.banned_cards[#onlycard.restrictions.banned_cards + 1] = { id = "c_jen_cryptid_ex" }
end
--end of banned cards
local challenges = {
sticker_sheet,
sticker_sheet_plus,

File diff suppressed because it is too large Load diff

View file

@ -55,34 +55,6 @@ local equilibrium = {
apply = function(self)
G.GAME.modifiers.cry_equilibrium = true
end,
init = function(self)
local gp = get_pack
function get_pack(k, t)
if G.GAME.modifiers.cry_equilibrium then
if not P_CRY_ITEMS then
P_CRY_ITEMS = {}
local valid_pools = { "Joker", "Consumeables", "Voucher", "Booster" }
for _, id in ipairs(valid_pools) do
for k, v in pairs(G.P_CENTER_POOLS[id]) do
if not Cryptid.no(v, "doe", k) then
P_CRY_ITEMS[#P_CRY_ITEMS + 1] = v.key
end
end
end
for k, v in pairs(G.P_CARDS) do
if not Cryptid.no(v, "doe", k) then
P_CRY_ITEMS[#P_CRY_ITEMS + 1] = v.key
end
end
end
return G.P_CENTERS[pseudorandom_element(
P_CRY_ITEMS,
pseudoseed("cry_equipackbrium" .. G.GAME.round_resets.ante)
)]
end
return gp(k, t)
end
end,
unlocked = false,
check_for_unlock = function(self, args)
if Cryptid.safe_get(G, "jokers") then
@ -147,13 +119,22 @@ local infinite = {
name = "cry-Infinite",
key = "infinite",
order = 2,
config = { cry_highlight_limit = 1e20, hand_size = 1 },
config = { hand_size = 1 },
pos = { x = 3, y = 0 },
atlas = "atlasdeck",
apply = function(self)
G.GAME.modifiers.cry_highlight_limit = self.config.cry_highlight_limit
end,
unlocked = false,
apply = function(self)
G.GAME.infinitedeck = true
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.7,
func = function()
SMODS.change_play_limit(1e6)
SMODS.change_discard_limit(1e6)
return true
end,
}))
end,
check_for_unlock = function(self, args)
if args.type == "hand_contents" then
if #args.cards >= 6 then
@ -377,17 +358,26 @@ local legendary = {
},
name = "cry-Legendary",
key = "legendary",
config = { cry_legendary = true, cry_legendary_rate = 0.2 },
config = { cry_legendary = true, cry_legendary_rate = 5 },
pos = { x = 0, y = 6 },
atlas = "atlasdeck",
order = 15,
loc_vars = function(self, info_queue, center)
return { vars = { SMODS.get_probability_vars(self, 1, self.config.cry_legendary_rate, "Legendary Deck") } }
end,
calculate = function(self, back, context)
if context.context == "eval" and Cryptid.safe_get(G.GAME, "last_blind", "boss") then
if G.jokers then
if #G.jokers.cards < G.jokers.config.card_limit then
local legendary_poll = pseudorandom(pseudoseed("cry_legendary"))
legendary_poll = legendary_poll / (G.GAME.probabilities.normal or 1)
if legendary_poll < self.config.cry_legendary_rate then
if
SMODS.pseudorandom_probability(
self,
"cry_legendary",
1,
self.config.cry_legendary_rate,
"Legendary Deck"
)
then
local card = create_card("Joker", G.jokers, true, 4, nil, nil, nil, "")
card:add_to_deck()
card:start_materialize()
@ -460,18 +450,21 @@ local critical = {
name = "cry-Critical",
key = "critical",
order = 10,
config = { cry_crit_rate = 0.25, cry_crit_miss_rate = 0.125 },
config = { cry_crit_rate = 4, cry_crit_miss_rate = 8 },
pos = { x = 4, y = 5 },
atlas = "atlasdeck",
loc_vars = function(self, info_queue, center)
return { vars = { G.GAME.probabilities.normal or 1 } }
local _, aaa = SMODS.get_probability_vars(self, 1, self.config.cry_crit_miss_rate, "Critical Deck")
return { vars = { SMODS.get_probability_vars(self, 1, self.config.cry_crit_rate, "Critical Deck"), aaa } }
end,
calculate = function(self, card, context)
if context.final_scoring_step then
local aaa =
SMODS.pseudorandom_probability(self, "cry_critical", 1, self.config.cry_crit_rate, "Critical Deck")
local bbb =
SMODS.pseudorandom_probability(self, "cry_critical", 1, self.config.cry_crit_miss_rate, "Critical Deck")
local check
local crit_poll = pseudorandom(pseudoseed("cry_critical"))
crit_poll = crit_poll / (G.GAME.probabilities.normal or 1)
if crit_poll < self.config.cry_crit_rate then
if aaa then
check = 2
G.E_MANAGER:add_event(Event({
func = function()
@ -487,7 +480,7 @@ local critical = {
return true
end,
}))
elseif crit_poll < self.config.cry_crit_rate + self.config.cry_crit_miss_rate then
elseif bbb then
check = 0.5
G.E_MANAGER:add_event(Event({
func = function()
@ -552,9 +545,7 @@ local glowing = {
if context.context == "eval" and Cryptid.safe_get(G.GAME, "last_blind", "boss") then
for i = 1, #G.jokers.cards do
if not Card.no(G.jokers.cards[i], "immutable", true) then
Cryptid.with_deck_effects(G.jokers.cards[i], function(card)
Cryptid.misprintize(card, { min = 1.25, max = 1.25 }, nil, true)
end)
Cryptid.manipulate(G.jokers.cards[i], { value = 1.25 })
end
end
end
@ -697,8 +688,8 @@ local antimatter = {
key = "antimatter",
config = {
cry_antimatter = true,
cry_crit_rate = 0.25, --Critical Deck
cry_legendary_rate = 0.2, --Legendary Deck
cry_crit_rate = 4, --Critical Deck
cry_legendary_rate = 5, --Legendary Deck
-- Enhanced Decks
cry_force_enhancement = "random",
cry_force_edition = "random",
@ -882,7 +873,16 @@ local antimatter = {
~= 0
or skip
then
G.GAME.modifiers.cry_highlight_limit = 1e20
G.GAME.infinitedeck = true
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.7,
func = function()
SMODS.change_play_limit(1e6)
SMODS.change_discard_limit(1e6)
return true
end,
}))
G.GAME.starting_params.hand_size = G.GAME.starting_params.hand_size + 1
end
-- Wormhole deck
@ -986,8 +986,6 @@ local antimatter = {
function Cryptid.antimatter_trigger_final_scoring(self, context, skip)
if context.context == "final_scoring_step" then
local crit_poll = pseudorandom(pseudoseed("cry_critical"))
crit_poll = crit_poll / (G.GAME.probabilities.normal or 1)
--Critical Deck
if
(
@ -997,7 +995,15 @@ local antimatter = {
~= 0
or skip
then
if crit_poll < self.config.cry_crit_rate then
if
SMODS.pseudorandom_probability(
self,
"cry_critical",
1,
self.config.cry_crit_rate,
"Antimatter Deck"
)
then
context.mult = context.mult ^ 2
update_hand_text({ delay = 0 }, { mult = context.mult, chips = context.chips })
G.E_MANAGER:add_event(Event({
@ -1090,9 +1096,7 @@ local antimatter = {
or skip
then
for i = 1, #G.jokers.cards do
Cryptid.with_deck_effects(G.jokers.cards[i], function(card)
Cryptid.misprintize(card, { min = 1.25, max = 1.25 }, nil, true)
end)
Cryptid.manipulate(G.jokers.cards[i], { value = 1.25 })
end
end
--Legendary Deck
@ -1112,9 +1116,15 @@ local antimatter = {
or skip
then
if #G.jokers.cards < G.jokers.config.card_limit then
local legendary_poll = pseudorandom(pseudoseed("cry_legendary"))
legendary_poll = legendary_poll / (G.GAME.probabilities.normal or 1)
if legendary_poll < self.config.cry_legendary_rate then
if
SMODS.pseudorandom_probability(
self,
"cry_legendary",
1,
self.config.cry_legendary_rate,
"Antimatter Deck"
)
then
local card = create_card("Joker", G.jokers, true, 4, nil, nil, nil, "")
card:add_to_deck()
card:start_materialize()
@ -1234,7 +1244,7 @@ local antimatter = {
unlocked = false,
check_for_unlock = function(self, args)
if args.type == "win_deck" then
if get_deck_win_stake("b_cry_blank") > 0 and get_deck_win_stake() >= 8 then
if get_deck_win_stake("b_cry_blank") >= 8 then
unlock_card(self)
end
end

View file

@ -1,5 +1,3 @@
--Move all the stuff in here into atlasdeck.png later
--Also a lot of the edition decks have wrong proportions so those also need to get fixed
local atlasedition = {
object_type = "Atlas",
key = "atlaseditiondeck",
@ -78,7 +76,7 @@ Cryptid.edeck_atlas_update = function(self)
if not sprite then
error(self.edeck_type)
end
local enh_info = { Cryptid.enhanced_deck_info(self) }
local enh_info = { Cryptid.enhanced_deck_info(G.cry_edeck_center and self or {}) }
sprite = sprite[enh_info[sprite.order]] or sprite.default
self.atlas, self.pos = sprite.atlas, sprite.pos
return sprite
@ -96,13 +94,13 @@ local e_deck = {
order = 17,
pos = { x = 5, y = 2 },
loc_vars = function(self, info_queue, center)
local aaa = Cryptid.enhanced_deck_info(self)
local aaa = Cryptid.enhanced_deck_info(G.cry_edeck_center and self or {})
return { vars = { localize({ type = "name_text", set = "Edition", key = "e_" .. aaa }) } }
end,
edeck_type = "edition",
config = { cry_no_edition_price = true },
apply = function(self)
local aaa = Cryptid.enhanced_deck_info(self)
local aaa = Cryptid.enhanced_deck_info({})
G.GAME.modifiers.cry_force_edition = aaa
--Ban Edition tags (They will never redeem)
for k, v in pairs(G.P_TAGS) do
@ -327,20 +325,7 @@ return {
init = function()
local sa = Card.set_ability
function Card:set_ability(center, y, z)
--adding immutable to cards because
-- A they are hardcoded and unaffected by misprintize but still have a description that changes because of it
-- B so they ignore misprintize in order to keep vanilla descripton accurate (ex hack shouldn't be able to trigger more than once)
-- C so Gemini doesn't say they are compatible when they are not
-- D Invisible Joker
if
center
and center.name
== ("Fortune Teller" or "Shoot the Moon" or "Riff-raff" or "Chaos the Clown" or "Dusk" or "Mime" or "Hack" or "Sock and Buskin" or "Invisible Joker" or "Swashbuckler" or "Smeared Joker" or "Certificate" or "Mr. Bones" or "Diet Cola" or "Luchador" or "Midas Mask" or "Shortcut" or "Seance" or "Superposition" or "Sixth Sense" or "DNA" or "Splash" or "Supernova" or "Pareidolia" or "Raised Fist" or "Marble Joker" or "Four Fingers" or "Joker Stencil" or "Showman" or "Blueprint" or "Oops! All 6s" or "Brainstorm" or "Cartomancer" or "Astronomer" or "Burnt Joker" or "Chicot" or "Perkeo")
then
self.config.center.immutable = true
end
if Cryptid.safe_get(center, "name") == "Default Base" then -- scuffed
if not G.SETTINGS.paused and Cryptid.safe_get(center, "name") == "Default Base" then -- scuffed
return sa(
self,
(not self.no_forced_enhancement and G.GAME.modifiers.cry_force_enhancement)
@ -355,7 +340,7 @@ return {
end
local se = Card.set_edition
function Card:set_edition(edition, y, z, force)
if not force then
if not force and not G.SETTINGS.paused then
return se(
self,
(not self.no_forced_edition and G.GAME.modifiers.cry_force_edition)
@ -369,11 +354,19 @@ return {
end
local ss = Card.set_seal
function Card:set_seal(seal, y, z)
return ss(self, not self.no_forced_seal and G.GAME.modifiers.cry_force_seal or seal, y, z)
return ss(
self,
not self.no_forced_seal and not G.SETTINGS.paused and G.GAME.modifiers.cry_force_seal or seal,
y,
z
)
end
local cs = Card.change_suit
function Card:change_suit(new_suit)
return cs(self, not self.no_forced_suit and G.GAME.modifiers.cry_force_suit or new_suit)
return cs(
self,
not self.no_forced_suit and not G.SETTINGS.paused and G.GAME.modifiers.cry_force_suit or new_suit
)
end
local ccl = Card.click
function Card:click()
@ -391,8 +384,9 @@ return {
and (Cryptid.safe_get(G.GAME, "viewed_back", "effect", "center", "edeck_type") and (self.back == "viewed_back" or self.edeck_select))
then
if not G.cry_edeck_select then
Cryptid.enhancement_config_UI(Galdur and self.config.center or G.GAME.viewed_back.effect.center)
G.cry_edeck_select = true
G.cry_edeck_center = Galdur and self.config.center or G.GAME.viewed_back.effect.center
Cryptid.enhancement_config_UI(Galdur and self.config.center or G.GAME.viewed_back.effect.center, 1)
else
if self.edeck_select then
G.PROFILES[G.SETTINGS.profile]["cry_edeck_" .. self.config.center.edeck_type] =
@ -402,10 +396,12 @@ return {
definition = G.UIDEF.run_setup("main_menu_play"),
})
G.cry_edeck_select = nil
G.cry_edeck_center = nil
end
end
end
function Cryptid.enhancement_config_UI(center)
function Cryptid.enhancement_config_UI(center, actual_page)
local count_per_page = 6
if not center.edeck_type then
return
end
@ -434,18 +430,30 @@ return {
seal = G.P_SEALS,
}
local editions = {}
for _, v in pairs(pool_table[center.edeck_type]) do
for i, v in pairs(pool_table[center.edeck_type]) do
if v.key ~= "e_base" and not v.no_edeck then
editions[#editions + 1] = (center.edeck_type == "edition" and v.key:sub(3)) or v.key
editions[#editions + 1] =
{ index = i, center = (center.edeck_type == "edition" and v.key:sub(3)) or v.key }
end
end
for i = 1, #editions do
local page = (actual_page and actual_page * count_per_page or count_per_page) - (count_per_page - 1)
local max_pages = math.floor(#editions / count_per_page)
if max_pages * count_per_page < #editions then --idk why this is needed but it is
max_pages = max_pages + 1
end
local modification_options = {}
for i = 1, max_pages do
table.insert(
modification_options,
localize("k_page") .. " " .. tostring(i) .. "/" .. tostring(max_pages)
)
end
for i = page, math.min(page + count_per_page - 1, #editions) do
local _center = Cryptid.deep_copy(center)
_center.config["cry_force_" .. center.edeck_type] = editions[i]
_center.config["cry_force_" .. center.edeck_type] = editions[i].center
Cryptid.edeck_atlas_update(_center)
local card = Cryptid.generic_card(_center)
card.edeck_select = editions[i]
card.edeck_select = editions[i].center
G.your_collection[1]:emplace(card)
end
@ -461,12 +469,31 @@ return {
config = { align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05 },
nodes = { deck_tables },
},
{
n = G.UIT.R,
config = { align = "cm" },
nodes = {
create_option_cycle({
options = modification_options,
w = 4.5,
cycle_shoulders = true,
opt_callback = "edeck_page",
current_option = actual_page,
colour = G.C.RED,
no_pips = true,
focus_args = { snap_to = true, nav = "wide" },
}),
},
},
},
})
G.FUNCS.overlay_menu({
definition = t,
})
end
G.FUNCS.edeck_page = function(args)
Cryptid.enhancement_config_UI(G.cry_edeck_center, args.cycle_config.current_option)
end
end,
items = { e_deck, et_deck, sk_deck, st_deck, sl_deck, atlasedition },
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -141,6 +141,7 @@
--Penetrating Joker
--Treacherous Joker
--[[
if JokerDisplay then
--Side note: I Don't think retrigger type exp gives a correct value with Emult jokers, but ehhhhh ig I can live with that (It's good enough)
@ -1374,9 +1375,9 @@ if JokerDisplay then
{ ref_table = "card.joker_display_values", ref_value = "localized_text" },
},
calc_function = function(card)
local is_active = card.ability.extra.score >= card.ability.extra.req
local is_active = card.ability.immutable.score >= card.ability.extra.req
card.joker_display_values.localized_text = "("
.. (is_active and localize("k_active_ex") or (card.ability.extra.score .. "/" .. card.ability.extra.req))
.. (is_active and localize("k_active_ex") or (card.ability.immutable.score .. "/" .. card.ability.extra.req))
.. ")"
end,
}
@ -2041,4 +2042,6 @@ if JokerDisplay then
--end of Jokerdisplays
end
]]
--
return { name = "JokerDisplay" }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

2725
Cryptid/items/pointer.lua Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -118,7 +118,7 @@ local amber = {
atlas = "stake",
applied_stakes = { "cry_diamond" },
modifiers = function()
G.GAME.modifiers.cry_booster_packs = 1
G.GAME.modifiers.extra_boosters = -1
end,
shiny = true,
order = 17,
@ -352,10 +352,7 @@ return {
-- Disallow use of Debuffed Perishable consumables
local cuc = Card.can_use_consumeable
function Card:can_use_consumeable(any_state, skip_check)
if self.ability.perish_tally == nil then
self.ability.perish_tally = G.GAME.perishable_rounds or 5
end
if self.ability.perishable and self.ability.perish_tally <= 0 then
if self.debuff then
return false
end
return cuc(self, any_state, skip_check)
@ -366,7 +363,7 @@ return {
local temp_hand = {}
local hasHand = false
for k, v in ipairs(G.hand.cards) do
if not v.ability.eternal then
if not SMODS.is_eternal(v) then
temp_hand[#temp_hand + 1] = v
hasHand = true
end

View file

@ -225,6 +225,9 @@ local empoweredPack = {
G.consumeables:emplace(ccard)
end,
},
in_pool = function()
return false
end,
}
local empowered = {
cry_credits = {
@ -325,11 +328,11 @@ local gambler = {
key = "gambler",
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = { set = "Tag", key = "tag_cry_empowered" }
return { vars = { G.GAME.probabilities.normal or 1, self.config.odds } }
return { vars = { SMODS.get_probability_vars(self, 1, self.config.odds, "Gambler Tag") } }
end,
apply = function(self, tag, context)
if context.type == "new_blind_choice" then
if pseudorandom("cry_gambler_tag") < G.GAME.probabilities.normal / tag.config.odds then
if SMODS.pseudorandom_probability(card, "cry_gambler_tag", 1, tag.config.odds, "Gambler Tag") then
local lock = tag.ID
G.CONTROLLER.locks[lock] = true
tag:yep("+", G.C.SECONDARY_SET.Spectral, function()
@ -1036,22 +1039,14 @@ local banana = {
set = "Joker",
key = G.P_CENTER_POOLS["Joker"][61].key,
})
info_queue[#info_queue + 1] = {
set = "Joker",
key = "j_cavendish",
specific_vars = { 3, G.GAME.probabilities.normal or 1, 1000 },
}
info_queue[#info_queue + 1] = G.P_CENTERS.j_cavendish
else
banana = localize({
type = "name_text",
set = "Joker",
key = G.P_CENTER_POOLS["Joker"][38].key,
})
info_queue[#info_queue + 1] = {
set = "Joker",
key = "j_gros_michel",
specific_vars = { 15, G.GAME.probabilities.normal or 1, 6 },
}
info_queue[#info_queue + 1] = G.P_CENTERS.j_gros_michel
end
return { vars = { banana } }
end,
@ -1328,7 +1323,7 @@ local better_voucher = {
G.P_CENTERS[voucher_key],
{ bypass_discovery_center = true, bypass_discovery_ui = true }
)
Cryptid.misprintize(card)
Cryptid.manipulate(card)
create_shop_card_ui(card, "Voucher", G.shop_vouchers)
card:start_materialize()
if G.GAME.modifiers.cry_force_edition and not G.GAME.modifiers.cry_force_random_edition then
@ -1404,7 +1399,7 @@ local booster = {
local lock = tag.ID
G.CONTROLLER.locks[lock] = true
tag:yep("+", G.C.BLUE, function()
G.GAME.boostertag = (G.GAME.boostertag or 0) + 1
G.GAME.boostertag = G.GAME.boostertag + 1
G.CONTROLLER.locks[lock] = nil
return true
end)
@ -1413,6 +1408,244 @@ local booster = {
end
end,
}
local clone = {
cry_credits = {
idea = {
"Squiddy",
},
art = {
"lord.ruby",
},
code = {
"lord.ruby",
},
},
object_type = "Tag",
dependencies = {
items = {
"set_cry_tag",
},
},
name = "cry-Clone Tag",
order = 29,
atlas = "tag_cry",
pos = { x = 6, y = 3 },
config = { type = "item_bought", cost_fac = 1.5 },
key = "clone",
loc_vars = function(self, info_queue)
return { vars = { self.config.cost_fac } }
end,
min_ante = 4,
apply = function(self, tag, context)
if context.type == "item_bought" then
local lock = tag.ID
G.CONTROLLER.locks[lock] = true
tag:yep("+", G.C.BLUE, function()
local copy = copy_card(context.card)
copy:add_to_deck()
if context.card.area then
context.card.area:emplace(copy)
else
G.consumeables:emplace(copy)
end
G.E_MANAGER:add_event(Event({
func = function()
for i, v in pairs(G.I.CARD) do
if v.set_cost then
v:set_cost()
end
end
return true
end,
}))
G.CONTROLLER.locks[lock] = nil
return true
end)
tag.triggered = true
return true
end
end,
init = function()
local buy_ref = G.FUNCS.buy_from_shop
G.FUNCS.buy_from_shop = function(e)
local r = buy_ref(e)
if r ~= false then
for i = 1, #G.GAME.tags do
G.GAME.tags[i]:apply_to_run({ type = "item_bought", card = e.config.ref_table })
end
end
return r
end
end,
}
local lens = {
cry_credits = {
idea = {
"Squiddy",
},
art = {
"lord.ruby",
},
code = {
"lord.ruby",
},
},
object_type = "Tag",
dependencies = {
items = {
"set_cry_tag",
},
},
name = "cry-Lens Tag",
order = 30,
atlas = "tag_cry",
pos = { x = 7, y = 3 },
config = { type = "immediate", negatives = 2 },
key = "lens",
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS.e_negative
return { vars = { self.config.negatives } }
end,
min_ante = 4,
apply = function(self, tag, context)
if context.type == "immediate" then
local c = {}
for i, v in pairs(G.consumeables.cards) do
if not v.edition or not v.edition.negative then
if not v.will_be_editioned then
c[#c + 1] = v
end
end
end
if #c > 0 then
local lock = tag.ID
G.CONTROLLER.locks[lock] = true
local card = pseudorandom_element(c, pseudoseed("cry_lens_tag"))
card.will_be_editioned = true
local card2 = pseudorandom_element(c, pseudoseed("cry_lens_tag"))
if card2 then
card2.will_be_editioned = true
end
tag:yep("+", G.C.BLUE, function()
card:set_edition("e_negative")
G.CONTROLLER.locks[lock] = nil
card.will_be_editioned = nil
if card2 then
card2:set_edition("e_negative")
card2.will_be_editioned = nil
end
return true
end)
else
tag:nope()
end
tag.triggered = true
return true
end
end,
}
local palette_cleanser = {
cry_credits = {
idea = {
"Squiddy",
},
art = {
"lord.ruby",
},
code = {
"lord.ruby",
},
},
object_type = "Tag",
dependencies = {
items = {
"set_cry_tag",
},
},
name = "cry-Palette Cleanser Tag",
order = 30,
atlas = "tag_cry",
pos = { x = 0, y = 4 },
config = { type = "immediate" },
key = "palette_cleanser",
loc_vars = function(self, info_queue)
return { vars = {} }
end,
min_ante = 4,
apply = function(self, tag, context)
if context.type == "immediate" then
local c = {}
for i, v in pairs(G.jokers.cards) do
if v:has_stickers() then
if not v.will_be_cleansed then
c[#c + 1] = v
end
end
end
for i, v in pairs(G.deck.cards) do
if v:has_stickers() then
if not v.will_be_cleansed then
c[#c + 1] = v
end
end
end
for i, v in pairs(G.hand.cards) do
if v:has_stickers() then
if not v.will_be_cleansed then
c[#c + 1] = v
end
end
end
if #c > 0 then
local lock = tag.ID
G.CONTROLLER.locks[lock] = true
local card = pseudorandom_element(c, pseudoseed("cry_palette_cleanser_tag"))
card.will_be_cleansed = true
tag:yep("+", G.C.BLUE, function()
card:remove_random_sticker("cry_palette_cleanser_sticker")
G.CONTROLLER.locks[lock] = nil
card.will_be_cleansed = nil
return true
end)
else
tag:nope()
end
tag.triggered = true
return true
end
end,
in_pool = function()
local c = {}
if G.jokers then
for i, v in pairs(G.jokers.cards) do
if not v:has_stickers() then
if not v.will_be_cleansed then
c[#c + 1] = v
end
end
end
for i, v in pairs(G.deck.cards) do
if not v:has_stickers() then
if not v.will_be_cleansed then
c[#c + 1] = v
end
end
end
for i, v in pairs(G.hand.cards) do
if not v:has_stickers() then
if not v.will_be_cleansed then
c[#c + 1] = v
end
end
end
end
return #c > 0
end,
}
local tagitems = {
cat,
empoweredPack,
@ -1436,6 +1669,9 @@ local tagitems = {
blur_tag,
astral_tag,
loss,
clone,
lens,
palette_cleanser,
m_tag,
double_m_tag,
}

View file

@ -129,18 +129,24 @@ local test3 = {
},
},
calculate = function(self, card, context)
if context.end_of_round and not context.individual and not context.repetition then
Cryptid.suit_level_up(context.blueprint_card or card, nil, 1, {
"High Card",
"Pair",
"Two Pair",
"Three of a Kind",
"Straight",
"Flush",
"Full House",
"Four of a Kind",
"Straight Flush",
}, true)
if context.using_consumeable then
if context.consumeable.ability.set == "Tarot" then
Cryptid.suit_level_up(
context.blueprint_card or card,
nil,
1,
Cryptid.table_merge({ "Three of a Kind" }, { "Three of a Kind" }, { "Full House" }, { "Pair" }),
true
)
else
Cryptid.suit_level_up(
context.blueprint_card or card,
nil,
1,
Cryptid.table_merge({ "Three of a Kind" }, { "Full House" }, { "Pair" }, { "Three of a Kind" }),
true
)
end
elseif context.pre_discard and not context.hook then
local text, loc_disp_text, poker_hands, scoring_hand, disp_text =
G.FUNCS.get_poker_hand_info(G.hand.highlighted)

View file

@ -5,7 +5,9 @@ local voucher_atlas = {
px = 71,
py = 95,
}
local copies = { --Double tags become Triple Tags and are 2X as common
-- Normal Vouchers (T1/T2)
local copies = { -- DTag T1; Double tags become Triple Tags and are 2X as common
cry_credits = {
idea = {
"Catman",
@ -27,7 +29,7 @@ local copies = { --Double tags become Triple Tags and are 2X as common
},
key = "copies",
atlas = "atlasvoucher",
order = 1,
order = 20001,
pos = { x = 1, y = 1 },
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = { set = "Tag", key = "tag_double" }
@ -56,7 +58,7 @@ local copies = { --Double tags become Triple Tags and are 2X as common
end
end,
}
local tag_printer = { --Double tags become Quadruple Tags and are 3X as common
local tag_printer = { --DTag T2; Double tags become Quadruple Tags and are 3X as common
cry_credits = {
idea = {
"Catman",
@ -78,7 +80,7 @@ local tag_printer = { --Double tags become Quadruple Tags and are 3X as common
},
},
key = "tag_printer",
order = 2,
order = 20002,
atlas = "atlasvoucher",
pos = { x = 1, y = 2 },
loc_vars = function(self, info_queue)
@ -88,144 +90,7 @@ local tag_printer = { --Double tags become Quadruple Tags and are 3X as common
end,
requires = { "v_cry_copies" },
}
local clone_machine = { --Double tags become Quintuple Tags and are 4X as common
cry_credits = {
idea = {
"Catman",
"Mystic Misclick",
},
art = {
"Linus Goof Balls",
},
code = {
"Math",
},
},
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_tag",
"set_cry_tier3",
"v_cry_tag_printer",
},
},
key = "clone_machine",
atlas = "atlasvoucher",
order = 91,
pos = { x = 1, y = 3 },
pools = { ["Tier3"] = true },
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = { set = "Tag", key = "tag_double" }
info_queue[#info_queue + 1] = { set = "Tag", key = "tag_cry_quintuple", specific_vars = { 4 } }
return { vars = {} }
end,
requires = { "v_cry_tag_printer" },
}
local command_prompt = { --Code cards can appear in the shop
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Mathguy",
},
},
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_code",
},
},
key = "command_prompt",
atlas = "atlasvoucher",
order = 3,
pos = { x = 0, y = 1 },
loc_vars = function(self, info_queue)
return { vars = {} }
end,
redeem = function(self)
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.code_rate = (G.GAME.code_rate or 0) + 4
return true
end,
}))
end,
unredeem = function(self)
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.code_rate = math.max(0, G.GAME.code_rate - 4)
return true
end,
}))
end,
}
local satellite_uplink = { --Code cards may appear in any of the Celestial Packs
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Mathguy",
},
},
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_code",
"v_cry_command_prompt",
},
},
key = "satellite_uplink",
atlas = "atlasvoucher",
order = 4,
pos = { x = 0, y = 2 },
loc_vars = function(self, info_queue)
return { vars = {} }
end,
requires = { "v_cry_command_prompt" },
}
local quantum_computing = { --Code cards can spawn with Negative addition
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Mathguy",
},
},
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_tier3",
"set_cry_code",
"v_cry_satellite_uplink",
},
},
key = "quantum_computing",
order = 92,
atlas = "atlasvoucher",
pos = { x = 0, y = 3 },
pools = { ["Tier3"] = true },
loc_vars = function(self, info_queue)
return { vars = {} }
end,
requires = { "v_cry_satellite_uplink" },
}
local pairing = { --Retrigger all M Jokers if played hand is a Pair
local pairing = { -- M T1; Retrigger all M Jokers if played hand is a Pair
object_type = "Voucher",
dependencies = {
items = {
@ -235,7 +100,7 @@ local pairing = { --Retrigger all M Jokers if played hand is a Pair
},
key = "pairing",
atlas = "atlasvoucher",
order = 5,
order = 20003,
pos = { x = 4, y = 5 },
cry_credits = {
art = {
@ -257,7 +122,7 @@ local pairing = { --Retrigger all M Jokers if played hand is a Pair
return false
end,
}
local repair_man = { --Retrigger all M Jokers if played hand contains a pair
local repair_man = { -- M T2; Retrigger all M Jokers if played hand contains a pair
object_type = "Voucher",
dependencies = {
items = {
@ -268,7 +133,7 @@ local repair_man = { --Retrigger all M Jokers if played hand contains a pair
},
key = "repair_man",
atlas = "atlasvoucher",
order = 6,
order = 20004,
pos = { x = 5, y = 5 },
requires = { "v_cry_pairing" },
cry_credits = {
@ -291,43 +156,7 @@ local repair_man = { --Retrigger all M Jokers if played hand contains a pair
return false
end,
}
local pairamount_plus = { --Retrigger all M Jokers once for every pair contained in played hand
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_m",
"set_cry_tier3",
"v_cry_repair_man",
},
},
key = "pairamount_plus",
atlas = "atlasvoucher",
order = 93,
pos = { x = 6, y = 5 },
requires = { "v_cry_repair_man" },
pools = { ["Tier3"] = true },
cry_credits = {
art = {
"lolxddj",
},
code = {
"Math",
},
jolly = {
"Jolly Open Winner",
"Xaltios",
},
},
in_pool = function(self)
local mcheck = Cryptid.get_m_jokers()
if mcheck > 0 then
return true
end
return false
end,
}
local double_vision = { --Double-Sided cards appear 4x more frequently
local double_vision = { -- DSide T1; Double-Sided cards appear 4x more frequently
object_type = "Voucher",
dependencies = {
items = {
@ -336,7 +165,7 @@ local double_vision = { --Double-Sided cards appear 4x more frequently
},
},
key = "double_vision",
order = 7,
order = 20005,
atlas = "atlasvoucher",
pos = { x = 4, y = 3 },
loc_vars = function(self, info_queue)
@ -355,7 +184,7 @@ local double_vision = { --Double-Sided cards appear 4x more frequently
},
},
}
local double_slit = { --Meld can appear in the shop and Arcana Packs
local double_slit = { -- DSide T2; Meld can appear in the shop and Arcana Packs
object_type = "Voucher",
dependencies = {
items = {
@ -367,7 +196,7 @@ local double_slit = { --Meld can appear in the shop and Arcana Packs
},
key = "double_slit",
atlas = "atlasvoucher",
order = 8,
order = 20006,
pos = { x = 3, y = 4 },
requires = { "v_cry_double_vision" },
loc_vars = function(self, info_queue)
@ -386,39 +215,159 @@ local double_slit = { --Meld can appear in the shop and Arcana Packs
},
},
}
local double_down = { --After every round, X1.5 to all values on the back of Double-Sided Cards
local stickyhand = { -- CSL T1; +1 card selection limit
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"HexaCryonic",
},
},
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_tier3",
"e_cry_double_sided",
"v_cry_double_slit",
},
},
key = "double_down",
key = "stickyhand",
config = { extra = 1 },
atlas = "atlasvoucher",
order = 94,
pos = { x = 4, y = 4 },
requires = { "v_cry_double_slit" },
pools = { ["Tier3"] = true },
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_double_sided
order = 20007,
pos = { x = 0, y = 5 },
loc_vars = function(self, info_queue, card)
return { vars = { (card and card.ability.extra or self.config.extra) } }
end,
redeem = function(self, card)
SMODS.change_play_limit(card.ability.extra or self.config.extra)
SMODS.change_discard_limit(card.ability.extra or self.config.extra)
end,
unredeem = function(self, card)
SMODS.change_play_limit(-(card.ability.extra or self.config.extra))
SMODS.change_discard_limit(-(card.ability.extra or self.config.extra))
if not G.GAME.before_play_buffer then
G.hand:unhighlight_all()
end
end,
}
local grapplinghook = { -- CSL T2; +2 card selection limit
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"Linus Goof Balls",
"HexaCryonic",
},
code = {
"Math",
},
jolly = {
"Jolly Open Winner",
"Axolotolus",
"HexaCryonic",
},
},
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"v_cry_stickyhand",
},
},
key = "grapplinghook",
config = { extra = 2 },
atlas = "atlasvoucher",
order = 20008,
pos = { x = 1, y = 5 },
requires = { "v_cry_stickyhand" },
loc_vars = function(self, info_queue, card)
return { vars = { (card and card.ability.extra or self.config.extra) } }
end,
redeem = function(self, card)
SMODS.change_play_limit(card.ability.extra or self.config.extra)
SMODS.change_discard_limit(card.ability.extra or self.config.extra)
end,
unredeem = function(self, card)
SMODS.change_play_limit(-(card.ability.extra or self.config.extra))
SMODS.change_discard_limit(-(card.ability.extra or self.config.extra))
if not G.GAME.before_play_buffer then
G.hand:unhighlight_all()
end
end,
}
local overstock_multi = { --+1 card slot[s], +1 booster pack slot[s] and +1 voucher slot[s] available in the shop
local command_prompt = { -- Code T1; Code cards can appear in the shop
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Mathguy",
},
},
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_code",
},
},
key = "command_prompt",
atlas = "atlasvoucher",
order = 20031,
pos = { x = 0, y = 1 },
loc_vars = function(self, info_queue)
return { vars = {} }
end,
redeem = function(self)
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.code_rate = (G.GAME.code_rate or 0) + 4
return true
end,
}))
end,
unredeem = function(self)
G.E_MANAGER:add_event(Event({
func = function()
G.GAME.code_rate = math.max(0, G.GAME.code_rate - 4)
return true
end,
}))
end,
}
local satellite_uplink = { -- Code T2; Code cards may appear in any of the Celestial Packs
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Mathguy",
},
},
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_code",
"v_cry_command_prompt",
},
},
key = "satellite_uplink",
atlas = "atlasvoucher",
order = 20032,
pos = { x = 0, y = 2 },
loc_vars = function(self, info_queue)
return { vars = {} }
end,
requires = { "v_cry_command_prompt" },
}
-- Tier 3 Vouchers
local overstock_multi = { -- Overstock T3; +1 card slot, +1 booster pack slot and +1 voucher slot available in the shop
cry_credits = {
idea = {
"Frix",
@ -439,7 +388,7 @@ local overstock_multi = { --+1 card slot[s], +1 booster pack slot[s] and +1 vouc
key = "overstock_multi",
config = { extra = 1 },
atlas = "atlasvoucher",
order = 75,
order = 32658,
pos = { x = 4, y = 1 },
requires = { "v_overstock_plus" },
pools = { ["Tier3"] = true },
@ -471,7 +420,7 @@ local overstock_multi = { --+1 card slot[s], +1 booster pack slot[s] and +1 vouc
SMODS.change_voucher_limit(-mod)
end,
}
local massproduct = { --All cards and packs in the shop cost $1
local massproduct = { -- Clearance Sale T3; All cards and packs in the shop cost $1
cry_credits = {
idea = {
"Frix",
@ -491,7 +440,7 @@ local massproduct = { --All cards and packs in the shop cost $1
},
key = "massproduct",
atlas = "atlasvoucher",
order = 76,
order = 32659,
pos = { x = 6, y = 4 },
requires = { "v_liquidation" },
pools = { ["Tier3"] = true },
@ -523,7 +472,7 @@ local massproduct = { --All cards and packs in the shop cost $1
}))
end,
}
local curate = { --All cards appear with an Edition
local curate = { -- Hone T3; All cards appear with an Edition
cry_credits = {
idea = {
"Frix",
@ -543,7 +492,7 @@ local curate = { --All cards appear with an Edition
},
key = "curate",
atlas = "atlasvoucher",
order = 77,
order = 32660,
pos = { x = 6, y = 1 },
requires = { "v_glow_up" },
pools = { ["Tier3"] = true },
@ -558,7 +507,7 @@ local curate = { --All cards appear with an Edition
end
end,
}
local rerollexchange = { --All rerolls cost $2
local rerollexchange = { -- Reroll Surplus T3; All rerolls cost $2
cry_credits = {
idea = {
"Project666",
@ -578,7 +527,7 @@ local rerollexchange = { --All rerolls cost $2
},
key = "rerollexchange",
atlas = "atlasvoucher",
order = 78,
order = 32661,
pos = { x = 6, y = 2 },
requires = { "v_reroll_glut" },
pools = { ["Tier3"] = true },
@ -602,22 +551,35 @@ local rerollexchange = { --All rerolls cost $2
}))
end,
}
--Order 79 reserved for celestial storage (unimplemented)
local scope = { --Also unimplemented
local CBALLT3PLACEHOLDER = { -- RESERVED FOR CRYSTAL BALL T3
object_type = "Voucher",
dependencies = {
items = {
"set_cry_tier3",
},
},
key = "scope",
key = "CBALLT3PLACEHOLDER",
atlas = "atlasvoucher",
order = 80,
order = 32662,
-- pos = { x = 2, y = 0 },
requires = { "v_omen_globe" },
pools = { ["Tier3"] = true },
}
local TSCOPET3PLACEHOLDER = { -- RESERVED FOR TELESCOPE T3
object_type = "Voucher",
dependencies = {
items = {
"set_cry_tier3",
},
},
key = "TSCOPET3PLACEHOLDER",
atlas = "atlasvoucher",
order = 32663,
pos = { x = 2, y = 0 },
requires = { "v_observatory" },
pools = { ["Tier3"] = true },
}
local dexterity = { --Permanently gain +2 hand[s] each round
local dexterity = { -- Grabber T3; Permanently gain +2 hands each round
cry_credits = {
idea = {
"Frix",
@ -638,7 +600,7 @@ local dexterity = { --Permanently gain +2 hand[s] each round
key = "dexterity",
config = { extra = 2 },
atlas = "atlasvoucher",
order = 81,
order = 32664,
pos = { x = 6, y = 3 },
requires = { "v_nacho_tong" },
pools = { ["Tier3"] = true },
@ -654,7 +616,7 @@ local dexterity = { --Permanently gain +2 hand[s] each round
ease_hands_played(-1 * (card and card.ability.extra or self.config.extra))
end,
}
local threers = { --Permanently gain +2 discard[s] each round
local threers = { -- Wasteful T3; Permanently gain +2 discards each round
cry_credits = {
idea = {
"Frix",
@ -675,7 +637,7 @@ local threers = { --Permanently gain +2 discard[s] each round
key = "threers",
config = { extra = 2 },
atlas = "atlasvoucher",
order = 82,
order = 32665,
pos = { x = 5, y = 0 },
requires = { "v_recyclomancy" },
pools = { ["Tier3"] = true },
@ -691,7 +653,7 @@ local threers = { --Permanently gain +2 discard[s] each round
ease_discard(-1 * (card and card.ability.extra or self.config.extra))
end,
}
local tacclimator = { --Tarot cards appear X6 more frequently in the shop All future Tarot cards are free
local tacclimator = { -- Tarot Merchant T3; Tarots are free, spawn rate controllable in run info
cry_credits = {
idea = {
"Frix",
@ -713,7 +675,7 @@ local tacclimator = { --Tarot cards appear X6 more frequently in the shop All
key = "tacclimator",
config = { extra = 24 / 4, extra_disp = 6 },
atlas = "atlasvoucher",
order = 83,
order = 32666,
pos = { x = 1, y = 4 },
requires = { "v_tarot_tycoon" },
pools = { ["Tier3"] = true },
@ -737,7 +699,7 @@ local tacclimator = { --Tarot cards appear X6 more frequently in the shop All
}))
end,
}
local pacclimator = { --Planet cards appear X6 more frequently in the shop All future Planet cards are free
local pacclimator = { -- Planet Merchant T3; Planets are free, spawn rate controllable in run info
cry_credits = {
idea = {
"Frix",
@ -759,7 +721,7 @@ local pacclimator = { --Planet cards appear X6 more frequently in the shop All
key = "pacclimator",
config = { extra = 24 / 4, extra_disp = 6 },
atlas = "atlasvoucher",
order = 84,
order = 32667,
pos = { x = 0, y = 4 },
requires = { "v_planet_tycoon" },
pools = { ["Tier3"] = true },
@ -783,7 +745,7 @@ local pacclimator = { --Planet cards appear X6 more frequently in the shop All
}))
end,
}
local moneybean = { --Raise the cap on interest earned in each round to $2.0e299
local moneybean = { -- Seed Money T3; Raise the cap on interest earned in each round to $2.0e299
cry_credits = {
idea = {
"Frix",
@ -804,7 +766,7 @@ local moneybean = { --Raise the cap on interest earned in each round to $2.0e299
key = "moneybean",
config = { extra = 1e300 },
atlas = "atlasvoucher",
order = 85,
order = 32668,
pos = { x = 5, y = 1 },
requires = { "v_money_tree" },
pools = { ["Tier3"] = true },
@ -832,7 +794,7 @@ local moneybean = { --Raise the cap on interest earned in each round to $2.0e299
}))
end,
}
local fabric = { --+2 Joker slot[s]
local fabric = { -- Blank Voucher T3; +2 Joker slots
cry_credits = {
idea = {
"Frix",
@ -853,7 +815,7 @@ local fabric = { --+2 Joker slot[s]
key = "fabric",
config = { extra = 2 },
atlas = "atlasvoucher",
order = 86,
order = 32669,
pos = { x = 6, y = 0 },
requires = { "v_antimatter" },
pools = { ["Tier3"] = true },
@ -898,8 +860,21 @@ local fabric = { --+2 Joker slot[s]
end
end,
}
--Order 87 reserved for Fake-out (unimplemented)
local asteroglyph = { --Set Ante to 0
local MTRICKT3PLACEHOLDER = { -- RESERVED FOR MAGIC TRICK T3
object_type = "Voucher",
dependencies = {
items = {
"set_cry_tier3",
},
},
key = "TSCOPET3PLACEHOLDER",
atlas = "atlasvoucher",
order = 32670,
pos = { x = 2, y = 0 },
requires = { "v_observatory" },
pools = { ["Tier3"] = true },
}
local asteroglyph = { -- Heiroglyph T3; Set Ante to 0
cry_credits = {
idea = {
"Frix",
@ -919,7 +894,7 @@ local asteroglyph = { --Set Ante to 0
},
key = "asteroglyph",
atlas = "atlasvoucher",
order = 88,
order = 32761,
pos = { x = 5, y = 2 },
requires = { "v_petroglyph" },
pools = { ["Tier3"] = true },
@ -963,8 +938,21 @@ local asteroglyph = { --Set Ante to 0
end
end,
}
--Order 89 reserved for Ivory Script (unimplemented)
local blankcanvas = { --+2 hand size
local DCUTT3PLACEHOLDER = { -- RESERVED FOR DIRECTOR'S CUT T3
object_type = "Voucher",
dependencies = {
items = {
"set_cry_tier3",
},
},
key = "TSCOPET3PLACEHOLDER",
atlas = "atlasvoucher",
order = 32672,
pos = { x = 2, y = 0 },
requires = { "v_observatory" },
pools = { ["Tier3"] = true },
}
local blankcanvas = { -- Paint Brush T3; +2 hand size
cry_credits = {
idea = {
"Frix",
@ -985,7 +973,7 @@ local blankcanvas = { --+2 hand size
key = "blankcanvas",
config = { extra = 2 },
atlas = "atlasvoucher",
order = 90,
order = 32763,
pos = { x = 2, y = 4 },
requires = { "v_palette" },
pools = { ["Tier3"] = true },
@ -1011,91 +999,110 @@ local blankcanvas = { --+2 hand size
end
end,
}
local stickyhand = { --+1 card selection limit
local clone_machine = { -- DTag Voucher T3; Double tags become Quintuple Tags and are 4X as common
cry_credits = {
idea = {
"HexaCryonic",
"Catman",
"Mystic Misclick",
},
art = {
"HexaCryonic",
"Linus Goof Balls",
},
code = {
"HexaCryonic",
"Math",
},
},
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_tag",
"set_cry_tier3",
"v_cry_tag_printer",
},
},
key = "stickyhand",
config = { extra = 1 },
key = "clone_machine",
atlas = "atlasvoucher",
order = 9,
pos = { x = 0, y = 5 },
loc_vars = function(self, info_queue, card)
return { vars = { (card and card.ability.extra or self.config.extra) } }
end,
redeem = function(self, card)
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit
+ (card and card.ability.extra or self.config.extra)
end,
unredeem = function(self, card)
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit
- (card and card.ability.extra or self.config.extra)
if G.hand.config.highlighted_limit < 5 then
G.hand.config.highlighted_limit = 5
end
if not G.GAME.before_play_buffer then
G.hand:unhighlight_all()
end
order = 32764,
pos = { x = 1, y = 3 },
pools = { ["Tier3"] = true },
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = { set = "Tag", key = "tag_double" }
info_queue[#info_queue + 1] = { set = "Tag", key = "tag_cry_quintuple", specific_vars = { 4 } }
return { vars = {} }
end,
requires = { "v_cry_tag_printer" },
}
local grapplinghook = { --+1 card selection limit (replace me when "extra functionality" is added later)
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"HexaCryonic",
},
},
local pairamount_plus = { -- M T3; Retrigger all M Jokers once for every pair contained in played hand
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"v_cry_stickyhand",
"set_cry_m",
"set_cry_tier3",
"v_cry_repair_man",
},
},
key = "grapplinghook",
config = { extra = 2 },
key = "pairamount_plus",
atlas = "atlasvoucher",
order = 10,
pos = { x = 1, y = 5 },
requires = { "v_cry_stickyhand" },
loc_vars = function(self, info_queue, card)
return { vars = { (card and card.ability.extra or self.config.extra) } }
end,
redeem = function(self, card)
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit
+ (card and card.ability.extra or self.config.extra)
end,
unredeem = function(self, card)
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit
- (card and card.ability.extra or self.config.extra)
if G.hand.config.highlighted_limit < 5 then
G.hand.config.highlighted_limit = 5
end
if not G.GAME.before_play_buffer then
G.hand:unhighlight_all()
order = 32765,
pos = { x = 6, y = 5 },
requires = { "v_cry_repair_man" },
pools = { ["Tier3"] = true },
cry_credits = {
art = {
"lolxddj",
},
code = {
"Math",
},
jolly = {
"Jolly Open Winner",
"Xaltios",
},
},
in_pool = function(self)
local mcheck = Cryptid.get_m_jokers()
if mcheck > 0 then
return true
end
return false
end,
}
local hyperspacetether = { --+2 card selection limit + other stuff
local double_down = { -- DSide T3; After every round, X1.5 to all values on the back of Double-Sided Cards
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_tier3",
"e_cry_double_sided",
"v_cry_double_slit",
},
},
key = "double_down",
atlas = "atlasvoucher",
order = 32766,
pos = { x = 4, y = 4 },
requires = { "v_cry_double_slit" },
pools = { ["Tier3"] = true },
loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_double_sided
end,
cry_credits = {
art = {
"Linus Goof Balls",
},
code = {
"Math",
"lord-ruby",
},
jolly = {
"Jolly Open Winner",
"Axolotolus",
},
},
}
local hyperspacetether = { -- CSL T3; +2 card selection limit, all* selected cards contribute to asc power
cry_credits = {
idea = {
"HexaCryonic",
@ -1119,27 +1126,58 @@ local hyperspacetether = { --+2 card selection limit + other stuff
config = { extra = 2 },
atlas = "atlasvoucher",
pos = { x = 2, y = 5 },
order = 95,
order = 32767,
requires = { "v_cry_grapplinghook" },
pools = { ["Tier3"] = true },
loc_vars = function(self, info_queue, card)
return { vars = { (card and card.ability.extra or self.config.extra) } }
end,
redeem = function(self, card)
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit
+ (card and card.ability.extra or self.config.extra)
SMODS.change_play_limit(card.ability.extra or self.config.extra)
SMODS.change_discard_limit(card.ability.extra or self.config.extra)
end,
unredeem = function(self, card)
G.hand.config.highlighted_limit = G.hand.config.highlighted_limit
- (card and card.ability.extra or self.config.extra)
if G.hand.config.highlighted_limit < 5 then
G.hand.config.highlighted_limit = 5
end
SMODS.change_play_limit(-(card.ability.extra or self.config.extra))
SMODS.change_discard_limit(-(card.ability.extra or self.config.extra))
if not G.GAME.before_play_buffer then
G.hand:unhighlight_all()
end
end,
}
local quantum_computing = { -- Code T3; Code cards spawn with +1 use
cry_credits = {
idea = {
"HexaCryonic",
},
art = {
"HexaCryonic",
},
code = {
"Mathguy",
},
},
object_type = "Voucher",
dependencies = {
items = {
"set_cry_voucher",
"set_cry_tier3",
"set_cry_code",
"v_cry_satellite_uplink",
},
},
key = "quantum_computing",
order = 32768,
atlas = "atlasvoucher",
pos = { x = 0, y = 3 },
config = { extra = 1 },
pools = { ["Tier3"] = true },
loc_vars = function(self, info_queue, card)
return { vars = { (card and card.ability.extra or self.config.extra) } }
end,
requires = { "v_cry_satellite_uplink" },
}
-- Triple+ tag tags
local triple = { --Copies voucher triple tag
cry_credits = {
idea = {
@ -1351,36 +1389,44 @@ if SMODS.Mods["Tier3Sub"] then
end
local voucheritems = {
voucher_atlas,
-- Cryptid Normal Vouchers
copies,
tag_printer,
triple,
quadruple,
quintuple,
pairing,
repair_man,
double_vision,
double_slit,
stickyhand,
grapplinghook,
command_prompt,
satellite_uplink,
-- Vanilla T3s
overstock_multi,
massproduct,
curate,
rerollexchange,
-- Crystal Ball T3 Placeholder
-- Telescope T3 Placeholder
dexterity,
threers,
tacclimator,
pacclimator,
moneybean,
fabric,
-- Magic Trick T3 Placeholder
asteroglyph,
-- Director's Cut T3 Placeholder
blankcanvas,
-- Cryptid T3s
clone_machine,
stickyhand,
grapplinghook,
hyperspacetether,
command_prompt,
satellite_uplink,
quantum_computing,
pairing,
repair_man,
pairamount_plus,
double_vision,
double_slit,
double_down,
hyperspacetether,
quantum_computing,
triple,
quadruple,
quintuple,
}
return {
name = "Vouchers",

View file

@ -32,9 +32,15 @@ function G.FUNCS.get_poker_hand_info(_cards)
loc_disp_text = localize(disp_text, "poker_hands")
end
end
local hidden = false
for i, v in pairs(scoring_hand) do
if v.facing == "back" then
hidden = true
break
end
end
if G.SETTINGS.language == "en-us" then
if #scoring_hand > 5 and (text == "Flush Five" or text == "Five of a Kind") then
if #scoring_hand > 5 and (text == "Flush Five" or text == "Five of a Kind" or text == "bunc_Spectrum Five") then
local rank_array = {}
local county = 0
for i = 1, #scoring_hand do
@ -104,103 +110,192 @@ function G.FUNCS.get_poker_hand_info(_cards)
return str_ret
end
-- text gets stupid small at 100+ anyway
loc_disp_text = (text == "Flush Five" and "Flush " or "")
loc_disp_text = (text == "Flush Five" and "Flush " or text == "bunc_Spectrum Five" and "Spectrum " or "")
.. (
(county < 1000 and create_num_chunk(county) or "Thousand")
.. (text == "Five of a Kind" and " of a Kind" or "")
)
end
end
local hand_table = {
["High Card"] = G.GAME.used_vouchers.v_cry_hyperspacetether and 1 or nil,
["Pair"] = G.GAME.used_vouchers.v_cry_hyperspacetether and 2 or nil,
["Two Pair"] = 4,
["Three of a Kind"] = G.GAME.used_vouchers.v_cry_hyperspacetether and 3 or nil,
["Straight"] = next(SMODS.find_card("j_four_fingers")) and Cryptid.gameset() ~= "modest" and 4 or 5,
["Flush"] = next(SMODS.find_card("j_four_fingers")) and Cryptid.gameset() ~= "modest" and 4 or 5,
["Full House"] = 5,
["Four of a Kind"] = G.GAME.used_vouchers.v_cry_hyperspacetether and 4 or nil,
["Straight Flush"] = next(SMODS.find_card("j_four_fingers")) and Cryptid.gameset() ~= "modest" and 4 or 5, --debatable
["cry_Bulwark"] = 5,
["Five of a Kind"] = 5,
["Flush House"] = 5,
["Flush Five"] = 5,
["cry_Clusterfuck"] = 8,
["cry_UltPair"] = 8,
["cry_WholeDeck"] = 52,
}
-- Ascension power
local a_power = Cryptid.calculate_ascension_power(
text,
_cards,
scoring_hand,
G.GAME.used_vouchers.v_cry_hyperspacetether,
G.GAME.bonus_asc_power
)
if a_power > 0 then
G.GAME.current_round.current_hand.cry_asc_num = a_power
-- Change mult and chips colors if hand is ascended
if hand_table[text] and next(scoring_hand) and #scoring_hand > hand_table[text] then
if not hidden then
ease_colour(G.C.UI_CHIPS, copy_table(G.C.GOLD), 0.3)
ease_colour(G.C.UI_MULT, copy_table(G.C.GOLD), 0.3)
G.GAME.current_round.current_hand.cry_asc_num_text = (
a_power and (type(a_power) == "table" and a_power:gt(to_big(0)) or a_power > 0)
)
and " (+" .. a_power .. ")"
or ""
else
ease_colour(G.C.UI_CHIPS, G.C.BLUE, 0.3)
ease_colour(G.C.UI_MULT, G.C.RED, 0.3)
G.GAME.current_round.current_hand.cry_asc_num_text = ""
end
-- this is where all the logic for asc hands is. currently it's very simple but if you want more complex logic, here's the place to do it
if hand_table[text] and Cryptid.enabled("set_cry_poker_hand_stuff") == true then
G.GAME.current_round.current_hand.cry_asc_num = G.GAME.used_vouchers.v_cry_hyperspacetether
and #_cards - hand_table[text]
or #scoring_hand - hand_table[text]
else
G.GAME.current_round.current_hand.cry_asc_num = 0
ease_colour(G.C.UI_CHIPS, G.C.BLUE, 0.3)
ease_colour(G.C.UI_MULT, G.C.RED, 0.3)
G.GAME.current_round.current_hand.cry_asc_num_text = ""
end
G.GAME.current_round.current_hand.cry_asc_num = math.max(0, G.GAME.current_round.current_hand.cry_asc_num)
if G.GAME.cry_exploit_override then
G.GAME.current_round.current_hand.cry_asc_num = G.GAME.current_round.current_hand.cry_asc_num + 1
end
G.GAME.current_round.current_hand.cry_asc_num_text = (
G.GAME.current_round.current_hand.cry_asc_num
and (
type(G.GAME.current_round.current_hand.cry_asc_num) == "table"
and G.GAME.current_round.current_hand.cry_asc_num:gt(to_big(0))
or G.GAME.current_round.current_hand.cry_asc_num > 0
)
)
and " (+" .. G.GAME.current_round.current_hand.cry_asc_num .. ")"
or ""
return text, loc_disp_text, poker_hands, scoring_hand, disp_text
end
function Cryptid.ascend(num) -- edit this function at your leisure
if Cryptid.enabled("set_cry_poker_hand_stuff") ~= true then
if (Cryptid.safe_get(G, "GAME", "current_round", "current_hand", "cry_asc_num") or 0) <= 0 then
return num
end
if Cryptid.gameset() == "modest" then
-- x(1.1 + 0.05 per sol) base, each card gives + (0.1 + 0.05 per sol)
if not G.GAME.current_round.current_hand.cry_asc_num then
return num
end
if G.GAME.current_round.current_hand.cry_asc_num <= 0 then
return num
end
return math.max(
num,
num
* (
1
+ 0.1
+ to_big(0.05 * (G.GAME.sunnumber or 0))
+ to_big(
(0.1 + (0.05 * (G.GAME.sunnumber or 0)))
* to_big(G.GAME.current_round.current_hand.cry_asc_num or 0)
)
)
)
if Cryptid.gameset(G.P_CENTERS.c_cry_sunplanet) == "modest" then
-- Default: Chips and Mult multiplier + 0.25 for every 1 Ascension power
return num * to_big(1 + ((0.25 + G.GAME.sunnumber.modest) * G.GAME.current_round.current_hand.cry_asc_num))
else
return math.max(
num,
num
* to_big(
(1.25 + (0.05 * (G.GAME.sunnumber or 0)))
^ to_big(G.GAME.current_round.current_hand.cry_asc_num or 0)
)
)
-- Default: Chips and Mult multiplier X1.25 for every 1 Ascension power
return num * to_big((1.25 + G.GAME.sunnumber.not_modest) ^ G.GAME.current_round.current_hand.cry_asc_num)
end
end
function Cryptid.pulse_flame(duration, intensity) -- duration is in seconds, intensity is in idfk honestly, but it increases pretty quickly
G.cry_flame_override = G.cry_flame_override or {}
G.cry_flame_override["duration"] = duration or 0.01
G.cry_flame_override["intensity"] = intensity or 2
end
function Cryptid.calculate_ascension_power(hand_name, hand_cards, hand_scoring_cards, tether, bonus)
bonus = bonus or 0
local starting = 0
if Cryptid.enabled("set_cry_poker_hand_stuff") ~= true then
return 0
end
if hand_name then
-- Get Starting Ascension power from Poker Hands
if hand_cards then
local check = Cryptid.hand_ascension_numbers(hand_name, tether)
if check then
starting = (tether and #hand_cards or #hand_scoring_cards) - check
end
end
-- Extra starting calculation for Declare hands
if G.GAME.hands[hand_name] and G.GAME.hands[hand_name].declare_cards then
local total = 0
for i, v in pairs(G.GAME.hands[hand_name].declare_cards or {}) do
local how_many_fit = 0
local suit, rank
for i2, v2 in pairs(hand_cards) do
if not v2.marked then
if SMODS.has_no_rank(v2) and v.rank == "rankless" or v2:get_id() == v.rank then
rank = true
end
if v2:is_suit(v.suit) or (v.suit == "suitless" and SMODS.has_no_suit(v2)) or not v.suit then
suit = true
end
if not (suit and rank) then
suit = false
rank = false
end
if suit and rank then
how_many_fit = how_many_fit + 1
v2.marked = true
end
end
end
if not rank or not suit then
how_many_fit = 0
end
total = total + how_many_fit
end
for i2, v2 in pairs(hand_cards) do
v2.marked = nil
end
starting = starting + (total - #hand_scoring_cards)
end
end
-- Get Ascension power from Exploit
if G.GAME.cry_exploit_override then
bonus = bonus + 1
end
-- Get Ascension Power From Sol (Observatory effect)
if G.GAME.used_vouchers.v_observatory and next(find_joker("cry-sunplanet")) then
if #find_joker("cry-sunplanet") == 1 then
bonus = bonus + 1
else
bonus = bonus + Cryptid.nuke_decimals(Cryptid.funny_log(2, #find_joker("cry-sunplanet") + 1), 2)
end
end
local final = math.max(0, starting + bonus)
-- Round to 1 if final value is less than 1 but greater than 0
if final > 0 and final < 1 then
final = 1
end
return final
end
function Cryptid.hand_ascension_numbers(hand_name, tether)
if Cryptid.ascension_numbers[hand_name] and type(Cryptid.ascension_numbers[hand_name]) == "function" then
return Cryptid.ascension_numbers[hand_name](hand_name, tether)
end
if hand_name == "High Card" then
return tether and 1 or nil
elseif hand_name == "Pair" then
return tether and 2 or nil
elseif hand_name == "Two Pair" then
return 4
elseif hand_name == "Three of a Kind" then
return tether and 3 or nil
elseif hand_name == "Straight" or hand_name == "Flush" or hand_name == "Straight Flush" then
return next(SMODS.find_card("j_four_fingers")) and Cryptid.gameset() ~= "modest" and 4 or 5
elseif
hand_name == "Full House"
or hand_name == "Five of a Kind"
or hand_name == "Flush House"
or hand_name == "cry_Bulwark"
or hand_name == "Flush Five"
or hand_name == "bunc_Spectrum"
or hand_name == "bunc_Straight Spectrum"
or hand_name == "bunc_Spectrum House"
or hand_name == "bunc_Spectrum Five"
then
return 5
elseif hand_name == "Four of a Kind" then
return G.GAME.used_vouchers.v_cry_hyperspacetether and 4 or nil
elseif hand_name == "cry_Clusterfuck" or hand_name == "cry_UltPair" then
return 8
elseif hand_name == "cry_WholeDeck" then
return 52
elseif hand_name == "cry_Declare0" then
return G.GAME.hands.cry_Declare0
and G.GAME.hands.cry_Declare0.declare_cards
and #G.GAME.hands.cry_Declare0.declare_cards
elseif hand_name == "cry_Declare1" then
return G.GAME.hands.cry_Declare1
and G.GAME.hands.cry_Declare1.declare_cards
and #G.GAME.hands.cry_Declare1.declare_cards
elseif hand_name == "cry_Declare2" then
return G.GAME.hands.cry_Declare2
and G.GAME.hands.cry_Declare2.declare_cards
and #G.GAME.hands.cry_Declare2.declare_cards
elseif
hand_name == "spa_Spectrum"
or hand_name == "spa_Straight_Spectrum"
or hand_name == "spa_Spectrum_House"
or hand_name == "spa_Spectrum_Five"
or hand_name == "spa_Flush_Spectrum"
or hand_name == "spa_Straight_Flush_Spectrum"
or hand_name == "spa_Flush_Spectrum_House"
or hand_name == "spa_Flush_Spectrum_Five"
then
return SpectrumAPI
and SpectrumAPI.configuration.misc.four_fingers_spectrums
and next(SMODS.find_card("j_four_fingers"))
and Cryptid.gameset() ~= "modest"
and 4
or 5
end
return nil
end

View file

@ -3,18 +3,19 @@
-- deal with Rigged and Fragile when scoring a playing card
local ec = eval_card
function eval_card(card, context)
if not card then
card = {
ability = {},
can_calculate = function()
return false
end,
}
end
if card.will_shatter then
return {}, {}
end
-- Store old probability for later reference
local ggpn = G.GAME.probabilities.normal
if card.ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local ret, post = ec(card, context)
if card.ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
return ret, post
end
@ -39,398 +40,6 @@ function Card:cry_copy_ability()
end
local cj = Card.calculate_joker
function Card:cry_double_scale_calc(orig_ability, in_context_scaling)
if
self.ability.name ~= "cry-happyhouse"
and self.ability.name ~= "Acrobat"
and self.ability.name ~= "cry-sapling"
and self.ability.name ~= "cry-mstack"
and self.ability.name ~= "cry-notebook"
and self.ability.name ~= "Invisible Joker"
and self.ability.name ~= "cry-Old Invisible Joker"
then
local jkr = self
if jkr.ability and type(jkr.ability) == "table" then
if not G.GAME.cry_double_scale[jkr.sort_id] or not G.GAME.cry_double_scale[jkr.sort_id].ability then
if not G.GAME.cry_double_scale[jkr.sort_id] then
G.GAME.cry_double_scale[jkr.sort_id] = { ability = { double_scale = true } }
end
for k, v in pairs(jkr.ability) do
if type(jkr.ability[k]) ~= "table" then
G.GAME.cry_double_scale[jkr.sort_id].ability[k] = v
else
G.GAME.cry_double_scale[jkr.sort_id].ability[k] = {}
for _k, _v in pairs(jkr.ability[k]) do
G.GAME.cry_double_scale[jkr.sort_id].ability[k][_k] = _v
end
end
end
end
if G.GAME.cry_double_scale[jkr.sort_id] and not G.GAME.cry_double_scale[jkr.sort_id].scaler then
local dbl_info = G.GAME.cry_double_scale[jkr.sort_id]
if jkr.ability.name == "cry-Number Blocks" then
dbl_info.base = { "extra", "money" }
dbl_info.scaler = { "extra", "money_mod" }
dbl_info.scaler_base = jkr.ability.extra.money_mod
dbl_info.offset = 1
end
if jkr.ability.name == "cry-Exponentia" then
dbl_info.base = { "extra", "Emult" }
dbl_info.scaler = { "extra", "Emult_mod" }
dbl_info.scaler_base = jkr.ability.extra.Emult_mod
dbl_info.offset = 1
end
if jkr.ability.name == "cry-Redeo" then
dbl_info.base = { "extra", "money_req" }
dbl_info.scaler = { "extra", "money_mod" }
dbl_info.scaler_base = jkr.ability.extra.money_mod
dbl_info.offset = 1
end
if jkr.ability.name == "cry-Chili Pepper" then
dbl_info.base = { "extra", "Xmult" }
dbl_info.scaler = { "extra", "Xmult_mod" }
dbl_info.scaler_base = jkr.ability.extra.Xmult_mod
dbl_info.offset = 1
end
if jkr.ability.name == "cry-Scalae" then
dbl_info.base = { "extra", "shadow_scale" }
dbl_info.scaler = { "extra", "shadow_scale_mod" }
dbl_info.scaler_base = jkr.ability.extra.scale_mod
dbl_info.offset = 1
end
if jkr.ability.name == "cry-mprime" then
dbl_info.base = { "extra", "mult" }
dbl_info.scaler = { "extra", "bonus" }
dbl_info.scaler_base = jkr.ability.extra.bonus
dbl_info.offset = 1
end
if jkr.ability.name == "Yorick" then
dbl_info.base = { "x_mult" }
dbl_info.scaler = { "extra", "xmult" } --not kidding
dbl_info.scaler_base = 1
dbl_info.offset = 1
end
if jkr.ability.name == "Hologram" then
dbl_info.base = { "x_mult" }
dbl_info.scaler = { "extra" }
dbl_info.scaler_base = jkr.ability.extra
dbl_info.offset = 1
end
if jkr.ability.name == "Gift Card" then
dbl_info.base = { "extra_value" }
dbl_info.scaler = { "extra" }
dbl_info.scaler_base = jkr.ability.extra
dbl_info.offset = 1
end
if jkr.ability.name == "Throwback" then
dbl_info.base = { "x_mult" }
dbl_info.scaler = { "extra" }
dbl_info.scaler_base = jkr.ability.x_mult or 1
dbl_info.offset = 1
end
if jkr.ability.name == "Egg" then
dbl_info.base = { "extra_value" }
dbl_info.scaler = { "extra" }
dbl_info.scaler_base = jkr.ability.extra
dbl_info.offset = 1
end
local default_modifiers = {
mult = 0,
h_mult = 0,
h_x_mult = 0,
h_dollars = 0,
p_dollars = 0,
t_mult = 0,
t_chips = 0,
x_mult = 1,
h_size = 0,
d_size = 0,
}
for k, v in pairs(jkr.ability) do
--extra_value is ignored because it can be scaled by Gift Card
if
k ~= "extra_value"
and dbl_info.ability[k] ~= v
and is_number(v)
and is_number(dbl_info.ability[k])
then
dbl_info.base = { k }
local predicted_mod = math.abs(to_number(to_big(v)) - to_number(to_big(dbl_info.ability[k])))
local best_key = { "" }
local best_coeff = 10 ^ 100
for l, u in pairs(jkr.ability) do
if not (default_modifiers[l] and default_modifiers[l] == u) then
if l ~= k and is_number(u) then
if
to_number(to_big(predicted_mod / u)) >= 0.999
and to_number(to_big(predicted_mod / u)) < to_number(to_big(best_coeff))
then
best_coeff = to_number(to_big(predicted_mod / u))
best_key = { l }
end
end
if type(jkr.ability[l]) == "table" then
for _l, _u in pairs(jkr.ability[l]) do
if
is_number(_u)
and to_number(to_big(predicted_mod / _u)) >= 0.999
and to_number(to_big(predicted_mod / _u))
< to_number(to_big(best_coeff))
then
best_coeff = to_number(to_big(predicted_mod / _u))
best_key = { l, _l }
end
end
end
end
end
dbl_info.scaler = best_key
end
if
type(jkr.ability[k]) == "table"
and type(dbl_info.ability) == "table"
and type(dbl_info.ability[k]) == "table"
then
for _k, _v in pairs(jkr.ability[k]) do
if
dbl_info.ability[k][_k] ~= _v
and is_number(_v)
and is_number(dbl_info.ability[k][_k])
then
dbl_info.base = { k, _k }
local predicted_mod = math.abs(_v - dbl_info.ability[k][_k])
local best_key = { "" }
local best_coeff = 10 ^ 100
for l, u in pairs(jkr.ability) do
if is_number(u) and to_number(to_big(predicted_mod / u)) >= 0.999 then
if to_number(to_big(predicted_mod / u)) < to_number(to_big(best_coeff)) then
best_coeff = to_number(to_big(predicted_mod / u))
best_key = { l }
end
end
if type(jkr.ability[l]) == "table" then
for _l, _u in pairs(jkr.ability[l]) do
if
(l ~= k or _l ~= _k)
and is_number(_u)
and to_number(to_big(predicted_mod / _u)) >= 0.999
then
if
to_number(to_big(predicted_mod / _u))
< to_number(to_big(best_coeff))
then
best_coeff = to_number(to_big(predicted_mod / _u))
best_key = { l, _l }
end
end
end
end
end
dbl_info.scaler = best_key
end
end
end
end
if dbl_info.scaler then
dbl_info.scaler_base = #dbl_info.scaler == 2
and orig_ability[dbl_info.scaler[1]][dbl_info.scaler[2]]
or orig_ability[dbl_info.scaler[1]]
dbl_info.offset = 1
end
end
end
end
local orig_scale_base = nil
local orig_scale_scale = nil
if G.GAME.cry_double_scale[self.sort_id] and G.GAME.cry_double_scale[self.sort_id].scaler then
local jkr = self
local dbl_info = G.GAME.cry_double_scale[self.sort_id]
if #dbl_info.base == 2 then
if
not (
type(jkr.ability) ~= "table"
or not orig_ability[dbl_info.base[1]]
or type(orig_ability[dbl_info.base[1]]) ~= "table"
or not orig_ability[dbl_info.base[1]][dbl_info.base[2]]
)
then
orig_scale_base = orig_ability[dbl_info.base[1]][dbl_info.base[2]]
end
else
if jkr.ability[dbl_info.base[1]] then
orig_scale_base = orig_ability[dbl_info.base[1]]
end
end
if #dbl_info.scaler == 2 then
if
not (
not orig_ability[dbl_info.scaler[1]]
or type(orig_ability[dbl_info.scaler[1]]) == "number"
or not orig_ability[dbl_info.scaler[1]][dbl_info.scaler[2]]
)
then
orig_scale_scale = orig_ability[dbl_info.scaler[1]][dbl_info.scaler[2]]
end
else
if orig_ability[dbl_info.scaler[1]] then
orig_scale_scale = orig_ability[dbl_info.scaler[1]]
end
end
end
if orig_scale_base and orig_scale_scale then
local new_scale_base = nil
local true_base = nil
local jkr = self
local dbl_info = G.GAME.cry_double_scale[self.sort_id]
if #dbl_info.base == 2 then
if
not (
type(jkr.ability) ~= "table"
or not jkr.ability[dbl_info.base[1]]
or type(jkr.ability[dbl_info.base[1]]) ~= "table"
or not jkr.ability[dbl_info.base[1]][dbl_info.base[2]]
)
then
new_scale_base = jkr.ability[dbl_info.base[1]][dbl_info.base[2]]
end
else
if jkr.ability[dbl_info.base[1]] then
new_scale_base = jkr.ability[dbl_info.base[1]]
end
end
true_base = dbl_info.scaler_base
if
new_scale_base and ((to_big(math.abs(new_scale_base - orig_scale_base)) > to_big(0)) or in_context_scaling)
then
for i = 1, #G.jokers.cards do
local obj = G.jokers.cards[i].config.center
if obj.cry_scale_mod and type(obj.cry_scale_mod) == "function" then
local ggpn = G.GAME.probabilities.normal
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local o = obj:cry_scale_mod(
G.jokers.cards[i],
jkr,
orig_scale_scale,
true_base,
orig_scale_base,
new_scale_base
)
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
if o then
if #dbl_info.scaler == 2 then
if
not (
not jkr.ability[dbl_info.scaler[1]]
or not jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]]
)
then
jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]] = o
orig_scale_scale = o
end
else
if jkr.ability[dbl_info.scaler[1]] then
jkr.ability[dbl_info.scaler[1]] = o
orig_scale_scale = o
end
end
card_eval_status_text(
G.jokers.cards[i],
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex") }
)
end
local reps = {}
for i2 = 1, #G.jokers.cards do
local _card = G.jokers.cards[i2]
local ggpn = G.GAME.probabilities.normal
if _card.ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local check =
cj(G.jokers.cards[i2], { retrigger_joker_check = true, other_card = G.jokers.cards[i] })
if _card.ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
if type(check) == "table" then
reps[i2] = check and check.repetitions and check or 0
else
reps[i2] = 0
end
if
G.jokers.cards[i2] == G.jokers.cards[i]
and G.jokers.cards[i].edition
and G.jokers.cards[i].edition.retriggers
then
local old_repetitions = reps[i] ~= 0 and reps[i].repetitions or 0
local check = false --G.jokers.cards[i]:calculate_retriggers()
if check and check.repetitions then
check.repetitions = check.repetitions + old_repetitions
reps[i] = check
end
end
end
for i0, j in ipairs(reps) do
if (type(j) == "table") and j.repetitions and (j.repetitions > 0) then
for r = 1, j.repetitions do
card_eval_status_text(j.card, "jokers", nil, nil, nil, j)
local ggpn = G.GAME.probabilities.normal
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local o = obj:cry_scale_mod(
G.jokers.cards[i],
jkr,
orig_scale_scale,
true_base,
orig_scale_base,
new_scale_base
)
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
if o then
if #dbl_info.scaler == 2 then
if
not (
not jkr.ability[dbl_info.scaler[1]]
or not jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]]
)
then
jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]] = o
orig_scale_scale = o
end
else
if jkr.ability[dbl_info.scaler[1]] then
jkr.ability[dbl_info.scaler[1]] = o
orig_scale_scale = o
end
end
card_eval_status_text(
G.jokers.cards[i],
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex") }
)
end
end
end
end
end
end
end
end
end
local smcc = SMODS.calculate_context
function SMODS.calculate_context(context, return_table)
for k, v in pairs(SMODS.Events) do
@ -497,8 +106,9 @@ function Card:calculate_joker(context)
and self.edition
and self.edition.cry_double_sided
then
self:init_dbl_side()
active_side = self.dbl_side
local dummy = self:get_other_side_dummy()
if dummy then
active_side = dummy
if context.callback then
local m = context.callback
context.callback = function(card, a, b)
@ -506,18 +116,17 @@ function Card:calculate_joker(context)
end
context.dbl_side = true
end
end
if active_side.will_shatter then
else
return
end
end
if not active_side or active_side.will_shatter then
return
end
local ggpn = G.GAME.probabilities.normal
if not G.GAME.cry_double_scale then
G.GAME.cry_double_scale = { double_scale = true } --doesn't really matter what's in here as long as there's something
end
if active_side.ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local orig_ability = active_side:cry_copy_ability()
local orig_ability = copy_table(active_side.ability)
local in_context_scaling = false
local callback = context.callback
if active_side.ability.cry_possessed then
@ -594,327 +203,5 @@ function Card:calculate_joker(context)
in_context_scaling = true
end
end
if active_side.ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
if
(next(find_joker("cry-Scalae")) or next(find_joker("cry-Double Scale")))
or (active_side.ability.name == "cry-Exponentia" or "cry-Compound Interest")
then
active_side:cry_double_scale_calc(orig_ability, in_context_scaling)
end
return ret, trig
end
function Cryptid.exponentia_scale_mod(self, orig_scale_scale, orig_scale_base, new_scale_base)
local jkr = self
local dbl_info = G.GAME.cry_double_scale[jkr.sort_id]
if jkr.ability and type(jkr.ability) == "table" then
if not G.GAME.cry_double_scale[jkr.sort_id] or not G.GAME.cry_double_scale[jkr.sort_id].ability then
if not G.GAME.cry_double_scale[jkr.sort_id] then
G.GAME.cry_double_scale[jkr.sort_id] = { ability = { double_scale = true } }
end
for k, v in pairs(jkr.ability) do
if type(jkr.ability[k]) ~= "table" then
G.GAME.cry_double_scale[jkr.sort_id].ability[k] = v
else
G.GAME.cry_double_scale[jkr.sort_id].ability[k] = {}
for _k, _v in pairs(jkr.ability[k]) do
G.GAME.cry_double_scale[jkr.sort_id].ability[k][_k] = _v
end
end
end
end
if not dbl_info then
dbl_info = {}
end
if G.GAME.cry_double_scale[jkr.sort_id] and not G.GAME.cry_double_scale[jkr.sort_id].scaler then
dbl_info.base = { "extra", "Emult" }
dbl_info.scaler = { "extra", "Emult_mod" }
dbl_info.scaler_base = jkr.ability.extra.Emult_mod
dbl_info.offset = 1
end
end
local true_base = dbl_info.scaler_base
if true_base then
for i = 1, #G.jokers.cards do
local obj = G.jokers.cards[i].config.center
if obj.cry_scale_mod and type(obj.cry_scale_mod) == "function" then
local ggpn = G.GAME.probabilities.normal
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local o = obj:cry_scale_mod(
G.jokers.cards[i],
jkr,
orig_scale_scale,
true_base,
orig_scale_base,
new_scale_base
)
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
if o then
if #dbl_info.scaler == 2 then
if
not (
not jkr.ability[dbl_info.scaler[1]]
or not jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]]
)
then
jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]] = o
orig_scale_scale = o
end
else
if jkr.ability[dbl_info.scaler[1]] then
jkr.ability[dbl_info.scaler[1]] = o
orig_scale_scale = o
end
end
card_eval_status_text(
G.jokers.cards[i],
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex") }
)
end
local reps = {}
for i2 = 1, #G.jokers.cards do
local _card = G.jokers.cards[i2]
local ggpn = G.GAME.probabilities.normal
if _card.ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local check =
cj(G.jokers.cards[i2], { retrigger_joker_check = true, other_card = G.jokers.cards[i] })
if _card.ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
if type(check) == "table" then
reps[i2] = check and check.repetitions and check or 0
else
reps[i2] = 0
end
if
G.jokers.cards[i2] == G.jokers.cards[i]
and G.jokers.cards[i].edition
and G.jokers.cards[i].edition.retriggers
then
local old_repetitions = reps[i] ~= 0 and reps[i].repetitions or 0
local check = false --G.jokers.cards[i]:calculate_retriggers()
if check and check.repetitions then
check.repetitions = check.repetitions + old_repetitions
reps[i] = check
end
end
end
for i0, j in ipairs(reps) do
if (type(j) == "table") and j.repetitions and (j.repetitions > 0) then
for r = 1, j.repetitions do
card_eval_status_text(j.card, "jokers", nil, nil, nil, j)
local ggpn = G.GAME.probabilities.normal
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local o = obj:cry_scale_mod(
G.jokers.cards[i],
jkr,
orig_scale_scale,
true_base,
orig_scale_base,
new_scale_base
)
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
if o then
if #dbl_info.scaler == 2 then
if
not (
not jkr.ability[dbl_info.scaler[1]]
or not jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]]
)
then
jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]] = o
orig_scale_scale = o
end
else
if jkr.ability[dbl_info.scaler[1]] then
jkr.ability[dbl_info.scaler[1]] = o
orig_scale_scale = o
end
end
card_eval_status_text(
G.jokers.cards[i],
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex") }
)
end
end
end
end
end
end
end
end
function Cryptid.compound_interest_scale_mod(self, orig_scale_scale, orig_scale_base, new_scale_base)
local jkr = self
local dbl_info = G.GAME.cry_double_scale[jkr.sort_id]
if jkr.ability and type(jkr.ability) == "table" then
if not G.GAME.cry_double_scale[jkr.sort_id] or not G.GAME.cry_double_scale[jkr.sort_id].ability then
if not G.GAME.cry_double_scale[jkr.sort_id] then
G.GAME.cry_double_scale[jkr.sort_id] = { ability = { double_scale = true } }
end
for k, v in pairs(jkr.ability) do
if type(jkr.ability[k]) ~= "table" then
G.GAME.cry_double_scale[jkr.sort_id].ability[k] = v
else
G.GAME.cry_double_scale[jkr.sort_id].ability[k] = {}
for _k, _v in pairs(jkr.ability[k]) do
G.GAME.cry_double_scale[jkr.sort_id].ability[k][_k] = _v
end
end
end
end
if G.GAME.cry_double_scale[jkr.sort_id] and not G.GAME.cry_double_scale[jkr.sort_id].scaler then
dbl_info.base = { "extra", "percent" }
dbl_info.scaler = { "extra", "percent_mod" }
dbl_info.scaler_base = jkr.ability.extra.percent_mod
dbl_info.offset = 1
end
end
local true_base = dbl_info.scaler_base
if true_base then
for i = 1, #G.jokers.cards do
local obj = G.jokers.cards[i].config.center
if obj.cry_scale_mod and type(obj.cry_scale_mod) == "function" then
local ggpn = G.GAME.probabilities.normal
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local o = obj:cry_scale_mod(
G.jokers.cards[i],
jkr,
orig_scale_scale,
true_base,
orig_scale_base,
new_scale_base
)
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
if o then
if #dbl_info.scaler == 2 then
if
not (
not jkr.ability[dbl_info.scaler[1]]
or not jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]]
)
then
jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]] = o
orig_scale_scale = o
end
else
if jkr.ability[dbl_info.scaler[1]] then
jkr.ability[dbl_info.scaler[1]] = o
orig_scale_scale = o
end
end
card_eval_status_text(
G.jokers.cards[i],
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex") }
)
end
local reps = {}
for i2 = 1, #G.jokers.cards do
local _card = G.jokers.cards[i2]
local ggpn = G.GAME.probabilities.normal
if _card.ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local check =
cj(G.jokers.cards[i2], { retrigger_joker_check = true, other_card = G.jokers.cards[i] })
if _card.ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
if type(check) == "table" then
reps[i2] = check and check.repetitions and check or 0
else
reps[i2] = 0
end
if
G.jokers.cards[i2] == G.jokers.cards[i]
and G.jokers.cards[i].edition
and G.jokers.cards[i].edition.retriggers
then
local old_repetitions = reps[i] ~= 0 and reps[i].repetitions or 0
local check = false --G.jokers.cards[i]:calculate_retriggers()
if check and check.repetitions then
check.repetitions = check.repetitions + old_repetitions
reps[i] = check
end
end
end
for i0, j in ipairs(reps) do
if (type(j) == "table") and j.repetitions and (j.repetitions > 0) then
for r = 1, j.repetitions do
card_eval_status_text(j.card, "jokers", nil, nil, nil, j)
local ggpn = G.GAME.probabilities.normal
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = 1e9
end
local o = obj:cry_scale_mod(
G.jokers.cards[i],
jkr,
orig_scale_scale,
true_base,
orig_scale_base,
new_scale_base
)
if G.jokers.cards[i].ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
if o then
if #dbl_info.scaler == 2 then
if
not (
not jkr.ability[dbl_info.scaler[1]]
or not jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]]
)
then
jkr.ability[dbl_info.scaler[1]][dbl_info.scaler[2]] = o
orig_scale_scale = o
end
else
if jkr.ability[dbl_info.scaler[1]] then
jkr.ability[dbl_info.scaler[1]] = o
orig_scale_scale = o
end
end
card_eval_status_text(
G.jokers.cards[i],
"extra",
nil,
nil,
nil,
{ message = localize("k_upgrade_ex") }
)
end
end
end
end
end
end
end
end

View file

@ -15,11 +15,11 @@ SMODS.PokerHand({
l_chips = 50,
l_mult = 1,
example = {
{ "S_A", true, "m_stone" },
{ "S_A", true, "m_stone" },
{ "S_A", true, "m_stone" },
{ "S_A", true, "m_stone" },
{ "S_A", true, "m_stone" },
{ "S_A", true, enhancement = "m_stone" },
{ "S_A", true, enhancement = "m_stone" },
{ "S_A", true, enhancement = "m_stone" },
{ "S_A", true, enhancement = "m_stone" },
{ "S_A", true, enhancement = "m_stone" },
},
atlas = "poker_hands",
pos = { x = 0, y = 0 },
@ -267,6 +267,68 @@ SMODS.PokerHand({
return
end,
})
SMODS.PokerHand({
key = "None",
visible = false,
chips = 0,
mult = 0,
l_chips = 5,
l_mult = 0.5,
example = {},
atlas = "poker_hands",
pos = { x = 0, y = 0 },
evaluate = function(parts, hand)
if Cryptid.enabled("set_cry_poker_hand_stuff") ~= true or Cryptid.enabled("c_cry_nibiru") ~= true then --or Cryptid.enabled("c_cry_asteroidbelt") ~= true then
return {}
end
return { hand and #hand == 0 and G.GAME.hands["cry_None"].visible and {} or nil }
end,
})
SMODS.PokerHand({
key = "Declare0",
visible = false,
chips = 0,
mult = 0,
l_chips = 0,
l_mult = 0,
example = {},
atlas = "poker_hands",
pos = { x = 0, y = 0 },
above_hand = "cry_UltPair",
order_offset = 1000,
evaluate = function(parts, hand) end,
})
SMODS.PokerHand({
key = "Declare1",
visible = false,
chips = 0,
mult = 0,
l_chips = 0,
l_mult = 0,
example = {},
atlas = "poker_hands",
pos = { x = 0, y = 0 },
above_hand = "cry_UltPair",
order_offset = 1001,
evaluate = function(parts, hand) end,
})
SMODS.PokerHand({
key = "Declare2",
visible = false,
chips = 0,
mult = 0,
l_chips = 0,
l_mult = 0,
example = {},
atlas = "poker_hands",
pos = { x = 0, y = 0 },
above_hand = "cry_UltPair",
order_offset = 1002,
evaluate = function(parts, hand) end,
})
SMODS.Rarity({
key = "exotic",
loc_txt = {},
@ -312,6 +374,7 @@ SMODS.ConsumableType({
default = "c_cry_potion",
can_stack = false,
can_divide = false,
no_collection = true,
})
-- Pool used by Food Jokers
SMODS.ObjectType({
@ -399,6 +462,14 @@ SMODS.Atlas({
Sprite(0, 0, G.CARD_W, G.CARD_H, G[self.atlas_table][self.key_noloc or self.key], { x = 5, y = 0 })
end,
})
SMODS.Sound({
key = "forcetrigger",
path = "forcetrigger.ogg",
})
SMODS.Sound({
key = "demitrigger",
path = "demitrigger.ogg",
})
SMODS.Sound({
key = "meow1",
path = "meow1.ogg",
@ -492,9 +563,17 @@ SMODS.Sound({
key = "music_big",
path = "music_big.ogg",
select_music_track = function()
return Cryptid_config.Cryptid
if G.GAME.cry_music_big then
return G.GAME.cry_music_big
end
if
Cryptid_config.Cryptid
and Cryptid_config.Cryptid.big_music
and to_big(G.GAME.round_scores["hand"].amt) > to_big(10) ^ 1000000
then
G.GAME.cry_music_big = true
return true
end
end,
})
SMODS.Sound({
@ -661,7 +740,7 @@ SMODS.UndiscoveredSprite({
key = "Code",
atlas = "atlasnotjokers",
path = "atlasnotjokers.png",
pos = { x = 9, y = 5 },
pos = { x = 12, y = 6 },
px = 71,
py = 95,
})
@ -681,6 +760,15 @@ SMODS.Atlas({
py = 34,
frames = 21,
})
--splitting these up because like more than 20 on one atlas is a crime
SMODS.Atlas({
key = "blinds_two",
atlas_table = "ANIMATION_ATLAS",
path = "bl_cry_two.png",
px = 34,
py = 34,
frames = 21,
})
SMODS.Atlas({
key = "nostalgia",
atlas_table = "ANIMATION_ATLAS",
@ -702,3 +790,77 @@ SMODS.Atlas({
px = 73,
py = 95,
})
SMODS.Atlas({
key = "glowingSleeve",
path = "sleeve_cry_glowing.png",
px = 73,
py = 95,
})
-- Scoring Calculation for The Tax
SMODS.Scoring_Calculation({
key = "tax",
func = function(self, chips, mult, flames)
return math.floor(math.min(0.4 * G.GAME.blind.chips, chips * mult) + 0.5)
end,
replace_ui = function(self)
local aaa = 40
local bbb = localize({ type = "variable", key = "tax_hand", vars = { aaa } })[1]
-- rebuild the ui to change colours and add text and stuff
-- SMODS made some stuff for this so that's kinda convienient ig
return {
n = G.UIT.R,
config = { minh = 1.2, align = "cm" },
nodes = {
{
n = G.UIT.C,
config = { align = "cm" },
nodes = {
{
n = G.UIT.R,
config = { align = "cm", minh = 1, padding = 0.1 },
nodes = {
-- Chips box
{
n = G.UIT.C,
config = { align = "cm", id = "hand_chips_container" },
nodes = {
SMODS.GUI.score_container({
type = "chips",
text = "chip_text",
align = "cr",
colour = G.C.CRY_TAX_CHIPS,
}),
},
},
-- Operator thingy (Stays the same)
SMODS.GUI.operator(0.4),
-- Mult box
{
n = G.UIT.C,
config = { align = "cm", id = "hand_mult_container" },
nodes = {
SMODS.GUI.score_container({
type = "mult",
colour = G.C.CRY_TAX_MULT,
}),
},
},
},
},
-- Text
{
n = G.UIT.R,
config = { align = "cm" },
nodes = {
{
n = G.UIT.T,
config = { text = bbb, scale = 0.25, colour = G.C.IMPORTANT },
},
},
},
},
},
},
}
end,
})

View file

@ -13,26 +13,28 @@ SMODS.Joker:take_ownership("green_joker", {
and not context.blueprint
and context.other_card == context.full_hand[#context.full_hand]
then
local prev_mult = card.ability.mult
card.ability.mult = math.max(0, card.ability.mult - card.ability.extra)
if card.ability.mult ~= prev_mult then
return {
message = localize({
type = "variable",
key = "a_mult_minus",
vars = { card.ability.extra },
}),
colour = G.C.RED,
card = card,
}
if card.ability.mult ~= 0 then
SMODS.scale_card(card, {
ref_table = card.ability,
ref_value = "mult",
scalar_table = card.ability,
scalar_value = "extra",
operation = function(ref_table, ref_value, initial, change)
ref_table[ref_value] = math.max(0, initial - change)
end,
message_key = "a_mult_minus",
message_colour = G.C.RED,
})
end
end
if context.cardarea == G.jokers and context.before and not context.blueprint then
card.ability.mult = card.ability.mult + card.ability.extra
return {
card = card,
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.extra } }),
}
SMODS.scale_card(card, {
ref_table = card.ability,
ref_value = "mult",
scalar_value = "extra",
message_key = "a_mult",
message_colour = G.C.RED,
})
end
if context.joker_main then
return {
@ -44,41 +46,6 @@ SMODS.Joker:take_ownership("green_joker", {
loc_txt = {},
}, true)
--Top Gear from The World End with Jimbo has several conflicts with Cryptid items
--Namely, It overrides the edition that edition jokers spawn with, and doesn't work correctly with edition decks
--I'm taking ownership of this, overiding it, and making an implementaion that is compatible with Cryptid
--Unrelated but kind of related side note: this prevents top gear from showing up in collection, not sure what's up with that
--Is it due to how TWEWJ is Coded? Is it an issue with Steamodded itself? Might be worth looking into, just sayin
if (SMODS.Mods["TWEWY"] or {}).can_load then
SMODS.Joker:take_ownership("twewy_topGear", {
name = "Cry-topGear",
--Stop Top Gear's Old code from working by overriding these
add_to_deck = function(self, card, from_debuff) end,
remove_from_deck = function(self, card, from_debuff) end,
rarity = 3,
loc_txt = {
name = "Top Gear",
text = {
"All {C:blue}Common{C:attention} Jokers{}",
"are {C:dark_edition}Polychrome{}",
},
},
})
end
--Make Ortalab's Locked jokers not show up on Deck of Equilibrium and Antimatter Deck
if (SMODS.Mods["ortalab"] or {}).can_load then
for i = 1, 150 do
print(i)
SMODS.Joker:take_ownership("ortalab_temp_" .. i, {
name = "Cry-skibidi",
no_doe = true,
})
end
end
--Requires Malverk Mod
if (SMODS.Mods["malverk"] or {}).can_load then
AltTexture({
@ -117,9 +84,11 @@ if (SMODS.Mods["AntePreview"] or {}).can_load then
big = get_new_boss()
end
local predictions = predict_hook()
if next(SMODS.find_card("j_cry_kittyprinter")) then
predictions.Small.tag = "tag_cry_cat"
predictions.Big.tag = "tag_cry_cat"
local s = Cryptid.get_next_tag("Small")
local b = Cryptid.get_next_tag("Big")
if s or b then
predictions.Small.tag = s or predictions.Small.tag
predictions.Big.tag = b or predictions.Big.tag
end
if G.GAME.modifiers.cry_no_tags then
for _, pred in pairs(predictions) do
@ -140,3 +109,63 @@ if (SMODS.Mods["AntePreview"] or {}).can_load then
return predictions
end
end
--Designed to run if ran with is_suit overriding mods of higher priority (UnStable comes to first mind)
function Card:is_suit_force_enhancement(suit, bypass_debuff, flush_calc)
--Force suit to be suit X if specified in enhancement, only if not vampired
if Cryptid.cry_enhancement_has_specific_suit(self) and not self.vampired then
return suit == Cryptid.cry_enhancement_get_specific_suit(self)
end
local ref = self:is_suit(suit, bypass_debuff, flush_calc)
return ref
end
-- === Cross mod access for Cryptid === --
-- IcyEthics: Adding this section to collect functions that are intended to help other mods
-- interact with Cryptid's functionality in some way
-- ://CLASS API
-- This function allows another mod to set up a name and alias that's accessible by the ://CLASS Code Card
-- It's also set up more generically so that other mods can access the same information
Cryptid.enhancement_alias_list = {}
---@param list table
function Cryptid.load_enhancement_aliases(list)
for _enhancementkey, _listofaliases in pairs(list) do
Cryptid.enhancement_alias_list[_enhancementkey] = _listofaliases
end
end
-- Acclimator Voucher API functions
-- This should allow other mods to set up their own tier 3 vouchers in the style of
-- the Tarot Acclimator voucher by setting up the voucher and just initializing
-- a call to this function in their initialization
Cryptid.voucher_acclimator_data = {}
---@param voucher_key string
---@param localization_key string
---@param ref_value string
---@param colour any
function Cryptid.setup_voucher_rate_adjuster(voucher_key, localization_key, ref_value, colour)
-- Necessary values:
-- Voucher key
-- localize key
-- ref value
-- colour
if not voucher_key or not localization_key or not ref_value or not colour then
print("Cryptid.setup_voucher_rate_adjuster was improperly called")
end
Cryptid.voucher_acclimator_data[#Cryptid.voucher_acclimator_data + 1] = {
voucher_key = voucher_key,
localization_key = localization_key,
ref_value = ref_value,
colour = colour,
}
print(Cryptid.voucher_acclimator_data[#Cryptid.voucher_acclimator_data])
end
Cryptid.setup_voucher_rate_adjuster("v_cry_tacclimator", "b_tarot_rate", "tarot", G.C.SECONDARY_SET.Tarot)
Cryptid.setup_voucher_rate_adjuster("v_cry_pacclimator", "b_planet_rate", "planet", G.C.SECONDARY_SET.Planet)

1332
Cryptid/lib/forcetrigger.lua Normal file

File diff suppressed because it is too large Load diff

View file

@ -31,10 +31,6 @@ function Game:update(dt)
end
G.FUNCS.cry_intro_controller = function()
if Jen then
G.PROFILES[G.SETTINGS.profile].cry_intro_complete = true
G.PROFILES[G.SETTINGS.profile].cry_gameset = "madness"
end
G.PROFILES[G.SETTINGS.profile].cry_intro_progress = G.PROFILES[G.SETTINGS.profile].cry_intro_progress
or {
state = "start",
@ -188,7 +184,7 @@ G.FUNCS.cry_intro_part = function(_part)
--TODO: localize
G.modestBtn = create_UIBox_character_button_with_sprite({
sprite = modestSprite,
button = "Modest",
button = localize("cry_gameset_modest"),
id = "modest",
func = "cry_modest",
colour = G.C.GREEN,
@ -196,7 +192,7 @@ G.FUNCS.cry_intro_part = function(_part)
})
G.mainlineBtn = create_UIBox_character_button_with_sprite({
sprite = mainlineSprite,
button = "Mainline",
button = localize("cry_gameset_mainline"),
id = "mainline",
func = "cry_mainline",
colour = G.C.RED,
@ -204,7 +200,7 @@ G.FUNCS.cry_intro_part = function(_part)
})
G.madnessBtn = create_UIBox_character_button_with_sprite({
sprite = madnessSprite,
button = "Madness",
button = localize("cry_gameset_madness"),
id = "madness",
func = "cry_madness",
colour = G.C.CRY_EXOTIC,
@ -547,9 +543,6 @@ end
-- designed to work on any object type
function Cryptid.gameset(card, center)
if Jen then
return "madness"
end
if not center then
if not card then
return G.PROFILES[G.SETTINGS.profile].cry_gameset or "mainline"
@ -569,7 +562,9 @@ function Cryptid.gameset(card, center)
if center.tag and center.tag.key then --dumb fix for tags
center = center.tag
else
if false then
print("Could not find key for center: " .. tprint(center))
end
return G.PROFILES[G.SETTINGS.profile].cry_gameset or "mainline"
end
end
@ -602,6 +597,11 @@ function Card:set_ability(center, y, z)
if not center then
return
end
-- Addition by IcyEthics to make compatible with strings used on set_ability. Copied directly from the smods set_ability implementation
if type(center) == "string" then
assert(G.P_CENTERS[center], ('Could not find center "%s"'):format(center))
center = G.P_CENTERS[center]
end
if not center.config then
center.config = {} --crashproofing
end
@ -633,15 +633,19 @@ function Card:set_ability(center, y, z)
end
end
--open gameset config UI when clicking on a card in the Cryptid collection
--disable this functionality for Jen's Almanac
if not Jen then
-- open gameset config UI when clicking on a card in the Cryptid collection
-- can be disabled in config
if Cryptid_config.gameset_toggle then
local ccl = Card.click
function Card:click()
ccl(self)
if G.your_collection then
for k, v in pairs(G.your_collection) do
if self.area == v and G.ACTIVE_MOD_UI and G.ACTIVE_MOD_UI.id == "Cryptid" then
if
self.area == v
and G.ACTIVE_MOD_UI
and (Cryptid.mod_gameset_whitelist[G.ACTIVE_MOD_UI.id] or G.ACTIVE_MOD_UI.id == "Cryptid")
then
if not self.config.center or self.config.center and self.config.center.set == "Default" then
--make a fake center
local old_force_gameset = self.config.center and self.config.center.force_gameset
@ -1115,15 +1119,29 @@ function Cryptid.update_obj_registry(m, force_enable)
end
if m.obj_table then
for k, v in pairs(m.obj_table) do
if v.mod and v.mod.id == "Cryptid" then
if v.mod and (v.mod.id == "Cryptid" or Cryptid.mod_gameset_whitelist[v.mod.id]) then
local en = force_enable or Cryptid.enabled(k)
if en == true then
if v.cry_disabled then
v:enable()
if v.key == "set_cry_poker_hand_stuff" then
G.PROFILES[G.SETTINGS.profile].cry_none = Cryptid.safe_get(
G.PROFILES,
G.SETTINGS.profile,
"cry_none2"
) or nil
G.PROFILES[G.SETTINGS.profile].cry_none2 = nil
end
end
else
if not v.cry_disabled then
v:_disable(en)
if v.key == "set_cry_poker_hand_stuff" and G.PROFILES[G.SETTINGS.profile].cry_none then
--Remove the none flag if poker hands are disabled because leaving it on can leave to softlocks
G.PROFILES[G.SETTINGS.profile].cry_none2 =
Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "cry_none")
G.PROFILES[G.SETTINGS.profile].cry_none = nil
end
end
end
end
@ -1141,7 +1159,7 @@ function Cryptid.index_items(func, m)
end
if m.obj_table then
for k, v in pairs(m.obj_table) do
if v.mod and v.mod.id == "Cryptid" then
if v.mod and (v.mod.id == "Cryptid" or Cryptid.mod_gameset_whitelist[v.mod.id]) then
func(v)
end
end
@ -1186,6 +1204,12 @@ SMODS.ContentSet({
key = "m",
atlas = "atlasepic",
pos = { x = 3, y = 1 }, --m
cry_order = -23,
})
SMODS.ContentSet({
key = "meme",
atlas = "atlastwo",
pos = { x = 2, y = 4 }, --Happy House
cry_order = -22,
})
SMODS.ContentSet({
@ -1218,7 +1242,7 @@ SMODS.ContentSet({
key = "deck",
atlas = "atlasdeck",
pos = { x = 4, y = 5 }, --Critical Deck
cry_order = -23,
cry_order = -24,
})
SMODS.ContentSet({
key = "spooky",
@ -1243,7 +1267,7 @@ SMODS.ContentSet({
key = "misc",
atlas = "cry_misc",
pos = { x = 2, y = 0 }, --Echo Card
cry_order = -22,
cry_order = -21,
})
SMODS.ContentSet({
key = "misc_joker",
@ -1329,7 +1353,7 @@ function create_UIBox_your_collection_content_sets()
local joker_pool = {}
for k, v in pairs(SMODS.ContentSet.obj_table) do
if v.set == "Content Set" then
if v.set == "Content Set" and v.original_mod.id == G.ACTIVE_MOD_UI.id then
table.insert(joker_pool, v)
end
end
@ -1424,7 +1448,7 @@ function create_UIBox_your_collection_current_set()
end
Cryptid.index_items(is_in_set)
table.sort(joker_pool, function(a, b)
return a.cry_order < b.cry_order
return (a.cry_order or a.order or pseudorandom(a.key)) < (b.cry_order or b.order or pseudorandom(b.key))
end)
local joker_options = {}
for i = 1, math.ceil(#joker_pool / (5 * #G.your_collection)) do
@ -1493,12 +1517,12 @@ G.FUNCS.your_collection_content_set_page = function(args)
end
local joker_pool = {}
for k, v in pairs(SMODS.ContentSet.obj_table) do
if v.set == "Content Set" then
if v.set == "Content Set" and v.original_mod.id == G.ACTIVE_MOD_UI.id then
table.insert(joker_pool, v)
end
end
table.sort(joker_pool, function(a, b)
return a.cry_order < b.cry_order
return (a.cry_order or a.order or pseudorandom(a.key)) < (b.cry_order or b.order or pseudorandom(b.key))
end)
for i = 1, 5 do
for j = 1, #G.your_collection do
@ -1541,7 +1565,7 @@ G.FUNCS.your_collection_current_set_page = function(args)
end
Cryptid.index_items(is_in_set)
table.sort(joker_pool, function(a, b)
return a.cry_order < b.cry_order
return (a.cry_order or a.order or pseudorandom(a.key)) < (b.cry_order or b.order or pseudorandom(b.key))
end)
for i = 1, 5 do
for j = 1, #G.your_collection do
@ -1612,19 +1636,19 @@ end
-- Hooks for all collection types
local smcp = SMODS.collection_pool
SMODS.collection_pool = function(m)
if G.ACTIVE_MOD_UI and G.ACTIVE_MOD_UI.id == "Cryptid" then
if G.ACTIVE_MOD_UI and (Cryptid.mod_gameset_whitelist[G.ACTIVE_MOD_UI.id] or G.ACTIVE_MOD_UI.id == "Cryptid") then
-- use SMODS pools instead of vanilla pools, so disabled cards appear
if m[1] and m[1].set and m[1].set == "Seal" then
m = {}
for k, v in pairs(SMODS.Seal.obj_table) do
if v.mod and v.mod.id == "Cryptid" then
if v.mod and (Cryptid.mod_gameset_whitelist[v.mod.id] or v.mod.id == "Cryptid") then
table.insert(m, v)
end
end
elseif m[1] and m[1].set and m[1].set == "Sticker" then
m = {}
for k, v in pairs(SMODS.Sticker.obj_table) do
if v.mod and v.mod.id == "Cryptid" then
if v.mod and (Cryptid.mod_gameset_whitelist[v.mod.id] or v.mod.id == "Cryptid") then
table.insert(m, v)
end
end
@ -1632,19 +1656,19 @@ SMODS.collection_pool = function(m)
local set = m[1].set
m = {}
for k, v in pairs(SMODS.Center.obj_table) do
if v.set == set and v.mod and v.mod.id == "Cryptid" then
if v.set == set and v.mod and (Cryptid.mod_gameset_whitelist[v.mod.id] or v.mod.id == "Cryptid") then
table.insert(m, v)
end
end
end
-- Fix blind issues
for k, v in pairs(m) do
if v.set == "Blind" and v.mod and v.mod.id == "Cryptid" then
if v.set == "Blind" and v.mod and (Cryptid.mod_gameset_whitelist[v.mod.id] or v.mod.id == "Cryptid") then
v.config = {}
end
end
table.sort(m, function(a, b)
return a.cry_order < b.cry_order
return (a.cry_order or a.order or pseudorandom(a.key)) < (b.cry_order or b.order or pseudorandom(b.key))
end)
end
return smcp(m)
@ -1654,7 +1678,7 @@ end
local mct = modsCollectionTally
function modsCollectionTally(pool, set)
local t = mct(pool, set)
if G.ACTIVE_MOD_UI and G.ACTIVE_MOD_UI.id == "Cryptid" then
if G.ACTIVE_MOD_UI and (Cryptid.mod_gameset_whitelist[G.ACTIVE_MOD_UI.id] or G.ACTIVE_MOD_UI.id == "Cryptid") then
local obj_tally = { tally = 0, of = 0 }
--infer pool
local _set = set or Cryptid.safe_get(pool, 1, "set")
@ -1709,10 +1733,10 @@ end
-- Make non-center collections show all cards as centers
local uibk = create_UIBox_your_collection_decks
function create_UIBox_your_collection_decks()
if G.ACTIVE_MOD_UI and G.ACTIVE_MOD_UI.id == "Cryptid" then
if G.ACTIVE_MOD_UI and (Cryptid.mod_gameset_whitelist[G.ACTIVE_MOD_UI.id] or G.ACTIVE_MOD_UI.id == "Cryptid") then
local generic_collection_pool = {}
for k, v in pairs(SMODS.Center.obj_table) do
if v.set == "Back" and v.mod and v.mod.id == "Cryptid" then
if v.set == "Back" and v.mod and (v.mod.id == "Cryptid" or Cryptid.mod_gameset_whitelist[v.mod.id]) then
table.insert(generic_collection_pool, v)
end
end
@ -1740,10 +1764,10 @@ end
local uitag = create_UIBox_your_collection_tags
function create_UIBox_your_collection_tags()
if G.ACTIVE_MOD_UI and G.ACTIVE_MOD_UI.id == "Cryptid" then
if G.ACTIVE_MOD_UI and (Cryptid.mod_gameset_whitelist[G.ACTIVE_MOD_UI.id] or G.ACTIVE_MOD_UI.id == "Cryptid") then
local generic_collection_pool = {}
for k, v in pairs(SMODS.Tag.obj_table) do
if v.set == "Tag" and v.mod and v.mod.id == "Cryptid" then
if v.set == "Tag" and v.mod and (v.mod.id == "Cryptid" or Cryptid.mod_gameset_whitelist[v.mod.id]) then
table.insert(generic_collection_pool, v)
end
end
@ -1763,10 +1787,10 @@ end
local uibl = create_UIBox_your_collection_blinds
function create_UIBox_your_collection_blinds()
if G.ACTIVE_MOD_UI and G.ACTIVE_MOD_UI.id == "Cryptid" then
if G.ACTIVE_MOD_UI and (Cryptid.mod_gameset_whitelist[G.ACTIVE_MOD_UI.id] or G.ACTIVE_MOD_UI.id == "Cryptid") then
local generic_collection_pool = {}
for k, v in pairs(SMODS.Blind.obj_table) do
if v.set == "Blind" and v.mod and v.mod.id == "Cryptid" then
if v.set == "Blind" and v.mod and (v.mod.id == "Cryptid" or Cryptid.mod_gameset_whitelist[v.mod.id]) then
table.insert(generic_collection_pool, v)
end
end
@ -1786,7 +1810,7 @@ end
local uisl = create_UIBox_your_collection_seals
function create_UIBox_your_collection_seals()
if G.ACTIVE_MOD_UI and G.ACTIVE_MOD_UI.id == "Cryptid" then
if G.ACTIVE_MOD_UI and (Cryptid.mod_gameset_whitelist[G.ACTIVE_MOD_UI.id] or G.ACTIVE_MOD_UI.id == "Cryptid") then
return SMODS.card_collection_UIBox(G.P_CENTER_POOLS.Seal, { 5, 5 }, {
snap_back = true,
infotip = localize("ml_edition_seal_enhancement_explanation"),
@ -1808,7 +1832,7 @@ end
local uist = create_UIBox_your_collection_stickers
function create_UIBox_your_collection_stickers()
if G.ACTIVE_MOD_UI and G.ACTIVE_MOD_UI.id == "Cryptid" then
if G.ACTIVE_MOD_UI and (Cryptid.mod_gameset_whitelist[G.ACTIVE_MOD_UI.id] or G.ACTIVE_MOD_UI.id == "Cryptid") then
return SMODS.card_collection_UIBox(SMODS.Stickers, { 5, 5 }, {
snap_back = true,
hide_single_page = true,

View file

@ -187,6 +187,9 @@ function Cryptid.pluralize(str, vars)
if type(num) == "string" then
num = (Big and to_number(to_big(num))) or num
end
if not num then
num = 1
end
local plural = _table[1] -- default
local checks = { [1] = "=" } -- checks 1 by default
local checks1mod = false -- tracks if 1 was modified
@ -217,6 +220,9 @@ function Cryptid.pluralize(str, vars)
table.sort(keys, function(a, b)
return a < b
end)
if not (tonumber(num) or is_number(num)) then
num = 1
end
for _, k in ipairs(keys) do
if fch(checks[k], "=") then
if to_big(math.abs(num - k)) < to_big(0.001) then
@ -293,9 +299,11 @@ function Cryptid.with_deck_effects(card, func)
if not card.added_to_deck then
return func(card)
else
card.from_quantum = true
card:remove_from_deck(true)
local ret = func(card)
card:add_to_deck(true)
card.from_quantum = nil
return ret
end
end
@ -468,7 +476,7 @@ function Cryptid.bonus_voucher_mod(mod)
{ bypass_discovery_center = true, bypass_discovery_ui = true }
)
card.shop_cry_bonusvoucher = #curr_bonus
Cryptid.misprintize(card)
Cryptid.manipulate(card)
if G.GAME.events.ev_cry_choco2 then
card.misprint_cost_fac = (card.misprint_cost_fac or 1) * 2
card:set_cost()
@ -502,6 +510,9 @@ end
local sppref = set_profile_progress
function set_profile_progress()
sppref()
if not Cryptid.shinytagdata then
Cryptid.shinytagdata = {}
end
if not Cryptid.shinytagdata.init then
for k, v in pairs(G.P_TAGS) do
if Cryptid.shinytagdata[k] == nil then
@ -512,54 +523,46 @@ function set_profile_progress()
end
end
Cryptid.big_num_whitelist = {
j_ride_the_bus = true,
j_egg = true,
j_runner = true,
j_ice_cream = true,
j_constellation = true,
j_green_joker = true,
j_red_card = true,
j_madness = true,
j_square = true,
j_vampire = true,
j_hologram = true,
j_obelisk = true,
j_turtle_bean = true,
j_lucky_cat = true,
j_flash = true,
j_popcorn = true,
j_trousers = true,
j_ramen = true,
j_castle = true,
j_campfire = true,
j_throwback = true,
j_glass = true,
j_wee = true,
j_hit_the_road = true,
j_caino = true,
j_yorick = true,
-- Once all Cryptid Jokers get support for this, these can be removed
j_cry_dropshot = true,
j_cry_wee_fib = true,
j_cry_whip = true,
j_cry_pickle = true,
j_cry_chili_pepper = true,
j_cry_cursor = true,
j_cry_jimball = true,
j_cry_eternalflame = true,
j_cry_fspinner = true,
j_cry_krustytheclown = true,
j_cry_antennastoheaven = true,
j_cry_mondrian = true,
j_cry_spaceglobe = true,
j_cry_m = true,
j_cry_exponentia = true,
j_cry_crustulum = true,
j_cry_primus = true,
j_cry_stella_mortis = true,
j_cry_hugem = true,
j_cry_mprime = true,
Cryptid.big_num_blacklist = {
["j_cry_fractal"] = true,
["j_cry_wonka_bar"] = true,
["j_cry_oldcandy"] = true,
["j_cry_negative"] = true,
["c_magician"] = true,
["c_empress"] = true,
["c_heirophant"] = true,
["c_lovers"] = true,
["c_chariot"] = true,
["c_justice"] = true,
["c_strength"] = true,
["c_hanged_man"] = true,
["c_death"] = true,
["c_devil"] = true,
["c_tower"] = true,
["c_star"] = true,
["c_moon"] = true,
["c_sun"] = true,
["c_world"] = true,
["c_cry_eclipse"] = true,
["c_cry_seraph"] = true,
["c_cry_instability"] = true,
["v_cry_stickyhand"] = true,
["v_cry_grapplinghook"] = true,
["v_cry_hyperspacetether"] = true,
-- Add your Jokers here if you *don't* want to have it's numbers go into BigNum
-- FORMAT: <Joker Key ("j_cry_oil_lamp")> = true,
-- TARGET: BigNum Black List
}
Cryptid.mod_whitelist = {
Cryptid = true,
-- Add your ModName here if you want your mod to have it's jokers' values go into BigNum
-- FORMAT: <ModName> = true,
-- TARGET: BigNum Mod Whitelist
}
function Cryptid.is_card_big(joker)
@ -567,7 +570,18 @@ function Cryptid.is_card_big(joker)
if not center then
return false
end
return Cryptid.big_num_whitelist[center.key or "Nope!"] --[[or
if center.immutable and center.immutable == true then
return false
end
if center.mod and not Cryptid.mod_whitelist[center.mod.name] then
return false
end
local in_blacklist = Cryptid.big_num_blacklist[center.key or "Nope!"] or false
return not in_blacklist --[[or
(center.mod and center.mod.id == "Cryptid" and not center.no_break_infinity) or center.break_infinity--]]
end
@ -585,6 +599,7 @@ function Cryptid.safe_get(t, ...)
end
return current
end
--Functions used by boss blinds
function Blind:cry_ante_base_mod(dt)
if not self.disabled then
@ -595,6 +610,7 @@ function Blind:cry_ante_base_mod(dt)
end
return 0
end
function Blind:cry_round_base_mod(dt)
if not self.disabled then
local obj = self.config.blind
@ -604,15 +620,20 @@ function Blind:cry_round_base_mod(dt)
end
return 1
end
function Blind:cry_cap_score(score)
if not self.disabled then
local obj = self.config.blind
if obj.cry_modify_score and type(obj.cry_modify_score) == "function" then
score = obj:cry_modify_score(score)
end
if obj.cry_cap_score and type(obj.cry_cap_score) == "function" then
return obj:cry_cap_score(score)
end
end
return score
end
function Blind:cry_after_play()
if not self.disabled then
local obj = self.config.blind
@ -621,6 +642,7 @@ function Blind:cry_after_play()
end
end
end
function Blind:cry_before_play()
if not self.disabled then
local obj = self.config.blind
@ -629,6 +651,17 @@ function Blind:cry_before_play()
end
end
end
--The decision's ability to show a booster pack
function Blind:cry_before_cash()
if not self.disabled then
local obj = self.config.blind
if obj.cry_before_cash and type(obj.cry_before_cash) == "function" then
return obj:cry_before_cash()
end
end
end
function Blind:cry_calc_ante_gain()
if G.GAME.modifiers.cry_spooky then --here is the best place to check when spooky should apply
local card
@ -649,6 +682,7 @@ function Blind:cry_calc_ante_gain()
end
return 1
end
function Cryptid.enhanced_deck_info(deck)
--only accounts for vanilla stuff at the moment (WIP)
local edition, enhancement, sticker, suit, seal =
@ -679,6 +713,7 @@ function Cryptid.enhanced_deck_info(deck)
end
return ret.edition, ret.enhancement, ret.sticker, ret.suit, ret.seal
end
function Cryptid.post_process(center)
if center.pools and center.pools.M then
local vc = center.calculate
@ -703,8 +738,11 @@ end
-- For resetting localization on the fly for family friendly toggle
function Cryptid.reload_localization()
SMODS.handle_loc_file(Cryptid.path)
Cryptid.handle_other_localizations()
return init_localization()
end
-- Purely for crossmod purposes
function Cryptid.handle_other_localizations() end
-- Checks if all jokers in shop will have editions (via Curate, Edition Decks, etc.)
-- Will cause edition tags to Nope!
@ -760,3 +798,665 @@ function Cryptid.is_shiny()
end
return false
end
--Abstracted cards
function Cryptid.cry_enhancement_has_specific_suit(card)
for k, _ in pairs(SMODS.get_enhancements(card)) do
if G.P_CENTERS[k].specific_suit then
return true
end
end
return false
end
function Cryptid.cry_enhancement_get_specific_suit(card)
for k, _ in pairs(SMODS.get_enhancements(card)) do
if G.P_CENTERS[k].specific_suit then
return G.P_CENTERS[k].specific_suit
end
end
return nil
end
function Cryptid.cry_enhancement_has_specific_rank(card)
for k, _ in pairs(SMODS.get_enhancements(card)) do
if G.P_CENTERS[k].specific_rank then
return true
end
end
return false
end
function Cryptid.cry_enhancement_get_specific_rank(card)
for k, _ in pairs(SMODS.get_enhancements(card)) do
if G.P_CENTERS[k].specific_rank then
return G.P_CENTERS[k].specific_rank
end
end
return nil
end
--For better durability (at the expense of performance), this finds the rank ID of a custom rank (such as abstract).
function Cryptid.cry_rankname_to_id(rankname)
for i, v in pairs(SMODS.Rank.obj_buffer) do
if rankname == v then
return i
end
end
return nil
end
-- for buttercup
function G.FUNCS.can_store_card(e)
-- get shop highlighted
-- only from the jokers spot
local highlighted_shop_cards = {}
local areas_to_check = {
shop_jokers = G.shop_jokers,
shop_vouchers = G.shop_vouchers,
shop_booster = G.shop_booster,
}
local jok = e.config.ref_table
for key, value in pairs(areas_to_check) do
if value == nil then
e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil
return
elseif #value.highlighted == 1 and #highlighted_shop_cards == 0 then
highlighted_shop_cards[1] = value.highlighted[1]
end
end
if #highlighted_shop_cards == 1 and jok:can_use_storage() then
e.config.colour = G.C.BLUE
e.config.button = "store_card"
else
e.config.colour = G.C.UI.BACKGROUND_INACTIVE
e.config.button = nil
end
end
function G.FUNCS.store_card(e)
G.E_MANAGER:add_event(Event({
trigger = "after",
delay = 0.1,
func = function()
local areas_to_check = {
shop_jokers = G.shop_jokers,
shop_vouchers = G.shop_vouchers,
shop_booster = G.shop_booster,
}
local this_card = e.config.ref_table
-- This doesn't take into account the possibility that multiple cards might be selected in different areas
-- but can_store_card already does that for us, so who cares tbh
for shop_name, shop_area in pairs(areas_to_check) do
if #shop_area.highlighted == 1 then
local new_card = shop_area.highlighted[1]
new_card.T.orig = { w = new_card.T.w, h = new_card.T.h }
new_card.T.w = new_card.T.w * 0.5
new_card.T.h = new_card.T.h * 0.5
new_card.cry_from_shop = shop_name
if new_card.children.price then
new_card.children.price:remove()
end
new_card.children.price = nil
if new_card.children.buy_button then
new_card.children.buy_button:remove()
end
new_card.children.buy_button = nil
shop_area:remove_card(new_card)
this_card.cry_storage:emplace(new_card)
end
end
return true
end,
}))
end
function Card:can_use_storage()
if self.cry_storage ~= nil then
return #self.cry_storage.cards < self.ability.extra.slots
elseif self.config.center.key == "j_cry_buttercup" then -- "where did my fucking storage go"
sendInfoMessage("creating missing card area")
self.cry_storage = CardArea(0.5, 0.5, 1, 1, storage_area_config)
end
return false
end
function Cryptid.reset_to_none()
update_hand_text({ delay = 0 }, {
mult = Cryptid.ascend(G.GAME.hands["cry_None"].mult),
chips = Cryptid.ascend(G.GAME.hands["cry_None"].chips),
level = G.GAME.hands["cry_None"].level,
handname = localize("cry_None", "poker_hands"),
})
end
function Card:is_food()
--you cant really check if vanilla jokers are in a pool because its hardcoded
--so i have to hardcode it here too for the starfruit unlock
local food = {
j_gros_michel = true,
j_egg = true,
j_ice_cream = true,
j_cavendish = true,
j_turtle_bean = true,
j_diet_cola = true,
j_popcorn = true,
j_ramen = true,
j_selzer = true,
}
if food[self.config.center.key] or Cryptid.safe_get(self.config.center, "pools", "Food") then
return true
end
end
function Cryptid.get_highlighted_cards(areas, ignore, min, max, blacklist, seed)
ignore.checked = true
blacklist = blacklist or function()
return true
end
local cards = {}
for i, area in pairs(areas) do
if area.cards then
for i2, card in pairs(area.cards) do
if
card ~= ignore
and blacklist(card)
and (card.highlighted or G.cry_force_use)
and not card.checked
then
cards[#cards + 1] = card
card.checked = true
end
end
end
end
for i, v in ipairs(cards) do
v.checked = nil
end
if (#cards >= min and #cards <= max) or not G.cry_force_use then
ignore.checked = nil
return cards
else
for i, v in pairs(cards) do
v.f_use_order = i
end
pseudoshuffle(cards, pseudoseed("forcehighlight" or seed))
local actual = {}
for i = 1, max do
if cards[i] and not cards[i].checked and actual ~= ignore then
actual[#actual + 1] = cards[i]
end
end
table.sort(actual, function(a, b)
return a.f_use_order < b.f_use_order
end)
for i, v in pairs(cards) do
v.f_use_order = nil
end
ignore.checked = nil
return actual
end
return {}
end
function Cryptid.table_merge(...)
local tbl = {}
for _, t in ipairs({ ... }) do
if type(t) == "table" then
for _, v in pairs(t) do
tbl[#tbl + 1] = v
end
end
end
return tbl
end
function Cryptid.get_circus_description()
local desc = {}
local ind = 1
local extra_rarities = {}
if not Cryptid.circus_rarities then
Cryptid.circus_rarities = {}
end
for i, v in pairs(Cryptid.circus_rarities) do
if not v.hidden then
extra_rarities[#extra_rarities + 1] = v
end
end
table.sort(extra_rarities, function(a, b)
return a.order < b.order
end)
for i, v in pairs(extra_rarities) do
local rarity = v.rarity
rarity = localize(({
[1] = "k_common",
[2] = "k_uncommon",
[3] = "k_rare",
[4] = "k_legendary",
})[rarity] or "k_" .. rarity)
local orig = localize("cry_circus_generic")
orig = string.gsub(orig, "#1#", ind)
orig = string.gsub(orig, "#2#", rarity)
orig = string.gsub(orig, "#3#", "#" .. tostring(ind) .. "#")
desc[#desc + 1] = orig
ind = ind + 1
end
return desc
end
function Cryptid.add_circus_rarity(rarity, dontreload)
Cryptid.circus_rarities[rarity.rarity] = rarity
if not dontreload then
Cryptid.reload_localization()
end
end
function Cryptid.get_paved_joker()
if G.hand then
local total = 0
for i, v in pairs(SMODS.find_card("j_cry_paved_joker")) do
total = total + v.ability.extra
end
local stones = 0
for i, v in pairs(G.hand.highlighted) do
if v.config.center.key == "m_stone" then
stones = stones + 1
end
end
for i, v in pairs(G.play.cards) do
if v.config.center.key == "m_stone" then
stones = stones + 1
end
end
total = math.min(stones, total)
return total
end
return 0
end
function Card:has_stickers()
for i, v in pairs(SMODS.Sticker.obj_table) do
if self.ability[i] then
return true
end
end
end
function Card:remove_random_sticker(seed)
local s = {}
for i, v in pairs(SMODS.Sticker.obj_table) do
if not v.hidden and i ~= "cry_absolute" and self.ability[i] then
s[#s + 1] = i
end
end
if #s > 0 then
local sticker = pseudorandom_element(s, pseudoseed(seed))
self.ability[sticker] = nil
if sticker == "perishable" then
self.ability.perish_tally = nil
end
end
end
function create_UIBox_class()
return SMODS.card_collection_UIBox(G.P_CENTER_POOLS.Enhanced, { 4, 4 }, {
no_materialize = true,
snap_back = true,
h_mod = 1.03,
--infotip = localize('ml_edition_seal_enhancement_explanation'),
hide_single_page = true,
back_func = "exit_overlay_menu_code",
})
end
function create_UIBox_variable_code()
local cards = {}
local ranks = {}
for i, v in pairs(SMODS.Ranks) do
cards[#cards + 1] = G.P_CENTERS.c_base
ranks[#ranks + 1] = i
end
table.sort(ranks, function(a, b)
return SMODS.Ranks[a].id < SMODS.Ranks[b].id
end)
return SMODS.card_collection_UIBox(cards, { 5, 5, 5 }, {
no_materialize = true,
snap_back = true,
h_mod = 1.03,
--infotip = localize('ml_edition_seal_enhancement_explanation'),
hide_single_page = true,
back_func = "exit_overlay_menu_code",
modify_card = function(card, center, i, j)
SMODS.change_base(card, "Spades", ranks[(j - 1) * 5 + i])
end,
})
end
function create_UIBox_exploit()
local cards = {}
local ranks = {}
for i, v in pairs(G.P_CENTER_POOLS.Planet) do
if v.config.handname then
cards[#cards + 1] = v
end
end
table.sort(ranks, function(a, b)
return G.GAME.hands[a.config.handname].order < G.GAME.hands[b.config.handname]
end)
return SMODS.card_collection_UIBox(cards, { 5, 5, 5 }, {
no_materialize = true,
snap_back = true,
h_mod = 1.03,
--infotip = localize('ml_edition_seal_enhancement_explanation'),
hide_single_page = true,
back_func = "exit_overlay_menu_code",
})
end
G.FUNCS.exit_overlay_menu_code = function(e)
G.FUNCS.exit_overlay_menu(e)
G.GAME.USING_CLASS = nil
G.GAME.USING_CODE = nil
G.GAME.USING_VARIABLE = nil
G.GAME.USING_EXPLOIT_HAND = nil
G.GAME.USING_EXPLOIT = nil
G.GAME.USING_POINTER = nil
G.GAME.POINTER_SUBMENU = nil
G.GAME.POINTER_PLAYING = nil
G.GAME.POINTER_COLLECTION = nil
if
G.GAME.CODE_DESTROY_CARD
and G.GAME.CODE_DESTROY_CARD.ability
and G.GAME.CODE_DESTROY_CARD.ability.cry_multiuse
then
G.GAME.CODE_DESTROY_CARD.ability.cry_multiuse = G.GAME.CODE_DESTROY_CARD.ability.cry_multiuse - 1
elseif G.GAME.CODE_DESTROY_CARD then
G.GAME.CODE_DESTROY_CARD:start_dissolve()
G.GAME.CODE_DESTROY_CARD = nil
end
G.GAME.CODE_DESTROY_CARD = nil
end
function G.UIDEF.exploit_menu()
return create_UIBox_generic_options({
contents = {
create_tabs({
tabs = {
{
label = localize("b_poker_hands"),
chosen = true,
tab_definition_function = create_UIBox_current_hands_exploit,
},
},
tab_h = 8,
snap_to_nav = true,
}),
},
})
end
function create_UIBox_current_hands_exploit(simple)
local ref = create_UIBox_current_hand_row
local ret = create_UIBox_current_hands(simple)
create_UIBox_current_hand_row = ref
return ret
end
local htref = create_UIBox_hand_tip
function create_UIBox_hand_tip(handname)
if G.GAME.USING_EXPLOIT then
G.GAME.USING_EXPLOIT_HAND = handname
end
return htref(handname)
end
local lcpref = Controller.L_cursor_press
function Controller:L_cursor_press(x, y)
lcpref(self, x, y)
if G and G.GAME and G.GAME.hands and G.GAME.USING_EXPLOIT_HAND then
if
G.CONTROLLER.cursor_hover
and G.CONTROLLER.cursor_hover.target
and G.CONTROLLER.cursor_hover.target.config
and G.CONTROLLER.cursor_hover.target.config.on_demand_tooltip
and G.CONTROLLER.cursor_hover.target.config.on_demand_tooltip.filler
and G.CONTROLLER.cursor_hover.target.config.on_demand_tooltip.filler.args
and G.GAME.hands[G.CONTROLLER.cursor_hover.target.config.on_demand_tooltip.filler.args]
then
-- Re-use the Exploit card
if G.GAME.ACTIVE_CODE_CARD then
if
not G.GAME.ACTIVE_CODE_CARD.ability.cry_multiuse
or to_big(G.GAME.ACTIVE_CODE_CARD.ability.cry_multiuse) <= to_big(1)
then
G.GAME.ACTIVE_CODE_CARD:start_dissolve()
else
G.GAME.ACTIVE_CODE_CARD.ability.cry_multiuse =
lenient_bignum(to_big(G.GAME.ACTIVE_CODE_CARD.ability.cry_multiuse) - to_big(1))
end
end
G.GAME.ACTIVE_CODE_CARD = nil
G.GAME.cry_exploit_override = G.GAME.USING_EXPLOIT_HAND
G.FUNCS.exit_overlay_menu_code()
end
end
end
function create_UIBox_pointer_rank()
G.GAME.POINTER_SUBMENU = "Rank"
G.GAME.POINTER_PLAYING = {}
local cards = {}
local ranks = {}
for i, v in pairs(SMODS.Ranks) do
cards[#cards + 1] = G.P_CENTERS.c_base
ranks[#ranks + 1] = i
end
table.sort(ranks, function(a, b)
return SMODS.Ranks[a].id < SMODS.Ranks[b].id
end)
return SMODS.card_collection_UIBox(cards, { 5, 5, 5 }, {
no_materialize = true,
snap_back = true,
h_mod = 1.03,
--infotip = localize('ml_edition_seal_enhancement_explanation'),
hide_single_page = true,
back_func = "your_collection",
modify_card = function(card, center, i, j)
SMODS.change_base(card, "Spades", ranks[(j - 1) * 5 + i])
if
center.hidden
or center.no_noe
or center.no_pointer
or center.no_code
or center.no_variable
or center.no_class
then
card.deuff = true
end
end,
})
end
function create_UIBox_pointer_suit()
G.GAME.POINTER_SUBMENU = "Suit"
local cards = {}
local suits = {}
for i, v in pairs(SMODS.Suits) do
cards[#cards + 1] = G.P_CENTERS.c_base
suits[#suits + 1] = i
end
table.sort(suits, function(a, b)
return SMODS.Suits[a].suit_nominal < SMODS.Suits[b].suit_nominal
end)
return SMODS.card_collection_UIBox(cards, { 4, 4, 4 }, {
no_materialize = true,
snap_back = true,
h_mod = 1.03,
--infotip = localize('ml_edition_seal_enhancement_explanation'),
hide_single_page = true,
back_func = "your_collection",
modify_card = function(card, center, i, j)
SMODS.change_base(card, suits[(j - 1) * 4 + i], G.GAME.POINTER_PLAYING.rank)
if
center.hidden
or center.no_noe
or center.no_pointer
or center.no_code
or center.no_variable
or center.no_class
then
card.deuff = true
end
end,
})
end
function create_UIBox_pointer_enhancement()
G.GAME.POINTER_SUBMENU = "Enhancement"
return create_UIBox_your_collection_enhancements_pointer()
end
function create_UIBox_pointer_edition()
G.GAME.POINTER_SUBMENU = "Edition"
return create_UIBox_your_collection_editions_pointer()
end
function create_UIBox_pointer_seal()
G.GAME.POINTER_SUBMENU = "Seal"
return create_UIBox_your_collection_seals_pointer()
end
G.FUNCS.your_collection_create_card_rank = function(e)
G.SETTINGS.paused = true
G.FUNCS.overlay_menu({
definition = create_UIBox_pointer_rank(),
})
end
create_UIBox_your_collection_enhancements_pointer = function()
local cards = {
G.P_CENTERS.c_base,
}
for i, v in pairs(G.P_CENTER_POOLS.Enhanced) do
cards[#cards + 1] = v
end
return SMODS.card_collection_UIBox(cards, { 4, 4 }, {
no_materialize = true,
snap_back = true,
h_mod = 1.03,
hide_single_page = true,
modify_card = function(card, center)
SMODS.change_base(card, G.GAME.POINTER_PLAYING.suit, G.GAME.POINTER_PLAYING.rank)
if
center.hidden
or center.no_noe
or center.no_pointer
or center.no_code
or center.no_variable
or center.no_class
then
card.deuff = true
end
end,
})
end
create_UIBox_your_collection_editions_pointer = function()
return SMODS.card_collection_UIBox(G.P_CENTER_POOLS.Edition, { 5, 5 }, {
snap_back = true,
h_mod = 1.03,
hide_single_page = true,
collapse_single_page = true,
modify_card = function(card, center)
if center.discovered then
card:set_edition(center.key, true, true)
SMODS.change_base(card, G.GAME.POINTER_PLAYING.suit, G.GAME.POINTER_PLAYING.rank)
card:set_ability(G.P_CENTERS[G.GAME.POINTER_PLAYING.center])
if
center.hidden
or center.no_noe
or center.no_pointer
or center.no_code
or center.no_variable
or center.no_class
then
card.deuff = true
end
end
end,
})
end
create_UIBox_your_collection_seals_pointer = function()
local cards = {
{ key = nil },
}
for i, v in pairs(G.P_CENTER_POOLS.Seal) do
cards[#cards + 1] = v
end
return SMODS.card_collection_UIBox(cards, { 5, 5 }, {
snap_back = true,
hide_single_page = true,
collapse_single_page = true,
center = "c_base",
h_mod = 1.03,
modify_card = function(card, center)
card:set_seal(center.key, true)
SMODS.change_base(card, G.GAME.POINTER_PLAYING.suit, G.GAME.POINTER_PLAYING.rank)
card:set_ability(G.P_CENTERS[G.GAME.POINTER_PLAYING.center])
card:set_edition(G.GAME.POINTER_PLAYING.edition, true, true)
if
center.hidden
or center.no_noe
or center.no_pointer
or center.no_code
or center.no_variable
or center.no_class
then
card.deuff = true
end
end,
})
end
function Cryptid.get_next_tag(override)
if next(SMODS.find_card("j_cry_kittyprinter")) then
return "tag_cry_cat"
end
end
-- for Cryptid.isNonRollProbabilityContext
local probability_contexts = {
"mod_probability",
"fix_probability",
}
-- Checks if a context table is a probability context called outside of a roll
function Cryptid.isNonRollProbabilityContext(context)
for _, ctx in ipairs(probability_contexts) do
if context[ctx] then
return context.from_roll
end
end
return true
end
function Cryptid.nuke_decimals(number, surviving_decimals, round)
surviving_decimals = surviving_decimals or 0
--Set round to 0.5 to round or 0 to floor
round = round or 0
local aaa = 10 ^ surviving_decimals
return math.floor(number * aaa + round) / aaa
end
-- "log base (x) of (y)". Pre-Calculus courses recommended
function Cryptid.funny_log(x, y)
return math.log(y) / math.log(x)
end
local say_stuff_ref = Card_Character.say_stuff
function Card_Character:say_stuff(n, not_first, quip_key)
local quip = SMODS.JimboQuips[quip_key]
if quip then
return say_stuff_ref(self, n, not_first, quip_key)
end
end

View file

@ -2,78 +2,195 @@
--Redefine these here because they're always used
Cryptid.base_values = {}
function Cryptid.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack, big)
Cryptid.misprintize_value_blacklist = {
perish_tally = false,
id = false,
suit_nominal = false,
base_nominal = false,
face_nominal = false,
qty = false,
h_x_chips = false,
d_size = false,
h_size = false,
selected_d6_face = false,
cry_hook_id = false,
colour = false,
suit_nominal_original = false,
times_played = false,
-- TARGET: Misprintize Value Blacklist (format: key = false, )
}
Cryptid.misprintize_bignum_blacklist = {
odds = false,
cry_prob = false,
--nominal = false,
}
function Cryptid.calculate_misprint(initial, min, max, grow_type, pow_level)
local big_initial = (type(initial) ~= "table" and to_big(initial)) or initial
local big_min = (type(min) ~= "table" and to_big(min)) or min
local big_max = (type(max) ~= "table" and to_big(max)) or max
local grow = Cryptid.log_random(pseudoseed("cry_misprint" .. G.GAME.round_resets.ante), big_min, big_max)
local calc = big_initial
if not grow_type then
calc = calc * grow
elseif grow_type == "+" then
calc = calc + grow
elseif grow_type == "-" then
calc = calc - grow
elseif grow_type == "/" then
calc = calc / grow
elseif grow_type == "^" then
pow_level = pow_level or 1
if pow_level == 1 then
calc = calc ^ grow
else
local function hyper(level, base, height)
local big_base = (type(base) ~= "table" and to_big(base)) or base
local big_height = (type(height) ~= "table" and to_big(height)) or height
if height == 1 then
return big_base
elseif level == 1 then
return big_base ^ big_height
else
local inner = hyper(level, base, height - 1)
return hyper(level - 1, base, inner)
end
end
calc = hyper(pow_level, calc, grow)
end
end
if calc > to_big(-1e100) and calc < to_big(1e100) then
calc = to_number(calc)
end
return calc
end
function Cryptid.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stack, big, grow_type, pow_level)
local prob_max = 1e69 -- funny number
local max_slots = 100
local max_booster_slots = 25
local function num_too_big(initial, min, max, limit)
return (
to_big(initial) > to_big(limit)
or (min and to_big(initial) * min > to_big(limit))
or (max and to_big(initial) * max > to_big(limit))
)
end
if name and ref_tbl and ref_value then
tbl = Cryptid.deep_copy(ref_tbl[ref_value])
local tbl = Cryptid.deep_copy(ref_tbl[ref_value])
local function can_misprintize_value(k, v)
if
(k == "x_mult" and v == 1 and not tbl.override_x_mult_check)
or (k == "x_chips" and v == 1 and not tbl.override_x_chips_check)
then
return false
end
for key, val in pairs(Cryptid.misprintize_value_blacklist) do
if tostring(k) == tostring(key) then
return val
end
end
return true
end
for k, v in pairs(tbl) do
if (type(tbl[k]) ~= "table") or is_number(tbl[k]) then
if
is_number(tbl[k])
and not (k == "perish_tally")
and not (k == "id")
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.override_x_mult_check)
and not (k == "x_chips" and v == 1 and not tbl.override_x_chips_check)
and not (k == "h_x_chips")
and not (k == "selected_d6_face")
then --Temp fix, even if I did clamp the number to values that wouldn't crash the game, the fact that it did get randomized means that there's a higher chance for 1 or 6 than other values
if is_number(tbl[k]) and can_misprintize_value(k, tbl[k]) then
if not Cryptid.base_values[name] then
Cryptid.base_values[name] = {}
end
if not Cryptid.base_values[name][k] then
Cryptid.base_values[name][k] = tbl[k]
if not Cryptid.base_values[name][k .. ref_value] then
Cryptid.base_values[name][k .. ref_value] = tbl[k]
end
local initial = (stack and tbl[k] or Cryptid.base_values[name][k .. ref_value])
local min = override and override.min or G.GAME.modifiers.cry_misprint_min
local max = override and override.max or G.GAME.modifiers.cry_misprint_max
if
(
k == "cry_prob"
-- Hack for vanilla jokers that use the extra field to describe their odds
or (
(
name == "j_8_ball"
or name == "j_business"
or name == "j_space"
or name == "j_hallucination"
) and k == "extra"
)
) and num_too_big(initial, min, max, prob_max)
then
initial = Cryptid.base_values[name][k .. ref_value] * prob_max
min = 1
max = 1
end
tbl[k] = Cryptid.sanity_check(
clear and Cryptid.base_values[name][k]
or cry_format(
(stack and tbl[k] or Cryptid.base_values[name][k])
* Cryptid.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"
),
clear and Cryptid.base_values[name][k .. ref_value]
or cry_format(Cryptid.calculate_misprint(initial, min, max, grow_type, pow_level), "%.2g"),
big
)
end
elseif not (k == "immutable") then
elseif not (k == "immutable") and not (k == "colour") then
for _k, _v in pairs(tbl[k]) do
if
is_number(tbl[k][_k])
and not (_k == "id")
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 == "x_chips" and v == 1 and not tbl[k].override_x_chips_check)
and not (k == "h_x_chips")
and not (_k == "selected_d6_face")
then --Refer to above
if is_number(tbl[k][_k]) and can_misprintize_value(_k, tbl[k][_k]) then
if not Cryptid.base_values[name] then
Cryptid.base_values[name] = {}
end
if not Cryptid.base_values[name][k] then
Cryptid.base_values[name][k] = {}
if not Cryptid.base_values[name][_k .. k] then
if
G.P_CENTERS[name]
and type(G.P_CENTERS[name].config[k]) == "table"
and G.P_CENTERS[name].config[k][_k]
then
Cryptid.base_values[name][_k .. k] = G.P_CENTERS[name].config[k][_k]
else
Cryptid.base_values[name][_k .. k] = tbl[k][_k]
end
if not Cryptid.base_values[name][k][_k] then
Cryptid.base_values[name][k][_k] = tbl[k][_k]
end
local initial = (stack and tbl[k][_k] or Cryptid.base_values[name][_k .. k])
local min = override and override.min or G.GAME.modifiers.cry_misprint_min
local max = override and override.max or G.GAME.modifiers.cry_misprint_max
if (_k == "odds") and num_too_big(initial, min, max, prob_max) then
initial = Cryptid.base_values[name][_k .. k] * prob_max
min = 1
max = 1
end
if
(_k == "slots" and (name == "j_cry_tenebris" or name == "j_cry_negative"))
and num_too_big(initial, min, max, max_slots)
then
initial = max_slots
min = 1
max = 1
end
if
(_k == "booster_slots" and (name == "j_cry_booster"))
and num_too_big(initial, min, max, max_booster_slots)
then
initial = max_booster_slots
min = 1
max = 1
end
tbl[k][_k] = Cryptid.sanity_check(
clear and Cryptid.base_values[name][k][_k]
clear and Cryptid.base_values[name][_k .. k]
or cry_format(
(stack and tbl[k][_k] or Cryptid.base_values[name][k][_k])
* Cryptid.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
),
Cryptid.calculate_misprint(initial, min, max, grow_type, pow_level),
"%.2g"
),
big
@ -85,15 +202,16 @@ function Cryptid.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stac
ref_tbl[ref_value] = tbl
end
end
function Cryptid.misprintize_val(val, override, big)
function Cryptid.misprintize_val(val, override, big, grow_type, pow_level)
if is_number(val) then
val = Cryptid.sanity_check(
cry_format(
val
* Cryptid.log_random(
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
Cryptid.calculate_misprint(
val,
override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max
override and override.max or G.GAME.modifiers.cry_misprint_max,
grow_type,
pow_level
),
"%.2g"
),
@ -117,9 +235,19 @@ function Cryptid.sanity_check(val, is_big)
if not val or type(val) == "number" and (val ~= val or val > 1e300 or val < -1e300) then
return 1e300
end
if type(val) == "table" then
if val > to_big(1e300) then
return 1e300
end
if val < to_big(-1e300) then
return -1e300
end
return to_number(val)
end
return val
end
function Cryptid.misprintize(card, override, force_reset, stack)
function Cryptid.misprintize(card, override, force_reset, stack, grow_type, pow_level)
local clamps = card.config.center.misprintize_caps or {}
if Card.no(card, "immutable", true) then
force_reset = true
end
@ -127,7 +255,7 @@ function Cryptid.misprintize(card, override, force_reset, stack)
if card.infinifusion then
if card.config.center == card.infinifusion_center or card.config.center.key == "j_infus_fused" then
calculate_infinifusion(card, nil, function(i)
Cryptid.misprintize(card, override, force_reset, stack)
Cryptid.misprintize(card, override, force_reset, stack, grow_type, pow_level)
end)
end
end
@ -137,9 +265,6 @@ function Cryptid.misprintize(card, override, force_reset, stack)
and not stack
or not Card.no(card, "immutable", true)
then
if card.ability.name == "Ace Aequilibrium" then
return
end
if G.GAME.modifiers.cry_jkr_misprint_mod and card.ability.set == "Joker" then
if not override then
override = {}
@ -157,7 +282,9 @@ function Cryptid.misprintize(card, override, force_reset, stack)
nil,
override,
stack,
Cryptid.is_card_big(card)
Cryptid.is_card_big(card),
grow_type,
pow_level
)
if card.base then
Cryptid.misprintize_tbl(
@ -167,7 +294,9 @@ function Cryptid.misprintize(card, override, force_reset, stack)
nil,
override,
stack,
Cryptid.is_card_big(card)
Cryptid.is_card_big(card),
grow_type,
pow_level
)
end
end
@ -182,7 +311,41 @@ function Cryptid.misprintize(card, override, force_reset, stack)
card:set_cost()
end
else
Cryptid.misprintize_tbl(card.config.center_key, card, "ability", true, nil, nil, Cryptid.is_card_big(card))
Cryptid.misprintize_tbl(
card.config.center_key,
card,
"ability",
true,
nil,
nil,
Cryptid.is_card_big(card),
grow_type,
pow_level
)
end
if clamps then
for i, v in pairs(clamps) do
if type(v) == "table" and not v.tetrate then
for i2, v2 in pairs(v) do
if to_big(card.ability[i][i2]) > to_big(v2) then
card.ability[i][i2] = Cryptid.sanity_check(v2, Cryptid.is_card_big(card))
if
to_big(card.ability[i][i2]) > to_big(-1e100)
or to_big(card.ability[i][i2]) < to_big(1e100)
then
card.ability[i][i2] = to_number(card.ability[i][i2])
end
end
end
elseif (type(v) == "table" and v.tetrate) or type(v) == "number" then
if to_big(card.ability[i]) > to_big(v) then
card.ability[i] = Cryptid.sanity_check(v, Cryptid.is_card_big(card))
if to_big(card.ability[i]) > to_big(-1e100) or to_big(card.ability[i]) < to_big(1e100) then
card.ability[i] = to_number(card.ability[i])
end
end
end
end
end
if card.ability.consumeable then
for k, v in pairs(card.ability.consumeable) do
@ -223,3 +386,187 @@ function Card:get_nominal(mod)
+ 10 * self.base.face_nominal * rank_mult
+ 0.000001 * self.unique_val
end
function Cryptid.manipulate(card, args)
if not Card.no(card, "immutable", true) or (args and args.bypass_checks) then
if not args then
return Cryptid.manipulate(card, {
min = (G.GAME.modifiers.cry_misprint_min or 1) * (G.GAME.modifiers.cry_jkr_misprint_mod or 1),
max = (G.GAME.modifiers.cry_misprint_max or 1) * (G.GAME.modifiers.cry_jkr_misprint_mod or 1),
type = "X",
dont_stack = true,
no_deck_effects = true,
})
else
local func = function(card)
if not args.type then
args.type = "X"
end
--hardcoded whatever
if card.config.center.set == "Booster" then
args.big = false
end
local caps = card.config.center.misprintize_caps or {}
if card.infinifusion then
if card.config.center == card.infinifusion_center or card.config.center.key == "j_infus_fused" then
calculate_infinifusion(card, nil, function(i)
Cryptid.manipulate(card, args)
end)
end
end
Cryptid.manipulate_table(card, card, "ability", args)
if card.base then
Cryptid.manipulate_table(card, card, "base", args)
end
if G.GAME.modifiers.cry_misprint_min then
--card.cost = cry_format(card.cost / Cryptid.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),"%.2f")
card.misprint_cost_fac = 1
/ Cryptid.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
)
card:set_cost()
end
if caps then
for i, v in pairs(caps) do
if type(v) == "table" and not v.tetrate then
for i2, v2 in pairs(v) do
if to_big(card.ability[i][i2]) > to_big(v2) then
card.ability[i][i2] = Cryptid.sanity_check(v2, Cryptid.is_card_big(card))
end
end
elseif (type(v) == "table" and v.tetrate) or type(v) == "number" then
if to_big(card.ability[i]) > to_big(v) then
card.ability[i] = Cryptid.sanity_check(v, Cryptid.is_card_big(card))
end
end
end
end
end
local config = copy_table(card.config.center.config)
if not Cryptid.base_values[card.config.center.key] then
Cryptid.base_values[card.config.center.key] = {}
for i, v in pairs(config) do
if (type(v) == "table" and v.tetrate) or type(v) == "number" and to_big(v) ~= to_big(0) then
Cryptid.base_values[card.config.center.key][i .. "ability"] = v
elseif type(v) == "table" then
for i2, v2 in pairs(v) do
Cryptid.base_values[card.config.center.key][i2 .. i] = v2
end
end
end
end
if not args.bypass_checks and not args.no_deck_effects then
Cryptid.with_deck_effects(card, func)
else
func(card)
end
if card.ability.consumeable then
for k, v in pairs(card.ability.consumeable) do
card.ability.consumeable[k] = Cryptid.deep_copy(card.ability[k])
end
end
--ew ew ew ew
G.P_CENTERS[card.config.center.key].config = config
end
return true
end
end
function Cryptid.manipulate_table(card, ref_table, ref_value, args, tblkey)
if ref_value == "consumeable" then
return
end
for i, v in pairs(ref_table[ref_value]) do
if
(type(v) == "number" or (type(v) == "table" and v.tetrate))
and Cryptid.misprintize_value_blacklist[i] ~= false
then
local num = v
if args.dont_stack then
if
Cryptid.base_values[card.config.center.key]
and (
Cryptid.base_values[card.config.center.key][i .. ref_value]
or (ref_value == "ability" and Cryptid.base_values[card.config.center.key][i .. "consumeable"])
)
then
num = Cryptid.base_values[card.config.center.key][i .. ref_value]
or Cryptid.base_values[card.config.center.key][i .. "consumeable"]
end
end
if args.big ~= nil then
ref_table[ref_value][i] = Cryptid.manipulate_value(num, args, args.big, i)
else
ref_table[ref_value][i] = Cryptid.manipulate_value(num, args, Cryptid.is_card_big(card), i)
end
elseif i ~= "immutable" and type(v) == "table" and Cryptid.misprintize_value_blacklist[i] ~= false then
Cryptid.manipulate_table(card, ref_table[ref_value], i, args)
end
end
end
function Cryptid.manipulate_value(num, args, is_big, name)
if args.func then
num = args.func(num, args, is_big, name)
else
if args.min and args.max then
local new_args = args
local big_min = to_big(args.min)
local big_max = to_big(args.max)
local new_value = Cryptid.log_random(
pseudoseed(args.seed or ("cry_misprint" .. G.GAME.round_resets.ante)),
big_min,
big_max
)
if args.type == "+" then
if to_big(num) ~= to_big(0) and to_big(num) ~= to_big(1) then
num = num + new_value
end
elseif args.type == "X" then
if
to_big(num) ~= to_big(0) and (to_big(num) ~= to_big(1) or (name ~= "x_chips" and name ~= "x_mult"))
then
num = num * new_value
end
elseif args.type == "^" then
num = to_big(num) ^ new_value
elseif args.type == "hyper" then
if to_big(num) ~= to_big(0) and to_big(num) ~= to_big(1) then
num = to_big(num):arrow(args.value.arrows, to_big(new_value))
end
end
elseif args.value then
if args.type == "+" then
if to_big(num) ~= to_big(0) and to_big(num) ~= to_big(1) then
num = num + to_big(args.value)
end
elseif args.type == "X" then
if
to_big(num) ~= to_big(0) and (to_big(num) ~= to_big(1) or (name ~= "x_chips" and name ~= "x_mult"))
then
num = num * args.value
end
elseif args.type == "^" then
num = to_big(num) ^ args.value
elseif args.type == "hyper" then
num = to_big(num):arrow(args.value.arrows, to_big(args.value.height))
end
end
end
if Cryptid.misprintize_bignum_blacklist[name] == false then
num = to_number(num)
return to_number(Cryptid.sanity_check(num, false))
end
local val = Cryptid.sanity_check(num, is_big)
if to_big(val) > to_big(-1e100) and to_big(val) < to_big(1e100) then
return to_number(val)
end
return val
end
local get_nominalref = Card.get_nominal
function Card:get_nominal(...)
return to_number(get_nominalref(self, ...))
end

View file

@ -318,14 +318,7 @@ function Card:update(dt)
if self.flipping == "f2b" then
self.flipping = "b2f"
end
self:dbl_side_flip()
end
if self.ability.cry_absolute then -- feedback loop... may be problematic
self.cry_absolute = true
end
if self.cry_absolute then
self.ability.cry_absolute = true
self.ability.eternal = true
self:flip_side()
end
if self.ability.pinned then
self.pinned = true
@ -395,7 +388,7 @@ function cry_best_interest_cap()
}
for _, table in ipairs(vouchers) do
for i, v in ipairs(table) do
if v.ability.extra >= best then
if to_big(v.ability.extra) >= to_big(best) then
best = v.ability.extra
end
end
@ -407,6 +400,7 @@ G.FUNCS.evaluate_round = function()
G.GAME.interest_cap = cry_best_interest_cap() -- blehhhhhh
--Semicolon Stuff
if G.GAME.current_round.semicolon then
G.GAME.saved_text = ";"
add_round_eval_row({ dollars = 0, name = "blind1", pitch = 0.95, saved = true })
G.E_MANAGER:add_event(Event({
trigger = "before",
@ -578,7 +572,7 @@ function Card:set_eternal(_eternal)
end
function Card:calculate_banana()
if not self.ability.extinct then
if self.ability.banana and (pseudorandom("banana") < G.GAME.probabilities.normal / 10) then
if self.ability.banana and SMODS.pseudorandom_probability(self, "banana", 1, 10, "Banana Sticker") then
self.ability.extinct = true
G.E_MANAGER:add_event(Event({
func = function()
@ -676,6 +670,16 @@ SMODS.Sticker:take_ownership("eternal", {
return { key = "cry_eternal_booster" }
end
end,
draw = function(self, card)
local notilt = nil
if card.area and card.area.config.type == "deck" then
notilt = true
end
if not card.ability.cry_absolute then
G.shared_stickers[self.key].role.draw_major = card
G.shared_stickers[self.key]:draw_shader("dissolve", nil, nil, notilt, card.children.center)
end
end,
})
SMODS.Sticker:take_ownership("rental", {
loc_vars = function(self, info_queue, card)
@ -713,13 +717,16 @@ SMODS.Sticker({
should_apply = false,
loc_vars = function(self, info_queue, card)
if card.ability.consumeable then
return { key = "cry_banana_consumeable", vars = { G.GAME.probabilities.normal or 1, 4 } }
return {
key = "cry_banana_consumeable",
vars = { SMODS.get_probability_vars(card, 1, 4, "Banana Sticker") },
}
elseif card.ability.set == "Voucher" then
return { key = "cry_banana_voucher", vars = { G.GAME.probabilities.normal or 1, 12 } }
return { key = "cry_banana_voucher", vars = { SMODS.get_probability_vars(card, 1, 12, "Banana Sticker") } }
elseif card.ability.set == "Booster" then
return { key = "cry_banana_booster" }
else
return { vars = { G.GAME.probabilities.normal or 1, 10 } }
return { vars = { SMODS.get_probability_vars(card, 1, 10, "Banana Sticker") } }
end
end,
calculate = function(self, card, context)
@ -730,7 +737,15 @@ SMODS.Sticker({
and not context.individual
then
if card.ability.set == "Voucher" then
if pseudorandom("byebyevoucher") < G.GAME.probabilities.normal / G.GAME.cry_voucher_banana_odds then
if
SMODS.pseudorandom_probability(
card,
"byebyevoucher",
1,
G.GAME.cry_voucher_banana_odds,
"Banana Sticker"
)
then
local area
if G.STATE == G.STATES.HAND_PLAYED then
if not G.redeemed_vouchers_during_hand then
@ -873,53 +888,33 @@ function G.UIDEF.used_vouchers()
{ n = G.UIT.R, config = { align = "cm", padding = 0, no_fill = true }, nodes = voucher_tables }
)
local t = silent
and {
n = G.UIT.ROOT,
config = { align = "cm", colour = G.C.CLEAR },
nodes = {
-- tarot/planet acclimator sliders
next(SMODS.find_card("v_cry_tacclimator"))
and {
-- Code by IcyEthics: Generates sliders dynamically
local cryptid_voucher_nodes = {}
if silent then
for i, _info in ipairs(Cryptid.voucher_acclimator_data) do
if next(SMODS.find_card(_info.voucher_key)) then
cryptid_voucher_nodes[#cryptid_voucher_nodes + 1] = {
n = G.UIT.R,
config = { align = "cm" },
nodes = {
create_slider({
label = localize("b_tarot_rate"),
label = localize(_info.localization_key),
label_scale = 0.4,
text_scale = 0.3,
w = 4,
h = 0.4,
ref_table = G.GAME.cry_percrate,
ref_value = "tarot",
colour = G.C.SECONDARY_SET.Tarot,
ref_value = _info.ref_value,
colour = _info.colour,
min = 0,
max = 100,
}),
},
}
or nil,
next(SMODS.find_card("v_cry_pacclimator")) and {
n = G.UIT.R,
config = { align = "cm" },
nodes = {
create_slider({
label = localize("b_planet_rate"),
label_scale = 0.4,
text_scale = 0.3,
w = 4,
h = 0.4,
ref_table = G.GAME.cry_percrate,
ref_value = "planet",
colour = G.C.SECONDARY_SET.Planet,
min = 0,
max = 100,
}),
},
} or nil,
end
end
{
cryptid_voucher_nodes[#cryptid_voucher_nodes + 1] = {
n = G.UIT.R,
config = { align = "cm" },
nodes = {
@ -935,16 +930,28 @@ function G.UIDEF.used_vouchers()
},
},
},
},
{ n = G.UIT.R, config = { align = "cm", minh = 0.5 }, nodes = {} },
{
}
cryptid_voucher_nodes[#cryptid_voucher_nodes + 1] = {
n = G.UIT.R,
config = { align = "cm", minh = 0.5 },
nodes = {},
}
cryptid_voucher_nodes[#cryptid_voucher_nodes + 1] = {
n = G.UIT.R,
config = { align = "cm", colour = G.C.BLACK, r = 1, padding = 0.15, emboss = 0.05 },
nodes = {
{ n = G.UIT.R, config = { align = "cm" }, nodes = voucher_table_rows },
},
},
},
}
end
local t = silent
and {
n = G.UIT.ROOT,
config = { align = "cm", colour = G.C.CLEAR },
nodes = cryptid_voucher_nodes,
}
or {
n = G.UIT.ROOT,

File diff suppressed because it is too large Load diff

193
Cryptid/lib/pointerlib.lua Normal file
View file

@ -0,0 +1,193 @@
-- if it works, it works
Cryptid.pointerblist = {}
Cryptid.pointerblisttype = {}
Cryptid.pointeralias = {}
function Cryptid.pointerblistify(target, remove) -- Add specific joker to blacklist, must input either a card object or a key as string, eg:
if not Cryptid.pointerblist then
Cryptid.pointerblist = {}
end
if not remove then
Cryptid.pointerblist[#Cryptid.pointerblist + 1] = target
return true
else
for i = 1, #Cryptid.pointerblist do
if Cryptid.pointerblist[i] == target then
table.remove(Cryptid.pointerblisttype, i)
end
end
end
return false
end
function Cryptid.pointeraliasify(target, key, remove) -- Add a specific alias/key combo to the alias list
if type(key) == "string" then
if string.len(key) ~= 1 then
key = string.lower(key:gsub("%b{}", ""):gsub("%s+", ""))
end
if not remove then
Cryptid.pointeralias[key] = target
return true
else
Cryptid.pointeralias[key] = nil
end
end
return false
end
function Cryptid.pointerblistifytype(target, key, remove) -- eg: blacklists a certain card value, see pointer.lua
if not remove then
for target1, key1 in pairs(Cryptid.pointerblisttype) do
if target1 == target then
for _, key2 in ipairs(Cryptid.pointerblisttype[target]) do
if key2 == key then
return true
end
end
Cryptid.pointerblisttype[target][(#Cryptid.pointerblisttype[target] + 1)] = key
return true
end
end
if not Cryptid.pointerblisttype[target] then
Cryptid.pointerblisttype[target] = {}
end
Cryptid.pointerblisttype[target][1] = key
return true
else
if Cryptid.pointerblisttype[target] then
for index, value in ipairs(Cryptid.pointerblisttype[target]) do
if key == value then
table.remove(Cryptid.pointerblisttype[target], index)
return true
end
end
if key == nil then
Cryptid.pointerblisttype[target] = nil
return true
end
end
end
return false
end
function Cryptid.pointergetalias(target) -- "Is this alias legit?"
target = tostring(target)
local function apply_lower(strn)
if type(strn) ~= string then -- safety
strn = tostring(strn)
end
-- Remove content within {} and any remaining spaces
strn = strn:gsub("%b{}", ""):gsub("%s+", "")
--this weirdness allows you to get m and M separately
if string.len(strn) == 1 then
return strn
end
return string.lower(strn)
end
if Cryptid.pointeralias[apply_lower(target)] then
return Cryptid.pointeralias[apply_lower(target)]
end
if G.P_CENTERS[apply_lower(target)] then
return G.P_CENTERS[apply_lower(target)].key
end
if Cryptid.pointeralias[target] then
return Cryptid.pointeralias[target]
end
if G.P_CENTERS[target] then
return G.P_CENTERS[target].key
end
return false
end
function Cryptid.pointergetblist(target) -- "Is this card pointer banned?"
target = Cryptid.pointergetalias(target) or target
target = target
results = {}
results[1] = false
if not target then
results[1] = true
end
if G.GAME.banned_keys[target] or (type(target) == "table" and G.GAME.banned_keys[target.key]) then
results[1] = true
end
for index, value in ipairs(Cryptid.pointerblist) do
if target == value or (type(target) == "table" and target.key) then
results[1] = true
end
end
if results[1] ~= true and (G.P_CENTERS[target] or (type(target) == "table" and G.P_CENTERS[target.key])) then
target = (G.P_CENTERS[target] or (type(target) == "table" and G.P_CENTERS[target.key]))
for value, power in pairs(Cryptid.pointerblisttype) do
for index, val2 in pairs(target) do
if value == index then
if power == ({} or true or nil) then
results[1] = true
end
for _, val3 in ipairs(power) do
if target[index] == val3 then
results[1] = true
end
end
end
end
end
end
if G.DEBUG_POINTER then
results[1] = false
end
target = G.P_CENTERS[target] or target
if results[1] == false then
if target and target.set == "Joker" then
results[2] = "Joker"
if
target.unlocked -- If card unlocked
and #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit -- and you have room
then
results[3] = true
elseif G.DEBUG_POINTER then
results[3] = true
else
results[3] = false
end
elseif target and target.consumeable then
results[2] = "Consumeable"
if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then
results[3] = true
elseif G.DEBUG_POINTER then
results[3] = true
else
results[3] = false
end
elseif target and target.set == "Voucher" then
results[2] = "Voucher"
if target.unlocked then
results[3] = true
elseif G.DEBUG_POINTER then
results[3] = true
else
results[3] = false
end
elseif target and target.set == "Booster" then
results[2] = "Booster"
if
not ( -- no boosters if already in booster
G.STATE ~= G.STATES.TAROT_PACK
and G.STATE ~= G.STATES.SPECTRAL_PACK
and G.STATE ~= G.STATES.STANDARD_PACK
and G.STATE ~= G.STATES.BUFFOON_PACK
and G.STATE ~= G.STATES.PLANET_PACK
and G.STATE ~= G.STATES.SMODS_BOOSTER_OPENED
)
then
if target.unlocked then
results[3] = true
elseif G.DEBUG_POINTER then
results[3] = true
else
results[3] = false
end
end
end
end
return results
end

View file

@ -14,23 +14,6 @@ SMODS.DrawStep({
self.params.viewed_back
) == "table" and self.params.viewed_back or (self.params.viewed_back and G.GAME.viewed_back or G.GAME.selected_back))
or Back(G.P_CENTERS["b_red"])
if currentBack.effect.config.cry_force_edition and not currentBack.effect.config.cry_antimatter then
if currentBack.effect.config.cry_force_edition_shader then
self.children.back:draw_shader(
currentBack.effect.config.cry_force_edition_shader,
nil,
self.ARGS.send_to_shader,
true
)
else
self.children.back:draw_shader(
currentBack.effect.config.cry_force_edition,
nil,
self.ARGS.send_to_shader,
true
)
end
end
if
currentBack.effect.config.cry_force_seal
and not currentBack.effect.config.hide_seal
@ -200,6 +183,7 @@ SMODS.DrawStep({
then
local scale_mod = 0.07 -- + 0.02*math.cos(1.8*G.TIMERS.REAL) + 0.00*math.cos((G.TIMERS.REAL - math.floor(G.TIMERS.REAL))*math.pi*14)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^3
local rotate_mod = 0 --0.05*math.cos(1.219*G.TIMERS.REAL) + 0.00*math.cos((G.TIMERS.REAL)*math.pi*5)*(1 - (G.TIMERS.REAL - math.floor(G.TIMERS.REAL)))^2
if self.children.floating_sprite2 then
self.children.floating_sprite2:draw_shader(
"dissolve",
0,
@ -222,12 +206,44 @@ SMODS.DrawStep({
scale_mod,
rotate_mod
)
else
local center = self.config.center
if _center and _center.soul_pos and _center.soul_pos.extra then
self.children.floating_sprite2 = Sprite(
self.T.x,
self.T.y,
self.T.w,
self.T.h,
G.ASSET_ATLAS[_center.atlas or _center.set],
_center.soul_pos.extra
)
self.children.floating_sprite2.role.draw_major = self
self.children.floating_sprite2.states.hover.can = false
self.children.floating_sprite2.states.click.can = false
end
end
end
end,
conditions = { vortex = false, facing = "front" },
})
SMODS.draw_ignore_keys.floating_sprite2 = true
-- CCD Drawstep
local interceptorSprite = nil
SMODS.DrawStep({
key = "ccd_interceptor",
order = -5,
func = function(self)
local card_type = self.ability.set or "None"
if card_type ~= "Default" and card_type ~= "Enhanced" and self.playing_card and self.facing == "front" then
interceptorSprite = interceptorSprite
or Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_misc"], { x = 3, y = 1 })
interceptorSprite.role.draw_major = self
interceptorSprite:draw_shader("dissolve", nil, nil, nil, self.children.center)
end
end,
})
-- Make hover UI collidable - so we can detect collision and display tooltips
local m = Card.move
function Card:move(dt)
@ -278,7 +294,7 @@ end
-- Unfortunately this doesn't play nicely with gameset UI
local cainit = CardArea.init
function CardArea:init(X, Y, W, H, config)
if config.collection then
if config and config.collection then
config.highlight_limit = config.card_limit
end
return cainit(self, X, Y, W, H, config)
@ -393,12 +409,13 @@ function G.UIDEF.use_and_sell_buttons(card)
if card.config and card.config.center and card.config.center.key == "c_cry_potion" then
table.remove(abc.nodes[1].nodes, 1)
end
-- i love buttercup
if
card.area
and card.edition
and (card.area == G.jokers or card.area == G.consumeables or card.area == G.hand)
and card.edition.cry_double_sided
and not Card.no(card, "dbl")
and card.area.config.type == "joker"
and card.config
and card.config.center
and card.ability.name == "cry-Buttercup"
then
local use = {
n = G.UIT.C,
@ -411,20 +428,20 @@ function G.UIDEF.use_and_sell_buttons(card)
align = "cr",
maxw = 1.25,
padding = 0.1,
r = 0.08,
r = 0.05,
hover = true,
shadow = true,
colour = G.C.UI.BACKGROUND_INACTIVE,
one_press = true,
button = "flip",
func = "can_flip_card",
button = "store",
func = "can_store_card",
},
nodes = {
{ n = G.UIT.B, config = { w = 0.1, h = 0.3 } },
{
n = G.UIT.T,
config = {
text = localize("b_flip"),
text = localize("b_store"),
colour = G.C.UI.TEXT_LIGHT,
scale = 0.3,
shadow = true,
@ -447,63 +464,5 @@ function G.UIDEF.use_and_sell_buttons(card)
} })
return abc
end
if
card.area
and (card.area == G.jokers or card.area == G.consumeables or card.area == G.hand)
and (not card.edition or not card.edition.cry_double_sided)
and not card.ability.eternal
and not Card.no(card, "dbl")
then
for i = 1, #card.area.cards do
if card.area.cards[i].edition and card.area.cards[i].edition.cry_double_sided then
local use = {
n = G.UIT.C,
config = { align = "cr" },
nodes = {
{
n = G.UIT.C,
config = {
ref_table = card,
align = "cr",
maxw = 1.25,
padding = 0.1,
r = 0.08,
hover = true,
shadow = true,
colour = G.C.UI.BACKGROUND_INACTIVE,
one_press = true,
button = "flip_merge",
func = "can_flip_merge_card",
},
nodes = {
{ n = G.UIT.B, config = { w = 0.1, h = 0.3 } },
{
n = G.UIT.T,
config = {
text = localize("b_merge"),
colour = G.C.UI.TEXT_LIGHT,
scale = 0.3,
shadow = true,
},
},
},
},
},
}
local m = abc.nodes[1]
if not card.added_to_deck then
use.nodes[1].nodes = { use.nodes[1].nodes[2] }
if card.ability.consumeable then
m = abc
end
end
m.nodes = m.nodes or {}
table.insert(m.nodes, { n = G.UIT.R, config = { align = "cl" }, nodes = {
use,
} })
return abc
end
end
end
return abc
end

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -52,8 +52,8 @@ return {
name = "Baraja crítica",
text = {
"Después de cada mano jugada,",
"{C:green}#1# en 4{} probabilidades para {X:dark_edition,C:white} ^2 {} multi",
"{C:green}#1# en 8{} probabilidades para {X:dark_edition,C:white} ^0.5 {} multi",
"{C:green}#1# en #2#{} probabilidades para {X:dark_edition,C:white} ^2 {} multi",
"{C:green}#1# en #3#{} probabilidades para {X:dark_edition,C:white} ^0.5 {} multi",
},
},
b_cry_encoded = {
@ -136,7 +136,7 @@ return {
name = "Baraja legendaria",
text = {
"Comienza con un comodín {C:legendary}legendario{C:legendary}",
"{C:green}1 en 5{} probabilidades para crear otro",
"{C:green}#1# en #2#{} probabilidades para crear otro",
"cuando se derrota a la ciega jefe",
"{C:inactive}(debe haber espacio){}",
},
@ -1427,7 +1427,7 @@ return {
"{C:attention}primer descarte{} de cada ronda",
},
},
j_cry_Megg = {
j_cry_megg = {
name = "Muevo",
text = {
"Vende esta carta para crear",
@ -1449,7 +1449,7 @@ return {
"{X:mult,C:white}X#1#{} multi por cada miembro",
"en el {C:attention}Discord de Cryptid{}",
"{C:inactive}(Actual: {X:mult,C:white}X#2#{C:inactive} multi)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo = {
@ -1458,7 +1458,7 @@ return {
"{C:chips}+#1#{} fichas por cada miembro",
"en el {C:attention}Discord de Cryptid{}",
"{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_meteor = {
@ -2406,6 +2406,14 @@ return {
"gana {C:attention}2{} vales aleatorios",
},
},
c_cry_meld = {
name = "Fusionar",
text = {
"Selecciona un {C:attention}comodín{} o",
"{C:attention}carta de juego{} para",
"hacerla {C:dark_edition}Doble cara",
},
},
c_cry_typhoon = {
name = "Tifón",
text = {
@ -2848,14 +2856,7 @@ return {
"una {C:attention}Carta de eco",
},
},
c_cry_meld = {
name = "Fusionar",
text = {
"Selecciona un {C:attention}comodín{} o",
"{C:attention}carta de juego{} para",
"hacerla {C:dark_edition}Doble cara",
},
},
c_cry_theblessing = {
name = "La bendición",
text = {
@ -3084,6 +3085,15 @@ return {
},
},
Other = {
alt_wheel_of_fortune = {
name = "La rueda de la fortuna",
text = {
"{C:green}#1# en #2#{} probabilidades de agregar",
"que sean {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} o",
"{C:dark_edition}polícromas{}",
"a un {C:attention}comodín al azar",
},
},
banana = {
name = "Banana",
text = {
@ -3563,6 +3573,7 @@ return {
cry_debuff_obsidian_orb = "Aplica las habilidades de todos los jefes derrotados",
k_code = "Código",
k_chips = "fichas",
k_unique = "Único",
b_code_cards = "Cartas de código",
b_unique_cards = "Cartas únicas",

View file

@ -65,8 +65,8 @@ return {
name = "Baraja crítica",
text = {
"Después de cada mano jugada,",
"{C:green}#1# en 4{} probabilidades para {X:dark_edition,C:white} ^2 {} multi",
"{C:green}#1# en 8{} probabilidades para {X:dark_edition,C:white} ^0.5 {} multi",
"{C:green}#1# en #2#{} probabilidades para {X:dark_edition,C:white} ^2 {} multi",
"{C:green}#1# en #3#{} probabilidades para {X:dark_edition,C:white} ^0.5 {} multi",
},
},
b_cry_e_deck = {
@ -188,7 +188,7 @@ return {
name = "Baraja legendaria",
text = {
"Comienza con un comodín {C:legendary}legendario{C:legendary}",
"{C:green}1 en 5{} probabilidades para crear otro",
"{C:green}#1# en #2#{} probabilidades para crear otro",
"cuando se derrota a la ciega jefe",
"{C:inactive}(debe haber espacio){}",
},
@ -406,7 +406,7 @@ return {
},
},
c_cry_crash = {
name = "://CHOQUE",
name = "://CRASH",
text = {
"{C:cry_code,E:1}No.",
},
@ -651,7 +651,7 @@ return {
set_cry_poker_hand_stuff = {
name = "Manos de póker",
text = {
"Añade 4 {C:attention}manos de póker{} nuevas",
"Añade 5 {C:attention}manos de póker{} nuevas",
"y habilita {C:attention}Manos ascendidas",
},
},
@ -800,6 +800,16 @@ return {
"{C:inactive}(Actual: {X:mult,C:white}X#2#{C:inactive} multi)",
},
},
m_cry_abstract = {
name = "Carta abstracta",
text = {
"{X:dark_edition,C:white}^#1#{} multi,",
"Cuenta como su {C:attention}propio{} rango y palo",
"Chance de {C:green}#4# en #5#{} de que",
"{C:red,E:2}se destruya{} la carta al tenerla en la mano al",
"{C:attention}final de la ronda{} o al {C:attention}jugar una mano{}",
},
},
},
Joker = {
j_cry_test_modest = {
@ -925,6 +935,15 @@ return {
"{C:inactive,s:0.8}La categoría no cambia",
},
},
j_cry_highfive = {
name = "Choca esos cinco",
text = {
"Si la carta {C:attention}puntuada más alta{}",
"es {C:attention}5{}, convierte {C:attention}todas{} las cartas que puntúan",
"en {C:attention}5{}s",
"{s:0.8,C:inactive}Se considera a los Aces como 1",
},
},
j_cry_blender = {
name = "Blender",
text = {
@ -1149,6 +1168,18 @@ return {
"una {E:1,C:attention}Pareja suprema",
},
},
j_cry_the = {
name = "El",
text = {
"{X:mult,C:white} X#1# {} multi si la mano",
"jugada es {C:attention}#2#",
},
unlock = {
"Gana una partida con",
"tu última mano siendo",
"una {E:1,C:attention}None", --queda None por traducir, revisar el discord si alguien lo solucionó
},
},
j_cry_clicked_cookie = {
name = "Galleta clickeada",
text = {
@ -1301,6 +1332,21 @@ return {
"de su respectivo {C:attention}tipo{}",
},
},
j_cry_starfruit = {
name = "Carambola",
text = {
"{X:dark_edition,C:white}^#1#{} multi,",
"pierde {X:dark_edition,C:white}^#2#{} multi por cada",
"{C:attention}renovación{} en la tienda",
},
},
j_cry_demicolon = {
name = "Demicolon",
text = {
"{C:attention}Activa por la fuerza{} al Comodín",
"a la derecha",
},
},
j_cry_discreet = {
name = "Comodín discreto",
text = {
@ -1462,6 +1508,15 @@ return {
"{C:attention}#2#{} o menos veces",
},
},
j_cry_familiar_currency = {
name = "Moneda familiar",
text = {
"Crea un {C:attention}comodín meme{}",
"al final de la ronda",
"por {C:money}$#1#{} {C:inactive}(si es posible)",
"{C:inactive}(Debe haber espacio)",
},
},
j_cry_filler = {
name = "El relleno",
text = {
@ -1514,6 +1569,13 @@ return {
"un {C:attention}#2#",
},
},
j_cry_undefined = {
name = "Comodín indefinido",
text = {
"{C:red}+#1#{} multi si la mano",
"jugada es {C:attention}#2#",
},
},
j_cry_formidiulosus = {
name = "Formidiulosus",
text = {
@ -1618,7 +1680,7 @@ return {
"{X:dark_edition,C:white}^#1#{} multi sólo después de",
"jugar {C:attention}114{} manos{}",
"{C:inactive}(Actual: #2#/114){}",
"{C:inactive,s:0.8}¡No hay un lugar como el hugar!{}",
"{C:inactive,s:0.8}¡No hay lugar como el hogar!{}",
},
},
j_cry_home = {
@ -1644,7 +1706,7 @@ return {
j_cry_huntingseason = {
name = "Época de caza",
text = {
"Si la mano jugada contiene exactalemte {C:attention}3{} cartas,",
"Si la mano jugada contiene exactamente {C:attention}3{} cartas,",
"{C:red}destruye{} la carta {C:attention}central{} después de puntuar",
},
},
@ -1658,7 +1720,7 @@ return {
},
},
j_cry_jawbreaker = {
name = "Jawbreaker",
name = "Rompemuelas",
text = {
"Al derrotar la {C:attention}ciega jefe,",
"{C:attention}duplica{} los valores de los comodines adyacentes",
@ -1708,6 +1770,14 @@ return {
"o {C:attention}tipo fichas{} es vendido",
},
},
j_cry_kittyprinter = {
name = "Impresora de gatitos",
text = {
"{X:mult,C:white} X#1# {} multi",
"Todas las etiquetas {C:attention}salteadas{}",
"se vuelven {C:attention}etiquetas de gato{}",
},
},
j_cry_kooky = {
name = "Comodín raro",
text = {
@ -1769,7 +1839,7 @@ return {
"{C:attention}Reactiva{} todos los comodines",
"una vez por cada {C:attention}comodín{}",
"{C:attention}contento{} vendido esta ronda",
"{C:inactive}(Actual:{}{C:attention:} #1#{}{C:inactive} reactivaci#<ones,ón>2#){}",
"{C:inactive}(Actual:{}{C:attention:} #1#{}{C:inactive} reactivaci#<ones,ón>1#){}",
"{C:inactive,s:0.8}No había suficiente espacio...{}",
},
},
@ -1868,7 +1938,7 @@ return {
"{C:attention}primer descarte{} de cada ronda",
},
},
j_cry_Megg = {
j_cry_megg = {
name = "Muevo",
text = {
"Vende esta carta para crear",
@ -1890,8 +1960,7 @@ return {
"{X:mult,C:white}X#1#{} multi por cada miembro",
"en el {C:attention}Discord de Cryptid{}",
"{C:inactive}(Actual: {X:mult,C:white}X#2#{C:inactive} multi)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo = {
@ -1900,7 +1969,7 @@ return {
"{C:chips}+#1#{} ficha#<s>1# por cada miembro",
"en el {C:attention}Discord de Cryptid{}",
"{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo_balanced = {
@ -1909,7 +1978,7 @@ return {
"{C:chips}+#1#{} ficha#<s>1# por cada {C:attention}8{} miembros",
"en el {C:attention}Discord de Cryptid{}",
"{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_meteor = {
@ -2302,7 +2371,7 @@ return {
},
},
j_cry_scrabble = {
name = "Teja de Scrabble",
name = "Ficha de Scrabble",
text = {
"{C:green}#1# en #2#{} probabilidades de crear",
"un comodín {C:green}inusual{} {C:dark_edition}contento",
@ -2380,7 +2449,22 @@ return {
'{C:inactive,s:0.8}"Esta prisión... para mantenerme...?"',
},
},
j_cry_sock_and_sock = {
name = "Calcetín y calcetín",
text = {
"Reactiva todas las cartas",
"{C:attention}abstractas{} jugadas {C:attention}#1#{} vez#<ces>1#",
},
},
j_cry_brokenhome = {
name = "Hogar roto",
text = {
"{X:mult,C:white} X#1# {} multi",
"{C:green}#2# en #3#{} probabilidades",
"de que la carta se destruya",
"al final de la ronda",
},
},
j_cry_spaceglobe = {
name = "Esfera celestial",
text = {
@ -2531,6 +2615,13 @@ return {
"un {C:attention}#2#",
},
},
j_cry_nebulous = {
name = "Comodín Nebuloso",
text = {
"{C:chips}+#1#{} Chip#<s>1# si la mano",
"jugada es {C:attention}#2#",
},
},
j_cry_trick_or_treat = {
name = "Dulce o truco",
text = {
@ -3094,6 +3185,14 @@ return {
"de tu mano al azar",
},
},
c_cry_meld = {
name = "Fusionar",
text = {
"Selecciona un {C:attention}comodín{} o",
"{C:attention}carta de juego{} para",
"hacerla {C:dark_edition}Doble cara",
},
},
c_cry_vacuum = {
name = "Vacío",
text = {
@ -3536,14 +3635,7 @@ return {
"una {C:attention}Carta de eco",
},
},
c_cry_meld = {
name = "Fusionar",
text = {
"Selecciona un {C:attention}comodín{} o",
"{C:attention}carta de juego{} para",
"hacerla {C:dark_edition}Doble cara",
},
},
c_cry_theblessing = {
name = "La bendición",
text = {
@ -3845,6 +3937,15 @@ return {
},
},
Other = {
alt_wheel_of_fortune = {
name = "La rueda de la fortuna",
text = {
"{C:green}#1# en #2#{} probabilidades de agregar",
"que sean {C:dark_edition}laminadas{}, {C:dark_edition}holográficas{} o",
"{C:dark_edition}polícromas{}",
"a un {C:attention}comodín al azar",
},
},
disabled = {
name = "Deshabilitado",
text = {
@ -4391,7 +4492,7 @@ return {
ach_cry_pull_request = "Haz que ://COMMIT haga aparecer el mismo comodín que destruyó",
ach_cry_traffic_jam = "Gana todos los desafíos Hora punta",
ach_cry_ult_full_skip = "Gana en 1 ronda",
ach_cry_used_crash = "Usa ://CHOQUE",
ach_cry_used_crash = "Usa ://CRASH",
ach_cry_what_have_you_done = "Elimina o sacrifica un comodín exótico",
ach_cry_pin = "Pierde una partida contra El Alfiler",
},
@ -4465,6 +4566,7 @@ return {
cry_joke_placeholder = "(múltiplo of 8)",
k_code = "Código",
k_chips = "fichas",
k_content_set = "Set temático",
b_content_sets = "Sets temáticos",
--Why aren't these in vanilla?

View file

@ -111,8 +111,8 @@ return {
name = "Jeu Critique",
text = {
"Après chaque main jouée,",
"{C:green}#1# chance#<s>1# sur 4{} d'obtenir {X:dark_edition,C:white} ^2 {} Multi",
"{C:green}#1# chance#<s>1# sur 8{} d'obtenir {X:dark_edition,C:white} ^0.5 {} Multi",
"{C:green}#1# chance#<s>1# sur #2#{} d'obtenir {X:dark_edition,C:white} ^2 {} Multi",
"{C:green}#1# chance#<s>1# sur #3#{} d'obtenir {X:dark_edition,C:white} ^0.5 {} Multi",
},
unlock = {
"Obtenir un {C:attention}Joker Truqué",
@ -285,7 +285,7 @@ return {
name = "Jeu Légendaire",
text = {
"Démarre avec un Joker {C:legendary}Légendaire{C:legendary}",
"{C:green}1 chance sur 5{} d'en créer un autre",
"{C:green}#1# chance sur #2#{} d'en créer un autre",
"lorsque la Blinde de Boss est battue",
"{C:inactive}(selon la place disponible)",
},
@ -307,7 +307,8 @@ return {
name = "L'Horloge",
text = {
"+0.1X du score requis toutes",
"les 12 secondes passées dans cette Ante",
"les 12 secondes passées dans cette Ante,",
"multiplié par la vitesse du jeu",
},
},
bl_cry_hammer = {
@ -335,7 +336,8 @@ return {
name = "Boucle Lavande",
text = {
"1.25X du score requis toutes les",
"6 secondes passées dans cette manche",
"6 secondes passées dans cette manche,",
"multiplié par la vitesse du jeu",
},
},
bl_cry_obsidian_orb = {
@ -412,6 +414,37 @@ return {
"rareté supérieure sont affaiblis",
},
},
bl_cry_greed = {
name = "L'Avarice",
text = {
"+#2# à la taille de la blinde pour",
"chaque $#1# lorsqu'elle est sélectionnée",
},
},
bl_cry_repulsor = {
name = "Le Répulseur",
text = {
"Redéclenche les jokers",
"aux extrêmités, tous les autres",
"Jokers ne déclenchent pas",
},
},
bl_cry_chromatic = {
name = "Le Chromatisme",
text = {
"Le score de la main",
"est soustrait sur les",
"mains impaires",
},
},
bl_cry_landlord = {
name = "Le Locateur",
text = {
"Applique Location à",
"un Joker aléatoire",
"après que la main soit jouée",
},
},
bl_cry_pinkbow = {
name = "Nœud Rose",
text = {
@ -422,9 +455,9 @@ return {
bl_cry_scorch = {
name = "La Grille",
text = {
"Must play 5 cards,",
"destroy played and",
"discarded cards",
"5 cartes doivent être jouées,",
"toutes les cartes jouées",
"et défaussées sont détruites",
},
},
bl_cry_sapphire_stamp = {
@ -490,8 +523,25 @@ return {
"sont affaiblis",
},
},
bl_cry_decision = {
name = "La Décision",
text = {
"Attache les Jokers après qu'une main",
"soit jouée ou défaussée",
"Ouvre un Paquet Bouffon Maléfique",
"après la manche",
},
},
},
Code = {
c_cry_assemble = {
name = "://ASSEMBLAGE",
text = {
"Ajoute du {C:cry_code}Multi{}",
"à la {C:cry_code}main sélectionnée{} égal au",
"nombre de Jokers possédés",
},
},
c_cry_alttab = {
name = "://ALTTAB",
text = {
@ -518,7 +568,7 @@ return {
c_cry_crash = {
name = "://CRASH",
text = {
"{C:cry_code,E:1}Ne le faites pas.",
"{C:cry_code,E:1}Ne le fais pas.",
},
},
c_cry_ctrl_v = {
@ -555,12 +605,26 @@ return {
"{C:inactive,s:0.8}découvertes pour être valides",
},
},
c_cry_cryfunction = {
name = "FONCTION://",
text = {
"Enregistre les {C:cry_code}trois derniers{} consommables utilisés,",
"réutiliser cette carte crée une copie du",
"premier consommable avec un sticker {C:cry_code}Fonction://{}",
},
},
c_cry_global = {
name = "://GLOBAL",
text = {
"Définit la carte sélectionnée",
"comme carte {C:cry_code}Globale{}",
},
},
c_cry_hook = {
name = "ACCROCHER://",
text = {
"Les deux jokers sélectionnés deviennent {C:cry_code}Accrochés",
"{C:inactive,s:0.8}Ne marche seulement si les Jokers se déclenchent dans le même contexte,",
"{C:inactive,s:0.8}comme Joker et Le Duo (les deux après le compte)",
"Applique {C:cry_code}Accroché{} à",
"2 Jokers sélectionnés",
},
},
c_cry_inst = {
@ -571,6 +635,21 @@ return {
"{C:inactive}(si possible){}",
},
},
c_cry_keygen = {
name = "://KEYGEN",
text = {
"Crée un coupon {C:cry_code}Périssable Banane{}",
"aléatoire, {C:cry_code}détruit{} le dernier coupon créé",
"de cette manière",
},
},
c_cry_log = {
name = "://LOG",
text = {
"To Be {C:cry_code}Implemented{}",
"in a future {C:cry_code}update{}",
},
},
c_cry_machinecode = {
name = "://MACHINECODE",
text = {
@ -596,6 +675,13 @@ return {
"la fin de la manche",
},
},
c_cry_nperror = {
name = "://ERREURNP",
text = {
"Retourne la {C:cry_code}dernière main jouée{}",
"dans votre main",
},
},
c_cry_patch = {
name = "://PATCH",
text = {
@ -620,6 +706,14 @@ return {
"{C:inactive}(Currently {C:cry_code}+#2#{C:inactive})",
},
},
c_cry_quantify = {
name = "://QUANTIFIER",
text = {
"Transfère {C:attention}#1#{} {C:attention}Carte#<s>1#{}",
"ou {C:attention}Paquet#<s>1#{} sélectionné#<s>1#",
"dans les emplacements de {C:attention}Jokers{}",
},
},
c_cry_reboot = {
name = "://REDÉMARRAGE",
text = {
@ -671,6 +765,13 @@ return {
"Nourriture {C:cry_code}Glitché",
},
},
c_cry_cryupdate = {
name = "://MISEAJOUR",
text = {
"on sait {C:cry_code}pas encore{},",
"reviens dans la prochaine {C:cry_code}mise à jour{}",
},
},
c_cry_variable = {
name = "://VARIABLE",
text = {
@ -678,6 +779,15 @@ return {
"en un rang {C:cry_code}choisi{}",
},
},
c_cry_declare = {
name = "://DECLARER",
text = {
"Vos {C:attention}cartes sélectionnées{}",
"deviennent une {C:cry_code}nouvelle{} main de Poker",
"qui est considérée comme un {C:attention}#1#{}",
"Un maximum de {C:attention}3{} {C:inactive}[#2#]{} mains peuvent être créées",
},
},
},
["Content Set"] = {
set_cry_blind = {
@ -731,6 +841,13 @@ return {
"et au {C:attention}Joker Joyeux",
},
},
set_cry_meme = {
name = "Mème",
text = {
"Tout un tas de références",
"à de nombreux mèmes",
},
},
set_cry_misc = {
name = "Divers",
text = {
@ -757,7 +874,7 @@ return {
set_cry_poker_hand_stuff = {
name = "Mains de poker supplémentaires",
text = {
"Rajoute 4 nouvelles {C:attention}mains de poker",
"Rajoute 5 nouvelles {C:attention}mains de poker",
"et active les {C:attention}mains ascensionnées",
},
},
@ -839,6 +956,7 @@ return {
"{C:green}#1# chance#<s>1# sur #2#{} de",
"ne pas {C:red}détruire{} cette carte",
"lorsqu'elle est déclenchée",
"{C:inactive}Non-truquable{}",
},
},
e_cry_glitched = {
@ -906,6 +1024,16 @@ return {
"{C:inactive}(Actuellement {X:mult,C:white}X#2#{C:inactive} Multi)",
},
},
m_cry_abstract = {
name = "Carte abstraite",
text = {
"{X:dark_edition,C:white}^#1#{} Multi,",
"Compte comme son {C:attention}propre{} rang et couleur",
"{C:green}#4# chance#<s>4# sur #5#{} de",
"{C:red,E:2}détruire{} la carte lorsqu'elle {C:attention}jouée",
"ou {C:attention}à la fin de la manche{} si elle est tenue en main",
},
},
},
Joker = {
j_cry_test_modest = {
@ -953,6 +1081,7 @@ return {
"Vendre cette carte crée",
"{C:attention}2{} copies du {C:attention}Joker{} le plus à gauche",
"{C:inactive,s:0.8}Ne copie pas les Carte Googol Play Nostalgiques{}",
"{C:inactive}(Selon la place disponible){}",
},
},
j_cry_altgoogol_balanced = {
@ -1038,6 +1167,16 @@ return {
"{C:inactive,s:0.8}Le rang ne change pas",
},
},
j_cry_rotten_egg = {
name = "Œuf pourri",
text = {
"Lorsque obtenu, définit la valeur de vente",
"de tous les Jokers actuels et futurs à {C:attention}$#1#{}",
"Réduit la valeur de vente des {C:attention}Jokers{} de {C:attention}$#2#{}",
"À la fin de la manche, après avoir gagné {C:attention}$#3#{} {C:inactive}[#4#]{}",
"en vendant des {C:attention}Jokers{}, {C:red}s'auto-détruit{}",
},
},
j_cry_blender = {
name = "Blender",
text = {
@ -1129,6 +1268,14 @@ return {
"pour {C:mult}-#2#{} Multi",
},
},
j_cry_buttercup = {
name = "Potimarron",
text = {
"Permet de stocker {C:attention}#1#{} objet#<s>1# de la boutique",
"Lorsque ce Joker est vendu: Ajoute l#<es objets,'objet>1# stocké#<s>1#",
"à la prochaîne boutique",
},
},
j_cry_candy_basket = {
name = "Panier de bonbons",
text = {
@ -1272,6 +1419,18 @@ return {
"comme main gagnante",
},
},
j_cry_the = {
name = "Le",
text = {
"{X:mult,C:white} X#1# {} Multi si",
"la dernière m {C:attention}#2#",
},
unlock = {
"Gagner une partie",
"en ne jouant {E:1,C:attention}Rien",
"comme main gagnante",
},
},
j_cry_clicked_cookie = {
name = "Cookie cliqué", -- the joke works better in french :3c
text = {
@ -1426,6 +1585,21 @@ return {
"contient une {C:attention}#2#",
},
},
j_cry_demicolon = {
name = "Deux-points-et-demie",
text = {
"{C:attention}Force-déclenche{} le Joker",
"à droite de celui-ci",
},
},
j_cry_starfruit = {
name = "Starfruit",
text = {
"{X:dark_edition,C:white}^#1#{} Multi,",
"perd {X:dark_edition,C:white}^#2#{} Multi à chaque",
"{C:attention}réapprovisionnement{} de la boutique",
},
},
j_cry_digitalhallucinations = {
name = "Hallucinations digitales",
text = {
@ -1597,7 +1771,7 @@ return {
},
},
j_cry_highfive = {
name = "High five",
name = "Tapes-m'en-Cinq",
text = {
"Si le rang le plus haut {C:attention}marqué{}",
"est un {C:attention}5{}, convertit {C:attention}toutes{} les cartes marquées",
@ -1613,6 +1787,15 @@ return {
"que {C:attention}#2#{} fois ou moins",
},
},
j_cry_familiar_currency = {
name = "Monnaie connue",
text = {
"Crée un {C:attention}Joker Mème{}",
"à la fin de la manche",
"pour {C:money}$#1#{} {C:inactive}(si possible)",
"{C:inactive}(Selon la place disponible)",
},
},
j_cry_filler = {
name = "Le filler", -- "english word used in french" moment
text = {
@ -1665,6 +1848,14 @@ return {
"une {C:attention}#2#",
},
},
j_cry_undefined = {
name = "Undefined Joker",
text = {
"{C:red}+#1#{} Multi si la",
"main jouée contient",
"un {C:attention}#2#",
},
},
j_cry_formidiulosus = {
name = "Formidiulosus",
text = {
@ -1809,6 +2000,7 @@ return {
"{C:attention}#2#{} fois,",
"chaque carte jouée donne",
"{X:mult,C:white} X#1# {} Multi lorsqu'elle est comptée",
"{C:inactive}(Maximum {}{C:attention}#3#{}{C:inactive} redéclenchements)",
},
},
j_cry_jawbreaker = {
@ -1907,6 +2099,7 @@ return {
"Les {C:attention}Rois{} comptés donnent",
"{C:attention}+#1#{} à la taille de la main cette manche",
"et redéclenchent les effets des cartes {C:attention}tenues en main{}",
"{C:inactive}(Actuellement {}{C:attention}+#2#{}{C:inactive})",
},
},
j_cry_lightupthenight = {
@ -2028,7 +2221,7 @@ return {
"{C:attention}première défausse{} de chaque manche",
},
},
j_cry_Megg = {
j_cry_megg = {
name = "Mœuf",
text = {
"Vendre cette carte crée",
@ -2050,7 +2243,7 @@ return {
"{X:mult,C:white}X#1#{} Multi pour chaque membre",
"dans le {C:attention}serveur Discord{} de {C:attention}Cryptid{}",
"{C:inactive}(Actuellement {X:mult,C:white}X#2#{C:inactive} Multi)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo = {
@ -2059,7 +2252,7 @@ return {
"{C:chips}+#1#{} Jeton#<s>1# pour chaque membre",
"dans le {C:attention}serveur Discord{} de {C:attention}Cryptid{}",
"{C:inactive}(Actuellement {C:chips}+#2#{C:inactive} Jeton#<s>2#)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo_balanced = {
@ -2068,7 +2261,7 @@ return {
"{C:chips}+#1#{} Jeton#<s>1# tous les {C:attention}8{} membres",
"dans le {C:attention}serveur Discord{} de {C:attention}Cryptid{}",
"{C:inactive}(Actuellement {C:chips}+#2#{C:inactive} Jeton#<s>2#)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_meteor = {
@ -2305,6 +2498,14 @@ return {
"donne un {C:attention}Badge{} aléatoire",
},
},
j_cry_pity_prize_modest = {
name = "Lot de pitié",
text = {
"Lorsqu'un {C:attention}Paquet Booster{} est passé,",
"donne un {C:attention}Badge{} aléatoire",
"{C:red,E:2}S'auto-détruit{}",
},
},
j_cry_pot_of_jokes = {
name = "Pot de Blagues",
text = {
@ -2526,8 +2727,9 @@ return {
"{C:attention}+#1#{} emplacement#<s>1# de coupon",
},
unlock = {
"Win a run with",
"only {C:attention}High Card",
"Gagner une partie",
"avec uniquement",
"des {C:attention}Carte Haute",
},
},
j_cry_fleshpanopticon = {
@ -2540,6 +2742,71 @@ return {
'{C:inactive,s:0.8}"This prison... to hold... me?"',
},
},
j_cry_sock_and_sock = {
name = "Chaussettes de Cirque", -- un cirque plutôt digital, mdr
text = {
"Redéclenche toutes les",
"cartes {C:attention}Abstraites{} {C:attention}#1#{} fois",
},
},
j_cry_brokenhome = {
name = "Maison cassée",
text = {
"{X:mult,C:white} X#1# {} Multi",
"{C:green}#2# chance#<s>2# sur #3#{} que cette carte",
"soit détruite à la fin",
"de la manche",
},
},
j_cry_yarnball = {
name = "Boule de laine",
text = {
"Ajoute le niveau du {C:attention}Badge Chat{} le plus élevé",
"à toutes les {C:green}probabilités affichées",
},
},
j_cry_pizza = {
name = "Pizza",
text = {
"Après {C:attention}#1#{} {C:inactive}[#2#]{} manche#<s>1#",
"vendre ce Joker crée",
"{C:attention}#3#{} Parts de pizza",
},
},
j_cry_pizza_slice = {
name = "Part de pizza",
text = {
"Ce Joker gagne {X:mult,C:white}X#1#{} Multi",
"lorsqu'une {C:attention}Part de pizza{} est vendue",
"{C:inactive}(Actuellement{} {X:mult,C:white}X#2#{}{C:inactive} Multi){}",
},
},
j_cry_paved_joker = {
name = "Joker pavé",
text = {
"Les Cartes Pierre peuvent remplir",
"{C:attention}#1#{} trou#<s>1# dans les",
"{C:attention}Quintes{} et {C:attention}Couleurs{}",
},
},
j_cry_fading_joker = {
name = "Joker effacé",
text = {
"Ce Joker gagne",
"{X:mult,C:white}X#1#{} Multi lorsqu'une",
"carte {C:attention}Périssable{} est affaiblie",
"{C:inactive}(Actuellement{} {X:mult,C:white}X#2#{} {C:inactive}Multi){}",
},
},
j_cry_poor_joker = {
name = "Joker pauvre",
text = {
"Ce Joker gagne",
"{X:mult,C:white}X#1#{} Multi lorsqu'une",
"carte {C:attention}Location{} prend de l'argent",
"{C:inactive}(Actuellement{} {C:mult}+#2#{} {C:inactive}Multi){}",
},
},
j_cry_spaceglobe = {
name = "Globe Céleste",
text = {
@ -2691,6 +2958,43 @@ return {
"contient une {C:attention}#2#",
},
},
j_cry_nebulous = {
name = "Joker nébuleux",
text = {
"{C:chips}+#1#{} Jeton#<s>1# si",
"la main jouée",
"ne contient {C:attention}#2#",
},
},
j_cry_words_cant_even = {
name = "Un joker dont je ne suis pas en mesure de décrire avec des mots",
text = {
"{X:mult,C:white}X#1#{} Multi si",
"la main jouée",
"contient {C:attention}#2#",
},
},
j_cry_many_lost_minds = {
name = "Nombreux sont ceux que ce joker a rendus fous en essayant de le comprendre",
text = {
"{C:chips}+#1#{} Jetons si",
"la main jouée",
"contient {C:attention}#2#",
},
},
j_cry_annihalation = {
name = "La destruction et la fin nette pure et dure de tout ce qui a rendu Balatro sacré",
text = {
"{X:dark_edition,C:white}^#1#{} Multi si",
"la main jouée",
"contient {C:attention}#2#",
},
unlock = {
"Gagner une partie",
"en jouant l'{E:1,C:attention}#1#",
"comme main gagnante",
},
},
j_cry_trick_or_treat = {
name = "Des bonbons ou un sort!",
text = {
@ -2720,7 +3024,7 @@ return {
text = {
"Vendre cette carte",
"{C:attention}multiplie{} les valeurs",
"des jokers possédés de {C:attention}X1.5{}",
"des jokers possédés de {C:attention}X#1#{}",
},
},
j_cry_unity = {
@ -2883,7 +3187,7 @@ return {
},
Planet = {
c_cry_Klubi = {
name = "Klubi",
name = "Risti",
text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Améliore",
@ -2893,7 +3197,7 @@ return {
},
},
c_cry_Lapio = {
name = "Lapio",
name = "Pata",
text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Améliore",
@ -2912,6 +3216,16 @@ return {
"et {C:attention}#3#{}",
},
},
c_cry_voxel = {
name = "Voxel",
text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Améliore",
"{C:attention}#1#{},",
"{C:attention}#2#{},",
"et {C:attention}#3#{}",
},
},
c_cry_nstar = {
name = "Étoile à neutrons",
text = {
@ -2933,7 +3247,7 @@ return {
},
},
c_cry_Sydan = {
name = "Sydan",
name = "Hertta",
text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Améliore",
@ -2943,7 +3257,7 @@ return {
},
},
c_cry_Timantti = {
name = "Timantti",
name = "Ruutu",
text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Améliore",
@ -2998,6 +3312,26 @@ return {
"{C:inactive}(Actuellement {X:gold,C:white}X(#3#^asc){C:inactive})",
},
},
c_cry_Timantii = {
name = "Ruutu",
text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Améliore",
"{C:attention}#1#{},",
"{C:attention}#2#{},",
"et {C:attention}#3#{}",
},
},
-- give it up for le rien
c_cry_nibiru = {
name = "Nibiru",
text = {
"{S:0.8}({S:0.8,V:1}niv.#1#{S:0.8}){} Améliore",
"{C:attention}#2#",
"{C:mult}+#3#{} Multi et",
"{C:chips}+#4#{} Jeton#<s>4#",
},
},
},
Sleeve = {
sleeve_cry_beige_sleeve = {
@ -3141,12 +3475,22 @@ return {
sleeve_cry_antimatter_sleeve = {
name = "Pochette d'Antimatière",
text = {
"Applique les {C:attention}effects{}",
"Applique les {C:attention}effets{}",
"et autres {C:attention}effets spéciaux{}",
"de toutes les autres pochettes",
"{C:red}WIP",
},
},
sleeve_cry_antimatter_sleeve_balanced = {
name = "Pochette d'Antimatière",
text = {
"Applique les {C:attention}effets{}",
"et autres {C:attention}effets spéciaux{}",
"de {C:attention}toutes{} les pochettes",
"battues avec la {C:gold}Mise Or{}",
"{C:red}WIP",
},
},
},
Spectral = {
c_cry_adversary = {
@ -3170,6 +3514,7 @@ return {
text = {
"Crée {C:attention}#1#{} copie#<s>1# {C:dark_edition}Négatives{}",
"d'un consommable {C:attention}aléatoire",
"en votre possession",
"{C:inactive,s:0.8}Ne copie pas Chambré{}",
},
},
@ -3261,6 +3606,14 @@ return {
"sélectionnée",
},
},
c_cry_meld = {
name = "Mélange", -- c'était "le Mélange qd c'était un tarot"
text = {
"Transforme un {C:attention}Joker{} ou",
"une {C:attention}carte à jouer{} en",
"carte {C:dark_edition}Double-face",
},
},
c_cry_vacuum = {
name = "Aspiration",
text = {
@ -3683,6 +4036,30 @@ return {
"{s:0.8,C:inactive}Badges de Copie exclus",
},
},
tag_cry_clone = {
name = "Badge Clone",
text = {
"Les objets de la boutique coûtent {C:attention}X#1#{}",
"plus cher, octroie une {C:attention}Copie{}",
"de la prochaîne carte achetée",
},
},
tag_cry_lens = {
name = "Badge Optique",
text = {
"Applique {C:dark_edition}Négatif{}",
"à {C:attention}#1#{} consommable#<s>1#",
"aléatoire#<s>1#",
},
},
tag_cry_palette_cleanser = {
name = "Badge Nettoyant Palette",
text = {
"Enlève un sticker {C:attention}aléatoire{}",
"d'un Joker ou carte à jouer",
"{C:attention}aléatoire{}",
},
},
},
Tarot = {
c_cry_automaton = {
@ -3701,12 +4078,12 @@ return {
"{C:attention}Carte#<s>1# écho",
},
},
c_cry_meld = {
name = "le Mélange",
c_cry_instability = {
name = "Instabilité",
text = {
"Transforme un {C:attention}Joker{} ou",
"une {C:attention}carte à jouer{} en",
"carte {C:dark_edition}Double-face",
"Transforme jusqu'à {C:attention}#1#{}",
"carte#<s>1# sélectionnée#<s>1# en",
"{C:attention}Carte#<s>1# abstraites",
},
},
c_cry_theblessing = {
@ -3873,6 +4250,9 @@ return {
"Les cartes {C:planet}Planète{} apparaissent",
"{C:attention}X#1#{} plus souvent",
"dans la boutique",
"Permet de contrôler le {C:planet}taux d'apparition{}",
"{C:planet}des planètes{} dans la boutique",
"{C:inactive}(Voir les {C:attention}Infos de la partie{C:inactive})",
"Toutes les futures cartes",
"{C:planet}Planète{} sont {C:green}gratuites{}",
},
@ -3953,8 +4333,11 @@ return {
"Les cartes {C:tarot}Tarot{} apparaissent",
"{C:attention}X#1#{} plus souvent",
"dans la boutique",
"Permet de contrôler le {C:tarot}taux d'apparition{}",
"{C:tarot}des Tarots{} dans la boutique",
"{C:inactive}(Voir les {C:attention}Infos de la partie{C:inactive})",
"Toutes les futures cartes",
"{C:tarot}Tarot{} seront {C:green}gratuites{}",
"{C:tarot}Tarot{} sont {C:green}gratuites{}",
},
unlock = {
"Acheter {C:attention}100{} cartes",
@ -4002,12 +4385,21 @@ return {
text = {
"{C:attention}+#1#{} limite",
"de sélection de cartes",
"{C:inactive,s:0.7}NOTE: Aura plus de{}",
"{C:inactive,s:0.7}fonctionnalités plus tard{}",
"Toutes les cartes sélectionnées contribuent",
"aux {C:attention}Mains Ascensionées{}",
},
},
},
Other = {
alt_wheel_of_fortune = {
name = "La Roue de Fortune",
text = {
"{C:green}#1# chance(s) sur #2#{} d'ajouter une édition",
"{C:dark_edition}Brillantes{}, {C:dark_edition}Holographique{} ou",
"{C:dark_edition}Polychrome{}",
"à un {C:attention}Joker au hasard",
},
},
disabled = {
name = "Désactivé",
text = {
@ -4062,6 +4454,16 @@ return {
text = {
"Quand ce joker est {C:cry_code}déclenché{},",
"déclenche {C:cry_code}#1#",
"{C:inactive}Ne marche pas avec toutes les cartes{}",
"{C:inactive}mais tous les jokers peuvent déclencher l'autre{}",
},
},
cry_global_sticker = {
name = "Global",
text = {
"Cette carte est {C:cry_code}prioritaire",
"lorsque des cartes sont tirées,",
"si possible",
},
},
cry_flickering = {
@ -4079,6 +4481,22 @@ return {
"{C:attention}#1#{} déclenchements",
},
},
cry_function_sticker = {
name = "Fonction://",
text = {
"Crée {C:cry_code}#1#{}",
"à l'utilisation",
},
},
cry_function_sticker_desc = { --for function:// card
name = "Fonction://",
text = {
"Crée le consommable",
"{C:cry_code}Fonction://{} suivant",
"{C:inactive}Actuellement #1#, #2# puis #3#{}",
},
},
cry_possessed = {
name = "Possédé",
text = {
@ -4103,10 +4521,11 @@ return {
},
},
ev_cry_choco0 = {
name = "",
name = "Événements possibles",
text = {
"Les détails d'un {C:cry_ascendant,E:1}événement",
"seront affichés ici",
"{T:ev_cry_choco1}1{} {T:ev_cry_choco2}2{} {T:ev_cry_choco3}3{} {T:ev_cry_choco4}4{} {T:ev_cry_choco5}5{}",
"{T:ev_cry_choco6}6{} {T:ev_cry_choco7}7{} {T:ev_cry_choco8}8{} {T:ev_cry_choco9}9{} {T:ev_cry_choco10}10{}",
"{C:inactive}(Survolez pour plus d'informations)",
},
},
ev_cry_choco1 = {
@ -4368,6 +4787,15 @@ return {
"{C:attention}Joker Mème{} parmi {C:attention}#2#{}",
},
},
p_cry_baneful_1 = {
name = "Paquet Bouffon Maléfique",
text = {
"Jusqu'à {C:attention}#1#{} Joker#<s>1#",
"parmi {C:attention}#2#{} Joker#<s>2# {X:cry_cursed,C:white}Maudit#<s>2#{}",
"{C:attention}Skipping{} will {C:red}banish{}",
"{C:attention}rightmost{} owned Joker",
},
},
undiscovered_code = {
name = "Non découvert",
text = {
@ -4410,6 +4838,12 @@ return {
'{C:inactive,s:0.7}"Je déteste cette carte" - SDM_0, 2024{}{}',
},
},
cry_multiuse = {
name = "m",
text = {
"{C:inactive}Réutilisable: ({C:cry_code}#1#{C:inactive} utilisations restantes)",
},
},
},
Unique = {
c_cry_potion = {
@ -4496,6 +4930,7 @@ return {
["cry_UltPair"] = "Super Paire",
["cry_WholeDeck"] = Cryptid_config.family_mode and "Jeu complet" or "un putain de jeu complet",
["cry-Cluster Bulwark"] = "Capharna-rempart",
["cry_None"] = "Rien",
},
poker_hand_descriptions = {
["cry_Bulwark"] = {
@ -4515,6 +4950,24 @@ return {
"d'un jeu standard de 52 cartes.",
"Je sais pas quoi dire, mais tu es fou.",
},
["cry_None"] = { "Une main contenant 0 cartes" },
["cry_Declare0"] = { "Compte toujours comme une Quinte" },
["cry_Declare1"] = { "Compte toujours comme une Couleur" },
["cry_Declare2"] = { "Compte toujours comme un Full" },
["cry_Declare0_suitless"] = {
"Compte toujours comme une Quinte",
"La main n'a pas besoin de couleurs particulières",
},
["cry_Declare1_suitless"] = {
"Compte toujours comme une Couleur",
"La main n'a pas besoin de couleurs particulières",
},
["cry_Declare2_suitless"] = {
"Compte toujours comme un Full",
"La main n'a pas besoin de couleurs particulières",
},
},
achievement_names = {
ach_cry_ace_in_crash = "ACE de poche",
@ -4540,6 +4993,11 @@ return {
ach_cry_pin = "L'épingle de la honte",
ach_cry_youre_fucking_kidding = Cryptid_config.family_mode and "J'ai plus besoin de ça"
or "Tu te fous de moi",
ach_cry_decked = "Remis en jeu",
ach_cry_despaired = "Déparaillé",
ach_cry_stoned = "Solide",
ach_cry_fucked = "Foutu",
ach_cry_technically_positive = "Techniquement positif",
},
achievement_descriptions = {
ach_cry_ace_in_crash = 'check_for_unlock({type = "ace_in_crash"})',
@ -4558,12 +5016,17 @@ return {
ach_cry_patience_virtue = "Attendre 2 minutes face à la Boucle Lavande avant de jouer la première main, puis battre la blinde",
ach_cry_perfectly_balanced = "Battre le Jeu Très Équilibré avec la Mise Ascendante",
ach_cry_pull_request = "Faire ://ENGAGER apparaître le même joker qu'il a détruit",
ach_cry_traffic_jam = "Battre tous les challenges Heure de Pointe",
ach_cry_traffic_jam = "Battre tous les challenges Heure de pointe",
ach_cry_ult_full_skip = "Gagner en 1 tour",
ach_cry_used_crash = "Utiliser ://CRASH",
ach_cry_what_have_you_done = "Supprimer ou sacrifier un Joker exotique",
ach_cry_pin = "Perdre une partie face à l'Épingle",
ach_cry_youre_fucking_kidding = "Défausser " .. localize("cry_WholeDeck", "poker_hands"),
ach_cry_decked = "Monter " .. localize("cry_WholeDeck", "poker_hands") .. " au niveau 5252",
ach_cry_despaired = "Monter " .. localize("cry_UltPair", "poker_hands") .. " au niveau 2222",
ach_cry_fucked = "Monter " .. localize("cry_Clusterfuck", "poker_hands") .. " au niveau 69",
ach_cry_stoned = "Monter " .. localize("cry_Bulwark", "poker_hands") .. " au niveau 420",
ach_cry_technically_positive = "Obtenir un Joker Négatif négatif",
},
challenge_names = {
c_cry_ballin = "Ballin'",
@ -4617,6 +5080,8 @@ return {
k_cry_program_pack = "Paquet Programme",
k_cry_meme_pack = "Paquet Meme",
k_cry_baneful_pack = "Paquet Bouffon Maléfique",
cry_baneful_warning = "Passer bannira le Joker le plus à droite",
cry_critical_hit_ex = "Coup critique!",
cry_critical_miss_ex = "Échec critique!",
@ -4631,16 +5096,19 @@ return {
cry_debuff_oldflint = "Pas de Couleur",
cry_debuff_oldmark = "No hands containing a Pair",
cry_debuff_obsidian_orb = "Applique les capacités de tous les boss battus",
cry_blind_baneful_pack = "Après la manche, ouvre un Paquet Bouffon Maléfique",
cry_tax_placeholder = "(X0.4 taille de la blinde)",
cry_joke_placeholder = "(multiple de 8)",
k_code = "Code",
k_chips = "Jetons",
k_content_set = "Set à thème",
b_content_sets = "Sets à thème",
--Why aren't these in vanilla?
b_tag = "Badge",
b_blind = "Blinde",
rush_hour_reminder = "Activez l'Horloge et la Boucle Lavande pour jouer à Heure de pointe",
b_tarot_rate = "Taux de tarot",
b_planet_rate = "Taux de planète",
@ -4668,6 +5136,7 @@ return {
b_flip = "RETOURNER",
b_merge = "FUSIONNER",
b_store = "STOCKER",
cry_asc_hands = "Mains Asc.",
cry_p_star = "Étoile",
@ -4679,6 +5148,7 @@ return {
cry_again_q = "Encore?",
cry_curse = "Malédiction",
cry_curse_ex = "Malédiction!",
cry_demicolon = "Demi-déclenché!",
cry_sobbing = "À l'aide...",
cry_gaming = "Gaming",
cry_gaming_ex = "Gaming!",
@ -4697,6 +5167,7 @@ return {
cry_unredeemed = "Plus échangé...",
cry_active = "Actif",
cry_inactive = "Inactif",
cry_divorced = "Divorcé!",
k_disable_music = "Désactiver la musique",
@ -4707,6 +5178,7 @@ return {
k_planet_disc = "Disque Circumstellaire",
k_planet_satellite = "Satellites Naturels",
k_planet_universe = Cryptid_config.family_mode and "Univers" or "Le putain d'univers",
k_planet_nibiru = "Inexistante",
cry_notif_jimball_1 = "Jimboule",
cry_notif_jimball_2 = "Notice de droits d'auteur",
@ -4747,6 +5219,7 @@ return {
unique = "Unique",
cry_rigged = "Truqué",
cry_hooked = "Accroché",
cry_global_sticker = "Global",
cry_flickering = "Luisant",
cry_possessed = "Possédé",

View file

@ -1222,7 +1222,7 @@ return {
"{C:attention}first discard{} of each round",
},
},
j_cry_Megg = {
j_cry_megg = {
name = "Megg",
text = {
"Sell this card to create",
@ -1236,7 +1236,7 @@ return {
"{X:mult,C:white}X#1#{} Mult for each member",
"in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo = {
@ -1245,7 +1245,7 @@ return {
"{C:chips}+#1#{} Chips for each member",
"in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_meteor = {
@ -2045,6 +2045,14 @@ return {
"card in your hand",
},
},
c_cry_meld = {
name = "Meld",
text = {
"Select a {C:attention}Joker{} or",
"{C:attention}playing card{} to",
"become {C:dark_edition}Double-Sided",
},
},
c_cry_vacuum = {
name = "Vacuum",
text = {
@ -2477,14 +2485,7 @@ return {
"into an {C:attention}Echo Card",
},
},
c_cry_meld = {
name = "Meld",
text = {
"Select a {C:attention}Joker{} or",
"{C:attention}playing card{} to",
"become {C:dark_edition}Double-Sided",
},
},
c_cry_theblessing = {
name = "The Blessing",
text = {
@ -2716,6 +2717,15 @@ return {
},
},
Other = {
alt_wheel_of_fortune = {
name = "The Wheel of Fortune",
text = {
"{C:green}#1# dalam #2#{} peluang untuk menambah",
"edisi {C:dark_edition}Foil{}, {C:dark_edition}Holographic{}, dan",
"{C:dark_edition}Polychrome{}",
"menghancurkan sebuah {C:attention}Joker secara acak",
},
},
banana = {
name = "Banana",
text = {
@ -3041,6 +3051,7 @@ return {
cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses",
k_code = "Code",
k_chips = "chip",
b_code_cards = "Code Cards",
b_pull = "PULL",
cry_hooked_ex = "Hooked!",

View file

@ -1222,7 +1222,7 @@ return {
"{C:attention}first discard{} of each round",
},
},
j_cry_Megg = {
j_cry_megg = {
name = "Megg",
text = {
"Sell this card to create",
@ -1236,7 +1236,7 @@ return {
"{X:mult,C:white}X#1#{} Mult for each member",
"in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo = {
@ -1245,7 +1245,7 @@ return {
"{C:chips}+#1#{} Chips for each member",
"in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_meteor = {
@ -2045,6 +2045,14 @@ return {
"card in your hand",
},
},
c_cry_meld = {
name = "Meld",
text = {
"Select a {C:attention}Joker{} or",
"{C:attention}playing card{} to",
"become {C:dark_edition}Double-Sided",
},
},
c_cry_vacuum = {
name = "Vacuum",
text = {
@ -2477,14 +2485,6 @@ return {
"into an {C:attention}Echo Card",
},
},
c_cry_meld = {
name = "Meld",
text = {
"Select a {C:attention}Joker{} or",
"{C:attention}playing card{} to",
"become {C:dark_edition}Double-Sided",
},
},
c_cry_theblessing = {
name = "The Blessing",
text = {
@ -2716,6 +2716,15 @@ return {
},
},
Other = {
alt_wheel_of_fortune = {
name = "運命の輪",
text = {
"{C:green}#2#分の#1#{} の確率で",
"ランダムな {C:attention}ジョーカー{} に",
"{C:dark_edition}フォイル{}、 {C:dark_edition}ホログラム{}",
"{C:dark_edition}ポリクローム{} エディションのいずれかを加える",
},
},
banana = {
name = "Banana",
text = {
@ -3041,6 +3050,7 @@ return {
cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses",
k_code = "Code",
k_chips = "チップ",
b_code_cards = "Code Cards",
b_pull = "PULL",
cry_hooked_ex = "Hooked!",

File diff suppressed because it is too large Load diff

View file

@ -1225,7 +1225,7 @@ return {
"{C:attention}first discard{} of each round",
},
},
j_cry_Megg = {
j_cry_megg = {
name = "Megg",
text = {
"Sell this card to create",
@ -1239,7 +1239,7 @@ return {
"{X:mult,C:white}X#1#{} Mult for each member",
"in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo = {
@ -1248,7 +1248,7 @@ return {
"{C:chips}+#1#{} Chips for each member",
"in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_meteor = {
@ -2049,6 +2049,14 @@ return {
"card in your hand",
},
},
c_cry_meld = {
name = "Meld",
text = {
"Select a {C:attention}Joker{} or",
"{C:attention}playing card{} to",
"become {C:dark_edition}Double-Sided",
},
},
c_cry_vacuum = {
name = "Vacuum",
text = {
@ -2481,14 +2489,6 @@ return {
"into an {C:attention}Echo Card",
},
},
c_cry_meld = {
name = "Meld",
text = {
"Select a {C:attention}Joker{} or",
"{C:attention}playing card{} to",
"become {C:dark_edition}Double-Sided",
},
},
c_cry_theblessing = {
name = "The Blessing",
text = {
@ -2720,6 +2720,15 @@ return {
},
},
Other = {
alt_wheel_of_fortune = {
name = "Het rad van fortuin",
text = {
"Een kans van {C:green}#1# op #2#{} om",
"{C:dark_edition}folie{}, {C:dark_edition}holografische{} of",
"{C:dark_edition}polychrome{} editie toe te voegen",
"aan een willekeurige {C:attention}Joker",
},
},
banana = {
name = "Banana",
text = {
@ -3044,6 +3053,7 @@ return {
cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses",
k_code = "Code",
k_chips = "fiches",
b_code_cards = "Code Cards",
b_pull = "PULL",
cry_hooked_ex = "Hooked!",

View file

@ -52,8 +52,8 @@ return {
name = "Krytyczna Talia",
text = {
"Po każdej zagranej ręce,",
"{C:green}#1# na 4{} szans na mnożnik {X:dark_edition,C:white} ^2 {}",
"{C:green}#1# na 8{} szans na mnożnik {X:dark_edition,C:white} ^0.5 {}",
"{C:green}#1# na #2#{} szans na mnożnik {X:dark_edition,C:white} ^2 {}",
"{C:green}#1# na #3#{} szans na mnożnik {X:dark_edition,C:white} ^0.5 {}",
},
},
b_cry_encoded = {
@ -136,7 +136,7 @@ return {
name = "Legendarna Talia",
text = {
"Rozpoczynasz podejście z {C:legendary}legendarnym{C:legendary} jokerem",
"{C:green}1 in 5{} szans na dodanie kolejnego",
"{C:green}#1# in #2#{} szans na dodanie kolejnego",
"po pokonaniu przeszkadzajki bossa",
"{C:inactive}(wymaga miejsca){}",
},
@ -1426,7 +1426,7 @@ return {
"{C:attention}pierwsza zrzutka{} rundy",
},
},
j_cry_Megg = {
j_cry_megg = {
name = "M-Jajko",
text = {
"Sprzedaj tę kartę, aby stworzyć",
@ -1448,7 +1448,7 @@ return {
"Mnoż. {X:mult,C:white}X#1#{} za każdego członka",
"discordowego serwera {C:attention}Cryptid{}",
"{C:inactive}(obecny mnoż.: {X:mult,C:white}X#2#{C:inactive}",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo = {
@ -1457,7 +1457,7 @@ return {
"{C:chips}+#1#{} za każdego członka",
"discordowego serwera {C:attention}Cryptid{}",
"{C:inactive}(obecnie: {C:chips}+#2#{C:inactive} żet.)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_meteor = {
@ -2475,6 +2475,14 @@ return {
"karty w ręcę",
},
},
c_cry_meld = {
name = "Wtopienie",
text = {
"Wybierz {C:attention}jokera{} lub",
"{C:attention}kartę rozgrywającą{}, aby",
"stała się {C:dark_edition}Dwustronna",
},
},
c_cry_vacuum = {
name = "Próżnia",
text = {
@ -2907,14 +2915,6 @@ return {
"do: {C:attention}Karta Echa",
},
},
c_cry_meld = {
name = "Wtopienie",
text = {
"Wybierz {C:attention}jokera{} lub",
"{C:attention}kartę rozgrywającą{}, aby",
"stała się {C:dark_edition}Dwustronna",
},
},
c_cry_theblessing = {
name = "Błogosławieństwo",
text = {
@ -3141,6 +3141,15 @@ return {
},
},
Other = {
alt_wheel_of_fortune = {
name = "Koło Fortuny",
text = {
"{C:green}#1# na #2#{} szans zamiany",
"losowego {C:attention}jokera na jego wersję",
"{C:dark_edition}w folii{}, {C:dark_edition}holograficzną{} lub",
"{C:dark_edition}polichromowaną{}",
},
},
banana = {
name = "Bananowy",
text = {
@ -3653,6 +3662,7 @@ return {
cry_debuff_obsidian_orb = "Aplikuje zdolności wszystkich pokonanych bossów",
k_code = "Kod",
k_chips = "żet",
k_unique = "Unikalny",
b_code_cards = "Karty Kodowe",
b_unique_cards = "Unikalne Karty",

View file

@ -65,8 +65,8 @@ return {
name = "Baralho Crítico",
text = {
"Após cada mão jogada,",
"{C:green}#1# em 4{} de chance para {X:dark_edition,C:white} ^2 {} Mult",
"{C:green}#1# em 8{} de chance para {X:dark_edition,C:white} ^0.5 {} Mult",
"{C:green}#1# em #2#{} de chance para {X:dark_edition,C:white} ^2 {} Mult",
"{C:green}#1# em #3#{} de chance para {X:dark_edition,C:white} ^0.5 {} Mult",
},
},
b_cry_e_deck = {
@ -188,7 +188,7 @@ return {
name = "Baralho Lendário",
text = {
"Começe com um Curinga {C:legendary}Lendário{C:legendary}",
"{C:green}1 em 5{} de chance para criar outro",
"{C:green}#1# em #2#{} de chance para criar outro",
"quando o Blind Chefe é derrotado",
"{C:inactive}(precisa ter espaço){}",
},
@ -645,7 +645,7 @@ return {
set_cry_poker_hand_stuff = {
name = "Poker Hand Stuff",
text = {
"Add 4 new {C:attention}poker hands",
"Add 5 new {C:attention}poker hands",
"and enable {C:attention}Ascended hands",
},
},
@ -1894,7 +1894,7 @@ return {
"{C:attention}primeiro descarte{} de cada rodada",
},
},
j_cry_Megg = {
j_cry_megg = {
name = "Movo",
text = {
"Venda esta carta para criar",
@ -1916,7 +1916,7 @@ return {
"{X:mult,C:white}X#1#{} Mult para cada membro",
"no {C:attention}Cryptid Discord{}",
"{C:inactive}(Atualmente {X:mult,C:white}X#2#{C:inactive} Mult)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo = {
@ -1925,7 +1925,7 @@ return {
"{C:chips}+#1#{} Fichas#<s>1# para cada menbro",
"no {C:attention}Cryptid Discord{}",
"{C:inactive}(Atualmente {C:chips}+#2#{C:inactive} Ficha#<s>2#)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo_balanced = {
@ -1934,7 +1934,7 @@ return {
"{C:chips}+#1#{} Ficha#<s>1# para cada {C:attention}8{} membros",
"no {C:attention}Cryptid Discord{}",
"{C:inactive}(Atualmente {C:chips}+#2#{C:inactive} Ficha#<s>2#)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_meteor = {
@ -3112,6 +3112,14 @@ return {
"em sua mão",
},
},
c_cry_meld = {
name = "Fusão",
text = {
"Selecione um {C:attention}Curinga{} ou",
"{C:attention}carta de jogo{} para",
"se tornar {C:dark_edition}Duas Caras",
},
},
c_cry_vacuum = {
name = "Vácuo",
text = {
@ -3555,14 +3563,6 @@ return {
"em uma {C:attention}Carta Eco",
},
},
c_cry_meld = {
name = "Fusão",
text = {
"Selecione um {C:attention}Curinga{} ou",
"{C:attention}carta de jogo{} para",
"se tornar {C:dark_edition}Duas Caras",
},
},
c_cry_theblessing = {
name = "A Benção",
text = {
@ -3861,6 +3861,15 @@ return {
},
},
Other = {
alt_wheel_of_fortune = {
name = "A Roda da Fortuna",
text = {
"Chance de {C:green}#1# em #2#{} de adicionar",
"edição {C:dark_edition}Laminada{}, {C:dark_edition}Holográfica{} ou",
"{C:dark_edition}Policromática{}",
"a um {C:attention}Curinga aleatório",
},
},
disabled = {
name = "Desativado",
text = {
@ -4483,6 +4492,7 @@ return {
cry_joke_placeholder = "(multiple of 8)",
k_code = "Code",
k_chips = "fichas",
k_content_set = "Thematic Set",
b_content_sets = "Thematic Sets",
--Why aren't these in vanilla?

View file

@ -73,20 +73,20 @@ return {
},
},
b_cry_conveyor = {
name = "Conveyor Deck",
name = "Конвейерная колода",
text = {
"Jokers may {C:attention}not{} be moved",
"At start of round,",
"{C:attention}duplicate{} rightmost Joker",
"and {C:attention}destroy{} leftmost Joker",
"Джокеров {C:attention}нельзя{} двигать",
"в начале раунда,",
"{C:attention}дублирует{} самого правого джокера",
"и {C:attention}уничтожает{} самого левого джокера",
},
},
b_cry_critical = {
name = "Критическая колода",
text = {
"После каждой сыгранной руки,",
"{C:green}#1# к 4{} шанс для {X:dark_edition,C:white} ^2 {} Множ",
"{C:green}#1# к 8{} шанс для {X:dark_edition,C:white} ^0.5 {} Множ",
"{C:green}#1# к #2#{} шанс для {X:dark_edition,C:white} ^2 {} Множ",
"{C:green}#1# к #3#{} шанс для {X:dark_edition,C:white} ^0.5 {} Множ",
},
},
b_cry_encoded = {
@ -108,7 +108,7 @@ return {
},
},
b_cry_glowing = {
name = "Glowing Deck",
name = "Светящаяся колода",
text = {
"Умножает значения всех",
"джокеров на {X:dark_edition,C:white} X1.25 {}",
@ -646,21 +646,21 @@ return {
j_cry_bonk = {
name = "Bonk",
text = {
"Each {C:attention}Joker{} gives {C:chips}+#1#{} Chips",
"Increase amount by {C:chips}+#2#{} if",
"{C:attention} poker hand{} is a {C:attention}#3#{}",
"{C:inactive,s:0.8}Jolly Jokers give{} {C:chips,s:0.8}+#4#{} {C:inactive,s:0.8}Chips instead{}",
"Каждый {C:attention}Джокер{} дает {C:chips}+#1#{} фишек",
"Увеличивает значение на {C:chips}+#2#{} если",
"{C:attention}покерная рука{} это {C:attention}#3#{}",
"{C:inactive,s:0.8}Веселые Джокеры вместо этого дают{} {C:chips,s:0.8}+#4#{} {C:inactive,s:0.8}фишек{}",
},
},
j_cry_bonusjoker = {
name = "Bonus Joker",
name = "Бонусный Джокер",
text = {
"{C:green}#1# in #2#{} chance for each",
"played {C:attention}Bonus{} card to increase",
"{C:attention}Joker{} or {C:attention}Consumable slots",
"by {C:dark_edition}1{} when scored",
"{C:red}Works twice per round",
"{C:inactive,s:0.8}(Equal chance for each){}",
"{C:green}#1# из #2#{} шанс что каждая",
"сыгранная {C:attention}Бонусная{} карта увеличит",
"{C:attention}слоты для {C:attention}джокеров{} или {C:attention}расходников",
"на {C:dark_edition}1{} когда засчитана",
"{C:red}Работает дважды за раунд",
"{C:inactive,s:0.8}(Равный шанс у каждой){}",
},
},
j_cry_booster = {
@ -754,11 +754,11 @@ return {
},
},
j_cry_coin = {
name = "Crypto Coin",
name = "Крипто Монета",
text = {
"Earn between",
"{C:money}$#1#{} and {C:money}$#2#{} for",
"each Joker {C:attention}sold{}",
"Получите между",
"{C:money}$#1#{} и {C:money}$#2#{} за",
"каждого {C:attention}проданного{} джокера",
},
},
j_cry_compound_interest = {
@ -771,62 +771,62 @@ return {
},
},
j_cry_copypaste = {
name = "Copy/Paste",
name = "Копировать/Вставить",
text = {
"When a {C:cry_code}Code{} card is used,",
"{C:green}#1# in #2#{} chance to add a copy",
"to your consumable area",
"{C:inactive}(Must have room)",
"Когда карта {C:cry_code}Кода{} использована,",
"{C:green}#1# из #2#{} шанс создает её копию",
"в вашей зоне расходуемых",
"{C:inactive}(Должно быть место)",
},
},
j_cry_crustulum = {
name = "Crustulum",
text = {
"This Joker gains {C:chips}+#2#{} Chips",
"per {C:attention}reroll{} in the shop",
"{C:green}All rerolls are free{}",
"{C:inactive}(Currently {C:chips}+#1#{C:inactive} chips)",
"Этот джокер дает {C:chips}+#2#{} фишек",
"за каждый {C:attention}переброс{} в лавке",
"{C:green}Все перебросы бесплатные{}",
"{C:inactive}(Сейчас {C:chips}+#1#{C:inactive} фишек)",
},
},
j_cry_cryptidmoment = {
name = "M Chain",
name = "Цепь М",
text = {
"Sell this card to",
"add {C:money}$#1#{} of {C:attention}sell value{}",
"to every {C:attention}Joker{} card",
"Продайте эту карту",
"чтобы добавить {C:money}$#1#{} {C:attention}к цене продажи{}",
"каждого {C:attention}джокера{}",
},
},
j_cry_cube = {
name = "Cube",
name = "Куб",
text = {
"{C:chips}+#1#{} Chips",
"{C:chips}+#1#{} фишек",
},
},
j_cry_curse_sob = {
name = "Sob",
text = {
"{C:edition,E:1}you cannot{} {C:cry_ascendant,E:1}run...{}",
"{C:edition,E:1}you cannot{} {C:cry_ascendant,E:1}hide...{}",
"{C:dark_edition,E:1}you cannot escape...{}",
"{C:inactive}(Must have room){}",
"{C:edition,E:1}ты не можешь{} {C:cry_ascendant,E:1}бежать...{}",
"{C:edition,E:1}ты не можешь{} {C:cry_ascendant,E:1}прятаться...{}",
"{C:dark_edition,E:1}ты не можешь...{}",
"{C:inactive}(Должно быть место){}",
},
},
j_cry_cursor = {
name = "Cursor",
name = "Курсор",
text = {
"This Joker gains {C:chips}+#2#{} Chips",
"for each card {C:attention}purchased{}",
"{C:inactive}(Currently {C:chips}+#1#{C:inactive} Chips)",
"Этот джокер дает {C:chips}+#2#{} фишек",
"за каждую {C:attention}купленную{} карта",
"{C:inactive}(Сейчас {C:chips}+#1#{C:inactive} фишек)",
},
},
j_cry_cut = {
name = "Cut",
name = "Разрез",
text = {
"This Joker destroys",
"a random {C:cry_code}Code{} card",
"and gains {X:mult,C:white} X#1# {} Mult",
"at the end of the {C:attention}shop{}",
"{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)",
"Этот джокер уничтожает",
"случайную карту {C:cry_code}Кода{}",
"и получает {X:mult,C:white} X#1# {} множ.",
"в конце {C:attention}магазина{}",
"{C:inactive}(Сейчас {X:mult,C:white} X#2# {C:inactive} множ.)",
},
},
j_cry_delirious = {
@ -939,10 +939,10 @@ return {
},
},
j_cry_exoplanet = {
name = "Exoplanet",
name = "Экзопланета",
text = {
"{C:dark_edition}Holographic{} cards",
"each give {C:mult}+#1#{} Mult",
"{C:dark_edition}Голографические{} карты",
"дают {C:mult}+#1#{} множ.",
},
},
j_cry_exponentia = {
@ -1027,7 +1027,7 @@ return {
},
},
j_cry_giggly = {
name = "Absurd Joker",
name = "Абсурдный джокер",
text = {
"{C:red}+#1#{} Mult if played",
"hand contains",
@ -1035,7 +1035,7 @@ return {
},
},
j_cry_goldjoker = {
name = "Gold Joker",
name = "Золотой джокер",
text = {
"Earn {C:money}#1#%{} of total",
"money at end of round",
@ -1062,7 +1062,7 @@ return {
},
},
j_cry_happyhouse = {
name = "Happy House",
name = "Счастливый дом",
text = {
"{X:dark_edition,C:white}^#1#{} Mult only after",
"playing {C:attention}114{} hands{}",
@ -1071,11 +1071,11 @@ return {
},
},
j_cry_home = {
name = "The Home",
name = "Дом",
text = {
"{X:mult,C:white} X#1# {} Mult if played",
"hand contains",
"a {C:attention}#2#",
"{X:mult,C:white} X#1# {} множ. если сыгранная",
"содержит",
"{C:attention}#2#",
},
},
j_cry_hunger = {
@ -1105,7 +1105,7 @@ return {
},
},
j_cry_jollysus = {
name = "Jolly Joker?",
name = "Веселый джокер?",
text = {
"Create a {C:dark_edition}Jolly{} Joker",
"when a Joker is {C:attention}sold{}",
@ -1115,20 +1115,20 @@ return {
},
},
j_cry_kidnap = {
name = "Kidnapping",
name = "Похищение",
text = {
"Earn {C:money}$#2#{} at end of round",
"Increase payout by {C:money}$#1#{}",
"when a {C:attention}Type Mult{} or",
"{C:attention}Type Chips{} Joker is sold",
"Получайте {C:money}$#2#{} в конце раунда",
"Выплата увеличивается на {C:money}$#1#{}",
"когда {C:attention}Тип множ.{} или",
"{C:attention}Тип фишек{} джокер продан",
},
},
j_cry_kooky = {
name = "Kooky Joker",
text = {
"{C:red}+#1#{} Mult if played",
"hand contains",
"a {C:attention}#2#",
"{C:red}+#1#{} множ. если сыгранная",
"рука содержит",
"{C:attention}#2#",
},
},
j_cry_krustytheclown = {
@ -1141,27 +1141,27 @@ return {
},
},
j_cry_kscope = {
name = "Kaleidoscope",
name = "Калейдоскоп",
text = {
"Add {C:dark_edition}Polychrome{} to",
"a random {C:attention}Joker{} when",
"{C:attention}Boss Blind{} is defeated",
"Добавляет {C:dark_edition}Полихром{} к",
"случайному {C:attention}джокеру{} когда",
"{C:attention}блайнд босс{} побежден",
},
},
j_cry_lightupthenight = {
name = "Light Up the Night",
text = {
"Each played {C:attention}7{} or {C:attention}2{}",
"gives {X:mult,C:white}X#1#{} Mult when scored",
"Каждая сыгранная {C:attention}7{} или {C:attention}2{}",
"дает {X:mult,C:white}X#1#{} множ. когда подсчитана",
},
},
j_cry_longboi = {
name = "Monster",
name = "Монстр",
text = {
"Give future copies of",
"this Joker {X:mult,C:white}X#1#{} Mult",
"at end of round",
"{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult){}",
"Дает будущим копиям",
"этого джокера {X:mult,C:white}X#1#{} множ.",
"в конце раунда",
"{C:inactive}(Сейчас {X:mult,C:white}X#2#{C:inactive} множ.){}",
},
},
j_cry_loopy = {
@ -1175,34 +1175,34 @@ return {
},
},
j_cry_lucky_joker = {
name = "Lucky Joker",
name = "Счастливый джокер",
text = {
"Earn {C:money}$#1#{} every time a",
"{C:attention}Lucky{} card {C:green}successfully{}",
"triggers",
"Получите {C:money}$#1#{} каждый раз когда",
"{C:attention}Счастливая{} карта {C:green}успешно{}",
"срабатывает",
},
},
j_cry_luigi = {
name = "Luigi",
name = "Луиджи",
text = {
"All Jokers give",
"{X:chips,C:white} X#1# {} Chips",
"Все джокеры дают",
"{X:chips,C:white} X#1# {} фишек",
},
},
j_cry_m = {
name = "m",
name = "м",
text = {
"This Joker gains {X:mult,C:white} X#1# {} Mult",
"when {C:attention}Jolly Joker{} is sold",
"{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)",
"Этот джокер получает {X:mult,C:white} X#1# {} множ.",
"когда {C:attention}Веселый Джокер{} продан",
"{C:inactive}(Сейчас {X:mult,C:white} X#2# {C:inactive} множ.)",
},
},
j_cry_M = {
name = "M",
name = "М",
text = {
"Create a {C:dark_edition}Negative{}",
"{C:attention}Jolly Joker{} when",
"{C:attention}Blind{} is selected",
"Создает {C:dark_edition}Негативного{}",
"{C:attention}Веселого Джокера{} при",
"выборе {C:attention}блайнда{}",
},
},
j_cry_macabre = {
@ -1216,11 +1216,11 @@ return {
},
},
j_cry_magnet = {
name = "Fridge Magnet",
name = "Магнит на холодильник",
text = {
"Earn {C:money}$#1#{} at end of round",
"This earns {X:money,C:white} X#2# {} if there are",
"{C:attention}#3#{} or fewer {C:attention}Joker{} cards",
"Получайте {C:money}$#1#{} в конце раунда",
"Дает {X:money,C:white} X#2# {} если",
"у вас {C:attention}#3#{} или меньше {C:attention}джокеров{}",
},
},
j_cry_manic = {
@ -1248,15 +1248,15 @@ return {
},
},
j_cry_maze = {
name = "Labyrinth",
name = "Лабиринт",
text = {
"All hands are considered the",
"{C:attention}first hand{} of each round,",
"all discards are considered the",
"{C:attention}first discard{} of each round",
"Все руки считаются",
"{C:attention}первыми руками{} каждого раунда,",
"все сбросы считаются",
"{C:attention}первыми сбросами{} каждого раунда",
},
},
j_cry_Megg = {
j_cry_megg = {
name = "Megg",
text = {
"Sell this card to create",
@ -1270,7 +1270,7 @@ return {
"{X:mult,C:white}X#1#{} Mult for each member",
"in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo = {
@ -1279,14 +1279,14 @@ return {
"{C:chips}+#1#{} Chips for each member",
"in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_meteor = {
name = "Meteor Shower",
name = "Метеоритный дождь",
text = {
"{C:dark_edition}Foil{} cards each",
"give {C:chips}+#1#{} Chips",
"{C:dark_edition}Фольговые{} карты",
"дают {C:chips}+#1#{} фишек",
},
},
j_cry_mneon = {
@ -1319,11 +1319,11 @@ return {
},
},
j_cry_morse = {
name = "Morse Code",
name = "Код Морзе",
text = {
"Earn {C:money}$#2#{} at end of round",
"Increase payout by {C:money}$#1#{} when",
"a card with an {C:attention}Edition{} is sold",
"Получите {C:money}$#2#{} в конце раунда",
"Выплата увеличивается на {C:money}$#1#{} когда",
"когда карта с {C:attention}Выпуском{} продана",
},
},
j_cry_mprime = {
@ -1356,9 +1356,9 @@ return {
},
},
j_cry_negative = {
name = "Negative Joker",
name = "Негативный джокер",
text = {
"{C:dark_edition}+#1#{C:attention} Joker{} slots",
"{C:dark_edition}+#1#{}слотов для {C:attention}джокеров{}",
},
},
j_cry_nice = {
@ -1370,12 +1370,12 @@ return {
},
},
j_cry_night = {
name = "Night",
name = "Ночь",
text = {
"{X:dark_edition,C:white}^#1#{} Mult on final",
"hand of round",
"{E:2,C:red}self destructs{} on",
"final hand of round",
"{X:dark_edition,C:white}^#1#{} множ. в последней",
"руке раунда",
"{E:2,C:red}самоуничтожается{} в",
"последней руке раунда",
},
},
j_cry_nosound = {
@ -1386,7 +1386,7 @@ return {
},
},
j_cry_notebook = {
name = "Notebook",
name = "Блокнот",
text = {
"{C:green} #1# in #2#{} chance to gain {C:dark_edition}+1{} Joker",
"slot per {C:attention}reroll{} in the shop",
@ -1422,13 +1422,13 @@ return {
},
},
j_cry_oldblueprint = {
name = "Old Blueprint",
name = "Старый чертеж",
text = {
"Copies ability of",
"{C:attention}Joker{} to the right",
"{C:green}#1# in #2#{} chance this",
"card is destroyed",
"at end of round",
"Копирует способность",
"{C:attention}джокера{} справа",
"{C:green}#1# из #2#{} шанс что",
"эта карта уничтожена",
"в конце раунда",
},
},
j_cry_oldcandy = {
@ -1450,22 +1450,22 @@ return {
},
},
j_cry_panopticon = {
name = "Panopticon",
name = "Паноптикум",
text = {
"All hands are considered the",
"{C:attention}last hand{} of each round", -- +$4
"Все руки считаются",
"{C:attention}последними руками{} каждого раунда", -- +$4
},
},
j_cry_pickle = {
name = "Pickle",
name = "Огурчик",
text = {
"When {C:attention}Blind{} is skipped, create",
"{C:attention}#1#{} Tags, reduced by",
"{C:red}#2#{} when {C:attention}Blind{} is selected",
"Когда {C:attention}блайнд{} пропущен, создает",
"{C:attention}#1#{} тегов, уменьшается на",
"{C:red}#2#{} когда {C:attention}блайнд{} выбран",
},
},
j_cry_pirate_dagger = {
name = "Pirate Dagger",
name = "Пиратский кинжал",
text = {
"When {C:attention}Blind{} is selected,",
"destroy Joker to the right",
@ -1475,11 +1475,11 @@ return {
},
},
j_cry_pot_of_jokes = {
name = "Pot of Jokes",
name = "Горшок шуток",
text = {
"{C:attention}#1#{} hand size,",
"increases by",
"{C:blue}#2#{} every round",
"{C:attention}#1#{} размер руки,",
"увеличивается на",
"{C:blue}#2#{} каждый раунд",
},
},
j_cry_primus = {
@ -1570,7 +1570,7 @@ return {
},
},
j_cry_sapling = {
name = "Sapling",
name = "Росток",
text = {
"After scoring {C:attention}#2#{} {C:inactive}[#1#]{} Enhanced",
"cards, sell this card to",
@ -1666,10 +1666,10 @@ return {
},
},
j_cry_stardust = {
name = "Stardust",
name = "Звездная пыль",
text = {
"{C:dark_edition}Polychrome{} cards",
"each give {X:mult,C:white}X#1#{} Mult",
"{C:dark_edition}Полихромные{} карты",
"дают {X:mult,C:white}X#1#{} множ.",
},
},
j_cry_stella_mortis = {
@ -1725,10 +1725,10 @@ return {
},
},
j_cry_tenebris = {
name = "Tenebris",
name = "Тенебрис",
text = {
"{C:dark_edition}+#1#{C:attention} Joker{} slots",
"Earn {C:money}$#2#{} at end of round",
"{C:dark_edition}+#1#{} слотов для {C:attention}джокеров{}",
"Получите {C:money}$#2#{} в конце раунда",
},
},
j_cry_translucent = {
@ -1882,18 +1882,18 @@ return {
},
},
c_cry_nstar = {
name = "Neutron Star",
name = "Нейтронная Звезда",
text = {
"Upgrade a random",
"poker hand by",
"{C:attention}1{} level for each",
"{C:attention}Neutron Star{} used",
"in this run",
"{C:inactive}(Currently{C:attention} #1#{C:inactive}){}",
"Улучшите случайную",
"покерную руку на",
"{C:attention}1{} уровень за каждую",
"{C:attention}Нейтронную Звезду{} использованную",
"в этом забеге",
"{C:inactive}(Сейчас{C:attention} #1#{C:inactive}){}",
},
},
c_cry_planetlua = {
name = "Planet.lua",
name = "Планета.lua",
text = {
"{C:green}#1# in #2#{} chance to",
"upgrade every",
@ -2007,11 +2007,11 @@ return {
},
},
c_cry_gateway = {
name = "Gateway",
name = "Врата",
text = {
"Create a random",
"{C:cry_exotic,E:1}Exotic{C:attention} Joker{}, destroy",
"all other Jokers",
"Создайте случайного",
"{C:cry_exotic,E:1}Экзотического{C:attention} джокера{}, уничтожьте",
"всех других джокеров",
},
},
c_cry_hammerspace = {
@ -2023,52 +2023,52 @@ return {
},
},
c_cry_lock = {
name = "Lock",
name = "Замок",
text = {
"Remove {C:red}all{} stickers",
"from {C:red}all{} Jokers,",
"then apply {C:purple,E:1}Eternal{}",
"to a random {C:attention}Joker{}",
"Уберите {C:red}все{} наклейки",
"со {C:red}всех{} джокеров,",
"затем добавьте {C:purple,E:1}Вечную наклейку{}",
"случайному {C:attention}джокеру{}",
},
},
c_cry_pointer = {
name = "POINTER://",
text = {
"Create a card",
"of {C:cry_code}your choice",
"{C:inactive,s:0.8}(Exotic Jokers #1#excluded)",
"Создает карту",
"{C:cry_code}вашего выбора",
"{C:inactive,s:0.8}(исключая Экзотических джокеров)",
},
},
c_cry_replica = {
name = "Replica",
text = {
"Convert all cards",
"held in hand",
"to a {C:attention}random{}",
"card held in hand",
"Конвертирует все",
"карты в руке",
"в {C:attention}случайную{}",
"карту в вашей руке",
},
},
c_cry_source = {
name = "Source",
name = "Исходник",
text = {
"Add a {C:cry_code}Green Seal{}",
"to {C:attention}#1#{} selected",
"card in your hand",
"Добавьте {C:cry_code}Зеленую печать{}",
"на {C:attention}#1#{} выбранную",
"карту в вашей руке",
},
},
c_cry_summoning = {
name = "Summoning",
name = "Призыв",
text = {
"Create a random",
"{C:cry_epic}Epic{} {C:joker}Joker{}, destroy",
"one random {C:joker}Joker{}",
"Создайте случайного",
"{C:cry_epic}Эпического{} {C:joker}джокера{}, уничтожьте",
"одного случайного {C:joker}джокера{}",
},
},
c_cry_trade = {
name = "Trade",
name = "Обмен",
text = {
"{C:attention}Lose{} a random Voucher,",
"gain {C:attention}2{} random Vouchers",
"{C:attention}Потеряйте{} случайный ваучер,",
"получите {C:attention}2{} случайных ваучера",
},
},
c_cry_typhoon = {
@ -2079,6 +2079,14 @@ return {
"card in your hand",
},
},
c_cry_meld = {
name = "Meld",
text = {
"Select a {C:attention}Joker{} or",
"{C:attention}playing card{} to",
"become {C:dark_edition}Double-Sided",
},
},
c_cry_vacuum = {
name = "Vacuum",
text = {
@ -2099,8 +2107,8 @@ return {
},
Stake = {
stake_cry_pink = {
name = "Pink Stake",
colour = "Pink", --this is used for auto-generated sticker localization
name = "Розовая ставка",
colour = "Розовая", --this is used for auto-generated sticker localization
text = {
"Required score scales",
"faster for each {C:attention}Ante",
@ -2108,15 +2116,15 @@ return {
},
stake_cry_brown = {
name = "Brown Stake",
colour = "Brown",
colour = "Коричневая",
text = {
"All {C:attention}stickers{} are compatible",
"with each other",
},
},
stake_cry_yellow = {
name = "Yellow Stake",
colour = "Yellow",
name = "Желтая ставка",
colour = "Желтая",
text = {
"{C:attention}Stickers{} can appear on",
"all purchasable items",
@ -2138,22 +2146,22 @@ return {
},
},
stake_cry_gray = {
name = "Gray Stake",
colour = "Gray",
name = "Серая ставка",
colour = "Серая",
text = {
"Rerolls increase by {C:attention}$2{} each",
},
},
stake_cry_crimson = {
name = "Crimson Stake",
colour = "Crimson",
name = "Багровая ставка",
colour = "Багровая",
text = {
"Vouchers restock on {C:attention}even{} Antes",
},
},
stake_cry_diamond = {
name = "Diamond Stake",
colour = "Diamond",
name = "Алмазная ставка",
colour = "Алмазная",
text = {
"Must beat Ante {C:attention}10{} to win",
},
@ -2511,14 +2519,6 @@ return {
"into an {C:attention}Echo Card",
},
},
c_cry_meld = {
name = "Meld",
text = {
"Select a {C:attention}Joker{} or",
"{C:attention}playing card{} to",
"become {C:dark_edition}Double-Sided",
},
},
c_cry_theblessing = {
name = "The Blessing",
text = {
@ -2750,6 +2750,15 @@ return {
},
},
Other = {
alt_wheel_of_fortune = {
name = "Колесо Фортуны",
text = {
"Шанс {C:green}#1# из #2#{} добавить",
"{C:dark_edition}фольговый{}, {C:dark_edition}голографический{} или",
"{C:dark_edition}полихромный{} выпуск",
"к случайному {C:attention}джокеру",
},
},
banana = {
name = "Banana",
text = {
@ -3061,7 +3070,7 @@ return {
cry_mus_high_score = "High Score (Final Boss [For Your Computer] by AlexZGreat)",
k_cry_program_pack = "Program Pack",
k_cry_meme_pack = "Meme Pack",
k_cry_meme_pack = "Мемный пак",
cry_critical_hit_ex = "Critical Hit!",
cry_critical_miss_ex = "Critical Miss!",
@ -3074,6 +3083,7 @@ return {
cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses",
k_code = "Code",
k_chips = "шт. фишек",
b_code_cards = "Code Cards",
b_pull = "PULL",
cry_hooked_ex = "Hooked!",
@ -3095,7 +3105,7 @@ return {
b_flip = "FLIP",
b_merge = "MERGE",
cry_again_q = "Again?",
cry_again_q = "Снова?",
cry_curse = "Curse",
cry_curse_ex = "Curse!",
cry_sobbing = "Help me...",
@ -3106,7 +3116,7 @@ return {
cry_m_minus = "m",
cry_m = "M",
cry_m_ex = "M!",
cry_minus_round = "-1 Round",
cry_minus_round = "-1 Раунд",
cry_plus_cryptid = "+1 Cryptid",
cry_no_triggers = "No triggers left!",
cry_unredeemed = "Unredeemed...",
@ -3285,22 +3295,22 @@ return {
{ "WHY DO THEY CALL IT VOUCHER", "WHEN MULT OUT THE HOT", "IN COLD EAT EAT THE CHIP" },
{ "SORRY", "THE VOUCHERS ARE EXPERIENCING", "VOUCHIFIA ABORTUS" },
{ "UNFORTUNATELY", "THE VOUCHRX REWRITE UPDATE", "HAS BEEN CANCELLED" },
{ "DEFEAT", "BOSS BLIND", "TO CHANGE NOTHING" },
{ "ПОБЕДИ", "БОСС БЛАЙНД ЧТОБЫ", "НИЧЕГО НЕ ИЗМЕНИТЬ" },
{ "BIRDS ARE SINGING", "FLOWERS ARE BLOOMING", "KIDS LIKE YOU..." },
{ "WE ARE SORRY TO SAY", "ALL VOUCHERS HAVE BEEN RECALLED", "DUE TO SALMONELLA EXPOSURE" },
{ "VOUCHERS COULDN'T ARRIVE", "DUE TO SHOP LAYOUT BEING", "200% OVERBUDGET" },
{ "YOU LIKE", "BUYING VOUCHERS, DON'T YOU", "YOU'RE A VOUCHERBUYER" },
{ "VOUCHERS", "!E", "VOUCHER POOL" },
{ "THERE", "IS NO", "VOUCHER" },
{ "ВАУЧЕРЫ", "НЕ", "РЕАЛЬНЫ" },
{ "THERE IS", "NO SANTA", "AND THERE ARE NO VOUCHERS" },
{ "", "VOUCHERN'T", "" },
{ "YOU", "JUST LOST", "THE GAME" },
{ "ТЫ", "ТОЛЬКО ЧТО", "ПРОИГРАЛ ИГРУ" },
{ "CAN I OFFER YOU", "A NICE EGG", "IN THESE TRYING TIMES?" },
{ "GO TOUCH GRASS", "INSTEAD OF USING", "THIS DECK" },
{ "YOU COULD BE", "PLAYING ON BLUE DECK", "RIGHT NOW" },
{ "FREE EXOTICS", "GET THEM BEFORE ITS", "TOO LATE (sold out)" },
{ "PROVE THEM WRONG", "BUY BUYING AN INVISIBLE", "VOUCHER FOR $10" },
{ "", "no vouchers?", "" },
{ "", "без ваучеров?", "" },
{ "see this ad?", "if you are, then it's working", "and you could have it for your own" },
{ "YOU'RE MISSING OUT ON", "AT LEAST 5 VOUCHERS RIGHT NOW", "tonktonktonktonktonk" },
{ "10", "20 NO VOUCHER XD", "30 GOTO 10" },
@ -3309,7 +3319,7 @@ return {
{ "ENJOYING YOUR", "VOUCHER EXPERIENCE? GIVE US A", "FIVE STAR RATING ON JESTELP" },
{ "FREE VOUCHERS", "HOT VOUCHERS NEAR YOU", "GET VOUCHERS QUICK WITH THIS ONE TRICK" },
{ "INTRODUCING", "THE VERY FIRST TIER 0 VOUCHER!", "(coming to Cryptid 1.0 soon)" },
{ "A VOUCHER!", "IT'S JUST IMAGINARY", "WE IMAGINED YOU WOULD WANT IT, THAT IS" },
{ "ВАУЧЕР!", "ОН ПРОСТО ВООБРАЖАЕМЫЙ", "WE IMAGINED YOU WOULD WANT IT, THAT IS" },
{ "TURN OFF ADBLOCKER", "WITHOUT ADS, WE WOULDN'T", "BE ABLE TO SELL YOU VOUCHERS" },
{ "IF YOU HAVE", "A PROBLEM WITH THIS", "EMAIL IT TO US AT NORESPONSE@JMAIL.COM" },
{ "NOT ENOUGH MONEY", "TO BUY THIS VOUCHER", "SO WHY WOULD WE PUT IT HERE?" },

View file

@ -0,0 +1,22 @@
"""
This Script searches for missing entries in a given localization lua-file,
comparing its contents to en-us.lua.
Author: Avery (@onichama)
"""
vars_en = []
vars_other = []
def read_vars_from_file(filename, into_list):
with open(filename) as file_en:
for line in file_en:
if " = {" in line and "text = {" not in line and "unlock = {" not in line:
into_list.append(line.split(" = {")[0].strip())
read_vars_from_file("../en-us.lua", vars_en) # Take EN-US as base language
read_vars_from_file("../de.lua", vars_other) # Change this to the language you want to compare to
for var in vars_en:
if var not in vars_other:
print(var)

View file

@ -0,0 +1,29 @@
"""
This Script searches for missing entries in a given localization lua-file,
comparing its contents to en-us.lua.
This version also gives the full "path" to a given entry, and can detect
stuff like missing unlock descriptors.
Author: Avery (@onichama)
"""
vars_en = []
vars_other = []
def read_vars_from_file(filename, into_list):
current_var_path = []
with open(filename) as file_en:
for line in file_en:
if " = {" in line:
current_var = line.split(" = {")[0].strip()
current_var_path.append(current_var)
into_list.append(".".join(current_var_path))
if ("},\n" in line or "}\n" in line) and len(current_var_path) > 0:
current_var_path.pop(len(current_var_path)-1)
read_vars_from_file("../en-us.lua", vars_en) # Take EN-US as base language
read_vars_from_file("../de.lua", vars_other) # Change this to the language you want to compare to
for var in vars_en:
if var not in vars_other:
print(var)

View file

@ -59,8 +59,8 @@ return {
name = "Bộ Bài Chí Mạng",
text = {
"Sau mỗi tay bài đã chơi,",
"Xác suất {C:green}#1# trên 4{} cho {X:dark_edition,C:white} ^2 {} Nhân",
"Xác suất {C:green}#1# trên 8{} cho {X:dark_edition,C:white} ^0.5 {} Nhân",
"Xác suất {C:green}#1# trên #2#{} cho {X:dark_edition,C:white} ^2 {} Nhân",
"Xác suất {C:green}#1# trên #3#{} cho {X:dark_edition,C:white} ^0.5 {} Nhân",
},
},
b_cry_e_deck = {
@ -181,7 +181,7 @@ return {
name = "Bộ Bài Huyền Thoại",
text = {
"Bắt đầu với một Joker {C:legendary}Huyền Thoại",
"Xác suất {C:green}1 trên 5{} tạo ra thêm một lá nữa",
"Xác suất {C:green}#1# trên #2#{} tạo ra thêm một lá nữa",
"khi Boss Blind bị đánh bại {C:inactive}(Phải có ô trống)",
},
},
@ -639,7 +639,7 @@ return {
set_cry_poker_hand_stuff = {
name = "Tay Poker",
text = {
"Thêm 4 {C:attention}tay poker mới",
"Thêm 5 {C:attention}tay poker mới",
"và cho phép {C:attention}tay Thăng Thiên",
},
},
@ -1775,7 +1775,7 @@ return {
"{C:attention}lượt bỏ đầu tiên{} của mỗi ván",
},
},
j_cry_Megg = {
j_cry_megg = {
name = "Mrứng",
text = {
"Bán lá này để tạo ra",
@ -1797,7 +1797,7 @@ return {
"{X:mult,C:white}X#1#{} Nhân cho mỗi thành viên",
"ở trong {C:attention}Cryptid Discord{}",
"{C:inactive}(Hiện tại là {X:mult,C:white}X#2#{C:inactive} Nhân)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_membershipcardtwo = {
@ -1806,7 +1806,7 @@ return {
"{C:chips}+#1#{} Chip cho mỗi thành viên",
"ở trong {C:attention}Cryptid Discord{}",
"{C:inactive}(Hiện tại là {C:chips}+#2#{C:inactive} Chip)",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
"{C:blue,s:0.7}https://discord.gg/eUf9Ur6RyB{}",
},
},
j_cry_meteor = {
@ -2912,6 +2912,14 @@ return {
"trên tay",
},
},
c_cry_meld = {
name = "Pha Trộn",
text = {
"Chọn một lá {C:attention}Joker{} hoặc",
"{C:attention}Lá bài thường{} để",
"trở thành {C:dark_edition}Hai Mặt",
},
},
c_cry_vacuum = {
name = "Chân Không",
text = {
@ -3352,14 +3360,6 @@ return {
"thành một {C:attention}Lá Vang Vọng",
},
},
c_cry_meld = {
name = "Pha Trộn",
text = {
"Chọn một lá {C:attention}Joker{} hoặc",
"{C:attention}Lá bài thường{} để",
"trở thành {C:dark_edition}Hai Mặt",
},
},
c_cry_theblessing = {
name = "Phước Lành",
text = {
@ -3655,6 +3655,15 @@ return {
},
},
Other = {
alt_wheel_of_fortune = {
name = "Bánh Xe Số Phận",
text = {
"Xác suất {C:green}#1# trên #2#{} để thêm",
"ấn bản {C:dark_edition}Ánh Kim{}, {C:dark_edition}Lấp Lánh",
"hoặc {C:dark_edition}Đa Sắc{} cho một {C:attention}Joker",
"ngẫu nhiên",
},
},
disabled = {
name = "Vô Hiệu",
text = {
@ -4274,6 +4283,7 @@ return {
cry_joke_placeholder = "(bội số của 8)",
k_code = "Code",
k_chips = "chip",
k_content_set = "Thiết Lập Chủ Đề",
b_content_sets = "Thiết Lập Chủ Đề",
--Why aren't these in vanilla?

Some files were not shown because too many files have changed in this diff Show more