mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-18 11:44:42 +02:00
G2 support
This commit is contained in:
@@ -0,0 +1,118 @@
|
||||
-- The boot copyright card (pokegold SplashScreen -> Copyright), ~100 frames
|
||||
-- then on to the GAME FREAK splash; A/B/START skip it.
|
||||
--
|
||||
-- The cart's card is the three Nintendo / Creatures / GAME FREAK lines from
|
||||
-- CopyrightGFX. RomExtractorGen2 composes that into title/copyright_splash.png
|
||||
-- and this screen draws it.
|
||||
|
||||
-- src/render/Assets.lua is the mod-override choke point: a raw
|
||||
-- love.graphics.newImage skips overrides/ and AssetTransform output.
|
||||
local Assets = require("src.render.Assets")
|
||||
local Chrome = require("src.ui.gen2.Chrome")
|
||||
local Font = require("src.render.Font")
|
||||
local Runtime = require("src.mods.Runtime")
|
||||
|
||||
local CopyrightSplash = {}
|
||||
CopyrightSplash.__index = CopyrightSplash
|
||||
CopyrightSplash.isOpaque = true
|
||||
|
||||
local SCREEN_W, SCREEN_H = 160, 144
|
||||
local HOLD_FRAMES = 100
|
||||
|
||||
-- Rows are the Gen 1 card's, which sit where the cart's own three lines do.
|
||||
-- Only used when the extracted splash image is missing.
|
||||
local LINE_Y = { 48, 64, 80 }
|
||||
|
||||
local function tryImage(path)
|
||||
if not path then return nil end
|
||||
local ok, image = pcall(Assets.image, path)
|
||||
if ok then return image end
|
||||
return nil
|
||||
end
|
||||
|
||||
function CopyrightSplash:wantsFillScale() return true end
|
||||
function CopyrightSplash:drawsWidescreen() return true end
|
||||
|
||||
function CopyrightSplash.new(game, opts)
|
||||
opts = opts or {}
|
||||
local self = setmetatable({}, CopyrightSplash)
|
||||
self.game = game
|
||||
self.onDone = opts.onDone
|
||||
local title = opts.title or {}
|
||||
-- Prefer an explicit override, then the extracted splash from title.lua.
|
||||
self.image = tryImage(opts.image)
|
||||
or tryImage(title.copyrightSplash)
|
||||
or tryImage("assets/generated/title/copyright_splash.png")
|
||||
-- Text fallback only when the ROM extract is missing (tests / bare boots).
|
||||
self.lines = opts.lines
|
||||
self.frames = 0
|
||||
self.done = false
|
||||
return self
|
||||
end
|
||||
|
||||
-- intro.boot.copyright: the first card of the GS boot cinema is on screen.
|
||||
--
|
||||
-- The four intro.boot.* names are Gen 2 ONLY, and deliberately new rather than
|
||||
-- borrowed: Red boots straight into IntroMovie and has no copyright card, no
|
||||
-- GAME FREAK splash and no attract movie, so there is no Gen 1 moment for any
|
||||
-- of them to share a name with (see docs/mod-api-gen2-compat.md). One name per
|
||||
-- card, emitted the frame the card comes up, because that is the moment a mod
|
||||
-- can act on -- swap the art, start its own jingle, or count the boot. The
|
||||
-- card's END needs no name of its own: Game2:showCopyright chains straight into
|
||||
-- the next card, so intro.boot.gamefreak IS this card's end.
|
||||
function CopyrightSplash:enter()
|
||||
if Runtime.wants("intro.boot.copyright") then
|
||||
Runtime.emit("intro.boot.copyright", { screen = self, game = self.game })
|
||||
end
|
||||
end
|
||||
|
||||
function CopyrightSplash:update(_dt)
|
||||
self.frames = self.frames + 1
|
||||
local input = self.game.input
|
||||
local skip = input and (input:wasPressed("a") or input:wasPressed("start")
|
||||
or input:wasPressed("b") or input:wasPressed("select"))
|
||||
if skip or self.frames >= HOLD_FRAMES then
|
||||
if self.done then return end
|
||||
self.done = true
|
||||
if self.onDone then self.onDone() end
|
||||
end
|
||||
end
|
||||
|
||||
function CopyrightSplash:drawPanel()
|
||||
local G = love.graphics
|
||||
G.setColor(1, 1, 1, 1)
|
||||
G.rectangle("fill", 0, 0, SCREEN_W, SCREEN_H)
|
||||
if self.image then
|
||||
G.draw(self.image, 0, 0)
|
||||
return
|
||||
end
|
||||
if not self.lines then return end
|
||||
-- The Gen 2 font is a fixed 8px cell, so centring is a character count.
|
||||
G.setColor(0, 0, 0, 1)
|
||||
for index, line in ipairs(self.lines) do
|
||||
local y = LINE_Y[index]
|
||||
if y then
|
||||
Font.draw(line, math.floor((SCREEN_W - #line * 8) / 2), y)
|
||||
end
|
||||
end
|
||||
G.setColor(1, 1, 1, 1)
|
||||
end
|
||||
|
||||
function CopyrightSplash:draw()
|
||||
self:drawPanel()
|
||||
end
|
||||
|
||||
function CopyrightSplash:drawWidescreen(winW, winH)
|
||||
local G = love.graphics
|
||||
G.setColor(1, 1, 1, 1)
|
||||
G.rectangle("fill", 0, 0, winW, winH)
|
||||
local scale = Chrome.fitScale(winW, winH)
|
||||
G.push()
|
||||
G.translate(math.floor((winW - SCREEN_W * scale) / 2),
|
||||
math.floor((winH - SCREEN_H * scale) / 2))
|
||||
G.scale(scale, scale)
|
||||
self:drawPanel()
|
||||
G.pop()
|
||||
end
|
||||
|
||||
return CopyrightSplash
|
||||
Reference in New Issue
Block a user