diff --git a/lsp_def/utils.lua b/lsp_def/utils.lua index 6fa300233..ddbb855de 100644 --- a/lsp_def/utils.lua +++ b/lsp_def/utils.lua @@ -923,6 +923,12 @@ function SMODS.copy_card(card, args) end ---@return Card|table function SMODS.add_to_deck(card, args) end +-- Util function to render one card to a `.png` file, saved to `love.filesystem.getSaveDirectory()` +---@param card Card|table Card to save as an image +---@param scale number? Scale to render the card at (default = G.SETTINGS.GRAPHICS.texture_scaling) +---@param filename string? Name of the file (default = [center.key]) +function SMODS.card_to_image(card, scale, filename) end + ---Checks if a card counts as at least one suit that matches the provided suit shade ---@param card Card|table Card to check ---@param shade string Suit shade to check for diff --git a/src/game_object.lua b/src/game_object.lua index 1b2d155e0..a7cab592f 100644 --- a/src/game_object.lua +++ b/src/game_object.lua @@ -3734,7 +3734,7 @@ SMODS.UndiscoveredCompat = { end } - SMODS.Keybind { + SMODS.Keybind { key_pressed = 'f5', held_keys = { "lalt" }, event = 'pressed', @@ -3744,6 +3744,22 @@ SMODS.UndiscoveredCompat = { end } + SMODS.Keybind { + key_pressed = 'f2', + event = 'pressed', + action = function(self) + local target = G.CONTROLLER.hovering.target or G.CONTROLLER.focused.target + if not _RELEASE_MODE and target and type(target.is) == "function" and target:is(Card) then + local scale = 0 + for i=0,9,1 do + if love.keyboard.isDown(""..i) then scale = scale + (i == 0 and 10 or i) end + end + if scale <= 0 then scale = G.SETTINGS.GRAPHICS.texture_scaling end + SMODS.card_to_image(target, scale) + end + end + } + ------------------------------------------------------------------------------------------------- ------- API CODE GameObject.Achievement ------------------------------------------------------------------------------------------------- diff --git a/src/utils.lua b/src/utils.lua index 39063631b..48f1d56aa 100644 --- a/src/utils.lua +++ b/src/utils.lua @@ -4377,6 +4377,69 @@ function SMODS.add_to_deck(card, args) return card end +-- Hook for the below Util function +local sprite_draw_from_ref = Sprite.draw_from +function Sprite:draw_from(...) + local old_filter_min, old_filter_mag + if self.atlas and SMODS.texture_filter_override then + old_filter_min, old_filter_mag = self.atlas.image:getFilter() + self.atlas.image:setFilter(SMODS.texture_filter_override, SMODS.texture_filter_override) + end + local ret = sprite_draw_from_ref(self, ...) + if self.atlas and SMODS.texture_filter_override then + self.atlas.image:setFilter(old_filter_min, old_filter_mag) + end + return ret +end + +-- Hook for the below Util function +local sprite_draw_self_ref = Sprite.draw_self +function Sprite:draw_self(...) + local old_filter_min, old_filter_mag + if self.atlas and SMODS.texture_filter_override then + old_filter_min, old_filter_mag = self.atlas.image:getFilter() + self.atlas.image:setFilter(SMODS.texture_filter_override, SMODS.texture_filter_override) + end + local ret = sprite_draw_self_ref(self, ...) + if self.atlas and SMODS.texture_filter_override then + self.atlas.image:setFilter(old_filter_min, old_filter_mag) + end + return ret +end + +-- Util function to render one card to a .png file (usually saved to the mods folder's parent directory) +function SMODS.card_to_image(card, scale, filename) + if not type(card) == "table" then return end + local key = ((card.config or {}).center or {}).key or "card_to_image" + scale = scale or G.SETTINGS.GRAPHICS.texture_scaling + filename = (filename or key == "j_joker" and "jimbo" or key) .. ".png" + + local canvas = love.graphics.newCanvas(71 * scale, 95 * scale, {type = '2d', readable = true}) + canvas:setFilter('nearest', 'nearest') + + local old_t = SMODS.shallow_copy(card.T) + local old_shadow = card.no_shadow + local old_rm = G.SETTINGS.reduced_motion + card.T.r = 0 + local old_scale = card.T.scale + card.T.scale = scale / G.TILE_H * G.window_prev.orig_scale * G.window_prev.orig_scale/G.TILESCALE * 1.5 -- Don't ask me why I had to multiply by 1.5 here, and by the per-dimension factors below, I do not know,,, (this may have been brute-tinkered) + local w, h = old_t.w * 0.997, old_t.h * 0.99348 -- (well these factors are needed to remove extra pixels in height/width for scales == 2.0 -> 16.0 (at least)) + card:hard_set_T(w/2*(card.T.scale-1), h/2*(card.T.scale-1), w, h) + card.no_shadow = true + G.SETTINGS.reduced_motion = true + SMODS.texture_filter_override = "nearest" + canvas:renderTo(card.draw, card) + SMODS.texture_filter_override = nil + G.SETTINGS.reduced_motion = old_rm + card.no_shadow = old_shadow + card.T.scale = old_scale + card:hard_set_T(old_t.x, old_t.y, old_t.w, old_t.h) + + local image_data = canvas:newImageData() + image_data:encode("png", filename) + print("SMODS : Saved card image to "..love.filesystem.getSaveDirectory().."/"..filename .. " at scale " .. scale) +end + function Card:is_suit_shade(shade, bypass_debuff) if self.debuff and not bypass_debuff then return end if SMODS.has_no_suit(self) then