diff --git a/src/dusk/save/save.c b/src/dusk/save/save.c index 0c22ca7e..ba49c46e 100644 --- a/src/dusk/save/save.c +++ b/src/dusk/save/save.c @@ -75,6 +75,13 @@ errorret_t saveUpdate() { // Reset slot, implying no slot has been selected. SAVE.slotCurrent = 0xFF; + // TEST: write settings back out immediately once a device is + // selected, to confirm the write path actually works on hardware. + errorChain(saveDeviceSettingsWrite( + &SAVE.devices[SAVE.deviceCurrent], + &SAVE.settings + )); + SAVE.findingAvailableDevice = false; SAVE.findAvailableCallback( &SAVE.devices[SAVE.deviceCurrent], diff --git a/src/dusk/scene/initial/sceneinitial.c b/src/dusk/scene/initial/sceneinitial.c index b3482d72..b9e4baad 100644 --- a/src/dusk/scene/initial/sceneinitial.c +++ b/src/dusk/scene/initial/sceneinitial.c @@ -23,7 +23,7 @@ void sceneInitialSaveDeviceRetryCallback(const uint8_t opt, void *u); CUTSCENE(INITIAL, 0, DEFAULT, CUTSCENE_MODAL( "Checking for save data...", - "Checking for save data... Please wait." + "Please wait." ), CUTSCENE_WAIT(1.0f), CUTSCENE_CALLBACK(sceneInitialFindDevices), @@ -58,8 +58,6 @@ void sceneInitialSaveDeviceRetryCallback(const uint8_t opt, void *u) { cutsceneGoTo(opt == 0 ? "RETRY" : "CONTINUE"); } - - errorret_t sceneInitialInit(scenedata_t *sceneData) { assertNotNull(sceneData, "Scene data cannot be null"); memoryZero(&sceneData->initial, sizeof(sceneinitial_t)); diff --git a/src/dusklinux/input/inputlinux.c b/src/dusklinux/input/inputlinux.c index d3523a50..aaf268d3 100644 --- a/src/dusklinux/input/inputlinux.c +++ b/src/dusklinux/input/inputlinux.c @@ -517,7 +517,6 @@ errorret_t inputInitLinux(void) { X("tab", INPUT_ACTION_CANCEL); X("q", INPUT_ACTION_CANCEL); X("escape", INPUT_ACTION_RAGEQUIT); - X("enter", INPUT_ACTION_PAUSE); X("`", INPUT_ACTION_CONSOLE); #endif diff --git a/src/duskpsp/save/savedevicepsp.c b/src/duskpsp/save/savedevicepsp.c index 6240381a..6bfb8589 100644 --- a/src/duskpsp/save/savedevicepsp.c +++ b/src/duskpsp/save/savedevicepsp.c @@ -38,13 +38,18 @@ void saveDevicePSPCheckAvailability(savedevice_t *device) { // Confirm the memory stick is actually reachable - the real save/load // (via sceUtilitySavedata) only reports failure once a save/load is - // attempted, so this is checked separately up front. - SceIoStat stat; - if(sceIoGetstat(SAVE_DEVICE_PSP_ROOT, &stat) < 0) { + // attempted, so this is checked separately up front. sceIoGetstat on a + // bare device root (e.g. "ms0:/") is unreliable on real hardware - + // confirmed returning EINVAL there even with a memory stick present - + // so open/close the root directory instead, which is the SDK's own + // documented way to probe a device (see sceIoDopen's doc comment). + SceUID dir = sceIoDopen(SAVE_DEVICE_PSP_ROOT); + if(dir < 0) { device->state = SAVE_DEVICE_STATE_UNAVAILABLE; device->reasonKey = "save.psp.no_memory_stick"; return saveDeviceFireCallback(device); } + sceIoDclose(dir); device->state = SAVE_DEVICE_STATE_AVAILABLE; device->reasonKey = NULL;