diff --git a/Cryptid.lua b/Cryptid.lua index 9ddd68640..34b9ec323 100644 --- a/Cryptid.lua +++ b/Cryptid.lua @@ -238,7 +238,6 @@ function SMODS.injectItems(...) Cryptid.inject_pointer_aliases() --this has to be here because the colors dont exist earlier then this - Cryptid.circus_rarities = Cryptid.circus_rarities or {} 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 } @@ -246,15 +245,6 @@ function SMODS.injectItems(...) { rarity = "cry_exotic", base_mult = 20, order = 4, colour = G.C.RARITY.cry_exotic } Cryptid.reload_localization() - local keys = {} - local a_keys = {} - for i, v in pairs(SMODS.calculation_keys) do - if not keys[v] then - a_keys[#a_keys + 1] = v - end - keys[v] = true - end - SMODS.calculation_keys = a_keys end local old_repitions = SMODS.calculate_repetitions diff --git a/README.md b/README.md index ae03e6710..11102d049 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,7 @@ # Cryptid An unbalanced Balatro mod. -Note: Cryptid requires [Steamodded](https://github.com/Steamopollys/Steamodded/archive/refs/heads/main.zip) -[Talisman](https://github.com/SpectralPack/Talisman/archive/refs/heads/main.zip) may be used to increase the score cap but isnt required. - +Note: Cryptid requires [Steamodded](https://github.com/Steamopollys/Steamodded/archive/refs/heads/main.zip) and [Talisman](https://github.com/SpectralPack/Talisman/archive/refs/heads/main.zip). Cryptid currently adds: @@ -19,13 +17,13 @@ Cryptid currently adds: ### Frequently asked questions * Credit to @jenwalter666 for creating this FAQ (forwarded from Cryptid Discord) -* Edits to reflect some changed made by @lord.ruby ## General > *My game is crashing on startup/something doesn't appear to be loading!* Make sure everything is properly installed. +For Talisman, the folder that contains Talisman should be named `Talisman`. If you've downloaded the source code from GitHub (by clicking on [Code] and then [Download ZIP]), the folder within the ZIP may be called `Talisman-main`, which will cause a problem. Simply rename the folder(s) so that the `-main` part of the name is removed, so that the folder is just called `Talisman`. Whenever you are manually updating Talisman or Cryptid, or any other mod for that matter, it's a good approach to instead delete the contents of the folder, then install the contents of the folder from the ZIP into the existing folder to avoid having to constantly rename the folder over and over. For automatic updates, try using the [automatic update script](https://discord.com/channels/1264429948970733782/1268911536638787625). It could also be that Steamodded is out of date, sometimes mods may use features of a new version that's absent in an older version, but don't change the version that they ask for. @@ -45,7 +43,7 @@ If they show up red, that means there's a problem. Hover over the mod icon (whic You can disable some features of the mod by opening your Mods, clicking [Cryptid], going over to the Config tab, and clicking Thematic Sets. There, you can toggle various Cryptid additions on or off as you see fit. You can also enable/disable certain music tracks in the Music tab. If you're a streamer, consider disabling the Jimball music for your safety! -> *I'm hitting "naneinf"/"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 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)! diff --git a/assets/1x/atlasepic.png b/assets/1x/atlasepic.png index e35d89cb2..f35ae50cb 100644 Binary files a/assets/1x/atlasepic.png and b/assets/1x/atlasepic.png differ diff --git a/assets/1x/atlasexotic.png b/assets/1x/atlasexotic.png index 8beed996d..94866c67b 100644 Binary files a/assets/1x/atlasexotic.png and b/assets/1x/atlasexotic.png differ diff --git a/assets/1x/atlastwo.png b/assets/1x/atlastwo.png index 8b258da5f..56283d767 100644 Binary files a/assets/1x/atlastwo.png and b/assets/1x/atlastwo.png differ diff --git a/assets/1x/stake_cry.png b/assets/1x/stake_cry.png index 91091d6e0..abf6de820 100644 Binary files a/assets/1x/stake_cry.png and b/assets/1x/stake_cry.png differ diff --git a/assets/2x/atlasepic.png b/assets/2x/atlasepic.png index f8553a591..3104e41dc 100644 Binary files a/assets/2x/atlasepic.png and b/assets/2x/atlasepic.png differ diff --git a/assets/2x/atlasexotic.png b/assets/2x/atlasexotic.png index 855003843..501f13eba 100644 Binary files a/assets/2x/atlasexotic.png and b/assets/2x/atlasexotic.png differ diff --git a/assets/2x/atlastwo.png b/assets/2x/atlastwo.png index 2cf75b0e3..b4be4348f 100644 Binary files a/assets/2x/atlastwo.png and b/assets/2x/atlastwo.png differ diff --git a/assets/2x/stake_cry.png b/assets/2x/stake_cry.png index 20b9bf16b..38ff8b995 100644 Binary files a/assets/2x/stake_cry.png and b/assets/2x/stake_cry.png differ diff --git a/assets/shaders/glitched_b.fs b/assets/shaders/glitched_b.fs new file mode 100644 index 000000000..409507dec --- /dev/null +++ b/assets/shaders/glitched_b.fs @@ -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(int 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(int 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 diff --git a/assets/sounds/ExponentialChips.wav b/assets/sounds/ExponentialChips.wav deleted file mode 100644 index 40d3b3b55..000000000 Binary files a/assets/sounds/ExponentialChips.wav and /dev/null differ diff --git a/assets/sounds/ExponentialMult.wav b/assets/sounds/ExponentialMult.wav deleted file mode 100644 index 8eabc4645..000000000 Binary files a/assets/sounds/ExponentialMult.wav and /dev/null differ diff --git a/assets/sounds/MultiplicativeChips.wav b/assets/sounds/MultiplicativeChips.wav deleted file mode 100644 index 8a3e4d94d..000000000 Binary files a/assets/sounds/MultiplicativeChips.wav and /dev/null differ diff --git a/items/achievement.lua b/items/achievement.lua index 543483039..dcfe3363c 100644 --- a/items/achievement.lua +++ b/items/achievement.lua @@ -52,7 +52,19 @@ local haxxor = { end, } ---order 4 was googol play pass +local googol_play_pass = { + object_type = "Achievement", + key = "googol_play_pass", + order = 4, + bypass_all_unlocked = true, + atlas = "cry_achievements", + --reset_on_startup = true, + unlock_condition = function(self, args) + if args.type == "googol_play_rigged" then + return true + end + end, +} local bullet_hell = { object_type = "Achievement", @@ -454,6 +466,7 @@ local technically_positive = { -- Break Infinity: Score more than 1.57e308 in one hand -- H4xx0r: Use a cheat code -- We Told You Not To: Use ://CRASH +-- Googol Play Pass: Rig a Googol Play Card -- Bullet Hell: Have 15 copies of AP Joker -- !niW uoY: Reach Ante -8 -- Now the Fun Begins: Obtain Canvas @@ -484,6 +497,7 @@ local achievement_objects = { what_have_you_done, used_crash, haxxor, + googol_play_pass, pull_request, niw_uoy, jokes_on_you, diff --git a/items/code.lua b/items/code.lua index 944e0f9cc..625309add 100644 --- a/items/code.lua +++ b/items/code.lua @@ -991,7 +991,10 @@ local payload = { end, can_bulk_use = true, use = function(self, card, area, copier) - G.GAME.cry_payload = 3 + G.GAME.cry_payload = to_big((G.GAME.cry_payload or 1)) * to_big(card.ability.interest_mult) + end, + bulk_use = function(self, card, area, copier, number) + G.GAME.cry_payload = to_big((G.GAME.cry_payload or 1)) * to_big(card.ability.interest_mult) ^ to_big(number) end, demicoloncompat = true, force_use = function(self, card, area) @@ -1210,50 +1213,27 @@ local rework = { order = 406, pos = { x = 10, y = 3 }, cost = 4, - loc_vars = function(self, info_queue, card) - local cards = Cryptid.get_highlighted_cards({ G.jokers }, card, 1, 1, function(card) - return card.ability.set == "Joker" - end) - local jkr = cards[1] - if not jkr then - return { - vars = { - "None", - }, - } - end - local found_index = 1 - if jkr.edition then - for i, v in ipairs(G.P_CENTER_POOLS.Edition) do - if v.key == jkr.edition.key then - found_index = i - break - end - end - end - found_index = found_index + 1 - if found_index > #G.P_CENTER_POOLS.Edition then - found_index = found_index - #G.P_CENTER_POOLS.Edition - end - local rework_edition = G.P_CENTER_POOLS.Edition[found_index].key - return { vars = { (G.localization.descriptions.Edition[rework_edition] or {}).name or "ERROR" } } + loc_vars = function(self, info_queue) + info_queue[#info_queue + 1] = + { set = "Tag", key = "tag_cry_rework", specific_vars = { "[edition]", "[joker]", "n" } } + return { vars = {} } end, can_use = function(self, card) local cards = Cryptid.get_highlighted_cards({ G.jokers }, card, 1, 1, function(card) return card.ability.set == "Joker" end) return #cards == 1 + and not cards[1].ability.eternal and cards[1].ability.name - ~= ("cry-meteor" or "cry-exoplanet" or "cry-stardust" or "cry_cursed" or "Diet Cola") + ~= ("cry-meteor" or "cry-exoplanet" or "cry-stardust" or "cry_cursed" or ("Diet Cola" or Card.get_gameset( + card + ) == "madness")) end, use = function(self, card, area, copier) local cards = Cryptid.get_highlighted_cards({ G.jokers }, card, 1, 1, function(card) return card.ability.set == "Joker" end) local jkr = cards[1] - if not jkr then - return - end local found_index = 1 if jkr.edition then for i, v in ipairs(G.P_CENTER_POOLS.Edition) do @@ -1267,13 +1247,22 @@ local rework = { if found_index > #G.P_CENTER_POOLS.Edition then found_index = found_index - #G.P_CENTER_POOLS.Edition end - local rework_edition = G.P_CENTER_POOLS.Edition[found_index].key + local tag = Tag("tag_cry_rework") + if not tag.ability then + tag.ability = {} + end + if jkr.config.center.key == "c_base" then + jkr.config.center.key = "j_scholar" + end + tag.ability.rework_key = jkr.config.center.key + tag.ability.rework_edition = G.P_CENTER_POOLS.Edition[found_index].key + add_tag(tag) --SMODS.Tags.tag_cry_rework.apply(tag, {type = "store_joker_create"}) G.E_MANAGER:add_event(Event({ trigger = "before", delay = 0.75, func = function() - jkr:set_edition(rework_edition) + jkr:start_dissolve() return true end, })) @@ -1283,6 +1272,84 @@ local rework = { self:use(card, area) end, } +-- Rework Tag +-- Upgraded edition refers to the next edition along in the collection; base -> foil -> holo -> poly -> negative -> etc +local rework_tag = { + cry_credits = { + idea = { + "HexaCryonic", + }, + art = { + "HexaCryonic", + }, + code = { + "Math", + }, + }, + dependencies = { + items = { + "c_cry_rework", + }, + }, + object_type = "Tag", + atlas = "tag_cry", + name = "cry-Rework Tag", + order = 610, + pos = { x = 0, y = 3 }, + config = { type = "store_joker_create" }, + key = "rework", + ability = { rework_edition = nil, rework_key = nil }, + loc_vars = function(self, info_queue, tag) + local function p(w) + r = "" + local vowels = { "a", "e", "i", "o", "u" } + for i, v in ipairs(vowels) do + if string.sub(string.lower(w), 1, 1) == v then + r = "n" + break + end + end + return r + end + local ed = Cryptid.safe_get(tag, "ability", "rework_edition") + and localize({ type = "name_text", set = "Edition", key = tag.ability.rework_edition }) + or "[" .. string.lower(localize("k_edition")) .. "]" + return { + vars = { + ed, + Cryptid.safe_get(tag, "ability", "rework_key") + and localize({ type = "name_text", set = "Joker", key = tag.ability.rework_key }) + or "[" .. string.lower(localize("k_joker")) .. "]", + string.sub(ed, 1, 1) ~= "[" and p(ed) or "n", + }, + } + end, + apply = function(self, tag, context) + if context.type == "store_joker_create" then + local card = create_card("Joker", context.area, nil, nil, nil, nil, (tag.ability.rework_key or "j_scholar")) + create_shop_card_ui(card, "Joker", context.area) + card:set_edition((tag.ability.rework_edition or "e_foil"), true, nil, true) + card.states.visible = false + tag:yep("+", G.C.FILTER, function() + card:start_materialize() + return true + end) + tag.triggered = true + G.E_MANAGER:add_event(Event({ + trigger = "after", + delay = 0.5, + func = function() + save_run() --fixes savescum bugs hopefully? + return true + end, + })) + return card + end + end, + in_pool = function() + return false + end, +} -- ://Merge -- Merges a selected consumable and playing card, destroying the consumable and turning the playing card into a CCD of that consumable local merge = { @@ -1836,6 +1903,9 @@ local seed = { local cards = Cryptid.get_highlighted_cards({ G.jokers, G.hand, G.consumeables, G.pack_cards }, card, 1, 1) if cards[1] then cards[1].ability.cry_rigged = true + if cards[1].config.center.key == "j_cry_googol_play" then + check_for_unlock({ type = "googol_play_rigged" }) + end end if cards[1].area == G.hand then G.E_MANAGER:add_event(Event({ @@ -2059,6 +2129,7 @@ local hook = { gameset_config = { modest = { disabled = true }, mainline = { disabled = false }, + madness = { disabled = false }, experimental = { disabled = false }, }, dependencies = { @@ -2091,8 +2162,6 @@ local hook = { for _, v in ipairs(G.jokers.cards) do if v.sort_id == card1.ability.cry_hook_id then v.ability.cry_hooked = false - v.ability.cry_hook_triggers = 8 - v.ability.cry_hook_triggers_left = 8 end end end @@ -2100,8 +2169,6 @@ local hook = { for _, v in ipairs(G.jokers.cards) do if v.sort_id == card2.ability.cry_hook_id then v.ability.cry_hooked = false - v.ability.cry_hook_triggers = 8 - v.ability.cry_hook_triggers_left = 8 end end end @@ -2109,10 +2176,6 @@ local hook = { card2.ability.cry_hooked = true card1.ability.cry_hook_id = card2.sort_id card2.ability.cry_hook_id = card1.sort_id - card1.ability.cry_hook_triggers = 8 - card1.ability.cry_hook_triggers_left = 8 - card2.ability.cry_hook_triggers = 8 - card2.ability.cry_hook_triggers_left = 8 end end, init = function(self) @@ -2163,13 +2226,7 @@ local hooked = { end var = var or ("[no joker found - " .. (card.ability.cry_hook_id or "nil") .. "]") end - return { - vars = { - var or "hooked Joker", - card.ability.cry_hook_triggers or 8, - card.ability.cry_hook_triggers_left or 8, - }, - } + return { vars = { var or "hooked Joker" } } end, key = "cry_hooked", no_sticker_sheet = true, @@ -2186,28 +2243,10 @@ local hooked = { and not context.forcetrigger and not context.other_context.forcetrigger then - if not card.ability.cry_hook_triggers_left then - card.ability.cry_hook_triggers_left = 8 - card.ability.cry_hook_triggers = 8 - end for i = 1, #G.jokers.cards do if G.jokers.cards[i].sort_id == card.ability.cry_hook_id then local results = Cryptid.forcetrigger(G.jokers.cards[i], context) if results and results.jokers then - card.ability.cry_hook_triggers_left = card.ability.cry_hook_triggers_left - 1 - if to_big(card.ability.cry_hook_triggers_left) <= 0 then - G.E_MANAGER:add_event(Event({ - func = function() - card.ability.cry_hook_id = nil - card.ability.cry_hooked = nil - G.jokers.cards[i].ability.cry_hook_id = nil - G.jokers.cards[i].ability.cry_hooked = nil - G.jokers.cards[i].ability.cry_hook_triggers_left = 8 - card.ability.cry_hook_triggers_left = 8 - return true - end, - })) - end return results.jokers end end @@ -4253,8 +4292,7 @@ local ctrl_v = { end, can_use = function(self, card) local cards = Cryptid.get_highlighted_cards({ G.hand, G.consumeables, G.pack_cards }, card, 1, 1, function(card) - return (card.area ~= G.pack_Cards or card.ability.set == "Default" or card.ability.set == "Enhanced") - and not card.config.center.hidden + return card.area ~= G.pack_Cards or card.ability.set == "Default" or card.ability.set == "Enhanced" end) return #cards == 1 end, @@ -4741,7 +4779,7 @@ local encoded = { end, } -- Code Joker --- Creates a Code card when starting blind +-- Creates a Negative Code card when starting blind local CodeJoker = { dependencies = { items = { @@ -4753,27 +4791,39 @@ local CodeJoker = { name = "cry-CodeJoker", key = "CodeJoker", pos = { x = 2, y = 4 }, + loc_vars = function(self, info_queue, center) + info_queue[#info_queue + 1] = { key = "e_negative_consumable", set = "Edition", config = { extra = 1 } } + return { key = Cryptid.gameset_loc(self, { exp_modest = "modest" }) } + end, extra_gamesets = { "exp_modest" }, rarity = "cry_epic", cost = 11, - order = 302, + order = 301, blueprint_compat = true, demicoloncompat = true, atlas = "atlasepic", calculate = function(self, card, context) - if context.setting_blind and not (context.blueprint_card or self).getting_sliced then - if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then - play_sound("timpani") - local card = create_card("Code", G.consumeables, nil, nil, nil, nil) - card:add_to_deck() - G.consumeables:emplace(card) - card:juice_up(0.3, 0.5) - return nil, true - end + if + context.setting_blind + and not (context.blueprint_card or self).getting_sliced + and (G.GAME.blind:get_type() == "Boss" or Cryptid.gameset(card) ~= "exp_modest") + then + play_sound("timpani") + local card = create_card("Code", G.consumeables, nil, nil, nil, nil) + card:set_edition({ + negative = true, + }) + card:add_to_deck() + G.consumeables:emplace(card) + card:juice_up(0.3, 0.5) + return nil, true end if context.forcetrigger then play_sound("timpani") local card = create_card("Code", G.consumeables, nil, nil, nil, nil) + card:set_edition({ + negative = true, + }) card:add_to_deck() G.consumeables:emplace(card) card:juice_up(0.3, 0.5) @@ -4828,9 +4878,10 @@ local copypaste = { name = "cry-copypaste", key = "copypaste", pos = { x = 3, y = 4 }, - order = 303, + order = 302, config = { extra = { + odds = 2, ckt = nil, }, }, -- what is a ckt @@ -4838,11 +4889,13 @@ local copypaste = { cost = 14, blueprint_compat = true, loc_vars = function(self, info_queue, card) + local num, denom = SMODS.get_probability_vars(card, 1, card and card.ability.extra.odds or 2) return { vars = { - card.ability.extra.ckt and localize("cry_inactive") or localize("cry_active"), - }, - key = Cryptid.gameset_loc(self, { exp_modest = "modest" }), + num, + denom, + }, -- this effectively prevents a copypaste from ever initially misprinting at above 50% odds. still allows rigging/oops + key = Cryptid.gameset_loc(self, { madness = "madness", exp_modest = "modest" }), } end, atlas = "atlasepic", @@ -4877,26 +4930,36 @@ local copypaste = { and not context.consumeable.beginning_end and not card.ability.extra.ckt and Cryptid.gameset(card) ~= "exp_modest" - and not card.ability.used then if #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then - G.E_MANAGER:add_event(Event({ - func = function() - local cards = copy_card(context.consumeable) - cards:add_to_deck() - G.consumeables:emplace(cards) - return true - end, - })) - card_eval_status_text( - context.blueprint_cards or card, - "extra", - nil, - nil, - nil, - { message = localize("k_copied_ex") } - ) - card.ability.extra.ckt = true + if + SMODS.pseudorandom_probability( + card, + "cry_copypaste_joker", + 1, + card and card.ability.extra.odds or 2 + ) + then + G.E_MANAGER:add_event(Event({ + func = function() + local cards = copy_card(context.consumeable) + cards:add_to_deck() + G.consumeables:emplace(cards) + return true + end, + })) + card_eval_status_text( + context.blueprint_cards or card, + "extra", + nil, + nil, + nil, + { message = localize("k_copied_ex") } + ) + if Card.get_gameset(card) ~= "madness" then + card.ability.extra.ckt = true + end + end end elseif context.end_of_round @@ -4943,7 +5006,7 @@ local cut = { pos = { x = 2, y = 2 }, rarity = 2, cost = 7, - order = 304, + order = 303, blueprint_compat = true, perishable_compat = false, demicoloncompat = true, @@ -5052,7 +5115,7 @@ local blender = { blueprint_compat = true, demicoloncompat = true, atlas = "atlasthree", - order = 305, + order = 304, calculate = function(self, card, context) if context.using_consumeable @@ -5107,7 +5170,7 @@ local python = { perishable_compat = false, demicoloncompat = true, atlas = "atlasthree", - order = 306, + order = 305, loc_vars = function(self, info_queue, center) return { vars = { @@ -5198,6 +5261,7 @@ local code_cards = { malware, crynperror, rework, + rework_tag, merge, commit, machinecode, diff --git a/items/deck.lua b/items/deck.lua index 3ecc2c6a8..2861ea899 100644 --- a/items/deck.lua +++ b/items/deck.lua @@ -49,7 +49,7 @@ local equilibrium = { name = "cry-Equilibrium", key = "equilibrium", order = 3, - config = { vouchers = { "v_overstock_norm" } }, + config = { vouchers = { "v_overstock_norm", "v_overstock_plus" } }, pos = { x = 0, y = 1 }, atlas = "atlasdeck", apply = function(self) @@ -84,7 +84,7 @@ local misprint = { name = "cry-Misprint", key = "misprint", order = 4, - config = { cry_misprint_min = 0.25, cry_misprint_max = 4 }, + config = { cry_misprint_min = 0.1, cry_misprint_max = 10 }, pos = { x = 4, y = 2 }, atlas = "atlasdeck", apply = function(self) @@ -217,24 +217,29 @@ local wormhole = { name = "cry-Wormhole", key = "wormhole", order = 6, + config = { cry_negative_rate = 20, joker_slot = -2 }, pos = { x = 3, y = 4 }, atlas = "atlasdeck", - calculate = function(self, back, context) - if - context.end_of_round - and not context.individual - and not context.repetition - and not context.blueprint - and G.GAME.blind - and G.GAME.blind.config.blind - and G.GAME.blind.config.blind.boss - then - if G.jokers.cards[1] and G.jokers.cards[1].config.center.rarity ~= "cry_exotic" then - Cryptid.with_deck_effects(G.jokers.cards[1], function(card) - Cryptid.upgrade_rarity(card, "cry_wormhole") - end) - end - end + apply = function(self) + G.GAME.modifiers.cry_negative_rate = self.config.cry_negative_rate + G.E_MANAGER:add_event(Event({ + func = function() + if G.jokers then + local card = create_card("Joker", G.jokers, nil, "cry_exotic", nil, nil, nil, "cry_wormhole") + card:add_to_deck() + card:start_materialize() + G.jokers:emplace(card) + return true + end + end, + })) + end, + init = function(self) + SMODS.Edition:take_ownership("negative", { + get_weight = function(self) + return self.weight * (G.GAME.modifiers.cry_negative_rate or 1) + end, + }, true) end, unlocked = false, check_for_unlock = function(self, args) @@ -409,7 +414,7 @@ local critical = { check = 2 G.E_MANAGER:add_event(Event({ func = function() - play_sound("cry_emult", 1) + play_sound("talisman_emult", 1) attention_text({ scale = 1.4, text = localize("cry_critical_hit_ex"), @@ -441,7 +446,7 @@ local critical = { delay(0.6) if check then return { - e_mult = check, + Emult_mod = check, colour = G.C.DARK_EDITION, } end @@ -621,6 +626,9 @@ local antimatter = { "set_cry_deck", }, }, + loc_vars = function(self, info_queue, center) + return { key = Cryptid.gameset_loc(self, { mainline = "balanced", modest = "balanced" }) } + end, name = "cry-Antimatter", order = 76, key = "antimatter", @@ -637,13 +645,17 @@ local antimatter = { pos = { x = 2, y = 0 }, calculate = function(self, back, context) if context.context ~= "final_scoring_step" then - Cryptid.antimatter_trigger(self, context, false) + Cryptid.antimatter_trigger(self, context, Cryptid.gameset(G.P_CENTERS.b_cry_antimatter) == "madness") else - return Cryptid.antimatter_trigger_final_scoring(self, context, false) + return Cryptid.antimatter_trigger_final_scoring( + self, + context, + Cryptid.gameset(G.P_CENTERS.b_cry_antimatter) == "madness" + ) end end, apply = function(self) - Cryptid.antimatter_apply(false) + Cryptid.antimatter_apply(Cryptid.gameset(G.P_CENTERS.b_cry_antimatter) == "madness") end, atlas = "atlasdeck", init = function(self) @@ -799,7 +811,7 @@ local antimatter = { or skip then G.GAME.modifiers.cry_misprint_min = 1 - G.GAME.modifiers.cry_misprint_max = 4 + G.GAME.modifiers.cry_misprint_max = 10 end -- Infinite Deck if @@ -819,6 +831,29 @@ local antimatter = { })) G.GAME.starting_params.hand_size = G.GAME.starting_params.hand_size + 1 end + -- Wormhole deck + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_wormhole", "wins", 8) or 0) + ~= 0 + or skip + then + G.GAME.modifiers.cry_negative_rate = 20 + + if Cryptid.enabled("set_cry_exotic") == true then + G.E_MANAGER:add_event(Event({ + func = function() + if G.jokers then + local card = + create_card("Joker", G.jokers, nil, "cry_exotic", nil, nil, nil, "cry_wormhole") + card:add_to_deck() + card:start_materialize() + G.jokers:emplace(card) + return true + end + end, + })) + end + end -- Redeemed deck if (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_redeemed", "wins", 8) or 0) @@ -896,7 +931,7 @@ local antimatter = { update_hand_text({ delay = 0 }, { mult = context.mult, chips = context.chips }) G.E_MANAGER:add_event(Event({ func = function() - play_sound("cry_emult", 1) + play_sound("talisman_emult", 1) attention_text({ scale = 1.4, text = localize("cry_critical_hit_ex"), @@ -1049,22 +1084,6 @@ local antimatter = { end, })) end - --Wormhole Deck - if - context.end_of_round - and not context.individual - and not context.repetition - and not context.blueprint - and G.GAME.blind - and G.GAME.blind.config.blind - and G.GAME.blind.config.blind.boss - then - if G.jokers.cards[1] and G.jokers.cards[1].config.center.rarity ~= "cry_exotic" then - Cryptid.with_deck_effects(G.jokers.cards[1], function(card) - Cryptid.upgrade_rarity(card, "cry_wormhole") - end) - end - end end end function Cryptid.get_antimatter_vouchers(voucher_table, skip) diff --git a/items/epic.lua b/items/epic.lua index 9081aea2c..a958c5e42 100644 --- a/items/epic.lua +++ b/items/epic.lua @@ -2,6 +2,7 @@ gameset_config = { modest = {extra = {chips = 1}, center = {rarity = 1, blueprint_compat = false, immutable = true, no_dbl = false}}, mainline = {center = {rarity = 2, blueprint_compat = true, immutable = true, no_dbl = true}}, + madness = {extra = {chips = 100}, center = {rarity = 3}}, cryptid_in_2025 = {extra = {chips = 1e308}, center = {rarity = "cry_exotic"}}, }, -- Card.get_gameset(card) ~= "modest" @@ -187,78 +188,60 @@ local googol_play = { object_type = "Joker", name = "cry-Googol Play Card", key = "googol_play", + config = { + extra = { + Xmult = 1e100, + odds = 8, + }, + }, dependencies = { items = { "set_cry_epic", }, }, - immutable = true, + gameset_config = { + modest = { extra = { Xmult = 9, odds = 8 } }, + }, + pos = { x = 3, y = 0 }, rarity = "cry_epic", cost = 10, - order = 60, - blueprint_compat = false, - eternal_compat = false, + order = 14, + blueprint_compat = true, demicoloncompat = true, atlas = "atlasepic", - pos = { x = 3, y = 0 }, soul_pos = { x = 10, y = 0, extra = { x = 4, y = 0 } }, - config = { - extra = { - Xmult = 10, - Xmult_payout = 100, - odds = 10, - }, - }, loc_vars = function(self, info_queue, card) - local num, denom = - SMODS.get_probability_vars(card, 1, card and card.ability.extra.odds or self.config.extra.odds) return { vars = { - num, - denom, + cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged), + card.ability.extra.odds, number_format(card.ability.extra.Xmult), - number_format(card.ability.extra.Xmult_payout), }, } end, calculate = function(self, card, context) - if context.joker_main then - if - context.joker_main - and SMODS.pseudorandom_probability( - card, - "cry_googol_play", - 1, - card and card.ability.extra.odds or self.config.extra.odds - ) - then - return { - message = localize({ - type = "variable", - key = "a_xmult", - vars = { number_format(card.ability.extra.Xmult_payout) }, - }), - Xmult_mod = lenient_bignum(card.ability.extra.Xmult_payout), - } - else - return { - message = localize({ - type = "variable", - key = "a_xmult", - vars = { number_format(card.ability.extra.Xmult) }, - }), - Xmult_mod = lenient_bignum(card.ability.extra.Xmult), - } - end + if + context.joker_main + and pseudorandom("cry_googol_play") + < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds + then + return { + message = localize({ + type = "variable", + key = "a_xmult", + vars = { number_format(card.ability.extra.Xmult) }, + }), + Xmult_mod = lenient_bignum(card.ability.extra.Xmult), + } end if context.forcetrigger then return { message = localize({ type = "variable", key = "a_xmult", - vars = { number_format(card.ability.extra.Xmult_payout) }, + vars = { number_format(card.ability.extra.Xmult) }, }), - Xmult_mod = lenient_bignum(card.ability.extra.Xmult_payout), + Xmult_mod = lenient_bignum(card.ability.extra.Xmult), } end end, @@ -405,26 +388,32 @@ local canvas = { cost = 18, blueprint_compat = true, atlas = "atlasepic", + loc_vars = function(self, info_queue, center) + return { key = Cryptid.gameset_loc(self, { modest = "balanced" }) } + end, calculate = function(self, card, context) - if - context.retrigger_joker_check - and not context.retrigger_joker - and context.other_card == G.jokers.cards[1] - then + if context.retrigger_joker_check and not context.retrigger_joker then local num_retriggers = 0 - local rarities = {} for i = 1, #G.jokers.cards do - local joker = G.jokers.cards[i] - if not rarities[joker.config.center.rarity] then - rarities[joker.config.center.rarity] = true + if + card.T.x + card.T.w / 2 < G.jokers.cards[i].T.x + G.jokers.cards[i].T.w / 2 + and G.jokers.cards[i].config.center.rarity ~= 1 + and (G.jokers.cards[i].config.center.rarity ~= "cry_candy" or Card.get_gameset(card) ~= "modest") + then num_retriggers = num_retriggers + 1 end end - return { - message = localize("k_again_ex"), - repetitions = Card.get_gameset(card) ~= "modest" and num_retriggers or math.min(2, num_retriggers), - card = card, - } + if + card.T + and context.other_card.T + and (card.T.x + card.T.w / 2 > context.other_card.T.x + context.other_card.T.w / 2) + then + return { + message = localize("k_again_ex"), + repetitions = Card.get_gameset(card) ~= "modest" and num_retriggers or math.min(2, num_retriggers), + card = card, + } + end end end, cry_credits = { @@ -587,15 +576,10 @@ local error_joker = { jokers[#jokers + 1] = G.jokers.cards[i] end end - local buff = 0 - local cards = #G.jokers.cards for i = 1, #jokers do - if cards + buff < G.jokers.config.card_limit then - local card = copy_card(jokers[i]) - card:add_to_deck() - G.jokers:emplace(card) - buff = buff + 1 - end + local card = copy_card(jokers[i]) + card:add_to_deck() + G.jokers:emplace(card) end return nil, true end @@ -606,7 +590,7 @@ local error_joker = { "Fetch", }, art = { - "Mystic Misclick", + "mold spores", }, code = { "Math", @@ -840,16 +824,20 @@ local M = { demicoloncompat = true, loc_vars = function(self, info_queue, center) info_queue[#info_queue + 1] = G.P_CENTERS.j_jolly + if not center.edition or (center.edition and not center.edition.negative) then + info_queue[#info_queue + 1] = G.P_CENTERS.e_negative + end end, atlas = "atlasepic", calculate = function(self, card, context) if (context.setting_blind and not (context.blueprint_card or self).getting_sliced) or context.forcetrigger then - if #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit then - local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_jolly") - card:add_to_deck() - G.jokers:emplace(card) - return nil, true - end + local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_jolly") + card:set_edition({ + negative = true, + }) + card:add_to_deck() + G.jokers:emplace(card) + return nil, true end end, pools = { ["M"] = true }, @@ -891,6 +879,7 @@ local boredom = { loc_vars = function(self, info_queue, card) local num, denom = SMODS.get_probability_vars(card, 1, card and card.ability.extra.odds or self.config.extra.odds) + return { vars = { num, @@ -900,27 +889,13 @@ local boredom = { end, atlas = "atlasepic", calculate = function(self, card, context) - if context.before then - local cards = {} - for i, v in pairs(G.jokers.cards) do - if v.config.center.key ~= "j_cry_boredom" then - cards[#cards + 1] = v - end - end - local joker = pseudorandom_element(cards, pseudoseed("cry_boredom_joker")) - card.cry_boredom_marked = joker - end - if context.after then - card.cry_boredom_marked = nil - end if context.retrigger_joker_check and not context.retrigger_joker and not (context.other_card.ability and context.other_card.ability.name == "cry-Boredom") - and card.cry_boredom_marked == context.other_card then if - pseudorandom_probability( + SMODS.pseudorandom_probability( card, "cry_boredom_joker", 1, @@ -939,9 +914,9 @@ local boredom = { if context.repetition and context.cardarea == G.play - and pseudorandom_probability( + and SMODS.pseudorandom_probability( card, - "cry_boredom_card", + "cry_boredom_joker", 1, card and card.ability.extra.odds or self.config.extra.odds ) @@ -998,14 +973,26 @@ local number_blocks = { } end, calculate = function(self, card, context) - if context.after and not context.blueprint and not context.before and not context.repetition then - for i, v in pairs(G.hand.cards) do - if v:get_id() == G.GAME.current_round.cry_nb_card.id and not v.debuff then - card.ability.extra.money = - lenient_bignum(to_big(card.ability.extra.money) + card.ability.extra.money_mod) - card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("k_upgrade_ex") }) - return nil, true - end + if + context.individual + and not context.end_of_round + and context.cardarea == G.hand + and not context.blueprint + and not context.before + and not context.after + and context.other_card:get_id() == G.GAME.current_round.cry_nb_card.id + then + if context.other_card.debuff then + return { + message = localize("k_debuffed"), + colour = G.C.RED, + card = card, + } + else + card.ability.extra.money = + lenient_bignum(to_big(card.ability.extra.money) + card.ability.extra.money_mod) + card_eval_status_text(card, "extra", nil, nil, nil, { message = localize("k_upgrade_ex") }) + return nil, true end end end, @@ -1040,13 +1027,27 @@ local double_scale = { "set_cry_epic", }, }, + gameset_config = { + modest = { + cost = 20, + center = { rarity = 4 }, + }, + exp_modest = { cost = 11 }, + }, + extra_gamesets = { "exp_modest" }, + loc_vars = function(self, info_queue, center) + return { key = Cryptid.gameset_loc(self, { exp_modest = "modest" }) } + end, order = 6, rarity = "cry_epic", cost = 18, immutable = true, atlas = "atlasepic", cry_scale_mod = function(self, card, joker, orig_scale_scale, true_base, orig_scale_base, new_scale_base) - return lenient_bignum(to_big(true_base) * 2) + if Cryptid.gameset(self) == "exp_modest" then + return lenient_bignum(to_big(true_base) * 2) + end + return lenient_bignum(orig_scale_scale + to_big(true_base)) end, cry_credits = { idea = { @@ -1193,7 +1194,7 @@ local circus = { if context.other_joker and card ~= context.other_joker then local mod_key = card.ability.immutable.rarity_map[context.other_joker.config.center.rarity] if mod_key and card.ability.extra[mod_key] and to_big(card.ability.extra[mod_key]) > to_big(1) then - if Talisman and not Talisman.config_file.disable_anims then + if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ func = function() context.other_joker:juice_up(0.5, 0.5) @@ -1702,8 +1703,8 @@ local goldjoker = { key = "goldjoker", config = { extra = { - percent_mod = 5, - percent = 20, + percent_mod = 2, + percent = 0, }, }, dependencies = { @@ -1751,9 +1752,12 @@ local goldjoker = { end end end, - cry_calc_interest = function(self, card, interest) - local old = lenient_bignum(card.ability.extra.percent) - return (1 + old / 100) * interest + calc_dollar_bonus = function(self, card) + local bonus = + lenient_bignum(math.max(0, math.floor(0.01 * to_big(card.ability.extra.percent) * (G.GAME.dollars or 0)))) + if to_big(bonus) > to_big(0) then + return bonus + end end, cry_credits = { idea = { @@ -1768,73 +1772,48 @@ local goldjoker = { }, } --- Nostalgic Googol Play Card is now Googol Play Card +-- Nostalgic Googol Play Card -- Sell this card to create 2 copies of the leftmost Joker -- Still needs updated description - local altgoogol = { object_type = "Joker", name = "cry-altgoogol", key = "altgoogol", + pos = { x = 4, y = 3 }, dependencies = { items = { "set_cry_epic", }, }, + immutable = true, rarity = "cry_epic", cost = 10, - order = 14, - blueprint_compat = true, + order = 60, + blueprint_compat = false, + eternal_compat = false, demicoloncompat = true, atlas = "atlasepic", - pos = { x = 4, y = 3 }, soul_pos = { x = 10, y = 0, extra = { x = 5, y = 3 } }, - config = { copies = 2, rounds = 3, rounds_left = 3 }, + config = { copies = 2 }, gameset_config = { modest = { cost = 15, copies = 1, - rounds = 3, - rounds_left = 3, }, - mainline = { copies = 2, rounds = 3, rounds_left = 3 }, + mainline = { copies = 2 }, + madness = { + center = { blueprint_compat = true }, + copies = 2, + }, }, loc_vars = function(self, info_queue, center) - return { - key = Cryptid.gameset_loc(self, { modest = "balanced" }), - vars = { center.ability.copies, center.ability.rounds, center.ability.rounds_left }, - } + return { key = Cryptid.gameset_loc(self, { modest = "balanced" }), vars = { center.ability.copies } } end, calculate = function(self, card, context) local gameset = Card.get_gameset(card) if - context.end_of_round - and not context.retrigger_joker - and not context.blueprint - and not context.individual - and not context.repetition - then - card.ability.rounds_left = card.ability.rounds_left - 1 - if to_big(card.ability.rounds_left) <= to_big(0) then - local eval = function(card) - return not card.REMOVED - end - juice_card_until(card, eval, true) - end - return { - message = to_big(card.ability.rounds_left) > to_big(0) - and ((card.ability.rounds - card.ability.rounds_left) .. "/" .. card.ability.rounds) - or localize("k_active_ex"), - colour = G.C.FILTER, - } - end - if - ( - context.selling_self - and not context.retrigger_joker - and not context.blueprint - and to_big(card.ability.rounds_left) <= to_big(0) - ) or context.forcetrigger + (context.selling_self and not context.retrigger_joker and (gameset == "madness" or not context.blueprint)) + or context.forcetrigger then local jokers = {} for i = 1, #G.jokers.cards do @@ -1931,6 +1910,7 @@ local soccer = { add_to_deck = function(self, card, from_debuff) card.ability.extra.holygrail = math.floor(card.ability.extra.holygrail) local mod = card.ability.extra.holygrail + G.jokers.config.card_limit = G.jokers.config.card_limit + ((Card.get_gameset(card) == "modest") and 0 or mod) G.consumeables.config.card_limit = G.consumeables.config.card_limit + mod G.hand:change_size(mod) SMODS.change_booster_limit(mod) @@ -1939,6 +1919,7 @@ local soccer = { remove_from_deck = function(self, card, from_debuff) card.ability.extra.holygrail = math.floor(card.ability.extra.holygrail) local mod = card.ability.extra.holygrail + G.jokers.config.card_limit = G.jokers.config.card_limit + ((Card.get_gameset(card) == "modest") and 0 or -mod) G.consumeables.config.card_limit = G.consumeables.config.card_limit - mod G.hand:change_size(-mod) SMODS.change_booster_limit(-mod) @@ -1986,6 +1967,7 @@ local fleshpanopticon = { dependencies = { items = { "set_cry_epic", + "c_cry_gateway", }, }, immutable = true, @@ -2162,7 +2144,7 @@ local jtron = { name = "cry-jtron", key = "jtron", config = { - extra = { bonus = 2 }, + extra = { bonus = 1 }, immutable = { current = 0 }, }, rarity = "cry_epic", @@ -2184,63 +2166,32 @@ local jtron = { } end, calculate = function(self, card, context) + card.ability.immutable.current = + lenient_bignum(1 + to_big(card.ability.extra.bonus) * #SMODS.find_card("j_joker")) if context.cardarea == G.jokers and context.joker_main then - card.ability.immutable.current = - lenient_bignum(1 + to_big(card.ability.extra.bonus) * #SMODS.find_card("j_joker")) - if to_big(card.ability.immutable.current) > to_big(0) then - return { - message = localize({ - type = "variable", - key = "a_xmult", - vars = { - number_format(card.ability.immutable.current), - }, - }), - Xmult_mod = lenient_bignum(card.ability.immutable.current), - colour = G.C.MULT, - } - end - end - if - context.end_of_round - and not context.blueprint - and not context.individual - and not context.repetition - and not context.retrigger_joker - then - if #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit then - G.E_MANAGER:add_event(Event({ - func = function() - SMODS.add_card({ - key = "j_joker", - area = G.jokers, - }) - return true - end, - })) - end + return { + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(card.ability.immutable.current), + }, + }), + Emult_mod = lenient_bignum(card.ability.immutable.current), + colour = G.C.DARK_EDITION, + } end if context.forcetrigger then - G.GAME.joker_buffer = G.GAME.joker_buffer + 1 - G.E_MANAGER:add_event(Event({ - func = function() - SMODS.add_card({ - key = "j_joker", - area = G.jokers, - }) - return true - end, - })) return { message = localize({ type = "variable", - key = "a_xmult", + key = "a_powmult", vars = { number_format(1 + to_big(card.ability.extra.bonus)), }, }), - Xmult_mod = lenient_bignum(1 + to_big(card.ability.extra.bonus)), - colour = G.C.MULT, + Emult_mod = lenient_bignum(1 + to_big(card.ability.extra.bonus)), + colour = G.C.DARK_EDITION, } end end, @@ -2364,6 +2315,7 @@ local clockwork = { -- Steel Support: The Joker and not context.blueprint_card and not context.retrigger_joker and card.ability.immutable.counters.c3 == 0 + and context.full_hand[1] then -- effect 3 context.full_hand[1]:set_ability(G.P_CENTERS["m_steel"], nil, true) end @@ -2440,7 +2392,8 @@ local demicolon = { object_type = "Joker", gameset_config = { modest = { disabled = true }, - mainline = { disabled = false }, + mainline = { disabled = true }, + madness = { disabled = false }, experimental = { disabled = false }, }, dependencies = { @@ -2573,7 +2526,15 @@ local starfruit = { calculate = function(self, card, context) if context.joker_main or context.forcetrigger then return { - e_mult = lenient_bignum(card.ability.emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(card.ability.emult), + }, + }), + Emult_mod = lenient_bignum(card.ability.emult), + colour = G.C.DARK_EDITION, } end if context.reroll_shop or context.forcetrigger then @@ -2655,57 +2616,6 @@ local starfruit = { end, } -local chad = { - object_type = "Joker", - dependencies = { - items = { - "set_cry_meme", - }, - }, - name = "cry-Chad", - key = "chad", - pos = { x = 0, y = 3 }, - order = 300.25, - config = { - extra = { retriggers = 2 }, - immutable = { max_retriggers = 25 }, - }, - pools = { ["Meme"] = true }, - rarity = "cry_epic", - cost = 10, - blueprint_compat = true, - loc_vars = function(self, info_queue, center) - return { vars = { math.min(center.ability.immutable.max_retriggers, center.ability.extra.retriggers) } } - end, - atlas = "atlasone", - calculate = function(self, card, context) - if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= self then - if context.other_card == G.jokers.cards[1] then - return { - message = localize("k_again_ex"), - repetitions = to_number( - math.min(card.ability.immutable.max_retriggers, card.ability.extra.retriggers) - ), - card = card, - } - else - return nil, true - end - end - end, - cry_credits = { - idea = { - "Jevonn", - }, - art = { - "SDM_0", - }, - code = { - "Math", - }, - }, -} - return { name = "Epic Jokers", items = { @@ -2736,6 +2646,5 @@ return { clockwork, demicolon, starfruit, - chad, }, } diff --git a/items/exotic.lua b/items/exotic.lua index 4c49d28d9..a9acc3628 100644 --- a/items/exotic.lua +++ b/items/exotic.lua @@ -169,7 +169,7 @@ local universum = { --Universum Patches local uht = update_hand_text function update_hand_text(config, vals) - if next(find_joker("cry-Universum")) and (not Talisman or not Talisman.config_file.disable_anims) then + if next(find_joker("cry-Universum")) and not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ --This is the Hand name text for the poker hand trigger = "before", blockable = not config.immediate, @@ -294,7 +294,7 @@ local exponentia = { object_type = "Joker", name = "cry-Exponentia", key = "exponentia", - config = { extra = { Emult = 1, e_mult = 0.03 } }, + config = { extra = { Emult = 1, Emult_mod = 0.03 } }, pos = { x = 0, y = 0 }, rarity = "cry_exotic", cost = 50, @@ -307,13 +307,29 @@ local exponentia = { calculate = function(self, card, context) if context.joker_main and (to_big(card.ability.extra.Emult) > to_big(1)) then return { - e_mult = lenient_bignum(card.ability.extra.Emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(card.ability.extra.Emult), + }, + }), + Emult_mod = lenient_bignum(card.ability.extra.Emult), + colour = G.C.DARK_EDITION, } end if context.forcetrigger then card.ability.extra.Emult = card.ability.extra.Emult + card.ability.extra.Emult_mod return { - e_mult = lenient_bignum(card.ability.extra.Emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(card.ability.extra.Emult), + }, + }), + Emult_mod = lenient_bignum(card.ability.extra.Emult), + colour = G.C.DARK_EDITION, } end end, @@ -327,7 +343,8 @@ local exponentia = { end, cry_credits = { idea = { "Enemui" }, - art = { "Jevonn" }, + art = { "Lil Mr. Slipstream" }, + art = { "George the Rat" }, code = { "Math" }, }, init = function(self) @@ -355,7 +372,6 @@ local exponentia = { type = "variable", key = "a_powmult", vars = { number_format(v.ability.extra.Emult) }, - colour = G.C.DARK_EDITION, }), }) Cryptid.apply_scale_mod(v, v.ability.extra.Emult_mod, old, v.ability.extra.Emult, { @@ -509,8 +525,8 @@ local tenebris = { soul_pos = { x = 4, y = 2, extra = { x = 5, y = 2 } }, config = { extra = { - slots = 10, - money = 20, + slots = 25, + money = 25, }, immutable = { max_slots = 100, @@ -566,9 +582,7 @@ local effarcire = { object_type = "Joker", name = "cry-Effarcire", key = "effarcire", - config = { - extra = 5, - }, + config = {}, immutable = true, pos = { x = 0, y = 0 }, soul_pos = { x = 1, y = 0, extra = { x = 2, y = 0 } }, @@ -577,18 +591,6 @@ local effarcire = { atlas = "effarcire", rarity = "cry_exotic", demicoloncompat = true, - add_to_deck = function(self, card) - card.ability.extra = math.min(math.floor(card.ability.extra), 1000) - SMODS.change_play_limit(card.ability.extra) - SMODS.change_discard_limit(card.ability.extra) - end, - remove_from_deck = function(self, card) - SMODS.change_play_limit(-1 * card.ability.extra) - SMODS.change_discard_limit(-1 * card.ability.extra) - if not G.GAME.before_play_buffer then - G.hand:unhighlight_all() - end - end, calculate = function(self, card, context) if not context.blueprint and not context.retrigger_joker or context.forcetrigger then if context.first_hand_drawn or context.forcetrigger then @@ -599,13 +601,6 @@ local effarcire = { end end end, - loc_vars = function(self, queue, card) - return { - vars = { - card.ability.extra, - }, - } - end, cry_credits = { idea = { "Frix" }, art = { "AlexZGreat", "Catformer" }, @@ -631,8 +626,8 @@ local crustulum = { key = "crustulum", config = { extra = { - rerolls_stored = 0, - rerolls_per = 8, + chips = 0, + chip_mod = 4, }, }, pos = { x = 0, y = 2 }, @@ -647,58 +642,43 @@ local crustulum = { loc_vars = function(self, info_queue, center) return { vars = { - number_format(center.ability.extra.rerolls_stored), - number_format(center.ability.extra.rerolls_per), + number_format(center.ability.extra.chips), + number_format(center.ability.extra.chip_mod), }, } end, - calculate = function(self, center, context) + calculate = function(self, card, context) if context.reroll_shop and not context.blueprint then - center.ability.extra.rerolls_stored = center.ability.extra.rerolls_stored - 1 - if to_big(center.ability.extra.rerolls_stored) < 0 then - center.ability.extra.rerolls_stored = 0 - calculate_reroll_cost(true) - else - calculate_reroll_cost(true) - return { - message = "-1", - colour = G.C.DARK_EDITION, - } - end - end - if - context.end_of_round - and not context.blueprint - and not context.repetition - and not context.retrigger_joker - and not context.individual - then - if #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit then - SMODS.add_card({ - set = "Food", - area = G.jokers, - }) - end + card.ability.extra.chips = lenient_bignum(to_big(card.ability.extra.chips) + card.ability.extra.chip_mod) + card_eval_status_text(card, "extra", nil, nil, nil, { + message = localize({ + type = "variable", + key = "a_chips", + vars = { number_format(card.ability.extra.chips) }, + }), + colour = G.C.CHIPS, + }) + return nil, true end - if context.food_joker_expired then - center.ability.extra.rerolls_stored = center.ability.extra.rerolls_stored + center.ability.extra.rerolls_per + if context.joker_main and to_big(card.ability.extra.chips) > to_big(0) then return { - message = localize("k_upgrade_ex"), - colour = G.C.DARK_EDITION, + message = localize({ + type = "variable", + key = "a_chips", + vars = { number_format(card.ability.extra.chips) }, + }), + chip_mod = lenient_bignum(card.ability.extra.chips), } end if context.forcetrigger then - center.ability.extra.rerolls_stored = center.ability.extra.rerolls_stored - + center.abilities.extra.rerolls_per - if #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit then - SMODS.add_card({ - set = "Food", - area = G.jokers, - }) - end + card.ability.extra.chips = lenient_bignum(to_big(card.ability.extra.chips) + card.ability.extra.chip_mod) return { - message = localize("k_upgrade_ex"), - colour = G.C.DARK_EDITION, + message = localize({ + type = "variable", + key = "a_chips", + vars = { number_format(card.ability.extra.chips) }, + }), + chip_mod = lenient_bignum(card.ability.extra.chips), } end end, @@ -715,18 +695,6 @@ local crustulum = { art = { "lolxddj" }, code = { "Jevonn" }, }, - init = function() - local remove_ref = CardArea.remove_card - function CardArea:remove_card(card, ...) - local c = remove_ref(self, card, ...) - if card and card.is_food and card:is_food() and self == G.jokers and not G.SETTINGS.paused then - if card.states.drag.is == true and card.children.center.pinch.x == true then - SMODS.calculate_context({ food_joker_expired = true, card = self }) - end - end - return c - end - end, } --todo: make the Emult always prime local primus = { @@ -788,7 +756,15 @@ local primus = { if context.joker_main and (to_big(card.ability.extra.Emult) > to_big(1)) then card.children.floating_sprite:set_sprite_pos({ x = 8, y = 6 }) return { - e_mult = lenient_bignum(card.ability.extra.Emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(card.ability.extra.Emult), + }, + }), + Emult_mod = lenient_bignum(card.ability.extra.Emult), + colour = G.C.DARK_EDITION, } end if context.end_of_round then @@ -797,7 +773,15 @@ local primus = { if context.forcetrigger then card.ability.extra.Emult = lenient_bignum(to_big(card.ability.extra.Emult) + card.ability.extra.Emult_mod) return { - e_mult = lenient_bignum(card.ability.extra.Emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(card.ability.extra.Emult), + }, + }), + Emult_mod = lenient_bignum(card.ability.extra.Emult), + colour = G.C.DARK_EDITION, } end end, @@ -832,7 +816,7 @@ local scalae = { cost = 50, atlas = "atlasexotic", order = 311, - config = { extra = { scale = 2, scale_mod = 1 } }, + config = { extra = { scale = 1, scale_mod = 1 } }, demicoloncompat = true, calculate = function(self, card, context) if @@ -848,7 +832,18 @@ local scalae = { end, cry_scale_mod = function(self, card, joker, orig_scale_scale, true_base, orig_scale_base, new_scale_base) if joker.ability.name ~= "cry-Scalae" then - local new_scale = lenient_bignum(to_big(true_base) * card.ability.extra.scale) + local new_scale = lenient_bignum( + to_big(true_base) + * ( + ( + 1 + + ( + (to_big(orig_scale_scale) / to_big(true_base)) + ^ (to_big(1) / to_big(card.ability.extra.scale)) + ) + ) ^ to_big(card.ability.extra.scale) + ) + ) if not Cryptid.is_card_big(joker) and to_big(new_scale) >= to_big(1e300) then new_scale = 1e300 end @@ -856,10 +851,17 @@ local scalae = { end end, loc_vars = function(self, info_queue, card) + local example = { 2, 3, 4 } + for i = 1, #example do + example[i] = to_big(example[i]) ^ (card.ability.extra.scale + 1) + end return { vars = { - number_format(card.ability.extra.scale), + number_format(card.ability.extra.scale + 1), number_format(card.ability.extra.scale_mod), + example[1], + example[2], + example[3], }, } end, @@ -882,7 +884,7 @@ local stella_mortis = { config = { extra = { Emult = 1, - Emult_mod = 0.25, + Emult_mod = 0.4, }, }, pos = { x = 3, y = 5 }, @@ -895,38 +897,65 @@ local stella_mortis = { atlas = "atlasexotic", soul_pos = { x = 5, y = 5, extra = { x = 4, y = 5 } }, calculate = function(self, card, context) - if context.skipping_booster and not context.blueprint then - if SMODS.OPENED_BOOSTER.config.center.kind == "Celestial" then - for i = 1, G.GAME.pack_choices do - local new_card = pseudorandom_element(G.pack_cards.cards) - local tries = 10 - while new_card.to_destroy and tries > 0 do - new_card = pseudorandom_element(G.pack_cards.cards) - tries = tries - 1 - end - new_card.to_destroy = true - new_card:start_dissolve() - card.ability.extra.Emult = card.ability.extra.Emult + card.ability.extra.Emult_mod + if (context.ending_shop and not context.blueprint) or context.forcetrigger then + local destructable_planet = {} + local quota = 1 + for i = 1, #G.consumeables.cards do + if + G.consumeables.cards[i].ability.set == "Planet" + and not G.consumeables.cards[i].getting_sliced + and not G.consumeables.cards[i].ability.eternal + then + destructable_planet[#destructable_planet + 1] = G.consumeables.cards[i] end - card_eval_status_text((context.blueprint_card or card), "extra", nil, nil, nil, { - message = localize({ - type = "variable", - key = "a_powmult", - vars = { - number_format(lenient_bignum(card.ability.extra.Emult)), - }, - colour = G.C.DARK_EDITION, - }), - }) - delay(2) end - end - if context.forcetrigger then - card.ability.extra.Emult = card.ability.extra.Emult + card.ability.extra.Emult_mod + local planet_to_destroy = #destructable_planet > 0 + and pseudorandom_element(destructable_planet, pseudoseed("stella_mortis")) + or nil + + if planet_to_destroy then + if Incantation then + quota = planet_to_destroy:getEvalQty() + end + if Overflow then + quaota = planet_to_destroy.ability.immutable and planet_to_destroy.ability.immutable.overflow_amount + end + planet_to_destroy.getting_sliced = true + card.ability.extra.Emult = + lenient_bignum(card.ability.extra.Emult + to_big(card.ability.extra.Emult_mod) * quota) + G.E_MANAGER:add_event(Event({ + func = function() + (context.blueprint_card or card):juice_up(0.8, 0.8) + planet_to_destroy:start_dissolve({ G.C.RED }, nil, 1.6) + return true + end, + })) + planet_to_destroy.dissolve = 0 --timing issues related to crossmod stuff + if not (context.blueprint_card or self).getting_sliced then + card_eval_status_text((context.blueprint_card or card), "extra", nil, nil, nil, { + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(lenient_bignum(card.ability.extra.Emult)), + }, + }), + }) + end + return nil, true + end end if (context.joker_main and (to_big(card.ability.extra.Emult) > to_big(1))) or context.forcetrigger then return { - e_mult = lenient_bignum(card.ability.extra.Emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(card.ability.extra.Emult), + }, + }), + Emult_mod = lenient_bignum(card.ability.extra.Emult), + colour = G.C.DARK_EDITION, } end end, @@ -993,13 +1022,12 @@ local circulus_pistoris = { pi = 2 * pi end return { - e_chips = pi, - e_mult = pi, + Echip_mod = pi, + Emult_mod = pi, message = localize({ type = "variable", key = "a_powmultchips", vars = { (Cryptid.safe_get(card, "edition", "cry_oversat") and "tau" or "pi") }, - sound = "cry_echips", }), colour = { 0.8, 0.45, 0.85, 1 }, --plasma colors } @@ -1116,7 +1144,13 @@ local facile = { if to_big(card.ability.immutable.check2) <= to_big(card.ability.extra.check) then card.ability.immutable.check2 = 0 return { - e_mult = lenient_bignum(card.ability.extra.Emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { number_format(card.ability.extra.Emult) }, + }), + Emult_mod = lenient_bignum(card.ability.extra.Emult), + colour = G.C.DARK_EDITION, } else card.ability.immutable.check2 = 0 @@ -1124,7 +1158,13 @@ local facile = { end if context.forcetrigger then return { - e_mult = lenient_bignum(card.ability.extra.Emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { number_format(card.ability.extra.Emult) }, + }), + Emult_mod = lenient_bignum(card.ability.extra.Emult), + colour = G.C.DARK_EDITION, } end end, @@ -1587,7 +1627,15 @@ local formidiulosus = { end if context.cardarea == G.jokers and (to_big(card.ability.extra.Emult) > to_big(1)) and context.joker_main then return { - e_mult = lenient_bignum(card.ability.extra.Emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(card.ability.extra.Emult), + }, + }), + Emult_mod = lenient_bignum(card.ability.extra.Emult), + colour = G.C.DARK_EDITION, } end if context.forcetrigger then @@ -1598,7 +1646,15 @@ local formidiulosus = { G.jokers:emplace(card) end return { - e_mult = lenient_bignum(card.ability.extra.Emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(card.ability.extra.Emult), + }, + }), + Emult_mod = lenient_bignum(card.ability.extra.Emult), + colour = G.C.DARK_EDITION, } end end, diff --git a/items/m.lua b/items/m.lua index ec711f62f..b9083f940 100644 --- a/items/m.lua +++ b/items/m.lua @@ -538,12 +538,10 @@ local notebook = { demicoloncompat = true, loc_vars = function(self, info_queue, card) info_queue[#info_queue + 1] = G.P_CENTERS.j_jolly - local num, denom = - SMODS.get_probability_vars(card, 1, card and card.ability.extra.odds or self.config.extra.odds) return { vars = { - num, - denom, + cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged), + card.ability.extra.odds, number_format(card.ability.immutable.slots), number_format(card.ability.extra.active), number_format(card.ability.extra.jollies), @@ -567,7 +565,7 @@ local notebook = { end if to_number(jollycount) >= to_number(card.ability.extra.jollies) --if there are 5 or more jolly jokers - or pseudorandom_probability( + or SMODS.pseudorandom_probability( card, "cry_notebook", 1, @@ -690,7 +688,7 @@ local bonk = { end if context.other_joker and context.other_joker.ability.set == "Joker" then if context.other_joker:is_jolly() then - if Talisman and not Talisman.config_file.disable_anims then + if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ func = function() context.other_joker:juice_up(0.5, 0.5) @@ -709,7 +707,7 @@ local bonk = { chip_mod = lenient_bignum(to_big(card.ability.extra.chips) * card.ability.extra.xchips), } else - if Talisman and not Talisman.config_file.disable_anims then + if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ func = function() context.other_joker:juice_up(0.5, 0.5) @@ -837,12 +835,10 @@ local scrabble = { if Cryptid.enabled("e_cry_m") == true then info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_m end - local num, denom = - SMODS.get_probability_vars(card, 1, card and card.ability.extra.odds or self.config.extra.odds) return { vars = { - num, - denom, + cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged), + card.ability.extra.odds, }, } end, @@ -850,22 +846,20 @@ local scrabble = { if context.cardarea == G.jokers and context.before and not context.retrigger_joker then local check = false if - pseudorandom_probability( + SMODS.pseudorandom_probability( card, "scrabbleother", 1, card and card.ability.extra.odds or self.config.extra.odds ) then - if #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit then - check = true - local card = create_card("Joker", G.jokers, nil, 0.9, nil, nil, nil, "scrabbletile") - if Cryptid.enabled("e_cry_m") == true then - card:set_edition({ cry_m = true }) - end - card:add_to_deck() - G.jokers:emplace(card) + check = true + local card = create_card("Joker", G.jokers, nil, 0.9, nil, nil, nil, "scrabbletile") + if Cryptid.enabled("e_cry_m") == true then + card:set_edition({ cry_m = true }) end + card:add_to_deck() + G.jokers:emplace(card) end if check then card_eval_status_text( @@ -953,20 +947,16 @@ local sacrifice = { if to_big(card.ability.extra.unc) < to_big(1) then card.ability.extra.unc = 1 end - for i = 1, math.min(card.ability.immutable.max_spawns, card.ability.extra.unc) do - if G.GAME.joker_buffer + #G.jokers.cards < G.jokers.config.card_limit then - local unc = create_card("Joker", G.jokers, nil, 0.9, nil, nil, nil, "sacrifice") - unc:add_to_deck() - G.jokers:emplace(unc) - unc:start_materialize() - end - end for i = 1, math.min(card.ability.immutable.max_spawns, card.ability.extra.jollies) do - if G.GAME.joker_buffer + #G.jokers.cards < G.jokers.config.card_limit then - local jolly = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_jolly") - jolly:add_to_deck() - G.jokers:emplace(jolly) - end + local jolly = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_jolly") + jolly:add_to_deck() + G.jokers:emplace(jolly) + end + for i = 1, math.min(card.ability.immutable.max_spawns, card.ability.extra.unc) do + local unc = create_card("Joker", G.jokers, nil, 0.9, nil, nil, nil, "sacrifice") + unc:add_to_deck() + G.jokers:emplace(unc) + unc:start_materialize() end card_eval_status_text( context.blueprint_card or card, @@ -1176,7 +1166,7 @@ local doodlem = { config = { extra = { add = 1, - init = 1, + init = 2, }, immutable = { max_jollies = 25 }, }, @@ -1568,7 +1558,7 @@ local mprime = { context.other_joker:is_jolly() or Cryptid.safe_get(context.other_joker.config.center, "pools", "M") ) then - if Talisman and not Talisman.config_file.disable_anims then + if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ func = function() context.other_joker:juice_up(0.5, 0.5) @@ -1577,7 +1567,13 @@ local mprime = { })) end return { - e_mult = lenient_bignum(card.ability.extra.mult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { number_format(card.ability.extra.mult) }, + }), + Emult_mod = lenient_bignum(card.ability.extra.mult), + colour = G.C.DARK_EDITION, card = card, } end @@ -1599,7 +1595,13 @@ local mprime = { end, })) return { - e_mult = lenient_bignum(card.ability.extra.mult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { number_format(card.ability.extra.mult) }, + }), + Emult_mod = lenient_bignum(card.ability.extra.mult), + colour = G.C.DARK_EDITION, } end end, diff --git a/items/misc.lua b/items/misc.lua index 5fb27e14b..e81a96a64 100644 --- a/items/misc.lua +++ b/items/misc.lua @@ -24,14 +24,13 @@ local echo = { pos = { x = 2, y = 0 }, config = { retriggers = 2, extra = 2 }, loc_vars = function(self, info_queue, card) - local num, denom = SMODS.get_probability_vars(card, 1, card and card.ability.extra or self.config.extra) return { vars = { card and card.ability.retriggers or self.config.retriggers, - num, - denom, + card and cry_prob(card.ability.cry_prob or 1, card.ability.extra, card.ability.cry_rigged) or 1, + card and card.ability.extra or self.config.extra, }, - } + } -- note that the check for (card.ability.cry_prob or 1) is probably unnecessary due to cards being initialised with ability.cry_prob end, calculate = function(self, card, context) if @@ -251,7 +250,15 @@ local abstract = { end if context.cardarea == G.play and context.main_scoring then return { - e_mult = card.ability.extra.Emult, + message = localize({ + type = "variable", + key = "a_powmult", + vars = { + number_format(card.ability.extra.Emult), + }, + }), + Emult_mod = card.ability.extra.Emult, + colour = G.C.DARK_EDITION, } end @@ -399,7 +406,7 @@ local azure_seal = { name = "cry-Azure-Seal", key = "azure", badge_colour = HEX("1d4fd7"), - config = { planets_amount = 2 }, + config = { planets_amount = 3 }, loc_vars = function(self, info_queue) return { vars = { self.config.planets_amount } } end, @@ -747,7 +754,7 @@ local mosaic = { shader = "mosaic", in_shop = true, extra_cost = 5, - config = { x_chips = 2, trigger = nil }, + config = { x_chips = 2.5, trigger = nil }, sound = { sound = "cry_e_mosaic", per = 1, @@ -908,12 +915,15 @@ local glitched_shader2 = { key = "ultrafoil", path = "ultrafoil.fs", } +local glitched_shaderb = { + object_type = "Shader", + key = "glitched_b", + path = "glitched_b.fs", +} local glitched = { cry_credits = { art = { - "Samario", - -- Reduced Motion Shader - "Selicre", + "Cassknows", }, code = { "Math", @@ -928,7 +938,8 @@ local glitched = { key = "glitched", order = 1, weight = 15, - shader = G.SETTINGS.reduced_motion and "ultrafoil" or "glitched", + --shader = G.SETTINGS.reduced_motion and "ultrafoil" or "glitched", + shader = "glitched_b", in_shop = true, extra_cost = 0, sound = { @@ -943,15 +954,15 @@ local glitched = { on_apply = function(card) if not card.ability.cry_glitched then Cryptid.manipulate(card, { - min = 0.25, - max = 4, + min = 0.1, + max = 10, }) if card.config.center.apply_glitched then card.config.center:apply_glitched(card, function(val) return Cryptid.manipulate_value(val, { - min = 0.25 * (G.GAME.modifiers.cry_misprint_min or 1), - max = 4 * (G.GAME.modifiers.cry_misprint_max or 1), + min = 0.1 * (G.GAME.modifiers.cry_misprint_min or 1), + max = 10 * (G.GAME.modifiers.cry_misprint_max or 1), type = "X", }, Cryptid.is_card_big(card)) end) @@ -1171,7 +1182,7 @@ local astral = { in_shop = true, extra_cost = 9, sound = { - sound = "cry_emult", + sound = "talisman_emult", per = 1, vol = 0.5, }, @@ -1286,8 +1297,8 @@ local noisy_stats = { chips = 0, }, max = { - mult = 8, - chips = 64, + mult = 30, + chips = 150, }, } local noisy = { @@ -1829,22 +1840,12 @@ local glass_edition = { }, weight = 7, extra_cost = 2, - config = { x_mult = 3, odds = 8, trigger = nil }, + config = { x_mult = 3, shatter_chance = 8, trigger = nil }, loc_vars = function(self, info_queue, card) - local prob = 1 - local odds = 8 - if card and card.ability then - if card.ability.cry_prob then - prob = cry_prob(card.ability.cry_prob, card.edition.odds, card.ability.cry_rigged) - end - if card.ability.odds then - odds = card.ability.odds - end - end return { vars = { - prob, - odds, + ((card and card.edition and card.edition.shatter_chance or self.config.shatter_chance) - 1), + (card and card.edition and card.edition.shatter_chance or self.config.shatter_chance), card and card.edition and card.edition.x_mult or self.config.x_mult, }, } @@ -1861,8 +1862,10 @@ local glass_edition = { then if not card.ability.eternal - and pseudorandom("cry_fragile_destroy") - < cry_prob(card.ability.cry_prob, card.aedition.odds, card.ability.cry_rigged) / card.edition.odds + and not ( + pseudorandom(pseudoseed("cry_fragile")) + > ((self.config.shatter_chance - 1) / self.config.shatter_chance) + ) then -- this event call might need to be pushed later to make more sense G.E_MANAGER:add_event(Event({ @@ -1889,8 +1892,10 @@ local glass_edition = { if context.main_scoring and context.cardarea == G.play then if not card.ability.eternal - and pseudorandom("cry_fragile_destroy") - < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds + and ( + pseudorandom(pseudoseed("cry_fragile")) + > ((self.config.shatter_chance - 1) / self.config.shatter_chance) + ) then card.config.will_shatter = true end @@ -2004,9 +2009,15 @@ local double_sided = { "set_cry_misc", }, }, + -- gameset_config = { + -- modest = { disabled = true }, + -- mainline = { disabled = true }, + -- madness = { disabled = true }, + -- exp = {}, + -- }, extra_gamesets = { "exp" }, key = "double_sided", - shader = false, + shader = G.SETTINGS.reduced_motion and "ultrafoil" or "glitched", order = 32, weight = 10, extra_cost = 0, @@ -2018,6 +2029,11 @@ local double_sided = { vol = 0.3, }, cry_credits = { + art = { + "Samario", + -- Reduced Motion Shader + "Selicre", + }, code = { "Math", "lord-ruby", @@ -2505,6 +2521,7 @@ local miscitems = { oversat_shader, glitched_shader, glitched_shader2, + glitched_shaderb, astral_shader, blurred_shader, glass_shader, diff --git a/items/misc_joker.lua b/items/misc_joker.lua index 35634e6d1..44ce8d906 100644 --- a/items/misc_joker.lua +++ b/items/misc_joker.lua @@ -2,6 +2,7 @@ gameset_config = { modest = {extra = {chips = 1}, center = {rarity = 1, blueprint_compat = false, immutable = true, no_dbl = false}}, mainline = {center = {rarity = 2, blueprint_compat = true, immutable = true, no_dbl = true}}, + madness = {extra = {chips = 100}, center = {rarity = 3}}, cryptid_in_2025 = {extra = {chips = 1e308}, center = {rarity = "cry_exotic"}}, }, ]] @@ -188,13 +189,25 @@ local happyhouse = { and to_big(card.ability.immutable.check) > to_big(card.ability.immutable.trigger) then return { - e_mult = lenient_bignum(card.ability.immutable.mult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { number_format(card.ability.immutable.mult) }, + }), + Emult_mod = lenient_bignum(card.ability.immutable.mult), + colour = G.C.DARK_EDITION, card = card, } end if context.forcetrigger then return { - e_mult = lenient_bignum(card.ability.immutable.mult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { number_format(card.ability.immutable.mult) }, + }), + Emult_mod = lenient_bignum(card.ability.immutable.mult), + colour = G.C.DARK_EDITION, card = card, } end @@ -383,7 +396,7 @@ local queensgambit = { name = "cry-Queen's Gambit", key = "queens_gambit", pos = { x = 1, y = 0 }, - rarity = 2, + rarity = 1, order = 7, cost = 7, immutable = true, @@ -470,7 +483,7 @@ local wee_fib = { config = { extra = { mult = 0, - mult_mod = 2, + mult_mod = 3, }, }, gameset_config = { @@ -559,7 +572,7 @@ local whip = { pos = { x = 5, y = 3 }, config = { extra = { - Xmult_mod = 0.25, + Xmult_mod = 0.5, x_mult = 1, }, }, @@ -754,7 +767,7 @@ local cursor = { }, name = "cry-Cursor", key = "cursor", - config = { extra = { chips = 0, chip_mod = 6 } }, + config = { extra = { chips = 0, chip_mod = 8 } }, gameset_config = { modest = { extra = { @@ -1237,8 +1250,8 @@ local compound_interest = { key = "compound_interest", config = { extra = { - percent_mod = 10, - percent = 20, + percent_mod = 3, + percent = 12, }, }, pos = { x = 3, y = 2 }, @@ -1255,10 +1268,28 @@ local compound_interest = { }, } end, - cry_calc_interest = function(self, card, interest) - local old = lenient_bignum(card.ability.extra.percent) - card.ability.extra.percent = lenient_bignum(to_big(card.ability.extra.percent) + card.ability.extra.percent_mod) - return (1 + old / 100) * interest + calc_dollar_bonus = function(self, card) + if to_big(G.GAME.dollars) > to_big(0) then + local bonus = lenient_bignum( + math.max(0, math.floor(0.01 * to_big(card.ability.extra.percent) * (G.GAME.dollars or 1))) + ) + + local old = lenient_bignum(card.ability.extra.percent) + + card.ability.extra.percent = + lenient_bignum(to_big(card.ability.extra.percent) + card.ability.extra.percent_mod) + + Cryptid.apply_scale_mod(card, card.ability.extra.percent_mod, old, card.ability.extra.percent, { + base = { { "extra", "percent" } }, + scaler = { { "extra", "percent_mod" } }, + scaler_base = { card.ability.extra.percent_mod }, + }) + if to_big(bonus) > to_big(0) then + return bonus + end + else + return 0 + end end, cry_credits = { idea = { @@ -1309,7 +1340,7 @@ local big_cube = { key = "a_xchips", vars = { number_format(card.ability.extra.x_chips) }, }), - x_chips = lenient_bignum(card.ability.extra.x_chips), + Xchip_mod = lenient_bignum(card.ability.extra.x_chips), colour = G.C.CHIPS, } end @@ -1373,7 +1404,6 @@ local eternalflame = { } elseif context.selling_card - and context.card.config.center.set == "Joker" and (context.card.sell_cost >= 2 or Card.get_gameset(card) ~= "modest") and not context.blueprint then @@ -1566,6 +1596,56 @@ local seal_the_deal = { }, }, } +local chad = { + object_type = "Joker", + dependencies = { + items = { + "set_cry_meme", + }, + }, + name = "cry-Chad", + key = "chad", + pos = { x = 0, y = 3 }, + order = 71, + config = { + extra = { retriggers = 2 }, + immutable = { max_retriggers = 25 }, + }, + pools = { ["Meme"] = true }, + rarity = 3, + cost = 10, + blueprint_compat = true, + loc_vars = function(self, info_queue, center) + return { vars = { math.min(center.ability.immutable.max_retriggers, center.ability.extra.retriggers) } } + end, + atlas = "atlasone", + calculate = function(self, card, context) + if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= self then + if context.other_card == G.jokers.cards[1] then + return { + message = localize("k_again_ex"), + repetitions = to_number( + math.min(card.ability.immutable.max_retriggers, card.ability.extra.retriggers) + ), + card = card, + } + else + return nil, true + end + end + end, + cry_credits = { + idea = { + "Jevonn", + }, + art = { + "SDM_0", + }, + code = { + "Math", + }, + }, +} local jimball = { object_type = "Joker", dependencies = { @@ -1900,7 +1980,7 @@ local waluigi = { key = "waluigi", pos = { x = 0, y = 3 }, soul_pos = { x = 1, y = 3 }, - config = { extra = { Xmult = 1.5 } }, + config = { extra = { Xmult = 2.5 } }, loc_vars = function(self, info_queue, center) return { vars = { number_format(center.ability.extra.Xmult) } } end, @@ -1910,16 +1990,14 @@ local waluigi = { blueprint_compat = true, demicoloncompat = true, calculate = function(self, card, context) - if context.post_trigger or context.forcetrigger then - if not context.forcetrigger then - if Talisman and not Talisman.config_file.disable_anims then - G.E_MANAGER:add_event(Event({ - func = function() - context.other_card:juice_up(0.5, 0.5) - return true - end, - })) - end + if context.other_joker and context.other_joker.ability.set == "Joker" then + if not Talisman.config_file.disable_anims then + G.E_MANAGER:add_event(Event({ + func = function() + context.other_joker:juice_up(0.5, 0.5) + return true + end, + })) end return { message = localize({ @@ -1928,7 +2006,16 @@ local waluigi = { vars = { number_format(card.ability.extra.Xmult) }, }), Xmult_mod = lenient_bignum(card.ability.extra.Xmult), - card = card, + } + end + if context.forcetrigger then + return { + message = localize({ + type = "variable", + key = "a_xmult", + vars = { number_format(card.ability.extra.Xmult) }, + }), + Xmult_mod = lenient_bignum(card.ability.extra.Xmult), } end end, @@ -1938,6 +2025,7 @@ local waluigi = { "HexaCryonic", }, art = { + "MarioFan597", "HexaCryonic", }, code = { @@ -1957,7 +2045,7 @@ local wario = { order = 88, pos = { x = 2, y = 3 }, soul_pos = { x = 3, y = 3 }, - config = { extra = { money = 2 } }, + config = { extra = { money = 3 } }, demicoloncompat = true, loc_vars = function(self, info_queue, center) return { vars = { number_format(center.ability.extra.money) } } @@ -1967,6 +2055,18 @@ local wario = { return { dollars = lenient_bignum(card.ability.extra.money), card = context.other_context and context.other_context.blueprint_card or context.other_card or nil, + -- This function isn't working properly :sob: + --[[func = function() + G.E_MANAGER:add_event(Event({ + func = function() + if not Talisman.config_file.disable_anims then + (context.blueprint_card or card):juice_up(0.5, 0.5) + end + return true + end, + })) + return true + end,--]] } end end, @@ -2315,7 +2415,7 @@ local antennastoheaven = { key = "a_xchips", vars = { number_format(card.ability.extra.x_chips) }, }), - x_chips = lenient_bignum(card.ability.extra.x_chips), + Xchip_mod = lenient_bignum(card.ability.extra.x_chips), colour = G.C.CHIPS, } end @@ -2339,7 +2439,7 @@ local antennastoheaven = { key = "a_xchips", vars = { number_format(card.ability.extra.x_chips) }, }), - x_chips = lenient_bignum(card.ability.extra.x_chips), + Xchip_mod = lenient_bignum(card.ability.extra.x_chips), colour = G.C.CHIPS, } end @@ -2702,6 +2802,7 @@ local magnet = { config = { extra = { money = 2, + Xmoney = 5, slots = 4, }, }, @@ -2709,6 +2810,7 @@ local magnet = { modest = { extra = { money = 2, + Xmoney = 3, slots = 3, }, }, @@ -2722,7 +2824,7 @@ local magnet = { return { vars = { number_format(center.ability.extra.money), - 4 - (Card.get_gameset(card) == "modest" and 1 or 0), + number_format(center.ability.extra.Xmoney), number_format(center.ability.extra.slots), }, } @@ -2730,16 +2832,12 @@ local magnet = { atlas = "atlastwo", calculate = function(self, card, context) if context.forcetrigger then - ease_dollars( - lenient_bignum(to_big(card.ability.extra.money) * (4 - (Card.get_gameset(card) == "modest" and 1 or 0))) - ) + ease_dollars(lenient_bignum(to_big(card.ability.extra.money) * card.ability.extra.Xmoney)) end end, calc_dollar_bonus = function(self, card) if to_big(#G.jokers.cards) <= to_big(card.ability.extra.slots) then - return lenient_bignum( - to_big(card.ability.extra.money) * (4 - (Card.get_gameset(card) == "modest" and 1 or 0)) - ) + return lenient_bignum(to_big(card.ability.extra.money) * card.ability.extra.Xmoney) else return lenient_bignum(card.ability.extra.money) end @@ -3019,7 +3117,7 @@ local pirate_dagger = { key = "a_xchips", vars = { number_format(card.ability.extra.x_chips) }, }), - x_chips = lenient_bignum(card.ability.extra.x_chips), + Xchip_mod = lenient_bignum(card.ability.extra.x_chips), } end local my_pos = nil @@ -3093,7 +3191,7 @@ local pirate_dagger = { key = "a_xchips", vars = { number_format(card.ability.extra.x_chips) }, }), - x_chips = lenient_bignum(card.ability.extra.x_chips), + Xchip_mod = lenient_bignum(card.ability.extra.x_chips), } end end, @@ -3378,7 +3476,7 @@ local spaceglobe = { key = "a_xchips", vars = { number_format(card.ability.extra.x_chips) }, }), - x_chips = lenient_bignum(card.ability.extra.x_chips), + Xchip_mod = lenient_bignum(card.ability.extra.x_chips), colour = G.C.CHIPS, } end @@ -3391,7 +3489,7 @@ local spaceglobe = { key = "a_xchips", vars = { number_format(card.ability.extra.x_chips) }, }), - x_chips = lenient_bignum(card.ability.extra.x_chips), + Xchip_mod = lenient_bignum(card.ability.extra.x_chips), colour = G.C.CHIPS, } end @@ -3545,7 +3643,7 @@ local meteor = { and context.other_joker.edition.foil == true and card ~= context.other_joker then - if Talisman and not Talisman.config_file.disable_anims then + if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ func = function() context.other_joker:juice_up(0.5, 0.5) @@ -3641,7 +3739,7 @@ local exoplanet = { and context.other_joker.edition.holo == true and card ~= context.other_joker then - if Talisman and not Talisman.config_file.disable_anims then + if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ func = function() context.other_joker:juice_up(0.5, 0.5) @@ -3737,7 +3835,7 @@ local stardust = { and context.other_joker.edition.polychrome == true and card ~= context.other_joker then - if Talisman and not Talisman.config_file.disable_anims then + if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ func = function() context.other_joker:juice_up(0.5, 0.5) @@ -3824,7 +3922,7 @@ local rnjoker = { (card.ability.extra and card.ability.extra.value and card.ability.extra.value_mod) or (card.ability.extra and card.ability.extra.value) or 0, - denom, + card.ability.extra and card.ability.extra.cond_value or 0, num, }, } @@ -3984,7 +4082,7 @@ local rnjoker = { cards = { context.other_card } end for i2, j2 in ipairs(cards) do - if type(j2) == "table" and j2:is_face() then + if j2:is_face() then cond_passed = true times_passed = times_passed + 1 end @@ -4342,10 +4440,11 @@ local rnjoker = { end elseif j.cond == "odds" then if - pseudorandom_probability( + SMODS.pseudorandom_probability( card, + "rnj", 1, - card and card.ability.extra.odds or self.config.extra.odds + card and card.ability.extra.cond_value or 0 ) then cond_passed = true @@ -7429,7 +7528,7 @@ local coin = { loc_vars = function(self, info_queue, center) return { vars = { - number_format(center.ability.extra.money - 1), + number_format(center.ability.extra.money), number_format( center.ability.extra.money * (Card.get_gameset(card) ~= "modest" and center.ability.immutable.money_mod or 4) @@ -7442,8 +7541,8 @@ local coin = { if (context.selling_card and context.card.ability.set == "Joker") or context.forcetrigger then local mod = math.floor( pseudorandom(pseudoseed("coin")) - * ((Card.get_gameset(card) ~= "modest" and card.ability.immutable.money_mod or 4) + 1) - ) + * (Card.get_gameset(card) ~= "modest" and card.ability.immutable.money_mod or 4) + ) + 1 local option = lenient_bignum(to_big(card.ability.extra.money) * mod) ease_dollars(option) card_eval_status_text( @@ -7482,7 +7581,7 @@ local wheelhope = { pos = { x = 1, y = 1 }, config = { extra = { - extra = 0.2, + extra = 0.5, x_mult = 1, }, }, @@ -7564,7 +7663,7 @@ local oldblueprint = { key = "oldblueprint", pos = { x = 2, y = 1 }, config = { extra = { odds = 4 } }, - rarity = 2, + rarity = 1, cost = 6, order = 83, blueprint_compat = true, @@ -7611,12 +7710,10 @@ local oldblueprint = { }, } end - local num, denom = - SMODS.get_probability_vars(card, 1, card and card.ability.extra.odds or self.config.extra.odds) return { vars = { - num, - denom, + cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged), + card.ability.extra.odds, }, main_end = main_end, } @@ -7698,7 +7795,13 @@ local night = { if context.joker_main and G.GAME.current_round.hands_left == 0 then if to_big(card.ability.extra.mult) > to_big(1) then return { - e_mult = lenient_bignum(card.ability.extra.mult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { number_format(card.ability.extra.mult) }, + }), + Emult_mod = lenient_bignum(card.ability.extra.mult), + colour = G.C.DARK_EDITION, } end elseif @@ -7770,7 +7873,13 @@ local night = { end, })) return { - e_mult = lenient_bignum(card.ability.extra.mult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { number_format(card.ability.extra.mult) }, + }), + Emult_mod = lenient_bignum(card.ability.extra.mult), + colour = G.C.DARK_EDITION, } end end, @@ -7795,7 +7904,7 @@ local busdriver = { }, name = "cry-busdriver", key = "busdriver", - config = { extra = { mult = 25, odds = 4 } }, + config = { extra = { mult = 50, odds = 4 } }, pos = { x = 5, y = 1 }, rarity = 2, cost = 7, @@ -7804,15 +7913,14 @@ local busdriver = { blueprint_compat = true, demicoloncompat = true, loc_vars = function(self, info_queue, card) - local num, denom = - SMODS.get_probability_vars(card, 3, card and card.ability.extra.odds or self.config.extra.odds) - local num2 = denom - num + local prob = cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) + local oddy = math.max(1, card.ability.extra.odds) return { vars = { - num, + (oddy - 1 / prob), number_format(card.ability.extra.mult), - denom, - num2, + oddy, + (1 / prob), }, } end, @@ -7820,7 +7928,7 @@ local busdriver = { if context.joker_main and (to_big(card.ability.extra.mult) > to_big(0)) then local oddy = math.max(1, card.ability.extra.odds) if - pseudorandom_probability( + SMODS.pseudorandom_probability( card, "cry_busdriver", 3, @@ -7877,6 +7985,7 @@ local translucent = { dependencies = { items = { "set_cry_misc_joker", + "banana", }, }, name = "cry-translucent Joker", @@ -7889,9 +7998,6 @@ local translucent = { eternal_compat = false, demicoloncompat = true, atlas = "atlasthree", - loc_vars = function(self, queue, card) - queue[#queue + 1] = { set = "Other", key = "perishable", vars = { 5, 5 } } - end, calculate = function(self, card, context) if (context.selling_self and not (context.retrigger_joker or context.blueprint)) or context.forcetrigger then local jokers = {} @@ -7907,6 +8013,7 @@ local translucent = { local _card = copy_card(chosen_joker, nil, nil, nil, chosen_joker.edition and chosen_joker.edition.negative) _card:add_to_deck() + _card:set_banana(true) _card.ability.perishable = true -- Done manually to bypass perish compat _card.ability.perish_tally = G.GAME.perishable_rounds G.jokers:emplace(_card) @@ -8263,9 +8370,6 @@ local oldinvisible = { func = function() local card = copy_card(pseudorandom_element(eligibleJokers, pseudoseed("cry_oldinvis")), nil) - if card.edition and card.edition.negative then - card:set_edition() - end card:add_to_deck() G.jokers:emplace(card) return true @@ -8398,7 +8502,7 @@ local universe = { and context.other_joker.edition.cry_astral == true and card ~= context.other_joker then - if Talisman and not Talisman.config_file.disable_anims then + if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ func = function() context.other_joker:juice_up(0.5, 0.5) @@ -8407,7 +8511,12 @@ local universe = { })) end return { - e_mult = lenient_bignum(card.ability.extra.emult), + message = localize({ + type = "variable", + key = "a_powmult", + vars = { number_format(card.ability.extra.emult) }, + }), + Emult_mod = lenient_bignum(card.ability.extra.emult), colour = G.C.DARK_EDITION, } end @@ -8464,7 +8573,7 @@ local astral_bottle = { }, }, name = "cry-astral_bottle", - extra_gamesets = { "exp_modest", "exp_mainline" }, + extra_gamesets = { "exp_modest", "exp_mainline", "exp_madness" }, key = "astral_bottle", eternal_compat = false, pos = { x = 7, y = 0 }, @@ -8478,11 +8587,23 @@ local astral_bottle = { if not center.edition or (center.edition and not center.edition.cry_astral) then info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_astral end + return { + key = Cryptid.gameset_loc( + self, + { exp_modest = "mainline", exp_mainline = "mainline", exp_madness = "madness" } + ), + } end, calculate = function(self, card, context) if (context.selling_self and not context.retrigger_joker and not context.blueprint) or context.forcetrigger then local g = Cryptid.gameset(card) local effect = { { astral = true, perishable = true } } + if g == "exp_modest" or g == "exp_mainline" then + effect = { { astral = true }, { perishable = true } } + end + if g == "exp_madness" then + effect = { { astral = true } } + end local jokers = {} for i = 1, #G.jokers.cards do if G.jokers.cards[i] ~= card and not G.jokers.cards[i].debuff and not G.jokers.cards[i].edition then @@ -8559,7 +8680,7 @@ local kidnap = { order = 23, pos = { x = 1, y = 2 }, config = { - extra = { money = 3 }, + extra = { money = 4 }, }, gameset_config = { modest = { @@ -8782,7 +8903,6 @@ local tropical_smoothie = { order = 125, atlas = "atlastwo", pools = { ["Food"] = true }, - immutable = true, loc_vars = function(self, info_queue, center) return { vars = { number_format(center.ability.extra) } } end, @@ -8792,11 +8912,7 @@ local tropical_smoothie = { for i, v in pairs(G.jokers.cards) do if v ~= card then if not Card.no(v, "immutable", true) then - if v.ability.value_manip then - Cryptid.manipulate(v) - end Cryptid.manipulate(v, { value = card.ability.extra }) - v.ability.value_manip = true check = true end end @@ -8813,6 +8929,11 @@ local tropical_smoothie = { end end end, + cry_credits = { + art = { + "Ori", + }, + }, } local pumpkin = { object_type = "Joker", @@ -9094,7 +9215,6 @@ local necromancer = { }, }, } - local oil_lamp = { --You want it? It's yours my friend object_type = "Joker", dependencies = { @@ -9107,11 +9227,10 @@ local oil_lamp = { --You want it? It's yours my friend pos = { x = 4, y = 5 }, config = { extra = { increase = 1.2 } }, rarity = 3, - cost = 15, + cost = 10, order = 127, atlas = "atlastwo", demicoloncompat = true, - immutable = true, loc_vars = function(self, info_queue, card) card.ability.blueprint_compat_ui = card.ability.blueprint_compat_ui or "" card.ability.blueprint_compat_check = nil @@ -9174,11 +9293,7 @@ local oil_lamp = { --You want it? It's yours my friend if i < #G.jokers.cards then if not Card.no(G.jokers.cards[i + 1], "immutable", true) then check = true - if G.jokers.cards[i + 1].ability.value_manip then - Cryptid.manipulate(G.jokers.cards[i + 1]) - end Cryptid.manipulate(G.jokers.cards[i + 1], { value = card.ability.extra.increase }) - G.jokers.cards[i + 1].ability.value_manip = true end end end @@ -9207,7 +9322,6 @@ local oil_lamp = { --You want it? It's yours my friend }, }, } - local tax_fraud = { object_type = "Joker", dependencies = { @@ -9272,11 +9386,7 @@ local pity_prize = { name = "cry-Pity-Prize", key = "pity_prize", pos = { x = 5, y = 5 }, - config = { - extra = { - active = true, - }, - }, + config = {}, rarity = 1, cost = 2, atlas = "atlastwo", @@ -9284,75 +9394,62 @@ local pity_prize = { blueprint_compat = true, demicoloncompat = true, loc_vars = function(self, info_queue, center) - return { - key = Cryptid.gameset_loc(self, { modest = "modest" }), - vars = { - center.ability.extra.active and localize("cry_active") or localize("cry_inactive"), - }, - } + return { key = Cryptid.gameset_loc(self, { modest = "modest" }), vars = {} } end, calculate = function(self, card, context) - if context.after then - card.ability.extra.active = true - end if context.skipping_booster or context.forcetrigger then - if card.ability.extra.active or context.forcetrigger then - if not context.forcetrigger then - card.ability.extra.active = false - end - local tag_key - repeat - tag_key = get_next_tag_key("cry_pity_prize") - until tag_key ~= "tag_boss" --I saw pickle not generating boss tags because it apparently causes issues, so I did the same here - -- this is my first time seeing repeat... wtf - local tag = Tag(tag_key) - tag.ability.shiny = Cryptid.is_shiny() - if tag.name == "Orbital Tag" then - local _poker_hands = {} - for k, v in pairs(G.GAME.hands) do - if v.visible then - _poker_hands[#_poker_hands + 1] = k - end + local tag_key + repeat + tag_key = get_next_tag_key("cry_pity_prize") + until tag_key ~= "tag_boss" --I saw pickle not generating boss tags because it apparently causes issues, so I did the same here + -- this is my first time seeing repeat... wtf + local tag = Tag(tag_key) + tag.ability.shiny = Cryptid.is_shiny() + if tag.name == "Orbital Tag" then + local _poker_hands = {} + for k, v in pairs(G.GAME.hands) do + if v.visible then + _poker_hands[#_poker_hands + 1] = k end - tag.ability.orbital_hand = pseudorandom_element(_poker_hands, pseudoseed("cry_pity_prize")) end - add_tag(tag) - if - Card.get_gameset(card) == "modest" - and ((not context.blueprint and not context.retrigger_joker) or context.forcetrigger) - then - G.E_MANAGER:add_event(Event({ - func = function() - play_sound("tarot1") - card.T.r = -0.2 - card:juice_up(0.3, 0.4) - card.states.drag.is = true - card.children.center.pinch.x = true - G.E_MANAGER:add_event(Event({ - trigger = "after", - delay = 0.3, - blockable = false, - func = function() - G.jokers:remove_card(card) - card:remove() - card = nil - return true - end, - })) - return true - end, - })) - card_eval_status_text( - card, - "extra", - nil, - nil, - nil, - { message = localize("k_extinct_ex"), colour = G.C.FILTER } - ) - end - return nil, true + tag.ability.orbital_hand = pseudorandom_element(_poker_hands, pseudoseed("cry_pity_prize")) + end + add_tag(tag) + if + Card.get_gameset(card) == "modest" + and ((not context.blueprint and not context.retrigger_joker) or context.forcetrigger) + then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound("tarot1") + card.T.r = -0.2 + card:juice_up(0.3, 0.4) + card.states.drag.is = true + card.children.center.pinch.x = true + G.E_MANAGER:add_event(Event({ + trigger = "after", + delay = 0.3, + blockable = false, + func = function() + G.jokers:remove_card(card) + card:remove() + card = nil + return true + end, + })) + return true + end, + })) + card_eval_status_text( + card, + "extra", + nil, + nil, + nil, + { message = localize("k_extinct_ex"), colour = G.C.FILTER } + ) end + return nil, true end end, cry_credits = { @@ -9380,9 +9477,8 @@ local digitalhallucinations = { order = 130, config = { odds = 2 }, loc_vars = function(self, info_queue, card) - local num, denom = SMODS.get_probability_vars(card, 1, card and card.ability.odds or self.config.odds) return { - vars = { num, denom }, + vars = { cry_prob(card.ability.cry_prob, card.ability.odds, card.ability.cry_rigged), card.ability.odds }, } end, atlas = "atlasthree", @@ -9395,7 +9491,7 @@ local digitalhallucinations = { if context.open_booster - and (pseudorandom_probability(card, "digi", 1, card and card.ability.odds or self.config.odds)) + and (SMODS.pseudorandom_probability(card, "digi", 1, card and card.ability.odds or self.config.odds)) then local boosty = context.card -- finally mod compat? @@ -9761,8 +9857,8 @@ local huntingseason = { -- If played hand contains three cards, destroy the midd pos = { x = 4, y = 5 }, order = 134, immutable = true, - rarity = 3, - cost = 8, + rarity = 2, + cost = 7, blueprint_compat = false, atlas = "atlasone", calculate = function(self, card, context) @@ -9889,7 +9985,7 @@ local familiar_currency = { name = "cry-Familiar Currency", key = "familiar_currency", pos = { x = 0, y = 6 }, - config = { extra = 19, taken_so_far = 0 }, + config = { extra = 19 }, order = 137, rarity = 3, cost = 0, @@ -9897,7 +9993,7 @@ local familiar_currency = { demicoloncompat = true, atlas = "atlasone", loc_vars = function(self, info_queue, center) - return { vars = { center.ability.extra, center.ability.taken_so_far } } + return { vars = { center.ability.extra } } end, calculate = function(self, card, context) if @@ -9906,41 +10002,29 @@ local familiar_currency = { and not context.repetition and not (context.blueprint_card or card).getting_sliced then - if to_big(G.GAME.dollars - G.GAME.bankrupt_at) >= to_big(card.ability.extra) then + if + to_big(G.GAME.dollars - G.GAME.bankrupt_at) >= to_big(card.ability.extra) + and #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit + then + G.GAME.joker_buffer = G.GAME.joker_buffer + 1 ease_dollars(-card.ability.extra) - card.ability.taken_so_far = card.ability.taken_so_far + 1 + G.E_MANAGER:add_event(Event({ + func = function() + SMODS.add_card({ set = "Meme", key_append = "fcc" }) + G.GAME.joker_buffer = 0 + return true + end, + })) card_eval_status_text( context.blueprint_card or card, "extra", nil, nil, nil, - { message = localize("k_upgrade_ex"), colour = G.C.BLUE } + { message = localize("k_plus_joker"), colour = G.C.BLUE } ) end end - if context.selling_self or context.forcetrigger then - for i = 1, card.ability.taken_so_far do - if #G.jokers.cards + G.GAME.joker_buffer + 1 < G.jokers.config.card_limit then - G.GAME.joker_buffer = G.GAME.joker_buffer + 1 - G.E_MANAGER:add_event(Event({ - func = function() - SMODS.add_card({ set = "Meme", key_append = "fcc" }) - G.GAME.joker_buffer = 0 - return true - end, - })) - card_eval_status_text( - context.blueprint_card or card, - "extra", - nil, - nil, - nil, - { message = localize("k_joker_plus"), colour = G.C.BLUE } - ) - end - end - end if context.forcetrigger then ease_dollars(-card.ability.extra) G.E_MANAGER:add_event(Event({ @@ -10456,7 +10540,7 @@ local fading_joker = { -- +1 to all listed probabilities for the highest cat tag "set_cry_misc_joker", }, }, - name = "cry-fading_joker", + name = "cry-paved_joker", key = "fading_joker", atlas = "atlasone", pos = { x = 2, y = 6 }, @@ -10597,6 +10681,7 @@ local miscitems = { big_cube, nice, sus, + chad, jimball, waluigi, wario, @@ -10668,6 +10753,7 @@ local miscitems = { --carved_pumpkin, cookie, necromancer, + oil_lamp, tax_fraud, pity_prize, digitalhallucinations, @@ -10706,7 +10792,6 @@ local miscitems = { paved_joker, fading_joker, poor_joker, - oil_lamp, } return { diff --git a/items/planet.lua b/items/planet.lua index ceb3c9a2b..7ccdee340 100644 --- a/items/planet.lua +++ b/items/planet.lua @@ -588,7 +588,7 @@ local planetlua = { and ( SMODS.pseudorandom_probability( card, - "nstar", + "nstar", --this is how it was before i didnt make it use the same seed 1, card and card.ability.extra.odds or self.config.extra.odds ) diff --git a/items/pointer.lua b/items/pointer.lua index b8236519c..07957ddab 100644 --- a/items/pointer.lua +++ b/items/pointer.lua @@ -36,6 +36,7 @@ local pointer = { card.ability.cry_multiuse = card.ability.cry_multiuse + 1 end G.GAME.USING_CODE = true + G.OVERLAY_MENU_POINTER = true G.E_MANAGER:add_event(Event({ func = function() G.GAME.USING_POINTER = true @@ -56,10 +57,6 @@ local pointer = { G.consumeables:emplace(copy) G.FUNCS.exit_overlay_menu_code() ccl(self) - if G.GAME.CODE_DESTROY_CARD then - G.GAME.CODE_DESTROY_CARD:start_dissolve() - G.GAME.CODE_DESTROY_CARD = nil - end elseif self.config.center.set == "Booster" then G.FUNCS.exit_overlay_menu_code() local card = copy_card(self) @@ -69,10 +66,6 @@ local pointer = { card:start_materialize() created = true ccl(self) - if G.GAME.CODE_DESTROY_CARD then - G.GAME.CODE_DESTROY_CARD:start_dissolve() - G.GAME.CODE_DESTROY_CARD = nil - end elseif self.config.center.key == "c_base" or self.config.center.set == "Enhanced" @@ -124,10 +117,6 @@ local pointer = { table.insert(G.playing_cards, card) G.FUNCS.exit_overlay_menu_code() G.GAME.POINTER_PLAYING = nil - if G.GAME.CODE_DESTROY_CARD then - G.GAME.CODE_DESTROY_CARD:start_dissolve() - G.GAME.CODE_DESTROY_CARD = nil - end end else G.ENTERED_CARD = self.config.center.key @@ -136,10 +125,6 @@ local pointer = { if ret then G.FUNCS.exit_overlay_menu_code() ccl(self) - if G.GAME.CODE_DESTROY_CARD then - G.GAME.CODE_DESTROY_CARD:start_dissolve() - G.GAME.CODE_DESTROY_CARD = nil - end else G.GAME.USING_CODE = true G.GAME.USING_POINTER = true @@ -416,6 +401,13 @@ local pointer = { end t.ability.orbital_hand = pseudorandom_element(_poker_hands, pseudoseed("cry_pointer_orbital")) end + if current_card == "tag_cry_rework" then + --tbh this is the most unbalanced part of the card + t.ability.rework_edition = + pseudorandom_element(G.P_CENTER_POOLS.Edition, pseudoseed("cry_pointer_edition")).key + t.ability.rework_key = + pseudorandom_element(G.P_CENTER_POOLS.Joker, pseudoseed("cry_pointer_joker")).key + end G.CHOOSE_CARD:remove() G.GAME.USING_CODE = false G.GAME.USING_POINTER = false @@ -501,6 +493,7 @@ local pointer = { G.GAME.USING_CODE = false G.GAME.USING_POINTER = false G.DEBUG_POINTER = false + return true end end if not current_card then -- if card isn't created yet, try playing cards @@ -752,6 +745,7 @@ local pointer = { end, })) draw_card(G.play, G.deck, 90, "up", nil) + return true end end end @@ -1993,7 +1987,7 @@ local aliases = { "Rerollsurplus", "Reroll Voucher", }, - v__glut = { + v_reroll_glut = { "Reroll Glut", "Rerollglut", "Reroll Surplus+", @@ -2556,10 +2550,10 @@ local aliases = { }, tag_cry_epic = { "Epic Tag", - "Full-price Epic Joker", - "Full price Epic Joker", - "Full price Epic", - "Full-price Epic", + "Half-price Epic Joker", + "Half price Epic Joker", + "Half price Epic", + "Half-price Epic", }, tag_cry_gambler = { "Gambler Tag", @@ -2622,6 +2616,13 @@ local aliases = { "Quadruple", "Quadruple Tag", }, + tag_cry_quintuple = { + "Quintuple", + "Quintuple Tag", + }, + tag_cry_rework = { + "Rework Tag", + }, tag_cry_schematic = { "Schematic", "Schematic Tag", @@ -2685,7 +2686,6 @@ return { --print("[CRYPTID] Inserting Pointer Aliases") local alify = Cryptid.pointeraliasify Cryptid.pointerblistifytype("rarity", "cry_exotic", nil) - Cryptid.pointerblistifytype("misc", "hidden", nil) for key, aliasesTable in pairs(aliases) do for _, alias in pairs(aliasesTable) do alify(key, alias, nil) diff --git a/items/sleeve.lua b/items/sleeve.lua index 7b35f22d8..1743d94b3 100644 --- a/items/sleeve.lua +++ b/items/sleeve.lua @@ -68,7 +68,7 @@ if CardSleeves then trigger_effect = function(self, args) end, apply = function(self) - change_shop_size(1) + change_shop_size(2) G.GAME.modifiers.cry_equilibrium = true end, }) @@ -78,7 +78,7 @@ if CardSleeves then name = "Misprinted Sleeve", atlas = "atlasSleeves", pos = { x = 3, y = 0 }, - config = { cry_misprint_min = 0.24, cry_misprint_max = 4 }, + config = { cry_misprint_min = 0.1, cry_misprint_max = 10 }, unlocked = true, unlock_condition = { deck = "Misprint Deck", stake = 1 }, apply = function(self) @@ -112,27 +112,28 @@ if CardSleeves then name = "Wormhole Sleeve", atlas = "atlasSleeves", pos = { x = 0, y = 0 }, + config = { cry_wormhole = true, cry_negative_rate = 20, joker_slot = -2 }, unlocked = true, unlock_condition = { deck = "Wormhole Deck", stake = 1 }, loc_vars = function(self) return { vars = {} } end, - calculate = function(self, back, context) - if - context.end_of_round - and not context.individual - and not context.repetition - and not context.blueprint - and G.GAME.blind - and G.GAME.blind.config.blind - and G.GAME.blind.config.blind.boss - then - if G.jokers.cards[1] and G.jokers.cards[1].config.center.rarity ~= "cry_exotic" then - Cryptid.with_deck_effects(G.jokers.cards[1], function(card) - Cryptid.upgrade_rarity(card, "cry_wormhole") - end) - end - end + apply = function(self) + G.E_MANAGER:add_event(Event({ + func = function() + if G.jokers then + local card = + create_card("Joker", G.jokers, nil, "cry_exotic", nil, nil, nil, "cry_wormholesleeve") + card:add_to_deck() + card:start_materialize() + G.jokers:emplace(card) + return true + end + end, + })) + G.GAME.modifiers.cry_negative_rate = (G.GAME.modifiers.cry_negative_rate or 1) + * self.config.cry_negative_rate + G.GAME.starting_params.joker_slots = G.GAME.starting_params.joker_slots + self.config.joker_slot end, }) @@ -212,7 +213,7 @@ if CardSleeves then update_hand_text({ delay = 0 }, { mult = args.mult, chips = args.chips }) G.E_MANAGER:add_event(Event({ func = function() - play_sound("cry_emult", 1) + play_sound("talisman_emult", 1) attention_text({ scale = 1.4, text = localize("cry_critical_hit_ex"), @@ -517,6 +518,8 @@ if CardSleeves then then self.config.cry_spooky = true end + + return { key = Cryptid.gameset_loc(self, { mainline = "balanced", modest = "balanced" }) } end, calculate = function(self, sleeve, context) if context.create_card and context.card then @@ -1286,7 +1289,7 @@ if CardSleeves then update_hand_text({ delay = 0 }, { mult = context.mult, chips = context.chips }) G.E_MANAGER:add_event(Event({ func = function() - play_sound("cry_emult", 1) + play_sound("talisman_emult", 1) attention_text({ scale = 1.4, text = localize("cry_critical_hit_ex"), diff --git a/items/spectral.lua b/items/spectral.lua index 2fddd2ed6..ecf3b3a53 100644 --- a/items/spectral.lua +++ b/items/spectral.lua @@ -20,25 +20,18 @@ local lock = { name = "cry-Lock", key = "lock", pos = { x = 0, y = 1 }, - config = { extra = 1 }, + config = {}, cost = 4, order = 451, atlas = "atlasnotjokers", loc_vars = function(self, info_queue, card) info_queue[#info_queue + 1] = { key = "eternal", set = "Other" } - return { - vars = { - card.ability.extra, - }, - } end, can_use = function(self, card) - local cards = Cryptid.get_highlighted_cards({ G.jokers }, card, 1, card.ability.extra) - return #cards > 0 and #cards <= card.ability.extra + return #G.jokers.cards > 0 end, use = function(self, card, area, copier) local used_consumable = copier or card - local cards = Cryptid.get_highlighted_cards({ G.jokers }, card, 1, card.ability.extra) check_for_unlock({ cry_used_consumable = "c_cry_lock" }) local target = #G.jokers.cards == 1 and G.jokers.cards[1] or G.jokers.cards[math.random(#G.jokers.cards)] G.E_MANAGER:add_event(Event({ @@ -50,23 +43,23 @@ local lock = { return true end, })) - for i = 1, #cards do - local percent = 1.15 - (i - 0.999) / (#cards - 0.998) * 0.3 + for i = 1, #G.jokers.cards do + local percent = 1.15 - (i - 0.999) / (#G.jokers.cards - 0.998) * 0.3 G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.15, func = function() - cards[i]:flip() + G.jokers.cards[i]:flip() play_sound("card1", percent) - cards[i]:juice_up(0.3, 0.3) + G.jokers.cards[i]:juice_up(0.3, 0.3) return true end, })) end delay(0.2) - for i = 1, #cards do - local CARD = cards[i] - local percent = 0.85 + (i - 0.999) / (#cards - 0.998) * 0.3 + for i = 1, #G.jokers.cards do + local CARD = G.jokers.cards[i] + local percent = 0.85 + (i - 0.999) / (#G.jokers.cards - 0.998) * 0.3 G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.15, @@ -156,7 +149,7 @@ local vacuum = { name = "cry-Vacuum", key = "vacuum", pos = { x = 3, y = 1 }, - config = { extra = 3 }, + config = { extra = 4 }, cost = 4, order = 452, atlas = "atlasnotjokers", @@ -248,23 +241,14 @@ local hammerspace = { name = "cry-Hammerspace", key = "hammerspace", pos = { x = 4, y = 3 }, - config = { extra = 2 }, + config = {}, cost = 4, order = 453, atlas = "atlasnotjokers", - loc_vars = function(self, _, card) - return { - vars = { - number_format(card.ability.extra), - number_format(G.GAME.hammerspace_mod_price or 0), - }, - } - end, can_use = function(self, card) return #G.hand.cards > 0 end, use = function(self, card, area, copier) - G.GAME.hammerspace_mod_price = (G.GAME.hammerspace_mod_price or 0) + card.ability.extra local used_consumable = copier or card check_for_unlock({ cry_used_consumable = "c_cry_hammerspace" }) G.E_MANAGER:add_event(Event({ @@ -474,17 +458,10 @@ local replica = { name = "cry-Replica", key = "replica", pos = { x = 1, y = 1 }, - config = { extra = 1 }, + config = {}, cost = 4, order = 455, atlas = "atlasnotjokers", - loc_vars = function(self, _, card) - return { - vars = { - number_format(card.ability.extra), - }, - } - end, can_use = function(self, card) return #G.hand.cards > 0 end, @@ -492,7 +469,6 @@ local replica = { local used_consumable = copier or card check_for_unlock({ cry_used_consumable = "c_cry_replica" }) local chosen_card = pseudorandom_element(G.hand.cards, pseudoseed("cry_replica_choice")) - G.hand.config.card_limit = G.hand.config.card_limit - card.ability.extra G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.4, @@ -567,7 +543,7 @@ local analog = { name = "cry-Analog", key = "analog", pos = { x = 3, y = 0 }, - config = { copies = 1, ante = 1, immutable = { max_copies = 200, max_ante = 1e300 } }, + config = { copies = 2, ante = 1, immutable = { max_copies = 200, max_ante = 1e300 } }, loc_vars = function(self, info_queue, center) return { vars = { @@ -585,8 +561,27 @@ local analog = { use = function(self, card, area, copier) check_for_unlock({ cry_used_consumable = "c_cry_analog" }) local used_consumable = copier or card + local deletable_jokers = {} + for k, v in pairs(G.jokers.cards) do + if not v.ability.eternal then + deletable_jokers[#deletable_jokers + 1] = v + end + end local chosen_joker = pseudorandom_element(G.jokers.cards, pseudoseed("cry_analog_choice")) local _first_dissolve = nil + G.E_MANAGER:add_event(Event({ + trigger = "before", + delay = 0.75, + func = function() + for k, v in pairs(deletable_jokers) do + if v ~= chosen_joker then + v:start_dissolve(nil, _first_dissolve) + _first_dissolve = true + end + end + return true + end, + })) for i = 1, to_number(math.min(card.ability.copies, card.ability.immutable.max_copies)) do G.E_MANAGER:add_event(Event({ trigger = "before", @@ -632,11 +627,11 @@ local ritual = { if not center.edition or (center.edition and not center.edition.cry_mosaic) then info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_mosaic end - if not center.edition or (center.edition and not center.edition.cry_oversat) then - info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_oversat + if not center.edition or (center.edition and not center.edition.negative) then + info_queue[#info_queue + 1] = G.P_CENTERS.e_negative end - if not center.edition or (center.edition and not center.edition.cry_gold) then - info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_gold + if not center.edition or (center.edition and not center.edition.cry_astral) then + info_queue[#info_queue + 1] = G.P_CENTERS.e_cry_astral end return { vars = { center.ability.max_highlighted } } end, @@ -672,12 +667,12 @@ local ritual = { if highlighted then local random_result = pseudorandom(pseudoseed("cry-Ritual")) if random_result >= 5 / 6 then - highlighted:set_edition({ cry_gold = true }) + highlighted:set_edition({ cry_astral = true }) else if random_result >= 1 / 2 then highlighted:set_edition({ cry_mosaic = true }) else - highlighted:set_edition({ cry_oversat = true }) + highlighted:set_edition({ negative = true }) end end highlighted.will_be_editioned = nil @@ -726,11 +721,6 @@ local adversary = { if not center.edition or (center.edition and not center.edition.negative) then info_queue[#info_queue + 1] = G.P_CENTERS.e_negative end - return { - vars = { - G.jokers and number_format(1 + #G.jokers.cards) or "1", - }, - } end, can_use = function(self, card) return #G.jokers.cards > 0 @@ -790,8 +780,7 @@ local adversary = { })) G.E_MANAGER:add_event(Event({ func = function() - G.GAME.cry_shop_joker_price_modifier = G.GAME.cry_shop_joker_price_modifier - * number_format(1 + #G.jokers.cards) + G.GAME.cry_shop_joker_price_modifier = G.GAME.cry_shop_joker_price_modifier * 2 for k, v in pairs(G.I.CARD) do if v.set_cost then v:set_cost() @@ -822,7 +811,7 @@ local chambered = { name = "cry-Chambered", key = "chambered", pos = { x = 5, y = 0 }, - config = { extra = { num_copies = 1 } }, + config = { extra = { num_copies = 3 } }, misprintize_caps = { extra = { num_copies = 100 } }, loc_vars = function(self, info_queue, card) info_queue[#info_queue + 1] = { key = "e_negative_consumable", set = "Edition", config = { extra = 1 } } @@ -852,19 +841,16 @@ local chambered = { end end target = pseudorandom_element(filteredCons, pseudoseed("chambered")) - if Overflow then + for i = 1, card.ability.extra.num_copies do G.E_MANAGER:add_event(Event({ func = function() local card_copy = copy_card(target, nil) + if Incantation then + card_copy:setQty(1) + end card_copy:set_edition({ negative = true }, true) card_copy:add_to_deck() G.consumeables:emplace(card_copy) - G.E_MANAGER:add_event(Event({ - func = function() - Overflow.set_amount(card_copy, card.ability.extra.num_copies) - return true - end, - })) return true end, })) @@ -876,29 +862,6 @@ local chambered = { nil, { message = localize("k_duplicated_ex"), colour = G.C.SECONDARY_SET.Spectral } ) - else - for i = 1, card.ability.extra.num_copies do - G.E_MANAGER:add_event(Event({ - func = function() - local card_copy = copy_card(target, nil) - if Incantation then - card_copy:setQty(1) - end - card_copy:set_edition({ negative = true }, true) - card_copy:add_to_deck() - G.consumeables:emplace(card_copy) - return true - end, - })) - card_eval_status_text( - target, - "extra", - nil, - nil, - nil, - { message = localize("k_duplicated_ex"), colour = G.C.SECONDARY_SET.Spectral } - ) - end end end, demicoloncompat = true, @@ -927,25 +890,32 @@ local conduit = { order = 460, atlas = "atlasnotjokers", can_use = function(self, card) - if #G.jokers.highlighted == 2 then - local both_match = true - if G.jokers.highlighted[1].edition and G.jokers.highlighted[1].edition.cry_double_sided then - both_match = G.jokers.highlighted[2].edition and G.jokers.highlighted[2].edition.cry_double_sided - end - if G.jokers.highlighted[2].edition and G.jokers.highlighted[2].edition.cry_double_sided then - both_match = G.jokers.highlighted[1].edition and G.jokers.highlighted[1].edition.cry_double_sided - end - return both_match - elseif #G.hand.highlighted == 2 then - local both_match = true - if G.hand.highlighted[1].edition and G.hand.highlighted[1].edition.cry_double_sided then - both_match = G.hand.highlighted[2].edition and G.hand.highlighted[2].edition.cry_double_sided + local combinedTable = {} + dbl = false + no_dbl = false + + for _, value in ipairs(G.hand.highlighted) do + if value ~= card then + if Card.no(value, "dbl") then + no_dbl = true + elseif value.edition and value.edition.cry_double_sided then + dbl = true + end + table.insert(combinedTable, value) end - if G.hand.highlighted[2].edition and G.hand.highlighted[2].edition.cry_double_sided then - both_match = G.hand.highlighted[1].edition and G.hand.highlighted[1].edition.cry_double_sided + end + + for _, value in ipairs(G.jokers.highlighted) do + if value ~= card then + if Card.no(value, "dbl") then + no_dbl = true + elseif value.edition and value.edition.cry_double_sided then + dbl = true + end + table.insert(combinedTable, value) end - return both_match end + return (#combinedTable == 2 and not (dbl and no_dbl)) end, use = function(self, card, area, copier) local used_consumable = copier or card @@ -1070,11 +1040,15 @@ local white_hole = { atlas = "atlasnotjokers", hidden = true, --default soul_rate of 0.3% in spectral packs is used soul_set = "Planet", + loc_vars = function(self, info_queue, card) + return { key = Card.get_gameset(card) == "modest" and "c_cry_white_hole" or "c_cry_white_hole2" } + end, can_use = function(self, card) return true end, use = function(self, card, area, copier) local used_consumable = copier or card + local modest = Card.get_gameset(used_consumable) == "modest" --Get most played hand type (logic yoinked from Telescope) local _hand, _tally = nil, -1 for k, v in ipairs(G.handlist) do @@ -1093,7 +1067,7 @@ local white_hole = { (v ~= "cry_Bulwark" and v ~= "cry_Clusterfuck" and v ~= "cry_UltPair" and v ~= "cry_WholeDeck") or Cryptid.enabled("set_cry_poker_hand_stuff") == true then - if v ~= _hand then + if v ~= _hand or not modest then removed_levels = removed_levels + this_removed_levels level_up_hand(used_consumable, v, true, -this_removed_levels) end diff --git a/items/spooky.lua b/items/spooky.lua index 592e285b4..fe8c8c7ce 100644 --- a/items/spooky.lua +++ b/items/spooky.lua @@ -20,19 +20,14 @@ local cotton_candy = { (context.selling_self and not context.retrigger_joker and not context.blueprint_card) or context.forcetrigger then - local jokers = {} - for i, v in pairs(G.jokers.cards) do - if not v.edition or not v.edition.negative then - if v ~= card then - jokers[#jokers + 1] = v + for i = 1, #G.jokers.cards do + if G.jokers.cards[i] == card then + if i > 1 then + G.jokers.cards[i - 1]:set_edition({ negative = true }) + end + if i < #G.jokers.cards then + G.jokers.cards[i + 1]:set_edition({ negative = true }) end - end - end - pseudoshuffle(jokers, pseudoseed("cry_cotton_candy")) - if jokers[1] then - jokers[1]:set_edition({ negative = true }) - if jokers[2] then - jokers[2]:set_edition({ negative = true }) end end end @@ -923,7 +918,7 @@ local candy_basket = { extra = { candies = 0, candy_mod = 1, - candy_boss_mod = 1, + candy_boss_mod = 2, }, immutable = { current_win_count = 0, @@ -1139,7 +1134,7 @@ local ghost = { if SMODS.pseudorandom_probability( card, - "planetlua", + "ghostdestroy", 1, (card and card.ability.extra.odds or self.config.extra.odds) * card.ability.extra.possess_rate ) @@ -1590,7 +1585,7 @@ local candy_buttons = { pos = { x = 1, y = 2 }, order = 140, rarity = "cry_candy", - config = { extra = { rerolls = 10 } }, + config = { extra = { rerolls = 15 } }, cost = 10, atlas = "atlasspooky", blueprint_compat = true, @@ -1670,22 +1665,12 @@ local jawbreaker = { if G.jokers.cards[i] == card then if i > 1 then if not Card.no(G.jokers.cards[i - 1], "immutable", true) then - if G.jokers.cards[i - 1].ability.value_manip then - Cryptid.manipulate(G.jokers.cards[i - 1]) - end Cryptid.manipulate(G.jokers.cards[i - 1], { value = 2 }) - local v = G.jokers.cards[i - 1] - v.ability.value_manip = true end end if i < #G.jokers.cards then if not Card.no(G.jokers.cards[i + 1], "immutable", true) then - if G.jokers.cards[i + 1].ability.value_manip then - Cryptid.manipulate(G.jokers.cards[i + 1]) - end Cryptid.manipulate(G.jokers.cards[i + 1], { value = 2 }) - local v = G.jokers.cards[i + 1] - v.ability.value_manip = true end end end @@ -1792,7 +1777,9 @@ local brittle = { config = { extra = { rounds = 9 } }, pools = { ["Food"] = true }, loc_vars = function(self, info_queue, center) - info_queue[#info_queue + 1] = G.P_CENTERS.m_glass + info_queue[#info_queue + 1] = G.P_CENTERS.m_stone + info_queue[#info_queue + 1] = G.P_CENTERS.m_gold + info_queue[#info_queue + 1] = G.P_CENTERS.m_steel return { vars = { number_format(center.ability.extra.rounds) } } end, blueprint_compat = true, @@ -1807,7 +1794,7 @@ local brittle = { local _card = context.scoring_hand[#context.scoring_hand] if _card and not _card.brittled then card.ability.extra.rounds = lenient_bignum(to_big(card.ability.extra.rounds) - 1) - local enhancement = "m_glass" + local enhancement = pseudorandom_element({ "m_stone", "m_gold", "m_steel" }, pseudoseed("cry_brittle")) _card.brittled = true _card:set_ability(G.P_CENTERS[enhancement], nil, true) G.E_MANAGER:add_event(Event({ diff --git a/items/stake.lua b/items/stake.lua index 67c5f7be8..dcce914e3 100644 --- a/items/stake.lua +++ b/items/stake.lua @@ -1,118 +1,348 @@ -local ruby = { +--These don't use the gameset system currently. +--Will probably add when there's a way to view stakes in the Collection +local pink = { object_type = "Stake", - name = "cry-Ruby Stake", - key = "ruby", + name = "cry-Pink Stake", + key = "pink", pos = { x = 0, y = 0 }, atlas = "stake", applied_stakes = { "gold" }, prefix_config = { applied_stakes = { mod = false } }, + modifiers = function() + G.GAME.modifiers.scaling = (G.GAME.modifiers.scaling or 1) + 1 + end, + order = 9, + colour = HEX("ff5ee6"), +} +local brown = { + object_type = "Stake", + name = "cry-Brown Stake", + key = "brown", + pos = { x = 1, y = 0 }, + atlas = "stake", + applied_stakes = { "cry_pink" }, + modifiers = function() + G.GAME.modifiers.cry_eternal_perishable_compat = true + end, + order = 10, + colour = HEX("883200"), +} +local yellow = { + object_type = "Stake", + name = "cry-Yellow Stake", + key = "yellow", + pos = { x = 2, y = 0 }, + atlas = "stake", + applied_stakes = { "cry_brown" }, + modifiers = function() + G.GAME.modifiers.cry_any_stickers = true + end, + order = 11, + colour = HEX("f7ff1f"), +} +local jade = { + object_type = "Stake", + name = "cry-Jade Stake", + key = "jade", + pos = { x = 3, y = 0 }, + atlas = "stake", + applied_stakes = { "cry_yellow" }, + modifiers = function() + G.GAME.modifiers.flipped_cards = 20 + end, + shiny = true, + order = 12, + colour = HEX("78953c"), +} +local cyan = { + object_type = "Stake", + name = "cry-Cyan Stake", + key = "cyan", + pos = { x = 4, y = 0 }, + atlas = "stake", + applied_stakes = { "cry_jade" }, + modifiers = function() + G.GAME.modifiers.cry_rarer_jokers = true + -- Note that this is not the exact rarity as the old lovely patch might be nerf/buff to the stake + G.GAME.uncommon_mod = 0.8 + G.GAME.rare_mod = 0.8 + end, + order = 13, + colour = HEX("39ffcc"), +} +local gray = { + object_type = "Stake", + name = "cry-Gray Stake", + key = "gray", + pos = { x = 0, y = 1 }, + atlas = "stake", + applied_stakes = { "cry_cyan" }, + modifiers = function() + G.GAME.modifiers.cry_reroll_scaling = 2 + end, + order = 14, + colour = HEX("999999"), +} +local crimson = { + object_type = "Stake", + name = "cry-Crimson Stake", + key = "crimson", + pos = { x = 1, y = 1 }, + atlas = "stake", + applied_stakes = { "cry_gray" }, + modifiers = function() + G.GAME.modifiers.cry_voucher_restock_antes = 2 + end, + order = 15, + colour = HEX("800000"), +} +local diamond = { + object_type = "Stake", + name = "cry-Diamond Stake", + key = "diamond", + pos = { x = 2, y = 1 }, + atlas = "stake", + applied_stakes = { "cry_crimson" }, modifiers = function() G.GAME.win_ante = 10 end, shiny = true, - order = 2, + order = 16, + colour = HEX("88e5d9"), } - -local topaz = { +local amber = { object_type = "Stake", - name = "cry-Topaz Stake", - key = "topaz", - pos = { x = 1, y = 0 }, + name = "cry-Amber Stake", + key = "amber", + pos = { x = 3, y = 1 }, atlas = "stake", - applied_stakes = { "cry_ruby" }, + applied_stakes = { "cry_diamond" }, + modifiers = function() + G.GAME.modifiers.extra_boosters = -1 + end, + shiny = true, + order = 17, + colour = HEX("feb900"), +} +local bronze = { + object_type = "Stake", + name = "cry-Bronze Stake", + key = "bronze", + pos = { x = 4, y = 1 }, + atlas = "stake", + applied_stakes = { "cry_amber" }, modifiers = function() - G.GAME.modifiers.cry_interest_rate = 8 + G.GAME.modifiers.cry_voucher_price_hike = 1.5 end, shiny = true, - order = 2, + order = 18, + colour = HEX("d27c37"), } - local quartz = { object_type = "Stake", name = "cry-Quartz Stake", key = "quartz", - pos = { x = 2, y = 0 }, + pos = { x = 0, y = 2 }, atlas = "stake", - applied_stakes = { "cry_topaz" }, + applied_stakes = { "cry_bronze" }, modifiers = function() G.GAME.modifiers.cry_enable_pinned_in_shop = true end, shiny = true, - order = 3, + order = 19, + colour = HEX("e8e8e8"), } - -local diamond = { +local ruby = { object_type = "Stake", - name = "cry-Diamond Stake", - key = "diamond", - pos = { x = 3, y = 0 }, + name = "cry-Ruby Stake", + key = "ruby", + pos = { x = 1, y = 2 }, atlas = "stake", applied_stakes = { "cry_quartz" }, modifiers = function() - G.GAME.modifiers.enable_banana = true + G.GAME.modifiers.cry_big_boss_rate = 0.3 + end, + shiny = true, + order = 20, + colour = HEX("fc5f55"), +} +local glass = { + object_type = "Stake", + name = "cry-Glass Stake", + key = "glass", + pos = { x = 2, y = 2 }, + atlas = "stake", + applied_stakes = { "cry_ruby" }, + modifiers = function() + G.GAME.modifiers.cry_shatter_rate = 30 end, shiny = true, - order = 4, + order = 21, + colour = HEX("ffffff8f"), +} +local sapphire = { + object_type = "Stake", + name = "cry-Sapphire Stake", + key = "sapphire", + pos = { x = 3, y = 2 }, + atlas = "stake", + applied_stakes = { "cry_glass" }, + modifiers = function() + G.GAME.modifiers.cry_ante_tax = 0.25 + G.GAME.modifiers.cry_ante_tax_max = 10 + end, + shiny = true, + order = 22, + colour = HEX("3551fc"), +} +local emerald = { + object_type = "Stake", + name = "cry-Emerald Stake", + key = "emerald", + pos = { x = 4, y = 2 }, + atlas = "stake", + applied_stakes = { "cry_sapphire" }, + modifiers = function() + G.GAME.modifiers.cry_enable_flipped_in_shop = true + end, + shiny = true, + order = 23, + colour = HEX("06fc2c"), +} +local platinum = { + object_type = "Stake", + name = "cry-Platinum Stake", + key = "platinum", + pos = { x = 0, y = 3 }, + atlas = "stake", + applied_stakes = { "cry_emerald" }, + modifiers = function() + G.GAME.modifiers.cry_no_small_blind = true + G.GAME.round_resets.blind_states["Small"] = "Hide" + end, + shiny = true, + order = 24, + colour = HEX("b0f6ff"), } --init colors so they have references +G.C.CRY_TWILIGHT = { 0, 0, 0, 0 } +G.C.CRY_VERDANT = { 0, 0, 0, 0 } G.C.CRY_EMBER = { 0, 0, 0, 0 } +G.C.CRY_DAWN = { 0, 0, 0, 0 } G.C.CRY_HORIZON = { 0, 0, 0, 0 } G.C.CRY_BLOSSOM = { 0, 0, 0, 0 } +G.C.CRY_AZURE = { 0, 0, 0, 0 } G.C.CRY_ASCENDANT = { 0, 0, 0, 0 } +local twilight = { + object_type = "Stake", + name = "cry-Twilight Stake", + key = "twilight", + pos = { x = 1, y = 3 }, + atlas = "stake", + applied_stakes = { "cry_platinum" }, + modifiers = function() + G.GAME.modifiers.enable_banana = true + end, + shiny = true, + order = 25, + colour = G.C.CRY_TWILIGHT, +} +local verdant = { + object_type = "Stake", + name = "cry-Verdant Stake", + key = "verdant", + pos = { x = 2, y = 3 }, + atlas = "stake", + applied_stakes = { "cry_twilight" }, + modifiers = function() + G.GAME.modifiers.scaling = (G.GAME.modifiers.scaling or 1) + 1 + end, + shiny = true, + order = 26, + colour = G.C.CRY_VERDANT, +} local ember = { object_type = "Stake", name = "cry-Ember Stake", key = "ember", - pos = { x = 0, y = 1 }, + pos = { x = 3, y = 3 }, atlas = "stake", - applied_stakes = { "cry_diamond" }, + applied_stakes = { "cry_verdant" }, modifiers = function() - G.GAME.modifiers.cry_sell_price = -1 + G.GAME.modifiers.cry_no_sell_value = true end, shiny = true, - order = 5, + order = 27, colour = G.C.CRY_EMBER, } +local dawn = { + object_type = "Stake", + name = "cry-Dawn Stake", + key = "dawn", + pos = { x = 4, y = 3 }, + atlas = "stake", + applied_stakes = { "cry_ember" }, + modifiers = function() + G.GAME.modifiers.cry_consumable_reduce = true + end, + shiny = true, + order = 28, + colour = G.C.CRY_DAWN, +} local horizon = { object_type = "Stake", name = "cry-Horizon Stake", key = "horizon", - pos = { x = 1, y = 1 }, + pos = { x = 0, y = 4 }, atlas = "stake", - applied_stakes = { "cry_ember" }, + applied_stakes = { "cry_dawn" }, modifiers = function() - G.GAME.modifiers.cry_big_showdown = 5 + G.GAME.modifiers.cry_card_each_round = true end, shiny = true, - order = 6, + order = 29, colour = G.C.CRY_HORIZON, } local blossom = { object_type = "Stake", name = "cry-Blossom Stake", key = "blossom", - pos = { x = 2, y = 1 }, + pos = { x = 1, y = 4 }, atlas = "stake", applied_stakes = { "cry_horizon" }, modifiers = function() - G.GAME.modifiers.cry_rarer_modifications = 0.2 + G.GAME.modifiers.cry_big_showdown = true end, shiny = true, - order = 7, + order = 30, colour = G.C.CRY_BLOSSOM, } +local azure = { + object_type = "Stake", + name = "cry-Azure Stake", + key = "azure", + pos = { x = 2, y = 4 }, + atlas = "stake", + applied_stakes = { "cry_blossom" }, + modifiers = function() + G.GAME.modifiers.cry_jkr_misprint_mod = 0.8 + end, + shiny = true, + order = 31, + colour = G.C.CRY_AZURE, +} local ascendant = { object_type = "Stake", name = "cry-Ascendant Stake", key = "ascendant", - pos = { x = 3, y = 1 }, + pos = { x = 3, y = 4 }, atlas = "stake", - applied_stakes = { "cry_blossom" }, + applied_stakes = { "cry_azure" }, modifiers = function() - G.GAME.modifiers.inflation = true + change_shop_size(-1) end, shiny = true, - order = 8, + order = 32, colour = G.C.CRY_ASCENDANT, } local stake_atlas = { object_type = "Atlas", key = "stake", path = "stake_cry.png", px = 29, py = 29 } @@ -302,15 +532,29 @@ return { end, items = { stake_atlas, - - ruby, - topaz, - quartz, + pink, + brown, + yellow, + jade, + cyan, + gray, + crimson, diamond, - + amber, + bronze, + quartz, + ruby, + glass, + sapphire, + emerald, + platinum, + twilight, + verdant, ember, + dawn, horizon, blossom, + azure, ascendant, }, } diff --git a/items/tag.lua b/items/tag.lua index faf0a5382..6077764f0 100644 --- a/items/tag.lua +++ b/items/tag.lua @@ -69,7 +69,7 @@ local epic_tag = { card.states.visible = false tag:yep("+", G.C.RARITY.cry_epic, function() card:start_materialize() - card.misprint_cost_fac = 1 + card.misprint_cost_fac = 0.5 card:set_cost() return true end) @@ -107,24 +107,14 @@ local schematic = { config = { type = "store_joker_create" }, key = "schematic", loc_vars = function(self, info_queue) + info_queue[#info_queue + 1] = { set = "Joker", key = "j_brainstorm" } return { vars = {} } end, apply = function(self, tag, context) if context.type == "store_joker_create" then local card - if #G.jokers.cards == 0 then - tag:nope() - tag.triggered = true - return - end - local chosen_key = pseudorandom_element(G.jokers.cards, pseudoseed("schematic_tag")).config.center.key - local tries = 0 - while G.GAME.banned_keys[chosen_key] and tries <= 10 do - chosen_key = pseudorandom_element(G.jokers.cards, pseudoseed("schematic_tag")).config.center.key - tries = tries + 1 - end - if not G.GAME.banned_keys[chosen_key] then - card = create_card("Joker", context.area, nil, nil, nil, nil, chosen_key) + if not G.GAME.banned_keys["j_brainstorm"] then + card = create_card("Joker", context.area, nil, nil, nil, nil, "j_brainstorm") create_shop_card_ui(card, "Joker", context.area) card.states.visible = false tag:yep("+", G.C.RED, function() @@ -512,6 +502,7 @@ local memory = { and self.key ~= "tag_cry_memory" and self.key ~= "tag_cry_triple" and self.key ~= "tag_cry_quadruple" + and self.key ~= "tag_cry_quintuple" and self.key ~= "tag_ortalab_rewind" then G.GAME.cry_last_tag_used = self.key diff --git a/items/test.lua b/items/test.lua index e903a4aef..2568f7d7f 100644 --- a/items/test.lua +++ b/items/test.lua @@ -85,7 +85,7 @@ local test2 = { end elseif context.other_joker and card ~= context.other_joker then if card.T.x + card.T.w / 2 < context.other_joker.T.x + context.other_joker.T.w / 2 then - if Talisman and not Talisman.config_file.disable_anims then + if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ func = function() context.other_joker:juice_up(0.5, 0.5) diff --git a/items/voucher.lua b/items/voucher.lua index b1c56c7ef..c0a42a2f6 100644 --- a/items/voucher.lua +++ b/items/voucher.lua @@ -33,6 +33,7 @@ local copies = { -- DTag T1; Double tags become Triple Tags and are 2X as common pos = { x = 1, y = 1 }, 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_triple", specific_vars = { 2 } } return { vars = {} } end, init = function(self) @@ -40,12 +41,18 @@ local copies = { -- DTag T1; Double tags become Triple Tags and are 2X as common local tinit = Tag.init function Tag:init(tag, for_collection, _blind_type) if not for_collection then - if tag == "tag_double" and G.GAME.used_vouchers.v_cry_tag_printer then + if tag == "tag_double" and G.GAME.used_vouchers.v_cry_copies then tag = "tag_cry_triple" end - if (tag == "tag_double" or tag == "tag_cry_triple") and G.GAME.used_vouchers.v_cry_clone_machine then + if (tag == "tag_double" or tag == "tag_cry_triple") and G.GAME.used_vouchers.v_cry_tag_printer then tag = "tag_cry_quadruple" end + if + (tag == "tag_double" or tag == "tag_cry_triple" or tag == "tag_cry_quadruple") + and G.GAME.used_vouchers.v_cry_clone_machine + then + tag = "tag_cry_quintuple" + end end return tinit(self, tag, for_collection, _blind_type) end @@ -78,7 +85,7 @@ local tag_printer = { --DTag T2; Double tags become Quadruple Tags and are 3X as pos = { x = 1, y = 2 }, 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_triple", specific_vars = { 2 } } + info_queue[#info_queue + 1] = { set = "Tag", key = "tag_cry_quadruple", specific_vars = { 3 } } return { vars = {} } end, requires = { "v_cry_copies" }, @@ -266,7 +273,7 @@ local grapplinghook = { -- CSL T2; +2 card selection limit }, }, key = "grapplinghook", - config = { extra = 1 }, + config = { extra = 2 }, atlas = "atlasvoucher", order = 20008, pos = { x = 1, y = 5 }, @@ -437,21 +444,11 @@ local massproduct = { -- Clearance Sale T3; All cards and packs in the shop cost pos = { x = 6, y = 4 }, requires = { "v_liquidation" }, pools = { ["Tier3"] = true }, - config = { - discount_percentage = 75, - }, - loc_vars = function(self, q, card) - return { - vars = { - card.ability.discount_percentage, - }, - } - end, - redeem = function(self, card) + redeem = function(self) G.E_MANAGER:add_event(Event({ func = function() G.GAME.backup_discount_percent = G.GAME.backup_discount_percent or G.GAME.discount_percent - G.GAME.discount_percent = card.ability.discount_percentage + G.GAME.discount_percent = 100 for k, v in pairs(G.I.CARD) do if v.set_cost then v:set_cost() @@ -534,25 +531,18 @@ local rerollexchange = { -- Reroll Surplus T3; All rerolls cost $2 pos = { x = 6, y = 2 }, requires = { "v_reroll_glut" }, pools = { ["Tier3"] = true }, - config = { - extra = -5, - }, - loc_vars = function(self, _, card) - return { - vars = { - card.ability.extra, - }, - } - end, - redeem = function(selfm, card) - G.GAME.backup_cost = G.GAME.backup_cost or G.GAME.round_resets.reroll_cost - G.GAME.round_resets.reroll_cost = card.ability.extra - G.GAME.current_round.reroll_cost = card.ability.extra - G.GAME.current_round.reroll_cost_increase = 0 + redeem = function(self) + --most of the code for this (one line) is in cryptid.lua, check out the reroll function there + G.E_MANAGER:add_event(Event({ + func = function() + if G.GAME.current_round.reroll_cost > 2 then + G.GAME.current_round.reroll_cost = 2 + end + return true + end, + })) end, - unredeem = function(self, card) - G.GAME.round_resets.reroll_cost = G.GAME.backup_cost - G.GAME.current_round.reroll_cost = G.GAME.backup_cost + unredeem = function(self) G.E_MANAGER:add_event(Event({ func = function() calculate_reroll_cost(true) @@ -774,14 +764,14 @@ local moneybean = { -- Seed Money T3; Raise the cap on interest earned in each r }, }, key = "moneybean", - config = { extra = 100 }, + config = { extra = 1e300 }, atlas = "atlasvoucher", order = 32668, pos = { x = 5, y = 1 }, requires = { "v_money_tree" }, pools = { ["Tier3"] = true }, 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) / 5 } } end, redeem = function(self, card) -- this doesn't really matter with the whole interest overwrite G.E_MANAGER:add_event(Event({ @@ -823,7 +813,7 @@ local fabric = { -- Blank Voucher T3; +2 Joker slots }, }, key = "fabric", - config = { extra = 1 }, + config = { extra = 2 }, atlas = "atlasvoucher", order = 32669, pos = { x = 6, y = 0 }, @@ -915,8 +905,11 @@ local asteroglyph = { -- Heiroglyph T3; Set Ante to 0 return { vars = { card.ability.ante_mod } } end, redeem = function(self) - local mod = -card.ability.ante_mod + local mod = -G.GAME.round_resets.ante + Cryptid.asteroglyph_ante() ease_ante(mod) + G.GAME.modifiers.cry_astero_ante = (G.GAME.modifiers.cry_astero_ante or 0) > 0 + and math.min(math.ceil(G.GAME.modifiers.cry_astero_ante ^ 1.13), 1e300) + or 1 G.E_MANAGER:add_event(Event({ func = function() G.GAME.round_resets.blind_ante = mod @@ -936,6 +929,17 @@ local asteroglyph = { -- Heiroglyph T3; Set Ante to 0 unlock_card(self) end end, + init = function(self) + function Cryptid.asteroglyph_ante() + if not (G.GAME or {}).modifiers then + return 0 + end + if not G.GAME.modifiers.cry_astero_ante then + G.GAME.modifiers.cry_astero_ante = 0 + end + return G.GAME.modifiers.cry_astero_ante + end + end, } local DCUTT3PLACEHOLDER = { -- RESERVED FOR DIRECTOR'S CUT T3 object_type = "Voucher", @@ -1027,7 +1031,7 @@ local clone_machine = { -- DTag Voucher T3; Double tags become Quintuple Tags an 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_quadruple", specific_vars = { 3 } } + info_queue[#info_queue + 1] = { set = "Tag", key = "tag_cry_quintuple", specific_vars = { 4 } } return { vars = {} } end, requires = { "v_cry_tag_printer" }, @@ -1122,7 +1126,7 @@ local hyperspacetether = { -- CSL T3; +2 card selection limit, all* selected car }, }, key = "hyperspacetether", - config = { extra = 1 }, + config = { extra = 2 }, atlas = "atlasvoucher", pos = { x = 2, y = 5 }, order = 32767, @@ -1212,6 +1216,7 @@ local triple = { --Copies voucher triple tag and context.tag.key ~= "tag_double" and context.tag.key ~= "tag_cry_triple" and context.tag.key ~= "tag_cry_quadruple" + and context.tag.key ~= "tag_cry_quintuple" and context.tag.key ~= "tag_cry_memory" then local lock = tag.ID @@ -1222,6 +1227,10 @@ local triple = { --Copies voucher triple tag end for i = 1, tag.config.num do local tag = Tag(context.tag.key) + if context.tag.key == "tag_cry_rework" then + tag.ability.rework_edition = context.tag.ability.rework_edition + tag.ability.rework_key = context.tag.ability.rework_key + end add_tag(tag) end G.orbital_hand = nil @@ -1271,6 +1280,7 @@ local quadruple = { --Tag printer voucher quadruple tag and context.tag.key ~= "tag_double" and context.tag.key ~= "tag_cry_triple" and context.tag.key ~= "tag_cry_quadruple" + and context.tag.key ~= "tag_cry_quintuple" and context.tag.key ~= "tag_cry_memory" then local lock = tag.ID @@ -1281,6 +1291,10 @@ local quadruple = { --Tag printer voucher quadruple tag end for i = 1, tag.config.num do local tag = Tag(context.tag.key) + if context.tag.key == "tag_cry_rework" then + tag.ability.rework_edition = context.tag.ability.rework_edition + tag.ability.rework_key = context.tag.ability.rework_key + end add_tag(tag) end G.orbital_hand = nil @@ -1295,6 +1309,70 @@ local quadruple = { --Tag printer voucher quadruple tag return G.GAME.used_vouchers.v_cry_tag_printer end, } +local quintuple = { --Clone machine voucher quintuple tag + cry_credits = { + idea = { + "Catman", + "Mystic Misclick", + }, + art = { + "5381", + }, + code = { + "Math", + }, + }, + object_type = "Tag", + dependencies = { + items = { + "set_cry_tag", + "v_cry_clone_machine", + }, + }, + atlas = "tag_cry", + name = "cry-Quintuple Tag", + order = 22, + pos = { x = 2, y = 1 }, + config = { type = "tag_add", num = 4 }, + key = "quintuple", + loc_vars = function(self, info_queue) + return { vars = { self.config.num } } + end, + apply = function(self, tag, context) + if + context.type == "tag_add" + and context.tag.key ~= "tag_double" + and context.tag.key ~= "tag_cry_triple" + and context.tag.key ~= "tag_cry_quadruple" + and context.tag.key ~= "tag_cry_quintuple" + and context.tag.key ~= "tag_cry_memory" + then + local lock = tag.ID + G.CONTROLLER.locks[lock] = true + tag:yep("+", G.C.RED, function() + if context.tag.ability and context.tag.ability.orbital_hand then + G.orbital_hand = context.tag.ability.orbital_hand + end + for i = 1, tag.config.num do + local tag = Tag(context.tag.key) + if context.tag.key == "tag_cry_rework" then + tag.ability.rework_edition = context.tag.ability.rework_edition + tag.ability.rework_key = context.tag.ability.rework_key + end + add_tag(tag) + end + G.orbital_hand = nil + G.CONTROLLER.locks[lock] = nil + return true + end) + tag.triggered = true + return true + end + end, + in_pool = function() + return G.GAME.used_vouchers.v_cry_clone_machine + end, +} -- If Tier 3 Vouchers is loaded, make Cryptid function as Tier 4 Vouchers if SMODS.Mods["Tier3Sub"] then overstock_multi.requires[#overstock_multi.requires + 1] = "v_overstock_three" @@ -1351,6 +1429,7 @@ local voucheritems = { triple, quadruple, + quintuple, } return { name = "Vouchers", diff --git a/lib/ascended.lua b/lib/ascended.lua index ac695a11b..5d9081980 100644 --- a/lib/ascended.lua +++ b/lib/ascended.lua @@ -40,7 +40,7 @@ function G.FUNCS.get_poker_hand_info(_cards) end end if G.SETTINGS.language == "en-us" then - if #scoring_hand > 5 and (text == "Flush Five" or text == "Five of a Kind") then + if #scoring_hand > 5 and (text == "Flush Five" or text == "Five of a Kind" or text == "bunc_Spectrum Five") then local rank_array = {} local county = 0 for i = 1, #scoring_hand do @@ -110,7 +110,7 @@ function G.FUNCS.get_poker_hand_info(_cards) return str_ret end -- text gets stupid small at 100+ anyway - loc_disp_text = (text == "Flush Five" and "Flush " or "") + loc_disp_text = (text == "Flush Five" and "Flush " or text == "bunc_Spectrum Five" and "Spectrum " or "") .. ( (county < 1000 and create_num_chunk(county) or "Thousand") .. (text == "Five of a Kind" and " of a Kind" or "") @@ -143,7 +143,41 @@ function G.FUNCS.get_poker_hand_info(_cards) ["cry_Declare2"] = G.GAME.hands.cry_Declare2 and G.GAME.hands.cry_Declare2.declare_cards and #G.GAME.hands.cry_Declare2.declare_cards, + ["bunc_Spectrum"] = 5, + ["bunc_Straight Spectrum"] = 5, + ["bunc_Spectrum House"] = 5, + ["bunc_Spectrum Five"] = 5, + ["spa_Spectrum"] = SpectrumAPI and SpectrumAPI.configuration.misc.four_fingers_spectrums and next( + SMODS.find_card("j_four_fingers") + ) and Cryptid.gameset() ~= "modest" and 4 or 5, + ["spa_Straight_Spectrum"] = SpectrumAPI and SpectrumAPI.configuration.misc.four_fingers_spectrums and next( + SMODS.find_card("j_four_fingers") + ) and Cryptid.gameset() ~= "modest" and 4 or 5, + ["spa_Spectrum_House"] = SpectrumAPI and SpectrumAPI.configuration.misc.four_fingers_spectrums and next( + SMODS.find_card("j_four_fingers") + ) and Cryptid.gameset() ~= "modest" and 4 or 5, + ["spa_Spectrum_Five"] = SpectrumAPI and SpectrumAPI.configuration.misc.four_fingers_spectrums and next( + SMODS.find_card("j_four_fingers") + ) and Cryptid.gameset() ~= "modest" and 4 or 5, + ["spa_Flush_Spectrum"] = SpectrumAPI and SpectrumAPI.configuration.misc.four_fingers_spectrums and next( + SMODS.find_card("j_four_fingers") + ) and Cryptid.gameset() ~= "modest" and 4 or 5, + ["spa_Straight_Flush_Spectrum"] = SpectrumAPI + and SpectrumAPI.configuration.misc.four_fingers_spectrums + and next(SMODS.find_card("j_four_fingers")) + and Cryptid.gameset() ~= "modest" + and 4 + or 5, + ["spa_Flush_Spectrum_House"] = SpectrumAPI and SpectrumAPI.configuration.misc.four_fingers_spectrums and next( + SMODS.find_card("j_four_fingers") + ) and Cryptid.gameset() ~= "modest" and 4 or 5, + ["spa_Flush_Spectrum_Five"] = SpectrumAPI and SpectrumAPI.configuration.misc.four_fingers_spectrums and next( + SMODS.find_card("j_four_fingers") + ) and Cryptid.gameset() ~= "modest" and 4 or 5, } + if not hand_table[text] and Cryptid.ascension_numbers[text] then + hand_table[text] = Cryptid.ascension_numbers[text]() + end -- this is where all the logic for asc hands is. currently it's very simple but if you want more complex logic, here's the place to do it if hand_table[text] and Cryptid.enabled("set_cry_poker_hand_stuff") == true then G.GAME.current_round.current_hand.cry_asc_num = G.GAME.used_vouchers.v_cry_hyperspacetether diff --git a/lib/calculate.lua b/lib/calculate.lua index 55b649745..3940dcde0 100644 --- a/lib/calculate.lua +++ b/lib/calculate.lua @@ -16,6 +16,9 @@ function eval_card(card, context) end -- Store old probability for later reference local ret, post = ec(card, context) + if card.ability.cry_rigged then + G.GAME.probabilities.normal = ggpn + end return ret, post end @@ -360,6 +363,12 @@ function Card:cry_double_scale_calc(orig_ability, in_context_scaling) local obj = G.jokers.cards[i].config.center -- found one! if obj.cry_scale_mod and type(obj.cry_scale_mod) == "function" then + -- rig the probabilities in case that matters for the joker's scaling function + local ggpn = G.GAME.probabilities.normal + if G.jokers.cards[i].ability.cry_rigged then + G.GAME.probabilities.normal = 1e9 + end + -- 'o' will be the new factor that the joker should scale by next time local o = obj:cry_scale_mod( G.jokers.cards[i], @@ -370,6 +379,11 @@ function Card:cry_double_scale_calc(orig_ability, in_context_scaling) new_scale_base ) + -- return probabilities to normal + if G.jokers.cards[i].ability.cry_rigged then + G.GAME.probabilities.normal = ggpn + end + -- the function returned a value, do the scale setting with it if o then -- set the scale factor field to 'o' @@ -403,11 +417,18 @@ function Card:cry_double_scale_calc(orig_ability, in_context_scaling) -- now, let's check for repetitions on the scale-affecting jokers local reps = {} for j = 1, #G.jokers.cards do + local ggpn = G.GAME.probabilities.normal + if G.jokers.cards[j].ability.cry_rigged then + G.GAME.probabilities.normal = 1e9 + end -- check if another joker is retriggering our scale-affecting joker local check = cj( G.jokers.cards[j], { retrigger_joker_check = true, other_card = G.jokers.cards[i] } ) + if G.jokers.cards[j].ability.cry_rigged then + G.GAME.probabilities.normal = ggpn + end -- keep track of which joker retriggers the scale-joker if type(check) == "table" then reps[j] = check and check.repetitions and check or 0 @@ -444,6 +465,7 @@ function Card:cry_double_scale_calc(orig_ability, in_context_scaling) orig_scale_base, new_scale_base ) + if o then if #dbl_info.scaler[info_i] == 2 then if @@ -565,9 +587,13 @@ function Card:calculate_joker(context) if not active_side or active_side.will_shatter then return end + local ggpn = G.GAME.probabilities.normal if not G.GAME.cry_double_scale then G.GAME.cry_double_scale = { double_scale = true } --doesn't really matter what's in here as long as there's something end + if active_side.ability.cry_rigged then + G.GAME.probabilities.normal = 1e9 + end local orig_ability = copy_table(active_side.ability) local in_context_scaling = false local callback = context.callback @@ -645,6 +671,9 @@ function Card:calculate_joker(context) in_context_scaling = true end end + if active_side.ability.cry_rigged then + G.GAME.probabilities.normal = ggpn + end if next(find_joker("cry-Scalae")) or next(find_joker("cry-Double Scale")) then active_side:cry_double_scale_calc(orig_ability, in_context_scaling) end @@ -688,6 +717,10 @@ function Cryptid.apply_scale_mod(jkr, orig_scale_scale, orig_scale_base, new_sca 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, @@ -696,6 +729,9 @@ function Cryptid.apply_scale_mod(jkr, orig_scale_scale, orig_scale_base, new_sca 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[info_i] == 2 then if @@ -725,8 +761,15 @@ function Cryptid.apply_scale_mod(jkr, orig_scale_scale, orig_scale_base, new_sca local reps = {} for j = 1, #G.jokers.cards do + local ggpn = G.GAME.probabilities.normal + if G.jokers.cards[j].ability.cry_rigged then + G.GAME.probabilities.normal = 1e9 + end local check = cj(G.jokers.cards[j], { retrigger_joker_check = true, other_card = G.jokers.cards[i] }) + if G.jokers.cards[j].ability.cry_rigged then + G.GAME.probabilities.normal = ggpn + end if type(check) == "table" then reps[j] = check and check.repetitions and check or 0 else @@ -749,6 +792,10 @@ function Cryptid.apply_scale_mod(jkr, orig_scale_scale, orig_scale_base, new_sca if (type(rep) == "table") and rep.repetitions and (rep.repetitions > 0) then for r = 1, rep.repetitions do card_eval_status_text(rep.card, "jokers", nil, nil, nil, rep) + 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, diff --git a/lib/content.lua b/lib/content.lua index 93cae300c..9c2ee3714 100644 --- a/lib/content.lua +++ b/lib/content.lua @@ -522,18 +522,6 @@ SMODS.Sound({ key = "e_golden", path = "e_golden.ogg", }) -SMODS.Sound({ - key = "emult", - path = "ExponentialMult.wav", -}) -SMODS.Sound({ - key = "echips", - path = "ExponentialChips.wav", -}) -SMODS.Sound({ - key = "xchip", - path = "MultiplicativeChips.wav", -}) SMODS.Sound({ key = "studiofromhelsinki", path = "studiofromhelsinki.ogg", @@ -581,7 +569,7 @@ SMODS.Sound({ if Cryptid_config.Cryptid and Cryptid_config.Cryptid.big_music - and to_big(G.GAME.round_scores["hand"].amt or 0) > 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 @@ -604,24 +592,37 @@ SMODS.Sound({ volume = 0.7, sync = { cry_music_modest = true, + cry_music_madness = true, }, pitch = 1, select_music_track = function() - if G.PROFILES[G.SETTINGS.profile].cry_gameset == "madness" then - G.PROFILES[G.SETTINGS.profile].cry_gameset = "mainline" - end return G.STAGE == G.STAGES.MAIN_MENU - and (G.PROFILES[G.SETTINGS.profile].cry_gameset and G.PROFILES[G.SETTINGS.profile].cry_gameset == "mainline" or G.selectedGameset and G.selectedGameset ~= "modest") + and (G.PROFILES[G.SETTINGS.profile].cry_gameset and G.PROFILES[G.SETTINGS.profile].cry_gameset == "mainline" or G.selectedGameset and G.selectedGameset ~= "modest" and G.selectedGameset ~= "madness") + and Cryptid_config.Cryptid.alt_bg_music + end, +}) +SMODS.Sound({ + key = "music_madness", + path = "music_madness.ogg", + volume = 0.7, + sync = { + cry_music_modest = true, + cry_music_mainline = true, + }, + pitch = 1, + select_music_track = function() + return G.STAGE == G.STAGES.MAIN_MENU + and (G.PROFILES[G.SETTINGS.profile].cry_gameset and G.PROFILES[G.SETTINGS.profile].cry_gameset == "madness" or G.selectedGameset == "madness") and Cryptid_config.Cryptid.alt_bg_music end, }) - SMODS.Sound({ key = "music_modest", path = "music_modest.ogg", volume = 0.7, sync = { cry_music_mainline = true, + cry_music_madness = true, }, pitch = 1, select_music_track = function() diff --git a/lib/cross-mod.lua b/lib/cross-mod.lua index c01dd7069..28fc649c1 100644 --- a/lib/cross-mod.lua +++ b/lib/cross-mod.lua @@ -110,7 +110,9 @@ if (SMODS.Mods["AntePreview"] or {}).can_load then function predict_next_ante() local small = "bl_small" local big = "bl_big" - if G.GAME.modifiers.cry_rush_hour_ii then + if G.GAME.modifiers.cry_big_boss_rate and pseudorandom("cry_big_boss") < G.GAME.modifiers.cry_big_boss_rate then + big = get_new_boss() + elseif G.GAME.modifiers.cry_rush_hour_ii then small = get_new_boss() big = get_new_boss() end @@ -132,6 +134,9 @@ if (SMODS.Mods["AntePreview"] or {}).can_load then if G.P_BLINDS[predictions.Big.blind].boss then G.GAME.bosses_used[predictions.Big.blind] = G.GAME.bosses_used[predictions.Big.blind] - 1 end + if G.GAME.modifiers.cry_no_small_blind then + predictions.Small = nil + end return predictions end end diff --git a/lib/forcetrigger.lua b/lib/forcetrigger.lua index d252555d6..ed7b606f0 100644 --- a/lib/forcetrigger.lua +++ b/lib/forcetrigger.lua @@ -25,7 +25,7 @@ function Cryptid.forcetrigger(card, context) end local results = {} local check = Cryptid.forcetriggerVanillaCheck(card) - if Talisman and not Talisman.config_file.disable_anims then + if not Talisman.config_file.disable_anims then G.E_MANAGER:add_event(Event({ trigger = "before", func = function() @@ -526,6 +526,7 @@ function Cryptid.forcetrigger(card, context) end end if card.ability.name == "Rocket" then + card.ability.extra.dollars = card.ability.extra.dollars + card.ability.extra.increase ease_dollars(card.ability.extra.dollars) end if card.ability.name == "Obelisk" then -- Sobelisk diff --git a/lib/gameset.lua b/lib/gameset.lua index 055fe67fd..6ec400935 100644 --- a/lib/gameset.lua +++ b/lib/gameset.lua @@ -27,9 +27,6 @@ function Game:update(dt) gu(self, dt) if not G.PROFILES[G.SETTINGS.profile].cry_intro_complete then G.FUNCS.cry_intro_controller() - if G.OVERLAY_TUTORIAL then - G.E_MANAGER:update(dt, true) - end end end @@ -179,6 +176,12 @@ G.FUNCS.cry_intro_part = function(_part) { shader = "dissolve", shadow_height = 0.05 }, { shader = "dissolve" }, }) + local madnessSprite = Sprite(0, 0, 1, 1, G.ASSET_ATLAS["cry_gameset"], { x = 2, y = 0 }) + madnessSprite:define_draw_steps({ + { shader = "dissolve", shadow_height = 0.05 }, + { shader = "dissolve" }, + }) + --TODO: localize G.modestBtn = create_UIBox_character_button_with_sprite({ sprite = modestSprite, button = localize("cry_gameset_modest"), @@ -195,16 +198,34 @@ G.FUNCS.cry_intro_part = function(_part) colour = G.C.RED, maxw = 3, }) + G.madnessBtn = create_UIBox_character_button_with_sprite({ + sprite = madnessSprite, + button = localize("cry_gameset_madness"), + id = "madness", + func = "cry_madness", + colour = G.C.CRY_EXOTIC, + maxw = 3, + }) local gamesetUI = create_UIBox_generic_options({ infotip = false, contents = { G.modestBtn, G.mainlineBtn, + G.madnessBtn, }, back_label = "Confirm", back_colour = G.C.BLUE, back_func = "cry_gameset_confirm", }) + G.E_MANAGER:add_event(Event({ + trigger = "after", + blocking = false, + blockable = false, + func = function() + G.madnessBtn.config.colour = G.C.CRY_EXOTIC + return true + end, + })) gamesetUI.nodes[2] = nil gamesetUI.config.colour = G.C.CLEAR G.gamesetUI = UIBox({ @@ -234,10 +255,11 @@ G.FUNCS.cry_intro_part = function(_part) no_button = true, }) end - if _part == "modest" or _part == "mainline" then + if _part == "modest" or _part == "mainline" or _part == "madness" then local desc_length = { --number of times Jolly Joker speaks for each gameset modest = 2, mainline = 3, + madness = 3, } G.E_MANAGER:clear_queue("tutorial") if G.OVERLAY_TUTORIAL.content then @@ -272,15 +294,24 @@ end G.FUNCS.cry_modest = function(e) G.modestBtn.config.colour = G.C.CRY_SELECTED G.mainlineBtn.config.colour = G.C.RED + G.madnessBtn.config.colour = G.C.CRY_EXOTIC G.FUNCS.cry_intro_part("modest") G.selectedGameset = "modest" end G.FUNCS.cry_mainline = function(e) G.modestBtn.config.colour = G.C.GREEN G.mainlineBtn.config.colour = G.C.CRY_SELECTED + G.madnessBtn.config.colour = G.C.CRY_EXOTIC G.FUNCS.cry_intro_part("mainline") G.selectedGameset = "mainline" end +G.FUNCS.cry_madness = function(e) + G.modestBtn.config.colour = G.C.GREEN + G.mainlineBtn.config.colour = G.C.RED + G.madnessBtn.config.colour = G.C.CRY_SELECTED + G.FUNCS.cry_intro_part("madness") + G.selectedGameset = "madness" +end G.FUNCS.cry_gameset_confirm = function(e) if G.selectedGameset then G.PROFILES[G.SETTINGS.profile].cry_intro_complete = true @@ -296,6 +327,35 @@ G.FUNCS.cry_gameset_confirm = function(e) end G.OVERLAY_TUTORIAL:remove() G.OVERLAY_TUTORIAL = nil + if G.selectedGameset == "madness" then + --Unlock All by default in madness + G.PROFILES[G.SETTINGS.profile].all_unlocked = true + for k, v in pairs(G.P_CENTERS) do + if not v.demo and not v.wip then + v.alerted = true + v.discovered = true + v.unlocked = true + end + end + for k, v in pairs(G.P_BLINDS) do + if not v.demo and not v.wip then + v.alerted = true + v.discovered = true + v.unlocked = true + end + end + for k, v in pairs(G.P_TAGS) do + if not v.demo and not v.wip then + v.alerted = true + v.discovered = true + v.unlocked = true + end + end + set_profile_progress() + set_discover_tallies() + G:save_progress() + G.FILE_HANDLER.force = true + end end end @@ -342,7 +402,6 @@ function Cryptid.intro_info(args) args.highlight[#args.highlight + 1] = G.OVERLAY_TUTORIAL.Jimbo if args.text_key then G.OVERLAY_TUTORIAL.Jimbo:add_speech_bubble(args.text_key, align, args.loc_vars) - --G.OVERLAY_TUTORIAL.Jimbo.children.speech_bubble.states.visible = true end G.OVERLAY_TUTORIAL.Jimbo:set_alignment(attach) if args.hard_set then @@ -396,7 +455,6 @@ function Cryptid.intro_info(args) end return true end - return true end, }), "tutorial" @@ -472,7 +530,7 @@ function Cryptid.gameset_sprite(scale, profile, force_gameset) scale, scale, G.ASSET_ATLAS["cry_gameset"], - { x = (gameset == "modified" and 3 or gameset == "modest" and 0 or 1), y = 0 } + { x = (gameset == "modified" and 3 or gameset == "madness" and 2 or gameset == "modest" and 0 or 1), y = 0 } ) sprite:define_draw_steps({ { shader = "dissolve", shadow_height = 0.09 }, @@ -638,7 +696,7 @@ function Cryptid.gameset_config_UI(center) }, } - local gamesets = { "disabled", "modest", "mainline" } + local gamesets = { "disabled", "modest", "mainline", "madness" } if center.extra_gamesets then for i = 1, #center.extra_gamesets do gamesets[#gamesets + 1] = center.extra_gamesets[i] @@ -765,7 +823,9 @@ function get_type_colour(center, card) if center.force_gameset == "modest" then color = G.C.GREEN elseif center.force_gameset == "mainline" then - color = G.C.PURPLE + color = G.C.RED + elseif center.force_gameset == "madness" then + color = G.C.CRY_EXOTIC elseif center.force_gameset ~= "disabled" then color = G.C.CRY_ASCENDANT end diff --git a/lib/misc.lua b/lib/misc.lua index c5dd742db..7a68d1d8d 100644 --- a/lib/misc.lua +++ b/lib/misc.lua @@ -566,9 +566,6 @@ Cryptid.mod_whitelist = { } function Cryptid.is_card_big(joker) - if not Talisman then - return false - end local center = joker.config and joker.config.center if not center then return false @@ -1013,30 +1010,11 @@ function Cryptid.table_merge(t1, t2) return tbl end -local get_prob_vars_ref = SMODS.get_probability_vars -function SMODS.get_probability_vars(trigger_obj, base_numerator, base_denominator) - local mod = trigger_obj and trigger_obj.ability and trigger_obj.ability.cry_prob or 1 - local numerator = base_numerator * mod - if trigger_obj and trigger_obj.ability and trigger_obj.ability.cry_rigged then - numerator = base_denominator - end - return get_prob_vars_ref(trigger_obj, numerator, base_denominator) -end - -local pseudorandom_probability_ref = SMODS.pseudorandom_probability -function SMODS.pseudorandom_probability(trigger_obj, seed, base_numerator, base_denominator) - local mod = trigger_obj and trigger_obj.ability and trigger_obj.ability.cry_prob or 1 - local numerator = base_numerator * mod - if trigger_obj and trigger_obj.ability and trigger_obj.ability.cry_rigged then - return true - end - return pseudorandom_probability_ref(trigger_obj, seed, numerator, base_denominator) -end function Cryptid.get_circus_description() local desc = {} local ind = 1 local extra_rarities = {} - for i, v in pairs(Cryptid.circus_rarities or {}) do + for i, v in pairs(Cryptid.circus_rarities) do if not v.hidden then extra_rarities[#extra_rarities + 1] = v end @@ -1077,12 +1055,12 @@ function Cryptid.get_paved_joker() end local stones = 0 for i, v in pairs(G.hand.highlighted) do - if SMODS.has_no_rank(v) then + if v.config.center.key == "m_stone" then stones = stones + 1 end end for i, v in pairs(G.play.cards) do - if SMODS.has_no_rank(v) then + if v.config.center.key == "m_stone" then stones = stones + 1 end end @@ -1187,6 +1165,9 @@ G.FUNCS.exit_overlay_menu_code = function(e) 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 @@ -1467,124 +1448,3 @@ function Cryptid.declare_hand_ascended_counter(hand, declarehand) end return total end - -function Cryptid.interest_rate() - return G.GAME.modifiers.cry_interest_rate or 5 -end - -function Cryptid.get_interest(add_rows) - local rate = Cryptid.interest_rate() - local interest = math.min(math.floor(G.GAME.dollars / rate), G.GAME.interest_cap / 5) - interst = interest * G.GAME.interest_amount - for _, a in pairs(SMODS.get_card_areas("jokers")) do - for i, c in pairs(a.cards) do - if c.config.center.cry_calc_interest then - interest = c.config.center:cry_calc_interest(c, interest) - end - end - end - interest = interest * (G.GAME.cry_payload or 1) - return interest -end - -function Cryptid.is_in_shop(key, consumable) - local center = G.P_CENTERS[key] - if center.hidden or center.no_doe or center.no_collection then - return - elseif G.GAME.banned_keys[key] or not center.unlocked then - return - elseif center.set == "Joker" then - if type(center.rarity) == "number" and center.rarity <= 3 then - return center.unlocked or nil - end - local rare = ({ - "Common", - "Uncommon", - "Rare", - })[center.rarity] or center.rarity - if - SMODS.Rarities[rare] - and ( - SMODS.Rarities[rare].get_weight - or (SMODS.Rarities[rare].default_weight and SMODS.Rarities[rare].default_weight > 0) - ) - then - return center.unlocked or nil - end - return nil - else - if consumable then - if center.set == "Tarot" then - return G.GAME.tarot_rate * (G.GAME.cry_percrate.tarot / 100) > 0 or nil - end - if center.set == "Planet" then - return G.GAME.planet_rate * (G.GAME.cry_percrate.planet / 100) > 0 or nil - end - if center.set == "Spectral" then - return G.GAME.spectral_rate > 0 or nil - end - local num = G.GAME.cry_percrate and G.GAME.cry_percrate[center.set:lower()] or 100 - local val = G.GAME[center.set:lower() .. "_rate"] * ((num or 100) / 100) - return val > 0 - end - end - if center.in_pool then - return center:in_pool() - end - return center.unlocked or nil -end - -function Cryptid.get_equilibrium_pool() - local P_CRY_ITEMS = {} - local valid_pools = { "Joker", "Consumeables", "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) and Cryptid.is_in_shop(v.key, id == "Consumeables") then - P_CRY_ITEMS[#P_CRY_ITEMS + 1] = v.key - end - end - end - local _pool, _pool_key = get_current_pool("Voucher", nil, nil, nil, true) - for i, v in pairs(_pool) do - if v ~= "UNAVAILABLE" then - P_CRY_ITEMS[#P_CRY_ITEMS + 1] = v - 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 - return P_CRY_ITEMS -end - -function Cryptid.upgrade_rarity(card, seed) - local rarity = ({ - "Common", - "Uncommon", - "Rare", - "Legendary", - })[card.config.center.rarity] or card.config.center.rarity - if rarity ~= "cry_exotic" then - local next_rarity = rarity - for i, v in pairs(Cryptid.rarity_table) do - if v == rarity then - next_rarity = Cryptid.rarity_table[i + 1] or next_rarity - end - end - local next_rarity = ({ - Common = 1, - Uncommon = 2, - Rare = 3, - Legendary = 4, - })[next_rarity] or next_rarity - local center = pseudorandom_element(G.P_JOKER_RARITY_POOLS[next_rarity], pseudoseed(seed)) - card:flip() - delay(1) - card:set_ability(center) - delay(1) - card:flip() - delay(1) - card:juice_up() - end -end diff --git a/lib/misprintize.lua b/lib/misprintize.lua index 7974352b7..b3aa39afb 100644 --- a/lib/misprintize.lua +++ b/lib/misprintize.lua @@ -260,11 +260,20 @@ function Cryptid.misprintize(card, override, force_reset, stack, grow_type, pow_ end end if - not force_reset + (not force_reset or G.GAME.modifiers.cry_jkr_misprint_mod) and (G.GAME.modifiers.cry_misprint_min or override or card.ability.set == "Joker") and not stack or not Card.no(card, "immutable", true) then + if G.GAME.modifiers.cry_jkr_misprint_mod and card.ability.set == "Joker" then + if not override then + override = {} + end + override.min = override.min or G.GAME.modifiers.cry_misprint_min or 1 + override.max = override.max or G.GAME.modifiers.cry_misprint_max or 1 + override.min = override.min * G.GAME.modifiers.cry_jkr_misprint_mod + override.max = override.max * G.GAME.modifiers.cry_jkr_misprint_mod + end if G.GAME.modifiers.cry_misprint_min or override and override.min then Cryptid.misprintize_tbl( card.config.center_key, @@ -382,8 +391,8 @@ 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), - max = (G.GAME.modifiers.cry_misprint_max or 1), + 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, @@ -428,7 +437,7 @@ function Cryptid.manipulate(card, args) end end elseif (type(v) == "table" and v.tetrate) or type(v) == "number" then - if to_big(card.ability[i] or 0) > to_big(v or 0) 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 @@ -523,7 +532,7 @@ function Cryptid.manipulate_value(num, args, is_big, name) end elseif args.type == "^" then num = to_big(num) ^ new_value - elseif args.type == "hyper" and SMODS.Mods.Talisman and SMODS.Mods.Talisman.can_load then + 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 @@ -541,7 +550,7 @@ function Cryptid.manipulate_value(num, args, is_big, name) end elseif args.type == "^" then num = to_big(num) ^ args.value - elseif args.type == "hyper" and SMODS.Mods.Talisman and SMODS.Mods.Talisman.can_load then + elseif args.type == "hyper" then num = to_big(num):arrow(args.value.arrows, to_big(args.value.height)) end end diff --git a/lib/modifiers.lua b/lib/modifiers.lua index 56f25847e..02dacac37 100644 --- a/lib/modifiers.lua +++ b/lib/modifiers.lua @@ -456,15 +456,29 @@ function Cryptid.next_voucher_stickers(booster) v["force"] = G.GAME.modifiers.cry_sticker_sheet_plus or (G.GAME.modifiers.cry_force_sticker and G.GAME.modifiers.cry_force_sticker == k) end - if G.GAME.modifiers.cry_sticker_sheet_plus or G.GAME.modifiers.cry_force_sticker then + if + G.GAME.modifiers.cry_any_stickers + or G.GAME.modifiers.cry_sticker_sheet_plus + or G.GAME.modifiers.cry_force_sticker + then if (G.GAME.modifiers.enable_eternals_in_shop and checks.eternal.poll > odds) or checks.eternal.force then ret.eternal = true end if ( - G.GAME.modifiers.enable_perishables_in_shop - and checks.eternal.poll > odds - rate - and checks.eternal.poll <= odds + G.GAME.modifiers.cry_eternal_perishable_compat + and (G.GAME.modifiers.enable_perishables_in_shop and checks.perishable.poll > odds) + ) or checks.perishable.force + then -- still ehh? but way more understandable + ret.perishable = true + elseif + ( + not G.GAME.modifiers.cry_eternal_perishable_compat + and ( + G.GAME.modifiers.enable_perishables_in_shop + and checks.eternal.poll > odds - rate + and checks.eternal.poll <= odds + ) ) or checks.perishable.force then ret.perishable = true @@ -543,6 +557,25 @@ function Card:cry_calculate_voucher_perishable() end end +function Card:set_perishable(_perishable) + self.ability.perishable = nil + if + (self.config.center.perishable_compat or G.GAME.modifiers.cry_any_stickers) + and (not self.ability.eternal or G.GAME.modifiers.cry_eternal_perishable_compat) + then + self.ability.perishable = true + self.ability.perish_tally = G.GAME.perishable_rounds or 5 + end +end +function Card:set_eternal(_eternal) + self.ability.eternal = nil + if + (self.config.center.eternal_compat or G.GAME.modifiers.cry_any_stickers) + and (not self.ability.perishable or G.GAME.modifiers.cry_eternal_perishable_compat) + then + self.ability.eternal = _eternal + end +end function Card:calculate_banana() if not self.ability.extinct then if self.ability.banana and (pseudorandom("banana") < G.GAME.probabilities.normal / 10) then diff --git a/lib/overrides.lua b/lib/overrides.lua index 6a7eef0d0..6caa2a3bc 100644 --- a/lib/overrides.lua +++ b/lib/overrides.lua @@ -16,7 +16,22 @@ function get_pack(_key, _type) --Convert banned keys back to what it was originally G.GAME.banned_keys = copy_table(temp_banned) if G.GAME.modifiers.cry_equilibrium then - P_CRY_ITEMS = P_CRY_ITEMS or Cryptid.get_equilibrium_pool() + 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) @@ -31,14 +46,19 @@ function get_current_pool(_type, _rarity, _legendary, _append, override_equilibr if type == "Tag" then for i = 1, #pool do -- Copies: Turn Double tags into Triple Tags - if pool[i] == "tag_double" and G.GAME.used_vouchers.v_cry_tag_printers then + if pool[i] == "tag_double" and G.GAME.used_vouchers.v_cry_copies then pool[i] = "tag_cry_triple" end -- Tag Printer: Turn Double tags and Triple Tags into Quadruple Tags + if (pool[i] == "tag_double" or pool[i] == "tag_cry_triple") and G.GAME.used_vouchers.v_cry_tag_printer then + pool[i] = "tag_cry_quadruple" + end + -- Clone Machine: Turn Double tags and Triple Tags as well as Quadruple Tags into Quintuple Tags if - (pool[i] == "tag_double" or pool[i] == "tag_cry_triple") and G.GAME.used_vouchers.v_cry_clone_machine + (pool[i] == "tag_double" or pool[i] == "tag_cry_triple" or pool[i] == "tag_cry_quadruple") + and G.GAME.used_vouchers.v_cry_clone_machine then - pool[i] = "tag_cry_quadruple" + pool[i] = "tag_cry_quintuple" end end -- Deck of Equilibrium stuff @@ -56,7 +76,19 @@ function get_current_pool(_type, _rarity, _legendary, _append, override_equilibr and _type ~= "Stake" then -- we're regenerating the pool every time because of banned keys but it's fine tbh - P_CRY_ITEMS = P_CRY_ITEMS or Cryptid.get_equilibrium_pool() + 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 + v.unlocked == true + and not Cryptid.no(v, "doe", k) + and not (G.GAME.banned_keys[v.key] or G.GAME.cry_banished_keys[v.key]) + then + P_CRY_ITEMS[#P_CRY_ITEMS + 1] = v.key + end + end + end if #P_CRY_ITEMS <= 0 then P_CRY_ITEMS[#P_CRY_ITEMS + 1] = "v_blank" end @@ -139,10 +171,7 @@ function Blind:defeat(s) and (self.name ~= "The Needle" or not G.GAME.defeated_blinds["bl_cry_tax"]) and (self.name ~= "cry-Tax" or not G.GAME.defeated_blinds["bl_needle"]) then - G.GAME.defeated_blinds[self.config.blind.key] = true - end - if obj.boss then - G.GAME.inflation = 0 + G.GAME.defeated_blinds[self.config.blind.key or ""] = true end end @@ -260,18 +289,26 @@ end local upd = Game.update --init colors so they have references +G.C.CRY_TWILIGHT = { 0, 0, 0, 0 } +G.C.CRY_VERDANT = { 0, 0, 0, 0 } G.C.CRY_EMBER = { 0, 0, 0, 0 } +G.C.CRY_DAWN = { 0, 0, 0, 0 } G.C.CRY_HORIZON = { 0, 0, 0, 0 } G.C.CRY_BLOSSOM = { 0, 0, 0, 0 } +G.C.CRY_AZURE = { 0, 0, 0, 0 } G.C.CRY_ASCENDANT = { 0, 0, 0, 0 } G.C.CRY_JOLLY = { 0, 0, 0, 0 } G.C.CRY_GREENGRADIENT = { 0, 0, 0, 0 } G.C.CRY_ALTGREENGRADIENT = { 0, 0, 0, 0 } Cryptid.C = { EXOTIC = { HEX("708b91"), HEX("1e9eba") }, + TWILIGHT = { HEX("0800ff"), HEX("aa00ff") }, + VERDANT = { HEX("00ff22"), HEX("f4ff57") }, EMBER = { HEX("ff0000"), HEX("ffae00") }, + DAWN = { HEX("00aaff"), HEX("ff00e3") }, HORIZON = { HEX("c8fd09"), HEX("1ee7d9") }, BLOSSOM = { HEX("ff09da"), HEX("ffd121") }, + AZURE = { HEX("0409ff"), HEX("63dcff") }, ASCENDANT = { HEX("2e00f5"), HEX("e5001d") }, JOLLY = { HEX("6ec1f5"), HEX("456b84") }, SELECTED = { HEX("e38039"), HEX("ccdd1b") }, @@ -282,6 +319,7 @@ cry_pointer_dt = 0 cry_jimball_dt = 0 cry_glowing_dt = 0 cry_glowing_dt2 = 0 +local none_eval = 0 function Game:update(dt) upd(self, dt) if not Cryptid.member_count_delay then @@ -370,9 +408,16 @@ function Game:update(dt) v.children.back:set_sprite_pos(G.P_CENTERS.b_cry_glowing.pos or G.P_CENTERS["b_red"].pos) end end - if not G.OVERLAY_MENU and G.GAME.CODE_DESTROY_CARD then + if not G.OVERLAY_MENU and G.GAME.CODE_DESTROY_CARD and not G.OVERLAY_MENU_POINTER then G.FUNCS.exit_overlay_menu_code() end + + if not G.OVERLAY_MENU then + G.GAME.USING_POINTER = nil + else + G.OVERLAY_MENU_POINTER = nil + end + --Increase the blind size for The Clock and Lavender Loop local choices = { "Small", "Big", "Boss" } G.GAME.CRY_BLINDS = G.GAME.CRY_BLINDS or {} @@ -471,14 +516,6 @@ function Game:update(dt) G.STATE = G.STATES.SELECTING_HAND G.STATE_COMPLETE = false end - if - G.STATE == G.STATES.HAND_PLAYED - and to_big(G.GAME.chips) > to_big(G.GAME.blind.chips) - and not G.hand.cards[1] - and not G.deck.cards[1] - then - --im having to manually recreate some of this idk why - end end -- All the scattered set_cost hooks from all the pre refactor files moved into one hook @@ -512,9 +549,19 @@ function Card:set_cost() if self.ability.set == "Planet" and G.GAME.used_vouchers.v_cry_pacclimator then self.cost = 0 end - if self.ability.consumeable and G.GAME.hammerspace_mod_price then - self.cost = self.cost + G.GAME.hammerspace_mod_price + + --Multiplies voucher cost by G.GAME.modifiers.cry_voucher_price_hike + --Used by bronze stake to make vouchers %50 more expensive + if self.ability.set == "Voucher" and G.GAME.modifiers.cry_voucher_price_hike then + self.cost = math.floor(self.cost * G.GAME.modifiers.cry_voucher_price_hike) + --Update related costs + self.sell_cost = math.max(1, math.floor(self.cost / 2)) + (self.ability.extra_value or 0) + if self.area and self.ability.couponed and (self.area == G.shop_jokers or self.area == G.shop_booster) then + self.cost = 0 + end + self.sell_cost_label = self.facing == "back" and "?" or self.sell_cost end + --Makes Cursed Jokers always sell for $0 if self.config and self.config.center and self.config.center.rarity == "cry_cursed" then self.sell_cost = 0 @@ -555,9 +602,6 @@ function Card:sell_card() end end end - if G.GAME.modifiers.cry_sell_price then - ease_dollars(G.GAME.modifiers.cry_sell_price) - end --G.P_CENTERS.j_jolly sell_card_stuff(self) end @@ -726,7 +770,10 @@ function SMODS.create_mod_badges(obj, badges) end badges[#badges + 1] = create_badge( card_type, - set == "modest" and G.C.GREEN or set == "mainline" and G.C.PURPLE or G.C.CRY_ASCENDANT + set == "modest" and G.C.GREEN + or set == "mainline" and G.C.RED + or set == "madness" and G.C.CRY_EXOTIC + or G.C.CRY_ASCENDANT ) end end @@ -737,16 +784,14 @@ function calculate_reroll_cost(skip_increment) if not limit then if next(find_joker("cry-candybuttons")) then limit = 1 + elseif G.GAME.used_vouchers.v_cry_rerollexchange then + limit = 2 end end if not G.GAME.current_round.free_rerolls or G.GAME.current_round.free_rerolls < 0 then G.GAME.current_round.free_rerolls = 0 end - local crustulum_rolls = 0 - for i, v in pairs(find_joker("cry-crustulum") or {}) do - crustulum_rolls = crustulum_rolls + v.ability.extra.rerolls_stored - end - if to_big(crustulum_rolls) > to_big(0) or G.GAME.current_round.free_rerolls > 0 then + if next(find_joker("cry-crustulum")) or G.GAME.current_round.free_rerolls > 0 then G.GAME.current_round.reroll_cost = 0 return end @@ -756,14 +801,15 @@ function calculate_reroll_cost(skip_increment) + G.GAME.current_round.reroll_cost_increase >= limit then - --G.GAME.current_round.reroll_cost_increase = 0 + G.GAME.current_round.reroll_cost_increase = 0 G.GAME.current_round.reroll_cost = limit return end G.GAME.current_round.reroll_cost_increase = G.GAME.current_round.reroll_cost_increase or 0 if not skip_increment then - G.GAME.current_round.reroll_cost_increase = G.GAME.current_round.reroll_cost_increase + 1 + G.GAME.current_round.reroll_cost_increase = G.GAME.current_round.reroll_cost_increase + + (G.GAME.modifiers.cry_reroll_scaling or 1) end G.GAME.current_round.reroll_cost = (G.GAME.round_resets.temp_reroll_cost or G.GAME.round_resets.reroll_cost) + G.GAME.current_round.reroll_cost_increase @@ -918,7 +964,7 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable if card.ability.name == "cry-Cube" then card:set_eternal(true) end - if _type == "Joker" then + if _type == "Joker" or (G.GAME.modifiers.cry_any_stickers and not G.GAME.modifiers.cry_sticker_sheet) then if G.GAME.modifiers.all_eternal then card:set_eternal(true) end @@ -940,7 +986,16 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable card:set_eternal(true) end if G.GAME.modifiers.enable_perishables_in_shop then - if (eternal_perishable_poll > 0.4) and (eternal_perishable_poll <= 0.7) then + if + not G.GAME.modifiers.cry_eternal_perishable_compat + and ((eternal_perishable_poll > 0.4) and (eternal_perishable_poll <= 0.7)) + then + card:set_perishable(true) + end + if + G.GAME.modifiers.cry_eternal_perishable_compat + and pseudorandom("cry_per" .. (key_append or "") .. G.GAME.round_resets.ante) > 0.7 + then card:set_perishable(true) end end @@ -957,12 +1012,20 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable card.pinned = true end if - G.GAME.modifiers.enable_banana + not G.GAME.modifiers.cry_eternal_perishable_compat + and G.GAME.modifiers.enable_banana and (pseudorandom("cry_banana" .. (key_append or "") .. G.GAME.round_resets.ante) > 0.7) and (eternal_perishable_poll <= 0.7) then card.ability.banana = true end + if + G.GAME.modifiers.cry_eternal_perishable_compat + and G.GAME.modifiers.enable_banana + and (pseudorandom("cry_banana" .. (key_append or "") .. G.GAME.round_resets.ante) > 0.7) + then + card.ability.banana = true + end if G.GAME.modifiers.cry_sticker_sheet then for k, v in pairs(SMODS.Stickers) do if v.apply and not v.no_sticker_sheet then @@ -971,7 +1034,7 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable end end if - card.ability.eternal + not card.ability.eternal and G.GAME.modifiers.cry_enable_flipped_in_shop and pseudorandom("cry_flip" .. (key_append or "") .. G.GAME.round_resets.ante) > 0.7 then @@ -1367,12 +1430,10 @@ function set_consumeable_usage(card) end G.GAME.cry_function_stupid_workaround[i] = G.GAME.cry_last_used_consumeables[i] end - if not card.config.center.hidden then - local nextindex = #G.GAME.cry_last_used_consumeables + 1 - G.GAME.cry_last_used_consumeables[nextindex] = card.config.center_key - if nextindex > 3 then - table.remove(G.GAME.cry_last_used_consumeables, 1) - end + local nextindex = #G.GAME.cry_last_used_consumeables + 1 + G.GAME.cry_last_used_consumeables[nextindex] = card.config.center_key + if nextindex > 3 then + table.remove(G.GAME.cry_last_used_consumeables, 1) end scuref(card) end @@ -1729,7 +1790,10 @@ end local end_roundref = end_round function end_round() - if (#G.hand.cards < 1 and #G.deck.cards < 1 and #G.play.cards < 1) or (#G.hand.cards < 1 and #G.deck.cards < 1) then + if + ((#G.hand.cards < 1 and #G.deck.cards < 1 and #G.play.cards < 1) or (#G.hand.cards < 1 and #G.deck.cards < 1)) + and G.STATE ~= G.STATES.NEW_ROUND + then if Cryptid.enabled("set_cry_poker_hand_stuff") == true and not Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "cry_none") @@ -2063,143 +2127,31 @@ function get_straight(hand, min_length, skip, wrap) return get_straight_ref(hand, min_length + stones, skip, wrap) end -local poll_editionref = poll_edition -function poll_edition(_key, _mod, _no_neg, _guaranteed) - if not _guaranteed and G.GAME.modifiers.cry_rarer_modifications then - if pseudorandom("cry_rarer_modifications") < G.GAME.modifiers.cry_rarer_modifications then - return nil - end +local get_prob_vars_ref = SMODS.get_probability_vars +function SMODS.get_probability_vars(trigger_obj, base_numerator, base_denominator, identifier, from_roll) + local mod = trigger_obj and trigger_obj.ability and trigger_obj.ability.cry_prob or 1 + local numerator = base_numerator * mod + if trigger_obj and trigger_obj.ability and trigger_obj.ability.cry_rigged then + numerator = base_denominator end - return poll_editionref(_key, _mod, _no_neg, _guaranteed) + return get_prob_vars_ref(trigger_obj, numerator, base_denominator, identifier, from_roll) end -if SMODS and SMODS.Mods and (not SMODS.Mods.Talisman or not SMODS.Mods.Talisman.can_load) then - local smods_xchips = false - for _, v in pairs(SMODS.calculation_keys) do - if v == "x_chips" then - smods_xchips = true - break - end - end - local calculation_keys = { - e_mult = true, - emult = true, - Emult_mod = true, - e_chips = true, - echips = true, - Echip_mod = true, - } - local scie = SMODS.calculate_individual_effect - function SMODS.calculate_individual_effect(effect, scored_card, key, amount, from_edition) - if (key == "e_chips" or key == "echips" or key == "Echip_mod") and amount ~= 1 then - if effect.card then - juice_card(effect.card) - end - hand_chips = mod_chips(hand_chips ^ amount) - update_hand_text({ delay = 0 }, { chips = hand_chips, mult = mult }) - if not effect.remove_default_message then - if from_edition then - card_eval_status_text( - scored_card, - "jokers", - nil, - percent, - nil, - { message = "^" .. amount, colour = G.C.EDITION, edition = true, sound = "cry_chips" } - ) - elseif key ~= "Echip_mod" then - if effect.echip_message or effect.message then - local msg = effect.echip_message or effect.message - if not msg.sound then - msg.sound = "cry_echips" - end - card_eval_status_text( - scored_card or effect.card or effect.focus, - "e_chips", - amount, - percent, - nil, - msg - ) - else - card_eval_status_text( - scored_card or effect.card or effect.focus, - "e_chips", - amount, - percent, - nil, - { colour = G.C.DARK_EDITION } - ) - end - end - end - return true - end - if (key == "e_mult" or key == "emult" or key == "Emult_mod") and amount ~= 1 then - if effect.card then - juice_card(effect.card) - end - mult = mod_mult(mult ^ amount) - update_hand_text({ delay = 0 }, { chips = hand_chips, mult = mult }) - if not effect.remove_default_message then - if from_edition then - card_eval_status_text(scored_card, "jokers", nil, percent, nil, { - message = "^" .. amount .. " " .. localize("k_mult"), - colour = G.C.EDITION, - edition = true, - sound = "cry_emult", - }) - elseif key ~= "Emult_mod" then - if effect.emult_message or effect.message then - local msg = effect.echip_message or effect.message - if not msg.sound then - msg.sound = "cry_emult" - end - card_eval_status_text( - scored_card or effect.card or effect.focus, - "e_mult", - amount, - percent, - nil, - msg - ) - else - card_eval_status_text( - scored_card or effect.card or effect.focus, - "e_mult", - amount, - percent, - nil, - { colour = G.C.DARK_EDITION } - ) - end - end - end - return true - end - local ret = scie(effect, scored_card, key, amount, from_edition) - if ret then - return ret - end - end - for i, v in pairs(calculation_keys) do - table.insert(SMODS.calculation_keys, i) - end - if not smods_xchips then - for _, v in ipairs({ "x_chips", "xchips", "Xchip_mod" }) do - table.insert(SMODS.calculation_keys, v) - end - end - function to_number(a) - return a - end - function to_big(a) - return a - end - function lenient_bignum(a) - return a - end - function is_number(x) - return type(x) == "number" +local pseudorandom_probability_ref = SMODS.pseudorandom_probability +function SMODS.pseudorandom_probability(trigger_obj, seed, base_numerator, base_denominator, identifier) + local mod = trigger_obj and trigger_obj.ability and trigger_obj.ability.cry_prob or 1 + local numerator = base_numerator * mod + if trigger_obj and trigger_obj.ability and trigger_obj.ability.cry_rigged then + SMODS.post_prob = SMODS.post_prob or {} + SMODS.post_prob[#SMODS.post_prob + 1] = { + pseudorandom_result = true, + result = true, + trigger_obj = trigger_obj, + numerator = base_denominator, + denominator = base_denominator, + identifier = identifier or seed, + } + return true end + return pseudorandom_probability_ref(trigger_obj, seed, numerator, base_denominator, identifier) end diff --git a/lib/pointerlib.lua b/lib/pointerlib.lua index 6616b7e83..b688cbd16 100644 --- a/lib/pointerlib.lua +++ b/lib/pointerlib.lua @@ -115,15 +115,6 @@ function Cryptid.pointergetblist(target) -- "Is this card pointer banned?" results[1] = true end end - local table = G.P_CENTERS[target] - if not table and type(target) == "table" then - table = G.P_CENTERS[target.key] - end - for i, v in pairs(Cryptid.pointerblisttype.misc or {}) do - if table and table[v] 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 diff --git a/lib/ui.lua b/lib/ui.lua index 212b69de0..cbe85dd99 100644 --- a/lib/ui.lua +++ b/lib/ui.lua @@ -235,7 +235,7 @@ SMODS.DrawStep({ 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 then + 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_clarifier"], { x = 0, y = 0 }) interceptorSprite.role.draw_major = self diff --git a/localization/de.lua b/localization/de.lua index e7e69883e..23e390501 100644 --- a/localization/de.lua +++ b/localization/de.lua @@ -8,7 +8,6 @@ return { text = { "Hat die {C:legendary,E:1}positiven Effekte{}", "von {C:attention}jedem{} Deck", - "mit dem du {C:gold}Goldenen Einsatz{} gewonnen hast", }, unlock = { "Gewinne einen Durchlauf", @@ -16,6 +15,14 @@ return { "auf {C:attention}Goldener Einsatz", }, }, + b_cry_antimatter_balanced = { + name = "Antimaterie Deck", + text = { + "Hat die {C:legendary,E:1}positiven Effekte{}", + "von {C:attention}jedem{} Deck", + "mit dem du {C:gold}Goldenen Einsatz{} gewonnen hast", + }, + }, b_cry_beige = { name = "Beiges Deck", text = { @@ -1087,6 +1094,14 @@ return { }, }, j_cry_astral_bottle = { + name = "Astral in einer Flasche", + text = { + "Wenn verkauft, füge {C:dark_edition}Astral{}", + "und {C:attention}Verderblich{} einem", + "zufälligen {C:attention}Joker{} hinzu", + }, + }, + j_cry_astral_bottle_mainline = { name = "Astral in einer Flasche", text = { "Wenn verkauft, füge {C:dark_edition}Astral{}", @@ -1094,6 +1109,13 @@ return { "anderen, zufälligen {C:attention}Joker{} hinzu", }, }, + j_cry_astral_bottle_madness = { + name = "Astral in einer Flasche", + text = { + "Wenn verkauft, füge {C:dark_edition}Astral{}", + "einem zufälligen {C:attention}Joker{} hinzu", + }, + }, j_cry_big_cube = { name = "Großer Würfel", text = { diff --git a/localization/en-us.lua b/localization/en-us.lua index 8e90d4565..08f719705 100644 --- a/localization/en-us.lua +++ b/localization/en-us.lua @@ -5,8 +5,7 @@ return { name = "Antimatter Deck", text = { "Applies the {C:legendary,E:1}upsides{}", - "of {C:attention}every{} deck won", - "with {C:gold}Gold Stake{}", + "of {C:attention}every{} deck", }, unlock = { "Win a run", @@ -14,6 +13,14 @@ return { "on {C:attention}Gold Stake", }, }, + b_cry_antimatter_balanced = { + name = "Antimatter Deck", + text = { + "Applies the {C:legendary,E:1}upsides{}", + "of {C:attention}every{} deck won", + "with {C:gold}Gold Stake{}", + }, + }, b_cry_beige = { name = "Beige Deck", text = { @@ -119,7 +126,7 @@ return { "{C:attention}same chance{} of", "appearing in shops,", "start run with", - "{C:attention,T:v_overstock_norm}Overstock", + "{C:attention,T:v_overstock_plus}Overstock Plus", }, unlock = { "Have {C:attention}100 Jokers", @@ -243,9 +250,10 @@ return { b_cry_wormhole = { name = "Wormhole Deck", text = { - "When a {C:attention}Boss-Blind{} is", - "defeated, Upgrade the {C:attention}rarity{}", - "of the leftmost Joker", + "Start with an {C:cry_exotic}Exotic{C:attention} Joker", + "Jokers are {C:attention}20X{} more", + "likely to be {C:dark_edition}Negative", + "{C:attention}-2{} Joker slots", }, unlock = { "Obtain an {C:cry_exotic}Exotic{C:attention} Joker", @@ -548,8 +556,9 @@ return { c_cry_rework = { name = "://REWORK", text = { - "{C:cry_code}Upgrade{} the edition of", - "a {C:cry_code}selected{} Joker", + "Destroy a {C:cry_code}selected{} Joker,", + "create a {C:cry_code}Rework Tag{} with", + "an {C:cry_code}upgraded{} edition", "{C:inactive,s:0.8}Upgrades using order in the Collection", }, }, @@ -649,7 +658,6 @@ return { "Saves the {C:cry_code}Last Three{} consumables used,", "using this card again creates a copy of", "the first with a {C:cry_code}Function://{} sticker", - "{C:inactive}(Hidden consumables excluded){}", }, }, c_cry_run = { @@ -734,7 +742,6 @@ return { text = { "Create a {C:cry_code}copy{} of a selected", "playing card or consumable", - "{C:inactive}(Hidden consumables excluded){}", }, }, c_cry_reboot = { @@ -1044,12 +1051,23 @@ return { "a {C:attention}#2#", }, }, - j_cry_googol_play = { - name = "Googol Play Card", + j_cry_altgoogol = { + name = "Nostalgic Googol Play Card", text = { - "{C:green}#1# in #2#{} chance for", - "{X:red,C:white} X#4# {} Mult", - "Otherwise {X:red,C:white}X#3#{} Mult", + "Sell this card to create", + "{C:attention}#1#{} cop#1# of the leftmost {C:attention}Joker{}", + "{C:inactive,s:0.8}Does not copy Nostalgic Googol Play Cards{}", + "{C:inactive}(Must have room){}", + }, + }, + j_cry_altgoogol_balanced = { + name = "Nostalgic Googol Play Card", + text = { + "Sell this card to create", + "{C:attention}#1#{} cop#1# of the leftmost {C:attention}Joker{}", + "{C:inactive,s:0.8}Does not copy Nostalgic Googol Play Cards{}", + "{C:inactive}(Must have room){}", + --todo: add "removes negative from copy" like Ankh/Invis Joker }, }, j_cry_antennastoheaven = { @@ -1082,6 +1100,21 @@ return { "a random {C:attention}Joker{}", }, }, + j_cry_astral_bottle_mainline = { + name = "Astral in a Bottle", + text = { + "When sold, apply {C:dark_edition}Astral{}", + "and {C:attention}Perishable{} to", + "different, random {C:attention}Jokers{}", + }, + }, + j_cry_astral_bottle_madness = { + name = "Astral in a Bottle", + text = { + "When sold, apply {C:dark_edition}Astral{}", + "to a random {C:attention}Joker{}", + }, + }, j_cry_big_cube = { name = "Big Cube", text = { @@ -1172,9 +1205,8 @@ return { name = "Boredom", text = { "{C:green}#1# in #2#{} chance to", - "{C:attention}retrigger{} a random {C:attention}Joker{}", - "{C:green}#1# in #2#{} chance to", - "retrigger each {C:attention}played card{}", + "{C:attention}retrigger{} each {C:attention}Joker{}", + "or {C:attention}played card{}", "{C:inactive,s:0.8}Does not affect other Boredom{}", }, unlock = { @@ -1187,7 +1219,7 @@ return { name = "Brittle Candy", text = { "For the next {C:attention}#1#{} hand#1#,", - "add {C:attention}Glass{} to", + "add {C:attention}Stone{}, {C:attention}Gold{}, or {C:attention}Steel{} to", "the rightmost scoring card", }, }, @@ -1258,9 +1290,23 @@ return { j_cry_canvas = { name = "Canvas", text = { - "{C:attention}Retrigger{} the leftmost {C:attention}Joker{}", - "once for {C:attention}every{} unique {C:attention}Joker Rarity{C:attention}", - "currently held", + "{C:attention}Retrigger{} all {C:attention}Jokers{} to the left", + "once for {C:attention}every{} non-{C:blue}Common{C:attention} Joker{}", + "to the right of this Joker", + }, + unlock = { + "Retrigger a {C:attention}Joker", + "{C:attention}114{} times", + "in one hand", + }, + }, + j_cry_canvas_balanced = { + name = "Canvas", + text = { + "{C:attention}Retrigger{} all {C:attention}Jokers{} to the left", + "once for {C:attention}every{} non-{C:blue}Common{C:attention} Joker{}", + "to the right of this Joker", + "{C:inactive}(Up to 2 retriggers)", }, unlock = { "Retrigger a {C:attention}Joker", @@ -1372,27 +1418,27 @@ return { j_cry_CodeJoker = { name = "Code Joker", text = { - "Create a {C:cry_code}Code Card{} when", + "Create a {C:dark_edition}Negative{}", + "{C:cry_code}Code Card{} when", "{C:attention}Blind{} is selected", - "{C:inactive}(Must have room){}", }, unlock = { "Discover {C:attention}every", "{C:cry_code}Code Card", }, }, - -- j_cry_CodeJoker_modest = { - -- name = "Code Joker", - -- text = { - -- "Create a {C:dark_edition}Negative{}", - -- "{C:cry_code}Code Card{} when", - -- "{C:attention}Boss Blind{} is selected", - -- }, - -- unlock = { - -- "Discover {C:attention}every", - -- "{C:cry_code}Code Card", - -- }, - -- }, + j_cry_CodeJoker_modest = { + name = "Code Joker", + text = { + "Create a {C:dark_edition}Negative{}", + "{C:cry_code}Code Card{} when", + "{C:attention}Boss Blind{} is selected", + }, + unlock = { + "Discover {C:attention}every", + "{C:cry_code}Code Card", + }, + }, j_cry_coin = { name = "Crypto Coin", text = { @@ -1404,7 +1450,7 @@ return { j_cry_compound_interest = { name = "Compound Interest", text = { - "Earn {C:money}#1#%{} more interest", + "Earn {C:money}#1#%{} of total money", "at end of round,", "increases by {C:money}#2#%{} per", "consecutive payout", @@ -1413,10 +1459,10 @@ return { j_cry_copypaste = { name = "Copy/Paste", text = { - "Duplicate used {C:cry_code}Code{} cards", + "{C:green}#1# in #2#{} chance to duplicate", + "used {C:cry_code}Code{} cards", "{C:red}Works once per round{}", "{C:inactive}(Must have room)", - "{C:inactive}(Currently #1#)", }, }, j_cry_copypaste_modest = { @@ -1427,20 +1473,28 @@ return { "{C:inactive}(Must have room)", }, }, + j_cry_copypaste_madness = { + name = "Copy/Paste", + text = { + "{C:green}#1# in #2#{} chance to duplicate", + "used {C:cry_code}Code{} cards", + "{C:inactive}(Must have room)", + }, + }, j_cry_cotton_candy = { name = "Cotton Candy", text = { - "When sold, apply {C:dark_edition}Negative{}", - "to two {C:attention}random{} Jokers", + "When sold, adjacent", + "{C:attention}Jokers{} become {C:dark_edition}Negative{}", }, }, j_cry_crustulum = { name = "Crustulum", text = { - "This Joker gains {C:attention}+#2#{} Reroll#2#", - "when a {C:attention}Food{} Joker {C:red}Expires{}", - "Create a {C:attention}Food{} Joker at end of round", - "{C:inactive}(Currently {C:attention}+#1#{C:inactive} Reroll#1#)", + "This Joker gains {C:chips}+#2#{} Chip#2#", + "per {C:attention}reroll{} in the shop", + "{C:green}All rerolls are free{}", + "{C:inactive}(Currently {C:chips}+#1#{C:inactive} chip#1#)", }, }, j_cry_cryptidmoment = { @@ -1516,9 +1570,8 @@ return { text = { "When a {C:attention}Booster Pack{} is opened,", "{C:green}#1# in #2#{} chance to create", - "a random card corresponding", - "to its {C:attention}type{}", - "{C:inactive}(Must have room){}", + "a random {C:dark_edition}Negative{} card", + "corresponding to its {C:attention}type{}", }, }, j_cry_discreet = { @@ -1538,16 +1591,16 @@ return { "for each {C:attention}Jolly Joker{}", }, }, - -- ["j_cry_Double Scale"] = { -- ????????????? - -- name = "Double Scale", - -- text = { - -- "Scaling {C:attention}Jokers{}", - -- "scale {C:attention}quadratically", - -- "{C:inactive,s:0.8}(ex. +1, +3, +6, +10)", - -- "{C:inactive,s:0.8}(grows by +1, +2, +3)", - -- }, - -- }, - ["j_cry_Double Scale"] = { + ["j_cry_Double Scale"] = { -- ????????????? + name = "Double Scale", + text = { + "Scaling {C:attention}Jokers{}", + "scale {C:attention}quadratically", + "{C:inactive,s:0.8}(ex. +1, +3, +6, +10)", + "{C:inactive,s:0.8}(grows by +1, +2, +3)", + }, + }, + ["j_cry_Double Scale_modest"] = { name = "Double Scale", text = { "Scaling {C:attention}Jokers{}", @@ -1604,8 +1657,7 @@ return { text = { "Draw {C:green}full deck{} to hand", "when {C:attention}Blind{} is selected", - "{C:attention}+#1#{} Card Selection Limit", - "{C:inactive,s:0.8}\"If you can't handle me at my 1x", + "{C:inactive,s:0.8}\"If you can't handle me at my 1x,", "{C:inactive,s:0.8}you don't deserve me at my 2x\"", }, }, @@ -1639,7 +1691,7 @@ return { name = "Eternal Flame", text = { "This Joker gains {X:mult,C:white} X#1# {} Mult", - "for each Joker {C:attention}sold{} with", + "for each card {C:attention}sold{} with", "at least {C:money}$3{} of {C:attention}sell value", "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", }, @@ -1648,7 +1700,7 @@ return { name = "Eternal Flame", text = { "This Joker gains {X:mult,C:white} X#1# {} Mult", - "for each Joker {C:attention}sold{}", + "for each card {C:attention}sold{}", "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", }, }, @@ -1703,11 +1755,9 @@ return { j_cry_familiar_currency = { name = "Familiar Currency", text = { - "Take {C:money}$#1#{}", - "at the end of round {C:inactive}(if possible)", - "When sold create {C:attention}One{} meme Joker", - "for every {C:money}$#1#{} Taken so Far", - "{C:inactive}(Currently {C:attention}#2#{C:inactive})", + "Create a {C:attention}Meme Joker{}", + "at the end of round", + "for {C:money}$#1#{} {C:inactive}(if possible)", "{C:inactive}(Must have room)", }, }, @@ -1817,7 +1867,6 @@ return { "{C:attention}Double{} all values", "of leftmost {C:attention}Joker", "at end of round", - "{C:inactive}(Value Modifer stacks){}", }, }, j_cry_ghost = { @@ -1841,20 +1890,18 @@ return { j_cry_goldjoker = { name = "Gold Joker", text = { - "Earn {C:money}#1#%{} more", - "interest at end of round", - "Percentage increases by {C:money}#2#%{}", + "Earn {C:money}#1#%{} of total", + "money at end of round", + "Payout increases by {C:money}#2#%{}", "when each played {C:attention}Gold{}", "card is scored", }, }, - j_cry_altgoogol = { - name = "Nostalgic Googol Play Card", + j_cry_googol_play = { + name = "Googol Play Card", text = { - "After {C:attention}#2#{} {C:inactive}[#3#]{} rounds Sell this card to create", - "{C:attention}#1#{} cop#1# of the leftmost {C:attention}Joker{}", - "{C:inactive,s:0.8}Does not copy Googol Play Cards{}", - "{C:inactive}(Must have room){}", + "{C:green}#1# in #2#{} chance for", + "{X:red,C:white} X#3# {} Mult", }, unlock = { "Score {C:attention}1.0e100{} Chips", @@ -1921,9 +1968,8 @@ return { name = "Jawbreaker", text = { "When {C:attention}Boss Blind{} defeated,", - "{C:attention}Double{} values of adjacent Jokers", + "{C:attention}double{} values of adjacent Jokers", "{E:2,C:red}self destructs{}", - "{C:inactive}(Value Modifer does not stack){}", }, }, j_cry_jimball = { @@ -1955,11 +2001,9 @@ return { j_cry_jtron = { name = "Jimbo-tron 9000", text = { - "This Joker gains {X:mult,C:white} X#1# {} Mult", + "This Joker gains {X:dark_edition,C:white} ^#1# {} Mult", "for each default {C:attention}Joker{}", - "Generate a default {C:attention}Joker{} at the end of round", - "{C:inactive}(Must have room){}", - "{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)", + "{C:inactive}(Currently {X:dark_edition,C:white}^#2#{C:inactive} Mult)", }, }, j_cry_kidnap = { @@ -2071,9 +2115,9 @@ return { j_cry_M = { name = "M", text = { - "Create a {C:attention}Jolly Joker{} when", + "Create a {C:dark_edition}Negative{}", + "{C:attention}Jolly Joker{} when", "{C:attention}Blind{} is selected", - "{C:inactive}(Must have room){}", }, }, j_cry_macabre = { @@ -2317,7 +2361,7 @@ return { text = { "Earn {C:money}$#1#{} at end of round", "Increase payout by {C:money}$#2#{}", - "if a {C:attention}#3#{} is held in hand,", + "for each {C:attention}#3#{} held in hand,", "rank changes every round", }, }, @@ -2345,9 +2389,8 @@ return { j_cry_oil_lamp = { name = "Oil Lamp", text = { - "Increase values of {C:attention}Joker{}", - "to the right by {C:attention}Twenty{} Percent", - "{C:inactive}(Value Modifer does not stack){}", + "Increase values of {C:attention}Joker{} to the right", + "by {C:attention}X#1#{} at end of round", }, }, j_cry_oldblueprint = { @@ -2416,8 +2459,6 @@ return { text = { "On skipping a {C:attention}Booster Pack{},", "gain a random {C:attention}Tag{}", - "{C:red}Works once per round{}", - "{C:inactive}(Currently #1#){}", }, }, j_cry_pity_prize_modest = { @@ -2575,10 +2616,11 @@ return { name = "Scalae", text = { "Scaling {C:attention}Jokers{} scale", - "{X:dark_edition,C:white}X#1#{} as fast", - "increase multiplier by {C:attention}#2#{}", + "as a degree-{C:attention}#1#{} polynomial", + "raise degree by {C:attention}#2#{}", "at end of round", "{C:inactive,s:0.8}({C:attention,s:0.8}Scalae{C:inactive,s:0.8} excluded)", + "{C:inactive,s:0.8}(ex. +1, +#3#, +#4#, +#5#)", }, }, j_cry_scrabble = { @@ -2622,6 +2664,21 @@ return { }, }, j_cry_soccer = { + name = "One for All", --changed the name from latin because this isn't exotic + text = { + "{C:attention}+#1#{} Joker slot#1#", + "{C:attention}+#1#{} Booster Pack slot#1#", + "{C:attention}+#1#{} hand size", + "{C:attention}+#1#{} consumable slot#1#", + "{C:attention}+#1#{} card#1# in shop", + "{C:attention}+#1#{} voucher slot#1#", + }, + unlock = { + "Win a run with", + "only {C:attention}High Card", + }, + }, + j_cry_soccer_balanced = { name = "One for All", --changed the name from latin because this isn't exotic text = { "{C:attention}+#1#{} Booster Pack slot#1#", @@ -2687,7 +2744,7 @@ return { j_cry_paved_joker = { name = "Paved Joker", text = { - "Rankless Cards may fill", + "Stone Cards may fill", "gaps of {C:attention}#1#{} in", "{C:attention}Straights{} and {C:attention}Flushes{}", }, @@ -2753,11 +2810,11 @@ return { j_cry_stella_mortis = { name = "Stella Mortis", text = { - "When skipping a {C:attention}Celestial{} Pack", - "{C:red}destroy{} pack cards based on how many", - "{C:attention}choices{} are left. Gain {X:dark_edition,C:white}^#1#{} Mult", - "for each card {C:red}destroyed{}", - "{C:inactive}(Currently, {X:dark_edition,C:white}^#2#{} {C:inactive}Mult)", + "This Joker destroys a", + "random {C:planet}Planet{} card", + "to gain {X:dark_edition,C:white} ^#1# {} Mult", + "at the end of the {C:attention}shop{}", + "{C:inactive}(Currently {X:dark_edition,C:white} ^#2# {C:inactive} Mult)", }, }, j_cry_stronghold = { @@ -2846,7 +2903,7 @@ return { name = "Translucent Joker", text = { "Sell this card to create", - "a {C:attention}Perishable{} copy", + "a {C:attention}Banana Perishable{} copy", "of a random {C:attention}Joker{}", "{s:0.8,C:inactive}(Copy bypasses perish compat)", }, @@ -2923,11 +2980,9 @@ return { j_cry_tropical_smoothie = { name = "Tropical Smoothie", text = { - "Sell this card to", - "Increase values of all", - "{C:attention}Jokers{} by {C:attention}Fifty{} Percent", - "for the remainder of this ante", - "{C:inactive}(Value Modifer does not stack){}", + "Sell this card", + "to {C:attention}multiply{} values", + "of owned Jokers by {C:attention}X#1#{}", }, }, j_cry_unity = { @@ -3000,7 +3055,7 @@ return { name = "Waluigi", text = { "All Jokers give", - "{X:mult,C:white} X#1# {} Mult when triggered", + "{X:mult,C:white} X#1# {} Mult", }, }, j_cry_wario = { @@ -3293,7 +3348,7 @@ return { "{C:attention}same chance{} of", "appearing in shops,", "start run with", - "{C:attention}+1 Shop Slots", + "{C:attention,T:v_overstock_plus}+2 Shop Slots", }, }, sleeve_cry_glowing_sleeve = { @@ -3347,9 +3402,10 @@ return { sleeve_cry_wormhole_sleeve = { name = "Wormhole Sleeve", text = { - "When a {C:attention}Boss-Blind{} is", - "defeated, Upgrade the {C:attention}rarity{}", - "of the leftmost Joker", + "Start with an {C:cry_exotic}Exotic{C:attention} Joker", + "Jokers are {C:attention}20X{} more", + "likely to be {C:dark_edition}Negative", + "{C:attention}-2{} Joker slots", }, }, sleeve_cry_legendary_sleeve = { @@ -3362,6 +3418,15 @@ return { }, }, sleeve_cry_antimatter_sleeve = { + name = "Antimatter Sleeve", + text = { + "applies the {C:attention}effects{}", + "and {C:attention}special effects{}", + "of all deck sleeves", + "{C:red}WIP", + }, + }, + sleeve_cry_antimatter_sleeve_balanced = { name = "Antimatter Sleeve", text = { "applies the {C:attention}effects{}", @@ -3377,15 +3442,15 @@ return { text = { "{C:red}All{} of your {C:attention}Jokers{} become {C:dark_edition}Negative{},", "{C:red}all{} {C:attention}Jokers{} in the shop cost", - "{X:red,C:white}X#1#{} for the rest of the run", + "{C:red}double{} for the rest of the run", }, }, c_cry_analog = { name = "Analog", text = { "Create {C:attention}#1#{} cop#1# of a", - "random {C:attention}Joker{}", - "{C:attention}+#2#{} Ante", + "random {C:attention}Joker{}, destroy", + "all other Jokers, {C:attention}+#2#{} Ante", }, }, c_cry_chambered = { @@ -3403,7 +3468,6 @@ return { text = { "Swap the {C:attention}editions{} of", "{C:attention}2{} selected playing cards or {C:attention}Jokers{}", - "{C:inactive}(Both cards must be the same type){}", }, }, c_cry_gateway = { @@ -3420,15 +3484,13 @@ return { "Apply random {C:attention}consumables{}", "as if they were {C:dark_edition}Enhancements{}", "to cards held in hand", - "Consumables cost {C:attention}$#1#{} more", - "{C:inactive}(Currently {C:attention}$#2#{C:inactive} more){}", }, }, c_cry_lock = { name = "Lock", text = { "Remove {C:red}all{} stickers", - "from {C:attention}#1#{} selected Joker#1#", + "from {C:red}all{} Jokers,", "then apply {C:purple,E:1}Eternal{}", "to a random {C:attention}Joker{}", }, @@ -3438,7 +3500,7 @@ return { text = { "Create a card", "of {C:cry_code}your choice", - "{C:inactive,s:0.8}(Exotic Jokers and Hidden consumables excluded)", + "{C:inactive,s:0.8}(Exotic Jokers excluded)", }, }, c_cry_replica = { @@ -3448,14 +3510,13 @@ return { "held in hand", "to a {C:attention}random{}", "card held in hand", - "{C:red}-#1#{} hand size", }, }, c_cry_ritual = { name = "Ritual", text = { - "Apply {C:dark_edition}Mosaic{}, {C:dark_edition}Oversaturated{},", - "or {C:dark_edition}Golden{} to {C:attention}#1#{}", + "Apply {C:dark_edition}Negative{}, {C:dark_edition}Mosaic{},", + "or {C:dark_edition}Astral{} to {C:attention}#1#{}", "selected card#1# in hand", }, }, @@ -3515,79 +3576,199 @@ return { "{C:attention}Remove{} all other hand levels", }, }, + c_cry_white_hole2 = { + name = "White Hole", + text = { + "{C:attention}Remove{} all hand levels,", + "upgrade {C:legendary,E:1}most played{} poker hand", + "by {C:attention}3{} for each removed level", + }, + }, }, Stake = { - stake_cry_ruby = { - name = "Ruby Stake", - colour = "Ruby", --this is used for auto-generated sticker localization + stake_cry_pink = { + name = "Pink Stake", + colour = "Pink", --this is used for auto-generated sticker localization + text = { + "Required score scales", + "faster for each {C:attention}Ante", + }, + }, + stake_cry_brown = { + name = "Brown Stake", + colour = "Brown", + text = { + "All {C:attention}stickers{} are compatible", + "with each other", + }, + }, + stake_cry_yellow = { + name = "Yellow Stake", + colour = "Yellow", + text = { + "{C:attention}Stickers{} can appear on", + "all purchasable items", + }, + }, + stake_cry_jade = { + name = "Jade Stake", + colour = "Jade", + text = { + "Cards can be drawn {C:attention}face down{}", + }, + }, + stake_cry_cyan = { + name = "Cyan Stake", + colour = "Cyan", + text = { + "{C:green}Uncommon{} and {C:red}Rare{} Jokers are", + "less likely to appear", + }, + }, + stake_cry_gray = { + name = "Gray Stake", + colour = "Gray", + text = { + "Rerolls increase by {C:attention}$2{} each", + }, + }, + stake_cry_crimson = { + name = "Crimson Stake", + colour = "Crimson", + text = { + "Vouchers restock on {C:attention}even{} Antes", + }, + }, + stake_cry_diamond = { + name = "Diamond Stake", + colour = "Diamond", + text = { + "Must beat Ante {C:attention}10{} to win", + }, + }, + stake_cry_amber = { + name = "Amber Stake", + colour = "Amber", text = { - "Win Ante is {C:attention}10{}", - "{s:0.8}Applies all previous Stakes", + "{C:attention}-1{} Booster Pack slot", }, }, - stake_cry_topaz = { - name = "Topaz Stake", - colour = "Topaz", + stake_cry_bronze = { + name = "Bronze Stake", + colour = "Bronze", text = { - "Interest rate is", - "now every {C:attention}$8{}", - "{s:0.8}Applies all previous Stakes", + "Vouchers are {C:attention}50%{} more expensive", }, }, stake_cry_quartz = { name = "Quartz Stake", colour = "Quartz", text = { - "Jokers may be {C:attention}Pinned{}", + "Jokers can be {C:attention}Pinned{}", "{s:0.8,C:inactive}(Stays pinned to the leftmost position){}", - "{s:0.8}Applies all previous Stakes", }, }, - stake_cry_diamond = { - name = "Diamond Stake", - colour = "Diamond", + stake_cry_ruby = { + name = "Ruby Stake", + colour = "Ruby", + text = { + "{C:attention}Big{} Blinds can become", + "{C:attention}Boss{} Blinds", + }, + }, + stake_cry_glass = { + name = "Glass Stake", + colour = "Glass", + text = { + "Cards can {C:attention}shatter{} when scored", + }, + }, + stake_cry_sapphire = { + name = "Sapphire Stake", + colour = "Sapphire", + text = { + "Lose {C:attention}25%{} of current money", + "at end of Ante", + "{s:0.8,C:inactive}(Up to $10){}", + }, + }, + stake_cry_emerald = { + name = "Emerald Stake", + colour = "Emerald", + text = { + "Cards, packs, and vouchers", + "can be {C:attention}face down{}", + "{s:0.8,C:inactive}(Unable to be viewed until purchased){}", + }, + }, + stake_cry_platinum = { + name = "Platinum Stake", + colour = "Platinum", + text = { + "Small Blinds are {C:attention}removed{}", + }, + }, + stake_cry_twilight = { + name = "Twilight Stake", + colour = "Twilight", text = { "Cards can be {C:attention}Banana{}", "{s:0.8,C:inactive}(1 in 10 chance of being destroyed each round){}", - "{s:0.8}Applies all previous Stakes", }, }, - + stake_cry_verdant = { + name = "Verdant Stake", + colour = "Verdant", + text = { + "Required score scales", + "faster for each {C:attention}Ante", + }, + }, stake_cry_ember = { name = "Ember Stake", colour = "Ember", text = { - "Lose {C:attention}$1{} when", - "a card is sold", - "{s:0.8}Applies all previous Stakes", + "All items give no money when sold", + }, + }, + stake_cry_dawn = { + name = "Dawn Stake", + colour = "Dawn", + text = { + "Tarots and Spectrals target {C:attention}1", + "fewer card", + "{s:0.8,C:inactive}(Minimum of 1){}", }, }, stake_cry_horizon = { name = "Horizon Stake", colour = "Horizon", text = { - "Showdown blinds now", - "appear every {C:attention}5{} antes", - "{s:0.8}Applies all previous Stakes", + "When blind selected, add a", + "{C:attention}random card{} to deck", }, }, stake_cry_blossom = { name = "Blossom Stake", colour = "Blossom", text = { - "{C:attention}Natural{} modifications", - "are rarer", - "{s:0.8}Applies all previous Stakes", + "{C:attention}Final{} Boss Blinds can appear", + "in {C:attention}any{} Ante", + }, + }, + stake_cry_azure = { + name = "Azure Stake", + colour = "Azure", + text = { + "Values on Jokers are reduced", + "by {C:attention}20%{}", }, }, stake_cry_ascendant = { name = "Ascendant Stake", colour = "Ascendant", text = { - "Buying items increases", - "shop {C:attention}costs{} for", - "the current ante", - "{s:0.8}Applies all previous Stakes", + "{C:attention}-1{} Shop slot", }, }, }, @@ -3764,12 +3945,26 @@ return { "{s:0.8,C:inactive}Copying Tags excluded", }, }, + tag_cry_quintuple = { + name = "Quintuple Tag", + text = { + "Gives {C:attention}#1#{} cop#1# of the", + "next selected {C:attention}Tag", + "{s:0.8,C:inactive}Copying Tags excluded", + }, + }, + tag_cry_rework = { + name = "Rework Tag", + text = { + "Shop has a#3#", + "{C:dark_edition}#1# {C:cry_code}#2#", + }, + }, tag_cry_schematic = { name = "Schematic Tag", text = { - "Shop has a copy", - "of {C:attention}One{} of", - "your owned Jokers", + "Shop has a", + "{C:attention}Brainstorm", }, }, tag_cry_scope = { @@ -3856,7 +4051,8 @@ return { v_cry_copies = { name = "Copies", text = { - "Double Tags are", + "Double Tags become", + "{C:attention}Triple Tags{} and are", "{C:attention}2X{} as common", }, }, @@ -3864,7 +4060,7 @@ return { name = "Tag Printer", text = { "Double Tags become", - "{C:attention}Triple Tags{} and", + "{C:attention}Quadruple Tags{} and", "are {C:attention}3X{} as common", }, }, @@ -3945,7 +4141,7 @@ return { name = "Mass Production", text = { "All cards and packs", - "in shop are {C:attention}#1#%{} off", + "in shop cost {C:attention}$1{}", }, unlock = { "Redeem {C:attention}25", @@ -3968,8 +4164,8 @@ return { v_cry_rerollexchange = { name = "Reroll Exchange", text = { - "Reroll costs", - "starts at {C:attention}$#1#{}", + "All rerolls", + "cost {C:attention}$2{}", }, unlock = { "{C:attention}Reroll{} the shop", @@ -4080,7 +4276,7 @@ return { v_cry_asteroglyph = { name = "Asteroglyph", text = { - "{C:attention}-#1#{} Ante", + "Set Ante to {C:attention}#1#{}", }, unlock = { "Reach Ante {C:attention}36", @@ -4102,7 +4298,7 @@ return { name = "Clone Machine", text = { "Double Tags become", - "{C:attention}Quadruple Tags{} and", + "{C:attention}Quintuple Tags{} and", "are {C:attention}4X{} as common", }, }, @@ -4194,7 +4390,6 @@ return { text = { "When this Joker is {C:cry_code}triggered{},", "trigger {C:cry_code}#1#", - "Removed after {C:attention}#2#{} {C:inactive}[#3#]{} triggers", "{C:inactive}Not all cards can be triggered this way{}", "{C:inactive}but all Jokers can trigger the other{}", }, @@ -4707,6 +4902,7 @@ return { ach_cry_cryptid_the_cryptid = "Cryptid the Cryptid", ach_cry_exodia = "Exodia", ach_cry_freak_house = "Freak House", + ach_cry_googol_play_pass = "Googol Play Pass", ach_cry_haxxor = "H4xx0r", ach_cry_home_realtor = "Home Realtor", ach_cry_jokes_on_you = "Joke's on You, Pal!", @@ -4736,6 +4932,7 @@ return { ach_cry_cryptid_the_cryptid = "Use Cryptid on Cryptid", ach_cry_exodia = "Have 5 Exotic Jokers", ach_cry_freak_house = "Play a Flush House consisting of 6s and 9s of Hearts whilst possessing Nice", + ach_cry_googol_play_pass = "Rig a Googol Play Card", ach_cry_haxxor = "Use a cheat code", ach_cry_home_realtor = "Activate Happy House before Ante 8 (without DoE/Antimatter)", ach_cry_jokes_on_you = "Trigger The Joke's effect on Ante 1 and win the run", diff --git a/localization/es_ES.lua b/localization/es_ES.lua index 3c198609d..6d9aaf517 100644 --- a/localization/es_ES.lua +++ b/localization/es_ES.lua @@ -2,6 +2,13 @@ return { descriptions = { Back = { b_cry_antimatter = { + name = "Baraja de antimateria", + text = { + "Aplica las {C:legendary,E:1}ventajas{}", + "de {C:attention}todas{} las barajas", + }, + }, + b_cry_antimatter_balanced = { name = "Baraja de antimateria", text = { "Aplica las {C:legendary,E:1}ventajas{}", @@ -881,6 +888,14 @@ return { }, }, j_cry_astral_bottle = { + name = "Astral en una botella", + text = { + "Al venderse, aplica {C:dark_edition}Astral{}", + "y {C:attention}Perecedero{} a", + "un {C:attention}comodín{} aleatorio", + }, + }, + j_cry_astral_bottle_mainline = { name = "Astral en una botella", text = { "Al venderse, aplica {C:dark_edition}Astral{}", @@ -888,6 +903,13 @@ return { "diferentes {C:attention}comodines{} aleatorios", }, }, + j_cry_astral_bottle_madness = { + name = "Astral en una botella", + text = { + "Al venderse, aplica {C:dark_edition}Astral{}", + "a un {C:attention}comodín{} aleatorio", + }, + }, j_cry_big_cube = { name = "Cubo grande", text = { diff --git a/localization/fr.lua b/localization/fr.lua index 041c5bf94..e6d1b3498 100644 --- a/localization/fr.lua +++ b/localization/fr.lua @@ -28,7 +28,6 @@ return { text = { "Applique les {C:legendary,E:1}effets{}", "de {C:attention}tous{} les jeux", - "battus avec la {C:attention}Mise Or", }, unlock = { "Gagner une partie", @@ -36,6 +35,14 @@ return { "et la {C:attention}Mise Or", }, }, + b_cry_antimatter_balanced = { + name = "Jeu d'Antimatière", + text = { + "Applique les {C:legendary,E:1}effets{}", + "de {C:attention}tous{} les jeux", + "battus avec la {C:attention}Mise Or", + }, + }, b_cry_beige = { name = "Jeu Beige", text = { @@ -1110,6 +1117,15 @@ return { }, }, j_cry_astral_bottle = { + name = "Astres en Bouteille", + text = { + "Lorsque cette carte est vendue,", + "applique {C:dark_edition}Astral{}", + "et {C:attention}Périssable{} à", + "un {C:attention}Joker{} aléatoire", + }, + }, + j_cry_astral_bottle_mainline = { name = "Astres en Bouteille", text = { "Lorsque cette carte est vendue,", @@ -1118,6 +1134,14 @@ return { "des Jokers {C:attention}Jokers{} différents, aléatoirement", }, }, + j_cry_astral_bottle_madness = { + name = "Astres en Bouteille", + text = { + "Lorsque cette carte est vendue,", + "applique {C:dark_edition}Astral{}", + "à un {C:attention}Joker{} aléatoire", + }, + }, j_cry_big_cube = { name = "Gros cube", text = { diff --git a/localization/pt_BR.lua b/localization/pt_BR.lua index 11389dae2..3dc8985a4 100644 --- a/localization/pt_BR.lua +++ b/localization/pt_BR.lua @@ -3,6 +3,13 @@ return { Back = { b_cry_antimatter = { name = "Baralho Antimatéria", + text = { + "Applies the {C:legendary,E:1}upsides{}", + "of {C:attention}every{} deck", + }, + }, + b_cry_antimatter_balanced = { + name = "Baralho Anti-Materia", text = { "Aplica TODOS os efeitos {C:legendary,E:1}positivos{}", "de {C:attention}cada{} deck vencido", @@ -872,6 +879,21 @@ return { "um {C:attention}Curinga{} aleatório", }, }, + j_cry_astral_bottle_mainline = { + name = "Astral na Garrafa", + text = { + "Quando vendido, aplica {C:dark_edition}Astral{}", + "e {C:attention}Perecível{} para", + "um {C:attention}Curinga{} aleatório", + }, + }, + j_cry_astral_bottle_madness = { + name = "Astral na Garrafa", + text = { + "Quando vendido, aplica {C:dark_edition}Astral{}", + "para um {C:attention}Curinga{} aleatório", + }, + }, j_cry_big_cube = { name = "Cubo Grande", text = { diff --git a/localization/zh_CN.lua b/localization/zh_CN.lua index a66502855..0bf4483be 100644 --- a/localization/zh_CN.lua +++ b/localization/zh_CN.lua @@ -72,7 +72,7 @@ return { name = "传送带牌组", text = { "小丑牌{C:attention}不可{}移动", - "回合开始时,", + "回合开始时", "{C:attention}复制{}最右边的小丑牌", "并且{C:attention}销毁{}最左边的小丑牌", }, @@ -83,7 +83,7 @@ return { b_cry_critical = { name = "暴击牌组", text = { - "每打出一手牌后,", + "每打出一手牌后", "{C:green}#1#/4{}几率获得{X:dark_edition,C:white}^2{}倍率", "{C:green}#1#/8{}几率获得{X:dark_edition,C:white}^0.5{}倍率", }, @@ -416,7 +416,7 @@ return { name = "均衡牌组", text = { "所有卡牌在", - "商店中出现的{C:attention}几率相同{},", + "商店中出现的{C:attention}几率相同{}", "以{C:attention,T:v_overstock_plus}库存过剩加强版{}开始游戏", }, unlock = { @@ -438,7 +438,7 @@ return { b_cry_glowing = { name = "发光牌组", text = { - "在击败Boss盲注时,", + "在击败Boss盲注时", "所有小丑牌的数值乘以{X:dark_edition,C:white}X1.25{}", "{X:cry_jolly,C:white,s:0.8} Jolly#1#Open#1#Winner#1#-#1#wawa#1#person", }, @@ -482,7 +482,7 @@ return { b_cry_redeemed = { name = "赎回牌组", text = { - "购买{C:attention}优惠券{}时,", + "购买{C:attention}优惠券{}时", "获得其{C:attention}额外等级{}", }, unlock = { @@ -682,21 +682,21 @@ return { bl_cry_greed = { name = "贪婪", text = { - "选择时,每$#1#增加#2#盲注要求", + "选择时,每拥有$#1#增加#2#盲注要求", }, }, bl_cry_repulsor = { name = "排斥", text = { - "重新触发最右侧和最左侧的小丑,", + "重新触发最右侧和最左侧的小丑", "其他所有小丑不触发", }, }, bl_cry_chromatic = { name = "彩色", text = { - "在出牌次数为奇数次时的打出手牌", - "总分会减去手牌得分", + "所有奇数次的出牌", + "回合分数会减去手牌得分", }, }, bl_cry_landlord = { @@ -818,7 +818,7 @@ return { c_cry_keygen = { name = "://密钥", text = { - "创建一张随机的{C:cry_code}易腐香蕉{}优惠券,", + "创建一张随机的{C:cry_code}易腐香蕉{}优惠券", "{C:cry_code}摧毁{}此前以此方式创建的优惠券。", }, }, @@ -915,7 +915,7 @@ return { c_cry_assemble = { name = "://汇编", text = { - "为{C:cry_code}选中的手牌牌型{}增加{C:cry_code}倍率{},", + "为{C:cry_code}选中的手牌牌型{}增加{C:cry_code}倍率{}", "数值等于拥有的小丑数量", }, }, @@ -1082,7 +1082,7 @@ return { set_cry_m = { name = "M小丑集合", text = { - "与字母{C:attention}M{}相关的小丑,", + "与字母{C:attention}M{}相关的小丑", "以及{C:attention}开心小丑", }, }, @@ -1113,7 +1113,7 @@ return { set_cry_poker_hand_stuff = { name = "扑克手牌扩展", text = { - "新增5种{C:attention}扑克手牌{},", + "新增5种{C:attention}扑克手牌{}", "并启用{C:attention}晋升手牌", }, }, @@ -1173,7 +1173,7 @@ return { e_cry_double_sided = { name = "双面", text = { - "此卡可以被{C:attention}翻转{},", + "此卡可以被{C:attention}翻转{}", "以展示另一张不同的卡牌", }, }, @@ -1248,7 +1248,7 @@ return { m_cry_abstract = { name = "抽象牌", text = { - "{X:dark_edition,C:white}^#1#{}倍率,", + "{X:dark_edition,C:white}^#1#{}倍率", "算作{C:attention}自身{}的点数和花色", "在{C:attention}回合结束{}或{C:attention}出牌{}时", "有{C:green}#4#/#5#{}概率{C:red,E:2}摧毁{}此牌", @@ -1677,7 +1677,7 @@ return { j_cry_CodeJoker = { name = "代码小丑", text = { - "选择{C:attention}盲注{}时,", + "选择{C:attention}盲注{}时", "创建一张{C:dark_edition}负片{}{C:cry_code}代码牌{}", }, unlock = { @@ -1688,7 +1688,7 @@ return { j_cry_CodeJoker_modest = { name = "代码小丑", text = { - "选择{C:attention}Boss盲注{}时,", + "选择{C:attention}Boss盲注{}时", "创建一张{C:dark_edition}负片{}{C:cry_code}代码牌{}", }, unlock = { @@ -1808,7 +1808,7 @@ return { j_cry_digitalhallucinations = { name = "数字幻觉", text = { - "打开{C:attention}补充包{}时,", + "打开{C:attention}补充包{}时", "有{C:green}#1#/#2#{}概率创建一张", "与其{C:attention}类型{}对应的随机{C:dark_edition}负片{}牌", }, @@ -1837,7 +1837,7 @@ return { "{C:inactive}(当前 {X:mult,C:white} X#3# {C:inactive} 倍率)", }, unlock = { - "打出一手{C:attention}高牌{},", + "打出一手{C:attention}高牌{}", "其中包含{C:attention}4张{}", "同花色的牌", }, @@ -1874,7 +1874,7 @@ return { text = { "选择{C:attention}盲注{}时", "将{C:green}整副牌{}抽入手牌", - "{C:inactive,s:0.8}如果你在一倍速时无法掌控我,", + "{C:inactive,s:0.8}如果你在一倍速时无法掌控我", "{C:inactive,s:0.8}你就不配在二倍速时拥有我", }, }, @@ -1899,13 +1899,13 @@ return { j_cry_error = { name = "{C:dark_edition}E{}{C:red}错误{}{C:dark_edition}O{}{C:red}R{}", text = { - "nan", + "", }, }, j_cry_eternalflame = { name = "永恒之火", text = { - "每{C:attention}出售{}一张售价至少为{C:money}$3{}的牌,", + "每{C:attention}出售{}一张售价至少为{C:money}$3{}的牌", "这张小丑获得{X:mult,C:white} X#1# {}倍率", "(当前{X:mult,C:white} X#2# {C:inactive}倍率)", }, @@ -1913,7 +1913,7 @@ return { j_cry_eternalflame2 = { name = "永恒之火", text = { - "每{C:attention}出售{}一张牌,", + "每{C:attention}出售{}一张牌", "这张小丑获得{X:mult,C:white} X#1# {}倍率", "(当前{X:mult,C:white} X#2# {C:inactive}倍率)", }, @@ -1950,7 +1950,7 @@ return { j_cry_highfive = { name = "击掌", text = { - "如果最高{C:attention}计分点数{}是{C:attention}5{},", + "如果最高{C:attention}计分点数{}是{C:attention}5{}", "将所有计分牌转换为{C:attention}5{}", "{s:0.8,C:inactive}A算作1", }, @@ -1958,7 +1958,7 @@ return { j_cry_facile = { name = "简易", text = { - "{C:attention}#2#{}张及以下的牌得分", + "如果打出的牌被计分{C:attention}#2#{}次及以下", "{X:dark_edition,C:white}^#1#{}倍率", "(重复触发算作多张)", }, @@ -1966,7 +1966,7 @@ return { j_cry_fading_joker = { name = "褪色小丑", text = { - "当一张{C:attention}易腐{}牌被削弱时,", + "当一张{C:attention}易腐{}牌被削弱时", "此小丑获得{X:mult,C:white}X#1#{}倍率", "{C:inactive}(当前{} {X:mult,C:white}X#2#{} {C:inactive}倍率){}", }, @@ -2170,7 +2170,7 @@ return { j_cry_huntingseason = { name = "狩猎季节", text = { - "如果打出的手牌正好有{C:attention}3张{}牌,", + "如果打出的手牌正好有{C:attention}3张{}牌", "计分后{C:red}摧毁{}中间的牌", }, }, @@ -2184,7 +2184,7 @@ return { j_cry_jawbreaker = { name = "硬糖", text = { - "击败{C:attention}Boss 盲注后{} ,", + "击败{C:attention}Boss 盲注后{},", "让所有小丑数值变为{C:attention}两倍{} ", "{E:2,C:red}自毁{}", }, @@ -2221,11 +2221,9 @@ return { j_cry_kidnap = { name = "绑架", text = { - "{C:red}Outdated Description{}", "每回合结尾获得{C:money}$#2#{}", "每卖掉一张不同的{C:attention}倍率{}或者{C:attention}筹码{}小丑时", "增加{C:money}$#1#{}", - "{C:inactive}(当前{C:money}$#2#{C:inactive})", }, }, j_cry_kittyprinter = { @@ -2402,7 +2400,7 @@ return { j_cry_membershipcardtwo_balanced = { name = "老旧会员卡", --Could probably have a diff Name imo text = { - "每有{C:attention}8{}名{C:attention}Cryptid Discord{}成员,", + "每有{C:attention}8{}名{C:attention}Cryptid Discord{}成员", "获得{C:chips}+#1#{}筹码", "{C:inactive}(当前为{C:chips}+#2#{C:inactive}筹码)", "{C:blue,s:0.7}https://discord.gg/cryptid{}", @@ -2434,7 +2432,7 @@ return { j_cry_monkey_dagger = { name = "猴子匕首", text = { - "当选择{C:attention}盲注{}时,", + "当选择{C:attention}盲注{}时", "摧毁左边的小丑", "并永久增加其售价的{C:attention}十倍{}", "到这张{C:chips}筹码{}", @@ -2535,7 +2533,7 @@ return { text = { "在回合结束时获得{C:money}$#1#{}", "每持有一张{C:attention}#3#{}手牌", - "增加{C:money}$#2#{}的奖励,", + "增加{C:money}$#2#{}的奖励", "每回合卡牌变化", }, }, @@ -2620,7 +2618,7 @@ return { j_cry_pirate_dagger = { name = "海盗匕首", text = { - "当选择{C:attention}盲注{}时,", + "当选择{C:attention}盲注{}时", "摧毁右边的小丑", "并获得其售价的{C:attention}四分之一{}", "作为{X:chips,C:white} X筹码 {}", @@ -2645,14 +2643,14 @@ return { j_cry_pizza = { name = "披萨", text = { - "在{C:attention}#1#{} {C:inactive}[#2#]{}回合之后,", + "在{C:attention}#1#{} {C:inactive}[#2#]{}回合之后", "出售这个小丑可以创建{C:attention}#3#{}个披萨片", }, }, j_cry_pizza_slice = { name = "披萨片", text = { - "当一个{C:attention}披萨片{}被出售时,", + "当一个{C:attention}披萨片{}被出售时", "这张小丑获得{X:mult,C:white}X#1#{} 倍率", "{C:inactive}(当前 {X:mult,C:white}X#2#{}{C:inactive} 倍率){}", }, @@ -2671,7 +2669,7 @@ return { j_cry_poor_joker = { name = "贫穷小丑", text = { - "当一张{C:attention}租赁{}牌扣除金钱时,", + "当一张{C:attention}租用{}牌扣除金钱时", "此小丑获得{C:mult}+#1#{}倍率", "{C:inactive}(当前{} {C:mult}+#2#{} {C:inactive}倍率){}", }, @@ -2777,7 +2775,7 @@ return { text = { "获得时,将所有当前和未来小丑的售价设置为{C:attention}$#1#{}", "所有{C:attention}小丑{}的售价降低{C:attention}$#2#{}", - "回合结束时,从出售{C:attention}小丑{}中获得{C:attention}$#3#{} {C:inactive}[#4#]{}后,", + "回合结束时,从出售{C:attention}小丑{}中获得{C:attention}$#3#{} {C:inactive}[#4#]{}后", "{C:red}自毁{}", }, }, @@ -2810,7 +2808,7 @@ return { j_cry_scrabble = { name = "拼M游戏", text = { - "当打出手牌时,", + "当打出手牌时", "会有{C:green}#1#/#2#{}几率生成一张", "{C:dark_edition}欢愉{C:green}罕见{}小丑", }, @@ -2818,7 +2816,7 @@ return { j_cry_seal_the_deal = { name = "契约已成", text = { - "打出本回合{C:attention}最后一手牌{}时,", + "打出本回合{C:attention}最后一手牌{}时", "每张计分的卡获得{C:attention}随机蜡封{}", }, }, @@ -2937,7 +2935,7 @@ return { j_cry_starfruit = { name = "杨桃", text = { - "{X:dark_edition,C:white}^#1#{} 倍率,", + "{X:dark_edition,C:white}^#1#{} 倍率", "商店中每{C:attention}重掷{}一次,失去{X:dark_edition,C:white}^#2#{} 倍率", }, }, @@ -3141,7 +3139,7 @@ return { j_cry_unjust_dagger = { name = "不公匕首", text = { - "当选择{C:attention}盲注{}时,", + "当选择{C:attention}盲注{}时", "摧毁左边的小丑", "并获得其售价的{C:attention}五分之一{}", "作为{X:mult,C:white} X倍率 {}", @@ -3152,7 +3150,7 @@ return { name = "虚实", text = { "当任何概率", - "{C:green}成功{}触发时,", + "{C:green}成功{}触发时", "这张小丑获得{X:red,C:white}X倍率{}", "等于其列出的{C:attention}概率", "{C:inactive}(当前 {X:mult,C:white} X#1# {C:inactive} 倍率)", @@ -3255,7 +3253,7 @@ return { j_cry_zooble = { name = "祖波", text = { - "打出并计分的牌中,", + "打出并计分的牌中", "每有一个{C:attention}不同点数{},获得{C:mult}+#2#{}倍率", "{C:inactive}(当前{C:mult}+#1#{C:inactive}倍率)", "{C:inactive}(包含顺子的出牌不触发)", @@ -3373,7 +3371,7 @@ return { cry_hooked = { name = "连锁", text = { - "当这个小丑被{C:cry_code}触发{}时,", + "当这个小丑被{C:cry_code}触发{}时", "触发{C:cry_code}#1#{}", }, }, @@ -3386,7 +3384,7 @@ return { cry_multiuse = { name = "多次使用", text = { - "{C:inactive}多次使用: ({C:inactive}剩余{C:cry_code}#1#{C:inactive}次)", + "{C:inactive}可多次使用: ({C:inactive}剩余{C:cry_code}#1#{C:inactive}次)", }, }, cry_perishable_booster = { @@ -3512,7 +3510,7 @@ return { "一张售价{C:money}$50{}的{C:legendary}传奇{}{C:attention}小丑{} ", "出现在商店{C:attention}优惠券{}槽位", "只有作为商店{C:attention}最后一件物品{}时才能购买", - "{C:inactive,s:0.7}你已经引起了遗物之灵的注意,", + "{C:inactive,s:0.7}你已经引起了遗物之灵的注意", "{C:inactive,s:0.7}但想要平息它,可没那么简单", }, }, @@ -3553,7 +3551,7 @@ return { "移除所有打出的牌的{C:attention}增强{} ", "并有{C:green}1 / 3{} 几率摧毁", "{C:heart}红桃{}和{C:diamond}方块{}卡牌", - "{C:inactive,s:0.7}夜深人静时,你必须更加谨慎,", + "{C:inactive,s:0.7}夜深人静时,你必须更加谨慎", "{C:inactive,s:0.7,E:1}因为它们在阴影中{C:inactive,s:0.7}伺机满足自己的饥渴……", }, }, @@ -3590,24 +3588,24 @@ return { "获得{C:money}$20", "所有赚到的{C:money}钱{}都变为{C:attention}双倍", "{C:inactive,s:0.7}你已故亲戚的幽灵在午夜时分来访!", - "{C:inactive,s:0.7}他们默默地将一袋钱放在你的手中,", + "{C:inactive,s:0.7}他们默默地将一袋钱放在你的手中", "{C:inactive,s:0.7}温暖一笑,随即化为虚影消散在空气中~", }, }, food_jokers = { name = "食物小丑", text = { - "{s:0.8}Gros Michel,鸡蛋,冰淇淋,卡文迪许,", - "{s:0.8}乌龟豆,饮料可乐,爆米花,拉面,", - "{s:0.8}苏打水,泡菜,辣椒,焦糖,", - "{s:0.8}怀旧糖果,M当劳,", - "{s:0.8}切奶酪,咖啡馆美食,樱桃,", - "{s:0.8}全糖可乐,星果,火锅,", - "{s:0.8}幸运饼干,瑞士小丑,塔利亚费罗,", - "{s:0.8}皇家佳丽,优质葡萄酒,神秘苏打水,", - "{s:0.8}爆米花袋,火鸡晚餐,咖啡,", - "{s:0.8}蜡烛服务,燃烧的西瓜,", - "{s:0.8}燃烧的樱桃,软玉米饼,脆玉米饼,", + "{s:0.8}Gros Michel,鸡蛋,冰淇淋,卡文迪许", + "{s:0.8}乌龟豆,饮料可乐,爆米花,拉面", + "{s:0.8}苏打水,泡菜,辣椒,焦糖", + "{s:0.8}怀旧糖果,M当劳", + "{s:0.8}切奶酪,咖啡馆美食,樱桃", + "{s:0.8}全糖可乐,星果,火锅", + "{s:0.8}幸运饼干,瑞士小丑,塔利亚费罗", + "{s:0.8}皇家佳丽,优质葡萄酒,神秘苏打水", + "{s:0.8}爆米花袋,火鸡晚餐,咖啡", + "{s:0.8}蜡烛服务,燃烧的西瓜", + "{s:0.8}燃烧的樱桃,软玉米饼,脆玉米饼", "{s:0.8}玉米片,幽灵可乐,汉堡,披萨", }, }, @@ -3820,7 +3818,7 @@ return { "{C:attention}#1#{},", "{C:attention}#2#{},", "以及{C:attention}#3#{}", - "{C:inactive,S:0.8}(译者注:升级的为使用{C:cry_code}://声明{}创建的牌型)", + "{C:inactive,S:0.8}(译者注:升级的为{C:cry_code}://声明{}创建的牌型)", }, }, c_cry_sunplanet = { @@ -3874,7 +3872,7 @@ return { name = "传送带牌套", text = { "{C:attention}不能{}移动小丑卡", - "回合开始时,", + "回合开始时", "{C:attention}复制{}最右边的小丑卡", "并且{C:attention}销毁{}最左边的小丑卡", }, @@ -3882,7 +3880,7 @@ return { sleeve_cry_critical_sleeve = { name = "暴击牌套", text = { - "每打出一手牌后,", + "每打出一手牌后", "{C:green}1/4{}几率获得{X:dark_edition,C:white} ^2 {}倍率", "{C:green}1/8{}几率获得{X:dark_edition,C:white} ^0.5 {}倍率", }, @@ -3907,7 +3905,7 @@ return { sleeve_cry_glowing_sleeve = { name = "发光牌组", text = { - "在击败Boss盲注时,", + "在击败Boss盲注时", "所有小丑牌的数值乘以{X:dark_edition,C:white}X1.25{}", "{X:cry_jolly,C:white,s:0.8} Jolly#1#Open#1#Winner#1#-#1#wawa#1#person", }, @@ -3939,7 +3937,7 @@ return { sleeve_cry_redeemed_sleeve = { name = "赎回牌套", text = { - "当购买{C:attention}优惠券{}时,", + "当购买{C:attention}优惠券{}时", "会获得对应{C:attention}高级{}版", }, }, @@ -4029,7 +4027,7 @@ return { c_cry_lock = { name = "锁定", text = { - "从{C:red}所有{}小丑中,", + "从{C:red}所有{}小丑中", "移除{C:red}所有{}贴纸", "然后随机给一张小丑牌增加{C:purple,E:1}永恒{}贴纸", }, @@ -4077,7 +4075,7 @@ return { c_cry_trade = { name = "交易", text = { - "{C:attention}失去{}1张随机优惠券,", + "{C:attention}失去{}1张随机优惠券", "获得{C:attention}2{}张随机优惠券", }, }, @@ -4099,7 +4097,7 @@ return { c_cry_vacuum = { name = "虚空", text = { - "从{C:red}所有{}手中的牌,", + "从{C:red}所有{}手中的牌", "移除{C:red}所有{C:green}修改{}", "每移除一个{C:green}修改{},获得{C:money}$#1#{}", "{C:inactive,s:0.7}(例如: 强化、蜡封、版本)", @@ -4115,7 +4113,7 @@ return { c_cry_white_hole2 = { name = "白洞", text = { - "{C:attention}移除{}所有手牌等级,", + "{C:attention}移除{}所有手牌等级", "升级{C:legendary,E:1}最常用{}扑克牌型", "每移除1级,最常用牌型升{C:attention}3{}级", }, @@ -4372,7 +4370,7 @@ return { tag_cry_bundle = { name = "组合标签", text = { - "创造一个{C:attention}标准标签{},{C:tarot}吊饰标签{},", + "创造一个{C:attention}标准标签{},{C:tarot}吊饰标签{}", "{C:attention}小丑标签{},和{C:planet}流星标签", }, }, @@ -4393,7 +4391,7 @@ return { tag_cry_clone = { name = "克隆标签", text = { - "商店物品价格为原来的{C:attention}X#1#{}倍,", + "商店物品价格为原来的{C:attention}X#1#{}倍", "获得下一张购买卡牌的{C:attention}复制{}", }, }, @@ -4668,7 +4666,7 @@ return { v_cry_double_down = { name = "双倍下注", text = { - "每轮之后,", + "每轮之后", " {C:dark_edition}双面{}牌背面的所有数值{X:dark_edition,C:white} X1.5 {}", }, }, @@ -4788,7 +4786,7 @@ return { name = "修理工", text = { "{C:attention}重新触发{}所有 M 小丑", - "如果出牌包含{C:attention}一对", + "如果出牌包含{C:attention}对子", }, }, v_cry_rerollexchange = { @@ -4866,7 +4864,7 @@ return { achievement_descriptions = { ach_cry_ace_in_crash = "check_for_unlock({type = ace_in_crash})", ach_cry_blurred_blurred_joker = "获得模糊的模糊小丑", - ach_cry_break_infinity = "在次出牌中获得1.79e308筹码", + ach_cry_break_infinity = "在单次出牌中获得1.79e308筹码", ach_cry_bullet_hell = "拥有15个AP小丑", ach_cry_cryptid_the_cryptid = "用神秘生物复制神秘生物", ach_cry_exodia = "拥有5个域外小丑", @@ -5438,8 +5436,8 @@ return { "想法: #1#", }, cry_sticker_desc = { - "使用这张小丑在", - "#2##1##2#注#3#", + "使用这张小丑", + "在#2##1##2#注#3#", "难度下获胜", }, cry_sticker_name = { @@ -5567,7 +5565,7 @@ return { "会得到免费优惠券!", }, { - "对不起,", + "对不起", "由于预算削减", "没有优惠券", }, diff --git a/lovely/Probability.toml b/lovely/Probability.toml index ca2100142..fbfec2875 100644 --- a/lovely/Probability.toml +++ b/lovely/Probability.toml @@ -46,5 +46,7 @@ payload = ''' if (SMODS.has_enhancement(scoring_hand[i], 'm_glass') and not scoring_hand[i].debuff and SMODS.pseudorandom_probability(scoring_hand[i], 'glass', 1, scoring_hand[i].ability.extra or G.P_CENTERS.m_glass.config.extra) + or (G.GAME.modifiers.cry_shatter_rate + and pseudorandom('cry_shatter') < 1 / G.GAME.modifiers.cry_shatter_rate)) and not scoring_hand[i].ability.eternal then''' match_indent = true \ No newline at end of file diff --git a/lovely/code.toml b/lovely/code.toml index d03a03ca6..b8998cc75 100644 --- a/lovely/code.toml +++ b/lovely/code.toml @@ -30,39 +30,23 @@ match_indent = true [[patches]] [patches.pattern] target = "functions/state_events.lua" -pattern = ''' -if G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest then - add_round_eval_row({bonus = true, name='interest', pitch = pitch, dollars = G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)}) - pitch = pitch + 0.06 - if (not G.GAME.seeded and not G.GAME.challenge) or SMODS.config.seeded_unlocks then - if G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) == G.GAME.interest_amount*G.GAME.interest_cap/5 then - G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak = G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak + 1 - else - G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak = 0 - end - end - check_for_unlock({type = 'interest_streak'}) - dollars = dollars + G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) -end -''' +pattern = "if G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest then" position = "at" payload = ''' -if G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest then - local interest = Cryptid.get_interest(true) - if G.GAME.cry_payload then add_round_eval_row({bonus = true, payload = G.GAME.cry_payload, name='interest_payload', pitch = pitch, dollars = interest}) else - add_round_eval_row({bonus = true, name='interest', pitch = pitch, dollars = interest}) end +if G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest and G.GAME.cry_payload then + add_round_eval_row({bonus = true, payload = G.GAME.cry_payload, name='interest_payload', pitch = pitch, dollars = G.GAME.interest_amount*G.GAME.cry_payload*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5)}) pitch = pitch + 0.06 if not G.GAME.seeded and not G.GAME.challenge then - if to_big(G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/Cryptid.interest_rate()), G.GAME.interest_cap/Cryptid.interest_rate())) >= to_big(G.GAME.interest_amount*G.GAME.interest_cap/Cryptid.interest_rate()) then + if G.GAME.interest_amount*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) == G.GAME.interest_amount*G.GAME.interest_cap/5 then G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak = G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak + 1 else G.PROFILES[G.SETTINGS.profile].career_stats.c_round_interest_cap_streak = 0 end end check_for_unlock({type = 'interest_streak'}) - dollars = dollars + interest + dollars = dollars + G.GAME.interest_amount*G.GAME.cry_payload*math.min(math.floor(G.GAME.dollars/5), G.GAME.interest_cap/5) G.GAME.cry_payload = nil -end''' +elseif G.GAME.dollars >= 5 and not G.GAME.modifiers.no_interest then''' match_indent = true # Revert - fix a crash diff --git a/lovely/lib_misc.toml b/lovely/lib_misc.toml index c6061b6e1..b13dcdb9a 100644 --- a/lovely/lib_misc.toml +++ b/lovely/lib_misc.toml @@ -134,21 +134,13 @@ Cryptid.aliases = {} Cryptid.pointerblist = {} Cryptid.pointerblistrarity = {} Cryptid.mod_gameset_whitelist = {} +Cryptid.ascension_numbers = {} Cryptid.pin_debuff = {} Cryptid.circus_rarities = { --format {base_mult = ..., loc_key = ..., rarity=..., order=...} } -Cryptid.rarity_table = { - "Common", - "Uncommon", - "Rare", - "cry_epic", - "Legendary", - "cry_exotic" -} - function cry_format(...) return ... end diff --git a/lovely/lib_ui.toml b/lovely/lib_ui.toml index 327f80d2f..4bfb007f7 100644 --- a/lovely/lib_ui.toml +++ b/lovely/lib_ui.toml @@ -31,6 +31,7 @@ if not Cryptid.shared_gamesets and G.ASSET_ATLAS["cry_gameset"] then Cryptid.shared_gamesets = { modest = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_gameset"], {x = 0,y = 0}), mainline = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_gameset"], {x = 1,y = 0}), + madness = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_gameset"], {x = 2,y = 0}), custom = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_gameset"], {x = 3,y = 0}), selected = Sprite(0, 0, G.CARD_W, G.CARD_H, G.ASSET_ATLAS["cry_sticker"], {x = 0,y = 4}), } @@ -38,7 +39,7 @@ end local gameset_key if self.config.center.force_gameset then gameset_key = self.config.center.force_gameset - if gameset_key ~= "disabled" and gameset_key ~= "modest" and gameset_key ~= "mainline" then + if gameset_key ~= "disabled" and gameset_key ~= "modest" and gameset_key ~= "mainline" and gameset_key ~= "madness" then gameset_key = "custom" end end diff --git a/lovely/misc.toml b/lovely/misc.toml index 5c71c95a5..1a5957b2c 100644 --- a/lovely/misc.toml +++ b/lovely/misc.toml @@ -683,34 +683,4 @@ payload = ''' local safe_seal = type(other.ability.seal) == "table" and other.ability.seal or {} for k, v in pairs(safe_seal) do ''' -match_indent = true - -[[patches]] -[patches.pattern] -target = "functions/common_events.lua" -pattern = "elseif eval_type == 'dollars' then" -position = "before" -payload = ''' -elseif eval_type == 'x_chips' then - sound = 'cry_xchip' - amt = amt - text = 'X' .. amt - colour = G.C.CHIPS - config.type = 'fade' - config.scale = 0.7 -elseif eval_type == 'e_chips' then - sound = 'cry_echips' - amt = amt - text = '^' .. amt .. ' ' .. localize('k_chips') - colour = G.C.DARK_EDITION - config.type = 'fade' - config.scale = 0.7 -elseif eval_type == 'e_mult' then - sound = 'cry_emult' - amt = amt - text = '^' .. amt .. ' ' .. localize('k_mult') - colour = G.C.DARK_EDITION - config.type = 'fade' - config.scale = 0.7 -''' -match_indent = true +match_indent = true \ No newline at end of file diff --git a/lovely/stake.toml b/lovely/stake.toml index 653680677..15236edef 100644 --- a/lovely/stake.toml +++ b/lovely/stake.toml @@ -155,6 +155,32 @@ rental = self.ability and self.ability.rental, ''' match_indent = true +# Crimson Stake - Disable restocks on even antes +[[patches]] +[patches.pattern] +target = "game.lua" +pattern = '''for _,_ in pairs(G.GAME.current_round.voucher.spawn) do vouchers_to_spawn = vouchers_to_spawn + 1 end +if vouchers_to_spawn < G.GAME.starting_params.vouchers_in_shop + (G.GAME.modifiers.extra_vouchers or 0) then + SMODS.get_next_vouchers(G.GAME.current_round.voucher) +end +for _, key in ipairs(G.GAME.current_round.voucher or {}) do + if G.P_CENTERS[key] and G.GAME.current_round.voucher.spawn[key] then + SMODS.add_voucher_to_shop(key) + end +end''' +position = "at" +payload = '''if (G.GAME.modifiers.cry_voucher_restock_antes == nil or G.GAME.round_resets.ante % G.GAME.modifiers.cry_voucher_restock_antes == 0) then + for _,_ in pairs(G.GAME.current_round.voucher.spawn) do vouchers_to_spawn = vouchers_to_spawn + 1 end + if vouchers_to_spawn < G.GAME.starting_params.vouchers_in_shop + (G.GAME.modifiers.extra_vouchers or 0) then + SMODS.get_next_vouchers(G.GAME.current_round.voucher) + end + for _, key in ipairs(G.GAME.current_round.voucher or {}) do + if G.P_CENTERS[key] and G.GAME.current_round.voucher.spawn[key] then + SMODS.add_voucher_to_shop(key) + end + end +end''' +match_indent = true # Quartz Stake - pinned effect applies in every type of slot [[patches]] @@ -181,6 +207,53 @@ end match_indent = true +# Ruby Stake - big blind bosses +[[patches]] +[patches.pattern] +target = "game.lua" +pattern = "self.GAME.round_resets.blind_choices.Boss = get_new_boss()" +position = "before" +payload = ''' +if G.GAME.modifiers.cry_big_boss_rate and pseudorandom('cry_big_boss') < G.GAME.modifiers.cry_big_boss_rate then + self.GAME.round_resets.blind_choices.Big = get_new_boss() +elseif G.GAME.modifiers.cry_rush_hour_ii then + self.GAME.round_resets.blind_choices.Small = get_new_boss() + self.GAME.round_resets.blind_choices.Big = get_new_boss() +else + self.GAME.round_resets.blind_choices.Big = 'bl_big' +end +''' +match_indent = true + + +# Ruby Stake - big blind bosses +[[patches]] +[patches.pattern] +target = "functions/common_events.lua" +pattern = "G.GAME.round_resets.blind_choices.Boss = get_new_boss()" +position = "before" +payload = ''' +if G.GAME.modifiers.cry_big_boss_rate and pseudorandom('cry_big_boss') < G.GAME.modifiers.cry_big_boss_rate then + G.GAME.round_resets.blind_choices.Big = get_new_boss() +elseif G.GAME.modifiers.cry_rush_hour_ii then + G.GAME.round_resets.blind_choices.Small = get_new_boss() + G.GAME.round_resets.blind_choices.Big = get_new_boss() +else + G.GAME.round_resets.blind_choices.Big = 'bl_big' +end +''' +match_indent = true + + +# Ruby Stake - big blind doesn't increase ante +[[patches]] +[patches.pattern] +target = "functions/state_events.lua" +pattern = "if G.GAME.blind:get_type() == 'Boss' then" +position = "at" +payload = "if G.GAME.blind_on_deck == 'Boss' then" +match_indent = true + # Ruby Stake - smaller showdown blinds don't win # Win on any ante above win_ante [[patches]] @@ -201,6 +274,15 @@ position = "at" payload = "if G.GAME.blind_on_deck == 'Small' then" match_indent = true +# Ruby Stake - mark big blind as defeated +[[patches]] +[patches.pattern] +target = "functions/state_events.lua" +pattern = "elseif G.GAME.round_resets.blind == G.P_BLINDS.bl_big then" +position = "at" +payload = "elseif G.GAME.blind_on_deck == 'Big' then" +match_indent = true + # Sapphire Stake - ante tax # The Joke boss effect @@ -251,24 +333,136 @@ end''' match_indent = true -# Blossom Stake - showdown blinds before the winning ante +# Platinum Stake - start with big blind ready to be selected [[patches]] [patches.pattern] target = "functions/common_events.lua" -pattern = '''elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then''' +pattern = "G.GAME.blind_on_deck = 'Small'" position = "at" -payload = '''elseif v.boss.showdown and ((G.GAME.round_resets.ante)%(G.GAME.modifiers.cry_big_showdown or G.GAME.win_ante) == 0 and G.GAME.round_resets.ante >= 2) then''' +payload = "G.GAME.blind_on_deck = G.GAME.modifiers.cry_no_small_blind and 'Big' or 'Small'" match_indent = true -# Blossom Stake - showdown blinds before the winning ante + +# Platinum Stake - start with big blind ready to be selected +[[patches]] +[patches.pattern] +target = "functions/UI_definitions.lua" +pattern = "G.GAME.blind_on_deck = 'Small'" +position = "at" +payload = "G.GAME.blind_on_deck = G.GAME.modifiers.cry_no_small_blind and 'Big' or 'Small'" +match_indent = true + + +# Platinum Stake - hide Small Blind [[patches]] [patches.pattern] target = "functions/common_events.lua" -pattern = '''elseif not v.boss.showdown and (v.boss.min <= math.max(1, G.GAME.round_resets.ante) and ((math.max(1, G.GAME.round_resets.ante))%G.GAME.win_ante ~= 0 or G.GAME.round_resets.ante < 2)) and res then''' +pattern = "G.GAME.round_resets.blind_states.Small = 'Upcoming'" position = "at" -payload = '''elseif not v.boss.showdown and (v.boss.min <= math.max(1, G.GAME.round_resets.ante) and ((math.max(1, G.GAME.round_resets.ante))%(G.GAME.modifiers.cry_big_showdown or G.GAME.win_ante) ~= 0 or G.GAME.round_resets.ante < 2)) and res then''' +payload = "G.GAME.round_resets.blind_states.Small = G.GAME.modifiers.cry_no_small_blind and 'Hide' or 'Upcoming'" match_indent = true +# Ember Stake - give no money for selling +[[patches]] +[patches.pattern] +target = "card.lua" +pattern = '''ease_dollars(self.sell_cost)''' +position = "at" +payload = '''if (not G.GAME.modifiers.cry_no_sell_value) and self.sell_cost ~= 0 then + ease_dollars(self.sell_cost) +end''' +match_indent = true + +# Ember Stake - don't play coin sound +[[patches]] +[patches.pattern] +target = "card.lua" +pattern = '''play_sound('coin2')''' +position = "at" +payload = '''if (not G.GAME.modifiers.cry_no_sell_value) and self.sell_cost ~= 0 then + play_sound('coin2') +end''' +match_indent = true + +# Ember Stake - red dissolve for swag points +[[patches]] +[patches.pattern] +target = "card.lua" +pattern = '''self:start_dissolve({G.C.GOLD})''' +position = "at" +payload = '''if G.GAME.modifiers.cry_no_sell_value or self.sell_cost == 0 then + self:start_dissolve({G.C.RED}) +else + self:start_dissolve({G.C.GOLD}) +end''' +match_indent = true + +# Ember Stake - remove sell price visually +[[patches]] +[patches.pattern] +target = "card.lua" +pattern = '''self.sell_cost_label = self.facing == 'back' and '?' or self.sell_cost''' +position = "at" +payload = '''self.sell_cost_label = (self.facing == 'back' and '?') or (G.GAME.modifiers.cry_no_sell_value and 0) or self.sell_cost''' +match_indent = true + +# Dawn Stake - change maximum allowed highlights (i have no idea what this code is meant to be doing?? whatever it is, it doesn't seem to be working -toneblock) +[[patches]] +[patches.pattern] +target = "functions/common_events.lua" +pattern = '''local cfg = (card and card.ability) or _c['config']''' +position = "after" +payload = '''if cfg and G.GAME.modifiers.cry_consumable_reduce and cfg.max_highlighted and (cfg.max_highlighted > 1) then + local new_table = {} + for i0, j0 in pairs(cfg) do + new_table[i0] = j0 + end + new_table.max_highlighted = new_table.max_highlighted - 1 + cfg = new_table +end''' +match_indent = true + +# Horizon Stake - create random card at start of blind +[[patches]] +[patches.pattern] +target = "functions/state_events.lua" +pattern = '''G.GAME.blind:set_blind(G.GAME.round_resets.blind)''' +position = "after" +payload = '''if G.GAME.modifiers.cry_card_each_round then + G.E_MANAGER:add_event(Event({ + func = function() + local front = pseudorandom_element(G.P_CARDS, pseudoseed('cry_horizon')) + G.playing_card = (G.playing_card and G.playing_card + 1) or 1 + local edition = G.P_CENTERS.c_base + local card = Card(G.play.T.x + G.play.T.w/2, G.play.T.y, G.CARD_W, G.CARD_H, front, G.P_CENTERS.c_base, {playing_card = G.playing_card}) + card:start_materialize() + if G.GAME.selected_back.effect.config.cry_force_edition and G.GAME.selected_back.effect.config.cry_force_edition ~= "random" then + local edition = {} + edition[G.GAME.selected_back.effect.config.cry_force_edition] = true + card:set_edition(edition, true, true); + end + G.play:emplace(card) + table.insert(G.playing_cards, card) + playing_card_joker_effects({true}) + return true + end})) + G.E_MANAGER:add_event(Event({ + func = function() + G.deck.config.card_limit = G.deck.config.card_limit + 1 + return true + end})) + draw_card(G.play,G.deck, 90,'up', nil) +end''' +match_indent = true + +# Blossom Stake - showdown blinds before the winning ante +[[patches]] +[patches.pattern] +target = "functions/common_events.lua" +pattern = '''elseif v.boss.showdown and (G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2 then''' +position = "at" +payload = '''elseif v.boss.showdown and (((G.GAME.round_resets.ante)%G.GAME.win_ante == 0 and G.GAME.round_resets.ante >= 2) or G.GAME.modifiers.cry_big_showdown ) then''' +match_indent = true # inject into vanilla calculate_perishable to prevent nil index bug (i don't know where it fails so i'm just patching every part of it...) [[patches]] @@ -287,12 +481,3 @@ pattern = '''if self.ability.perishable and self.ability.perish_tally <= 0 then' position = "before" payload = '''if self.ability.perishable and not self.ability.perish_tally then self.ability.perish_tally = G.GAME.perishable_rounds end''' match_indent = true - -# interest rate display -[[patches]] -[patches.pattern] -target = "functions/common_events.lua" -pattern = '''table.insert(left_text,{n=G.UIT.O, config={object = DynaText({string = {" "..localize{type = 'variable', key = 'interest', vars = {G.GAME.interest_amount, 5, G.GAME.interest_amount*G.GAME.interest_cap/5}}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}})''' -position = "at" -payload = '''table.insert(left_text,{n=G.UIT.O, config={object = DynaText({string = {" "..localize{type = 'variable', key = 'interest', vars = {G.GAME.interest_amount, Cryptid.interest_rate(), G.GAME.interest_amount*G.GAME.interest_cap/5}}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4*scale, silent = true})}})''' -match_indent = true \ No newline at end of file diff --git a/lovely/very_fair.toml b/lovely/very_fair.toml index 27eaaae36..03a347be3 100644 --- a/lovely/very_fair.toml +++ b/lovely/very_fair.toml @@ -46,7 +46,7 @@ match_indent = true target = "cardarea.lua" pattern = "{n=G.UIT.T, config={text = 'BOSS BLIND', scale = 0.4, colour = G.C.WHITE}}" position = "at" -payload = "{n=G.UIT.T, config={text = G.GAME.modifiers.cry_no_vouchers and (very_fair_quip[2] or '')or 'BOSS BLIND', scale = 0.4, colour = G.C.WHITE}}" +payload = "{n=G.UIT.T, config={text = G.GAME.modifiers.cry_no_vouchers and (very_fair_quip[2] or '') or G.GAME.modifiers.cry_voucher_restock_antes and G.GAME.round_resets.ante % G.GAME.modifiers.cry_voucher_restock_antes == 0 and 'TWO BOSS BLINDS' or 'BOSS BLIND', scale = 0.4, colour = G.C.WHITE}}" match_indent = true