From 43f059999561597e1d1dc69b3e22b465a4969d19 Mon Sep 17 00:00:00 2001 From: Emik Date: Sun, 17 May 2026 15:59:02 +0200 Subject: [PATCH] Add Escapey joker, move Peppino to Cryptid, nerf challenge goal --- assets/1x/default/j_jane_escapey.png | Bin 0 -> 2297 bytes assets/2x/default/j_jane_escapey.png | Bin 0 -> 3275 bytes manifest.json | 2 +- src/challenge.lua | 4 +- src/joker.lua | 102 ++++++++++++++++++++++++++- src/main.lua | 22 ++++++ src/voucher.lua | 7 +- 7 files changed, 131 insertions(+), 6 deletions(-) create mode 100644 assets/1x/default/j_jane_escapey.png create mode 100644 assets/2x/default/j_jane_escapey.png diff --git a/assets/1x/default/j_jane_escapey.png b/assets/1x/default/j_jane_escapey.png new file mode 100644 index 0000000000000000000000000000000000000000..0d18ab2e4c6f38485a58ad5640911ddbd853cfcc GIT binary patch literal 2297 zcmZuyc{G%L8~%+kWlea8Y>7%dWUDEZm@H$4EaQ2msfPWJ2k+q@vAxTF&>!cfRYK``q`r&UIhcIrl$zhPNj{SwUL?0H92C zb0z}-`Tzj?<UYqM|lrX=~%)rlW6+$KwMI9tjN%{WLq~6%_hv z=wFR&hPt}Cv9U1#VBdFV2>@VK4B69n>Hh=tsGGk50LUM8+Y=4IijE(J!Wxs30RUPt zF4P#`sF0YGfyaY^ci`d37;{e-cn!|n%G}CY9Yu%%05k902Ba# z1OU+aJ^wg^F$(>YmjM7+p=5w60AMcw;BdO^Pd)TsQj;unk3a2|0I+-`(HRfN z`45XTV~1>3E(GMP4Iy4-5`{Lqa|#6&OZN!JQwKMtQe9s4TzO&9x>isaoxJkz3nYwam`(Xgd~ z(3fdZzik_wsP{n+aX9hya$aPgoJy8wM2@$VC43DrCD zItO^?-yee6bJDGAl_Phv=5u-|{5jT>s{NR<2=|pq-FjqB!m#2bY~XgNIv#ZK68bVH zDaxB+w^J8|`K=HQTEm<*?EALIRr;1zpaZwwZg}&z8Go*?#xt8?$QwzelBD6Z(*48G zwRCO*M{n^%_VjJ$r33n{4yL>Wmi?X^GLI*feH*6G_=OLG+2zEN>nUnf*@6gr_f!o3 zhHs9B2i*R&#*BU8d{-Tzn_YiMf&9rikXh?1mFO;cJT4B?B`9_@+1hNP2DxwE)vM*F znhCdi5LJ7GLy)_jN=`ICOr<}r&@;;4$<_A8x8k8SL4L z4|YEr=d2eUS2l`xVPE$0=k$~oqD9bQ4NmKti(%e8Iq6%=XWZA?a_TFQ_7grtLgX^; zoMro03MtbO_rSp4)F1sW00Wt+ zZy4c}<#EMlFV6Hqg3j@zhhyHySvk3h#Uh?vW%`S{n_SmpY1f692AodFaPk#vMJ}3T z#VwV>q#FvFIHlNHbYfBeBJx)+ceDO7`r8Ulwfquw}@%pa2 zA?hdmL&|R6hSEphK6>TDF{JoncxZDKm|@rHvz~URzuD22e-4#y#7Q*AomGW({63gh z!^@b&)s%)XY}><|cFD@7byXe5v)oSvr9=kgIA6Lv?d40?f2_O~t2^y+H3xSiS1Wzo ziDSGRsWBou8^p|alxTM_yW94cGtwE} zR4dDwbD=my9&S&zJDRnR8Dwp(*gqq1dZFAud=Oh9nw=Q9R~o-!%d&7h7QyJdFPC1u z(CU>kMuEi9PqPqaxtdX(bKfen$`pDe3>U?N%+v$iun5<|`=awW-%sjnp*JhWgD!}q zOllVGYKndSpy|TeKMfn$Y#ly{W0pJ*lr9&f+#l5xutwWlsw)B+na9ebqT`aDyNR=W zIKjh@@1~isk(m->RvfYzVQXH+_{-UP;DaOordbuvGV`pA9!+|0q z%kx@;_>`9~c0MS4%_zwD)cr|~JI|8S`V7aFm?E>?n$eB2(4a*yWp{iKuGMZY`itdG%eNQz9Bgi9Nyn#PitQjRyhUxear}b zz#gjBg3GLXk7iCx&$uAX3yV~2qOkcyF?2AE{f##jFl$c`vg6qwxzNhCx?34O5=W-P zW*+T;!fVNC1lx6|-o*LcZr1CvsR;CCLZUh|urI@B8-*W;^F9SXvgr4Zl;^e2PY>$n zbZ%Huo0nQErCP)rq4l!4-zD~OM;+6u6?1C_!WUDg{YJ8R^r`r^5nnX-&S|eP6FgP` ze=9h1l3JnPsjv1*t=Sim!CvuqCA`s4T#>DNSJZ{c|JKGO$M25LikhL)=+(~Lk^Ga} zH|%e0d3`Fzle9Vd?}?5uU|snZ2UNGv)$U|#}g&G LcskeY3`qG0pk4dz literal 0 HcmV?d00001 diff --git a/assets/2x/default/j_jane_escapey.png b/assets/2x/default/j_jane_escapey.png new file mode 100644 index 0000000000000000000000000000000000000000..afc035285fef641c6b118fa9fac690b20090453a GIT binary patch literal 3275 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 QEMl<}X@`A@t#AB)09MKLD*ylh literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index 4ed2bfb..ff2ce74 100644 --- a/manifest.json +++ b/manifest.json @@ -17,5 +17,5 @@ "conflicts": [ "Jen" ], - "version": "1.5.38" + "version": "1.6.0" } \ No newline at end of file diff --git a/src/challenge.lua b/src/challenge.lua index 1ad4dd3..78181b2 100644 --- a/src/challenge.lua +++ b/src/challenge.lua @@ -28,7 +28,7 @@ SMODS.Challenge { {id = "jane_downpour4"}, }}, apply = function(_) - G.GAME.win_ante = 16 + G.GAME.win_ante = 10 for _, v in ipairs(rain_world_jokers) do Jane.q(function() @@ -83,4 +83,4 @@ G.localization.misc.v_text.ch_c_jane_downpour3 = {"{C:attention}Boss Blind {}is defeated, or {C:red}lose"} G.localization.misc.v_text.ch_c_jane_downpour4 = -{"Win on {C:attention}Ante 16"} +{"Win on {C:attention}Ante 10"} diff --git a/src/joker.lua b/src/joker.lua index 714ed13..5f0ba99 100644 --- a/src/joker.lua +++ b/src/joker.lua @@ -1,4 +1,4 @@ -for _, v in pairs({"7granddad", "betmma", "honey", "oxy", "maxie", "peppino"}) do +for _, v in pairs({"7granddad", "betmma", "escapey", "honey", "oxy", "maxie", Cryptid and "peppino" or nil}) do SMODS.Atlas { px = 71, py = 95, @@ -48,6 +48,10 @@ local granddad_palette = { HEX("6c0700"), } +local function destructible(card) + return not card.highlighted and not (card.ability or {}).eternal +end + local function food_jokers_count() if not G.jokers or not next(G.jokers.cards) then return 0 @@ -116,6 +120,98 @@ local function voucher_count() return count end +SMODS.Joker { + key = "escapey", + atlas = "janeescapey", + pronouns = "they_them", + loc_txt = { + name = "Escapey", + text = { + "Use to sell {C:attention}tags", + "for {X:money,C:white}$#1#X{} each", + "{s:0.75}If any {C:attention,s:0.75}consumables", + "{s:0.75}are unselected, sell", + "{s:0.75}those for {C:money,s:0.75}$#2# {s:0.75}instead", + }, + }, + config = {extra = {money = 2, xmoney = 1.5}}, + attributes = {"destroy_card", "economy", "tag"}, + pos = {x = 0, y = 0}, + sinis = {x = 2, y = 0}, + soul_pos = {x = 1, y = 0}, + cost = 4, + rarity = 2, + eternal_compat = true, + blueprint_compat = false, + perishable_compat = true, + loc_vars = function(_, _, card) + return {vars = {card.ability.extra.xmoney, card.ability.extra.money}} + end, + Bakery_can_use = function(_, card) + if not Jane.can_use() or card.debuff or G.GAME.used_vouchers.v_jane_token_voucher then + return false + end + + if next(G.GAME.tags) then + return true + end + + for _, v in ipairs(G.consumeables.cards) do + if destructible(v) then + return true + end + end + + return false + end, + Bakery_use_button_text = function(_, card) + return (card.debuff or G.GAME.used_vouchers.v_jane_token_voucher) and "DEBUFFED" or "ESCAPE" + end, + Bakery_use_joker = function(self, card) + if card.debuff then + return + end + + local times, xtimes = 0, 0 + local extra = card.ability.extra + + for _, v in ipairs(G.consumeables.cards) do + if destructible(v) then + v:start_dissolve({HEX "57ecabff"}, nil, 1.6) + times = times + 1 + end + end + + if times == 0 then + local delay = #G.GAME.tags >= self.tag_threshold and 0 or 1 / #G.GAME.tags + local trigger = delay == 0 and "immediate" or "before" + + for _, v in ipairs(G.GAME.tags) do + Jane.q(function() + attention_text { + scale = 0.7, + align = "cm", + text = "ESC", + cover = v.HUD_tag, + colour = G.C.WHITE, + cover_colour = G.C.BLACK, + hold = 0.3 / G.SETTINGS.GAMESPEED, + } + + play_sound("cancel", 1.66, 0.5) + v.HUD_tag.states.visible = false + v:remove() + end, delay, nil, trigger, nil, delay ~= 0) + + xtimes = xtimes + 1 + end + end + + ease_dollars(math.ceil(times * extra.money + G.GAME.dollars * (math.pow(extra.xmoney, xtimes) - 1))) + end, + tag_threshold = 30, +} + local maxie_quotes = { normal = { "Hey! I hope we can become great friends together!", @@ -608,6 +704,10 @@ SMODS.Joker { end, } +if not Cryptid then + return +end + SMODS.Joker { key = "peppino", atlas = "janepeppino", diff --git a/src/main.lua b/src/main.lua index fad6300..3652fc1 100644 --- a/src/main.lua +++ b/src/main.lua @@ -206,6 +206,28 @@ function Jane.q(func, delay, timer, trigger, blockable, blocking) })) end +local orig_can_highlight = CardArea.can_highlight + +function CardArea:can_highlight(...) + if self ~= G.consumeables then + return orig_can_highlight(self, ...) + end + + --- Allows more flexibility when using the Escapey joker to delete specific consumables. + self.config.highlighted_limit = 1 / 0 + return true +end + +local orig_highlight = Card.highlight + +function Card:highlight(is_highlighted, ...) + self.highlighted = is_highlighted + + if not G.CONTROLLER.HID.controller then + return orig_highlight(self, is_highlighted, ...) + end +end + function Card:gc() return (self.config or {}).center or {} end diff --git a/src/voucher.lua b/src/voucher.lua index 0b08e31..35ef401 100644 --- a/src/voucher.lua +++ b/src/voucher.lua @@ -35,12 +35,15 @@ SMODS.Voucher { atlas = "janetokenvoucher", loc_txt = { name = "Token Voucher", - text = {"{C:attention}Tokens {}can appear", "in the shop", SMODS.Mods.Roland and "{C:inactive}(Permanently disables Escapey)"}, + text = {"{C:attention}Tokens {}can appear", "in the shop", "{C:inactive}(Disables Escapey)"}, }, pos = {x = 0, y = 0}, cost = 10, + loc_vars = function(_, info_queue, _) + info_queue[#info_queue + 1] = G.P_CENTERS.j_jane_escapey + return {vars = {}} + end, redeem = function(_, _) G.GAME.jane_tokens_rate = 1.5 - G.GAME.modifiers.Roland_debuff_escapey = true end, }