mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-09-26 13:33:27 -04:00
137 lines
4.6 KiB
Lua
137 lines
4.6 KiB
Lua
#!/usr/bin/env luajit
|
|
-- pokefirered/include/global.fieldmap.h:191 struct MapHeader on the live map def.
|
|
|
|
package.path = "./?.lua;./?/init.lua;" .. package.path
|
|
|
|
local failed = 0
|
|
local function check(cond, msg)
|
|
if cond then
|
|
print("[ok] " .. msg)
|
|
else
|
|
failed = failed + 1
|
|
print("[FAIL] " .. msg)
|
|
end
|
|
end
|
|
|
|
local function eq(a, b, msg)
|
|
check(a == b, string.format("%s (%s == %s)", msg, tostring(a), tostring(b)))
|
|
end
|
|
|
|
require("src.core.GameVersion").set("firered")
|
|
|
|
local Cache = require("tests.game3_cache")
|
|
local root = Cache.mount("meta.json")
|
|
if not root then
|
|
print("[skip] " .. tostring(Cache.reason))
|
|
os.exit(0)
|
|
end
|
|
print("[info] FireRed cache at " .. root)
|
|
|
|
local Json = require("src.link.Json")
|
|
local MapCatalog = require("src.import.gba.map_catalog")
|
|
local Dataset = require("src.core.game3.dataset")
|
|
local DEFS = Dataset.buildMaps()
|
|
|
|
local function header_of(mapId)
|
|
local slot = MapCatalog.slotKeyFor and MapCatalog.slotKeyFor(mapId)
|
|
if not slot then return nil end
|
|
local f = io.open(root .. "/map_tree/maps/" .. slot .. "/header.json", "rb")
|
|
if not f then return nil end
|
|
local raw = f:read("*a")
|
|
f:close()
|
|
if type(raw) ~= "string" or raw == "" then return nil end
|
|
local ok, h = pcall(Json.decode, raw)
|
|
if ok and type(h) == "table" then return h end
|
|
return nil
|
|
end
|
|
|
|
local function def_of(pretName)
|
|
local id = MapCatalog.pretToEngine(pretName)
|
|
return id and DEFS[id], id
|
|
end
|
|
|
|
local FIELDS = {
|
|
"cave", "allowEscaping", "allowRunning", "bikingAllowed",
|
|
"battleType", "music", "borderWidth", "borderHeight",
|
|
}
|
|
|
|
print("[test] 1. every header field reaches the def")
|
|
local sample = { "PalletTown", "MtMoon_1F", "RockTunnel_1F", "ViridianForest",
|
|
"PalletTown_PlayersHouse_1F", "ViridianCity_Gym" }
|
|
for _, pretName in ipairs(sample) do
|
|
local def, id = def_of(pretName)
|
|
if not def then
|
|
print("[skip] the cache has no live map def for " .. pretName)
|
|
os.exit(0)
|
|
end
|
|
local h = header_of(id)
|
|
if not h then
|
|
print("[skip] the cache has no header.json for " .. pretName)
|
|
os.exit(0)
|
|
end
|
|
for _, key in ipairs(FIELDS) do
|
|
eq(def[key], tonumber(h[key]), pretName .. "." .. key)
|
|
end
|
|
end
|
|
|
|
print("[test] 2. the values are the cart's")
|
|
local rock = def_of("RockTunnel_1F")
|
|
eq(rock.cave, 1, "Rock Tunnel 1F is a flash cave")
|
|
eq(rock.allowEscaping, 1, "Rock Tunnel 1F allows Escape Rope and Dig")
|
|
eq(rock.mapType, 4, "Rock Tunnel 1F is MAP_TYPE_UNDERGROUND")
|
|
local moon = def_of("MtMoon_1F")
|
|
eq(moon.cave, 0, "Mt Moon 1F is not a flash cave")
|
|
eq(moon.allowEscaping, 1, "Mt Moon 1F allows Escape Rope and Dig")
|
|
eq(moon.bikingAllowed, 1, "Mt Moon 1F allows cycling")
|
|
local gym = def_of("ViridianCity_Gym")
|
|
eq(gym.battleType, 1, "Viridian Gym asks for the gym battle background")
|
|
eq(gym.bikingAllowed, 0, "Viridian Gym forbids cycling")
|
|
eq(gym.allowRunning, 0, "Viridian Gym forbids running")
|
|
local house = def_of("PalletTown_PlayersHouse_1F")
|
|
eq(house.allowEscaping, 0, "the player's house refuses Escape Rope")
|
|
eq(house.battleType, 0, "the player's house uses MAP_BATTLE_SCENE_NORMAL")
|
|
local pallet = def_of("PalletTown")
|
|
eq(pallet.battleType, 0, "Pallet Town uses MAP_BATTLE_SCENE_NORMAL")
|
|
eq(pallet.allowRunning, 1, "Pallet Town allows running")
|
|
eq(def_of("ViridianForest").borderWidth, 3, "Viridian Forest has a 3 wide border")
|
|
|
|
print("[test] 3. the whole map table agrees with the cache, with no gaps")
|
|
local checked, mismatched, missing = 0, 0, 0
|
|
for mapId, def in pairs(DEFS) do
|
|
local h = header_of(mapId)
|
|
if h then
|
|
checked = checked + 1
|
|
for _, key in ipairs(FIELDS) do
|
|
if def[key] == nil then
|
|
missing = missing + 1
|
|
if missing <= 5 then print(" nil " .. mapId .. "." .. key) end
|
|
elseif def[key] ~= tonumber(h[key]) then
|
|
mismatched = mismatched + 1
|
|
if mismatched <= 5 then
|
|
print(string.format(" %s.%s def %s header %s",
|
|
mapId, key, tostring(def[key]), tostring(h[key])))
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
check(checked > 300, "headers compared: " .. checked)
|
|
eq(missing, 0, "no def is missing a header field")
|
|
eq(mismatched, 0, "no def disagrees with its header")
|
|
|
|
print("[test] 4. FieldView reads the stamped cave flag")
|
|
-- pokefirered/src/overworld.c:956
|
|
local FieldView = require("src.core.game3.field_view")
|
|
local game = { data = { maps = DEFS } }
|
|
local rockId = MapCatalog.pretToEngine("RockTunnel_1F")
|
|
local palletId = MapCatalog.pretToEngine("PalletTown")
|
|
eq(FieldView.defaultFlashLevel(game, rockId), FieldView.MAX_FLASH_LEVEL,
|
|
"Rock Tunnel 1F starts dark")
|
|
eq(FieldView.defaultFlashLevel(game, palletId), 0, "Pallet Town starts lit")
|
|
|
|
if failed > 0 then
|
|
print(string.format("\n%d CHECK(S) FAILED", failed))
|
|
os.exit(1)
|
|
end
|
|
print("\nALL STITCHMAP HEADER TESTS PASSED")
|