mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-17 19:24:01 +02:00
117 lines
4.0 KiB
Lua
117 lines
4.0 KiB
Lua
-- Driver: authors a CRT bezel skin from nothing using only Skin Studio
|
|
-- actions -- New, drop the art on the window, Detect screen, Save -- then
|
|
-- loads the saved folder back and renders the game through it. Answers
|
|
-- "could the studio have made tv_crt?" by doing it.
|
|
-- SHOT_DIR=/tmp/author POKEPORT_DRIVER=tests/drivers/skin_studio_author_tv.lua love .
|
|
return function(game)
|
|
local U = dofile("tests/drivers/util.lua")
|
|
local Studio = require("src.ui.SkinStudio")
|
|
local TouchSkin = require("src.core.TouchSkin")
|
|
|
|
local dir = os.getenv("SHOT_DIR") or "/tmp/author"
|
|
os.execute('mkdir -p "' .. dir .. '" 2>/dev/null')
|
|
love.window.setMode(1280, 720, { resizable = true, highdpi = true })
|
|
U.wait(2)
|
|
|
|
local baseDraw = love.draw
|
|
local pending = nil
|
|
love.draw = function()
|
|
Studio.draw()
|
|
if pending then
|
|
local path = pending
|
|
pending = nil
|
|
love.graphics.captureScreenshot(function(imagedata)
|
|
local f = io.open(path, "wb")
|
|
if f then f:write(imagedata:encode("png"):getString()) f:close() end
|
|
end)
|
|
end
|
|
end
|
|
local function shot(name)
|
|
pending = dir .. "/" .. name
|
|
for _ = 1, 90 do
|
|
if not pending then break end
|
|
coroutine.yield()
|
|
end
|
|
U.wait(3)
|
|
end
|
|
|
|
-- a stand-in for LOVE's DroppedFile, same three calls Studio.filedropped uses
|
|
local function droppedFile(realPath)
|
|
local handle
|
|
return {
|
|
getFilename = function() return realPath end,
|
|
open = function() handle = assert(io.open(realPath, "rb")) end,
|
|
read = function() return handle:read("*a") end,
|
|
close = function() if handle then handle:close() handle = nil end end,
|
|
}
|
|
end
|
|
|
|
Studio.load({ onClose = function() end })
|
|
U.wait(3)
|
|
|
|
-- 1. New skin, named
|
|
Studio.skin = TouchSkin.newSkin("my_tv")
|
|
Studio.skinIdField = "my_tv"
|
|
Studio.pageIndex, Studio.selected = 1, nil
|
|
Studio.images = {}
|
|
TouchSkin.setActive(Studio.skin)
|
|
U.log("1. new skin:", Studio.skin.id, "controls:", #Studio.page().controls)
|
|
|
|
-- 2. Desktop canvas preset
|
|
for i, c in ipairs(Studio.CANVASES) do
|
|
if c.id == "desktop_1080" then Studio.setCanvas(i) end
|
|
end
|
|
U.log("2. canvas:", Studio.canvas().label, Studio.canvas().w .. "x" .. Studio.canvas().h)
|
|
|
|
-- 3. Drop the bezel art on the window
|
|
Studio.filedropped(droppedFile("assets/skins/tv_crt/img/tv-integer.png"))
|
|
U.log("3. drop:", Studio.status)
|
|
U.log(" bezel:", tostring(Studio.page().imagePath), "root:", Studio.skin.root)
|
|
|
|
-- 4. Detect the screen hole from the art's alpha
|
|
Studio.detectViewport()
|
|
local v = Studio.page().viewport
|
|
U.log("4. detect:", Studio.status)
|
|
U.log((" viewport %.4f %.4f %.4f %.4f"):format(v.x, v.y, v.w, v.h))
|
|
shot("author_studio.png")
|
|
|
|
-- 5. Save
|
|
Studio.save()
|
|
U.log("5. save:", Studio.status)
|
|
|
|
-- what landed on disk
|
|
local root = "skins/my_tv"
|
|
for _, name in ipairs(love.filesystem.getDirectoryItems(root)) do
|
|
local info = love.filesystem.getInfo(root .. "/" .. name)
|
|
U.log(" file:", name, info and info.type)
|
|
end
|
|
local src = love.filesystem.read(root .. "/skin.lua")
|
|
U.log(" skin.lua bytes:", src and #src)
|
|
U.log(" skin.lua:", (src or ""):gsub("%s+", " "):sub(1, 260))
|
|
|
|
-- 6. Load the saved folder back as a normal skin and play through it
|
|
Studio.unload()
|
|
local reloaded, err = TouchSkin.load(root, "my_tv")
|
|
U.log("6. reload:", reloaded and "ok" or tostring(err),
|
|
"format:", reloaded and reloaded.format,
|
|
"controls:", reloaded and #reloaded.pages[1].controls)
|
|
|
|
game.save.options.touchControls = { enabled = true, skin = "my_tv" }
|
|
game.save.options.tilt = 0
|
|
game.save.options.zoom = 0
|
|
game.save.options.pipelines = {}
|
|
game:applyOptions()
|
|
local TouchControls = require("src.core.TouchControls")
|
|
U.log(" active:", tostring(TouchControls.skinId), "err:", tostring(TouchControls.skinError))
|
|
U.log(" decorativeOnly:", TouchSkin.decorativeOnly(), "drawable:", TouchSkin.drawable())
|
|
|
|
love.draw = baseDraw
|
|
U.teleport(game, "PALLET_TOWN", 10, 8, "down")
|
|
U.wait(12)
|
|
U.shot(game, dir .. "/author_result.png")
|
|
|
|
U.log("done")
|
|
love.event.quit()
|
|
while true do coroutine.yield() end
|
|
end
|