From 3be69067ab20d13a392182c0f93954d612f60202 Mon Sep 17 00:00:00 2001 From: Emik Date: Mon, 13 Jul 2026 22:35:14 +0200 Subject: [PATCH] Fix Frozen playing card jitter, improve funky autofunc --- manifest.json | 2 +- src/edition.lua | 10 ++++---- src/lib/funky.lua | 59 +++++++++++++++++++++++++++++------------------ 3 files changed, 43 insertions(+), 28 deletions(-) diff --git a/manifest.json b/manifest.json index 848f155..69e2d57 100644 --- a/manifest.json +++ b/manifest.json @@ -3,7 +3,7 @@ "id": "Roland", "name": "Roland", "prefix": "Roland", - "version": "2.9.53", + "version": "2.9.54", "badge_colour": "8BE9FD", "display_name": "Roland", "main_file": "src/main.lua", diff --git a/src/edition.lua b/src/edition.lua index 1bd8bea..4e8fb91 100644 --- a/src/edition.lua +++ b/src/edition.lua @@ -53,20 +53,22 @@ local function freeze(card) return card.ability end - (card.ability or {}).Roland_crimson = not not (card.ability or {}).Roland_crimson local config = card.config or {} + (card.ability or {}).Roland_crimson = not not (card.ability or {}).Roland_crimson card.Roland_frozen_base = card.Roland_frozen_base or copy(card.base) card.Roland_frozen_card = card.Roland_frozen_card or copy(config.card) card.Roland_frozen_ability = card.Roland_frozen_ability or copy(card.ability) - card.base = card.Roland_frozen_base and copy(card.Roland_frozen_base) or card.base + + local diff = type(card.set_sprites) == "function" and + f(card.Roland_frozen_card):diff(config.card, f.chain(type, f.nq "table")) + config.card = card.Roland_frozen_card and copy(card.Roland_frozen_card) or config.card card.ability = card.Roland_frozen_ability and copy(card.Roland_frozen_ability) or card.ability card.Roland_frozen = card.Roland_frozen or {probability = SMODS.get_probability_vars(card, 1, 1)} - if type(card.set_sprites) == "function" and - f(card.Roland_frozen_card):diff(config.card) then + if diff then card:set_sprites(card.config.center, card.config.card) end diff --git a/src/lib/funky.lua b/src/lib/funky.lua index f611560..f6f2bd9 100644 --- a/src/lib/funky.lua +++ b/src/lib/funky.lua @@ -9,7 +9,7 @@ local f = {} if not f then ---@generic I, O - ---@param first string|fun(v: I): O + ---@param first integer|string|fun(v: I): O ---@return fun(v: I): O ---@nodiscard function f.chain(first) @@ -17,8 +17,8 @@ if not f then end ---@generic I, T, O - ---@param first string|fun(v: I): T - ---@param second string|fun(v: T): O + ---@param first integer|string|fun(v: I): T + ---@param second integer|string|fun(v: T): O ---@return fun(v: I): O ---@nodiscard function f.chain(first, second) @@ -26,9 +26,9 @@ if not f then end ---@generic I, T1, T2, O - ---@param first string|fun(v: I): T1 - ---@param second string|fun(v: T1): T2 - ---@param third string|fun(v: T2): O + ---@param first integer|string|fun(v: I): T1 + ---@param second integer|string|fun(v: T1): T2 + ---@param third integer|string|fun(v: T2): O ---@return fun(v: I): O ---@nodiscard function f.chain(first, second, third) @@ -36,10 +36,10 @@ if not f then end ---@generic I, T1, T2, T3, O - ---@param first string|fun(v: I): T1 - ---@param second string|fun(v: T1): T2 - ---@param third string|fun(v: T2): T3 - ---@param fourth string|fun(v: T3): O + ---@param first integer|string|fun(v: I): T1 + ---@param second integer|string|fun(v: T1): T2 + ---@param third integer|string|fun(v: T2): T3 + ---@param fourth integer|string|fun(v: T3): O ---@return fun(v: I): O ---@nodiscard function f.chain(first, second, third, fourth) @@ -47,11 +47,11 @@ if not f then end ---@generic I, T1, T2, T3, T4, O - ---@param first string|fun(v: I): T1 - ---@param second string|fun(v: T1): T2 - ---@param third string|fun(v: T2): T3 - ---@param fourth string|fun(v: T3): T4 - ---@param fifth string|fun(v: T4): O + ---@param first integer|string|fun(v: I): T1 + ---@param second integer|string|fun(v: T1): T2 + ---@param third integer|string|fun(v: T2): T3 + ---@param fourth integer|string|fun(v: T3): T4 + ---@param fifth integer|string|fun(v: T4): O ---@return fun(v: I): O ---@nodiscard function f.chain(first, second, third, fourth, fifth) @@ -59,7 +59,7 @@ if not f then end ---@generic I, O - ---@param all { [1]: (string|fun(v: I): O) } + ---@param all { [1]: (integer|string|fun(v: I): O) } ---@return fun(v: I): O ---@nodiscard function f.chain(all) @@ -67,7 +67,7 @@ if not f then end ---@generic I, T, O - ---@param all { [1]: (string|fun(v: I): T), [2]: (string|fun(v: T): O) } + ---@param all { [1]: (integer|string|fun(v: I): T), [2]: (integer|string|fun(v: T): O) } ---@return fun(v: I): O ---@nodiscard function f.chain(all) @@ -75,7 +75,7 @@ if not f then end ---@generic I, T1, T2, O - ---@param all { [1]: (string|fun(v: I): T1), [2]: (string|fun(v: T1): T2), [3]: (string|fun(v: T2): O) } + ---@param all { [1]: (integer|string|fun(v: I): T1), [2]: (integer|string|fun(v: T1): T2), [3]: (integer|string|fun(v: T2): O) } ---@return fun(v: I): O ---@nodiscard function f.chain(all) @@ -83,7 +83,7 @@ if not f then end ---@generic I, T1, T2, T3, O - ---@param all { [1]: (string|fun(v: I): T1), [2]: (string|fun(v: T1): T2), [3]: (string|fun(v: T2): T3), [4]: (string|fun(v: T3): O) } + ---@param all { [1]: (integer|string|fun(v: I): T1), [2]: (integer|string|fun(v: T1): T2), [3]: (integer|string|fun(v: T2): T3), [4]: (integer|string|fun(v: T3): O) } ---@return fun(v: I): O ---@nodiscard function f.chain(all) @@ -91,7 +91,7 @@ if not f then end ---@generic I, T1, T2, T3, T4, O - ---@param all { [1]: (string|fun(v: I): T1), [2]: (string|fun(v: T1): T2), [3]: (string|fun(v: T2): T3), [4]: (string|fun(v: T3): T4), [4]: (string|fun(v: T4): O) } + ---@param all { [1]: (integer|string|fun(v: I): T1), [2]: (integer|string|fun(v: T1): T2), [3]: (integer|string|fun(v: T2): T3), [4]: (integer|string|fun(v: T3): T4), [4]: (integer|string|fun(v: T4): O) } ---@return fun(v: I): O ---@nodiscard function f.chain(all) @@ -114,7 +114,17 @@ local none ---@return T ---@nodiscard local function autofunc(func) - return type(func) == "string" and f.indices(func) or func or f.id + if func == false then + return f.fals + elseif func == true then + return f.tru + elseif type(func) == "number" then + return f.arg(func) + elseif type(func) == "string" then + return f.indices(func) + else + return func or f.id + end end ---@generic K, V @@ -722,12 +732,15 @@ end ---@generic K, V ---@param self F|{ [K]: V } ---@param other { [K]: V } +---@param func? fun(v: V, k: K): any ---@return K? ---@overload fun(self: F|{ [K]: V }, func: string): integer ---@nodiscard -function f:diff(other) +function f:diff(other, func) + func = autofunc(func) + for k, v in self.next do - if other[k] ~= v then + if (not func or func(v, k)) and other[k] ~= v then return k end end