From 6263b196cd30485da2ac8257ace870fdf7984833 Mon Sep 17 00:00:00 2001 From: nacro711072 Date: Sun, 8 Jan 2023 01:27:02 +0800 Subject: [PATCH] Refactor maptype & resolve map setting issue (#8328) * Add [MapGenerateMainType] to separate with [MapType]. * Add missing import. --- core/src/com/unciv/logic/map/MapParameters.kt | 21 +++++----- .../ui/mapeditor/MapEditorGenerateTab.kt | 3 +- .../unciv/ui/mapeditor/MapEditorSaveTab.kt | 3 +- .../unciv/ui/newgamescreen/MapOptionsTable.kt | 42 ++++++++++++------- .../ui/newgamescreen/MapParametersTable.kt | 16 +++---- .../unciv/ui/newgamescreen/NewGameScreen.kt | 3 +- 6 files changed, 52 insertions(+), 36 deletions(-) diff --git a/core/src/com/unciv/logic/map/MapParameters.kt b/core/src/com/unciv/logic/map/MapParameters.kt index 2a74c3d50b..d8f88ebad1 100644 --- a/core/src/com/unciv/logic/map/MapParameters.kt +++ b/core/src/com/unciv/logic/map/MapParameters.kt @@ -25,7 +25,7 @@ enum class MapSize(val radius: Int, val width: Int, val height: Int) { companion object { /** Not a predefined [MapSize] enum value, but a String * used in [MapParameters.mapSize] to indicate user-defined dimensions. - * Do not mistake for [MapType.custom]. */ + * Do not mistake for [MapGeneratedMainType.custom]. */ const val custom = "Custom" } } @@ -128,6 +128,15 @@ object MapShape : IsPartOfGameInfoSerialization { const val rectangular = "Rectangular" } +object MapGeneratedMainType : IsPartOfGameInfoSerialization { + const val generated = "Generated" + // Randomly choose a generated map type + const val randomGenerated = "Random Generated" + // Non-generated maps + const val custom = "Custom" + +} + object MapType : IsPartOfGameInfoSerialization { const val default = "Default" const val pangaea = "Pangaea" @@ -141,14 +150,6 @@ object MapType : IsPartOfGameInfoSerialization { // Cellular automata style const val smoothedRandom = "Smoothed Random" - const val generated = "Generated" - - // Randomly choose a generated map type - const val randomGenerated = "Random Generated" - - // Non-generated maps - const val custom = "Custom" - // All ocean tiles const val empty = "Empty" } @@ -260,7 +261,7 @@ class MapParameters : IsPartOfGameInfoSerialization { if(mapResources != MapResources.default) yield(" {Resource Setting}: {$mapResources}") if (name.isEmpty()) return@sequence yield("\n") - if (type != MapType.custom && type != MapType.empty) yield("{Map Generation Type}: {$type}, ") + if (type != MapGeneratedMainType.custom && type != MapType.empty) yield("{Map Generation Type}: {$type}, ") yield("{RNG Seed} $seed") yield(", {Map Elevation}=" + elevationExponent.niceToString(2)) yield(", {Temperature extremeness}=" + temperatureExtremeness.niceToString(2)) diff --git a/core/src/com/unciv/ui/mapeditor/MapEditorGenerateTab.kt b/core/src/com/unciv/ui/mapeditor/MapEditorGenerateTab.kt index b5b15db400..f4bb16e60d 100644 --- a/core/src/com/unciv/ui/mapeditor/MapEditorGenerateTab.kt +++ b/core/src/com/unciv/ui/mapeditor/MapEditorGenerateTab.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup import com.badlogic.gdx.scenes.scene2d.ui.CheckBox import com.badlogic.gdx.scenes.scene2d.ui.Table +import com.unciv.logic.map.MapGeneratedMainType import com.unciv.logic.map.MapParameters import com.unciv.logic.map.MapType import com.unciv.logic.map.TileMap @@ -165,7 +166,7 @@ class MapEditorGenerateTab( private val parent: MapEditorGenerateTab ): Table(BaseScreen.skin) { val generateButton = "".toTextButton() - val mapParametersTable = MapParametersTable(parent.editorScreen.newMapParameters, forMapEditor = true) { + val mapParametersTable = MapParametersTable(parent.editorScreen.newMapParameters, MapGeneratedMainType.generated, forMapEditor = true) { parent.replacePage(0, this) // A kludge to get the ScrollPanes to recognize changes in vertical layout?? } diff --git a/core/src/com/unciv/ui/mapeditor/MapEditorSaveTab.kt b/core/src/com/unciv/ui/mapeditor/MapEditorSaveTab.kt index 32db7f262e..77894cc50c 100644 --- a/core/src/com/unciv/ui/mapeditor/MapEditorSaveTab.kt +++ b/core/src/com/unciv/ui/mapeditor/MapEditorSaveTab.kt @@ -6,6 +6,7 @@ import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.TextField import com.unciv.logic.MapSaver +import com.unciv.logic.map.MapGeneratedMainType import com.unciv.logic.map.MapType import com.unciv.logic.map.TileMap import com.unciv.models.translations.tr @@ -76,7 +77,7 @@ class MapEditorSaveTab( private fun saveHandler() { if (mapNameTextField.text.isBlank()) return editorScreen.tileMap.mapParameters.name = mapNameTextField.text - editorScreen.tileMap.mapParameters.type = MapType.custom + editorScreen.tileMap.mapParameters.type = MapGeneratedMainType.custom thread(name = "MapSaver", block = this::saverThread) } diff --git a/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt b/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt index 4a33059b53..4c9bb3e106 100644 --- a/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt @@ -7,6 +7,7 @@ import com.badlogic.gdx.utils.Array import com.unciv.UncivGame import com.unciv.logic.MapSaver import com.unciv.logic.UncivShowableException +import com.unciv.logic.map.MapGeneratedMainType import com.unciv.logic.map.MapType import com.unciv.models.ruleset.RulesetCache import com.unciv.ui.popup.Popup @@ -18,7 +19,8 @@ class MapOptionsTable(private val newGameScreen: NewGameScreen): Table() { private val mapParameters = newGameScreen.gameSetupInfo.mapParameters private var mapTypeSpecificTable = Table() - var generatedMapOptionsTable = MapParametersTable(mapParameters) + val generatedMapOptionsTable = MapParametersTable(mapParameters, MapGeneratedMainType.generated) + private val randomMapOptionsTable = MapParametersTable(mapParameters, MapGeneratedMainType.randomGenerated) private val savedMapOptionsTable = Table() lateinit var mapTypeSelectBox: TranslatedSelectBox private val mapFileSelectBox = createMapFileSelectBox() @@ -40,8 +42,8 @@ class MapOptionsTable(private val newGameScreen: NewGameScreen): Table() { } private fun addMapTypeSelection() { - val mapTypes = arrayListOf(MapType.generated, MapType.randomGenerated) - if (mapFilesSequence.any()) mapTypes.add(MapType.custom) + val mapTypes = arrayListOf(MapGeneratedMainType.generated, MapGeneratedMainType.randomGenerated) + if (mapFilesSequence.any()) mapTypes.add(MapGeneratedMainType.custom) mapTypeSelectBox = TranslatedSelectBox(mapTypes, "Generated", BaseScreen.skin) savedMapOptionsTable.defaults().pad(5f) @@ -55,18 +57,26 @@ class MapOptionsTable(private val newGameScreen: NewGameScreen): Table() { fun updateOnMapTypeChange() { mapTypeSpecificTable.clear() - if (mapTypeSelectBox.selected.value == MapType.custom) { - fillMapFileSelectBox() - mapParameters.type = MapType.custom - mapParameters.name = mapFileSelectBox.selected.toString() - mapTypeSpecificTable.add(savedMapOptionsTable) - newGameScreen.unlockTables() - } else { // generated map - mapParameters.name = "" - mapParameters.type = mapTypeSelectBox.selected.value - generatedMapOptionsTable = MapParametersTable(mapParameters) - mapTypeSpecificTable.add(generatedMapOptionsTable) - newGameScreen.unlockTables() + when (mapTypeSelectBox.selected.value) { + MapGeneratedMainType.custom -> { + fillMapFileSelectBox() + mapParameters.type = MapGeneratedMainType.custom + mapParameters.name = mapFileSelectBox.selected.toString() + mapTypeSpecificTable.add(savedMapOptionsTable) + newGameScreen.unlockTables() + } + MapGeneratedMainType.generated -> { + mapParameters.name = "" + mapParameters.type = generatedMapOptionsTable.mapTypeSelectBox.selected.value + mapTypeSpecificTable.add(generatedMapOptionsTable) + newGameScreen.unlockTables() + + } + MapGeneratedMainType.randomGenerated -> { + mapParameters.name = "" + mapTypeSpecificTable.add(randomMapOptionsTable) + newGameScreen.unlockTables() + } } newGameScreen.gameSetupInfo.gameParameters.godMode = false newGameScreen.updateTables() @@ -74,7 +84,7 @@ class MapOptionsTable(private val newGameScreen: NewGameScreen): Table() { // Pre-select custom if any map saved within last 15 minutes if (mapFilesSequence.any { it.fileHandle.lastModified() > System.currentTimeMillis() - 900000 }) - mapTypeSelectBox.selected = TranslatedSelectBox.TranslatedString(MapType.custom) + mapTypeSelectBox.selected = TranslatedSelectBox.TranslatedString(MapGeneratedMainType.custom) // activate once, so when we had a file map before we'll have the right things set for another one updateOnMapTypeChange() diff --git a/core/src/com/unciv/ui/newgamescreen/MapParametersTable.kt b/core/src/com/unciv/ui/newgamescreen/MapParametersTable.kt index 627814edbf..74ea489ca0 100644 --- a/core/src/com/unciv/ui/newgamescreen/MapParametersTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/MapParametersTable.kt @@ -5,6 +5,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.CheckBox import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.scenes.scene2d.ui.TextField import com.badlogic.gdx.scenes.scene2d.ui.TextField.TextFieldFilter.DigitsOnlyFilter +import com.unciv.logic.map.MapGeneratedMainType import com.unciv.logic.map.MapParameters import com.unciv.logic.map.MapResources import com.unciv.logic.map.MapShape @@ -31,6 +32,7 @@ import com.unciv.ui.utils.extensions.toTextButton * */ class MapParametersTable( private val mapParameters: MapParameters, + private val mapGeneratedMainType: String, private val forMapEditor: Boolean = false, private val sizeChangedCallback: (()->Unit)? = null ) : Table() { @@ -67,7 +69,7 @@ class MapParametersTable( init { skin = BaseScreen.skin defaults().pad(5f, 10f) - if (mapParameters.type === MapType.randomGenerated) { + if (mapGeneratedMainType == MapGeneratedMainType.randomGenerated) { add("{Which options should be available to the random selection?}".toLabel()).colspan(2).grow().row() } addMapShapeSelectBox() @@ -90,7 +92,7 @@ class MapParametersTable( MapShape.rectangular ) - if (mapParameters.type === MapType.randomGenerated) { + if (mapGeneratedMainType == MapGeneratedMainType.randomGenerated) { mapShapesOptionsValues = mapShapes.toHashSet() val optionsTable = MultiCheckboxTable("{Enabled Map Shapes}", "NewGameMapShapes", mapShapesOptionsValues) { if (mapShapesOptionsValues.isEmpty()) { @@ -125,10 +127,10 @@ class MapParametersTable( MapType.smoothedRandom, MapType.archipelago, MapType.innerSea, - if (forMapEditor && mapParameters.type !== MapType.randomGenerated) MapType.empty else null + if (forMapEditor && mapGeneratedMainType != MapGeneratedMainType.randomGenerated) MapType.empty else null ) - if (mapParameters.type === MapType.randomGenerated) { + if (mapGeneratedMainType == MapGeneratedMainType.randomGenerated) { mapTypesOptionsValues = mapTypes.toHashSet() val optionsTable = MultiCheckboxTable("{Enabled Map Generation Types}", "NewGameMapGenerationTypes", mapTypesOptionsValues) { if (mapTypesOptionsValues.isEmpty()) { @@ -155,7 +157,7 @@ class MapParametersTable( } private fun addWorldSizeTable() { - if (mapParameters.type === MapType.randomGenerated) { + if (mapGeneratedMainType == MapGeneratedMainType.randomGenerated) { val mapSizes = MapSize.values().map { it.name } mapSizesOptionsValues = mapSizes.toHashSet() val optionsTable = MultiCheckboxTable("{Enabled World Sizes}", "NewGameWorldSizes", mapSizesOptionsValues) { @@ -249,7 +251,7 @@ class MapParametersTable( MapResources.legendaryStart ) - if (mapParameters.type === MapType.randomGenerated) { + if (mapGeneratedMainType == MapGeneratedMainType.randomGenerated) { mapResourcesOptionsValues = mapResources.toHashSet() val optionsTable = MultiCheckboxTable("{Enabled Resource Settings}", "NewGameResourceSettings", mapResourcesOptionsValues) { if (mapResourcesOptionsValues.isEmpty()) { @@ -294,7 +296,7 @@ class MapParametersTable( private fun addWrappedCheckBoxes() { val worldWrapWarning = "World wrap maps are very memory intensive - creating large world wrap maps on Android can lead to crashes!" - if (mapParameters.type === MapType.randomGenerated) { + if (mapGeneratedMainType == MapGeneratedMainType.randomGenerated) { add(ExpanderTab("{Other Settings}", persistenceID = "NewGameOtherSettings", startsOutOpened = false) { it.defaults().pad(5f,0f) it.addNoRuinsCheckbox() diff --git a/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt b/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt index 926f825264..f2992699d1 100644 --- a/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt +++ b/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt @@ -13,6 +13,7 @@ import com.unciv.logic.GameStarter import com.unciv.logic.IdChecker import com.unciv.logic.MapSaver import com.unciv.logic.civilization.PlayerType +import com.unciv.logic.map.MapGeneratedMainType import com.unciv.logic.map.MapType import com.unciv.logic.multiplayer.OnlineMultiplayer import com.unciv.logic.multiplayer.storage.FileStorageRateLimitReached @@ -153,7 +154,7 @@ class NewGameScreen( Gdx.input.inputProcessor = null // remove input processing - nothing will be clicked! - if (mapOptionsTable.mapTypeSelectBox.selected.value == MapType.custom) { + if (mapOptionsTable.mapTypeSelectBox.selected.value == MapGeneratedMainType.custom) { val map = try { MapSaver.loadMap(gameSetupInfo.mapFile!!) } catch (ex: Throwable) {