mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-12 00:10:56 +02:00
cc67be341f
On a window too short for the stacked single-column layout -- a phone, or a narrow desktop window -- the ROM / SAVE FILES / Play / SAVE SLOT stack ran past the bottom of the window while the footer stayed pinned there and drew over it. Nothing clipped the panel and nothing scrolled it, so the overflow was unreachable. Everything under the tab bar (panel, updater banner, footer) is now one scrolling column, used only when it is taller than the room below the tab bar. The strip, logo and tab bar stay pinned, so navigation is always on screen, and the footer is laid out downward from footerTop right after the content instead of upward from the window bottom. - RomImporter.pageScrollFor is the whole decision, pure and covered by tests/engine/launcher_page_scroll.lua. A window that grows back drags the offset down with it, so the page never stays parked past its own end. - The panels return their natural height as they draw, so the measurement is the previous frame's: the same one-frame settle the slot and mod lists already rely on. - One scroll axis at a time. While the page scrolls, the panels draw paged: the slot and mod lists take their natural height, keep no inner scroll region and report a max of 0, so wheel, right stick and drag all move the page. Two-column layouts do not overflow, paged stays false, and every one of these behaves exactly as before. - inside() and _ptIn() reject a rect that scrolled out of the viewport, so a control that slid under the tab bar cannot be clicked through it. Tab chips are pinned and exempt. pageScroll resets on a tab change. Android had no scroll gesture at all: the launcher is handed no move events (main.lua forwards neither touchmoved nor mousemoved while it is up) and its mouse emulation was never trusted, which is what "no reliable pointer polling" referred to. That was survivable while every scroll region was an inner list, and useless once the page itself scrolls, since a phone is exactly where it overflows. love.touch is pollable, so _pointerHold reads the first active touch there and hands _updateSlotDrag the same (held, y) pair the mouse gives on desktop. Slot rows and mod toggles consequently arm on press and commit on release on Android too, matching desktop, so a swipe that starts on a card scrolls instead of selecting it. All of it is gated on touchPollable: without love.touch every Android path is exactly what it was. conf.lua also grows minwidth/minheight (480x360) for the desktop window, under which the cards stop being readable. Mobile is fullscreen and ignores it. Verified on the Android emulator (1080x2400) against a build of the parent commit: before, the footer painted over the SAVE SLOT card with no way to reach it; after, the page pans by touch and the footer is reachable and intact.
85 lines
4.0 KiB
Lua
85 lines
4.0 KiB
Lua
function love.conf(t)
|
|
local editor = os.getenv("POKEPORT_EDITOR") == "1"
|
|
local developer = os.getenv("POKEPORT_DEV") == "1"
|
|
if arg then
|
|
for _, a in ipairs(arg) do
|
|
if a == "--editor" then editor = true end
|
|
if a == "--developer" then developer = true end
|
|
end
|
|
end
|
|
-- main.lua runs in the same Lua state right after conf.lua; stash the
|
|
-- decision in a global so it doesn't need to reparse `arg`.
|
|
_G.POKEPORT_EDITOR_MODE = editor
|
|
_G.POKEPORT_DEV_MODE = developer
|
|
|
|
if editor then
|
|
-- Same identity as the game, deliberately: the editor edits the game's
|
|
-- saves and reads the game's ROM cache, both of which live under this
|
|
-- folder. A private editor identity would point love.filesystem at an
|
|
-- empty directory in a packaged build, so `--editor` could not find
|
|
-- data/generated at all (SaveIO.defaultPath already assumed this name).
|
|
t.identity = os.getenv("POKEPORT_IDENTITY") or "pokemon-love2d"
|
|
t.window.title = "Pokemon Save Editor"
|
|
t.window.width = 1280
|
|
t.window.height = 800
|
|
else
|
|
t.identity = os.getenv("POKEPORT_IDENTITY") or "pokemon-love2d"
|
|
-- Version.lua has zero requires, so it is loadable this early; fall
|
|
-- back to the plain title if the source is not mounted yet
|
|
local ok, Version = pcall(require, "src.core.Version")
|
|
t.window.title = ok and Version.title()
|
|
or "gen1recomp"
|
|
-- Open at the launcher's design size (the split-screen ROM selector is
|
|
-- laid out for 1024x768). The window is resizable and the 160x144 game
|
|
-- canvas letterboxes into whatever size it ends up, so this only sets the
|
|
-- starting size, not the game's resolution.
|
|
t.window.width = 1024
|
|
t.window.height = 768
|
|
-- Floor for the resizable desktop window. The launcher's single-column
|
|
-- layout is laid out against ~420 logical px of content, and the game
|
|
-- canvas letterboxes fine below that, so this only stops a drag that would
|
|
-- squeeze the cards past the point where their buttons still read. Kept
|
|
-- well under the smallest supported desktop display; mobile ignores it
|
|
-- (fullscreen), so the handheld ports are unaffected.
|
|
t.window.minwidth = 480
|
|
t.window.minheight = 360
|
|
end
|
|
t.version = "11.5"
|
|
t.window.vsync = 1
|
|
t.modules.joystick = true
|
|
t.modules.physics = false
|
|
|
|
-- love.system is not loaded during love.conf; love._os is set by the
|
|
-- engine before conf runs (LÖVE 11.x / 11.5).
|
|
local osName = love._os
|
|
local mobile = osName == "Android" or osName == "iOS"
|
|
if mobile then
|
|
-- resizable is what unlocks orientation. SDL's Android backend, given no
|
|
-- SDL_HINT_ORIENTATIONS (LÖVE sets none), calls setRequestedOrientation
|
|
-- at window creation -- FULL_SENSOR when the window is resizable (rotates
|
|
-- freely to portrait or landscape), otherwise locked to the window's w/h
|
|
-- aspect. So a non-resizable tall window forced portrait; resizable lets
|
|
-- the game follow the device. The renderer letterboxes the 160x144
|
|
-- viewport into whatever size results, and the on-screen touch controls
|
|
-- re-lay themselves out from the new window size, so both orientations
|
|
-- just work. iOS follows the Info.plist orientations
|
|
-- (see mobile/ios/overlays/love-ios.plist, now portrait + landscape).
|
|
t.window.resizable = true
|
|
-- Starting size is a tall portrait hint; the OS resizes to the real
|
|
-- display and rotations resize again. highdpi is required for Retina iOS
|
|
-- (Android always behaves as highdpi).
|
|
t.window.width = 1080
|
|
t.window.height = 1920
|
|
t.window.fullscreen = true
|
|
t.window.highdpi = true
|
|
-- Android only (irrelevant on iOS): puts the save directory under the
|
|
-- app's external-files folder, which is readable/writable via USB or a
|
|
-- file manager with no runtime permission, so RomImporter can ask the
|
|
-- player to copy their ROM there instead of needing a native file
|
|
-- picker (LOVE 11.5 on Android has none -- see src/import/RomImporter.lua).
|
|
t.externalstorage = osName == "Android"
|
|
else
|
|
t.window.resizable = true
|
|
end
|
|
end
|