From f6fc9cc357b1825f53d9e0284fd3da9c97765b62 Mon Sep 17 00:00:00 2001 From: Emik Date: Wed, 3 Jun 2026 22:01:52 +0200 Subject: [PATCH] Improve Frozen compatibility, Nerf Arctic Circle --- localization/en-us.lua | 4 +-- lovely.toml | 16 +++++++--- manifest.json | 2 +- src/edition.lua | 71 +++++++++++++++++++----------------------- src/joker.lua | 29 +++++++++-------- src/lib/funky.lua | 22 ++++++++----- 6 files changed, 78 insertions(+), 66 deletions(-) diff --git a/localization/en-us.lua b/localization/en-us.lua index fc5451e..1866748 100644 --- a/localization/en-us.lua +++ b/localization/en-us.lua @@ -125,7 +125,7 @@ return { }, j_Roland_arctic = { name = "Arctic Circle", - text = {"Retrigger {C:dark_edition}Frozen {}cards", "Retrigger playing cards"}, + text = {"Retrigger {C:attention}all", "{C:dark_edition}Frozen {}cards"}, }, j_Roland_artemis = { name = "Artemis X", @@ -261,7 +261,7 @@ return { }, j_Roland_phytoestrogens = { name = "Phytoestrogens", - text = {"{C:mult}+Chips{} Mult", "{X:mult,C:white}X#1#{} Mult"}, + text = {"{C:mult}+Chips{} Mult, {X:mult,C:white}X#1#{} Mult"}, }, j_Roland_sapling = { name = "Sapling", diff --git a/lovely.toml b/lovely.toml index 8311a94..f6918d6 100644 --- a/lovely.toml +++ b/lovely.toml @@ -12,12 +12,12 @@ priority = -2 target = "game.lua" pattern = "self.GAME.round_resets.blind_choices.Boss = get_new_boss()" position = "before" -payload = ''' +payload = """ if G.GAME.modifiers.Roland_blossom_deck then self.GAME.round_resets.blind_choices.Small = get_new_boss() self.GAME.round_resets.blind_choices.Big = get_new_boss() end -''' +""" match_indent = true [[patches]] @@ -25,12 +25,12 @@ match_indent = true target = "functions/common_events.lua" pattern = "G.GAME.round_resets.blind_choices.Boss = get_new_boss()" position = "before" -payload = ''' +payload = """ if G.GAME.modifiers.Roland_blossom_deck then G.GAME.round_resets.blind_choices.Small = get_new_boss() G.GAME.round_resets.blind_choices.Big = get_new_boss() end -''' +""" match_indent = true [[patches]] @@ -85,3 +85,11 @@ payload = """if next(SMODS.find_card "j_Roland_misfortune") then card:set_edition "e_negative" end""" match_indent = true + +[[patches]] +[patches.regex] +target = "card.lua" +pattern = "math\\.floor\\(\\(G\\.GAME\\.dollars \\+ \\(G\\.GAME\\.dollar_buffer or 0\\)\\)/self\\.ability\\.extra\\.dollars\\)" +position = "at" +payload = "G.P_CENTERS.j_erosion:mult(self)" +match_indent = true diff --git a/manifest.json b/manifest.json index 9f2cb8f..be5dfea 100644 --- a/manifest.json +++ b/manifest.json @@ -3,7 +3,7 @@ "id": "Roland", "name": "Roland", "prefix": "Roland", - "version": "2.8.1", + "version": "2.8.2", "badge_colour": "8BE9FD", "display_name": "Roland", "main_file": "src/main.lua", diff --git a/src/edition.lua b/src/edition.lua index 759b3ac..8d51b32 100644 --- a/src/edition.lua +++ b/src/edition.lua @@ -17,7 +17,6 @@ local frozen_sounds = f(4):map(frozen_sound):map("key"):table() local needs_chip_mult_override = { Bull = true, - Erosion = true, Misprint = true, TierList = true, Bootstraps = true, @@ -48,7 +47,7 @@ local function freeze(card) ---@return T local function copy(x) return type(x) == "table" and f(x):map(copy):where(function(v, k) - return k ~= "Roland_frozen_proxy" and (k ~= "nine_tally" or v ~= 0) + return k ~= "nine_tally" or v ~= 0 end):table() or x end @@ -58,7 +57,7 @@ local function freeze(card) card.Roland_frozen_ability = card.Roland_frozen_ability or copy(card.ability) card.ability = card.Roland_frozen_ability and copy(card.Roland_frozen_ability) or card.ability - card.Roland_frozen_probability = card.Roland_frozen_probability or SMODS.get_probability_vars(card, 1, 1) + card.Roland_frozen = card.Roland_frozen and {probability = SMODS.get_probability_vars(card, 1, 1)} local ability, ret = card.ability, card.Roland_frozen_ability if type(ability) ~= "table" then @@ -93,15 +92,10 @@ SMODS.Edition { in_shop = true, apply_to_float = false, calculate = function(_, card, context) - if not context.fix_probability and not context.mod_probability then - freeze(card) - end + local _ = not context.fix_probability and not context.mod_probability and freeze(card) end, on_remove = function(card) - card.Roland_frozen_proxy = nil - card.Roland_frozen_estate = nil - card.Roland_frozen_ability = nil - card.Roland_frozen_probability = nil + card.Roland_frozen, card.Roland_frozen_ability, card.Roland_frozen_current_round = nil, nil, nil end, get_weight = function(self) return G.GAME.edition_rate * self.weight @@ -153,7 +147,7 @@ function Card:calculate_joker(context, ...) local ret = {orig_calculate_joker(self, context, ...)} - if not is_frozen or not ret[1] then + if not is_frozen or type(ret[1]) ~= "table" then return unpack(ret) end @@ -163,24 +157,11 @@ function Card:calculate_joker(context, ...) return unpack(ret) end - ability.Roland_frozen_mult_mod = ability.Roland_frozen_mult_mod or ret[1].mult_mod - ability.Roland_frozen_chip_mod = ability.Roland_frozen_chip_mod or ret[1].chip_mod - ability.Roland_frozen_xmult = ability.Roland_frozen_xmult or ret[1].xmult - - return { - chip_mod = ability.Roland_frozen_chip_mod, - mult_mod = ability.Roland_frozen_mult_mod, - xmult = ability.Roland_frozen_xmult, - message = localize { - type = "variable", - key = "a_mult", - vars = { - ability.Roland_frozen_mult_mod or - ability.Roland_frozen_chip_mod or - ability.Roland_frozen_xmult, - }, - }, - } + return f {mult = "mult_mod", chips = "chip_mod", xmult = "xmult", x_mult = "x_mult"}:map(function(v) + local key = "Roland_frozen_" .. v + ability[key] = ability[key] or ret[1][v] + return ability[key] + end):where(f().id):table() end local orig_calculate_dollar_bonus = Card.calculate_dollar_bonus @@ -205,9 +186,21 @@ end local orig_get_probability_vars = SMODS.get_probability_vars +function G.P_CENTERS.j_erosion:mult(card) + local ability = card.Roland_frozen_ability + local ret = math.floor((G.GAME.dollars + (G.GAME.dollar_buffer or 0)) / card.ability.extra.dollars) + + if not ability then + return ret + end + + ability.Roland_erosion_mult = ability.Roland_erosion_mult or ret + return ability.Roland_erosion_mult +end + function SMODS.get_probability_vars(trigger_obj, ...) local numerator, denominator = orig_get_probability_vars(trigger_obj, ...) - return trigger_obj and trigger_obj.Roland_frozen_probability or numerator, denominator + return trigger_obj and (trigger_obj.Roland_frozen or {}).probability or numerator, denominator end q(function() @@ -217,19 +210,19 @@ q(function() return end - ---@param card Card|{ Roland_frozen_estate: integer } + ---@param card Card|{ Roland_frozen: {estate: integer} } local function estate_pos(card) if card.area ~= G.jokers and card.area.config.type ~= "title" then return 1 end - card.Roland_frozen_estate = card.Roland_frozen_estate and - card.Roland_frozen_estate or + card.Roland_frozen.estate = card.Roland_frozen.estate and + card.Roland_frozen.estate or (f(card.area.cards):swap():any(function(_, k) return k == card end) or 1) - return card.Roland_frozen_estate + return card.Roland_frozen.estate end local orig_calculate = estate.calculate @@ -268,18 +261,18 @@ q(function() return end - ---@param card Card|{ Roland_frozen_proxy: number } + ---@param card Card|{ Roland_frozen: {proxy: string} } local function get_proxied_joker(card) if not G.jokers or not G.jokers.cards then return end - card.Roland_frozen_proxy = card.Roland_frozen_proxy or + card.Roland_frozen.proxy = card.Roland_frozen.proxy or (Bakery_API.get_proxied_joker() or card).config.center.key ---@param v Card local function eq(v) - return v.config.center.key == card.Roland_frozen_proxy + return v.config.center.key == card.Roland_frozen.proxy end return f(G.jokers.cards):any(eq) ---@type Card? @@ -290,9 +283,9 @@ q(function() function proxy:calculate(card, context, ...) if not card or not card.edition or not card.edition.Roland_frozen then return orig_calculate(self, card, context, ...) + else + return SMODS.blueprint_effect(card, get_proxied_joker(card), context) end - - return SMODS.blueprint_effect(card, get_proxied_joker(card), context) end local orig_loc_vars = proxy.loc_vars diff --git a/src/joker.lua b/src/joker.lua index e9af943..58d1e34 100644 --- a/src/joker.lua +++ b/src/joker.lua @@ -438,7 +438,7 @@ joker { pronouns = "they_them", cost = 10, rarity = 3, - config = {extra = {frozen = 2, non_frozen = 1}}, + config = {extra = {frozen = 1}}, attributes = {"retrigger", "editions"}, eternal_compat = true, blueprint_compat = true, @@ -449,18 +449,21 @@ joker { calculate = function(_, card, context) local extra = card.ability.extra - return (context.repetition and context.other_card) and - {card = card, repetitions = is_frozen(context.other_card) and extra.frozen or extra.non_frozen} or - SMODS.merge_effects( - f(G.jokers.cards):where(is_frozen):map(function(v) - return SMODS.blueprint_effect(card, v, context) or true - end):where(function(v) - return type(v) == "table" - end):map(function(v) - v.colour = G.C.DARK_EDITION - return v - end):values():table() - ) + if context.repetition and context.other_card then + local repetitions = is_frozen(context.other_card) and extra.frozen or extra.non_frozen + return repetitions ~= 0 and {card = card, repetitions = repetitions} or nil + end + + return SMODS.merge_effects( + f(G.jokers.cards):where(is_frozen):map(function(v) + return SMODS.blueprint_effect(card, v, context) or true + end):where(function(v) + return type(v) == "table" + end):map(function(v) + v.colour = G.C.DARK_EDITION + return v + end):values():table() + ) end, } diff --git a/src/lib/funky.lua b/src/lib/funky.lua index 6b5e326..9c3b7da 100644 --- a/src/lib/funky.lua +++ b/src/lib/funky.lua @@ -18,6 +18,14 @@ end ---@type F local none +---@generic T: F|function|string|nil +---@param func T +---@return T +---@nodiscard +local function autofunc(func) + return type(func) == "string" and f.index(func) or func or f.id +end + ---@generic K, V ---@param tbl table ---@param fpairs? fun(t: table): (fun(table: table, index?: K): K, V) @@ -236,7 +244,7 @@ end ---@nodiscard ---@overload fun(self: F|{ [K]: V }, func: string): F|{ [K]: U } function f:map(func) - func = type(func) == "string" and f.index(func) or func + func = autofunc(func) return f.new(function() local k, v = self:next() @@ -257,7 +265,7 @@ end function f:flatmap(func, fpairs) -- local i = 0 local vt, vk, vv, vp - func = type(func) == "string" and f.index(func) or func + func = autofunc(func) return f.new(function() if vk then @@ -307,7 +315,7 @@ end function f:flatmap(func, fpairs) -- local i = 0 local vt, vk, vv, vp - func = type(func) == "string" and f.index(func) or func + func = autofunc(func) return f.new(function() if vk then @@ -355,7 +363,7 @@ end ---@nodiscard ---@overload fun(self: F|{ [K]: V }, func: string, is?: any): F|{ [K]: V } function f:where(func, is) - func = type(func) == "string" and f.index(func) or func + func = autofunc(func) return f.new(function() local k, v @@ -517,7 +525,7 @@ end ---@nodiscard ---@overload fun(self: F|{ [K]: V }, func: string?): boolean|V function f:any(func) - func = type(func) == "string" and f.index(func) or func + func = autofunc(func) for k, v in self.next do if not func or func(v, k) then @@ -535,7 +543,7 @@ end ---@nodiscard ---@overload fun(self: F|{ [K]: V }, func: string?): boolean|V function f:all(func) - func = type(func) == "string" and f.index(func) or func + func = autofunc(func) for k, v in self.next do if not func or not func(v, k) then @@ -554,7 +562,7 @@ end ---@overload fun(self: F|{ [K]: V }, func: string): integer function f:count(func) local ret = 0 - func = type(func) == "string" and f.index(func) or func + func = autofunc(func) for k, v in self.next do if not func or func(v, k) then