Fix Tutorial loader for mods on Android (#10229)

This commit is contained in:
SomeTroglodyte
2023-10-05 09:24:54 +02:00
committed by GitHub
parent ed97c5b0ea
commit a4e3617037
2 changed files with 21 additions and 9 deletions

View File

@ -34,12 +34,20 @@ fun json() = Json(JsonWriter.OutputType.json).apply {
}
/**
* @throws SerializationException
* Load a json file by [filePath] from Gdx.files.internal
* (meaning from jar/apk for packaged release code, and not appropriate for mod files)
* @throws SerializationException
*/
fun <T> Json.fromJsonFile(tClass: Class<T>, filePath: String): T = fromJsonFile(tClass, Gdx.files.internal(filePath))
/**
* @throws SerializationException
* Load a json [file] - by handle, so internal/external/local is caller's decision.
*
* Reminder:
* * `internal` for Unciv-packaged assets, loaded from jar/apk, e.g. Built-in ruleset files.
* * `local` for mods and settings - Android will place that under /data/data/com.unciv.app/files.
* * `external` for saves - Android will place that under /sdcard/Android/data/com.unciv.app/files.
* @throws SerializationException
*/
fun <T> Json.fromJsonFile(tClass: Class<T>, file: FileHandle): T {
try {

View File

@ -1,6 +1,7 @@
package com.unciv.ui.screens.basescreen
import com.badlogic.gdx.Gdx
import com.badlogic.gdx.files.FileHandle
import com.unciv.Constants
import com.unciv.UncivGame
import com.unciv.json.fromJsonFile
@ -26,18 +27,21 @@ class TutorialController(screen: BaseScreen) {
// static to allow use from TutorialTranslationTests
fun loadTutorialsFromJson(includeMods: Boolean = true): LinkedHashMap<String, Tutorial> {
val result = linkedMapOf<String, Tutorial>()
for (path in tutorialFiles(includeMods)) {
json().fromJsonFile(Array<Tutorial>::class.java, path)
for (file in tutorialFiles(includeMods)) {
json().fromJsonFile(Array<Tutorial>::class.java, file)
.associateByTo(result) { it.name }
}
return result
}
private fun tutorialFiles(includeMods: Boolean) = sequence<String> {
yield("jsons/Tutorials.json")
private fun tutorialFiles(includeMods: Boolean) = sequence<FileHandle> {
yield(Gdx.files.internal("jsons/Tutorials.json"))
if (!includeMods) return@sequence
val mods = UncivGame.Current.gameInfo?.ruleset?.mods ?: return@sequence
val names = mods.asSequence().map { "mods/$it/jsons/Tutorials.json" }
yieldAll(names.filter { Gdx.files.local(it).exists() })
val mods = UncivGame.Current.gameInfo?.ruleset?.mods
?: return@sequence
val files = mods.asSequence()
.map { Gdx.files.local("mods/$it/jsons/Tutorials.json") }
yieldAll(files.filter { it.exists() })
}
}