Files
gen1recomp/tests/engine/town_map_player_sprite_bug1344.lua
T

87 lines
2.8 KiB
Lua

-- The TOWN MAP drew a blinking black square for the player instead of their
-- walk sprite, because the marker was a placeholder rectangle instead of the
-- OAM sprite the cart draws (#1344).
-- engine/items/town_map.asm:347
-- luajit tests/engine/town_map_player_sprite_bug1344.lua
package.path = "./?.lua;./?/init.lua;" .. package.path
local T = require("tests.harness")
local check, eq = T.check, T.eq
love = love or require("tests.love_stub")
local TownMap = require("src.ui.TownMap")
local function newGame()
return {
data = {
field = {
townMap = { PALLET_TOWN = { x = 1, y = 2, name = "PALLET TOWN" } },
playerSprites = { walk = "SPRITE_RED" },
-- no townMap.background: forces the stale-asset fallback draw path,
-- which is the one #1344's repro screenshot came from
},
sprites = { SPRITE_RED = { image = "assets/generated/sprites/red_walk.png" } },
maps = {},
},
save = {},
overworld = { map = { id = "PALLET_TOWN" } },
}
end
local game = newGame()
local tm = TownMap.new(game, {})
eq(tm.mode, "grid", "one located entry puts the screen in grid mode")
check(tm.bg == nil, "no background.map means the stale-asset fallback draws")
check(tm.playerLoc ~= nil, "the player's map resolved to a location")
check(tm.playerSheet ~= nil,
"TownMap.new resolved the walk sheet (the fix this test guards)")
-- capture what :draw() actually paints, without a real screen
local draws, rects = {}, {}
local realDraw, realRect = love.graphics.draw, love.graphics.rectangle
love.graphics.draw = function(img, quadOrX, x, y)
draws[#draws + 1] = { img = img, quad = quadOrX, x = x, y = y }
end
love.graphics.rectangle = function(mode, x, y, w, h)
rects[#rects + 1] = { mode = mode, x = x, y = y, w = w, h = h }
end
tm.blink = 0 -- (0 < 20): the player marker is in its "on" blink phase
tm:draw()
love.graphics.draw = realDraw
love.graphics.rectangle = realRect
local function drewSprite()
for _, d in ipairs(draws) do
if d.img == tm.playerSheet and d.quad == tm.playerQuad then
return d
end
end
return nil
end
local spriteDraw = drewSprite()
check(spriteDraw ~= nil, "the player's walk sprite was drawn, not a placeholder")
if spriteDraw then
-- engine/items/town_map.asm:449 WriteTownMapSpriteOAM's -4,-3 carry quirk
eq(spriteDraw.x, tm.playerLoc.x * 8 - 4, "sprite x is markerXY - 4")
eq(spriteDraw.y, tm.playerLoc.y * 8 - 3, "sprite y is markerXY - 3")
end
local function blackDotAtPlayer()
for _, r in ipairs(rects) do
if r.mode == "fill" and r.w == 4 and r.h == 4
and r.x == tm.playerLoc.x * 8 + 2 and r.y == tm.playerLoc.y * 8 + 2 then
return true
end
end
return false
end
check(not blackDotAtPlayer(),
"the old 4x4 placeholder square is not drawn once a sprite is available")
T.finish("town map player sprite bug 1344")