From 0feb9bdefcf578ddaa2bbd30cc9be7085abb4a19 Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Tue, 1 Dec 2020 23:26:01 +0200 Subject: [PATCH] First attempt at making Unciv Android-TV-compatible --- android/AndroidManifest.xml | 18 ++ android/res/drawable-xhdpi/banner.png | Bin 0 -> 33657 bytes android/src/com/unciv/app/AndroidLauncher.kt | 6 +- .../com/unciv/ui/worldscreen/WorldScreen.kt | 206 +++++++++--------- 4 files changed, 123 insertions(+), 107 deletions(-) create mode 100644 android/res/drawable-xhdpi/banner.png diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml index d3d8fc5140..36f8bcd151 100644 --- a/android/AndroidManifest.xml +++ b/android/AndroidManifest.xml @@ -6,12 +6,17 @@ + + + + + + + + + + + + + diff --git a/android/res/drawable-xhdpi/banner.png b/android/res/drawable-xhdpi/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..bde46a549b5630aca5d9928787adf94617d98beb GIT binary patch literal 33657 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 {} - private val tutorialTaskTable = Table().apply { background=ImageGetter.getBackground(ImageGetter.getBlue().lerp(Color.BLACK, 0.5f)) } + private var nextTurnAction: () -> Unit = {} + private val tutorialTaskTable = Table().apply { background = ImageGetter.getBackground(ImageGetter.getBlue().lerp(Color.BLACK, 0.5f)) } private val notificationsScroll: NotificationsScroll var shouldUpdate = false - private var backButtonListener : InputListener - + private var backButtonListener: InputListener init { @@ -78,13 +77,13 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { notificationsScroll = NotificationsScroll(this) // notifications are right-aligned, they take up only as much space as necessary. - notificationsScroll.width = stage.width/2 + notificationsScroll.width = stage.width / 2 minimapWrapper.x = stage.width - minimapWrapper.width mapHolder.addTiles() - techButtonHolder.touchable=Touchable.enabled + techButtonHolder.touchable = Touchable.enabled techButtonHolder.onClick(UncivSound.Paper) { game.setScreen(TechPickerScreen(viewingCiv)) } @@ -94,7 +93,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { fogOfWarButton.setPosition(10f, topBar.y - fogOfWarButton.height - 10f) // Don't show policies until they become relevant - if(viewingCiv.policies.adoptedPolicies.isNotEmpty() || viewingCiv.policies.canAdoptPolicy()) { + if (viewingCiv.policies.adoptedPolicies.isNotEmpty() || viewingCiv.policies.canAdoptPolicy()) { val policyScreenButton = Button(skin) policyScreenButton.add(ImageGetter.getImage("PolicyIcons/Constitution")).size(30f).pad(15f) policyScreenButton.onClick { game.setScreen(PolicyPickerScreen(this)) } @@ -116,8 +115,8 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { stage.addActor(diplomacyButtonHolder) stage.addActor(bottomUnitTable) stage.addActor(bottomTileInfoTable) - battleTable.width = stage.width/3 - battleTable.x = stage.width/3 + battleTable.width = stage.width / 3 + battleTable.x = stage.width / 3 stage.addActor(battleTable) stage.addActor(unitActionsTable) @@ -133,28 +132,28 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { // Don't select unit and change selectedCiv when centering as spectator if (viewingCiv.isSpectator()) - mapHolder.setCenterPosition(tileToCenterOn,true, false) + mapHolder.setCenterPosition(tileToCenterOn, true, false) else - mapHolder.setCenterPosition(tileToCenterOn,true, true) + mapHolder.setCenterPosition(tileToCenterOn, true, true) - if(gameInfo.gameParameters.isOnlineMultiplayer && !gameInfo.isUpToDate) + if (gameInfo.gameParameters.isOnlineMultiplayer && !gameInfo.isUpToDate) isPlayersTurn = false // until we're up to date, don't let the player do anything - - if(gameInfo.gameParameters.isOnlineMultiplayer && !isPlayersTurn) { + + if (gameInfo.gameParameters.isOnlineMultiplayer && !isPlayersTurn) { // restart the timer stopMultiPlayerRefresher() // isDaemon = true, in order to not block the app closing multiPlayerRefresher = Timer("multiPlayerRefresh", true).apply { schedule(object : TimerTask() { //todo maybe not use timer for web request, from timer docs "Timer tasks should complete quickly." - override fun run() { loadLatestMultiplayerState() } + override fun run() { + loadLatestMultiplayerState() + } }, 0, 10000) // 10 seconds } } - tutorialController.allTutorialsShowedCallback = { - shouldUpdate = true - } + tutorialController.allTutorialsShowedCallback = { shouldUpdate = true } backButtonListener = onBackButtonClicked { backButtonAndESCHandler() } @@ -173,63 +172,63 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { } private fun cleanupKeyDispatcher() { - val delKeys = keyPressDispatcher.keys.filter { it!=' ' && it!='n' } + val delKeys = keyPressDispatcher.keys.filter { it != ' ' && it != 'n' } delKeys.forEach { keyPressDispatcher.remove(it) } } private fun addKeyboardListener() { stage.addListener( - object : InputListener() { - private val pressedKeys = mutableSetOf() - private var infiniteAction : RepeatAction? = null - private val amountToMove = 30 / mapHolder.scaleX - private val ALLOWED_KEYS = setOf(Input.Keys.W,Input.Keys.S,Input.Keys.A,Input.Keys.D, - Input.Keys.UP, Input.Keys.DOWN, Input.Keys.LEFT, Input.Keys.RIGHT ) + object : InputListener() { + private val pressedKeys = mutableSetOf() + private var infiniteAction: RepeatAction? = null + private val amountToMove = 30 / mapHolder.scaleX + private val ALLOWED_KEYS = setOf(Input.Keys.W, Input.Keys.S, Input.Keys.A, Input.Keys.D, + Input.Keys.UP, Input.Keys.DOWN, Input.Keys.LEFT, Input.Keys.RIGHT) - override fun keyDown(event: InputEvent?, keycode: Int): Boolean { - if (keycode !in ALLOWED_KEYS) return false + override fun keyDown(event: InputEvent?, keycode: Int): Boolean { + if (keycode !in ALLOWED_KEYS) return false - pressedKeys.add(keycode) - if (infiniteAction == null) { - // create a copy of the action, because removeAction() will destroy this instance - infiniteAction = Actions.forever(Actions.delay(0.05f, Actions.run { whileKeyPressedLoop() })) - mapHolder.addAction(infiniteAction) - } - return true - } - - fun whileKeyPressedLoop() { - for (keycode in pressedKeys) { - when (keycode) { - Input.Keys.W, Input.Keys.UP -> mapHolder.scrollY -= amountToMove - Input.Keys.S, Input.Keys.DOWN -> mapHolder.scrollY += amountToMove - Input.Keys.A, Input.Keys.LEFT -> mapHolder.scrollX -= amountToMove - Input.Keys.D, Input.Keys.RIGHT -> mapHolder.scrollX += amountToMove + pressedKeys.add(keycode) + if (infiniteAction == null) { + // create a copy of the action, because removeAction() will destroy this instance + infiniteAction = Actions.forever(Actions.delay(0.05f, Actions.run { whileKeyPressedLoop() })) + mapHolder.addAction(infiniteAction) } + return true } - mapHolder.updateVisualScroll() - } - override fun keyUp(event: InputEvent?, keycode: Int): Boolean { - if (keycode !in ALLOWED_KEYS) return false - - pressedKeys.remove(keycode) - if (infiniteAction != null && pressedKeys.isEmpty()) { - // stop the loop otherwise it keeps going even after removal - infiniteAction?.finish() - // remove and nil the action - mapHolder.removeAction(infiniteAction) - infiniteAction = null + fun whileKeyPressedLoop() { + for (keycode in pressedKeys) { + when (keycode) { + Input.Keys.W, Input.Keys.UP -> mapHolder.scrollY -= amountToMove + Input.Keys.S, Input.Keys.DOWN -> mapHolder.scrollY += amountToMove + Input.Keys.A, Input.Keys.LEFT -> mapHolder.scrollX -= amountToMove + Input.Keys.D, Input.Keys.RIGHT -> mapHolder.scrollX += amountToMove + } + } + mapHolder.updateVisualScroll() + } + + override fun keyUp(event: InputEvent?, keycode: Int): Boolean { + if (keycode !in ALLOWED_KEYS) return false + + pressedKeys.remove(keycode) + if (infiniteAction != null && pressedKeys.isEmpty()) { + // stop the loop otherwise it keeps going even after removal + infiniteAction?.finish() + // remove and nil the action + mapHolder.removeAction(infiniteAction) + infiniteAction = null + } + return true } - return true } - } ) } - private fun loadLatestMultiplayerState(){ + private fun loadLatestMultiplayerState() { // Since we're on a background thread, all the UI calls in this func need to run from the // main thread which has a GL context @@ -243,14 +242,13 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { val latestGame = OnlineMultiplayer().tryDownloadGame(gameInfo.gameId) // if we find it still isn't player's turn...nothing changed - if(gameInfo.isUpToDate && gameInfo.currentPlayer==latestGame.currentPlayer) { + if (gameInfo.isUpToDate && gameInfo.currentPlayer == latestGame.currentPlayer) { Gdx.app.postRunnable { loadingGamePopup.close() } return - } - else{ //else we found it is the player's turn again, turn off polling and load turn + } else { //else we found it is the player's turn again, turn off polling and load turn stopMultiPlayerRefresher() - latestGame.isUpToDate=true + latestGame.isUpToDate = true Gdx.app.postRunnable { game.loadGame(latestGame) } } @@ -328,50 +326,50 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { } updateNextTurnButton(hasOpenPopups()) // This must be before the notifications update, since its position is based on it notificationsScroll.update(viewingCiv.notifications) - notificationsScroll.setPosition(stage.width - notificationsScroll.width*0.5f - 10f, - nextTurnButton.y - notificationsScroll.height*0.5f - 5f) + notificationsScroll.setPosition(stage.width - notificationsScroll.width * 0.5f - 10f, + nextTurnButton.y - notificationsScroll.height * 0.5f - 5f) } private fun getCurrentTutorialTask(): String { val completedTasks = game.settings.tutorialTasksCompleted - if(!completedTasks.contains("Move unit")) + if (!completedTasks.contains("Move unit")) return "Move a unit!\nClick on a unit > Click on a destination > Click the arrow popup" - if(!completedTasks.contains("Found city")) + if (!completedTasks.contains("Found city")) return "Found a city!\nSelect the Settler (flag unit) > Click on 'Found city' (bottom-left corner)" - if(!completedTasks.contains("Enter city screen")) + if (!completedTasks.contains("Enter city screen")) return "Enter the city screen!\nClick the city button twice" - if(!completedTasks.contains("Pick technology")) + if (!completedTasks.contains("Pick technology")) return "Pick a technology to research!\nClick on the tech button (greenish, top left) > " + "\n select technology > click 'Research' (bottom right)" - if(!completedTasks.contains("Pick construction")) + if (!completedTasks.contains("Pick construction")) return "Pick a construction!\nEnter city screen > Click on a unit or building (bottom left side) >" + " \n click 'add to queue'" - if(!completedTasks.contains("Pass a turn")) + if (!completedTasks.contains("Pass a turn")) return "Pass a turn!\nCycle through units with 'Next unit' > Click 'Next turn'" - if(!completedTasks.contains("Reassign worked tiles")) + if (!completedTasks.contains("Reassign worked tiles")) return "Reassign worked tiles!\nEnter city screen > click the assigned (green) tile to unassign > " + "\n click an unassigned tile to assign population" - if(!completedTasks.contains("Meet another civilization")) + if (!completedTasks.contains("Meet another civilization")) return "Meet another civilization!\nExplore the map until you encounter another civilization!" - if(!completedTasks.contains("Open the options table")) + if (!completedTasks.contains("Open the options table")) return "Open the options table!\nClick the menu button (top left) > click 'Options'" - if(!completedTasks.contains("Construct an improvement")) + if (!completedTasks.contains("Construct an improvement")) return "Construct an improvement!\nConstruct a Worker unit > Move to a Plains or Grassland tile > " + "\n Click 'Create improvement' (above the unit table, bottom left)" + "\n > Choose the farm > \n Leave the worker there until it's finished" - if(!completedTasks.contains("Create a trade route") - && viewingCiv.citiesConnectedToCapitalToMediums.any { it.key.civInfo==viewingCiv }) + if (!completedTasks.contains("Create a trade route") + && viewingCiv.citiesConnectedToCapitalToMediums.any { it.key.civInfo == viewingCiv }) game.settings.addCompletedTutorialTask("Create a trade route") - if(viewingCiv.cities.size>1 && !completedTasks.contains("Create a trade route")) + if (viewingCiv.cities.size > 1 && !completedTasks.contains("Create a trade route")) return "Create a trade route!\nConstruct roads between your capital and another city" + "\nOr, automate your worker and let him get to that eventually" - if(viewingCiv.isAtWar() && !completedTasks.contains("Conquer a city")) + if (viewingCiv.isAtWar() && !completedTasks.contains("Conquer a city")) return "Conquer a city!\nBring an enemy city down to low health > " + "\nEnter the city with a melee unit" - if(viewingCiv.getCivUnits().any { it.type.isAirUnit() } && !completedTasks.contains("Move an air unit")) + if (viewingCiv.getCivUnits().any { it.type.isAirUnit() } && !completedTasks.contains("Move an air unit")) return "Move an air unit!\nSelect an air unit > select another city within range > " + "\nMove the unit to the other city" - if(!completedTasks.contains("See your stats breakdown")) + if (!completedTasks.contains("See your stats breakdown")) return "See your stats breakdown!\nEnter the Overview screen (top right corner) >" + "\nClick on 'Stats'" @@ -398,9 +396,9 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { // ... all tiles around those in range of an average melee unit // -> and now we look for a unit that could do the conquering because it's ours // no matter whether civilian, air or ranged, tell user he needs melee - .any { it.getUnits().any { unit -> unit.civInfo == viewingCiv} } + .any { it.getUnits().any { unit -> unit.civInfo == viewingCiv } } } - displayTutorial(Tutorial.AfterConquering) { viewingCiv.cities.any{it.hasJustBeenConquered} } + displayTutorial(Tutorial.AfterConquering) { viewingCiv.cities.any { it.hasJustBeenConquered } } displayTutorial(Tutorial.InjuredUnits) { gameInfo.getCurrentPlayerCivilization().getCivUnits().any { it.health < 100 } } @@ -409,8 +407,8 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { private fun updateDiplomacyButton(civInfo: CivilizationInfo) { diplomacyButtonHolder.clear() - if(!civInfo.isDefeated() && !civInfo.isSpectator() && civInfo.getKnownCivs() - .filterNot { it==viewingCiv || it.isBarbarian() } + if (!civInfo.isDefeated() && !civInfo.isSpectator() && civInfo.getKnownCivs() + .filterNot { it == viewingCiv || it.isBarbarian() } .any()) { displayTutorial(Tutorial.OtherCivEncountered) val btn = "Diplomacy".toTextButton() @@ -439,7 +437,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { val buttonPic = Table() buttonPic.background = ImageGetter.getRoundedEdgeTableBackground(colorFromRGB(7, 46, 43)) buttonPic.defaults().pad(20f) - val text = if(viewingCiv.tech.canResearchTech()) "{Pick a tech}!" else "Technologies" + val text = if (viewingCiv.tech.canResearchTech()) "{Pick a tech}!" else "Technologies" buttonPic.add(text.toLabel(Color.WHITE, 30)) techButtonHolder.add(buttonPic) } @@ -474,7 +472,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { nextTurnButton.label.setFontSize(30) nextTurnButton.labelCell.pad(10f) val nextTurnActionWrapped = { nextTurnAction() } - nextTurnButton.onClick (nextTurnActionWrapped) + nextTurnButton.onClick(nextTurnActionWrapped) keyPressDispatcher[' '] = nextTurnActionWrapped keyPressDispatcher['n'] = nextTurnActionWrapped @@ -486,13 +484,13 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { shouldUpdate = true - thread(name="NextTurn") { // on a separate thread so the user can explore their world while we're passing the turn + thread(name = "NextTurn") { // on a separate thread so the user can explore their world while we're passing the turn val gameInfoClone = gameInfo.clone() gameInfoClone.setTransients() try { gameInfoClone.nextTurn() - if(gameInfo.gameParameters.isOnlineMultiplayer) { + if (gameInfo.gameParameters.isOnlineMultiplayer) { try { OnlineMultiplayer().tryUploadGame(gameInfoClone) } catch (ex: Exception) { @@ -520,7 +518,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { // do this on main thread - it's the only one that has a GL context to create images from Gdx.app.postRunnable { - fun createNewWorldScreen(){ + fun createNewWorldScreen() { val newWorldScreen = WorldScreen(gameInfoClone.getPlayerToViewAs()) newWorldScreen.mapHolder.scrollX = mapHolder.scrollX newWorldScreen.mapHolder.scrollY = mapHolder.scrollY @@ -542,7 +540,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { createNewWorldScreen() } - if(shouldAutoSave) { + if (shouldAutoSave) { val newWorldScreen = game.worldScreen newWorldScreen.waitingForAutosave = true newWorldScreen.shouldUpdate = true @@ -556,10 +554,10 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { } } - private class NextTurnAction(val text:String, val color:Color, val action:()->Unit) + private class NextTurnAction(val text: String, val color: Color, val action: () -> Unit) private fun updateNextTurnButton(isSomethingOpen: Boolean) { - val action:NextTurnAction = getNextTurnAction() + val action: NextTurnAction = getNextTurnAction() nextTurnAction = action.action nextTurnButton.setText(action.text.tr()) @@ -568,6 +566,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { nextTurnButton.isEnabled = !isSomethingOpen && isPlayersTurn && !waitingForAutosave nextTurnButton.setPosition(stage.width - nextTurnButton.width - 10f, topBar.y - nextTurnButton.height - 10f) } + fun enableNextTurnButtonAfterOptions() { nextTurnButton.isEnabled = isPlayersTurn && !waitingForAutosave } @@ -598,7 +597,7 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { game.setScreen(TechPickerScreen(viewingCiv.tech.freeTechs != 0, viewingCiv)) } - viewingCiv.policies.shouldOpenPolicyPicker || (viewingCiv.policies.freePolicies > 0 && viewingCiv.policies.canAdoptPolicy()) -> + viewingCiv.policies.shouldOpenPolicyPicker || (viewingCiv.policies.freePolicies > 0 && viewingCiv.policies.canAdoptPolicy()) -> NextTurnAction("Pick a policy", Color.VIOLET) { game.setScreen(PolicyPickerScreen(this)) viewingCiv.policies.shouldOpenPolicyPicker = false @@ -634,10 +633,10 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { super.render(delta) } - private fun showTutorialsOnNextTurn(){ + private fun showTutorialsOnNextTurn() { if (!game.settings.showTutorials) return displayTutorial(Tutorial.SlowStart) - displayTutorial(Tutorial.CityExpansion){ viewingCiv.cities.any { it.expansion.tilesClaimed()>0 } } + displayTutorial(Tutorial.CityExpansion) { viewingCiv.cities.any { it.expansion.tilesClaimed() > 0 } } displayTutorial(Tutorial.BarbarianEncountered) { viewingCiv.viewableTiles.any { it.getUnits().any { unit -> unit.civInfo.isBarbarian() } } } displayTutorial(Tutorial.RoadsAndRailroads) { viewingCiv.cities.size > 2 } displayTutorial(Tutorial.Happiness) { viewingCiv.getHappiness() < 5 } @@ -646,11 +645,11 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { displayTutorial(Tutorial.IdleUnits) { gameInfo.turns >= 50 && game.settings.checkForDueUnits } displayTutorial(Tutorial.ContactMe) { gameInfo.turns >= 100 } val resources = viewingCiv.detailedCivResources.asSequence().filter { it.origin == "All" } // Avoid full list copy - displayTutorial(Tutorial.LuxuryResource) { resources.any { it.resource.resourceType==ResourceType.Luxury } } - displayTutorial(Tutorial.StrategicResource) { resources.any { it.resource.resourceType==ResourceType.Strategic} } + displayTutorial(Tutorial.LuxuryResource) { resources.any { it.resource.resourceType == ResourceType.Luxury } } + displayTutorial(Tutorial.StrategicResource) { resources.any { it.resource.resourceType == ResourceType.Strategic } } displayTutorial(Tutorial.EnemyCity) { viewingCiv.getKnownCivs().asSequence().filter { viewingCiv.isAtWarWith(it) } - .flatMap { it.cities.asSequence() }.any { viewingCiv.exploredTiles.contains(it.location) } + .flatMap { it.cities.asSequence() }.any { viewingCiv.exploredTiles.contains(it.location) } } displayTutorial(Tutorial.ApolloProgram) { viewingCiv.hasUnique("Enables construction of Spaceship parts") } displayTutorial(Tutorial.SiegeUnits) { viewingCiv.getCivUnits().any { it.type == UnitType.Siege } } @@ -693,17 +692,14 @@ class WorldScreen(val viewingCiv:CivilizationInfo) : CameraStageBaseScreen() { promptWindow.addGoodSizedLabel("Do you want to exit the game?".tr()) promptWindow.row() promptWindow.addButton("Yes") { Gdx.app.exit() } - promptWindow.addButton("No") { - promptWindow.close() - } + promptWindow.addButton("No") { promptWindow.close() } // show the dialog - promptWindow.open (true) // true = always on top + promptWindow.open(true) // true = always on top } companion object { // this object must not be created multiple times - private var multiPlayerRefresher : Timer? = null + private var multiPlayerRefresher: Timer? = null } -} - +} \ No newline at end of file