diff --git a/Cryptid/.gitattributes b/Cryptid/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/Cryptid/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/Cryptid/.github/workflows/pull_request.yml b/Cryptid/.github/workflows/pull_request.yml new file mode 100644 index 0000000..d623131 --- /dev/null +++ b/Cryptid/.github/workflows/pull_request.yml @@ -0,0 +1,30 @@ +name: Stylua + +on: + push: + branches: + - '*' + +jobs: + stylua: + runs-on: ubuntu-latest + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Run stylua + uses: JohnnyMorganz/stylua-action@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + version: latest + args: . + + - name: Commit changes + run: | + git config --global user.name "jolly[bot]" + git config --global user.email "jolly[bot]@users.noreply.github.com" + git add . + git diff --cached --quiet || git commit -m "jolly-bot: auto-format Lua files using Stylua" + git push diff --git a/Cryptid/.gitignore b/Cryptid/.gitignore new file mode 100644 index 0000000..d74fa80 --- /dev/null +++ b/Cryptid/.gitignore @@ -0,0 +1,4 @@ +# LSP setting files (add more if applicable) +.vscode/* +.luarc.json +.lovelyignore diff --git a/Cryptid/Cryptid.json b/Cryptid/Cryptid.json index b7cd620..47393c0 100644 --- a/Cryptid/Cryptid.json +++ b/Cryptid/Cryptid.json @@ -9,9 +9,13 @@ "priority": 114, "badge_colour": "708b91", "badge_text_colour": "FFFFFF", - "version": "0.5.5", + "version": "0.5.5b", "dependencies": [ "Talisman (>=2.0.9)", - "Steamodded (>=1.0.0~BETA-0308a)" + "Steamodded (>=1.0.0~BETA-0314c)" + ], + "conflicts": [ + "Saturn", + "AntePreview (>= 2.0.0~0c16a) (<<3.0.0)" ] } diff --git a/Cryptid/Cryptid.lua b/Cryptid/Cryptid.lua index 64ccdde..7c612a9 100644 --- a/Cryptid/Cryptid.lua +++ b/Cryptid/Cryptid.lua @@ -14,20 +14,15 @@ Cryptid_config = SMODS.current_mod.config SMODS.current_mod.optional_features = { retrigger_joker = true, post_trigger = true, - cardareas = { - unscored = true, - }, + quantum_enhancements = false, -- Here are some other ones Steamodded has -- Cryptid doesn't use them YET, but these should be uncommented if Cryptid uses them - --[[ - quantum_enhancements = true, -- These ones add new card areas that Steamodded will calculate through -- Might already be useful for sticker calc cardareas = { - deck = true, - discard = true, - } - ]] + --deck = true, + discard = true, -- used by scorch + }, } --Load Library Files @@ -58,11 +53,11 @@ local function process_items(f, mod) if item.key then if item.object_type and SMODS[item.object_type].class_prefix then item.key = SMODS[item.object_type].class_prefix .. "_" .. mod.prefix .. "_" .. item.key - else + elseif string.find(item.key, mod.prefix .. "_") ~= 1 then item.key = mod.prefix .. "_" .. item.key end end - if item.atlas then + if item.atlas and string.find(item.atlas, mod.prefix .. "_") ~= 1 then item.atlas = mod.prefix .. "_" .. item.atlas end -- this will also display the mod's own badge @@ -237,6 +232,12 @@ local cryptidConfigTab = function() ref_table = Cryptid_config, ref_value = "experimental", }) + cry_nodes[#cry_nodes + 1] = create_toggle({ + label = localize("cry_force_tooltips"), + active_colour = HEX("22c705"), + ref_table = Cryptid_config, + ref_value = "force_tooltips", + }) cry_nodes[#cry_nodes + 1] = create_toggle({ label = localize("cry_feat_https module"), active_colour = HEX("b1c78d"), diff --git a/smods/LICENSE b/Cryptid/LICENSE similarity index 100% rename from smods/LICENSE rename to Cryptid/LICENSE diff --git a/Cryptid/README.md b/Cryptid/README.md index 3d39599..d4a3bc7 100644 --- a/Cryptid/README.md +++ b/Cryptid/README.md @@ -1,16 +1,19 @@ + # Cryptid An unbalanced Balatro mod. -Note: Cryptid requires [Steamodded **1.0.0-Alpha**](https://github.com/Steamopollys/Steamodded/archive/refs/heads/main.zip) and [Talisman](https://github.com/MathIsFun0/Talisman/releases/latest). +Note: Cryptid requires [Steamodded **1.0.0~BETA-0314c**](https://github.com/Steamopollys/Steamodded/archive/refs/heads/main.zip) and [Talisman](https://github.com/MathIsFun0/Talisman/releases/latest). Cryptid currently adds: -![image](https://github.com/user-attachments/assets/0a03d6b2-d57f-4f92-9f42-a9ff201c5f2f) -![image](https://github.com/user-attachments/assets/c3f26d4d-2fb4-4b07-8f43-0d7a730e986d) + +![image](https://github.com/user-attachments/assets/fa426832-2910-4bff-86d3-97b973c79801) +![image](https://github.com/user-attachments/assets/a99b29fb-93c0-4f24-9dbd-f0ef82050aa5) +![image](https://github.com/user-attachments/assets/2441010d-1f0d-4b3f-80f7-de45e071ad06) -### [Official Discord](https://discord.gg/eUf9Ur6RyB) - -### [Video Installation Guide](https://www.youtube.com/watch?v=aUr0gXE77rk) +### [Official Discord](https://discord.gg/cryptid) +### [Mac Video Installation Guide](https://youtu.be/l5ni7fHgwTE?si=GAN5t5-y_IuEv8uA) +### [Not Mac Video Installation Guide](https://www.youtube.com/watch?v=aUr0gXE77rk) ### Frequently asked questions * Credit to @jenwalter666 for creating this FAQ (forwarded from Cryptid Discord) @@ -49,12 +52,3 @@ Talisman may be configured to be on **BigNum** mode, which has a maximum limit o Be sure to give us as much information about the bug/crash as possible. A way to reproduce the bug/crash is also especially useful information to help us fix it. Remember; just saying you're crashing doesn't tell us anything. We need to know the details! - -> *How can I disable a specific boss blind/joker/etc.?* - -Let's use Blinds as an example. - -In your Balatro mods folder, navigate to `\Cryptid\Items` and find `Blinds.lua`. (Different types of items will be contained in different Lua files in this folder.) - -Towards the end of the file, there's an array named `items_togo`, near line 1230. You can disable specific Blinds by deleting the relevant lines here. These settings will take effect on a restart. -Most other files will have a similar items array near the bottom of the file that you can modify to remove specific things from Cryptid. This system will be changed to be in-game before Cryptid 0.6.0. diff --git a/Cryptid/assets/1x/atlasepic.png b/Cryptid/assets/1x/atlasepic.png index 2591a75..6a83066 100644 Binary files a/Cryptid/assets/1x/atlasepic.png and b/Cryptid/assets/1x/atlasepic.png differ diff --git a/Cryptid/assets/1x/atlasnotjokers.png b/Cryptid/assets/1x/atlasnotjokers.png index e143fbb..b75c9a4 100644 Binary files a/Cryptid/assets/1x/atlasnotjokers.png and b/Cryptid/assets/1x/atlasnotjokers.png differ diff --git a/Cryptid/assets/1x/atlasone.png b/Cryptid/assets/1x/atlasone.png index ec0fb2a..bebce10 100644 Binary files a/Cryptid/assets/1x/atlasone.png and b/Cryptid/assets/1x/atlasone.png differ diff --git a/Cryptid/assets/1x/atlasspooky.png b/Cryptid/assets/1x/atlasspooky.png index 63803aa..2b4b164 100644 Binary files a/Cryptid/assets/1x/atlasspooky.png and b/Cryptid/assets/1x/atlasspooky.png differ diff --git a/Cryptid/assets/1x/atlasthree.png b/Cryptid/assets/1x/atlasthree.png index ae80eda..c99ad1f 100644 Binary files a/Cryptid/assets/1x/atlasthree.png and b/Cryptid/assets/1x/atlasthree.png differ diff --git a/Cryptid/assets/1x/atlastwo.png b/Cryptid/assets/1x/atlastwo.png index 0c49b8d..4a01b78 100644 Binary files a/Cryptid/assets/1x/atlastwo.png and b/Cryptid/assets/1x/atlastwo.png differ diff --git a/Cryptid/assets/1x/bl_cry.png b/Cryptid/assets/1x/bl_cry.png index b52122f..550abb9 100644 Binary files a/Cryptid/assets/1x/bl_cry.png and b/Cryptid/assets/1x/bl_cry.png differ diff --git a/Cryptid/assets/1x/c_cry_code.png b/Cryptid/assets/1x/c_cry_code.png deleted file mode 100644 index 100dd2c..0000000 Binary files a/Cryptid/assets/1x/c_cry_code.png and /dev/null differ diff --git a/Cryptid/assets/1x/hands.png b/Cryptid/assets/1x/hands.png new file mode 100644 index 0000000..7da6b8a Binary files /dev/null and b/Cryptid/assets/1x/hands.png differ diff --git a/Cryptid/assets/2x/atlasepic.png b/Cryptid/assets/2x/atlasepic.png index 106806f..35092df 100644 Binary files a/Cryptid/assets/2x/atlasepic.png and b/Cryptid/assets/2x/atlasepic.png differ diff --git a/Cryptid/assets/2x/atlasnotjokers.png b/Cryptid/assets/2x/atlasnotjokers.png index dae27ab..ee64819 100644 Binary files a/Cryptid/assets/2x/atlasnotjokers.png and b/Cryptid/assets/2x/atlasnotjokers.png differ diff --git a/Cryptid/assets/2x/atlasone.png b/Cryptid/assets/2x/atlasone.png index 67f2256..968a7cd 100644 Binary files a/Cryptid/assets/2x/atlasone.png and b/Cryptid/assets/2x/atlasone.png differ diff --git a/Cryptid/assets/2x/atlasspooky.png b/Cryptid/assets/2x/atlasspooky.png index 899ef58..bd10f33 100644 Binary files a/Cryptid/assets/2x/atlasspooky.png and b/Cryptid/assets/2x/atlasspooky.png differ diff --git a/Cryptid/assets/2x/atlasthree.png b/Cryptid/assets/2x/atlasthree.png index 961fdf7..4ea4d34 100644 Binary files a/Cryptid/assets/2x/atlasthree.png and b/Cryptid/assets/2x/atlasthree.png differ diff --git a/Cryptid/assets/2x/atlastwo.png b/Cryptid/assets/2x/atlastwo.png index ef74a6b..eb737c8 100644 Binary files a/Cryptid/assets/2x/atlastwo.png and b/Cryptid/assets/2x/atlastwo.png differ diff --git a/Cryptid/assets/2x/bl_cry.png b/Cryptid/assets/2x/bl_cry.png index db40845..02d8278 100644 Binary files a/Cryptid/assets/2x/bl_cry.png and b/Cryptid/assets/2x/bl_cry.png differ diff --git a/Cryptid/assets/2x/c_cry_code.png b/Cryptid/assets/2x/c_cry_code.png deleted file mode 100644 index 11653cf..0000000 Binary files a/Cryptid/assets/2x/c_cry_code.png and /dev/null differ diff --git a/Cryptid/assets/2x/hands.png b/Cryptid/assets/2x/hands.png new file mode 100644 index 0000000..e134301 Binary files /dev/null and b/Cryptid/assets/2x/hands.png differ diff --git a/Cryptid/assets/sounds/whapoosh.ogg b/Cryptid/assets/sounds/whapoosh.ogg new file mode 100644 index 0000000..d82ea49 Binary files /dev/null and b/Cryptid/assets/sounds/whapoosh.ogg differ diff --git a/Cryptid/config.lua b/Cryptid/config.lua index 8912a73..ebd9c6f 100644 --- a/Cryptid/config.lua +++ b/Cryptid/config.lua @@ -8,6 +8,7 @@ return { }, ["family_mode"] = false, ["experimental"] = false, + ["force_tooltips"] = true, ["HTTPS"] = true, ["menu"] = true, } diff --git a/Cryptid/items/achievement.lua b/Cryptid/items/achievement.lua index 505e3f7..a8aeb51 100644 --- a/Cryptid/items/achievement.lua +++ b/Cryptid/items/achievement.lua @@ -269,10 +269,25 @@ local ult_full_skip = { end, } +local youre_fucking_kidding = { + object_type = "Achievement", + key = "youre_fucking_kidding", + order = 15, + hidden_text = true, + bypass_all_unlocked = true, + atlas = "cry_achievements", + -- reset_on_startup = true, + unlock_condition = function(self, args) + if args.type == "discard_custom" and next(evaluate_poker_hand(args.cards)["cry_WholeDeck"]) then + return true + end + end, +} + local patience_virtue = { object_type = "Achievement", key = "patience_virtue", - order = 15, + order = 16, bypass_all_unlocked = true, hidden_text = true, pos = { x = 2, y = 0 }, @@ -299,7 +314,7 @@ local patience_virtue = { local pull_request = { object_type = "Achievement", key = "pull_request", - order = 16, + order = 17, bypass_all_unlocked = true, hidden_text = true, pos = { x = 2, y = 0 }, @@ -315,7 +330,7 @@ local pull_request = { local ace_through_crash = { object_type = "Achievement", key = "ace_in_crash", - order = 17, + order = 18, bypass_all_unlocked = true, pos = { x = 2, y = 0 }, atlas = "cry_achievements", @@ -330,7 +345,7 @@ local ace_through_crash = { local home_realtor = { object_type = "Achievement", key = "home_realtor", - order = 18, + order = 19, bypass_all_unlocked = true, hidden_text = true, pos = { x = 2, y = 0 }, @@ -347,7 +362,7 @@ local home_realtor = { local traffic_jam = { object_type = "Achievement", key = "traffic_jam", - order = 19, + order = 20, bypass_all_unlocked = true, hidden_text = true, pos = { x = 2, y = 0 }, @@ -377,7 +392,7 @@ local traffic_jam = { local perfectly_balanced = { object_type = "Achievement", key = "perfectly_balanced", - order = 20, + order = 21, bypass_all_unlocked = true, hidden_text = true, pos = { x = 2, y = 0 }, @@ -397,7 +412,7 @@ local perfectly_balanced = { local pin = { object_type = "Achievement", key = "pin", - order = 21, + order = 22, hidden_text = true, pos = { x = 3, y = 0 }, atlas = "cry_achievements", @@ -430,6 +445,7 @@ local pin = { -- Ultimate Full Skip: Win in 1 round -- Legally Blind: Obtain a Blurred Blurred Joker -- Cryptid the Cryptid: Use Cryptid on Cryptid +-- You're Fucking Kidding/You Can't Be Serious: Discard your entire deck -- Implemented (Platinum) -- Patience is a Virtue: Wait out Lavender Loop for 2 minutes before playing first hand and beat it -- Pull Request: Have ://COMMIT spawn the same Joker that it destroyed @@ -455,6 +471,7 @@ local achievement_objects = { jokes_on_you, freak_house, ult_full_skip, + youre_fucking_kidding, patience_virtue, ace_through_crash, home_realtor, diff --git a/Cryptid/items/blind.lua b/Cryptid/items/blind.lua index ca64c82..902f0e3 100644 --- a/Cryptid/items/blind.lua +++ b/Cryptid/items/blind.lua @@ -258,6 +258,28 @@ local tax = { loc_vars = function(self, info_queue, card) return { vars = { 0.4 * get_blind_amount(G.GAME.round_resets.ante) * 2 * G.GAME.starting_params.ante_scaling } } -- no bignum? end, + preview_ui = function(self) + local value = self:loc_vars().vars[1] + return { + n = G.UIT.C, + nodes = { + { + n = G.UIT.R, + nodes = { + { n = G.UIT.O, config = { object = get_stake_sprite(G.GAME.stake, 0.25) } }, + { + n = G.UIT.T, + config = { + text = number_format(value), + colour = G.C.RED, + scale = score_number_scale(0.5, value), + }, + }, + }, + }, + }, + } + end, collection_loc_vars = function(self) return { vars = { localize("cry_tax_placeholder") } } end, @@ -327,7 +349,7 @@ local clock = { if G.SETTINGS.paused then return 0 else - return 0.1 * dt / 3 + return 0.1 * (dt * math.min(G.SETTINGS.GAMESPEED, 4) / 4) / 3 end end, } @@ -394,11 +416,18 @@ local joke = { }, } end, + preview_ui = function(self) + local value = self:loc_vars().vars[2] + return { + n = G.UIT.T, + config = { text = number_format(value), colour = G.C.ORANGE, scale = score_number_scale(0.5, value) }, + } + end, collection_loc_vars = function(self) return { vars = { "8", localize("cry_joke_placeholder") } } end, cry_calc_ante_gain = function(self) - if to_big(G.GAME.chips) >= to_big(G.GAME.blind.chips) * 2 then + if to_big(G.GAME.chips) > to_big(G.GAME.blind.chips) * 2 then if G.GAME.round_resets.ante == 1 then G.GAME.cry_ach_conditions.the_jokes_on_you_triggered = true end @@ -427,7 +456,7 @@ local hammer = { recalc_debuff = function(self, card, from_blind) if card.area ~= G.jokers and not G.GAME.blind.disabled then if - card.ability.effect ~= "Stone Card" + not SMODS.has_no_rank(card) and ( card.base.value == "3" or card.base.value == "5" @@ -462,7 +491,7 @@ local magic = { recalc_debuff = function(self, card, from_blind) if card.area ~= G.jokers and not G.GAME.blind.disabled then if - card.ability.effect ~= "Stone Card" + not SMODS.has_no_rank(card) and ( card.base.value == "2" or card.base.value == "4" @@ -599,6 +628,53 @@ local pin = { return false end, } +-- Must play 5 cards, +-- Destroy all played and discarded cards +-- (only appears in endless) +local scorch = { + dependencies = { + items = { + "set_cry_blind", + }, + }, + object_type = "Blind", + name = "cry-scorch", + key = "scorch", + pos = { x = 0, y = 18 }, -- use Trick as placeholder icon + boss = { + min = 1, + max = 10, + }, + atlas = "blinds", + order = 21, + boss_colour = HEX("77261a"), + debuff = { -- must play 5 cards + h_size_ge = 5, + h_size_le = 5, + }, + calculate = function(self, blind, context) + if + context.full_hand + and context.destroy_card + and (context.cardarea == G.play or context.cardarea == "unscored") + and not G.GAME.blind.disabled + then + return { remove = not context.destroy_card.ability.eternal } + end + if context.discard and not G.GAME.blind.disabled then + for i, card in ipairs(G.hand.highlighted) do + return { remove = not card.ability.eternal } + end + end + end, + in_pool = function(self) -- only appears in endless + if G.GAME.round_resets.blind_ante > G.GAME.win_ante then + return true + else + return false + end + end, +} --It seems Showdown blind order is seperate from normal blind collection order? convenient for me at least --Nvm they changed it local lavender_loop = { @@ -637,14 +713,17 @@ local lavender_loop = { and G.GAME.cry_ach_conditions.patience_virtue_earnable ~= true then G.GAME.cry_ach_conditions.patience_virtue_timer = G.GAME.cry_ach_conditions.patience_virtue_timer - - dt * (G.GAME.modifiers.cry_rush_hour_iii and 0.5 or 1) * (G.SETTINGS.paused and 0 or 1) + - dt + * (G.GAME.modifiers.cry_rush_hour_iii and 0.5 or 1) + * (G.SETTINGS.paused and 0 or 1) + * G.SETTINGS.GAMESPEED elseif G.GAME.current_round.hands_played == 0 then G.GAME.cry_ach_conditions.patience_virtue_earnable = true end - if G.SETTINGS.paused then + if G.SETTINGS.paused or G.STATE == G.STATES.HAND_PLAYED then return 1 else - return 1.25 ^ (dt / 1.5) + return 1.25 ^ (dt / (1.5 / math.min(G.SETTINGS.GAMESPEED, 4) * 4)) end end, } @@ -774,15 +853,22 @@ local sapphire_stamp = { end, set_blind = function(self, reset, silent) if not reset then + G.GAME.stamp_mod = true G.hand.config.highlighted_limit = G.hand.config.highlighted_limit + 1 end end, defeat = function(self, silent) + if G.GAME.stamp_mod then + G.GAME.stamp_mod = nil + end if not G.GAME.blind.disabled then G.hand.config.highlighted_limit = G.hand.config.highlighted_limit - 1 end end, disable = function(self, silent) + if G.GAME.stamp_mod then + G.GAME.stamp_mod = nil + end if not G.GAME.blind.disabled then G.hand.config.highlighted_limit = G.hand.config.highlighted_limit - 1 end @@ -1340,6 +1426,7 @@ local items_togo = { striker, shackle, pin, + scorch, vermillion_virus, tornado, sapphire_stamp, diff --git a/Cryptid/items/challenge.lua b/Cryptid/items/challenge.lua index 764e35b..41eba28 100644 --- a/Cryptid/items/challenge.lua +++ b/Cryptid/items/challenge.lua @@ -283,11 +283,10 @@ local rng = { { id = "tag_rare" }, { id = "tag_top_up" }, { id = "tag_cry_epic" }, + { id = "tag_cry_gourmand" }, }, banned_cards = { - { id = "j_cry_equilib" }, { id = "c_cry_delete" }, - { id = "p_cry_meme_1", ids = { "p_cry_meme_1", "p_cry_meme_two", "p_cry_meme_three" } }, }, banned_other = {}, }, diff --git a/Cryptid/items/code.lua b/Cryptid/items/code.lua index b9606d1..ca401a3 100644 --- a/Cryptid/items/code.lua +++ b/Cryptid/items/code.lua @@ -48,7 +48,7 @@ local pack1 = { order = 1, weight = 0.96, create_card = function(self, card) - return create_card("Code", G.pack_cards, nil, nil, true, true, nil, "cry_program") + return create_card("Code", G.pack_cards, nil, nil, true, true, nil, "cry_program_1") end, ease_background_colour = function(self) ease_colour(G.C.DYN_UI.MAIN, G.C.SET.Code) @@ -92,7 +92,7 @@ local pack2 = { order = 2, weight = 0.96, create_card = function(self, card) - return create_card("Code", G.pack_cards, nil, nil, true, true, nil, "cry_program") + return create_card("Code", G.pack_cards, nil, nil, true, true, nil, "cry_program_2") end, ease_background_colour = function(self) ease_colour(G.C.DYN_UI.MAIN, G.C.SET.Code) @@ -136,7 +136,7 @@ local packJ = { order = 3, weight = 0.48, create_card = function(self, card) - return create_card("Code", G.pack_cards, nil, nil, true, true, nil, "cry_program") + return create_card("Code", G.pack_cards, nil, nil, true, true, nil, "cry_program_j") end, ease_background_colour = function(self) ease_colour(G.C.DYN_UI.MAIN, G.C.SET.Code) @@ -180,7 +180,7 @@ local packM = { order = 4, weight = 0.12, create_card = function(self, card) - return create_card("Code", G.pack_cards, nil, nil, true, true, nil, "cry_program") + return create_card("Code", G.pack_cards, nil, nil, true, true, nil, "cry_program_m") end, ease_background_colour = function(self) ease_colour(G.C.DYN_UI.MAIN, G.C.SET.Code) @@ -277,10 +277,10 @@ local crash = { set = "Code", name = "cry-Crash", key = "crash", - pos = { x = 0, y = 0 }, + pos = { x = 7, y = 0 }, config = {}, cost = 4, - atlas = "code", + atlas = "atlasnotjokers", order = 1, can_use = function(self, card) return true @@ -855,13 +855,13 @@ local payload = { set = "Code", name = "cry-Payload", key = "payload", - pos = { x = 1, y = 0 }, + pos = { x = 8, y = 0 }, config = { interest_mult = 3 }, loc_vars = function(self, info_queue, center) return { vars = { self.config.interest_mult } } end, cost = 4, - atlas = "code", + atlas = "atlasnotjokers", order = 2, can_use = function(self, card) return true @@ -895,10 +895,10 @@ local reboot = { set = "Code", name = "cry-Reboot", key = "reboot", - pos = { x = 2, y = 0 }, + pos = { x = 9, y = 0 }, config = {}, cost = 4, - atlas = "code", + atlas = "atlasnotjokers", order = 3, can_use = function(self, card) return G.STATE == G.STATES.SELECTING_HAND @@ -948,10 +948,10 @@ local revert = { set = "Code", name = "cry-Revert", key = "revert", - pos = { x = 3, y = 0 }, + pos = { x = 10, y = 0 }, config = {}, cost = 4, - atlas = "code", + atlas = "atlasnotjokers", order = 4, can_use = function(self, card) return G.GAME.cry_revert @@ -974,6 +974,10 @@ local revert = { init = function(self) local sr = save_run function save_run() + --Sneaking this here but hopefully fixes pointer UI crashes + if G.GAME.USING_CODE then + return + end if G.GAME.round_resets.ante ~= G.GAME.cry_revert_ante then G.GAME.cry_revert_ante = G.GAME.round_resets.ante G.GAME.cry_revert = nil @@ -1007,12 +1011,12 @@ local semicolon = { name = "cry-Semicolon", key = "semicolon", pos = { - x = 0, + x = 7, y = 1, }, config = {}, cost = 4, - atlas = "code", + atlas = "atlasnotjokers", order = 32, can_use = function(self, card) return G.STATE == G.STATES.SELECTING_HAND and not G.GAME.blind.boss @@ -1035,27 +1039,6 @@ local semicolon = { "other" ) end, - init = function(self) - --don't evaluate round - local gfer = G.FUNCS.evaluate_round - function G.FUNCS.evaluate_round() - if G.GAME.current_round.semicolon then - add_round_eval_row({ dollars = 0, name = "blind1", pitch = 0.95, saved = true }) - G.E_MANAGER:add_event(Event({ - trigger = "before", - delay = 1.3 * math.min(G.GAME.blind.dollars + 2, 7) / 2 * 0.15 + 0.5, - func = function() - G.GAME.blind:defeat() - return true - end, - })) - delay(0.2) - add_round_eval_row({ name = "bottom", dollars = 0 }) - else - return gfer() - end - end - end, } local malware = { cry_credits = { @@ -1079,12 +1062,12 @@ local malware = { name = "cry-Malware", key = "malware", pos = { - x = 1, + x = 8, y = 1, }, config = {}, cost = 4, - atlas = "code", + atlas = "atlasnotjokers", order = 9, can_use = function(self, card) return #G.hand.cards > 0 @@ -1154,12 +1137,12 @@ local seed = { name = "cry-Seed", key = "seed", pos = { - x = 3, + x = 10, y = 1, }, config = {}, cost = 4, - atlas = "code", + atlas = "atlasnotjokers", order = 12, can_use = function(self, card) --the card itself and one other card @@ -1167,6 +1150,7 @@ local seed = { + #G.hand.highlighted + #G.consumeables.highlighted + (G.pack_cards and #G.pack_cards.highlighted or 0) + --+ (G.shop_cards and #G.shop_cards.highlighted or 0) TODO: this so you can use seed when it's in shop == 2 end, loc_vars = function(self, info_queue, card) @@ -1255,12 +1239,12 @@ local hook = { name = "cry-Hook", key = "hook", pos = { - x = 0, + x = 7, y = 4, }, config = {}, cost = 4, - atlas = "code", + atlas = "atlasnotjokers", order = 14, no_pool_flag = "beta_deck", can_use = function(self, card) @@ -1375,9 +1359,9 @@ local variable = { set = "Code", key = "variable", name = "cry-Variable", - atlas = "code", + atlas = "atlasnotjokers", pos = { - x = 2, + x = 9, y = 1, }, cost = 4, @@ -1513,6 +1497,10 @@ local variable = { end if rank_suffix then + local TempCard = {} + for i = 1, #G.hand.highlighted do + TempCard[i] = G.hand.highlighted[i] + end G.PREVIOUS_ENTERED_RANK = G.ENTERED_RANK G.GAME.USING_CODE = false if rank_suffix == 15 then @@ -1535,23 +1523,23 @@ local variable = { return true end, })) - for i = 1, #G.hand.highlighted do + for i = 1, #TempCard do local percent = 1.15 - (i - 0.999) / (#G.hand.highlighted - 0.998) * 0.3 G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.15, func = function() - G.hand.highlighted[i]:flip() + TempCard[i]:flip() play_sound("card1", percent) - G.hand.highlighted[i]:juice_up(0.3, 0.3) + TempCard[i]:juice_up(0.3, 0.3) return true end, })) end delay(0.2) - for i = 1, #G.hand.highlighted do - local CARD = G.hand.highlighted[i] - local percent = 0.85 + (i - 0.999) / (#G.hand.highlighted - 0.998) * 0.3 + for i = 1, #TempCard do + local CARD = TempCard[i] + local percent = 0.85 + (i - 0.999) / (#TempCard - 0.998) * 0.3 G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.15, @@ -1580,26 +1568,26 @@ local variable = { return true end, })) - for i = 1, #G.hand.highlighted do - local percent = 1.15 - (i - 0.999) / (#G.hand.highlighted - 0.998) * 0.3 + for i = 1, #TempCard do + local percent = 1.15 - (i - 0.999) / (#TempCard - 0.998) * 0.3 G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.15, func = function() - G.hand.highlighted[i]:flip() + TempCard[i]:flip() play_sound("card1", percent) - G.hand.highlighted[i]:juice_up(0.3, 0.3) + TempCard[i]:juice_up(0.3, 0.3) return true end, })) end delay(0.2) - for i = 1, #G.hand.highlighted do + for i = 1, #TempCard do G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.1, func = function() - local card = G.hand.highlighted[i] + local card = TempCard[i] local suit_prefix = string.sub(card.base.suit, 1, 1) .. "_" local r2suffix = nil if rank_suffix < 10 then @@ -1620,15 +1608,15 @@ local variable = { end, })) end - for i = 1, #G.hand.highlighted do - local percent = 0.85 + (i - 0.999) / (#G.hand.highlighted - 0.998) * 0.3 + for i = 1, #TempCard do + local percent = 0.85 + (i - 0.999) / (#TempCard - 0.998) * 0.3 G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.15, func = function() - G.hand.highlighted[i]:flip() + TempCard[i]:flip() play_sound("tarot2", percent, 0.6) - G.hand.highlighted[i]:juice_up(0.3, 0.3) + TempCard[i]:juice_up(0.3, 0.3) return true end, })) @@ -1674,9 +1662,9 @@ local class = { set = "Code", key = "class", name = "cry-Class", - atlas = "code", + atlas = "atlasnotjokers", pos = { - x = 4, + x = 11, y = 1, }, cost = 4, @@ -1807,6 +1795,10 @@ local class = { end if enh_suffix then + local TempCard = {} + for i = 1, #G.hand.highlighted do + TempCard[i] = G.hand.highlighted[i] + end G.PREVIOUS_ENTERED_ENH = G.ENTERED_ENH G.GAME.USING_CODE = false if enh_suffix == "ccd" then @@ -1819,22 +1811,22 @@ local class = { return true end, })) - for i = 1, #G.hand.highlighted do + for i = 1, #TempCard do local percent = 1.15 - (i - 0.999) / (#G.hand.highlighted - 0.998) * 0.3 G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.15, func = function() - G.hand.highlighted[i]:flip() + TempCard[i]:flip() play_sound("card1", percent) - G.hand.highlighted[i]:juice_up(0.3, 0.3) + TempCard[i]:juice_up(0.3, 0.3) return true end, })) + delay(0.2) end - delay(0.2) - for i = 1, #G.hand.highlighted do - local CARD = G.hand.highlighted[i] + for i = 1, #TempCard do + local CARD = TempCard[i] local percent = 0.85 + (i - 0.999) / (#G.hand.highlighted - 0.998) * 0.3 G.E_MANAGER:add_event(Event({ trigger = "after", @@ -1851,14 +1843,14 @@ local class = { elseif enh_suffix == "null" then local destroyed_cards = {} check_for_unlock({ type = "cheat_used" }) - for i = #G.hand.highlighted, 1, -1 do - local card = G.hand.highlighted[i] + for i = #TempCard, 1, -1 do + local card = TempCard[i] if not card.ability.eternal then - destroyed_cards[#destroyed_cards + 1] = G.hand.highlighted[i] + destroyed_cards[#destroyed_cards + 1] = TempCard[i] if card.ability.name == "Glass Card" then card:shatter() else - card:start_dissolve(nil, i == #G.hand.highlighted) + card:start_dissolve(nil, i == #TempCard) end end end @@ -1881,39 +1873,39 @@ local class = { return true end, })) - for i = 1, #G.hand.highlighted do - local percent = 1.15 - (i - 0.999) / (#G.hand.highlighted - 0.998) * 0.3 + for i = 1, #TempCard do + local percent = 1.15 - (i - 0.999) / (#TempCard - 0.998) * 0.3 G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.15, func = function() - G.hand.highlighted[i]:flip() + TempCard[i]:flip() play_sound("card1", percent) - G.hand.highlighted[i]:juice_up(0.3, 0.3) + TempCard[i]:juice_up(0.3, 0.3) return true end, })) end delay(0.2) - for i = 1, #G.hand.highlighted do + for i = 1, #TempCard do G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.1, func = function() - G.hand.highlighted[i]:set_ability(G.P_CENTERS[enh_suffix]) + TempCard[i]:set_ability(G.P_CENTERS[enh_suffix]) return true end, })) end - for i = 1, #G.hand.highlighted do - local percent = 0.85 + (i - 0.999) / (#G.hand.highlighted - 0.998) * 0.3 + for i = 1, #TempCard do + local percent = 0.85 + (i - 0.999) / (#TempCard - 0.998) * 0.3 G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.15, func = function() - G.hand.highlighted[i]:flip() + TempCard[i]:flip() play_sound("tarot2", percent, 0.6) - G.hand.highlighted[i]:juice_up(0.3, 0.3) + TempCard[i]:juice_up(0.3, 0.3) return true end, })) @@ -1959,9 +1951,9 @@ local commit = { set = "Code", key = "commit", name = "cry-Commit", - atlas = "code", + atlas = "atlasnotjokers", pos = { - x = 1, + x = 8, y = 2, }, cost = 4, @@ -2037,9 +2029,9 @@ local merge = { set = "Code", key = "merge", name = "cry-Merge", - atlas = "code", + atlas = "atlasnotjokers", pos = { - x = 0, + x = 7, y = 2, }, cost = 4, @@ -2148,17 +2140,23 @@ local multiply = { set = "Code", key = "multiply", name = "cry-Multiply", - atlas = "code", + atlas = "atlasnotjokers", order = 24, pos = { - x = 3, + x = 10, y = 2, }, cost = 4, can_use = function(self, card) - return #G.jokers.highlighted == 1 - and not Card.no(G.jokers.highlighted[1], "immune_to_chemach", true) - and not Card.no(G.jokers.highlighted[1], "immutable", true) + if not G.GAME.modifiers.cry_beta then + return #G.jokers.highlighted == 1 and not Card.no(G.jokers.highlighted[1], "immutable", true) + else + return #G.jokers.highlighted == 2 + and not ( + Card.no(G.jokers.highlighted[1], "immutable", true) + or Card.no(G.jokers.highlighted[2], "immutable", true) + ) + end end, use = function(self, card, area, copier) if not G.jokers.highlighted[1].config.cry_multiply then @@ -2207,10 +2205,10 @@ local divide = { set = "Code", key = "divide", name = "cry-Divide", - atlas = "code", + atlas = "atlasnotjokers", order = 23, pos = { - x = 2, + x = 9, y = 2, }, cost = 4, @@ -2275,10 +2273,10 @@ local delete = { set = "Code", key = "delete", name = "cry-Delete", - atlas = "code", + atlas = "atlasnotjokers", order = 18, pos = { - x = 4, + x = 11, y = 2, }, cost = 4, @@ -2406,10 +2404,10 @@ local spaghetti = { set = "Code", key = "spaghetti", name = "cry-Spaghetti", - atlas = "code", + atlas = "atlasnotjokers", order = 13, pos = { - x = 5, + x = 12, y = 2, }, cost = 4, @@ -2450,9 +2448,9 @@ local machinecode = { set = "Code", name = "cry-Machine Code", key = "machinecode", - pos = { x = 0, y = 3 }, + pos = { x = 7, y = 3 }, cost = 3, - atlas = "code", + atlas = "atlasnotjokers", order = 19, can_use = function(self, card) return true @@ -2720,12 +2718,12 @@ local run = { set = "Code", name = "cry-Run", key = "run", - pos = { x = 5, y = 0 }, + pos = { x = 12, y = 0 }, cost = 3, - atlas = "code", + atlas = "atlasnotjokers", order = 6, can_use = function(self, card) - return Cryptid.safe_get(G.GAME, "blind", "in_blind") + return Cryptid.safe_get(G.GAME, "blind", "in_blind") and not G.GAME.USING_RUN end, can_bulk_use = true, use = function(self, card, area, copier) @@ -2832,9 +2830,9 @@ local exploit = { set = "Code", key = "exploit", name = "cry-Exploit", - atlas = "code", + atlas = "atlasnotjokers", pos = { - x = 1, + x = 8, y = 3, }, cost = 4, @@ -2942,12 +2940,49 @@ local exploit = { end G.FUNCS.exploit_apply = function() local hand_table = { - ["High Card"] = { "high card", "high", "1oak", "1 of a kind", "haha one" }, - ["Pair"] = { "pair", "2oak", "2 of a kind", "m" }, - ["Two Pair"] = { "two pair", "2 pair", "mm" }, - ["Three of a Kind"] = { "three of a kind", "3 of a kind", "3oak", "trips", "triangle" }, - ["Straight"] = { "straight", "lesbian", "gay", "bisexual", "asexual" }, - ["Flush"] = { "flush", "skibidi", "toilet", "floosh" }, + ["High Card"] = { + "high card", + "high", + "1oak", + "1 of a kind", + "haha one", + }, + ["Pair"] = { + "pair", + "2oak", + "2 of a kind", + "m", + "window", + }, + ["Two Pair"] = { + "two pair", + "2 pair", + "mm", + "pairpair", + "pair of a kind", + }, + ["Three of a Kind"] = { + "three of a kind", + "3 of a kind", + "3oak", + "trips", + "triangle", + }, + ["Straight"] = { + "straight", + "lesbian", + "gay", + "bisexual", + "asexual", + "staircase", + }, + ["Flush"] = { + "flush", + "skibidi", + "toilet", + "floosh", + "monotone", + }, ["Full House"] = { "full house", "full", @@ -2964,14 +2999,69 @@ local exploit = { "quads", "four to the floor", }, - ["Straight Flush"] = { "straight flush", "strush", "slush", "slushie", "slushy" }, - ["Five of a Kind"] = { "five of a kind", "5 of a kind", "5oak", "quints" }, - ["Flush House"] = { "flush house", "flouse", "outhouse" }, - ["Flush Five"] = { "flush five", "fish", "you know what that means", "five of a flush" }, - ["cry_Bulwark"] = { "bulwark", "flush rock", "stoned", "stone flush", "flush stone" }, - ["cry_Clusterfuck"] = { "clusterfuck", "fuck", "wtf" }, - ["cry_UltPair"] = { "ultimate pair", "ultpair", "ult pair", "pairpairpair" }, - ["cry_WholeDeck"] = { "the entire fucking deck", "deck", "tefd", "fifty-two", "you are fuck deck" }, + ["Straight Flush"] = { + "straight flush", + "strush", + "slush", + "slushie", + "slushy", + "monotone staircase", + }, + ["Five of a Kind"] = { + "five of a kind", + "5 of a kind", + "5oak", + "quints", + }, + ["Flush House"] = { + "flush house", + "flouse", + "outhouse", + "monotone house", + "the grey house", + }, + ["Flush Five"] = { + "flush five", + "fish", + "you know what that means", + "five of a flush", + "monotone fish", + }, + ["cry_Bulwark"] = { + "bulwark", + "flush rock", + "stoned", + "stone flush", + "flush stone", + "rock and stone", + }, + ["cry_Clusterfuck"] = { + "clusterfuck", + "fuck", + "wtf", + "cluster", + "what", + }, + ["cry_UltPair"] = { + "ultimate pair", + "ultpair", + "ult pair", + "pairpairpair", + "flush pair of a kind of a kind", + "2f2oakoak", + "two flush two of a kind of a kind", + }, + ["cry_WholeDeck"] = { + "the entire fucking deck", + "deck", + "tefd", + "fifty-two", + "you are fuck deck", + "deck of a kind", + "the entire deck", + "everything of a kind", + "everything", + }, } local current_hand = nil for k, v in pairs(SMODS.PokerHands) do @@ -3048,11 +3138,11 @@ local oboe = { set = "Code", key = "oboe", name = "cry-oboe", - atlas = "code", + atlas = "atlasnotjokers", order = 10, config = { extra = { choices = 1 } }, pos = { - x = 2, + x = 9, y = 3, }, cost = 4, @@ -3094,11 +3184,11 @@ local rework = { set = "Code", key = "rework", name = "cry-Rework", - atlas = "code", + atlas = "atlasnotjokers", order = 25, no_pool_flag = "beta_deck", pos = { - x = 3, + x = 10, y = 3, }, cost = 4, @@ -3108,13 +3198,21 @@ local rework = { return { vars = {} } end, can_use = function(self, card) - return #G.jokers.highlighted == 1 - and not G.jokers.highlighted[1].ability.eternal - and G.jokers.highlighted[1].ability.name ~= "cry-meteor" - and G.jokers.highlighted[1].ability.name ~= "cry-exoplanet" - and G.jokers.highlighted[1].ability.name ~= "cry-stardust" - and G.jokers.highlighted[1].config.center.rarity ~= "cry_cursed" - and (G.jokers.highlighted[1].ability.name ~= "Diet Cola" or Card.get_gameset(card) == "madness") + if not G.GAME.modifiers.cry_beta then + return #G.jokers.highlighted == 1 + and not G.jokers.highlighted[1].ability.eternal + and G.jokers.highlighted[1].ability.name + ~= ("cry-meteor" or "cry-exoplanet" or "cry-stardust" or "cry_cursed" or ("Diet Cola" or Card.get_gameset( + card + ) == "madness")) + else + return #G.jokers.highlighted == 2 + and not G.jokers.highlighted[1].ability.eternal + and G.jokers.highlighted[1].ability.name + ~= ("cry-meteor" or "cry-exoplanet" or "cry-stardust" or "cry_cursed" or ("Diet Cola" or Card.get_gameset( + card + ) == "madness")) + end end, use = function(self, card, area, copier) local jkr = G.jokers.highlighted[1] @@ -3238,11 +3336,11 @@ local patch = { set = "Code", key = "patch", name = "cry-patch", - atlas = "code", + atlas = "atlasnotjokers", order = 26, config = {}, pos = { - x = 1, + x = 8, y = 4, }, cost = 4, @@ -3299,15 +3397,6 @@ local patch = { end CARD.debuff = false CARD.cry_debuff_immune = true - CARD.ability.perishable = nil - CARD.pinned = nil - CARD:set_rental(nil) - if not CARD.sob then - CARD:set_eternal(nil) - end - CARD.ability.banana = nil - CARD.ability.cry_possessed = nil - SMODS.Stickers.cry_flickering:apply(CARD, nil) play_sound("tarot2", percent) CARD:juice_up(0.3, 0.3) return true @@ -3324,15 +3413,6 @@ local patch = { CARD:flip() end CARD.debuff = false - CARD.ability.perishable = nil - CARD.pinned = nil - CARD:set_rental(nil) - if not CARD.sob then - CARD:set_eternal(nil) - end - CARD.ability.banana = notify_alert - CARD.ability.cry_possessed = nil - SMODS.Stickers.cry_flickering:apply(CARD, nil) play_sound("card1", percent) CARD:juice_up(0.3, 0.3) return true @@ -3349,15 +3429,6 @@ local patch = { CARD:flip() end CARD.debuff = false - CARD.ability.perishable = nil - CARD.pinned = nil - CARD:set_rental(nil) - if not CARD.sob then - CARD:set_eternal(nil) - end - CARD.ability.banana = nil - CARD.ability.cry_possessed = nil - SMODS.Stickers.cry_flickering:apply(CARD, nil) play_sound("card1", percent) CARD:juice_up(0.3, 0.3) return true @@ -3387,11 +3458,11 @@ local ctrl_v = { set = "Code", key = "ctrl_v", name = "cry-Ctrl-V", - atlas = "code", + atlas = "atlasnotjokers", order = 27, config = {}, pos = { - x = 2, + x = 9, y = 4, }, cost = 4, @@ -3490,11 +3561,11 @@ local inst = { set = "Code", key = "inst", name = "cry-Inst", - atlas = "code", + atlas = "atlasnotjokers", order = 28, config = {}, pos = { - x = 3, + x = 10, y = 4, }, cost = 4, @@ -3567,11 +3638,11 @@ local alttab = { set = "Code", key = "alttab", name = "cry-Alttab", - atlas = "code", + atlas = "atlasnotjokers", order = 28, config = {}, pos = { - x = 4, + x = 11, y = 4, }, cost = 4, @@ -3587,6 +3658,9 @@ local alttab = { ret = "???" end end + if next(SMODS.find_card("j_cry_kittyprinter")) then + ret = localize({ type = "name_text", key = "tag_cry_cat", set = "Tag" }) + end return { vars = { ret } } end, can_use = function(self, card) @@ -3602,7 +3676,9 @@ local alttab = { play_sound("tarot1") local tag = nil local type = G.GAME.blind:get_type() - if type == "Boss" then + if next(SMODS.find_card("j_cry_kittyprinter")) then + tag = Tag("tag_cry_cat") + elseif type == "Boss" then tag = Tag(get_next_tag_key()) else tag = Tag(G.GAME.round_resets.blind_tags[type]) @@ -3646,7 +3722,7 @@ local automaton = { "HexaCryonic", }, art = { - "HexaCryonic", + "unze2unze4", }, code = { "Math", @@ -3661,10 +3737,10 @@ local automaton = { set = "Tarot", name = "cry-Automaton", key = "automaton", - pos = { x = 5, y = 1 }, + pos = { x = 12, y = 1 }, config = { create = 1 }, order = 5, - atlas = "code", + atlas = "atlasnotjokers", loc_vars = function(self, info_queue, card) return { vars = { Cryptid.safe_get(card, "ability", "create") or self.config.create } } end, @@ -3819,11 +3895,11 @@ local pointer = { set = "Spectral", name = "cry-Pointer", key = "pointer", - pos = { x = 4, y = 3 }, + pos = { x = 11, y = 3 }, hidden = true, soul_set = "Code", order = 41, - atlas = "code", + atlas = "atlasnotjokers", can_use = function(self, card) return true end, @@ -3847,6 +3923,7 @@ local pointer = { G.CHOOSE_CARD.alignment.offset.y = 0 G.ROOM.jiggle = G.ROOM.jiggle + 1 G.CHOOSE_CARD:align_to_major() + check_for_unlock({ cry_used_consumable = "c_cry_pointer" }) end, init = function(self) function create_UIBox_pointer(card) @@ -3939,6 +4016,7 @@ local pointer = { G.CHOOSE_CARD:remove() G.GAME.USING_CODE = false G.GAME.USING_POINTER = false + G.DEBUG_POINTER = false end G.FUNCS.pointer_apply_previous = function() if G.PREVIOUS_ENTERED_CARD then @@ -3947,6 +4025,7 @@ local pointer = { G.FUNCS.pointer_apply() end local aliases = { + -- Vanilla Jokers jimbo = "joker", ["gary mccready"] = "joker", greedy = "greedy joker", @@ -4000,6 +4079,7 @@ local pointer = { driverslicense = "driver's license", burnt = "burnt joker", caino = "canio", + -- Cryptid Jokers house = "happy house", queensgambit = "queen's gambit", weefib = "weebonacci", @@ -4042,16 +4122,55 @@ local pointer = { oldgoogle = "nostalgic googol play card", oldgoogleplay = "nostalgic googol play card", oldgoogleplaycard = "nostalgic googol play card", + ngpc = "nostalgic googol play card", localthunk = "supercell", ["1fa"] = "one for all", - crust = "crustulum", - deathstar = "stella mortis", ["jolly?"] = "jolly joker?", scrabble = "scrabble tile", - ["13"] = "tredecim", + oldcandy = "nostalgic candy", + jimbo9000 = "jimbo-tron 9000", + jimbotron9000 = "jimbo-tron 9000", + magnet = "fridge magnet", + weeb = "weebonacci", + potofgreed = "pot of jokes", + flipside = "on the flip side", + bonkers = "bonkers joker", + fuckedup = "fucked-up joker", + foolhardy = "foolhardy joker", + adroit = "adroit joker", + penetrating = "penetrating joker", + treacherous = "treacherous joker", + stronghold = "the stronghold", + thefuck = "the fuck!?", + ["tf!?"] = "the fuck!?", + wtf = "the fuck!?", + clash = "the clash", + astral = "astral in a bottle", + smoothie = "tropical smoothie", + chocodie = "chocolate die", + chocodice = "chocolate die", + chocolatedice = "chocolate die", + cookie = "clicked cookie", + lebronjames = "lebaron james", + lebron = "lebaron james", + lebaron = "lebaron james", + hunting = "hunting season", + clockwork = "clockwork joker", + monopoly = "monopoly money", + notebook = "the motebook", + motebook = "the motebook", + mcdonalds = "fast food m", + code = "code joker", + copypaste = "copy/paste", + translucent = "translucent joker", + circulus = "circulus pistoris", + macabre = "macabre joker", + cat_owl = "cat owl", + --Vouchers ["overstock+"] = "overstock plus", directorscut = "director's cut", ["3rs"] = "the 3 rs", + -- Vanilla Tarots fool = "the fool", magician = "the magician", priestess = "the high priestess", @@ -4070,10 +4189,13 @@ local pointer = { moon = "the moon", sun = "the sun", world = "the world", + -- Cryptid Tarots automaton = "the automaton", eclipse = "c_cry_eclipse", + -- Planets x = "planet x", X = "planet x", + -- Code Cards pointer = "pointer://", payload = "://payload", reboot = "://reboot", @@ -4099,12 +4221,15 @@ local pointer = { ctrlv = "://ctrl+v", ["ctrl+v"] = "://ctrl+v", ["ctrl v"] = "://ctrl+v", + hook = "hook://", instantiate = "://INSTANTIATE", inst = "://INSTANTIATE", spaghetti = "://spaghetti", + alttab = "://alttab", + -- Tags topuptag = "top-up tag", gamblerstag = "gambler's tag", - hook = "hook://", + -- Blinds ox = "the ox", wall = "the wall", wheel = "the wheel", @@ -4142,45 +4267,6 @@ local pointer = { box = "the box", windmill = "the windmill", clock = "the clock", - code = "code joker", - copypaste = "copy/paste", - translucent = "translucent joker", - circulus = "circulus pistoris", - macabre = "macabre joker", - -- Jen's Almanac aliases - freddy = "freddy snowshoe", - paupovlin = "paupovlin revere", - poppin = "paupovlin revere", - jen = "jen walter", - dandy = 'Dandicus "Dandy" Dancifer', - --should I add "reverse ___" prefixes for the reverse tarots? - survivor = "the survivor", - monk = "the monk", - hunter = "the hunter", - gourmand = "the gourmand", - saint = "the saint", - genius = "the genius", - scientist = "the scientist", - peasant = "the peasant", - adversary = "the adversary", - rivals = "the rivals", - hitchhiker = "the hitchhiker", - angel = "the angel", - collapse = "the collapse", - lowlaywoman = "the low laywoman", - laywoman = "the low laywoman", - servant = "the servant", - extrovert = "the extrovert", - discofpenury = "the disc of penury", - flash = "the flash", - eclipsespectral = "c_jen_reverse_moon", - eclipsetorat = "c_jen_reverse_moon", - darkness = "the darkness", - void = "the void", - topuptoken = "top-up token", - sagittarius = "sagittarius a*", - ["sagitarius a*"] = "sagittarius a*", --minor spelling mistakes are forgiven - sagitarius = "sagittarius a*", --minor spelling mistakes are forgiven } for k, v in pairs(aliases) do Cryptid.aliases[k] = v @@ -4217,10 +4303,16 @@ local pointer = { local created = false if G.P_CENTERS[current_card].set == "Joker" - and G.P_CENTERS[current_card].unlocked - and not G.GAME.banned_keys[current_card] - and (G.P_CENTERS[current_card].rarity ~= "cry_exotic" or #SMODS.find_card("j_jen_p03") > 0) - and not (Jen and Jen.overpowered(G.P_CENTERS[current_card].rarity)) + and ( + G.DEBUG_POINTER + or ( + G.P_CENTERS[current_card].unlocked + and #G.jokers.cards + G.GAME.joker_buffer < G.jokers.config.card_limit + and not G.GAME.banned_keys[current_card] + and (G.P_CENTERS[current_card].rarity ~= "cry_exotic" or #SMODS.find_card("j_jen_p03") > 0) + and not (Jen and Jen.overpowered(G.P_CENTERS[current_card].rarity)) + ) + ) then local card = create_card("Joker", G.jokers, nil, nil, nil, nil, current_card) card:add_to_deck() @@ -4229,8 +4321,14 @@ local pointer = { end if G.P_CENTERS[current_card].consumeable - and G.P_CENTERS[current_card].set ~= "jen_omegaconsumable" - and not G.GAME.banned_keys[current_card] + and ( + G.DEBUG_POINTER + or ( + G.P_CENTERS[current_card].set ~= "jen_omegaconsumable" + and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit + and not G.GAME.banned_keys[current_card] + ) + ) then local card = create_card("Consumeable", G.consumeables, nil, nil, nil, nil, current_card) if card.ability.name and card.ability.name == "cry-Chambered" then @@ -4241,9 +4339,8 @@ local pointer = { created = true end if - G.P_CENTERS[current_card].set == "Voucher" - and G.P_CENTERS[current_card].unlocked - and not G.GAME.banned_keys[current_card] + G.P_CENTERS[current_card].set == "Voucher" and G.DEBUG_POINTER + or (G.P_CENTERS[current_card].unlocked and not G.GAME.banned_keys[current_card]) then local area if G.STATE == G.STATES.HAND_PLAYED then @@ -4280,8 +4377,9 @@ local pointer = { end if G.P_CENTERS[current_card].set == "Booster" - and not G.GAME.banned_keys[current_card] - and (G.P_CENTERS[current_card].name ~= "Exotic Buffoon Pack" or #SMODS.find_card("j_jen_p03") ~= 0) + and (G.DEBUG_POINTER or (not G.GAME.banned_keys[current_card] and (G.P_CENTERS[current_card].name ~= "Exotic Buffoon Pack" or #SMODS.find_card( + "j_jen_p03" + ) ~= 0))) and G.STATE ~= G.STATES.TAROT_PACK and G.STATE ~= G.STATES.SPECTRAL_PACK and G.STATE ~= G.STATES.STANDARD_PACK @@ -4300,6 +4398,7 @@ local pointer = { G.CHOOSE_CARD:remove() G.GAME.USING_CODE = false G.GAME.USING_POINTER = false + G.DEBUG_POINTER = false return end end @@ -4314,7 +4413,10 @@ local pointer = { current_card = i end end - if current_card and not G.P_CENTERS[current_card] and not G.GAME.banned_keys[current_card] then + if + current_card + and (G.DEBUG_POINTER or (not G.P_CENTERS[current_card] and not G.GAME.banned_keys[current_card])) + then local created = false local t = Tag(current_card, nil, "Big") add_tag(t) @@ -4337,6 +4439,7 @@ local pointer = { G.CHOOSE_CARD:remove() G.GAME.USING_CODE = false G.GAME.USING_POINTER = false + G.DEBUG_POINTER = false return end for i, v in pairs(G.P_BLINDS) do @@ -4356,7 +4459,7 @@ local pointer = { current_card and not G.P_CENTERS[current_card] and not G.P_TAGS[current_card] - and not G.GAME.banned_keys[current_card] + and (G.DEBUG_POINTER or not G.GAME.banned_keys[current_card]) then local created = false if not G.GAME.blind or (G.GAME.blind.name == "" or not G.GAME.blind.blind_set) then @@ -4414,6 +4517,7 @@ local pointer = { G.CHOOSE_CARD:remove() G.GAME.USING_CODE = false G.GAME.USING_POINTER = false + G.DEBUG_POINTER = false end end if not current_card then -- if card isn't created yet, try playing cards @@ -4607,6 +4711,7 @@ local pointer = { G.CHOOSE_CARD:remove() G.GAME.USING_CODE = false G.GAME.USING_POINTER = false + G.DEBUG_POINTER = false G.E_MANAGER:add_event(Event({ func = function() @@ -4661,7 +4766,8 @@ local pointer = { local encoded = { cry_credits = { idea = { - "I forgot", + "Auto Watto", + "Kailen", }, art = { "Kailen", @@ -4713,6 +4819,18 @@ local encoded = { end, })) end, + unlocked = false, + check_for_unlock = function(self, args) + if args.cry_used_consumable == "c_cry_pointer" then + unlock_card(self) + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local CodeJoker = { dependencies = { @@ -4755,6 +4873,7 @@ local CodeJoker = { cry_credits = { idea = { "Kailen", + "Auto Watto", }, art = { "Kailen", @@ -5129,7 +5248,7 @@ local code_cards = { oboe, rework, rework_tag, - --patch, + patch, ctrl_v, inst, alttab, @@ -5141,84 +5260,6 @@ local code_cards = { return { name = "Code Cards", init = function() - --allow Program Packs to let you keep the cards - local G_UIDEF_use_and_sell_buttons_ref = G.UIDEF.use_and_sell_buttons - function G.UIDEF.use_and_sell_buttons(card) - if (card.area == G.pack_cards and G.pack_cards) and card.ability.consumeable then --Add a use button - if card.ability.set == "Code" then - return { - n = G.UIT.ROOT, - config = { padding = -0.1, colour = G.C.CLEAR }, - nodes = { - { - n = G.UIT.R, - config = { - ref_table = card, - r = 0.08, - padding = 0.1, - align = "bm", - minw = 0.5 * card.T.w - 0.15, - minh = 0.7 * card.T.h, - maxw = 0.7 * card.T.w - 0.15, - hover = true, - shadow = true, - colour = G.C.UI.BACKGROUND_INACTIVE, - one_press = true, - button = "use_card", - func = "can_reserve_card", - }, - nodes = { - { - n = G.UIT.T, - config = { - text = localize("b_pull"), - colour = G.C.UI.TEXT_LIGHT, - scale = 0.55, - shadow = true, - }, - }, - }, - }, - { - n = G.UIT.R, - config = { - ref_table = card, - r = 0.08, - padding = 0.1, - align = "bm", - minw = 0.5 * card.T.w - 0.15, - maxw = 0.9 * card.T.w - 0.15, - minh = 0.1 * card.T.h, - hover = true, - shadow = true, - colour = G.C.UI.BACKGROUND_INACTIVE, - one_press = true, - button = "Do you know that this parameter does nothing?", - func = "can_use_consumeable", - }, - nodes = { - { - n = G.UIT.T, - config = { - text = localize("b_use"), - colour = G.C.UI.TEXT_LIGHT, - scale = 0.45, - shadow = true, - }, - }, - }, - }, - { n = G.UIT.R, config = { align = "bm", w = 7.7 * card.T.w } }, - { n = G.UIT.R, config = { align = "bm", w = 7.7 * card.T.w } }, - { n = G.UIT.R, config = { align = "bm", w = 7.7 * card.T.w } }, - { n = G.UIT.R, config = { align = "bm", w = 7.7 * card.T.w } }, - -- Betmma can't explain it, neither can I - }, - } - end - end - return G_UIDEF_use_and_sell_buttons_ref(card) - end --Code from Betmma's Vouchers G.FUNCS.can_reserve_card = function(e) local c1 = e.config.ref_table diff --git a/Cryptid/items/deck.lua b/Cryptid/items/deck.lua index 7b9aaea..05eee87 100644 --- a/Cryptid/items/deck.lua +++ b/Cryptid/items/deck.lua @@ -24,6 +24,20 @@ local very_fair = { return avts(...) end end, + unlocked = false, + check_for_unlock = function(self, args) + if args.type == "win_deck" then + if get_deck_win_stake("b_cry_blank") > 0 then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local equilibrium = { object_type = "Back", @@ -69,6 +83,24 @@ local equilibrium = { return gp(k, t) end end, + unlocked = false, + check_for_unlock = function(self, args) + if Cryptid.safe_get(G, "jokers") then + local count = 0 + for i = 1, #G.jokers.cards do + count = count + 1 + end + if count >= 10 then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local misprint = { object_type = "Back", @@ -87,6 +119,23 @@ local misprint = { G.GAME.modifiers.cry_misprint_min = (G.GAME.modifiers.cry_misprint_min or 1) * self.config.cry_misprint_min G.GAME.modifiers.cry_misprint_max = (G.GAME.modifiers.cry_misprint_max or 1) * self.config.cry_misprint_max end, + unlocked = false, + check_for_unlock = function(self, args) + if Cryptid.safe_get(G, "jokers") then + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].edition and G.jokers.cards[i].edition.cry_glitched then + unlock_card(self) + break + end + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local infinite = { object_type = "Back", @@ -104,6 +153,20 @@ local infinite = { apply = function(self) G.GAME.modifiers.cry_highlight_limit = self.config.cry_highlight_limit end, + unlocked = false, + check_for_unlock = function(self, args) + if args.type == "hand_contents" then + if #args.cards >= 6 then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local conveyor = { object_type = "Back", @@ -120,6 +183,18 @@ local conveyor = { apply = function(self) G.GAME.modifiers.cry_conveyor = true end, + unlocked = false, + check_for_unlock = function(self, args) + if args.cry_used_consumable == "c_cry_analog" then + unlock_card(self) + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local CCD = { object_type = "Back", @@ -137,6 +212,18 @@ local CCD = { apply = function(self) G.GAME.modifiers.cry_ccd = true end, + unlocked = false, + check_for_unlock = function(self, args) + if args.cry_used_consumable == "c_cry_hammerspace" then + unlock_card(self) + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local wormhole = { object_type = "Back", @@ -173,6 +260,22 @@ local wormhole = { end, }, true) end, + unlocked = false, + check_for_unlock = function(self, args) + if Cryptid.safe_get(G, "jokers") then + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].config.center.rarity == "cry_exotic" then + unlock_card(self) + end + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local redeemed = { object_type = "Back", @@ -193,6 +296,7 @@ local redeemed = { local cr = Card.redeem function Card:redeem() cr(self) + if G.GAME.modifiers.cry_redeemed then if #G.play.cards == 0 @@ -220,7 +324,9 @@ local redeemed = { else area = G.play end - if not G.cry_redeemed_buffer then G.cry_redeemed_buffer = {} end + if not G.cry_redeemed_buffer then + G.cry_redeemed_buffer = {} + end if not G.cry_redeemed_buffer[v.key] and v.unlocked then local card = create_card("Voucher", area, nil, nil, nil, nil, v.key) G.cry_redeemed_buffer[v.key] = true @@ -247,6 +353,20 @@ local redeemed = { end end end, + unlocked = false, + check_for_unlock = function(self, args) + if args.type == "discover_amount" then + if G.DISCOVER_TALLIES.vouchers.tally / G.DISCOVER_TALLIES.vouchers.of >= 1 then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local legendary = { object_type = "Back", @@ -309,6 +429,26 @@ local legendary = { end, })) end, + unlocked = false, + check_for_unlock = function(self, args) + if Cryptid.safe_get(G, "jokers") then + local count = 0 + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].config.center.rarity == 4 then + count = count + 1 + end + end + if count >= 2 then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local critical = { object_type = "Back", @@ -373,6 +513,23 @@ local critical = { end end end, + unlocked = false, + check_for_unlock = function(self, args) + if Cryptid.safe_get(G, "jokers") then + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].ability.cry_rigged then + unlock_card(self) + break + end + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local glowing = { object_type = "Back", @@ -402,6 +559,20 @@ local glowing = { end end end, + unlocked = false, + check_for_unlock = function(self, args) + if args.type == "win_deck" then + if get_deck_win_stake("b_cry_beige") > 0 then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local beta = { object_type = "Back", @@ -419,6 +590,20 @@ local beta = { apply = function(self) G.GAME.modifiers.cry_beta = true end, + unlocked = false, + check_for_unlock = function(self, args) + if args.type == "win_deck" then + if get_deck_win_stake() >= 9 then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local bountiful = { object_type = "Back", @@ -436,6 +621,23 @@ local bountiful = { apply = function(self) G.GAME.modifiers.cry_forced_draw_amount = self.config.cry_forced_draw_amount end, + unlocked = false, + check_for_unlock = function(self, args) + if args.type == "round_win" then + if + G.GAME.blind.name == "The Serpent" + and G.GAME.current_round.discards_left == G.GAME.round_resets.discards + then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local beige = { object_type = "Back", @@ -452,6 +654,20 @@ local beige = { apply = function(self) G.GAME.modifiers.cry_common_value_quad = true end, + unlocked = false, + check_for_unlock = function(self, args) + if args.type == "discover_amount" then + if args.amount >= 200 then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local blank = { object_type = "Back", @@ -492,81 +708,29 @@ local antimatter = { pos = { x = 2, y = 0 }, calculate = function(self, back, context) if context.context ~= "final_scoring_step" then - Cryptid.antimatter_trigger(self, context) + Cryptid.antimatter_trigger(self, context, Cryptid.gameset(G.P_CENTERS.b_cry_antimatter) == "madness") else - return Cryptid.antimatter_trigger_final_scoring(self, context) + 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() + Cryptid.antimatter_apply(Cryptid.gameset(G.P_CENTERS.b_cry_antimatter) == "madness") end, atlas = "atlasdeck", init = function(self) - function Cryptid.antimatter_apply() - local bluecheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_blue", "wins", 8) - local yellowcheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_yellow", "wins", 8) - local abandonedcheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_abandoned", "wins", 8) - local ghostcheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_ghost", "wins", 8) - local redcheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_red", "wins", 8) - local checkeredcheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_checkered", "wins", 8) - local erraticcheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_erratic", "wins", 8) - local blackcheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_black", "wins", 8) - local paintedcheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_painted", "wins", 8) - local greencheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_green", "wins", 8) - local spookycheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_spooky", "wins", 8) - local equilibriumcheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_equilibrium", "wins", 8) - local misprintcheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_misprint", "wins", 8) - local infinitecheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_infinite", "wins", 8) - local wormholecheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_wormhole", "wins", 8) - local redeemedcheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_redeemed", "wins", 8) - local legendarycheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_legendary", "wins", 8) - local encodedcheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_encoded", "wins", 8) - local world = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_world_deck", "wins", 8) - local sun = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_sun_deck", "wins", 8) - local star = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_star_deck", "wins", 8) - local moon = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_moon_deck", "wins", 8) - - if Cryptid.gameset(G.P_CENTERS.b_cry_antimatter) == "madness" then - bluecheck = 1 - yellowcheck = 1 - abandonedcheck = 1 - ghostcheck = 1 - redcheck = 1 - checkeredcheck = 1 - erraticcheck = 1 - blackcheck = 1 - paintedcheck = 1 - greencheck = 1 - spookycheck = 1 - equilibriumcheck = 1 - misprintcheck = 1 - infinitecheck = 1 - wormholecheck = 1 - redeemedcheck = 1 - legendarycheck = 1 - encodedcheck = 1 - world = 1 - sun = 1 - star = 1 - moon = 1 - end - + function Cryptid.antimatter_apply(skip) --Blue Deck - if (bluecheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_blue", "wins", 8) or 0 ~= 0) or skip + then G.GAME.starting_params.hands = G.GAME.starting_params.hands + 1 end --All Consumables (see Cryptid.get_antimatter_consumables) - local querty = Cryptid.get_antimatter_consumables() + local querty = Cryptid.get_antimatter_consumables(nil, skip) if #querty > 0 then delay(0.4) G.E_MANAGER:add_event(Event({ @@ -583,23 +747,33 @@ local antimatter = { })) end --Yellow Deck - if (yellowcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_yellow", "wins", 8) or 0) ~= 0 + or skip + then G.GAME.starting_params.dollars = G.GAME.starting_params.dollars + 10 end --Abandoned Deck - if (abandonedcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_abandoned", "wins", 8) or 0) ~= 0 + or skip + then G.GAME.starting_params.no_faces = true end --Ghost Deck - if (ghostcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_ghost", "wins", 8) or 0) ~= 0 or skip + then G.GAME.spectral_rate = 2 end -- Red Deck - if (redcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_red", "wins", 8) or 0) ~= 0 or skip + then G.GAME.starting_params.discards = G.GAME.starting_params.discards + 1 end -- All Decks with Vouchers (see Cryptid.get_antimatter_vouchers) - local vouchers = Cryptid.get_antimatter_vouchers() + local vouchers = Cryptid.get_antimatter_vouchers(nil, skip) if #vouchers > 0 then for k, v in pairs(vouchers) do if G.P_CENTERS[v] then @@ -615,7 +789,10 @@ local antimatter = { end end -- Checkered Deck - if (checkeredcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_checkered", "wins", 8) or 0) ~= 0 + or skip + then G.E_MANAGER:add_event(Event({ func = function() for k, v in pairs(G.playing_cards) do @@ -631,57 +808,89 @@ local antimatter = { })) end -- Erratic Deck - if (erraticcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_erratic", "wins", 8) or 0) ~= 0 + or skip + then G.GAME.starting_params.erratic_suits_and_ranks = true end -- Black Deck - if (blackcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_black", "wins", 8) or 0) ~= 0 or skip + then G.GAME.starting_params.joker_slots = G.GAME.starting_params.joker_slots + 1 end -- Painted Deck - if (paintedcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_painted", "wins", 8) or 0) ~= 0 + or skip + then G.GAME.starting_params.hand_size = G.GAME.starting_params.hand_size + 2 end -- Green Deck - if (greencheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_green", "wins", 8) or 0) ~= 0 or skip + then G.GAME.modifiers.money_per_hand = (G.GAME.modifiers.money_per_hand or 1) + 1 G.GAME.modifiers.money_per_discard = (G.GAME.modifiers.money_per_discard or 0) + 1 end -- Spooky Deck - if (spookycheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_spooky", "wins", 8) or 0) + ~= 0 + or skip + then G.GAME.modifiers.cry_spooky = true G.GAME.modifiers.cry_curse_rate = 0 - --[[ - G.E_MANAGER:add_event(Event({ - func = function() - if G.jokers then - local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_cry_chocolate_dice") - card:add_to_deck() - card:start_materialize() - G.jokers:emplace(card) - return true - end - end, - })) - ]] - -- + if Cryptid.enabled("j_cry_chocolate_dice") == true then + G.E_MANAGER:add_event(Event({ + func = function() + if G.jokers then + local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_cry_chocolate_dice") + card:add_to_deck() + card:start_materialize() + G.jokers:emplace(card) + return true + end + end, + })) + end end -- Deck of Equilibrium - if (equilibriumcheck or 0) ~= 0 then + if + ( + Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_equilibrium", "wins", 8) + or 0 + ) + ~= 0 + or skip + then G.GAME.modifiers.cry_equilibrium = true end -- Misprint Deck - if (misprintcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_misprint", "wins", 8) or 0) + ~= 0 + or skip + then G.GAME.modifiers.cry_misprint_min = 1 G.GAME.modifiers.cry_misprint_max = 10 end -- Infinite Deck - if (infinitecheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_infinite", "wins", 8) or 0) + ~= 0 + or skip + then G.GAME.modifiers.cry_highlight_limit = 1e20 G.GAME.starting_params.hand_size = G.GAME.starting_params.hand_size + 1 end -- Wormhole deck - if (wormholecheck or 0) ~= 0 then + 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 @@ -700,24 +909,26 @@ local antimatter = { end end -- Redeemed deck - if (redeemedcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_redeemed", "wins", 8) or 0) + ~= 0 + or skip + then G.GAME.modifiers.cry_redeemed = true end - -- Deck of the Moon, Deck of the Sun, Deck of the Stars, Deck of the World - if (world or 0) ~= 0 then - G.GAME.bosses_used["bl_goad"] = 1e308 - end - if (star or 0) ~= 0 then - G.GAME.bosses_used["bl_window"] = 1e308 - end - if (sun or 0) ~= 0 then - G.GAME.bosses_used["bl_head"] = 1e308 - end - if (moon or 0) ~= 0 then - G.GAME.bosses_used["bl_club"] = 1e308 - end + --[[ + G.GAME.bosses_used["bl_goad"] = 1e308 + G.GAME.bosses_used["bl_window"] = 1e308 + G.GAME.bosses_used["bl_head"] = 1e308 + G.GAME.bosses_used["bl_club"] = 1e308 + ]] + -- --Legendary Deck - if (legendarycheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_legendary", "wins", 8) or 0) + ~= 0 + or skip + then G.E_MANAGER:add_event(Event({ func = function() if G.jokers then @@ -731,13 +942,18 @@ local antimatter = { })) end --Encoded Deck - if (encodedcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_encoded", "wins", 8) or 0) + ~= 0 + or skip + then G.E_MANAGER:add_event(Event({ func = function() if G.jokers then if G.P_CENTERS["j_cry_CodeJoker"] and (G.GAME.banned_keys and not G.GAME.banned_keys["j_cry_CodeJoker"]) + and Cryptid.enabled("j_cry_CodeJoker") == true then local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_cry_CodeJoker") card:add_to_deck() @@ -746,6 +962,7 @@ local antimatter = { end if G.P_CENTERS["j_cry_copypaste"] + and Cryptid.enabled("j_cry_copypaste") == true and (G.GAME.banned_keys and not G.GAME.banned_keys["j_cry_copypaste"]) then local card = create_card("Joker", G.jokers, nil, nil, nil, nil, "j_cry_copypaste") @@ -758,23 +975,28 @@ local antimatter = { end, })) end + --Beige Deck + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_beige", "wins", 8) or 0) ~= 0 + or skip + then + G.GAME.modifiers.cry_common_value_quad = true + end end - function Cryptid.antimatter_trigger_final_scoring(self, context) - local critcheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_critical", "wins", 8) - local plasmacheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_plasma", "wins", 8) - - if Cryptid.gameset(G.P_CENTERS.b_cry_antimatter) == "madness" then - critcheck = 1 - plasmacheck = 1 - end - + function Cryptid.antimatter_trigger_final_scoring(self, context, skip) if context.context == "final_scoring_step" then local crit_poll = pseudorandom(pseudoseed("cry_critical")) crit_poll = crit_poll / (G.GAME.probabilities.normal or 1) --Critical Deck - if (critcheck or 0) ~= 0 then + if + ( + Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_critical", "wins", 8) + or 0 + ) + ~= 0 + or skip + then if crit_poll < self.config.cry_crit_rate then context.mult = context.mult ^ 2 update_hand_text({ delay = 0 }, { mult = context.mult, chips = context.chips }) @@ -797,7 +1019,11 @@ local antimatter = { end --Plasma Deck local tot = context.chips + context.mult - if (plasmacheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_plasma", "wins", 8) or 0) + ~= 0 + or skip + then context.chips = math.floor(tot / 2) context.mult = math.floor(tot / 2) update_hand_text({ delay = 0 }, { mult = context.mult, chips = context.chips }) @@ -852,24 +1078,17 @@ local antimatter = { return context.chips, context.mult end end - - function Cryptid.antimatter_trigger(self, context) - local glowingcheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_glowing", "wins", 8) - local legendarycheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_legendary", "wins", 8) - local anaglyphcheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_anaglyph", "wins", 8) - - if Cryptid.gameset(G.P_CENTERS.b_cry_antimatter) == "madness" then - glowingcheck = 1 - legendarycheck = 1 - anaglyphcheck = 1 - end - + function Cryptid.antimatter_trigger(self, context, skip) if context.context == "eval" and Cryptid.safe_get(G.GAME, "last_blind", "boss") then --Glowing Deck - if (glowingcheck or 0) ~= 0 then + if + ( + Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_glowing", "wins", 8) + or 0 + ) + ~= 0 + or skip + then for i = 1, #G.jokers.cards do Cryptid.with_deck_effects(G.jokers.cards[i], function(card) Cryptid.misprintize(card, { min = 1.25, max = 1.25 }, nil, true) @@ -877,16 +1096,40 @@ local antimatter = { end end --Legendary Deck - if G.jokers and (legendarycheck or 0) ~= 0 then - if #G.jokers.cards < G.jokers.config.card_limit then - local legendary_poll = pseudorandom(pseudoseed("cry_legendary")) - legendary_poll = legendary_poll / (G.GAME.probabilities.normal or 1) - if legendary_poll < self.config.cry_legendary_rate then - local card = create_card("Joker", G.jokers, true, 4, nil, nil, nil, "") - card:add_to_deck() - card:start_materialize() - G.jokers:emplace(card) - return true + if G.jokers then + if + ( + Cryptid.safe_get( + G.PROFILES, + G.SETTINGS.profile, + "deck_usage", + "b_cry_legendary", + "wins", + 8 + ) or 0 + ) + ~= 0 + or skip + then + if #G.jokers.cards < G.jokers.config.card_limit then + local legendary_poll = pseudorandom(pseudoseed("cry_legendary")) + legendary_poll = legendary_poll / (G.GAME.probabilities.normal or 1) + if legendary_poll < self.config.cry_legendary_rate then + local card = create_card("Joker", G.jokers, true, 4, nil, nil, nil, "") + card:add_to_deck() + card:start_materialize() + G.jokers:emplace(card) + return true + else + card_eval_status_text( + G.jokers, + "jokers", + nil, + nil, + nil, + { message = localize("k_nope_ex"), colour = G.C.RARITY[4] } + ) + end else card_eval_status_text( G.jokers, @@ -894,22 +1137,17 @@ local antimatter = { nil, nil, nil, - { message = localize("k_nope_ex"), colour = G.C.RARITY[4] } + { message = localize("k_no_room_ex"), colour = G.C.RARITY[4] } ) end - else - card_eval_status_text( - G.jokers, - "jokers", - nil, - nil, - nil, - { message = localize("k_no_room_ex"), colour = G.C.RARITY[4] } - ) end end --Anaglyph Deck - if (anaglyphcheck or 0) ~= 0 then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_anaglyph", "wins", 8) or 0) + ~= 0 + or skip + then G.E_MANAGER:add_event(Event({ func = function() add_tag(Tag("tag_double")) @@ -921,19 +1159,15 @@ local antimatter = { end end end - - function Cryptid.get_antimatter_vouchers(voucher_table) + function Cryptid.get_antimatter_vouchers(voucher_table, skip) -- Create a table or use one that is passed into the function if not voucher_table or type(voucher_table) ~= "table" then voucher_table = {} end - local skip = (Cryptid.gameset(G.P_CENTERS.b_cry_antimatter) == "madness") - -- Add Vouchers into the table by key local function already_exists(t, voucher) for _, v in ipairs(t) do if v == voucher then - --print("sus") return true end end @@ -944,58 +1178,73 @@ local antimatter = { table.insert(t, voucher) end end - - local nebulacheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_nebula", "wins", 8) - local magiccheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_magic", "wins", 8) - local zodiaccheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_zodiac", "wins", 8) - local equilibriumcheck = - Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_equilibrium", "wins", 8) - --Nebula Deck - if (nebulacheck or 0) ~= 0 or skip then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_nebula", "wins", 8) or 0 ~= 0) + or skip + then Add_voucher_to_the_table(voucher_table, "v_telescope") end -- Magic Deck - if (magiccheck or 0) ~= 0 or skip then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_magic", "wins", 8) or 0 ~= 0) or skip + then Add_voucher_to_the_table(voucher_table, "v_crystal_ball") end - -- Zodiac Deck - if (zodiaccheck or 0) ~= 0 or skip then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_zodiac", "wins", 8) or 0 ~= 0) + or skip + then Add_voucher_to_the_table(voucher_table, "v_tarot_merchant") Add_voucher_to_the_table(voucher_table, "v_planet_merchant") Add_voucher_to_the_table(voucher_table, "v_overstock_norm") end -- Deck Of Equilibrium - if (equilibriumcheck or 0) ~= 0 or skip then + if + ( + Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_cry_equilibrium", "wins", 8) + or 0 ~= 0 + ) or skip + then Add_voucher_to_the_table(voucher_table, "v_overstock_norm") Add_voucher_to_the_table(voucher_table, "v_overstock_plus") end return voucher_table end --Does this even need to be a function idk - function Cryptid.get_antimatter_consumables(consumable_table) - local skip = (Cryptid.gameset(G.P_CENTERS.b_cry_antimatter) == "madness") + function Cryptid.get_antimatter_consumables(consumable_table, skip) if not consumable_table or type(consumable_table) ~= "table" then consumable_table = {} end - - -- Add Consumables into the table by key - - local magiccheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_magic", "wins", 8) - local ghostcheck = Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_ghost", "wins", 8) - - if (magiccheck or 0) ~= 0 or skip then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_magic", "wins", 8) or 0 ~= 0) or skip + then table.insert(consumable_table, "c_fool") table.insert(consumable_table, "c_fool") end - if (ghostcheck or 0) ~= 0 or skip then + if + (Cryptid.safe_get(G.PROFILES, G.SETTINGS.profile, "deck_usage", "b_ghost", "wins", 8) or 0 ~= 0) or skip + then table.insert(consumable_table, "c_hex") end - return consumable_table end end, + unlocked = false, + check_for_unlock = function(self, args) + if args.type == "win_deck" then + if get_deck_win_stake("b_cry_blank") > 0 and get_deck_win_stake() >= 8 then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } return { diff --git a/Cryptid/items/enhanced.lua b/Cryptid/items/enhanced.lua index 5da3108..8c75dbb 100644 --- a/Cryptid/items/enhanced.lua +++ b/Cryptid/items/enhanced.lua @@ -119,6 +119,20 @@ local e_deck = { end, })) end, + unlocked = false, + check_for_unlock = function(self, args) + if args.type == "discover_amount" then + if G.DISCOVER_TALLIES.editions.tally / G.DISCOVER_TALLIES.editions.of >= 1 then + unlock_card(self) + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local et_deck = { object_type = "Back", @@ -150,6 +164,18 @@ local et_deck = { })) end, draw = cry_edeck_draw, + unlocked = false, + check_for_unlock = function(self, args) + if args.cry_used_consumable == "c_cry_vacuum" then + unlock_card(self) + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local sk_deck = { object_type = "Back", @@ -189,6 +215,18 @@ local sk_deck = { end, })) end, + unlocked = false, + check_for_unlock = function(self, args) + if args.cry_used_consumable == "c_cry_lock" then + unlock_card(self) + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local st_deck = { object_type = "Back", @@ -228,6 +266,18 @@ local st_deck = { end, })) end, + unlocked = false, + check_for_unlock = function(self, args) + if args.cry_used_consumable == "c_cry_replica" then + unlock_card(self) + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local sl_deck = { object_type = "Back", @@ -258,6 +308,18 @@ local sl_deck = { end, })) end, + unlocked = false, + check_for_unlock = function(self, args) + if args.cry_used_consumable == "c_cry_typhoon" then + unlock_card(self) + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } return { @@ -272,43 +334,9 @@ return { -- D Invisible Joker if - center.name == "Fortune Teller" - or center.name == "Shoot the Moon" - or center.name == "Riff-raff" - or center.name == "Chaos the Clown" - or center.name == "Dusk" - or center.name == "Mime" - or center.name == "Hack" - or center.name == "Sock and Buskin" - or center.name == "Invisible Joker" - or center.name == "Swashbuckler" - or center.name == "Smeared Joker" - or center.name == "Certificate" - or center.name == "Mr. Bones" - or center.name == "Diet Cola" - or center.name == "Luchador" - or center.name == "Midas Mask" - or center.name == "Shortcut" - or center.name == "Seance" - or center.name == "Superposition" - or center.name == "Sixth Sense" - or center.name == "DNA" - or center.name == "Splash" - or center.name == "Supernova" - or center.name == "Pareidolia" - or center.name == "Raised Fist" - or center.name == "Marble Joker" - or center.name == "Four Fingers" - or center.name == "Joker Stencil" - or center.name == "Showman" - or center.name == "Blueprint" - or center.name == "Oops! All 6s" - or center.name == "Brainstorm" - or center.name == "Cartomancer" - or center.name == "Astronomer" - or center.name == "Burnt Joker" - or center.name == "Chicot" - or center.name == "Perkeo" + center + and center.name + == ("Fortune Teller" or "Shoot the Moon" or "Riff-raff" or "Chaos the Clown" or "Dusk" or "Mime" or "Hack" or "Sock and Buskin" or "Invisible Joker" or "Swashbuckler" or "Smeared Joker" or "Certificate" or "Mr. Bones" or "Diet Cola" or "Luchador" or "Midas Mask" or "Shortcut" or "Seance" or "Superposition" or "Sixth Sense" or "DNA" or "Splash" or "Supernova" or "Pareidolia" or "Raised Fist" or "Marble Joker" or "Four Fingers" or "Joker Stencil" or "Showman" or "Blueprint" or "Oops! All 6s" or "Brainstorm" or "Cartomancer" or "Astronomer" or "Burnt Joker" or "Chicot" or "Perkeo") then self.config.center.immutable = true end diff --git a/Cryptid/items/epic.lua b/Cryptid/items/epic.lua index 5e35fbd..831664d 100644 --- a/Cryptid/items/epic.lua +++ b/Cryptid/items/epic.lua @@ -398,11 +398,6 @@ local error_joker = { "set_cry_epic", }, }, - conflicts = { - mods = { - "jen", - }, - }, immutable = true, rarity = "cry_epic", cost = 1, @@ -599,6 +594,7 @@ local error_joker = { { string = "Jolly", colour = G.C.CRY_JOLLY }, { string = "Tags", colour = G.C.RED }, { string = "Cryptids", colour = G.C.SECONDARY_SET.Spectral }, + { string = "Glop", colour = G.C.CRY_ALTGREENGRADIENT }, { string = "%%ERROR", colour = G.C.CRY_ASCENDANT }, --temp string, this will be modified } @@ -939,7 +935,6 @@ local double_scale = { atlas = "atlasepic", --todo: support jokers that scale multiple variables cry_scale_mod = function(self, card, joker, orig_scale_scale, true_base, orig_scale_base, new_scale_base) - print(orig_scale_scale, true_base, orig_scale_base, new_scale_base) if Cryptid.gameset(self) == "exp_modest" then return true_base * 2 end @@ -1228,11 +1223,6 @@ local curse_sob = { gameset_config = { modest = { cost = 20, center = { rarity = 4 } }, }, - conflicts = { - mods = { - "jen", - }, - }, rarity = "cry_epic", cost = 9, order = 82, @@ -1355,7 +1345,7 @@ local bonusjoker = { atlas = "atlasepic", calculate = function(self, card, context) if context.individual and context.cardarea == G.play then - if context.other_card.ability.effect == "Bonus Card" then + if SMODS.has_enhancement(context.other_card, "m_bonus") then if pseudorandom("bonusjoker") < cry_prob(card.ability.cry_prob, card.ability.extra.odds, card.ability.cry_rigged) / card.ability.extra.odds @@ -1442,7 +1432,7 @@ local multjoker = { calculate = function(self, card, context) if context.individual and context.cardarea == G.play then if - context.other_card.ability.effect == "Mult Card" + SMODS.has_enhancement(context.other_card, "m_mult") and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then if @@ -1512,7 +1502,7 @@ local goldjoker = { end, calculate = function(self, card, context) if context.cardarea == G.play and context.individual and not context.blueprint then - if context.other_card.ability.effect == "Gold Card" then + if SMODS.has_enhancement(context.other_card, "m_gold") then card.ability.extra.percent = card.ability.extra.percent + card.ability.extra.percent_mod return { extra = { focus = card, message = localize("k_upgrade_ex") }, @@ -1522,7 +1512,7 @@ local goldjoker = { end end if context.individual and context.cardarea == G.play then - if context.other_card.ability.effect == "Gold Card" then + if SMODS.has_enhancement(context.other_card, "m_gold") then card.ability.extra.percent = card.ability.extra.percent + card.ability.extra.percent_mod return { message = localize("k_upgrade_ex"), @@ -1871,7 +1861,12 @@ local spectrogram = { end end - if context.retrigger_joker_check and not context.retrigger_joker and context.other_card ~= self then + if + context.retrigger_joker_check + and not context.retrigger_joker + and context.other_card == G.jokers.cards[#G.jokers.cards] + and context.other_card ~= self + then if card.ability.extra.echonum and card.ability.extra.echonum > 0 then return { message = localize("k_again_ex"), @@ -1936,6 +1931,164 @@ local jtron = { code = { "candycanearter" }, }, } +-- Retriggers steels every 2nd hand, scaling xmult every 3rd hand, first card to steel every 5th hand, stronger steels every 7th hand +local clockwork = { -- Steel Support: The Joker + object_type = "Joker", + dependencies = { + items = { + "set_cry_epic", + }, + }, + name = "cry-clockwork", + key = "clockwork", + pos = { x = 5, y = 5 }, + config = { + limits = { l1 = 2, l2 = 3, l3 = 5, l4 = 7 }, + counters = { c1 = 0, c2 = 0, c3 = 0, c4 = 0 }, + extra = { xmult = 1, xmult_mod = 0.25, steelenhc = 1, steel_mod = 0.1 }, + }, + order = 135, + immutable = false, + rarity = "cry_epic", + cost = 12, + blueprint_compat = true, + atlas = "atlasone", + enhancement_gate = "m_steel", -- lucky joker uses this? hopefully it works + loc_vars = function(self, info_queue, center) + local function process_var(m, cap) + if m >= cap - 1 then + return localize("k_active_ex") + end + return cap - m - 1 + end + return { + vars = { + process_var(center.ability.counters.c1, center.ability.limits.l1), + process_var(center.ability.counters.c2, center.ability.limits.l2), + process_var(center.ability.counters.c3, center.ability.limits.l3), + process_var(center.ability.counters.c4, center.ability.limits.l4), + center.ability.extra.xmult, + center.ability.extra.xmult_mod, + center.ability.extra.steelenhc, + center.ability.extra.steel_mod, + center.ability.limits.l1, + center.ability.limits.l2, + center.ability.limits.l3, + center.ability.limits.l4, + }, + } + end, + calculate = function(self, card, context) + if context.before and context.cardarea == G.jokers and not context.blueprint and not context.retrigger then + local function clamp(c, l) + local m = c + 1 + if c + 1 >= l then + return 0 + end + return m + end + + card.ability.counters.c1 = clamp(card.ability.counters.c1, card.ability.limits.l1) -- ticker 1 + + card.ability.counters.c2 = clamp(card.ability.counters.c2, card.ability.limits.l2) -- ticker 2 + if card.ability.counters.c2 == 0 then + card.ability.extra.xmult = card.ability.extra.xmult + card.ability.extra.xmult_mod + end + + card.ability.counters.c3 = clamp(card.ability.counters.c3, card.ability.limits.l3) -- ticker 3 + + card.ability.counters.c4 = clamp(card.ability.counters.c4, card.ability.limits.l4) -- ticker 4 + if card.ability.counters.c4 == 0 then + card.ability.extra.steelenhc = card.ability.extra.steelenhc + card.ability.extra.steel_mod + end + end + if context.repetition and context.cardarea == G.hand and card.ability.counters.c1 == 0 then -- effect 1 + if SMODS.has_enhancement(context.other_card, "m_steel") then + return { + message = localize("k_again_ex"), + repetitions = 1, + card = card, + } + end + end + if + context.joker_main and context.cardarea == G.jokers -- effect 2 + then + return { xmult = card.ability.extra.xmult } + end + if + context.before + and context.cardarea == G.jokers + and not context.blueprint_card + and not context.retrigger_joker + and card.ability.counters.c3 == 0 + then -- effect 3 + context.full_hand[1]:set_ability(G.P_CENTERS["m_steel"], nil, true) + end + if + context.individual + and context.cardarea == G.hand + and not context.end_of_round + and SMODS.has_enhancement(context.other_card, "m_steel") + and card.ability.extra.steelenhc ~= 1 + then + if context.other_card.debuff then + return { + message = localize("k_debuffed"), + colour = G.C.RED, + card = card, + } + else -- effect 4 + return { xmult = card.ability.extra.steelenhc } + end + end + --imo this secret effect can be madness only -Math + if + context.after + and context.cardarea == G.jokers + and not context.blueprint_card + and not context.retrigger_joker + then -- The Clockwork Joker is canonically a non-binary self-replicating machine amoeba, that self replicates every 21 minutes. Their pronouns are any/all; they are several billion tiny jokers + if -- in a trench coat, constantly ticking in an almost perfect yet flawed mechanism. Its only purpose is the strengthening and spreading of the steel world; everything else is meaningless to it. + card.ability.counters.c1 == 0 -- lore by nova :3 + and card.ability.counters.c2 == 0 + and card.ability.counters.c3 == 0 + and card.ability.counters.c4 == 0 + then + G.E_MANAGER:add_event(Event({ + func = function() + local m = copy_card(card) + m:add_to_deck() + G.jokers:emplace(m) + return true + end, + })) + return { + message = localize("k_duplicated_ex"), + card = card, + } + end + end + end, + set_ability = function(self, card, initial, delay_sprites) + card.ability.counters.c1 = math.floor(pseudorandom("Clockwork1") * (card.ability.limits.l1 - 1) + 0.5) + card.ability.counters.c2 = math.floor(pseudorandom("Clockwork2") * (card.ability.limits.l2 - 1) + 0.5) + card.ability.counters.c3 = math.floor(pseudorandom("Clockwork3") * (card.ability.limits.l3 - 1) + 0.5) + card.ability.counters.c4 = math.floor(pseudorandom("Clockwork4") * (card.ability.limits.l4 - 1) + 0.5) + end, + cry_credits = { + idea = { + "cassknows", + }, + code = { + "Nova", + "Math", + }, + art = { + "unexian", + }, + }, +} return { name = "Epic Jokers", items = { @@ -1963,5 +2116,6 @@ return { fleshpanopticon, spectrogram, jtron, + clockwork, }, } diff --git a/Cryptid/items/exotic.lua b/Cryptid/items/exotic.lua index 53d9e47..6724f34 100644 --- a/Cryptid/items/exotic.lua +++ b/Cryptid/items/exotic.lua @@ -784,7 +784,7 @@ local stella_mortis = { type = "variable", key = "a_powmult", vars = { - number_format(to_big(card.ability.extra.Emult + card.ability.extra.Emult_mod * quota)), + number_format(to_big(card.ability.extra.Emult)), }, }), }) @@ -831,6 +831,7 @@ local circulus_pistoris = { cost = 10 * math.pi, order = 509, blueprint_compat = true, + immutable = true, atlas = "atlasexotic", soul_pos = { x = 2, y = 3, extra = { x = 1, y = 3 } }, loc_vars = function(self, info_queue, center) @@ -916,78 +917,6 @@ local aequilibrium = { return nil, true end end, - --[[ - add_to_deck = function(self, card, from_debuff) - if not from_debuff then - if card.ability.extra.card then - card.ability.extra.card = nil - end - card.ability.extra.card = - Card(G.jokers.T.x, G.jokers.T.y, G.CARD_W * 0.675, G.CARD_H * 0.675, G.P_CARDS.S_A, G.P_CENTERS.c_base) - --G.hand:emplace(card.ability.extra.card) - --card.ability.extra.card:set_card_area(G.hand) - card.ability.extra.card:start_materialize({ G.C.WHITE, G.C.WHITE }, nil, 1.2) - card.ability.extra.card:set_seal("Gold", true, true) - card.ability.extra.card:set_edition({ cry_glitched = true }, true) - --card.ability.extra.card.T.x = card.T.x - - if card.ability.extra.card and G.P_CENTERS.j_blueprint.unlocked then - local viable_unlockables = {} - for k, v in ipairs(G.P_LOCKED) do - if (v.set == "Voucher" or v.set == "Joker") and not v.demo then - viable_unlockables[#viable_unlockables + 1] = v - end - end - if #viable_unlockables > 0 then - local card2 = card.ability.extra.card - G.E_MANAGER:add_event(Event({ - trigger = "after", - delay = 4.04, - func = function() - card2 = Card( - G.jokers.T.x, - G.jokers.T.y, - G.CARD_W * 0.675, - G.CARD_H * 0.675, - nil, - pseudorandom_element(viable_unlockables) or self.P_CENTERS.j_joker - ) - card2.no_ui = #viable_unlockables == 0 - card2.states.visible = false - card.ability.extra.card.parent = nil - card.ability.extra.card:start_dissolve({ G.C.BLACK, G.C.ORANGE, G.C.RED, G.C.GOLD }) - return true - end, - })) - G.E_MANAGER:add_event(Event({ - trigger = "after", - delay = 1.04, - func = function() - card2:start_materialize() - --G.:emplace(card) - return true - end, - })) - end - end - end - end, - --Known bug: card does not reappear after save reopened - update = function(self, card, front) - if card.ability.extra.card then - if card.ability.extra.card.states and not card.ability.extra.card.states.drag.is then - card.ability.extra.card.T.x = card.T.x + card.T.w / 5 - card.ability.extra.card.T.y = card.T.y + card.T.h / 5 - end - end - end, - remove_from_deck = function(self, card, from_debuff) - if not from_debuff and card.ability.extra.card then - card.ability.extra.card:start_dissolve() - end - end, - ]] - -- cry_credits = { idea = { "Elial2" }, art = { "Elial2", "unexian", "hydro" }, @@ -1509,34 +1438,6 @@ local items = { } return { name = "Exotic Jokers", - init = function() - --I have no clue what this patch does - local cc = copy_card - function copy_card(card, a, b, c, d) - local m - if - card - and card.ability - and card.ability.extra - and type(card.ability.extra) == "table" - and card.ability.extra.card - then - m = card.ability.extra.card - card.ability.extra.card = nil - end - local ret = cc(card, a, b, c, d) - if - card - and card.ability - and card.ability.extra - and type(card.ability.extra) == "table" - and card.ability.extra.card - and m - then - card.ability.extra.card = m - end - return ret - end - end, + init = function() end, items = items, } diff --git a/Cryptid/items/joker_display.lua b/Cryptid/items/joker_display.lua index e4882c3..0fa5313 100644 --- a/Cryptid/items/joker_display.lua +++ b/Cryptid/items/joker_display.lua @@ -223,13 +223,34 @@ if JokerDisplay then JokerDisplay.Definitions["j_cry_kidnap"] = { text = { { text = "+$" }, - { ref_table = "card.ability.extra", ref_value = "money" }, + { ref_table = "card.joker_display_values", ref_value = "extra" }, }, text_config = { colour = G.C.GOLD }, reminder_text = { { ref_table = "card.joker_display_values", ref_value = "localized_text" }, }, calc_function = function(card) + local abc = 0 + if G.GAME and G.GAME.jokers_sold then + for _, v in ipairs(G.GAME.jokers_sold) do + if + G.P_CENTERS[v].effect == "Type Mult" + or G.P_CENTERS[v].effect == "Cry Type Mult" + or G.P_CENTERS[v].effect == "Cry Type Chips" + or G.P_CENTERS[v].effect == "Boost Kidnapping" + or ( + G.P_CENTERS[v].name == "Sly Joker" + or G.P_CENTERS[v].name == "Wily Joker" + or G.P_CENTERS[v].name == "Clever Joker" + or G.P_CENTERS[v].name == "Devious Joker" + or G.P_CENTERS[v].name == "Crafty Joker" + ) + then + abc = abc + 1 + end + end + end + card.joker_display_values.extra = card.ability.extra * abc card.joker_display_values.localized_text = "(" .. localize("k_round") .. ")" end, } diff --git a/Cryptid/items/m.lua b/Cryptid/items/m.lua index 0ff9bcc..952f144 100644 --- a/Cryptid/items/m.lua +++ b/Cryptid/items/m.lua @@ -1061,7 +1061,7 @@ local smallestm = { --This isn't retrigger joker compatible for some reason if context.scoring_name == card.ability.extra.type then local tag = Tag("tag_cry_double_m") - tag.ability.shiny = cry_rollshinybool() + tag.ability.shiny = Cryptid.is_shiny() add_tag(tag) play_sound("generic1", 0.9 + math.random() * 0.1, 0.8) play_sound("holo1", 1.2 + math.random() * 0.1, 0.4) @@ -1443,7 +1443,7 @@ local longboi = { } end end, - set_ability = function(self, card, from_debuff) + set_ability = function(self, card, initial, delay_sprites) card.ability.extra.monster = G.GAME and G.GAME.monstermult or 1 if card.ability.extra.monster >= 1234567654321 then card.children.center:set_sprite_pos({ x = 7, y = 5 }) @@ -1482,6 +1482,7 @@ local ret_items = { smallestm, biggestm, mprime, + scrabble, } --retriggering system for M Vouchers function Cryptid.get_m_retriggers(self, card, context) diff --git a/Cryptid/items/misc.lua b/Cryptid/items/misc.lua index b6f7e67..63e863e 100644 --- a/Cryptid/items/misc.lua +++ b/Cryptid/items/misc.lua @@ -41,7 +41,7 @@ local meme1 = { and not (G.GAME.used_jokers["j_cry_waluigi"] and not next(find_joker("Showman"))) then if pseudorandom("meme1_" .. G.GAME.round_resets.ante) > 0.997 then - return create_card(nil, G.pack_cards, nil, nil, true, true, "j_cry_waluigi", nil) + return create_card("Meme", G.pack_cards, nil, nil, true, true, "j_cry_waluigi", nil) end end return create_card("Meme", G.pack_cards, nil, nil, true, true, nil, "cry_meme") @@ -98,7 +98,7 @@ local meme2 = { and not (G.GAME.used_jokers["j_cry_waluigi"] and not next(find_joker("Showman"))) then if pseudorandom("memetwo_" .. G.GAME.round_resets.ante) > 0.997 then - return create_card(nil, G.pack_cards, nil, nil, true, true, "j_cry_waluigi", nil) + return create_card("Meme", G.pack_cards, nil, nil, true, true, "j_cry_waluigi", nil) end end return create_card("Meme", G.pack_cards, nil, nil, true, true, nil, "cry_memetwo") @@ -155,7 +155,7 @@ local meme3 = { and not (G.GAME.used_jokers["j_cry_waluigi"] and not next(find_joker("Showman"))) then if pseudorandom("memethree_" .. G.GAME.round_resets.ante) > 0.997 then - return create_card(nil, G.pack_cards, nil, nil, true, true, "j_cry_waluigi", nil) + return create_card("Meme", G.pack_cards, nil, nil, true, true, "j_cry_waluigi", nil) end end return create_card("Meme", G.pack_cards, nil, nil, true, true, nil, "cry_memethree") @@ -340,7 +340,7 @@ local oversat = { end, })) update_hand_text({ delay = 1.3 }, { mult = G.GAME.hands[hand].mult, StatusText = true }) - elseif hand == G.handlist[#G.handlist] then + elseif Aurinko.VerboseMode then G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.2, @@ -350,7 +350,10 @@ local oversat = { return true end, })) - update_hand_text({ delay = 1.3 }, { chips = (amount > 0 and "++" or "--"), StatusText = true }) + update_hand_text( + { delay = 1.3 }, + { chips = (to_big(amount) > to_big(0) and "++" or "--"), StatusText = true } + ) G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.2, @@ -360,7 +363,10 @@ local oversat = { return true end, })) - update_hand_text({ delay = 1.3 }, { mult = (amount > 0 and "++" or "--"), StatusText = true }) + update_hand_text( + { delay = 1.3 }, + { mult = (to_big(amount) > to_big(0) and "++" or "--"), StatusText = true } + ) end end end, @@ -570,7 +576,7 @@ local glitched = { StatusText = true, }) update_hand_text({ delay = 1.3 }, { mult = G.GAME.hands[hand].mult }) - elseif hand == G.handlist[#G.handlist] then + elseif Aurinko.VerboseMode then G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.2, @@ -938,6 +944,90 @@ local noisy = { desc_nodes[#desc_nodes + 1] = chip_ui end, init = function(self) + local randtext = { + "A", + "B", + "C", + "D", + "E", + "F", + "G", + "H", + "I", + "J", + "K", + "L", + "M", + "N", + "O", + "P", + "Q", + "R", + "S", + "T", + "U", + "V", + "W", + "X", + "Y", + "Z", + " ", + "a", + "b", + "c", + "d", + "e", + "f", + "g", + "h", + "i", + "j", + "k", + "l", + "m", + "n", + "o", + "p", + "q", + "r", + "s", + "t", + "u", + "v", + "w", + "x", + "y", + "z", + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "+", + "-", + "?", + "!", + "$", + "%", + "[", + "]", + "(", + ")", + } + + local function obfuscatedtext(length) + local str = "" + for i = 1, length do + str = str .. randtext[math.random(#randtext)] + end + return str + end + AurinkoAddons.cry_noisy = function(card, hand, instant, amount) local modc = pseudorandom("cry_noisy_chips_aurinko", noisy_stats.min.chips, noisy_stats.max.chips) local modm = pseudorandom("cry_noisy_mult_aurinko", noisy_stats.min.mult, noisy_stats.max.mult) @@ -959,10 +1049,10 @@ local noisy = { return true end, })) - update_hand_text( - { delay = 0 }, - { chips = (amount > to_big(0) and "+" or "-") .. number_format(math.abs(modc)), StatusText = true } - ) + update_hand_text({ delay = 0 }, { + chips = (to_big(amount) > to_big(0) and "+" or "-") .. number_format(math.abs(modc)), + StatusText = true, + }) update_hand_text({ delay = 1.3 }, { chips = G.GAME.hands[hand].chips }) for i = 1, math.random(2, 4) do update_hand_text( @@ -979,10 +1069,10 @@ local noisy = { return true end, })) - update_hand_text( - { delay = 0 }, - { mult = (amount > to_big(0) and "+" or "-") .. number_format(math.abs(modm)), StatusText = true } - ) + update_hand_text({ delay = 0 }, { + mult = (to_big(amount) > to_big(0) and "+" or "-") .. number_format(math.abs(modm)), + StatusText = true, + }) update_hand_text({ delay = 1.3 }, { mult = G.GAME.hands[hand].mult }) elseif hand == G.handlist[#G.handlist] then G.E_MANAGER:add_event(Event({ @@ -994,7 +1084,10 @@ local noisy = { return true end, })) - update_hand_text({ delay = 1.3 }, { chips = (amount > 0 and "+" or "-") .. "???", StatusText = true }) + update_hand_text( + { delay = 1.3 }, + { chips = (to_big(amount) > to_big(0) and "+" or "-") .. "???", StatusText = true } + ) G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.2, @@ -1004,7 +1097,10 @@ local noisy = { return true end, })) - update_hand_text({ delay = 1.3 }, { mult = (amount > 0 and "+" or "-") .. "???", StatusText = true }) + update_hand_text( + { delay = 1.3 }, + { mult = (to_big(amount) > to_big(0) and "+" or "-") .. "???", StatusText = true } + ) end end end, @@ -1094,18 +1190,12 @@ local jollyedition = { gcui(_c, full_UI_table, specific_vars, card_type, badges, hide_desc, main_start, main_end, card) if card - and card.edition - and card.edition.cry_m - and (not card.ability or card.ability.set ~= "Edition") - and full_UI_table - and full_UI_table.name - and type(full_UI_table.name) == "table" - and full_UI_table.name[1] - and full_UI_table.name[1].config - and full_UI_table.name[1].config.object - and full_UI_table.name[1].config.object.config + and Cryptid.safe_get(card, "edition", "cry_m") + and ((not card.ability) or card.ability.set ~= "Edition") + and type(Cryptid.safe_get(full_UI_table, "name")) == "table" + and Cryptid.safe_get(full_UI_table.name, 1, "nodes", 1, "config", "object", "config") then - local conf = full_UI_table.name[1].config.object.config + local conf = full_UI_table.name[1].nodes[1].config.object.config if conf.string and #conf.string > 0 then local function m_ify_word(text) -- Define a pattern for vowels @@ -1140,8 +1230,8 @@ local jollyedition = { return result end conf.string[1] = m_ify(conf.string[1]) - full_UI_table.name[1].config.object:remove() - full_UI_table.name[1].config.object = DynaText(conf) + full_UI_table.name[1].nodes[1].config.object:remove() + full_UI_table.name[1].nodes[1].config.object = DynaText(conf) end end return full_UI_table @@ -1216,7 +1306,7 @@ local glass_edition = { then if not card.ability.eternal - and ( + and not ( pseudorandom(pseudoseed("cry_fragile")) > ((self.config.shatter_chance - 1) / self.config.shatter_chance) ) @@ -1440,147 +1530,6 @@ local double_sided = { end, })) end - local use_and_sell_buttonsref = G.UIDEF.use_and_sell_buttons - function G.UIDEF.use_and_sell_buttons(card) - local retval = use_and_sell_buttonsref(card) - if - card.area - and card.edition - and (card.area == G.jokers or card.area == G.consumeables or card.area == G.hand) - and card.edition.cry_double_sided - and not Card.no(card, "dbl") - then - local use = { - n = G.UIT.C, - config = { align = "cr" }, - nodes = { - { - n = G.UIT.C, - config = { - ref_table = card, - align = "cr", - maxw = 1.25, - padding = 0.1, - r = 0.08, - hover = true, - shadow = true, - colour = G.C.UI.BACKGROUND_INACTIVE, - one_press = true, - button = "flip", - func = "can_flip_card", - }, - nodes = { - { n = G.UIT.B, config = { w = 0.1, h = 0.3 } }, - { - n = G.UIT.T, - config = { - text = localize("b_flip"), - colour = G.C.UI.TEXT_LIGHT, - scale = 0.3, - shadow = true, - }, - }, - }, - }, - }, - } - local m = retval.nodes[1] - if not card.added_to_deck then - use.nodes[1].nodes = { use.nodes[1].nodes[2] } - if card.ability.consumeable then - m = retval - end - end - m.nodes = m.nodes or {} - table.insert(m.nodes, { n = G.UIT.R, config = { align = "cl" }, nodes = { - use, - } }) - return retval - end - if - card.area - and (card.area == G.jokers or card.area == G.consumeables or card.area == G.hand) - and (not card.edition or not card.edition.cry_double_sided) - and not card.ability.eternal - and not Card.no(card, "dbl") - then - for i = 1, #card.area.cards do - if card.area.cards[i].edition and card.area.cards[i].edition.cry_double_sided then - local use = { - n = G.UIT.C, - config = { align = "cr" }, - nodes = { - { - n = G.UIT.C, - config = { - ref_table = card, - align = "cr", - maxw = 1.25, - padding = 0.1, - r = 0.08, - hover = true, - shadow = true, - colour = G.C.UI.BACKGROUND_INACTIVE, - one_press = true, - button = "flip_merge", - func = "can_flip_merge_card", - }, - nodes = { - { n = G.UIT.B, config = { w = 0.1, h = 0.3 } }, - { - n = G.UIT.T, - config = { - text = localize("b_merge"), - colour = G.C.UI.TEXT_LIGHT, - scale = 0.3, - shadow = true, - }, - }, - }, - }, - }, - } - local m = retval.nodes[1] - if not card.added_to_deck then - use.nodes[1].nodes = { use.nodes[1].nodes[2] } - if card.ability.consumeable then - m = retval - end - end - m.nodes = m.nodes or {} - table.insert(m.nodes, { n = G.UIT.R, config = { align = "cl" }, nodes = { - use, - } }) - return retval - end - end - end - return retval - end - local cupd = Card.update - function Card:update(dt) - cupd(self, dt) - if self.area then - if self.area.config.type == "discard" or self.area.config.type == "deck" then - return --prevent lagging event queues with unneeded flips - end - end - if self.sprite_facing == "back" and self.edition and self.edition.cry_double_sided then - self.sprite_facing = "front" - self.facing = "front" - if self.flipping == "f2b" then - self.flipping = "b2f" - end - self:dbl_side_flip() - end - if self.ability.cry_absolute then -- feedback loop... may be problematic - self.cry_absolute = true - end - if self.cry_absolute then - self.ability.cry_absolute = true - self.ability.eternal = true - end - end function Cryptid.copy_dbl_card(C, c, deck_effects) if not deck_effects then Cdeck = C.added_to_deck @@ -2057,7 +2006,12 @@ local azure_seal = { pos = { x = 0, y = 2 }, -- This is still quite jank calculate = function(self, card, context) - if context.destroying_card and not card.will_shatter then + if context.destroying_card and not card.will_shatter and context.cardarea == G.play then + for i, cards in ipairs(context.full_hand) do + if cards ~= card then + return + end + end card.will_shatter = true G.E_MANAGER:add_event(Event({ trigger = "before", @@ -2130,6 +2084,7 @@ local typhoon = { pos = { x = 0, y = 4 }, use = function(self, card, area, copier) --Good enough local used_consumable = copier or card + check_for_unlock({ cry_used_consumable = "c_cry_typhoon" }) for i = 1, #G.hand.highlighted do local highlighted = G.hand.highlighted[i] G.E_MANAGER:add_event(Event({ @@ -2224,8 +2179,8 @@ local miscitems = { blessing, typhoon, azure_seal, - double_sided, - meld, + --double_sided, + --meld, absolute, light, seraph, diff --git a/Cryptid/items/misc_joker.lua b/Cryptid/items/misc_joker.lua index 14e531a..6797dfb 100644 --- a/Cryptid/items/misc_joker.lua +++ b/Cryptid/items/misc_joker.lua @@ -221,7 +221,7 @@ local potofjokes = { }, name = "cry-Pot of Jokes", key = "pot_of_jokes", - config = { extra = { h_size = -2, h_mod = 1 } }, + config = { extra = { h_size = -2, h_mod = 1 }, immutable = { h_added = 0, h_mod_max = 1000 } }, pos = { x = 5, y = 0 }, rarity = 3, order = 104, @@ -234,13 +234,39 @@ local potofjokes = { center.ability.extra.h_size < 0 and center.ability.extra.h_size or "+" .. math.min(1000, center.ability.extra.h_size), center.ability.extra.h_mod, + "+" .. center.ability.immutable.h_mod_max, }, } end, calculate = function(self, card, context) if context.end_of_round and not context.individual and not context.repetition and not context.blueprint then - G.hand:change_size(math.min(math.max(0, 1000 - card.ability.extra.h_size), card.ability.extra.h_mod)) + if + to_big(card.ability.extra.h_size) + to_big(card.ability.extra.h_mod) + >= to_big(card.ability.immutable.h_mod_max) + then + card.ability.extra.h_size = card.ability.immutable.h_mod_max + card.ability.extra.h_mod = 0 + + -- Fallback for if Pot of Jokes comes into this calcuate function with large h_size + if card.ability.immutable.h_added < card.ability.immutable.h_mod_max then + local delta = card.ability.immutable.h_mod_max - card.ability.immutable.h_added + + G.hand:change_size(delta) + + card.ability.immutable.h_added = card.ability.immutable.h_mod_max + end + end + + local delta = math.min( + math.max(0, card.ability.immutable.h_mod_max - card.ability.extra.h_size), + card.ability.extra.h_mod + ) + + G.hand:change_size(delta) + card.ability.extra.h_size = card.ability.extra.h_size + card.ability.extra.h_mod + card.ability.immutable.h_added = card.ability.immutable.h_added + delta + return { message = localize({ type = "variable", key = "a_handsize", vars = { card.ability.extra.h_mod } }), colour = G.C.FILTER, @@ -249,10 +275,10 @@ local potofjokes = { end end, add_to_deck = function(self, card, from_debuff) - G.hand:change_size(math.min(1000, card.ability.extra.h_size)) + G.hand:change_size(math.min(card.ability.immutable.h_mod_max, card.ability.extra.h_size)) end, remove_from_deck = function(self, card, from_debuff) - G.hand:change_size(-1 * math.min(1000, card.ability.extra.h_size)) + G.hand:change_size(-1 * math.min(card.ability.immutable.h_mod_max, card.ability.extra.h_size)) end, cry_credits = { idea = { @@ -263,6 +289,7 @@ local potofjokes = { }, code = { "Math", + "BobJoe400", }, }, unlocked = false, @@ -629,7 +656,7 @@ local pickle = { end tag.ability.orbital_hand = pseudorandom_element(_poker_hands, pseudoseed("cry_pickle_orbital")) end - tag.ability.shiny = cry_rollshinybool() + tag.ability.shiny = Cryptid.is_shiny() add_tag(tag) end end @@ -739,18 +766,6 @@ local cube = { "Math", }, }, - init = function(self) - local sc = Card.set_cost - function Card:set_cost() - sc(self) - if self.ability.name == "cry-Cube" then - self.cost = -27 - end - if self.ability.name == "cry-Big Cube" then - self.cost = 27 - end - end - end, } local triplet_rhythm = { object_type = "Joker", @@ -981,7 +996,7 @@ local big_cube = { name = "cry-Big Cube", key = "big_cube", joker_gate = "cry-Cube", - config = { extra = { x_chips = 6 } }, + config = { extra = { x_chips = 6 }, override_x_chips_check = true }, pos = { x = 4, y = 4 }, rarity = 1, order = 105, @@ -1369,7 +1384,12 @@ local sus = { local function is_impostor(card) return card.base.value and SMODS.Ranks[card.base.value].key == "King" and card:is_suit("Hearts") end - if context.end_of_round and context.cardarea == G.jokers and not context.blueprint and not context.retrigger_joker then + if + context.end_of_round + and context.cardarea == G.jokers + and not context.blueprint + and not context.retrigger_joker + then if not card.ability.used_round or card.ability.used_round ~= G.GAME.round then card.ability.chosen_card = nil end @@ -1605,7 +1625,7 @@ local wario = { "Auto Watto", }, art = { - "Linus Goof Balls", + "MarioFan597", }, code = { "Auto Watto", @@ -3761,6 +3781,7 @@ local rnjoker = { G.hand:change_size(-hand_size) end, generate_ui = function(self, info_queue, card, desc_nodes, specific_vars, full_UI_table) + card = card or self:create_fake_card() local len = ( card.ability and card.ability.abilities @@ -3791,6 +3812,7 @@ local rnjoker = { end new_loc.text_parsed = card.ability.abilities[1].text_parsed end + new_loc.text_parsed = new_loc.text_parsed or {} if not full_UI_table.name then full_UI_table.name = localize({ type = "name", set = self.set, key = target.key or self.key, nodes = full_UI_table.name }) @@ -6691,63 +6713,69 @@ local kittyprinter = { end, } local kidnap = { - object_type = "Joker", dependencies = { items = { "set_cry_misc_joker", }, }, + object_type = "Joker", name = "cry-kidnap", key = "kidnap", order = 23, pos = { x = 1, y = 2 }, config = { - extra = { money = 1, money_mod = 3 }, + extra = 4, }, rarity = 1, cost = 4, blueprint_compat = false, loc_vars = function(self, info_queue, center) - return { vars = { center.ability.extra.money_mod, center.ability.extra.money } } + local value = 0 + if G.GAME and G.GAME.jokers_sold then + for _, v in ipairs(G.GAME.jokers_sold) do + if + G.P_CENTERS[v].effect == "Type Mult" + or G.P_CENTERS[v].effect == "Cry Type Mult" + or G.P_CENTERS[v].effect == "Cry Type Chips" + or G.P_CENTERS[v].effect == "Boost Kidnapping" + or ( + G.P_CENTERS[v].name == "Sly Joker" + or G.P_CENTERS[v].name == "Wily Joker" + or G.P_CENTERS[v].name == "Clever Joker" + or G.P_CENTERS[v].name == "Devious Joker" + or G.P_CENTERS[v].name == "Crafty Joker" + ) + then + value = value + 1 + end + end + end + return { vars = { center.ability.extra, center.ability.extra * value } } end, atlas = "atlasone", - calculate = function(self, card, context) - if - context.selling_card - and ( - ( - context.card.ability.name == "Sly Joker" - or context.card.ability.name == "Wily Joker" - or context.card.ability.name == "Clever Joker" - or context.card.ability.name == "Devious Joker" - or context.card.ability.name == "Crafty Joker" - ) - or context.card.ability.effect == "Type Mult" - or context.card.ability.effect == "Cry Type Mult" - or context.card.ability.effect == "Cry Type Chips" - --[[ - Other developers can add effect == "Boost Kidnapping" - to their joker config if they want it to boost kidnapping when sold - ]] - -- - or context.card.ability.effect == "Boost Kidnapping" - or context.card:is_jolly() - ) - and not context.blueprint - then - card.ability.extra.money = card.ability.extra.money + card.ability.extra.money_mod - return { - card_eval_status_text(card, "extra", nil, nil, nil, { - message = localize("k_upgrade_ex"), - colour = G.C.MONEY, - }), - } - end - end, calc_dollar_bonus = function(self, card) - if card.ability.extra.money > 0 then - return card.ability.extra.money + local value = 0 + for _, v in ipairs(G.GAME.jokers_sold) do + if + G.P_CENTERS[v].effect == "Type Mult" + or G.P_CENTERS[v].effect == "Cry Type Mult" + or G.P_CENTERS[v].effect == "Cry Type Chips" + or G.P_CENTERS[v].effect == "Boost Kidnapping" + or ( + G.P_CENTERS[v].name == "Sly Joker" + or G.P_CENTERS[v].name == "Wily Joker" + or G.P_CENTERS[v].name == "Clever Joker" + or G.P_CENTERS[v].name == "Devious Joker" + or G.P_CENTERS[v].name == "Crafty Joker" + ) + then + value = value + 1 + end end + if value == 0 then + return + end + return card.ability.extra * value end, cry_credits = { idea = { @@ -6871,6 +6899,7 @@ local tropical_smoothie = { cost = 5, order = 125, atlas = "atlastwo", + pools = { ["Food"] = true }, loc_vars = function(self, info_queue, center) return { vars = { center.ability.extra } } end, @@ -7132,6 +7161,8 @@ local necromancer = { and context.card.config.center.set == "Joker" and G.GAME.jokers_sold and #G.GAME.jokers_sold > 0 + and not context.blueprint + and not context.retrigger_joker then local card = create_card( "Joker", @@ -7311,7 +7342,7 @@ local tax_fraud = { }, }, } ---TODO update desc + local pity_prize = { object_type = "Joker", dependencies = { @@ -7321,6 +7352,7 @@ local pity_prize = { }, name = "cry-Pity-Prize", key = "pity_prize", + blueprint_compat = true, pos = { x = 5, y = 5 }, config = {}, rarity = 1, @@ -7338,7 +7370,7 @@ local 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 = cry_rollshinybool() + tag.ability.shiny = Cryptid.is_shiny() if tag.name == "Orbital Tag" then local _poker_hands = {} for k, v in pairs(G.GAME.hands) do @@ -7623,14 +7655,16 @@ local zooble = { if not (next(context.poker_hands["Straight"]) or next(context.poker_hands["Straight Flush"])) then local unique_ranks = {} for i, v in pairs(context.scoring_hand) do - local not_unique = false - for i = 1, #unique_ranks do - if unique_ranks[i] == v:get_id() then - not_unique = true + if not (SMODS.has_no_rank(v) and not v.vampired) then + local not_unique = false + for i = 1, #unique_ranks do + if unique_ranks[i] == v:get_id() then + not_unique = true + end + end + if not not_unique then + unique_ranks[#unique_ranks + 1] = v:get_id() end - end - if not not_unique then - unique_ranks[#unique_ranks + 1] = v:get_id() end end if #unique_ranks >= 1 then @@ -7643,7 +7677,7 @@ local zooble = { end end end - if context.joker_main and context.cardarea == G.jokers then + if context.joker_main and card.ability.extra.mult > 0 then return { message = localize({ type = "variable", key = "a_mult", vars = { card.ability.extra.mult } }), mult_mod = card.ability.extra.mult, @@ -7674,6 +7708,7 @@ local lebaron_james = { key = "lebaron_james", pos = { x = 2, y = 5 }, config = { extra = { h_mod = 1 } }, + blueprint_compat = true, rarity = 3, cost = 6, atlas = "atlasone", @@ -7771,6 +7806,166 @@ local huntingseason = { -- If played hand contains three cards, destroy the midd }, }, } +local cat_owl = { -- Lucky Cards are considered Echo Cards and vice versa + object_type = "Joker", + dependencies = { + items = { + "set_cry_misc_joker", + "m_cry_echo", + "set_cry_misc", + }, + }, + name = "cry-cat_owl", + pools = { ["Meme"] = true }, + key = "cat_owl", + pos = { x = 6, y = 5 }, + order = 135, + rarity = 3, + cost = 8, + blueprint_compat = false, + atlas = "atlasone", + loc_vars = function(self, info_queue, center) + info_queue[#info_queue + 1] = G.P_CENTERS.m_lucky + info_queue[#info_queue + 1] = G.P_CENTERS.m_cry_echo + end, + calculate = function(self, card, context) + if context.check_enhancement then + if context.other_card.config.center.key == "m_lucky" then + return { m_cry_echo = true } + end + if context.other_card.config.center.key == "m_cry_echo" then + return { m_lucky = true } + end + end + end, + cry_credits = { + idea = { + "Math", + }, + code = { + "Math", + }, + art = { + "George the Rat", + }, + }, +} +local eyeofhagane = { + object_type = "Joker", + dependencies = { + items = { + "set_cry_misc_joker", + }, + }, + name = "cry-eyeofhagane", + key = "eyeofhagane", + order = 136, + pos = { x = 5, y = 6 }, + rarity = 2, + cost = 6, + blueprint_compat = false, + immutable = true, + atlas = "atlastwo", -- https://discord.com/channels/1264429948970733782/1274103559113150629/1351479917367263312 + calculate = function(self, card, context) + if context.before then + local faces = {} + for k, v in ipairs(context.scoring_hand) do + if v:is_face() then + faces[#faces + 1] = v + v:set_ability(G.P_CENTERS.m_steel, nil, true) + G.E_MANAGER:add_event(Event({ + func = function() + v:juice_up() + return true + end, + })) + end + end + if #faces > 0 then + return { + message = "Steel", + colour = G.C.UI.TEXT_INACTIVE, + card = self, + } + end + end + end, + cry_credits = { + idea = { "Soren" }, + code = { "Lexi" }, + art = { "Soren" }, + }, +} + +local highfive = { + object_type = "Joker", + dependencies = { + items = { + "set_cry_misc_joker", + }, + }, + name = "cry-highfive", + key = "highfive", + order = 137, + atlas = "atlastwo", + pos = { x = 4, y = 1 }, + blueprint_compat = false, + eternal_compat = true, + perishable_compat = true, + rarity = 3, + cost = 5, + calculate = function(self, card, context) + if context.final_scoring_step then + local maximum = -1 + local fives = 0 + for k, v in ipairs(context.scoring_hand) do + if not SMODS.has_no_rank(v) then + local thunk = v:get_id() == 14 and 1 or v:get_id() + if thunk == 5 then + fives = fives + 1 + end + if thunk > maximum then + maximum = thunk + end + end + end + + local whapoosh = false + if maximum == 5 and fives ~= #context.scoring_hand then + for index = 1, #context.scoring_hand do + local v = context.scoring_hand[index] + if v:get_id() ~= 5 and not SMODS.has_no_rank(v) then + whapoosh = true + G.E_MANAGER:add_event(Event({ + func = function() + assert(SMODS.change_base(v, _, "5")) + v:juice_up() + return true + end, + })) + end + end + + if whapoosh then + G.E_MANAGER:add_event(Event({ + func = function() + play_sound("cry_whapoosh") + return true + end, + })) + return { + message = localize("cry_highfive_ex"), + } + end + end + end + end, + cry_credits = { + idea = { "cassknows" }, + art = { "MarioFan597" }, + code = { "astrapboy" }, + }, +} local miscitems = { jimball_sprite, dropshot, @@ -7859,8 +8054,8 @@ local miscitems = { exposed, mask, tropical_smoothie, - pumpkin, - carved_pumpkin, + --pumpkin, + --carved_pumpkin, cookie, necromancer, oil_lamp, @@ -7884,6 +8079,9 @@ local miscitems = { translucent, lebaron_james, huntingseason, + --cat_owl, + --eyeofhagane, (apparently this wasn't screened) + highfive, } return { name = "Misc. Jokers", diff --git a/Cryptid/items/planet.lua b/Cryptid/items/planet.lua index d712ed6..7bbcb51 100644 --- a/Cryptid/items/planet.lua +++ b/Cryptid/items/planet.lua @@ -29,40 +29,35 @@ local timantti = { return true end, loc_vars = function(self, info_queue, center) - local levelone = G.GAME.hands["High Card"].level or 1 - local leveltwo = G.GAME.hands["Pair"].level or 1 - local levelthree = G.GAME.hands["Two Pair"].level or 1 - local planetcolourone = G.C.HAND_LEVELS[math.min(levelone, 7)] - local planetcolourtwo = G.C.HAND_LEVELS[math.min(leveltwo, 7)] - local planetcolourthree = G.C.HAND_LEVELS[math.min(levelthree, 7)] - if levelone == 1 or leveltwo == 1 or levelthree == 1 then --Level 1 colour is white (The background), so this sets it to black - if levelone == 1 then - planetcolourone = G.C.UI.TEXT_DARK - end - if leveltwo == 1 then - planetcolourtwo = G.C.UI.TEXT_DARK - end - if levelthree == 1 then - planetcolourthree = G.C.UI.TEXT_DARK - end - end return { vars = { localize("High Card", "poker_hands"), localize("Pair", "poker_hands"), localize("Two Pair", "poker_hands"), - G.GAME.hands["High Card"].level, - G.GAME.hands["Pair"].level, - G.GAME.hands["Two Pair"].level, - colours = { planetcolourone, planetcolourtwo, planetcolourthree }, + number_format(G.GAME.hands["High Card"].level), + number_format(G.GAME.hands["Pair"].level), + number_format(G.GAME.hands["Two Pair"].level), + colours = { + ( + to_big(G.GAME.hands["High Card"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["High Card"].level)):to_number()] + ), + (to_big(G.GAME.hands["Pair"].level) == to_big(1) and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[to_big( + math.min(7, G.GAME.hands["Pair"].level) + ):to_number()]), + ( + to_big(G.GAME.hands["Two Pair"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["Two Pair"].level)):to_number()] + ), + }, }, } end, use = function(self, card, area, copier) - Cryptid.suit_level_up(self, card, area, copier) + Cryptid.suit_level_up(card, copier, 1, card.config.center.config.hand_types) end, bulk_use = function(self, card, area, copier, number) - Cryptid.suit_level_up(self, card, area, copier, number) + Cryptid.suit_level_up(card, copier, number, card.config.center.config.hand_types) end, calculate = function(self, card, context) if @@ -113,40 +108,35 @@ local klubi = { return true end, loc_vars = function(self, info_queue, center) - local levelone = G.GAME.hands["Three of a Kind"].level or 1 - local leveltwo = G.GAME.hands["Straight"].level or 1 - local levelthree = G.GAME.hands["Flush"].level or 1 - local planetcolourone = G.C.HAND_LEVELS[math.min(levelone, 7)] - local planetcolourtwo = G.C.HAND_LEVELS[math.min(leveltwo, 7)] - local planetcolourthree = G.C.HAND_LEVELS[math.min(levelthree, 7)] - if levelone == 1 or leveltwo == 1 or levelthree == 1 then --Level 1 colour is white (The background), so this sets it to black - if levelone == 1 then - planetcolourone = G.C.UI.TEXT_DARK - end - if leveltwo == 1 then - planetcolourtwo = G.C.UI.TEXT_DARK - end - if levelthree == 1 then - planetcolourthree = G.C.UI.TEXT_DARK - end - end return { vars = { localize("Three of a Kind", "poker_hands"), localize("Straight", "poker_hands"), localize("Flush", "poker_hands"), - G.GAME.hands["Three of a Kind"].level, - G.GAME.hands["Straight"].level, - G.GAME.hands["Flush"].level, - colours = { planetcolourone, planetcolourtwo, planetcolourthree }, + number_format(G.GAME.hands["Three of a Kind"].level), + number_format(G.GAME.hands["Straight"].level), + number_format(G.GAME.hands["Flush"].level), + colours = { + ( + to_big(G.GAME.hands["Three of a Kind"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["Three of a Kind"].level)):to_number()] + ), + ( + to_big(G.GAME.hands["Straight"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["Straight"].level)):to_number()] + ), + (to_big(G.GAME.hands["Flush"].level) == to_big(1) and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[to_big( + math.min(7, G.GAME.hands["Flush"].level) + ):to_number()]), + }, }, } end, use = function(self, card, area, copier) - Cryptid.suit_level_up(self, card, area, copier) + Cryptid.suit_level_up(card, copier, 1, card.config.center.config.hand_types) end, bulk_use = function(self, card, area, copier, number) - Cryptid.suit_level_up(self, card, area, copier, number) + Cryptid.suit_level_up(card, copier, number, card.config.center.config.hand_types) end, calculate = function(self, card, context) if @@ -197,40 +187,36 @@ local sydan = { return true end, loc_vars = function(self, info_queue, center) - local levelone = G.GAME.hands["Full House"].level or 1 - local leveltwo = G.GAME.hands["Four of a Kind"].level or 1 - local levelthree = G.GAME.hands["Straight Flush"].level or 1 - local planetcolourone = G.C.HAND_LEVELS[math.min(levelone, 7)] - local planetcolourtwo = G.C.HAND_LEVELS[math.min(leveltwo, 7)] - local planetcolourthree = G.C.HAND_LEVELS[math.min(levelthree, 7)] - if levelone == 1 or leveltwo == 1 or levelthree == 1 then --Level 1 colour is white (The background), so this sets it to black - if levelone == 1 then - planetcolourone = G.C.UI.TEXT_DARK - end - if leveltwo == 1 then - planetcolourtwo = G.C.UI.TEXT_DARK - end - if levelthree == 1 then - planetcolourthree = G.C.UI.TEXT_DARK - end - end return { vars = { localize("Full House", "poker_hands"), localize("Four of a Kind", "poker_hands"), localize("Straight Flush", "poker_hands"), - G.GAME.hands["Full House"].level, - G.GAME.hands["Four of a Kind"].level, - G.GAME.hands["Straight Flush"].level, - colours = { planetcolourone, planetcolourtwo, planetcolourthree }, + number_format(G.GAME.hands["Full House"].level), + number_format(G.GAME.hands["Four of a Kind"].level), + number_format(G.GAME.hands["Straight Flush"].level), + colours = { + ( + to_big(G.GAME.hands["Full House"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["Full House"].level)):to_number()] + ), + ( + to_big(G.GAME.hands["Four of a Kind"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["Four of a Kind"].level)):to_number()] + ), + ( + to_big(G.GAME.hands["Straight Flush"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["Straight Flush"].level)):to_number()] + ), + }, }, } end, use = function(self, card, area, copier) - Cryptid.suit_level_up(self, card, area, copier) + Cryptid.suit_level_up(card, copier, 1, card.config.center.config.hand_types) end, bulk_use = function(self, card, area, copier, number) - Cryptid.suit_level_up(self, card, area, copier, number) + Cryptid.suit_level_up(card, copier, number, card.config.center.config.hand_types) end, calculate = function(self, card, context) if @@ -281,40 +267,36 @@ local lapio = { return true end, loc_vars = function(self, info_queue, center) - local levelone = G.GAME.hands["Five of a Kind"].level or 1 - local leveltwo = G.GAME.hands["Flush House"].level or 1 - local levelthree = G.GAME.hands["Flush Five"].level or 1 - local planetcolourone = G.C.HAND_LEVELS[math.min(levelone, 7)] - local planetcolourtwo = G.C.HAND_LEVELS[math.min(leveltwo, 7)] - local planetcolourthree = G.C.HAND_LEVELS[math.min(levelthree, 7)] - if levelone == 1 or leveltwo == 1 or levelthree == 1 then --Level 1 colour is white (The background), so this sets it to black - if levelone == 1 then - planetcolourone = G.C.UI.TEXT_DARK - end - if leveltwo == 1 then - planetcolourtwo = G.C.UI.TEXT_DARK - end - if levelthree == 1 then - planetcolourthree = G.C.UI.TEXT_DARK - end - end return { vars = { localize("Five of a Kind", "poker_hands"), localize("Flush House", "poker_hands"), localize("Flush Five", "poker_hands"), - G.GAME.hands["Five of a Kind"].level, - G.GAME.hands["Flush House"].level, - G.GAME.hands["Flush Five"].level, - colours = { planetcolourone, planetcolourtwo, planetcolourthree }, + number_format(G.GAME.hands["Five of a Kind"].level), + number_format(G.GAME.hands["Flush House"].level), + number_format(G.GAME.hands["Flush Five"].level), + colours = { + ( + to_big(G.GAME.hands["Five of a Kind"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["Five of a Kind"].level)):to_number()] + ), + ( + to_big(G.GAME.hands["Flush House"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["Flush House"].level)):to_number()] + ), + ( + to_big(G.GAME.hands["Flush Five"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["Flush Five"].level)):to_number()] + ), + }, }, } end, use = function(self, card, area, copier) - Cryptid.suit_level_up(self, card, area, copier) + Cryptid.suit_level_up(card, copier, 1, card.config.center.config.hand_types) end, bulk_use = function(self, card, area, copier, number) - Cryptid.suit_level_up(self, card, area, copier, number) + Cryptid.suit_level_up(card, copier, number, card.config.center.config.hand_types) end, calculate = function(self, card, context) if @@ -372,17 +354,7 @@ local kaikki = { local planetcolourone = G.C.HAND_LEVELS[math.min(levelone, 7)] local planetcolourtwo = G.C.HAND_LEVELS[math.min(leveltwo, 7)] local planetcolourthree = G.C.HAND_LEVELS[math.min(levelthree, 7)] - if levelone == 1 or leveltwo == 1 or levelthree == 1 then --Level 1 colour is white (The background), so this sets it to black - if levelone == 1 then - planetcolourone = G.C.UI.TEXT_DARK - end - if leveltwo == 1 then - planetcolourtwo = G.C.UI.TEXT_DARK - end - if levelthree == 1 then - planetcolourthree = G.C.UI.TEXT_DARK - end - end + return { vars = { localize("cry_Bulwark", "poker_hands"), @@ -391,15 +363,28 @@ local kaikki = { G.GAME.hands["cry_Bulwark"].level, G.GAME.hands["cry_Clusterfuck"].level, G.GAME.hands["cry_UltPair"].level, - colours = { planetcolourone, planetcolourtwo, planetcolourthree }, + colours = { + ( + to_big(G.GAME.hands["cry_Bulwark"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["cry_Bulwark"].level)):to_number()] + ), + ( + to_big(G.GAME.hands["cry_Clusterfuck"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["cry_Clusterfuck"].level)):to_number()] + ), + ( + to_big(G.GAME.hands["cry_UltPair"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["cry_UltPair"].level)):to_number()] + ), + }, }, } end, use = function(self, card, area, copier) - Cryptid.suit_level_up(self, card, area, copier) + Cryptid.suit_level_up(card, copier, 1, card.config.center.config.hand_types) end, bulk_use = function(self, card, area, copier, number) - Cryptid.suit_level_up(self, card, area, copier, number) + Cryptid.suit_level_up(card, copier, number, card.config.center.config.hand_types) end, calculate = function(self, card, context) if @@ -766,7 +751,7 @@ local nstar = { --Add +1 to amount of neutron stars used this run G.GAME.neutronstarsusedinthisrun = G.GAME.neutronstarsusedinthisrun + 1 - local neutronhand = Cryptid.get_random_hand() --Random poker hand + local neutronhand = Cryptid.get_random_hand(nil, "nstar" .. G.GAME.round_resets.ante) --Random poker hand update_hand_text({ sound = "button", volume = 0.7, pitch = 0.8, delay = 0.3 }, { handname = localize(neutronhand, "poker_hands"), chips = G.GAME.hands[neutronhand].chips, @@ -888,6 +873,9 @@ local sunplanet = { aurinko = true, atlas = "atlasnotjokers", order = 7, + config = { + extra = 0.05, + }, set_card_type_badge = function(self, card, badges) badges[1] = create_badge(localize("cry_p_star"), get_type_colour(self or card.config, card), nil, 1.2) end, @@ -896,11 +884,12 @@ local sunplanet = { end, use = function(self, card, area, copier) local used_consumable = copier or card - local sunlevel = (G.GAME.sunnumber and G.GAME.sunnumber or 0) + 1 + local sunlevel = (G.GAME.sunlevel and G.GAME.sunlevel or 0) + 1 + G.GAME.sunlevel = (G.GAME.sunlevel or 0) + 1 delay(0.4) update_hand_text( { sound = "button", volume = 0.7, pitch = 0.8, delay = 0.3 }, - { handname = localize("cry_asc_hands"), chips = "...", mult = "...", level = sunlevel } + { handname = localize("cry_asc_hands"), chips = "...", mult = "...", level = to_big(sunlevel) } ) delay(1.0) G.E_MANAGER:add_event(Event({ @@ -926,9 +915,9 @@ local sunplanet = { return true end, })) - update_hand_text({ sound = "button", volume = 0.7, pitch = 0.9, delay = 0 }, { level = sunlevel + 1 }) + update_hand_text({ sound = "button", volume = 0.7, pitch = 0.9, delay = 0 }, { level = to_big(sunlevel + 1) }) delay(2.6) - G.GAME.sunnumber = G.GAME.sunnumber ~= nil and G.GAME.sunnumber + 1 or 1 + G.GAME.sunnumber = G.GAME.sunnumber ~= nil and G.GAME.sunnumber + card.ability.extra or card.ability.extra update_hand_text( { sound = "button", volume = 0.7, pitch = 1.1, delay = 0 }, { mult = 0, chips = 0, handname = "", level = "" } @@ -936,11 +925,12 @@ local sunplanet = { end, bulk_use = function(self, card, area, copier, number) local used_consumable = copier or card - local sunlevel = (G.GAME.sunnumber and G.GAME.sunnumber or 0) + 1 + local sunlevel = (G.GAME.sunlevel and G.GAME.sunlevel or 0) + 1 + G.GAME.sunlevel = (G.GAME.sunlevel or 0) + 1 delay(0.4) update_hand_text( { sound = "button", volume = 0.7, pitch = 0.8, delay = 0.3 }, - { handname = localize("cry_asc_hands"), chips = "...", mult = "...", level = sunlevel } + { handname = localize("cry_asc_hands"), chips = "...", mult = "...", level = to_big(sunlevel) } ) delay(1.0) G.E_MANAGER:add_event(Event({ @@ -966,9 +956,13 @@ local sunplanet = { return true end, })) - update_hand_text({ sound = "button", volume = 0.7, pitch = 0.9, delay = 0 }, { level = sunlevel + number }) + update_hand_text( + { sound = "button", volume = 0.7, pitch = 0.9, delay = 0 }, + { level = to_big(sunlevel + number) } + ) delay(2.6) - G.GAME.sunnumber = G.GAME.sunnumber ~= nil and G.GAME.sunnumber + number or number + G.GAME.sunnumber = G.GAME.sunnumber ~= nil and G.GAME.sunnumber + number * card.ability.extra + or number * card.ability.extra update_hand_text( { sound = "button", volume = 0.7, pitch = 1.1, delay = 0 }, { mult = 0, chips = 0, handname = "", level = "" } @@ -988,15 +982,16 @@ local sunplanet = { end end, loc_vars = function(self, info_queue, center) - local levelone = (G.GAME.sunnumber and G.GAME.sunnumber or 0) + 1 + local levelone = (G.GAME.sunlevel and G.GAME.sunlevel or 0) + 1 local planetcolourone = G.C.HAND_LEVELS[math.min(levelone, 7)] if levelone == 1 then planetcolourone = G.C.UI.TEXT_DARK end return { vars = { - (G.GAME.sunnumber and G.GAME.sunnumber or 0) + 1, - ((G.GAME.sunnumber and G.GAME.sunnumber or 0) / 20) + 1.25, + (G.GAME.sunlevel or 0) + 1, + center.ability.extra or 0.05, + (G.GAME.sunnumber and G.GAME.sunnumber or 0) + 1.25, colours = { planetcolourone }, }, } @@ -1037,18 +1032,18 @@ local abelt = { badges[1] = create_badge(localize("k_planet_disc"), get_type_colour(self or card.config, card), nil, 1.2) end, loc_vars = function(self, info_queue, center) - local levelone = G.GAME.hands["cry_Bulwark"].level or 1 - local planetcolourone = G.C.HAND_LEVELS[math.min(levelone, 7)] - if levelone == 1 then - planetcolourone = G.C.UI.TEXT_DARK - end return { vars = { localize("cry_hand_bulwark"), G.GAME.hands["cry_Bulwark"].level, G.GAME.hands["cry_Bulwark"].l_mult, G.GAME.hands["cry_Bulwark"].l_chips, - colours = { planetcolourone }, + colours = { + ( + to_big(G.GAME.hands["cry_Bulwark"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["cry_Bulwark"].level)):to_number()] + ), + }, }, } end, @@ -1083,18 +1078,18 @@ local void = { badges[1] = create_badge("", get_type_colour(self or card.config, card), nil, 1.2) end, loc_vars = function(self, info_queue, center) - local levelone = G.GAME.hands["cry_Clusterfuck"].level or 1 - local planetcolourone = G.C.HAND_LEVELS[math.min(levelone, 7)] - if levelone == 1 then - planetcolourone = G.C.UI.TEXT_DARK - end return { vars = { localize("cry_Clusterfuck"), G.GAME.hands["cry_Clusterfuck"].level, G.GAME.hands["cry_Clusterfuck"].l_mult, G.GAME.hands["cry_Clusterfuck"].l_chips, - colours = { planetcolourone }, + colours = { + ( + to_big(G.GAME.hands["cry_Clusterfuck"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["cry_Clusterfuck"].level)):to_number()] + ), + }, }, } end, @@ -1140,7 +1135,12 @@ local marsmoons = { G.GAME.hands["cry_UltPair"].level, G.GAME.hands["cry_UltPair"].l_mult, G.GAME.hands["cry_UltPair"].l_chips, - colours = { planetcolourone }, + colours = { + ( + to_big(G.GAME.hands["cry_UltPair"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["cry_UltPair"].level)):to_number()] + ), + }, }, } end, @@ -1175,29 +1175,42 @@ local universe = { badges[1] = create_badge(localize("k_planet_universe"), get_type_colour(self or card.config, card), nil, 1.2) end, loc_vars = function(self, info_queue, center) - local levelone = G.GAME.hands["cry_WholeDeck"].level or 1 - local planetcolourone = G.C.HAND_LEVELS[math.min(levelone, 7)] - if levelone == 1 then - planetcolourone = G.C.UI.TEXT_DARK - end return { vars = { localize("cry_UltPair"), G.GAME.hands["cry_WholeDeck"].level, G.GAME.hands["cry_WholeDeck"].l_mult, G.GAME.hands["cry_WholeDeck"].l_chips, - colours = { planetcolourone }, + colours = { + ( + to_big(G.GAME.hands["cry_Bulwark"].level) == to_big(1) and G.C.UI.TEXT_DARK + or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands["cry_WholeDeck"].level)):to_number()] + ), + }, }, } end, generate_ui = 0, } -function Cryptid.suit_level_up(center, card, area, copier, number) +function Cryptid.suit_level_up(card, copier, number, poker_hands, message) local used_consumable = copier or card if not number then number = 1 end - for _, v in pairs(card.config.center.config.hand_types) do + if not poker_hands then + poker_hands = { "Two Pair", "Straight Flush" } + end + if message then + card_eval_status_text( + card, + "extra", + nil, + nil, + nil, + { message = localize("k_level_up_ex"), colour = G.C.FILTER } + ) + end + for _, v in pairs(poker_hands) do update_hand_text({ sound = "button", volume = 0.7, pitch = 0.8, delay = 0.3 }, { handname = localize(v, "poker_hands"), chips = G.GAME.hands[v].chips, diff --git a/Cryptid/items/sleeve.lua b/Cryptid/items/sleeve.lua index 1350726..6928cd8 100644 --- a/Cryptid/items/sleeve.lua +++ b/Cryptid/items/sleeve.lua @@ -448,7 +448,7 @@ if CardSleeves then key = "antimatter_sleeve", name = "Antimatter Sleeve", atlas = "atlasSleeves", - pos = { x = 0, y = 2 }, + pos = { x = 0, y = 1 }, config = { cry_antimatter = true, cry_crit_rate = 0.25, --Critical Deck diff --git a/Cryptid/items/spectral.lua b/Cryptid/items/spectral.lua index 28778f0..73f51d1 100644 --- a/Cryptid/items/spectral.lua +++ b/Cryptid/items/spectral.lua @@ -152,6 +152,7 @@ local vacuum = { use = function(self, card, area, copier) local used_consumable = copier or card local earnings = 0 + check_for_unlock({ cry_used_consumable = "c_cry_vacuum" }) G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.4, @@ -235,6 +236,7 @@ local hammerspace = { end, use = function(self, card, area, copier) local used_consumable = copier or card + check_for_unlock({ cry_used_consumable = "c_cry_hammerspace" }) G.E_MANAGER:add_event(Event({ trigger = "after", delay = 0.4, @@ -309,6 +311,7 @@ local lock = { end, use = function(self, card, area, copier) local used_consumable = copier or card + 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({ trigger = "after", @@ -566,6 +569,7 @@ local analog = { return #G.jokers.cards > 0 end, 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 @@ -715,6 +719,7 @@ local replica = { end, use = function(self, card, area, copier) 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.E_MANAGER:add_event(Event({ trigger = "after", diff --git a/Cryptid/items/spooky.lua b/Cryptid/items/spooky.lua index db41b5c..e000c51 100644 --- a/Cryptid/items/spooky.lua +++ b/Cryptid/items/spooky.lua @@ -135,7 +135,7 @@ local choco_dice = { then --todo: check if duplicates of event are already started/finished SMODS.Events["ev_cry_choco" .. card.ability.extra.roll]:finish() - card.ability.extra.roll = Cryptid.roll("cry_choco", 1, 10, { ignore_value = card.ability.extra.roll }) + card.ability.extra.roll = Cryptid.roll("cry_choco", 2, 10, { ignore_value = card.ability.extra.roll }) SMODS.Events["ev_cry_choco" .. card.ability.extra.roll]:start() return { message = tostring(card.ability.extra.roll), @@ -651,7 +651,7 @@ local spy = { G.jokers.config.card_limit = G.jokers.config.card_limit - 1 end, calculate = function(self, card, context) - if context.cardarea == G.jokers and not context.before and not context.after then + if context.joker_main then return { message = localize({ type = "variable", key = "a_xmult", vars = { card.ability.x_mult } }), Xmult_mod = card.ability.x_mult, @@ -1122,6 +1122,22 @@ local spookydeck = { end end end, + unlocked = false, + check_for_unlock = function(self, args) + if Cryptid.safe_get(G, "jokers") then + for i = 1, #G.jokers.cards do + if G.jokers.cards[i].config.center.rarity == "cry_candy" then + unlock_card(self) + end + end + end + if args.type == "cry_lock_all" then + lock_card(self) + end + if args.type == "cry_unlock_all" then + unlock_card(self) + end + end, } local candy_dagger = { object_type = "Joker", @@ -1688,12 +1704,51 @@ local candy_sticks = { }, }, } +-- Wonka Bar +-- Sell this card to permanently gain +1 card selection limit +local wonka_bar = { + object_type = "Joker", + dependencies = { + items = { + "set_cry_spooky", + }, + }, + key = "wonka_bar", + name = "cry_wonka_bar", + config = { extra = 1 }, + pos = { x = 1, y = 3 }, + order = 146, + rarity = "cry_candy", + cost = 10, + eternal_compat = false, + atlas = "atlasspooky", + loc_vars = function(self, info_queue, center) + return { vars = { center.ability.extra } } + end, + calculate = function(self, card, context) + if context.selling_self and not context.blueprint then + card.ability.extra = math.floor(card.ability.extra) + G.hand.config.highlighted_limit = G.hand.config.highlighted_limit + card.ability.extra + end + end, + cry_credits = { + idea = { + "Inspector_B", + }, + art = { + "George the Rat", + }, + code = { + "Glitchkat10", + }, + }, +} items = { cotton_candy, wrapped, choco_dice, choco_base_event, - choco1, + --choco1, choco2, choco3, potion, @@ -1709,7 +1764,7 @@ items = { trick_or_treat, candy_basket, blacklist, - ghost, + --ghost, possessed, spookydeck, candy_dagger, @@ -1720,38 +1775,10 @@ items = { brittle, monopoly_money, candy_sticks, + wonka_bar, } return { name = "Spooky", - init = function() - --Cursed rarity patches - local sc = Card.set_cost - function Card:set_cost() - sc(self) - if self.config and self.config.center and self.config.center.rarity == "cry_cursed" then - self.sell_cost = 0 - self.sell_cost_label = 0 - end - end - --Really hacky patch to remove sell button for cursed jokers - local G_UIDEF_use_and_sell_buttons_ref = G.UIDEF.use_and_sell_buttons - function G.UIDEF.use_and_sell_buttons(card) - local m = G_UIDEF_use_and_sell_buttons_ref(card) - if - card.area - and card.area.config.type == "joker" - and card.config - and card.config.center - and card.config.center.rarity == "cry_cursed" - and card.ability.name ~= "cry-Monopoly" - then - table.remove(m.nodes[1].nodes, 1) - end - if card.config and card.config.center and card.config.center.key == "c_cry_potion" then - table.remove(m.nodes[1].nodes, 1) - end - return m - end - end, + init = function() end, items = items, } diff --git a/Cryptid/items/stake.lua b/Cryptid/items/stake.lua index fd7de32..a92f224 100644 --- a/Cryptid/items/stake.lua +++ b/Cryptid/items/stake.lua @@ -526,24 +526,6 @@ return { SMODS.calculate_context({ remove_playing_cards = true, removed = destroyed_cards }) end, }, true) - - local sc = Card.set_cost - function Card:set_cost() - sc(self) - 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 - end for _, v in pairs(self.items) do if v.object_type == "Stake" then v.sticker_pos = v.pos diff --git a/Cryptid/items/tag.lua b/Cryptid/items/tag.lua index 1e3793b..1b361d6 100644 --- a/Cryptid/items/tag.lua +++ b/Cryptid/items/tag.lua @@ -197,11 +197,13 @@ local empoweredPack = { if i % 2 == 1 and Cryptid.enabled("c_cry_gateway") == true - and not G.GAME.used_jokers["c_cry_gateway"] - and not next(find_joker("Showman")) + and not G.GAME.banned_keys["c_cry_gateway"] + and not (G.GAME.used_jokers["c_cry_gateway"] and not next(find_joker("Showman"))) then return create_card("Spectral", G.pack_cards, nil, nil, true, true, "c_cry_gateway") - elseif not G.GAME.used_jokers["c_soul"] and not next(find_joker("Showman")) then + elseif + not (G.GAME.used_jokers["c_soul"] and not next(find_joker("Showman"))) and not G.GAME.banned_keys["c_soul"] + then return create_card("Spectral", G.pack_cards, nil, nil, true, true, "c_soul") else return create_card("Spectral", G.pack_cards, nil, nil, true, true) @@ -333,7 +335,7 @@ local gambler = { tag:yep("+", G.C.SECONDARY_SET.Spectral, function() local emp = Tag("tag_cry_empowered") if tag.ability.shiny then -- good fucking luck - emp.ability.shiny = cry_rollshinybool() + emp.ability.shiny = Cryptid.is_shiny() end add_tag(emp) tag.triggered = true @@ -397,7 +399,7 @@ local bundle = { local tags = { "standard", "charm", "meteor", "buffoon" } for i, v in ipairs(tags) do local _tag = Tag("tag_" .. v) - _tag.ability.shiny = cry_rollshinybool() + _tag.ability.shiny = Cryptid.is_shiny() add_tag(_tag) if i == 1 then tag.triggered = true @@ -444,6 +446,28 @@ local memory = { or localize("k_none") return { vars = { self.config.num, loc_tag } } end, + preview_ui = function(self, tag) + if G.GAME.cry_last_tag_used then + local last_tag = Tag(G.GAME.cry_last_tag_used, true) + last_tag.ability.orbital_hand = G.GAME.cry_memory_orbital + local tag_sprite + _, tag_sprite = last_tag:generate_UI(0.4) + return { + n = G.UIT.C, + nodes = { + { + n = G.UIT.R, + nodes = { + { n = G.UIT.T, config = { text = ">", colour = G.C.WHITE, scale = 0.4 } }, + { n = G.UIT.O, config = { object = tag_sprite } }, + G.P_TAGS[G.GAME.cry_last_tag_used].preview_ui + and G.P_TAGS[G.GAME.cry_last_tag_used]:preview_ui(last_tag), + }, + }, + }, + } + end + end, apply = function(self, tag, context) if context.type == "immediate" and G.GAME.cry_last_tag_used then local lock = tag.ID diff --git a/Cryptid/items/test.lua b/Cryptid/items/test.lua index 372bc31..2568f7d 100644 --- a/Cryptid/items/test.lua +++ b/Cryptid/items/test.lua @@ -37,7 +37,7 @@ local test = { end, calculate = function(self, card, context) local gameset = Card.get_gameset(card) - if context.cardarea == G.jokers and not context.before and not context.after then + if context.joker_main then return { message = localize({ type = "variable", key = "a_chips", vars = { card.ability.extra.chips } }), chip_mod = card.ability.extra.chips, @@ -108,20 +108,15 @@ local test3 = { pos = { x = 2, y = 1 }, rarity = 1, cost = 2, + blueprint_compat = true, discovered = true, atlas = "atlastwo", loc_txt = { - name = "Loc var man B)", + name = "function dump man B)", text = { - "{C:attention}#1#", - "{C:green}#2#", - "{C:inactive}#3##4##5#", + "{C:attention}What does the fox say?", }, }, - loc_vars = function(self, info_queue, card) - local a, b, c, d, e = Cryptid.enhanced_deck_info() - return { vars = { a, b, c, d, e } } - end, cry_credits = { idea = { "Jevonn", @@ -133,6 +128,45 @@ local test3 = { "Jevonn", }, }, + calculate = function(self, card, context) + if context.end_of_round and not context.individual and not context.repetition then + Cryptid.suit_level_up(context.blueprint_card or card, nil, 1, { + "High Card", + "Pair", + "Two Pair", + "Three of a Kind", + "Straight", + "Flush", + "Full House", + "Four of a Kind", + "Straight Flush", + }, true) + elseif context.pre_discard and not context.hook then + local text, loc_disp_text, poker_hands, scoring_hand, disp_text = + G.FUNCS.get_poker_hand_info(G.hand.highlighted) + if disp_text == "cry-Cluster Bulwark" then + card_eval_status_text( + context.blueprint_card or card, + "extra", + nil, + nil, + nil, + { message = localize("k_upgrade_ex") } + ) + update_hand_text({ sound = "button", volume = 0.7, pitch = 0.8, delay = 0.3 }, { + handname = localize(text, "poker_hands"), + chips = G.GAME.hands[text].chips, + mult = G.GAME.hands[text].mult, + level = G.GAME.hands[text].level, + }) + level_up_hand(context.blueprint_card or card, text, nil, 6) + update_hand_text( + { sound = "button", volume = 0.7, pitch = 1.1, delay = 0 }, + { mult = 0, chips = 0, handname = "", level = "" } + ) + end + end + end, } local test4 = { object_type = "Joker", @@ -161,7 +195,6 @@ local test4 = { end, update = function(self, card, front) if G.STAGE == G.STAGES.RUN then - G.GAME.round_resets.discards = G.GAME.round_resets.discards + 1 other_joker = G.jokers.cards[1] if other_joker then if G.GAME.current_round.discards_used % 3 == 0 then @@ -190,4 +223,84 @@ local test4 = { end end, } -return { items = { test, test2, test3, test4 }, disabled = true } +local kidnap2 = { + object_type = "Joker", + name = "cry-kidnap2", + key = "kidnap2", + pos = { x = 1, y = 2 }, + config = { + extra = 1, + }, + rarity = 1, + cost = 4, + loc_txt = { + name = "asd", + text = { + "Earn {C:money}$#1#{} at end of round", + "per unique {C:attention}Type Mult{} or", + "{C:attention}Type Chips{} Joker sold this run", + "{C:inactive}(Currently {C:money}$#2#{C:inactive})", + }, + }, + blueprint_compat = false, + loc_vars = function(self, info_queue, center) + local value = 0 + if G.GAME and G.GAME.jokers_sold then + for _, v in ipairs(G.GAME.jokers_sold) do + if + G.P_CENTERS[v].effect == "Type Mult" + or G.P_CENTERS[v].effect == "Cry Type Mult" + or G.P_CENTERS[v].effect == "Cry Type Chips" + or G.P_CENTERS[v].effect == "Boost Kidnapping" + or ( + G.P_CENTERS[v].name == "Sly Joker" + or G.P_CENTERS[v].name == "Wily Joker" + or G.P_CENTERS[v].name == "Clever Joker" + or G.P_CENTERS[v].name == "Devious Joker" + or G.P_CENTERS[v].name == "Crafty Joker" + ) + then + value = value + 1 + end + end + end + return { vars = { center.ability.extra, center.ability.extra * value } } + end, + atlas = "atlasone", + calc_dollar_bonus = function(self, card) + local value = 0 + for _, v in ipairs(G.GAME.jokers_sold) do + if + G.P_CENTERS[v].effect == "Type Mult" + or G.P_CENTERS[v].effect == "Cry Type Mult" + or G.P_CENTERS[v].effect == "Cry Type Chips" + or G.P_CENTERS[v].effect == "Boost Kidnapping" + or ( + G.P_CENTERS[v].name == "Sly Joker" + or G.P_CENTERS[v].name == "Wily Joker" + or G.P_CENTERS[v].name == "Clever Joker" + or G.P_CENTERS[v].name == "Devious Joker" + or G.P_CENTERS[v].name == "Crafty Joker" + ) + then + value = value + 1 + end + end + if value == 0 then + return + end + return card.ability.extra * value + end, + cry_credits = { + idea = { + "Jevonn", + }, + art = { + "Jevonn", + }, + code = { + "Jevonn", + }, + }, +} +return { items = { test, test2, test3, test4, kidnap2 }, disabled = true } diff --git a/Cryptid/items/voucher.lua b/Cryptid/items/voucher.lua index c0c5de9..4387d84 100644 --- a/Cryptid/items/voucher.lua +++ b/Cryptid/items/voucher.lua @@ -37,20 +37,22 @@ local copies = { --Double tags become Triple Tags and are 2X as common init = function(self) --Copies and upgrades local tinit = Tag.init - function Tag:init(tag, y, z) - if tag == "tag_double" and G.GAME.used_vouchers.v_cry_copies then - tag = "tag_cry_triple" + function Tag:init(tag, for_collection, _blind_type) + if not for_collection 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_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 - 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 - return tinit(self, tag, y, z) + return tinit(self, tag, for_collection, _blind_type) end end, } diff --git a/Cryptid/lib/ascended.lua b/Cryptid/lib/ascended.lua index 14ee1a2..0c757b6 100644 --- a/Cryptid/lib/ascended.lua +++ b/Cryptid/lib/ascended.lua @@ -8,10 +8,31 @@ G.FUNCS.cry_asc_UI_set = function(e) end e.config.object:update_text() end + +-- Needed because get_poker_hand_info isnt called at the end of the road +local evaluateroundref = G.FUNCS.evaluate_round +function G.FUNCS.evaluate_round() + evaluateroundref() + -- This is just the easiest way to check if its gold because lua is annoying + if G.C.UI_CHIPS[1] == G.C.GOLD[1] then + ease_colour(G.C.UI_CHIPS, G.C.BLUE, 0.3) + ease_colour(G.C.UI_MULT, G.C.RED, 0.3) + end +end + -- this is a hook to make funny "x of a kind"/"flush x" display text local pokerhandinforef = G.FUNCS.get_poker_hand_info function G.FUNCS.get_poker_hand_info(_cards) local text, loc_disp_text, poker_hands, scoring_hand, disp_text = pokerhandinforef(_cards) + -- Display text if played hand contains a Cluster and a Bulwark + -- Not Ascended hand related but this hooks in the same spot so i'm lumping it here anyways muahahahahahaha + if text == "cry_Clusterfuck" then + if next(poker_hands["cry_Bulwark"]) then + disp_text = "cry-Cluster Bulwark" + loc_disp_text = localize(disp_text, "poker_hands") + end + end + if G.SETTINGS.language == "en-us" then if #scoring_hand > 5 and (text == "Flush Five" or text == "Five of a Kind") then local rank_array = {} @@ -108,7 +129,14 @@ function G.FUNCS.get_poker_hand_info(_cards) ["cry_UltPair"] = 8, ["cry_WholeDeck"] = 52, } - + -- Change mult and chips colors if hand is ascended + if hand_table[text] and next(scoring_hand) and #scoring_hand > hand_table[text] then + ease_colour(G.C.UI_CHIPS, copy_table(G.C.GOLD), 0.3) + ease_colour(G.C.UI_MULT, copy_table(G.C.GOLD), 0.3) + else + ease_colour(G.C.UI_CHIPS, G.C.BLUE, 0.3) + ease_colour(G.C.UI_MULT, G.C.RED, 0.3) + 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 @@ -124,7 +152,12 @@ function G.FUNCS.get_poker_hand_info(_cards) end G.GAME.current_round.current_hand.cry_asc_num_text = ( - G.GAME.current_round.current_hand.cry_asc_num and G.GAME.current_round.current_hand.cry_asc_num > 0 + G.GAME.current_round.current_hand.cry_asc_num + and ( + type(G.GAME.current_round.current_hand.cry_asc_num) == "table" + and G.GAME.current_round.current_hand.cry_asc_num:gt(to_big(0)) + or G.GAME.current_round.current_hand.cry_asc_num > 0 + ) ) and " (+" .. G.GAME.current_round.current_hand.cry_asc_num .. ")" or "" @@ -148,14 +181,21 @@ function Cryptid.ascend(num) -- edit this function at your leisure * ( 1 + 0.1 - + (0.05 * (G.GAME.sunnumber or 0)) - + ((0.1 + (0.05 * (G.GAME.sunnumber or 0))) * (G.GAME.current_round.current_hand.cry_asc_num or 0)) + + to_big(0.05 * (G.GAME.sunnumber or 0)) + + to_big( + (0.1 + (0.05 * (G.GAME.sunnumber or 0))) + * to_big(G.GAME.current_round.current_hand.cry_asc_num or 0) + ) ) ) else return math.max( num, - num * ((1.25 + (0.05 * (G.GAME.sunnumber or 0))) ^ (G.GAME.current_round.current_hand.cry_asc_num or 0)) + num + * to_big( + (1.25 + (0.05 * (G.GAME.sunnumber or 0))) + ^ to_big(G.GAME.current_round.current_hand.cry_asc_num or 0) + ) ) end end diff --git a/Cryptid/lib/calculate.lua b/Cryptid/lib/calculate.lua index d1059c2..2a97533 100644 --- a/Cryptid/lib/calculate.lua +++ b/Cryptid/lib/calculate.lua @@ -263,7 +263,11 @@ function Card:cry_double_scale_calc(orig_ability, in_context_scaling) end if #dbl_info.scaler == 2 then if - not (not orig_ability[dbl_info.scaler[1]] or not orig_ability[dbl_info.scaler[1]][dbl_info.scaler[2]]) + not ( + not orig_ability[dbl_info.scaler[1]] + or type(orig_ability[dbl_info.scaler[1]]) == "number" + or not orig_ability[dbl_info.scaler[1]][dbl_info.scaler[2]] + ) then orig_scale_scale = orig_ability[dbl_info.scaler[1]][dbl_info.scaler[2]] end @@ -474,7 +478,7 @@ function SMODS.calculate_context(context, return_table) SMODS.trigger_effects(effects, _card) end end - smcc(context, return_table) + local ret = smcc(context, return_table) for k, v in pairs(SMODS.Events) do if G.GAME.events and G.GAME.events[k] then context.post_jokers = true @@ -482,6 +486,7 @@ function SMODS.calculate_context(context, return_table) context.post_jokers = nil end end + return ret end function Card:calculate_joker(context) @@ -592,7 +597,12 @@ function Card:calculate_joker(context) if active_side.ability.cry_rigged then G.GAME.probabilities.normal = ggpn end - active_side:cry_double_scale_calc(orig_ability, in_context_scaling) + if + (next(find_joker("cry-Scalae")) or next(find_joker("cry-Double Scale"))) + or (active_side.ability.name == "cry-Exponentia" or "cry-Compound Interest") + then + active_side:cry_double_scale_calc(orig_ability, in_context_scaling) + end return ret, trig end @@ -615,6 +625,9 @@ function Cryptid.exponentia_scale_mod(self, orig_scale_scale, orig_scale_base, n end end end + if not dbl_info then + dbl_info = {} + end if G.GAME.cry_double_scale[jkr.sort_id] and not G.GAME.cry_double_scale[jkr.sort_id].scaler then dbl_info.base = { "extra", "Emult" } dbl_info.scaler = { "extra", "Emult_mod" } diff --git a/Cryptid/lib/content.lua b/Cryptid/lib/content.lua index 14c6f9a..e24ee09 100644 --- a/Cryptid/lib/content.lua +++ b/Cryptid/lib/content.lua @@ -1,5 +1,12 @@ -- content.lua - adds SMODS objects for content that should always be loaded +SMODS.Atlas({ + key = "poker_hands", + path = "hands.png", + px = 53, + py = 13, +}) + SMODS.PokerHand({ key = "Bulwark", visible = false, @@ -14,13 +21,18 @@ SMODS.PokerHand({ { "S_A", true, "m_stone" }, { "S_A", true, "m_stone" }, }, + atlas = "poker_hands", + pos = { x = 0, y = 0 }, evaluate = function(parts, hand) if Cryptid.enabled("set_cry_poker_hand_stuff") ~= true or Cryptid.enabled("c_cry_asteroidbelt") ~= true then return {} end local stones = {} for i, card in ipairs(hand) do - if card.config.center_key == "m_stone" or (card.config.center.no_rank and card.config.center.no_suit) then + if + card.config.center_key == "m_stone" + or (card.config.center.no_rank and card.config.center.no_suit and not card.config.center.not_stoned) + then stones[#stones + 1] = card end end @@ -35,7 +47,7 @@ SMODS.PokerHandPart({ end local eligible_cards = {} for i, card in ipairs(hand) do - if true then --card.ability.name ~= "Gold Card" + if not card.config.center.not_fucked then --card.ability.name ~= "Gold Card" eligible_cards[#eligible_cards + 1] = card end end @@ -62,6 +74,8 @@ SMODS.PokerHand({ { "S_6", true }, { "C_5", true }, }, + atlas = "poker_hands", + pos = { x = 0, y = 1 }, evaluate = function(parts, hand) local other_hands = next(parts._flush) or next(parts._straight) or next(parts._all_pairs) if next(parts.cry_cfpart) then @@ -89,6 +103,8 @@ SMODS.PokerHand({ { "H_7", true }, { "H_7", true }, }, + atlas = "poker_hands", + pos = { x = 0, y = 2 }, evaluate = function(parts, hand) if Cryptid.enabled("set_cry_poker_hand_stuff") ~= true or Cryptid.enabled("c_cry_marsmoons") ~= true then return @@ -439,6 +455,10 @@ SMODS.Sound({ key = "studiofromhelsinki", path = "studiofromhelsinki.ogg", }) +SMODS.Sound({ + key = "whapoosh", + path = "whapoosh.ogg", +}) SMODS.Sound({ key = "music_jimball", path = "music_jimball.ogg", @@ -631,12 +651,6 @@ SMODS.Atlas({ px = 71, py = 95, }) -SMODS.Atlas({ - key = "code", - path = "c_cry_code.png", - px = 71, - py = 95, -}) SMODS.Atlas({ key = "pack", path = "pack_cry.png", @@ -645,17 +659,17 @@ SMODS.Atlas({ }) SMODS.UndiscoveredSprite({ key = "Code", - atlas = "code", - path = "c_cry_code.png", - pos = { x = 2, y = 5 }, + atlas = "atlasnotjokers", + path = "atlasnotjokers.png", + pos = { x = 9, y = 5 }, px = 71, py = 95, }) SMODS.UndiscoveredSprite({ key = "Unique", - atlas = "code", - path = "c_cry_code.png", - pos = { x = 2, y = 5 }, + atlas = "atlasnotjokers", + path = "atlasnotjokers.png", + pos = { x = 9, y = 5 }, px = 71, py = 95, }) diff --git a/Cryptid/lib/cross-mod.lua b/Cryptid/lib/cross-mod.lua index be1921f..5dc2e56 100644 --- a/Cryptid/lib/cross-mod.lua +++ b/Cryptid/lib/cross-mod.lua @@ -103,3 +103,40 @@ if (SMODS.Mods["malverk"] or {}).can_load then }, }) end + +--Make extra modifiers display on the Next Ante Preview +if (SMODS.Mods["AntePreview"] or {}).can_load then + local predict_hook = predict_next_ante + function predict_next_ante() + local small = "bl_small" + local big = "bl_big" + 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 + local predictions = predict_hook() + if next(SMODS.find_card("j_cry_kittyprinter")) then + predictions.Small.tag = "tag_cry_cat" + predictions.Big.tag = "tag_cry_cat" + end + if G.GAME.modifiers.cry_no_tags then + for _, pred in pairs(predictions) do + pred.tag = nil + end + end + predictions.Small.blind = small + predictions.Big.blind = big + if G.P_BLINDS[predictions.Small.blind].boss then + G.GAME.bosses_used[predictions.Small.blind] = G.GAME.bosses_used[predictions.Small.blind] - 1 + end + 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/Cryptid/lib/gameset.lua b/Cryptid/lib/gameset.lua index 73962f6..8b02f75 100644 --- a/Cryptid/lib/gameset.lua +++ b/Cryptid/lib/gameset.lua @@ -15,7 +15,6 @@ Cryptid.cross_mod_names = { CardSleeves = "Card Sleeves", Cryptid = "Cryptid", - jen = "Jen's Almanac", sdm0sstuff = "SDM_0's Stuff", magic_the_jokering = "Magic the Jokering", } @@ -600,6 +599,9 @@ function Card:get_gameset(center) end local csa = Card.set_ability function Card:set_ability(center, y, z) + if not center then + return + end if not center.config then center.config = {} --crashproofing end @@ -1194,8 +1196,8 @@ SMODS.ContentSet({ }) SMODS.ContentSet({ key = "code", - atlas = "code", - pos = { x = 0, y = 0 }, --://CRASH + atlas = "atlasnotjokers", + pos = { x = 7, y = 0 }, --://CRASH cry_order = -39, }) SMODS.ContentSet({ diff --git a/Cryptid/lib/https.lua b/Cryptid/lib/https.lua index ff5f920..d037208 100644 --- a/Cryptid/lib/https.lua +++ b/Cryptid/lib/https.lua @@ -1,16 +1,20 @@ -- Update the Cryptid member count using HTTPS -local member_fallback = 24000 -local https = require("SMODS.https") +local member_fallback = 29332 +local succ, https = pcall(require, "SMODS.https") local last_update_time = 0 local initial = true Cryptid.member_count = member_fallback +if not succ then + sendErrorMessage("HTTP module could not be loaded. " .. tostring(https), "Cryptid") +end + local function apply_discord_member_count(code, body, headers) if body then - Cryptid.member_count = string.match(body, '"approximate_member_count"%s*:%s*(%d+)') + Cryptid.member_count = string.match(body, '"approximate_member_count"%s*:%s*(%d+)') or Cryptid.member_count end end function Cryptid.update_member_count() - if Cryptid_config.HTTPS then + if Cryptid_config.HTTPS and https and https.asyncRequest then if (os.time() - last_update_time >= 60) or initial then initial = false last_update_time = os.time() diff --git a/Cryptid/lib/misc.lua b/Cryptid/lib/misc.lua index 9fdc8dd..d6d93da 100644 --- a/Cryptid/lib/misc.lua +++ b/Cryptid/lib/misc.lua @@ -184,6 +184,9 @@ function Cryptid.pluralize(str, vars) table.insert(_table, v) end local num = vars[tonumber(string.match(str, ">(%d+)"))] -- gets reference variable + if type(num) == "string" then + num = (Big and to_number(to_big(num))) or num + end local plural = _table[1] -- default local checks = { [1] = "=" } -- checks 1 by default local checks1mod = false -- tracks if 1 was modified @@ -216,7 +219,7 @@ function Cryptid.pluralize(str, vars) end) for _, k in ipairs(keys) do if fch(checks[k], "=") then - if math.abs(to_big(num) - k) < to_big(0.001) then + if to_big(math.abs(num - k)) < to_big(0.001) then return string.sub(checks[k], 2, -1) end elseif fch(checks[k], "<") then @@ -277,7 +280,7 @@ end -- checks for Jolly Jokers or cards that are supposed to be treated as jolly jokers function Card:is_jolly() - if self.ability.name == "Jolly Joker" then + if self.ability.name == "Jolly Joker" or self.ability.name == "cry-jollysus Joker" then return true end if self.edition and self.edition.key == "e_cry_m" then @@ -575,7 +578,7 @@ end function Cryptid.safe_get(t, ...) local current = t for _, k in ipairs({ ... }) do - if current[k] == nil then + if not current or current[k] == nil then return false end current = current[k] @@ -708,3 +711,52 @@ end function Cryptid.forced_edition() return G.GAME.modifiers.cry_force_edition or G.GAME.used_vouchers.v_cry_curate end + +-- Add Ctrl+Space for Pointer UI in Debug Mode +local ckpu = Controller.key_press_update +function Controller:key_press_update(key, dt) + ckpu(self, key, dt) + if + key == "space" + and G.STAGE == G.STAGES.RUN + and not _RELEASE_MODE + and (self.held_keys["lctrl"] or self.held_keys["rctrl"] or self.held_keys["lgui"] or self.held_keys["rgui"]) + and not G.GAME.USING_CODE + then + G.GAME.USING_CODE = true + G.GAME.USING_POINTER = true + G.DEBUG_POINTER = true + G.ENTERED_CARD = "" + G.CHOOSE_CARD = UIBox({ + definition = create_UIBox_pointer(card), + config = { + align = "cm", + offset = { x = 0, y = 10 }, + major = G.ROOM_ATTACH, + bond = "Weak", + instance_type = "POPUP", + }, + }) + G.CHOOSE_CARD.alignment.offset.y = 0 + G.ROOM.jiggle = G.ROOM.jiggle + 1 + G.CHOOSE_CARD:align_to_major() + end +end + +function Cryptid.roll_shiny() + local prob = 1 + if next(SMODS.find_card("j_lucky_cat")) then + prob = 3 + end + if pseudorandom("cry_shiny") < prob / 4096 then + return "shiny" + end + return "normal" +end + +function Cryptid.is_shiny() + if Cryptid.roll_shiny() == "shiny" then + return true + end + return false +end diff --git a/Cryptid/lib/misprintize.lua b/Cryptid/lib/misprintize.lua index 0d2ee5d..6460b08 100644 --- a/Cryptid/lib/misprintize.lua +++ b/Cryptid/lib/misprintize.lua @@ -9,6 +9,7 @@ function Cryptid.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stac if (type(tbl[k]) ~= "table") or is_number(tbl[k]) then if is_number(tbl[k]) + and not (k == "perish_tally") and not (k == "id") and not (k == "colour") and not (k == "suit_nominal") @@ -16,6 +17,8 @@ function Cryptid.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stac and not (k == "face_nominal") and not (k == "qty") and not (k == "x_mult" and v == 1 and not tbl.override_x_mult_check) + and not (k == "x_chips" and v == 1 and not tbl.override_x_chips_check) + and not (k == "h_x_chips") and not (k == "selected_d6_face") then --Temp fix, even if I did clamp the number to values that wouldn't crash the game, the fact that it did get randomized means that there's a higher chance for 1 or 6 than other values if not Cryptid.base_values[name] then @@ -38,18 +41,19 @@ function Cryptid.misprintize_tbl(name, ref_tbl, ref_value, clear, override, stac big ) end - else + elseif not (k == "immutable") then for _k, _v in pairs(tbl[k]) do if is_number(tbl[k][_k]) and not (_k == "id") - and not (k == "perish_tally") and not (k == "colour") and not (_k == "suit_nominal") and not (_k == "base_nominal") and not (_k == "face_nominal") and not (_k == "qty") and not (k == "x_mult" and v == 1 and not tbl[k].override_x_mult_check) + and not (k == "x_chips" and v == 1 and not tbl[k].override_x_chips_check) + and not (k == "h_x_chips") and not (_k == "selected_d6_face") then --Refer to above if not Cryptid.base_values[name] then diff --git a/Cryptid/lib/modifiers.lua b/Cryptid/lib/modifiers.lua index 6db4eac..fb80535 100644 --- a/Cryptid/lib/modifiers.lua +++ b/Cryptid/lib/modifiers.lua @@ -307,6 +307,26 @@ end local updateref = Card.update function Card:update(dt) updateref(self, dt) + if self.area then + if self.area.config.type == "discard" or self.area.config.type == "deck" then + return --prevent lagging event queues with unneeded flips + end + end + if self.sprite_facing == "back" and self.edition and self.edition.cry_double_sided then + self.sprite_facing = "front" + self.facing = "front" + if self.flipping == "f2b" then + self.flipping = "b2f" + end + self:dbl_side_flip() + end + if self.ability.cry_absolute then -- feedback loop... may be problematic + self.cry_absolute = true + end + if self.cry_absolute then + self.ability.cry_absolute = true + self.ability.eternal = true + end if self.ability.pinned then self.pinned = true end -- gluing these variables together @@ -371,7 +391,7 @@ function cry_best_interest_cap() local vouchers = { SMODS.find_card("v_seed_money"), SMODS.find_card("v_money_tree"), - SMODS.find_card("v_cry_money_beanstalk"), + SMODS.find_card("v_cry_moneybean"), } for _, table in ipairs(vouchers) do for i, v in ipairs(table) do @@ -382,11 +402,25 @@ function cry_best_interest_cap() end return best end - local evaluateroundref = G.FUNCS.evaluate_round G.FUNCS.evaluate_round = function() G.GAME.interest_cap = cry_best_interest_cap() -- blehhhhhh - evaluateroundref() + --Semicolon Stuff + if G.GAME.current_round.semicolon then + add_round_eval_row({ dollars = 0, name = "blind1", pitch = 0.95, saved = true }) + G.E_MANAGER:add_event(Event({ + trigger = "before", + delay = 1.3 * math.min(G.GAME.blind.dollars + 2, 7) / 2 * 0.15 + 0.5, + func = function() + G.GAME.blind:defeat() + return true + end, + })) + delay(0.2) + add_round_eval_row({ name = "bottom", dollars = 0 }) + else + return evaluateroundref() + end end function Cryptid.edition_to_table(edition) -- look mom i figured it out (this does NOT need to be a function) if edition then @@ -749,7 +783,7 @@ function Tag:set_ability() G.GAME.cry_shiny_choices[G.GAME.round_resets.ante] = G.GAME.cry_shiny_choices[G.GAME.round_resets.ante] or {} if not G.GAME.cry_shiny_choices[G.GAME.round_resets.ante][self.ability.blind_type] then - G.GAME.cry_shiny_choices[G.GAME.round_resets.ante][self.ability.blind_type] = cry_rollshiny() + G.GAME.cry_shiny_choices[G.GAME.round_resets.ante][self.ability.blind_type] = Cryptid.roll_shiny() end self.ability.shiny = G.GAME.cry_shiny_choices[G.GAME.round_resets.ante][self.ability.blind_type] == "shiny" and true diff --git a/Cryptid/lib/overrides.lua b/Cryptid/lib/overrides.lua index cb4b8bf..ca92b75 100644 --- a/Cryptid/lib/overrides.lua +++ b/Cryptid/lib/overrides.lua @@ -176,6 +176,7 @@ function Game:init_game_object() g.monstermult = 1 -- Create G.GAME.events when starting a run, so there's no errors g.events = {} + g.jokers_sold = {} return g end @@ -190,7 +191,7 @@ function reset_castle_card() G.GAME.current_round.cry_dropshot_card.suit = "Spades" local valid_castle_cards = {} for k, v in ipairs(G.playing_cards) do - if v.ability.effect ~= "Stone Card" then + if not SMODS.has_no_suit(v) then valid_castle_cards[#valid_castle_cards + 1] = v end end @@ -285,7 +286,7 @@ function Game:update(dt) if G.P_CENTERS and G.P_CENTERS.c_cry_pointer and cry_pointer_dt > 0.5 then cry_pointer_dt = 0 local pointerobj = G.P_CENTERS.c_cry_pointer - pointerobj.pos.x = (pointerobj.pos.x == 4) and 5 or 4 + pointerobj.pos.x = (pointerobj.pos.x == 11) and 12 or 11 end if G.P_CENTERS and G.P_CENTERS.j_cry_jimball and cry_jimball_dt > 0.1 then cry_jimball_dt = 0 @@ -474,6 +475,38 @@ function Card:set_cost() self.sell_cost_label = 0 end end +local sell_card_stuff = Card.sell_card +function Card:sell_card() + if self.config.center.set == "Joker" then + if self.config.center.key ~= "j_cry_necromancer" then + local contained = false + for _, v in ipairs(G.GAME.jokers_sold) do + if v == self.config.center.key then + contained = true + break + end + end + if not contained then + table.insert(G.GAME.jokers_sold, self.config.center.key) + end + end + -- Add Jolly Joker to the pool if card was treated as Jolly Joker + if self:is_jolly() then + local contained = false + for _, v in ipairs(G.GAME.jokers_sold) do + if v == "j_jolly" then + contained = true + break + end + end + if not contained then + table.insert(G.GAME.jokers_sold, "j_jolly") + end + end + end + --G.P_CENTERS.j_jolly + sell_card_stuff(self) +end -- Modify to display badges for credits and some gameset badges -- todo: make this optional @@ -681,14 +714,11 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable ps = Cryptid.predict_pseudoseed end local center = G.P_CENTERS.b_red - if (_type == "Joker") and G.GAME and G.GAME.modifiers and G.GAME.modifiers.all_rnj then + if (_type == "Joker" or _type == "Meme") and G.GAME and G.GAME.modifiers and G.GAME.modifiers.all_rnj then forced_key = "j_cry_rnjoker" end local function aeqviable(center) - return center.unlocked - and not Cryptid.no(center, "doe") - and not Cryptid.no(center, "aeq") - and not (center.rarity == 6 or center.rarity == "cry_exotic") + return center.unlocked and not Cryptid.no(center, "doe") and not (center.rarity == "cry_exotic") end if _type == "Joker" and not _rarity and not legendary then if not G.GAME.aequilibriumkey then @@ -1002,12 +1032,12 @@ function create_card(_type, area, legendary, _rarity, skip_materialize, soulable if not (card.edition and (card.edition.cry_oversat or card.edition.cry_glitched)) then Cryptid.misprintize(card) end - if _type == "Joker" and G.GAME.modifiers.cry_common_value_quad then + if card.ability.set == "Joker" and G.GAME.modifiers.cry_common_value_quad then if card.config.center.rarity == 1 then Cryptid.misprintize(card, { min = 4, max = 4 }, nil, true) end end - if _type == "Joker" and G.GAME.modifiers.cry_uncommon_value_quad then + if card.ability.set == "Joker" and G.GAME.modifiers.cry_uncommon_value_quad then if card.config.center.rarity == 2 then Cryptid.misprintize(card, { min = 4, max = 4 }, nil, true) end diff --git a/Cryptid/lib/ui.lua b/Cryptid/lib/ui.lua index 7d6b23e..ae81f44 100644 --- a/Cryptid/lib/ui.lua +++ b/Cryptid/lib/ui.lua @@ -241,6 +241,9 @@ function Card:move(dt) end end +function Card:get_banned_force_popup_areas() + return { G.pack_cards } +end -- This defines when we should show a card's description even when it's not hovered function Card:force_popup() -- Must be selected @@ -262,8 +265,10 @@ function Card:force_popup() return false end -- Other areas where it doesn't work well - if self.area == G.pack_cards then - return false + for i, v in ipairs(self:get_banned_force_popup_areas()) do + if self.area == v then + return false + end end return true end @@ -285,7 +290,7 @@ function CardArea:can_highlight(card) if self.config.collection then return true end - return cach(self) + return cach(self, card) end -- Prevent hover UI from being redrawn @@ -296,3 +301,209 @@ function Card:hover() end ch(self) end + +local G_UIDEF_use_and_sell_buttons_ref = G.UIDEF.use_and_sell_buttons +function G.UIDEF.use_and_sell_buttons(card) + local abc = G_UIDEF_use_and_sell_buttons_ref(card) + -- Allow code cards to be reserved + if (card.area == G.pack_cards and G.pack_cards) and card.ability.consumeable then --Add a use button + if card.ability.set == "Code" then + return { + n = G.UIT.ROOT, + config = { padding = -0.1, colour = G.C.CLEAR }, + nodes = { + { + n = G.UIT.R, + config = { + ref_table = card, + r = 0.08, + padding = 0.1, + align = "bm", + minw = 0.5 * card.T.w - 0.15, + minh = 0.7 * card.T.h, + maxw = 0.7 * card.T.w - 0.15, + hover = true, + shadow = true, + colour = G.C.UI.BACKGROUND_INACTIVE, + one_press = true, + button = "use_card", + func = "can_reserve_card", + }, + nodes = { + { + n = G.UIT.T, + config = { + text = localize("b_pull"), + colour = G.C.UI.TEXT_LIGHT, + scale = 0.55, + shadow = true, + }, + }, + }, + }, + { + n = G.UIT.R, + config = { + ref_table = card, + r = 0.08, + padding = 0.1, + align = "bm", + minw = 0.5 * card.T.w - 0.15, + maxw = 0.9 * card.T.w - 0.15, + minh = 0.1 * card.T.h, + hover = true, + shadow = true, + colour = G.C.UI.BACKGROUND_INACTIVE, + one_press = true, + button = "Do you know that this parameter does nothing?", + func = "can_use_consumeable", + }, + nodes = { + { + n = G.UIT.T, + config = { + text = localize("b_use"), + colour = G.C.UI.TEXT_LIGHT, + scale = 0.45, + shadow = true, + }, + }, + }, + }, + { n = G.UIT.R, config = { align = "bm", w = 7.7 * card.T.w } }, + { n = G.UIT.R, config = { align = "bm", w = 7.7 * card.T.w } }, + { n = G.UIT.R, config = { align = "bm", w = 7.7 * card.T.w } }, + { n = G.UIT.R, config = { align = "bm", w = 7.7 * card.T.w } }, + -- Betmma can't explain it, neither can I + }, + } + end + end + -- Remove sell button from cursed jokers + if + card.area + and card.area.config.type == "joker" + and card.config + and card.config.center + and card.config.center.rarity == "cry_cursed" + and card.ability.name ~= "cry-Monopoly" + then + table.remove(abc.nodes[1].nodes, 1) + end + if card.config and card.config.center and card.config.center.key == "c_cry_potion" then + table.remove(abc.nodes[1].nodes, 1) + end + if + card.area + and card.edition + and (card.area == G.jokers or card.area == G.consumeables or card.area == G.hand) + and card.edition.cry_double_sided + and not Card.no(card, "dbl") + then + local use = { + n = G.UIT.C, + config = { align = "cr" }, + nodes = { + { + n = G.UIT.C, + config = { + ref_table = card, + align = "cr", + maxw = 1.25, + padding = 0.1, + r = 0.08, + hover = true, + shadow = true, + colour = G.C.UI.BACKGROUND_INACTIVE, + one_press = true, + button = "flip", + func = "can_flip_card", + }, + nodes = { + { n = G.UIT.B, config = { w = 0.1, h = 0.3 } }, + { + n = G.UIT.T, + config = { + text = localize("b_flip"), + colour = G.C.UI.TEXT_LIGHT, + scale = 0.3, + shadow = true, + }, + }, + }, + }, + }, + } + local m = abc.nodes[1] + if not card.added_to_deck then + use.nodes[1].nodes = { use.nodes[1].nodes[2] } + if card.ability.consumeable then + m = abc + end + end + m.nodes = m.nodes or {} + table.insert(m.nodes, { n = G.UIT.R, config = { align = "cl" }, nodes = { + use, + } }) + return abc + end + if + card.area + and (card.area == G.jokers or card.area == G.consumeables or card.area == G.hand) + and (not card.edition or not card.edition.cry_double_sided) + and not card.ability.eternal + and not Card.no(card, "dbl") + then + for i = 1, #card.area.cards do + if card.area.cards[i].edition and card.area.cards[i].edition.cry_double_sided then + local use = { + n = G.UIT.C, + config = { align = "cr" }, + nodes = { + { + n = G.UIT.C, + config = { + ref_table = card, + align = "cr", + maxw = 1.25, + padding = 0.1, + r = 0.08, + hover = true, + shadow = true, + colour = G.C.UI.BACKGROUND_INACTIVE, + one_press = true, + button = "flip_merge", + func = "can_flip_merge_card", + }, + nodes = { + { n = G.UIT.B, config = { w = 0.1, h = 0.3 } }, + { + n = G.UIT.T, + config = { + text = localize("b_merge"), + colour = G.C.UI.TEXT_LIGHT, + scale = 0.3, + shadow = true, + }, + }, + }, + }, + }, + } + local m = abc.nodes[1] + if not card.added_to_deck then + use.nodes[1].nodes = { use.nodes[1].nodes[2] } + if card.ability.consumeable then + m = abc + end + end + m.nodes = m.nodes or {} + table.insert(m.nodes, { n = G.UIT.R, config = { align = "cl" }, nodes = { + use, + } }) + return abc + end + end + end + return abc +end diff --git a/Cryptid/localization/de.lua b/Cryptid/localization/de.lua index effdd10..d7ba2c0 100644 --- a/Cryptid/localization/de.lua +++ b/Cryptid/localization/de.lua @@ -167,7 +167,7 @@ return { name = "Die Uhr", text = { "+0.1X Blindgröße für alle", - "3 Sekunden, die du in dieser Ante verbringst.", + "12 Sekunden, die du in dieser Ante verbringst.", }, }, bl_cry_hammer = { @@ -195,7 +195,7 @@ return { name = "Lavendelschleife", text = { "1.25X Blindgröße für alle", - "1.5 Sekunden, die du in dieser Runde verbringst", + "6 Sekunden, die du in dieser Runde verbringst", }, }, bl_cry_obsidian_orb = { @@ -1304,6 +1304,7 @@ return { j_cry_kidnap = { name = "Entführung", text = { + "{C:red}Outdated Description{}", "Verdiene {C:money}$#2#{} am Ende der Runde", "Erhöhe Auszahlung um {C:money}$#1#{}", "wenn ein {C:attention}Mult Typ{} oder", diff --git a/Cryptid/localization/en-us.lua b/Cryptid/localization/en-us.lua index 9b11069..366ca9e 100644 --- a/Cryptid/localization/en-us.lua +++ b/Cryptid/localization/en-us.lua @@ -7,6 +7,11 @@ return { "Applies the {C:legendary,E:1}upsides{}", "of {C:attention}every{} deck", }, + unlock = { + "Win a run", + "with {C:attention}Blank Deck", + "on {C:attention}Gold Stake", + }, }, b_cry_antimatter_balanced = { name = "Antimatter Deck", @@ -22,6 +27,11 @@ return { "{C:attention}Common{} Jokers have", "{C:attention}quadrupled{} values", }, + unlock = { + "Discover at least", + "{C:attention}200{} items from", + "your collection", + }, }, b_cry_beta = { name = "Nostalgic Deck", @@ -31,6 +41,10 @@ return { "{C:attention}Nostalgic{} Blinds replace", "their updated Blind", }, + unlock = { + "Win a run", + "on {C:attention}Pink Stake", + }, }, b_cry_blank = { name = "Blank Deck", @@ -44,6 +58,10 @@ return { "After {C:blue}Play{} or {C:red}Discard{},", "always draw {C:attention}5{} cards", }, + unlock = { + "Beat {C:attention}The Serpent", + "without {C:red}discarding", + }, }, b_cry_CCD = { name = "CCD Deck", @@ -51,6 +69,9 @@ return { "Every card is also", "a {C:attention}random{} consumable", }, + unlock = { + "Use {C:spectral}Hammerspace", + }, }, b_cry_conveyor = { name = "Conveyor Deck", @@ -60,6 +81,9 @@ return { "{C:attention}duplicate{} rightmost Joker", "and {C:attention}destroy{} leftmost Joker", }, + unlock = { + "Use {C:spectral}Analog", + }, }, b_cry_critical = { name = "Critical Deck", @@ -68,6 +92,9 @@ return { "{C:green}#1# in 4{} chance for {X:dark_edition,C:white} ^2 {} Mult", "{C:green}#1# in 8{} chance for {X:dark_edition,C:white} ^0.5 {} Mult", }, + unlock = { + "Obtain a {C:attention}Rigged Joker", + }, }, b_cry_e_deck = { name = "Edition Deck", @@ -76,6 +103,10 @@ return { "Cards cannot change editions", "{C:inactive}(Click to edit)", }, + unlock = { + "Discover every", + "{C:dark_edition}Edition", + }, }, b_cry_encoded = { name = "Encoded Deck", @@ -84,6 +115,9 @@ return { "and a {C:cry_code,T:j_cry_copypaste}Copy/Paste{}", "Only {C:cry_code}Code Cards{} appear in shop", }, + unlock = { + "Use {C:spectral}POINTER://", + }, }, b_cry_equilibrium = { name = "Deck of Equilibrium", @@ -94,6 +128,10 @@ return { "start run with", "{C:attention,T:v_overstock_plus}Overstock Plus", }, + unlock = { + "Have {C:attention}100 Jokers", + "at the same time", + }, }, b_cry_et_deck = { name = "Enhancement Deck", @@ -102,6 +140,9 @@ return { "are {C:attention}#1#{}(s)", "{C:inactive}(Click to edit)", }, + unlock = { + "Use {C:spectral}Vacuum", + }, }, b_cry_glowing = { name = "Glowing Deck", @@ -111,6 +152,10 @@ return { "when Boss Blind is defeated", "{X:cry_jolly,C:white,s:0.8} Jolly#1#Open#1#Winner#1#-#1#wawa#1#person", --peak loc_vars right here }, + unlock = { + "Win a run", + "with {C:attention}Beige Deck", + }, }, b_cry_infinite = { name = "Infinite Deck", @@ -119,6 +164,10 @@ return { "number of cards", "{C:attention}+1{} hand size", }, + unlock = { + "Play a hand containing", + "{C:attention}6{} or more cards", + }, }, b_cry_misprint = { name = "Misprint Deck", @@ -127,6 +176,9 @@ return { "and poker hands", "are {C:attention}randomized", }, + unlock = { + "Obtain a {C:dark_edition}Glitched{C:attention} Joker", + }, }, b_cry_redeemed = { name = "Redeemed Deck", @@ -134,6 +186,10 @@ return { "When a {C:attention}Voucher{} is purchased,", "gain its {C:attention}extra tiers", }, + unlock = { + "Discover every", + "{C:attention}Voucher", + }, }, b_cry_sk_deck = { name = "Sticker Deck", @@ -141,6 +197,9 @@ return { "All cards are {C:attention}#1#{}", "{C:inactive}(Click to edit)", }, + unlock = { + "Use {C:spectral}Lock", + }, }, b_cry_sl_deck = { name = "Seal Deck", @@ -149,6 +208,9 @@ return { "Cards cannot change seals", "{C:inactive}(Click to edit)", }, + unlock = { + "Use {C:spectral}Typhoon", + }, }, b_cry_spooky = { name = "Spooky Deck", @@ -157,6 +219,9 @@ return { "After each {C:attention}Ante{}, create a", "{C:cry_candy}Candy{} or {X:cry_cursed,C:white}Cursed{} Joker", }, + unlock = { + "Obtain a {C:cry_candy}Candy{C:attention} Joker", + }, }, b_cry_st_deck = { name = "Suit Deck", @@ -165,6 +230,9 @@ return { "and cannot change suits", "{C:inactive}(Click to edit)", }, + unlock = { + "Use {C:spectral}Replica", + }, }, b_cry_very_fair = { name = "Very Fair Deck", @@ -174,6 +242,10 @@ return { "{C:attention}Vouchers{} no longer", "appear in the shop", }, + unlock = { + "Win a run", + "with {C:attention}Blank Deck", + }, }, b_cry_wormhole = { name = "Wormhole Deck", @@ -183,6 +255,9 @@ return { "likely to be {C:dark_edition}Negative", "{C:attention}-2{} Joker slots", }, + unlock = { + "Obtain an {C:cry_exotic}Exotic{C:attention} Joker", + }, }, b_cry_legendary = { name = "Legendary Deck", @@ -191,6 +266,10 @@ return { "{C:green}1 in 5{} chance to create another", "when Boss Blind is defeated {C:inactive}(must have room){}", }, + unlock = { + "Have {C:attention}2 Legendary Jokers", + "at the same time", + }, }, }, Blind = { @@ -205,7 +284,7 @@ return { name = "The Clock", text = { "+0.1X blind requirements every", - "3 seconds spent this ante", + "12 seconds spent this ante", }, }, bl_cry_hammer = { @@ -233,7 +312,7 @@ return { name = "Lavender Loop", text = { "1.25X blind requirements every", - "1.5 seconds spent this round", + "6 seconds spent this round", }, }, bl_cry_obsidian_orb = { @@ -309,6 +388,14 @@ return { "rarity are debuffed", }, }, + bl_cry_scorch = { + name = "The Scorch", + text = { + "Must play 5 cards,", + "destroy played and", + "discarded cards", + }, + }, bl_cry_pinkbow = { name = "Pink Bow", text = { @@ -486,8 +573,9 @@ return { c_cry_patch = { name = "://PATCH", text = { - "Remove all debuffs and stickers", + "Remove all {C:cry_code}debuffs", "from currently visible items", + "{C:cry_code}Resets{} shop state", }, }, c_cry_payload = { @@ -1080,6 +1168,15 @@ return { "for the next {C:attention}#2#{} round#2#", }, }, + j_cry_cat_owl = { + name = "Cat Owl", + text = { + "{C:attention}Lucky Cards{} are also", + "considered {C:attention}Echo Cards", + "{C:attention}Echo Cards{} are also", + "considered {C:attention}Lucky Cards", + }, + }, j_cry_chad = { name = "Chad", text = { @@ -1148,6 +1245,15 @@ return { "you {C:attention}click", }, }, + j_cry_clockwork = { + name = "Clockwork Joker", + text = { + "Retrigger held Steel Cards every {C:attention}#9#{} {C:inactive}(#1#){} hands", + "This Joker gains {X:mult,C:white}X#6#{} Mult {C:inactive}(X#5#){} every {C:attention}#10#{} {C:inactive}(#2#){} hands", + "Turn the first played card Steel every {C:attention}#11#{} {C:inactive}(#3#){} hands", + "Held Steel Cards give +{X:mult,C:white}X#8#{} Mult {C:inactive}(X#7#){} every {C:attention}#12#{} {C:inactive}(#4#){} hands", + }, + }, j_cry_CodeJoker = { name = "Code Joker", text = { @@ -1445,6 +1551,23 @@ return { "All {C:attention}face{} cards are debuffed", }, }, + j_cry_eyeofhagane = { + name = "Eye of Hagane", + text = { + "All played {C:attention}face{} cards", + "become {C:attention}Steel{} cards", + "when scored", + }, + }, + j_cry_highfive = { + name = "High Five", + text = { + "If highest {C:attention}scoring rank{}", + "is {C:attention}5{}, convert {C:attention}all{} scoring cards", + "into {C:attention}5{}s", + "{s:0.8,C:inactive}Aces are considered 1", + }, + }, j_cry_facile = { name = "Facile", text = { @@ -1693,10 +1816,10 @@ return { j_cry_kidnap = { name = "Kidnapping", text = { - "Earn {C:money}$#2#{} at end of round", - "Increase payout by {C:money}$#1#{}", - "when a {C:attention}Type Mult{} or", - "{C:attention}Type Chips{} Joker is sold", + "Earn {C:money}$#1#{} at end of round", + "per unique {C:attention}Type Mult{} or", + "{C:attention}Type Chips{} Joker sold this run", + "{C:inactive}(Currently {C:money}$#2#{C:inactive})", }, }, j_cry_kittyprinter = { @@ -2029,7 +2152,7 @@ return { }, }, j_cry_notebook = { - name = "The Motebook", + name = "Motebook", text = { "{C:green} #1# in #2#{} chance to gain {C:dark_edition}+#6#{} Joker", "slot#6# per {C:attention}reroll{} in the shop", @@ -2150,6 +2273,7 @@ return { "{C:attention}#1#{} hand size,", "increases by", "{C:blue}#2#{} every round", + "{C:inactive}(Maximum {}{C:attention}#3#{}{C:inactive} hand size){}", }, unlock = { "Increase your {C:attention}handsize", @@ -2673,6 +2797,14 @@ return { "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", }, }, + j_cry_wonka_bar = { + name = "Wonka Bar", + text = { + "Sell this card to", + "permanently gain {C:attention}+#1#{}", + "card selection limit", + }, + }, j_cry_wrapped = { name = "Wrapped Candy", text = { @@ -2817,8 +2949,8 @@ return { text = { "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){}", "Increase power of", - "{C:attention}Ascended{} hands by {X:gold,C:white}0.05{}", - "{C:inactive}(Currently {X:gold,C:white}X(#2#^asc){C:inactive})", + "{C:attention}Ascended{} hands by {X:gold,C:white}#2#{}", + "{C:inactive}(Currently {X:gold,C:white}X(#3#^asc){C:inactive})", }, }, }, @@ -3001,7 +3133,7 @@ return { name = "Conduit", text = { "Swap the {C:attention}editions{} of", - "{C:attention}2{} selected cards or {C:attention}Jokers{}", + "{C:attention}2{} selected playing cards or {C:attention}Jokers{}", }, }, c_cry_gateway = { @@ -4165,7 +4297,7 @@ return { }, }, p_cry_empowered = { - name = "Spectral Pack [Empowered Tag]", + name = "Empowered Pack", text = { "Choose {C:attention}#1#{} of up to", "{C:attention}#2#{C:spectral} Spectral{} card#2#", @@ -4318,6 +4450,7 @@ return { ["cry_Clusterfuck"] = Cryptid_config.family_mode and "Cluster" or "Clusterfuck", ["cry_UltPair"] = "Ultimate Pair", ["cry_WholeDeck"] = Cryptid_config.family_mode and "The Entire Deck" or "The Entire Fucking Deck", + ["cry-Cluster Bulwark"] = "Clusterwark", }, poker_hand_descriptions = { ["cry_Bulwark"] = { @@ -4360,6 +4493,8 @@ return { ach_cry_used_crash = "We Told You Not To", ach_cry_what_have_you_done = "WHAT HAVE YOU DONE?!", ach_cry_pin = "Pin of Shame", + ach_cry_youre_fucking_kidding = Cryptid_config.family_mode and "You Can't Be Serious" + or "You're Fucking Kidding", }, achievement_descriptions = { ach_cry_ace_in_crash = 'check_for_unlock({type = "ace_in_crash"})', @@ -4383,6 +4518,7 @@ return { ach_cry_used_crash = "Use ://CRASH", ach_cry_what_have_you_done = "Delete or Sacrifice an Exotic Joker", ach_cry_pin = "Lose a run to The Pin", + ach_cry_youre_fucking_kidding = "Discard " .. localize("cry_WholeDeck", "poker_hands"), }, challenge_names = { c_cry_ballin = "Ballin'", @@ -4430,6 +4566,7 @@ return { cry_mus_exotic = "Exotic Jokers (Joker in Latin by AlexZGreat)", cry_mus_high_score = "High Score (Final Boss [For Your Computer] by AlexZGreat)", cry_mus_alt_bg = "Background Music (by MathIsFun_)", + cry_force_tooltips = "Force Tooltips", cry_family = "Family Friendly Mode", cry_experimental = "Experimental Mode", @@ -4503,6 +4640,7 @@ return { cry_good_luck_ex = "Good luck!", cry_sus_ex = "Impostor!", cry_jolly_ex = "Jolly Up!", + cry_highfive_ex = "High Five!", cry_m_minus = "m", cry_m = "M", cry_m_ex = "M!", diff --git a/Cryptid/localization/es_419.lua b/Cryptid/localization/es_419.lua index 48ee072..60150a8 100644 --- a/Cryptid/localization/es_419.lua +++ b/Cryptid/localization/es_419.lua @@ -154,7 +154,7 @@ return { name = "El reloj", text = { "+0.1X requisitos de ciega por cada", - "3 segundos pasados en esta apuesta", + "12 segundos pasados en esta apuesta", }, }, bl_cry_hammer = { @@ -182,7 +182,7 @@ return { name = "Ciclo lavanda", text = { "1.25X requisitos de ciega por cada", - "1.5 segundos pasados en esta ronda", + "6 segundos pasados en esta ronda", }, }, bl_cry_obsidian_orb = { @@ -1278,6 +1278,7 @@ return { j_cry_kidnap = { name = "Secuestro", text = { + "{C:red}Outdated Description{}", "Gana {C:money}$#2#{} al final de la ronda", "Aumenta el pago por {C:money}$#1#{}", "cuando un comodín de {C:attention}tipo multi{}", diff --git a/Cryptid/localization/es_ES.lua b/Cryptid/localization/es_ES.lua index 68f06c0..919d33b 100644 --- a/Cryptid/localization/es_ES.lua +++ b/Cryptid/localization/es_ES.lua @@ -206,7 +206,7 @@ return { name = "El reloj", text = { "+0.1X requisitos de ciega por cada", - "3 segundos pasados en esta apuesta", + "12 segundos pasados en esta apuesta", }, }, bl_cry_hammer = { @@ -234,7 +234,7 @@ return { name = "Ciclo lavanda", text = { "1.25X requisitos de ciega por cada", - "1.5 segundos pasados en esta ronda", + "6 segundos pasados en esta ronda", }, }, bl_cry_obsidian_orb = { @@ -1701,6 +1701,7 @@ return { j_cry_kidnap = { name = "Secuestro", text = { + "{C:red}Outdated Description{}", "Gana {C:money}$#2#{} al final de la ronda", "Aumenta el pago por {C:money}$#1#{}", "cuando un comodín de {C:attention}tipo multi{}", @@ -2823,8 +2824,8 @@ return { text = { "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){}", "Aumenta el poder de", - "las {C:attention}manos ascendidas{} por {X:gold,C:white}0.05{}", - "{C:inactive}(Actual: {X:gold,C:white}X(#2#^asc){C:inactive})", + "las {C:attention}manos ascendidas{} por {X:gold,C:white}#2#{}", + "{C:inactive}(Actual: {X:gold,C:white}X(#3#^asc){C:inactive})", }, }, }, diff --git a/Cryptid/localization/fr.lua b/Cryptid/localization/fr.lua index df22ed5..b26f86d 100644 --- a/Cryptid/localization/fr.lua +++ b/Cryptid/localization/fr.lua @@ -29,15 +29,44 @@ return { "Applique les {C:legendary,E:1}effets{}", "de {C:attention}tous{} les jeux", }, + unlock = { + "Gagner une partie", + "avec le {C:attention}Jeu à Blanc", + "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 = { + "Les Jokers {C:attention}communs{} ont", + "leur valeurs {C:attention}quadruplées{}", + }, + unlock = { + "Découvrir au moins", + "{C:attention}200{} objets dans", + "la collection", + }, }, b_cry_beta = { - name = "Nostalgic Deck", + name = "Jeu Nostalgique", text = { "{C:attention}Joker{} and {C:attention}Consumable{}", "slots are {C:attention}combined", "{C:attention}Nostalgic{} Blinds replace", "their updated Blind", }, + unlock = { + "Gagner une partie", + "avec la {C:attention}Mise Rose", + }, }, b_cry_blank = { name = "Jeu à blanc", @@ -45,12 +74,16 @@ return { "{C:inactive,E:1}Ne fait rien?", }, }, - b_cry_bontiful = { + b_cry_bountiful = { name = "Jeu généreux", text = { "Après avoir utilisé une {C:blue}main{} ou une {C:red}défausse{},", "{C:attention}5{} cartes sont toujours tirées", }, + unlock = { + "Battre {C:attention}le Serpent", + "sans {C:red}défausser", + }, }, b_cry_CCD = { name = "Jeu CCD", @@ -58,6 +91,9 @@ return { "Chaque carte est aussi", "un consommable {C:attention}aléatoire{}", }, + unlock = { + "Utiliser {C:spectral}Hammerspace", + }, }, b_cry_conveyor = { name = "Jeu Convoyeur", @@ -67,6 +103,9 @@ return { "{C:attention}copie{} le Joker le plus à droite", "and {C:attention}destroy{} le Joker le plus à gauche", }, + unlock = { + "Utiliser {C:spectral}Analogue", + }, }, b_cry_critical = { name = "Jeu Critique", @@ -75,6 +114,21 @@ return { "{C:green}#1# chance#1# sur 4{} d'obtenir {X:dark_edition,C:white} ^2 {} Multi", "{C:green}#1# chance#1# sur 8{} d'obtenir {X:dark_edition,C:white} ^0.5 {} Multi", }, + unlock = { + "Obtenir un {C:attention}Joker Truqué", + }, + }, + b_cry_e_deck = { + name = "Jeu Édition", + text = { + "Toutes les cartes sont {C:dark_edition}#1#{}", + "Les cartes ne peuvent pas changer d'édition", + "{C:inactive}(Cliquez pour modifier)", + }, + unlock = { + "Découvrir toutes", + "les {C:dark_edition}Éditions", + }, }, b_cry_encoded = { name = "Jeu Encodé", @@ -83,6 +137,9 @@ return { "et un {C:cry_code,T:j_cry_copypaste}Copier/Coller{}", "Seules les {C:cry_code}Cartes Code{} apparaissent dans la boutique", }, + unlock = { + "Utiliser {C:spectral}POINTEUR://", + }, }, b_cry_equilibrium = { name = "Jeu de l'Équilibrium", @@ -93,6 +150,10 @@ return { "démarre la partie avec", "{C:attention,T:v_overstock_plus}Excédent Plus", }, + unlock = { + "Avoir {C:attention}100 Jokers", + "en même temps", + }, }, b_cry_et_deck = { name = "Jeu Amélioré", @@ -101,6 +162,9 @@ return { "sont {C:attention}#1#{}(s)", "{C:inactive}(Cliquez pour modifier)", }, + unlock = { + "Utiliser {C:spectral}Aspiration", + }, }, b_cry_glowing = { name = "Jeu Brillant", --wtf is glowing? @@ -110,6 +174,10 @@ return { "quand la Boss Blinde est battue", "{X:cry_jolly,C:white,s:0.8} Jolly#1#Open#1#Winner#1#-#1#wawa#1#person", --peak loc_vars right here }, + unlock = { + "Gagner une partie", + "avec le {C:attention}Jeu Beige", + }, }, b_cry_infinite = { name = "Jeu Infini", @@ -118,6 +186,10 @@ return { "nombre de cartes", "Taille de la main {C:attention}+1{} ", }, + unlock = { + "Jouer une main avec", + "{C:attention}6{} cartes ou plus", + }, }, b_cry_misprint = { name = "Jeu Mal Imprimé", @@ -126,6 +198,9 @@ return { "et des mains de poker", "sont {C:attention}aléatoires", }, + unlock = { + "Obtenir un Joker {C:dark_edition}Glitché{C:attention}", + }, }, b_cry_redeemed = { name = "Jeu Acheté", @@ -133,6 +208,20 @@ return { "Quand un {C:attention}Bon d'Achat{} est acheté,", "gagne son {C:attention}amélioration", }, + unlock = { + "Découvrir tous les", + "{C:attention}Coupons", + }, + }, + b_cry_sk_deck = { + name = "Jeu d'autocollants", + text = { + "Toutes les cartes sont {C:attention}#1#{}", + "{C:inactive}(Cliquez pour modifier)", + }, + unlock = { + "Utiliser {C:spectral}Verrou", + }, }, b_cry_sl_deck = { name = "Jeu scellé", @@ -141,6 +230,9 @@ return { "Les cartes ne peuvent pas changer de sceau", "{C:inactive}(Cliquez pour modifier)", }, + unlock = { + "Utiliser {C:spectral}Typhon", + }, }, b_cry_spooky = { name = "Jeu fantôme", @@ -149,6 +241,9 @@ return { "Après chaque {C:attention}Ante{}, crée un", "{C:cry_candy}Bonbon{} ou un Joker {X:cry_cursed,C:white}Maudit{}", }, + unlock = { + "Obtenir un Joker {C:cry_candy}Bonbon{C:attention}", + }, }, b_cry_st_deck = { name = "Jeu Couleur", @@ -157,6 +252,9 @@ return { "et ne peuvent pas changer de couleur", "{C:inactive}(Cliquez pour modifier)", }, + unlock = { + "Utiliser {C:spectral}Réplique", + }, }, b_cry_very_fair = { name = "Jeu Très Équilibré", @@ -166,6 +264,10 @@ return { "Les {C:attention}Bons d'Achat{} n'apparaissent", "plus dans la boutique", }, + unlock = { + "Gagner une partie", + "avec le {C:attention}Jeu à Blanc", + }, }, b_cry_wormhole = { name = "Jeu Vortex", @@ -175,6 +277,9 @@ return { "plus susceptibles d'être {C:dark_edition}Négatifs", "{C:attention}-2{} emplacements de Joker", }, + unlock = { + "Obtenir un Joker {C:cry_exotic}Exotique{C:attention}", + }, }, b_cry_legendary = { name = "Jeu Légendaire", @@ -184,6 +289,10 @@ return { "lorsque la Blinde de Boss est battue", "{C:inactive}(selon la place disponible)", }, + unlock = { + "Avoir {C:attention}2 Jokers Légendaires", + "en même temps", + }, }, }, Blind = { @@ -198,7 +307,7 @@ return { name = "L'Horloge", text = { "+0.1X du score requis toutes", - "les 3 secondes passées dans cette Ante", + "les 12 secondes passées dans cette Ante", }, }, bl_cry_hammer = { @@ -226,7 +335,7 @@ return { name = "Boucle Lavande", text = { "1.25X du score requis toutes les", - "1.5 secondes passées dans cette manche", + "6 secondes passées dans cette manche", }, }, bl_cry_obsidian_orb = { @@ -310,6 +419,14 @@ return { "est altéré de manière aléatoire", }, }, + bl_cry_scorch = { + name = "La Grille", + text = { + "Must play 5 cards,", + "destroy played and", + "discarded cards", + }, + }, bl_cry_sapphire_stamp = { name = "Tampon Saphir", text = { @@ -352,6 +469,13 @@ return { "les cartes visibles en main", }, }, + bl_cry_trophy = { + name = "Trophée Citron", + text = { + "Le multi ne peut pas", + "dépasser les jetons", + }, + }, bl_cry_vermillion_virus = { name = "Virus Vermillion", text = { @@ -409,8 +533,9 @@ return { name = "://EFFACER", text = { "Enlève de manière {C:cry_code}permanente{}", - "un objet {C:cry_code}choisi{} de la boutique", - "{C:inactive,s:0.8}L'objet n'apparaîtra plus pendant le reste de la partie", + "un objet {C:cry_code}choisi{} de la boutique, il n'apparaîtra plus", + "pendant le reste de la partie", + "{C:inactive}Multiuse: ({C:cry_code}#1#{C:inactive} restantes)", }, }, c_cry_divide = { @@ -474,8 +599,9 @@ return { c_cry_patch = { name = "://PATCH", text = { - "Enlève tous les affaiblissements et", - "stickers de tous les objets visibles", + "Enlève tous les {C:cry_code}affaiblissements", + "de tous les objets visibles", + "{C:cry_code}Réinitialise{} la boutique", }, }, c_cry_payload = { @@ -701,6 +827,8 @@ return { "Cette carte peut être", "{C:attention}retournée{} pour révéler", "une autre carte", + "{C:inactive}(La face vierge peut être fusionnée", + "{C:inactive}avec une autre carte)", }, }, e_cry_glass = { @@ -709,7 +837,7 @@ return { text = { "{C:white,X:mult} X#3# {} Multi", "{C:green}#1# chance#1# sur #2#{} de", - "ne pas {C:red}détruite{} cette carte", + "ne pas {C:red}détruire{} cette carte", "lorsqu'elle est déclenchée", }, }, @@ -827,6 +955,16 @@ return { "{C:inactive,s:0.8}Ne copie pas les Carte Googol Play Nostalgiques{}", }, }, + j_cry_altgoogol_balanced = { + name = "Carte Googol Play Nostalgique", + text = { + "Vendre cette carte crée", + "{C:attention}2{} copies du {C:attention}Joker{} le plus à gauche", + "{C:inactive,s:0.8}Ne copie pas les Carte Googol Play Nostalgiques{}", + "{C:inactive}(Selon la place disponible){}", + --todo: add "removes negative from copy" like Ankh/Invis Joker + }, + }, j_cry_antennastoheaven = { name = "...Like Antennas to Heaven", text = { @@ -858,6 +996,23 @@ return { "un {C:attention}Joker{} aléatoire", }, }, + j_cry_astral_bottle_mainline = { + name = "Astres en Bouteille", + text = { + "Lorsque cette carte est vendue,", + "applique {C:dark_edition}Astral{}", + "et {C:attention}Périssable{} à", + "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 = { @@ -1025,6 +1180,20 @@ return { "en une main", }, }, + j_cry_canvas_balanced = { + name = "Canevas", + text = { + "{C:attention}Redéclenche{} tous les {C:attention}Jokers{} à gauche", + "une fois pour {C:attention}chaque{C:attention} Joker{} non-{C:blue}Commun", + "à droite de ce Joker", + "{C:inactive}(Jusqu'à 2 redéclenchements)", -- wow il s'est fait grave nerf + }, + unlock = { + "Redéclencher un {C:attention}Joker", + "{C:attention}114{} fois", + "en une main", + }, + }, j_cry_caramel = { name = "Caramel", text = { @@ -1033,6 +1202,15 @@ return { "pour les {C:attention}#2#{} prochaines manches", }, }, + j_cry_cat_owl = { + name = "Chat Hibou", + text = { + "Les {C:attention}Cartes Chance{} sont aussi", + "considérées des {C:attention}Cartes Écho", + "Les {C:attention}Cartes Écho{} sont aussi", + "considérées des {C:attention}Cartes Chance", + }, + }, j_cry_chad = { name = "Chad", text = { @@ -1075,6 +1253,11 @@ return { "Les Jokers {C:legendary}Légendaires{} donnent chacun {X:mult,C:white} X#3# {} Multi", "Les Jokers {C:cry_exotic}Exotiques{} donnent chacun {X:mult,C:white} X#4# {} Multi", }, + unlock = { + "Obtenir un Joker {C:red}Rare{},", + "{C:cry_epic}Épique{} et {C:legendary}Légendaire{}", + "avant l'{C:attention}Ante 9", + }, }, j_cry_clash = { name = "Le clash", @@ -1097,6 +1280,15 @@ return { "{C:attention}clic", }, }, + j_cry_clockwork = { + name = "Joker horloger", + text = { + "Redéclenche toutes les cartes Acier toutes les {C:attention}#9#{} {C:inactive}(#1#){} mains", + "Ce Joker gagne {X:mult,C:white}X#6#{} Multi {C:inactive}(X#5#){} toutes les {C:attention}#10#{} {C:inactive}(#2#){} mains", + "Ajoute Acier à la première carte jouée toutes les {C:attention}#11#{} {C:inactive}(#3#){} mains", + "Les cartes Acier en main donnent +{X:mult,C:white}X#8#{} Multi {C:inactive}(X#7#){} toutes les {C:attention}#12#{} {C:inactive}(#4#){} mains", + }, + }, j_cry_CodeJoker = { name = "Joker Code", text = { @@ -1109,6 +1301,18 @@ return { "les {C:cry_code}Cartes Code", }, }, + j_cry_CodeJoker_modest = { + name = "Joker Code", + text = { + "Crée une {C:cry_code}Carte Code", + "{C:dark_edition}Négative{} lorsque", + "la {C:attention}Blinde Boss{} est sélectionnée", + }, + unlock = { + "Découvrir {C:attention}toutes", + "les {C:cry_code}Cartes Code", + }, + }, j_cry_coin = { name = "Crypto-monnaie", text = { @@ -1128,6 +1332,24 @@ return { }, j_cry_copypaste = { name = "Copier/Coller", + text = { + "Lorsqu'une carte {C:cry_code}Code{} est utilisée,", + "{C:green}#1# chance#1# sur #2#{} pour ajouter une copie", + "dans votre zone de consommables", + "{C:red}Ne fonctionne qu'une seule fois par manche{}", + "{C:inactive}(Selon la place disponible)", + }, + }, + j_cry_copypaste_modest = { + name = "Copy/Paste", + text = { + "Duplique les", + "cartes {C:cry_code}Code{} tirées", + "{C:inactive}(Selon la place disponible)", + }, + }, + j_cry_copypaste_madness = { + name = "Copy/Paste", text = { "Lorsqu'une carte {C:cry_code}Code{} est utilisée,", "{C:green}#1# chance#1# sur #2#{} pour ajouter une copie", @@ -1239,6 +1461,14 @@ return { "{C:inactive,s:0.8}(grandit comme +1, +2, +3)", }, }, + ["j_cry_Double Scale_modest"] = { + name = "Double Échelle", + text = { + "Les {C:attention}Jokers{} augmentant", + "augmentent {C:attention}deux fois{} plus vite", + "{C:inactive,s:0.8}\"Ça s'appelle la double échelle, pas l'échelle quadratique!\"", + }, + }, j_cry_dropshot = { name = "Tir Amorti", text = { @@ -1320,6 +1550,15 @@ return { }, }, j_cry_eternalflame = { + name = "Flamme éternelle", + text = { + "Ce Joker gagne {X:mult,C:white} X#1# {} Multi", + "pour chaque carte {C:attention}vendue{} avec", + "une {C:attention}valeur de vente{} de {C:money}$3{} ou plus", + "{C:inactive}(Actuellement {X:mult,C:white} X#2# {C:inactive} Multi)", + }, + }, + j_cry_eternalflame2 = { name = "Flamme éternelle", text = { "Ce Joker gagne {X:mult,C:white} X#1# {} Multi", @@ -1350,6 +1589,22 @@ return { "Les cartes {C:attention}figure{} sont affaiblies", }, }, + j_cry_eyeofhagane = { + name = "l'Œil d'Hagane", + text = { + "Toutes les cartes {C:attention}Figure{} marquées", + "deviennent des cartes {C:attention}Acier{}", + }, + }, + j_cry_highfive = { + name = "High five", + text = { + "Si le rang le plus haut {C:attention}marqué{}", + "est un {C:attention}5{}, convertit {C:attention}toutes{} les cartes marquées", + "en des {C:attention}5{}", + "{s:0.8,C:inactive}Les As sont considérés des 1", + }, + }, j_cry_facile = { name = "Facile", text = { @@ -1376,6 +1631,11 @@ return { text = { "{C:attention}+#1#{} à la limite de sélection de cartes", }, + unlock = { + "Jouer une {C:attention}Quinte Flush{}", + "où la {C:attention}Quinte", + "n'est pas un {C:attention}Flush", + }, }, j_cry_flip_side = { name = "De l'autre côté", @@ -1535,6 +1795,13 @@ return { "{C:attention}consommable{} est utilisé", }, }, + j_cry_huntingseason = { + name = "Saison de chasse", + text = { + "Si la main jouée contient exactement {C:attention}3{} cartes,", + "{C:red}détruit{} la carte du {C:attention}centre{} après qu'elle soit comptée", + }, + }, j_cry_iterum = { name = "Iterum", text = { @@ -1589,10 +1856,18 @@ return { j_cry_kidnap = { name = "Kidnapping", text = { - "Gagne {C:money}$#2#{} à la fin de la manche", - "Augmente le gain de {C:money}$#1#{}", - "lorsqu'un Joker {C:attention}type {C:mult}multi{} ou", - "{C:attention}type chips{} est vendu", + "Donne {C:money}$#1#{} à la fin de la manche", + "pour chaque Joker {C:attention}type {C:mult}multi{}", + "ou {C:attention}type chips{} vendu durant cette partie", + "{C:inactive}(Actuellement {C:money}$#2#{C:inactive})", + }, + }, + j_cry_kittyprinter = { + name = "Chat-primante", + text = { + "{X:mult,C:white} X#1# {} Multi", + "Tous les badges {C:attention}passés{}", + "deviennent des {C:attention}Badges Chat{}", }, }, j_cry_kooky = { @@ -1787,6 +2062,15 @@ return { "{C:blue,s:0.7}https://discord.gg/cryptid{}", }, }, + j_cry_membershipcardtwo_balanced = { + name = "Vieille carte de membre", --Could probably have a diff Name imo + text = { + "{C:chips}+#1#{} Jeton#1# tous les {C:attention}8{} membres", + "dans le {C:attention}serveur Discord{} de {C:attention}Cryptid{}", + "{C:inactive}(Actuellement {C:chips}+#2#{C:inactive} Jeton#2#)", + "{C:blue,s:0.7}https://discord.gg/cryptid{}", + }, + }, j_cry_meteor = { name = "Pluie de météores", text = { @@ -2014,12 +2298,20 @@ return { "{C:inactive}(Actuellement {X:chips,C:white} X#1# {C:inactive} Jetons)", }, }, + j_cry_pity_prize = { + name = "Lot de pitié", + text = { + "Lorsqu'un {C:attention}Paquet Booster{} est passé,", + "donne un {C:attention}Badge{} aléatoire", + }, + }, j_cry_pot_of_jokes = { name = "Pot de Blagues", text = { "{C:attention}#1#{} à la taille de la main,", "mais augmente de", "{C:blue}#2#{} à la fin de la manche", + "{C:inactive}({}{C:attention}#3#{}{C:inactive} taille de main maximum){}", }, unlock = { "Augmenter la {C:attention}taille de la main", @@ -2146,9 +2438,7 @@ return { text = { "Après avoir marqué {C:attention}#2#{} {C:inactive}[#1#]{}", "cartes améliorées, vendre cette carte", - "crée un {C:attention}Joker{} {C:cry_epic}Épique{}", - "{C:inactive,s:0.8}Crée un {C:attention,s:0.8}Joker{} {C:red,s:0.8}Rare{}", - "{C:inactive,s:0.8}si les Jokers {C:cry_epic,s:0.8}Épiques{} {C:inactive,s:0.8}sont désactivés{}", + "crée un {C:attention}Joker{} {V:1}#3#", }, }, j_cry_savvy = { @@ -2167,6 +2457,7 @@ return { "élève le degré de {C:attention}#2#{}", "à la fin de la manche", "{C:inactive,s:0.8}({C:attention,s:0.8}Scalae{C:inactive,s:0.8} exclu)", + "{C:inactive,s:0.8}(par ex. +1, +#3#, +#4#, +#5#)", }, }, j_cry_scrabble = { @@ -2216,14 +2507,29 @@ return { "{C:attention}+#1#{} Joker max", "{C:attention}+#1#{} Paquet Booster max", "{C:attention}+#1#{} taille de main", - "{C:attention}+#1#{} emplacement de consommable", - "{C:attention}+#1#{} carte dans la boutique", + "{C:attention}+#1#{} emplacement#1# de consommable", + "{C:attention}+#1#{} carte#1# dans la boutique", + "{C:attention}+#1#{} emplacement#1# de coupon", }, unlock = { "Gagner une partie", "en ne jouant que des {C:attention}Carte Haute", }, }, + j_cry_soccer_balanced = { + name = "One for All", --changed the name from latin because this isn't exotic + text = { + "{C:attention}+#1#{} Booster Pack max", + "{C:attention}+#1#{} taille de main", + "{C:attention}+#1#{} emplacement#1# de consommable", + "{C:attention}+#1#{} carte#1# dans la boutique", + "{C:attention}+#1#{} emplacement#1# de coupon", + }, + unlock = { + "Win a run with", + "only {C:attention}High Card", + }, + }, j_cry_fleshpanopticon = { name = "Flesh Panopticon", text = { @@ -2243,6 +2549,14 @@ return { "{C:inactive}(Actuellement{} {X:chips,C:white}X#1#{} {C:inactive}Jetons){}", }, }, + j_cry_spectrogram = { + name = "Spectrogramme", + text = { + "{C:attention}Redéclenche{} le Joker le plus à droite", + "une fois pour chaque {C:attention}Carte Écho", + "jouée et comptée", + }, + }, j_cry_speculo = { name = "Speculo", text = { @@ -2308,6 +2622,14 @@ return { "la fin de la manche", }, }, + j_cry_supercell_balanced = { + name = "Supercell", + text = { + "{X:chips,C:white}X#2#{} Jetons, {X:mult,C:white}X#2#{} Multi", + "Gagne {C:money}$#3#{} à", + "la fin de la manche", + }, + }, j_cry_sus = { name = "SUS", text = { @@ -2518,6 +2840,14 @@ return { "{C:inactive}(Actuellement {X:mult,C:white} X#2# {C:inactive} Multi)", }, }, + j_cry_wonka_bar = { + name = "Wonka Bar", + text = { + "Vendre cette carte", + "augmente de {C:attention}+#1#{} la", + "limite de sélection de cartes", + }, + }, j_cry_wrapped = { name = "Bonbon enveloppé", text = { @@ -2664,12 +2994,42 @@ return { text = { "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){}", "Augmente la puissance des", - "mains {C:attention}ascensionnées{} de {X:gold,C:white}0.05{}", - "{C:inactive}(Actuellement {X:gold,C:white}X(#2#^asc){C:inactive})", + "mains {C:attention}ascensionnées{} de {X:gold,C:white}#2#{}", + "{C:inactive}(Actuellement {X:gold,C:white}X(#3#^asc){C:inactive})", }, }, }, Sleeve = { + sleeve_cry_beige_sleeve = { + name = "Pochette Beige", + text = { + "Les Jokers {C:attention}Communs{} ont leur", + "valeurs {C:attention}quadruplées{}", + }, + }, + sleeve_cry_beige_sleeve_alt = { + name = "Beige Sleeve", + text = { + "Les Jokers {C:attention}peu communs{} ont leur", + "valeurs {C:attention}quadruplées{}", + }, + }, + sleeve_cry_beta_sleeve = { + name = "Nostalgic Sleeve", + text = { + "Les emplacements de {C:attention}Joker{} et {C:attention}Consommable{}", + "sont {C:attention}combinés", + "Les blindes {C:attention}Nostalgiques{} remplacent", + "leur équivalent", + }, + }, + sleeve_cry_bountiful_sleeve = { + name = "Pochette généreuse", + text = { + "Après chaque main {C:blue}jouée{} ou {C:red}défaussée{},", + "tire toujours {C:attention}5{} cartes", + }, + }, sleeve_cry_ccd_sleeve = { name = "Pochette CCD", text = { @@ -2712,6 +3072,15 @@ return { "{C:attention,T:v_overstock_plus}+2 cartes dans la boutique", }, }, + sleeve_cry_glowing_sleeve = { + name = "Pochette brillante", + text = { + "Multiplie les valeurs de", + "tous les Jokers de {X:dark_edition,C:white} X1.25 {}", + "lorsque la Blinde Boss est battue", + "{X:cry_jolly,C:white,s:0.8} Jolly#1#Open#1#Winner#1#-#1#wawa#1#person", --peak loc_vars right here + }, + }, sleeve_cry_infinite_sleeve = { name = "Pochette illimitée", text = { @@ -2734,6 +3103,23 @@ return { "gagne ses {C:attention}améliorations", }, }, + sleeve_cry_spooky_sleeve = { + name = "Pochette Effroi", + text = { + "Démarre avec un {C:attention,T:j_cry_chocolate_dice}Dé en chocolat{} {C:eternal}éternel", + "Après chaque {C:attention}Ante{}, crée un", + "{C:cry_candy}Bonbon{} ou un Joker {X:cry_cursed,C:white}Maudit{}", + }, + }, + sleeve_cry_very_fair_sleeve = { + name = "Pochette Super Équilibrée", + text = { + "{C:blue}-2{} mains, {C:red}-2{} défausses", + "à chaque manche", + "Les {C:attention}Bons d'Achat{} n'apparaissent", + "plus dans la boutique", + }, + }, sleeve_cry_wormhole_sleeve = { name = "Pochette Vortex", text = { @@ -2752,6 +3138,15 @@ return { "{C:inactive}(selon la place disponible)", }, }, + sleeve_cry_antimatter_sleeve = { + name = "Pochette d'Antimatière", + text = { + "Applique les {C:attention}effects{}", + "et autres {C:attention}effets spéciaux{}", + "de toutes les autres pochettes", + "{C:red}WIP", + }, + }, }, Spectral = { c_cry_adversary = { @@ -2765,7 +3160,7 @@ return { c_cry_analog = { name = "Analogue", text = { - "Crée {C:attention}#1#{} copies d'un", + "Crée {C:attention}#1#{} copie#1# d'un", "{C:attention}Joker{} aléatoire, détruit", "tous les autres Jokers, {C:attention}+#2#{} Ante", }, @@ -2773,7 +3168,7 @@ return { c_cry_chambered = { name = "Chambré", text = { - "Crée {C:attention}#1#{} copies {C:dark_edition}Négatives{}", + "Crée {C:attention}#1#{} copie#1# {C:dark_edition}Négatives{}", "d'un consommable {C:attention}aléatoire", "{C:inactive,s:0.8}Ne copie pas Chambré{}", }, @@ -2796,9 +3191,9 @@ return { c_cry_hammerspace = { name = "Hammerspace", text = { - "Apply random {C:attention}consumables{}", - "as if they were {C:dark_edition}Enhancements{}", - "to cards held in hand", + "Applique des {C:attention}consommables{} aléatoires", + "comme des {C:dark_edition}Améliorations{}", + "à toutes les cartes tenues en main", }, }, c_cry_lock = { @@ -3461,8 +3856,9 @@ return { v_cry_overstock_multi = { name = "Multi-stock", text = { - "{C:attention}+#1#{} emplacement#1# de carte#1# et", - "{C:attention}+#1#{} emplacement#1# de paquet#1#", + "{C:attention}+#1#{} emplacement#1# de carte#1#,", + "{C:attention}+#1#{} emplacement#1# de paquet#1# et", + "and {C:attention}+#1#{} emplacements#1# de coupon", "disponibles dans la boutique", }, unlock = { @@ -3577,7 +3973,7 @@ return { v_cry_threers = { name = "Les 3 R", text = { - "{C:red}#1#{} défausses", + "{C:red}+#1#{} défausse#1#", "par manche", }, unlock = { @@ -4099,6 +4495,7 @@ return { ["cry_Clusterfuck"] = Cryptid_config.family_mode and "Capharnaüm" or "Foutoir", ["cry_UltPair"] = "Super Paire", ["cry_WholeDeck"] = Cryptid_config.family_mode and "Jeu complet" or "un putain de jeu complet", + ["cry-Cluster Bulwark"] = "Capharna-rempart", }, poker_hand_descriptions = { ["cry_Bulwark"] = { @@ -4140,6 +4537,9 @@ return { ach_cry_ult_full_skip = "Je passe", ach_cry_used_crash = "Tu t'attendais à quoi ?", ach_cry_what_have_you_done = "QU'EST-CE QUE TU AS FAIT ?!", + ach_cry_pin = "L'épingle de la honte", + ach_cry_youre_fucking_kidding = Cryptid_config.family_mode and "J'ai plus besoin de ça" + or "Tu te fous de moi", }, achievement_descriptions = { ach_cry_ace_in_crash = 'check_for_unlock({type = "ace_in_crash"})', @@ -4162,6 +4562,8 @@ return { ach_cry_ult_full_skip = "Gagner en 1 tour", ach_cry_used_crash = "Utiliser ://CRASH", ach_cry_what_have_you_done = "Supprimer ou sacrifier un Joker exotique", + ach_cry_pin = "Perdre une partie face à l'Épingle", + ach_cry_youre_fucking_kidding = "Défausser " .. localize("cry_WholeDeck", "poker_hands"), }, challenge_names = { c_cry_ballin = "Ballin'", @@ -4208,7 +4610,8 @@ return { cry_mus_code = "Cartes Code (://LETS_BREAK_THE_GAME par HexaCryonic)", cry_mus_exotic = "Jokers exotiques (Joker in Latin par AlexZGreat)", cry_mus_high_score = "High Score (Final Boss [For Your Computer] par AlexZGreat)", - cry_mus_alt_bg = "Musique de titre (by MathIsFun_)", + cry_mus_alt_bg = "Musique de titre (par MathIsFun_)", + cry_force_tooltips = "Forcer l'affichage des info-bulles", cry_family = "Mode family-friendly", cry_experimental = "Mode expérimental", @@ -4248,6 +4651,7 @@ return { b_pull = "TIRER", cry_hooked_ex = "Accroché!", k_end_blind = "Finir la blinde", + k_cry_shiny = "Étincelant", cry_code_rank = "ENTRER UN RANG", cry_code_enh = "ENTRER UNE AMELIORATION", @@ -4278,8 +4682,10 @@ return { cry_sobbing = "À l'aide...", cry_gaming = "Gaming", cry_gaming_ex = "Gaming!", + cry_good_luck_ex = "Bonne chance!", cry_sus_ex = "Imposteur!", cry_jolly_ex = "Plus joyeux!", + cry_highfive_ex = "Tope-là!", cry_m_minus = "m", cry_m = "M", cry_m_ex = "M!", @@ -4324,6 +4730,10 @@ return { cry_view_set_contents = "Voir les objets dans le set", + -- These two are left empty because they aren't used here + cry_sapling_an = "", -- "un Joker Exotique" + cry_sapling_a = "", -- "un Joker Rare" + b_reset_gameset_modest = "Réinitialiser la configuration du style (Modeste)", b_reset_gameset_mainline = "Réinitialiser la configuration du style (Médian)", b_reset_gameset_madness = "Réinitialiser la configuration du style (Maboul)", @@ -4331,6 +4741,8 @@ return { labels = { food_jokers = "Jokers nourriture", banana = "Banane", + pinned = "Épinglé", + cry_absolute = "Absolu", code = "Code", unique = "Unique", cry_rigged = "Truqué", diff --git a/Cryptid/localization/id.lua b/Cryptid/localization/id.lua index cc5579c..579a341 100644 --- a/Cryptid/localization/id.lua +++ b/Cryptid/localization/id.lua @@ -138,7 +138,7 @@ return { name = "The Clock", text = { "+0.1X blind requirements every", - "3 seconds spent this ante", + "12 seconds spent this ante", }, }, bl_cry_hammer = { @@ -166,7 +166,7 @@ return { name = "Lavender Loop", text = { "1.25X blind requirements every", - "1.5 seconds spent this round", + "6 seconds spent this round", }, }, bl_cry_obsidian_orb = { diff --git a/Cryptid/localization/ja.lua b/Cryptid/localization/ja.lua index 24a359e..df4410a 100644 --- a/Cryptid/localization/ja.lua +++ b/Cryptid/localization/ja.lua @@ -138,7 +138,7 @@ return { name = "The Clock", text = { "+0.1X blind requirements every", - "3 seconds spent this ante", + "12 seconds spent this ante", }, }, bl_cry_hammer = { @@ -166,7 +166,7 @@ return { name = "Lavender Loop", text = { "1.25X blind requirements every", - "1.5 seconds spent this round", + "6 seconds spent this round", }, }, bl_cry_obsidian_orb = { diff --git a/Cryptid/localization/ko.lua b/Cryptid/localization/ko.lua index cc5579c..579a341 100644 --- a/Cryptid/localization/ko.lua +++ b/Cryptid/localization/ko.lua @@ -138,7 +138,7 @@ return { name = "The Clock", text = { "+0.1X blind requirements every", - "3 seconds spent this ante", + "12 seconds spent this ante", }, }, bl_cry_hammer = { @@ -166,7 +166,7 @@ return { name = "Lavender Loop", text = { "1.25X blind requirements every", - "1.5 seconds spent this round", + "6 seconds spent this round", }, }, bl_cry_obsidian_orb = { diff --git a/Cryptid/localization/nl.lua b/Cryptid/localization/nl.lua index 787f1ae..f64b7bb 100644 --- a/Cryptid/localization/nl.lua +++ b/Cryptid/localization/nl.lua @@ -144,7 +144,7 @@ return { name = "The Clock", text = { "+0.1X blind requirements every", - "3 seconds spent this ante", + "12 seconds spent this ante", }, }, bl_cry_hammer = { @@ -172,7 +172,7 @@ return { name = "Lavender Loop", text = { "1.25X blind requirements every", - "1.5 seconds spent this round", + "6 seconds spent this round", }, }, bl_cry_obsidian_orb = { diff --git a/Cryptid/localization/pl.lua b/Cryptid/localization/pl.lua index 05c7cc6..a1b7e39 100644 --- a/Cryptid/localization/pl.lua +++ b/Cryptid/localization/pl.lua @@ -154,7 +154,7 @@ return { name = "Zegar", text = { "+0.1X wymagań przeszkadzajki", - "co 3 sekundy tego wejścia", + "co 12 sekundy tego wejścia", }, }, bl_cry_hammer = { @@ -182,7 +182,7 @@ return { name = "Lawendowa Pętla", text = { "1,25x wymagań przeszkadzajki", - "co 1,5 sekundy tego wejścia", + "co 6 sekundy tego wejścia", }, }, bl_cry_obsidian_orb = { @@ -1278,6 +1278,7 @@ return { j_cry_kidnap = { name = "Porwanie", text = { + "{C:red}Outdated Description{}", "Zyskujesz {C:money}$#2#{} na końcu rundy", "Wypłata rośnie o {C:money}$#1#{}", "kiedy Joker {C:attention}mnożnikowy{} lub", diff --git a/Cryptid/localization/pt_BR.lua b/Cryptid/localization/pt_BR.lua index cc5579c..8ecd762 100644 --- a/Cryptid/localization/pt_BR.lua +++ b/Cryptid/localization/pt_BR.lua @@ -1,363 +1,463 @@ ---I couldn't get Meme Packs to work without crashing ---yes somehow that was harder than RNJoker return { descriptions = { Back = { b_cry_antimatter = { - name = "Antimatter Deck", + name = "Baralho Antimatéria", text = { "Applies the {C:legendary,E:1}upsides{}", "of {C:attention}every{} deck", }, }, - b_cry_beta = { - name = "Nostalgic Deck", + b_cry_antimatter_balanced = { + name = "Baralho Anti-Materia", text = { - "{C:attention}Joker{} and {C:attention}Consumable{}", - "slots are {C:attention}combined", - "{C:attention}Nostalgic{} Blinds replace", - "their updated Blind", + "Aplica TODOS os efeitos {C:legendary,E:1}positivos{}", + "de {C:attention}cada{} deck vencido", + "na {C:gold}Aposta Dourada{}", + }, + }, + b_cry_beige = { + name = "Baralho Bege", + text = { + "{C:attention}Curingas{} comuns tem", + "{C:attention}Tem o valor{} quadruplicado", + }, + }, + b_cry_beta = { + name = "Baralho Nostalgico", + text = { + "{C:attention}Curingas{} e {C:attention}Consumíveis{}", + "tem espaços {C:attention}combinados", + "{C:attention}Blinds{} Nostálgicos são recolocados", + "com seu Blind atualizado", }, }, b_cry_blank = { - name = "Blank Deck", + name = "Baralho em Branco", text = { - "{C:inactive,E:1}Does nothing?", + "{C:inactive,E:1}Não faz Nada?", + }, + }, + b_cry_bountiful = { + name = "Baralho Generoso", + text = { + "Depois de {C:blue}Jogar{} ou {C:red}Descartar{},", + "sempre compre {C:attention}5{} cartas", }, }, b_cry_CCD = { - name = "CCD Deck", + name = "Baralho CDD", text = { - "Every card is also", - "a {C:attention}random{} consumable", + "Toda carta também", + "é um {C:attention}consumível{} aleatório", }, }, b_cry_conveyor = { - name = "Conveyor Deck", + name = "Baralho Conversor", text = { - "Jokers may {C:attention}not{} be moved", - "At start of round,", - "{C:attention}duplicate{} rightmost Joker", - "and {C:attention}destroy{} leftmost Joker", + "Curingas {C:attention}não{} podem sem movidos", + "No começo da rodada,", + "{C:attention}duplique{} O Curinga mais a direita", + "e {C:attention}destrua{} O Curinga mais a esquerda", }, }, b_cry_critical = { - name = "Critical Deck", + name = "Baralho Crítico", text = { - "After each hand played,", - "{C:green}#1# in 4{} chance for {X:dark_edition,C:white} ^2 {} Mult", - "{C:green}#1# in 8{} chance for {X:dark_edition,C:white} ^0.5 {} Mult", + "Após cada mão jogada,", + "{C:green}#1# em 4{} de chance para {X:dark_edition,C:white} ^2 {} Mult", + "{C:green}#1# em 8{} de chance para {X:dark_edition,C:white} ^0.5 {} Mult", + }, + }, + b_cry_e_deck = { + name = "Deck Edição", + text = { + "TODAS as cartas são {C:dark_edition}#1#{}", + "Cartas não conseguem mudar de edição", + "{C:inactive}(Clique para editar)", }, }, b_cry_encoded = { - name = "Encoded Deck", + name = "Baralho Codificado", text = { - "Start with a {C:cry_code,T:j_cry_CodeJoker}Code Joker{}", - "and a {C:cry_code,T:j_cry_copypaste}Copy/Paste{}", - "Only {C:cry_code}Code Cards{} appear in shop", + "Começe com um {C:cry_code,T:j_cry_CodeJoker} Curinga Código{}", + "e um {C:cry_code,T:j_cry_copypaste}Copia/Cola{}", + "Apenas {C:cry_code}Cartas de código{} aparecem na loja", }, }, b_cry_equilibrium = { - name = "Deck of Equilibrium", + name = "Baralho do Equilíbrio", text = { - "All cards have the", - "{C:attention}same chance{} of", - "appearing in shops,", - "start run with", - "{C:attention,T:v_overstock_plus}Overstock Plus", + "TODAS as cartas tem a", + "{C:attention}mesma chance{} de", + "aparecer nas lojas,", + "começe o jogo com", + "{C:attention,T:v_overstock_plus}Excesso de Estoque +1", + }, + }, + b_cry_et_deck = { + name = "Baralho Aprimorado", + text = { + "TODAS {C:attention}as cartas em jogo{}", + "são {C:attention}#1#{}(s)", + "{C:inactive}(Clique para editar)", }, }, b_cry_glowing = { - name = "Glowing Deck", + name = "Baralho Brilhante", text = { - "Multiply the values of", - "all Jokers by {X:dark_edition,C:white} X1.25 {}", - "when Boss Blind is defeated", + "Multiplica os valores de", + "todos os Curingas por {X:dark_edition,C:white} X1.25 {}", + "quando o Blind Chefe é derrotado", "{X:cry_jolly,C:white,s:0.8} Jolly#1#Open#1#Winner#1#-#1#wawa#1#person", --peak loc_vars right here }, }, b_cry_infinite = { - name = "Infinite Deck", + name = "Baralho Infinito", text = { - "You can select {C:attention}any", - "number of cards", - "{C:attention}+1{} hand size", + "Voce pode selecionar {C:attention}qualquer", + "número de cartas", + "{C:attention}+1{} tamanho de mão", }, }, b_cry_misprint = { - name = "Misprint Deck", + name = "Caralho com Erro de Impressão", text = { - "Values of cards", - "and poker hands", - "are {C:attention}randomized", + "Valores de cartas", + "e mãos de poker", + "são {C:attention}randomizados", }, }, b_cry_redeemed = { - name = "Redeemed Deck", + name = "Baralho Resgatado", text = { - "When a {C:attention}Voucher{} is purchased,", - "gain its {C:attention}extra tiers", + "Quando um {C:attention}Cumpom{} é comprado,", + "ganhe {C:attention}seus níveis extras", + }, + }, + b_cry_sk_deck = { + name = "Baralho Adesivado", + text = { + "TODAS as cartas são {C:attention}#1#{}", + "{C:inactive}(Clique para editar)", + }, + }, + b_cry_sl_deck = { + name = "Baralho Selo", + text = { + "Todas as cartas em jogo tem uma {C:dark_edition}#1#{}", + "Cartas não conseguem mudar de Selos", + "{C:inactive}(Clique para editar)", + }, + }, + b_cry_spooky = { + name = "Baralho Assustador", + text = { + "Começe com um {C:eternal}Eterno{} {C:attention,T:j_cry_chocolate_dice}Dado de Chocolate", + "Após cada {C:attention}Aposta{}, crie um", + "Curinga {C:cry_candy}Doce{} ou {X:cry_cursed,C:white}Amaldiçoado{}", + }, + }, + b_cry_st_deck = { + name = "Baralho Naipe", + text = { + "TODAS as cartas em jogo são {C:dark_edition}#1#", + "e não conseguem mudar de naipe", + "{C:inactive}(Clique para editar)", }, }, b_cry_very_fair = { - name = "Very Fair Deck", + name = "Baralho Muito Justo", text = { - "{C:blue}-2{} hands, {C:red}-2{} discards", - "every round", - "{C:attention}Vouchers{} no longer", - "appear in the shop", + "{C:blue}-2{} mãos, {C:red}-2{} descartes", + "toda rodada", + "{C:attention}Cupons{} não vão mais", + "aparecer na loja", }, }, b_cry_wormhole = { - name = "Wormhole Deck", + name = "Baralho Buraco de Minhoca", text = { - "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", + "Começe com um Curinga {C:cry_exotic}Exótico{C:attention}", + "Curingas são {C:attention}20X{} mais suscetíveis", + "para serem {C:dark_edition}Negativos", + "{C:attention}-2{} Espaços de Coringa", }, }, b_cry_legendary = { - name = "Legendary Deck", + name = "Baralho Lendário", text = { - "Start with an {C:legendary}Legendary{C:legendary} Joker", - "{C:green}1 in 5{} chance to create another", - "when Boss Blind is defeated {C:inactive}(must have room){}", + "Começe com um Curinga {C:legendary}Lendário{C:legendary}", + "{C:green}1 em 5{} de chance para criar outro", + "quando o Blind Chefe é derrotado", + "{C:inactive}(precisa ter espaço){}", }, }, }, Blind = { bl_cry_box = { - name = "The Box", + name = "A Caixa", text = { - "All Common Jokers", - "are debuffed", + "Todos os Curingas Comuns", + "são desativados", }, }, bl_cry_clock = { - name = "The Clock", + name = "O Relogio", text = { - "+0.1X blind requirements every", - "3 seconds spent this ante", + "+0.1X requirimentos do blind a cada", + "12 segundos gastos nesta aposta", }, }, bl_cry_hammer = { - name = "The Hammer", + name = "O Martelo", text = { - "All cards with odd", - "rank are debuffed", + "Todas as cartas com classe", + "ímpar são desativadas", }, }, bl_cry_joke = { - name = "The Joke", + name = "A Piada", text = { - "If score is >2X requirements,", - "set ante to multiple of #1#", + "Se a pontuação é >2X maior que o", + "requerimento, coloque a aposta para #2#", }, }, bl_cry_magic = { - name = "The Magic", + name = "A Magia", text = { - "All cards with even", - "rank are debuffed", + "Todas as cartas com clsse", + "par são desativadas", }, }, bl_cry_lavender_loop = { - name = "Lavender Loop", + name = "Loop de Lavanda", text = { - "1.25X blind requirements every", - "1.5 seconds spent this round", + "1.25X requerimentos do blind para cada", + "6 segundos gastos nesta rodada", }, }, bl_cry_obsidian_orb = { - name = "Obsidian Orb", + name = "Orbe de Obsidiana", text = { - "Applies abilities of", - "all defeated bosses", + "Aplica as habilidades", + "de todos os chefes derrotados", }, }, bl_cry_oldarm = { - name = "Nostalgic Arm", + name = "Braço Nostálgico", text = { - "Must play 4", - "or fewer cards", + "Deve jogar 4", + "ou menos cartas", }, }, bl_cry_oldfish = { - name = "Nostalgic Fish", + name = "Peixe Nostálgico", text = { - "All hands start", - "with 1 Mult", + "Todas as mãos começam", + "com 1 Mult", }, }, bl_cry_oldflint = { - name = "Nostalgic Flint", + name = "Pederneira Nostálgica", text = { - "No Flushes", + "Sem Flushes", }, }, bl_cry_oldhouse = { - name = "Nostalgic House", + name = "Casa Nostálgica", text = { - "No Full Houses", + "Sem Full Houses", }, }, bl_cry_oldmanacle = { - name = "Nostalgic Manacle", + name = "Algema Nostálgica", text = { - "Divide Mult by discards", + "Divide o Mult pelos descartes", }, }, bl_cry_oldmark = { - name = "Nostalgic Mark", + name = "Marca Nostálgica", text = { - "No hands that", - "contain a Pair", + "Sem mãos que", + "contém um Par", }, }, bl_cry_oldox = { - name = "Nostalgic Ox", + name = "Boi Nostálgico", text = { - "All hands start", - "with 0 Chips", + "Todas as mãos começam", + "com 0 Fichas", }, }, bl_cry_oldpillar = { - name = "Nostalgic Pillar", + name = "Pilar Nostálgico", text = { - "No Straights", + "Sem sequências", }, }, bl_cry_oldserpent = { - name = "Nostalgic Serpent", + name = "Serpente Nostálgica", text = { - "Divide Mult by level", - "of played poker hand", + "Divide o Mult pelo nível", + "da mão de poker jogada", }, }, bl_cry_pin = { - name = "The Pin", + name = "O Pino", text = { - "Jokers with Epic or higher", - "rarity are debuffed", + "Curingas com a raridade Épica", + "ou maior são desativados", }, }, bl_cry_pinkbow = { - name = "Pink Bow", + name = "Laço Rosa", text = { - "Randomize rank of cards", - "held in hand on play", + "Randomiza a classe das cartas", + "seguradas em mãos ao jogar", }, }, bl_cry_sapphire_stamp = { - name = "Sapphire Stamp", + name = "Carimbo Safira", text = { - "Select an extra card, deselect", - "random card before scoring", + "Selecione uma carta extra, desseleciona", + "uma carta aleatória antes de pontuar", }, }, bl_cry_shackle = { - name = "The Shackle", + name = "As Algemas", text = { - "All Negative Jokers", - "are debuffed", + "Todos os Curingas Negativos", + "são desativados", }, }, bl_cry_striker = { - name = "The Striker", + name = "O Atacante", text = { - "All Rare Jokers", - "are debuffed", + "Todos os Curingas Raros", + "são desativados", }, }, bl_cry_tax = { - name = "The Tax", + name = "O Imposto", text = { - "Score per hand capped at", - "0.4X blind requirements", + "Pontos por mão são limitados", + "em #1#", }, }, bl_cry_tornado = { - name = "Turquoise Tornado", + name = "Tornado Turquesa", text = { - "#1# in #2# chance for", - "played hand to not score", + "#1# em #2# de chance da", + "mão jogada não pontuar", }, }, bl_cry_trick = { - name = "The Trick", + name = "O Truque", text = { - "After each hand, flip all", - "face-up cards held in hand", + "Após cada mão, vire todas as cartas", + "na mão de cabeça para baixo", + }, + }, + bl_cry_trophy = { + name = "Troféu Limão", + text = { + "Mult não pode", + "exceder as Fichas", }, }, bl_cry_vermillion_virus = { - name = "Vermillion Virus", + name = "Virus Vermelhão", text = { - "One random Joker", - "replaced every hand", + "Um Curinga aleatório", + "é substituido a cada mão", }, }, bl_cry_windmill = { - name = "The Windmill", + name = "O Moinho de Vento", text = { - "All Uncommon Jokers", - "are debuffed", + "Todos os Curingas Incomuns", + "são desativados", }, }, }, Code = { - c_cry_class = { - name = "://CLASS", + c_cry_alttab = { + name = "://ALTTAB", text = { - "Convert {C:cry_code}#1#{} selected card", - "to a {C:cry_code}chosen{} enhancement", + "Cria a {C:cry_code}atual{}", + "marca do blind", + "{C:inactive}(Atual: {C:cry_code}#1#{C:inactive})", + }, + }, + c_cry_class = { + name = "://CLASSE", + text = { + "Converta {C:cry_code}#1#{} carta#1# selecionada ", + "para uma do aprimoramento {C:cry_code}escolhido{}", }, }, c_cry_commit = { - name = "://COMMIT", + name = "://COMPROMETER-SE", text = { - "Destroy a {C:cry_code}selected{} Joker,", - "create a {C:cry_code}new{} Joker", - "of the {C:cry_code}same rarity", + "Destrua um Coringa {C:cry_code}selecionado{},", + "cria um Coringa {C:cry_code}novo{}", + "com a {C:cry_code}mesma raridade", }, }, c_cry_crash = { - name = "://CRASH", + name = "://CRASHAR", text = { - "{C:cry_code,E:1}Don't.", + "{C:cry_code,E:1}Não.", + }, + }, + c_cry_ctrl_v = { + name = "://CTRL+V", + text = { + "Cria uma {C:cry_code}cópia{} de um(a)", + "Carta de jogo ou um Consumível", }, }, c_cry_delete = { name = "://DELETE", text = { - "{C:cry_code}Permanently{} remove a", - "{C:cry_code}selected{} shop item", - "{C:inactive,s:0.8}Item cannot appear again this run", + "{C:cry_code}Bana{} qualquer item de loja", + "{C:cry_code}selecionado{}, ele não vai mais aparecer", + "normalmente na partida", + "{C:inactive}Multiuso: ({C:cry_code}#1#{C:inactive} restantes)", }, }, c_cry_divide = { - name = "://DIVIDE", + name = "://DIVIDIR", text = { - "{C:cry_code}Halve{} all listed prices", - "in current shop", + "{C:cry_code}Divida{} todos os preços listado", + "na atual loja por 2", }, }, c_cry_exploit = { name = "://EXPLOIT", text = { - "The {C:cry_code}next{} hand played", - "is calculated as a", - "{C:cry_code}chosen{} poker hand", - "{C:inactive,s:0.8}Secret hands must be", - "{C:inactive,s:0.8}discovered to be valid", + "{C:cry_code}Escolha{} uma mão de poker {C:cry_code}atualmente visível{},", + "a próxima mão é {C:cry_code}calculada{} como essa,", + "e ganha {C:cry_code}um{} temp {C:cry_code}Poder de Ascensão{}", + "{C:inactive}Multiuso: ({C:cry_code}#1#{C:inactive} restante(s))", }, }, c_cry_hook = { - name = "HOOK://", + name = "FISGAR://", text = { - "Select two Jokers", - "to become {C:cry_code}Hooked", + "Selecione dois Coringas para se tornarem {C:cry_code}fisgado", + "{C:inactive,s:0.8}Apenas Funciona apropriadamente se os Coringas", + "ativarem no mesmo contexto,", + "{C:inactive,s:0.8}Como os Coringas e A Dupla (ambos pós-pontuados)", + }, + }, + c_cry_inst = { + name = "://INSTANTIATE", + text = { + "Compre uma carta com a {C:cry_code}classe{} selecionado da carta ", + "e uma com o {C:cry_code}Naipe{} da carta selecionada ", + "{C:inactive}(se possível){}", }, }, c_cry_machinecode = { @@ -368,94 +468,227 @@ return { }, c_cry_malware = { name = "://MALWARE", - text = { "Add {C:dark_edition}Glitched{} to all", "cards {C:cry_code}held in hand" }, + text = { "Adicione {C:dark_edition}Bugado{} para todas as", "cartas {C:cry_code}em mãos" }, }, c_cry_merge = { name = "://MERGE", text = { - "Merge a selected {C:cry_code}consumable", - "with a selected {C:cry_code}playing card", + "Fusione um {C:cry_code}consumível selecionado ", + "com a {C:cry_code}carta de jogo selecionada", }, }, c_cry_multiply = { name = "://MULTIPLY", text = { - "{C:cry_code}Double{} all values of", - "a selected {C:cry_code}Joker{} until", - "end of round", + "{C:cry_code}Drobra{} todos os valores do", + " {C:cry_code}Coringa{} selecionado até", + "o fim da rodada", + }, + }, + c_cry_patch = { + name = "://PATCH", + text = { + "Romove todos {C:cry_code}desativados", + "dos itens visiveis atualmente", + "{C:cry_code}Reseta{} o ou do estado da loja", }, }, c_cry_payload = { name = "://PAYLOAD", text = { - "Next defeated Blind", - "gives {C:cry_code}X#1#{} interest", + "O próximo Blind derrotado", + "vai dar {C:cry_code}X#1#{} juros", }, }, c_cry_oboe = { name = "://OFFBYONE", text = { - "Next {C:cry_code}Booster Pack{} has", - "{C:cry_code}#1#{} extra card and", - "{C:cry_code}#1#{} extra choice", - "{C:inactive}(Currently {C:cry_code}+#2#{C:inactive})", + "O próximo {C:cry_code}Pacote de Reforço{} tem,", + "{C:cry_code}#1#{} uma carta#1# extra e", + "{C:cry_code}#1#{} uma escolha#1# extra", + "{C:inactive}(Atualmente {C:cry_code}+#2#{C:inactive})", }, }, c_cry_reboot = { name = "://REBOOT", text = { - "Replenish {C:blue}Hands{} and {C:red}Discards{},", - "return {C:cry_code}all{} cards to deck", - "and draw a {C:cry_code}new{} hand", + "Reabastece {C:blue}Mãos{} e {C:red}Descartes{},", + "retorna {C:cry_code}todas{} as cartas para o baralho", + "e compre uma {C:cry_code}nova{} mão", }, }, c_cry_revert = { - name = "://REVERT", + name = "://REVERTA", text = { - "Set {C:cry_code}game state{} to", - "start of {C:cry_code}this Ante{}", + "Coloque o {C:cry_code}estado do jogo{} para", + "o começo {C:cry_code}desta aposta{}", }, }, c_cry_rework = { name = "://REWORK", text = { - "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", + "Destrua um Coringa {C:cry_code}selecionado{},", + "cria uma {C:cry_code}Marca Retrabalhada{} com", + "uma edição {C:cry_code}aprimorada{}", + "{C:inactive,s:0.8}Aprimoramento são usados na ordem da coleção", }, }, c_cry_run = { name = "://RUN", text = { - "Visit a {C:cry_code}shop", - "during a {C:cry_code}Blind", + "Visite a {C:cry_code}loja", + "durante o {C:cry_code}Blind", }, }, c_cry_seed = { - name = "://SEED", + name = "://SEMENTE", text = { - "Select a Joker", - "or playing card", - "to become {C:cry_code}Rigged", + "Selecione um Coringa", + "ou uma carta de jogo", + "ela se tornará {C:cry_code}Roubada", }, }, c_cry_semicolon = { name = ";//", - text = { "Ends current non-Boss {C:cry_code}Blind{}", "{C:cry_code}without{} cashing out" }, + text = { "Termine o atual {C:cry_code}Blind{} que não seja Chefe ", "{C:cry_code}sem{} falhar" }, }, c_cry_spaghetti = { - name = "://SPAGHETTI", + name = "://ESPAGUETE", text = { - "Create a {C:cry_code}Glitched", - "Food Joker", + "Cria um Coringa Comida", + "{C:cry_code}Bugado", }, }, c_cry_variable = { - name = "://VARIABLE", + name = "://VARIAVEL", text = { - "Convert {C:cry_code}#1#{} selected cards", - "to a {C:cry_code}chosen{} rank", + "Converta {C:cry_code}#1#{} carta#1# selecionadas", + "para a classe {C:cry_code}escolhida{}", + }, + }, + }, + ["Content Set"] = { + set_cry_blind = { + name = "Blinds", + text = { + "{C:attention}Boss Blinds{} added", + "by Cryptid", + }, + }, + set_cry_code = { + name = "Code Cards", + text = { + "{C:cry_code}Code Cards{} and", + "related content", + }, + }, + set_cry_cursed = { + name = "Cursed Jokers", + text = { + "Harmful Jokers with", + "{X:cry_cursed,C:white}Cursed{} rarity", + }, + }, + set_cry_deck = { + name = "Decks", + text = { + "{C:attention}Decks{} added", + "by Cryptid", + }, + }, + set_cry_epic = { + name = "Epic Jokers", + text = { + "Jokers with", + "{C:cry_epic}Epic{} rarity", + "{C:inactive,s:0.8}(Between Rare and Legendary)", + }, + }, + set_cry_exotic = { + name = "Exotic Jokers", + text = { + "Powerful Jokers with", + "{C:cry_exotic}Exotic{} rarity", + }, + }, + set_cry_m = { + name = "M Jokers", + text = { + "Jokers related to", + "the letter {C:attention}M{}", + "and {C:attention}Jolly Joker", + }, + }, + set_cry_misc = { + name = "Misc.", + text = { + "Things that don't", + "fit in any other", + "{C:cry_ascendant}Thematic Set", + }, + }, + set_cry_misc_joker = { + name = "Misc. Jokers", + text = { + "{C:attention}Jokers{} that don't", + "fit in any other", + "{C:cry_ascendant}Thematic Set", + }, + }, + set_cry_planet = { + name = "Planet Cards", + text = { + "Miscellaneous {C:planet}Planet{} Cards", + "added by Cryptid", + }, + }, + set_cry_poker_hand_stuff = { + name = "Poker Hand Stuff", + text = { + "Add 4 new {C:attention}poker hands", + "and enable {C:attention}Ascended hands", + }, + }, + set_cry_spectral = { + name = "Spectral Cards", + text = { + "{C:spectral}Spectral{} Cards added", + "by Cryptid", + }, + }, + set_cry_spooky = { + name = "Spooky Update", + text = { + "Spooky Update content,", + "including {C:cry_candy}Candy{} Jokers", + }, + }, + set_cry_tag = { + name = "Tags", + text = { + "{C:attention}Tags{} added", + "by Cryptid", + }, + }, + set_cry_tier3 = { + name = "Tier 3 Vouchers", + text = { + "An extra {C:attention}tier{}", + "of Vouchers", + }, + }, + set_cry_timer = { + name = "Timer Mechanics", + text = { + "Items with {C:attention}time-based", + "effects and mechanics", + }, + }, + set_cry_voucher = { + name = "Misc. Vouchers", + text = { + "Tier 1 and 2 {C:attention}Vouchers{}", + "added by Cryptid", }, }, }, @@ -467,1873 +700,2718 @@ return { }, }, e_cry_blur = { - name = "Blurred", + name = "Borrada", text = { - "{C:attention}Retrigger{} this", - "card {C:attention}1{} time", - "{C:green}#1# in #2#{} chance", - "to retrigger {C:attention}#3#{}", - "additional time", + "{C:attention}Reativa{} essa", + "carta {C:attention}1{} vez", + "{C:green}#1# em #2#{} de chance", + "para reativar {C:attention}#3#{}", + " vezes#3# adicionais", }, }, e_cry_double_sided = { - name = "Double-Sided", + name = "Lado Duplo", text = { - "This card can be", - "{C:attention}flipped{} to reveal", - "a different card", - "{C:inactive}(Blank side can be merged", - "{C:inactive}with another card)", + "Essa carta pode ser", + "{C:attention}virada{} para revelar", + "uma carta diferente", + "{C:inactive}(O lado em branco pode ser mesclado", + "{C:inactive}com outra carta)", }, }, e_cry_glass = { - name = "Fragile", + name = "Frágil", label = "Fragile", text = { "{C:white,X:mult} X#3# {} Mult", - "{C:green}#1# in #2#{} chance this", - "card isn't {C:red}destroyed", - "when triggered", + "{C:green}#1# em #2#{} de chance desta", + "carta não ser {C:red}destruída", + "quando ativada", }, }, e_cry_glitched = { - name = "Glitched", + name = "Bugado", text = { - "All values on this card", - "are {C:dark_edition}randomized{}", - "between {C:attention}X0.1{} and {C:attention}X10{}", - "{C:inactive}(If possible){}", + "TODOS os valores nesta carta", + "são {C:dark_edition}randomizados{}", + "entre {C:attention}X0.1{} e {C:attention}X10{}", + "{C:inactive}(Se possivel){}", }, }, e_cry_gold = { - name = "Golden", + name = "Dourada", label = "Golden", text = { - "Earn {C:money}$#1#{} when used", - "or triggered", + "Ganhe {C:money}$#1#{} quando usada", + "ou Ativada", }, }, e_cry_m = { - name = "Jolly", + name = "Alegre", text = { "{C:mult}+#1#{} Mult", - "This card is feeling", - "rather {C:attention}jolly{}", + "Esta carta está sentindo", + "{C:attention}alegre{}", }, }, e_cry_mosaic = { - name = "Mosaic", + name = "Mosaico", text = { - "{X:chips,C:white} X#1# {} Chips", + "{X:chips,C:white} X#1# {} Fichas", }, }, e_cry_noisy = { - name = "Noisy", + name = "Barulhenta", text = { "???", }, }, e_cry_oversat = { - name = "Oversaturated", + name = "Hipersaturada", text = { - "All values", - "on this card", - "are {C:attention}doubled{}", - "{C:inactive}(If possible)", + "TODOS os valores", + "nesta carta", + "são {C:attention}dobrados{}", + "{C:inactive}(Se possível)", }, }, }, Enhanced = { m_cry_echo = { - name = "Echo Card", + name = "Carta Eco", text = { - "{C:green}#2# in #3#{} chance to", - "{C:attention}retrigger{} #1# additional", - "times when scored", + "{C:green}#2# em #3#{} de chance para", + "{C:attention}reativar{} #1# veze#1#", + " adicionais quando pontuada", + }, + }, + m_cry_light = { + name = "Carta da luz", + text = { + "Quando ativada com {C:attention}#4#{} {C:inactive}(#3#){} outra", + "carta#4# pontuada, ganha {X:mult,C:white}X#1#{} Mult e", + "aumenta o requerimento em {C:attention}5{}", + "{C:inactive}(Atualmente {X:mult,C:white}X#2#{C:inactive} Mult)", }, }, }, Joker = { - j_cry_altgoogol = { - name = "Nostalgic Googol Play Card", + j_cry_test_modest = { + name = "Test Joker", text = { - "Sell this card to create", - "{C:attention}2{} copies of the leftmost {C:attention}Joker{}", - "{C:inactive,s:0.8}Does not copy Nostalgic Googol Play Cards{}", + "{C:chips}+#1#{} Chip#1#", + }, + }, + j_cry_test_mainline = { + name = "Test Joker", + text = { + "{C:chips}+#1#{} Chip#1#", + "{C:money}+$44{} at start of {C:attention}Blind{}", + }, + }, + j_cry_test_madness = { + name = "Test Joker", + text = { + "{C:chips}+#1#{} Chip#1#", + "{C:money}+$44444{} at start of {C:attention}Blind{}", + }, + }, + j_cry_test_cryptid_in_2025 = { + name = "Test Joker", + text = { + "{C:chips}+#1#{} Chip#1#", + "{C:money}+$44444{} at start of {C:attention}Blind{}", + }, + }, + j_cry_adroit = { + name = "Curinga Adroit", + text = { + "{C:chips}+#1#{} Ficha#1# se a mão", + "jogada conter", + "um {C:attention}#2#", + }, + }, + j_cry_altgoogol = { + name = "Carta da Gugol Play Nostalgica", + text = { + "Venda esta carta para criar", + "{C:attention}#1#{} copia#1# do {C:attention}Curinga{} mais a esquerda", + "{C:inactive,s:0.8}Não copia Cartas da Gugol Play Nostálgica{}", + }, + }, + j_cry_altgoogol_balanced = { + name = "Carta da Gugol Play Nostalgica", + text = { + "Venda esta carta para criar", + "{C:attention}#1#{} copia#1# do {C:attention}Curinga{} mais a esquerda", + "{C:inactive,s:0.8}Não copia Cartas da Gugol Play Nostálgica{}", + "{C:inactive}(Precisa ter espaço){}", + --todo: add "removes negative from copy" like Ankh/Invis Joker }, }, j_cry_antennastoheaven = { - name = "...Like Antennas to Heaven", + name = "São...Tipo Antenas no Ceu", text = { - "This Joker gains", - "{X:chips,C:white} X#1# {} Chips when each", - "played {C:attention}7{} or {C:attention}4{} is scored", - "{C:inactive}(Currently {X:chips,C:white}X#2# {C:inactive} Chips)", + "Este Curinga ganha", + "{X:chips,C:white} X#1# {} Fichas quando cada", + "{C:attention}7{} ou {C:attention}4{} jogado é pontuado", + "{C:inactive}(Atualmente {X:chips,C:white}X#2# {C:inactive} Fichas)", }, }, j_cry_apjoker = { - name = "AP Joker", - text = { "{X:mult,C:white} X#1# {} Mult against {C:attention}Boss Blinds{}" }, + name = "Curinga AP", + text = { "{X:mult,C:white} X#1# {} Mult contra {C:attention}Blids Chefes{}" }, + }, + j_cry_arsonist = { + name = "Incendiario", + text = { + "Se a mão jogada", + "conter um {C:attention}Full House{},", + "{C:red}destrua{} todas as cartas", + "depois de pontuar", + }, + }, + j_cry_astral_bottle = { + 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_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 = "Big Cube", + name = "Cubo Grande", text = { - "{X:chips,C:white} X#1# {} Chips", + "{X:chips,C:white} X#1# {} Fichas", }, }, j_cry_biggestm = { - name = "Huge", + name = "GIGANTE", text = { - "{X:mult,C:white} X#1# {} Mult until end", - "of round if {C:attention}poker hand{}", - "is a {C:attention}#2#{}", - "{C:inactive}(Currently {C:attention}#3#{}{C:inactive}){}", - "{C:inactive,s:0.8}not fat, just big boned.", + "{X:mult,C:white} X#1# {} Mult até o final", + "da rodada se a {C:attention}mão de poker{}", + "é um {C:attention}#2#{}", + "{C:inactive}(Atualmente {C:attention}#3#{}{C:inactive}){}", + "{C:inactive,s:0.8}Não gordo, apenas com ossos largos.", + }, + }, + j_cry_blacklist = { + name = "Lista Negra", + text = { + "Se um {C:attention}#1#{} está em sua mão ou foi jogado,", + "coloque {C:chips}Fichas{} e {C:mult}Mult{} para 0", + "{C:red,E:2}se autodestrói{} se nenhum {C:attention}#1#{} está no baralho", + "{C:inactive,s:0.8}A classe não muda", }, }, j_cry_blender = { - name = "Blender", + name = "Liquidificador", text = { - "Create a {C:attention}random{}", - "consumable when a", - "{C:cry_code}Code{} card is used", - "{C:inactive}(Must have room){}", + "Cria um consumível", + "{C:attention}aleatório{} quando uma", + "carta de {C:cry_code}Código{} é usada", + "{C:inactive}(Deve ter espaço){}", }, }, j_cry_blurred = { - name = "Blurred Joker", + name = "Curinga Borrado", text = { - "Gain {C:blue}+#1#{} hand(s) when", - "{C:attention}Blind{} is selected", + "Ganhe {C:blue}+#1#{} mão#1# quando", + "{C:attention}Blind{} é selecionado", }, }, j_cry_bonk = { - name = "Bonk", + name = "BAM", text = { - "Each {C:attention}Joker{} gives {C:chips}+#1#{} Chips", - "Increase amount by {C:chips}+#2#{} if", - "{C:attention} poker hand{} is a {C:attention}#3#{}", - "{C:inactive,s:0.8}Jolly Jokers give{} {C:chips,s:0.8}+#4#{} {C:inactive,s:0.8}Chips instead{}", + "Cada {C:attention}Coringa{} da {C:chips}+#1#{} ficha#1#", + "Aumenta a quantidade em {C:chips}+#2#{} se", + "a {C:attention} mão de poker{} é um {C:attention}#3#{}", + "{C:inactive,s:0.8}Curingas Alegres dão{} {C:chips,s:0.8}+#4#{} {C:inactive,s:0.8}Fichas#4# em vez disso{}", + }, + }, + j_cry_bonkers = { + name = "Curinga Bonkers", + text = { + "{C:red}+#1#{} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_bonusjoker = { - name = "Bonus Joker", + name = "Curinga Bonus", text = { - "{C:green}#1# in #2#{} chance for each", - "played {C:attention}Bonus{} card to increase", - "{C:attention}Joker{} or {C:attention}Consumable slots", - "by {C:dark_edition}1{} when scored", - "{C:red}Works twice per round", - "{C:inactive,s:0.8}(Equal chance for each){}", + "{C:green}#1# em #2#{} de chance para cada", + "carta {C:attention}Bônus{} jogada aumentar", + "espaço de {C:attention}Curinga{} ou {C:attention}Consumível", + "por {C:dark_edition}#3#{} quando pontuado", + "{C:red}Funciona duas vezes por rodada", + "{C:inactive,s:0.8}(Chance é igual para ambos){}", }, }, j_cry_booster = { - name = "Booster Joker", + name = "Pacote-Curinga", text = { - "{C:attention}+#1#{} Booster Pack slot", - "available in shop", + "{C:attention}+#1#{} espaço#1# de Pacote de Reforço", + "disponível na loja", }, }, j_cry_boredom = { - name = "Boredom", + name = "Tedio", text = { - "{C:green}#1# in #2#{} chance to", - "{C:attention}retrigger{} each {C:attention}Joker{}", - "or {C:attention}played card{}", - "{C:inactive,s:0.8}Does not affect other Boredom{}", + "{C:green}#1# em #2#{} de chance para", + "{C:attention}reativar{} cada {C:attention}Curinga{}", + "ou {C:attention}carta de jogo{}", + "{C:inactive,s:0.8}Não afeta outros Tédios{}", + }, + unlock = { + "AFK in the title", + "screen for", + "{C:attention}10 minutes", + }, + }, + j_cry_brittle = { + name = "Doce Fragil", + text = { + "Para as próximas {C:attention}#1#{} mão#1#,", + "adicione {C:attention}Pedra{}, {C:attention}Ouro{}, ou {C:attention}Aço{} para", + "a carta pontuada mais a direita", }, }, j_cry_bubblem = { - name = "Bubble M", + name = "Bolha M", text = { - "Create a {C:dark_edition}Foil {C:attention}Jolly Joker{}", - "if played hand contains", - "a {C:attention}#1#{}", - "{C:red,E:2}self destructs{}", + "Cria um {C:attention}Curinga Alegre{} {C:dark_edition}Laminado", + "se a mão jogada contém", + "um {C:attention}#1#{}", + "{C:red,E:2}se autodestrói{}", }, }, j_cry_busdriver = { - name = "Bus Driver", + name = "Motorista de Onibus", text = { - "{C:green}#1# in #3#{} chance", - "for {C:mult}+#2#{} Mult", - "{C:green}1 in 4{} chance", - "for {C:mult}-#2#{} Mult", + "{C:green}#1# em #3#{} de chance", + "para {C:mult}+#2#{} Mult", + "{C:green}#4# em #3#{} de chance", + "para {C:mult}-#2#{} Mult", + }, + }, + j_cry_candy_basket = { + name = "Cesta de Doces", + text = { + "Venda esta carta para criar {C:attention}#1#{} {C:cry_candy}Doce#1#", + "{C:attention}+#2#{} {C:cry_candy}Doce#2#{} para cada {C:attention}2{} Blinds derrotados", + "{C:attention}+#3#{} {C:cry_candy}Doce#3#{} quando {C:attention}Blind Chefe{} derrotado", + }, + }, + j_cry_candy_buttons = { + name = "Botões de Doces", + text = { + "As Próximas {C:attention}#1#{} atulizações", + "cost {C:money}$1{}", + }, + }, + j_cry_candy_cane = { + name = "Bengala Doce", + text = { + "Pelas próximas {C:attention}#1#{} rodadas#1#,", + "Cartas de jogo dão {C:money}$#2#", + "quando {C:attention}reativadas", + }, + }, + j_cry_candy_dagger = { + name = "Adaga Doce", + text = { + "Quando {C:attention}Blind{} é selecionado,", + "destrua o Curinga mais a direita", + "para criar um {C:cry_candy}Doce{}", + }, + }, + j_cry_candy_sticks = { + name = "Palitinho Doce", + text = { + "O próximo Blind Chefe tem seu efeito desativado", + "até você ter jogado {C:attention}#1#{} mão#1#", }, }, j_cry_canvas = { - name = "Canvas", + name = "Tela", 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:attention}Reativa{} todos os {C:attention}Curingas{} para a esquerda", + "uma vez para {C:attention}cada{} {C:attention} Curinga{} não {C:blue}Comum", + "na direita deste Curinga", + }, + unlock = { + "Retrigger a {C:attention}Joker", + "{C:attention}114{} times", + "in one hand", + }, + }, + j_cry_canvas_balanced = { + name = "Tela", + text = { + "{C:attention}Reativa{} todos os {C:attention}Curingas{} para a esquerda", + "uma vez para {C:attention}cada{} {C:attention} Curinga{} não {C:blue}Comum", + "na direita deste Curinga", + "{C:inactive}(Máximo de 2 reativações)", + }, + unlock = { + "Retrigger a {C:attention}Joker", + "{C:attention}114{} times", + "in one hand", }, }, j_cry_caramel = { - name = "Caramel", + name = "Caramelo", text = { - "Each played card gives", - "{X:mult,C:white}X#1#{} Mult when scored", - "for the next {C:attention}#2#{} rounds", + "Cada carta da", + "{X:mult,C:white}X#1#{} Mult quando pontuada", + "pelas próximas {C:attention}#2#{} rodada#2#", + }, + }, + j_cry_cat_owl = { + name = "Gatoruja", + text = { + "{C:attention}Cartas da Sorte{} também são", + "Consideradas {C:attention}Cartas Eco", + "{C:attention}Cartas Eco{} também são", + "consideradas {C:attention}Cartas da Sorte", }, }, j_cry_chad = { name = "Chad", text = { - "Retrigger {C:attention}leftmost{} Joker", - "{C:attention}#1#{} additional time(s)", + "Reativa o Curinga {C:attention}mais a esquerda{}", + "{C:attention}#1#{} vez#1# adicionais ", }, }, j_cry_chili_pepper = { - name = "Chili Pepper", + name = "Pimenta Malagueta", text = { - "This Joker gains {X:mult,C:white} X#2# {} Mult", - "at end of round,", - "{C:red,E:2}self destructs{} after {C:attention}#3#{} rounds", - "{C:inactive}(Currently{} {X:mult,C:white} X#1# {} {C:inactive}Mult){}", + "Este Curinga ganha {X:mult,C:white} X#2# {} Mult", + "no fim da rodada,", + "{C:red,E:2}se autodestrói{} depois de {C:attention}#3#{} rodada#3#", + "{C:inactive}(Atualmente{} {X:mult,C:white} X#1# {} {C:inactive}Mult){}", + }, + }, + j_cry_chocolate_dice = { + name = "Dado de Chocolate", + text = { + "Role um {C:green}d10{} quando", + "o {C:attention}Blind Chefe{} é derrotado", + "para começar um {C:cry_ascendant,E:1}evento", + "{C:inactive}(Atualmente: #1#)", }, }, j_cry_circulus_pistoris = { name = "Circulus Pistoris", text = { - "{X:dark_edition,C:white}^#1#{} Chips and {X:dark_edition,C:white}^#1#{} Mult", - "if {C:attention}exactly{} #2#", - "hands remaining", + "{X:dark_edition,C:white}^#1#{} Fichas e {X:dark_edition,C:white}^#1#{} Mult", + "se tiver {C:attention}exatamente{} #2#", + "mão#2# restantes", }, }, j_cry_circus = { - name = "Circus", + name = "Circo", text = { - "{C:red}Rare{} Jokers each give {X:mult,C:white} X#1# {} Mult", - "{C:cry_epic}Epic{} Jokers each give {X:mult,C:white} X#2# {} Mult", - "{C:legendary}Legendary{} Jokers each give {X:mult,C:white} X#3# {} Mult", - "{C:cry_exotic}Exotic{} Jokers each give {X:mult,C:white} X#4# {} Mult", + "Cada Curinga {C:red}Raro{} da {X:mult,C:white} X#1# {} Mult", + "Cada Curinga{C:cry_epic}Épico{} da {X:mult,C:white} X#2# {} Mult", + "Cada Curinga {C:legendary}Lendário{} da {X:mult,C:white} X#3# {} Mult", + "Cada Curinga {C:cry_exotic}Exótico{} da {X:mult,C:white} X#4# {} Mult", + }, + unlock = { + "Obtain a {C:red}Rare{},", + "{C:cry_epic}Epic{} and {C:legendary}Legendary{}", + "Joker before {C:attention}Ante 9", + }, + }, + j_cry_clash = { + name = "O Confronto", + text = { + "{X:mult,C:white} X#1# {} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", + }, + unlock = { + "Win a run with", + "your final hand being", + "an {E:1,C:attention}Ultimate Pair", + }, + }, + j_cry_clicked_cookie = { + name = "Cookie Clicado", + text = { + "{C:chips}+#1#{} Ficha#1#", + "{C:chips}-#2#{} Ficha#2# quando", + "você {C:attention}clica", + "{C:inactive}(Em caso de vício, busque ajuda em Clickers Anônimos)", + }, + }, + j_cry_clockwork = { + name = "Curinga Relojoeiro", + text = { + "Reativa cartas de Aço em mãos para cada {C:attention}#9#{} {C:inactive}(#1#){} mãos", + "Este Curinga ganha {X:mult,C:white}X#6#{} Mult {C:inactive}(X#5#){} para cada {C:attention}#10#{} {C:inactive}(#2#){} mãos", + "Transforma a primeira Carta de Aço a cada {C:attention}#11#{} {C:inactive}(#3#){} mãos", + "Cartas de Aço dão +{X:mult,C:white}X#8#{} Mult {C:inactive}(X#7#){} para cada {C:attention}#12#{} {C:inactive}(#4#){} mãos", }, }, j_cry_CodeJoker = { - name = "Code Joker", + name = "Curinga Codigo", text = { - "Create a {C:dark_edition}Negative{}", - "{C:cry_code}Code Card{} when", - "{C:attention}Blind{} is selected", + "Crie uma {C:cry_code}Carta de Código{}", + "{C:dark_edition}Negativo{} quando o", + "{C:attention}Blind{} é selecionado", + }, + unlock = { + "Discover {C:attention}every", + "{C:cry_code}Code Card", + }, + }, + j_cry_CodeJoker_modest = { + name = "Curinga Codigo", + text = { + "Crie uma C:cry_code}Carta de Código{}", + "{C:dark_edition}Negativo{} quando o", + "{C:attention}Blind Chefe{} é selecionado", + }, + unlock = { + "Discover {C:attention}every", + "{C:cry_code}Code Card", }, }, j_cry_coin = { - name = "Crypto Coin", + name = "Criptomoeda", text = { - "Earn between", - "{C:money}$#1#{} and {C:money}$#2#{} for", - "each Joker {C:attention}sold{}", + "Ganhe entre", + "{C:money}$#1#{} e {C:money}$#2#{} para", + "cada Curinga {C:attention}vendido{}", }, }, j_cry_compound_interest = { - name = "Compound Interest", + name = "Juros Compostos", text = { - "Earn {C:money}#1#%{} of total money", - "at end of round,", - "increases by {C:money}#2#%{} per", - "consecutive payout", + "Consiga {C:money}#1#%{} do dinheiro total", + "no fim da rodada,", + "aumenta em {C:money}#2#%{} por", + "pagamento consecutivo", }, }, j_cry_copypaste = { - name = "Copy/Paste", + name = "Copia/Cola", text = { - "When a {C:cry_code}Code{} card is used,", - "{C:green}#1# in #2#{} chance to add a copy", - "to your consumable area", - "{C:inactive}(Must have room)", + "{C:green}#1# em #2#{} de chance para duplicar", + "Cartas de {C:cry_code}Código{} usadas", + "{C:red}Funciona uma vez por rodada{}", + "{C:inactive}(Deve ter espaço)", + }, + }, + j_cry_copypaste_modest = { + name = "Copia/Cola", + text = { + "Duplica Cartas de", + "{C:cry_code}Código{} retiradas", + "{C:inactive}(Deve ter espaço)", + }, + }, + j_cry_copypaste_madness = { + name = "Copia/Cola", + text = { + "{C:green}#1# em #2#{} de chance para duplicar", + "cartas de {C:cry_code}Código{} usadas", + "{C:inactive}(Deve ter espaço)", + }, + }, + j_cry_cotton_candy = { + name = "Algodao Doce", + text = { + "Quando vendido, {C:attention}Curingas{}", + "adjacentes se tornam {C:dark_edition}Negativo{}", }, }, j_cry_crustulum = { name = "Crustulum", text = { - "This Joker gains {C:chips}+#2#{} Chips", - "per {C:attention}reroll{} in the shop", - "{C:green}All rerolls are free{}", - "{C:inactive}(Currently {C:chips}+#1#{C:inactive} chips)", + "Este Curinga ganha {C:chips}+#2#{} Ficha#1#", + "por {C:attention}atualização{} na loja", + "{C:green}TODAS as atualizações são gratis{}", + "{C:inactive}(Atualmente {C:chips}+#1#{C:inactive} Ficha#1#)", }, }, j_cry_cryptidmoment = { - name = "M Chain", + name = "Corrente M", text = { - "Sell this card to", - "add {C:money}$#1#{} of {C:attention}sell value{}", - "to every {C:attention}Joker{} card", + "Venda esta carta para", + "adicionar {C:money}$#1#{} de {C:attention}valor de venda{}", + "para cada carta {C:attention}Curinga{}", }, }, j_cry_cube = { - name = "Cube", + name = "Cubo", text = { - "{C:chips}+#1#{} Chips", + "{C:chips}+#1#{} Ficha#1#", }, }, j_cry_curse_sob = { - name = "Sob", + name = "Chora mais", text = { - "{C:edition,E:1}you cannot{} {C:cry_ascendant,E:1}run...{}", - "{C:edition,E:1}you cannot{} {C:cry_ascendant,E:1}hide...{}", - "{C:dark_edition,E:1}you cannot escape...{}", - "{C:inactive}(Must have room){}", + "{C:edition,E:1}você não pode{} {C:cry_ascendant,E:1}correr...{}", + "{C:edition,E:1}você não pode{} {C:cry_ascendant,E:1}se esconder...{}", + "{C:dark_edition,E:1}voce não pode escapar...{}", + "{C:inactive}(Deve ter espaço){}", + }, + unlock = { + "Obtain an {C:purple}Eternal{}", + "{C:attention}Obelisk", }, }, j_cry_cursor = { name = "Cursor", text = { - "This Joker gains {C:chips}+#2#{} Chips", - "for each card {C:attention}purchased{}", - "{C:inactive}(Currently {C:chips}+#1#{C:inactive} Chips)", + "Este Curinga ganha {C:chips}+#2#{} Ficha#2#", + "para cada carta {C:attention}comprada{}", + "{C:inactive}(Atualmente {C:chips}+#1#{C:inactive} Ficha#1#)", }, }, j_cry_cut = { - name = "Cut", + name = "Cortar", text = { - "This Joker destroys", - "a random {C:cry_code}Code{} card", - "and gains {X:mult,C:white} X#1# {} Mult", - "at the end of the {C:attention}shop{}", - "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + "Este Curinga destrói", + "uma Carta de {C:cry_code}Código{} aleatória", + "e ganha {X:mult,C:white} X#1# {} Mult", + "no fim de cada {C:attention}loja{}", + "{C:inactive}(Atualmente {X:mult,C:white} X#2# {C:inactive} Mult)", }, }, j_cry_delirious = { - name = "Delirious Joker", + name = "Curinga Delirante", text = { - "{C:red}+#1#{} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{C:red}+#1#{} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", + }, + }, + j_cry_digitalhallucinations = { + name = "Alucinacoes Digitais", + text = { + "Quando um {C:attention}Pacote de Reforço{} é aberto,", + "{C:green}#1# em #2#{} de chance para criar", + "uma carta {C:dark_edition}Negativo{} aleatória", + "correspondendo com seu {C:attention}tipo{}", }, }, j_cry_discreet = { - name = "Discreet Joker", + name = "Curinga Discreto", text = { - "{C:chips}+#1#{} Chips if played", - "hand contains", - "a {C:attention}#2#", + "{C:chips}+#1#{} Fichas se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_doodlem = { - name = "Doodle M", + name = "M Rabiscado", text = { - "Create 2 {C:dark_edition}Negative{} {C:attention}consumables{}", - "when {C:attention}Blind{} is selected", - "Create 1 more {C:attention}consumable", - "for each {C:attention}Jolly Joker{}", + "Cria #2# {C:attention}consumíveis{} {C:dark_edition}Negativo{}", + "quando o {C:attention}Blind{} é selecionado", + "Cria #1# {C:attention}consumível a mais", + "para cada {C:attention}Curinga Alegre{}", }, }, - ["j_cry_Double Scale"] = { - name = "Double Scale", + ["j_cry_Double Scale"] = { -- ????????????? + name = "Escala em Dobro", text = { - "Scaling {C:attention}Jokers{}", - "scale {C:attention}quadratically", + "{C:attention}Curingas{} que escalam", + "escalam {C:attention}quadraticamente", "{C:inactive,s:0.8}(ex. +1, +3, +6, +10)", - "{C:inactive,s:0.8}(grows by +1, +2, +3)", + "{C:inactive,s:0.8}(cresce por +1, +2, +3)", + }, + }, + ["j_cry_Double Scale_modest"] = { + name = "Escala em Dobro", + text = { + "{C:attention}Curingas{} que escalam", + "escalam {C:attention}duas vezes{} mais rápido", + '{C:inactive,s:0.8}"não confunda com escala quadrática!"', }, }, j_cry_dropshot = { name = "Dropshot", text = { - "This Joker gains {X:mult,C:white} X#1# {} Mult for", - "each played, {C:attention}nonscoring{} {V:1}#2#{} card,", - "suit changes every round", - "{C:inactive}(Currently {X:mult,C:white} X#3# {C:inactive} Mult)", + "Este Curinga ganha{X:mult,C:white} X#1# {} Mult para", + "cada naipe de carta, {C:attention}não pontuado{} {V:1}#2#{},", + "naipe muda cada rodada", + "{C:inactive}(Atualmente {X:mult,C:white} X#3# {C:inactive} Mult)", + }, + unlock = { + "Play a {C:attention}High Card{}", + "with {C:attention}4{} cards", + "of the {C:attention}same suit", }, }, j_cry_dubious = { - name = "Dubious Joker", + name = "Curinga Duvidoso", text = { - "{C:chips}+#1#{} Chips if played", - "hand contains", - "a {C:attention}#2#", + "{C:chips}+#1#{} Fichas se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_duos = { - name = "The Duos", + name = "A Dupla", text = { - "{X:mult,C:white} X#1# {} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{X:mult,C:white} X#1# {} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", + }, + unlock = { + "Win a run", + "without playing", + "a {E:1,C:attention}Two Pair", }, }, j_cry_duplicare = { name = "Duplicare", text = { - "Every {C:attention}Joker{} gives", - "{X:dark_edition,C:white}^#1#{} Mult", + "Este Curinga ganha {X:mult,C:white} X#2# {} Mult", + "quando um {C:attention}Curinga{} ou", + "carta de jogo é pontuada", + "{C:inactive}(Atualmente {X:mult,C:white} X#1# {C:inactive} Mult)", }, }, j_cry_effarcire = { name = "Effarcire", text = { - "Draw {C:green}full deck{} to hand", - "when {C:attention}Blind{} is selected", - "{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\"", + "Compre {C:green}o baralho inteiro{} para a sua mão", + "quando o {C:attention}Blind{} é selecionado", + '{C:inactive,s:0.8}"Muito bem, tô só aquecendo', + '{C:inactive,s:0.8}ISSO! eu quero MAIS"', }, }, j_cry_energia = { name = "Energia", text = { - "When a {C:attention}Tag{} is acquired,", - "create {C:attention}#1#{} copies of it", - "and {C:attention}increase{} the number of", - "copies by {C:attention}#2#", + "Quando uma {C:attention}Marca{} é adquirida,", + "crie até {C:attention}#1#{} cópia#1# dela", + "e {C:attention}aumente{} o número de", + "cópias em {C:attention}#2#", }, }, j_cry_equilib = { name = "Ace Aequilibrium", text = { - "Jokers appear using the", - "order from the {C:attention}Collection{}", - "Create {C:attention}#1#{} {C:dark_edition}Negative{} Joker(s)", - "when hand is played", - "{C:cry_exotic,s:0.8}Exotic {C:inactive,s:0.8}or better Jokers cannot appear", - "{s:0.8}Last Joker Generated: {C:attention,s:0.8}#2#", + "Curingas aparecem usando", + "a ordem da {C:attention}Coleção{}", + "Crie {C:attention}#1#{} Curinga#1# {C:dark_edition}Negativo{} ", + "quando a mão é jogada", + "{C:inactive,s:0.8}Curingas {C:cry_exotic,s:0.8}Exóticos {C:inactive,s:0.8}ou melhores não podem aparecer", + "{s:0.8}Último Curinga Gerado: {C:attention,s:0.8}#2#", }, }, j_cry_error = { - name = "{C:red}ERR{}{C:dark_edition}O{}{C:red}R{}", + name = "{C:red}ER{}{C:dark_edition}R{}{C:red}O{}", text = { "", }, }, j_cry_eternalflame = { - name = "Eternal Flame", + name = "Fogo Eterno", text = { - "This Joker gains {X:mult,C:white} X#1# {} Mult", - "for each card {C:attention}sold{}", - "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + "Este Curinga ganha {X:mult,C:white} X#1# {} Mult", + "para cada carta {C:attention}vendida{} com", + "pelo menos {C:money}$3{} de {C:attention}valor de venda", + "{C:inactive}(Atualmente {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_cry_eternalflame2 = { + name = "Fogo Eterno", + text = { + "Esse Curinga ganha {X:mult,C:white} X#1# {} Mult", + "para cada carta {C:attention}vendida{}", + "{C:inactive}(Atualmente {X:mult,C:white} X#2# {C:inactive} Mult)", }, }, j_cry_exoplanet = { - name = "Exoplanet", + name = "Exoplaneta", text = { - "{C:dark_edition}Holographic{} cards", - "each give {C:mult}+#1#{} Mult", + "Outras cartas {C:dark_edition}Holográficas{}", + "dão {C:mult}+#1#{} Mult cada", }, }, j_cry_exponentia = { name = "Exponentia", text = { - "This Joker gains {X:dark_edition,C:white} ^#1# {} Mult", - "when {X:red,C:white} XMult {} is triggered", - "{C:inactive}(Currently {X:dark_edition,C:white} ^#2# {C:inactive} Mult)", + "Esse Curinga ganha {X:dark_edition,C:white} ^#1# {} Mult", + "quando {X:red,C:white} XMult {} é ativado", + "{C:inactive}(Ativado {X:dark_edition,C:white} ^#2# {C:inactive} Mult)", + }, + }, + j_cry_exposed = { + name = "Exposto", + text = { + "Reative todas as cartas que não são cartas de {C:attention}Realeza{}", + "{C:attention}#1#{} vezes#1# adicionais", + "Todas as cartas de {C:attention}Realeza{} são desativadas", + }, + }, + j_cry_eyeofhagane = { + name = "Olho de Hagane", + text = { + "Todas as cartas de {C:attention}realeza{} se tornam cartas de {C:attention}Aço{}", }, }, j_cry_facile = { name = "Facile", text = { - "{X:dark_edition,C:white}^#1#{} Mult if", - "played cards are scored", - "{C:attention}#2#{} or fewer times", + "{X:dark_edition,C:white}^#1#{} Mult se", + "as cartas de jogo são pontuadas", + "{C:attention}#2#{} ou menos vezes", }, }, j_cry_filler = { - name = "The Filler", + name = "O Tapa Buraco", text = { - "{X:mult,C:white} X#1# {} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{X:mult,C:white} X#1# {} Mult se a mão", + "jogada contem", + "um {C:attention}#2#", + }, + unlock = { + "Win a run", + "without playing", + "a {E:1,C:attention}High Card", }, }, j_cry_fractal = { - name = "Fractal Fingers", + name = "Dedos Fractais", text = { - "{C:attention}+#1#{} card selection limit", + "{C:attention}+#1#{} limite de seleção de cartas", + }, + unlock = { + "Play a {C:attention}Straight Flush{}", + "without the {C:attention}Straight", + "being a {C:attention}Flush", }, }, j_cry_flip_side = { - name = "On the Flip Side", + name = "Do Outro Lado", text = { - "{C:dark_edition}Double-Sided{} Jokers use", - "their back side for effects", - "instead of the front side", - "{C:attention}Retrigger{} all {C:dark_edition}Double-Sided{} Jokers", + "Curingas {C:dark_edition}Duas Caras{} usam", + "usam a sua parte de trás para efeitos", + "em vês da parte da frente", + "{C:attention}Reativa{} todos os Curingas {C:dark_edition}Duas Caras{}", }, }, j_cry_foodm = { - name = "Fast Food M", + name = "M Fast Food", text = { "{C:mult}+#1#{} Mult", - "{C:red,E:2}self destructs{} in {C:attention}#2#{} round(s)", - "Increases by {C:attention}#3#{} round when", - "{C:attention}Jolly Joker{} is {C:attention}sold{}", + "{C:red,E:2}se autodestrói{} em {C:attention}#2#{} rodada#2#", + "Aumenta em {C:attention}#3#{} rodadas quando", + "um {C:attention}Curinga Alegre{} é {C:attention}vendido{}", "{C:inactive,s:0.8}2 McDoubles, 2 McChickens{}", - "{C:inactive,s:0.8}Large Fries, 20 Piece & Large Cake{}", + "{C:inactive,s:0.8}Fritas Largas, 20 Pedaços & Bolos Largos{}", + }, + }, + j_cry_foolhardy = { + name = "Curinga Imprudente", + text = { + "{C:red}+#1#{} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", + }, + }, + j_cry_formidiulosus = { + name = "Formidiulosus", + text = { + "Quando um Curinga {X:cry_cursed,C:white}Amaldiçoado{} é obtido, destrua ele", + "Cria um {C:attention}#1#{} {C:cry_candy}Doce#1#{} {C:dark_edition}Negativo no fim da loja", + "Gains {X:dark_edition,C:white}^#2#{} Mult para cada {C:cry_candy}Doce{} em posse", + "{C:inactive}(Atualmente {X:dark_edition,C:white}^#3#{C:inactive} Mult)", }, }, j_cry_foxy = { - name = "Foxy Joker", + name = "Curinga Raposa", text = { - "{C:chips}+#1#{} Chips if played", - "hand contains", - "a {C:attention}#2#", + "{C:chips}+#1#{} Ficha#1# se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_fspinner = { name = "Fidget Spinner", text = { - "This Joker gains {C:chips}+#2#{} Chips", - "if hand played is {C:attention}not{}", - "most played {C:attention}poker hand{}", - "{C:inactive}(Currently {C:chips}+#1#{C:inactive} Chips)", + "Este Curinga ganha {C:chips}+#2#{} Ficha#2#", + "se a mão jogada {C:attention}não{}", + "é a {C:attention}mão de poker{} mais jogada", + "{C:inactive}(Atualmente {C:chips}+#1#{C:inactive} Ficha#1#)", + }, + }, + j_cry_fuckedup = { + name = Cryptid_config.family_mode and "Curinga arrumado" or "Curinga Todo Fudido", + text = { + "{C:red}+#1#{} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_gardenfork = { - name = "Garden of Forking Paths", + name = "Jardim dos Caminhos Bifurcados", text = { - "Earn {C:money}$#1#{} if {C:attention}played hand{}", - "contains an {C:attention}Ace{} and a {C:attention}7{}", + "Ganha {C:money}$#1#{} se a {C:attention}mão jogada{}", + "conter um {C:attention}Ás{} e um {C:attention}7{}", }, }, j_cry_gemino = { name = "Gemini", text = { - "{C:attention}Double{} all values", - "of leftmost {C:attention}Joker", - "at end of round", + "{C:attention}Dobra{} todos os valores", + "do {C:attention}Curinga mais a esquerda", + "no fim da rodada", + }, + }, + j_cry_ghost = { + name = "Fantasma", + text = { + "No fim da rodada:", + "{C:green}#1# em #2#{} de chance para", + "{C:attention}possuir{} um {C:attention}Curinga aleatório", + "{C:green}#1# em #3#{} de chance para", + "{E:2,C:red}se autodestruir", }, }, j_cry_giggly = { - name = "Absurd Joker", + name = "Curinga Absurdo", text = { - "{C:red}+#1#{} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{C:red}+#1#{} Mult se a mão", + "jogada contém", + "um {C:attention}#2#", }, }, j_cry_goldjoker = { - name = "Gold Joker", + name = "Coringa de Ouro", text = { - "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", + "Ganhe {C:money}#1#%{} do total", + "de dinheiro no final da rodada", + "pagamento aumenta em {C:money}#2#%{}", + "quando cada carta de {C:attention}Ouro{}", + "é pontuada", }, }, j_cry_googol_play = { - name = "Googol Play Card", + name = "Carta do gugol play", text = { - "{C:green}#1# in #2#{} chance for", + "{C:green}#1# em #2#{} de chance para", "{X:red,C:white} X#3# {} Mult", }, + unlock = { + "Score {C:attention}1.0e100{} Chips", + "in a single hand", + }, }, j_cry_happy = { name = ":D", text = { - "Create a random {C:attention}Joker{}", - "at end of round", - "Sell this card to", - "create a random {C:attention}Joker{}", - "{C:inactive}(Must have room){}", + "Crie um {C:attention}Curinga{} aleatório", + "no fim da rodada", + "Venda esta carta para", + "criar um {C:attention}Curinga{} aleatório", + "{C:inactive}(Deve ter espaço){}", }, }, j_cry_happyhouse = { - name = "Happy House", + name = "Casinha Feliz", text = { - "{X:dark_edition,C:white}^#1#{} Mult only after", - "playing {C:attention}114{} hands{}", - "{C:inactive}(Currently #2#/114){}", - "{C:inactive,s:0.8}There is no place like home!{}", + "{X:dark_edition,C:white}^#1#{} Mult apenas depois", + "de jogar {C:attention}114{} mãos{}", + "{C:inactive}(Atualmente #2#/114){}", + "{C:inactive,s:0.8}Não há lugar como o nosso lar!{}", }, }, j_cry_home = { - name = "The Home", + name = "A Casa", text = { - "{X:mult,C:white} X#1# {} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{X:mult,C:white} X#1# {} Mult se a mão", + "jogada contém", + "um {C:attention}#2#", + }, + unlock = { + "Win a run", + "without playing", + "a {E:1,C:attention}Full House", }, }, j_cry_hunger = { - name = "Consume-able", + name = "Consu-mivel", text = { - "Earn {C:money}$#1#{} when", - "using a {C:attention}consumable{}", + "Ganhe {C:money}$#1#{} quando", + "se usa um {C:attention}consumível{}", + }, + }, + j_cry_huntingseason = { + name = "Temporada de Pato", + text = { + "Se a mão jogada contém exatamente {C:attention}3{} cartas,", + "{C:red}destrua{} a carta do {C:attention}centro{} depois de pontuar", }, }, j_cry_iterum = { name = "Iterum", text = { - "Retrigger all cards played", - "{C:attention}#2#{} time(s),", - "each played card gives", - "{X:mult,C:white} X#1# {} Mult when scored", + "Reative todas as cartas jogadas", + "{C:attention}#2#{} vez#2#,", + "cada carta da", + "{X:mult,C:white} X#1# {} Mult quando pontuada", + }, + }, + j_cry_jawbreaker = { + name = "Quebra-Mandibula", + text = { + "Quando o {C:attention}Blind Chefe{} é derrotado,", + "{C:attention}dobra{} os valores dos curingas adjacentes", + "{E:2,C:red}self destructs{}", }, }, j_cry_jimball = { - name = "Jimball", + name = "Jimbola", text = { - "This Joker gains {X:mult,C:white} X#1# {} Mult", - "per {C:attention}consecutive{} hand played", - "while playing your", - "most played {C:attention}poker hand", + "Este Curinga ganha {X:mult,C:white} X#1# {} Mult", + "por mão {C:attention}consecutiva{} jogada", + "enquanto você estiver", + "jogando a sua {C:attention}mão de poker{} mais jogada", "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", }, + unlock = { + "Win a run", + "while playing a", + " {C:attention}single type of{}", + "{C:attention}poker hand", + }, }, j_cry_jollysus = { - name = "Jolly Joker?", + name = "Curinga alegre?", text = { - "Create a {C:dark_edition}Jolly{} Joker", - "when a Joker is {C:attention}sold{}", - "{C:red}Works once per round{}", + "Crie um Curinga {C:dark_edition}Alegre{}", + "quando um curinga é {C:attention}vendido{}", + "{C:red}Funciona uma vez por rodada{}", "{C:inactive}#1#{}", - "{C:inactive,s:0.8}Seems legit...{}", + "{C:inactive,s:0.8}Parece Verdadeiro...{}", + }, + }, + j_cry_jtron = { + name = "Jimbo-tron 9000", + text = { + "Este Curinga ganha {X:dark_edition,C:white} ^#1# {} Mult", + "para cada {C:attention}Curinga{} padrão", + "{C:inactive}(Atualmente {X:dark_edition,C:white}^#2#{C:inactive} Mult)", }, }, j_cry_kidnap = { - name = "Kidnapping", + name = "Sequestro", text = { - "Earn {C:money}$#2#{} at end of round", - "Increase payout by {C:money}$#1#{}", - "when a {C:attention}Type Mult{} or", - "{C:attention}Type Chips{} Joker is sold", + "Ganhe {C:money}$#2#{} ao fim da rodada", + "Aumenta o pagamento em {C:money}$#1#{}", + "quando um Coringa do {C:attention}Tipo Mult{} ou", + "{C:attention}Tipo Fichas{} é vendido", + }, + }, + j_cry_kittyprinter = { + name = "Impressora de Gatinhos", + text = { + "{X:mult,C:white} X#1# {} Mult", + "TODAS as marcas {C:attention}ignoradas{}", + "te tornam {C:attention}Marcas Gato{}", }, }, j_cry_kooky = { - name = "Kooky Joker", + name = "Curinga Excentrico", text = { - "{C:red}+#1#{} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{C:red}+#1#{} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_krustytheclown = { - name = "Krusty the Clown", + name = "Crusty o Palhaco", text = { - "This Joker gains", - "{X:mult,C:white} X#1# {} Mult when", - "each played {C:attention}card{} is scored", - "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + "Este Curinga ganha", + "{X:mult,C:white} X#1# {} Mult quando", + "cada {C:attention}card{} jogada é pontuada", + "{C:inactive}(Atualmente {X:mult,C:white} X#2# {C:inactive} Mult)", }, }, j_cry_kscope = { - name = "Kaleidoscope", + name = "Caleidoscopio", text = { - "Add {C:dark_edition}Polychrome{} to", - "a random {C:attention}Joker{} when", - "{C:attention}Boss Blind{} is defeated", + "Adiciona {C:dark_edition}Policromático{} para", + "um {C:attention}Curinga{} aleatório quando", + "o {C:attention}Chefe Blind{} é derrotado", + }, + unlock = { + "Defeat a {C:attention}Boss Blind", + "with {C:attention}5{} or more", + "{C:attention}Editioned Cards{} or", + "{C:attention}Jokers", + }, + }, + j_cry_lebaron_james = { + name = "LeBarao James", + text = { + "Cartas {C:attention}Reis{} Jogadas e pontuadas dão", + "{C:attention}+#1#{} de tamanho de mão para a rodada", + "e ativa os efeitos {C:attention}contidos na mão{}", }, }, j_cry_lightupthenight = { - name = "Light Up the Night", + name = "Ilumine a noite", text = { - "Each played {C:attention}7{} or {C:attention}2{}", - "gives {X:mult,C:white}X#1#{} Mult when scored", + "Cada {C:attention}7{} ou {C:attention}2{} jogado", + "da {X:mult,C:white}X#1#{} Mult quando pontuado", }, }, j_cry_longboi = { - name = "Monster", + name = "Monstro", text = { - "Give future copies of", - "this Joker {X:mult,C:white}X#1#{} Mult", - "at end of round", - "{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult){}", + "Da as futuras cópias", + "deste Curinga {X:mult,C:white}X#1#{} Mult", + "no fim da rodada", + "{C:inactive}(Atualmente {X:mult,C:white}X#2#{C:inactive} Mult){}", }, }, j_cry_loopy = { - name = "Loopy", + name = "Maluco", text = { - "{C:attention}Retrigger{} all Jokers", - "once for each {C:attention}Jolly{}", - "{C:attention}Joker{} sold this round", - "{C:inactive}(Currently{}{C:attention:} #1#{}{C:inactive} Retrigger(s)){}", - "{C:inactive,s:0.8}There wasn't enough room...{}", + "{C:attention}Reativa{} todos os Curingas", + "uma vez para cada {C:attention}Curinga Alegre", + "vendido nesta rodada", + "{C:inactive}(Atualmente{}{C:attention:} #1#{}{C:inactive} reativamentos#<>1#){}", + "{C:inactive,s:0.8}Não tinha espaço o suficiente...{}", }, }, j_cry_lucky_joker = { - name = "Lucky Joker", + name = "Curinga Sortudo", text = { - "Earn {C:money}$#1#{} every time a", - "{C:attention}Lucky{} card {C:green}successfully{}", - "triggers", + "Ganhe {C:money}$#1#{} cada vez que uma", + "carta da {C:attention}Sorte{} ativa {C:green}com sucesso", + "", }, }, j_cry_luigi = { name = "Luigi", text = { - "All Jokers give", - "{X:chips,C:white} X#1# {} Chips", + "Todos os curingas dão", + "{X:chips,C:white} X#1# {} Fichas", }, }, j_cry_m = { name = "m", text = { - "This Joker gains {X:mult,C:white} X#1# {} Mult", - "when {C:attention}Jolly Joker{} is sold", - "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + "Este Curinga ganha {X:mult,C:white} X#1# {} Mult", + "quando um {C:attention}Curinga Alegre{} é vendido", + "{C:inactive}(Atualmente {X:mult,C:white} X#2# {C:inactive} Mult)", }, }, j_cry_M = { name = "M", text = { - "Create a {C:dark_edition}Negative{}", - "{C:attention}Jolly Joker{} when", - "{C:attention}Blind{} is selected", + "Crie um {C:attention}Curinga Alegre{}", + "{C:dark_edition}Negativo{} quando", + "o {C:attention}Blind{} é selecionado", }, }, j_cry_macabre = { - name = "Macabre Joker", + name = "Curinga Macabro", text = { - "When {C:attention}Blind{} is selected,", - "destroys each {C:attention}Joker{} except", - "{C:legendary}M Jokers{} and {C:attention}Jolly Jokers{}", - "and create 1 {C:attention}Jolly Joker{}", - "for each destroyed card", + "Quando o {C:attention}Blind{} é selecionado,", + "destrua cada {C:attention}Curinga{} exceto", + "{C:legendary}Curingas M{} e {C:attention}Curingas Alegres{}", + "e crie #1# {C:attention}Curingas#1#{} Alegre#1#{}", + "para cada carta destruída", }, }, j_cry_magnet = { - name = "Fridge Magnet", + name = "Ima de Geladeira", text = { - "Earn {C:money}$#1#{} at end of round", - "This earns {X:money,C:white} X#2# {} if there are", - "{C:attention}#3#{} or fewer {C:attention}Joker{} cards", + "Ganhe {C:money}$#1#{} no final da rodada", + "Isso ganha {X:money,C:white} X#2# {} se tiver", + "{C:attention}#3#{} ou menos cartas {C:attention}Curingas{}", }, }, j_cry_manic = { - name = "Manic Joker", + name = "Curinga Maniaco", text = { - "{C:red}+#1#{} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{C:red}+#1#{} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_mario = { name = "Mario", text = { - "Retrigger all Jokers", - "{C:attention}#1#{} additional time(s)", + "Reative todos os Curingas", + "{C:attention}#1#{} vez#1# adicionais", + }, + }, + j_cry_mask = { + name = "Mascara", + text = { + "Reativa todas as cartas de {C:attention}realeza{} pontuadas", + "{C:attention}#1#{} vez#1# adicionais", + "Todas as cartas que não são de {C:attention}realeza{} são desativadas", }, }, j_cry_maximized = { - name = "Maximized", + name = "Maximizado", text = { - "All {C:attention}face{} cards", - "are considered {C:attention}Kings{},", - "all {C:attention}numbered{} cards", - "are considered {C:attention}10s{}", + "Todas as cartas de {C:attention}realeza{}", + "são consideradas {C:attention}Reis{},", + "todas as cartas {C:attention}numeradas{}", + "são consideradas {C:attention}10s{}", + }, + unlock = { + "Play a {C:attention}Flush Five{}", + "of {C:attention}Kings", }, }, j_cry_maze = { - name = "Labyrinth", + name = "Labirinto", text = { - "All hands are considered the", - "{C:attention}first hand{} of each round,", - "all discards are considered the", - "{C:attention}first discard{} of each round", + "Todas as mão são consideradas a", + "{C:attention}primeira mão{} de cada rodada,", + "todos os descartes são considerados o", + "{C:attention}primeiro descarte{} de cada rodada", }, }, j_cry_Megg = { - name = "Megg", + name = "Movo", text = { - "Sell this card to create", - "{C:attention}#2#{} Jolly #3#, increase", - "by {C:attention}#1#{} at end of round", + "Venda esta carta para criar", + "{C:attention}#2#{} Curinga Alegre #3#, aumente", -- huh + "em {C:attention}#1#{} no final da rodada", + }, + }, + j_cry_mellowcreme = { + name = "Gelatina", + text = { + "Venda esta carta para {C:attention}multiplicar", + "o valor de venda de todos os", + "{C:attention}consumíveis{} em {C:attention}X#1#", }, }, j_cry_membershipcard = { - name = "Membership Card", + name = "Cartao de Socio", text = { - "{X:mult,C:white}X#1#{} Mult for each member", - "in the {C:attention}Cryptid Discord{}", - "{C:inactive}(Currently {X:mult,C:white}X#2#{C:inactive} Mult)", + "{X:mult,C:white}X#1#{} Mult para cada membro", + "no {C:attention}Cryptid Discord{}", + "{C:inactive}(Atualmente {X:mult,C:white}X#2#{C:inactive} Mult)", "{C:blue,s:0.7}https://discord.gg/cryptid{}", }, }, j_cry_membershipcardtwo = { - name = "Old Membership Card", --Could probably have a diff Name imo + name = "Convite Para Socios", --Could probably have a diff Name imo text = { - "{C:chips}+#1#{} Chips for each member", - "in the {C:attention}Cryptid Discord{}", - "{C:inactive}(Currently {C:chips}+#2#{C:inactive} Chips)", + "{C:chips}+#1#{} Fichas#1# para cada menbro", + "no {C:attention}Cryptid Discord{}", + "{C:inactive}(Atualmente {C:chips}+#2#{C:inactive} Ficha#2#)", + "{C:blue,s:0.7}https://discord.gg/cryptid{}", + }, + }, + j_cry_membershipcardtwo_balanced = { + name = "Convite Para Socios", --Could probably have a diff Name imo + text = { + "{C:chips}+#1#{} Ficha#1# para cada {C:attention}8{} membros", + "no {C:attention}Cryptid Discord{}", + "{C:inactive}(Atualmente {C:chips}+#2#{C:inactive} Ficha#2#)", "{C:blue,s:0.7}https://discord.gg/cryptid{}", }, }, j_cry_meteor = { - name = "Meteor Shower", + name = "Chuva de Meteoros", text = { - "{C:dark_edition}Foil{} cards each", - "give {C:chips}+#1#{} Chips", + "Outras cartas {C:dark_edition}Laminado{} dão", + "{C:chips}+#1#{} Ficha#1# cada", }, }, j_cry_mneon = { - name = "Neon M", + name = "M Neon", text = { - "Earn {C:money}$#2#{} at end of round", - "Increase payout by", - "{C:money}$#1#{} for each {C:attention}Jolly Joker{}", - "or {C:legendary}M Joker{} at", - "end of round", + "Ganha {C:money}$#2#{} no fim da rodada", + "Aumenta o pagamento em", + "{C:money}$#1#{} para cada Curinga {C:attention}Alegre{}", + "ou {C:legendary}Curinga M{} no", + "fim da rodada", }, }, j_cry_mondrian = { name = "Mondrian", text = { - "This Joker gains {X:mult,C:white} X#1# {} Mult", - "if no {C:attention}discards{} were", - "used this round", - "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + "Este Curinga ganha {X:mult,C:white} X#1# {} Mult", + "se nenhum {C:attention}descarte{} foi", + "usado nesta rodada", + "{C:inactive}(Atualmente {X:mult,C:white} X#2# {C:inactive} Mult)", }, }, j_cry_monkey_dagger = { - name = "Monkey Dagger", + name = "Adaga Macaco", text = { - "When {C:attention}Blind{} is selected,", - "destroy Joker to the left", - "and permanently add {C:attention}ten times{}", - "its sell value to this {C:chips}Chips{}", - "{C:inactive}(Currently {C:chips}+#1#{C:inactive} Chips)", + "Quando o {C:attention}Blind{} é selecionado,", + "destrua o Curinga da esquerda", + "e permanentemente adiciona {C:attention}dez vezes{}", + "o seu valor de venda em {C:chips}Fichas{}", + "{C:inactive}(Atualmente {C:chips}+#1#{C:inactive} Ficha#1#)", + }, + }, + j_cry_monopoly_money = { + name = "Dinheiro do Monopoly", + text = { + "{C:green}#1# em #2#{} de chance para", + "{C:attention}destruir{} o item comprado", + "Divide em 2 o dinheiro quando {C:attention}vendido", }, }, j_cry_morse = { - name = "Morse Code", + name = "Codigo Morse", text = { - "Earn {C:money}$#2#{} at end of round", - "Increase payout by {C:money}$#1#{} when", - "a card with an {C:attention}Edition{} is sold", + "Ganhe {C:money}$#2#{} no final da rodada", + "Aumenta o pagamento em {C:money}$#1#{} quando", + "uma carta com {C:attention}Edição{} é vendida", }, }, j_cry_mprime = { name = "Tredecim", text = { - "Create an {C:legendary}M Joker{} at end of round", - "Each {C:attention}Jolly Joker{} or {C:legendary}M Joker", - "gives {X:dark_edition,C:white}^#1#{} Mult", - "Increase amount by {X:dark_edition,C:white}^#2#{}", - "when a {C:attention}Jolly Joker{} is {C:attention}sold", - "{C:inactive,s:0.8}(Tredecim excluded)", + "Cria um {C:legendary}Curinga M{} no final da rodada", + "Cada {C:attention}Curinga Alegre{} ou {C:legendary}Curinga M", + "da {X:dark_edition,C:white}^#1#{} Mult", + "Aumenta a quantidade em {X:dark_edition,C:white}^#2#{}", + "quando um {C:attention}Curinga Alegre{} é {C:attention}vendido", + "{C:inactive,s:0.8}(Tredecim excluído)", }, }, j_cry_mstack = { - name = "M Stack", + name = "Monte M", text = { - "Retrigger all cards played", - "once for every", - "{C:attention}#2#{} {C:inactive}[#3#]{} {C:attention}Jolly Jokers{} sold", - "{C:inactive}(Currently{}{C:attention:} #1#{}{C:inactive} retriggers){}", + "Reative todas as cartas jogadas", + "uma vez para cada", + "{C:attention}#2#{} {C:inactive}[#3#]{} {C:attention}Curinga#2#{} Alegre#2#{} vendido", + "{C:inactive}(Atualmente{}{C:attention:} #1#{}{C:inactive} reativamentos){}", }, }, j_cry_multjoker = { - name = "Mult Joker", + name = "Curinga Mult", text = { - "{C:green}#1# in #2#{} chance for each", - "played {C:attention}Mult{} card to create", - "a {C:spectral}Cryptid{} card when scored", - "{C:inactive}(Must have room)", + "{C:green}#1# em #2#{} de chance para cada", + "carta {C:attention}Mult{} jogada para criar", + "uma carta {C:spectral}Cryptid{} quando pontuada", + "{C:inactive}(Deve ter espaço)", + }, + }, + j_cry_necromancer = { + name = "Necromante", + text = { + "Quando um Curinga é {C:attention}vendido{} por mais que {C:attention}$0{},", + "ganhe um Curinga {C:attention}aleatório{} já {C:attention}vendido{} nesta partida", + "com {C:money}$0{} valor de venda", }, }, j_cry_negative = { - name = "Negative Joker", + name = "Curinga Negativo", text = { - "{C:dark_edition}+#1#{C:attention} Joker{} slots", + "{C:dark_edition}+#1#{C:attention} {}espaço#1# de Curinga", }, }, j_cry_nice = { - name = "Nice", + name = "Legal", text = { - "{C:chips}+#1#{} Chips if played hand", - "contains a {C:attention}6{} and a {C:attention}9", - "{C:inactive,s:0.8}Nice.{}", + "{C:chips}+#1#{} Ficha#1# se a mão jogada", + "conter um {C:attention}6{} e um {C:attention}9", + "{C:inactive,s:0.8}Legal.{}", }, }, j_cry_night = { - name = "Night", + name = "Noite", text = { - "{X:dark_edition,C:white}^#1#{} Mult on final", - "hand of round", - "{E:2,C:red}self destructs{} on", - "final hand of round", + "{X:dark_edition,C:white}^#1#{} Mult na mão", + "final da rodada", + "{E:2,C:red}se autodestrói{} na", + "mão final da rodada", }, }, j_cry_nosound = { - name = "No Sound, No Memory", + name = "Sem Som, Sem Memoria", text = { - "Retrigger each played {C:attention}7{}", - "{C:attention:}#1#{} additional time(s)", + "Reative cada {C:attention}7{} jogado", + "{C:attention:}#1#{} veze#1# adicionais", }, }, j_cry_notebook = { - name = "Notebook", + name = "O Maderno", text = { - "{C:green} #1# in #2#{} chance to gain {C:dark_edition}+1{} Joker", - "slot per {C:attention}reroll{} in the shop", - "{C:green}Always triggers{} if there are", - "{C:attention}#5#{} or more {C:attention}Jolly Jokers{}", - "{C:red}Works once per round{}", - "{C:inactive}(Currently {C:dark_edition}+#3#{}{C:inactive} and #4#){}", + "{C:green} #1# em #2#{} de chance de ganha {C:dark_edition}+#6#{} espaço#6# ", + "de Curinga por {C:attention}atualização{} na loja", + "{C:green}Sempre ativa{} se tiver", + "{C:attention}#5#{} ou mais {C:attention}Curingas Alegres{}", + "{C:red}Funciona uma vez por rodada{}", + "{C:inactive}(Atualmente {C:dark_edition}+#3#{}{C:inactive} e #4#){}", }, }, j_cry_number_blocks = { - name = "Number Blocks", + name = "Blocos Empilhados", text = { - "Earn {C:money}$#1#{} at end of round", - "Increase payout by {C:money}$#2#{}", - "for each {C:attention}#3#{} held in hand,", - "rank changes every round", + "Ganhe {C:money}$#1#{} no final da rodada", + "Aumenta o pagamento em {C:money}$#2#{}", + "para cada {C:attention}#3#{} em mãos,", + "classe muda a cada rodada", }, }, j_cry_nuts = { - name = "The Nuts", + name = "As Nozes", text = { - "{X:mult,C:white} X#1# {} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{X:mult,C:white} X#1# {} Mult se a mão", + "jogada contém", + "um {C:attention}#2#", + }, + unlock = { + "Win a run", + "without playing", + "a {E:1,C:attention}Straight Flush", }, }, j_cry_nutty = { - name = "Nutty Joker", + name = "Curinga Maluco", text = { - "{C:red}+#1#{} Mult if played", - "hand contains", + "{C:red}+#1#{} Mult se a mão", + "jogada contém", "a {C:attention}#2#", }, }, - j_cry_oldblueprint = { - name = "Old Blueprint", + j_cry_oil_lamp = { + name = "Lamparina a oleo", text = { - "Copies ability of", - "{C:attention}Joker{} to the right", - "{C:green}#1# in #2#{} chance this", - "card is destroyed", - "at end of round", + "Aumenta os valores do {C:attention}Curinga{} da direita", + "em {C:attention}X#1#{} no final da rodada", + }, + }, + j_cry_oldblueprint = { + name = "Projeto Antigo", + text = { + "Copia a habilidade do", + "{C:attention}Curinga{} da direita", + "{C:green}#1# em #2#{} de chance dessa", + "carta ser destruida", + "em fim da rodada", }, }, j_cry_oldcandy = { - name = "Nostalgic Candy", + name = "Doce Nostalgico", text = { - "Sell this card to", - "permanently gain", - "{C:attention}+#1#{} hand size", + "Venda esta carta para", + "permanentemente ganhar", + "{C:attention}+#1#{} tamanho de mão", }, }, j_cry_oldinvisible = { - name = "Nostalgic Invisible Joker", + name = "Curinga Invisivel Nostálgico", text = { - "{C:attention}Duplicate{} a random", - "{C:attention}Joker{} every {C:attention}4", - "Joker cards sold", - "{s:0.8}Nostalgic Invisible Joker Excluded{}", - "{C:inactive}(Currently #1#/4){}", + "{C:attention}Duplique{} um {C:attention}Curinga{}", + " aleatoriamente a cada {C:attention}4", + "Curingas vendidos", + "{s:0.8}Curinga Invisível Nostálgico Excluído{}", + "{C:inactive}(Atualmente #1#/4){}", }, }, j_cry_panopticon = { - name = "Panopticon", + name = "Panoptico", text = { - "All hands are considered the", - "{C:attention}last hand{} of each round", -- +$4 + "Todas as mão são consideradas a", + "{C:attention}última mão{} de cada rodada", -- +$4 + }, + }, + j_cry_penetrating = { + name = "Curinga Penetrante", + text = { + "{C:chips}+#1#{} Fichas se a mão", + "jogada contém", + "um {C:attention}#2#", }, }, j_cry_pickle = { - name = "Pickle", + name = "Picles", text = { - "When {C:attention}Blind{} is skipped, create", - "{C:attention}#1#{} Tags, reduced by", - "{C:red}#2#{} when {C:attention}Blind{} is selected", + "Quando o {C:attention}Blind{} é ignorado, crie", + "{C:attention}#1#{} Marca, reduz em", + "{C:red}#2#{} quando o {C:attention}Blind{} é selecionado", }, }, j_cry_pirate_dagger = { - name = "Pirate Dagger", + name = "Adaga Pirata", text = { - "When {C:attention}Blind{} is selected,", - "destroy Joker to the right", - "and gain {C:attention}one-fourth{} of", - "its sell value as {X:chips,C:white} XChips {}", - "{C:inactive}(Currently {X:chips,C:white} X#1# {C:inactive} Chips)", + "Quando o {C:attention}Blind{} é selecionado,", + "destrua o Curinga da direita", + "e ganhe {C:attention}um quarto{} de", + "seu valor de venda como {X:chips,C:white} XFichas {}", + "{C:inactive}(Atualmente {X:chips,C:white} X#1# {C:inactive} Fichas)", + }, + }, + j_cry_pity_prize = { + name = "Premio de pena", + text = { + "Quando um {C:attention}Pacote de Reforço{} é ignorado,", + "ganhe uma {C:attention}Marca{} aleatória", }, }, j_cry_pot_of_jokes = { - name = "Pot of Jokes", + name = "Pote de Piadas", text = { - "{C:attention}#1#{} hand size,", - "increases by", - "{C:blue}#2#{} every round", + "{C:attention}#1#{} tamanho de mão,", + "aumenta em", + "{C:blue}#2#{} a cada rodada", + }, + unlock = { + "Increase your {C:attention}handsize", + "to {C:attention}12", }, }, j_cry_primus = { name = "Primus", text = { - "This Joker gains {X:dark_edition,C:white} ^#1# {} Mult", - "if all cards in played hand are", - "{C:attention}Aces{}, {C:attention}2s{}, {C:attention}3s{}, {C:attention}5s{}, or {C:attention}7s{}", - "{C:inactive}(Currently {X:dark_edition,C:white} ^#2# {C:inactive} Mult)", + "Este Curinga ganha {X:dark_edition,C:white} ^#1# {} Mult", + "se todas as cartas na mão jogada são", + "{C:attention}Ás{}, {C:attention}2s{}, {C:attention}3s{}, {C:attention}5s{}, ou {C:attention}7s{}", + "{C:inactive}(Atualmente {X:dark_edition,C:white} ^#2# {C:inactive} Mult)", + }, + }, + j_cry_pumpkin = { + name = "Abobora", + text = { + "Previne a Morte se as fichas pontuadas", + "são pelo menos {C:attention}50%{} das fichas necessárias", + "{C:attention}Se torna em Abóbora Esculpida", + "{C:attention}quando{} {C:red}destruída", + }, + }, + j_cry_carved_pumpkin = { + name = "Abobora Esculpida", + text = { + "Os Próximos {C:attention}#1#{} Blinds Chefes", + "terão suas habilidades", + "{C:attention}desabilitadas", }, }, j_cry_python = { name = "Python", text = { - "This Joker gains", - "{X:mult,C:white} X#1# {} Mult when a", - "{C:cry_code}Code{} card is used", - "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + "Este Curinga ganha", + "{X:mult,C:white} X#1# {} Mult quando uma", + "carta de {C:cry_code}Código{} é usada", + "{C:inactive}(Atualmente {X:mult,C:white} X#2# {C:inactive} Mult)", }, }, j_cry_queens_gambit = { - name = "Queen's Gambit", + name = "Gambito da Rainha", text = { - "If {C:attention}poker hand{} is a", - "{C:attention}Royal Flush{}, destroy scored", - "{C:attention}Queen{} and create a", - "{C:dark_edition}Negative {}{C:red}Rare{}{C:attention} Joker{}", + "Se a {C:attention}mão de poker{} é um", + "{C:attention}Royal Flush{}, destrua a {C:attention}Rainha{}", + "pontuada e crie", + "Um {C:attention} Curinga{} {}{C:red}Raro{} {C:dark_edition}Negativo ", }, }, j_cry_quintet = { - name = "The Quintet", + name = "O Quinteto", text = { - "{X:mult,C:white} X#1# {} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{X:mult,C:white} X#1# {} Mult se a mão", + "jogada contém", + "um {C:attention}#2#", + }, + unlock = { + "Win a run with", + "your final hand being", + "a {E:1,C:attention}Five of a Kind", }, }, j_cry_redbloon = { - name = "Red Bloon", + name = "Balao Vermelho", text = { - "Earn {C:money}$#1#{} in {C:attention}#2#{} round(s)", - "{C:red,E:2}self destructs{}", + "Ganhe {C:money}$#1#{} em {C:attention}#2#{} rodada#2#", + "{C:red,E:2}se autoestoura{}", }, }, j_cry_redeo = { name = "Redeo", text = { - "{C:attention}-#1#{} Ante when", - "{C:money}$#2#{} {C:inactive}($#3#){} spent", - "{s:0.8}Requirements increase", - "{C:attention,s:0.8}exponentially{s:0.8} per use", - "{C:money,s:0.8}Next increase: {s:1,c:money}$#4#", + "{C:attention}-#1#{} Aposta quando", + "{C:money}$#2#{} {C:inactive}($#3#){} é gasto", + "{s:0.8}Requerimentos aumentam", + "{C:attention,s:0.8}exponencialmente{s:0.8} por uso", + "{C:money,s:0.8}Próximo aumento: {s:1,c:money}$#4#", }, }, j_cry_rescribere = { name = "Rescribere", text = { - "When a {C:attention}Joker{} is sold,", - "add its effects to", - "every other Joker", - "{C:inactive,s:0.8}Does not affect other Rescribere{}", + "Quando um {C:attention}Curinga{} é vendido,", + "adicionada seus efeitos para", + "todos os outros Curingas", + "{C:inactive,s:0.8}Não afeta outros Rescribere{}", }, }, j_cry_reverse = { - name = "Reverse Card", + name = "Carta Reversa", text = { - "Fill all empty Joker slots {C:inactive}(Max 100){}", - "with {C:dark_edition}Holographic{} {C:attention}Jolly Jokers{} if", - "{C:attention}discarded poker hand{} is a {C:attention}#1#{}", - "{C:red,E:2}self destructs{}", - "{C:inactive,s:0.8}The ULTIMATE comeback{}", + "Encha todos os espaços de Curinga vazios {C:inactive}(Max 100){}", + "com {C:attention}Curingas Alegres{} {C:dark_edition}Holográfico{} se", + "a {C:attention}mão de poker descartada{} for um {C:attention}#1#{}", + "{C:red,E:2}se autodestrói{}", + "{C:inactive,s:0.8}A volta por cima suprema{}", }, }, j_cry_rnjoker = { name = "RNJoker", text = { - "Randomize abilities each {C:attention}Ante{}", + "Randomiza as habilidades a cada {C:attention}Aposta{}", + }, + unlock = { + "{C:green}1 in 20{} chance", + "to unlock this card", + "on {C:attention}Game Over", }, }, j_cry_sacrifice = { - name = "Sacrifice", + name = "Sacrificio", text = { - "Create an {C:green}Uncommon{} Joker", - "and 3 {C:attention}Jolly Jokers{} when", - "a {C:spectral}Spectral{} card is used", - "{C:red}Works once per round{}", + "Crie #3# Curinga#3# {C:green}Incomum{}", + "e #2# {C:attention}Curinga#2#{} Alegre#2#{} quando", + "uma carta {C:spectral}Espectral{} é usada", + "{C:red}Funciona uma vez por rodada{}", "{C:inactive}#1#{}", }, }, j_cry_sapling = { - name = "Sapling", + name = "Muda", text = { - "After scoring {C:attention}#2#{} {C:inactive}[#1#]{} Enhanced", - "cards, sell this card to", - "create an {C:cry_epic}Epic{} {C:attention}Joker{}", - "{C:inactive,s:0.8}Will create a {C:red,s:0.8}Rare{} {C:attention,s:0.8}Joker{}", - "{C:inactive,s:0.8}if {C:cry_epic,s:0.8}Epic{} {C:inactive,s:0.8}Jokers are disabled{}", + "Depois de pontuar {C:attention}#2#{} cartas", + " {C:inactive}[#1#]{} Aprimoradas, venda esta carta para", + "criar #4# {V:1}#3#{} {C:attention}Curinga{}", }, }, j_cry_savvy = { - name = "Savvy Joker", + name = "Curinga Experiente", text = { - "{C:chips}+#1#{} Chips if played", - "hand contains", - "a {C:attention}#2#", + "{C:chips}+#1#{} Ficha#1# se a mão", + "jogada contém", + "um {C:attention}#2#", }, }, j_cry_Scalae = { name = "Scalae", text = { - "Scaling {C:attention}Jokers{} scale", - "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:attention}Curingas{} que escalam, agora escalam", + "como um grau-{C:attention}#1#{} polinômio", + "aumente o grau em {C:attention}#2#{} no final da rodada", + "{C:inactive,s:0.8}({C:attention,s:0.8}Scalae{C:inactive,s:0.8} excluída)", + "{C:inactive,s:0.8}(ex. +1, +#3#, +#4#, +#5#)", }, }, j_cry_scrabble = { - name = "Scrabble Tile", + name = "Titulo Scrabble", text = { - "{C:green}#1# in #2#{} chance to create", - "a {C:dark_edition}Jolly {C:green}Uncommon{} Joker", - "when hand is played", + "{C:green}#1# em #2#{} de chance de criar", + "um {C:green}Uncommon{} Curinga {C:dark_edition}Alegre", + "quando a mão é jogada", }, }, j_cry_seal_the_deal = { - name = "Seal the Deal", + name = "Selar o Acordo", text = { - "Add a {C:attention}random seal{} to each card", - "scored on {C:attention}final hand{} of round", + "Adicione um {C:attention}selo aleatório{} para cada carta", + "pontuada na {C:attention}mão final{} da rodada", }, }, j_cry_shrewd = { - name = "Shrewd Joker", + name = "Curinga Astuto", text = { - "{C:chips}+#1#{} Chips if played", - "hand contains", - "a {C:attention}#2#", + "{C:chips}+#1#{} Ficha#1# se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_silly = { - name = "Silly Joker", + name = "Curinga bobo", text = { - "{C:red}+#1#{} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{C:red}+#1#{} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_smallestm = { - name = "Tiny", + name = "Pequeno", text = { - "Create a {C:cry_jolly}Double M", - "tag if {C:attention}poker hand{}", - "is a {C:attention}#1#{}", - "{C:inactive,s:0.8}ok so basically i'm very smol", + "Cria uma marca {C:cry_jolly}Drobro M", + "se a {C:attention}mão de poker{}", + "é um {C:attention}#1#{}", + "{C:inactive,s:0.8}ok então basicamente eu sou bem piqueno", }, }, j_cry_soccer = { - name = "One for All", --changed the name from latin because this isn't exotic + name = "Um por Todos", --changed the name from latin because this isn't exotic text = { - "{C:attention}+#1#{} Joker slot", - "{C:attention}+#1#{} Booster Pack slot", - "{C:attention}+#1#{} hand size", - "{C:attention}+#1#{} consumable slot", - "{C:attention}+#1#{} card in shop", + "{C:attention}+#1#{} espaço#1# de Curinga", + "{C:attention}+#1#{} espaço#1# de Pacote de Reforço", + "{C:attention}+#1#{} tamanho de mão", + "{C:attention}+#1#{} espaço#1# de consumível", + "{C:attention}+#1#{} carta#1# na loja", + "{C:attention}+#1#{} espaço#1# de cupom", + }, + unlock = { + "Win a run with", + "only {C:attention}High Card", + }, + }, + j_cry_soccer_balanced = { + name = "Um por Todos", --changed the name from latin because this isn't exotic + text = { + "{C:attention}+#1#{} espaço#1# de Pacote de Reforço", + "{C:attention}+#1#{} tamanho de mão", + "{C:attention}+#1#{} espaço#1# de consumível", + "{C:attention}+#1#{} carta#1# na loja", + "{C:attention}+#1#{} espaço#1# de cupom", + }, + unlock = { + "Win a run with", + "only {C:attention}High Card", + }, + }, + j_cry_fleshpanopticon = { + name = "Panoptico de Carne", + text = { + "{C:red}X#1#{} tamanho de {C:attention}Blind Chefe{}", + "Quando o {C:attention}Blind Chefe{} é derrotado,", + "{C:red}se autodestrói{}, e cria", + "uma carta {C:spectral}Porta de Entrada{} {C:dark_edition}Negativo{}", + '{C:inactive,s:0.8}"This prison... to hold... me?"', }, }, j_cry_spaceglobe = { - name = "Celestial Globe", + name = "Globo Celestial", text = { - "This Joker gains {X:chips,C:white}X#2#{} Chips", - "if {C:attention}poker hand{} is a {C:attention}#3#{},", - "Hand changes after increase{}", - "{C:inactive}(Currently{} {X:chips,C:white}X#1#{} {C:inactive}Chips){}", + "Este Curinga ganha {X:chips,C:white}X#2#{} Fichas", + "se a {C:attention}mão de poker{} é um {C:attention}#3#{},", + "Mão muda depois do aumento{}", + "{C:inactive}(Atualmente{} {X:chips,C:white}X#1#{} {C:inactive}Fichas){}", + }, + }, + j_cry_spectrogram = { + name = "Espectrograma", + text = { + "{C:attention}Reativa{} o Curinga mais a direita", + "uma vez para cada {C:attention}Carta Eco", + "que é jogada e pontuada", }, }, j_cry_speculo = { name = "Speculo", text = { - "Creates a {C:dark_edition}Negative{} copy", - "of a random {C:attention}Joker{}", - "at the end of the {C:attention}shop", - "{C:inactive,s:0.8}Does not copy other Speculo{}", + "Cria uma cópia {C:dark_edition}Negativo{}", + "de um {C:attention}Curinga{} aleatório", + "no fim da {C:attention}loja", + "{C:inactive,s:0.8}Não copia outro Speculo{}", + }, + }, + j_cry_spy = { + name = "Espiao", + text = { + "{X:mult,C:white} X#2# {} Mult, {C:dark_edition}+1 Espaço de {C:attention}Curinga{}", + "{C:inactive}That #1# is a spy!", }, }, j_cry_stardust = { - name = "Stardust", + name = "Poeira Estelar", text = { - "{C:dark_edition}Polychrome{} cards", - "each give {X:mult,C:white}X#1#{} Mult", + "Outras cartas {C:dark_edition}Policromático{}", + "dão {X:mult,C:white}X#1#{} Mult cada", }, }, j_cry_stella_mortis = { name = "Stella Mortis", text = { - "This Joker destroys a", - "random {C:planet}Planet{} card", - "and gains {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)", + "Este Curinga destrói um", + "carta {C:planet}Planeta{} aleatória", + "e ganha {X:dark_edition,C:white} ^#1# {} Mult", + "no fim da {C:attention}loja{}", + "{C:inactive}(Atualmente {X:dark_edition,C:white} ^#2# {C:inactive} Mult)", + }, + }, + j_cry_stronghold = { + name = "A Fortaleza", + text = { + "{X:mult,C:white} X#1# {} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", + }, + unlock = { + "Win a run with", + "your final hand being", + "a {E:1,C:attention}Bulwark", }, }, j_cry_subtle = { - name = "Subtle Joker", + name = "Curinga sutil", text = { - "{C:chips}+#1#{} Chips if played", - "hand contains", - "a {C:attention}#2#", + "{C:chips}+#1#{} Fichas se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_supercell = { name = "Supercell", text = { - "{C:chips}+#1#{} Chips, {C:mult}+#1#{} Mult,", - "{X:chips,C:white}X#2#{} Chips, {X:mult,C:white}X#2#{} Mult", - "Earn {C:money}$#3#{} at", - "end of round", + "{C:chips}+#1#{} Ficha#1#, {C:mult}+#1#{} Mult,", + "{X:chips,C:white}X#2#{} Ficha, {X:mult,C:white}X#2#{} Mult", + "Ganhe {C:money}$#3#{} no", + "final da rodada", + }, + }, + j_cry_supercell_balanced = { + name = "Supercell", + text = { + "{X:chips,C:white}X#2#{} Fichas, {X:mult,C:white}X#2#{} Mult", + "Ganhe {C:money}$#3#{} no", + "final da rodada", }, }, j_cry_sus = { name = "SUS", text = { - "At end of round, create", - "a {C:attention}copy{} of a random", - "card {C:attention}held in hand{},", - "destroy all others", - "{C:attention,s:0.8}Kings{s:0.8} of {C:hearts,s:0.8}Hearts{s:0.8} are prioritized", + "No fim da rodada, crie", + "uma {C:attention}cópia{} de uma carta", + "aleatória {C:attention}em mãos{},", + "destrua todas as outras", + "{C:attention,s:0.8}Reis{s:0.8} de {C:hearts,s:0.8}Copas{s:0.8} são priorizados", }, }, j_cry_swarm = { - name = "The Swarm", + name = "O Enxame", text = { - "{X:mult,C:white} X#1# {} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{X:mult,C:white} X#1# {} Mult se a mão", + "jogada conter", + "um {C:attention}#2#", + }, + unlock = { + "Win a run with", + "your final hand being", + "a {E:1,C:attention}Flush Five", }, }, j_cry_sync_catalyst = { - name = "Sync Catalyst", + name = "Catalisador de Sincronização", text = { - "Balances {C:chips}Chips{} and {C:mult}Mult{}", - "{C:inactive,s:0.8}Hey! I've seen this one before!", + "Balanceia {C:chips}Fichas{} e {C:mult}Mult{}", + "{C:inactive,s:0.8}Ei! Eu ja vi esse antes!", + }, + }, + j_cry_tax_fraud = { + name = "Fraude Fiscal", + text = { + "Ganhe {C:attention}$#1#{} por {C:attention}Curinga Aluguel", + "no final da rodada", }, }, j_cry_tenebris = { name = "Tenebris", text = { - "{C:dark_edition}+#1#{C:attention} Joker{} slots", - "Earn {C:money}$#2#{} at end of round", + "{C:dark_edition}+#1# espaço#1# de {C:attention}Curinga{}", + "Ganhe {C:money}$#2#{} no final da rodada", }, }, j_cry_translucent = { - name = "Translucent Joker", + name = "Curinga Translucido", text = { - "Sell this card to create", - "a {C:attention}Banana Perishable{} copy", - "of a random {C:attention}Joker{}", - "{s:0.8,C:inactive}(Copy bypasses perish compat)", + "Venda esta carta para criar", + "uma cópia {C:attention}Banana Perecível{}", + "de um {C:attention}Curinga{} aleatório", + "{s:0.8,C:inactive}(Cópia ignora compatibilidade perecível)", + }, + }, + j_cry_treacherous = { + name = "Curinga Traicoeiro", + text = { + "{C:chips}+#1#{} Ficha#1# se a mão", + "jogada conter", + "um {C:attention}#2#", + }, + }, + j_cry_trick_or_treat = { + name = "Doces ou Travessuras", + text = { + "quando {C:attention}vendido{}:", + "{C:green}#1# em #2#{} de chance de criar {C:attention}2{} {C:cry_candy}Doces", + "ou criar um Curinga {X:cry_cursed,C:white}Amaldiçoado{}", + "{C:inactive}(Pode transbordar)", }, }, j_cry_tricksy = { - name = "Tricksy Joker", + name = "Curinga Complicado", text = { - "{C:chips}+#1#{} Chips if played", - "hand contains", - "a {C:attention}#2#", + "{C:chips}+#1#{} Ficha#1# se a mão", + "jogada conter", + "um {C:attention}#2#", }, }, j_cry_triplet_rhythm = { - name = "Triplet Rhythm", + name = "Ritmo Triplo", text = { - "{X:mult,C:white} X#1# {} Mult if scoring hand", - "contains {C:attention}exactly{} three {C:attention}3s", + "{X:mult,C:white} X#1# {} Mult se a mão pontuada", + "contém {C:attention}exatamente{} três {C:attention}3s", + }, + }, + j_cry_tropical_smoothie = { + name = "Batida tropical", + text = { + "Venda esta carta", + "para {C:attention}multiplicar{} os valores", + "dos Curingas possuídos em {C:attention}X#1#{}", }, }, j_cry_unity = { - name = "The Unity", + name = "A Unidade", text = { - "{X:mult,C:white} X#1# {} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{X:mult,C:white} X#1# {} Mult se a mão", + "jogada contém", + "um {C:attention}#2#", + }, + unlock = { + "Win a run with", + "your final hand being", + "a {E:1,C:attention}Flush House", + }, + }, + j_cry_universe = { + name = "Universo", + text = { + "Outras cartas {C:dark_edition}Astral{}", + "dão {X:dark_edition,C:white}^#1#{} Mult cada", }, }, j_cry_universum = { name = "Universum", text = { - "{C:attention}Poker hands{} gain", - "{X:red,C:white} X#1# {} Mult and {X:blue,C:white} X#1# {} Chips", - "when leveled up", + "{C:attention}Mãos de poker{} ganham", + "{X:red,C:white} X#1# {} Mult e {X:blue,C:white} X#1# {} Fichas", + "quando sobem de nível", }, }, j_cry_unjust_dagger = { - name = "Unjust Dagger", + name = "Adaga Injusta", text = { - "When {C:attention}Blind{} is selected,", - "destroy Joker to the left", - "and gain {C:attention}one-fifth{} of", - "its sell value as {X:mult,C:white} XMult {}", - "{C:inactive}(Currently {X:mult,C:white} X#1# {C:inactive} Mult)", + "Quando o {C:attention}Blind{} é selecionado,", + "destrua o Curinga da esquerda", + "e ganhe {C:attention}um quinto{} de", + "seu valor de venda como {X:mult,C:white} XMult {}", + "{C:inactive}(Atualmente {X:mult,C:white} X#1# {C:inactive} Mult)", }, }, j_cry_verisimile = { name = "Non Verisimile", text = { - "When any probability", - "is {C:green}successfully{} triggered,", - "this Joker gains {X:red,C:white}XMult{}", - "equal to its listed {C:attention}odds", - "{C:inactive}(Currently {X:mult,C:white} X#1# {C:inactive} Mult)", + "Quando qualquer probabilidade", + "é ativada {C:green}com sucesso{},", + "este Curinga ganha {X:red,C:white}XMult{}", + "igual a sua {C:attention}chance{} listada", + "{C:inactive}(Atualmente {X:mult,C:white} X#1# {C:inactive} Mult)", }, }, j_cry_virgo = { - name = "Virgo", + name = "Virgem", text = { - "This Joker gains {C:money}$#1#{} of {C:attention}sell value{}", - "if {C:attention}poker hand{} contains a {C:attention}#2#{}", - "Sell this card to create a", - "{C:dark_edition}Polychrome{} {C:attention}Jolly Joker{} for", - "every {C:money}$4{} of {C:attention}sell value{} {C:inactive}(Min 1){}", + "Este Curinga ganha {C:money}$#1#{} de {C:attention}valor de venda{}", + "se a {C:attention}mão de poker{} conter um {C:attention}#2#{}", + "Venda esta carta para criar um", + "{C:attention}Curinga Alegre{} {C:dark_edition}Policromático{} para", + "cada {C:money}$4{} de {C:attention}valor de venda{} {C:inactive}(Min 1){}", }, }, j_cry_wacky = { - name = "Wacky Joker", + name = "Curinga Louco", text = { - "{C:red}+#1#{} Mult if played", - "hand contains", - "a {C:attention}#2#", + "{C:red}+#1#{} Mult se a mão", + "jogada contém", + "um {C:attention}#2#", }, }, j_cry_waluigi = { name = "Waluigi", text = { - "All Jokers give", + "Todos os Curingas dão", "{X:mult,C:white} X#1# {} Mult", }, }, j_cry_wario = { name = "Wario", text = { - "All Jokers give", - "{C:money}$#1#{} when triggered", + "Todos os Curingas dão", + "{C:money}$#1#{} quando ativados", }, }, j_cry_wee_fib = { name = "Weebonacci", text = { - "This Joker gains", - "{C:mult}+#2#{} Mult when each played", - "{C:attention}Ace{}, {C:attention}2{}, {C:attention}3{}, {C:attention}5{}, or {C:attention}8{}", - "is scored", - "{C:inactive}(Currently {C:mult}+#1#{C:inactive} Mult)", + "Este Curinga ganha", + "{C:mult}+#2#{} Mult quando cada", + "{C:attention}Ás{}, {C:attention}2{}, {C:attention}3{}, {C:attention}5{}, ou {C:attention}8{} jogado", + "e pontuado", + "{C:inactive}(Atualmente {C:mult}+#1#{C:inactive} Mult)", }, }, j_cry_weegaming = { name = "2D", text = { - "Retrigger each played {C:attention}2{}", --wee gaming - "{C:attention:}#1#{} additional time(s)", --wee gaming? + "Reativa cada {C:attention}2{} jogado", --wee gaming + "{C:attention:}#1#{} vez#1# adicionais", --wee gaming? "{C:inactive,s:0.8}Wee Gaming?{}", }, }, j_cry_wheelhope = { - name = "Wheel of Hope", + name = "Roda da Esperanca", text = { - "This Joker gains", - "{X:mult,C:white} X#1# {} Mult when failing", - "a {C:attention}Wheel of Fortune{}", - "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + "Este Curinga ganha", + "{X:mult,C:white} X#1# {} Mult quando uma", + "{C:attention}A Roda da Fortuna{} falha", + "{C:inactive}(Atualmente {X:mult,C:white} X#2# {C:inactive} Mult)", }, }, j_cry_whip = { - name = "The WHIP", + name = "O CHICOTE", text = { - "This Joker gains {X:mult,C:white} X#1# {} Mult", - "if {C:attention}played hand{} contains a", - "{C:attention}2{} and {C:attention}7{} of different suits", - "{C:inactive}(Currently {X:mult,C:white} X#2# {C:inactive} Mult)", + "Este Curinga ganha {X:mult,C:white} X#1# {} Mult", + "se a {C:attention}mão jogada{} contém um", + "{C:attention}2{} e {C:attention}7{} de naipes diferentes", + "{C:inactive}(Atualmente {X:mult,C:white} X#2# {C:inactive} Mult)", + }, + }, + j_cry_wrapped = { + name = "Doce Embrulhado", + text = { + "Cria um {C:attention}Curinga Comida{} aleatório", + "em {C:attention}#1#{} rodada#1#", + "{C:red,E:2}se autodestrói{}", + }, + }, + j_cry_wtf = { + name = Cryptid_config.family_mode and "O Aglomerado" or "Que Porra!?", + text = { + "{X:mult,C:white} X#1# {} Mult se a mão", + "jogada contém", + "um {C:attention}#2#", + }, + unlock = { + "Win a run with", + "your final hand being", + "a {E:1,C:attention}Clusterfuck", + }, + }, + j_cry_zooble = { + name = "Zooble", + text = { + "Se a mão jogada {C:attention}não{}", + "contém uma {C:attention}Sequência{},", + "Este Curinga ganha {C:mult}+#2#{} Mult para cada", + "{C:attention}classe única{} na mão pontuada", + "{C:inactive}(Atualmente {C:mult}+#1#{C:inactive} Mult)", }, }, }, Planet = { c_cry_Klubi = { - name = "Klubi", + name = "Risti", text = { "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", - "Level up", + "Subir de nível", "{C:attention}#1#{},", "{C:attention}#2#{},", - "and {C:attention}#3#{}", + "e {C:attention}#3#{}", }, }, c_cry_Lapio = { - name = "Lapio", + name = "Pata", text = { "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", - "Level up", + "Subir de nível", + "{C:attention}#1#{},", + "{C:attention}#2#{},", + "e {C:attention}#3#{}", + }, + }, + c_cry_Kaikki = { + name = "Kaikki", + text = { + "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", + "Subir de nível", "{C:attention}#1#{},", "{C:attention}#2#{},", "and {C:attention}#3#{}", }, }, c_cry_nstar = { - name = "Neutron Star", + name = "Estrela de Nêutrons", text = { - "Upgrade a random", - "poker hand by", - "{C:attention}1{} level for each", - "{C:attention}Neutron Star{} used", - "in this run", - "{C:inactive}(Currently{C:attention} #1#{C:inactive}){}", + "Suba de nível uma mão de poker", + "aleatória em", + "{C:attention}1{} nível para cada", + "{C:attention}Estrela de Nêutrons{} usada", + "nesta partida", + "{C:inactive}(Atualmente{C:attention} #1#{C:inactive}){}", }, }, c_cry_planetlua = { - name = "Planet.lua", + name = "Planeta.lua", text = { - "{C:green}#1# in #2#{} chance to", - "upgrade every", - "{C:legendary,E:1}poker hand{}", - "by {C:attention}1{} level", + "{C:green}#1# em #2#{} de chance para", + "subir de nível cada", + "{C:legendary,E:1}mão de poker{}", + "em {C:attention}1{} nível", }, }, c_cry_Sydan = { - name = "Sydan", + name = "Hertta", text = { "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", - "Level up", + "Subir de nível", + "{C:attention}#1#{},", + "{C:attention}#2#{},", + "e {C:attention}#3#{}", + }, + }, + c_cry_Timantti = { + name = "Ruutu", + text = { + "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", + "Subir de nível", "{C:attention}#1#{},", "{C:attention}#2#{},", "and {C:attention}#3#{}", }, }, - c_cry_Timantti = { - name = "Timantti", + c_cry_marsmoons = { + name = "Phobos & Deimos", text = { - "({V:1}lvl.#4#{})({V:2}lvl.#5#{})({V:3}lvl.#6#{})", - "Level up", - "{C:attention}#1#{},", - "{C:attention}#2#{},", - "and {C:attention}#3#{}", + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult e", + "{C:chips}+#4#{} fichas#4#", + }, + }, + c_cry_void = { + name = "Vazio", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult e", + "{C:chips}+#4#{} ficha#4#", + }, + }, + c_cry_asteroidbelt = { + name = "Cinturão de Asteroides", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Subir de Nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult e", + "{C:chips}+#4#{} ficha#4#", + }, + }, + c_cry_universe = { + name = Cryptid_config.family_mode and "Universo" or "O Universo Em Sua Fodendo Totalidade", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){} Subir de nível", + "{C:attention}#2#", + "{C:mult}+#3#{} Mult e", + "{C:chips}+#4#{} ficha#4#", + }, + }, + c_cry_sunplanet = { + name = "Sol", + text = { + "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){}", + "Aumenta o poder das", + "mãos {C:attention}Ascendido{} em {X:gold,C:white}0.05{}", + "{C:inactive}(Atualmente {X:gold,C:white}X(#2#^asc){C:inactive})", }, }, }, Sleeve = { - sleeve_cry_ccd_sleeve = { - name = "CCD Sleeve", + sleeve_cry_beige_sleeve = { + name = "Capa Bege", text = { - "Every card is also", - "a {C:attention}random{} consumable", + "Curingas {C:attention}Comuns{} Jokers tem", + "valores {C:attention}quadruplicados{}", + }, + }, + sleeve_cry_beige_sleeve_alt = { + name = "Capa Bege", + text = { + "Curingas {C:attention}Incomuns{} tem", + "valores {C:attention}quadruplicados{}", + }, + }, + sleeve_cry_beta_sleeve = { + name = "Capa Nostálgica", + text = { + "Espaços de {C:attention}Curingas{} e {C:attention}Consumíveis{}", + "são {C:attention}combinados", + "Blinds {C:attention}Nostálgicos{} são recolocados", + "em seu Blind atualizado", + }, + }, + sleeve_cry_bountiful_sleeve = { + name = "Capa Generosa", + text = { + "Depois de {C:blue}Jogar{} ou {C:red}Descartar{},", + "sempre compra {C:attention}5{} cartas", + }, + }, + sleeve_cry_ccd_sleeve = { + name = "Capa CCD", + text = { + "Toda carta também", + "é um {C:attention}consumível{} aleatório", }, }, sleeve_cry_conveyor_sleeve = { - name = "Conveyor Sleeve", + name = "Capa Conversor", text = { - "Jokers may {C:attention}not{} be moved", - "At start of round,", - "{C:attention}duplicate{} rightmost Joker", - "and {C:attention}destroy{} leftmost Joker", + "Curingas {C:attention}não{} podem ser movidos", + "No começo de cada rodada, {C:attention}duplique{}", + "o Curinga mais a direita e", + "{C:attention}destrua{} o Curinga mais a esquerda", }, }, sleeve_cry_critical_sleeve = { - name = "Critical Sleeve", + name = "Capa Crítica", text = { - "After each hand played,", - "{C:green}1 in 4{} chance for {X:dark_edition,C:white} ^2 {} Mult", - "{C:green}1 in 8{} chance for {X:dark_edition,C:white} ^0.5 {} Mult", + "Depois de cada mão jogada,", + "{C:green}1 em 4{} de chance para {X:dark_edition,C:white} ^2 {} Mult", + "{C:green}1 em 8{} de chance para {X:dark_edition,C:white} ^0.5 {} Mult", }, }, sleeve_cry_encoded_sleeve = { - name = "Encoded Sleeve", + name = "Capa Codificada", text = { - "Start with a {C:cry_code,T:j_cry_CodeJoker}Code Joker{}", - "and a {C:cry_code,T:j_cry_copypaste}Copy/Paste{}", - "Only {C:cry_code}Code Cards{} appear in shop", + "Começe com um {C:cry_code,T:j_cry_CodeJoker}Curinga Código{}", + "e um {C:cry_code,T:j_cry_copypaste}Copia/Cola{}", + "Apenas {C:cry_code}Cartas Código{} aparecem na loja", }, }, sleeve_cry_equilibrium_sleeve = { - name = "Balanced Sleeve", + name = "Capa Balanceada", text = { - "All cards have the", - "{C:attention}same chance{} of", - "appearing in shops,", - "start run with", - "{C:attention,T:v_overstock_plus}+2 Shop Slots", + "Todas as cartas tem a", + "{C:attention}mesma chance{} de", + "aparecerem nas lojas,", + "começe a partida com um", + "{C:attention,T:v_overstock_plus}+2 Espaços de Loja", + }, + }, + sleeve_cry_glowing_sleeve = { + name = "Capa Brilhante", + text = { + "Multiplica os valores de", + "todos os Curingas em {X:dark_edition,C:white} X1.25 {}", + "quando o Blind Chefe é derrotado", + "{X:cry_jolly,C:white,s:0.8} Jolly#1#Open#1#Winner#1#-#1#wawa#1#person", --peak loc_vars right here }, }, sleeve_cry_infinite_sleeve = { - name = "Unlimited Sleeve", + name = "Capa Ilimitada", text = { - "You can select {C:attention}any", - "number of cards", + "Você pode selecionar {C:attention}qualquer", + "número de cartas e não te da +1 de tamanho de mão", --someone do the hand size thing for me }, }, sleeve_cry_misprint_sleeve = { - name = "Misprinted Sleeve", + name = "Cata com Erro de Impressão", text = { - "Values of cards", - "are {C:attention}randomized", + "Valores de cartas", + "são {C:attention}randomizados", }, }, sleeve_cry_redeemed_sleeve = { - name = "Redeemed Sleeve", + name = "Capa Resgatada", text = { - "When a {C:attention}Voucher{} is purchased,", - "gain its {C:attention}extra tiers", + "Quando um {C:attention}Cupom{} é comprado,", + "ganhe seus {C:attention}níveis extras", + }, + }, + sleeve_cry_spooky_sleeve = { + name = "Capa Assustadora", + text = { + "Começe com um {C:eternal}Eterno{} {C:attention,T:j_cry_chocolate_dice}Dado de Chocolate", + "Depois de cada {C:attention}Aposta{}, crie um", + "Curinga {C:cry_candy}Doce{} ou {X:cry_cursed,C:white}Amaldiçoado{}", + }, + }, + sleeve_cry_very_fair_sleeve = { + name = "Capa Muito Justa", + text = { + "{C:blue}-2{} mãos, {C:red}-2{} descartes", + "toda rodada", + "{C:attention}Cupons{} não aparecem", + "mais na loja", }, }, sleeve_cry_wormhole_sleeve = { - name = "Wormhole Sleeve", + name = "Capa Buraco de Minhoca", text = { - "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", + "Começe com um Curinga {C:cry_exotic}Exótico{C:attention}", + "Curingas são {C:attention}20X{} mais suscetíveis", + "para serem {C:dark_edition}Negativo", + "{C:attention}-2{} Espaços de Curinga", + }, + }, + sleeve_cry_legendary_sleeve = { + name = "Capa Lendária", + text = { + "Começe com um Curinga {C:legendary}Lendário{C:legendary}", + "{C:green}1 em 5{} de chance para criar outro", + "quando o Blind Chefe é derrotado {C:inactive}(deve ter espaço){}", + }, + }, + sleeve_cry_antimatter_sleeve = { + name = "Capa Antimatéria", + text = { + "aplica os {C:attention}efeitos{}", + "e {C:attention}efeitos especiais{}", + "de todas as capas dos baralhos", + "{C:red}WIP", }, }, }, Spectral = { - c_cry_analog = { - name = "Analog", + c_cry_adversary = { + name = "Adversário", text = { - "Create {C:attention}#1#{} copies of a", - "random {C:attention}Joker{}, destroy", - "all other Jokers, {C:attention}+#2#{} Ante", + "{C:red}Todos{} os seus {C:attention}Curingas{} se tornam {C:dark_edition}Negativo{},", + "{C:red}todos{} os {C:attention}Curingas{} na loja custam", + "{C:red}duas vezes{} mais pelo resto da partida", + }, + }, + c_cry_analog = { + name = "Analogico", + text = { + "Cria {C:attention}#1#{} copia#1# de um", + "{C:attention}Curinga{} aleatório, destrua", + "todos os outros Curingas, {C:attention}+#2#{} Aposta", + }, + }, + c_cry_chambered = { + name = "Compartimentado", + text = { + "Crie {C:attention}#1#{} copia#1#", + "{C:dark_edition}Negativo{} de um", + "consumível {C:attention}aleatório{}", + "em sua posse", + "{C:inactive,s:0.8}Não copia Compartimentado{}", + }, + }, + c_cry_conduit = { + name = "Conduíte", + text = { + "Troca as {C:attention}edições{} de", + "{C:attention}2{} cartas selecionadas ou {C:attention}Curingas{}", }, }, c_cry_gateway = { - name = "Gateway", + name = "Porta de Entrada", text = { - "Create a random", - "{C:cry_exotic,E:1}Exotic{C:attention} Joker{}, destroy", - "all other Jokers", + "Crie um {C:attention} Curinga{}", + "{C:cry_exotic,E:1}Exótico{} aleatório, destrua", + "todos os outros curingas", }, }, c_cry_hammerspace = { - name = "Hammerspace", + name = "Espaço do Martelo", text = { - "Apply random {C:attention}consumables{}", - "as if they were {C:dark_edition}Enhancements{}", - "to cards held in hand", + "Aplica {C:attention}consumíveis{} aleatórios", + "como se eles fossem {C:dark_edition}Aprimoramentos{}", + "para as cartas em mãos", }, }, c_cry_lock = { - name = "Lock", + name = "Trancar", text = { - "Remove {C:red}all{} stickers", - "from {C:red}all{} Jokers,", - "then apply {C:purple,E:1}Eternal{}", - "to a random {C:attention}Joker{}", + "Remove {C:red}todos{} os adesivos", + "de {C:red}todos{} os Curingas,", + "então aplica {C:purple,E:1}Eterno{}", + "para um {C:attention}Curinga{} aleatório", }, }, c_cry_pointer = { - name = "POINTER://", + name = "PONTEIRO://", text = { - "Create a card", - "of {C:cry_code}your choice", - "{C:inactive,s:0.8}(Exotic Jokers #1#excluded)", + "Cria uma carta", + "de {C:cry_code}sua escolha", + "{C:inactive,s:0.8}(Curingas Exóticos #1#excluídos)", }, }, c_cry_replica = { - name = "Replica", + name = "Réplica", text = { - "Convert all cards", - "held in hand", - "to a {C:attention}random{}", - "card held in hand", + "Converta todas as cartas", + "em mãos", + "para uma carta", + "em mãos {C:attention}aleatória{}", + }, + }, + c_cry_ritual = { + name = "Ritual", + text = { + "Aplica {C:dark_edition}Negativo{}, {C:dark_edition}Mosaico{},", + "ou {C:dark_edition}Astral{} para {C:attention}#1#{}", + "carta#1# selecionada na mão", }, }, c_cry_source = { - name = "Source", + name = "Fonte", text = { - "Add a {C:cry_code}Green Seal{}", - "to {C:attention}#1#{} selected", - "card in your hand", + "Adiciona um {C:cry_code}Selo Verde{}", + "para {C:attention}#1#{} carta#1#", + "selecionada em sua mão", }, }, c_cry_summoning = { - name = "Summoning", + name = "Invocar", text = { - "Create a random", - "{C:cry_epic}Epic{} {C:joker}Joker{}, destroy", - "one random {C:joker}Joker{}", + "Cria um {C:joker}Curinga{} {V:1}#1#{}", + "aleatório, destrói", + "um {C:joker}Curinga{} aleatório", }, }, c_cry_trade = { - name = "Trade", + name = "Troca", text = { - "{C:attention}Lose{} a random Voucher,", - "gain {C:attention}2{} random Vouchers", + "{C:attention}Perca{} um Cupom aleatório,", + "ganhe {C:attention}2{} Cupons aleatórios", }, }, c_cry_typhoon = { - name = "Typhoon", + name = "Tufão", text = { - "Add an {C:cry_azure}Azure Seal{}", - "to {C:attention}#1#{} selected", - "card in your hand", + "Adicione um {C:cry_azure}Selo Índigo{}", + "para {C:attention}#1#{} carta#1# selecionada", + "em sua mão", }, }, c_cry_vacuum = { - name = "Vacuum", + name = "Vácuo", text = { - "Removes {C:red}all {C:green}modifications{}", - "from {C:red}all{} cards held in hand,", - "Earn {C:money}$#1#{} per {C:green}modification{} removed", - "{C:inactive,s:0.7}(ex. Enhancements, Seals, Editions)", + "Remove {C:red}todas{} as {C:green}modificações{}", + "de {C:red}todas{} as cartas em mãos,", + "Ganhe {C:money}$#1#{} por {C:green}modificação{} removida", + "{C:inactive,s:0.7}(ex. Aprimoramentos, Selos, Edições)", }, }, c_cry_white_hole = { - name = "White Hole", + name = "Buraco Branco", text = { - "{C:attention}Remove{} all hand levels,", - "upgrade {C:legendary,E:1}most played{} poker hand", - "by {C:attention}3{} for each removed level", + "Melhora a mão de poker", + "{C:legendary,E:1}mais jogada{} em {C:attention}4{}", + "{C:attention}Remova{} todos os níveis das outras mãos", + }, + }, + c_cry_white_hole2 = { + name = "Buraco Branco", + text = { + "{C:attention}Remova{} todos os níveis de mãos,", + "melhora a mão de poker {C:legendary,E:1}mais jogada{}", + "em {C:attention}3{} para cada nível removido", }, }, }, Stake = { stake_cry_pink = { - name = "Pink Stake", + name = "Aposta Rosa", colour = "Pink", --this is used for auto-generated sticker localization text = { - "Required score scales", - "faster for each {C:attention}Ante", + "Pontos requeridos para escalam", + "mais rádido em cada {C:attention}Aposta", }, }, stake_cry_brown = { - name = "Brown Stake", + name = "Aposta Marrom", colour = "Brown", text = { - "All {C:attention}stickers{} are compatible", - "with each other", + "Todos os {C:attention}adesivos{} são compatíveis", + "um com o outro", }, }, stake_cry_yellow = { - name = "Yellow Stake", + name = "Aposta Amarela", colour = "Yellow", text = { - "{C:attention}Stickers{} can appear on", - "all purchasable items", + "{C:attention}Adesivos{} podem aparecer em", + "qualquer item comprável", }, }, stake_cry_jade = { - name = "Jade Stake", + name = "Aposta Jade", colour = "Jade", text = { - "Cards can be drawn {C:attention}face down{}", + "Cartas podem sem compradas {C:attention}viradas para baixo{}", }, }, stake_cry_cyan = { - name = "Cyan Stake", + name = "Aposta Ciana", colour = "Cyan", text = { - "{C:green}Uncommon{} and {C:red}Rare{} Jokers are", - "less likely to appear", + "Curingas {C:green}Incomuns{} e {C:red}Raros{} tem menos", + "chances de aparecer", }, }, stake_cry_gray = { - name = "Gray Stake", + name = "Aposta Cinza", colour = "Gray", text = { - "Rerolls increase by {C:attention}$2{} each", + "Atualizações aumentam em {C:attention}$2{} cada", }, }, stake_cry_crimson = { - name = "Crimson Stake", + name = "Aposta Carmesim", colour = "Crimson", text = { - "Vouchers restock on {C:attention}even{} Antes", + "Cupons restocam em Apostas {C:attention}pares{}", }, }, stake_cry_diamond = { - name = "Diamond Stake", + name = "Aposta Diamante", colour = "Diamond", text = { - "Must beat Ante {C:attention}10{} to win", + "Deve derrotar a aposta {C:attention}10{} para ganhar", }, }, stake_cry_amber = { - name = "Amber Stake", + name = "Aposta Âmbar", colour = "Amber", text = { - "{C:attention}-1{} Booster Pack slot", + "{C:attention}-1{} espaço de Pacote de Reforço", }, }, stake_cry_bronze = { - name = "Bronze Stake", + name = "Aposta Bronze", colour = "Bronze", text = { - "Vouchers are {C:attention}50%{} more expensive", + "Cupons são {C:attention}50%{} mais caros", }, }, stake_cry_quartz = { - name = "Quartz Stake", + name = "Aposta Quartzo", colour = "Quartz", text = { - "Jokers can be {C:attention}Pinned{}", - "{s:0.8,C:inactive}(Stays pinned to the leftmost position){}", + "Curingas podem ser {C:attention}Fixado{}", + "{s:0.8,C:inactive}(Ficam fixados na posição mais a esquerda){}", }, }, stake_cry_ruby = { - name = "Ruby Stake", + name = "Aposta Rubi", colour = "Ruby", text = { - "{C:attention}Big{} Blinds can become", - "{C:attention}Boss{} Blinds", + "Blinds {C:attention}Grandes{} podem se tornar", + "Blinds {C:attention}Chefes{} Blinds", }, }, stake_cry_glass = { - name = "Glass Stake", + name = "Aposta Vidro", colour = "Glass", text = { - "Cards can {C:attention}shatter{} when scored", + "Cartas podem {C:attention}quebrar{} ao pontuar", }, }, stake_cry_sapphire = { - name = "Sapphire Stake", + name = "Aposta Safira", colour = "Sapphire", text = { - "Lose {C:attention}25%{} of current money", - "at end of Ante", - "{s:0.8,C:inactive}(Up to $10){}", + "Perca {C:attention}25%{} do dinheiro atual", + "no fim da Aposta", + "{s:0.8,C:inactive}(Máximo de $10){}", }, }, stake_cry_emerald = { - name = "Emerald Stake", + name = "Aposta Esmeralda", colour = "Emerald", text = { - "Cards, packs, and vouchers", - "can be {C:attention}face down{}", - "{s:0.8,C:inactive}(Unable to be viewed until purchased){}", + "Cartas, pacotes, e cupons", + "podem vir de {C:attention}cabeça para baixo{}", + "{s:0.8,C:inactive}(Impossível de ver até ser comprado){}", }, }, stake_cry_platinum = { - name = "Platinum Stake", + name = "Aposta Platina", colour = "Platinum", text = { - "Small Blinds are {C:attention}removed{}", + "Blinds Pequenos são {C:attention}removidos{}", }, }, stake_cry_twilight = { - name = "Twilight Stake", + name = "Aposta Crepúsculo", colour = "Twilight", text = { - "Cards can be {C:attention}Banana{}", - "{s:0.8,C:inactive}(1 in 10 chance of being destroyed each round){}", + "Cartas podem ser {C:attention}Banana{}", + "{s:0.8,C:inactive}(1 em 10 de chance para serem destruidas a cada rodada){}", }, }, stake_cry_verdant = { - name = "Verdant Stake", + name = "Aposta Verdejante", colour = "Verdant", text = { - "Required score scales", - "faster for each {C:attention}Ante", + "Pontos necessários escalam", + "mais rapidamente para cada {C:attention}Aposta", }, }, stake_cry_ember = { - name = "Ember Stake", + name = "Aposta Brasa", colour = "Ember", text = { - "All items give no money when sold", + "Todos os itens não dão dinheiro quando vendidos", }, }, stake_cry_dawn = { - name = "Dawn Stake", + name = "Aposta Aurora", colour = "Dawn", text = { - "Tarots and Spectrals target {C:attention}1", - "fewer card", - "{s:0.8,C:inactive}(Minimum of 1){}", + "Tarôs e Espectrais miram em {C:attention}1", + "carta a menos", + "{s:0.8,C:inactive}(Mínimo de 1){}", }, }, stake_cry_horizon = { - name = "Horizon Stake", + name = "Aposta Horizonte", colour = "Horizon", text = { - "When blind selected, add a", - "{C:attention}random card{} to deck", + "Quando o blind é selecionado, adiciona uma", + "{C:attention}carta aleatória{} no baralho", }, }, stake_cry_blossom = { - name = "Blossom Stake", + name = "Aposta Floração", colour = "Blossom", text = { - "{C:attention}Final{} Boss Blinds can appear", - "in {C:attention}any{} Ante", + "Blinds Chefes {C:attention}Finais{} podem aparecer", + "em {C:attention}qualquer{} Aposta", }, }, stake_cry_azure = { - name = "Azure Stake", + name = "Aposta Índigo", colour = "Azure", text = { - "Values on Jokers are reduced", - "by {C:attention}20%{}", + "Valores em Curingas são reduzidos", + "em {C:attention}20%{}", }, }, stake_cry_ascendant = { - name = "Ascendant Stake", + name = "Aposta Ascendente", colour = "Ascendant", text = { - "{C:attention}-1{} Shop slot", + "{C:attention}-1{} Espaço de loja", }, }, }, Tag = { tag_cry_astral = { - name = "Astral Tag", + name = "Marca Astral", text = { - "Next base edition shop", - "Joker is free and", - "becomes {C:dark_edition}Astral{}", + "O próximo Curinga da loja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Astral{}", }, }, tag_cry_banana = { - name = "Banana Tag", + name = "Marca Banana", text = { - "Creates {C:attention}#1#", - "{C:inactive}(Must have room){}", + "Cria {C:attention}#1#", + "{C:inactive}(Deve ter espaço){}", }, }, tag_cry_bettertop_up = { - name = "Better Top-up Tag", + name = "Marca Melhor Recarga", text = { - "Creates up to {C:attention}#1#", - "{C:green}Uncommon{} Jokers", - "{C:inactive}(Must have room){}", + "Crie até {C:attention}#1#", + "Curinga#1# {C:green}Incomum{} ", + "{C:inactive}(Deve ter espaço){}", }, }, tag_cry_better_voucher = { - name = "Golden Voucher Tag", + name = "Marca Cupom Dourado", text = { - "Adds one Tier {C:attention}#1#{} Voucher", - "to the next shop", + "Adiciona um Cupom Nível {C:attention}#1#{}", + "na próxima loja", }, }, tag_cry_blur = { - name = "Blurred Tag", + name = "Marca Borrada", text = { - "Next base edition shop", - "Joker is free and", - "becomes {C:dark_edition}Blurred{}", + "O próximo Curinga da loja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Borrado{}", }, }, tag_cry_booster = { - name = "Booster Tag", + name = "Marca de Reforço", text = { - "Next {C:cry_code}Booster Pack{} has", - "{C:attention}double{} cards and", - "{C:attention}double{} choices", + "O próximo {C:cry_code}Pacote de Reforço{} tem o,", + "{C:attention}dobro{} de cartas e o", + "{C:attention}dodro{} de escolhas", }, }, tag_cry_bundle = { - name = "Bundle Tag", + name = "Marca Pacote", text = { - "Create a {C:attention}Standard Tag{}, {C:tarot}Charm Tag{},", - "{C:attention}Buffoon Tag{}, and {C:planet}Meteor Tag", + "Cria uma {C:attention}Marca Padrão{}, {C:tarot}Marca de Amuleto{},", + "{C:attention}Marca de Bufão{}, e {C:planet}Marca de Meteoro", }, }, tag_cry_cat = { - name = "Cat Tag", - text = { "Meow.", "{C:inactive}Level {C:dark_edition}#1#" }, + name = "Marca Gato", + text = { + "Skelleton Juice fez a tradução mas nínguem vai acreditar em você.", + "{C:inactive}Nível {C:dark_edition}#1#", + }, }, tag_cry_console = { - name = "Console Tag", + name = "Marca Console", text = { - "Gives a free", - "{C:cry_code}Program Pack", + "Oferece gratuitamente um", + "{C:cry_code}Pacote Programa", }, }, tag_cry_double_m = { - name = "Double M Tag", + name = "Marca Dobro M", text = { - "Shop has a", - "{C:dark_edition}Jolly {C:legendary}M Joker{}", + "A loja tem um um", + "{C:legendary}Curinga M{} {C:dark_edition}Alegre{} grátis", }, }, tag_cry_empowered = { - name = "Empowered Tag", + name = "Marca Empoderada", text = { - "Gives a free {C:spectral}Spectral Pack", - "with {C:legendary,E:1}The Soul{} and {C:cry_exotic,E:1}Gateway{}", + "Oferece Gratuitamente um {C:spectral}Pacote Espectral", + "com {C:legendary,E:1}A Alma{} e {C:cry_exotic,E:1}Porta de Entrada{}", }, }, tag_cry_epic = { - name = "Epic Tag", + name = "Marca Épica", text = { - "Shop has a half-price", - "{C:cry_epic}Epic Joker", + "A loja tem um {C:cry_epic}Curinga Épico", + "pela metade do preço", }, }, tag_cry_gambler = { @@ -2344,406 +3422,641 @@ return { }, }, tag_cry_glass = { - name = "Fragile Tag", + name = "Marca Frágil", text = { - "Next base edition shop", - "Joker is free and", - "becomes {C:dark_edition}Fragile{}", + "O próximo Curinga da joja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Frágil{}", }, }, tag_cry_glitched = { - name = "Glitched Tag", + name = "Marca Bugada", text = { - "Next base edition shop", - "Joker is free and", - "becomes {C:dark_edition}Glitched{}", + "O próximo Curinga da loja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Bugado{}", }, }, tag_cry_gold = { - name = "Golden Tag", + name = "Marca Dourada", text = { - "Next base edition shop", - "Joker is free and", - "becomes {C:dark_edition}Golden{}", + "O próximo Curinga da loja de", + "edilão de base é grátis", + "e torna-se {C:dark_edition}Dourado{}", }, }, tag_cry_gourmand = { - name = "Gourmand Tag", + name = "Marca Gourmand", text = { - "Shop has a free", - "{C:attention}Food Joker", + "A loja tem um", + "{C:attention}Curinga Comida grátis", }, }, tag_cry_loss = { - name = "Loss", + name = "Perda", text = { - "Gives a free", - "{C:cry_ascendant}Meme Pack", + "Oferece gratuitamente um", + "{C:cry_ascendant}Pacote Meme", }, }, tag_cry_m = { - name = "Jolly Tag", + name = "Marca Alegre", text = { - "Next base edition shop", - "Joker is free and", - "becomes {C:dark_edition}Jolly{}", + "O próximo Curinga da loja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Alegre{}", }, }, tag_cry_memory = { - name = "Memory Tag", + name = "Marca da Memoria", text = { - "Create {C:attention}#1#{} copies of", - "the last {C:attention}Tag{} used", - "during this run", - "{s:0.8,C:inactive}Copying Tags excluded", - "{s:0.8,C:inactive}Currently: {s:0.8,C:attention}#2#", + "Cria {C:attention}#1#{} cópia#1# da", + "última {C:attention}Marca{} usada", + "durante essa partida", + "{s:0.8,C:inactive}Marcas que copiam são excluídas", + "{s:0.8,C:inactive}Atualmente: {s:0.8,C:attention}#2#", }, }, tag_cry_mosaic = { - name = "Mosaic Tag", + name = "Marca de Mosaico", text = { - "Next base edition shop", - "Joker is free and", - "becomes {C:dark_edition}Mosaic{}", + "O próximo Curinga da loja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Mosaico{}", }, }, tag_cry_oversat = { - name = "Oversaturated Tag", + name = "Marca Hipersaturada", text = { - "Next base edition shop", - "Joker is free and", - "becomes {C:dark_edition}Oversaturated{}", + "O próximo Curinga da loja de", + "edição de base é grátis", + "e torna-se {C:dark_edition}Hipersaturado{}", }, }, tag_cry_quadruple = { - name = "Quadruple Tag", + name = "Marca Quádrupla", text = { - "Gives {C:attention}#1#{} copies of the", - "next selected {C:attention}Tag", - "{s:0.8,C:inactive}Copying Tags excluded", + "Oferece {C:attention}#1#{} cópia#1# da", + "próxima {C:attention}Marca{} selecionada", + "{s:0.8,C:inactive}Marcas que copiam são excluídas", }, }, tag_cry_quintuple = { - name = "Quintuple Tag", + name = "Marca Quíntupla", text = { - "Gives {C:attention}#1#{} copies of the", - "next selected {C:attention}Tag", - "{s:0.8,C:inactive}Copying Tags excluded", + "Oferece {C:attention}#1#{} cópia#1# da", + "próxima {C:attention}Marca{} selecionada", + "{s:0.8,C:inactive}Marcas que copiam são excluídas", }, }, tag_cry_rework = { - name = "Rework Tag", + name = "Marca Retrabalhada", text = { - "Shop has a(n)", - "{C:dark_edition}#1# {C:cry_code}#2#", + "A loja tem um", + "{C:cry_code}#2# {C:dark_edition}#1#", }, }, tag_cry_schematic = { - name = "Schematic Tag", + name = "Marca Esquemática", text = { - "Shop has a", - "{C:attention}Brainstorm", + "A loja tem um", + "{C:attention}Boa Ideia", }, }, tag_cry_scope = { - name = "Scope Tag", + name = "Marca de Escopo", text = { - "{C:attention}+#1# {C:blue}hands{} and", - "{C:red}discards{} next round", + "{C:attention}+#1# {C:blue}mão#1#{} e", + "{C:red}descarte#1#{} na próxima rodada", }, }, tag_cry_triple = { - name = "Triple Tag", + name = "Marca Tripla", text = { - "Gives {C:attention}#1#{} copies of the", - "next selected {C:attention}Tag", - "{s:0.8,C:inactive}Copying Tags excluded", + "Oferece {C:attention}#1#{} cópia#1# da", + "próxima {C:attention}Marca{} selecionada", + "{s:0.8,C:inactive}Marcas que copiam são excluídas", }, }, }, Tarot = { c_cry_automaton = { - name = "The Automaton", + name = "A Automação", text = { - "Creates up to {C:attention}#1#", - "random {C:cry_code}Code{} card", - "{C:inactive}(Must have room)", + "Cria até {C:attention}#1#", + "carta#1# de {C:cry_code}Código{} aleatórias", + "{C:inactive}(Deve ter espaço)", }, }, c_cry_eclipse = { - name = "The Eclipse", + name = "O Eclipse", text = { - "Enhances {C:attention}#1#{} selected card", - "into an {C:attention}Echo Card", + "Aprimora {C:attention}#1#{} carta#1# selecionada", + "em uma {C:attention}Carta Eco", }, }, c_cry_meld = { - name = "Meld", + name = "Fusão", text = { - "Select a {C:attention}Joker{} or", - "{C:attention}playing card{} to", - "become {C:dark_edition}Double-Sided", + "Selecione um {C:attention}Curinga{} ou", + "{C:attention}carta de jogo{} para", + "se tornar {C:dark_edition}Duas Caras", }, }, c_cry_theblessing = { - name = "The Blessing", + name = "A Benção", text = { - "Creates {C:attention}1{}", - "random {C:attention}consumable{}", - "{C:inactive}(Must have room){}", + "Cria até {C:attention}1{}", + "{C:attention}consumível{} aleatório", + "{C:inactive}(Deve ter espaço){}", + }, + }, + c_cry_seraph = { + name = "O Serafim", + text = { + "Aprimora {C:attention}#1#{} carta#1# selecionada#1#", + "em uma {C:attention}Carta da Luz", }, }, }, Voucher = { v_cry_asteroglyph = { - name = "Asteroglyph", + name = "Asteroglifo", text = { - "Set Ante to {C:attention}#1#{}", + "Defina a aposta para {C:attention}#1#{}", + }, + unlock = { + "Reach Ante {C:attention}36", }, }, v_cry_blankcanvas = { - name = "Blank Canvas", + name = "Tela Preta", text = { - "{C:attention}+#1#{} hand size", + "{C:attention}+#1#{} tamanho de mão", + }, + unlock = { + "Reduce your {C:attention}handsize", + "to {C:attention}0", }, }, v_cry_clone_machine = { - name = "Clone Machine", + name = "Máquina de Clones", text = { - "Double Tags become", - "{C:attention}Quintuple Tags{} and", - "are {C:attention}4X{} as common", + "Marca Dupla tornam-se", + "{C:attention}Marcas Quíntuplas{} e", + "são {C:attention}4X{} mais comuns", }, }, v_cry_command_prompt = { - name = "Command Prompt", + name = "Prompt de Comando", text = { - "{C:cry_code}Code{} cards", - "can appear", - "in the {C:attention}shop{}", + "Cartas {C:cry_code}Código{}", + "podem aparecer", + "na {C:attention}loja{}", }, }, v_cry_copies = { - name = "Copies", + name = "Cópias", text = { - "Double Tags become", - "{C:attention}Triple Tags{} and are", - "{C:attention}2X{} as common", + "Marcas Duplas tornam-se", + "{C:attention}Marcas Triplas{} e", + "são {C:attention}2X{} mais comuns", }, }, v_cry_curate = { - name = "Curate", + name = "Clérigo", text = { - "All cards", - "appear with", - "an {C:dark_edition}Edition{}", + "Todas as cartas", + "aparecem", + "com {C:dark_edition}Edição{}", + }, + unlock = { + "Discover", + "all {C:attention}Editions", }, }, v_cry_dexterity = { - name = "Dexterity", + name = "Destreza", text = { - "Permanently", - "gain {C:blue}+#1#{} hand(s)", - "each round", + "Permanentemente", + "ganha {C:blue}+#1#{} mão#1#", + "a cada rodada", + }, + unlock = { + "Play {C:attention}5000{}", + "{C:attention}Playing Cards{}", + "in total", }, }, v_cry_double_down = { - name = "Double Down", + name = "Esforço Redobrado", text = { - "After every round,", - "{X:dark_edition,C:white} X1.5 {} to all values", - "on the back of", - "{C:dark_edition}Double-Sided{} cards", + "Após cada rodada,", + "{X:dark_edition,C:white} X1.5 {} para todos os valores", + "na parte de trás das", + "cartas {C:dark_edition}Duas Caras{} cards", }, }, v_cry_double_slit = { - name = "Double Slit", + name = "Dupla Fenda", text = { - "{C:attention}Meld{} can appear", - "in the shop and", - "Arcana Packs", + "{C:attention}Fusão{} pode aparecer", + "na loja e em", + "Pacotes Arcanos", }, }, v_cry_double_vision = { - name = "Double Vision", + name = "Visão Dupla", text = { - "{C:dark_edition}Double-Sided{} cards appear", - "{C:attention}4X{} more frequently", + "Cartas {C:dark_edition}Duas Caras{} podem aparecer", + "{C:attention}4X{} mais frequentemente", }, }, v_cry_fabric = { - name = "Universal Fabric", + name = "Fábrica Universal", text = { - "{C:dark_edition}+#1#{} Joker slot(s)", + "{C:dark_edition}+#1#{} Espaço#1# de Curinga", + }, + unlock = { + "Redeem {C:dark_edition}Antimatter", + "{C:attention}10{} times", }, }, v_cry_massproduct = { - name = "Mass Production", + name = "Produção em Massa", text = { - "All cards and packs", - "in shop cost {C:attention}$1{}", + "Todas as cartas e pacotes na", + "loja custam {C:attention}$1{}", + }, + unlock = { + "Redeem {C:attention}25", + "{C:attention}Vouchers", + "in one run", }, }, v_cry_moneybean = { - name = "Money Beanstalk", + name = "Pé de Dinheiro", text = { - "Raise the cap on", - "interest earned in", - "each round to {C:money}$#1#{}", + "Aumenta o máximo de", + "juros ganhos em", + "cada rodada oara {C:money}$#1#{}", + }, + unlock = { + "Max out the", + "{C:attention}interest earnings{}", + "for the {C:attention}whole run", }, }, v_cry_overstock_multi = { - name = "Multistock", + name = "EStoque Múltiplo", text = { - "{C:attention}+#1#{} card slot(s) and", - "{C:attention}+#1#{} booster pack slot(s)", + "{C:attention}+#1#{} espaço#1# de carta,", + "{C:attention}+#1#{} espaço#1# de pacote de reforço,", + "and {C:attention}+#1#{} espaço#1# de cupom,", "available in shop", }, + unlock = { + "Spend {C:attention}1000$", + "in shop", + "in one run", + }, }, v_cry_pacclimator = { - name = "Planet Acclimator", + name = "Aclimatador Planetário", text = { - "{C:planet}Planet{} cards appear", - "{C:attention}X#1#{} more frequently", - "in the shop", - "All future {C:planet}Planet{}", - "cards are {C:green}free{}", + "Cartas de {C:planet}Planeta{} aparecem", + "{C:attention}X#1#{} mais frequentemente", + "na loja", + "Permite o controle da", + "{C:planet}Taxa de Aparição de Cartas de Planeta{} na loja", + "{C:inactive}(Cheque {C:attention}Informação da Tentativa{C:inactive})", + }, + unlock = { + "Buy {C:attention}100{} {C:planet}Planet", + "cards total in", + "the shop", }, }, v_cry_pairamount_plus = { name = "Pairamount Plus", text = { - "{C:attention}Retrigger{} all M Jokers", - "once for every Pair", - "{C:attention}contained{} in played hand", + "{C:attention}Reative{} todos os Curingas M", + "uma vez para cada Par", + "{C:attention}contido{} na mão jogada", }, }, v_cry_pairing = { - name = "Pairing", + name = "Emparelhamento", text = { - "{C:attention}Retrigger{} all M Jokers", - "if played hand is a {C:attention}Pair", + "{C:attention}Retive{} todos os Curingas M", + "se a mão jogada é um {C:attention}Par", }, }, v_cry_quantum_computing = { - name = "Quantum Computing", + name = "Computação Quântica", text = { - "{C:cry_code}Code{} cards can spawn", - "with {C:dark_edition}Negative{} edition", + "Cartas de {C:cry_code}Código{} podem aparecer", + "com a edição {C:dark_edition}Negativa{}", }, }, v_cry_repair_man = { - name = "Repair Man", + name = "Reparador", text = { - "{C:attention}Retrigger{} all M Jokers", - "if played hand contains a {C:attention}Pair", + "{C:attention}Reativa{} todos os Curingas M", + "se a mão jodada conter um {C:attention}Par", }, }, v_cry_rerollexchange = { - name = "Reroll Exchange", + name = "Mudança de Atualização", text = { - "All rerolls", - "cost {C:attention}$2{}", + "Todas as atualizações", + "custam {C:attention}$2{}", + }, + unlock = { + "{C:attention}Reroll{} the shop", + "a total of", + "{C:attention}250 times{}", + "in one run", }, }, v_cry_satellite_uplink = { - name = "Satellite Uplink", + name = "Ligação Ascendente por Satélite", text = { - "{C:cry_code}Code{} cards may", - "appear in any of", - "the {C:attention}Celestial Packs{}", + "Cartas de {C:cry_code}Código{} podem", + "podem aparecer em qualquer", + "{C:attention}Pacote Celestial{}", }, }, v_cry_scope = { - name = "Galactic Scope", + name = "Mira Galática", text = { - "Create the {C:planet}Planet", - "card for played", - "{C:attention}poker hand{}", - "{C:inactive}(Must have room){}", + "Cria a carta de {C:planet}Planeta", + "da {C:attention}mão de poker{} jogada", + "{C:inactive}(Deve ter espaço ){}", + }, + unlock = { + "Use {C:attention}50{} {C:planet}Planet", + "cards from", + "{C:attention}Booster Packs{}", + "in one run", }, }, v_cry_tacclimator = { - name = "Tarot Acclimator", + name = "Aclimatador de Tarô", text = { - "{C:tarot}Tarot{} cards appear", - "{C:attention}X#1#{} more frequently", - "in the shop", - "All future {C:tarot}Tarot{}", - "cards are {C:green}free{}", + "Cartas de {C:tarot}Tarô{} aparecem", + "{C:attention}X#1#{} mais frequentemente", + "na loja", + "Permite o controle da", + "{C:tarot}Taxa de Aparição das Cartas de Tarô{} nas lojas", + "{C:inactive}(Cheque {C:attention}Informação da Tentativa{C:inactive})", + }, + unlock = { + "Buy {C:attention}100{} {C:tarot}Tarot", + "cards total in", + "the shop", }, }, v_cry_tag_printer = { - name = "Tag Printer", + name = "Impressora de Marcas", text = { - "Double Tags become", - "{C:attention}Quadruple Tags{} and", - "are {C:attention}3X{} as common", + "Marcas Duplas se tornam", + "{C:attention}Marcas Quádruplas{} e", + "são {C:attention}3X{} mais comuns", }, }, v_cry_threers = { - name = "The 3 Rs", + name = "Os 3 Rs", text = { - "Permanently", - "gain {C:red}+#1#{} discard(s)", - "each round", + "Permanentemente", + "ganhe {C:red}+#1#{} descarte#1#", + "a cada rodada", + }, + unlock = { + "Discard {C:attention}5000{}", + "{C:attention}Playing Cards{}", + "in total", }, }, v_cry_stickyhand = { - name = "Sticky Hand", + name = "Mão Grudenta", text = { - "{C:attention}+#1#{} card", - "selection limit", + "{C:attention}+#1#{} limite de seleção de carta", }, }, v_cry_grapplinghook = { - name = "Grappling Hook", + name = "Gancho", text = { - "{C:attention}+#1#{} card", - "selection limit", - "{C:inactive,s:0.7}NOTE: Will have extra{}", - "{C:inactive,s:0.7}functionality later{}", + "{C:attention}+#1#{} limite de seleção de carta", + "{C:inactive,s:0.7}Voce pode fazer muito mais do que pensa.{}", }, }, v_cry_hyperspacetether = { - name = "Hyperspace Tether", + name = "Amarração do Hiperespaço", text = { - "{C:attention}+#1#{} card", - "selection limit", - "{C:inactive,s:0.7}NOTE: Will have extra{}", - "{C:inactive,s:0.7}functionality later{}", + "{C:attention}+#1#{} limite de seleção de carta", + "Todas as cartas selecionadas contribuem em poder", + "para {C:attention}Mãos Ascendidas{}", }, }, }, Other = { + disabled = { + name = "Desativado", + text = { + "Não aparece mais", + "durante uma partida", + }, + }, + disabled_card_dependency = { + name = "Desativado", + text = { + "Requer {C:attention}#1#", + }, + }, + disabled_mod_dependency = { + name = "Desativado", + text = { + "Requuer o mod:", + "{C:attention}#1#", + }, + }, + disabled_mod_conflict = { + name = "Desativado", + text = { + "Incompatível com o mod:", + "{C:attention}#1#", + }, + }, banana = { name = "Banana", text = { - "{C:green}#1# in #2#{} chance of being", - "destroyed each round", + "{C:green}#1# em #2#{} de chance de ser", + "destruída a cada rodada", + }, + }, + cry_absolute = { + name = "Absoluto", + text = { + "Não pode ser vendido", + "ou destruído", + "{C:attention}Irremovível{}", }, }, cry_rigged = { - name = "Rigged", + name = "Roubada", text = { - "All {C:cry_code}listed{} probabilities", - "are {C:cry_code}guaranteed", + "Todas as probabilidades {C:cry_code}listadas{}", + "são {C:cry_code}garantidas", }, }, cry_hooked = { - name = "Hooked", + name = "Fisgado", text = { - "When this Joker is {C:cry_code}triggered{},", - "trigger {C:cry_code}#1#", + "Quando este Curinga é {C:cry_code}ativado{},", + "ative {C:cry_code}#1#", }, }, - food_jokers = { - name = "Food Jokers", + cry_flickering = { + name = "Piscante", text = { - "{s:0.8}Gros Michel, Egg, Ice Cream, Cavendish,", - "{s:0.8}Turtle Bean, Diet Cola, Popcorn, Ramen,", - "{s:0.8}Seltzer, Pickle, Chili Pepper, Caramel,", - "{s:0.8}Nostalgic Candy, Fast Food M, etc.", + "Destruída depois de", + "{C:attention}#1#{} ativações", + "{C:inactive}({C:attention}#2#{C:inactive} restantes)", + }, + }, + cry_flickering_desc = { --used by choco dice + name = "Piscante", + text = { + "Destruída depois de", + "{C:attention}#1#{} ativações", + }, + }, + cry_possessed = { + name = "Possuído", + text = { + "{C:attention}Desativa{} e {C:attention}reverte{}", + "os efeitos, se possível", + "Destruída junto do {C:attention}Fantasma", + }, + }, + --todo? add candy jokers to list + food_jokers = { + name = "Curinga Comida", + text = { + "{s:0.8}Banana-prata, Ovo, Sorvete, Cavendish,", + "{s:0.8}Feijão Preto, Cola Diet, Pipoca, Rámen,", + "{s:0.8}Seltzer, Picles, Pimenta Malagueta, Caramelo,", + "{s:0.8}Doce Nostálgico, M Fast Food , etc.", + }, + }, + ev_cry_choco0 = { + name = "Eventos Possíveis", + text = { + "{T:ev_cry_choco1}1{} {T:ev_cry_choco2}2{} {T:ev_cry_choco3}3{} {T:ev_cry_choco4}4{} {T:ev_cry_choco5}5{}", + "{T:ev_cry_choco6}6{} {T:ev_cry_choco7}7{} {T:ev_cry_choco8}8{} {T:ev_cry_choco9}9{} {T:ev_cry_choco10}10{}", + "{C:inactive}(Passe o Cursor nos números para mais informações)", + }, + }, + ev_cry_choco1 = { + name = "1: Possessão (medo)", + text = { + "{C:attention}Curingas{} e cartas de jogo tem uma", + "chance de {C:green}1 em 3{} para ganhar Piscante", + "Crie um {C:attention}Fantasma", + "{C:inactive,s:0.7}Você foi possuído por um fantasma, e sua", + "{C:inactive,s:0.7}consciência está indo e voltando.", + }, + }, + ev_cry_choco2 = { + name = "2: Casa Mal Assombrada", + text = { + "Previne ignorar {C:attention}Blinds{}", + "Uma {C:attention}alualização{} é permitida por loja", + "Preços de {C:attention}Cupom{} são dobrados", + "{C:inactive,s:0.7}Espíritos assustadores tomaram conta! Não toque", + "{C:inactive,s:0.7}em nada e saia daí o mais rápido possível!", + }, + }, + ev_cry_choco3 = { + name = "3: Poções da Bruxa", + text = { + "Crie 3 {C:attention}Poções", + "Use uma no final do {C:attention}Blind Pequeno{},", + "ou {C:attention}todos{} os males serão aplicados nesta {C:attention}Aposta", + "{C:inactive,s:0.7}Você foi sequestrado por uma bruxa!", + "{C:inactive,s:0.7}Ela te oferece três poções, te assistindo de perto.", + "{C:inactive,s:0.7}Escolha uma, para que ela não tome a decisão por você.", + }, + }, + ev_cry_choco4 = { + name = "4: Abismo Lunar", + text = { + "Cartas jogadas tem uma chance de {C:green}1 em 4{}", + "para tornar-se em uma carta {C:club}Paus{} de realeza aleatória", + "Divida o {C:attention}Mult{} pelo número de cartas de realeza jogadas", + "{C:inactive,s:0.7}Até mesmo um homem que é puro de coração", + "{C:inactive,s:0.7}e reza à noite...", + }, + }, + ev_cry_choco5 = { + name = "5: Suga-sangue", + text = { + "Remove {C:attention}Aprimoramentos{} de todas as cartas jogadas", + "chance de {C:green}1 em 3{} para destruir", + "cartas de {C:heart}Copas{} e {C:diamond}Ouros{}", + "{C:inactive,s:0.7}Fique atento na calada da noite, pois", + "{C:inactive,s:0.7,E:1}pois eles nas sombras buscam saciar sua sede...", + }, + }, + ev_cry_choco6 = { + name = "6: Por favor pegue um", + text = { + "No {C:attention}final da rodada{}, abra um", + "Pacote de {C:attention}Reforço{} aleatório", + "{C:inactive,s:0.7}Enquanto você caminha pelas ruas, vê uma", + "{C:inactive,s:0.7}caixa com vários Pacotes de Reforço. Que tal pegar um?", + }, + }, + ev_cry_choco7 = { + name = "7: Atmosfera Festiva", + text = { + "Cria 3 {C:attention}Doces ou Travessuras{} e 1 {C:attention}Cesta de Doces", + "Lojas tem um {C:attention}Doces ou Travessuras{} a cada rodada", + "{C:cry_candy}Doces{} dão {C:money}$3{} quando obtidos", + "{C:inactive,s:0.7}A vizinhança inteira está decorada para empreitadas assustadoras,", + "{C:inactive,s:0.7}venha se deliciar na atmosfera festiva!", + }, + }, + ev_cry_choco8 = { + name = "8: Chuva de Doces", + text = { + "Quando o {C:attention}Blind{} é derrotado, obtenha 1 {C:cry_candy}Doce{}", + "por mão restante; Otenha um {C:attention}Curinga Comida{}", + "quando um {C:cry_candy}Doce{} é gerado", + "{C:inactive,s:0.7}Está chovendo doces do céu! Rápido,", + "{C:inactive,s:0.7,E:1}pegue o máximo que você pode!", + }, + }, + ev_cry_choco9 = { + name = "9: Riquezas Fantasmagoricas", + text = { + "Ganhe {C:money}$20", + "Todos {C:money}dinheiro{} ganho é {C:attention}duplicado", + "{C:inactive,s:0.7}O espectro de um parente já falecido", + "{C:inactive,s:0.7}visita você no meio da noite!", + "{C:inactive,s:0.7}Sem dizer uma palavra, eles colocam uma bolsa de dinheiro em suas mãos,", + "{C:inactive,s:0.7}sorriem calorosamente e acenam enquanto desaparecem no ar.", + }, + }, + ev_cry_choco10 = { + name = "10: Antiguidade Reverenciada", + text = { + "Um {C:attention}Curinga{} {C:legendary}Lendário{} aparece", + "no espaço de {C:attention}Cupom{} por {C:money}$50", + "Apenas será comprável como o {C:attention}último{} item na loja", + "{C:inactive,s:0.7}Você atraiu a atenção do espírito de uma relíquia,", + "{C:inactive,s:0.7} mas não será fácil acalmá-lo.", }, }, cry_https_disabled = { @@ -2755,251 +4068,369 @@ return { --i am so sorry for this --actually some of this needs to be refactored at some point cry_eternal_booster = { - name = "Eternal", + name = "Eterno", text = { - "All cards in pack", - "are {C:attention}Eternal{}", + "Todas as cartas no pacote", + "são {C:attention}Eterno{}", }, }, cry_perishable_booster = { - name = "Perishable", + name = "Perecível", text = { - "All cards in pack", - "are {C:attention}Perishable{}", + "Todas as cartas no pacote", + "são {C:attention}Perecível{}", }, }, cry_rental_booster = { - name = "Rental", + name = "Aluguel", text = { - "All cards in pack", - "are {C:attention}Rental{}", + "Todas as cartas no pacote", + "são {C:attention}Aluguel{}", }, }, cry_pinned_booster = { - name = "Pinned", + name = "Fixado", text = { - "All cards in pack", - "are {C:attention}Pinned{}", + "Todas as cartas no pacote", + "são {C:attention}Fixado{}", }, }, cry_banana_booster = { name = "Banana", text = { - "All cards in pack", - "are {C:attention}Banana{}", + "Todas as cartas no pacote", + "são {C:attention}Banana{}", }, }, cry_eternal_voucher = { - name = "Eternal", + name = "Eterno", text = { - "Can't be traded", + "não pode ser trocado", }, }, cry_perishable_voucher = { - name = "Perishable", + name = "Perecível", text = { - "Debuffed after", - "{C:attention}#1#{} rounds", - "{C:inactive}({C:attention}#2#{C:inactive} remaining)", + "Desativado depois de", + "{C:attention}#1#{} rodadas", + "{C:inactive}({C:attention}#2#{C:inactive} restantes)", }, }, cry_rental_voucher = { - name = "Rental", + name = "Aluguel", text = { - "Lose {C:money}$#1#{} at", - "end of round", + "Perca {C:money}$#1#{} no", + "fim da rodada", }, }, cry_pinned_voucher = { - name = "Pinned", + name = "Fixado", text = { - "Remains in shop", - "until redeemed", + "Permaneça na loja", + "até ser resgatado", }, }, cry_banana_voucher = { name = "Banana", text = { - "{C:green}#1# in #2#{} chance of being", - "unredeemed each round", + "chance de {C:green}#1# em #2#{} se tornar", + "não resgatável a cada rodada", }, }, cry_perishable_consumeable = { - name = "Perishable", + name = "Perecível", text = { - "Debuffed at", - "end of round", + "Desativado no", + "fim da rodada", }, }, cry_rental_consumeable = { - name = "Rental", + name = "Aluguel", text = { - "Lose {C:money}$#1#{} at end of", - "round, and on use", + "Perca {C:money}$#1#{} no final da", + "rodada, quando usado", }, }, cry_pinned_consumeable = { name = "Pinned", text = { - "Can't use other", - "non-{C:attention}Pinned{} consumables", + "{C:inactive}Does nothing...", + "{C:inactive}for now", }, }, cry_banana_consumeable = { name = "Banana", text = { - "{C:green}#1# in #2#{} chance to do", - "nothing on use", + "chance de {C:green}#1# em #2#{} para não", + "fazer nada quando usado", }, }, p_cry_code_normal_1 = { - name = "Program Pack", + name = "Pacote Programa", text = { - "Choose {C:attention}#1#{} of up to", - "{C:attention}#2#{C:cry_code} Code{} cards", + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2# carta#2# de {C:cry_code}Código{}", }, }, p_cry_code_normal_2 = { - name = "Program Pack", + name = "Pacote Programa", text = { - "Choose {C:attention}#1#{} of up to", - "{C:attention}#2#{C:cry_code} Code{} cards", + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2# carta#2# de {C:cry_code}Código{} ", }, }, p_cry_code_jumbo_1 = { - name = "Jumbo Program Pack", + name = "Pacote Programa Jumbo", text = { - "Choose {C:attention}#1#{} of up to", - "{C:attention}#2#{C:cry_code} Code{} cards", + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2# carta#2# de {C:cry_code}Código{}", }, }, p_cry_code_mega_1 = { - name = "Mega Program Pack", + name = "Pacote Programa Mega", text = { - "Choose {C:attention}#1#{} of up to", - "{C:attention}#2#{C:cry_code} Code{} cards", + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2# carta#2# de {C:cry_code}Código{}", }, }, p_cry_empowered = { - name = "Spectral Pack [Empowered Tag]", + name = "Pacote Espectral [Marca Empoderada]", text = { - "Choose {C:attention}#1#{} of up to", - "{C:attention}#2#{C:spectral} Spectral{} cards", - "{s:0.8,C:inactive}(Generated by Empowered Tag)", + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2# carta#2# {C:spectral}Espectral{}", + "{s:0.8,C:inactive}(Gerada pela Marca Empoderada)", }, }, p_cry_meme_1 = { - name = "Meme Pack", + name = "Pacote Meme", text = { - "Choose {C:attention}#1#{} of", - "up to {C:attention}#2# Meme Jokers{}", + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2# Curinga#2#{} Meme", }, }, p_cry_meme_two = { - name = "Meme Pack", + name = "Pacote Meme", text = { - "Choose {C:attention}#1#{} of", - "up to {C:attention}#2# Meme Jokers{}", + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2# Curinga#2#{} Meme", }, }, p_cry_meme_three = { - name = "Meme Pack", + name = "Pacote Meme", text = { - "Choose {C:attention}#1#{} of", - "up to {C:attention}#2# Meme Jokers{}", + "Escolha {C:attention}#1#{} de até", + "{C:attention}#2# Curinga#2#{} Meme", }, }, undiscovered_code = { - name = "Not Discovered", + name = "Não Descoberta", text = { - "Purchase or use", - "this card in an", - "unseeded run to", - "learn what it does", + "Copre ou use", + "esta carta em uma", + "partida sem código para", + "aprender o que isso faz", + }, + }, + undiscovered_unique = { + name = "Não Descoberta", + text = { + "Compre ou use", + "esta carta em uma", + "partida sem código para", + "aprender o que isso faz", }, }, cry_green_seal = { - name = "Green Seal", + name = "Selo Verde", text = { - "Creates a {C:cry_code}Code{} card", - "when played and unscoring", - "{C:inactive}(Must have room)", + "Crie uma carta de {C:cry_code}Código{}", + "quando jogada e não pontuada", + "{C:inactive}(Deve ter espaço)", }, }, cry_azure_seal = { - name = "Azure Seal", + name = "Selo Índigo", text = { - "Create {C:attention}#1#{} {C:dark_edition}Negative{}", - "{C:planet}Planets{} for played", - "{C:attention}poker hand{}, then", - "{C:red}destroy{} this card", + "Crie {C:attention}#1#{} {C:planet}Planeta#1#{}", + "{C:dark_edition}Negativo{} pela {C:attention}mão de poker{}", + "jogada, então", + "{C:red}destrua{} essa carta", + }, + }, + blurred_sdm0 = { + name = "a", + text = { + '{C:inactive,s:0.8}"Eu odeio essa carta" - SDM_0, 2024{}', + }, + }, + }, + Unique = { + c_cry_potion = { + name = "Poção", + text = { + "Aplica um {C:attention}mal{}", + "desconhecido quando usado", + "{C:inactive,s:0.7}Obtido do Dado de Chocolate", }, }, }, }, misc = { + tutorial = { + cry_intro_1 = { + "Olá, eu sou o {C:attention}Curinga Joseph J.{}!", + "E bem-vindo ao {C:cry_exotic,E:1}Cryptid{}!", + }, + cry_intro_2 = { + "Parece que você nunca", + "jogou {C:cry_exotic,E:1}Cryptid{} neste perfil antes.", + "Permita-me mostrar como as coisas funcionam!", + }, + cry_intro_3 = { + "*cresça mãos*", + }, + cry_intro_4 = { + "É difícil de comprimir tudo neste mod em", + "apenas algumas sentença, mas o que eu vou falar", + "é que você está prestes a embarcar em uma viagem {C:cry_exotic,E:1}selvagem{}!", + "Isso não é a mesma coisa que o {C:attention}Poekr de Curinga{} sabe...", + }, + cry_intro_5 = { + "Como você pode perceber por esses", + "{C:cry_ascendant}modos de jogo{}, eu gosto da letra {C:attention}M{}.", + "Selecionem um modo de jogo para que eu possa explicar...", + "{s:0.8}Nota: O balanceamento dos Modos de Jogo está em intenso desenvolvimento.", + "{s:0.8}Espere mudanças frequentes!", + }, + cry_modest_1 = { + "Procurando uma experiência mais próxima do original?", + "Então este modo de jogo {C:cry_ascendant}Modesto{} é para você!", + }, + cry_modest_2 = { + "Mesmo assim, seja cuidadoso com as mecânicas", + "escondidas entre Cryptid! Nunca se sabe", + "o que você achará na próxima rodada...", + }, + cry_mainline_1 = { + "Quer {E:1,C:attention}quebrar{} o jogo? Boas novas, você pode", + "fazer isso sem perder a noção!", + }, + cry_mainline_2 = { + "As coisas ainda estão uma loucura aqui, mas você terá", + "a chance de experimentar o sistema de {C:cry_ascendant}progressão{}.", + "Só não fique confortável demais...", + }, + cry_mainline_3 = { + "Porque você definitivamente vai ser mais forte, mas", + "eu criei alguns {E:1,C:dark_edition}chefes{} que talvez", + "façam você se arrepender de selecionar este {C:cry_ascendant}modo de jogo{}...", + }, + cry_madness_1 = { + "Você quer {C:red,E:1}aniquilar{} completamente o seu disco rígido?", + "Ai, que divertido! Este modo de jogo {C:cry_ascendant}Malucagem{} fala", + "de 'Balanceamento? {E:1,C:red}O QUE É ISSO!?{}'", + }, + cry_madness_2 = { + "Passei semanas sem dormir, abastecido por {C:green}Mountain Dew{}", + "trabalhando para garantir que este modo de jogo seja", + "{C:cry_ascendant}PERFEITAMENTE BALANCEADO{}, apenas para você!", + }, + cry_madness_3 = { + "Você começara com tudo desbloqueado, entã você", + "poderá liberar o {C:red,E:1}poder total{} do Cryptid!", + "Apenas tome cuidado para não {C:attention,E:1}crashar{} o jogo,", + "pois isso vai provavelmente acontecer antes mesmo de você perder...", + }, + }, + poker_hands = { + ["cry_Bulwark"] = "Baluarte", + ["cry_Clusterfuck"] = Cryptid_config.family_mode and "Conjunto" or "Zorra Total", + ["cry_UltPair"] = "Par Supremo", + ["cry_WholeDeck"] = Cryptid_config.family_mode and "O Baralho Inteiro" or "O Fodendo Baralho Inteiro", + }, + poker_hand_descriptions = { + ["cry_Bulwark"] = { + "5 cartas sem classe, sem naipe", + }, + ["cry_Clusterfuck"] = { + "Pelo menos 8 cartas que não", + "contenham um Par, Flush, or Sequência", + }, + ["cry_UltPair"] = { + "Dois Dois Pares, onde cada", + "Dois Pares é de uma classe única, por um", + "total de duas classes entre eles", + }, + ["cry_WholeDeck"] = { + "Uma mão que contenha cada uma das", + "cartas encontradas em um baralho de 52 cartas.", + "Você ficou louco?", + }, + }, achievement_names = { ach_cry_ace_in_crash = "Pocket ACE", - ach_cry_blurred_blurred_joker = "Legally Blind", - ach_cry_bullet_hell = "Bullet Hell", - ach_cry_break_infinity = "Break Infinity", - ach_cry_cryptid_the_cryptid = "Cryptid the Cryptid", + ach_cry_blurred_blurred_joker = "Legal Blind", + ach_cry_bullet_hell = "Inferno de Balas", + ach_cry_break_infinity = "Quebrando o Infinito", + ach_cry_cryptid_the_cryptid = "Criptídeo o Criptídeo", ach_cry_exodia = "Exodia", - ach_cry_freak_house = "Freak House", - ach_cry_googol_play_pass = "Googol Play Pass", + ach_cry_freak_house = "Casa Maluca", + ach_cry_googol_play_pass = "Passe da Gugol Play", ach_cry_haxxor = "H4xx0r", - ach_cry_home_realtor = "Home Realtor", - ach_cry_jokes_on_you = "Joke's on You, Pal!", - ach_cry_niw_uoy = "!niW uoY", - ach_cry_now_the_fun_begins = "Now the Fun Begins", - ach_cry_patience_virtue = "Patience is a Virtue", - ach_cry_perfectly_balanced = "Perfectly Balanced", + ach_cry_home_realtor = "Agente Imobiliário", + ach_cry_jokes_on_you = "A Piada Foi Feita Pra Você, Cara!", + ach_cry_niw_uoy = "êcoV uohnaG!", + ach_cry_now_the_fun_begins = "Agora Que a Diversão Começa", + ach_cry_patience_virtue = "Paciência é uma Virtude", + ach_cry_perfectly_balanced = "Perfeitamente Balanceado", ach_cry_pull_request = "Pull Request", - ach_cry_traffic_jam = "Traffic Jam", + ach_cry_traffic_jam = "Engarrafamento de Trânsito", ach_cry_ult_full_skip = "Ultimate Full Skip", - ach_cry_used_crash = "We Told You Not To", - ach_cry_what_have_you_done = "WHAT HAVE YOU DONE?!", + ach_cry_used_crash = "Nós Te Falamos Para Você Não Fazer", + ach_cry_what_have_you_done = "O QUE VOCÊ FEZ?!", + ach_cry_pin = "Quadro da Vergonha", }, achievement_descriptions = { - ach_cry_ace_in_crash = 'check_for_unlock({type = "ace_in_crash"})', - ach_cry_blurred_blurred_joker = "Obtain Blurred Blurred Joker", - ach_cry_bullet_hell = "Have 15 AP Jokers", - ach_cry_break_infinity = "Score 1.79e308 Chips in a single hand", - 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", - ach_cry_niw_uoy = "Reach Ante -8", - ach_cry_now_the_fun_begins = "Obtain Canvas", - ach_cry_patience_virtue = "Wait out Lavender Loop for 2 minutes before playing first hand and beat the blind", - ach_cry_perfectly_balanced = "Beat Very Fair Deck on Ascendant Stake", - ach_cry_pull_request = "Have ://COMMIT spawn the same Joker that it destroyed", - ach_cry_traffic_jam = "Beat all Rush Hour challenges", - ach_cry_ult_full_skip = "Win in 1 round", - ach_cry_used_crash = "Use ://CRASH", - ach_cry_what_have_you_done = "Delete or Sacrifice an Exotic Joker", + ach_cry_ace_in_crash = 'Cheque_para_desbloquear({tipo = "Ás_na_batida"})', + ach_cry_blurred_blurred_joker = "Obtenha um Curinga Borrado Borrado", + ach_cry_bullet_hell = "Tenha 15 Curingas AP", + ach_cry_break_infinity = "Pontue 1.79e308 Fichas em uma única mão", + ach_cry_cryptid_the_cryptid = "Use Criptídeo no Criptídeo", + ach_cry_exodia = "Tenha 5 Curingas Exóticos", + ach_cry_freak_house = "Jogue um Flush House consistindo de 6s e 9s de copas ao mesmo tempo que processa o Legal", + ach_cry_googol_play_pass = "Manipule uma Carta da Gugol Play", + ach_cry_haxxor = "Use um código de trapaça", + ach_cry_home_realtor = "Ative Casinha Feliz antes da aposta 8 (sem DoE/Antimatéria)", + ach_cry_jokes_on_you = "Ative o efeito da A Piada e ganhe a partida", + ach_cry_niw_uoy = "Alcançe a Aposta -8", + ach_cry_now_the_fun_begins = "Ontenha Tela", + ach_cry_patience_virtue = "Espere pelo Loop de Lavanda por 2 minutos antes de jogar a primeira mão e derrota-lo", + ach_cry_perfectly_balanced = "Vença o Baralho Muito Justo na Aposta Ascendente", + ach_cry_pull_request = "Tenha o ://COMETER invocar o mesmo Curinga que destruiu", + ach_cry_traffic_jam = "Vença todas os desafios da Hora do Rush", + ach_cry_ult_full_skip = "Vença na rodada 1", + ach_cry_used_crash = "Use ://CRASHAR", + ach_cry_what_have_you_done = "Delete or Sacrifique um Curinga Exótico", + ach_cry_pin = "Perca uma partica pelo Fixado", }, challenge_names = { c_cry_ballin = "Ballin'", - c_cry_boss_rush = "Enter the Gungeon", - c_cry_dagger_war = "Dagger War", - c_cry_joker_poker = "Joker Poker", - c_cry_onlycard = "Solo Card", + c_cry_boss_rush = "Entre na Gungeon", + c_cry_dagger_war = "Guerra das Adagas", + c_cry_joker_poker = "Curinga Poker", + c_cry_onlycard = "Carta Solo", c_cry_rng = "RNG", - c_cry_rush_hour = "Rush Hour I", - c_cry_rush_hour_ii = "Rush Hour II", - c_cry_rush_hour_iii = "Rush Hour III", - c_cry_sticker_sheet = "Sticker Sheet", - c_cry_sticker_sheet_plus = "Sticker Sheet+", + c_cry_rush_hour = "Hora do Rush I", + c_cry_rush_hour_ii = "Hora do Rush II", + c_cry_rush_hour_iii = "Hora do Rush III", + c_cry_sticker_sheet = "Folha de Adesivos", + c_cry_sticker_sheet_plus = "Folha de Adesivos+", }, dictionary = { --Settings Menu cry_set_features = "Features", cry_set_music = "Music", - cry_set_enable_features = "Select features to enable (applies on game restart):", + cry_set_enable_features = "Use this section to enable or disable entire Thematic Sets.", cry_feat_achievements = "Achievements", ["cry_feat_antimatter deck"] = "Antimatter Deck", cry_feat_blinds = "Blinds", @@ -3020,12 +4451,16 @@ return { cry_feat_tags = "Tags", cry_feat_sleeves = "Sleeves", cry_feat_spectrals = "Spectrals", + cry_feat_spooky = "Spooky Update", ["cry_feat_more stakes"] = "Stakes", cry_feat_vouchers = "Vouchers", cry_mus_jimball = "Jimball (Funkytown by Lipps Inc. - Copyrighted)", cry_mus_code = "Code Cards (://LETS_BREAK_THE_GAME by HexaCryonic)", cry_mus_exotic = "Exotic Jokers (Joker in Latin by AlexZGreat)", cry_mus_high_score = "High Score (Final Boss [For Your Computer] by AlexZGreat)", + cry_mus_alt_bg = "Background Music (by MathIsFun_)", + cry_family = "Family Friendly Mode", + cry_experimental = "Experimental Mode", k_cry_program_pack = "Program Pack", k_cry_meme_pack = "Meme Pack", @@ -3033,6 +4468,10 @@ return { cry_critical_hit_ex = "Critical Hit!", cry_critical_miss_ex = "Critical Miss!", + cry_potion1 = "-1 to all Hand Levels", + cry_potion2 = "X1.15 Blind size", + cry_potion3 = "-1 Hand and Discard", + cry_debuff_oldhouse = "No Full Houses", cry_debuff_oldarm = "Must play 4 or fewer cards", cry_debuff_oldpillar = "No Straights", @@ -3040,11 +4479,26 @@ return { cry_debuff_oldmark = "No hands containing a Pair", cry_debuff_obsidian_orb = "Applies abilities of all defeated bosses", + cry_tax_placeholder = "(X0.4 blind requirement)", + cry_joke_placeholder = "(multiple of 8)", + k_code = "Code", + k_content_set = "Thematic Set", + b_content_sets = "Thematic Sets", + --Why aren't these in vanilla? + b_tag = "Tag", + b_blind = "Blind", + + b_tarot_rate = "Tarot Rate", + b_planet_rate = "Planet Rate", + + k_unique = "Unique", b_code_cards = "Code Cards", + b_unique_cards = "Unique Cards", b_pull = "PULL", cry_hooked_ex = "Hooked!", k_end_blind = "End Blind", + k_cry_shiny = "Shiny", cry_code_rank = "ENTER RANK", cry_code_enh = "ENTER ENHANCEMENT", @@ -3062,12 +4516,20 @@ return { b_flip = "FLIP", b_merge = "MERGE", + cry_hand_bulwark = "Bulwark", + cry_hand_clusterfuck = "Clusterfuck", + cry_hand_ultpair = "Ultimate Pair", + + cry_asc_hands = "Asc. Hands", + cry_p_star = "Star", + cry_again_q = "Again?", cry_curse = "Curse", cry_curse_ex = "Curse!", cry_sobbing = "Help me...", cry_gaming = "Gaming", cry_gaming_ex = "Gaming!", + cry_good_luck_ex = "Good luck!", cry_sus_ex = "Impostor!", cry_jolly_ex = "Jolly Up!", cry_m_minus = "m", @@ -3075,6 +4537,8 @@ return { cry_m_ex = "M!", cry_minus_round = "-1 Round", cry_plus_cryptid = "+1 Cryptid", + cry_plus_card = "+1 Card", + cry_plus_code = "+1 Code", cry_no_triggers = "No triggers left!", cry_unredeemed = "Unredeemed...", cry_active = "Active", @@ -3084,19 +4548,52 @@ return { k_cry_epic = "Epic", k_cry_exotic = "Exotic", + k_cry_candy = "Candy", + k_cry_cursed = "Cursed", + k_planet_disc = "Circumstellar Disc", + k_planet_satellite = "Natural Satellites", + k_planet_universe = Cryptid_config.family_mode and "Universe" or "The Actual Fucking Universe", cry_notif_jimball_1 = "Jimball", cry_notif_jimball_2 = "Copyright Notice", cry_notif_jimball_d1 = 'Jimball plays the song "Funkytown",', cry_notif_jimball_d2 = "which is copyrighted and can't be", cry_notif_jimball_d3 = "used for streams and videos.", + + cry_gameset_explanation = { + "Select a gameset config option", + "to apply to this card.", + }, + cry_gameset_disabled = "Disabled", + cry_gameset_modest = "Modest", + cry_gameset_mainline = "Mainline", + cry_gameset_madness = "Madness", + cry_gameset_custom = "Modified", + cry_gameset_exp = "Experimental", + cry_gameset_exp_modest = "Experimental (Modest)", + cry_gameset_exp_mainline = "Experimental (Mainline)", + cry_gameset_exp_madness = "Experimental (Madness)", + + cry_view_set_contents = "View Items in Set", + + cry_sapling_an = "an", + cry_sapling_a = "a", + + b_reset_gameset_modest = "Reset Gameset Config (Modest)", + b_reset_gameset_mainline = "Reset Gameset Config (Mainline)", + b_reset_gameset_madness = "Reset Gameset Config (Madness)", }, labels = { food_jokers = "Food Jokers", banana = "Banana", + pinned = "Pinned", + cry_absolute = "Absolute", code = "Code", + unique = "Unique", cry_rigged = "Rigged", cry_hooked = "Hooked", + cry_flickering = "Flickering", + cry_possessed = "Possessed", cry_green_seal = "Green Seal", cry_azure_seal = "Azure Seal", @@ -3114,11 +4611,13 @@ return { k_cry_epic = "Epic", k_cry_exotic = "Exotic", + k_cry_candy = "Candy", + k_cry_cursed = "Cursed", }, rnj_loc_txts = { stats = { plus_mult = { "{C:red}+#2#{} Mult" }, - plus_chips = { "{C:blue}+#2#{} Chips" }, + plus_chips = { "{C:blue}+#2#{} Chip(s)" }, x_mult = { "{X:red,C:white} X#2#{} Mult" }, x_chips = { "{X:blue,C:white} X#2#{} Chips" }, h_size = { "{C:attention}+#2#{} Hand Size" }, @@ -3126,17 +4625,17 @@ return { }, stats_inactive = { plus_mult = { "{C:inactive}(Currently {C:red}+#1#{C:inactive} Mult)" }, - plus_chips = { "{C:inactive}(Currently {C:blue}+#1#{C:inactive} Chips)" }, + plus_chips = { "{C:inactive}(Currently {C:blue}+#1#{C:inactive} Chip(s))" }, x_mult = { "{C:inactive}(Currently {X:red,C:white} X#1# {C:inactive} Mult)" }, x_chips = { "{C:inactive}(Currently {X:blue,C:white} X#1# {C:inactive} Chips)" }, h_size = { "{C:inactive}(Currently {C:attention}+#1#{C:inactive} Hand Size)" }, money = { "{C:inactive}(Currently {C:money}+$#1#{C:inactive})" }, }, actions = { - make_joker = { "Create {C:attention}#2# Joker{}" }, - make_tarot = { "Create {C:attention}#2#{C:tarot} Tarot{} card" }, - make_planet = { "Create {C:attention}#2#{C:planet} Planet{} card" }, - make_spectral = { "Create {C:attention}#2#{C:spectral} Spectral{} card" }, + make_joker = { "Create {C:attention}#2# Joker(s){}" }, + make_tarot = { "Create {C:attention}#2#{C:tarot} Tarot{} card(s)" }, + make_planet = { "Create {C:attention}#2#{C:planet} Planet{} card(s)" }, + make_spectral = { "Create {C:attention}#2#{C:spectral} Spectral{} card(s)" }, add_dollars = { "Earn {C:money}$#2#{}" }, }, contexts = { @@ -3189,8 +4688,8 @@ return { poker_hand = { "if hand is a {C:attention}#3#{}" }, or_more = { "if hand contains {C:attention}#3#{} or more cards" }, or_less = { "if hand contains {C:attention}#3#{} or less cards" }, - hands_left = { "if #3# {C:blue}hands{} remaining at end of round" }, - discards_left = { "if #3# {C:red}discards{} remaining at end of round" }, + hands_left = { "if #3# {C:blue}hand(s){} remaining at end of round" }, + discards_left = { "if #3# {C:red}discard(s){} remaining at end of round" }, first_discard = { "if it's the {C:attention}first {C:attention}discard{}" }, last_discard = { "if it's the {C:attention}last {C:attention}discard{}" }, odds = { "with a {C:green}#4# {C:green}in {C:green}#3#{} chance" }, @@ -3202,14 +4701,16 @@ return { a_powchips = { "^#1# Chips" }, a_powmultchips = { "^#1# Mult+Chips" }, a_round = { "+#1# Round" }, + a_candy = { "+#1# Candy" }, a_xchips_minus = { "-X#1# Chips" }, a_powmult_minus = { "-^#1# Mult" }, a_powchips_minus = { "-^#1# Chips" }, a_powmultchips_minus = { "-^#1# Mult+Chips" }, a_round_minus = { "-#1# Round" }, - - a_tag = { "#1# Tag" }, - a_tags = { "#1# Tags" }, + a_tag_minus = { "-#1# Tag" }, + a_tags_minus = { "-#1# Tags" }, + a_tag = { "+#1# Tag" }, + a_tags = { "+#1# Tags" }, cry_sticker_name = { "#1# Sticker" }, cry_sticker_desc = { @@ -3217,6 +4718,10 @@ return { "to win on #2##1#", "#2#Stake#3# difficulty", }, + + cry_art = { "Art: #1#" }, + cry_code = { "Code: #1#" }, + cry_idea = { "Idea: #1#" }, }, v_text = { ch_c_cry_all_perishable = { "All Jokers are {C:eternal}Perishable{}" }, @@ -3280,17 +4785,33 @@ return { { "FREE EXOTICS", "GET THEM BEFORE ITS", "TOO LATE (sold out)" }, { "PROVE THEM WRONG", "BUY BUYING AN INVISIBLE", "VOUCHER FOR $10" }, { "", "no vouchers?", "" }, - { "see this ad?", "if you are, then it's working", "and you could have it for your own" }, + { + "see this ad?", + "if you are, then it's working", + "and you could have it for your own", + }, { "YOU'RE MISSING OUT ON", "AT LEAST 5 VOUCHERS RIGHT NOW", "tonktonktonktonktonk" }, { "10", "20 NO VOUCHER XD", "30 GOTO 10" }, { "VOUCHERS", "ARE A PREMIUM FEATURE", "$199.99 JOLLARS TO UNLOCK" }, { "TRUE VOUCHERLESS!?!?", "ASCENDANT STAKE ONLY", "VERY FAIR DECK" }, { "ENJOYING YOUR", "VOUCHER EXPERIENCE? GIVE US A", "FIVE STAR RATING ON JESTELP" }, - { "FREE VOUCHERS", "HOT VOUCHERS NEAR YOU", "GET VOUCHERS QUICK WITH THIS ONE TRICK" }, + { + "FREE VOUCHERS", + "HOT VOUCHERS NEAR YOU", + "GET VOUCHERS QUICK WITH THIS ONE TRICK", + }, { "INTRODUCING", "THE VERY FIRST TIER 0 VOUCHER!", "(coming to Cryptid 1.0 soon)" }, - { "A VOUCHER!", "IT'S JUST IMAGINARY", "WE IMAGINED YOU WOULD WANT IT, THAT IS" }, + { + "A VOUCHER!", + "IT'S JUST IMAGINARY", + "WE IMAGINED YOU WOULD WANT IT, THAT IS", + }, { "TURN OFF ADBLOCKER", "WITHOUT ADS, WE WOULDN'T", "BE ABLE TO SELL YOU VOUCHERS" }, - { "IF YOU HAVE", "A PROBLEM WITH THIS", "EMAIL IT TO US AT NORESPONSE@JMAIL.COM" }, + { + "IF YOU HAVE", + "A PROBLEM WITH THIS", + "EMAIL IT TO US AT NORESPONSE@JMAIL.COM", + }, { "NOT ENOUGH MONEY", "TO BUY THIS VOUCHER", "SO WHY WOULD WE PUT IT HERE?" }, { "WANT A VOUCHER?", "WELL SHUT UP", "YOU CAN'T HAVE ANY LOL" }, { "^$%& NO", "VOUCHERS ^%&% %&$^% FOR", "$%&%%$ %&$&*%$^ YOU" }, diff --git a/Cryptid/localization/ru.lua b/Cryptid/localization/ru.lua index 2596d7f..10565cf 100644 --- a/Cryptid/localization/ru.lua +++ b/Cryptid/localization/ru.lua @@ -170,7 +170,7 @@ return { name = "Часы", text = { "+0.1X минимум очков каждые", - "3 секунды в этом анте", + "12 секунды в этом анте", }, }, bl_cry_hammer = { @@ -198,7 +198,7 @@ return { name = "Лавандовый круг", text = { "1.25X минимум очков каждые", - "1.5 секунды потраченные в этом раунде", + "6 секунды потраченные в этом раунде", }, }, bl_cry_obsidian_orb = { diff --git a/Cryptid/localization/vi.lua b/Cryptid/localization/vi.lua index bf70d21..0da796f 100644 --- a/Cryptid/localization/vi.lua +++ b/Cryptid/localization/vi.lua @@ -197,7 +197,7 @@ return { bl_cry_clock = { name = "The Clock", text = { - "+0.1X điểm yêu cầu mỗi 3 giây", + "+0.1X điểm yêu cầu mỗi 12 giây", "đã trôi trong ante này", }, }, @@ -225,7 +225,7 @@ return { bl_cry_lavender_loop = { name = "Lavender Loop", text = { - "1.25X điểm yêu cầu mỗi 1.5 giây", + "1.25X điểm yêu cầu mỗi 6 giây", "đã trôi trong ván này", }, }, @@ -1610,10 +1610,11 @@ return { j_cry_kidnap = { name = "Bắt Cóc", text = { - "Nhận {C:money}$#2#{} ở cuối ván", + "Nhận {C:money}$#1#{} ở cuối ván", "Tiền thưởng tăng thêm {C:money}$#1#{}", "khi một Joker {C:attention}+Nhân Tay Bài{} hoặc", "{C:attention}+Chip Tay Bài{} được bán", + "{C:inactive}(Hiện tại là {C:money}$#2#{C:inactive})", }, }, j_cry_kooky = { @@ -2692,8 +2693,8 @@ return { text = { "{S:0.8}({S:0.8,V:1}lvl.#1#{S:0.8}){}", "Nâng sức mạnh cho", - "các tay bài {C:attention}Thăng Thiên{} lên {X:gold,C:white}0.05{}", - "{C:inactive}(Hiện tại là {X:gold,C:white}X(#2#^asc){C:inactive})", + "các tay bài {C:attention}Thăng Thiên{} lên {X:gold,C:white}#2#{}", + "{C:inactive}(Hiện tại là {X:gold,C:white}X(#3#^asc){C:inactive})", }, }, }, @@ -3986,7 +3987,7 @@ return { }, }, p_cry_empowered = { - name = "Gói Siêu Linh [Nhãn Siêu Cường]", + name = "Nhãn Siêu Cường", text = { "Chọn {C:attention}#1#{} trong tối đa", "{C:attention}#2#{} lá {C:spectral}Siêu Linh", diff --git a/Cryptid/localization/zh_CN.lua b/Cryptid/localization/zh_CN.lua index 8a8f105..d50f83d 100644 --- a/Cryptid/localization/zh_CN.lua +++ b/Cryptid/localization/zh_CN.lua @@ -474,7 +474,7 @@ return { bl_cry_lavender_loop = { name = "薰衣草环", text = { - "在boss回合中每经过1.5秒", + "在boss回合中每经过6秒", "盲注要求增加1.25倍", }, }, @@ -1588,6 +1588,7 @@ return { j_cry_kidnap = { name = "绑架", text = { + "{C:red}Outdated Description{}", "每回合结尾获得{C:money}$#2#{}", "每卖掉一张{C:attention}倍率{}或者{C:attention}筹码{}小丑时", "增加{C:money}$#1#{}", @@ -2867,8 +2868,8 @@ return { text = { "{S:0.8}({S:0.8,V:1}等级.#1#{S:0.8}){}", "使{C:attention}晋升{}牌型的指数", - "增加{X:gold,C:white}0.05{}", - "{C:inactive}(目前指数 {X:gold,C:white}X(#2#^晋升数){C:inactive})", + "增加{X:gold,C:white}#2#{}", + "{C:inactive}(目前指数 {X:gold,C:white}X(#3#^晋升数){C:inactive})", }, }, }, diff --git a/Cryptid/localization/zh_TW.lua b/Cryptid/localization/zh_TW.lua index cc5579c..579a341 100644 --- a/Cryptid/localization/zh_TW.lua +++ b/Cryptid/localization/zh_TW.lua @@ -138,7 +138,7 @@ return { name = "The Clock", text = { "+0.1X blind requirements every", - "3 seconds spent this ante", + "12 seconds spent this ante", }, }, bl_cry_hammer = { @@ -166,7 +166,7 @@ return { name = "Lavender Loop", text = { "1.25X blind requirements every", - "1.5 seconds spent this round", + "6 seconds spent this round", }, }, bl_cry_obsidian_orb = { diff --git a/Cryptid/lovely/Ascended.toml b/Cryptid/lovely/Ascended.toml index bfdd552..70e5d2a 100644 --- a/Cryptid/lovely/Ascended.toml +++ b/Cryptid/lovely/Ascended.toml @@ -39,7 +39,7 @@ G.GAME.hands[text].played_this_round = G.GAME.hands[text].played_this_round + 1 ''' position = "before" payload = ''' -if G.GAME.current_round.current_hand.cry_asc_num > (G.GAME.cry_exploit_override and 1 or 0) then +if G.GAME.current_round.current_hand.cry_asc_num and (((type(G.GAME.current_round.current_hand.cry_asc_num) == "table" and G.GAME.current_round.current_hand.cry_asc_num:gt(to_big(G.GAME.cry_exploit_override and 1 or 0)) or G.GAME.current_round.current_hand.cry_asc_num > (G.GAME.cry_exploit_override and 1 or 0)))) then G.GAME.cry_asc_played = G.GAME.cry_asc_played and G.GAME.cry_asc_played+1 or 1 end ''' diff --git a/Cryptid/version b/Cryptid/version deleted file mode 100644 index d1d899f..0000000 --- a/Cryptid/version +++ /dev/null @@ -1 +0,0 @@ -0.5.5 diff --git a/Steamodded/.gitattributes b/Steamodded/.gitattributes new file mode 100644 index 0000000..94f480d --- /dev/null +++ b/Steamodded/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf \ No newline at end of file diff --git a/Steamodded/.github/.keep b/Steamodded/.github/.keep new file mode 100644 index 0000000..e69de29 diff --git a/Steamodded/.github/CODEOWNERS b/Steamodded/.github/CODEOWNERS new file mode 100644 index 0000000..972521c --- /dev/null +++ b/Steamodded/.github/CODEOWNERS @@ -0,0 +1,7 @@ +* @Aurelius7309 + +src/crash_handler.lua @WilsontheWolf +libs/https/ @WilsontheWolf +lovely/crash_handler.toml @WilsontheWolf +lovely/libs.toml @WilsontheWolf +lsp_def/ @GauntletGames-2086 \ No newline at end of file diff --git a/Steamodded/.github/pull_request_template.md b/Steamodded/.github/pull_request_template.md new file mode 100644 index 0000000..c0bd60b --- /dev/null +++ b/Steamodded/.github/pull_request_template.md @@ -0,0 +1,7 @@ + + +## Additional Info: + +- [ ] I didn't modify api's or I've made a PR to the [wiki repo](https://github.com/Steamodded/wiki). +- [ ] I didn't modify api's or I've updated lsp definitions. +- [ ] I didn't make new lovely files or all new lovely files have appropriate priority. diff --git a/Steamodded/.gitignore b/Steamodded/.gitignore new file mode 100644 index 0000000..d4de02f --- /dev/null +++ b/Steamodded/.gitignore @@ -0,0 +1,202 @@ +# Created by https://www.toptal.com/developers/gitignore/api/python +# Edit at https://www.toptal.com/developers/gitignore?templates=python + +*~ + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +## IntelliJ +/.idea/ +/shelf/ +/workspace.xml +/httpRequests/ +/dataSources/ +/dataSources.local.xml + +# End of https://www.toptal.com/developers/gitignore/api/python + +# Mac +.DS_Store + +/injector/steamodded_injector.dist/ +/injector/steamodded_injector.exe +/steamodded_injector.build/ +/steamodded_injector.dist/ +/steamodded_injector.onefile-build/ +/steamodded_injector.exe + +*.Identifier +core/EditionAPI.lua + +# LSP/Editor settings +.vscode +.luarc.json diff --git a/Steamodded/LICENSE b/Steamodded/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/Steamodded/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/smods/README.md b/Steamodded/README.md similarity index 100% rename from smods/README.md rename to Steamodded/README.md diff --git a/smods/assets/1x/default_achievements.png b/Steamodded/assets/1x/default_achievements.png similarity index 100% rename from smods/assets/1x/default_achievements.png rename to Steamodded/assets/1x/default_achievements.png diff --git a/smods/assets/1x/mod_tags.png b/Steamodded/assets/1x/mod_tags.png similarity index 100% rename from smods/assets/1x/mod_tags.png rename to Steamodded/assets/1x/mod_tags.png diff --git a/smods/assets/2x/default_achievements.png b/Steamodded/assets/2x/default_achievements.png similarity index 100% rename from smods/assets/2x/default_achievements.png rename to Steamodded/assets/2x/default_achievements.png diff --git a/smods/assets/2x/mod_tags.png b/Steamodded/assets/2x/mod_tags.png similarity index 100% rename from smods/assets/2x/mod_tags.png rename to Steamodded/assets/2x/mod_tags.png diff --git a/smods/assets/sounds/xchips.ogg b/Steamodded/assets/sounds/xchips.ogg similarity index 100% rename from smods/assets/sounds/xchips.ogg rename to Steamodded/assets/sounds/xchips.ogg diff --git a/smods/config.lua b/Steamodded/config.lua similarity index 100% rename from smods/config.lua rename to Steamodded/config.lua diff --git a/smods/icon.png b/Steamodded/icon.png similarity index 100% rename from smods/icon.png rename to Steamodded/icon.png diff --git a/smods/libs/https/luajit-curl.lua b/Steamodded/libs/https/luajit-curl.lua similarity index 100% rename from smods/libs/https/luajit-curl.lua rename to Steamodded/libs/https/luajit-curl.lua diff --git a/smods/libs/https/smods-https.lua b/Steamodded/libs/https/smods-https.lua similarity index 97% rename from smods/libs/https/smods-https.lua rename to Steamodded/libs/https/smods-https.lua index b3b6708..6bbd333 100644 --- a/smods/libs/https/smods-https.lua +++ b/Steamodded/libs/https/smods-https.lua @@ -231,7 +231,7 @@ if not isThread then -- In main thread sendMessageToConsole(msg.level, msg.logger .. "(" .. tostring(msg.id) .. ")", msg.msg) elseif msgType == "cb" then -- NOTE: cb removes the thread so it must be the last message t.cb(msg.code, msg.body, msg.headers) - threads[id] = nil + threads[msg.id] = nil end end end @@ -268,9 +268,10 @@ if not isThread then -- In main thread assert(type(cb) == "function", "Callback is not a function") checkAndHandleInput(url, options, true) -- That way we aren't erroring in the thread as much local thread = love.thread.newThread(getContent()) - local obj = {thread = thread, cb = cb, id = id} - threads[id] = obj - thread:start(userAgent, url, options, id) + local tID = tostring(id) + local obj = {thread = thread, cb = cb, id = tID} + threads[tID] = obj + thread:start(userAgent, url, options, tID) id = id + 1 end diff --git a/smods/libs/json/init.lua b/Steamodded/libs/json/init.lua similarity index 100% rename from smods/libs/json/init.lua rename to Steamodded/libs/json/init.lua diff --git a/smods/libs/json/json.lua b/Steamodded/libs/json/json.lua similarity index 100% rename from smods/libs/json/json.lua rename to Steamodded/libs/json/json.lua diff --git a/smods/libs/nativefs/LICENSE b/Steamodded/libs/nativefs/LICENSE similarity index 100% rename from smods/libs/nativefs/LICENSE rename to Steamodded/libs/nativefs/LICENSE diff --git a/smods/libs/nativefs/README.md b/Steamodded/libs/nativefs/README.md similarity index 100% rename from smods/libs/nativefs/README.md rename to Steamodded/libs/nativefs/README.md diff --git a/smods/libs/nativefs/icon.png b/Steamodded/libs/nativefs/icon.png similarity index 100% rename from smods/libs/nativefs/icon.png rename to Steamodded/libs/nativefs/icon.png diff --git a/smods/libs/nativefs/init.lua b/Steamodded/libs/nativefs/init.lua similarity index 100% rename from smods/libs/nativefs/init.lua rename to Steamodded/libs/nativefs/init.lua diff --git a/smods/libs/nativefs/manifest.json b/Steamodded/libs/nativefs/manifest.json similarity index 100% rename from smods/libs/nativefs/manifest.json rename to Steamodded/libs/nativefs/manifest.json diff --git a/smods/libs/nativefs/nativefs.lua b/Steamodded/libs/nativefs/nativefs.lua similarity index 100% rename from smods/libs/nativefs/nativefs.lua rename to Steamodded/libs/nativefs/nativefs.lua diff --git a/smods/localization/en-us.lua b/Steamodded/localization/en-us.lua similarity index 99% rename from smods/localization/en-us.lua rename to Steamodded/localization/en-us.lua index 19c68bf..e79f666 100644 --- a/smods/localization/en-us.lua +++ b/Steamodded/localization/en-us.lua @@ -197,6 +197,7 @@ return { b_unknown = 'Unknown', b_lovely_mod = '(Lovely Mod) ', b_by = ' By: ', + b_priority = 'Priority: ', b_config = "Config", b_additions = 'Additions', b_stickers = 'Stickers', diff --git a/smods/localization/es_419.lua b/Steamodded/localization/es_419.lua similarity index 100% rename from smods/localization/es_419.lua rename to Steamodded/localization/es_419.lua diff --git a/smods/localization/es_ES.lua b/Steamodded/localization/es_ES.lua similarity index 100% rename from smods/localization/es_ES.lua rename to Steamodded/localization/es_ES.lua diff --git a/smods/localization/fr.lua b/Steamodded/localization/fr.lua similarity index 100% rename from smods/localization/fr.lua rename to Steamodded/localization/fr.lua diff --git a/Steamodded/localization/ko.lua b/Steamodded/localization/ko.lua new file mode 100644 index 0000000..8a19411 --- /dev/null +++ b/Steamodded/localization/ko.lua @@ -0,0 +1,235 @@ +return { + descriptions = { + Other = { + load_success = { + text = { + "모드가 {C:green}성공적으로{}", + "로드 됐습니다!", + }, + }, + load_failure_d = { + text = { + "{C:attention}선행 모드{}가 없습니다!", + "#1#", + }, + }, + load_failure_c = { + text = { + "{C:attention}모드 충돌!", + "#1#", + }, + }, + load_failure_d_c = { + text = { + "{C:attention}선행 모드{}가 없습니다!", + "#1#", + "{C:attention}모드 충돌!", + "#2#", + }, + }, + load_failure_o = { + text = { + "{C:attention}버전이 너무 낮습니다!{}", + "Steamodded{ C:money}0.9.8{}이하의 버전은", + "더 이상 지원되지 않습니다.", + }, + }, + load_failure_i = { + text = { + "{C:attention}호환 오류!{}", + "Steamodded 버전 #1#을 요구하지만,", + "설치된 버전은 #2#입니다.", + }, + }, + load_failure_p = { + text = { + "{C:attention}프리픽스 충돌!{}", + "이 모드의 프리픽스가", + "다른 모드의 프리픽스와 같습니다", + "({C:attention}#1#{})", + }, + }, + load_failure_m = { + text = { + "{C:attention}메인 파일이 없습니다!{}", + "이 모드의 메인 파일을", + "찾을수가 없습니다.", + "({C:attention}#1#{})", + }, + }, + load_disabled = { + text = { + "이 모드는", + "{C:attention}비활성화{} 됐습니다!", + }, + }, + + -- card perma bonuses + card_extra_chips = { + text = { + "추가 칩 {C:chips}#1#{}개", + }, + }, + card_x_chips = { + text = { + "칩 {X:chips,C:white}X#1#{}개", + }, + }, + card_extra_x_chips = { + text = { + "추가 칩 {X:chips,C:white}X#1#{}개", + }, + }, + card_extra_mult = { + text = { + "{C:mult}#1#{} 추가 배수", + }, + }, + card_x_mult = { + text = { + "{X:mult,C:white}X#1#{} 배수", + }, + }, + card_extra_x_mult = { + text = { + "{X:mult,C:white}X#1#{} 추가 배수", + }, + }, + card_extra_p_dollars = { + text = { + "득점 시 {C:money}#1#{}", + }, + }, + card_extra_h_chips = { + text = { + "손에 남을 시 칩 {C:chips}#1#{}개", + }, + }, + card_h_x_chips = { + text = { + "손에 남을 시 칩 {X:chips,C:white}X#1#{}개", + }, + }, + card_extra_h_x_chips = { + text = { + "손에 남을 시 추가 칩 {X:chips,C:white}X#1#{}개", + }, + }, + card_extra_h_mult = { + text = { + "손에 남을 시 {C:mult}#1#{} 배수", + }, + }, + card_h_x_mult = { + text = { + "손에 남을 시 {X:mult,C:white}X#1#{} 배수", + }, + }, + card_extra_h_x_mult = { + text = { + "손에 남을 시 {X:mult,C:white}X#1#{} 추가 배수", + }, + }, + card_extra_h_dollars = { + text = { + "라운드 종료 시 {C:money}#1#{}", + }, + }, + }, + Edition = { + e_negative_playing_card = { + name = "네거티브", + text = { + "핸드 크기 {C:dark_edition}+#1#{}장", + }, + }, + }, + Enhanced = { + m_gold = { + name = "골드 카드", + text = { + "라운드 종료 시", + "이 카드가 손패에 남아 있으면", + "{C:money}$#1#{}를 획득합니다", + }, + }, + m_stone = { + name = "석재 카드", + text = { + "칩 {C:chips}+#1#{}개", + "랭크 또는 문양이 없습니다", + }, + }, + m_mult = { + name = "배수 카드", + text = { + "{C:mult}#1#{} 배수", + }, + }, + }, + }, + misc = { + achievement_names = { + hidden_achievement = "???", + }, + achievement_descriptions = { + hidden_achievement = "미발견", + }, + dictionary = { + b_mods = "모드", + b_mods_cap = "모드", + b_modded_version = "모드된 버전!", + b_steamodded = "Steamodded", + b_credits = "크레딧", + b_open_mods_dir = "모드 폴더 열기", + b_no_mods = "아무런 모드도 찾지 못했습니다...", + b_mod_list = "활성화된 모드들", + b_mod_loader = "모드 로더", + b_developed_by = "개발: ", + b_rewrite_by = "재개발: ", + b_github_project = "Github 프로젝트", + b_github_bugs_1 = "버그를 제보하거나", + b_github_bugs_2 = "코드에 기여할수 있습니다", + b_disable_mod_badges = "모드 배지 숨기기", + b_author = "제작자", + b_authors = "제작자", + b_unknown = "불명", + b_lovely_mod = "(Lovely Mod)", + b_by = " By: ", + b_config = "설정", + b_additions = "추가", + b_stickers = "스티커", + b_achievements = "업적", + b_applies_stakes_1 = "적용: ", + b_applies_stakes_2 = "", + b_graphics_mipmap_level = "밉맵 레벨", + b_browse = "Browse", -- Unused? Not sure what the context for this is + b_search_prompt = "모드 검색", + b_search_button = "검색", + b_seeded_unlocks = "시드런 언락", + b_seeded_unlocks_info = "시드런에서도 해금을 할수있습니다", + ml_achievement_settings = { + "비활성화", + "활성화", + "제한 무시", + }, + b_deckskins_lc = "저대비 색상", + b_deckskins_hc = "고대비 색상", + b_deckskins_def = "기본 색상", + }, + v_dictionary = { + c_types = "#1# 종류", + cashout_hidden = "...그리고 #1#개 더", + a_xchips = "칩 X#1# 개", + a_xchips_minus = "칩 -X#1# 개", + smods_version_mismatch = { + "이 런을 시작한 후 Steamodded의", + "버전이 바뀌었습니다!", + "계속 진행 할 경우 예상치 않은", + "오류가 발생할수 있습니다.", + "시작한 버전: #1#", + "현재 버전: #2#", + }, + }, + }, +} diff --git a/smods/localization/pt_BR.lua b/Steamodded/localization/pt_BR.lua similarity index 100% rename from smods/localization/pt_BR.lua rename to Steamodded/localization/pt_BR.lua diff --git a/smods/localization/zh_CN.lua b/Steamodded/localization/zh_CN.lua similarity index 100% rename from smods/localization/zh_CN.lua rename to Steamodded/localization/zh_CN.lua diff --git a/smods/lsp_def/classes/achievement.lua b/Steamodded/lsp_def/classes/achievement.lua similarity index 100% rename from smods/lsp_def/classes/achievement.lua rename to Steamodded/lsp_def/classes/achievement.lua diff --git a/smods/lsp_def/classes/atlas.lua b/Steamodded/lsp_def/classes/atlas.lua similarity index 100% rename from smods/lsp_def/classes/atlas.lua rename to Steamodded/lsp_def/classes/atlas.lua diff --git a/smods/lsp_def/classes/back.lua b/Steamodded/lsp_def/classes/back.lua similarity index 100% rename from smods/lsp_def/classes/back.lua rename to Steamodded/lsp_def/classes/back.lua diff --git a/smods/lsp_def/classes/blind.lua b/Steamodded/lsp_def/classes/blind.lua similarity index 95% rename from smods/lsp_def/classes/blind.lua rename to Steamodded/lsp_def/classes/blind.lua index c722d1d..4455507 100644 --- a/smods/lsp_def/classes/blind.lua +++ b/Steamodded/lsp_def/classes/blind.lua @@ -41,6 +41,7 @@ ---@field loc_vars? fun(self: SMODS.Blind|table): table? Provides control over displaying the Blind descriptions. See [SMODS.Blind `loc_vars` implementation](https://github.com/Steamodded/smods/wiki/SMODS.Blind#api-methods) documentation for return value details. ---@field collection_loc_vars? fun(self: SMODS.Blind|table): table? Provides control over displaying the Blind description in the collections menu. ---@field in_pool? fun(self: SMODS.Blind|table): boolean Allows configuring if the Blind is allowed to appear. +---@field calculate? fun(self: SMODS.Blind|table, blind: Blind|table, context: CalcContext|table): table?, boolean? Calculates effects based on parameters in `context`. See [SMODS calculation](https://github.com/Steamodded/smods/wiki/calculate_functions) docs for details. ---@overload fun(self: SMODS.Blind): SMODS.Blind SMODS.Blind = setmetatable({}, { __call = function(self) diff --git a/smods/lsp_def/classes/booster.lua b/Steamodded/lsp_def/classes/booster.lua similarity index 100% rename from smods/lsp_def/classes/booster.lua rename to Steamodded/lsp_def/classes/booster.lua diff --git a/smods/lsp_def/classes/center.lua b/Steamodded/lsp_def/classes/center.lua similarity index 100% rename from smods/lsp_def/classes/center.lua rename to Steamodded/lsp_def/classes/center.lua diff --git a/smods/lsp_def/classes/challenge.lua b/Steamodded/lsp_def/classes/challenge.lua similarity index 100% rename from smods/lsp_def/classes/challenge.lua rename to Steamodded/lsp_def/classes/challenge.lua diff --git a/smods/lsp_def/classes/consumable.lua b/Steamodded/lsp_def/classes/consumable.lua similarity index 100% rename from smods/lsp_def/classes/consumable.lua rename to Steamodded/lsp_def/classes/consumable.lua diff --git a/smods/lsp_def/classes/consumable_type.lua b/Steamodded/lsp_def/classes/consumable_type.lua similarity index 100% rename from smods/lsp_def/classes/consumable_type.lua rename to Steamodded/lsp_def/classes/consumable_type.lua diff --git a/smods/lsp_def/classes/deck_skin.lua b/Steamodded/lsp_def/classes/deck_skin.lua similarity index 100% rename from smods/lsp_def/classes/deck_skin.lua rename to Steamodded/lsp_def/classes/deck_skin.lua diff --git a/smods/lsp_def/classes/draw_step.lua b/Steamodded/lsp_def/classes/draw_step.lua similarity index 100% rename from smods/lsp_def/classes/draw_step.lua rename to Steamodded/lsp_def/classes/draw_step.lua diff --git a/smods/lsp_def/classes/edition.lua b/Steamodded/lsp_def/classes/edition.lua similarity index 95% rename from smods/lsp_def/classes/edition.lua rename to Steamodded/lsp_def/classes/edition.lua index a40b004..3b4c525 100644 --- a/smods/lsp_def/classes/edition.lua +++ b/Steamodded/lsp_def/classes/edition.lua @@ -34,6 +34,7 @@ ---@field on_load? fun(card: Card|table) Used to modify the card when a card with this Edition is loaded from a save. ---@field draw? fun(self: SMODS.Edition|table, card: Card|table, layer: string) Draws the edition's shader. By default, `self.shader` is drawn. ---@field get_edition_cards? fun(self: SMODS.Edition|table, card_area: CardArea|table, edition: boolean): table +---@field in_pool? fun(self: SMODS.Edition|table, args: table|{source: string}): boolean? Allows configuring if the edition is allowed to spawn. ---@overload fun(self: SMODS.Edition): SMODS.Edition SMODS.Edition = setmetatable({}, { __call = function(self) @@ -51,8 +52,9 @@ function Card:calculate_edition(context) end ---@param edition string|{[string]: true}? Both `string` values are the key of the edition to apply. ---@param immediate? boolean ---@param silent? boolean +---@param delay? boolean --- Sets the card's edition. -function Card:set_edition(edition, immediate, silent) end +function Card:set_edition(edition, immediate, silent, delay) end ---@param _key string Used as the seed ---@param _mod? number Scales the chance of landing on an Edition. diff --git a/smods/lsp_def/classes/enhancement.lua b/Steamodded/lsp_def/classes/enhancement.lua similarity index 100% rename from smods/lsp_def/classes/enhancement.lua rename to Steamodded/lsp_def/classes/enhancement.lua diff --git a/smods/lsp_def/classes/game_object.lua b/Steamodded/lsp_def/classes/game_object.lua similarity index 100% rename from smods/lsp_def/classes/game_object.lua rename to Steamodded/lsp_def/classes/game_object.lua diff --git a/smods/lsp_def/classes/gradient.lua b/Steamodded/lsp_def/classes/gradient.lua similarity index 100% rename from smods/lsp_def/classes/gradient.lua rename to Steamodded/lsp_def/classes/gradient.lua diff --git a/smods/lsp_def/classes/joker.lua b/Steamodded/lsp_def/classes/joker.lua similarity index 100% rename from smods/lsp_def/classes/joker.lua rename to Steamodded/lsp_def/classes/joker.lua diff --git a/smods/lsp_def/classes/keybind.lua b/Steamodded/lsp_def/classes/keybind.lua similarity index 100% rename from smods/lsp_def/classes/keybind.lua rename to Steamodded/lsp_def/classes/keybind.lua diff --git a/smods/lsp_def/classes/language.lua b/Steamodded/lsp_def/classes/language.lua similarity index 100% rename from smods/lsp_def/classes/language.lua rename to Steamodded/lsp_def/classes/language.lua diff --git a/smods/lsp_def/classes/object_type.lua b/Steamodded/lsp_def/classes/object_type.lua similarity index 100% rename from smods/lsp_def/classes/object_type.lua rename to Steamodded/lsp_def/classes/object_type.lua diff --git a/smods/lsp_def/classes/poker_hand.lua b/Steamodded/lsp_def/classes/poker_hand.lua similarity index 100% rename from smods/lsp_def/classes/poker_hand.lua rename to Steamodded/lsp_def/classes/poker_hand.lua diff --git a/smods/lsp_def/classes/rank.lua b/Steamodded/lsp_def/classes/rank.lua similarity index 100% rename from smods/lsp_def/classes/rank.lua rename to Steamodded/lsp_def/classes/rank.lua diff --git a/smods/lsp_def/classes/rarity.lua b/Steamodded/lsp_def/classes/rarity.lua similarity index 100% rename from smods/lsp_def/classes/rarity.lua rename to Steamodded/lsp_def/classes/rarity.lua diff --git a/smods/lsp_def/classes/seal.lua b/Steamodded/lsp_def/classes/seal.lua similarity index 100% rename from smods/lsp_def/classes/seal.lua rename to Steamodded/lsp_def/classes/seal.lua diff --git a/smods/lsp_def/classes/shader.lua b/Steamodded/lsp_def/classes/shader.lua similarity index 100% rename from smods/lsp_def/classes/shader.lua rename to Steamodded/lsp_def/classes/shader.lua diff --git a/smods/lsp_def/classes/sound.lua b/Steamodded/lsp_def/classes/sound.lua similarity index 100% rename from smods/lsp_def/classes/sound.lua rename to Steamodded/lsp_def/classes/sound.lua diff --git a/smods/lsp_def/classes/stake.lua b/Steamodded/lsp_def/classes/stake.lua similarity index 100% rename from smods/lsp_def/classes/stake.lua rename to Steamodded/lsp_def/classes/stake.lua diff --git a/smods/lsp_def/classes/sticker.lua b/Steamodded/lsp_def/classes/sticker.lua similarity index 100% rename from smods/lsp_def/classes/sticker.lua rename to Steamodded/lsp_def/classes/sticker.lua diff --git a/smods/lsp_def/classes/suit.lua b/Steamodded/lsp_def/classes/suit.lua similarity index 100% rename from smods/lsp_def/classes/suit.lua rename to Steamodded/lsp_def/classes/suit.lua diff --git a/smods/lsp_def/classes/tag.lua b/Steamodded/lsp_def/classes/tag.lua similarity index 100% rename from smods/lsp_def/classes/tag.lua rename to Steamodded/lsp_def/classes/tag.lua diff --git a/smods/lsp_def/classes/undiscovered_sprite.lua b/Steamodded/lsp_def/classes/undiscovered_sprite.lua similarity index 100% rename from smods/lsp_def/classes/undiscovered_sprite.lua rename to Steamodded/lsp_def/classes/undiscovered_sprite.lua diff --git a/smods/lsp_def/classes/voucher.lua b/Steamodded/lsp_def/classes/voucher.lua similarity index 100% rename from smods/lsp_def/classes/voucher.lua rename to Steamodded/lsp_def/classes/voucher.lua diff --git a/smods/lsp_def/lib/json.lua b/Steamodded/lsp_def/lib/json.lua similarity index 100% rename from smods/lsp_def/lib/json.lua rename to Steamodded/lsp_def/lib/json.lua diff --git a/smods/lsp_def/lib/lovely.lua b/Steamodded/lsp_def/lib/lovely.lua similarity index 100% rename from smods/lsp_def/lib/lovely.lua rename to Steamodded/lsp_def/lib/lovely.lua diff --git a/smods/lsp_def/lib/nativefs.lua b/Steamodded/lsp_def/lib/nativefs.lua similarity index 100% rename from smods/lsp_def/lib/nativefs.lua rename to Steamodded/lsp_def/lib/nativefs.lua diff --git a/smods/lsp_def/lib/smods-https.lua b/Steamodded/lsp_def/lib/smods-https.lua similarity index 100% rename from smods/lsp_def/lib/smods-https.lua rename to Steamodded/lsp_def/lib/smods-https.lua diff --git a/smods/lsp_def/core.lua b/Steamodded/lsp_def/smods_core.lua similarity index 100% rename from smods/lsp_def/core.lua rename to Steamodded/lsp_def/smods_core.lua diff --git a/smods/lsp_def/ui.lua b/Steamodded/lsp_def/ui.lua similarity index 100% rename from smods/lsp_def/ui.lua rename to Steamodded/lsp_def/ui.lua diff --git a/smods/lsp_def/utils.lua b/Steamodded/lsp_def/utils.lua similarity index 89% rename from smods/lsp_def/utils.lua rename to Steamodded/lsp_def/utils.lua index 5cdb238..b147df1 100644 --- a/smods/lsp_def/utils.lua +++ b/Steamodded/lsp_def/utils.lua @@ -58,6 +58,17 @@ ---@field modify_scoring_hand? true Check if `true` for modifying the scoring hand. ---@field ending_booster? true Check if `true` for effects after a Booster Pack ends. ---@field starting_shop? true Check if `true` for effects when the shop is first opened. +---@field blind_disabled? true Check if `true` for effects when the blind is disabled. +---@field blind_defeated? true Check if `true` for effects when the blind is disabled. +---@field press_play? true Check if `true` for effects when the Play button is pressed. +---@field debuff_card? Card|table The card being checked for if it should be debuffed. +---@field ignore_debuff? true Sets if `self.debuff` checks are ignored. +---@field debuff_hand? true Check if `true` for calculating if the played hand should be debuffed. +---@field check? true `true` when the blind is being checked for if it debuffs the played hand. +---@field stay_flipped? true Check if `true` for effects when a card is being drawn. +---@field to_area? CardArea|table CardArea the card is being drawn to. +---@field from_area? CardArea|table CardArea the card is being drawn from. +---@field modify_hand? true Check if `true` for modifying the chips and mult of the played hand. --- Util Functions @@ -71,16 +82,21 @@ function SMODS.merge_lists(...) end ---@field quantum_enhancements? boolean Enables "Quantum Enhancement" contexts. Cards can count as having multiple enhancements at once. ---@field retrigger_joker? boolean Enables "Joker Retrigger" contexts. Jokers can be retriggered by other jokers or effects. ---@field post_trigger? boolean Enables "Post Trigger" contexts. Allows calculating effects after a Joker has been calculated. ----@field cardarea? table Enables additional CardArea calculation. Currently supports: `deck`, `discards`, `unscored`. +---@field cardareas? SMODS.optional_features.cardareas Enables additional CardArea calculation. + +---@class SMODS.optional_features.cardareas: table +---@field deck? boolean Enables "Deck Calculation". Decks are included in calculation. +---@field discard? boolean Enables "Discard Calculation". Discarded cards are included in calculation. ---@type SMODS.optional_features -SMODS.optional_features = { cardarea = {} } +SMODS.optional_features = { cardareas = {} } --- Inserts all SMODS features enabled by loaded mods into `SMODS.optional_features`. function SMODS.get_optional_features() end ---@param context CalcContext|table ---@param return_table? table +---@return table --- Used to calculate contexts across `G.jokers`, `scoring_hand` (if present), `G.play` and `G.GAME.selected_back`. --- Hook this function to add different areas to MOST calculations function SMODS.calculate_context(context, return_table) end @@ -140,12 +156,12 @@ function SMODS.calculate_retriggers(card, context, _ret) end ---@return table[] reps function SMODS.calculate_repetitions(card, context, reps) end ----@param card Card|table ----@param blueprint_card Card|table +---@param copier Card|table +---@param copied_card Card|table ---@param context CalcContext|table ---@return table? ---- Calculates blueprint-like effects. -function SMODS.blueprint_effect(card, blueprint_card, context) end +--- Helper function to copy the ability of another joker. Useful for implementing Blueprint-like jokers. +function SMODS.blueprint_effect(copier, copied_card, context) end ---@param _type string ---@param _context string @@ -270,6 +286,16 @@ function SMODS.juice_up_blind() end ---@return string? msg If it failed, a message describing what went wrong. function SMODS.change_base(card, suit, rank) end +--- Modify a card's rank by the specified amount. +--- Increase rank if amount is positive, decrease rank if negative. +--- It is recommended to wrap this function in `assert` to prevent unnoticed errors. +---@nodiscard +---@param card Card|table +---@param amount number +---@return Card|table? cardOrErr If successful the card. If it failed `nil`. +---@return string? msg If it failed, a message describing what went wrong. +function SMODS.modify_rank(card, amount) end + ---@param key string ---@param count_debuffed true? ---@return Card[]|table[] @@ -285,6 +311,8 @@ function SMODS.find_card(key, count_debuffed) end ---@field soulable? boolean Card could be replace by a legendary version, if applicable. ---@field key? string Created card is forced to have a center matching this key. ---@field key_append? string Appends this string to seeds. +---@field discover? boolean Discovers the card when created. +---@field bypass_discovery_center? boolean Creates the card's proper sprites and UI even if it hasn't been discovered. ---@field no_edition? boolean Ignore natural edition application. ---@field edition? string Apply this edition. ---@field enhancement? string Apply this enhancement. diff --git a/smods/lsp_def/vanilla.lua b/Steamodded/lsp_def/vanilla.lua similarity index 91% rename from smods/lsp_def/vanilla.lua rename to Steamodded/lsp_def/vanilla.lua index 140d279..ee37946 100644 --- a/smods/lsp_def/vanilla.lua +++ b/Steamodded/lsp_def/vanilla.lua @@ -84,9 +84,31 @@ function AnimatedSprite:__call(...) return self end ---@overload fun(...: any): Blind|table Blind = {} function Blind:__call(...) return self end + ---@type Blind|table|nil G.GAME.blind = Blind() +---@param self Blind +---@param area CardArea +---@param card Card|table +---@param from_area CardArea +---@return boolean? +--- Determines if the card should stay flipped when drawn. +function Blind:stay_flipped(area, card, from_area) end + +---@param self Blind +---@param cards (Card|table)[] +---@param poker_hands table[] +---@param text string +---@param mult number +---@param hand_chips number +---@param scoring_hand (table|Card)[] +---@return number mult +---@return number hand_chips +---@return boolean modded +--- Calculates modifications of played hand. +function Blind:modify_hand(cards, poker_hands, text, mult, hand_chips, scoring_hand) end + ---@class Card: Moveable ---@field ability? table ---@field ignore_base_shader? table @@ -95,6 +117,7 @@ G.GAME.blind = Blind() Card = {} function Card:__call(...) return self end +---@param self Card ---@param vars_only? boolean Only return description values ---@return table # Becomes `loc_vars` if `vars_only` is `true`. ---@return table? man_start Only returns if `vars_only` is `true`. diff --git a/smods/manifest.json b/Steamodded/manifest.json similarity index 100% rename from smods/manifest.json rename to Steamodded/manifest.json diff --git a/smods/src/card_draw.lua b/Steamodded/src/card_draw.lua similarity index 97% rename from smods/src/card_draw.lua rename to Steamodded/src/card_draw.lua index 3223746..089e421 100644 --- a/smods/src/card_draw.lua +++ b/Steamodded/src/card_draw.lua @@ -147,7 +147,7 @@ SMODS.DrawStep { order = -10, func = function(self, layer) --Draw the main part of the card - if (self.edition and self.edition.negative) or (self.ability.name == 'Antimatter' and (self.config.center.discovered or self.bypass_discovery_center)) then + if (self.edition and self.edition.negative and not self.delay_edition) or (self.ability.name == 'Antimatter' and (self.config.center.discovered or self.bypass_discovery_center)) then self.children.center:draw_shader('negative', nil, self.ARGS.send_to_shader) elseif not self:should_draw_base_shader() then -- Don't render base dissolve shader. @@ -190,7 +190,7 @@ SMODS.DrawStep { order = 0, func = function(self, layer) --Draw the main part of the card - if (self.edition and self.edition.negative) or (self.ability.name == 'Antimatter' and (self.config.center.discovered or self.bypass_discovery_center)) then + if (self.edition and self.edition.negative and not self.delay_edition) or (self.ability.name == 'Antimatter' and (self.config.center.discovered or self.bypass_discovery_center)) then if self.children.front and (self.ability.delayed or (self.ability.effect ~= 'Stone Card' and not self.config.center.replace_base_card)) then self.children.front:draw_shader('negative', nil, self.ARGS.send_to_shader) end @@ -240,7 +240,7 @@ SMODS.DrawStep { key = 'edition', order = 20, func = function(self, layer) - if self.edition then + if self.edition and not self.delay_edition then for k, v in pairs(G.P_CENTER_POOLS.Edition) do if self.edition[v.key:sub(3)] and v.shader then if type(v.draw) == 'function' then diff --git a/smods/src/compat_0_9_8.lua b/Steamodded/src/compat_0_9_8.lua similarity index 100% rename from smods/src/compat_0_9_8.lua rename to Steamodded/src/compat_0_9_8.lua diff --git a/smods/src/core.lua b/Steamodded/src/core.lua similarity index 97% rename from smods/src/core.lua rename to Steamodded/src/core.lua index e44e824..3ae1296 100644 --- a/smods/src/core.lua +++ b/Steamodded/src/core.lua @@ -75,3 +75,5 @@ for _, path in ipairs { } do assert(load(NFS.read(SMODS.path..path), ('=[SMODS _ "%s"]'):format(path)))() end + +sendInfoMessage("Steamodded v" .. SMODS.version, "SMODS") diff --git a/smods/src/crash_handler.lua b/Steamodded/src/crash_handler.lua similarity index 100% rename from smods/src/crash_handler.lua rename to Steamodded/src/crash_handler.lua diff --git a/smods/src/game_object.lua b/Steamodded/src/game_object.lua similarity index 98% rename from smods/src/game_object.lua rename to Steamodded/src/game_object.lua index 91df256..df60641 100644 --- a/smods/src/game_object.lua +++ b/Steamodded/src/game_object.lua @@ -765,7 +765,7 @@ Set `prefix_config.key = false` on your object instead.]]):format(obj.key), obj. G.C.RARITY[self.key] = self.badge_colour -- Called every frame, moving deprecated prints here if self.gradient and type(self.gradient) == "function" then - sendWarnMessage(('Found `gradient` function on SMODS.Rarity object "%s". This field is deprecated; please use `SMODS.Gradient` API instead.'):format(obj.key), 'Rarity') + sendWarnMessage(('Found `gradient` function on SMODS.Rarity object "%s". This field is deprecated; please use `SMODS.Gradient` API instead.'):format(self.key), 'Rarity') end end, process_loc_text = function(self) @@ -1219,7 +1219,8 @@ Set `prefix_config.key = false` on your object instead.]]):format(obj.key), obj. context.other_consumeable.ability.consumeable.hand_type == context.scoring_name then return { - x_mult = card.ability.extra + x_mult = card.ability.extra, + message_card = context.other_consumeable, } end end, @@ -1893,7 +1894,7 @@ Set `prefix_config.key = false` on your object instead.]]):format(obj.key), obj. ignore = false }, next = {}, - prev = {}, + prev = nil, straight_edge = false, -- TODO we need a better system for what this is doing. -- We should allow setting a playing card's atlas and position to any values, @@ -1924,6 +1925,7 @@ Set `prefix_config.key = false` on your object instead.]]):format(obj.key), obj. self.id = self.max_id.value self.shorthand = self.shorthand or self.key self.sort_nominal = self.nominal + (self.face_nominal or 0) + self.prev = self.prev or {} if self:check_dependencies() and not self.obj_table[self.key] then self.obj_table[self.key] = self local j @@ -1939,18 +1941,19 @@ Set `prefix_config.key = false` on your object instead.]]):format(obj.key), obj. else table.insert(self.obj_buffer, self.key) end - for _,v in ipairs(self.next) do - local other = self.obj_table[v] - if other then - table.insert(other.prev, self.key) - end - end + end end, process_loc_text = function(self) SMODS.process_loc_text(G.localization.misc.ranks, self.key, self.loc_txt, 'name') end, inject = function(self) + for _,v in ipairs(self.next) do + local other = self.obj_table[v] + if other then + table.insert(other.prev, self.key) + end + end for _, suit in pairs(SMODS.Suits) do SMODS.inject_p_card(suit, self) end @@ -2075,20 +2078,7 @@ Set `prefix_config.key = false` on your object instead.]]):format(obj.key), obj. trigger = 'after', delay = 0.1, func = function() - local _card = G.hand.highlighted[i] - local rank_data = SMODS.Ranks[_card.base.value] - local behavior = rank_data.strength_effect or { fixed = 1, ignore = false, random = false } - local new_rank - if behavior.ignore or not next(rank_data.next) then - return true - elseif behavior.random then - -- TODO doesn't respect in_pool - new_rank = pseudorandom_element(rank_data.next, pseudoseed('strength')) - else - local ii = (behavior.fixed and rank_data.next[behavior.fixed]) and behavior.fixed or 1 - new_rank = rank_data.next[ii] - end - assert(SMODS.change_base(_card, nil, new_rank)) + assert(SMODS.modify_rank(G.hand.highlighted[i], 1)) return true end })) @@ -2585,7 +2575,7 @@ Set `prefix_config.key = false` on your object instead.]]):format(obj.key), obj. } SMODS.PokerHandPart { key = '_straight', - func = function(hand) return get_straight(hand, next(SMODS.find_card('j_four_fingers')) and 4 or 5, next(SMODS.find_card('j_shortcut'))) end + func = function(hand) return get_straight(hand, next(SMODS.find_card('j_four_fingers')) and 4 or 5, not not next(SMODS.find_card('j_shortcut'))) end } SMODS.PokerHandPart { key = '_flush', @@ -2821,8 +2811,11 @@ Set `prefix_config.key = false` on your object instead.]]):format(obj.key), obj. ( not self.sets or self.sets[center.set or {}]) and ( center[self.key..'_compat'] or -- explicit marker - (self.default_compat and not self.compat_exceptions[center.key]) or -- default yes with no exception - (not self.default_compat and self.compat_exceptions[center.key]) -- default no with exception + ( + center[self.key..'_compat'] == nil and + ((self.default_compat and not self.compat_exceptions[center.key]) or -- default yes with no exception + (not self.default_compat and self.compat_exceptions[center.key])) + ) -- default no with exception ) and (not self.needs_enable_flag or G.GAME.modifiers['enable_'..self.key]) then @@ -3033,6 +3026,14 @@ Set `prefix_config.key = false` on your object instead.]]):format(obj.key), obj. -- end -- }) + SMODS.Enhancement:take_ownership('glass', { + calculate = function(self, card, context) + if context.destroy_card and context.cardarea == G.play and context.destroy_card == card and pseudorandom('glass') < G.GAME.probabilities.normal/card.ability.extra then + return { remove = true } + end + end, + }) + ------------------------------------------------------------------------------------------------- ----- API CODE GameObject.Shader ------------------------------------------------------------------------------------------------- @@ -3278,6 +3279,16 @@ Set `prefix_config.key = false` on your object instead.]]):format(obj.key), obj. end } + SMODS.Keybind { + key_pressed = 'f5', + held_keys = { "lalt" }, + event = 'pressed', + action = function(self) + SMODS.save_all_config() + SMODS.restart_game() + end + } + ------------------------------------------------------------------------------------------------- ------- API CODE GameObject.Achievement ------------------------------------------------------------------------------------------------- diff --git a/smods/src/index.lua b/Steamodded/src/index.lua similarity index 100% rename from smods/src/index.lua rename to Steamodded/src/index.lua diff --git a/smods/src/loader.lua b/Steamodded/src/loader.lua similarity index 99% rename from smods/src/loader.lua rename to Steamodded/src/loader.lua index fb429d1..8c2da95 100644 --- a/smods/src/loader.lua +++ b/Steamodded/src/loader.lua @@ -231,7 +231,7 @@ function loadMods(modsDirectory) if v.check then v.check(mod, mod[k]) end end end) - if not success then + if not success then valid = false err = e end @@ -239,13 +239,13 @@ function loadMods(modsDirectory) if not valid then sendErrorMessage(('Found invalid metadata JSON file at %s, ignoring: %s'):format(file_path, err), 'Loader') else - sendInfoMessage('Valid JSON file found') + sendInfoMessage('Valid JSON file found', 'Loader') if NFS.getInfo(directory..'/.lovelyignore') then mod.disabled = true end if mod.prefix and used_prefixes[mod.prefix] then mod.can_load = false - mod.load_issues = { + mod.load_issues = { prefix_conflict = used_prefixes[mod.prefix], dependencies = {}, conflicts = {}, diff --git a/smods/src/logging.lua b/Steamodded/src/logging.lua similarity index 100% rename from smods/src/logging.lua rename to Steamodded/src/logging.lua diff --git a/smods/src/overrides.lua b/Steamodded/src/overrides.lua similarity index 93% rename from smods/src/overrides.lua rename to Steamodded/src/overrides.lua index 281ea3b..2d5cd4d 100644 --- a/smods/src/overrides.lua +++ b/Steamodded/src/overrides.lua @@ -559,12 +559,13 @@ function get_straight(hand, min_length, skip, wrap) end end end - local function next_ranks(key) + local function next_ranks(key, start) local rank = SMODS.Ranks[key] local ret = {} + if not start and not wrap and rank.straight_edge then return ret end for _,v in ipairs(rank.next) do ret[#ret+1] = v - if skip then + if skip and (wrap or not SMODS.Ranks[v].straight_edge) then for _,w in ipairs(SMODS.Ranks[v].next) do ret[#ret+1] = w end @@ -583,8 +584,8 @@ function get_straight(hand, min_length, skip, wrap) local new_tuples = {} for _, tuple in ipairs(tuples) do local any_tuple - if (not SMODS.Ranks[tuple[i-1]].straight_edge or i == 2 or wrap) and i ~= #hand+1 then - for _,l in ipairs(next_ranks(tuple[i-1])) do + if i ~= #hand+1 then + for _,l in ipairs(next_ranks(tuple[i-1], i == 2)) do if next(ranks[l]) then local new_tuple = {} for _,v in ipairs(tuple) do new_tuple[#new_tuple+1] = v end @@ -870,6 +871,21 @@ function G.UIDEF.view_deck(unplayed_only) end end + -- Add empty card area if there's none, to fix a visual issue with no cards left + if not next(deck_tables) then + local view_deck = CardArea( + G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, + 6.5*G.CARD_W, + 0.6*G.CARD_H, + {card_limit = 1, type = 'title', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.7, draw_layers = {'card'}}) + table.insert( + deck_tables, + {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={ + {n=G.UIT.O, config={object = view_deck}} + }} + ) + end + local flip_col = G.C.WHITE local suit_tallies = {} @@ -1369,7 +1385,8 @@ end -- OR another card's self.edition table -- immediate = boolean value -- silent = boolean value -function Card:set_edition(edition, immediate, silent) +function Card:set_edition(edition, immediate, silent, delay) + SMODS.enh_cache:write(self, nil) -- Check to see if negative is being removed and reduce card_limit accordingly if (self.added_to_deck or self.joker_added_to_deck_but_debuffed or (self.area == G.hand and not self.debuff)) and self.edition and self.edition.card_limit then if self.ability.consumeable and self.area == G.consumeables then @@ -1472,7 +1489,7 @@ function Card:set_edition(edition, immediate, silent) G.hand.config.real_card_limit = G.hand.config.real_card_limit + v end G.hand.config.card_limit = G.hand.config.card_limit + v - if not is_in_pack then + if not is_in_pack and G.GAME.blind.in_blind then G.FUNCS.draw_from_deck_to_hand(v) end return true @@ -1519,6 +1536,17 @@ function Card:set_edition(edition, immediate, silent) })) end + if delay then + self.delay_edition = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + self.delay_edition = nil + return true + end + })) + end + if G.jokers and self.area == G.jokers then check_for_unlock({ type = 'modify_jokers' }) end @@ -1542,7 +1570,8 @@ function poll_edition(_key, _mod, _no_neg, _guaranteed, _options) if _key == "wheel_of_fortune" or _key == "aura" then -- set base game edition polling else for _, v in ipairs(G.P_CENTER_POOLS.Edition) do - if v.in_shop then + local in_pool = (v.in_pool and type(v.in_pool) == "function") and v:in_pool({source = _key}) + if in_pool or v.in_shop then table.insert(_options, v.key) end end @@ -1582,7 +1611,7 @@ function poll_edition(_key, _mod, _no_neg, _guaranteed, _options) local weight_i = 0 for _, v in ipairs(available_editions) do weight_i = weight_i + v.weight * _modifier - -- sendDebugMessage(v.name.." weight is "..v.weight*_modifier) + -- sendDebugMessage(v.name.." weight is "..v.weight*_modifier, "EditionAPI") -- sendDebugMessage("Checking for "..v.name.." at "..(1 - (weight_i)/total_weight), "EditionAPI") if edition_poll > 1 - (weight_i) / total_weight then if not (v.name == 'e_negative' and _no_neg) then -- skip return if negative is selected and _no_neg is true @@ -1702,6 +1731,7 @@ end function Card:align_h_popup() local focused_ui = self.children.focused_ui and true or false local popup_direction = (self.children.buy_button or (self.area and self.area.config.view_deck) or (self.area and self.area.config.type == 'shop')) and 'cl' or + (self.T.y > G.CARD_H*0.8 and self.T.y < G.CARD_H*1.8) and ((self.T.x > G.ROOM.T.w*0.4) and "cl" or "cr") or (self.T.y < G.CARD_H*0.8) and 'bm' or 'tm' local sign = 1 @@ -1828,3 +1858,88 @@ G.FUNCS.change_colour_palette = function(args) end G:save_settings() end + +-- blind calc contexts +local disable = Blind.disable +function Blind:disable() + disable(self) + SMODS.calculate_context({ blind_disabled = true }) +end + +local defeat = Blind.defeat +function Blind:defeat(silent) + defeat(self, silent) + SMODS.calculate_context({ blind_defeated = true }) +end + +local press_play = Blind.press_play +function Blind:press_play() + local ret = press_play(self) + SMODS.calculate_context({ press_play = true }) + return ret +end + +local debuff_card = Blind.debuff_card +function Blind:debuff_card(card, from_blind) + local flags = SMODS.calculate_context({ debuff_card = card, ignore_debuff = true }) + if flags.prevent_debuff then + if card.debuff then card:set_debuff(false) end + return + elseif flags.debuff then + if not card.debuff then card:set_debuff(true) end + return + end + debuff_card(self, card, from_blind) +end + +local debuff_hand = Blind.debuff_hand +function Blind:debuff_hand(cards, hand, handname, check) + SMODS.hand_debuff_source = nil + local ret = debuff_hand(self, cards, hand, handname, check) + local _, _, _, scoring_hand = G.FUNCS.get_poker_hand_info(cards) + local final_scoring_hand = {} + for i=1, #cards do + local splashed = SMODS.always_scores(cards[i]) or next(find_joker('Splash')) + local unsplashed = SMODS.never_scores(cards[i]) + if not splashed then + for _, card in pairs(scoring_hand) do + if card == cards[i] then splashed = true end + end + end + local effects = {} + SMODS.calculate_context({modify_scoring_hand = true, other_card = cards[i], full_hand = cards, scoring_hand = scoring_hand}, effects) + local flags = SMODS.trigger_effects(effects, cards[i]) + if flags.add_to_hand then splashed = true end + if flags.remove_from_hand then unsplashed = true end + if splashed and not unsplashed then table.insert(final_scoring_hand, G.play.cards[i]) end + end + local flags = SMODS.calculate_context({ debuff_hand = true, full_hand = cards, scoring_hand = final_scoring_hand, poker_hands = hand, scoring_name = handname, check = check }) + if flags.prevent_debuff then return false end + if flags.debuff then + SMODS.debuff_text = flags.debuff_text + SMODS.hand_debuff_source = flags.debuff_source + return true + end + SMODS.debuff_text = nil + return ret +end + +local stay_flipped = Blind.stay_flipped +function Blind:stay_flipped(to_area, card, from_area) + local ret = stay_flipped(self, to_area, card, from_area) + local flags = SMODS.calculate_context({ to_area = to_area, from_area = from_area, other_card = card, stay_flipped = true }) + local self_eval, self_post = eval_card(card, { to_area = to_area, from_area = from_area, other_card = card, stay_flipped = true }) + local self_flags = SMODS.trigger_effects({ self_eval, self_post }) + for k,v in pairs(self_flags) do flags[k] = flags[k] or v end + if flags.prevent_stay_flipped then return false end + if flags.stay_flipped then return true end + return ret +end + +local modify_hand = Blind.modify_hand +function Blind:modify_hand(cards, poker_hands, text, mult, hand_chips, scoring_hand) + local modded + _G.mult, _G.hand_chips, modded = modify_hand(self, cards, poker_hands, text, mult, hand_chips, scoring_hand) + local flags = SMODS.calculate_context({ modify_hand = true, poker_hands = poker_hands, scoring_name = text, scoring_hand = scoring_hand, full_hand = cards }) + return _G.mult, _G.hand_chips, modded or flags.calculated +end diff --git a/smods/src/ui.lua b/Steamodded/src/ui.lua similarity index 99% rename from smods/src/ui.lua rename to Steamodded/src/ui.lua index 97a726a..1695f33 100644 --- a/smods/src/ui.lua +++ b/Steamodded/src/ui.lua @@ -659,7 +659,8 @@ function buildAchievementsTab(mod, current_page) return wrappedText end - local loc_target = (v.hidden_text and not v.earned) and {localize("hidden_achievement", 'achievement_descriptions')} or wrapText(localize(v.key, 'achievement_descriptions'), maxCharsPerLine) + local loc_target = (v.hidden_text and not v.earned) and {localize("hidden_achievement", 'achievement_descriptions')} or localize(v.key, 'achievement_descriptions') + if type(loc_target) == 'string' then loc_target = wrapText(loc_target, maxCharsPerLine) end local loc_name = (v.hidden_name and not v.earned) and localize("hidden_achievement", 'achievement_names') or localize(v.key, 'achievement_names') local ability_text = {} @@ -922,7 +923,7 @@ local function createClickableModBox(modInfo, scale) shadow = true, }, }) - end + end if modInfo.config_tab then table.insert(but.nodes[1].nodes[1].nodes, { n = G.UIT.O, @@ -931,6 +932,17 @@ local function createClickableModBox(modInfo, scale) } }) end + if not _RELEASE_MODE and modInfo.priority then + table.insert(but.nodes[1].nodes[2].nodes, { + n = G.UIT.T, + config = { + text = ('(%s%s) '):format(localize('b_priority'), number_format(modInfo.priority)), + scale = scale*0.8, + colour = version_col, + shadow = true, + }, + }) + end return { n = G.UIT.R, config = { padding = 0, align = "cm" }, diff --git a/smods/src/utils.lua b/Steamodded/src/utils.lua similarity index 72% rename from smods/src/utils.lua rename to Steamodded/src/utils.lua index 5a7c68c..c7575ce 100644 --- a/smods/src/utils.lua +++ b/Steamodded/src/utils.lua @@ -292,6 +292,50 @@ function SMODS.change_base(card, suit, rank) return card end +-- Modify a card's rank by the specified amount. +-- Increase rank if amount is positive, decrease rank if negative. +function SMODS.modify_rank(card, amount) + local rank_key = card.base.value + local rank_data = SMODS.Ranks[card.base.value] + if amount > 0 then + for _ = 1, amount do + local behavior = rank_data.strength_effect or { fixed = 1, ignore = false, random = false } + if behavior.ignore or not next(rank_data.next) then + break + elseif behavior.random then + rank_key = pseudorandom_element( + rank_data.next, + pseudoseed('strength'), + { in_pool = function(key) return SMODS.Ranks[key]:in_pool({ suit = card.base.suit}) end } + ) + else + local i = (behavior.fixed and rank_data.next[behavior.fixed]) and behavior.fixed or 1 + rank_key = rank_data.next[i] + end + rank_data = SMODS.Ranks[rank_key] + end + else + for _ = 1, -amount do + local behavior = rank_data.prev_behavior or { fixed = 1, ignore = false, random = false } + if not next(rank_data.prev) or behavior.ignore then + break + elseif behavior.random then + rank_key = pseudorandom_element( + rank_data.prev, + pseudoseed('weakness'), + { in_pool = function(key) return SMODS.Ranks[key]:in_pool({ suit = card.base.suit}) end } + ) + else + local i = (behavior.fixed and rank_data.prev[behavior.fixed]) and behavior.fixed or 1 + rank_key = rank_data.prev[i] + end + rank_data = SMODS.Ranks[rank_key] + end + end + + return SMODS.change_base(card, nil, rank_key) +end + -- Return an array of all (non-debuffed) jokers or consumables with key `key`. -- Debuffed jokers count if `count_debuffed` is true. -- This function replaces find_joker(); please use SMODS.find_card() instead @@ -300,9 +344,11 @@ function SMODS.find_card(key, count_debuffed) local results = {} if not G.jokers or not G.jokers.cards then return {} end for _, area in ipairs(SMODS.get_card_areas('jokers')) do - for _, v in pairs(area.cards) do - if v and type(v) == 'table' and v.config.center.key == key and (count_debuffed or not v.debuff) then - table.insert(results, v) + if area.cards then + for _, v in pairs(area.cards) do + if v and type(v) == 'table' and v.config.center.key == key and (count_debuffed or not v.debuff) then + table.insert(results, v) + end end end end @@ -317,8 +363,12 @@ function SMODS.create_card(t) t.area = G.consumeables end SMODS.bypass_create_card_edition = t.no_edition or t.edition + SMODS.bypass_create_card_discover = t.discover + SMODS.bypass_create_card_discovery_center = t.bypass_discovery_center local _card = create_card(t.set, t.area, t.legendary, t.rarity, t.skip_materialize, t.soulable, t.key, t.key_append) SMODS.bypass_create_card_edition = nil + SMODS.bypass_create_card_discover = nil + SMODS.bypass_create_card_discovery_center = nil -- Should this be restricted to only cards able to handle these -- or should that be left to the person calling SMODS.create_card to use it correctly? @@ -562,7 +612,7 @@ V_MT = { local minorWildcard = string.match(minor, '%*') local patchWildcard = string.match(patch, '%*') if (minorFull ~= "" and minor == "") or (patchFull ~= "" and patch == "") then - sendWarnMessage('Trailing dot found in version "' .. str .. '".') + sendWarnMessage('Trailing dot found in version "' .. str .. '".', "Utils") major, minor, patch = -1, 0, 0 end local t = { @@ -834,12 +884,14 @@ function Card:add_sticker(sticker, bypass_check) local sticker = SMODS.Stickers[sticker] if bypass_check or (sticker and sticker.should_apply and type(sticker.should_apply) == 'function' and sticker:should_apply(self, self.config.center, self.area, true)) then sticker:apply(self, true) + SMODS.enh_cache:write(self, nil) end end function Card:remove_sticker(sticker) if self.ability[sticker] then SMODS.Stickers[sticker]:apply(self, false) + SMODS.enh_cache:write(self, nil) end end @@ -862,7 +914,7 @@ function Card:can_calculate(ignore_debuff) end function Card:calculate_enhancement(context) - if not self:can_calculate() or self.ability.set ~= 'Enhanced' then return nil end + if self.ability.set ~= 'Enhanced' then return nil end local center = self.config.center if center.calculate and type(center.calculate) == 'function' then local o = center:calculate(self, context) @@ -877,49 +929,54 @@ function SMODS.get_enhancements(card, extra_only) if not SMODS.optional_features.quantum_enhancements or not G.hand then return not extra_only and card.ability.set == 'Enhanced' and { [card.config.center.key] = true } or {} end - if card.extra_enhancements and next(card.extra_enhancements) then - if extra_only then - local extras = copy_table(card.extra_enhancements) - extras[card.config.center.key] = nil - return extras + if not SMODS.enh_cache:read(card, extra_only) then + + local enhancements = {} + if card.config.center.key ~= "c_base" then + enhancements[card.config.center.key] = true end - return card.extra_enhancements - end - local enhancements = {} - if card.config.center.key ~= "c_base" and not extra_only then - enhancements[card.config.center.key] = true - end - local calc_return = {} - SMODS.calculate_context({other_card = card, check_enhancement = true, no_blueprint = true}, calc_return) - for _, eval in pairs(calc_return) do - for key, eval2 in pairs(eval) do - if type(eval2) == 'table' then - for key2, _ in pairs(eval2) do - if G.P_CENTERS[key2] then enhancements[key2] = true end + local calc_return = {} + SMODS.calculate_context({other_card = card, check_enhancement = true, no_blueprint = true}, calc_return) + for _, eval in pairs(calc_return) do + for key, eval2 in pairs(eval) do + if type(eval2) == 'table' then + for key2, _ in pairs(eval2) do + if G.P_CENTERS[key2] then enhancements[key2] = true end + end + else + if G.P_CENTERS[key] then enhancements[key] = true end end - else - if G.P_CENTERS[key] then enhancements[key] = true end end end + SMODS.enh_cache:write(card, enhancements) end - - if extra_only and enhancements[card.config.center.key] then - enhancements[card.config.center.key] = nil - end - if next(enhancements) then card.extra_enhancements = enhancements end - return enhancements + return SMODS.enh_cache:read(card, extra_only) end +SMODS.enh_cache = { + write = function(self, key, value) + self.data[key] = value + end, + read = function(self, key, extra_only) + if not self.data[key] then return end + local ret = copy_table(self.data[key]) + if extra_only then ret[key.config.center.key] = nil end + return ret + end, + clear = function(self) + self.data = setmetatable({}, { __mode = 'k' }) + end, +} +SMODS.enh_cache:clear() + function SMODS.has_enhancement(card, key) if card.config.center.key == key then return true end - card.extra_enhancements = nil local enhancements = SMODS.get_enhancements(card) if enhancements[key] then return true end return false end function SMODS.shatters(card) - card.extra_enhancements = nil local enhancements = SMODS.get_enhancements(card) for key, _ in pairs(enhancements) do if G.P_CENTERS[key].shatters or key == 'm_glass' then return true end @@ -928,30 +985,31 @@ end function SMODS.calculate_quantum_enhancements(card, effects, context) if not SMODS.optional_features.quantum_enhancements then return end + if context.extra_enhancement or context.check_enhancement or SMODS.extra_enhancement_calc_in_progress then return end context.extra_enhancement = true + SMODS.extra_enhancement_calc_in_progress = true local extra_enhancements = SMODS.get_enhancements(card, true) local old_ability = copy_table(card.ability) local old_center = card.config.center local old_center_key = card.config.center_key for k, _ in pairs(extra_enhancements) do if G.P_CENTERS[k] then - card:set_ability(G.P_CENTERS[k]) + card:set_ability(G.P_CENTERS[k], nil, 'quantum') card.ability.extra_enhancement = k local eval = eval_card(card, context) - table.insert(effects, 1, eval) + table.insert(effects, eval) end end card.ability = old_ability card.config.center = old_center card.config.center_key = old_center_key - card:set_sprites(old_center) context.extra_enhancement = nil + SMODS.extra_enhancement_calc_in_progress = nil end function SMODS.has_no_suit(card) local is_stone = false local is_wild = false - card.extra_enhancements = nil for k, _ in pairs(SMODS.get_enhancements(card)) do if k == 'm_stone' or G.P_CENTERS[k].no_suit then is_stone = true end if k == 'm_wild' or G.P_CENTERS[k].any_suit then is_wild = true end @@ -959,19 +1017,16 @@ function SMODS.has_no_suit(card) return is_stone and not is_wild end function SMODS.has_any_suit(card) - card.extra_enhancements = nil for k, _ in pairs(SMODS.get_enhancements(card)) do if k == 'm_wild' or G.P_CENTERS[k].any_suit then return true end end end function SMODS.has_no_rank(card) - card.extra_enhancements = nil for k, _ in pairs(SMODS.get_enhancements(card)) do if k == 'm_stone' or G.P_CENTERS[k].no_rank then return true end end end function SMODS.always_scores(card) - card.extra_enhancements = nil for k, _ in pairs(SMODS.get_enhancements(card)) do if k == 'm_stone' or G.P_CENTERS[k].always_scores then return true end end @@ -982,7 +1037,6 @@ function SMODS.always_scores(card) end end function SMODS.never_scores(card) - card.extra_enhancements = nil for k, _ in pairs(SMODS.get_enhancements(card)) do if G.P_CENTERS[k].never_scores then return true end end @@ -1020,7 +1074,7 @@ end local function bufferCardLimitForSmallDS(cards, scaleFactor) local cardCount = #cards if type(scaleFactor) ~= "number" or scaleFactor <= 0 then - sendWarnMessage("scaleFactor must be a positive number") + sendWarnMessage("scaleFactor must be a positive number", "Utils") return cardCount end -- Ensure card_limit is always at least the number of cards @@ -1101,8 +1155,8 @@ end -- This function handles the calculation of each effect returned to evaluate play. -- Can easily be hooked to add more calculation effects ala Talisman SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, from_edition) - if effect.card and effect.card ~= scored_card then juice_card(effect.card) end if (key == 'chips' or key == 'h_chips' or key == 'chip_mod') and amount then + if effect.card and effect.card ~= scored_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 @@ -1111,9 +1165,9 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f else if key ~= 'chip_mod' then if effect.chip_message then - card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.chip_message) + card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.chip_message) else - card_eval_status_text(scored_card or effect.card or effect.focus, 'chips', amount, percent) + card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'chips', amount, percent) end end end @@ -1122,6 +1176,7 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f end if (key == 'mult' or key == 'h_mult' or key == 'mult_mod') and amount then + if effect.card and effect.card ~= scored_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 @@ -1130,9 +1185,9 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f else if key ~= 'mult_mod' then if effect.mult_message then - card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.mult_message) + card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.mult_message) else - card_eval_status_text(scored_card or effect.card or effect.focus, 'mult', amount, percent) + card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'mult', amount, percent) end end end @@ -1141,18 +1196,20 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f end if (key == 'p_dollars' or key == 'dollars' or key == 'h_dollars') and amount then + if effect.card and effect.card ~= scored_card then juice_card(effect.card) end ease_dollars(amount) if not effect.remove_default_message then if effect.dollar_message then - card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.dollar_message) + card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.dollar_message) else - card_eval_status_text(scored_card or effect.card or effect.focus, 'dollars', amount, percent) + card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'dollars', amount, percent) end end return true end if (key == 'x_chips' or key == 'xchips' or key == 'Xchip_mod') and amount ~= 1 then + if effect.card and effect.card ~= scored_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 @@ -1161,9 +1218,9 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f else if key ~= 'Xchip_mod' then if effect.xchip_message then - card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.xchip_message) + card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.xchip_message) else - card_eval_status_text(scored_card or effect.card or effect.focus, 'x_chips', amount, percent) + card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'x_chips', amount, percent) end end end @@ -1172,6 +1229,7 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f end if (key == 'x_mult' or key == 'xmult' or key == 'Xmult' or key == 'x_mult_mod' or key == 'Xmult_mod') and amount ~= 1 then + if effect.card and effect.card ~= scored_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 @@ -1180,9 +1238,9 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f else if key ~= 'Xmult_mod' then if effect.xmult_message then - card_eval_status_text(scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.xmult_message) + card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect.xmult_message) else - card_eval_status_text(scored_card or effect.card or effect.focus, 'x_mult', amount, percent) + card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'x_mult', amount, percent) end end end @@ -1191,6 +1249,7 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f end if key == 'message' then + if effect.card and effect.card ~= scored_card then juice_card(effect.card) end card_eval_status_text(effect.message_card or effect.juice_card or scored_card or effect.card or effect.focus, 'extra', nil, percent, nil, effect) return true end @@ -1201,6 +1260,7 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f end if key == 'swap' then + if effect.card and effect.card ~= scored_card then juice_card(effect.card) end local old_mult = mult mult = mod_mult(hand_chips) hand_chips = mod_chips(old_mult) @@ -1209,6 +1269,7 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f end if key == 'level_up' then + if effect.card and effect.card ~= scored_card then juice_card(effect.card) end local hand_type = effect.level_up_hand or G.GAME.last_hand_played level_up_hand(scored_card, hand_type, effect.instant, type(amount) == 'number' and amount or 1) return true @@ -1222,34 +1283,56 @@ SMODS.calculate_individual_effect = function(effect, scored_card, key, amount, f SMODS.saved = amount return true end + + if key == 'effect' then + return true + end + + if key == 'remove' or key == 'prevent_debuff' or key == 'add_to_hand' or key == 'remove_from_hand' or key == 'stay_flipped' or key == 'prevent_stay_flipped' then + return key + end + + if key == 'debuff' then + return { [key] = amount, debuff_source = scored_card } + end + + if key == 'debuff_text' then + return { [key] = amount } + end end -- Used to calculate a table of effects generated in evaluate_play SMODS.trigger_effects = function(effects, card) + local ret = {} for i, effect_table in ipairs(effects) do for key, effect in pairs(effect_table) do if key ~= 'smods' then if type(effect) == 'table' then - local calc = SMODS.calculate_effect(effect, card, key == 'edition') - if calc then effects.calculated = true end + local calc = SMODS.calculate_effect(effect, effect.scored_card or card, key == 'edition') + for k,v in pairs(calc) do ret[k] = v end end end end end + return ret end SMODS.calculate_effect = function(effect, scored_card, from_edition, pre_jokers) - local calculated = false + local ret = {} for _, key in ipairs(SMODS.calculation_keys) do if effect[key] then if effect.juice_card then G.E_MANAGER:add_event(Event({trigger = 'immediate', func = function () effect.juice_card:juice_up(0.1); scored_card:juice_up(0.1); return true end})) end - calculated = SMODS.calculate_individual_effect(effect, scored_card, key, effect[key], from_edition, pre_jokers) + local calc = SMODS.calculate_individual_effect(effect, scored_card, key, effect[key], from_edition) + if calc == true then ret.calculated = true end + if type(calc) == 'string' then + ret[calc] = true + elseif type(calc) == 'table' then + for k,v in pairs(calc) do ret[k] = v end + end percent = (percent or 0) + (percent_delta or 0.08) end end - if effect.effect then calculated = true end - if effect.remove then calculated = true end - return calculated + return ret end SMODS.calculation_keys = { @@ -1259,55 +1342,105 @@ SMODS.calculation_keys = { 'x_mult', 'Xmult', 'xmult', 'x_mult_mod', 'Xmult_mod', 'p_dollars', 'dollars', 'h_dollars', 'swap', + 'saved', 'effect', 'remove', + 'debuff', 'prevent_debuff', 'debuff_text', + 'add_to_hand', 'remove_from_hand', + 'stay_flipped', 'prevent_stay_flipped', 'message', 'level_up', 'func', 'extra', - 'saved' } +SMODS.insert_repetitions = function(ret, eval, effect_card, _type) + repeat + eval.repetitions = eval.repetitions or 0 + if eval.repetitions <= 0 then + sendWarnMessage('Found effect table with no assigned repetitions during repetition check') + end + local effect = {} + for k,v in pairs(eval) do + if k ~= 'extra' then effect[k] = v end + end + if _type == 'joker_retrigger' then + effect.retrigger_card = effect_card + effect.message_card = effect.message_card or effect_card + elseif _type == 'individual_retrigger' then + effect.retrigger_card = effect_card.object + effect.message_card = effect.message_card or effect_card.scored_card + elseif not _type then + effect.card = effect.card or effect_card + end + effect.message = effect.message or (not effect.remove_default_message and localize('k_again_ex')) + for h=1, effect.repetitions do + table.insert(ret, { key = effect}) + end + eval = eval.extra + until not eval +end + SMODS.calculate_repetitions = function(card, context, reps) -- From the card context.repetition_only = true local eval = eval_card(card, context) - for key, value in pairs(eval) do - if value.repetitions then - for h=1, value.repetitions do - value.card = value.card or card - value.message = value.message or (not value.remove_default_message and localize('k_again_ex')) - reps[#reps+1] = {key = value} - end + for _, value in pairs(eval) do + SMODS.insert_repetitions(reps, value, card) + end + -- Quantum enhancement support :cat_owl: + local quantum_eval = {} + SMODS.calculate_quantum_enhancements(card, quantum_eval, context) + for _, eval in ipairs(quantum_eval) do + for _, value in pairs(eval) do + SMODS.insert_repetitions(reps, value, card) end end - context.repetition_only = false + context.repetition_only = nil --From jokers for _, area in ipairs(SMODS.get_card_areas('jokers')) do for _, _card in ipairs(area.cards) do - --calculate the joker effects + --calculate the joker effects local eval, post = eval_card(_card, context) if next(post) then SMODS.trigger_effects({post}, card) end - local rt = eval and eval.retriggers and #eval.retriggers or 0 for key, value in pairs(eval) do - if value.repetitions and key ~= 'retriggers' then - - for h=1, value.repetitions do - value.card = value.card or _card - value.message = value.message or (not value.remove_default_message and localize('k_again_ex')) - reps[#reps+1] = {key = value} - for i=1, rt do - local rt_eval, rt_post = eval_card(_card, context) - rt_eval.card = rt_eval.card or _card - reps[#reps+1] = {key = value} - if next(rt_post) then SMODS.trigger_effects({rt_post}, card) end + if key ~= 'retriggers' then + SMODS.insert_repetitions(reps, value, _card) + end + end + if eval.retriggers then + context.retrigger_joker = true + for rt = 1, #eval.retriggers do + context.retrigger_joker = eval.retriggers[rt].retrigger_card + local rt_eval, rt_post = eval_card(_card, context) + if next(rt_post) then SMODS.trigger_effects({rt_post}, card) end + for key, value in pairs(rt_eval) do + if key ~= 'retriggers' then + SMODS.insert_repetitions(reps, value, _card) end end end + context.retrigger_joker = nil end end end - local effect = G.GAME.selected_back:trigger_effect(context) - if effect and effect.repetitions then - for h=1, effect.repetitions do - effect.card = effect.card or G.deck.cards[1] or G.deck - reps[#reps+1] = {key = effect} + for _, area in ipairs(SMODS.get_card_areas('individual')) do + local eval, post = SMODS.eval_individual(area, context) + if next(post) then SMODS.trigger_effects({post}, card) end + for key, value in pairs(eval) do + if key ~= 'retriggers' then + SMODS.insert_repetitions(reps, value, area.scored_card) + end + end + if eval.retriggers then + context.retrigger_joker = true + for rt = 1, #eval.retriggers do + context.retrigger_joker = eval.retriggers[rt].retrigger_card + local rt_eval, rt_post = SMODS.eval_individual(area, context) + if next(rt_post) then SMODS.trigger_effects({rt_post}, card) end + for key, value in pairs(rt_eval) do + if key ~= 'retriggers' then + SMODS.insert_repetitions(reps, value, area.scored_card) + end + end + end + context.retrigger_joker = nil end end return reps @@ -1321,29 +1454,25 @@ SMODS.calculate_retriggers = function(card, context, _ret) local eval, post = eval_card(_card, {retrigger_joker_check = true, other_card = card, other_context = context, other_ret = _ret}) if next(post) then SMODS.trigger_effects({post}, _card) end for key, value in pairs(eval) do - if value.repetitions then - for h=1, value.repetitions do - value.retrigger_card = _card - value.message_card = value.message_card or _card - value.message = value.message or (not value.remove_default_message and localize('k_again_ex')) - retriggers[#retriggers + 1] = value - end - end + SMODS.insert_repetitions(retriggers, value, _card, 'joker_retrigger') end end end - local deck_effect = G.GAME.selected_back:trigger_effect({retrigger_joker_check = true, other_card = card, other_context = context, other_ret = _ret}) - if deck_effect and deck_effect.repetitions then - deck_effect.retrigger_card = G.GAME.selected_back - deck_effect.message_card = deck_effect.message_card or G.deck.cards[1] or G.deck - deck_effect.message = deck_effect.message or (not deck_effect.remove_default_message and localize('k_again_ex')) - retriggers[#retriggers + 1] = deck_effect + + for _, area in ipairs(SMODS.get_card_areas('individual')) do + local eval, post = SMODS.eval_individual(area, {retrigger_joker_check = true, other_card = card, other_context = context, other_ret = _ret}) + if next(post) then SMODS.trigger_effects({post}, _card) end + for key, value in pairs(eval) do + if value.repetitions then + SMODS.insert_repetitions(retriggers, value, area, 'individual_retrigger') + end + end end + return retriggers end function Card:calculate_edition(context) - if not self:can_calculate() then return end if self.edition then local edition = G.P_CENTERS[self.edition.key] if edition.calculate and type(edition.calculate) == 'function' then @@ -1354,100 +1483,140 @@ function Card:calculate_edition(context) end end end +end + +function SMODS.calculate_card_areas(_type, context, return_table, args) + local flags = {} + if _type == 'jokers' then + for _, area in ipairs(SMODS.get_card_areas('jokers')) do + if args and args.joker_area and not args.has_area then context.cardarea = area end + for _, _card in ipairs(area.cards) do + --calculate the joker effects + local eval, post = eval_card(_card, context) + if args and args.main_scoring and eval.jokers then + eval.jokers.juice_card = eval.jokers.juice_card or eval.jokers.card or _card + eval.jokers.message_card = eval.jokers.message_card or eval.jokers.card or context.other_card + end + + local effects = {eval} + for _,v in ipairs(post) do effects[#effects+1] = v end + + if context.other_joker then + for k, v in pairs(effects[1]) do + v.other_card = _card + end + end + + if eval.retriggers then + context.retrigger_joker = true + for rt = 1, #eval.retriggers do + context.retrigger_joker = eval.retriggers[rt].retrigger_card + local rt_eval, rt_post = eval_card(_card, context) + if args and args.main_scoring and rt_eval.jokers then + rt_eval.jokers.juice_card = rt_eval.jokers.juice_card or rt_eval.jokers.card or _card + rt_eval.jokers.message_card = rt_eval.jokers.message_card or rt_eval.jokers.card or context.other_card + end + table.insert(effects, {eval.retriggers[rt]}) + table.insert(effects, rt_eval) + for _,v in ipairs(rt_post) do effects[#effects+1] = v end + end + context.retrigger_joker = nil + end + if return_table then + for _,v in ipairs(effects) do + if v.jokers and not v.jokers.card then v.jokers.card = _card end + return_table[#return_table+1] = v + end + else + local f = SMODS.trigger_effects(effects, _card) + for k,v in pairs(f) do flags[k] = v end + end + end + end + end + + if _type == 'playing_cards' then + local scoring_map = {} + if context.scoring_hand then + for _,v in ipairs(context.scoring_hand) do scoring_map[v] = true end + end + for _, area in ipairs(SMODS.get_card_areas('playing_cards')) do + if area == G.play and not context.scoring_hand then goto continue end + if not args or not args.has_area then context.cardarea = area end + for _, card in ipairs(area.cards) do + if not args or not args.has_area then + if area == G.play then + context.cardarea = SMODS.in_scoring(card, context.scoring_hand) and G.play or 'unscored' + elseif scoring_map[card] then + context.cardarea = G.play + else + context.cardarea = area + end + end + --calculate the played card effects + if return_table then + return_table[#return_table+1] = eval_card(card, context) + SMODS.calculate_quantum_enhancements(card, return_table, context) + else + local effects = {eval_card(card, context)} + SMODS.calculate_quantum_enhancements(card, effects, context) + local f = SMODS.trigger_effects(effects, _card) + for k,v in pairs(f) do flags[k] = v end + end + end + ::continue:: + end + end + + if _type == 'individual' then + for _, area in ipairs(SMODS.get_card_areas('individual')) do + local eval, post = SMODS.eval_individual(area, context) + if args and args.main_scoring and eval.individual then + eval.individual.juice_card = eval.individual.juice_card or eval.individual.card or area.scored_card + eval.individual.message_card = eval.individual.message_card or eval.individual.card or context.other_card + end + local effects = {eval} + for _,v in ipairs(post) do effects[#effects+1] = v end + if effects[1].retriggers then + context.retrigger_joker = true + for rt = 1, #effects[1].retriggers do + context.retrigger_joker = effects[1].retriggers[rt].retrigger_card + local rt_eval, rt_post = SMODS.eval_individual(area, context) + table.insert(effects, {effects[1].retriggers[rt]}) + table.insert(effects, rt_eval) + for _,v in ipairs(rt_post) do effects[#effects+1] = v end + end + context.retrigger_joker = nil + end + if return_table then + return_table[#return_table+1] = effects[1] + else + local f = SMODS.trigger_effects(effects, area.scored_card) + for k,v in pairs(f) do flags[k] = v end + end + end + end + return flags end -- Used to calculate contexts across G.jokers, scoring_hand (if present), G.play and G.GAME.selected_back -- Hook this function to add different areas to MOST calculations function SMODS.calculate_context(context, return_table) - context.cardarea = G.jokers + local has_area = context.cardarea and true or nil + local flags = {} context.main_eval = true - for _, area in ipairs(SMODS.get_card_areas('jokers')) do - for _, _card in ipairs(area.cards) do - --calculate the joker effects - local eval, post = eval_card(_card, context) - local effects = {eval} - for _,v in ipairs(post) do effects[#effects+1] = v end - - if context.other_joker then - for k, v in pairs(effects[1]) do - v.other_card = _card - end - end - if effects[1].retriggers then - context.retrigger_joker = true - for rt = 1, #effects[1].retriggers do - context.retrigger_joker = effects[1].retriggers[rt].retrigger_card - local rt_eval, rt_post = eval_card(_card, context) - table.insert(effects, {effects[1].retriggers[rt]}) - table.insert(effects, rt_eval) - for _,v in ipairs(rt_post) do effects[#effects+1] = v end - end - context.retrigger_joker = false - end - if return_table then - for _,v in ipairs(effects) do - if v.jokers and not v.jokers.card then v.jokers.card = _card end - return_table[#return_table+1] = v - end - else - SMODS.trigger_effects(effects, _card) - end - end - end + flags[#flags+1] = SMODS.calculate_card_areas('jokers', context, return_table, { joker_area = true, has_area = has_area }) context.main_eval = nil - if context.scoring_hand then - for i=1, #G.play.cards do - if SMODS.in_scoring(G.play.cards[i], context.scoring_hand) then context.cardarea = G.play else context.cardarea = 'unscored' end - --calculate the played card effects - if return_table then - return_table[#return_table+1] = eval_card(G.play.cards[i], context) - SMODS.calculate_quantum_enhancements(G.play.cards[i], return_table, context) - else - local effects = {eval_card(G.play.cards[i], context)} - SMODS.calculate_quantum_enhancements(G.play.cards[i], effects, context) - SMODS.trigger_effects(effects, G.play.cards[i]) - end + + flags[#flags+1] = SMODS.calculate_card_areas('playing_cards', context, return_table, { has_area = has_area }) + flags[#flags+1] = SMODS.calculate_card_areas('individual', context, return_table) + if not return_table then + local ret = {} + for _,f in ipairs(flags) do + for k,v in pairs(f) do ret[k] = v end end + return ret end - context.cardarea = G.hand - for i=1, #G.hand.cards do - --calculate the held card effects - if return_table then - return_table[#return_table+1] = eval_card(G.hand.cards[i], context) - else - local effects = {eval_card(G.hand.cards[i], context)} - SMODS.calculate_quantum_enhancements(G.hand.cards[i], effects, context) - SMODS.trigger_effects(effects, G.hand.cards[i]) - end - end - if SMODS.optional_features.cardareas.deck then - context.cardarea = G.deck - for i=1, #G.deck.cards do - --calculate the held card effects - if return_table then - return_table[#return_table+1] = eval_card(G.deck.cards[i], context) - else - local effects = {eval_card(G.deck.cards[i], context)} - SMODS.calculate_quantum_enhancements(G.deck.cards[i], effects, context) - SMODS.trigger_effects(effects, G.deck.cards[i]) - end - end - end - if SMODS.optional_features.cardareas.discard then - context.cardarea = G.discard - for i=1, #G.discard.cards do - --calculate the held card effects - if return_table then - return_table[#return_table+1] = eval_card(G.discard.cards[i], context) - else - local effects = {eval_card(G.discard.cards[i], context)} - SMODS.calculate_quantum_enhancements(G.discard.cards[i], effects, context) - SMODS.trigger_effects(effects, G.discard.cards[i]) - end - end - end - local effect = G.GAME.selected_back:trigger_effect(context) - if effect then SMODS.calculate_effect(effect, G.deck.cards[1] or G.deck) end end function SMODS.in_scoring(card, scoring_hand) @@ -1474,60 +1643,31 @@ function SMODS.score_card(card, context) context.other_card = card if next(effects) then - for _, area in ipairs(SMODS.get_card_areas('jokers')) do - for _, _card in ipairs(area.cards) do - --calculate the joker individual card effects - local eval, post = eval_card(_card, context) - if next(eval) then - if eval.jokers then - eval.jokers.juice_card = eval.jokers.juice_card or eval.jokers.card or _card - eval.jokers.message_card = eval.jokers.message_card or eval.jokers.card or card - end - - table.insert(effects, eval) - for _, v in ipairs(post) do effects[#effects+1] = v end - if eval.retriggers then - context.retrigger_joker = eval.retriggers.retrigger_card - for rt = 1, #eval.retriggers do - local rt_eval, rt_post = eval_card(_card, context) - if rt_eval.jokers then - rt_eval.jokers.juice_card = rt_eval.jokers.juice_card or rt_eval.jokers.card or _card - rt_eval.jokers.message_card = rt_eval.jokers.message_card or rt_eval.jokers.card or card - end - table.insert(effects, { eval.retriggers[rt] }) - table.insert(effects, rt_eval) - for _, v in ipairs(rt_post) do effects[#effects+1] = v end - end - context.retrigger_joker = nil - end - end - end - end + SMODS.calculate_card_areas('jokers', context, effects, { main_scoring = true }) + SMODS.calculate_card_areas('individual', context, effects, { main_scoring = true }) end - SMODS.trigger_effects(effects, card) - local deck_effect = G.GAME.selected_back:trigger_effect(context) - if deck_effect then SMODS.calculate_effect(deck_effect, G.deck.cards[1] or G.deck) end + local flags = SMODS.trigger_effects(effects, card) context.individual = nil - if reps[j] == 1 and effects.calculated then + if reps[j] == 1 and flags.calculated then context.repetition = true context.card_effects = effects SMODS.calculate_repetitions(card, context, reps) context.repetition = nil context.card_effects = nil end - j = j + (effects.calculated and 1 or #reps) + j = j + (flags.calculated and 1 or #reps) context.other_card = nil card.lucky_trigger = nil end - card.extra_enhancements = nil end function SMODS.calculate_main_scoring(context, scoring_hand) for _, card in ipairs(context.cardarea.cards) do + local in_scoring = scoring_hand and SMODS.in_scoring(card, context.scoring_hand) --add cards played to list - if scoring_hand and not SMODS.has_no_rank(card) and SMODS.in_scoring(card, context.scoring_hand) then + if scoring_hand and not SMODS.has_no_rank(card) and in_scoring then G.GAME.cards_played[card.base.value].total = G.GAME.cards_played[card.base.value].total + 1 if not SMODS.has_no_suit(card) then G.GAME.cards_played[card.base.value].suits[card.base.suit] = true @@ -1535,15 +1675,17 @@ function SMODS.calculate_main_scoring(context, scoring_hand) end --if card is debuffed if scoring_hand and card.debuff then - G.GAME.blind.triggered = true - G.E_MANAGER:add_event(Event({ - trigger = 'immediate', - func = (function() SMODS.juice_up_blind();return true end) - })) - card_eval_status_text(card, 'debuff') + if in_scoring then + G.GAME.blind.triggered = true + G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = (function() SMODS.juice_up_blind();return true end) + })) + card_eval_status_text(card, 'debuff') + end else if scoring_hand then - if SMODS.in_scoring(card, context.scoring_hand) then context.cardarea = G.play else context.cardarea = 'unscored' end + if in_scoring then context.cardarea = G.play else context.cardarea = 'unscored' end end SMODS.score_card(card, context) end @@ -1565,41 +1707,17 @@ function SMODS.calculate_end_of_round_effects(context) context.playing_card_end_of_round = true --calculate the hand effects local effects = {eval_card(card, context)} - local extra_enhancements = SMODS.get_enhancements(card, true) - local old_ability = copy_table(card.ability) - local old_center = card.config.center - local old_center_key = card.config.center_key - for k, _ in pairs(extra_enhancements) do - if G.P_CENTERS[k] then - card:set_ability(G.P_CENTERS[k]) - card.ability.extra_enhancement = k - effects[#effects+1] = eval_card(card, context) - end - end - card.ability = old_ability - card.config.center = old_center - card.config.center_key = old_center_key - card:set_sprites(old_center) + SMODS.calculate_quantum_enhancements(card, effects, context) context.playing_card_end_of_round = nil context.individual = true context.other_card = card -- context.end_of_round individual calculations - for _, area in ipairs(SMODS.get_card_areas('jokers')) do - for _, _card in ipairs(area.cards) do - local eval, post = eval_card(_card, context) - eval.juice_card = eval.card - if next(eval) then - table.insert(effects, eval) - end - for _, v in ipairs(post) do effects[#effects+1] = v end - end - end + SMODS.calculate_card_areas('jokers', context, effects, { main_scoring = true }) + SMODS.calculate_card_areas('individual', context, effects, { main_scoring = true }) - local deck_effect = G.GAME.selected_back:trigger_effect(context) - if deck_effect then SMODS.calculate_effect(deck_effect, G.deck.cards[1] or G.deck) end - SMODS.trigger_effects(effects, card) + local flags = SMODS.trigger_effects(effects, card) context.individual = nil context.repetition = true @@ -1610,7 +1728,7 @@ function SMODS.calculate_end_of_round_effects(context) context.repetition = nil context.card_effects = nil - j = j + (effects.calculated and 1 or #reps) + j = j + (flags.calculated and 1 or #reps) -- TARGET: effects after end of round evaluation end @@ -1621,58 +1739,29 @@ function SMODS.calculate_destroying_cards(context, cards_destroyed, scoring_hand for i,card in ipairs(context.cardarea.cards) do local destroyed = nil --un-highlight all cards - if scoring_hand and SMODS.in_scoring(card, context.scoring_hand) then highlight_card(card,(i-0.999)/(#scoring_hand-0.998),'down') end + local in_scoring = scoring_hand and SMODS.in_scoring(card, context.scoring_hand) + if scoring_hand and in_scoring then + -- Use index of card in scoring hand to determine pitch + local m = 1 + for j, _card in pairs(scoring_hand) do + if card == _card then m = j break end + end + highlight_card(card,(m-0.999)/(#scoring_hand-0.998),'down') + end -- context.destroying_card calculations context.destroy_card = card + context.destroying_card = nil if scoring_hand then - if SMODS.in_scoring(card, context.scoring_hand) then + if in_scoring then context.cardarea = G.play context.destroying_card = card else context.cardarea = 'unscored' - context.destroying_card = nil end end - for _, area in ipairs(SMODS.get_card_areas('jokers')) do - local should_break - for _, _card in ipairs(area.cards) do - local eval, post = eval_card(_card, context) - local self_destroy = false - for key, effect in pairs(eval) do - if type(effect) == 'table' then - self_destroy = SMODS.calculate_effect(effect, card) - else - self_destroy = effect - end - end - SMODS.trigger_effects({post}, card) - if self_destroy then - destroyed = true - should_break = true - break - end - end - if should_break then break end - end - - if scoring_hand and SMODS.has_enhancement(card, 'm_glass') and card:can_calculate() and pseudorandom('glass') < G.GAME.probabilities.normal/(card.ability.name == 'Glass Card' and card.ability.extra or G.P_CENTERS.m_glass.config.extra) then - destroyed = true - end - - local eval, post = eval_card(card, context) - local self_destroy = false - for key, effect in pairs(eval) do - self_destroy = SMODS.calculate_effect(effect, card) - end - SMODS.trigger_effects({post}, card) - if self_destroy then destroyed = true end - - local deck_effect = G.GAME.selected_back:trigger_effect(context) - if deck_effect then - self_destroy = SMODS.calculate_effect(deck_effect, G.deck.cards[1] or G.deck) - if self_destroy then destroyed = true end - end + local flags = SMODS.calculate_context(context) + if flags.remove then destroyed = true end -- TARGET: card destroyed @@ -1687,20 +1776,20 @@ function SMODS.calculate_destroying_cards(context, cards_destroyed, scoring_hand end end -function SMODS.blueprint_effect(card, blueprint_card, context) - if card == blueprint_card then return end - context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1 - context.blueprint_card = context.blueprint_card or card - if context.blueprint > #G.jokers.cards + 1 then return end - local other_joker_ret = blueprint_card:calculate_joker(context) - context.blueprint = nil - local eff_card = context.blueprint_card or card - context.blueprint_card = nil - if other_joker_ret then - other_joker_ret.card = card - other_joker_ret.colour = G.C.BLUE - return other_joker_ret - end +function SMODS.blueprint_effect(copier, copied_card, context) + if copied_card == copier then return end + context.blueprint = (context.blueprint and (context.blueprint + 1)) or 1 + context.blueprint_card = context.blueprint_card or copier + if context.blueprint > #G.jokers.cards + 1 then return end + local other_joker_ret = copied_card:calculate_joker(context) + context.blueprint = nil + local eff_card = context.blueprint_card or copier + context.blueprint_card = nil + if other_joker_ret then + other_joker_ret.card = copier + other_joker_ret.colour = G.C.BLUE + return other_joker_ret + end end function SMODS.get_card_areas(_type, _context) @@ -1718,9 +1807,52 @@ function SMODS.get_card_areas(_type, _context) -- TARGET: add your own CardAreas for joker evaluation return t end + if _type == 'individual' then + local t = { + { object = G.GAME.selected_back, scored_card = G.deck.cards[1] or G.deck }, + } + if G.GAME.blind then t[#t+1] = { object = G.GAME.blind, scored_card = G.GAME.blind.children.animatedSprite } end + -- TARGET: add your own individual scoring targets + return t + end return {} end +function Back:calculate(context) + return self:trigger_effect(context) +end +function Blind:calculate(context) + local obj = self.config.blind + if type(obj.calculate) == 'function' then + return obj:calculate(self, context) + end +end + +function SMODS.eval_individual(individual, context) + local ret = {} + local post_trig = {} + + local eff, triggered = individual.object:calculate(context) + if eff == true then eff = { remove = true } end + if type(eff) ~= 'table' then eff = nil end + + if (eff and not eff.no_retrigger) or triggered then + --if type(eff) == 'table' then eff.juice_card = eff.juice_card or individual.scored_card end + ret.individual = eff + + if not (context.retrigger_joker_check or context.retrigger_joker) then + local retriggers = SMODS.calculate_retriggers(individual.object, context, ret) + if next(retriggers) then + ret.retriggers = retriggers + end + end + if not context.post_trigger and not context.retrigger_joker_check and SMODS.optional_features.post_trigger then + SMODS.calculate_context({blueprint_card = context.blueprint_card, post_trigger = true, other_card = individual.object, other_context = context, other_ret = ret}, post_trig) + end + end + return ret, post_trig +end + local flat_copy_table = function(tbl) local new = {} for i, v in pairs(tbl) do @@ -1898,7 +2030,7 @@ end function SMODS.change_voucher_limit(mod) G.GAME.modifiers.extra_vouchers = (G.GAME.modifiers.extra_vouchers or 0) + mod - if mod > 0 and G.STATE == G.STATES.SHOP then + if mod > 0 and (G.STATE == G.STATES.SHOP or G.TAROT_INTERRUPT == G.STATES.SHOP) then for i=1, mod do SMODS.add_voucher_to_shop() end @@ -1918,7 +2050,7 @@ end function SMODS.change_booster_limit(mod) G.GAME.modifiers.extra_boosters = (G.GAME.modifiers.extra_boosters or 0) + mod - if mod > 0 and G.STATE == G.STATES.SHOP then + if mod > 0 and (G.STATE == G.STATES.SHOP or G.TAROT_INTERRUPT == G.STATES.SHOP) then for i = 1, mod do SMODS.add_booster_to_shop() end @@ -1945,3 +2077,52 @@ function SMODS.multiplicative_stacking(base, perma) local ret = base * perma return (ret == 1 and 0) or (ret > 0 and ret) or 0 end + +function SMODS.smeared_check(card, suit) + if ((card.base.suit == 'Hearts' or card.base.suit == 'Diamonds') and (suit == 'Hearts' or suit == 'Diamonds')) then + return true + elseif (card.base.suit == 'Spades' or card.base.suit == 'Clubs') and (suit == 'Spades' or suit == 'Clubs') then + return true + end + return false +end + +local function has_any_other_suit(count, suit) + for k, v in pairs(count) do + if k ~= suit then + if v > 0 then + return true + end + end + end + return false +end + +local function saw_double(count, suit) + if count[suit] > 0 and has_any_other_suit(count, suit) then return true else return false end +end + +function SMODS.seeing_double_check(hand, suit) + local suit_tally = {} + for i = #SMODS.Suit.obj_buffer, 1, -1 do + suit_tally[SMODS.Suit.obj_buffer[i]] = 0 + end + for i = 1, #hand do + if not SMODS.has_any_suit(hand[i]) then + for k, v in pairs(suit_tally) do + if hand[i]:is_suit(k) then suit_tally[k] = suit_tally[k] + 1 end + end + elseif SMODS.has_any_suit(hand[i]) then + if hand[i]:is_suit('Clubs') and suit_tally["Clubs"] == 0 then suit_tally["Clubs"] = suit_tally["Clubs"] + 1 + elseif hand[i]:is_suit('Diamonds') and suit_tally["Diamonds"] == 0 then suit_tally["Diamonds"] = suit_tally["Diamonds"] + 1 + elseif hand[i]:is_suit('Spades') and suit_tally["Spades"] == 0 then suit_tally["Spades"] = suit_tally["Spades"] + 1 + elseif hand[i]:is_suit('Hearts') and suit_tally["Hearts"] == 0 then suit_tally["Hearts"] = suit_tally["Hearts"] + 1 end + for k, v in pairs(suit_tally) do + if k ~= "Clubs" and k ~= "Diamonds" and k ~= "Hearts" and k ~= "Spades" then + if hand[i]:is_suit(k) and suit_tally[k] == 0 then suit_tally[k] = suit_tally[k] + 1 end + end + end + end + end + if saw_double(suit_tally, suit) then return true else return false end +end diff --git a/smods/tk_debug_window.py b/Steamodded/tk_debug_window.py similarity index 95% rename from smods/tk_debug_window.py rename to Steamodded/tk_debug_window.py index e5305f5..1b20795 100644 --- a/smods/tk_debug_window.py +++ b/Steamodded/tk_debug_window.py @@ -5,6 +5,7 @@ import threading import tkinter as tk from datetime import datetime from tkinter import filedialog +import argparse log_levels = { "TRACE": 0, @@ -15,6 +16,8 @@ log_levels = { "FATAL": 5 } +SCALE = 1.0 + # might or might not be a copy paste from https://stackoverflow.com/a/16375233 class TextLineNumbers(tk.Canvas): @@ -208,7 +211,14 @@ class GlobalSearchFrame(tk.Frame): self.search_mode_var = tk.StringVar(value='normal') self.search_mode_var.trace("w", self.apply_search_mode) for mode, text in [('normal', 'normal'), ('match_case', 'match case'), ('regex', 'regex')]: - self.search_modes.append(tk.Radiobutton(self, text=text, variable=self.search_mode_var, value=mode)) + self.search_modes.append(tk.Radiobutton( + self, + text=text, + variable=self.search_mode_var, + value=mode, + indicatoron=True if SCALE <= 1.0 else False, + padx=10*SCALE + )) self.create_widgets() @@ -494,7 +504,9 @@ class SpecificSearchFrame(tk.Frame): variable=self.and_above_var, onvalue=True, offvalue=False, - command=lambda: self.console.set_filter(and_above=self.and_above_var.get()) + indicatoron=True if SCALE <= 1.0 else False, + command=lambda: self.console.set_filter( + and_above=self.and_above_var.get()) ) self.clear_log_button: tk.Button | None = None @@ -643,7 +655,33 @@ def listen_for_clients(console: Console): threading.Thread(target=client_handler, args=(client, console)).start() +def fix_scaling(root, scale): + """Scale fonts on HiDPI displays.""" + import tkinter.font + for name in tkinter.font.names(root): + font = tkinter.font.Font(root=root, name=name, exists=True) + size = int(font['size']) + if size < 0: + font['size'] = round(-scale*size) + + +parser = argparse.ArgumentParser( + prog='Steamodded Debug Console') +parser.add_argument('-s', '--scale', type=float, + help="Scaling factor for the debug console.", default=None) + + if __name__ == "__main__": + args = parser.parse_args() + # set global scale for use by components above + if args.scale is not None: + SCALE = args.scale + root = MainWindow() + + # scale fonts after root initialized + if args.scale is not None: + fix_scaling(root, args.scale) + threading.Thread(target=listen_for_clients, daemon=True, args=(root.get_console(),)).start() root.mainloop() diff --git a/Steamodded/version.lua b/Steamodded/version.lua new file mode 100644 index 0000000..a6711c8 --- /dev/null +++ b/Steamodded/version.lua @@ -0,0 +1 @@ +return "1.0.0~BETA-0406a-STEAMODDED" diff --git a/Talisman/.gitattributes b/Talisman/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/Talisman/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/Talisman/.gitignore b/Talisman/.gitignore new file mode 100644 index 0000000..b65a9d4 --- /dev/null +++ b/Talisman/.gitignore @@ -0,0 +1,2 @@ +config.lua +.vscode \ No newline at end of file diff --git a/Talisman/big-num/bignumber.lua b/Talisman/big-num/bignumber.lua index 33e748e..6ca6e6e 100644 --- a/Talisman/big-num/bignumber.lua +++ b/Talisman/big-num/bignumber.lua @@ -242,13 +242,26 @@ function Big:compare(b) return -1 end - if self.e > b.e then return 1 end - if self.e < b.e then return -1 end + if self.m == 0 and self.e == 0 and b:is_negative() then + return 1 + end + if self.m == 0 and self.e == 0 and b:is_positive() then + return -1 + end + if self:is_positive() and b.m == 0 and b.e == 0 then + return 1 + end + if self:is_negative() and b.m == 0 and b.e == 0 then + return -1 + end - if self:is_positive() and self.m > b.m then return 1 end - if self:is_positive() and self.m < b.m then return -1 end - if self:is_negative() and self.m > b.m then return -1 end - if self:is_negative() and self.m < b.m then return 1 end + if self.e > b.e and self:is_positive() then return 1 end + if self.e < b.e and self:is_positive() then return -1 end + if self.e > b.e and self:is_negative() then return -1 end + if self.e < b.e and self:is_negative() then return 1 end + + if self.m > b.m then return 1 end + if self.m < b.m then return -1 end end function Big:gt(b) diff --git a/Talisman/big-num/notations/Balatro.lua b/Talisman/big-num/notations/Balatro.lua index bfd518e..ef70a4a 100644 --- a/Talisman/big-num/notations/Balatro.lua +++ b/Talisman/big-num/notations/Balatro.lua @@ -13,33 +13,35 @@ function BalaNotation:new() end function BalaNotation:format(n, places) - local function e_ify(n) - if (n > 10^6) then - local exponent = math.floor(math.log(n,10)) - local mantissa = n/10^exponent - mantissa = math.floor(mantissa*10^places+0.5)/10^places - return "("..exponent.."e"..mantissa..")" + --vanilla balatro number_format function basically + local function e_ify(num) + if type(num) == "table" then + num = num:to_number() end - if n < 1 then return 1 end - return n or "ERROR" + if num >= 10^6 then + local x = string.format("%.4g",num) + local fac = math.floor(math.log(tonumber(x), 10)) + return string.format("%.3f",x/(10^fac))..'e'..fac + end + return string.format(num ~= math.floor(num) and (num >= 100 and "%.0f" or num >= 10 and "%.1f" or "%.2f") or "%.0f", num):reverse():gsub("(%d%d%d)", "%1,"):gsub(",$", ""):reverse() end - --The notation here is heavily based on Hyper-E notation. + --The notation here is Hyper-E notation, but with lowercase E. if to_big(n:log10()) < to_big(1000000) then --1.234e56789 if n.m then --BigNum local mantissa = math.floor(n.m*10^places+0.5)/10^places local exponent = n.e - return mantissa.."e"..exponent + return mantissa.."e"..e_ify(exponent) elseif n.array[2] == 1 then --OmegaNum local mantissa = 10^(n.array[1]-math.floor(n.array[1])) mantissa = math.floor(mantissa*10^places+0.5)/10^places local exponent = math.floor(n.array[1]) - return mantissa.."e"..exponent + return mantissa.."e"..e_ify(exponent) else local exponent = math.floor(math.log(n.array[1],10)) local mantissa = n.array[1]/10^exponent mantissa = math.floor(mantissa*10^places+0.5)/10^places - return mantissa.."e"..exponent + return mantissa.."e"..e_ify(exponent) end elseif to_big(n:log10()) < to_big(10)^1000000 then --e1.234e56789 @@ -47,40 +49,36 @@ function BalaNotation:format(n, places) local exponent = math.floor(math.log(n.e,10)) local mantissa = n.e/10^exponent mantissa = math.floor(mantissa*10^places+0.5)/10^places - return "e"..mantissa.."e"..exponent + return "e"..mantissa.."e"..e_ify(exponent) elseif n.array[2] == 2 then --OmegaNum local mantissa = 10^(n.array[1]-math.floor(n.array[1])) mantissa = math.floor(mantissa*10^places+0.5)/10^places local exponent = math.floor(n.array[1]) - return "e"..mantissa.."e"..exponent + return "e"..mantissa.."e"..e_ify(exponent) else local exponent = math.floor(math.log(n.array[1],10)) local mantissa = n.array[1]/10^exponent mantissa = math.floor(mantissa*10^places+0.5)/10^places - return "e"..mantissa.."e"..exponent + return "e"..mantissa.."e"..e_ify(exponent) end elseif not n.array or not (n.isFinite and n:isFinite()) then return "Infinity" - elseif n.array[2] == 3 and #n.array == 2 then - --ee1.234e56789 + elseif n.array[2] and #n.array == 2 and n.array[2] <= 8 then + --eeeeeee1.234e56789 local mantissa = 10^(n.array[1]-math.floor(n.array[1])) mantissa = math.floor(mantissa*10^places+0.5)/10^places local exponent = math.floor(n.array[1]) - return "ee"..mantissa.."e"..exponent - elseif n.array[2] and #n.array == 2 and n.array[2] <= 8 then - --eeeeeeee56789 - local exponent = math.floor(n.array[1]) - return string.rep("e", n.array[2])..exponent + return string.rep("e", n.array[2]-1)..mantissa.."e"..e_ify(exponent) elseif #n.array < 8 then --e12#34#56#78 - local r = "e"..e_ify(math.floor(n.array[1]*10^places+0.5)/10^places).."#"..n.array[2] + local r = "e"..e_ify(math.floor(n.array[1]*10^places+0.5)/10^places).."#"..e_ify(n.array[2]) for i = 3, #n.array do - r = r.."#"..(n.array[i]+1) + r = r.."#"..e_ify(n.array[i]+1) end return r else --e12#34##5678 - return "e"..e_ify(math.floor(n.array[1]*10^places+0.5)/10^places).."#"..n.array[#n.array].."##"..(#n.array-2) + return "e"..e_ify(math.floor(n.array[1]*10^places+0.5)/10^places).."#"..e_ify(n.array[#n.array]).."##"..e_ify(#n.array-2) end end diff --git a/Talisman/big-num/omeganum.lua b/Talisman/big-num/omeganum.lua index 9911c81..f5b1d51 100644 --- a/Talisman/big-num/omeganum.lua +++ b/Talisman/big-num/omeganum.lua @@ -481,7 +481,7 @@ function Big:parse(input) if (intPartLen - 1 >= LONG_STRING_MIN_LENGTH) then b[1] = math.log10(b[1]) + log10LongString(string.sub(a[i], 1, intPartLen - 1)) b[2] = 1; - elseif ((a[i] ~= nil) and (a[i] ~= "")) then + elseif ((a[i] ~= nil) and (a[i] ~= "") and (tonumber(a[i]) ~= nil)) then b[1] = b[1] * tonumber(a[i]); end else diff --git a/Talisman/config.lua b/Talisman/config.lua deleted file mode 100644 index 0f706ea..0000000 --- a/Talisman/config.lua +++ /dev/null @@ -1 +0,0 @@ -return {["disable_anims"]=false,["score_opt_id"]=3,["break_infinity"]="omeganum",} \ No newline at end of file diff --git a/Talisman/lovely.toml b/Talisman/lovely.toml index 57ed099..e13d028 100644 --- a/Talisman/lovely.toml +++ b/Talisman/lovely.toml @@ -468,7 +468,7 @@ match_indent = true target = "functions/common_events.lua" pattern = "G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[math.min(vals.level, 7)]" position = "at" -payload = "G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[to_big(math.min(vals.level, 7)):to_number()]" +payload = "G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[to_number(to_big(math.min(vals.level, 7)))]" match_indent = true [[patches]] @@ -476,7 +476,7 @@ match_indent = true target = "functions/common_events.lua" pattern = "colours = {(G.GAME.hands[cfg.hand_type].level==1 and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[math.min(7, G.GAME.hands[cfg.hand_type].level)])}" position = "at" -payload = "colours = {(to_big(G.GAME.hands[cfg.hand_type].level)==to_big(1) and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands[cfg.hand_type].level)):to_number()])}" +payload = "colours = {(to_big(G.GAME.hands[cfg.hand_type].level)==to_big(1) and G.C.UI.TEXT_DARK or G.C.HAND_LEVELS[to_number(to_big(math.min(7, G.GAME.hands[cfg.hand_type].level)))])}" match_indent = true [[patches]] @@ -484,7 +484,7 @@ match_indent = true target = "functions/UI_definitions.lua" pattern = '{n=G.UIT.C, config={align = "cm", padding = 0.01, r = 0.1, colour = G.C.HAND_LEVELS[math.min(7, G.GAME.hands[handname].level)], minw = 1.5, outline = 0.8, outline_colour = G.C.WHITE}, nodes={' position = "at" -payload = '{n=G.UIT.C, config={align = "cm", padding = 0.01, r = 0.1, colour = G.C.HAND_LEVELS[to_big(math.min(7, G.GAME.hands[handname].level)):to_number()], minw = 1.5, outline = 0.8, outline_colour = G.C.WHITE}, nodes={' +payload = '{n=G.UIT.C, config={align = "cm", padding = 0.01, r = 0.1, colour = G.C.HAND_LEVELS[to_number(to_big(math.min(7, G.GAME.hands[handname].level)))], minw = 1.5, outline = 0.8, outline_colour = G.C.WHITE}, nodes={' match_indent = true # money fixes @@ -1356,4 +1356,159 @@ target = 'functions/common_events.lua' pattern = "text = localize{type='variable',key='a_xmult'..(amt<0 and '_minus' or ''),vars={math.abs(amt)}}" position = 'at' payload = "text = localize{type='variable',key='a_xmult'..(to_big(amt) to_big(1e300) then + val = 1e300 + else + val = val:tonumber() + end +end +G.SHADERS[_shader]:send(v.name, val)''' +match_indent = true + +# Let ambient sounds not use bignums +[[patches]] +[patches.pattern] +target = 'functions/misc_functions.lua' +pattern = "AC[k].vol = (not G.video_organ and G.STATE == G.STATES.SPLASH) and 0 or AC[k].vol and v.volfunc(AC[k].vol) or 0" +position = 'after' +payload = ''' +if type(AC[k].vol) == "table" then + if AC[k].vol > to_big(1e300) then + AC[k].vol = 1e300 + else + AC[k].vol = AC[k].vol:to_number() + end +end +if type(AC[k].per) == "table" then + if AC[k].per > to_big(1e300) then + AC[k].per = 1e300 + else + AC[k].per = AC[k].per:to_number() + end +end +''' +match_indent = true + +[[patches]] +[patches.pattern] +target = 'functions/button_callbacks.lua' +pattern = "_F.intensity = ((G.pack_cards and not G.pack_cards.REMOVED) or (G.TAROT_INTERRUPT)) and 0 or math.max(0., math.log(G.ARGS.score_intensity.earned_score, 5)-2)" +position = 'after' +payload = '''if type(_F.intensity) == "table" then + if _F.intensity > to_big(1e300) then + _F.intensity = 1e300 + else + _F.intensity = _F.intensity:to_number() + end +end +''' +match_indent = true + +# G.funcs.evaluate_play() +[[patches]] +[patches.pattern] +target = 'functions/state_events.lua' +position = 'at' +match_indent = true +pattern = ''' +G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.FUNCS.evaluate_play() + return true + end +})) +''' +payload = ''' +G.E_MANAGER:add_event(Event({ + trigger = 'immediate', + func = function() + G.FUNCS.evaluate_play(e) + return true + end +})) +''' \ No newline at end of file diff --git a/Talisman/steamodded_metadata.lua b/Talisman/steamodded_metadata.lua index bbe614f..35cbffa 100644 --- a/Talisman/steamodded_metadata.lua +++ b/Talisman/steamodded_metadata.lua @@ -4,7 +4,7 @@ --- MOD_AUTHOR: [MathIsFun_, Mathguy24, jenwalter666, cg-223] --- MOD_DESCRIPTION: A mod that increases Balatro's score limit and skips scoring animations. --- PREFIX: talisman ---- VERSION: 2.1.1~dev +--- VERSION: 2.2.0~dev ---------------------------------------------- ------------MOD CODE ------------------------- diff --git a/Talisman/talisman.lua b/Talisman/talisman.lua index f423c59..0a82582 100644 --- a/Talisman/talisman.lua +++ b/Talisman/talisman.lua @@ -127,19 +127,63 @@ if Talisman.config_file.break_infinity then return mc(x) end +function lenient_bignum(x) + if type(x) == "number" then return x end + if to_big(x) < to_big(1e300) and to_big(x) > to_big(-1e300) then + return x:to_number() + end + return x + end + + --prevent some log-related crashes + local sns = score_number_scale + function score_number_scale(scale, amt) + local ret = sns(scale, amt) + if type(ret) == "table" then + if ret > to_big(1e300) then return 1e300 end + return ret:to_number() + end + return ret + end + + local gftsj = G.FUNCS.text_super_juice + function G.FUNCS.text_super_juice(e, _amount) + if type(_amount) == "table" then + if _amount > to_big(1e300) then + _amount = 1e300 + else + _amount = _amount:to_number() + end + end + return gftsj(e, _amount) + end + local l10 = math.log10 function math.log10(x) - if type(x) == 'table' then return l10(math.min(x:to_number(),1e300)) end--x:log10() end - return l10(x) + if type(x) == 'table' then + if x.log10 then return lenient_bignum(x:log10()) end + return lenient_bignum(l10(math.min(x:to_number(),1e300))) + end + return lenient_bignum(l10(x)) end local lg = math.log function math.log(x, y) if not y then y = 2.718281828459045 end - if type(x) == 'table' then return lg(math.min(x:to_number(),1e300),y) end --x:log(y) end - return lg(x,y) + if type(x) == 'table' then + if x.log then return lenient_bignum(x:log(to_big(y))) end + if x.logBase then return lenient_bignum(x:logBase(to_big(y))) end + return lenient_bignum(lg(math.min(x:to_number(),1e300),y)) + end + return lenient_bignum(lg(x,y)) end + function math.exp(x) + local big_e = to_big(2.718281828459045) + + return lenient_bignum(big_e:pow(x)) + end + if SMODS then function SMODS.get_blind_amount(ante) local k = to_big(0.75) @@ -284,7 +328,11 @@ if Talisman.config_file.break_infinity then local tsj = G.FUNCS.text_super_juice function G.FUNCS.text_super_juice(e, _amount) - if _amount > 2 then _amount = 2 end + if type(_amount) == 'table' then + if _amount > to_big(2) then _amount = 2 end + else + if _amount > 2 then _amount = 2 end + end return tsj(e, _amount) end @@ -346,7 +394,9 @@ function is_number(x) end function to_big(x, y) - if Big and Big.m then + if type(x) == 'string' and x == "0" then --hack for when 0 is asked to be a bignumber need to really figure out the fix + return 0 + elseif Big and Big.m then return Big:new(x,y) elseif Big and Big.array then local result = Big:create(x) @@ -384,6 +434,10 @@ local jc = juice_card function juice_card(x) if not Talisman.config_file.disable_anims then jc(x) end end +local cju = Card.juice_up +function Card:juice_up(...) + if not Talisman.config_file.disable_anims then cju(self, ...) end +end function tal_uht(config, vals) local col = G.C.GREEN if vals.chips and G.GAME.current_round.current_hand.chips ~= vals.chips then @@ -419,8 +473,8 @@ function tal_uht(config, vals) G.GAME.current_round.current_hand.hand_level = vals.level else G.GAME.current_round.current_hand.hand_level = ' '..localize('k_lvl')..tostring(vals.level) - if is_number(vals.level) then - G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[to_big(math.min(vals.level, 7)):to_number()] + if is_number(vals.level) then + G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[type(vals.level) == "number" and math.floor(math.min(vals.level, 7)) or math.floor(to_big(math.min(vals.level, 7))):to_number()] else G.hand_text_area.hand_level.config.colour = G.C.HAND_LEVELS[1] end @@ -441,6 +495,25 @@ function update_hand_text(config, vals) else uht(config, vals) end end + + +G.FUNCS.evaluate_play = function(e) + Talisman.scoring_state = "intro" + text, disp_text, poker_hands, scoring_hand, non_loc_disp_text, percent, percent_delta = evaluate_play_intro() + if not G.GAME.blind:debuff_hand(G.play.cards, poker_hands, text) then + Talisman.scoring_state = "main" + text, disp_text, poker_hands, scoring_hand, non_loc_disp_text, percent, percent_delta = evaluate_play_main(text, disp_text, poker_hands, scoring_hand, non_loc_disp_text, percent, percent_delta) + else + Talisman.scoring_state = "debuff" + text, disp_text, poker_hands, scoring_hand, non_loc_disp_text, percent, percent_delta = evaluate_play_debuff(text, disp_text, poker_hands, scoring_hand, non_loc_disp_text, percent, percent_delta) + end + Talisman.scoring_state = "final_scoring" + text, disp_text, poker_hands, scoring_hand, non_loc_disp_text, percent, percent_delta = evaluate_play_final_scoring(text, disp_text, poker_hands, scoring_hand, non_loc_disp_text, percent, percent_delta) + Talisman.scoring_state = "after" + evaluate_play_after(text, disp_text, poker_hands, scoring_hand, non_loc_disp_text, percent, percent_delta) + Talisman.scoring_state = nil +end + local upd = Game.update function Game:update(dt) upd(self, dt) @@ -459,25 +532,29 @@ if not Talisman.F_NO_COROUTINE then --scoring coroutine local oldplay = G.FUNCS.evaluate_play - function G.FUNCS.evaluate_play() + function G.FUNCS.evaluate_play(...) G.SCORING_COROUTINE = coroutine.create(oldplay) G.LAST_SCORING_YIELD = love.timer.getTime() G.CARD_CALC_COUNTS = {} -- keys = cards, values = table containing numbers - local success, err = coroutine.resume(G.SCORING_COROUTINE) + local success, err = coroutine.resume(G.SCORING_COROUTINE, ...) if not success then error(err) end end + function G.FUNCS.tal_abort() + tal_aborted = true + end local oldupd = love.update + function love.update(dt, ...) oldupd(dt, ...) if G.SCORING_COROUTINE then if collectgarbage("count") > 1024*1024 then collectgarbage("collect") end - if coroutine.status(G.SCORING_COROUTINE) == "dead" then + if coroutine.status(G.SCORING_COROUTINE) == "dead" or tal_aborted then G.SCORING_COROUTINE = nil G.FUNCS.exit_overlay_menu() local totalCalcs = 0 @@ -486,6 +563,12 @@ if not Talisman.F_NO_COROUTINE then end G.GAME.LAST_CALCS = totalCalcs G.GAME.LAST_CALC_TIME = G.CURRENT_CALC_TIME + G.CURRENT_CALC_TIME = 0 + if tal_aborted and Talisman.scoring_state == "main" then + evaluate_play_final_scoring(text, disp_text, poker_hands, scoring_hand, non_loc_disp_text, percent, percent_delta) + end + tal_aborted = nil + Talisman.scoring_state = nil else G.SCORING_TEXT = nil if not G.OVERLAY_MENU then @@ -500,7 +583,15 @@ if not Talisman.F_NO_COROUTINE then {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.scoring_text, ref_value = 3}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4, silent = true})}}, }},{n = G.UIT.R, nodes = { {n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.scoring_text, ref_value = 4}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, pop_in = 0, scale = 0.4, silent = true})}}, - }}}}} + }},{n = G.UIT.R, nodes = { + UIBox_button({ + colour = G.C.BLUE, + button = "tal_abort", + label = { "Abort" }, + minw = 4.5, + focus_args = { snap_to = true }, + })}}, + }}} G.FUNCS.overlay_menu({ definition = {n=G.UIT.ROOT, minw = G.ROOM.T.w*5, minh = G.ROOM.T.h*5, config={align = "cm", padding = 9999, offset = {x = 0, y = -3}, r = 0.1, colour = {G.C.GREY[1], G.C.GREY[2], G.C.GREY[3],0.7}}, nodes= G.SCORING_TEXT}, @@ -936,6 +1027,13 @@ if SMODS and SMODS.calculate_individual_effect then table.insert(SMODS.calculation_keys, v) end end + + -- prvent juice animations + local smce = SMODS.calculate_effect + function SMODS.calculate_effect(effect, ...) + if Talisman.config_file.disable_anims then effect.juice_card = nil end + return smce(effect, ...) + end end --some debugging functions @@ -954,4 +1052,4 @@ local emae = EventManager.add_event function EventManager:add_event(x,y,z) printCallerInfo() return emae(self,x,y,z) -end--]] +end--]] \ No newline at end of file diff --git a/Talisman/version b/Talisman/version deleted file mode 100644 index 69078c6..0000000 --- a/Talisman/version +++ /dev/null @@ -1 +0,0 @@ -cryptid-0.5.5 diff --git a/smods/version b/smods/version deleted file mode 100644 index 69078c6..0000000 --- a/smods/version +++ /dev/null @@ -1 +0,0 @@ -cryptid-0.5.5 diff --git a/smods/version.lua b/smods/version.lua deleted file mode 100644 index 73d2cc1..0000000 --- a/smods/version.lua +++ /dev/null @@ -1 +0,0 @@ -return "1.0.0~BETA-0309b-STEAMODDED"