Files
gen1recomp/tests/engine/game3_egg_screens_test.lua
2026-09-23 16:34:15 -04:00

150 lines
6.8 KiB
Lua

#!/usr/bin/env luajit
-- The screens that show a single mon draw an egg as an egg, as pret does with
-- GetMonData(MON_DATA_SPECIES_OR_EGG) and MON_DATA_NICKNAME
-- (pokefirered/src/pokemon.c:3245, :3020): the party slots, the PC's hovered-mon
-- panel, the summary's egg page, the trade scene, and the script string buffers.
package.path = "./?.lua;./?/init.lua;" .. package.path
require("tests.fixture_data.game3_map_sections").install()
local T = require("tests.harness")
local check = T.check
require("src.core.GameVersion").set("firered")
package.loaded["src.core.game3.audio"] = setmetatable({}, { __index = function() return function() end end })
package.loaded["src.core.game3.rom_text"] = {
plain = function(key)
if key == "gText_EggNickname" then return require("src.core.Strings")("EGG") end
return key
end,
box = function(key) return key end,
ascii = function(key) return key end, has = function() return true end,
key = function(n, i, j) return j and (n .. "[" .. i .. "][" .. j .. "]") or (n .. "[" .. i .. "]") end,
at = function(n, i, j) return j and (n .. "[" .. i .. "][" .. j .. "]") or (n .. "[" .. i .. "]") end,
count = function() return 0 end, list = function() return {} end,
lazy = function(map) return setmetatable({}, { __index = function(_, k) return map[k] end }) end,
}
local gfx = setmetatable({}, { __index = function() return function() end end })
gfx.newQuad = function() return {} end
gfx.newImage = function() return nil end
gfx.getWidth = function() return 240 end
gfx.getHeight = function() return 160 end
_G.love = { graphics = gfx, timer = { getTime = function() return 0 end } }
local Strings = require("src.core.Strings")
local Pokemon = require("src.core.game3.pokemon")
Pokemon._names = { [25] = "PIKACHU", [172] = "PICHU" } -- a minimal pack, so no ROM is needed
Strings.load({ strings = { EGG = "OEUF" } })
local pics = {}
Pokemon.frontPic = function(species)
pics[#pics + 1] = species
return { image = { getDimensions = function() return 64, 64 end }, w = 64, h = 64 }
end
local texts = {}
local FrlgFont = require("src.ui.game3.frlg_font")
FrlgFont.draw = function(text) texts[#texts + 1] = tostring(text) end
local function egg()
return { species = 172, isEgg = true, nickname = "EGG", name = "EGG", level = 5,
heldItem = 1, gender = "M", personality = 1, otName = "RED", otId = 1,
hp = 1, maxHp = 1, moves = {}, pp = {} }
end
local function has(list, value)
for _, v in ipairs(list) do if v == value then return true end end
return false
end
-- pokefirered/src/pokemon_storage_system_data.c:1034, :1091
local PcChrome = require("src.ui.game3.pc_chrome")
PcChrome.ensure = function() end
PcChrome.drawWaveforms = function() end
pics, texts = {}, {}
PcChrome.drawLeftDataPanel(egg(), 0)
check(pics[1] == 412, "the PC panel draws an egg's front pic as the EGG's (got " .. tostring(pics[1]) .. ")")
check(texts[1] == "OEUF", "and names it by the language's EGG (got " .. tostring(texts[1]) .. ")")
check(not has(texts, "/PICHU") and not has(texts, "{LV_2}5"),
"with no species, level or item line: " .. table.concat(texts, " | "))
pics, texts = {}, {}
PcChrome.drawLeftDataPanel({ species = 172, nickname = "PICHU", level = 5, gender = "M" }, 0)
check(pics[1] == 172 and has(texts, "/PICHU") and has(texts, "{LV_2}5"),
"a hatched mon keeps its pic, species and level lines")
-- pokefirered/src/party_menu.c:781 DisplayPartyPokemonData, :2197 sSlotTilemap_MainNoHP
local PartyMenu = require("src.ui.game3.party_menu")
local PartyChrome = require("src.ui.game3.party_chrome")
PartyMenu.heldItemSheet = function() return nil end
local slotsHidingHp = {}
PartyChrome.drawSlot = function(kind, _, _, _, hideHp)
if kind ~= "empty" then slotsHidingHp[#slotsHidingHp + 1] = hideHp and true or false end
end
texts, slotsHidingHp = {}, {}
PartyMenu.show({ { species = 25, nickname = "SPARKY", level = 12, gender = "M", hp = 30, maxHp = 30 }, egg() })
PartyMenu.draw()
PartyMenu.close()
check(has(texts, "OEUF") and has(texts, "SPARKY"), "the party names both mons: " .. table.concat(texts, " | "))
check(not has(texts, "gText_Lv5") and has(texts, "gText_Lv12"),"an egg's party slot shows no level, the other one does")
check(slotsHidingHp[1] == false and slotsHidingHp[2] == true,
"and an egg's slot has no HP frame (hideHp = " .. tostring(slotsHidingHp[1]) .. ", " .. tostring(slotsHidingHp[2]) .. ")")
-- pokefirered/src/pokemon_summary_screen.c:4016
local SummaryMenu = require("src.ui.game3.summary_menu")
local SummaryChrome = require("src.ui.game3.summary_chrome")
for k, v in pairs(SummaryChrome) do
if type(v) == "function" and k:match("^draw") then SummaryChrome[k] = function() end end
end
pics = {}
SummaryMenu.openMenu({ egg() }, 1, { page = 0 })
SummaryMenu.draw()
SummaryMenu.close()
check(has(pics, 412) and not has(pics, 172),
"the summary's egg page draws the EGG's front pic (got " .. table.concat(pics, ",") .. ")")
pics = {}
local flagOnly = egg()
flagOnly.isEgg, flagOnly.egg = nil, true
SummaryMenu.openMenu({ flagOnly }, 1, { page = 0 })
SummaryMenu.draw()
SummaryMenu.close()
check(has(pics, 412) and not has(pics, 172), "for any egg flag (got " .. table.concat(pics, ",") .. ")")
-- pokefirered/src/trade_scene.c:757, :1239
local TradeSceneUi = require("src.ui.game3.trade_scene")
local offer, received = egg(), { species = 25, nickname = "SPARKY" }
TradeSceneUi._core = { state = function()
return { playerVisible = true, partnerVisible = true, offer = offer, received = received }
end }
pics = {}
TradeSceneUi.draw()
check(pics[1] == 412 and pics[2] == 25,
"the trade scene draws a sent egg as the EGG (got " .. table.concat(pics, ",") .. ")")
TradeSceneUi._core = nil
local savedLove = _G.love
_G.love = nil
local TradeScene = require("src.core.game3.trade_scene")
TradeScene.play(offer, received, nil, {})
local st = TradeScene.state()
check(st.sentName == "OEUF", "and names it by the language's EGG (got " .. tostring(st.sentName) .. ")")
check(st.recvName == "SPARKY", "while the other mon keeps its nickname")
_G.love = savedLove
-- pokefirered/src/field_specials.c:1671 BufferMonNickname, daycare.c:1216
local Ctx = require("src.core.game3.scripting.ctx")
local Flags = require("src.core.game3.scripting.flags")
local Std = require("src.core.game3.scripting.stdscripts")
local Natives = require("src.core.game3.scripting.natives")
package.loaded["src.core.game3.runtime"] = {
getSession = function() return { party = { egg() } } end,
isActive = function() return true end,
}
local ctx = Ctx.new({})
ctx.mode, ctx.status = "bytecode", "running"
Flags.setVar(nil, ctx, 0x8004, 0)
Natives.special(ctx, Std.SPECIAL.GetSelectedMonNicknameAndSpecies, { log = function() end })
check(ctx.stringVars and ctx.stringVars[1] == "OEUF",
"a script buffering an egg's nickname gets the language's EGG (got "
.. tostring(ctx.stringVars and ctx.stringVars[1]) .. ")")
Strings.load({})
T.finish("game3_egg_screens_test")