diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua index feae9ab9..e859a1ac 100644 --- a/src/import/RomImporter.lua +++ b/src/import/RomImporter.lua @@ -1434,8 +1434,15 @@ end -- "Import save" button: open a native .sav picker and import the pick. -- Android mirrors ROM / mod import via love.system.pickFile("sav"). +-- NX: no HostShell/desktop picker — rescan imports/saves/ inbox instead. function RomImporter:chooseSaveImport(version) if self.workState == "working" then return end + version = self:_resolveSaveVersion(version) + if self.isNX then + self:ensureSavesInboxDir() + self:rescanSavesAction(version) + return + end if self.ios and love.system.getPickedFile then self.iosPendingKind = "sav" self.iosPendingVersion = version @@ -3749,6 +3756,8 @@ function RomImporter:_drawGamePanel(version, x, y, w, h, paged) sfHintText, sfHintCol = sfNotice.text, (sfNotice.ok and PAL.green or PAL.red) elseif locked then sfHintText, sfHintCol = "Not available yet.", PAL.warning + elseif self.isNX then + sfHintText, sfHintCol = self:_savesDefaultHint(), PAL.warning elseif self.android then sfHintText, sfHintCol = "Import or export a .sav with the system file picker.", PAL.warning @@ -4683,6 +4692,20 @@ function RomImporter:_modsDefaultHint() return Strings("Or drop a mod .zip onto the window.") end +function RomImporter:_savesDefaultHint() + if self.isNX then + local saveDir = love.filesystem.getSaveDirectory() + local rel = RomImporter.mtpHintPath(saveDir) + if rel ~= "" and rel:sub(-1) ~= "/" then rel = rel .. "/" end + return Strings("Copy a .sav via MTP into %s/imports/saves/\n" + .. "DBI MTP → 1: SD Card/%simports/saves/", saveDir, rel) + end + if self.android then + return "Import or export a .sav with the system file picker." + end + return Strings("Import a .sav to a new slot, or export the active slot.") +end + function RomImporter:_modsEmptyHint() if self.isNX then return Strings("No mods installed - copy a .zip into imports/mods/ " diff --git a/tests/rom_importer_nx_saves_inbox_test.lua b/tests/rom_importer_nx_saves_inbox_test.lua index bbf34b59..8ec86803 100644 --- a/tests/rom_importer_nx_saves_inbox_test.lua +++ b/tests/rom_importer_nx_saves_inbox_test.lua @@ -83,6 +83,7 @@ local function freshImporter() exportSave = RomImporter.exportSave, _importSave = RomImporter._importSave, _savedropTarget = RomImporter._savedropTarget, + _savesDefaultHint = RomImporter._savesDefaultHint, _refreshSlots = function(self, version) self._refreshed = (self._refreshed or 0) + 1 self._refreshVersion = version @@ -268,6 +269,45 @@ hostShellCalls = 0 ri:chooseSaveImport("red") eq(hostShellCalls, 0, "RES-06: NX chooseSaveImport does not require HostShell") +-- NXSAV-05: chooseSaveImport on NX rescans inbox +ri = freshImporter() +importCalls = {} +hostShellCalls = 0 +love.filesystem.write("imports/saves/from-choose.sav", "CHOOSE") +importBehavior["imports/saves/from-choose.sav"] = { ok = true, id = "slot-choose" } +ri:chooseSaveImport("red") +eq(hostShellCalls, 0, "NX chooseSaveImport does not use HostShell") +eq(#importCalls, 1, "NX chooseSaveImport rescans and imports inbox .sav") +eq(importCalls[1].source, "imports/saves/from-choose.sav", + "NX chooseSaveImport imports from imports/saves/") +check(ri.saveNotice.red and ri.saveNotice.red.ok, "NX chooseSaveImport success notice") + +-- Empty chooseSaveImport still sets notice (RES-04 via Import save button) +ri = freshImporter() +importCalls = {} +ri:chooseSaveImport("red") +eq(#importCalls, 0, "empty NX chooseSaveImport does not import") +check(ri.saveNotice.red ~= nil and ri.saveNotice.red.text:find("imports/saves/", 1, true), + "empty NX chooseSaveImport sets MTP notice") + +-- RES-11 / NXSAV-07: NX default SAVE FILES hint mentions imports/saves/ +ri = freshImporter() +local defaultHint = ri:_savesDefaultHint() +check(defaultHint:find("imports/saves/", 1, true), + "RES-11: NX default hint mentions imports/saves/") +check(defaultHint:find("DBI MTP", 1, true), + "RES-11: NX default hint mentions DBI MTP") +check(not defaultHint:find("system file picker", 1, true), + "RES-11: NX default hint is not desktop picker wording") + +-- Desktop keeps picker-oriented default hint (non-NX) +local desk = setmetatable({ + isNX = false, android = false, + _savesDefaultHint = RomImporter._savesDefaultHint, +}, RomImporter) +check(desk:_savesDefaultHint():find("new slot", 1, true), + "desktop default save hint stays picker/drop-oriented") + -- Cleanup + restore stubs clearSavesInbox() love.filesystem.remove("imports/other.sav")