From eaed4f8486eac4579fddb9a84f72325516676c75 Mon Sep 17 00:00:00 2001 From: Emik Date: Mon, 2 Feb 2026 20:51:51 +0100 Subject: [PATCH] Localize almost everything --- assets/1x/iphone.png | Bin 0 -> 7201 bytes assets/2x/Pasted image.png | Bin 0 -> 9075 bytes assets/2x/afterimage.png | Bin 3337 -> 3337 bytes assets/2x/blind.png | Bin 2653 -> 2653 bytes assets/2x/escapey.png | Bin 1592 -> 1592 bytes assets/2x/icon.png | Bin 80997 -> 80997 bytes assets/2x/iphone.png | Bin 0 -> 9273 bytes assets/2x/martingale.png | Bin 398 -> 398 bytes assets/2x/void.png | Bin 13455 -> 13455 bytes assets/sounds/milestone.ogg | Bin 0 -> 10160 bytes localization/en-us.lua | 154 ++++++++++++++++++++++++++- lovely.toml | 4 +- src/charm.lua | 11 +- src/functional.lua | 4 +- src/joker.lua | 200 +++++++++++++++++++++++++++++++----- src/seal.lua | 4 +- src/spectral.lua | 2 +- 17 files changed, 341 insertions(+), 38 deletions(-) create mode 100644 assets/1x/iphone.png create mode 100644 assets/2x/Pasted image.png create mode 100644 assets/2x/iphone.png create mode 100644 assets/sounds/milestone.ogg diff --git a/assets/1x/iphone.png b/assets/1x/iphone.png new file mode 100644 index 0000000000000000000000000000000000000000..53e081827899b32684b0b814776581b07933bbdb GIT binary patch literal 7201 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 OFnGH9xvX&}m}naqSQ!|Y8&2V2U|?YI MboFyt=akR{0M$MZHUIzs delta 56 zcmcaBa#v)+9!^FnUL$7KyjjyX9xdfmHqFVdQ&MBb@0NGIwjQ{`u diff --git a/assets/2x/escapey.png b/assets/2x/escapey.png index a3dfde0e41910b8916dffba04cbbf721782b1d5f..14bfd6b6cca6b2d179abde55f15e9f7fabf5a0c8 100644 GIT binary patch delta 56 zcmdnNvx8^C22Lg>VMP|ZfTJ}VcgC&}m}naqSQ!|Y8&2V2U|?YI MboFyt=akR{0J(M!rvLx| delta 56 zcmdnNvx8^C22MsPUL$7KyjjyX?u=noHqFVdQ&MBb@0KJJ0{r~^~ diff --git a/assets/2x/icon.png b/assets/2x/icon.png index 11ace8831241f44a0a82ec96b6958609b17b5054..45adea8248d1245be98e31329125390ba9193f25 100644 GIT binary patch delta 61 zcmaF*gXQTDmI-y7OiaRxEOr4$YZ}|PwlnUwRyNW#FbXlWv@$lfGBD9LFt9Q(FgKjS R!@$76;OXk;vd$@?2>^bN5+48n delta 61 zcmaF*gXQTDmI-y7j8eQt%&d8{rZ={4ZD-tVt!$`kWENs*Y-MU-WniprU|?lnkRkA# Rmw|zS!PC{xWt~$(699sQ5_SLp diff --git a/assets/2x/iphone.png b/assets/2x/iphone.png new file mode 100644 index 0000000000000000000000000000000000000000..9059d4f6cc86c6d62f9b64d2b0f931a9eaa87c15 GIT binary patch literal 9273 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 N$Vn+nR*IVh{U5?f!!!T@ literal 0 HcmV?d00001 diff --git a/assets/2x/martingale.png b/assets/2x/martingale.png index 1ce9b94125d1adcf56e64b9e29ccd7c190895cbe..630fa5ef4e9cee2d8a97d3e714aa389b5725a138 100644 GIT binary patch delta 55 zcmeBU?qivDatjJ;)aI|J({~cu`T?3;KLrW`TV=Ds_Z36=<0|RrzDLf1e3=E#G KelF{r5}E*;*bYbl delta 55 zcmeBU?qiptfYsAc&H*5OD{yWNsx<+OphQ?N=237{f+6D$z1_l`d&v_Xb7#KWV L{an^LB{Ts5pY;x( diff --git a/assets/2x/void.png b/assets/2x/void.png index 8fb66fed12ef0ea57e66ed48ac0ad0ae689f0366..1d5845f3cfa363a93eceb201d4cb741fa9c6c5ed 100644 GIT binary patch delta 56 zcmeCr?9ZH#$;redtjJ;)aI|J)(Jy0VBV7Zd5JO8VV`D1=6Kw+nD+2>_!znxr3=9mO Lu6{1-oD!M<)Hn}K delta 56 zcmeCr?9ZH#$;l|iYsAc&H*5OFqF=_!hPp;(A%@0QrUq69#@Yr3Rt5$c0?&CF7#J8l MUHx3vIVCg!0N6_pqyPW_ diff --git a/assets/sounds/milestone.ogg b/assets/sounds/milestone.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3def76fdb6267eef4198d2bfaa9db99c3c7102ac GIT binary patch literal 10160 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 F{1?^Ros9qh literal 0 HcmV?d00001 diff --git a/localization/en-us.lua b/localization/en-us.lua index fdc583a..a9208e6 100644 --- a/localization/en-us.lua +++ b/localization/en-us.lua @@ -10,8 +10,22 @@ return { }, }, b_Roland_go = { - name = "placeholder", - text = {"grr"}, + name = "Pass GO Deck", + text = { + "Start with a {C:attention}Credit Card", + "Set money to {C:money}0$", + "when entering the shop", + }, + }, + }, + BakeryCharm = { + BakeryCharm_Roland_iphone = { + name = "fat i phone", + text = { + "Enter the shop", + "when any {C:attention}Blind", + "is {C:attention}skipped", + }, }, }, Blind = { @@ -37,6 +51,14 @@ return { }, }, Joker = { + j_Roland_bulldozer = { + name = "Bulldozer", + text = { + "Give {X:red,C:white}XMult{} equal to", + "the current {C:attention}Blind Size{C:attention}", + "{C:inactive}(Currently {X:red,C:white}X#1#{C:inactive})", + }, + }, j_Roland_escapey = { name = "Escapey", text = { @@ -63,6 +85,46 @@ return { }, }, }, + j_Roland_estrogen = { + name = "Estrogen", + text = {"{C:mult}+Chips{} Mult"}, + }, + j_Roland_hexagon = { + name = "Hexagon", + text = { + "Earn {C:money}#1#${} if", + "played hand is a", + "{C:attention}Four of a Kind", + }, + }, + j_Roland_hexagoner = { + name = "Hexagoner", + text = { + "This Joker gains the", + "rank of {C:attention}unscored cards", + "if played hand is a", + "{C:attention}Four of a Kind", + "{C:inactive}(Currently {C:red}+#1#{C:inactive} Mult)", + }, + }, + j_Roland_hexagonest = { + name = "Hexagonest", + text = { + "{C:attention}Unscored cards{} add a", + "permanent copy to deck", + "and draw it to {C:blue}hand", + "if played hand is a", + "{C:attention}Four of a Kind", + }, + }, + j_Roland_misfortune = { + name = "Misfortune Cookie", + text = { + "{C:tarot}Tarot{} cards created", + "by {C:tarot}Purple Seals", + "become {C:dark_edition}Negative", + }, + }, j_Roland_martingale = { name = "Martingale", text = { @@ -76,6 +138,72 @@ return { "{s:0}Otherwise {C:green,s:0}#1# in #2#{s:0} chance to give {X:mult,C:white,s:0}X#9#{s:0} Mult", }, }, + j_Roland_mrsbones = { + name = "Mrs. Bones", + text = { + "{X:red,C:white}X#1#{} Mult", + "{C:red,E:1}Self destructs{} if {C:chips}chips", + "scored at the end of", + "the {C:attention}Blind{} are less than", + "{C:attention}#2#%{} of required {C:chips}chips", + }, + }, + j_Roland_msjoker = { + name = "Ms. Joker", + text = {"{C:chips}+#1#{} Chips"}, + }, + j_Roland_oops = { + name = "Oops! All 7s", + text = { + "Listed {C:green,E:1}probabilities", + "{C:attention}increase{} for each", + "{C:hand}hand played this round", + "{C:inactive}(Currently {C:green}X#1#{C:inactive})", + }, + }, + j_Roland_rigged = { + name = "Rigged", + text = { + "{C:blue}#1#{}#2#{C:green}#3#{}#4#{C:red}#5#{}#6#{C:edition}#7#{}#8#{C:legendary}#9#{}#10#{C:dark_edition}#11#", + "jokers cannot appear", + "{C:attention}Upgrade{} this card by", + "obtaining another {C:attention}Rigged", + }, + }, + j_Roland_sunny = { + name = "Sunny Side Up", + text = { + "Sell this Joker to", + "{C:attention}draw{} the bottom", + "card of the {C:hand}deck", + "{C:inactive}(Currently {V:1}#1##2#{V:2}#3#{C:inactive})", + }, + }, + j_Roland_temple = { + name = "Temple", + text = { + "{C:attention}Unscored {C:enhanced}wild{} cards", + "give {X:red,C:white}X#1#{} Mult", + }, + }, + j_Roland_yard = { + name = "Yard Sale", + text = { + "Gain {C:money}#1#${} when a", + "card is {C:attention}removed", + "from the deck", + }, + }, + }, + Other = { + Roland_glass_seal = { + name = "Glass Seal", + text = { + "Gives a random tag at", + "the end of the {C:attention}Blind", + "{C:red,E:1}Self destructs{} if {C:attention}drawn", + }, + }, }, Spectral = { c_Roland_afterimage = { @@ -86,6 +214,22 @@ return { "{C:red}#2#{} hand size", }, }, + c_Roland_dual = { + name = "Dual", + text = { + "Add random seals", + "to {C:attention}#1#{} random", + "cards in {C:hands}hand", + }, + }, + c_Roland_mirror = { + name = "Mirror", + text = { + "Add a {C:dark_edition}Glass Tag", + "to {C:attention}#1#{} selected", + "card in {C:hands}hand", + }, + }, c_Roland_void = { name = "Void", text = { @@ -102,7 +246,13 @@ return { c_Roland_Pastries = "Sweet Pastries", }, v_dictionary = { + b_Roland_comma = ", ", + b_Roland_of = " of ", b_Roland_most_common_card = "(Rank)", + b_Roland_na = "N/A", + }, + labels = { + Roland_glass_seal = "Glass Seal", }, v_text = { ch_c_Roland_Jokerful = {"Only the {C:common}default Joker{} can appear in shops"}, diff --git a/lovely.toml b/lovely.toml index f79db91..8311a94 100644 --- a/lovely.toml +++ b/lovely.toml @@ -71,7 +71,7 @@ target = "card.lua" pattern = "if self.seal == 'Purple' and #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit then" position = "at" payload = """if self.seal == 'Purple' and - (next(SMODS.find_card "j_Roland_negative") or + (next(SMODS.find_card "j_Roland_misfortune") or #G.consumeables.cards + G.GAME.consumeable_buffer < G.consumeables.config.card_limit) then""" match_indent = true @@ -81,7 +81,7 @@ target = "card.lua" pattern = "local card = create_card('Tarot',G.consumeables, nil, nil, nil, nil, nil, '8ba')" position = "after" times = 1 -payload = """if next(SMODS.find_card "j_Roland_negative") then +payload = """if next(SMODS.find_card "j_Roland_misfortune") then card:set_edition "e_negative" end""" match_indent = true diff --git a/src/charm.lua b/src/charm.lua index f316df4..1a12e65 100644 --- a/src/charm.lua +++ b/src/charm.lua @@ -1,8 +1,15 @@ local _, q = unpack(... or require "src.functional") +SMODS.Atlas { + key = "iphone", + path = "iphone.png", + px = 68, + py = 68, +} + Bakery_API.Charm { - key = "tags", - atlas = "void", + key = "iphone", + atlas = "iphone", pos = {x = 0, y = 0}, calculate = function(_, _, context) local _ = context.skip_blind and q(function() diff --git a/src/functional.lua b/src/functional.lua index 9080bc6..f7493a6 100644 --- a/src/functional.lua +++ b/src/functional.lua @@ -23,7 +23,9 @@ local function protect_ev(fun) return fun end +local origf = F local luaf = assert(SMODS.load_file "src/LuaFunctional/functional.lua")() or require "src.LuaFunctional.functional" +F = origf -- We do not condone globals as side effects! if false then ---Returns the elements from the given `list`. This function is equivalent to @@ -70,7 +72,7 @@ end --- Queues an event to be run. --- Note that events added this way implicitly `return true` unless you explicitly `return false`, unlike the vanilla ones. ---- @param fun (fun():boolean?)|Event The event or a function to run turn into an event. +--- @param fun (fun():false|nil)|Event The event or a function to run turn into an event. --- @param front boolean|nil `true` to add the event to the front of the queue, rather than the end. local function q(fun, front) G.E_MANAGER:add_event(protect_ev(fun), nil, front) diff --git a/src/joker.lua b/src/joker.lua index 37f8516..ea29805 100644 --- a/src/joker.lua +++ b/src/joker.lua @@ -45,6 +45,11 @@ local function level_up(hand, by, card) update("", 0, 0, "", 1.1) end +SMODS.Sound { + key = "milestone", + path = "milestone.ogg", +} + SMODS.Atlas { px = 71, py = 95, @@ -67,8 +72,8 @@ SMODS.Joker { sinis = {x = 2, y = 0}, soul_pos = {x = 1, y = 0}, config = {extra = {hands = 2}}, - cost = 8, - rarity = 3, + cost = 6, + rarity = 2, eternal_compat = true, perishable_compat = true, blueprint_compat = false, @@ -203,10 +208,14 @@ SMODS.Joker { level_up(v, 1, card) end) end, + debug_export = function(self, obj) + local to = obj or self + to.f, to.q, to.u = f, q, u + end, } SMODS.Joker { - key = "temp", + key = "msjoker", -- Blue bow atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, @@ -222,7 +231,7 @@ SMODS.Joker { } SMODS.Joker { - key = "temp2", + key = "bulldozer", atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, @@ -240,52 +249,84 @@ SMODS.Joker { } SMODS.Joker { - key = "temp3", + key = "oops", -- Slot machine atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, cost = 8, rarity = 3, - config = {extra = {probability = 1}}, + config = {extra = {probability = 1, delta = 1}}, loc_vars = function(_, _, card) return {vars = {card.ability.extra.probability}} end, calculate = function(_, card, context) if context.mod_probability then return {numerator = card.ability.extra.probability} + elseif context.blind_defeated then + card.ability.extra.probability = card.ability.extra.delta elseif context.after and not context.blueprint then - card.ability.extra.probability = card.ability.extra.probability + 1 + card.ability.extra.probability = card.ability.extra.probability + card.ability.extra.delta end end, } SMODS.Joker { - key = "temp4", + key = "estrogen", atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, - cost = 8, - rarity = 3, + cost = 6, + rarity = 2, calculate = function(_, _, context) return context.joker_main and {mult = hand_chips} or nil end, } SMODS.Joker { - key = "temp5", + key = "sunny", -- Cracked egg atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, cost = 2, rarity = 1, + eternal_compat = false, + loc_vars = function(_, _, card) + local last = ((G.deck or {}).cards or {})[1] + + if last or card.area ~= G.jokers then + return { + vars = { + "", + localize {type = "variable", key = "b_Roland_na"}, + "", + colours = {G.C.JOKER_GREY, G.C.JOKER_GREY}, + }, + } + end + + local suit = last.base.suit + local value = last.base.value + local name = last.ability.name or "" + local no_rank = SMODS.has_no_rank(last) + local no_suit = SMODS.has_no_suit(last) + + return { + vars = { + value and not no_rank and localize(value or 14, "ranks") or name, + not no_rank and not no_suit and localize {type = "variable", key = "b_Roland_of"} or "", + no_suit and "" or localize(suit, "suits_plural"), + colours = {G.C.IMPORTANT, G.C.SUITS[suit] or G.C.JOKER_GREY}, + }, + } + end, calculate = function(_, _, context) local _ = context.selling_self and - draw_card(G.deck, G.hand, 100, "up", false, G.deck.cards[#G.deck.cards]) + draw_card(G.deck, G.hand, 100, "up", false, G.deck.cards[1]) end, } SMODS.Joker { - key = "temp6", + key = "yard", atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, @@ -302,12 +343,12 @@ SMODS.Joker { } SMODS.Joker { - key = "temp7", + key = "hexagon", atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, config = {extra = {money = 2}}, - cost = 3, + cost = 4, rarity = 1, loc_vars = function(_, _, card) return {vars = {card.ability.extra.money}} @@ -320,13 +361,16 @@ SMODS.Joker { } SMODS.Joker { - key = "temp8", + key = "hexagoner", atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, config = {extra = {mult = 0}}, - cost = 8, + cost = 6, rarity = 2, + loc_vars = function(_, _, card) + return {vars = {card.ability.extra.mult}} + end, calculate = function(_, card, context) if context.joker_main then return {mult = card.ability.extra.mult} @@ -341,7 +385,7 @@ SMODS.Joker { } SMODS.Joker { - key = "temp9", + key = "hexagonest", atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, @@ -371,13 +415,16 @@ SMODS.Joker { } SMODS.Joker { - key = "temp10", + key = "temple", atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, config = {extra = {xmult = 1.5}}, - cost = 8, - rarity = 3, + cost = 6, + rarity = 2, + loc_vars = function(_, _, card) + return {vars = {card.ability.extra.xmult}} + end, calculate = function(_, card, context) if context.individual and context.cardarea == "unscored" and @@ -388,7 +435,7 @@ SMODS.Joker { } SMODS.Joker { - key = "negative", + key = "misfortune", atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, @@ -396,26 +443,125 @@ SMODS.Joker { rarity = 2, } +SMODS.Joker { + key = "rigged", + atlas = "void", + config = {extra = {level = "1"}}, -- Strings do not get mutated by other mods, hopefully. + pos = {x = 0, y = 0}, + eternal_compat = false, + cost = 8, + rarity = 2, + loc_vars = function(_, _, card) + return {vars = {}} + end, +} + +---@diagnostic disable-next-line: undefined-global +local rarities = Cryptid and + {{1, "Common"}, {2, "Uncommon"}, {3, "Rare"}, {"cry_epic"}, {4, "Legendary"}, {"cry_exotic"}} or + {{1, "Common"}, {2, "Uncommon"}, {3, "Rare"}, {4, "Legendary"}} + +local orig_poll_rarity = SMODS.poll_rarity + +---@diagnostic disable-next-line: duplicate-set-field +function SMODS.poll_rarity(_pool_key, _rand_key) + local rarity = orig_poll_rarity(_pool_key, _rand_key) + + local max = f(SMODS.find_card "j_Roland_rigged"):reduce(0, function(a, n) + return n.debuff and a or math.max(a, tonumber(n.ability.extra.level)) + end) + + if f(rarities, ipairs):take(max):filter(function(v) + return f(v):any(function(vv) + return vv == rarity + end) + end):any() then + return rarities[max + 1][1] or rarities[#rarities][1] + end + + return rarity +end + +local orig_update = Game.update + +---@diagnostic disable-next-line: duplicate-set-field +function Game:update(dt) + orig_update(self, dt) + + if not G.GAME then + return + end + + local candidates = {} + + local max = f(SMODS.find_card "j_Roland_rigged"):reduce(1, function(a, n) + local level = tonumber(n.ability.extra.level) or 1 + + if not candidates[level] then + candidates[level] = n + elseif level == 1 then + candidates[0] = n + end + + return math.max(a, level) + end) + + for i = math.min(max, #rarities - 2), 1, -1 do + if not candidates[i] then + goto continue + end + + local skip = true + + for j = i - 1, i == 1 and 0 or 1, -1 do + if not candidates[j] then + break + end + + skip = j > 1 + end + + if skip then + goto continue + end + + for j = i - 1, i == 1 and 0 or 1, -1 do + candidates[i].sell_cost = candidates[i].sell_cost + candidates[j].sell_cost + candidates[j].ability.extra.level = "-1" + candidates[j]:start_dissolve() + end + + local extra = candidates[i].ability.extra + local level = tonumber(extra.level) + extra.level = tostring(level + 1) + candidates[i].children.center:set_sprite_pos({x = 0, y = math.min(level or 0, 2)}) + play_sound("Roland_milestone", 0.9 ^ (level - 2)) + ::continue:: + end +end + SMODS.Joker { key = "mrsbones", atlas = "void", pronouns = "they_them", pos = {x = 0, y = 0}, - config = {extra = {xmult = 4}}, - cost = 8, - rarity = 3, + config = {extra = {xmult = 4, requirement = 4}}, + cost = 4, + rarity = 2, + loc_vars = function(_, _, card) + return {vars = {card.ability.extra.xmult, card.ability.extra.requirement * 100}} + end, calculate = function(_, card, context) if context.joker_main then return {xmult = card.ability.extra.xmult} end - if context.blind_defeated and G.GAME.chips / card.ability.extra.xmult < G.GAME.blind.chips then + if context.blind_defeated and G.GAME.chips / card.ability.extra.requirement < G.GAME.blind.chips then q(function() G.hand_text_area.blind_chips:juice_up() G.hand_text_area.game_chips:juice_up() play_sound("tarot1") card:start_dissolve() - return true end) end end, diff --git a/src/seal.lua b/src/seal.lua index 2aa0ecb..2a86a0f 100644 --- a/src/seal.lua +++ b/src/seal.lua @@ -8,11 +8,9 @@ local f, q = unpack(... or require "src.functional") -- } SMODS.Seal { key = "glass", - name = "RolandGlass", - badge_colour = HEX "12f254", atlas = "void", pos = {x = 0, y = 0}, - config = {ready = true}, + badge_colour = HEX "f6f6f6", calculate = function(_, card, context) if context.setting_blind or context.starting_shop then card.Roland_glass = nil diff --git a/src/spectral.lua b/src/spectral.lua index 0435f04..ec47bba 100644 --- a/src/spectral.lua +++ b/src/spectral.lua @@ -79,7 +79,7 @@ SMODS.Consumable { } SMODS.Consumable { - key = "glass", + key = "mirror", set = "Spectral", pos = {x = 0, y = 0}, cost = 6,