From f3e80a4021912dce7c5dc9709dc29994aa686335 Mon Sep 17 00:00:00 2001 From: alexban011 Date: Wed, 10 May 2023 11:43:53 +0300 Subject: [PATCH] Fixed a couple warnings reported by code analysis (#9364) * fix: resolve EmptyCatchBlock warnings * fix: resolve PrintStackTrace warnings * fix: resolve SwallowedException warnings * fix: resolve ThrowingExceptionsWithoutMessageOrCause warnings * fix: resolve ConstructorParameterNaming warnings * fix: resolve FunctionParameterNaming warnings * fix: resolve InvalidPackageDeclaration warnings * fix: resolve ForEachOnRange warnings * fix: resolve ImplicitDefaultLocale warnings * fix: resolve MayBeConst warnings * fix: resolve NewLineAtEndOfFile warnings * fix: resolve UnusedParameter warnings * fix: resolve UtilityClassWithPublicConstructor warnings * fix: resolve WildcardImport warnings --- android/build.gradle.kts | 2 +- android/src/com/unciv/app/AndroidFont.kt | 2 + android/src/com/unciv/app/AndroidGame.kt | 2 +- .../src/com/unciv/app/AndroidSaverLoader.kt | 2 + .../com/unciv/app/CopyToClipboardReceiver.kt | 8 +- .../unciv/app/MultiplayerTurnCheckWorker.kt | 13 +- .../src/main/kotlin/AndroidImagePacker.kt | 2 +- core/build.gradle.kts | 2 +- core/src/com/unciv/UncivGame.kt | 8 +- .../com/unciv/logic/BackwardCompatibility.kt | 3 +- core/src/com/unciv/logic/GameInfo.kt | 1 + .../com/unciv/logic/automation/Automation.kt | 2 +- .../automation/city/ConstructionAutomation.kt | 4 +- .../civilization/BarbarianManager.kt | 4 +- .../civilization/NextTurnAutomation.kt | 4 +- .../civilization/ReligionAutomation.kt | 2 +- .../automation/unit/CityLocationTileRanker.kt | 242 +++++++++--------- .../com/unciv/logic/city/CityConstructions.kt | 4 + core/src/com/unciv/logic/city/CityStats.kt | 4 +- .../logic/civilization/CivConstructions.kt | 2 +- .../diplomacy/DiplomacyManager.kt | 4 +- .../civilization/managers/TechManager.kt | 2 +- .../civilization/managers/TurnManager.kt | 2 + core/src/com/unciv/logic/files/UncivFiles.kt | 14 +- core/src/com/unciv/logic/map/HexMath.kt | 10 +- .../logic/map/mapgenerator/MapGenerator.kt | 2 +- .../logic/map/mapunit/UnitUpgradeManager.kt | 2 +- .../logic/multiplayer/OnlineMultiplayer.kt | 10 +- .../multiplayer/OnlineMultiplayerGame.kt | 6 +- .../logic/multiplayer/storage/DropBox.kt | 14 +- .../logic/multiplayer/storage/SimpleHttp.kt | 2 + .../unciv/models/metadata/GameSetupInfo.kt | 4 +- core/src/com/unciv/models/ruleset/Building.kt | 3 - .../com/unciv/models/ruleset/IConstruction.kt | 11 +- core/src/com/unciv/models/ruleset/Ruleset.kt | 18 +- .../unciv/models/ruleset/RulesetValidator.kt | 10 +- .../models/ruleset/tile/ResourceSupplyList.kt | 2 +- .../com/unciv/models/ruleset/unique/Unique.kt | 6 +- .../com/unciv/models/ruleset/unit/BaseUnit.kt | 6 +- .../translations/TranslationFileReader.kt | 2 +- .../translations/TranslationFileWriter.kt | 23 +- .../unciv/models/translations/Translations.kt | 4 +- core/src/com/unciv/ui/audio/SoundPlayer.kt | 2 +- .../com/unciv/ui/components/TabbedPager.kt | 4 +- .../com/unciv/ui/components/UncivTextField.kt | 4 +- .../extensions/Scene2dExtensions.kt | 2 +- .../ui/components/tilegroups/CityButton.kt | 4 +- .../crashhandling/CrashHandlingExtensions.kt | 2 +- .../com/unciv/ui/crashhandling/CrashScreen.kt | 1 + core/src/com/unciv/ui/images/ImageGetter.kt | 15 +- core/src/com/unciv/ui/popups/ToastPopup.kt | 4 +- .../unciv/ui/popups/options/AdvancedTab.kt | 5 +- .../unciv/ui/popups/options/ModCheckTab.kt | 10 +- .../unciv/ui/popups/options/MultiplayerTab.kt | 16 +- .../unciv/ui/popups/options/OptionsPopup.kt | 5 +- .../unciv/ui/popups/options/SettingsSelect.kt | 4 +- .../com/unciv/ui/popups/options/SoundTab.kt | 4 +- .../unciv/ui/screens/basescreen/BaseScreen.kt | 1 - .../screens/basescreen/TutorialController.kt | 3 +- .../cityscreen/CityConstructionsTable.kt | 14 +- .../unciv/ui/screens/cityscreen/CityScreen.kt | 2 +- .../cityscreen/ConstructionInfoTable.kt | 6 +- .../diplomacyscreen/DiplomacyScreen.kt | 5 +- .../screens/mainmenuscreen/MainMenuScreen.kt | 4 +- .../tabs/MapEditorEditSubTabs.kt | 15 +- .../mapeditorscreen/tabs/MapEditorEditTab.kt | 15 +- .../tabs/MapEditorOptionsTab.kt | 2 + .../mapeditorscreen/tabs/MapEditorSaveTab.kt | 3 +- .../AddMultiplayerGameScreen.kt | 4 +- .../EditMultiplayerGameInfoScreen.kt | 6 +- .../multiplayerscreens/MultiplayerHelpers.kt | 4 +- .../ViewFriendsListScreen.kt | 3 +- .../ui/screens/newgamescreen/FriendTable.kt | 2 +- .../newgamescreen/MapFileSelectTable.kt | 5 +- .../ui/screens/newgamescreen/NewGameScreen.kt | 5 +- .../overviewscreen/WonderOverviewTable.kt | 3 +- .../pickerscreens/ModManagementScreen.kt | 12 +- .../pickerscreens/PolicyPickerScreen.kt | 10 +- .../screens/pickerscreens/TechPickerScreen.kt | 2 +- .../ui/screens/savescreens/LoadGameScreen.kt | 6 +- .../screens/savescreens/LoadOrSaveScreen.kt | 4 +- .../unciv/ui/screens/savescreens/QuickSave.kt | 4 +- .../ui/screens/savescreens/SaveGameScreen.kt | 4 +- .../savescreens/VerticalFileListScrollPane.kt | 4 +- .../worldscreen/TechPolicyDiplomacyButtons.kt | 2 +- .../ui/screens/worldscreen/WorldMapHolder.kt | 4 +- .../ui/screens/worldscreen/WorldScreen.kt | 8 +- .../screens/worldscreen/WorldScreenTopBar.kt | 2 +- .../ui/screens/worldscreen/minimap/Minimap.kt | 2 - .../status/MultiplayerStatusButton.kt | 4 +- .../worldscreen/status/NextTurnButton.kt | 4 +- core/src/com/unciv/utils/Concurrency.kt | 25 +- .../src/com/unciv/app/desktop/DesktopFont.kt | 8 +- .../src/com/unciv/app/server/UncivServer.kt | 24 +- settings.gradle.kts | 2 +- .../src/com/unciv/dev/FasterUIDevelopment.kt | 5 +- .../com/unciv/logic/map/UnitMovementTests.kt | 4 +- .../com/unciv/logic/map/VisibilityTests.kt | 3 +- tests/src/com/unciv/testing/IdHelperTests.kt | 2 +- .../com/unciv/testing/SerializationTests.kt | 3 +- .../src/com/unciv/testing/TranslationTests.kt | 13 +- .../unciv/testing/TutorialTranslationTests.kt | 2 +- 102 files changed, 466 insertions(+), 351 deletions(-) diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 5c4d3bd7ce..503b95f1f1 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -79,7 +79,7 @@ android { task("texturePacker") { doFirst { logger.info("Calling TexturePacker") - AndroidImagePacker.packImages(projectDir.path,false) + AndroidImagePacker.packImages(projectDir.path) } } diff --git a/android/src/com/unciv/app/AndroidFont.kt b/android/src/com/unciv/app/AndroidFont.kt index 6b6a30deb9..2171d06e99 100644 --- a/android/src/com/unciv/app/AndroidFont.kt +++ b/android/src/com/unciv/app/AndroidFont.kt @@ -15,6 +15,7 @@ import com.badlogic.gdx.graphics.Pixmap import com.unciv.ui.components.FontFamilyData import com.unciv.ui.components.FontImplementation import com.unciv.ui.components.Fonts +import com.unciv.utils.Log import java.util.* import kotlin.math.abs @@ -79,6 +80,7 @@ class AndroidFont : FontImplementation { } catch (e: Exception) { + Log.error("Failed to create typeface, falling back to default", e) // Falling back to default Typeface.create(Fonts.DEFAULT_FONT_FAMILY, Typeface.NORMAL) } diff --git a/android/src/com/unciv/app/AndroidGame.kt b/android/src/com/unciv/app/AndroidGame.kt index bccaa3d617..b0403ea568 100644 --- a/android/src/com/unciv/app/AndroidGame.kt +++ b/android/src/com/unciv/app/AndroidGame.kt @@ -13,7 +13,7 @@ import com.unciv.UncivGame import com.unciv.logic.event.EventBus import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.screens.basescreen.UncivStage -import com.unciv.utils.concurrency.Concurrency +import com.unciv.utils.Concurrency class AndroidGame(private val activity: Activity) : UncivGame() { diff --git a/android/src/com/unciv/app/AndroidSaverLoader.kt b/android/src/com/unciv/app/AndroidSaverLoader.kt index d9f0e26a3d..fc7671a169 100644 --- a/android/src/com/unciv/app/AndroidSaverLoader.kt +++ b/android/src/com/unciv/app/AndroidSaverLoader.kt @@ -6,6 +6,7 @@ import android.net.Uri import android.provider.DocumentsContract import android.provider.OpenableColumns import com.unciv.logic.files.PlatformSaverLoader +import com.unciv.utils.Log import java.io.InputStream import java.io.OutputStream @@ -106,6 +107,7 @@ class AndroidSaverLoader(private val activity: Activity) : PlatformSaverLoader { return "" } } catch(ex: Exception) { + Log.error("Failed to get filename from Uri", ex) return suggestedLocation.split("2F").last() // I have no idea why but the content path ends with this before the filename } diff --git a/android/src/com/unciv/app/CopyToClipboardReceiver.kt b/android/src/com/unciv/app/CopyToClipboardReceiver.kt index e469732568..8d7ce4d375 100644 --- a/android/src/com/unciv/app/CopyToClipboardReceiver.kt +++ b/android/src/com/unciv/app/CopyToClipboardReceiver.kt @@ -1,6 +1,10 @@ package com.unciv.app -import android.content.* +import android.content.BroadcastReceiver +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.content.Intent import android.widget.Toast import com.badlogic.gdx.backends.android.AndroidApplication @@ -16,4 +20,4 @@ class CopyToClipboardReceiver : BroadcastReceiver() { clipboard.setPrimaryClip(clip) Toast.makeText(context, context.resources.getString(R.string.Notify_Error_StackTrace_Toast), Toast.LENGTH_SHORT).show() } -} \ No newline at end of file +} diff --git a/android/src/com/unciv/app/MultiplayerTurnCheckWorker.kt b/android/src/com/unciv/app/MultiplayerTurnCheckWorker.kt index 91e54d86c2..9b5ce0a911 100644 --- a/android/src/com/unciv/app/MultiplayerTurnCheckWorker.kt +++ b/android/src/com/unciv/app/MultiplayerTurnCheckWorker.kt @@ -15,7 +15,14 @@ import android.util.Log import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat.DEFAULT_VIBRATE import androidx.core.app.NotificationManagerCompat -import androidx.work.* +import androidx.work.Constraints +import androidx.work.Data +import androidx.work.NetworkType +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager +import androidx.work.Worker +import androidx.work.WorkerParameters +import androidx.work.workDataOf import com.badlogic.gdx.Gdx import com.badlogic.gdx.backends.android.AndroidApplication import com.badlogic.gdx.backends.android.DefaultAndroidFiles @@ -30,7 +37,8 @@ import java.io.PrintWriter import java.io.StringWriter import java.io.Writer import java.time.Duration -import java.util.* +import java.util.Arrays +import java.util.GregorianCalendar import java.util.concurrent.TimeUnit @@ -362,6 +370,7 @@ class MultiplayerTurnCheckWorker(appContext: Context, workerParams: WorkerParame enqueue(applicationContext, Duration.ofMinutes(1), inputDataFailIncrease) } } catch (outOfMemory: OutOfMemoryError){ // no point in trying multiple times if this was an oom error + Log.e(LOG_TAG, "doWork ${outOfMemory::class.simpleName}: ${outOfMemory.message}") return@runBlocking Result.failure() } return@runBlocking Result.success() diff --git a/buildSrc/src/main/kotlin/AndroidImagePacker.kt b/buildSrc/src/main/kotlin/AndroidImagePacker.kt index afe61f3f45..ff0920f46e 100644 --- a/buildSrc/src/main/kotlin/AndroidImagePacker.kt +++ b/buildSrc/src/main/kotlin/AndroidImagePacker.kt @@ -54,7 +54,7 @@ object AndroidImagePacker { filterMag = Texture.TextureFilter.MipMapLinearLinear // I'm pretty sure this doesn't make sense for magnification, but setting it to Linear gives strange results } - fun packImages(workingPath: String, isRunFromJAR:Boolean) { + fun packImages(workingPath: String) { val defaultSettings = getDefaultSettings() // Scan for Image folders and build one atlas each diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 7796f51069..3e31d7c03e 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -12,4 +12,4 @@ sourceSets { main { java.srcDir("src/") } -} \ No newline at end of file +} diff --git a/core/src/com/unciv/UncivGame.kt b/core/src/com/unciv/UncivGame.kt index 995b04c4e7..5f56fd1545 100644 --- a/core/src/com/unciv/UncivGame.kt +++ b/core/src/com/unciv/UncivGame.kt @@ -45,10 +45,10 @@ import com.unciv.utils.DebugUtils import com.unciv.utils.Display import com.unciv.utils.Log import com.unciv.utils.PlatformSpecific -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread -import com.unciv.utils.concurrency.withGLContext -import com.unciv.utils.concurrency.withThreadPoolContext +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread +import com.unciv.utils.withGLContext +import com.unciv.utils.withThreadPoolContext import com.unciv.utils.debug import kotlinx.coroutines.CancellationException import java.io.PrintWriter diff --git a/core/src/com/unciv/logic/BackwardCompatibility.kt b/core/src/com/unciv/logic/BackwardCompatibility.kt index 70e996e0ad..99191fbf14 100644 --- a/core/src/com/unciv/logic/BackwardCompatibility.kt +++ b/core/src/com/unciv/logic/BackwardCompatibility.kt @@ -1,8 +1,9 @@ package com.unciv.logic import com.unciv.Constants +import com.unciv.logic.automation.civilization.BarbarianManager import com.unciv.logic.city.CityConstructions -import com.unciv.logic.city.PerpetualConstruction +import com.unciv.models.ruleset.PerpetualConstruction import com.unciv.logic.civilization.diplomacy.DiplomacyFlags import com.unciv.logic.civilization.diplomacy.DiplomacyManager import com.unciv.logic.civilization.managers.TechManager diff --git a/core/src/com/unciv/logic/GameInfo.kt b/core/src/com/unciv/logic/GameInfo.kt index ce65a40305..df9eda67c1 100644 --- a/core/src/com/unciv/logic/GameInfo.kt +++ b/core/src/com/unciv/logic/GameInfo.kt @@ -9,6 +9,7 @@ import com.unciv.logic.BackwardCompatibility.migrateToTileHistory import com.unciv.logic.BackwardCompatibility.removeMissingModReferences import com.unciv.logic.GameInfo.Companion.CURRENT_COMPATIBILITY_NUMBER import com.unciv.logic.GameInfo.Companion.FIRST_WITHOUT +import com.unciv.logic.automation.civilization.BarbarianManager import com.unciv.logic.city.City import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.CivilizationInfoPreview diff --git a/core/src/com/unciv/logic/automation/Automation.kt b/core/src/com/unciv/logic/automation/Automation.kt index d84f818a70..9e7b9f08f5 100644 --- a/core/src/com/unciv/logic/automation/Automation.kt +++ b/core/src/com/unciv/logic/automation/Automation.kt @@ -2,7 +2,7 @@ package com.unciv.logic.automation import com.unciv.logic.city.City import com.unciv.logic.city.CityFocus -import com.unciv.logic.city.INonPerpetualConstruction +import com.unciv.models.ruleset.INonPerpetualConstruction import com.unciv.logic.civilization.Civilization import com.unciv.logic.map.BFS import com.unciv.logic.map.TileMap diff --git a/core/src/com/unciv/logic/automation/city/ConstructionAutomation.kt b/core/src/com/unciv/logic/automation/city/ConstructionAutomation.kt index 859e7fe7a6..2e636943c1 100644 --- a/core/src/com/unciv/logic/automation/city/ConstructionAutomation.kt +++ b/core/src/com/unciv/logic/automation/city/ConstructionAutomation.kt @@ -3,8 +3,8 @@ package com.unciv.logic.automation.city import com.unciv.logic.automation.Automation import com.unciv.logic.automation.civilization.NextTurnAutomation import com.unciv.logic.city.CityConstructions -import com.unciv.logic.city.INonPerpetualConstruction -import com.unciv.logic.city.PerpetualConstruction +import com.unciv.models.ruleset.INonPerpetualConstruction +import com.unciv.models.ruleset.PerpetualConstruction import com.unciv.logic.civilization.CityAction import com.unciv.logic.civilization.NotificationCategory import com.unciv.logic.civilization.NotificationIcon diff --git a/core/src/com/unciv/logic/automation/civilization/BarbarianManager.kt b/core/src/com/unciv/logic/automation/civilization/BarbarianManager.kt index accbf6e8c1..0de9a6aa13 100644 --- a/core/src/com/unciv/logic/automation/civilization/BarbarianManager.kt +++ b/core/src/com/unciv/logic/automation/civilization/BarbarianManager.kt @@ -1,8 +1,10 @@ -package com.unciv.logic +package com.unciv.logic.automation.civilization import com.badlogic.gdx.math.Vector2 import com.unciv.Constants import com.unciv.json.HashMapVector2 +import com.unciv.logic.GameInfo +import com.unciv.logic.IsPartOfGameInfoSerialization import com.unciv.logic.civilization.NotificationCategory import com.unciv.logic.civilization.NotificationIcon import com.unciv.logic.map.tile.Tile diff --git a/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt b/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt index d7bcba3aa9..6a93e1e2df 100644 --- a/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt +++ b/core/src/com/unciv/logic/automation/civilization/NextTurnAutomation.kt @@ -8,8 +8,8 @@ import com.unciv.logic.battle.BattleDamage import com.unciv.logic.battle.CityCombatant import com.unciv.logic.battle.MapUnitCombatant import com.unciv.logic.city.City -import com.unciv.logic.city.INonPerpetualConstruction -import com.unciv.logic.city.PerpetualConstruction +import com.unciv.models.ruleset.INonPerpetualConstruction +import com.unciv.models.ruleset.PerpetualConstruction import com.unciv.logic.civilization.AlertType import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.NotificationCategory diff --git a/core/src/com/unciv/logic/automation/civilization/ReligionAutomation.kt b/core/src/com/unciv/logic/automation/civilization/ReligionAutomation.kt index a565d5deb4..68993a3843 100644 --- a/core/src/com/unciv/logic/automation/civilization/ReligionAutomation.kt +++ b/core/src/com/unciv/logic/automation/civilization/ReligionAutomation.kt @@ -2,7 +2,7 @@ package com.unciv.logic.automation.civilization import com.unciv.Constants import com.unciv.logic.city.City -import com.unciv.logic.city.INonPerpetualConstruction +import com.unciv.models.ruleset.INonPerpetualConstruction import com.unciv.logic.civilization.Civilization import com.unciv.logic.civilization.managers.ReligionState import com.unciv.logic.map.tile.Tile diff --git a/core/src/com/unciv/logic/automation/unit/CityLocationTileRanker.kt b/core/src/com/unciv/logic/automation/unit/CityLocationTileRanker.kt index e05a6a02e7..077de11da8 100644 --- a/core/src/com/unciv/logic/automation/unit/CityLocationTileRanker.kt +++ b/core/src/com/unciv/logic/automation/unit/CityLocationTileRanker.kt @@ -8,138 +8,136 @@ import com.unciv.logic.map.tile.Tile import com.unciv.models.ruleset.tile.ResourceType import com.unciv.models.ruleset.tile.TileResource -class CityLocationTileRanker { - companion object { - fun getBestTilesToFoundCity(unit: MapUnit): Sequence> { - val modConstants = unit.civ.gameInfo.ruleset.modOptions.constants - val tilesNearCities = sequence { - for (city in unit.civ.gameInfo.getCities()) { - val center = city.getCenterTile() - if (unit.civ.knows(city.civ) && - // If the CITY OWNER knows that the UNIT OWNER agreed not to settle near them - city.civ.getDiplomacyManager(unit.civ) - .hasFlag(DiplomacyFlags.AgreedToNotSettleNearUs) - ) { - yieldAll( - center.getTilesInDistance(6) - .filter { canUseTileForRanking(it, unit.civ) }) - continue - } +object CityLocationTileRanker { + fun getBestTilesToFoundCity(unit: MapUnit): Sequence> { + val modConstants = unit.civ.gameInfo.ruleset.modOptions.constants + val tilesNearCities = sequence { + for (city in unit.civ.gameInfo.getCities()) { + val center = city.getCenterTile() + if (unit.civ.knows(city.civ) && + // If the CITY OWNER knows that the UNIT OWNER agreed not to settle near them + city.civ.getDiplomacyManager(unit.civ) + .hasFlag(DiplomacyFlags.AgreedToNotSettleNearUs) + ) { yieldAll( - center.getTilesInDistance(modConstants.minimalCityDistance) - .filter { canUseTileForRanking(it, unit.civ) } - .filter { it.getContinent() == center.getContinent() } - ) - yieldAll( - center.getTilesInDistance(modConstants.minimalCityDistanceOnDifferentContinents) - .filter { canUseTileForRanking(it, unit.civ) } - .filter { it.getContinent() != center.getContinent() } - ) + center.getTilesInDistance(6) + .filter { canUseTileForRanking(it, unit.civ) }) + continue } - }.toSet() + yieldAll( + center.getTilesInDistance(modConstants.minimalCityDistance) + .filter { canUseTileForRanking(it, unit.civ) } + .filter { it.getContinent() == center.getContinent() } + ) + yieldAll( + center.getTilesInDistance(modConstants.minimalCityDistanceOnDifferentContinents) + .filter { canUseTileForRanking(it, unit.civ) } + .filter { it.getContinent() != center.getContinent() } + ) + } + }.toSet() - // This is to improve performance - instead of ranking each tile in the area up to 19 times, do it once. - val nearbyTileRankings = getNearbyTileRankings(unit.getTile(), unit.civ) + // This is to improve performance - instead of ranking each tile in the area up to 19 times, do it once. + val nearbyTileRankings = getNearbyTileRankings(unit.getTile(), unit.civ) - val distanceFromHome = if (unit.civ.cities.isEmpty()) 0 - else unit.civ.cities.minOf { it.getCenterTile().aerialDistanceTo(unit.getTile()) } - val range = (8 - distanceFromHome).coerceIn( - 1, - 5 - ) // Restrict vision when far from home to avoid death marches + val distanceFromHome = if (unit.civ.cities.isEmpty()) 0 + else unit.civ.cities.minOf { it.getCenterTile().aerialDistanceTo(unit.getTile()) } + val range = (8 - distanceFromHome).coerceIn( + 1, + 5 + ) // Restrict vision when far from home to avoid death marches - val possibleCityLocations = unit.getTile().getTilesInDistance(range) - .filter { canUseTileForRanking(it, unit.civ) } - .filter { - val tileOwner = it.getOwner() - it.isLand && !it.isImpassible() && (tileOwner == null || tileOwner == unit.civ) // don't allow settler to settle inside other civ's territory - && (unit.currentTile == it || unit.movement.canMoveTo(it)) - && it !in tilesNearCities - } + val possibleCityLocations = unit.getTile().getTilesInDistance(range) + .filter { canUseTileForRanking(it, unit.civ) } + .filter { + val tileOwner = it.getOwner() + it.isLand && !it.isImpassible() && (tileOwner == null || tileOwner == unit.civ) // don't allow settler to settle inside other civ's territory + && (unit.currentTile == it || unit.movement.canMoveTo(it)) + && it !in tilesNearCities + } - val luxuryResourcesInCivArea = getLuxuryResourcesInCivArea(unit.civ) + val luxuryResourcesInCivArea = getLuxuryResourcesInCivArea(unit.civ) - return possibleCityLocations - .map { - Pair( + return possibleCityLocations + .map { + Pair( + it, + rankTileAsCityCenterWithCachedValues( it, - rankTileAsCityCenterWithCachedValues( - it, - nearbyTileRankings, - luxuryResourcesInCivArea, - unit.civ - ), + nearbyTileRankings, + luxuryResourcesInCivArea, + unit.civ + ), + ) + } + .sortedByDescending { it.second } + } + + fun rankTileAsCityCenter(tile: Tile, civ: Civilization): Float { + val nearbyTileRankings = getNearbyTileRankings(tile, civ) + val luxuryResourcesInCivArea = getLuxuryResourcesInCivArea(civ) + return rankTileAsCityCenterWithCachedValues( + tile, + nearbyTileRankings, + luxuryResourcesInCivArea, + civ + ) + } + + private fun canUseTileForRanking( + tile: Tile, + civ: Civilization + ) = + // The AI is allowed to cheat and act like it knows the whole map. + tile.isExplored(civ) || civ.isAI() + + private fun getNearbyTileRankings( + tile: Tile, + civ: Civilization + ): Map { + return tile.getTilesInDistance(7) + .filter { canUseTileForRanking(it, civ) } + .associateBy({ it }, { Automation.rankTile(it, civ) }) + } + + private fun getLuxuryResourcesInCivArea(civ: Civilization): Sequence { + return civ.cities.asSequence() + .flatMap { it.getTiles().asSequence() }.filter { it.resource != null } + .map { it.tileResource }.filter { it.resourceType == ResourceType.Luxury } + .distinct() + } + + private fun rankTileAsCityCenterWithCachedValues( + tile: Tile, nearbyTileRankings: Map, + luxuryResourcesInCivArea: Sequence, + civ: Civilization + ): Float { + val bestTilesFromOuterLayer = tile.getTilesAtDistance(2) + .filter { canUseTileForRanking(it, civ) } + .sortedByDescending { nearbyTileRankings[it] }.take(2) + val top5Tiles = + (tile.neighbors.filter { + canUseTileForRanking( + it, + civ ) - } - .sortedByDescending { it.second } - } + } + bestTilesFromOuterLayer) + .sortedByDescending { nearbyTileRankings[it] } + .take(5) + var rank = top5Tiles.map { nearbyTileRankings.getValue(it) }.sum() + if (tile.isCoastalTile()) rank += 5 - fun rankTileAsCityCenter(tile: Tile, civ: Civilization): Float { - val nearbyTileRankings = getNearbyTileRankings(tile, civ) - val luxuryResourcesInCivArea = getLuxuryResourcesInCivArea(civ) - return rankTileAsCityCenterWithCachedValues( - tile, - nearbyTileRankings, - luxuryResourcesInCivArea, - civ - ) - } + val luxuryResourcesInCityArea = + tile.getTilesAtDistance(2).filter { canUseTileForRanking(it, civ) } + .filter { it.resource != null } + .map { it.tileResource }.filter { it.resourceType == ResourceType.Luxury } + .distinct() + val luxuryResourcesAlreadyInCivArea = + luxuryResourcesInCivArea.map { it.name }.toHashSet() + val luxuryResourcesNotYetInCiv = luxuryResourcesInCityArea + .count { it.name !in luxuryResourcesAlreadyInCivArea } + rank += luxuryResourcesNotYetInCiv * 10 - private fun canUseTileForRanking( - tile: Tile, - civ: Civilization - ) = - // The AI is allowed to cheat and act like it knows the whole map. - tile.isExplored(civ) || civ.isAI() - - private fun getNearbyTileRankings( - tile: Tile, - civ: Civilization - ): Map { - return tile.getTilesInDistance(7) - .filter { canUseTileForRanking(it, civ) } - .associateBy({ it }, { Automation.rankTile(it, civ) }) - } - - private fun getLuxuryResourcesInCivArea(civ: Civilization): Sequence { - return civ.cities.asSequence() - .flatMap { it.getTiles().asSequence() }.filter { it.resource != null } - .map { it.tileResource }.filter { it.resourceType == ResourceType.Luxury } - .distinct() - } - - private fun rankTileAsCityCenterWithCachedValues( - tile: Tile, nearbyTileRankings: Map, - luxuryResourcesInCivArea: Sequence, - civ: Civilization - ): Float { - val bestTilesFromOuterLayer = tile.getTilesAtDistance(2) - .filter { canUseTileForRanking(it, civ) } - .sortedByDescending { nearbyTileRankings[it] }.take(2) - val top5Tiles = - (tile.neighbors.filter { - canUseTileForRanking( - it, - civ - ) - } + bestTilesFromOuterLayer) - .sortedByDescending { nearbyTileRankings[it] } - .take(5) - var rank = top5Tiles.map { nearbyTileRankings.getValue(it) }.sum() - if (tile.isCoastalTile()) rank += 5 - - val luxuryResourcesInCityArea = - tile.getTilesAtDistance(2).filter { canUseTileForRanking(it, civ) } - .filter { it.resource != null } - .map { it.tileResource }.filter { it.resourceType == ResourceType.Luxury } - .distinct() - val luxuryResourcesAlreadyInCivArea = - luxuryResourcesInCivArea.map { it.name }.toHashSet() - val luxuryResourcesNotYetInCiv = luxuryResourcesInCityArea - .count { it.name !in luxuryResourcesAlreadyInCivArea } - rank += luxuryResourcesNotYetInCiv * 10 - - return rank - } + return rank } } diff --git a/core/src/com/unciv/logic/city/CityConstructions.kt b/core/src/com/unciv/logic/city/CityConstructions.kt index a3ed8e6e20..ef7fafca4c 100644 --- a/core/src/com/unciv/logic/city/CityConstructions.kt +++ b/core/src/com/unciv/logic/city/CityConstructions.kt @@ -13,6 +13,10 @@ import com.unciv.logic.map.mapunit.MapUnit import com.unciv.logic.map.tile.Tile import com.unciv.logic.multiplayer.isUsersTurn import com.unciv.models.ruleset.Building +import com.unciv.models.ruleset.IConstruction +import com.unciv.models.ruleset.INonPerpetualConstruction +import com.unciv.models.ruleset.PerpetualConstruction +import com.unciv.models.ruleset.RejectionReasonType import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.unique.LocalUniqueCache import com.unciv.models.ruleset.unique.StateForConditionals diff --git a/core/src/com/unciv/logic/city/CityStats.kt b/core/src/com/unciv/logic/city/CityStats.kt index fa1599f6f5..d478761ca0 100644 --- a/core/src/com/unciv/logic/city/CityStats.kt +++ b/core/src/com/unciv/logic/city/CityStats.kt @@ -5,6 +5,8 @@ import com.unciv.logic.map.tile.RoadStatus import com.unciv.models.Counter import com.unciv.models.ruleset.Building import com.unciv.models.ruleset.GlobalUniques +import com.unciv.models.ruleset.IConstruction +import com.unciv.models.ruleset.INonPerpetualConstruction import com.unciv.models.ruleset.ModOptionsConstants import com.unciv.models.ruleset.unique.LocalUniqueCache import com.unciv.models.ruleset.unique.StateForConditionals @@ -476,7 +478,7 @@ class CityStats(val city: City) { fun update(currentConstruction: IConstruction = city.cityConstructions.getCurrentConstruction(), updateTileStats:Boolean = true, - updateCivStats:Boolean = true) { + updateCivStats:Boolean = true) { if (updateTileStats) updateTileStats() // We need to compute Tile yields before happiness diff --git a/core/src/com/unciv/logic/civilization/CivConstructions.kt b/core/src/com/unciv/logic/civilization/CivConstructions.kt index 4015d16903..81c3be6d3c 100644 --- a/core/src/com/unciv/logic/civilization/CivConstructions.kt +++ b/core/src/com/unciv/logic/civilization/CivConstructions.kt @@ -1,7 +1,7 @@ package com.unciv.logic.civilization import com.unciv.logic.IsPartOfGameInfoSerialization -import com.unciv.logic.city.INonPerpetualConstruction +import com.unciv.models.ruleset.INonPerpetualConstruction import com.unciv.models.Counter import com.unciv.models.ruleset.Building import com.unciv.models.ruleset.unique.UniqueType diff --git a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt index be78af31c1..2dc71dcea1 100644 --- a/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt +++ b/core/src/com/unciv/logic/civilization/diplomacy/DiplomacyManager.kt @@ -149,9 +149,9 @@ class DiplomacyManager() : IsPartOfGameInfoSerialization { return toReturn } - constructor(civilization: Civilization, OtherCivName: String) : this() { + constructor(civilization: Civilization, mOtherCivName: String) : this() { civInfo = civilization - otherCivName = OtherCivName + otherCivName = mOtherCivName updateHasOpenBorders() } diff --git a/core/src/com/unciv/logic/civilization/managers/TechManager.kt b/core/src/com/unciv/logic/civilization/managers/TechManager.kt index 5fea268a30..ee8c92f2f2 100644 --- a/core/src/com/unciv/logic/civilization/managers/TechManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/TechManager.kt @@ -135,7 +135,7 @@ class TechManager : IsPartOfGameInfoSerialization { return if (techsToResearch.isEmpty()) null else techsToResearch[0] } - fun researchOfTech(TechName: String?) = techsInProgress[TechName] ?: 0 + fun researchOfTech(techName: String?) = techsInProgress[techName] ?: 0 // Was once duplicated as fun scienceSpentOnTech(tech: String): Int fun remainingScienceToTech(techName: String): Int { diff --git a/core/src/com/unciv/logic/civilization/managers/TurnManager.kt b/core/src/com/unciv/logic/civilization/managers/TurnManager.kt index f704a80652..db294da2d1 100644 --- a/core/src/com/unciv/logic/civilization/managers/TurnManager.kt +++ b/core/src/com/unciv/logic/civilization/managers/TurnManager.kt @@ -19,6 +19,7 @@ import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unique.endTurn import com.unciv.models.stats.Stats import com.unciv.ui.components.MayaCalendar +import com.unciv.utils.Log import java.util.* import kotlin.math.max import kotlin.math.min @@ -167,6 +168,7 @@ class TurnManager(val civInfo: Civilization) { // The first test in `updateRevolts` should prevent getting here in a no-barbarians game, but it has been shown to still occur civInfo.gameInfo.getBarbarianCivilization() } catch (ex: NoSuchElementException) { + Log.error("Barbarian civilization not found", ex) civInfo.removeFlag(CivFlags.RevoltSpawning.name) return } diff --git a/core/src/com/unciv/logic/files/UncivFiles.kt b/core/src/com/unciv/logic/files/UncivFiles.kt index e7a8e14c73..319e016bca 100644 --- a/core/src/com/unciv/logic/files/UncivFiles.kt +++ b/core/src/com/unciv/logic/files/UncivFiles.kt @@ -8,13 +8,18 @@ import com.badlogic.gdx.utils.SerializationException import com.unciv.UncivGame import com.unciv.json.fromJsonFile import com.unciv.json.json -import com.unciv.logic.* +import com.unciv.logic.CompatibilityVersion +import com.unciv.logic.GameInfo +import com.unciv.logic.GameInfoPreview +import com.unciv.logic.GameInfoSerializationVersion +import com.unciv.logic.HasGameInfoSerializationVersion +import com.unciv.logic.UncivShowableException import com.unciv.models.metadata.GameSettings import com.unciv.models.metadata.doMigrations import com.unciv.models.metadata.isMigrationNecessary import com.unciv.ui.screens.savescreens.Gzip import com.unciv.utils.Log -import com.unciv.utils.concurrency.Concurrency +import com.unciv.utils.Concurrency import com.unciv.utils.debug import kotlinx.coroutines.Job import java.io.File @@ -140,8 +145,8 @@ class UncivFiles( //endregion //region Saving - fun saveGame(game: GameInfo, GameName: String, saveCompletionCallback: (Exception?) -> Unit = { if (it != null) throw it }): FileHandle { - val file = getSave(GameName) + fun saveGame(game: GameInfo, gameName: String, saveCompletionCallback: (Exception?) -> Unit = { if (it != null) throw it }): FileHandle { + val file = getSave(gameName) saveGame(game, file, saveCompletionCallback) return file } @@ -402,6 +407,7 @@ class UncivFiles( try { saveGame(gameInfo, AUTOSAVE_FILE_NAME) } catch (oom: OutOfMemoryError) { + Log.error("Ran out of memory during autosave", oom) return // not much we can do here } diff --git a/core/src/com/unciv/logic/map/HexMath.kt b/core/src/com/unciv/logic/map/HexMath.kt index 3ecfc1b5c5..40f4ecc9c9 100644 --- a/core/src/com/unciv/logic/map/HexMath.kt +++ b/core/src/com/unciv/logic/map/HexMath.kt @@ -2,7 +2,15 @@ package com.unciv.logic.map import com.badlogic.gdx.math.Vector2 import com.badlogic.gdx.math.Vector3 -import kotlin.math.* +import kotlin.math.abs +import kotlin.math.cos +import kotlin.math.round +import kotlin.math.roundToInt +import kotlin.math.sign +import kotlin.math.sin +import kotlin.math.sqrt +import kotlin.math.max +import kotlin.math.min @Suppress("MemberVisibilityCanBePrivate", "unused") // this is a library offering optional services object HexMath { diff --git a/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt b/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt index 9f0204c454..abc4c8d13f 100644 --- a/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt +++ b/core/src/com/unciv/logic/map/mapgenerator/MapGenerator.kt @@ -964,6 +964,6 @@ class MapGenerationRandomness { } } // unreachable due to last loop iteration always returning and initialDistance >= 1 - throw Exception() + throw Exception("Unreachable code reached!") } } diff --git a/core/src/com/unciv/logic/map/mapunit/UnitUpgradeManager.kt b/core/src/com/unciv/logic/map/mapunit/UnitUpgradeManager.kt index 12dfa0d781..cc4631a868 100644 --- a/core/src/com/unciv/logic/map/mapunit/UnitUpgradeManager.kt +++ b/core/src/com/unciv/logic/map/mapunit/UnitUpgradeManager.kt @@ -1,6 +1,6 @@ package com.unciv.logic.map.mapunit -import com.unciv.logic.city.RejectionReasonType +import com.unciv.models.ruleset.RejectionReasonType import com.unciv.models.ruleset.unique.StateForConditionals import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unit.BaseUnit diff --git a/core/src/com/unciv/logic/multiplayer/OnlineMultiplayer.kt b/core/src/com/unciv/logic/multiplayer/OnlineMultiplayer.kt index ce731b1eae..de32b9ebee 100644 --- a/core/src/com/unciv/logic/multiplayer/OnlineMultiplayer.kt +++ b/core/src/com/unciv/logic/multiplayer/OnlineMultiplayer.kt @@ -16,10 +16,10 @@ import com.unciv.logic.multiplayer.storage.OnlineMultiplayerFiles import com.unciv.ui.components.extensions.isLargerThan import com.unciv.logic.multiplayer.storage.SimpleHttp import com.unciv.utils.Log -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.Dispatcher -import com.unciv.utils.concurrency.launchOnThreadPool -import com.unciv.utils.concurrency.withGLContext +import com.unciv.utils.Concurrency +import com.unciv.utils.Dispatcher +import com.unciv.utils.launchOnThreadPool +import com.unciv.utils.withGLContext import com.unciv.utils.debug import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.coroutineScope @@ -343,7 +343,7 @@ class OnlineMultiplayer { featureSet = try { json().fromJson(ServerFeatureSet::class.java, result) } catch (ex: Exception) { - Log.error("${UncivGame.Current.settings.multiplayer.server} does not support server feature set") + Log.error("${UncivGame.Current.settings.multiplayer.server} does not support server feature set", ex) ServerFeatureSet() } } diff --git a/core/src/com/unciv/logic/multiplayer/OnlineMultiplayerGame.kt b/core/src/com/unciv/logic/multiplayer/OnlineMultiplayerGame.kt index 9ae0f0497b..4981e0ff6f 100644 --- a/core/src/com/unciv/logic/multiplayer/OnlineMultiplayerGame.kt +++ b/core/src/com/unciv/logic/multiplayer/OnlineMultiplayerGame.kt @@ -10,8 +10,8 @@ import com.unciv.logic.multiplayer.GameUpdateResult.Type.UNCHANGED import com.unciv.logic.multiplayer.storage.FileStorageRateLimitReached import com.unciv.logic.multiplayer.storage.OnlineMultiplayerFiles import com.unciv.ui.components.extensions.isLargerThan -import com.unciv.utils.concurrency.launchOnGLThread -import com.unciv.utils.concurrency.withGLContext +import com.unciv.utils.launchOnGLThread +import com.unciv.utils.withGLContext import com.unciv.utils.debug import kotlinx.coroutines.coroutineScope import java.time.Duration @@ -97,7 +97,7 @@ class OnlineMultiplayerGame( error = null MultiplayerGameUpdateUnchanged(name, updateResult.status) } - else -> throw IllegalStateException() + else -> throw IllegalStateException("Unknown update event") } launchOnGLThread { EventBus.send(updateEvent) diff --git a/core/src/com/unciv/logic/multiplayer/storage/DropBox.kt b/core/src/com/unciv/logic/multiplayer/storage/DropBox.kt index 2f891c0e26..12370b4930 100644 --- a/core/src/com/unciv/logic/multiplayer/storage/DropBox.kt +++ b/core/src/com/unciv/logic/multiplayer/storage/DropBox.kt @@ -134,13 +134,13 @@ object DropBox: FileStorage { throw FileStorageRateLimitReached(remainingRateLimitSeconds) } - fun fileExists(fileName: String): Boolean = try { - dropboxApi("https://api.dropboxapi.com/2/files/get_metadata", - "{\"path\":\"$fileName\"}", "application/json") - true - } catch (ex: MultiplayerFileNotFoundException) { - false - } +// fun fileExists(fileName: String): Boolean = try { +// dropboxApi("https://api.dropboxapi.com/2/files/get_metadata", +// "{\"path\":\"$fileName\"}", "application/json") +// true +// } catch (ex: MultiplayerFileNotFoundException) { +// false +// } // // fun createTemplate(): String { diff --git a/core/src/com/unciv/logic/multiplayer/storage/SimpleHttp.kt b/core/src/com/unciv/logic/multiplayer/storage/SimpleHttp.kt index 79c72ce2bf..b38ff938a8 100644 --- a/core/src/com/unciv/logic/multiplayer/storage/SimpleHttp.kt +++ b/core/src/com/unciv/logic/multiplayer/storage/SimpleHttp.kt @@ -2,6 +2,7 @@ package com.unciv.logic.multiplayer.storage import com.badlogic.gdx.Net import com.unciv.UncivGame +import com.unciv.utils.Log import com.unciv.utils.debug import java.io.BufferedReader import java.io.DataOutputStream @@ -28,6 +29,7 @@ object SimpleHttp { try { urlObj = uri.toURL() } catch (t: Throwable) { + Log.debug("Bad URL", t) action(false, "Bad URL", null) return } diff --git a/core/src/com/unciv/models/metadata/GameSetupInfo.kt b/core/src/com/unciv/models/metadata/GameSetupInfo.kt index ef8ea5ef07..f056e7af33 100644 --- a/core/src/com/unciv/models/metadata/GameSetupInfo.kt +++ b/core/src/com/unciv/models/metadata/GameSetupInfo.kt @@ -24,7 +24,7 @@ class GameSetupInfo( * Unciv installation can QuickStart with a different difficulty than New Game defaults to. */ fun fromSettings(defaultDifficulty: String? = null) = UncivGame.Current.settings.run { - if (lastGameSetup == null) GameSetupInfo().apply { + if (lastGameSetup == null) GameSetupInfo().apply { if (defaultDifficulty != null) gameParameters.difficulty = defaultDifficulty } else GameSetupInfo(lastGameSetup!!).apply { @@ -32,4 +32,4 @@ class GameSetupInfo( } } } -} \ No newline at end of file +} diff --git a/core/src/com/unciv/models/ruleset/Building.kt b/core/src/com/unciv/models/ruleset/Building.kt index 5f4f0a1f06..131b6ff153 100644 --- a/core/src/com/unciv/models/ruleset/Building.kt +++ b/core/src/com/unciv/models/ruleset/Building.kt @@ -2,9 +2,6 @@ package com.unciv.models.ruleset import com.unciv.logic.city.City import com.unciv.logic.city.CityConstructions -import com.unciv.logic.city.INonPerpetualConstruction -import com.unciv.logic.city.RejectionReason -import com.unciv.logic.city.RejectionReasonType import com.unciv.logic.civilization.Civilization import com.unciv.models.Counter import com.unciv.models.ruleset.tile.ResourceType diff --git a/core/src/com/unciv/models/ruleset/IConstruction.kt b/core/src/com/unciv/models/ruleset/IConstruction.kt index d26187470d..27fafd25bd 100644 --- a/core/src/com/unciv/models/ruleset/IConstruction.kt +++ b/core/src/com/unciv/models/ruleset/IConstruction.kt @@ -1,5 +1,7 @@ -package com.unciv.logic.city +package com.unciv.models.ruleset +import com.unciv.logic.city.City +import com.unciv.logic.city.CityConstructions import com.unciv.logic.civilization.Civilization import com.unciv.models.ruleset.unique.IHasUniques import com.unciv.models.ruleset.unique.StateForConditionals @@ -94,8 +96,8 @@ interface INonPerpetualConstruction : IConstruction, INamed, IHasUniques { class RejectionReason(val type: RejectionReasonType, - val errorMessage: String = type.errorMessage, - val shouldShow: Boolean = type.shouldShow) { + val errorMessage: String = type.errorMessage, + val shouldShow: Boolean = type.shouldShow) { fun techPolicyEraWonderRequirements(): Boolean = type in techPolicyEraWonderRequirements @@ -199,7 +201,8 @@ enum class RejectionReasonType(val shouldShow: Boolean, val errorMessage: String } -open class PerpetualConstruction(override var name: String, val description: String) : IConstruction { +open class PerpetualConstruction(override var name: String, val description: String) : + IConstruction { override fun shouldBeDisplayed(cityConstructions: CityConstructions) = isBuildable(cityConstructions) open fun getProductionTooltip(city: City, withIcon: Boolean = false) : String = "" diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index 86f26cd2bf..a83eb60ebf 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -252,7 +252,9 @@ class Ruleset { try { modOptions = json().fromJsonFile(ModOptions::class.java, modOptionsFile) modOptions.updateDeprecations() - } catch (ex: Exception) {} + } catch (ex: Exception) { + Log.error("Failed to get modOptions from json file", ex) + } modOptions.uniqueObjects = modOptions.uniques.map { Unique(it, UniqueTarget.ModOptions) } modOptions.uniqueMap = modOptions.uniqueObjects.groupBy { it.placeholderText } } @@ -414,10 +416,20 @@ class Ruleset { name = cityStateType.name color = cityStateType.color friendBonusUniques = ArrayList(cityStateType.friendBonusUniques.filter { - RulesetValidator(this@Ruleset).checkUnique(Unique(it),false,"",UniqueType.UniqueComplianceErrorSeverity.RulesetSpecific,UniqueTarget.CityState).isEmpty() + RulesetValidator(this@Ruleset).checkUnique( + Unique(it), + false, + "", + UniqueType.UniqueComplianceErrorSeverity.RulesetSpecific + ).isEmpty() }) allyBonusUniques = ArrayList(cityStateType.allyBonusUniques.filter { - RulesetValidator(this@Ruleset).checkUnique(Unique(it),false,"",UniqueType.UniqueComplianceErrorSeverity.RulesetSpecific,UniqueTarget.CityState).isEmpty() + RulesetValidator(this@Ruleset).checkUnique( + Unique(it), + false, + "", + UniqueType.UniqueComplianceErrorSeverity.RulesetSpecific + ).isEmpty() }) } } diff --git a/core/src/com/unciv/models/ruleset/RulesetValidator.kt b/core/src/com/unciv/models/ruleset/RulesetValidator.kt index a0851d0359..53f74ea985 100644 --- a/core/src/com/unciv/models/ruleset/RulesetValidator.kt +++ b/core/src/com/unciv/models/ruleset/RulesetValidator.kt @@ -9,7 +9,6 @@ import com.unciv.models.ruleset.tile.TerrainType import com.unciv.models.ruleset.unique.IHasUniques import com.unciv.models.ruleset.unique.StateForConditionals import com.unciv.models.ruleset.unique.Unique -import com.unciv.models.ruleset.unique.UniqueTarget import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.stats.INamed import com.unciv.models.stats.Stats @@ -406,8 +405,7 @@ class RulesetValidator(val ruleset: Ruleset) { unique, tryFixUnknownUniques, cityStateType.name, - rulesetSpecific, - UniqueTarget.CityState + rulesetSpecific ) lines.addAll(errors) } @@ -430,8 +428,7 @@ class RulesetValidator(val ruleset: Ruleset) { unique, tryFixUnknownUniques, name, - severityToReport, - uniqueContainer.getUniqueTarget() + severityToReport ) lines.addAll(errors) } @@ -441,8 +438,7 @@ class RulesetValidator(val ruleset: Ruleset) { unique: Unique, tryFixUnknownUniques: Boolean, name: String, - severityToReport: UniqueType.UniqueComplianceErrorSeverity, - uniqueTarget: UniqueTarget + severityToReport: UniqueType.UniqueComplianceErrorSeverity ): List { if (unique.type == null) { if (!tryFixUnknownUniques) return emptyList() diff --git a/core/src/com/unciv/models/ruleset/tile/ResourceSupplyList.kt b/core/src/com/unciv/models/ruleset/tile/ResourceSupplyList.kt index 0e22b30762..bd5788c333 100644 --- a/core/src/com/unciv/models/ruleset/tile/ResourceSupplyList.kt +++ b/core/src/com/unciv/models/ruleset/tile/ResourceSupplyList.kt @@ -2,7 +2,7 @@ package com.unciv.models.ruleset.tile import com.unciv.Constants import com.unciv.models.ruleset.Ruleset -import com.unciv.logic.city.IConstruction // Kdoc only +import com.unciv.models.ruleset.IConstruction // Kdoc only /** Container helps aggregating supply and demand of [resources][ResourceSupply.resource], categorized by [origin][ResourceSupply.origin]. * diff --git a/core/src/com/unciv/models/ruleset/unique/Unique.kt b/core/src/com/unciv/models/ruleset/unique/Unique.kt index 1bda8ee71d..1d1a435e48 100644 --- a/core/src/com/unciv/models/ruleset/unique/Unique.kt +++ b/core/src/com/unciv/models/ruleset/unique/Unique.kt @@ -109,8 +109,10 @@ class Unique(val text: String, val sourceObjectType: UniqueTarget? = null, val s // filter out possible replacements that are obviously wrong val uniquesWithNoErrors = finalPossibleUniques.filter { val unique = Unique(it) - val errors = RulesetValidator(ruleset).checkUnique(unique, true, "", - UniqueType.UniqueComplianceErrorSeverity.RulesetSpecific, unique.type!!.targetTypes.first()) + val errors = RulesetValidator(ruleset).checkUnique( + unique, true, "", + UniqueType.UniqueComplianceErrorSeverity.RulesetSpecific + ) errors.isEmpty() } if (uniquesWithNoErrors.size == 1) return uniquesWithNoErrors.first() diff --git a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt index 99fe119022..41c9531c7c 100644 --- a/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt +++ b/core/src/com/unciv/models/ruleset/unit/BaseUnit.kt @@ -2,9 +2,9 @@ package com.unciv.models.ruleset.unit import com.unciv.logic.city.City import com.unciv.logic.city.CityConstructions -import com.unciv.logic.city.INonPerpetualConstruction -import com.unciv.logic.city.RejectionReason -import com.unciv.logic.city.RejectionReasonType +import com.unciv.models.ruleset.INonPerpetualConstruction +import com.unciv.models.ruleset.RejectionReason +import com.unciv.models.ruleset.RejectionReasonType import com.unciv.logic.civilization.Civilization import com.unciv.logic.map.mapunit.MapUnit import com.unciv.models.ruleset.Ruleset diff --git a/core/src/com/unciv/models/translations/TranslationFileReader.kt b/core/src/com/unciv/models/translations/TranslationFileReader.kt index 68c8fa130f..e523a341b0 100644 --- a/core/src/com/unciv/models/translations/TranslationFileReader.kt +++ b/core/src/com/unciv/models/translations/TranslationFileReader.kt @@ -36,4 +36,4 @@ object TranslationFileReader { return hashmap } -} \ No newline at end of file +} diff --git a/core/src/com/unciv/models/translations/TranslationFileWriter.kt b/core/src/com/unciv/models/translations/TranslationFileWriter.kt index aa46026d01..b3f55d0965 100644 --- a/core/src/com/unciv/models/translations/TranslationFileWriter.kt +++ b/core/src/com/unciv/models/translations/TranslationFileWriter.kt @@ -8,7 +8,17 @@ import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers import com.unciv.logic.civilization.managers.SpyAction import com.unciv.models.metadata.BaseRuleset import com.unciv.models.metadata.LocaleCode -import com.unciv.models.ruleset.* +import com.unciv.models.ruleset.Belief +import com.unciv.models.ruleset.Building +import com.unciv.models.ruleset.GlobalUniques +import com.unciv.models.ruleset.PolicyBranch +import com.unciv.models.ruleset.Quest +import com.unciv.models.ruleset.RuinReward +import com.unciv.models.ruleset.RulesetCache +import com.unciv.models.ruleset.Specialist +import com.unciv.models.ruleset.Speed +import com.unciv.models.ruleset.Tutorial +import com.unciv.models.ruleset.Victory import com.unciv.models.ruleset.nation.CityStateType import com.unciv.models.ruleset.nation.Difficulty import com.unciv.models.ruleset.nation.Nation @@ -17,11 +27,16 @@ import com.unciv.models.ruleset.tech.TechColumn import com.unciv.models.ruleset.tile.Terrain import com.unciv.models.ruleset.tile.TileImprovement import com.unciv.models.ruleset.tile.TileResource -import com.unciv.models.ruleset.unique.* +import com.unciv.models.ruleset.unique.Unique +import com.unciv.models.ruleset.unique.UniqueFlag +import com.unciv.models.ruleset.unique.UniqueParameterType +import com.unciv.models.ruleset.unique.UniqueTarget +import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.models.ruleset.unit.Promotion import com.unciv.models.ruleset.unit.UnitType import com.unciv.ui.components.KeyboardBinding +import com.unciv.utils.Log import com.unciv.utils.debug import java.io.File import java.lang.reflect.Field @@ -63,7 +78,7 @@ object TranslationFileWriter { return "Translation files are generated successfully.".tr() + fastlaneOutput } catch (ex: Throwable) { - ex.printStackTrace() + Log.error("Failed to generate translation files", ex) return ex.localizedMessage ?: ex.javaClass.simpleName } } @@ -512,7 +527,7 @@ object TranslationFileWriter { return "Fastlane files are generated successfully.".tr() } catch (ex: Throwable) { - ex.printStackTrace() + Log.error("Failed to generate fastlane files", ex) return ex.localizedMessage ?: ex.javaClass.simpleName } } diff --git a/core/src/com/unciv/models/translations/Translations.kt b/core/src/com/unciv/models/translations/Translations.kt index 04d039cae3..8ce8b3f149 100644 --- a/core/src/com/unciv/models/translations/Translations.kt +++ b/core/src/com/unciv/models/translations/Translations.kt @@ -147,7 +147,9 @@ class Translations : LinkedHashMap(){ for (file in Gdx.files.internal("jsons/translations").list()) languages.add(file.nameWithoutExtension()) } - catch (ex:Exception) {} // Iterating on internal files will not work when running from a .jar + catch (ex:Exception) { + Log.error("Failed to add languages", ex) + } // Iterating on internal files will not work when running from a .jar languages.addAll(Locale.getAvailableLocales() // And this should work for Desktop, meaning from a .jar .map { it.getDisplayName(Locale.ENGLISH) }) // Maybe THIS is the problem, that the DISPLAY locale wasn't english diff --git a/core/src/com/unciv/ui/audio/SoundPlayer.kt b/core/src/com/unciv/ui/audio/SoundPlayer.kt index bb00b08880..56f413150c 100644 --- a/core/src/com/unciv/ui/audio/SoundPlayer.kt +++ b/core/src/com/unciv/ui/audio/SoundPlayer.kt @@ -6,7 +6,7 @@ import com.badlogic.gdx.audio.Sound import com.badlogic.gdx.files.FileHandle import com.unciv.UncivGame import com.unciv.models.UncivSound -import com.unciv.utils.concurrency.Concurrency +import com.unciv.utils.Concurrency import com.unciv.utils.debug import kotlinx.coroutines.delay import java.io.File diff --git a/core/src/com/unciv/ui/components/TabbedPager.kt b/core/src/com/unciv/ui/components/TabbedPager.kt index de365a83fe..a8bfbfcbe2 100644 --- a/core/src/com/unciv/ui/components/TabbedPager.kt +++ b/core/src/com/unciv/ui/components/TabbedPager.kt @@ -353,7 +353,7 @@ open class TabbedPager( override fun getPrefWidth() = dimW.pref fun setPrefWidth(width: Float) { if (dimW.growMax && width > dimW.max) dimW.max = width - if (width !in dimW.min..dimW.max) throw IllegalArgumentException() + if (width !in dimW.min..dimW.max) throw IllegalArgumentException("Width is not in the required range") dimW.pref = width invalidateHierarchy() } @@ -361,7 +361,7 @@ open class TabbedPager( fun setPrefHeight(height: Float) { val contentHeight = (height - headerHeight).coerceIn(0f..dimH.limit) if (dimH.growMax && contentHeight > dimH.max) dimH.max = contentHeight - if (contentHeight !in dimH.min..dimH.max) throw IllegalArgumentException() + if (contentHeight !in dimH.min..dimH.max) throw IllegalArgumentException("Content height is not in the required range") dimH.pref = contentHeight invalidateHierarchy() } diff --git a/core/src/com/unciv/ui/components/UncivTextField.kt b/core/src/com/unciv/ui/components/UncivTextField.kt index e473095344..a70fc0af2c 100644 --- a/core/src/com/unciv/ui/components/UncivTextField.kt +++ b/core/src/com/unciv/ui/components/UncivTextField.kt @@ -19,8 +19,8 @@ import com.unciv.ui.components.extensions.stageBoundingBox import com.unciv.ui.components.extensions.top import com.unciv.ui.popups.Popup import com.unciv.ui.screens.basescreen.BaseScreen -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.withGLContext +import com.unciv.utils.Concurrency +import com.unciv.utils.withGLContext import kotlinx.coroutines.delay object UncivTextField { diff --git a/core/src/com/unciv/ui/components/extensions/Scene2dExtensions.kt b/core/src/com/unciv/ui/components/extensions/Scene2dExtensions.kt index 8713b12fb3..b3024e09f5 100644 --- a/core/src/com/unciv/ui/components/extensions/Scene2dExtensions.kt +++ b/core/src/com/unciv/ui/components/extensions/Scene2dExtensions.kt @@ -40,7 +40,7 @@ import com.unciv.ui.components.extensions.GdxKeyCodeFixes.valueOf import com.unciv.ui.images.IconCircleGroup import com.unciv.ui.images.ImageGetter import com.unciv.ui.screens.basescreen.BaseScreen -import com.unciv.utils.concurrency.Concurrency +import com.unciv.utils.Concurrency /** * Collection of extension functions mostly for libGdx widgets diff --git a/core/src/com/unciv/ui/components/tilegroups/CityButton.kt b/core/src/com/unciv/ui/components/tilegroups/CityButton.kt index 109f28666a..77e191c529 100644 --- a/core/src/com/unciv/ui/components/tilegroups/CityButton.kt +++ b/core/src/com/unciv/ui/components/tilegroups/CityButton.kt @@ -12,8 +12,8 @@ import com.badlogic.gdx.utils.Align import com.unciv.GUI import com.unciv.logic.battle.CityCombatant import com.unciv.logic.city.City -import com.unciv.logic.city.INonPerpetualConstruction -import com.unciv.logic.city.PerpetualConstruction +import com.unciv.models.ruleset.INonPerpetualConstruction +import com.unciv.models.ruleset.PerpetualConstruction import com.unciv.logic.civilization.diplomacy.RelationshipLevel import com.unciv.models.TutorialTrigger import com.unciv.ui.components.BorderedTable diff --git a/core/src/com/unciv/ui/crashhandling/CrashHandlingExtensions.kt b/core/src/com/unciv/ui/crashhandling/CrashHandlingExtensions.kt index 47845d00d9..cad47a41a0 100644 --- a/core/src/com/unciv/ui/crashhandling/CrashHandlingExtensions.kt +++ b/core/src/com/unciv/ui/crashhandling/CrashHandlingExtensions.kt @@ -1,7 +1,7 @@ package com.unciv.ui.crashhandling import com.unciv.UncivGame -import com.unciv.utils.concurrency.Concurrency +import com.unciv.utils.Concurrency /** diff --git a/core/src/com/unciv/ui/crashhandling/CrashScreen.kt b/core/src/com/unciv/ui/crashhandling/CrashScreen.kt index 69d684ee3d..58cdf49ba1 100644 --- a/core/src/com/unciv/ui/crashhandling/CrashScreen.kt +++ b/core/src/com/unciv/ui/crashhandling/CrashScreen.kt @@ -169,6 +169,7 @@ class CrashScreen(val exception: Throwable): BaseScreen() { this@CrashScreen ) } catch(ex:Exception) { + Log.debug("Could not copy to clipboard", ex) ToastPopup( "Could not copy to clipboard!", this@CrashScreen diff --git a/core/src/com/unciv/ui/images/ImageGetter.kt b/core/src/com/unciv/ui/images/ImageGetter.kt index 6ceb4a177e..96b418412f 100644 --- a/core/src/com/unciv/ui/images/ImageGetter.kt +++ b/core/src/com/unciv/ui/images/ImageGetter.kt @@ -19,13 +19,22 @@ import com.badlogic.gdx.utils.Align import com.unciv.Constants import com.unciv.UncivGame import com.unciv.json.json -import com.unciv.logic.city.PerpetualConstruction +import com.unciv.models.ruleset.PerpetualConstruction import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.nation.Nation import com.unciv.models.skins.SkinCache import com.unciv.models.tilesets.TileSetCache -import com.unciv.ui.components.* -import com.unciv.ui.components.extensions.* +import com.unciv.ui.components.Fonts +import com.unciv.ui.components.extensions.center +import com.unciv.ui.components.extensions.centerX +import com.unciv.ui.components.extensions.centerY +import com.unciv.ui.components.extensions.setFontColor +import com.unciv.ui.components.extensions.setFontSize +import com.unciv.ui.components.extensions.setSize +import com.unciv.ui.components.extensions.surroundWithCircle +import com.unciv.ui.components.extensions.surroundWithThinCircle +import com.unciv.ui.components.extensions.toGroup +import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.utils.debug import kotlin.math.atan2 diff --git a/core/src/com/unciv/ui/popups/ToastPopup.kt b/core/src/com/unciv/ui/popups/ToastPopup.kt index b3e88c8146..aa53717b37 100644 --- a/core/src/com/unciv/ui/popups/ToastPopup.kt +++ b/core/src/com/unciv/ui/popups/ToastPopup.kt @@ -3,8 +3,8 @@ package com.unciv.ui.popups import com.badlogic.gdx.scenes.scene2d.Stage import com.unciv.ui.components.extensions.onClick import com.unciv.ui.screens.basescreen.BaseScreen -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import kotlinx.coroutines.delay /** diff --git a/core/src/com/unciv/ui/popups/options/AdvancedTab.kt b/core/src/com/unciv/ui/popups/options/AdvancedTab.kt index 15d22b47da..4c63d3c165 100644 --- a/core/src/com/unciv/ui/popups/options/AdvancedTab.kt +++ b/core/src/com/unciv/ui/popups/options/AdvancedTab.kt @@ -25,7 +25,6 @@ import com.unciv.ui.components.FontFamilyData import com.unciv.ui.components.Fonts import com.unciv.ui.components.UncivSlider import com.unciv.ui.components.UncivTooltip.Companion.addTooltip -import com.unciv.ui.components.extensions.center import com.unciv.ui.components.extensions.disable import com.unciv.ui.components.extensions.keyShortcuts import com.unciv.ui.components.extensions.onActivation @@ -38,8 +37,8 @@ import com.unciv.ui.components.extensions.toTextButton import com.unciv.ui.components.extensions.withoutItem import com.unciv.utils.Display import com.unciv.utils.ScreenOrientation -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext diff --git a/core/src/com/unciv/ui/popups/options/ModCheckTab.kt b/core/src/com/unciv/ui/popups/options/ModCheckTab.kt index a2f81e6fe3..9b6664583d 100644 --- a/core/src/com/unciv/ui/popups/options/ModCheckTab.kt +++ b/core/src/com/unciv/ui/popups/options/ModCheckTab.kt @@ -25,8 +25,8 @@ import com.unciv.ui.popups.ToastPopup import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.screens.newgamescreen.TranslatedSelectBox import com.unciv.utils.Log -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import com.unciv.utils.debug @@ -204,8 +204,7 @@ class ModCheckTab( replacementUnique, false, "", - UniqueType.UniqueComplianceErrorSeverity.RulesetInvariant, - deprecatedUnique.sourceObjectType!! + UniqueType.UniqueComplianceErrorSeverity.RulesetInvariant ) for (error in modInvariantErrors) Log.error("ModInvariantError: %s - %s", error.text, error.errorSeverityToReport) @@ -216,8 +215,7 @@ class ModCheckTab( replacementUnique, false, "", - UniqueType.UniqueComplianceErrorSeverity.RulesetInvariant, - deprecatedUnique.sourceObjectType + UniqueType.UniqueComplianceErrorSeverity.RulesetInvariant ) for (error in modSpecificErrors) Log.error("ModSpecificError: %s - %s", error.text, error.errorSeverityToReport) diff --git a/core/src/com/unciv/ui/popups/options/MultiplayerTab.kt b/core/src/com/unciv/ui/popups/options/MultiplayerTab.kt index 63f26331bb..ab911cbb4f 100644 --- a/core/src/com/unciv/ui/popups/options/MultiplayerTab.kt +++ b/core/src/com/unciv/ui/popups/options/MultiplayerTab.kt @@ -26,8 +26,8 @@ import com.unciv.ui.popups.AuthPopup import com.unciv.ui.popups.Popup import com.unciv.ui.popups.options.SettingsSelect.SelectItem import com.unciv.ui.screens.basescreen.BaseScreen -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import java.time.Duration import java.time.temporal.ChronoUnit @@ -364,9 +364,9 @@ private fun getInitialOptions(extraCustomServerOptions: List( private val settingsProperty: KMutableProperty0 = setting.getProperty(settings) private val label = createLabel(labelText) - private val refreshSelectBox = createSelectBox(items.toGdxArray(), settings) + private val refreshSelectBox = createSelectBox(items.toGdxArray()) @Suppress("HasPlatformType") // Compiler problem // Explicit type Array> as suggested crashes the compiler, except if one // replaces `by x::` with `get() = x.` which according to docs should be entirely equivalent @@ -52,7 +52,7 @@ open class SettingsSelect( return selectLabel } - private fun createSelectBox(initialItems: Array>, settings: GameSettings): SelectBox> { + private fun createSelectBox(initialItems: Array>): SelectBox> { val selectBox = SelectBox>(BaseScreen.skin) selectBox.items = initialItems diff --git a/core/src/com/unciv/ui/popups/options/SoundTab.kt b/core/src/com/unciv/ui/popups/options/SoundTab.kt index 5ffdf254db..be5552fb28 100644 --- a/core/src/com/unciv/ui/popups/options/SoundTab.kt +++ b/core/src/com/unciv/ui/popups/options/SoundTab.kt @@ -16,8 +16,8 @@ import com.unciv.ui.components.extensions.onClick import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toTextButton import com.unciv.ui.components.extensions.toImageButton -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import kotlin.math.floor fun soundTab( diff --git a/core/src/com/unciv/ui/screens/basescreen/BaseScreen.kt b/core/src/com/unciv/ui/screens/basescreen/BaseScreen.kt index 0fbac3efa3..ef5ff602b6 100644 --- a/core/src/com/unciv/ui/screens/basescreen/BaseScreen.kt +++ b/core/src/com/unciv/ui/screens/basescreen/BaseScreen.kt @@ -27,7 +27,6 @@ import com.unciv.ui.components.extensions.isNarrowerThan4to3 import com.unciv.ui.images.ImageGetter import com.unciv.ui.popups.activePopup import com.unciv.ui.popups.options.OptionsPopup -import com.unciv.ui.tutorials.TutorialController abstract class BaseScreen : Screen { diff --git a/core/src/com/unciv/ui/screens/basescreen/TutorialController.kt b/core/src/com/unciv/ui/screens/basescreen/TutorialController.kt index 6beb7ce659..5345010231 100644 --- a/core/src/com/unciv/ui/screens/basescreen/TutorialController.kt +++ b/core/src/com/unciv/ui/screens/basescreen/TutorialController.kt @@ -1,4 +1,4 @@ -package com.unciv.ui.tutorials +package com.unciv.ui.screens.basescreen import com.badlogic.gdx.Gdx import com.unciv.Constants @@ -9,7 +9,6 @@ import com.unciv.models.TutorialTrigger import com.unciv.models.ruleset.Tutorial import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.stats.INamed -import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.components.KeyCharAndCode import com.unciv.ui.images.ImageGetter import com.unciv.ui.popups.Popup diff --git a/core/src/com/unciv/ui/screens/cityscreen/CityConstructionsTable.kt b/core/src/com/unciv/ui/screens/cityscreen/CityConstructionsTable.kt index 9e54109de4..7a792f3781 100644 --- a/core/src/com/unciv/ui/screens/cityscreen/CityConstructionsTable.kt +++ b/core/src/com/unciv/ui/screens/cityscreen/CityConstructionsTable.kt @@ -10,11 +10,11 @@ import com.badlogic.gdx.utils.Align import com.unciv.Constants import com.unciv.logic.city.City import com.unciv.logic.city.CityConstructions -import com.unciv.logic.city.IConstruction -import com.unciv.logic.city.INonPerpetualConstruction -import com.unciv.logic.city.PerpetualConstruction -import com.unciv.logic.city.RejectionReason -import com.unciv.logic.city.RejectionReasonType +import com.unciv.models.ruleset.IConstruction +import com.unciv.models.ruleset.INonPerpetualConstruction +import com.unciv.models.ruleset.PerpetualConstruction +import com.unciv.models.ruleset.RejectionReason +import com.unciv.models.ruleset.RejectionReasonType import com.unciv.logic.map.tile.Tile import com.unciv.models.UncivSound import com.unciv.models.ruleset.Building @@ -46,8 +46,8 @@ import com.unciv.ui.popups.ConfirmPopup import com.unciv.ui.popups.Popup import com.unciv.ui.popups.closeAllPopups import com.unciv.ui.screens.basescreen.BaseScreen -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import kotlin.math.max import kotlin.math.min import com.unciv.ui.components.AutoScrollPane as ScrollPane diff --git a/core/src/com/unciv/ui/screens/cityscreen/CityScreen.kt b/core/src/com/unciv/ui/screens/cityscreen/CityScreen.kt index d29cbe25e1..c7877be2d7 100644 --- a/core/src/com/unciv/ui/screens/cityscreen/CityScreen.kt +++ b/core/src/com/unciv/ui/screens/cityscreen/CityScreen.kt @@ -9,7 +9,7 @@ import com.unciv.GUI import com.unciv.UncivGame import com.unciv.logic.automation.Automation import com.unciv.logic.city.City -import com.unciv.logic.city.IConstruction +import com.unciv.models.ruleset.IConstruction import com.unciv.logic.map.tile.Tile import com.unciv.models.TutorialTrigger import com.unciv.models.UncivSound diff --git a/core/src/com/unciv/ui/screens/cityscreen/ConstructionInfoTable.kt b/core/src/com/unciv/ui/screens/cityscreen/ConstructionInfoTable.kt index cd4d314c74..25a40852eb 100644 --- a/core/src/com/unciv/ui/screens/cityscreen/ConstructionInfoTable.kt +++ b/core/src/com/unciv/ui/screens/cityscreen/ConstructionInfoTable.kt @@ -5,9 +5,9 @@ import com.badlogic.gdx.scenes.scene2d.Touchable import com.badlogic.gdx.scenes.scene2d.ui.Label import com.badlogic.gdx.scenes.scene2d.ui.Table import com.unciv.UncivGame -import com.unciv.logic.city.IConstruction -import com.unciv.logic.city.PerpetualConstruction -import com.unciv.logic.city.PerpetualStatConversion +import com.unciv.models.ruleset.IConstruction +import com.unciv.models.ruleset.PerpetualConstruction +import com.unciv.models.ruleset.PerpetualStatConversion import com.unciv.models.UncivSound import com.unciv.models.ruleset.Building import com.unciv.models.ruleset.IRulesetObject diff --git a/core/src/com/unciv/ui/screens/diplomacyscreen/DiplomacyScreen.kt b/core/src/com/unciv/ui/screens/diplomacyscreen/DiplomacyScreen.kt index 7d5d9fb490..01fc924f90 100644 --- a/core/src/com/unciv/ui/screens/diplomacyscreen/DiplomacyScreen.kt +++ b/core/src/com/unciv/ui/screens/diplomacyscreen/DiplomacyScreen.kt @@ -14,7 +14,6 @@ import com.unciv.logic.civilization.PopupAlert import com.unciv.logic.civilization.diplomacy.DiplomacyFlags import com.unciv.logic.civilization.diplomacy.DiplomacyManager import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers -import com.unciv.logic.civilization.diplomacy.DiplomaticModifiers.* import com.unciv.logic.civilization.diplomacy.DiplomaticStatus import com.unciv.logic.civilization.diplomacy.RelationshipLevel import com.unciv.logic.civilization.managers.AssignedQuest @@ -825,8 +824,8 @@ class DiplomacyScreen( val diplomacyModifiersTable = Table() for (modifier in otherCivDiplomacyManager.diplomaticModifiers) { // Angry about attacked CS and destroyed CS do not stack - if (modifier.key == AttackedProtectedMinor.name - && otherCivDiplomacyManager.hasModifier(DestroyedProtectedMinor)) + if (modifier.key == DiplomaticModifiers.AttackedProtectedMinor.name + && otherCivDiplomacyManager.hasModifier(DiplomaticModifiers.DestroyedProtectedMinor)) continue var text = DiplomaticModifiers.valueOf(modifier.key).text.tr() + " " diff --git a/core/src/com/unciv/ui/screens/mainmenuscreen/MainMenuScreen.kt b/core/src/com/unciv/ui/screens/mainmenuscreen/MainMenuScreen.kt index 6cb36ab4e8..346ae89508 100644 --- a/core/src/com/unciv/ui/screens/mainmenuscreen/MainMenuScreen.kt +++ b/core/src/com/unciv/ui/screens/mainmenuscreen/MainMenuScreen.kt @@ -51,8 +51,8 @@ import com.unciv.ui.screens.savescreens.QuickSave import com.unciv.ui.screens.worldscreen.BackgroundActor import com.unciv.ui.screens.worldscreen.WorldScreen import com.unciv.ui.screens.worldscreen.mainmenu.WorldScreenMenuPopup -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import kotlinx.coroutines.Job import kotlin.math.min diff --git a/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorEditSubTabs.kt b/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorEditSubTabs.kt index c89e8c5254..1930533027 100644 --- a/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorEditSubTabs.kt +++ b/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorEditSubTabs.kt @@ -1,4 +1,4 @@ -package com.unciv.ui.screens.mapeditorscreen +package com.unciv.ui.screens.mapeditorscreen.tabs import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.scenes.scene2d.Group @@ -28,7 +28,6 @@ import com.unciv.ui.images.ImageGetter import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.screens.civilopediascreen.FormattedLine import com.unciv.ui.screens.civilopediascreen.MarkupRenderer -import com.unciv.ui.screens.mapeditorscreen.tabs.MapEditorEditTab import com.unciv.ui.screens.mapeditorscreen.tabs.MapEditorEditTab.BrushHandlerType internal interface IMapEditorEditSubTabs { @@ -352,7 +351,9 @@ class MapEditorEditRiversTab( add(getRiverIcon(RiverEdge.Left)).padRight(10f) add("Bottom left river".toLabel(fontSize = 32)) onClick { - editTab.setBrush(BrushHandlerType.Direct,"Bottom left river", getTileGroupWithRivers(RiverEdge.Left)) { tile -> + editTab.setBrush(BrushHandlerType.Direct,"Bottom left river", getTileGroupWithRivers( + RiverEdge.Left + )) { tile -> tile.hasBottomLeftRiver = !tile.hasBottomLeftRiver } } @@ -363,7 +364,9 @@ class MapEditorEditRiversTab( add(getRiverIcon(RiverEdge.Bottom)).padRight(10f) add("Bottom river".toLabel(fontSize = 32)) onClick { - editTab.setBrush(BrushHandlerType.Direct,"Bottom river", getTileGroupWithRivers(RiverEdge.Bottom)) { tile -> + editTab.setBrush(BrushHandlerType.Direct,"Bottom river", getTileGroupWithRivers( + RiverEdge.Bottom + )) { tile -> tile.hasBottomRiver = !tile.hasBottomRiver } } @@ -374,7 +377,9 @@ class MapEditorEditRiversTab( add(getRiverIcon(RiverEdge.Right)).padRight(10f) add("Bottom right river".toLabel(fontSize = 32)) onClick { - editTab.setBrush(BrushHandlerType.Direct,"Bottom right river", getTileGroupWithRivers(RiverEdge.Right)) { tile -> + editTab.setBrush(BrushHandlerType.Direct,"Bottom right river", getTileGroupWithRivers( + RiverEdge.Right + )) { tile -> tile.hasBottomRightRiver = !tile.hasBottomRightRiver } } diff --git a/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorEditTab.kt b/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorEditTab.kt index be2c4dff46..9329080c6f 100644 --- a/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorEditTab.kt +++ b/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorEditTab.kt @@ -13,14 +13,13 @@ import com.unciv.models.ruleset.Ruleset import com.unciv.models.translations.tr import com.unciv.ui.screens.civilopediascreen.FormattedLine import com.unciv.ui.images.ImageGetter -import com.unciv.ui.screens.mapeditorscreen.IMapEditorEditSubTabs -import com.unciv.ui.screens.mapeditorscreen.MapEditorEditFeaturesTab -import com.unciv.ui.screens.mapeditorscreen.MapEditorEditImprovementsTab -import com.unciv.ui.screens.mapeditorscreen.MapEditorEditResourcesTab -import com.unciv.ui.screens.mapeditorscreen.MapEditorEditRiversTab -import com.unciv.ui.screens.mapeditorscreen.MapEditorEditStartsTab -import com.unciv.ui.screens.mapeditorscreen.MapEditorEditTerrainTab -import com.unciv.ui.screens.mapeditorscreen.MapEditorEditWondersTab +import com.unciv.ui.screens.mapeditorscreen.tabs.MapEditorEditFeaturesTab +import com.unciv.ui.screens.mapeditorscreen.tabs.MapEditorEditImprovementsTab +import com.unciv.ui.screens.mapeditorscreen.tabs.MapEditorEditResourcesTab +import com.unciv.ui.screens.mapeditorscreen.tabs.MapEditorEditRiversTab +import com.unciv.ui.screens.mapeditorscreen.tabs.MapEditorEditStartsTab +import com.unciv.ui.screens.mapeditorscreen.tabs.MapEditorEditTerrainTab +import com.unciv.ui.screens.mapeditorscreen.tabs.MapEditorEditWondersTab import com.unciv.ui.screens.mapeditorscreen.MapEditorScreen import com.unciv.ui.screens.mapeditorscreen.TileInfoNormalizer import com.unciv.ui.screens.mapeditorscreen.tabs.MapEditorOptionsTab.TileMatchFuzziness diff --git a/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorOptionsTab.kt b/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorOptionsTab.kt index f375f9857d..39aba3ab4c 100644 --- a/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorOptionsTab.kt +++ b/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorOptionsTab.kt @@ -20,6 +20,7 @@ import com.unciv.ui.components.extensions.onClick import com.unciv.ui.components.extensions.toCheckBox import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toTextButton +import com.unciv.utils.Log class MapEditorOptionsTab( private val editorScreen: MapEditorScreen @@ -79,6 +80,7 @@ class MapEditorOptionsTab( val loadedMap = MapSaver.mapFromSavedString(clipboardContentsString) editorScreen.loadMap(loadedMap) } catch (ex: Exception) { + Log.error("Could not load map", ex) ToastPopup("Could not load map!", editorScreen) } } diff --git a/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorSaveTab.kt b/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorSaveTab.kt index 5f24f13fa8..2137842768 100644 --- a/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorSaveTab.kt +++ b/core/src/com/unciv/ui/screens/mapeditorscreen/tabs/MapEditorSaveTab.kt @@ -25,6 +25,7 @@ import com.unciv.ui.components.extensions.onActivation import com.unciv.ui.components.extensions.onChange import com.unciv.ui.components.extensions.onClick import com.unciv.ui.components.extensions.toTextButton +import com.unciv.utils.Log import kotlin.concurrent.thread class MapEditorSaveTab( @@ -126,7 +127,7 @@ class MapEditorSaveTab( } editorScreen.isDirty = false } catch (ex: Exception) { - ex.printStackTrace() + Log.error("Failed to save map", ex) Gdx.app.postRunnable { val cantLoadGamePopup = Popup(editorScreen) cantLoadGamePopup.addGoodSizedLabel("It looks like your map can't be saved!").row() diff --git a/core/src/com/unciv/ui/screens/multiplayerscreens/AddMultiplayerGameScreen.kt b/core/src/com/unciv/ui/screens/multiplayerscreens/AddMultiplayerGameScreen.kt index 1fb3c09a60..292af8b648 100644 --- a/core/src/com/unciv/ui/screens/multiplayerscreens/AddMultiplayerGameScreen.kt +++ b/core/src/com/unciv/ui/screens/multiplayerscreens/AddMultiplayerGameScreen.kt @@ -13,8 +13,8 @@ import com.unciv.ui.components.extensions.enable import com.unciv.ui.components.extensions.onClick import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toTextButton -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import java.util.* class AddMultiplayerGameScreen : PickerScreen() { diff --git a/core/src/com/unciv/ui/screens/multiplayerscreens/EditMultiplayerGameInfoScreen.kt b/core/src/com/unciv/ui/screens/multiplayerscreens/EditMultiplayerGameInfoScreen.kt index 38e2a5cf14..c4ec3aa104 100644 --- a/core/src/com/unciv/ui/screens/multiplayerscreens/EditMultiplayerGameInfoScreen.kt +++ b/core/src/com/unciv/ui/screens/multiplayerscreens/EditMultiplayerGameInfoScreen.kt @@ -17,8 +17,9 @@ import com.unciv.ui.components.extensions.onClick import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toTextButton import com.unciv.ui.popups.AuthPopup -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Log +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread /** Subscreen of MultiplayerScreen to edit and delete saves * backScreen is used for getting back to the MultiplayerScreen so it doesn't have to be created over and over again */ @@ -41,6 +42,7 @@ class EditMultiplayerGameInfoScreen(val multiplayerGame: OnlineMultiplayerGame) game.onlineMultiplayer.deleteGame(multiplayerGame) game.popScreen() } catch (ex: Exception) { + Log.error("Could not delete game!", ex) ToastPopup("Could not delete game!", this) } } diff --git a/core/src/com/unciv/ui/screens/multiplayerscreens/MultiplayerHelpers.kt b/core/src/com/unciv/ui/screens/multiplayerscreens/MultiplayerHelpers.kt index 6fc37646be..37c43287e0 100644 --- a/core/src/com/unciv/ui/screens/multiplayerscreens/MultiplayerHelpers.kt +++ b/core/src/com/unciv/ui/screens/multiplayerscreens/MultiplayerHelpers.kt @@ -10,8 +10,8 @@ import com.unciv.ui.screens.savescreens.LoadGameScreen import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.components.extensions.formatShort import com.unciv.ui.components.extensions.toCheckBox -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import java.time.Duration import java.time.Instant diff --git a/core/src/com/unciv/ui/screens/multiplayerscreens/ViewFriendsListScreen.kt b/core/src/com/unciv/ui/screens/multiplayerscreens/ViewFriendsListScreen.kt index e5f50f15f6..a4d577f269 100644 --- a/core/src/com/unciv/ui/screens/multiplayerscreens/ViewFriendsListScreen.kt +++ b/core/src/com/unciv/ui/screens/multiplayerscreens/ViewFriendsListScreen.kt @@ -1,6 +1,7 @@ package com.unciv.ui.screens.multiplayerscreens -import com.badlogic.gdx.scenes.scene2d.ui.* +import com.badlogic.gdx.scenes.scene2d.ui.Table +import com.badlogic.gdx.scenes.scene2d.ui.TextButton import com.unciv.logic.multiplayer.FriendList import com.unciv.ui.screens.pickerscreens.PickerScreen import com.unciv.ui.popups.Popup diff --git a/core/src/com/unciv/ui/screens/newgamescreen/FriendTable.kt b/core/src/com/unciv/ui/screens/newgamescreen/FriendTable.kt index 9c514c2795..21a9f73166 100644 --- a/core/src/com/unciv/ui/screens/newgamescreen/FriendTable.kt +++ b/core/src/com/unciv/ui/screens/newgamescreen/FriendTable.kt @@ -6,7 +6,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table import com.badlogic.gdx.utils.Align import com.unciv.Constants import com.unciv.logic.multiplayer.FriendList -import com.unciv.ui.components.* +import com.unciv.ui.components.WrappableLabel import com.unciv.ui.components.extensions.pad class FriendTable(val friend: FriendList.Friend, width: Float, minHeight: Float) diff --git a/core/src/com/unciv/ui/screens/newgamescreen/MapFileSelectTable.kt b/core/src/com/unciv/ui/screens/newgamescreen/MapFileSelectTable.kt index 87bd3cf708..3ab3b0f0e6 100644 --- a/core/src/com/unciv/ui/screens/newgamescreen/MapFileSelectTable.kt +++ b/core/src/com/unciv/ui/screens/newgamescreen/MapFileSelectTable.kt @@ -18,7 +18,8 @@ import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.popups.Popup import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.screens.victoryscreen.LoadMapPreview -import com.unciv.utils.concurrency.Concurrency +import com.unciv.utils.Log +import com.unciv.utils.Concurrency import kotlinx.coroutines.Job import kotlinx.coroutines.isActive @@ -97,7 +98,7 @@ class MapFileSelectTable( val mapParams = try { MapSaver.loadMapParameters(mapFile) } catch (ex:Exception){ - ex.printStackTrace() + Log.error("Failed to load map parameters", ex) Popup(newGameScreen).apply { addGoodSizedLabel("Could not load map!").row() if (ex is UncivShowableException) diff --git a/core/src/com/unciv/ui/screens/newgamescreen/NewGameScreen.kt b/core/src/com/unciv/ui/screens/newgamescreen/NewGameScreen.kt index 15dce0fdfa..4c5d304b54 100644 --- a/core/src/com/unciv/ui/screens/newgamescreen/NewGameScreen.kt +++ b/core/src/com/unciv/ui/screens/newgamescreen/NewGameScreen.kt @@ -39,8 +39,8 @@ import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.screens.basescreen.RecreateOnResize import com.unciv.ui.screens.pickerscreens.PickerScreen import com.unciv.utils.Log -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import kotlinx.coroutines.coroutineScope import java.net.URL import java.util.UUID @@ -172,6 +172,7 @@ class NewGameScreen( val map = try { MapSaver.loadMap(gameSetupInfo.mapFile!!) } catch (ex: Throwable) { + Log.error("Could not load map", ex) Gdx.input.inputProcessor = stage ToastPopup("Could not load map!", this) return diff --git a/core/src/com/unciv/ui/screens/overviewscreen/WonderOverviewTable.kt b/core/src/com/unciv/ui/screens/overviewscreen/WonderOverviewTable.kt index 6e9d525e49..6d4862debc 100644 --- a/core/src/com/unciv/ui/screens/overviewscreen/WonderOverviewTable.kt +++ b/core/src/com/unciv/ui/screens/overviewscreen/WonderOverviewTable.kt @@ -44,7 +44,8 @@ class WonderOverviewTab( top() defaults().pad(10f).align(Align.center) - (1..5).forEach { _ -> add() } // dummies so equalizeColumns can work because the first grid cell is colspan(5) + for (i in 1..5) + add() // dummies so equalizeColumns can work because the first grid cell is colspan(5) row() createGrid() diff --git a/core/src/com/unciv/ui/screens/pickerscreens/ModManagementScreen.kt b/core/src/com/unciv/ui/screens/pickerscreens/ModManagementScreen.kt index d1fc4b9210..998dcc6265 100644 --- a/core/src/com/unciv/ui/screens/pickerscreens/ModManagementScreen.kt +++ b/core/src/com/unciv/ui/screens/pickerscreens/ModManagementScreen.kt @@ -45,8 +45,8 @@ import com.unciv.ui.screens.basescreen.RecreateOnResize import com.unciv.ui.screens.mainmenuscreen.MainMenuScreen import com.unciv.ui.screens.pickerscreens.ModManagementOptions.SortType import com.unciv.utils.Log -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import kotlinx.coroutines.Job import kotlinx.coroutines.isActive import java.io.IOException @@ -218,6 +218,7 @@ class ModManagementScreen( try { repoSearch = Github.tryGetGithubReposWithTopic(amountPerPage, pageNum)!! } catch (ex: Exception) { + Log.error("Could not download mod list", ex) launchOnGLThread { ToastPopup("Could not download mod list", this@ModManagementScreen) } @@ -352,7 +353,7 @@ class ModManagementScreen( * @param modName: The mod name (name from the RuleSet) * @param modOptions: The ModOptions as enriched by us with GitHub metadata when originally downloaded */ - private fun addModInfoToActionTable(modName: String, modOptions: ModOptions) { + private fun addModInfoToActionTable(modOptions: ModOptions) { addModInfoToActionTable( modOptions.modUrl, modOptions.lastUpdated, @@ -484,7 +485,7 @@ class ModManagementScreen( repo, Gdx.files.local("mods") ) - ?: throw Exception() // downloadAndExtract returns null for 404 errors and the like -> display something! + ?: throw Exception("downloadAndExtract returns null for 404 errors and the like") // downloadAndExtract returns null for 404 errors and the like -> display something! Github.rewriteModOptions(repo, modFolder) launchOnGLThread { ToastPopup("[${repo.name}] Downloaded!", this@ModManagementScreen) @@ -500,6 +501,7 @@ class ModManagementScreen( postAction() } } catch (ex: Exception) { + Log.error("Could not download ${repo.name}", ex) launchOnGLThread { ToastPopup("Could not download [${repo.name}]", this@ModManagementScreen) postAction() @@ -532,7 +534,7 @@ class ModManagementScreen( selectedMod = null modActionTable.clear() // show mod information first - addModInfoToActionTable(mod.name, mod.modOptions) + addModInfoToActionTable(mod.modOptions) // offer 'permanent visual mod' toggle val visualMods = game.settings.visualMods diff --git a/core/src/com/unciv/ui/screens/pickerscreens/PolicyPickerScreen.kt b/core/src/com/unciv/ui/screens/pickerscreens/PolicyPickerScreen.kt index 2968dfabc2..23af137498 100644 --- a/core/src/com/unciv/ui/screens/pickerscreens/PolicyPickerScreen.kt +++ b/core/src/com/unciv/ui/screens/pickerscreens/PolicyPickerScreen.kt @@ -130,11 +130,11 @@ class PolicyPickerScreen(val viewingCiv: Civilization, val canChangeState: Boole : PickerScreen(), RecreateOnResize { object Sizes { - val paddingVertical = 10f - val paddingHorizontal = 20f - val paddingBetweenHor = 10f - val paddingBetweenVer = 20f - val iconSize = 50f + const val paddingVertical = 10f + const val paddingHorizontal = 20f + const val paddingBetweenHor = 10f + const val paddingBetweenVer = 20f + const val iconSize = 50f } private var policyNameToButton = HashMap() diff --git a/core/src/com/unciv/ui/screens/pickerscreens/TechPickerScreen.kt b/core/src/com/unciv/ui/screens/pickerscreens/TechPickerScreen.kt index a892c2f657..2197bf6c7e 100644 --- a/core/src/com/unciv/ui/screens/pickerscreens/TechPickerScreen.kt +++ b/core/src/com/unciv/ui/screens/pickerscreens/TechPickerScreen.kt @@ -27,7 +27,7 @@ import com.unciv.ui.images.ImageGetter import com.unciv.ui.popups.ToastPopup import com.unciv.ui.screens.civilopediascreen.CivilopediaCategories import com.unciv.ui.screens.civilopediascreen.CivilopediaScreen -import com.unciv.utils.concurrency.Concurrency +import com.unciv.utils.Concurrency import kotlin.math.abs diff --git a/core/src/com/unciv/ui/screens/savescreens/LoadGameScreen.kt b/core/src/com/unciv/ui/screens/savescreens/LoadGameScreen.kt index ff6755b6c2..1a24624fd1 100644 --- a/core/src/com/unciv/ui/screens/savescreens/LoadGameScreen.kt +++ b/core/src/com/unciv/ui/screens/savescreens/LoadGameScreen.kt @@ -26,8 +26,8 @@ import com.unciv.ui.components.extensions.onClick import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toTextButton import com.unciv.utils.Log -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import java.io.FileNotFoundException class LoadGameScreen : LoadOrSaveScreen() { @@ -256,7 +256,7 @@ class LoadGameScreen : LoadOrSaveScreen() { repo, Gdx.files.local("mods") ) - ?: throw Exception() // downloadAndExtract returns null for 404 errors and the like -> display something! + ?: throw Exception("downloadAndExtract returns null for 404 errors and the like") // downloadAndExtract returns null for 404 errors and the like -> display something! Github.rewriteModOptions(repo, modFolder) val labelText = descriptionLabel.text // Surprise - a StringBuilder labelText.appendLine() diff --git a/core/src/com/unciv/ui/screens/savescreens/LoadOrSaveScreen.kt b/core/src/com/unciv/ui/screens/savescreens/LoadOrSaveScreen.kt index 4341e8cbcb..9ea8ebcfeb 100644 --- a/core/src/com/unciv/ui/screens/savescreens/LoadOrSaveScreen.kt +++ b/core/src/com/unciv/ui/screens/savescreens/LoadOrSaveScreen.kt @@ -22,8 +22,8 @@ import com.unciv.ui.components.extensions.onDoubleClick import com.unciv.ui.components.extensions.pad import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toTextButton -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import java.util.* diff --git a/core/src/com/unciv/ui/screens/savescreens/QuickSave.kt b/core/src/com/unciv/ui/screens/savescreens/QuickSave.kt index bcc04edb33..6d55df2236 100644 --- a/core/src/com/unciv/ui/screens/savescreens/QuickSave.kt +++ b/core/src/com/unciv/ui/screens/savescreens/QuickSave.kt @@ -8,8 +8,8 @@ import com.unciv.logic.UncivShowableException import com.unciv.ui.popups.Popup import com.unciv.ui.popups.ToastPopup import com.unciv.ui.screens.worldscreen.WorldScreen -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import com.unciv.utils.Log diff --git a/core/src/com/unciv/ui/screens/savescreens/SaveGameScreen.kt b/core/src/com/unciv/ui/screens/savescreens/SaveGameScreen.kt index ce0ac019b7..714e6309bf 100644 --- a/core/src/com/unciv/ui/screens/savescreens/SaveGameScreen.kt +++ b/core/src/com/unciv/ui/screens/savescreens/SaveGameScreen.kt @@ -20,8 +20,8 @@ import com.unciv.ui.components.extensions.toLabel import com.unciv.ui.components.extensions.toTextButton import com.unciv.ui.popups.ConfirmPopup import com.unciv.ui.popups.ToastPopup -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread class SaveGameScreen(val gameInfo: GameInfo) : LoadOrSaveScreen("Current saves") { diff --git a/core/src/com/unciv/ui/screens/savescreens/VerticalFileListScrollPane.kt b/core/src/com/unciv/ui/screens/savescreens/VerticalFileListScrollPane.kt index c559201df9..b5b5f9bb23 100644 --- a/core/src/com/unciv/ui/screens/savescreens/VerticalFileListScrollPane.kt +++ b/core/src/com/unciv/ui/screens/savescreens/VerticalFileListScrollPane.kt @@ -13,8 +13,8 @@ import com.unciv.ui.components.AutoScrollPane import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.components.extensions.keyShortcuts import com.unciv.ui.components.extensions.onClick -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread //todo key auto-repeat for navigation keys? diff --git a/core/src/com/unciv/ui/screens/worldscreen/TechPolicyDiplomacyButtons.kt b/core/src/com/unciv/ui/screens/worldscreen/TechPolicyDiplomacyButtons.kt index 5b579e972e..b4919c4b11 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/TechPolicyDiplomacyButtons.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/TechPolicyDiplomacyButtons.kt @@ -18,7 +18,7 @@ import com.unciv.ui.screens.overviewscreen.EspionageOverviewScreen import com.unciv.ui.screens.pickerscreens.PolicyPickerScreen import com.unciv.ui.screens.pickerscreens.TechButton import com.unciv.ui.screens.pickerscreens.TechPickerScreen -import com.unciv.utils.concurrency.Concurrency +import com.unciv.utils.Concurrency /** A holder for Tech, Policies and Diplomacy buttons going in the top left of the WorldScreen just under WorldScreenTopBar */ diff --git a/core/src/com/unciv/ui/screens/worldscreen/WorldMapHolder.kt b/core/src/com/unciv/ui/screens/worldscreen/WorldMapHolder.kt index 37b860b35c..6cfeac164d 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/WorldMapHolder.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/WorldMapHolder.kt @@ -54,8 +54,8 @@ import com.unciv.ui.images.ImageGetter import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.screens.basescreen.UncivStage import com.unciv.utils.Log -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import java.lang.Float.max diff --git a/core/src/com/unciv/ui/screens/worldscreen/WorldScreen.kt b/core/src/com/unciv/ui/screens/worldscreen/WorldScreen.kt index 325244a8e8..2c9dd535de 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/WorldScreen.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/WorldScreen.kt @@ -59,10 +59,10 @@ import com.unciv.ui.screens.worldscreen.status.NextTurnButton import com.unciv.ui.screens.worldscreen.status.StatusButtons import com.unciv.ui.screens.worldscreen.unit.UnitTable import com.unciv.ui.screens.worldscreen.unit.actions.UnitActionsTable -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread -import com.unciv.utils.concurrency.launchOnThreadPool -import com.unciv.utils.concurrency.withGLContext +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread +import com.unciv.utils.launchOnThreadPool +import com.unciv.utils.withGLContext import com.unciv.utils.debug import kotlinx.coroutines.Job import kotlinx.coroutines.coroutineScope diff --git a/core/src/com/unciv/ui/screens/worldscreen/WorldScreenTopBar.kt b/core/src/com/unciv/ui/screens/worldscreen/WorldScreenTopBar.kt index 486803df72..35affae7e8 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/WorldScreenTopBar.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/WorldScreenTopBar.kt @@ -54,7 +54,7 @@ class WorldScreenTopBar(val worldScreen: WorldScreen) : Table() { private val happinessLabel = "0".toLabel() private val cultureLabel = "0".toLabel(colorFromRGB(210, 94, 210)) private val faithLabel = "0".toLabel(colorFromRGB(168, 196, 241)) - private data class ResourceActors(val resource: TileResource, val Label: Label, val icon: Group) + private data class ResourceActors(val resource: TileResource, val label: Label, val icon: Group) private val resourceActors = ArrayList(12) private val happinessImage = Group() diff --git a/core/src/com/unciv/ui/screens/worldscreen/minimap/Minimap.kt b/core/src/com/unciv/ui/screens/worldscreen/minimap/Minimap.kt index e7de8128b4..9a722fb54b 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/minimap/Minimap.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/minimap/Minimap.kt @@ -11,8 +11,6 @@ import com.unciv.logic.map.MapShape import com.unciv.logic.map.MapSize import com.unciv.ui.images.ClippingImage import com.unciv.ui.images.ImageGetter -import com.unciv.ui.components.* -import com.unciv.ui.components.extensions.* import com.unciv.ui.screens.worldscreen.WorldMapHolder import kotlin.math.max import kotlin.math.min diff --git a/core/src/com/unciv/ui/screens/worldscreen/status/MultiplayerStatusButton.kt b/core/src/com/unciv/ui/screens/worldscreen/status/MultiplayerStatusButton.kt index ac87257a39..eac712d2fe 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/status/MultiplayerStatusButton.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/status/MultiplayerStatusButton.kt @@ -25,8 +25,8 @@ import com.unciv.ui.images.ImageGetter import com.unciv.ui.screens.basescreen.BaseScreen import com.unciv.ui.components.extensions.onClick import com.unciv.ui.components.extensions.setSize -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread import kotlinx.coroutines.Job import kotlinx.coroutines.delay import java.time.Duration diff --git a/core/src/com/unciv/ui/screens/worldscreen/status/NextTurnButton.kt b/core/src/com/unciv/ui/screens/worldscreen/status/NextTurnButton.kt index c8652c2079..23bef68e6f 100644 --- a/core/src/com/unciv/ui/screens/worldscreen/status/NextTurnButton.kt +++ b/core/src/com/unciv/ui/screens/worldscreen/status/NextTurnButton.kt @@ -23,8 +23,8 @@ import com.unciv.ui.screens.pickerscreens.PolicyPickerScreen import com.unciv.ui.screens.pickerscreens.ReligiousBeliefsPickerScreen import com.unciv.ui.screens.pickerscreens.TechPickerScreen import com.unciv.ui.screens.worldscreen.WorldScreen -import com.unciv.utils.concurrency.Concurrency -import com.unciv.utils.concurrency.launchOnGLThread +import com.unciv.utils.Concurrency +import com.unciv.utils.launchOnGLThread class NextTurnButton : IconTextButton("", null, 30) { private var nextTurnAction = NextTurnAction("", Color.BLACK) {} diff --git a/core/src/com/unciv/utils/Concurrency.kt b/core/src/com/unciv/utils/Concurrency.kt index 8685dcf714..e5f2124625 100644 --- a/core/src/com/unciv/utils/Concurrency.kt +++ b/core/src/com/unciv/utils/Concurrency.kt @@ -1,4 +1,4 @@ -package com.unciv.utils.concurrency +package com.unciv.utils import com.badlogic.gdx.Gdx import com.badlogic.gdx.LifecycleListener @@ -62,10 +62,14 @@ object Concurrency { } /** Non-blocking version of [runBlocking]. Runs on a non-daemon thread pool. Use this if you do something that should always finish if possible, like saving the game. */ - fun runOnNonDaemonThreadPool(name: String? = null, block: suspend CoroutineScope.() -> Unit) = run(name, CoroutineScope(Dispatcher.NON_DAEMON), block) + fun runOnNonDaemonThreadPool(name: String? = null, block: suspend CoroutineScope.() -> Unit) = run(name, CoroutineScope( + Dispatcher.NON_DAEMON + ), block) /** Non-blocking version of [runBlocking]. Runs on the GDX GL thread. Use this for all code that manipulates the GDX UI classes. */ - fun runOnGLThread(name: String? = null, block: suspend CoroutineScope.() -> Unit) = run(name, CoroutineScope(Dispatcher.GL), block) + fun runOnGLThread(name: String? = null, block: suspend CoroutineScope.() -> Unit) = run(name, CoroutineScope( + Dispatcher.GL + ), block) /** Must only be called in [com.unciv.UncivGame.dispose] to not have any threads running that prevent JVM shutdown. */ fun stopThreadPools() = EXECUTORS.forEach(ExecutorService::shutdown) @@ -88,16 +92,21 @@ fun CoroutineScope.launchCrashHandling( } /** See [launch]. Runs on a daemon thread pool. Use this for code that does not necessarily need to finish executing. */ -fun CoroutineScope.launchOnThreadPool(name: String? = null, block: suspend CoroutineScope.() -> Unit) = launchCrashHandling(Dispatcher.DAEMON, name, block) +fun CoroutineScope.launchOnThreadPool(name: String? = null, block: suspend CoroutineScope.() -> Unit) = launchCrashHandling( + Dispatcher.DAEMON, name, block) /** See [launch]. Runs on a non-daemon thread pool. Use this if you do something that should always finish if possible, like saving the game. */ -fun CoroutineScope.launchOnNonDaemonThreadPool(name: String? = null, block: suspend CoroutineScope.() -> Unit) = launchCrashHandling(Dispatcher.NON_DAEMON, name, block) +fun CoroutineScope.launchOnNonDaemonThreadPool(name: String? = null, block: suspend CoroutineScope.() -> Unit) = launchCrashHandling( + Dispatcher.NON_DAEMON, name, block) /** See [launch]. Runs on the GDX GL thread. Use this for all code that manipulates the GDX UI classes. */ -fun CoroutineScope.launchOnGLThread(name: String? = null, block: suspend CoroutineScope.() -> Unit) = launchCrashHandling(Dispatcher.GL, name, block) +fun CoroutineScope.launchOnGLThread(name: String? = null, block: suspend CoroutineScope.() -> Unit) = launchCrashHandling( + Dispatcher.GL, name, block) /** See [withContext]. Runs on a daemon thread pool. Use this for code that does not necessarily need to finish executing. */ -suspend fun withThreadPoolContext(block: suspend CoroutineScope.() -> T): T = withContext(Dispatcher.DAEMON, block) +suspend fun withThreadPoolContext(block: suspend CoroutineScope.() -> T): T = withContext( + Dispatcher.DAEMON, block) /** See [withContext]. Runs on a non-daemon thread pool. Use this if you do something that should always finish if possible, like saving the game. */ -suspend fun withNonDaemonThreadPoolContext(block: suspend CoroutineScope.() -> T): T = withContext(Dispatcher.NON_DAEMON, block) +suspend fun withNonDaemonThreadPoolContext(block: suspend CoroutineScope.() -> T): T = withContext( + Dispatcher.NON_DAEMON, block) /** See [withContext]. Runs on the GDX GL thread. Use this for all code that manipulates the GDX UI classes. */ suspend fun withGLContext(block: suspend CoroutineScope.() -> T): T = withContext(Dispatcher.GL, block) diff --git a/desktop/src/com/unciv/app/desktop/DesktopFont.kt b/desktop/src/com/unciv/app/desktop/DesktopFont.kt index 672026239d..19a15d41b9 100644 --- a/desktop/src/com/unciv/app/desktop/DesktopFont.kt +++ b/desktop/src/com/unciv/app/desktop/DesktopFont.kt @@ -5,9 +5,13 @@ import com.badlogic.gdx.graphics.Pixmap import com.unciv.ui.components.FontFamilyData import com.unciv.ui.components.FontImplementation import com.unciv.ui.components.Fonts -import java.awt.* +import java.awt.Color +import java.awt.Font +import java.awt.FontMetrics +import java.awt.GraphicsEnvironment +import java.awt.RenderingHints import java.awt.image.BufferedImage -import java.util.* +import java.util.Locale class DesktopFont : FontImplementation { diff --git a/server/src/com/unciv/app/server/UncivServer.kt b/server/src/com/unciv/app/server/UncivServer.kt index d9853cd180..13551379cf 100644 --- a/server/src/com/unciv/app/server/UncivServer.kt +++ b/server/src/com/unciv/app/server/UncivServer.kt @@ -6,19 +6,23 @@ import com.github.ajalt.clikt.parameters.options.flag import com.github.ajalt.clikt.parameters.options.option import com.github.ajalt.clikt.parameters.types.int import com.github.ajalt.clikt.parameters.types.restrictTo -import io.ktor.application.* -import io.ktor.features.* -import io.ktor.http.* -import io.ktor.request.* -import io.ktor.response.* -import io.ktor.routing.* -import io.ktor.server.engine.* -import io.ktor.server.netty.* -import io.ktor.utils.io.jvm.javaio.* +import io.ktor.application.call +import io.ktor.application.log +import io.ktor.http.HttpStatusCode +import io.ktor.request.receiveText +import io.ktor.response.respond +import io.ktor.response.respondText +import io.ktor.routing.get +import io.ktor.routing.put +import io.ktor.routing.routing +import io.ktor.server.engine.embeddedServer +import io.ktor.server.engine.stop +import io.ktor.server.netty.Netty +import io.ktor.utils.io.jvm.javaio.toInputStream import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.File -import java.util.* +import java.util.Base64 import java.util.concurrent.TimeUnit diff --git a/settings.gradle.kts b/settings.gradle.kts index d8999b2de9..76c2c65126 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1 +1 @@ -include("desktop", "android", "ios", "core", "tests", "server") \ No newline at end of file +include("desktop", "android", "ios", "core", "tests", "server") diff --git a/tests/src/com/unciv/dev/FasterUIDevelopment.kt b/tests/src/com/unciv/dev/FasterUIDevelopment.kt index 2a2e4f6b76..c756328ede 100644 --- a/tests/src/com/unciv/dev/FasterUIDevelopment.kt +++ b/tests/src/com/unciv/dev/FasterUIDevelopment.kt @@ -21,12 +21,13 @@ import com.unciv.ui.components.Fonts import com.unciv.ui.components.FontImplementation import com.unciv.ui.components.extensions.center import com.unciv.ui.components.extensions.toLabel -import com.unciv.utils.concurrency.Concurrency +import com.unciv.utils.Concurrency import java.awt.Font import java.awt.RenderingHints import java.awt.image.BufferedImage import java.time.Duration import java.time.Instant +import java.util.Locale import java.util.concurrent.atomic.AtomicReference /** Creates a basic GDX application that mimics [UncivGame] as closely as possible, starts up fast and shows one UI element, to be returned by [DevElement.createDevElement] */ @@ -96,7 +97,7 @@ object FasterUIDevelopment { override fun mouseMoved(event: InputEvent?, x: Float, y: Float): Boolean { Concurrency.run { throttle(lastPrint, Duration.ofMillis(500), {}) { - println(String.format("x: %.1f\ty: %.1f", x, y)) + println(String.format(Locale.US,"x: %.1f\ty: %.1f", x, y)) } } return false diff --git a/tests/src/com/unciv/logic/map/UnitMovementTests.kt b/tests/src/com/unciv/logic/map/UnitMovementTests.kt index 3c315f5e2c..2f8b4746cc 100644 --- a/tests/src/com/unciv/logic/map/UnitMovementTests.kt +++ b/tests/src/com/unciv/logic/map/UnitMovementTests.kt @@ -9,7 +9,9 @@ import com.unciv.logic.civilization.diplomacy.DiplomacyManager import com.unciv.logic.civilization.diplomacy.DiplomaticStatus import com.unciv.logic.map.mapunit.MapUnit import com.unciv.logic.map.tile.Tile -import com.unciv.models.ruleset.* +import com.unciv.models.ruleset.Ruleset +import com.unciv.models.ruleset.RulesetCache +import com.unciv.models.ruleset.Speed import com.unciv.models.ruleset.nation.Difficulty import com.unciv.models.ruleset.nation.Nation import com.unciv.models.ruleset.unit.BaseUnit diff --git a/tests/src/com/unciv/logic/map/VisibilityTests.kt b/tests/src/com/unciv/logic/map/VisibilityTests.kt index 6b039c0b4f..4d91397489 100644 --- a/tests/src/com/unciv/logic/map/VisibilityTests.kt +++ b/tests/src/com/unciv/logic/map/VisibilityTests.kt @@ -6,7 +6,8 @@ import com.unciv.logic.GameInfo import com.unciv.logic.civilization.Civilization import com.unciv.logic.map.mapunit.MapUnit import com.unciv.logic.map.tile.Tile -import com.unciv.models.ruleset.* +import com.unciv.models.ruleset.Ruleset +import com.unciv.models.ruleset.RulesetCache import com.unciv.models.ruleset.nation.Nation import com.unciv.testing.GdxTestRunner import org.junit.Before diff --git a/tests/src/com/unciv/testing/IdHelperTests.kt b/tests/src/com/unciv/testing/IdHelperTests.kt index 25dfd973e6..5f76c8bdb6 100644 --- a/tests/src/com/unciv/testing/IdHelperTests.kt +++ b/tests/src/com/unciv/testing/IdHelperTests.kt @@ -73,4 +73,4 @@ class IdHelperTests { fun testIdFailure5() { IdChecker.checkAndReturnGameUuid("G-2ddb3a34-0699-4126-b7a5-48603e665928-2") // changed uuid without changing checkdigit } -} \ No newline at end of file +} diff --git a/tests/src/com/unciv/testing/SerializationTests.kt b/tests/src/com/unciv/testing/SerializationTests.kt index ab49da05b6..1bd624f402 100644 --- a/tests/src/com/unciv/testing/SerializationTests.kt +++ b/tests/src/com/unciv/testing/SerializationTests.kt @@ -17,6 +17,7 @@ import com.unciv.models.metadata.GameSetupInfo import com.unciv.models.metadata.Player import com.unciv.models.ruleset.RulesetCache import com.unciv.models.ruleset.unique.UniqueType +import com.unciv.utils.Log import com.unciv.utils.debug import org.junit.After import org.junit.Assert @@ -105,7 +106,7 @@ class SerializationTests { val json = try { jsonSerializer.toJson(game) } catch (ex: Throwable) { - ex.printStackTrace() + Log.error("Failed to serialize game", ex) return } diff --git a/tests/src/com/unciv/testing/TranslationTests.kt b/tests/src/com/unciv/testing/TranslationTests.kt index 47d345acd2..3654ed7051 100644 --- a/tests/src/com/unciv/testing/TranslationTests.kt +++ b/tests/src/com/unciv/testing/TranslationTests.kt @@ -8,7 +8,14 @@ import com.unciv.models.metadata.GameSettings import com.unciv.models.ruleset.Ruleset import com.unciv.models.ruleset.RulesetCache import com.unciv.models.stats.Stats -import com.unciv.models.translations.* +import com.unciv.models.translations.TranslationEntry +import com.unciv.models.translations.TranslationFileWriter +import com.unciv.models.translations.Translations +import com.unciv.models.translations.getPlaceholderParametersIgnoringLowerLevelBraces +import com.unciv.models.translations.getPlaceholderText +import com.unciv.models.translations.squareBraceRegex +import com.unciv.models.translations.tr +import com.unciv.utils.Log import com.unciv.utils.debug import org.junit.Assert import org.junit.Before @@ -201,7 +208,7 @@ class TranslationTests { translationEntry.entry.tr() } catch (ex: Exception) { allWordsTranslatedCorrectly = false - println("Crashed when translating ${translationEntry.entry} to $language") + Log.error("Crashed when translating ${translationEntry.entry} to $language", ex) } } } @@ -259,7 +266,7 @@ class TranslationTests { UncivGame.Current.settings = GameSettings() fun addTranslation(original:String, result:String){ - UncivGame.Current.translations[original.getPlaceholderText()] =TranslationEntry(original) + UncivGame.Current.translations[original.getPlaceholderText()] = TranslationEntry(original) .apply { this[Constants.english] = result } } addTranslation("The brother of [person]", "The sibling of [person]") diff --git a/tests/src/com/unciv/testing/TutorialTranslationTests.kt b/tests/src/com/unciv/testing/TutorialTranslationTests.kt index 3181ba6823..44f5aa29a2 100644 --- a/tests/src/com/unciv/testing/TutorialTranslationTests.kt +++ b/tests/src/com/unciv/testing/TutorialTranslationTests.kt @@ -2,7 +2,7 @@ package com.unciv.testing import com.unciv.models.TutorialTrigger import com.unciv.models.ruleset.Tutorial -import com.unciv.ui.tutorials.TutorialController +import com.unciv.ui.screens.basescreen.TutorialController import org.junit.Assert.fail import org.junit.Test import org.junit.runner.RunWith