mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-12 08:21:02 +02:00
126 lines
4.5 KiB
Lua
126 lines
4.5 KiB
Lua
-- Screenshots of the mon SUMMARY (engine/pokemon/stats_screen.asm), which is
|
|
-- the one thing tests/gen2_summary_test.lua cannot check: it asserts every
|
|
-- hlcoord, but not whether the three pages read like Gold's.
|
|
--
|
|
-- POKEPORT_GAME=gold POKEPORT_DRIVER=tests/drivers/gold_summary_shots.lua love .
|
|
-- POKEPORT_SHOT_DIR=/tmp/gold-summary (default)
|
|
--
|
|
-- Boots into the world (Game2 skips the cinema under POKEPORT_DRIVER),
|
|
-- builds a party through the ONE Gen 2 builder so the mons actually have
|
|
-- stats, moves, PP and experience, then puts each page up.
|
|
local U = require("tests.drivers.util")
|
|
|
|
local Mon = require("src.battle.gen2.Mon")
|
|
local PartyMenu = require("src.ui.gen2.PartyMenu")
|
|
local SummaryMenu = require("src.ui.gen2.SummaryMenu")
|
|
|
|
return function(game)
|
|
local out = os.getenv("POKEPORT_SHOT_DIR") or "/tmp/gold-summary"
|
|
|
|
local function shot(name)
|
|
U.wait(3)
|
|
U.shot(game, ("%s/%s.png"):format(out, name))
|
|
end
|
|
|
|
local function show(name, state)
|
|
game.stack:push(state)
|
|
shot(name)
|
|
game.stack:pop()
|
|
end
|
|
|
|
U.wait(45)
|
|
assert(game.world and game.world.map, "gold world did not boot")
|
|
|
|
local save = game.save
|
|
save.player.name = "GOLD"
|
|
save.player.id = 12345
|
|
|
|
-- Mon.new is the only party-member builder: anything routed through Gen 1's
|
|
-- Pokemon.new comes back with no moves at all, because a Gen 2 moveset is
|
|
-- `levelMoves` and Gen 1 reads level1Moves / learnset.
|
|
local function build(species, level, opts)
|
|
opts = opts or {}
|
|
local mon = Mon.new(game.data, species, level, {
|
|
dvs = { attack = 15, defense = 15, speed = 15, special = 15 },
|
|
})
|
|
assert(mon, "no base data for " .. species)
|
|
mon.nickname = opts.nickname or mon.name
|
|
mon.otName = save.player.name
|
|
mon.otId = save.player.id
|
|
for key, value in pairs(opts.fields or {}) do mon[key] = value end
|
|
-- Spend some PP so the PP columns are not four identical pairs, and take
|
|
-- a bite out of the HP so the bar is not always full green.
|
|
for i, move in ipairs(mon.moves or {}) do
|
|
move.pp = math.max(0, (move.maxPp or move.pp) - i * 3)
|
|
end
|
|
return mon
|
|
end
|
|
|
|
save.party = {
|
|
-- A held item, a status, and a dual-typed third mon so the pink page shows
|
|
-- both type rows.
|
|
build("CYNDAQUIL", 22, { fields = { item = "BERRY" } }),
|
|
build("TOTODILE", 18, { fields = { status = "psn" } }),
|
|
build("GASTLY", 15, {}),
|
|
}
|
|
save.party[1].hp = math.floor(save.party[1].maxHp * 0.4)
|
|
save.party[2].hp = math.floor(save.party[2].maxHp * 0.15)
|
|
-- Part way to the next level, so the exp bar is not empty or full.
|
|
local growth = game.data.pokemon.growthRates
|
|
local function partWay(mon)
|
|
local def = game.data.pokemon[mon.species]
|
|
local rate = growth and def and growth[def.growthRate]
|
|
if not rate then return end
|
|
local base = Mon.experienceForLevel(rate, mon.level)
|
|
local next_ = Mon.experienceForLevel(rate, mon.level + 1)
|
|
mon.experience = base + math.floor((next_ - base) * 0.6)
|
|
end
|
|
for _, mon in ipairs(save.party) do partWay(mon) end
|
|
|
|
-- The party list the summary is opened from, and the action submenu STATS
|
|
-- lives in (engine/pokemon/mon_submenu.asm).
|
|
local party = PartyMenu.new(game, { prompt = "choose", submenu = true })
|
|
show("00-party", party)
|
|
party:openSubmenu()
|
|
show("01-mon-submenu", party)
|
|
party:closeSubmenu()
|
|
|
|
-- The three pages, in the order .d_right walks them.
|
|
local function page(n)
|
|
local screen = SummaryMenu.new(game, {
|
|
party = save.party, index = 1, save = save, page = n,
|
|
})
|
|
return screen
|
|
end
|
|
show("02-pink-page", page(SummaryMenu.PINK_PAGE))
|
|
show("03-green-page", page(SummaryMenu.GREEN_PAGE))
|
|
show("04-blue-page", page(SummaryMenu.BLUE_PAGE))
|
|
|
|
-- ...and the same three for the poisoned mon, whose HP bar is red and whose
|
|
-- status line is not OK.
|
|
local hurt = SummaryMenu.new(game, {
|
|
party = save.party, index = 2, save = save,
|
|
})
|
|
show("05-pink-page-poisoned", hurt)
|
|
hurt.page = SummaryMenu.BLUE_PAGE
|
|
show("06-blue-page-second-mon", hurt)
|
|
|
|
-- The dual-typed mon, for the second TYPE row.
|
|
local ghost = SummaryMenu.new(game, {
|
|
party = save.party, index = 3, save = save,
|
|
})
|
|
show("07-pink-page-dual-type", ghost)
|
|
|
|
-- PlaceMoveData's screen, which is where the cart shows a move description.
|
|
local detail = SummaryMenu.new(game, {
|
|
party = save.party, index = 1, save = save,
|
|
page = SummaryMenu.GREEN_PAGE,
|
|
})
|
|
detail.moveDetail = true
|
|
show("08-move-description", detail)
|
|
detail.moveIndex = 2
|
|
show("09-move-description-second", detail)
|
|
|
|
print("[driver] PASS gold summary shots in " .. out)
|
|
end
|