From fff22e66cd7428dbf4fb50c3bae6775c05909e71 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Fri, 12 Feb 2021 11:16:54 +0200 Subject: [PATCH] Mod-specific maps are go! :D Resolves #3517 --- core/src/com/unciv/logic/map/MapParameters.kt | 3 +++ core/src/com/unciv/logic/map/TileInfo.kt | 2 +- .../com/unciv/ui/mapeditor/MapEditorScreen.kt | 1 + .../com/unciv/ui/mapeditor/NewMapScreen.kt | 20 +++++++++++++--- .../ui/newgamescreen/GameOptionsTable.kt | 2 +- .../unciv/ui/newgamescreen/MapOptionsTable.kt | 4 ++++ .../ui/newgamescreen/ModCheckboxTable.kt | 5 ++-- .../unciv/ui/newgamescreen/NewGameScreen.kt | 24 +++++++++++++++++++ core/src/com/unciv/ui/utils/ImageGetter.kt | 1 - 9 files changed, 53 insertions(+), 9 deletions(-) diff --git a/core/src/com/unciv/logic/map/MapParameters.kt b/core/src/com/unciv/logic/map/MapParameters.kt index 5ceb383dcd..c98c5181d1 100644 --- a/core/src/com/unciv/logic/map/MapParameters.kt +++ b/core/src/com/unciv/logic/map/MapParameters.kt @@ -37,6 +37,9 @@ class MapParameters { var noRuins = false var noNaturalWonders = false + /** This is used mainly for the map editor, so you can continue editing a map under the ame ruleset you started with */ + var mods = LinkedHashSet() + var seed: Long = 0 var tilesPerBiomeArea = 6 var maxCoastExtension = 2 diff --git a/core/src/com/unciv/logic/map/TileInfo.kt b/core/src/com/unciv/logic/map/TileInfo.kt index c2f7d96b95..0599e37c17 100644 --- a/core/src/com/unciv/logic/map/TileInfo.kt +++ b/core/src/com/unciv/logic/map/TileInfo.kt @@ -502,7 +502,7 @@ open class TileInfo { if (!ruleset.terrains.containsKey(baseTerrain)) return "Base terrain $baseTerrain does not exist in ruleset!" if (terrainFeature != null && !ruleset.terrains.containsKey(terrainFeature)) return "Terrain feature $terrainFeature does not exist in ruleset!" if (resource != null && !ruleset.tileResources.containsKey(resource)) return "Resource $resource does not exist in ruleset!" - if (improvement != null && !ruleset.tileImprovements.containsKey(baseTerrain)) return "Improvement $improvement does not exist in ruleset!" + if (improvement != null && !ruleset.tileImprovements.containsKey(improvement)) return "Improvement $improvement does not exist in ruleset!" return "" } diff --git a/core/src/com/unciv/ui/mapeditor/MapEditorScreen.kt b/core/src/com/unciv/ui/mapeditor/MapEditorScreen.kt index b798a17a0f..f79ac2b5af 100644 --- a/core/src/com/unciv/ui/mapeditor/MapEditorScreen.kt +++ b/core/src/com/unciv/ui/mapeditor/MapEditorScreen.kt @@ -27,6 +27,7 @@ class MapEditorScreen(): CameraStageBaseScreen() { constructor(map: TileMap) : this() { tileMap = map + ruleset = RulesetCache.getComplexRuleset(map.mapParameters.mods) initialize() } diff --git a/core/src/com/unciv/ui/mapeditor/NewMapScreen.kt b/core/src/com/unciv/ui/mapeditor/NewMapScreen.kt index abc0b817fa..76108fa31c 100644 --- a/core/src/com/unciv/ui/mapeditor/NewMapScreen.kt +++ b/core/src/com/unciv/ui/mapeditor/NewMapScreen.kt @@ -7,9 +7,11 @@ import com.unciv.UncivGame import com.unciv.logic.map.mapgenerator.MapGenerator import com.unciv.logic.map.MapParameters import com.unciv.logic.map.TileMap +import com.unciv.models.metadata.GameParameters import com.unciv.models.ruleset.RulesetCache import com.unciv.models.translations.tr import com.unciv.ui.newgamescreen.MapParametersTable +import com.unciv.ui.newgamescreen.ModCheckboxTable import com.unciv.ui.pickerscreens.PickerScreen import com.unciv.ui.utils.* import kotlin.concurrent.thread @@ -19,6 +21,7 @@ import com.unciv.ui.utils.AutoScrollPane as ScrollPane class NewMapScreen : PickerScreen() { private val mapParameters = MapParameters() + private val ruleset = RulesetCache.getBaseRuleset() private var generatedMap: TileMap? = null init { @@ -28,12 +31,22 @@ class NewMapScreen : PickerScreen() { pad(10f) add("Map Options".toLabel(fontSize = 24)).row() add(MapParametersTable(mapParameters, isEmptyMapAllowed = true)).row() + add(ModCheckboxTable(mapParameters.mods, this@NewMapScreen) { + ruleset.clear() + val newRuleset = RulesetCache.getComplexRuleset(mapParameters.mods) + ruleset.add(newRuleset) + ruleset.mods += mapParameters.mods + ruleset.modOptions = newRuleset.modOptions + + ImageGetter.ruleset = ruleset + ImageGetter.reload() + }) pack() } topTable.apply { - add(ScrollPane(newMapScreenOptionsTable).apply { setOverscroll(false,false) }) + add(ScrollPane(newMapScreenOptionsTable).apply { setOverscroll(false, false) }) .height(topTable.parent.height) pack() setFillParent(true) @@ -47,11 +60,12 @@ class NewMapScreen : PickerScreen() { thread(name = "MapGenerator") { try { // Map generation can take a while and we don't want ANRs - val ruleset = RulesetCache.getBaseRuleset() generatedMap = MapGenerator(ruleset).generateMap(mapParameters) Gdx.app.postRunnable { - UncivGame.Current.setScreen(MapEditorScreen(generatedMap!!)) + val mapEditorScreen = MapEditorScreen(generatedMap!!) + mapEditorScreen.ruleset = ruleset + UncivGame.Current.setScreen(mapEditorScreen) } } catch (exception: Exception) { diff --git a/core/src/com/unciv/ui/newgamescreen/GameOptionsTable.kt b/core/src/com/unciv/ui/newgamescreen/GameOptionsTable.kt index 39d1ea74d6..59b555bc15 100644 --- a/core/src/com/unciv/ui/newgamescreen/GameOptionsTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/GameOptionsTable.kt @@ -174,7 +174,7 @@ class GameOptionsTable(val previousScreen: IPreviousScreen, val updatePlayerPick } fun Table.addModCheckboxes() { - val table = ModCheckboxTable(gameParameters, previousScreen as CameraStageBaseScreen) { + val table = ModCheckboxTable(gameParameters.mods, previousScreen as CameraStageBaseScreen) { reloadRuleset() update() diff --git a/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt b/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt index 5bce24cc68..9ab095deea 100644 --- a/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/MapOptionsTable.kt @@ -91,6 +91,10 @@ class MapOptionsTable(val newGameScreen: NewGameScreen): Table() { val mapFile = mapFileSelectBox.selected.fileHandle mapParameters.name = mapFile.name() newGameScreen.gameSetupInfo.mapFile = mapFile + val map = MapSaver.loadMap(mapFile) + newGameScreen.gameSetupInfo.gameParameters.mods = map.mapParameters.mods + newGameScreen.updateRuleset() + newGameScreen.updateTables() } return mapFileSelectBox } diff --git a/core/src/com/unciv/ui/newgamescreen/ModCheckboxTable.kt b/core/src/com/unciv/ui/newgamescreen/ModCheckboxTable.kt index e7c8c42796..29f3a8551e 100644 --- a/core/src/com/unciv/ui/newgamescreen/ModCheckboxTable.kt +++ b/core/src/com/unciv/ui/newgamescreen/ModCheckboxTable.kt @@ -10,10 +10,9 @@ import com.unciv.ui.utils.ToastPopup import com.unciv.ui.utils.onChange import com.unciv.ui.utils.toLabel -class ModCheckboxTable(val gameParameters: GameParameters, val screen: CameraStageBaseScreen, onUpdate: (String) -> Unit): Table(){ +class ModCheckboxTable(val mods:LinkedHashSet, val screen: CameraStageBaseScreen, onUpdate: (String) -> Unit): Table(){ init { val modRulesets = RulesetCache.values.filter { it.name != "" } - val mods = gameParameters.mods val baseRulesetCheckboxes = ArrayList() val extentionRulesetModButtons = ArrayList() @@ -41,7 +40,7 @@ class ModCheckboxTable(val gameParameters: GameParameters, val screen: CameraSta var isCompatibleWithCurrentRuleset = true var complexModLinkErrors = "" try { - val newRuleset = RulesetCache.getComplexRuleset(gameParameters.mods) + val newRuleset = RulesetCache.getComplexRuleset(mods) newRuleset.modOptions.isBaseRuleset = true // This is so the checkModLinks finds all connections complexModLinkErrors = newRuleset.checkModLinks() if (complexModLinkErrors != "") isCompatibleWithCurrentRuleset = false diff --git a/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt b/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt index 198d64c0b3..3e19ef870b 100644 --- a/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt +++ b/core/src/com/unciv/ui/newgamescreen/NewGameScreen.kt @@ -16,6 +16,7 @@ import com.unciv.ui.pickerscreens.PickerScreen import com.unciv.ui.utils.* import com.unciv.ui.worldscreen.mainmenu.OnlineMultiplayer import java.util.* +import kotlin.collections.HashSet import kotlin.concurrent.thread import com.unciv.ui.utils.AutoScrollPane as ScrollPane @@ -91,6 +92,28 @@ class NewGameScreen(previousScreen:CameraStageBaseScreen, _gameSetupInfo: GameSe } Gdx.input.inputProcessor = null // remove input processing - nothing will be clicked! + + + if (gameSetupInfo.mapFile != null){ + val map = MapSaver.loadMap(gameSetupInfo.mapFile!!) + val rulesetIncompatabilities = HashSet() + for(tile in map.values) { + val rulesetIncompat = tile.getRulesetIncompatability(ruleset) + if (rulesetIncompat != "") rulesetIncompatabilities.add(rulesetIncompat) + } + + if (rulesetIncompatabilities.isNotEmpty()) { + val incompatibleMap = Popup(this) + incompatibleMap.addGoodSizedLabel("Map is incompatible with the chosen ruleset!".tr()).row() + for(incompat in rulesetIncompatabilities) + incompatibleMap.addGoodSizedLabel(incompat).row() + incompatibleMap.addCloseButton() + incompatibleMap.open() + game.setScreen(this) // to get the input back + return@onClick + } + } + rightSideButton.disable() rightSideButton.setText("Working...".tr()) @@ -146,6 +169,7 @@ class NewGameScreen(previousScreen:CameraStageBaseScreen, _gameSetupInfo: GameSe fun updateRuleset() { ruleset.clear() ruleset.add(RulesetCache.getComplexRuleset(gameSetupInfo.gameParameters.mods)) + ImageGetter.setNewRuleset(ruleset) } fun lockTables() { diff --git a/core/src/com/unciv/ui/utils/ImageGetter.kt b/core/src/com/unciv/ui/utils/ImageGetter.kt index 5f7e201b15..0177234c4d 100644 --- a/core/src/com/unciv/ui/utils/ImageGetter.kt +++ b/core/src/com/unciv/ui/utils/ImageGetter.kt @@ -43,7 +43,6 @@ object ImageGetter { } fun setNewRuleset(ruleset: Ruleset) { - if (this.ruleset == ruleset) return this.ruleset = ruleset reload() }