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/* .vscode/*
.luarc.json .luarc.json
.lovelyignore .lovelyignore
.idea/*
*.diff

View file

@ -9,13 +9,16 @@
"priority": 114, "priority": 114,
"badge_colour": "708b91", "badge_colour": "708b91",
"badge_text_colour": "FFFFFF", "badge_text_colour": "FFFFFF",
"version": "0.5.5b", "version": "0.5.12a",
"dependencies": [ "dependencies": [
"Talisman (>=2.0.9)", "Talisman (>=2.2.0a)",
"Steamodded (>=1.0.0~BETA-0314c)" "Steamodded (>=1.0.0~BETA-0827)"
], ],
"conflicts": [ "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 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 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.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 -- Enable optional features
SMODS.current_mod.optional_features = { SMODS.current_mod.optional_features = {
retrigger_joker = true, retrigger_joker = true,
post_trigger = true, post_trigger = true,
quantum_enhancements = false,
-- Here are some other ones Steamodded has -- Here are some other ones Steamodded has
-- Cryptid doesn't use them YET, but these should be uncommented if Cryptid uses them -- 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 -- These ones add new card areas that Steamodded will calculate through
-- Might already be useful for sticker calc -- Might already be useful for sticker calc
-- Cryptid uses cardarea deck now
cardareas = { cardareas = {
--deck = true, deck = true,
discard = true, -- used by scorch discard = true, -- used by scorch
}, },
} }
@ -124,7 +128,7 @@ end
-- either in [Mod]/Cryptid.lua or [Mod]/Cryptid/*.lua -- either in [Mod]/Cryptid.lua or [Mod]/Cryptid/*.lua
for _, mod in pairs(SMODS.Mods) do for _, mod in pairs(SMODS.Mods) do
-- Note: Crashes with lone lua files -- 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 path = mod.path
local files = NFS.getDirectoryItems(path) local files = NFS.getDirectoryItems(path)
for _, file in ipairs(files) do for _, file in ipairs(files) do
@ -182,6 +186,74 @@ function SMODS.injectItems(...)
end end
end 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 end
local cryptidConfigTab = function() local cryptidConfigTab = function()

View file

@ -2,7 +2,7 @@
# Cryptid # Cryptid
An unbalanced Balatro mod. 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: Cryptid currently adds:
@ -11,7 +11,7 @@ Cryptid currently adds:
![image](https://github.com/user-attachments/assets/2441010d-1f0d-4b3f-80f7-de45e071ad06) ![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) ### [Mac Video Installation Guide](https://youtu.be/l5ni7fHgwTE?si=GAN5t5-y_IuEv8uA)
### [Not Mac Video Installation Guide](https://www.youtube.com/watch?v=aUr0gXE77rk) ### [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!* > *My game is crashing on startup/something doesn't appear to be loading!*
Make sure everything is properly installed. 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). 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. 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!* > *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?* > *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 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. If you're a streamer, consider disabling the Jimball music for your safety! 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?* > *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!* > *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 bool shadow;
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1; extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_1;
extern MY_HIGHP_OR_MEDIUMP vec4 burn_colour_2; 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) vec4 dissolve_mask(vec4 tex, vec2 texture_coords, vec2 uv)
{ {
@ -94,20 +97,144 @@ vec4 HSL(vec4 c)
return hsl; 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 effect( vec4 colour, Image texture, vec2 texture_coords, vec2 screen_coords )
{ {
vec4 tex = Texel(texture, texture_coords); vec4 tex = Texel(texture, texture_coords);
vec2 uv = (((texture_coords)*(image_details)) - texture_details.xy*texture_details.ba)/texture_details.ba; 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 low = min(tex.r, min(tex.g, tex.b));
number high = max(tex.r, max(tex.g, tex.b)); number high = max(tex.r, max(tex.g, tex.b));
number delta = high - low; 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 + time;
float t = astral.y*2.221 + mod(time,1.);
vec2 floored_uv = (floor((uv*texture_details.ba)))/texture_details.ba; vec2 floored_uv = (floor((uv*texture_details.ba)))/texture_details.ba;
vec2 uv_scaled_centered = (floored_uv - 0.5) * 50.; 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_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.; 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; vec4 pixel = Texel(texture, texture_coords);
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; 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; tex.rgb = RGB(hsl).rgb;
if (tex[3] < 0.7) vec2 mouse_offset = (screen_coords.xy - mouse_screen_pos.xy)/screen_scale;
tex[3] = tex[3]/3.;
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); 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 #ifdef VERTEX
vec4 position( mat4 transform_projection, vec4 vertex_position ) 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)) float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -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 #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)) float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -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 #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)) float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -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 #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)) float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -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 #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)) float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -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 #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)) float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -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 #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)) float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -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 #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)) float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -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 #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)) float scale = 0.2*(-0.03 - 0.3*max(0., 0.3-mid_dist))
*hovering*(length(mouse_offset)*length(mouse_offset))/(2. -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 #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 { return {
["Cryptid"] = { ["Cryptid"] = {
["jimball_music"] = true, ["jimball_music"] = true, -- plays funkytown when jimball
["code_music"] = true, ["code_music"] = true, -- plays code music when code pack
["exotic_music"] = true, ["exotic_music"] = true, -- plays exotic music when exotic joker
["big_music"] = true, ["big_music"] = true, -- plays music when sufficiently high score
["alt_bg_music"] = true, ["alt_bg_music"] = true, -- plays alternate title screen music based on gameset
}, },
["family_mode"] = false, ["family_mode"] = false, -- removes f*ck
["experimental"] = false, ["experimental"] = false, -- experimental stuff
["force_tooltips"] = true, ["force_tooltips"] = true, -- i don't actually know what this does
["HTTPS"] = true, ["HTTPS"] = true, -- your internet connection
["menu"] = true, ["menu"] = true, -- i don't know what this does either
} }

View file

@ -423,6 +423,38 @@ local pin = {
end end
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. -- TODO: Add new Achievements.
-- Current Ideas (Normal): -- Current Ideas (Normal):
@ -477,6 +509,7 @@ local achievement_objects = {
home_realtor, home_realtor,
traffic_jam, traffic_jam,
perfectly_balanced, perfectly_balanced,
technically_positive,
--pin, Needs to be screened --pin, Needs to be screened
} }
return { name = "Achievements", items = achievement_objects } return { name = "Achievements", items = achievement_objects }

View file

@ -11,6 +11,7 @@ local oldox = {
boss = { boss = {
min = 2, min = 2,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "nostalgia", atlas = "nostalgia",
order = 4, order = 4,
@ -36,6 +37,7 @@ local oldhouse = {
boss = { boss = {
min = 3, min = 3,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "nostalgia", atlas = "nostalgia",
order = 5, order = 5,
@ -64,6 +66,7 @@ local oldarm = {
boss = { boss = {
min = 3, min = 3,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "nostalgia", atlas = "nostalgia",
order = 6, order = 6,
@ -92,6 +95,7 @@ local oldfish = {
boss = { boss = {
min = 2, min = 2,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "nostalgia", atlas = "nostalgia",
order = 7, order = 7,
@ -117,6 +121,7 @@ local oldmanacle = {
boss = { boss = {
min = 1, min = 1,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "nostalgia", atlas = "nostalgia",
order = 8, order = 8,
@ -142,6 +147,7 @@ local oldserpent = {
boss = { boss = {
min = 5, min = 5,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "nostalgia", atlas = "nostalgia",
order = 9, order = 9,
@ -167,6 +173,7 @@ local oldpillar = {
boss = { boss = {
min = 3, min = 3,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "nostalgia", atlas = "nostalgia",
order = 10, order = 10,
@ -195,6 +202,7 @@ local oldflint = {
boss = { boss = {
min = 3, min = 3,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "nostalgia", atlas = "nostalgia",
order = 11, order = 11,
@ -223,6 +231,7 @@ local oldmark = {
boss = { boss = {
min = 4, min = 4,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "nostalgia", atlas = "nostalgia",
order = 12, order = 12,
@ -249,14 +258,15 @@ local tax = {
key = "tax", key = "tax",
pos = { x = 0, y = 0 }, pos = { x = 0, y = 0 },
boss = { boss = {
min = 1, min = 2,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 2, order = 2,
boss_colour = HEX("40ff40"), boss_colour = HEX("40ff40"),
loc_vars = function(self, info_queue, card) 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, end,
preview_ui = function(self) preview_ui = function(self)
local value = self:loc_vars().vars[1] local value = self:loc_vars().vars[1]
@ -283,8 +293,14 @@ local tax = {
collection_loc_vars = function(self) collection_loc_vars = function(self)
return { vars = { localize("cry_tax_placeholder") } } return { vars = { localize("cry_tax_placeholder") } }
end, end,
cry_cap_score = function(self, score) set_blind = function(self, reset, silent)
return math.floor(math.min(0.4 * G.GAME.blind.chips, score) + 0.5) 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, end,
in_pool = function() in_pool = function()
return G.GAME.round_resets.hands >= 3 return G.GAME.round_resets.hands >= 3
@ -303,6 +319,7 @@ local box = {
boss = { boss = {
min = 1, min = 1,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 13, order = 13,
@ -327,8 +344,9 @@ local clock = {
pos = { x = 0, y = 1 }, pos = { x = 0, y = 1 },
mult = 0, mult = 0,
boss = { boss = {
min = 1, min = 2,
max = 10, max = 10,
yes_orb = true,
}, },
config = { config = {
tw_bl = { tw_bl = {
@ -348,8 +366,10 @@ local clock = {
cry_ante_base_mod = function(self, dt) cry_ante_base_mod = function(self, dt)
if G.SETTINGS.paused then if G.SETTINGS.paused then
return 0 return 0
elseif G.GAME.round == 0 and G.GAME.skips == 0 then
return 0
else 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
end, end,
} }
@ -366,6 +386,7 @@ local trick = {
boss = { boss = {
min = 1, min = 1,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 14, order = 14,
@ -402,6 +423,7 @@ local joke = {
boss = { boss = {
min = 1, min = 1,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 15, order = 15,
@ -449,6 +471,7 @@ local hammer = {
boss = { boss = {
min = 2, min = 2,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 19, order = 19,
@ -457,6 +480,7 @@ local hammer = {
if card.area ~= G.jokers and not G.GAME.blind.disabled then if card.area ~= G.jokers and not G.GAME.blind.disabled then
if if
not SMODS.has_no_rank(card) not SMODS.has_no_rank(card)
and not SMODS.has_enhancement(card, "m_cry_abstract")
and ( and (
card.base.value == "3" card.base.value == "3"
or card.base.value == "5" or card.base.value == "5"
@ -484,6 +508,7 @@ local magic = {
boss = { boss = {
min = 2, min = 2,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 20, order = 20,
@ -492,6 +517,7 @@ local magic = {
if card.area ~= G.jokers and not G.GAME.blind.disabled then if card.area ~= G.jokers and not G.GAME.blind.disabled then
if if
not SMODS.has_no_rank(card) not SMODS.has_no_rank(card)
and not SMODS.has_enhancement(card, "m_cry_abstract")
and ( and (
card.base.value == "2" card.base.value == "2"
or card.base.value == "4" or card.base.value == "4"
@ -519,6 +545,7 @@ local windmill = {
boss = { boss = {
min = 4, min = 4,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 16, order = 16,
@ -543,6 +570,7 @@ local striker = {
boss = { boss = {
min = 4, min = 4,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 1, order = 1,
@ -567,6 +595,7 @@ local shackle = {
boss = { boss = {
min = 1, min = 1,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 18, order = 18,
@ -601,6 +630,7 @@ local pin = {
boss = { boss = {
min = 4, min = 4,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 17, order = 17,
@ -617,10 +647,10 @@ local pin = {
(card.area == G.jokers) (card.area == G.jokers)
and not G.GAME.blind.disabled and not G.GAME.blind.disabled
and ( and (
card.config.center.rarity ~= 3 card.config.center.rarity == 4
and card.config.center.rarity ~= 2 or card.config.center.rarity == "cry_epic"
and card.config.center.rarity ~= 1 or card.config.center.rarity == "cry_exotic"
and card.config.center.rarity ~= 5 or Cryptid.pin_debuff[card.config.center.rarity]
) )
then then
return true return true
@ -640,10 +670,11 @@ local scorch = {
object_type = "Blind", object_type = "Blind",
name = "cry-scorch", name = "cry-scorch",
key = "scorch", key = "scorch",
pos = { x = 0, y = 18 }, -- use Trick as placeholder icon pos = { x = 0, y = 18 },
boss = { boss = {
min = 1, min = 1,
max = 10, max = 10,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 21, order = 21,
@ -659,11 +690,11 @@ local scorch = {
and (context.cardarea == G.play or context.cardarea == "unscored") and (context.cardarea == G.play or context.cardarea == "unscored")
and not G.GAME.blind.disabled and not G.GAME.blind.disabled
then then
return { remove = not context.destroy_card.ability.eternal } return { remove = not SMODS.is_eternal(context.destroying_card) }
end end
if context.discard and not G.GAME.blind.disabled then if context.discard and not G.GAME.blind.disabled then
for i, card in ipairs(G.hand.highlighted) do 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 end
end, end,
@ -675,6 +706,285 @@ local scorch = {
end end
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 --It seems Showdown blind order is seperate from normal blind collection order? convenient for me at least
--Nvm they changed it --Nvm they changed it
local lavender_loop = { local lavender_loop = {
@ -694,6 +1004,7 @@ local lavender_loop = {
min = 3, min = 3,
max = 10, max = 10,
showdown = true, showdown = true,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 91, order = 91,
@ -708,22 +1019,20 @@ local lavender_loop = {
G.GAME.cry_ach_conditions.patience_virtue_earnable = nil G.GAME.cry_ach_conditions.patience_virtue_earnable = nil
end, end,
cry_round_base_mod = function(self, dt) cry_round_base_mod = function(self, dt)
local aaa = 4 * (G.GAME.modifiers.cry_rush_hour_iii or 1)
if if
G.GAME.cry_ach_conditions.patience_virtue_timer > 0 G.GAME.cry_ach_conditions.patience_virtue_timer > 0
and G.GAME.cry_ach_conditions.patience_virtue_earnable ~= true and G.GAME.cry_ach_conditions.patience_virtue_earnable ~= true
then then
G.GAME.cry_ach_conditions.patience_virtue_timer = G.GAME.cry_ach_conditions.patience_virtue_timer G.GAME.cry_ach_conditions.patience_virtue_timer = G.GAME.cry_ach_conditions.patience_virtue_timer
- dt - dt * (G.SETTINGS.paused and 0 or 1) * G.SETTINGS.GAMESPEED
* (G.GAME.modifiers.cry_rush_hour_iii and 0.5 or 1)
* (G.SETTINGS.paused and 0 or 1)
* G.SETTINGS.GAMESPEED
elseif G.GAME.current_round.hands_played == 0 then elseif G.GAME.current_round.hands_played == 0 then
G.GAME.cry_ach_conditions.patience_virtue_earnable = true G.GAME.cry_ach_conditions.patience_virtue_earnable = true
end end
if G.SETTINGS.paused or G.STATE == G.STATES.HAND_PLAYED then if G.SETTINGS.paused or G.STATE == G.STATES.HAND_PLAYED then
return 1 return 1
else 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
end, end,
} }
@ -748,7 +1057,7 @@ local tornado = {
order = 94, order = 94,
boss_colour = HEX("3dd9ca"), boss_colour = HEX("3dd9ca"),
loc_vars = function(self) 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, end,
set_blind = function(self, reset, silent) set_blind = function(self, reset, silent)
if not reset then if not reset then
@ -759,12 +1068,12 @@ local tornado = {
return #Cryptid.advanced_find_joker("Oops! All 6s", nil, nil, { "eternal" }, nil) == 0 return #Cryptid.advanced_find_joker("Oops! All 6s", nil, nil, { "eternal" }, nil) == 0
end, end,
collection_loc_vars = function(self) 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, end,
debuff_hand = function(self, cards, hand, handname, check) debuff_hand = function(self, cards, hand, handname, check)
if if
not check 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 and not G.GAME.blind.disabled
then then
--check for guarantee --check for guarantee
@ -797,26 +1106,33 @@ local vermillion_virus = {
min = 3, min = 3,
max = 10, max = 10,
showdown = true, showdown = true,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 90, order = 90,
boss_colour = HEX("f65d34"), boss_colour = HEX("f65d34"),
cry_before_play = function(self) cry_before_play = function(self)
if G.jokers.cards[1] then local eligible_cards = {}
local idx = pseudorandom(pseudoseed("cry_vermillion_virus"), 1, #G.jokers.cards) local idx
if G.jokers.cards[idx] then --Check for eligible cards (not eternal and not immune)
if G.jokers.cards[idx].config.center.immune_to_vermillion then for i = 1, #G.jokers.cards do
card_eval_status_text( if not G.jokers.cards[i].config.center.immune_to_vermillion and not SMODS.is_eternal(G.jokers.cards[i]) then
G.jokers.cards[idx], eligible_cards[#eligible_cards + 1] = G.jokers.cards[i]
"extra", end
nil, end
nil, if #eligible_cards ~= 0 then
nil, --Choose 1 eligible card and get the position of it
{ message = localize("k_nope_ex"), colour = G.C.JOKER_GREY } local option = pseudorandom_element(eligible_cards, pseudoseed("cry_vermillion_virus"))
) for i = 1, #G.jokers.cards do
else 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") _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:add_to_deck()
_card:start_materialize() _card:start_materialize()
G.jokers.cards[idx] = _card G.jokers.cards[idx] = _card
@ -825,7 +1141,6 @@ local vermillion_virus = {
G.jokers:align_cards() G.jokers:align_cards()
end end
end end
end
end, end,
} }
local sapphire_stamp = { local sapphire_stamp = {
@ -843,18 +1158,22 @@ local sapphire_stamp = {
min = 3, min = 3,
max = 10, max = 10,
showdown = true, showdown = true,
yes_orb = true,
}, },
atlas = "blinds", atlas = "blinds",
order = 92, order = 92,
boss_colour = HEX("4057d6"), boss_colour = HEX("4057d6"),
cry_before_play = function(self) cry_before_play = function(self)
if #G.hand.highlighted > 0 then
local idx = pseudorandom(pseudoseed("cry_sapphire_stamp"), 1, #G.hand.highlighted) local idx = pseudorandom(pseudoseed("cry_sapphire_stamp"), 1, #G.hand.highlighted)
G.hand:remove_from_highlighted(G.hand.highlighted[idx]) G.hand:remove_from_highlighted(G.hand.highlighted[idx])
end
end, end,
set_blind = function(self, reset, silent) set_blind = function(self, reset, silent)
if not reset then if not reset then
G.GAME.stamp_mod = true 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
end, end,
defeat = function(self, silent) defeat = function(self, silent)
@ -862,7 +1181,8 @@ local sapphire_stamp = {
G.GAME.stamp_mod = nil G.GAME.stamp_mod = nil
end end
if not G.GAME.blind.disabled then 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
end, end,
disable = function(self, silent) disable = function(self, silent)
@ -870,7 +1190,8 @@ local sapphire_stamp = {
G.GAME.stamp_mod = nil G.GAME.stamp_mod = nil
end end
if not G.GAME.blind.disabled then 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
end, end,
} }
@ -1233,7 +1554,7 @@ local obsidian_orb = {
if area == G.hand then if area == G.hand then
if if
s.name == "The Wheel" s.name == "The Wheel"
and pseudorandom(pseudoseed("ObsidianOrb")) < G.GAME.probabilities.normal / 7 and SMODS.pseudorandom_probability(self, "ObsidianOrb", 1, 7, "Obsidian Orb")
then then
return true return true
end end
@ -1348,6 +1669,21 @@ local obsidian_orb = {
end end
end 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) get_loc_debuff_text = function(self)
if not G.GAME.blind.debuff_boss then if not G.GAME.blind.debuff_boss then
return localize("cry_debuff_obsidian_orb") return localize("cry_debuff_obsidian_orb")
@ -1406,6 +1742,7 @@ local trophy = {
end end
end, end,
} }
local items_togo = { local items_togo = {
oldox, oldox,
oldhouse, oldhouse,
@ -1427,6 +1764,8 @@ local items_togo = {
shackle, shackle,
pin, pin,
scorch, scorch,
greed,
repulsor,
vermillion_virus, vermillion_virus,
tornado, tornado,
sapphire_stamp, sapphire_stamp,
@ -1434,5 +1773,8 @@ local items_togo = {
clock, clock,
lavender_loop, lavender_loop,
trophy, trophy,
decision,
chromatic,
landlord,
} }
return { name = "Blinds", items = items_togo } return { name = "Blinds", items = items_togo }

View file

@ -51,7 +51,9 @@ local ballin = {
key = "ballin", key = "ballin",
order = 1, order = 1,
rules = { rules = {
custom = {}, custom = {
{ id = "cry_force_enhancement", value = "m_stone" },
},
modifiers = { modifiers = {
{ id = "joker_slots", value = 3 }, { id = "joker_slots", value = 3 },
}, },
@ -66,20 +68,6 @@ local ballin = {
restrictions = { restrictions = {
banned_cards = { banned_cards = {
{ id = "j_vampire" }, { 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 = {}, banned_other = {},
}, },
@ -128,10 +116,6 @@ local rush_hour_ii = {
{ id = "j_diet_cola" }, { id = "j_diet_cola" },
{ id = "v_directors_cut" }, { id = "v_directors_cut" },
{ id = "v_retcon" }, { id = "v_retcon" },
{ id = "j_cry_pickle" },
{ id = "v_cry_copies" },
{ id = "v_cry_tag_printer" },
{ id = "v_cry_clone_machine" },
}, },
banned_other = {}, banned_other = {},
}, },
@ -145,7 +129,7 @@ local rush_hour_iii = {
custom = { custom = {
{ id = "cry_rush_hour" }, { id = "cry_rush_hour" },
{ id = "cry_rush_hour_ii" }, { id = "cry_rush_hour_ii" },
{ id = "cry_rush_hour_iii" }, { id = "cry_rush_hour_iii", value = 2 },
{ id = "cry_no_tags" }, { id = "cry_no_tags" },
}, },
modifiers = {}, modifiers = {},
@ -222,10 +206,6 @@ local rush_hour_iii = {
{ id = "j_diet_cola" }, { id = "j_diet_cola" },
{ id = "v_directors_cut" }, { id = "v_directors_cut" },
{ id = "v_retcon" }, { id = "v_retcon" },
{ id = "j_cry_pickle" },
{ id = "v_cry_copies" },
{ id = "v_cry_tag_printer" },
{ id = "v_cry_clone_machine" },
}, },
banned_other = {}, banned_other = {},
}, },
@ -506,61 +486,18 @@ function Game:start_run(args)
if G.GAME.modifiers.cry_no_consumables then if G.GAME.modifiers.cry_no_consumables then
G.GAME.joker_rate = 1e300 G.GAME.joker_rate = 1e300
end end
for i, v in pairs(G.handlist) do
if v == "cry_Declare0" then
d0 = true
end 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
--end of banned cards 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
local challenges = { local challenges = {
sticker_sheet, sticker_sheet,
sticker_sheet_plus, sticker_sheet_plus,

File diff suppressed because it is too large Load diff

View file

@ -55,34 +55,6 @@ local equilibrium = {
apply = function(self) apply = function(self)
G.GAME.modifiers.cry_equilibrium = true G.GAME.modifiers.cry_equilibrium = true
end, 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, unlocked = false,
check_for_unlock = function(self, args) check_for_unlock = function(self, args)
if Cryptid.safe_get(G, "jokers") then if Cryptid.safe_get(G, "jokers") then
@ -147,13 +119,22 @@ local infinite = {
name = "cry-Infinite", name = "cry-Infinite",
key = "infinite", key = "infinite",
order = 2, order = 2,
config = { cry_highlight_limit = 1e20, hand_size = 1 }, config = { hand_size = 1 },
pos = { x = 3, y = 0 }, pos = { x = 3, y = 0 },
atlas = "atlasdeck", atlas = "atlasdeck",
apply = function(self)
G.GAME.modifiers.cry_highlight_limit = self.config.cry_highlight_limit
end,
unlocked = false, 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) check_for_unlock = function(self, args)
if args.type == "hand_contents" then if args.type == "hand_contents" then
if #args.cards >= 6 then if #args.cards >= 6 then
@ -377,17 +358,26 @@ local legendary = {
}, },
name = "cry-Legendary", name = "cry-Legendary",
key = "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 }, pos = { x = 0, y = 6 },
atlas = "atlasdeck", atlas = "atlasdeck",
order = 15, 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) calculate = function(self, back, context)
if context.context == "eval" and Cryptid.safe_get(G.GAME, "last_blind", "boss") then if context.context == "eval" and Cryptid.safe_get(G.GAME, "last_blind", "boss") then
if G.jokers then if G.jokers then
if #G.jokers.cards < G.jokers.config.card_limit then if #G.jokers.cards < G.jokers.config.card_limit then
local legendary_poll = pseudorandom(pseudoseed("cry_legendary")) if
legendary_poll = legendary_poll / (G.GAME.probabilities.normal or 1) SMODS.pseudorandom_probability(
if legendary_poll < self.config.cry_legendary_rate then self,
"cry_legendary",
1,
self.config.cry_legendary_rate,
"Legendary Deck"
)
then
local card = create_card("Joker", G.jokers, true, 4, nil, nil, nil, "") local card = create_card("Joker", G.jokers, true, 4, nil, nil, nil, "")
card:add_to_deck() card:add_to_deck()
card:start_materialize() card:start_materialize()
@ -460,18 +450,21 @@ local critical = {
name = "cry-Critical", name = "cry-Critical",
key = "critical", key = "critical",
order = 10, 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 }, pos = { x = 4, y = 5 },
atlas = "atlasdeck", atlas = "atlasdeck",
loc_vars = function(self, info_queue, center) 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, end,
calculate = function(self, card, context) calculate = function(self, card, context)
if context.final_scoring_step then 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 check
local crit_poll = pseudorandom(pseudoseed("cry_critical")) if aaa then
crit_poll = crit_poll / (G.GAME.probabilities.normal or 1)
if crit_poll < self.config.cry_crit_rate then
check = 2 check = 2
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
@ -487,7 +480,7 @@ local critical = {
return true return true
end, end,
})) }))
elseif crit_poll < self.config.cry_crit_rate + self.config.cry_crit_miss_rate then elseif bbb then
check = 0.5 check = 0.5
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
@ -552,9 +545,7 @@ local glowing = {
if context.context == "eval" and Cryptid.safe_get(G.GAME, "last_blind", "boss") then if context.context == "eval" and Cryptid.safe_get(G.GAME, "last_blind", "boss") then
for i = 1, #G.jokers.cards do for i = 1, #G.jokers.cards do
if not Card.no(G.jokers.cards[i], "immutable", true) then if not Card.no(G.jokers.cards[i], "immutable", true) then
Cryptid.with_deck_effects(G.jokers.cards[i], function(card) Cryptid.manipulate(G.jokers.cards[i], { value = 1.25 })
Cryptid.misprintize(card, { min = 1.25, max = 1.25 }, nil, true)
end)
end end
end end
end end
@ -697,8 +688,8 @@ local antimatter = {
key = "antimatter", key = "antimatter",
config = { config = {
cry_antimatter = true, cry_antimatter = true,
cry_crit_rate = 0.25, --Critical Deck cry_crit_rate = 4, --Critical Deck
cry_legendary_rate = 0.2, --Legendary Deck cry_legendary_rate = 5, --Legendary Deck
-- Enhanced Decks -- Enhanced Decks
cry_force_enhancement = "random", cry_force_enhancement = "random",
cry_force_edition = "random", cry_force_edition = "random",
@ -882,7 +873,16 @@ local antimatter = {
~= 0 ~= 0
or skip or skip
then 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 G.GAME.starting_params.hand_size = G.GAME.starting_params.hand_size + 1
end end
-- Wormhole deck -- Wormhole deck
@ -986,8 +986,6 @@ local antimatter = {
function Cryptid.antimatter_trigger_final_scoring(self, context, skip) function Cryptid.antimatter_trigger_final_scoring(self, context, skip)
if context.context == "final_scoring_step" then 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 --Critical Deck
if if
( (
@ -997,7 +995,15 @@ local antimatter = {
~= 0 ~= 0
or skip or skip
then 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 context.mult = context.mult ^ 2
update_hand_text({ delay = 0 }, { mult = context.mult, chips = context.chips }) update_hand_text({ delay = 0 }, { mult = context.mult, chips = context.chips })
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
@ -1090,9 +1096,7 @@ local antimatter = {
or skip or skip
then then
for i = 1, #G.jokers.cards do for i = 1, #G.jokers.cards do
Cryptid.with_deck_effects(G.jokers.cards[i], function(card) Cryptid.manipulate(G.jokers.cards[i], { value = 1.25 })
Cryptid.misprintize(card, { min = 1.25, max = 1.25 }, nil, true)
end)
end end
end end
--Legendary Deck --Legendary Deck
@ -1112,9 +1116,15 @@ local antimatter = {
or skip or skip
then then
if #G.jokers.cards < G.jokers.config.card_limit then if #G.jokers.cards < G.jokers.config.card_limit then
local legendary_poll = pseudorandom(pseudoseed("cry_legendary")) if
legendary_poll = legendary_poll / (G.GAME.probabilities.normal or 1) SMODS.pseudorandom_probability(
if legendary_poll < self.config.cry_legendary_rate then self,
"cry_legendary",
1,
self.config.cry_legendary_rate,
"Antimatter Deck"
)
then
local card = create_card("Joker", G.jokers, true, 4, nil, nil, nil, "") local card = create_card("Joker", G.jokers, true, 4, nil, nil, nil, "")
card:add_to_deck() card:add_to_deck()
card:start_materialize() card:start_materialize()
@ -1234,7 +1244,7 @@ local antimatter = {
unlocked = false, unlocked = false,
check_for_unlock = function(self, args) check_for_unlock = function(self, args)
if args.type == "win_deck" then 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) unlock_card(self)
end end
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 = { local atlasedition = {
object_type = "Atlas", object_type = "Atlas",
key = "atlaseditiondeck", key = "atlaseditiondeck",
@ -78,7 +76,7 @@ Cryptid.edeck_atlas_update = function(self)
if not sprite then if not sprite then
error(self.edeck_type) error(self.edeck_type)
end 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 sprite = sprite[enh_info[sprite.order]] or sprite.default
self.atlas, self.pos = sprite.atlas, sprite.pos self.atlas, self.pos = sprite.atlas, sprite.pos
return sprite return sprite
@ -96,13 +94,13 @@ local e_deck = {
order = 17, order = 17,
pos = { x = 5, y = 2 }, pos = { x = 5, y = 2 },
loc_vars = function(self, info_queue, center) 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 }) } } return { vars = { localize({ type = "name_text", set = "Edition", key = "e_" .. aaa }) } }
end, end,
edeck_type = "edition", edeck_type = "edition",
config = { cry_no_edition_price = true }, config = { cry_no_edition_price = true },
apply = function(self) apply = function(self)
local aaa = Cryptid.enhanced_deck_info(self) local aaa = Cryptid.enhanced_deck_info({})
G.GAME.modifiers.cry_force_edition = aaa G.GAME.modifiers.cry_force_edition = aaa
--Ban Edition tags (They will never redeem) --Ban Edition tags (They will never redeem)
for k, v in pairs(G.P_TAGS) do for k, v in pairs(G.P_TAGS) do
@ -327,20 +325,7 @@ return {
init = function() init = function()
local sa = Card.set_ability local sa = Card.set_ability
function Card:set_ability(center, y, z) function Card:set_ability(center, y, z)
--adding immutable to cards because if not G.SETTINGS.paused and Cryptid.safe_get(center, "name") == "Default Base" then -- scuffed
-- 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
return sa( return sa(
self, self,
(not self.no_forced_enhancement and G.GAME.modifiers.cry_force_enhancement) (not self.no_forced_enhancement and G.GAME.modifiers.cry_force_enhancement)
@ -355,7 +340,7 @@ return {
end end
local se = Card.set_edition local se = Card.set_edition
function Card:set_edition(edition, y, z, force) function Card:set_edition(edition, y, z, force)
if not force then if not force and not G.SETTINGS.paused then
return se( return se(
self, self,
(not self.no_forced_edition and G.GAME.modifiers.cry_force_edition) (not self.no_forced_edition and G.GAME.modifiers.cry_force_edition)
@ -369,11 +354,19 @@ return {
end end
local ss = Card.set_seal local ss = Card.set_seal
function Card:set_seal(seal, y, z) 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 end
local cs = Card.change_suit local cs = Card.change_suit
function Card:change_suit(new_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 end
local ccl = Card.click local ccl = Card.click
function 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)) and (Cryptid.safe_get(G.GAME, "viewed_back", "effect", "center", "edeck_type") and (self.back == "viewed_back" or self.edeck_select))
then then
if not G.cry_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_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 else
if self.edeck_select then if self.edeck_select then
G.PROFILES[G.SETTINGS.profile]["cry_edeck_" .. self.config.center.edeck_type] = 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"), definition = G.UIDEF.run_setup("main_menu_play"),
}) })
G.cry_edeck_select = nil G.cry_edeck_select = nil
G.cry_edeck_center = nil
end end
end 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 if not center.edeck_type then
return return
end end
@ -434,18 +430,30 @@ return {
seal = G.P_SEALS, seal = G.P_SEALS,
} }
local editions = {} 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 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
end end
local page = (actual_page and actual_page * count_per_page or count_per_page) - (count_per_page - 1)
for i = 1, #editions do 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) 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) Cryptid.edeck_atlas_update(_center)
local card = Cryptid.generic_card(_center) local card = Cryptid.generic_card(_center)
card.edeck_select = editions[i] card.edeck_select = editions[i].center
G.your_collection[1]:emplace(card) G.your_collection[1]:emplace(card)
end 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 }, config = { align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05 },
nodes = { deck_tables }, 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({ G.FUNCS.overlay_menu({
definition = t, definition = t,
}) })
end end
G.FUNCS.edeck_page = function(args)
Cryptid.enhancement_config_UI(G.cry_edeck_center, args.cycle_config.current_option)
end
end, end,
items = { e_deck, et_deck, sk_deck, st_deck, sl_deck, atlasedition }, 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 --Penetrating Joker
--Treacherous Joker --Treacherous Joker
--[[
if JokerDisplay then 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) --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" }, { ref_table = "card.joker_display_values", ref_value = "localized_text" },
}, },
calc_function = function(card) 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 = "(" 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, end,
} }
@ -2041,4 +2042,6 @@ if JokerDisplay then
--end of Jokerdisplays --end of Jokerdisplays
end end
]]
--
return { name = "JokerDisplay" } 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", atlas = "stake",
applied_stakes = { "cry_diamond" }, applied_stakes = { "cry_diamond" },
modifiers = function() modifiers = function()
G.GAME.modifiers.cry_booster_packs = 1 G.GAME.modifiers.extra_boosters = -1
end, end,
shiny = true, shiny = true,
order = 17, order = 17,
@ -352,10 +352,7 @@ return {
-- Disallow use of Debuffed Perishable consumables -- Disallow use of Debuffed Perishable consumables
local cuc = Card.can_use_consumeable local cuc = Card.can_use_consumeable
function Card:can_use_consumeable(any_state, skip_check) function Card:can_use_consumeable(any_state, skip_check)
if self.ability.perish_tally == nil then if self.debuff then
self.ability.perish_tally = G.GAME.perishable_rounds or 5
end
if self.ability.perishable and self.ability.perish_tally <= 0 then
return false return false
end end
return cuc(self, any_state, skip_check) return cuc(self, any_state, skip_check)
@ -366,7 +363,7 @@ return {
local temp_hand = {} local temp_hand = {}
local hasHand = false local hasHand = false
for k, v in ipairs(G.hand.cards) do 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 temp_hand[#temp_hand + 1] = v
hasHand = true hasHand = true
end end

View file

@ -225,6 +225,9 @@ local empoweredPack = {
G.consumeables:emplace(ccard) G.consumeables:emplace(ccard)
end, end,
}, },
in_pool = function()
return false
end,
} }
local empowered = { local empowered = {
cry_credits = { cry_credits = {
@ -325,11 +328,11 @@ local gambler = {
key = "gambler", key = "gambler",
loc_vars = function(self, info_queue) loc_vars = function(self, info_queue)
info_queue[#info_queue + 1] = { set = "Tag", key = "tag_cry_empowered" } 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, end,
apply = function(self, tag, context) apply = function(self, tag, context)
if context.type == "new_blind_choice" then 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 local lock = tag.ID
G.CONTROLLER.locks[lock] = true G.CONTROLLER.locks[lock] = true
tag:yep("+", G.C.SECONDARY_SET.Spectral, function() tag:yep("+", G.C.SECONDARY_SET.Spectral, function()
@ -1036,22 +1039,14 @@ local banana = {
set = "Joker", set = "Joker",
key = G.P_CENTER_POOLS["Joker"][61].key, key = G.P_CENTER_POOLS["Joker"][61].key,
}) })
info_queue[#info_queue + 1] = { info_queue[#info_queue + 1] = G.P_CENTERS.j_cavendish
set = "Joker",
key = "j_cavendish",
specific_vars = { 3, G.GAME.probabilities.normal or 1, 1000 },
}
else else
banana = localize({ banana = localize({
type = "name_text", type = "name_text",
set = "Joker", set = "Joker",
key = G.P_CENTER_POOLS["Joker"][38].key, key = G.P_CENTER_POOLS["Joker"][38].key,
}) })
info_queue[#info_queue + 1] = { info_queue[#info_queue + 1] = G.P_CENTERS.j_gros_michel
set = "Joker",
key = "j_gros_michel",
specific_vars = { 15, G.GAME.probabilities.normal or 1, 6 },
}
end end
return { vars = { banana } } return { vars = { banana } }
end, end,
@ -1328,7 +1323,7 @@ local better_voucher = {
G.P_CENTERS[voucher_key], G.P_CENTERS[voucher_key],
{ bypass_discovery_center = true, bypass_discovery_ui = true } { bypass_discovery_center = true, bypass_discovery_ui = true }
) )
Cryptid.misprintize(card) Cryptid.manipulate(card)
create_shop_card_ui(card, "Voucher", G.shop_vouchers) create_shop_card_ui(card, "Voucher", G.shop_vouchers)
card:start_materialize() card:start_materialize()
if G.GAME.modifiers.cry_force_edition and not G.GAME.modifiers.cry_force_random_edition then 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 local lock = tag.ID
G.CONTROLLER.locks[lock] = true G.CONTROLLER.locks[lock] = true
tag:yep("+", G.C.BLUE, function() 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 G.CONTROLLER.locks[lock] = nil
return true return true
end) end)
@ -1413,6 +1408,244 @@ local booster = {
end end
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 = { local tagitems = {
cat, cat,
empoweredPack, empoweredPack,
@ -1436,6 +1669,9 @@ local tagitems = {
blur_tag, blur_tag,
astral_tag, astral_tag,
loss, loss,
clone,
lens,
palette_cleanser,
m_tag, m_tag,
double_m_tag, double_m_tag,
} }

View file

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

View file

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

View file

@ -32,9 +32,15 @@ function G.FUNCS.get_poker_hand_info(_cards)
loc_disp_text = localize(disp_text, "poker_hands") loc_disp_text = localize(disp_text, "poker_hands")
end end
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 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 rank_array = {}
local county = 0 local county = 0
for i = 1, #scoring_hand do for i = 1, #scoring_hand do
@ -104,103 +110,192 @@ function G.FUNCS.get_poker_hand_info(_cards)
return str_ret return str_ret
end end
-- text gets stupid small at 100+ anyway -- 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") (county < 1000 and create_num_chunk(county) or "Thousand")
.. (text == "Five of a Kind" and " of a Kind" or "") .. (text == "Five of a Kind" and " of a Kind" or "")
) )
end end
end end
local hand_table = { -- Ascension power
["High Card"] = G.GAME.used_vouchers.v_cry_hyperspacetether and 1 or nil, local a_power = Cryptid.calculate_ascension_power(
["Pair"] = G.GAME.used_vouchers.v_cry_hyperspacetether and 2 or nil, text,
["Two Pair"] = 4, _cards,
["Three of a Kind"] = G.GAME.used_vouchers.v_cry_hyperspacetether and 3 or nil, scoring_hand,
["Straight"] = next(SMODS.find_card("j_four_fingers")) and Cryptid.gameset() ~= "modest" and 4 or 5, G.GAME.used_vouchers.v_cry_hyperspacetether,
["Flush"] = next(SMODS.find_card("j_four_fingers")) and Cryptid.gameset() ~= "modest" and 4 or 5, G.GAME.bonus_asc_power
["Full House"] = 5, )
["Four of a Kind"] = G.GAME.used_vouchers.v_cry_hyperspacetether and 4 or nil, if a_power > 0 then
["Straight Flush"] = next(SMODS.find_card("j_four_fingers")) and Cryptid.gameset() ~= "modest" and 4 or 5, --debatable G.GAME.current_round.current_hand.cry_asc_num = a_power
["cry_Bulwark"] = 5,
["Five of a Kind"] = 5,
["Flush House"] = 5,
["Flush Five"] = 5,
["cry_Clusterfuck"] = 8,
["cry_UltPair"] = 8,
["cry_WholeDeck"] = 52,
}
-- Change mult and chips colors if hand is ascended -- 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_CHIPS, copy_table(G.C.GOLD), 0.3)
ease_colour(G.C.UI_MULT, 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 else
ease_colour(G.C.UI_CHIPS, G.C.BLUE, 0.3) ease_colour(G.C.UI_CHIPS, G.C.BLUE, 0.3)
ease_colour(G.C.UI_MULT, G.C.RED, 0.3) ease_colour(G.C.UI_MULT, G.C.RED, 0.3)
G.GAME.current_round.current_hand.cry_asc_num_text = ""
end 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 else
G.GAME.current_round.current_hand.cry_asc_num = 0 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 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 return text, loc_disp_text, poker_hands, scoring_hand, disp_text
end end
function Cryptid.ascend(num) -- edit this function at your leisure 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 return num
end end
if Cryptid.gameset() == "modest" then if Cryptid.gameset(G.P_CENTERS.c_cry_sunplanet) == "modest" then
-- x(1.1 + 0.05 per sol) base, each card gives + (0.1 + 0.05 per sol) -- Default: Chips and Mult multiplier + 0.25 for every 1 Ascension power
if not G.GAME.current_round.current_hand.cry_asc_num then return num * to_big(1 + ((0.25 + G.GAME.sunnumber.modest) * G.GAME.current_round.current_hand.cry_asc_num))
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)
)
)
)
else else
return math.max( -- Default: Chips and Mult multiplier X1.25 for every 1 Ascension power
num, return num * to_big((1.25 + G.GAME.sunnumber.not_modest) ^ G.GAME.current_round.current_hand.cry_asc_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)
)
)
end end
end end
function Cryptid.pulse_flame(duration, intensity) -- duration is in seconds, intensity is in idfk honestly, but it increases pretty quickly 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 = G.cry_flame_override or {}
G.cry_flame_override["duration"] = duration or 0.01 G.cry_flame_override["duration"] = duration or 0.01
G.cry_flame_override["intensity"] = intensity or 2 G.cry_flame_override["intensity"] = intensity or 2
end 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 -- deal with Rigged and Fragile when scoring a playing card
local ec = eval_card local ec = eval_card
function eval_card(card, context) function eval_card(card, context)
if not card then
card = {
ability = {},
can_calculate = function()
return false
end,
}
end
if card.will_shatter then if card.will_shatter then
return {}, {} return {}, {}
end end
-- Store old probability for later reference -- 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) local ret, post = ec(card, context)
if card.ability.cry_rigged then
G.GAME.probabilities.normal = ggpn
end
return ret, post return ret, post
end end
@ -39,398 +40,6 @@ function Card:cry_copy_ability()
end end
local cj = Card.calculate_joker 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 local smcc = SMODS.calculate_context
function SMODS.calculate_context(context, return_table) function SMODS.calculate_context(context, return_table)
for k, v in pairs(SMODS.Events) do for k, v in pairs(SMODS.Events) do
@ -497,8 +106,9 @@ function Card:calculate_joker(context)
and self.edition and self.edition
and self.edition.cry_double_sided and self.edition.cry_double_sided
then then
self:init_dbl_side() local dummy = self:get_other_side_dummy()
active_side = self.dbl_side if dummy then
active_side = dummy
if context.callback then if context.callback then
local m = context.callback local m = context.callback
context.callback = function(card, a, b) context.callback = function(card, a, b)
@ -506,18 +116,17 @@ function Card:calculate_joker(context)
end end
context.dbl_side = true context.dbl_side = true
end end
end else
if active_side.will_shatter then return
end
end
if not active_side or active_side.will_shatter then
return return
end end
local ggpn = G.GAME.probabilities.normal
if not G.GAME.cry_double_scale then 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 G.GAME.cry_double_scale = { double_scale = true } --doesn't really matter what's in here as long as there's something
end end
if active_side.ability.cry_rigged then local orig_ability = copy_table(active_side.ability)
G.GAME.probabilities.normal = 1e9
end
local orig_ability = active_side:cry_copy_ability()
local in_context_scaling = false local in_context_scaling = false
local callback = context.callback local callback = context.callback
if active_side.ability.cry_possessed then if active_side.ability.cry_possessed then
@ -594,327 +203,5 @@ function Card:calculate_joker(context)
in_context_scaling = true in_context_scaling = true
end end
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 return ret, trig
end 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_chips = 50,
l_mult = 1, l_mult = 1,
example = { example = {
{ "S_A", true, "m_stone" }, { "S_A", true, enhancement = "m_stone" },
{ "S_A", true, "m_stone" }, { "S_A", true, enhancement = "m_stone" },
{ "S_A", true, "m_stone" }, { "S_A", true, enhancement = "m_stone" },
{ "S_A", true, "m_stone" }, { "S_A", true, enhancement = "m_stone" },
{ "S_A", true, "m_stone" }, { "S_A", true, enhancement = "m_stone" },
}, },
atlas = "poker_hands", atlas = "poker_hands",
pos = { x = 0, y = 0 }, pos = { x = 0, y = 0 },
@ -267,6 +267,68 @@ SMODS.PokerHand({
return return
end, 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({ SMODS.Rarity({
key = "exotic", key = "exotic",
loc_txt = {}, loc_txt = {},
@ -312,6 +374,7 @@ SMODS.ConsumableType({
default = "c_cry_potion", default = "c_cry_potion",
can_stack = false, can_stack = false,
can_divide = false, can_divide = false,
no_collection = true,
}) })
-- Pool used by Food Jokers -- Pool used by Food Jokers
SMODS.ObjectType({ 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 }) Sprite(0, 0, G.CARD_W, G.CARD_H, G[self.atlas_table][self.key_noloc or self.key], { x = 5, y = 0 })
end, end,
}) })
SMODS.Sound({
key = "forcetrigger",
path = "forcetrigger.ogg",
})
SMODS.Sound({
key = "demitrigger",
path = "demitrigger.ogg",
})
SMODS.Sound({ SMODS.Sound({
key = "meow1", key = "meow1",
path = "meow1.ogg", path = "meow1.ogg",
@ -492,9 +563,17 @@ SMODS.Sound({
key = "music_big", key = "music_big",
path = "music_big.ogg", path = "music_big.ogg",
select_music_track = function() 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 Cryptid_config.Cryptid.big_music
and to_big(G.GAME.round_scores["hand"].amt) > to_big(10) ^ 1000000 and to_big(G.GAME.round_scores["hand"].amt) > to_big(10) ^ 1000000
then
G.GAME.cry_music_big = true
return true
end
end, end,
}) })
SMODS.Sound({ SMODS.Sound({
@ -661,7 +740,7 @@ SMODS.UndiscoveredSprite({
key = "Code", key = "Code",
atlas = "atlasnotjokers", atlas = "atlasnotjokers",
path = "atlasnotjokers.png", path = "atlasnotjokers.png",
pos = { x = 9, y = 5 }, pos = { x = 12, y = 6 },
px = 71, px = 71,
py = 95, py = 95,
}) })
@ -681,6 +760,15 @@ SMODS.Atlas({
py = 34, py = 34,
frames = 21, 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({ SMODS.Atlas({
key = "nostalgia", key = "nostalgia",
atlas_table = "ANIMATION_ATLAS", atlas_table = "ANIMATION_ATLAS",
@ -702,3 +790,77 @@ SMODS.Atlas({
px = 73, px = 73,
py = 95, 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 not context.blueprint
and context.other_card == context.full_hand[#context.full_hand] and context.other_card == context.full_hand[#context.full_hand]
then then
local prev_mult = card.ability.mult if card.ability.mult ~= 0 then
card.ability.mult = math.max(0, card.ability.mult - card.ability.extra) SMODS.scale_card(card, {
if card.ability.mult ~= prev_mult then ref_table = card.ability,
return { ref_value = "mult",
message = localize({ scalar_table = card.ability,
type = "variable", scalar_value = "extra",
key = "a_mult_minus", operation = function(ref_table, ref_value, initial, change)
vars = { card.ability.extra }, ref_table[ref_value] = math.max(0, initial - change)
}), end,
colour = G.C.RED, message_key = "a_mult_minus",
card = card, message_colour = G.C.RED,
} })
end end
end end
if context.cardarea == G.jokers and context.before and not context.blueprint then if context.cardarea == G.jokers and context.before and not context.blueprint then
card.ability.mult = card.ability.mult + card.ability.extra SMODS.scale_card(card, {
return { ref_table = card.ability,
card = card, ref_value = "mult",
message = localize({ type = "variable", key = "a_mult", vars = { card.ability.extra } }), scalar_value = "extra",
} message_key = "a_mult",
message_colour = G.C.RED,
})
end end
if context.joker_main then if context.joker_main then
return { return {
@ -44,41 +46,6 @@ SMODS.Joker:take_ownership("green_joker", {
loc_txt = {}, loc_txt = {},
}, true) }, 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 --Requires Malverk Mod
if (SMODS.Mods["malverk"] or {}).can_load then if (SMODS.Mods["malverk"] or {}).can_load then
AltTexture({ AltTexture({
@ -117,9 +84,11 @@ if (SMODS.Mods["AntePreview"] or {}).can_load then
big = get_new_boss() big = get_new_boss()
end end
local predictions = predict_hook() local predictions = predict_hook()
if next(SMODS.find_card("j_cry_kittyprinter")) then local s = Cryptid.get_next_tag("Small")
predictions.Small.tag = "tag_cry_cat" local b = Cryptid.get_next_tag("Big")
predictions.Big.tag = "tag_cry_cat" if s or b then
predictions.Small.tag = s or predictions.Small.tag
predictions.Big.tag = b or predictions.Big.tag
end end
if G.GAME.modifiers.cry_no_tags then if G.GAME.modifiers.cry_no_tags then
for _, pred in pairs(predictions) do for _, pred in pairs(predictions) do
@ -140,3 +109,63 @@ if (SMODS.Mods["AntePreview"] or {}).can_load then
return predictions return predictions
end end
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 end
G.FUNCS.cry_intro_controller = function() 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 G.PROFILES[G.SETTINGS.profile].cry_intro_progress = G.PROFILES[G.SETTINGS.profile].cry_intro_progress
or { or {
state = "start", state = "start",
@ -188,7 +184,7 @@ G.FUNCS.cry_intro_part = function(_part)
--TODO: localize --TODO: localize
G.modestBtn = create_UIBox_character_button_with_sprite({ G.modestBtn = create_UIBox_character_button_with_sprite({
sprite = modestSprite, sprite = modestSprite,
button = "Modest", button = localize("cry_gameset_modest"),
id = "modest", id = "modest",
func = "cry_modest", func = "cry_modest",
colour = G.C.GREEN, colour = G.C.GREEN,
@ -196,7 +192,7 @@ G.FUNCS.cry_intro_part = function(_part)
}) })
G.mainlineBtn = create_UIBox_character_button_with_sprite({ G.mainlineBtn = create_UIBox_character_button_with_sprite({
sprite = mainlineSprite, sprite = mainlineSprite,
button = "Mainline", button = localize("cry_gameset_mainline"),
id = "mainline", id = "mainline",
func = "cry_mainline", func = "cry_mainline",
colour = G.C.RED, colour = G.C.RED,
@ -204,7 +200,7 @@ G.FUNCS.cry_intro_part = function(_part)
}) })
G.madnessBtn = create_UIBox_character_button_with_sprite({ G.madnessBtn = create_UIBox_character_button_with_sprite({
sprite = madnessSprite, sprite = madnessSprite,
button = "Madness", button = localize("cry_gameset_madness"),
id = "madness", id = "madness",
func = "cry_madness", func = "cry_madness",
colour = G.C.CRY_EXOTIC, colour = G.C.CRY_EXOTIC,
@ -547,9 +543,6 @@ end
-- designed to work on any object type -- designed to work on any object type
function Cryptid.gameset(card, center) function Cryptid.gameset(card, center)
if Jen then
return "madness"
end
if not center then if not center then
if not card then if not card then
return G.PROFILES[G.SETTINGS.profile].cry_gameset or "mainline" 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 if center.tag and center.tag.key then --dumb fix for tags
center = center.tag center = center.tag
else else
if false then
print("Could not find key for center: " .. tprint(center)) print("Could not find key for center: " .. tprint(center))
end
return G.PROFILES[G.SETTINGS.profile].cry_gameset or "mainline" return G.PROFILES[G.SETTINGS.profile].cry_gameset or "mainline"
end end
end end
@ -602,6 +597,11 @@ function Card:set_ability(center, y, z)
if not center then if not center then
return return
end 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 if not center.config then
center.config = {} --crashproofing center.config = {} --crashproofing
end end
@ -634,14 +634,18 @@ function Card:set_ability(center, y, z)
end end
-- open gameset config UI when clicking on a card in the Cryptid collection -- open gameset config UI when clicking on a card in the Cryptid collection
--disable this functionality for Jen's Almanac -- can be disabled in config
if not Jen then if Cryptid_config.gameset_toggle then
local ccl = Card.click local ccl = Card.click
function Card:click() function Card:click()
ccl(self) ccl(self)
if G.your_collection then if G.your_collection then
for k, v in pairs(G.your_collection) do 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 if not self.config.center or self.config.center and self.config.center.set == "Default" then
--make a fake center --make a fake center
local old_force_gameset = self.config.center and self.config.center.force_gameset 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 end
if m.obj_table then if m.obj_table then
for k, v in pairs(m.obj_table) do 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) local en = force_enable or Cryptid.enabled(k)
if en == true then if en == true then
if v.cry_disabled then if v.cry_disabled then
v:enable() 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 end
else else
if not v.cry_disabled then if not v.cry_disabled then
v:_disable(en) 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 end
end end
@ -1141,7 +1159,7 @@ function Cryptid.index_items(func, m)
end end
if m.obj_table then if m.obj_table then
for k, v in pairs(m.obj_table) do 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) func(v)
end end
end end
@ -1186,6 +1204,12 @@ SMODS.ContentSet({
key = "m", key = "m",
atlas = "atlasepic", atlas = "atlasepic",
pos = { x = 3, y = 1 }, --m 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, cry_order = -22,
}) })
SMODS.ContentSet({ SMODS.ContentSet({
@ -1218,7 +1242,7 @@ SMODS.ContentSet({
key = "deck", key = "deck",
atlas = "atlasdeck", atlas = "atlasdeck",
pos = { x = 4, y = 5 }, --Critical Deck pos = { x = 4, y = 5 }, --Critical Deck
cry_order = -23, cry_order = -24,
}) })
SMODS.ContentSet({ SMODS.ContentSet({
key = "spooky", key = "spooky",
@ -1243,7 +1267,7 @@ SMODS.ContentSet({
key = "misc", key = "misc",
atlas = "cry_misc", atlas = "cry_misc",
pos = { x = 2, y = 0 }, --Echo Card pos = { x = 2, y = 0 }, --Echo Card
cry_order = -22, cry_order = -21,
}) })
SMODS.ContentSet({ SMODS.ContentSet({
key = "misc_joker", key = "misc_joker",
@ -1329,7 +1353,7 @@ function create_UIBox_your_collection_content_sets()
local joker_pool = {} local joker_pool = {}
for k, v in pairs(SMODS.ContentSet.obj_table) do 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) table.insert(joker_pool, v)
end end
end end
@ -1424,7 +1448,7 @@ function create_UIBox_your_collection_current_set()
end end
Cryptid.index_items(is_in_set) Cryptid.index_items(is_in_set)
table.sort(joker_pool, function(a, b) 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) end)
local joker_options = {} local joker_options = {}
for i = 1, math.ceil(#joker_pool / (5 * #G.your_collection)) do 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 end
local joker_pool = {} local joker_pool = {}
for k, v in pairs(SMODS.ContentSet.obj_table) do 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) table.insert(joker_pool, v)
end end
end end
table.sort(joker_pool, function(a, b) 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) end)
for i = 1, 5 do for i = 1, 5 do
for j = 1, #G.your_collection do for j = 1, #G.your_collection do
@ -1541,7 +1565,7 @@ G.FUNCS.your_collection_current_set_page = function(args)
end end
Cryptid.index_items(is_in_set) Cryptid.index_items(is_in_set)
table.sort(joker_pool, function(a, b) 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) end)
for i = 1, 5 do for i = 1, 5 do
for j = 1, #G.your_collection do for j = 1, #G.your_collection do
@ -1612,19 +1636,19 @@ end
-- Hooks for all collection types -- Hooks for all collection types
local smcp = SMODS.collection_pool local smcp = SMODS.collection_pool
SMODS.collection_pool = function(m) 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 -- use SMODS pools instead of vanilla pools, so disabled cards appear
if m[1] and m[1].set and m[1].set == "Seal" then if m[1] and m[1].set and m[1].set == "Seal" then
m = {} m = {}
for k, v in pairs(SMODS.Seal.obj_table) do 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) table.insert(m, v)
end end
end end
elseif m[1] and m[1].set and m[1].set == "Sticker" then elseif m[1] and m[1].set and m[1].set == "Sticker" then
m = {} m = {}
for k, v in pairs(SMODS.Sticker.obj_table) do 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) table.insert(m, v)
end end
end end
@ -1632,19 +1656,19 @@ SMODS.collection_pool = function(m)
local set = m[1].set local set = m[1].set
m = {} m = {}
for k, v in pairs(SMODS.Center.obj_table) do 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) table.insert(m, v)
end end
end end
end end
-- Fix blind issues -- Fix blind issues
for k, v in pairs(m) do 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 = {} v.config = {}
end end
end end
table.sort(m, function(a, b) 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)
end end
return smcp(m) return smcp(m)
@ -1654,7 +1678,7 @@ end
local mct = modsCollectionTally local mct = modsCollectionTally
function modsCollectionTally(pool, set) function modsCollectionTally(pool, set)
local t = mct(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 } local obj_tally = { tally = 0, of = 0 }
--infer pool --infer pool
local _set = set or Cryptid.safe_get(pool, 1, "set") local _set = set or Cryptid.safe_get(pool, 1, "set")
@ -1709,10 +1733,10 @@ end
-- Make non-center collections show all cards as centers -- Make non-center collections show all cards as centers
local uibk = create_UIBox_your_collection_decks local uibk = create_UIBox_your_collection_decks
function 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 = {} local generic_collection_pool = {}
for k, v in pairs(SMODS.Center.obj_table) do 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) table.insert(generic_collection_pool, v)
end end
end end
@ -1740,10 +1764,10 @@ end
local uitag = create_UIBox_your_collection_tags local uitag = create_UIBox_your_collection_tags
function 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 = {} local generic_collection_pool = {}
for k, v in pairs(SMODS.Tag.obj_table) do 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) table.insert(generic_collection_pool, v)
end end
end end
@ -1763,10 +1787,10 @@ end
local uibl = create_UIBox_your_collection_blinds local uibl = create_UIBox_your_collection_blinds
function 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 = {} local generic_collection_pool = {}
for k, v in pairs(SMODS.Blind.obj_table) do 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) table.insert(generic_collection_pool, v)
end end
end end
@ -1786,7 +1810,7 @@ end
local uisl = create_UIBox_your_collection_seals local uisl = create_UIBox_your_collection_seals
function 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 }, { return SMODS.card_collection_UIBox(G.P_CENTER_POOLS.Seal, { 5, 5 }, {
snap_back = true, snap_back = true,
infotip = localize("ml_edition_seal_enhancement_explanation"), infotip = localize("ml_edition_seal_enhancement_explanation"),
@ -1808,7 +1832,7 @@ end
local uist = create_UIBox_your_collection_stickers local uist = create_UIBox_your_collection_stickers
function 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 }, { return SMODS.card_collection_UIBox(SMODS.Stickers, { 5, 5 }, {
snap_back = true, snap_back = true,
hide_single_page = true, hide_single_page = true,

View file

@ -187,6 +187,9 @@ function Cryptid.pluralize(str, vars)
if type(num) == "string" then if type(num) == "string" then
num = (Big and to_number(to_big(num))) or num num = (Big and to_number(to_big(num))) or num
end end
if not num then
num = 1
end
local plural = _table[1] -- default local plural = _table[1] -- default
local checks = { [1] = "=" } -- checks 1 by default local checks = { [1] = "=" } -- checks 1 by default
local checks1mod = false -- tracks if 1 was modified local checks1mod = false -- tracks if 1 was modified
@ -217,6 +220,9 @@ function Cryptid.pluralize(str, vars)
table.sort(keys, function(a, b) table.sort(keys, function(a, b)
return a < b return a < b
end) end)
if not (tonumber(num) or is_number(num)) then
num = 1
end
for _, k in ipairs(keys) do for _, k in ipairs(keys) do
if fch(checks[k], "=") then if fch(checks[k], "=") then
if to_big(math.abs(num - k)) < to_big(0.001) 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 if not card.added_to_deck then
return func(card) return func(card)
else else
card.from_quantum = true
card:remove_from_deck(true) card:remove_from_deck(true)
local ret = func(card) local ret = func(card)
card:add_to_deck(true) card:add_to_deck(true)
card.from_quantum = nil
return ret return ret
end end
end end
@ -468,7 +476,7 @@ function Cryptid.bonus_voucher_mod(mod)
{ bypass_discovery_center = true, bypass_discovery_ui = true } { bypass_discovery_center = true, bypass_discovery_ui = true }
) )
card.shop_cry_bonusvoucher = #curr_bonus card.shop_cry_bonusvoucher = #curr_bonus
Cryptid.misprintize(card) Cryptid.manipulate(card)
if G.GAME.events.ev_cry_choco2 then if G.GAME.events.ev_cry_choco2 then
card.misprint_cost_fac = (card.misprint_cost_fac or 1) * 2 card.misprint_cost_fac = (card.misprint_cost_fac or 1) * 2
card:set_cost() card:set_cost()
@ -502,6 +510,9 @@ end
local sppref = set_profile_progress local sppref = set_profile_progress
function set_profile_progress() function set_profile_progress()
sppref() sppref()
if not Cryptid.shinytagdata then
Cryptid.shinytagdata = {}
end
if not Cryptid.shinytagdata.init then if not Cryptid.shinytagdata.init then
for k, v in pairs(G.P_TAGS) do for k, v in pairs(G.P_TAGS) do
if Cryptid.shinytagdata[k] == nil then if Cryptid.shinytagdata[k] == nil then
@ -512,54 +523,46 @@ function set_profile_progress()
end end
end end
Cryptid.big_num_whitelist = { Cryptid.big_num_blacklist = {
j_ride_the_bus = true, ["j_cry_fractal"] = true,
j_egg = true, ["j_cry_wonka_bar"] = true,
j_runner = true, ["j_cry_oldcandy"] = true,
j_ice_cream = true, ["j_cry_negative"] = true,
j_constellation = true,
j_green_joker = true, ["c_magician"] = true,
j_red_card = true, ["c_empress"] = true,
j_madness = true, ["c_heirophant"] = true,
j_square = true, ["c_lovers"] = true,
j_vampire = true, ["c_chariot"] = true,
j_hologram = true, ["c_justice"] = true,
j_obelisk = true, ["c_strength"] = true,
j_turtle_bean = true, ["c_hanged_man"] = true,
j_lucky_cat = true, ["c_death"] = true,
j_flash = true, ["c_devil"] = true,
j_popcorn = true, ["c_tower"] = true,
j_trousers = true, ["c_star"] = true,
j_ramen = true, ["c_moon"] = true,
j_castle = true, ["c_sun"] = true,
j_campfire = true, ["c_world"] = true,
j_throwback = true, ["c_cry_eclipse"] = true,
j_glass = true, ["c_cry_seraph"] = true,
j_wee = true, ["c_cry_instability"] = true,
j_hit_the_road = true,
j_caino = true, ["v_cry_stickyhand"] = true,
j_yorick = true, ["v_cry_grapplinghook"] = true,
-- Once all Cryptid Jokers get support for this, these can be removed ["v_cry_hyperspacetether"] = true,
j_cry_dropshot = true,
j_cry_wee_fib = true, -- Add your Jokers here if you *don't* want to have it's numbers go into BigNum
j_cry_whip = true, -- FORMAT: <Joker Key ("j_cry_oil_lamp")> = true,
j_cry_pickle = true, -- TARGET: BigNum Black List
j_cry_chili_pepper = true, }
j_cry_cursor = true,
j_cry_jimball = true, Cryptid.mod_whitelist = {
j_cry_eternalflame = true, Cryptid = true,
j_cry_fspinner = true,
j_cry_krustytheclown = true, -- Add your ModName here if you want your mod to have it's jokers' values go into BigNum
j_cry_antennastoheaven = true, -- FORMAT: <ModName> = true,
j_cry_mondrian = true, -- TARGET: BigNum Mod Whitelist
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,
} }
function Cryptid.is_card_big(joker) function Cryptid.is_card_big(joker)
@ -567,7 +570,18 @@ function Cryptid.is_card_big(joker)
if not center then if not center then
return false return false
end 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--]] (center.mod and center.mod.id == "Cryptid" and not center.no_break_infinity) or center.break_infinity--]]
end end
@ -585,6 +599,7 @@ function Cryptid.safe_get(t, ...)
end end
return current return current
end end
--Functions used by boss blinds --Functions used by boss blinds
function Blind:cry_ante_base_mod(dt) function Blind:cry_ante_base_mod(dt)
if not self.disabled then if not self.disabled then
@ -595,6 +610,7 @@ function Blind:cry_ante_base_mod(dt)
end end
return 0 return 0
end end
function Blind:cry_round_base_mod(dt) function Blind:cry_round_base_mod(dt)
if not self.disabled then if not self.disabled then
local obj = self.config.blind local obj = self.config.blind
@ -604,15 +620,20 @@ function Blind:cry_round_base_mod(dt)
end end
return 1 return 1
end end
function Blind:cry_cap_score(score) function Blind:cry_cap_score(score)
if not self.disabled then if not self.disabled then
local obj = self.config.blind 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 if obj.cry_cap_score and type(obj.cry_cap_score) == "function" then
return obj:cry_cap_score(score) return obj:cry_cap_score(score)
end end
end end
return score return score
end end
function Blind:cry_after_play() function Blind:cry_after_play()
if not self.disabled then if not self.disabled then
local obj = self.config.blind local obj = self.config.blind
@ -621,6 +642,7 @@ function Blind:cry_after_play()
end end
end end
end end
function Blind:cry_before_play() function Blind:cry_before_play()
if not self.disabled then if not self.disabled then
local obj = self.config.blind local obj = self.config.blind
@ -629,6 +651,17 @@ function Blind:cry_before_play()
end end
end 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() function Blind:cry_calc_ante_gain()
if G.GAME.modifiers.cry_spooky then --here is the best place to check when spooky should apply if G.GAME.modifiers.cry_spooky then --here is the best place to check when spooky should apply
local card local card
@ -649,6 +682,7 @@ function Blind:cry_calc_ante_gain()
end end
return 1 return 1
end end
function Cryptid.enhanced_deck_info(deck) function Cryptid.enhanced_deck_info(deck)
--only accounts for vanilla stuff at the moment (WIP) --only accounts for vanilla stuff at the moment (WIP)
local edition, enhancement, sticker, suit, seal = local edition, enhancement, sticker, suit, seal =
@ -679,6 +713,7 @@ function Cryptid.enhanced_deck_info(deck)
end end
return ret.edition, ret.enhancement, ret.sticker, ret.suit, ret.seal return ret.edition, ret.enhancement, ret.sticker, ret.suit, ret.seal
end end
function Cryptid.post_process(center) function Cryptid.post_process(center)
if center.pools and center.pools.M then if center.pools and center.pools.M then
local vc = center.calculate local vc = center.calculate
@ -703,8 +738,11 @@ end
-- For resetting localization on the fly for family friendly toggle -- For resetting localization on the fly for family friendly toggle
function Cryptid.reload_localization() function Cryptid.reload_localization()
SMODS.handle_loc_file(Cryptid.path) SMODS.handle_loc_file(Cryptid.path)
Cryptid.handle_other_localizations()
return init_localization() return init_localization()
end 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.) -- Checks if all jokers in shop will have editions (via Curate, Edition Decks, etc.)
-- Will cause edition tags to Nope! -- Will cause edition tags to Nope!
@ -760,3 +798,665 @@ function Cryptid.is_shiny()
end end
return false return false
end 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 --Redefine these here because they're always used
Cryptid.base_values = {} 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 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 for k, v in pairs(tbl) do
if (type(tbl[k]) ~= "table") or is_number(tbl[k]) then if (type(tbl[k]) ~= "table") or is_number(tbl[k]) then
if if is_number(tbl[k]) and can_misprintize_value(k, tbl[k]) then
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 not Cryptid.base_values[name] then if not Cryptid.base_values[name] then
Cryptid.base_values[name] = {} Cryptid.base_values[name] = {}
end end
if not Cryptid.base_values[name][k] then if not Cryptid.base_values[name][k .. ref_value] then
Cryptid.base_values[name][k] = tbl[k] Cryptid.base_values[name][k .. ref_value] = tbl[k]
end 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( tbl[k] = Cryptid.sanity_check(
clear and Cryptid.base_values[name][k] clear and Cryptid.base_values[name][k .. ref_value]
or cry_format( or cry_format(Cryptid.calculate_misprint(initial, min, max, grow_type, pow_level), "%.2g"),
(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"
),
big big
) )
end end
elseif not (k == "immutable") then elseif not (k == "immutable") and not (k == "colour") then
for _k, _v in pairs(tbl[k]) do for _k, _v in pairs(tbl[k]) do
if if is_number(tbl[k][_k]) and can_misprintize_value(_k, tbl[k][_k]) then
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 not Cryptid.base_values[name] then if not Cryptid.base_values[name] then
Cryptid.base_values[name] = {} Cryptid.base_values[name] = {}
end end
if not Cryptid.base_values[name][k] then if not Cryptid.base_values[name][_k .. k] then
Cryptid.base_values[name][k] = {} 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 end
if not Cryptid.base_values[name][k][_k] then
Cryptid.base_values[name][k][_k] = tbl[k][_k]
end 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( 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( or cry_format(
(stack and tbl[k][_k] or Cryptid.base_values[name][k][_k]) Cryptid.calculate_misprint(initial, min, max, grow_type, pow_level),
* 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" "%.2g"
), ),
big big
@ -85,15 +202,16 @@ function Cryptid.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stac
ref_tbl[ref_value] = tbl ref_tbl[ref_value] = tbl
end end
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 if is_number(val) then
val = Cryptid.sanity_check( val = Cryptid.sanity_check(
cry_format( cry_format(
val Cryptid.calculate_misprint(
* Cryptid.log_random( val,
pseudoseed("cry_misprint" .. G.GAME.round_resets.ante),
override and override.min or G.GAME.modifiers.cry_misprint_min, override and override.min or G.GAME.modifiers.cry_misprint_min,
override and override.max or G.GAME.modifiers.cry_misprint_max override and override.max or G.GAME.modifiers.cry_misprint_max,
grow_type,
pow_level
), ),
"%.2g" "%.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 if not val or type(val) == "number" and (val ~= val or val > 1e300 or val < -1e300) then
return 1e300 return 1e300
end 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 return val
end 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 if Card.no(card, "immutable", true) then
force_reset = true force_reset = true
end end
@ -127,7 +255,7 @@ function Cryptid.misprintize(card, override, force_reset, stack)
if card.infinifusion then if card.infinifusion then
if card.config.center == card.infinifusion_center or card.config.center.key == "j_infus_fused" then if card.config.center == card.infinifusion_center or card.config.center.key == "j_infus_fused" then
calculate_infinifusion(card, nil, function(i) 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 end
end end
@ -137,9 +265,6 @@ function Cryptid.misprintize(card, override, force_reset, stack)
and not stack and not stack
or not Card.no(card, "immutable", true) or not Card.no(card, "immutable", true)
then 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 G.GAME.modifiers.cry_jkr_misprint_mod and card.ability.set == "Joker" then
if not override then if not override then
override = {} override = {}
@ -157,7 +282,9 @@ function Cryptid.misprintize(card, override, force_reset, stack)
nil, nil,
override, override,
stack, stack,
Cryptid.is_card_big(card) Cryptid.is_card_big(card),
grow_type,
pow_level
) )
if card.base then if card.base then
Cryptid.misprintize_tbl( Cryptid.misprintize_tbl(
@ -167,7 +294,9 @@ function Cryptid.misprintize(card, override, force_reset, stack)
nil, nil,
override, override,
stack, stack,
Cryptid.is_card_big(card) Cryptid.is_card_big(card),
grow_type,
pow_level
) )
end end
end end
@ -182,7 +311,41 @@ function Cryptid.misprintize(card, override, force_reset, stack)
card:set_cost() card:set_cost()
end end
else 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 end
if card.ability.consumeable then if card.ability.consumeable then
for k, v in pairs(card.ability.consumeable) do 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 + 10 * self.base.face_nominal * rank_mult
+ 0.000001 * self.unique_val + 0.000001 * self.unique_val
end 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 if self.flipping == "f2b" then
self.flipping = "b2f" self.flipping = "b2f"
end end
self:dbl_side_flip() self:flip_side()
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
end end
if self.ability.pinned then if self.ability.pinned then
self.pinned = true self.pinned = true
@ -395,7 +388,7 @@ function cry_best_interest_cap()
} }
for _, table in ipairs(vouchers) do for _, table in ipairs(vouchers) do
for i, v in ipairs(table) 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 best = v.ability.extra
end end
end end
@ -407,6 +400,7 @@ G.FUNCS.evaluate_round = function()
G.GAME.interest_cap = cry_best_interest_cap() -- blehhhhhh G.GAME.interest_cap = cry_best_interest_cap() -- blehhhhhh
--Semicolon Stuff --Semicolon Stuff
if G.GAME.current_round.semicolon then if G.GAME.current_round.semicolon then
G.GAME.saved_text = ";"
add_round_eval_row({ dollars = 0, name = "blind1", pitch = 0.95, saved = true }) add_round_eval_row({ dollars = 0, name = "blind1", pitch = 0.95, saved = true })
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
trigger = "before", trigger = "before",
@ -578,7 +572,7 @@ function Card:set_eternal(_eternal)
end end
function Card:calculate_banana() function Card:calculate_banana()
if not self.ability.extinct then 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 self.ability.extinct = true
G.E_MANAGER:add_event(Event({ G.E_MANAGER:add_event(Event({
func = function() func = function()
@ -676,6 +670,16 @@ SMODS.Sticker:take_ownership("eternal", {
return { key = "cry_eternal_booster" } return { key = "cry_eternal_booster" }
end end
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", { SMODS.Sticker:take_ownership("rental", {
loc_vars = function(self, info_queue, card) loc_vars = function(self, info_queue, card)
@ -713,13 +717,16 @@ SMODS.Sticker({
should_apply = false, should_apply = false,
loc_vars = function(self, info_queue, card) loc_vars = function(self, info_queue, card)
if card.ability.consumeable then 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 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 elseif card.ability.set == "Booster" then
return { key = "cry_banana_booster" } return { key = "cry_banana_booster" }
else else
return { vars = { G.GAME.probabilities.normal or 1, 10 } } return { vars = { SMODS.get_probability_vars(card, 1, 10, "Banana Sticker") } }
end end
end, end,
calculate = function(self, card, context) calculate = function(self, card, context)
@ -730,7 +737,15 @@ SMODS.Sticker({
and not context.individual and not context.individual
then then
if card.ability.set == "Voucher" 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 local area
if G.STATE == G.STATES.HAND_PLAYED then if G.STATE == G.STATES.HAND_PLAYED then
if not G.redeemed_vouchers_during_hand 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 } { n = G.UIT.R, config = { align = "cm", padding = 0, no_fill = true }, nodes = voucher_tables }
) )
local t = silent -- Code by IcyEthics: Generates sliders dynamically
and { local cryptid_voucher_nodes = {}
n = G.UIT.ROOT, if silent then
config = { align = "cm", colour = G.C.CLEAR }, for i, _info in ipairs(Cryptid.voucher_acclimator_data) do
nodes = { if next(SMODS.find_card(_info.voucher_key)) then
cryptid_voucher_nodes[#cryptid_voucher_nodes + 1] = {
-- tarot/planet acclimator sliders
next(SMODS.find_card("v_cry_tacclimator"))
and {
n = G.UIT.R, n = G.UIT.R,
config = { align = "cm" }, config = { align = "cm" },
nodes = { nodes = {
create_slider({ create_slider({
label = localize("b_tarot_rate"), label = localize(_info.localization_key),
label_scale = 0.4, label_scale = 0.4,
text_scale = 0.3, text_scale = 0.3,
w = 4, w = 4,
h = 0.4, h = 0.4,
ref_table = G.GAME.cry_percrate, ref_table = G.GAME.cry_percrate,
ref_value = "tarot", ref_value = _info.ref_value,
colour = G.C.SECONDARY_SET.Tarot, colour = _info.colour,
min = 0, min = 0,
max = 100, max = 100,
}), }),
}, },
} }
or nil, end
next(SMODS.find_card("v_cry_pacclimator")) and { end
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,
{ cryptid_voucher_nodes[#cryptid_voucher_nodes + 1] = {
n = G.UIT.R, n = G.UIT.R,
config = { align = "cm" }, config = { align = "cm" },
nodes = { 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, n = G.UIT.R,
config = { align = "cm", colour = G.C.BLACK, r = 1, padding = 0.15, emboss = 0.05 }, config = { align = "cm", colour = G.C.BLACK, r = 1, padding = 0.15, emboss = 0.05 },
nodes = { nodes = {
{ n = G.UIT.R, config = { align = "cm" }, nodes = voucher_table_rows }, { 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 { or {
n = G.UIT.ROOT, 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 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)) ) == "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"]) 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 if
currentBack.effect.config.cry_force_seal currentBack.effect.config.cry_force_seal
and not currentBack.effect.config.hide_seal and not currentBack.effect.config.hide_seal
@ -200,6 +183,7 @@ SMODS.DrawStep({
then 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 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 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( self.children.floating_sprite2:draw_shader(
"dissolve", "dissolve",
0, 0,
@ -222,12 +206,44 @@ SMODS.DrawStep({
scale_mod, scale_mod,
rotate_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
end, end,
conditions = { vortex = false, facing = "front" }, conditions = { vortex = false, facing = "front" },
}) })
SMODS.draw_ignore_keys.floating_sprite2 = true 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 -- Make hover UI collidable - so we can detect collision and display tooltips
local m = Card.move local m = Card.move
function Card:move(dt) function Card:move(dt)
@ -278,7 +294,7 @@ end
-- Unfortunately this doesn't play nicely with gameset UI -- Unfortunately this doesn't play nicely with gameset UI
local cainit = CardArea.init local cainit = CardArea.init
function CardArea:init(X, Y, W, H, config) function CardArea:init(X, Y, W, H, config)
if config.collection then if config and config.collection then
config.highlight_limit = config.card_limit config.highlight_limit = config.card_limit
end end
return cainit(self, X, Y, W, H, config) 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 if card.config and card.config.center and card.config.center.key == "c_cry_potion" then
table.remove(abc.nodes[1].nodes, 1) table.remove(abc.nodes[1].nodes, 1)
end end
-- i love buttercup
if if
card.area card.area
and card.edition and card.area.config.type == "joker"
and (card.area == G.jokers or card.area == G.consumeables or card.area == G.hand) and card.config
and card.edition.cry_double_sided and card.config.center
and not Card.no(card, "dbl") and card.ability.name == "cry-Buttercup"
then then
local use = { local use = {
n = G.UIT.C, n = G.UIT.C,
@ -411,20 +428,20 @@ function G.UIDEF.use_and_sell_buttons(card)
align = "cr", align = "cr",
maxw = 1.25, maxw = 1.25,
padding = 0.1, padding = 0.1,
r = 0.08, r = 0.05,
hover = true, hover = true,
shadow = true, shadow = true,
colour = G.C.UI.BACKGROUND_INACTIVE, colour = G.C.UI.BACKGROUND_INACTIVE,
one_press = true, one_press = true,
button = "flip", button = "store",
func = "can_flip_card", func = "can_store_card",
}, },
nodes = { nodes = {
{ n = G.UIT.B, config = { w = 0.1, h = 0.3 } }, { n = G.UIT.B, config = { w = 0.1, h = 0.3 } },
{ {
n = G.UIT.T, n = G.UIT.T,
config = { config = {
text = localize("b_flip"), text = localize("b_store"),
colour = G.C.UI.TEXT_LIGHT, colour = G.C.UI.TEXT_LIGHT,
scale = 0.3, scale = 0.3,
shadow = true, shadow = true,
@ -447,63 +464,5 @@ function G.UIDEF.use_and_sell_buttons(card)
} }) } })
return abc return abc
end 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 return abc
end 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", name = "Baraja crítica",
text = { text = {
"Después de cada mano jugada,", "Después de cada mano jugada,",
"{C:green}#1# en 4{} probabilidades para {X:dark_edition,C:white} ^2 {} multi", "{C:green}#1# en #2#{} 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 #3#{} probabilidades para {X:dark_edition,C:white} ^0.5 {} multi",
}, },
}, },
b_cry_encoded = { b_cry_encoded = {
@ -136,7 +136,7 @@ return {
name = "Baraja legendaria", name = "Baraja legendaria",
text = { text = {
"Comienza con un comodín {C:legendary}legendario{C:legendary}", "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", "cuando se derrota a la ciega jefe",
"{C:inactive}(debe haber espacio){}", "{C:inactive}(debe haber espacio){}",
}, },
@ -1427,7 +1427,7 @@ return {
"{C:attention}primer descarte{} de cada ronda", "{C:attention}primer descarte{} de cada ronda",
}, },
}, },
j_cry_Megg = { j_cry_megg = {
name = "Muevo", name = "Muevo",
text = { text = {
"Vende esta carta para crear", "Vende esta carta para crear",
@ -1449,7 +1449,7 @@ return {
"{X:mult,C:white}X#1#{} multi por cada miembro", "{X:mult,C:white}X#1#{} multi por cada miembro",
"en el {C:attention}Discord de Cryptid{}", "en el {C:attention}Discord de Cryptid{}",
"{C:inactive}(Actual: {X:mult,C:white}X#2#{C:inactive} multi)", "{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 = { j_cry_membershipcardtwo = {
@ -1458,7 +1458,7 @@ return {
"{C:chips}+#1#{} fichas por cada miembro", "{C:chips}+#1#{} fichas por cada miembro",
"en el {C:attention}Discord de Cryptid{}", "en el {C:attention}Discord de Cryptid{}",
"{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)", "{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 = { j_cry_meteor = {
@ -2406,6 +2406,14 @@ return {
"gana {C:attention}2{} vales aleatorios", "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 = { c_cry_typhoon = {
name = "Tifón", name = "Tifón",
text = { text = {
@ -2848,14 +2856,7 @@ return {
"una {C:attention}Carta de eco", "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 = { c_cry_theblessing = {
name = "La bendición", name = "La bendición",
text = { text = {
@ -3084,6 +3085,15 @@ return {
}, },
}, },
Other = { 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 = { banana = {
name = "Banana", name = "Banana",
text = { text = {
@ -3563,6 +3573,7 @@ return {
cry_debuff_obsidian_orb = "Aplica las habilidades de todos los jefes derrotados", cry_debuff_obsidian_orb = "Aplica las habilidades de todos los jefes derrotados",
k_code = "Código", k_code = "Código",
k_chips = "fichas",
k_unique = "Único", k_unique = "Único",
b_code_cards = "Cartas de código", b_code_cards = "Cartas de código",
b_unique_cards = "Cartas únicas", b_unique_cards = "Cartas únicas",

View file

@ -65,8 +65,8 @@ return {
name = "Baraja crítica", name = "Baraja crítica",
text = { text = {
"Después de cada mano jugada,", "Después de cada mano jugada,",
"{C:green}#1# en 4{} probabilidades para {X:dark_edition,C:white} ^2 {} multi", "{C:green}#1# en #2#{} 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 #3#{} probabilidades para {X:dark_edition,C:white} ^0.5 {} multi",
}, },
}, },
b_cry_e_deck = { b_cry_e_deck = {
@ -188,7 +188,7 @@ return {
name = "Baraja legendaria", name = "Baraja legendaria",
text = { text = {
"Comienza con un comodín {C:legendary}legendario{C:legendary}", "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", "cuando se derrota a la ciega jefe",
"{C:inactive}(debe haber espacio){}", "{C:inactive}(debe haber espacio){}",
}, },
@ -406,7 +406,7 @@ return {
}, },
}, },
c_cry_crash = { c_cry_crash = {
name = "://CHOQUE", name = "://CRASH",
text = { text = {
"{C:cry_code,E:1}No.", "{C:cry_code,E:1}No.",
}, },
@ -651,7 +651,7 @@ return {
set_cry_poker_hand_stuff = { set_cry_poker_hand_stuff = {
name = "Manos de póker", name = "Manos de póker",
text = { 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", "y habilita {C:attention}Manos ascendidas",
}, },
}, },
@ -800,6 +800,16 @@ return {
"{C:inactive}(Actual: {X:mult,C:white}X#2#{C:inactive} multi)", "{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 = { Joker = {
j_cry_test_modest = { j_cry_test_modest = {
@ -925,6 +935,15 @@ return {
"{C:inactive,s:0.8}La categoría no cambia", "{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 = { j_cry_blender = {
name = "Blender", name = "Blender",
text = { text = {
@ -1149,6 +1168,18 @@ return {
"una {E:1,C:attention}Pareja suprema", "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 = { j_cry_clicked_cookie = {
name = "Galleta clickeada", name = "Galleta clickeada",
text = { text = {
@ -1301,6 +1332,21 @@ return {
"de su respectivo {C:attention}tipo{}", "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 = { j_cry_discreet = {
name = "Comodín discreto", name = "Comodín discreto",
text = { text = {
@ -1462,6 +1508,15 @@ return {
"{C:attention}#2#{} o menos veces", "{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 = { j_cry_filler = {
name = "El relleno", name = "El relleno",
text = { text = {
@ -1514,6 +1569,13 @@ return {
"un {C:attention}#2#", "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 = { j_cry_formidiulosus = {
name = "Formidiulosus", name = "Formidiulosus",
text = { text = {
@ -1618,7 +1680,7 @@ return {
"{X:dark_edition,C:white}^#1#{} multi sólo después de", "{X:dark_edition,C:white}^#1#{} multi sólo después de",
"jugar {C:attention}114{} manos{}", "jugar {C:attention}114{} manos{}",
"{C:inactive}(Actual: #2#/114){}", "{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 = { j_cry_home = {
@ -1644,7 +1706,7 @@ return {
j_cry_huntingseason = { j_cry_huntingseason = {
name = "Época de caza", name = "Época de caza",
text = { 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", "{C:red}destruye{} la carta {C:attention}central{} después de puntuar",
}, },
}, },
@ -1658,7 +1720,7 @@ return {
}, },
}, },
j_cry_jawbreaker = { j_cry_jawbreaker = {
name = "Jawbreaker", name = "Rompemuelas",
text = { text = {
"Al derrotar la {C:attention}ciega jefe,", "Al derrotar la {C:attention}ciega jefe,",
"{C:attention}duplica{} los valores de los comodines adyacentes", "{C:attention}duplica{} los valores de los comodines adyacentes",
@ -1708,6 +1770,14 @@ return {
"o {C:attention}tipo fichas{} es vendido", "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 = { j_cry_kooky = {
name = "Comodín raro", name = "Comodín raro",
text = { text = {
@ -1769,7 +1839,7 @@ return {
"{C:attention}Reactiva{} todos los comodines", "{C:attention}Reactiva{} todos los comodines",
"una vez por cada {C:attention}comodín{}", "una vez por cada {C:attention}comodín{}",
"{C:attention}contento{} vendido esta ronda", "{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...{}", "{C:inactive,s:0.8}No había suficiente espacio...{}",
}, },
}, },
@ -1868,7 +1938,7 @@ return {
"{C:attention}primer descarte{} de cada ronda", "{C:attention}primer descarte{} de cada ronda",
}, },
}, },
j_cry_Megg = { j_cry_megg = {
name = "Muevo", name = "Muevo",
text = { text = {
"Vende esta carta para crear", "Vende esta carta para crear",
@ -1890,8 +1960,7 @@ return {
"{X:mult,C:white}X#1#{} multi por cada miembro", "{X:mult,C:white}X#1#{} multi por cada miembro",
"en el {C:attention}Discord de Cryptid{}", "en el {C:attention}Discord de Cryptid{}",
"{C:inactive}(Actual: {X:mult,C:white}X#2#{C:inactive} multi)", "{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{}",
"{C:blue,s:0.7}https://discord.gg/cryptid{}",
}, },
}, },
j_cry_membershipcardtwo = { j_cry_membershipcardtwo = {
@ -1900,7 +1969,7 @@ return {
"{C:chips}+#1#{} ficha#<s>1# por cada miembro", "{C:chips}+#1#{} ficha#<s>1# por cada miembro",
"en el {C:attention}Discord de Cryptid{}", "en el {C:attention}Discord de Cryptid{}",
"{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)", "{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 = { j_cry_membershipcardtwo_balanced = {
@ -1909,7 +1978,7 @@ return {
"{C:chips}+#1#{} ficha#<s>1# por cada {C:attention}8{} miembros", "{C:chips}+#1#{} ficha#<s>1# por cada {C:attention}8{} miembros",
"en el {C:attention}Discord de Cryptid{}", "en el {C:attention}Discord de Cryptid{}",
"{C:inactive}(Actual: {C:chips}+#2#{C:inactive} fichas)", "{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 = { j_cry_meteor = {
@ -2302,7 +2371,7 @@ return {
}, },
}, },
j_cry_scrabble = { j_cry_scrabble = {
name = "Teja de Scrabble", name = "Ficha de Scrabble",
text = { text = {
"{C:green}#1# en #2#{} probabilidades de crear", "{C:green}#1# en #2#{} probabilidades de crear",
"un comodín {C:green}inusual{} {C:dark_edition}contento", "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...?"', '{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 = { j_cry_spaceglobe = {
name = "Esfera celestial", name = "Esfera celestial",
text = { text = {
@ -2531,6 +2615,13 @@ return {
"un {C:attention}#2#", "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 = { j_cry_trick_or_treat = {
name = "Dulce o truco", name = "Dulce o truco",
text = { text = {
@ -3094,6 +3185,14 @@ return {
"de tu mano al azar", "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 = { c_cry_vacuum = {
name = "Vacío", name = "Vacío",
text = { text = {
@ -3536,14 +3635,7 @@ return {
"una {C:attention}Carta de eco", "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 = { c_cry_theblessing = {
name = "La bendición", name = "La bendición",
text = { text = {
@ -3845,6 +3937,15 @@ return {
}, },
}, },
Other = { 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 = { disabled = {
name = "Deshabilitado", name = "Deshabilitado",
text = { text = {
@ -4391,7 +4492,7 @@ return {
ach_cry_pull_request = "Haz que ://COMMIT haga aparecer el mismo comodín que destruyó", 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_traffic_jam = "Gana todos los desafíos Hora punta",
ach_cry_ult_full_skip = "Gana en 1 ronda", 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_what_have_you_done = "Elimina o sacrifica un comodín exótico",
ach_cry_pin = "Pierde una partida contra El Alfiler", ach_cry_pin = "Pierde una partida contra El Alfiler",
}, },
@ -4465,6 +4566,7 @@ return {
cry_joke_placeholder = "(múltiplo of 8)", cry_joke_placeholder = "(múltiplo of 8)",
k_code = "Código", k_code = "Código",
k_chips = "fichas",
k_content_set = "Set temático", k_content_set = "Set temático",
b_content_sets = "Sets temáticos", b_content_sets = "Sets temáticos",
--Why aren't these in vanilla? --Why aren't these in vanilla?

View file

@ -111,8 +111,8 @@ return {
name = "Jeu Critique", name = "Jeu Critique",
text = { text = {
"Après chaque main jouée,", "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 #2#{} 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 #3#{} d'obtenir {X:dark_edition,C:white} ^0.5 {} Multi",
}, },
unlock = { unlock = {
"Obtenir un {C:attention}Joker Truqué", "Obtenir un {C:attention}Joker Truqué",
@ -285,7 +285,7 @@ return {
name = "Jeu Légendaire", name = "Jeu Légendaire",
text = { text = {
"Démarre avec un Joker {C:legendary}Légendaire{C:legendary}", "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", "lorsque la Blinde de Boss est battue",
"{C:inactive}(selon la place disponible)", "{C:inactive}(selon la place disponible)",
}, },
@ -307,7 +307,8 @@ return {
name = "L'Horloge", name = "L'Horloge",
text = { text = {
"+0.1X du score requis toutes", "+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 = { bl_cry_hammer = {
@ -335,7 +336,8 @@ return {
name = "Boucle Lavande", name = "Boucle Lavande",
text = { text = {
"1.25X du score requis toutes les", "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 = { bl_cry_obsidian_orb = {
@ -412,6 +414,37 @@ return {
"rareté supérieure sont affaiblis", "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 = { bl_cry_pinkbow = {
name = "Nœud Rose", name = "Nœud Rose",
text = { text = {
@ -422,9 +455,9 @@ return {
bl_cry_scorch = { bl_cry_scorch = {
name = "La Grille", name = "La Grille",
text = { text = {
"Must play 5 cards,", "5 cartes doivent être jouées,",
"destroy played and", "toutes les cartes jouées",
"discarded cards", "et défaussées sont détruites",
}, },
}, },
bl_cry_sapphire_stamp = { bl_cry_sapphire_stamp = {
@ -490,8 +523,25 @@ return {
"sont affaiblis", "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 = { 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 = { c_cry_alttab = {
name = "://ALTTAB", name = "://ALTTAB",
text = { text = {
@ -518,7 +568,7 @@ return {
c_cry_crash = { c_cry_crash = {
name = "://CRASH", name = "://CRASH",
text = { text = {
"{C:cry_code,E:1}Ne le faites pas.", "{C:cry_code,E:1}Ne le fais pas.",
}, },
}, },
c_cry_ctrl_v = { c_cry_ctrl_v = {
@ -555,12 +605,26 @@ return {
"{C:inactive,s:0.8}découvertes pour être valides", "{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 = { c_cry_hook = {
name = "ACCROCHER://", name = "ACCROCHER://",
text = { text = {
"Les deux jokers sélectionnés deviennent {C:cry_code}Accrochés", "Applique {C:cry_code}Accroché{} à",
"{C:inactive,s:0.8}Ne marche seulement si les Jokers se déclenchent dans le même contexte,", "2 Jokers sélectionnés",
"{C:inactive,s:0.8}comme Joker et Le Duo (les deux après le compte)",
}, },
}, },
c_cry_inst = { c_cry_inst = {
@ -571,6 +635,21 @@ return {
"{C:inactive}(si possible){}", "{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 = { c_cry_machinecode = {
name = "://MACHINECODE", name = "://MACHINECODE",
text = { text = {
@ -596,6 +675,13 @@ return {
"la fin de la manche", "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 = { c_cry_patch = {
name = "://PATCH", name = "://PATCH",
text = { text = {
@ -620,6 +706,14 @@ return {
"{C:inactive}(Currently {C:cry_code}+#2#{C:inactive})", "{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 = { c_cry_reboot = {
name = "://REDÉMARRAGE", name = "://REDÉMARRAGE",
text = { text = {
@ -671,6 +765,13 @@ return {
"Nourriture {C:cry_code}Glitché", "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 = { c_cry_variable = {
name = "://VARIABLE", name = "://VARIABLE",
text = { text = {
@ -678,6 +779,15 @@ return {
"en un rang {C:cry_code}choisi{}", "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"] = { ["Content Set"] = {
set_cry_blind = { set_cry_blind = {
@ -731,6 +841,13 @@ return {
"et au {C:attention}Joker Joyeux", "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 = { set_cry_misc = {
name = "Divers", name = "Divers",
text = { text = {
@ -757,7 +874,7 @@ return {
set_cry_poker_hand_stuff = { set_cry_poker_hand_stuff = {
name = "Mains de poker supplémentaires", name = "Mains de poker supplémentaires",
text = { 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", "et active les {C:attention}mains ascensionnées",
}, },
}, },
@ -839,6 +956,7 @@ return {
"{C:green}#1# chance#<s>1# sur #2#{} de", "{C:green}#1# chance#<s>1# sur #2#{} de",
"ne pas {C:red}détruire{} cette carte", "ne pas {C:red}détruire{} cette carte",
"lorsqu'elle est déclenchée", "lorsqu'elle est déclenchée",
"{C:inactive}Non-truquable{}",
}, },
}, },
e_cry_glitched = { e_cry_glitched = {
@ -906,6 +1024,16 @@ return {
"{C:inactive}(Actuellement {X:mult,C:white}X#2#{C:inactive} Multi)", "{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 = { Joker = {
j_cry_test_modest = { j_cry_test_modest = {
@ -953,6 +1081,7 @@ return {
"Vendre cette carte crée", "Vendre cette carte crée",
"{C:attention}2{} copies du {C:attention}Joker{} le plus à gauche", "{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,s:0.8}Ne copie pas les Carte Googol Play Nostalgiques{}",
"{C:inactive}(Selon la place disponible){}",
}, },
}, },
j_cry_altgoogol_balanced = { j_cry_altgoogol_balanced = {
@ -1038,6 +1167,16 @@ return {
"{C:inactive,s:0.8}Le rang ne change pas", "{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 = { j_cry_blender = {
name = "Blender", name = "Blender",
text = { text = {
@ -1129,6 +1268,14 @@ return {
"pour {C:mult}-#2#{} Multi", "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 = { j_cry_candy_basket = {
name = "Panier de bonbons", name = "Panier de bonbons",
text = { text = {
@ -1272,6 +1419,18 @@ return {
"comme main gagnante", "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 = { j_cry_clicked_cookie = {
name = "Cookie cliqué", -- the joke works better in french :3c name = "Cookie cliqué", -- the joke works better in french :3c
text = { text = {
@ -1426,6 +1585,21 @@ return {
"contient une {C:attention}#2#", "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 = { j_cry_digitalhallucinations = {
name = "Hallucinations digitales", name = "Hallucinations digitales",
text = { text = {
@ -1597,7 +1771,7 @@ return {
}, },
}, },
j_cry_highfive = { j_cry_highfive = {
name = "High five", name = "Tapes-m'en-Cinq",
text = { text = {
"Si le rang le plus haut {C:attention}marqué{}", "Si le rang le plus haut {C:attention}marqué{}",
"est un {C:attention}5{}, convertit {C:attention}toutes{} les cartes marquées", "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", "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 = { j_cry_filler = {
name = "Le filler", -- "english word used in french" moment name = "Le filler", -- "english word used in french" moment
text = { text = {
@ -1665,6 +1848,14 @@ return {
"une {C:attention}#2#", "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 = { j_cry_formidiulosus = {
name = "Formidiulosus", name = "Formidiulosus",
text = { text = {
@ -1809,6 +2000,7 @@ return {
"{C:attention}#2#{} fois,", "{C:attention}#2#{} fois,",
"chaque carte jouée donne", "chaque carte jouée donne",
"{X:mult,C:white} X#1# {} Multi lorsqu'elle est comptée", "{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 = { j_cry_jawbreaker = {
@ -1907,6 +2099,7 @@ return {
"Les {C:attention}Rois{} comptés donnent", "Les {C:attention}Rois{} comptés donnent",
"{C:attention}+#1#{} à la taille de la main cette manche", "{C:attention}+#1#{} à la taille de la main cette manche",
"et redéclenchent les effets des cartes {C:attention}tenues en main{}", "et redéclenchent les effets des cartes {C:attention}tenues en main{}",
"{C:inactive}(Actuellement {}{C:attention}+#2#{}{C:inactive})",
}, },
}, },
j_cry_lightupthenight = { j_cry_lightupthenight = {
@ -2028,7 +2221,7 @@ return {
"{C:attention}première défausse{} de chaque manche", "{C:attention}première défausse{} de chaque manche",
}, },
}, },
j_cry_Megg = { j_cry_megg = {
name = "Mœuf", name = "Mœuf",
text = { text = {
"Vendre cette carte crée", "Vendre cette carte crée",
@ -2050,7 +2243,7 @@ return {
"{X:mult,C:white}X#1#{} Multi pour chaque membre", "{X:mult,C:white}X#1#{} Multi pour chaque membre",
"dans le {C:attention}serveur Discord{} de {C:attention}Cryptid{}", "dans le {C:attention}serveur Discord{} de {C:attention}Cryptid{}",
"{C:inactive}(Actuellement {X:mult,C:white}X#2#{C:inactive} Multi)", "{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 = { j_cry_membershipcardtwo = {
@ -2059,7 +2252,7 @@ return {
"{C:chips}+#1#{} Jeton#<s>1# pour chaque membre", "{C:chips}+#1#{} Jeton#<s>1# pour chaque membre",
"dans le {C:attention}serveur Discord{} de {C:attention}Cryptid{}", "dans le {C:attention}serveur Discord{} de {C:attention}Cryptid{}",
"{C:inactive}(Actuellement {C:chips}+#2#{C:inactive} Jeton#<s>2#)", "{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 = { j_cry_membershipcardtwo_balanced = {
@ -2068,7 +2261,7 @@ return {
"{C:chips}+#1#{} Jeton#<s>1# tous les {C:attention}8{} membres", "{C:chips}+#1#{} Jeton#<s>1# tous les {C:attention}8{} membres",
"dans le {C:attention}serveur Discord{} de {C:attention}Cryptid{}", "dans le {C:attention}serveur Discord{} de {C:attention}Cryptid{}",
"{C:inactive}(Actuellement {C:chips}+#2#{C:inactive} Jeton#<s>2#)", "{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 = { j_cry_meteor = {
@ -2305,6 +2498,14 @@ return {
"donne un {C:attention}Badge{} aléatoire", "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 = { j_cry_pot_of_jokes = {
name = "Pot de Blagues", name = "Pot de Blagues",
text = { text = {
@ -2526,8 +2727,9 @@ return {
"{C:attention}+#1#{} emplacement#<s>1# de coupon", "{C:attention}+#1#{} emplacement#<s>1# de coupon",
}, },
unlock = { unlock = {
"Win a run with", "Gagner une partie",
"only {C:attention}High Card", "avec uniquement",
"des {C:attention}Carte Haute",
}, },
}, },
j_cry_fleshpanopticon = { j_cry_fleshpanopticon = {
@ -2540,6 +2742,71 @@ return {
'{C:inactive,s:0.8}"This prison... to hold... me?"', '{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 = { j_cry_spaceglobe = {
name = "Globe Céleste", name = "Globe Céleste",
text = { text = {
@ -2691,6 +2958,43 @@ return {
"contient une {C:attention}#2#", "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 = { j_cry_trick_or_treat = {
name = "Des bonbons ou un sort!", name = "Des bonbons ou un sort!",
text = { text = {
@ -2720,7 +3024,7 @@ return {
text = { text = {
"Vendre cette carte", "Vendre cette carte",
"{C:attention}multiplie{} les valeurs", "{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 = { j_cry_unity = {
@ -2883,7 +3187,7 @@ return {
}, },
Planet = { Planet = {
c_cry_Klubi = { c_cry_Klubi = {
name = "Klubi", name = "Risti",
text = { text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Améliore", "Améliore",
@ -2893,7 +3197,7 @@ return {
}, },
}, },
c_cry_Lapio = { c_cry_Lapio = {
name = "Lapio", name = "Pata",
text = { text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Améliore", "Améliore",
@ -2912,6 +3216,16 @@ return {
"et {C:attention}#3#{}", "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 = { c_cry_nstar = {
name = "Étoile à neutrons", name = "Étoile à neutrons",
text = { text = {
@ -2933,7 +3247,7 @@ return {
}, },
}, },
c_cry_Sydan = { c_cry_Sydan = {
name = "Sydan", name = "Hertta",
text = { text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Améliore", "Améliore",
@ -2943,7 +3257,7 @@ return {
}, },
}, },
c_cry_Timantti = { c_cry_Timantti = {
name = "Timantti", name = "Ruutu",
text = { text = {
"({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})",
"Améliore", "Améliore",
@ -2998,6 +3312,26 @@ return {
"{C:inactive}(Actuellement {X:gold,C:white}X(#3#^asc){C:inactive})", "{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 = {
sleeve_cry_beige_sleeve = { sleeve_cry_beige_sleeve = {
@ -3141,12 +3475,22 @@ return {
sleeve_cry_antimatter_sleeve = { sleeve_cry_antimatter_sleeve = {
name = "Pochette d'Antimatière", name = "Pochette d'Antimatière",
text = { text = {
"Applique les {C:attention}effects{}", "Applique les {C:attention}effets{}",
"et autres {C:attention}effets spéciaux{}", "et autres {C:attention}effets spéciaux{}",
"de toutes les autres pochettes", "de toutes les autres pochettes",
"{C:red}WIP", "{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 = { Spectral = {
c_cry_adversary = { c_cry_adversary = {
@ -3170,6 +3514,7 @@ return {
text = { text = {
"Crée {C:attention}#1#{} copie#<s>1# {C:dark_edition}Négatives{}", "Crée {C:attention}#1#{} copie#<s>1# {C:dark_edition}Négatives{}",
"d'un consommable {C:attention}aléatoire", "d'un consommable {C:attention}aléatoire",
"en votre possession",
"{C:inactive,s:0.8}Ne copie pas Chambré{}", "{C:inactive,s:0.8}Ne copie pas Chambré{}",
}, },
}, },
@ -3261,6 +3606,14 @@ return {
"sélectionnée", "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 = { c_cry_vacuum = {
name = "Aspiration", name = "Aspiration",
text = { text = {
@ -3683,6 +4036,30 @@ return {
"{s:0.8,C:inactive}Badges de Copie exclus", "{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 = { Tarot = {
c_cry_automaton = { c_cry_automaton = {
@ -3701,12 +4078,12 @@ return {
"{C:attention}Carte#<s>1# écho", "{C:attention}Carte#<s>1# écho",
}, },
}, },
c_cry_meld = { c_cry_instability = {
name = "le Mélange", name = "Instabilité",
text = { text = {
"Transforme un {C:attention}Joker{} ou", "Transforme jusqu'à {C:attention}#1#{}",
"une {C:attention}carte à jouer{} en", "carte#<s>1# sélectionnée#<s>1# en",
"carte {C:dark_edition}Double-face", "{C:attention}Carte#<s>1# abstraites",
}, },
}, },
c_cry_theblessing = { c_cry_theblessing = {
@ -3873,6 +4250,9 @@ return {
"Les cartes {C:planet}Planète{} apparaissent", "Les cartes {C:planet}Planète{} apparaissent",
"{C:attention}X#1#{} plus souvent", "{C:attention}X#1#{} plus souvent",
"dans la boutique", "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", "Toutes les futures cartes",
"{C:planet}Planète{} sont {C:green}gratuites{}", "{C:planet}Planète{} sont {C:green}gratuites{}",
}, },
@ -3953,8 +4333,11 @@ return {
"Les cartes {C:tarot}Tarot{} apparaissent", "Les cartes {C:tarot}Tarot{} apparaissent",
"{C:attention}X#1#{} plus souvent", "{C:attention}X#1#{} plus souvent",
"dans la boutique", "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", "Toutes les futures cartes",
"{C:tarot}Tarot{} seront {C:green}gratuites{}", "{C:tarot}Tarot{} sont {C:green}gratuites{}",
}, },
unlock = { unlock = {
"Acheter {C:attention}100{} cartes", "Acheter {C:attention}100{} cartes",
@ -4002,12 +4385,21 @@ return {
text = { text = {
"{C:attention}+#1#{} limite", "{C:attention}+#1#{} limite",
"de sélection de cartes", "de sélection de cartes",
"{C:inactive,s:0.7}NOTE: Aura plus de{}", "Toutes les cartes sélectionnées contribuent",
"{C:inactive,s:0.7}fonctionnalités plus tard{}", "aux {C:attention}Mains Ascensionées{}",
}, },
}, },
}, },
Other = { 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 = { disabled = {
name = "Désactivé", name = "Désactivé",
text = { text = {
@ -4062,6 +4454,16 @@ return {
text = { text = {
"Quand ce joker est {C:cry_code}déclenché{},", "Quand ce joker est {C:cry_code}déclenché{},",
"déclenche {C:cry_code}#1#", "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 = { cry_flickering = {
@ -4079,6 +4481,22 @@ return {
"{C:attention}#1#{} déclenchements", "{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 = { cry_possessed = {
name = "Possédé", name = "Possédé",
text = { text = {
@ -4103,10 +4521,11 @@ return {
}, },
}, },
ev_cry_choco0 = { ev_cry_choco0 = {
name = "", name = "Événements possibles",
text = { text = {
"Les détails d'un {C:cry_ascendant,E:1}événement", "{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{}",
"seront affichés ici", "{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 = { ev_cry_choco1 = {
@ -4368,6 +4787,15 @@ return {
"{C:attention}Joker Mème{} parmi {C:attention}#2#{}", "{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 = { undiscovered_code = {
name = "Non découvert", name = "Non découvert",
text = { text = {
@ -4410,6 +4838,12 @@ return {
'{C:inactive,s:0.7}"Je déteste cette carte" - SDM_0, 2024{}{}', '{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 = { Unique = {
c_cry_potion = { c_cry_potion = {
@ -4496,6 +4930,7 @@ return {
["cry_UltPair"] = "Super Paire", ["cry_UltPair"] = "Super Paire",
["cry_WholeDeck"] = Cryptid_config.family_mode and "Jeu complet" or "un putain de jeu complet", ["cry_WholeDeck"] = Cryptid_config.family_mode and "Jeu complet" or "un putain de jeu complet",
["cry-Cluster Bulwark"] = "Capharna-rempart", ["cry-Cluster Bulwark"] = "Capharna-rempart",
["cry_None"] = "Rien",
}, },
poker_hand_descriptions = { poker_hand_descriptions = {
["cry_Bulwark"] = { ["cry_Bulwark"] = {
@ -4515,6 +4950,24 @@ return {
"d'un jeu standard de 52 cartes.", "d'un jeu standard de 52 cartes.",
"Je sais pas quoi dire, mais tu es fou.", "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 = { achievement_names = {
ach_cry_ace_in_crash = "ACE de poche", ach_cry_ace_in_crash = "ACE de poche",
@ -4540,6 +4993,11 @@ return {
ach_cry_pin = "L'épingle de la honte", ach_cry_pin = "L'épingle de la honte",
ach_cry_youre_fucking_kidding = Cryptid_config.family_mode and "J'ai plus besoin de ça" ach_cry_youre_fucking_kidding = Cryptid_config.family_mode and "J'ai plus besoin de ça"
or "Tu te fous de moi", 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 = { achievement_descriptions = {
ach_cry_ace_in_crash = 'check_for_unlock({type = "ace_in_crash"})', 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_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_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_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_ult_full_skip = "Gagner en 1 tour",
ach_cry_used_crash = "Utiliser ://CRASH", ach_cry_used_crash = "Utiliser ://CRASH",
ach_cry_what_have_you_done = "Supprimer ou sacrifier un Joker exotique", ach_cry_what_have_you_done = "Supprimer ou sacrifier un Joker exotique",
ach_cry_pin = "Perdre une partie face à l'Épingle", ach_cry_pin = "Perdre une partie face à l'Épingle",
ach_cry_youre_fucking_kidding = "Défausser " .. localize("cry_WholeDeck", "poker_hands"), 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 = { challenge_names = {
c_cry_ballin = "Ballin'", c_cry_ballin = "Ballin'",
@ -4617,6 +5080,8 @@ return {
k_cry_program_pack = "Paquet Programme", k_cry_program_pack = "Paquet Programme",
k_cry_meme_pack = "Paquet Meme", 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_hit_ex = "Coup critique!",
cry_critical_miss_ex = "Échec critique!", cry_critical_miss_ex = "Échec critique!",
@ -4631,16 +5096,19 @@ return {
cry_debuff_oldflint = "Pas de Couleur", cry_debuff_oldflint = "Pas de Couleur",
cry_debuff_oldmark = "No hands containing a Pair", cry_debuff_oldmark = "No hands containing a Pair",
cry_debuff_obsidian_orb = "Applique les capacités de tous les boss battus", 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_tax_placeholder = "(X0.4 taille de la blinde)",
cry_joke_placeholder = "(multiple de 8)", cry_joke_placeholder = "(multiple de 8)",
k_code = "Code", k_code = "Code",
k_chips = "Jetons",
k_content_set = "Set à thème", k_content_set = "Set à thème",
b_content_sets = "Sets à thème", b_content_sets = "Sets à thème",
--Why aren't these in vanilla? --Why aren't these in vanilla?
b_tag = "Badge", b_tag = "Badge",
b_blind = "Blinde", 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_tarot_rate = "Taux de tarot",
b_planet_rate = "Taux de planète", b_planet_rate = "Taux de planète",
@ -4668,6 +5136,7 @@ return {
b_flip = "RETOURNER", b_flip = "RETOURNER",
b_merge = "FUSIONNER", b_merge = "FUSIONNER",
b_store = "STOCKER",
cry_asc_hands = "Mains Asc.", cry_asc_hands = "Mains Asc.",
cry_p_star = "Étoile", cry_p_star = "Étoile",
@ -4679,6 +5148,7 @@ return {
cry_again_q = "Encore?", cry_again_q = "Encore?",
cry_curse = "Malédiction", cry_curse = "Malédiction",
cry_curse_ex = "Malédiction!", cry_curse_ex = "Malédiction!",
cry_demicolon = "Demi-déclenché!",
cry_sobbing = "À l'aide...", cry_sobbing = "À l'aide...",
cry_gaming = "Gaming", cry_gaming = "Gaming",
cry_gaming_ex = "Gaming!", cry_gaming_ex = "Gaming!",
@ -4697,6 +5167,7 @@ return {
cry_unredeemed = "Plus échangé...", cry_unredeemed = "Plus échangé...",
cry_active = "Actif", cry_active = "Actif",
cry_inactive = "Inactif", cry_inactive = "Inactif",
cry_divorced = "Divorcé!",
k_disable_music = "Désactiver la musique", k_disable_music = "Désactiver la musique",
@ -4707,6 +5178,7 @@ return {
k_planet_disc = "Disque Circumstellaire", k_planet_disc = "Disque Circumstellaire",
k_planet_satellite = "Satellites Naturels", k_planet_satellite = "Satellites Naturels",
k_planet_universe = Cryptid_config.family_mode and "Univers" or "Le putain d'univers", 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_1 = "Jimboule",
cry_notif_jimball_2 = "Notice de droits d'auteur", cry_notif_jimball_2 = "Notice de droits d'auteur",
@ -4747,6 +5219,7 @@ return {
unique = "Unique", unique = "Unique",
cry_rigged = "Truqué", cry_rigged = "Truqué",
cry_hooked = "Accroché", cry_hooked = "Accroché",
cry_global_sticker = "Global",
cry_flickering = "Luisant", cry_flickering = "Luisant",
cry_possessed = "Possédé", cry_possessed = "Possédé",

View file

@ -1222,7 +1222,7 @@ return {
"{C:attention}first discard{} of each round", "{C:attention}first discard{} of each round",
}, },
}, },
j_cry_Megg = { j_cry_megg = {
name = "Megg", name = "Megg",
text = { text = {
"Sell this card to create", "Sell this card to create",
@ -1236,7 +1236,7 @@ return {
"{X:mult,C:white}X#1#{} Mult for each member", "{X:mult,C:white}X#1#{} Mult for each member",
"in the {C:attention}Cryptid Discord{}", "in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)", "{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 = { j_cry_membershipcardtwo = {
@ -1245,7 +1245,7 @@ return {
"{C:chips}+#1#{} Chips for each member", "{C:chips}+#1#{} Chips for each member",
"in the {C:attention}Cryptid Discord{}", "in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)", "{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 = { j_cry_meteor = {
@ -2045,6 +2045,14 @@ return {
"card in your hand", "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 = { c_cry_vacuum = {
name = "Vacuum", name = "Vacuum",
text = { text = {
@ -2477,14 +2485,7 @@ return {
"into an {C:attention}Echo Card", "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 = { c_cry_theblessing = {
name = "The Blessing", name = "The Blessing",
text = { text = {
@ -2716,6 +2717,15 @@ return {
}, },
}, },
Other = { 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 = { banana = {
name = "Banana", name = "Banana",
text = { text = {
@ -3041,6 +3051,7 @@ return {
cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses", cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses",
k_code = "Code", k_code = "Code",
k_chips = "chip",
b_code_cards = "Code Cards", b_code_cards = "Code Cards",
b_pull = "PULL", b_pull = "PULL",
cry_hooked_ex = "Hooked!", cry_hooked_ex = "Hooked!",

View file

@ -1222,7 +1222,7 @@ return {
"{C:attention}first discard{} of each round", "{C:attention}first discard{} of each round",
}, },
}, },
j_cry_Megg = { j_cry_megg = {
name = "Megg", name = "Megg",
text = { text = {
"Sell this card to create", "Sell this card to create",
@ -1236,7 +1236,7 @@ return {
"{X:mult,C:white}X#1#{} Mult for each member", "{X:mult,C:white}X#1#{} Mult for each member",
"in the {C:attention}Cryptid Discord{}", "in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)", "{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 = { j_cry_membershipcardtwo = {
@ -1245,7 +1245,7 @@ return {
"{C:chips}+#1#{} Chips for each member", "{C:chips}+#1#{} Chips for each member",
"in the {C:attention}Cryptid Discord{}", "in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)", "{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 = { j_cry_meteor = {
@ -2045,6 +2045,14 @@ return {
"card in your hand", "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 = { c_cry_vacuum = {
name = "Vacuum", name = "Vacuum",
text = { text = {
@ -2477,14 +2485,6 @@ return {
"into an {C:attention}Echo Card", "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 = { c_cry_theblessing = {
name = "The Blessing", name = "The Blessing",
text = { text = {
@ -2716,6 +2716,15 @@ return {
}, },
}, },
Other = { Other = {
alt_wheel_of_fortune = {
name = "運命の輪",
text = {
"{C:green}#2#分の#1#{} の確率で",
"ランダムな {C:attention}ジョーカー{} に",
"{C:dark_edition}フォイル{}、 {C:dark_edition}ホログラム{}",
"{C:dark_edition}ポリクローム{} エディションのいずれかを加える",
},
},
banana = { banana = {
name = "Banana", name = "Banana",
text = { text = {
@ -3041,6 +3050,7 @@ return {
cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses", cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses",
k_code = "Code", k_code = "Code",
k_chips = "チップ",
b_code_cards = "Code Cards", b_code_cards = "Code Cards",
b_pull = "PULL", b_pull = "PULL",
cry_hooked_ex = "Hooked!", 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", "{C:attention}first discard{} of each round",
}, },
}, },
j_cry_Megg = { j_cry_megg = {
name = "Megg", name = "Megg",
text = { text = {
"Sell this card to create", "Sell this card to create",
@ -1239,7 +1239,7 @@ return {
"{X:mult,C:white}X#1#{} Mult for each member", "{X:mult,C:white}X#1#{} Mult for each member",
"in the {C:attention}Cryptid Discord{}", "in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)", "{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 = { j_cry_membershipcardtwo = {
@ -1248,7 +1248,7 @@ return {
"{C:chips}+#1#{} Chips for each member", "{C:chips}+#1#{} Chips for each member",
"in the {C:attention}Cryptid Discord{}", "in the {C:attention}Cryptid Discord{}",
"{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)", "{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 = { j_cry_meteor = {
@ -2049,6 +2049,14 @@ return {
"card in your hand", "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 = { c_cry_vacuum = {
name = "Vacuum", name = "Vacuum",
text = { text = {
@ -2481,14 +2489,6 @@ return {
"into an {C:attention}Echo Card", "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 = { c_cry_theblessing = {
name = "The Blessing", name = "The Blessing",
text = { text = {
@ -2720,6 +2720,15 @@ return {
}, },
}, },
Other = { 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 = { banana = {
name = "Banana", name = "Banana",
text = { text = {
@ -3044,6 +3053,7 @@ return {
cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses", cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses",
k_code = "Code", k_code = "Code",
k_chips = "fiches",
b_code_cards = "Code Cards", b_code_cards = "Code Cards",
b_pull = "PULL", b_pull = "PULL",
cry_hooked_ex = "Hooked!", cry_hooked_ex = "Hooked!",

View file

@ -52,8 +52,8 @@ return {
name = "Krytyczna Talia", name = "Krytyczna Talia",
text = { text = {
"Po każdej zagranej ręce,", "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 #2#{} 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 #3#{} szans na mnożnik {X:dark_edition,C:white} ^0.5 {}",
}, },
}, },
b_cry_encoded = { b_cry_encoded = {
@ -136,7 +136,7 @@ return {
name = "Legendarna Talia", name = "Legendarna Talia",
text = { text = {
"Rozpoczynasz podejście z {C:legendary}legendarnym{C:legendary} jokerem", "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", "po pokonaniu przeszkadzajki bossa",
"{C:inactive}(wymaga miejsca){}", "{C:inactive}(wymaga miejsca){}",
}, },
@ -1426,7 +1426,7 @@ return {
"{C:attention}pierwsza zrzutka{} rundy", "{C:attention}pierwsza zrzutka{} rundy",
}, },
}, },
j_cry_Megg = { j_cry_megg = {
name = "M-Jajko", name = "M-Jajko",
text = { text = {
"Sprzedaj tę kartę, aby stworzyć", "Sprzedaj tę kartę, aby stworzyć",
@ -1448,7 +1448,7 @@ return {
"Mnoż. {X:mult,C:white}X#1#{} za każdego członka", "Mnoż. {X:mult,C:white}X#1#{} za każdego członka",
"discordowego serwera {C:attention}Cryptid{}", "discordowego serwera {C:attention}Cryptid{}",
"{C:inactive}(obecny mnoż.: {X:mult,C:white}X#2#{C:inactive}", "{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 = { j_cry_membershipcardtwo = {
@ -1457,7 +1457,7 @@ return {
"{C:chips}+#1#{} za każdego członka", "{C:chips}+#1#{} za każdego członka",
"discordowego serwera {C:attention}Cryptid{}", "discordowego serwera {C:attention}Cryptid{}",
"{C:inactive}(obecnie: {C:chips}+#2#{C:inactive} żet.)", "{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 = { j_cry_meteor = {
@ -2475,6 +2475,14 @@ return {
"karty w ręcę", "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 = { c_cry_vacuum = {
name = "Próżnia", name = "Próżnia",
text = { text = {
@ -2907,14 +2915,6 @@ return {
"do: {C:attention}Karta Echa", "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 = { c_cry_theblessing = {
name = "Błogosławieństwo", name = "Błogosławieństwo",
text = { text = {
@ -3141,6 +3141,15 @@ return {
}, },
}, },
Other = { 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 = { banana = {
name = "Bananowy", name = "Bananowy",
text = { text = {
@ -3653,6 +3662,7 @@ return {
cry_debuff_obsidian_orb = "Aplikuje zdolności wszystkich pokonanych bossów", cry_debuff_obsidian_orb = "Aplikuje zdolności wszystkich pokonanych bossów",
k_code = "Kod", k_code = "Kod",
k_chips = "żet",
k_unique = "Unikalny", k_unique = "Unikalny",
b_code_cards = "Karty Kodowe", b_code_cards = "Karty Kodowe",
b_unique_cards = "Unikalne Karty", b_unique_cards = "Unikalne Karty",

View file

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

View file

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

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