mirror of
https://github.com/bryanthaboi/gen1recomp
synced 2026-10-03 16:16:38 -04:00
113 lines
3.2 KiB
Lua
113 lines
3.2 KiB
Lua
-- PKMN LEAGUE hall-of-fame viewer (engine/menus/league_pc.asm:1)
|
|
|
|
local Font = require("src.render.Font")
|
|
local Strings = require("src.core.Strings")
|
|
local HallOfFame = require("src.ui.HallOfFame")
|
|
|
|
local LeaguePC = {}
|
|
LeaguePC.__index = LeaguePC
|
|
LeaguePC.isOpaque = true
|
|
|
|
-- constants/pokemon_data_constants.asm:65
|
|
local CAPACITY = 50
|
|
|
|
-- SGB: SET_PAL_POKEMON_WHOLE_SCREEN per mon (engine/menus/league_pc.asm:95)
|
|
function LeaguePC:sgbPalettes(game)
|
|
local P = require("src.render.PaletteFX")
|
|
local mon = self:currentMon()
|
|
local c = mon and P.monPal(game.data, mon.species)
|
|
if c then return { P.whole(c) } end
|
|
return P.wholeNamed(game.data, "MEWMON")
|
|
end
|
|
|
|
function LeaguePC.new(game, onDone)
|
|
local self = setmetatable({}, LeaguePC)
|
|
self.game = game
|
|
self.onDone = onDone
|
|
self.teams = (game.save and game.save.hallOfFame) or {}
|
|
self.teamIndex = math.max(1, #self.teams - CAPACITY + 1)
|
|
self.monIndex = 1
|
|
self.sprites = {}
|
|
self.spriteTrueColor = {}
|
|
self:loadMon()
|
|
return self
|
|
end
|
|
|
|
function LeaguePC:currentMon()
|
|
local team = self.teams[self.teamIndex]
|
|
return team and team[self.monIndex] or nil
|
|
end
|
|
|
|
function LeaguePC:loadMon()
|
|
local mon = self:currentMon()
|
|
if not mon then return end
|
|
local species = mon.species
|
|
if self.sprites[species] == nil then
|
|
local path, trueColor = require("src.pokemon.Sprites").path(
|
|
self.game.data, species, "front", { kind = "hof" })
|
|
local ok, img = false, nil
|
|
if path then ok, img = pcall(love.graphics.newImage, path) end
|
|
self.sprites[species] = ok and img or false
|
|
self.spriteTrueColor[species] = (ok and img and trueColor) or false
|
|
end
|
|
require("src.core.Sound").playCry(self.game.data, species)
|
|
end
|
|
|
|
function LeaguePC:close()
|
|
self.game.stack:pop()
|
|
if self.onDone then self.onDone() end
|
|
end
|
|
|
|
function LeaguePC:update(dt)
|
|
local input = self.game.input
|
|
if input:wasPressed("b") then
|
|
self:close()
|
|
return
|
|
end
|
|
if input:wasPressed("a") then
|
|
if not self:currentMon() then
|
|
self:close()
|
|
return
|
|
end
|
|
local team = self.teams[self.teamIndex]
|
|
if self.monIndex < #team then
|
|
self.monIndex = self.monIndex + 1
|
|
elseif self.teamIndex < #self.teams then
|
|
self.teamIndex = self.teamIndex + 1
|
|
self.monIndex = 1
|
|
else
|
|
self:close()
|
|
return
|
|
end
|
|
self:loadMon()
|
|
end
|
|
end
|
|
|
|
function LeaguePC:draw()
|
|
love.graphics.setColor(1, 1, 1, 1)
|
|
love.graphics.rectangle("fill", 0, 0, 160, 144)
|
|
local mon = self:currentMon()
|
|
if not mon then return end
|
|
local img = self.sprites[mon.species]
|
|
if img then
|
|
-- engine/menus/league_pc.asm:98 (hlcoord 12, 5)
|
|
local w, h = img:getDimensions()
|
|
local x = 96 + math.floor((8 - w / 8) / 2) * 8
|
|
local y = 40 + (7 - h / 8) * 8
|
|
love.graphics.draw(img, x, y)
|
|
if self.spriteTrueColor[mon.species] then
|
|
require("src.render.PaletteFX").markTrueColor(x, y, w, h)
|
|
end
|
|
end
|
|
-- engine/movie/hall_of_fame.asm:159
|
|
HallOfFame.drawMonInfo(self, mon)
|
|
-- engine/menus/league_pc.asm:102
|
|
Font.drawBox(0, 13, 20, 4)
|
|
love.graphics.setColor(0, 0, 0, 1)
|
|
Font.draw(Strings("HALL OF FAME No"), 1 * 8, 15 * 8)
|
|
Font.draw(("%3d"):format(self.teamIndex), 16 * 8, 15 * 8)
|
|
love.graphics.setColor(1, 1, 1, 1)
|
|
end
|
|
|
|
return LeaguePC
|