Files
gen1recomp/tests/drivers/widescreen_clip_bug1869_test.lua

167 lines
5.6 KiB
Lua

-- engine/events/halloffame.asm:270 (#1869)
-- POKEPORT_IDENTITY=gold-dev POKEPORT_GAME=gold POKEPORT_TOUCH=0 \
-- POKEPORT_DRIVER=tests/drivers/widescreen_clip_bug1869_test.lua \
-- POKEPORT_SHOT_DIR=/tmp/widescreen-clip love .
local U = require("tests.drivers.util")
local Chrome = require("src.ui.gen2.Chrome")
local Mon = require("src.battle.gen2.Mon")
local Permissions = require("src.world.gen2.Permissions")
return function(game)
local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/widescreen-clip"
local failures = 0
local function ok(label, condition, detail)
if condition then
print("[wide] ok " .. label)
else
failures = failures + 1
print("[wide] FAIL " .. label .. " " .. tostring(detail))
end
end
local function shot(path)
if not U.shot(game, path) then failures = failures + 1 end
end
U.wait(45)
local world = game.world
assert(world and world.map, "gold world did not boot")
if love.window and love.window.setMode then
love.window.setMode(1280, 840, { resizable = true })
U.wait(6)
end
local winW, winH = love.graphics.getDimensions()
local scale = Chrome.fitScale(winW, winH)
local ox, oy = Chrome.fitOrigin(winW, winH, scale)
ok(("the window leaves bars to look at (%dx%d, panel at %d,%d x%d)")
:format(winW, winH, ox, oy, scale), ox > 8 and oy > 8, ox .. "," .. oy)
local G = love.graphics
local function panelClip(label, drawIt)
local rects = {}
local realSet, realIntersect = G.setScissor, G.intersectScissor
G.setScissor = function(...) rects[#rects + 1] = { ... } return realSet(...) end
if realIntersect then
G.intersectScissor = function(...)
rects[#rects + 1] = { ... }
return realIntersect(...)
end
end
local fine, err = pcall(drawIt)
G.setScissor, G.intersectScissor = realSet, realIntersect
if not fine then
ok(label .. " draws", false, err)
return
end
local matched = false
for _, r in ipairs(rects) do
if r[1] == ox and r[2] == oy and r[3] == Chrome.SCREEN_W * 8 * scale
and r[4] == Chrome.SCREEN_H * 8 * scale then
matched = true
end
end
ok(label .. " clips to the 160x144 panel before it draws", matched,
#rects .. " scissors, none matching " .. ox .. "," .. oy)
end
game.save.party = { Mon.new(game.data, "CYNDAQUIL", 12) }
assert(world:setMap("ROUTE_29", 15, 11, "down"), "setMap ROUTE_29 failed")
U.wait(8)
if not Permissions.isWalkable(world:playerCollision()) then
for _, step in ipairs({ { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } }) do
if world:setMap("ROUTE_29", 15 + step[1], 11 + step[2], "down")
and Permissions.isWalkable(world:playerCollision()) then
break
end
end
U.wait(8)
end
assert(world:startBattle({ wild = Mon.new(game.data, "PIDGEY", 4) }),
"startBattle failed")
local battle
for _ = 1, 900 do
local top = game.stack:top()
if top and top.battle then battle = top break end
U.wait(1)
end
ok("the battle screen came up", battle ~= nil, battle)
if battle then
U.log("01: the first frames of the battle intro. The player's backpic")
U.log("slides in from the right EDGE OF THE PANEL. The white surround")
U.log("around it must be empty -- a trainer sprite parked out in the white")
U.log("void to the right of the screen is the bug.")
shot(out .. "/01-battle-intro.png")
U.wait(20)
shot(out .. "/02-battle-intro-mid.png")
for _ = 1, 150 do
if battle.phase == "menu" then break end
U.tap(game, "a")
U.wait(2)
end
U.log("03: the FIGHT menu. Nothing at all outside the panel.")
shot(out .. "/03-battle-menu.png")
panelClip("BattleState:drawWidescreen",
function() battle:drawWidescreen(winW, winH) end)
game.stack:pop()
U.wait(10)
end
world:hallOfFame(function() end)
local hof
for _ = 1, 600 do
local top = game.stack:top()
if top and top.phase then hof = top break end
U.wait(1)
end
ok("the Hall of Fame is up", hof ~= nil, hof)
if hof then
hof.phase = "backpic"
hof.scx = 0x50
U.wait(2)
U.log("04: the Hall of Fame mid-slide. The bars left and right of the")
U.log("panel must be solid black. A whole backpic sitting in the left bar,")
U.log("or a scrap of one in the right bar, is the wrap copy leaking.")
shot(out .. "/04-hof-backpic.png")
panelClip("HallOfFame:drawWidescreen",
function() hof:drawWidescreen(winW, winH) end)
for _ = 1, 60 do
U.tap(game, "a")
U.wait(4)
if game.stack:top() ~= hof then break end
end
end
local credits = game.stack:top()
if not (credits and credits.drawBorderStrips) then
game.stack:pop()
world:credits(function() end)
for _ = 1, 600 do
local top = game.stack:top()
if top and top.drawBorderStrips then credits = top break end
U.wait(1)
end
end
ok("the credits are rolling", credits ~= nil, credits)
if credits then
U.wait(120)
U.log("05: the credits. The two border strips run edge to edge INSIDE the")
U.log("panel only. Wavy white bands continuing through the black bars to")
U.log("the window edge is the strip loop drawing past x=0 and x=160.")
shot(out .. "/05-credits.png")
panelClip("Credits:drawWidescreen",
function() credits:drawWidescreen(winW, winH) end)
U.wait(240)
shot(out .. "/06-credits-later.png")
end
print(failures == 0 and "[wide] PASS widescreen_clip_bug1869"
or ("[wide] FAIL widescreen_clip_bug1869 (%d)"):format(failures))
U.log("the window is left at 1280x840; resize it and the bars must stay")
U.log("empty at every size.")
while true do coroutine.yield() end
end