mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-19 04:06:10 +02:00
G2 support
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
-- Reading a letter: ReadAnyMail / ReadPartyMonMail (engine/pokemon/mail_2.asm).
|
||||
--
|
||||
-- The screen is one full-page piece of stationery -- ten of them, one per mail
|
||||
-- item, each its own Load*MailGFX routine painting a border, a mon and a
|
||||
-- scattering of icons out of gfx/mail.asm's 1bpp art. None of that art is in
|
||||
-- the cache (the extractor has never followed gfx/mail.asm), so this draws the
|
||||
-- page as a plain full-screen box and puts the two pieces that are DATA rather
|
||||
-- than tiles exactly where MailGFX_PlaceMessage puts them:
|
||||
--
|
||||
-- message hlcoord 2, 7 -- one PlaceString, so the '<NEXT>' stored at offset
|
||||
-- MAIL_LINE_LENGTH lands the second line on row 8
|
||||
-- author hlcoord 5, 14, except hlcoord 8, 14 for PORTRAITMAIL_INDEX and
|
||||
-- hlcoord 6, 14 for MORPH_MAIL_INDEX -- those two stationeries have
|
||||
-- art where the name would otherwise sit
|
||||
--
|
||||
-- .loop reads A, B and START and exits on any of them (START is the printer,
|
||||
-- which this port has no path for; the VC builds mask it off entirely with
|
||||
-- the Forbid_printing_mail patch, so treating it as an exit is the VC
|
||||
-- behaviour rather than an invention).
|
||||
|
||||
local Chrome = require("src.ui.gen2.Chrome")
|
||||
local Mail = require("src.core.gen2.Mail")
|
||||
|
||||
local MailRead = {}
|
||||
MailRead.__index = MailRead
|
||||
MailRead.isOpaque = true
|
||||
|
||||
local MESSAGE_X, MESSAGE_Y = 2, 7
|
||||
local AUTHOR_Y = 14
|
||||
|
||||
function MailRead:wantsFillScale() return true end
|
||||
function MailRead:drawsWidescreen() return true end
|
||||
|
||||
-- opts: entry (a `mailmsg` from src/core/gen2/Mail.lua), onClose()
|
||||
function MailRead.new(game, opts)
|
||||
opts = opts or {}
|
||||
local self = setmetatable({}, MailRead)
|
||||
self.game = game
|
||||
self.entry = opts.entry
|
||||
self.onClose = opts.onClose
|
||||
return self
|
||||
end
|
||||
|
||||
-- MailGFX_PlaceMessage's three author columns, picked by wCurMailIndex --
|
||||
-- which .LoadGFX set from the mail's TYPE byte by walking MailGFXPointers, so
|
||||
-- it is the *_MAIL_INDEX of the stationery and nothing else.
|
||||
function MailRead:authorColumn()
|
||||
local index = Mail.INDEX[self.entry and self.entry.type or ""]
|
||||
if index == Mail.INDEX.PORTRAITMAIL then return 8 end
|
||||
if index == Mail.INDEX.MORPH_MAIL then return 6 end
|
||||
return 5
|
||||
end
|
||||
|
||||
function MailRead:close()
|
||||
if self.onClose then self.onClose() end
|
||||
end
|
||||
|
||||
function MailRead:update(_dt)
|
||||
local input = self.game and self.game.input
|
||||
if not input then return end
|
||||
if input:wasPressed("a") or input:wasPressed("b")
|
||||
or input:wasPressed("start") then
|
||||
self:close()
|
||||
end
|
||||
end
|
||||
|
||||
function MailRead:drawPanel()
|
||||
Chrome.clear()
|
||||
-- DrawMailBorder frames the whole 20x18 page; without the stationery tiles
|
||||
-- the shared box frame is the honest stand-in.
|
||||
Chrome.box(0, 0, Chrome.SCREEN_W, Chrome.SCREEN_H)
|
||||
|
||||
local top, bottom = Mail.lines(self.entry)
|
||||
Chrome.print(top, MESSAGE_X, MESSAGE_Y)
|
||||
if bottom ~= "" then Chrome.print(bottom, MESSAGE_X, MESSAGE_Y + 1) end
|
||||
|
||||
-- MailGFX_PlaceMessage returns early when the author field is empty
|
||||
-- (`ld a, [de] / and a / ret z`), so a blank author draws nothing at all
|
||||
-- rather than an empty line under the message.
|
||||
local author = self.entry and self.entry.author or ""
|
||||
if author ~= "" then
|
||||
Chrome.print(author, self:authorColumn(), AUTHOR_Y)
|
||||
end
|
||||
love.graphics.setColor(1, 1, 1, 1)
|
||||
end
|
||||
|
||||
function MailRead:draw()
|
||||
self:drawPanel()
|
||||
end
|
||||
|
||||
function MailRead: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 - 160 * scale) / 2),
|
||||
math.floor((winH - 144 * scale) / 2))
|
||||
G.scale(scale, scale)
|
||||
self:drawPanel()
|
||||
G.pop()
|
||||
end
|
||||
|
||||
return MailRead
|
||||
Reference in New Issue
Block a user