Skip to content

Commit 28a1f11

Browse files
committed
Import previous melonds saves when found.
1 parent 1013a76 commit 28a1f11

File tree

5 files changed

+68
-14
lines changed

5 files changed

+68
-14
lines changed

Diff for: retrograde-app-shared/src/main/java/com/swordfish/lemuroid/lib/game/GameLoader.kt

+6-6
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ import java.io.File
4343

4444
class GameLoader(
4545
private val lemuroidLibrary: LemuroidLibrary,
46-
private val legacyStatesManager: StatesManager,
47-
private val legacySavesManager: SavesManager,
48-
private val legacyCoreVariablesManager: CoreVariablesManager,
46+
private val statesManager: StatesManager,
47+
private val savesManager: SavesManager,
48+
private val coreVariablesManager: CoreVariablesManager,
4949
private val retrogradeDatabase: RetrogradeDatabase,
5050
private val savesCoherencyEngine: SavesCoherencyEngine,
5151
private val directoriesManager: DirectoriesManager,
@@ -97,7 +97,7 @@ class GameLoader(
9797

9898
val saveRAMData =
9999
runCatching {
100-
legacySavesManager.getSaveRAM(game)
100+
savesManager.getSaveRAM(game, systemCoreConfig)
101101
}.getOrElse { throw GameLoaderException(GameLoaderError.Saves) }
102102

103103
val quickSaveData =
@@ -106,14 +106,14 @@ class GameLoader(
106106
!savesCoherencyEngine.shouldDiscardAutoSaveState(game, systemCoreConfig.coreID)
107107

108108
if (systemCoreConfig.statesSupported && loadSave && shouldDiscardSave) {
109-
legacyStatesManager.getAutoSave(game, systemCoreConfig.coreID)
109+
statesManager.getAutoSave(game, systemCoreConfig.coreID)
110110
} else {
111111
null
112112
}
113113
}.getOrElse { throw GameLoaderException(GameLoaderError.Saves) }
114114

115115
val coreVariables =
116-
legacyCoreVariablesManager.getOptionsForCore(system.id, systemCoreConfig)
116+
coreVariablesManager.getOptionsForCore(system.id, systemCoreConfig)
117117
.toTypedArray()
118118

119119
val systemDirectory = directoriesManager.getSystemDirectory()

Diff for: retrograde-app-shared/src/main/java/com/swordfish/lemuroid/lib/library/GameSystem.kt

+2
Original file line numberDiff line numberDiff line change
@@ -996,6 +996,8 @@ data class GameSystem(
996996
CoreVariable("melonds_number_of_screen_layouts", "1"),
997997
CoreVariable("melonds_touch_mode", "Touch"),
998998
CoreVariable("melonds_threaded_renderer", "enabled"),
999+
// TODO... As soon as libretrodroid supports the microphone we can remove this.
1000+
CoreVariable("melonds_mic_input", "blow"),
9991001
),
10001002
controllerConfigs =
10011003
hashMapOf(

Diff for: retrograde-app-shared/src/main/java/com/swordfish/lemuroid/lib/saves/SavesManager.kt

+18-8
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,38 @@
11
package com.swordfish.lemuroid.lib.saves
22

33
import com.swordfish.lemuroid.common.kotlin.runCatchingWithRetry
4+
import com.swordfish.lemuroid.lib.library.SystemCoreConfig
45
import com.swordfish.lemuroid.lib.library.db.entity.Game
6+
import com.swordfish.lemuroid.lib.saves.migrators.getSavesMigrator
57
import com.swordfish.lemuroid.lib.storage.DirectoriesManager
68
import kotlinx.coroutines.Dispatchers
79
import kotlinx.coroutines.withContext
810
import java.io.File
911

1012
class SavesManager(private val directoriesManager: DirectoriesManager) {
11-
suspend fun getSaveRAM(game: Game): ByteArray? =
12-
withContext(Dispatchers.IO) {
13+
suspend fun getSaveRAM(
14+
game: Game,
15+
systemCoreConfig: SystemCoreConfig,
16+
): ByteArray? {
17+
return withContext(Dispatchers.IO) {
1318
val result =
1419
runCatchingWithRetry(FILE_ACCESS_RETRIES) {
1520
val saveFile = getSaveFile(getSaveRAMFileName(game))
1621
if (saveFile.exists() && saveFile.length() > 0) {
1722
saveFile.readBytes()
1823
} else {
19-
null
24+
val savesMigrator = systemCoreConfig.getSavesMigrator()
25+
savesMigrator?.loadPreviousSaveForGame(game, directoriesManager)
2026
}
2127
}
2228
result.getOrNull()
2329
}
30+
}
2431

2532
suspend fun setSaveRAM(
2633
game: Game,
2734
data: ByteArray,
28-
): Unit =
35+
) {
2936
withContext(Dispatchers.IO) {
3037
val result =
3138
runCatchingWithRetry(FILE_ACCESS_RETRIES) {
@@ -38,19 +45,22 @@ class SavesManager(private val directoriesManager: DirectoriesManager) {
3845
}
3946
result.getOrNull()
4047
}
48+
}
4149

42-
suspend fun getSaveRAMInfo(game: Game): SaveInfo =
43-
withContext(Dispatchers.IO) {
50+
suspend fun getSaveRAMInfo(game: Game): SaveInfo {
51+
return withContext(Dispatchers.IO) {
4452
val saveFile = getSaveFile(getSaveRAMFileName(game))
4553
val fileExists = saveFile.exists() && saveFile.length() > 0
4654
SaveInfo(fileExists, saveFile.lastModified())
4755
}
56+
}
4857

49-
private suspend fun getSaveFile(fileName: String): File =
50-
withContext(Dispatchers.IO) {
58+
private suspend fun getSaveFile(fileName: String): File {
59+
return withContext(Dispatchers.IO) {
5160
val savesDirectory = directoriesManager.getSavesDirectory()
5261
File(savesDirectory, fileName)
5362
}
63+
}
5464

5565
/** This name should make it compatible with RetroArch so that users can freely sync saves across the two application. */
5666
private fun getSaveRAMFileName(game: Game) = "${game.fileName.substringBeforeLast(".")}.srm"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.swordfish.lemuroid.lib.saves.migrators
2+
3+
import com.swordfish.lemuroid.lib.library.db.entity.Game
4+
import com.swordfish.lemuroid.lib.storage.DirectoriesManager
5+
import java.io.File
6+
7+
object MelonDsSavesMigrator : SavesMigrator {
8+
override fun loadPreviousSaveForGame(
9+
game: Game,
10+
directoriesManager: DirectoriesManager,
11+
): ByteArray? {
12+
val savesDirectory = directoriesManager.getSavesDirectory()
13+
val previousSaveFileName = "${game.fileName.substringBeforeLast(".")}.sav"
14+
val previousSaveFile = File(savesDirectory, previousSaveFileName)
15+
16+
return if (previousSaveFile.exists() && previousSaveFile.length() > 0) {
17+
previousSaveFile.readBytes()
18+
} else {
19+
null
20+
}
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.swordfish.lemuroid.lib.saves.migrators
2+
3+
import com.swordfish.lemuroid.lib.library.CoreID
4+
import com.swordfish.lemuroid.lib.library.SystemCoreConfig
5+
import com.swordfish.lemuroid.lib.library.db.entity.Game
6+
import com.swordfish.lemuroid.lib.storage.DirectoriesManager
7+
8+
interface SavesMigrator {
9+
fun loadPreviousSaveForGame(
10+
game: Game,
11+
directoriesManager: DirectoriesManager,
12+
): ByteArray?
13+
}
14+
15+
fun SystemCoreConfig.getSavesMigrator(): SavesMigrator? {
16+
return when (this.coreID) {
17+
CoreID.MELONDS -> MelonDsSavesMigrator
18+
else -> null
19+
}
20+
}

0 commit comments

Comments
 (0)