mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-09-26 13:33:27 -04:00
a9ce423bdc
CLOSES #1275, CLOSES #1295, CLOSES #1384, CLOSES #1628, CLOSES #1677, CLOSES #1682, CLOSES #1691, CLOSES #1813, CLOSES #1822, CLOSES #1861, CLOSES #1867, CLOSES #1868, CLOSES #1869, CLOSES #1870, CLOSES #1871, CLOSES #1872, CLOSES #1874, CLOSES #1876, CLOSES #1878, CLOSES #1880, CLOSES #1881, CLOSES #1882, CLOSES #1884, CLOSES #1885, CLOSES #1886, CLOSES #1887, CLOSES #1888, CLOSES #1889, CLOSES #1890, CLOSES #1891, CLOSES #1892, CLOSES #1893, CLOSES #1894, CLOSES #1895, CLOSES #1896, CLOSES #1899, CLOSES #1900, CLOSES #1901
134 lines
4.3 KiB
Lua
134 lines
4.3 KiB
Lua
-- engine/items/town_map.asm:124, 403 (#1878)
|
|
|
|
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 Font = require("src.render.Font")
|
|
local TownMap = require("src.ui.TownMap")
|
|
|
|
local LOCATIONS = {
|
|
ROUTE_2 = { x = 2, y = 6, name = "ROUTE 2" },
|
|
VIRIDIAN_FOREST = { x = 2, y = 4, name = "VIRIDIAN FOREST" },
|
|
CERULEAN_CAVE_1F = { x = 9, y = 1, name = "CERULEAN CAVE" },
|
|
PALLET_TOWN = { x = 1, y = 12, name = "PALLET TOWN" },
|
|
}
|
|
|
|
local function grass(species)
|
|
return { grass = { slots = { { species = species, level = 3 } } } }
|
|
end
|
|
|
|
local function newGame(encounters)
|
|
return {
|
|
data = {
|
|
field = {
|
|
townMap = {
|
|
locations = LOCATIONS,
|
|
background = {
|
|
map = { 1 },
|
|
tiles = { path = "assets/generated/townmap/tiles.png" },
|
|
},
|
|
},
|
|
playerSprites = { walk = "SPRITE_RED" },
|
|
},
|
|
sprites = { SPRITE_RED = { image = "assets/generated/sprites/red_walk.png" } },
|
|
pokemon = {
|
|
BULBASAUR = { name = "BULBASAUR" },
|
|
CATERPIE = { name = "CATERPIE" },
|
|
MEWTWO = { name = "MEWTWO" },
|
|
},
|
|
maps = {},
|
|
encounters = encounters,
|
|
},
|
|
save = {},
|
|
overworld = { map = { id = "PALLET_TOWN" } },
|
|
}
|
|
end
|
|
|
|
local function capture(tm)
|
|
local texts, draws, boxes = {}, {}, {}
|
|
local realDraw = love.graphics.draw
|
|
local realText, realBox = Font.draw, Font.drawBox
|
|
love.graphics.draw = function(img, quadOrX, x, y)
|
|
draws[#draws + 1] = { img = img, quad = quadOrX, x = x, y = y }
|
|
end
|
|
Font.draw = function(text, x, y)
|
|
texts[#texts + 1] = { text = text, x = x, y = y }
|
|
return 0
|
|
end
|
|
Font.drawBox = function(tx, ty, tw, th)
|
|
boxes[#boxes + 1] = { tx = tx, ty = ty, tw = tw, th = th }
|
|
end
|
|
tm.blink = 0
|
|
tm:draw()
|
|
love.graphics.draw, Font.draw, Font.drawBox = realDraw, realText, realBox
|
|
return texts, draws, boxes
|
|
end
|
|
|
|
local function findText(texts, want)
|
|
for _, t in ipairs(texts) do
|
|
if t.text == want then return t end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
local tm = TownMap.new(newGame({}), { nestSpecies = "BULBASAUR" })
|
|
eq(#tm.nests, 0, "no encounters means no nests")
|
|
check(tm.playerLoc ~= nil, "the player's location still resolves in AREA mode")
|
|
|
|
local texts, draws, boxes = capture(tm)
|
|
check(findText(texts, "BULBASAUR's NEST") ~= nil,
|
|
"row 0 always reads \"<NAME>'s NEST\"")
|
|
check(findText(texts, "BULBASAUR AREA UNKNOWN") == nil,
|
|
"the cropped concatenated title is gone")
|
|
local unknown = findText(texts, " AREA UNKNOWN")
|
|
check(unknown ~= nil, "AREA UNKNOWN is printed in the middle of the map")
|
|
if unknown then
|
|
eq(unknown.x, 16, "AreaUnknownText sits at hlcoord 2, 9")
|
|
eq(unknown.y, 72, "AreaUnknownText sits at hlcoord 2, 9")
|
|
end
|
|
local box
|
|
for _, b in ipairs(boxes) do
|
|
if b.tx == 1 and b.ty == 7 then box = b end
|
|
end
|
|
check(box ~= nil, "TextBoxBorder at hlcoord 1, 7")
|
|
if box then
|
|
eq(box.tw, 17, "the border is 15 interior columns wide")
|
|
eq(box.th, 4, "the border is 2 interior rows tall")
|
|
end
|
|
local drewPlayer = false
|
|
for _, d in ipairs(draws) do
|
|
if d.img == tm.playerSheet then drewPlayer = true end
|
|
end
|
|
check(not drewPlayer,
|
|
"DrawPlayerOrBirdSprite is skipped when no nest OAM was written")
|
|
|
|
local tm2 = TownMap.new(
|
|
newGame({ ROUTE_2 = grass("CATERPIE"), VIRIDIAN_FOREST = grass("CATERPIE") }),
|
|
{ nestSpecies = "CATERPIE" })
|
|
eq(#tm2.nests, 2, "ROUTE 2 and VIRIDIAN FOREST are separate nest squares")
|
|
|
|
local texts2, draws2, boxes2 = capture(tm2)
|
|
check(findText(texts2, "CATERPIE's NEST") ~= nil, "the title is unchanged")
|
|
check(findText(texts2, " AREA UNKNOWN") == nil,
|
|
"no AREA UNKNOWN text once a nest was drawn")
|
|
eq(#boxes2, 0, "no mid-screen box once a nest was drawn")
|
|
local playerDraw
|
|
for _, d in ipairs(draws2) do
|
|
if d.img == tm2.playerSheet and d.quad == tm2.playerQuad then playerDraw = d end
|
|
end
|
|
check(playerDraw ~= nil, "the player's walk sprite is drawn on the AREA map")
|
|
if playerDraw then
|
|
-- town_map.asm:454
|
|
eq(playerDraw.x, tm2.playerLoc.x * 8 + 16 - 4, "player x is markerXY - 4")
|
|
eq(playerDraw.y, tm2.playerLoc.y * 8 + 8 - 3, "player y is markerXY - 3")
|
|
end
|
|
|
|
local tm3 = TownMap.new(
|
|
newGame({ CERULEAN_CAVE_1F = grass("MEWTWO") }), { nestSpecies = "MEWTWO" })
|
|
eq(#tm3.nests, 0, "packed coords $19 (Cerulean Cave) are skipped")
|
|
|
|
T.finish("pokedex area bug 1878")
|