chore: Renamed OnlineMultiplayer -> Multiplayer. That's the default MP, local MP is called 'hotseat'.

This commit is contained in:
yairm210 2024-08-08 00:52:00 +03:00
parent cdf6d6169e
commit 25f2e03a66
12 changed files with 53 additions and 53 deletions

View File

@ -11,7 +11,7 @@ import com.unciv.logic.IsPartOfGameInfoSerialization
import com.unciv.logic.UncivShowableException
import com.unciv.logic.civilization.PlayerType
import com.unciv.logic.files.UncivFiles
import com.unciv.logic.multiplayer.OnlineMultiplayer
import com.unciv.logic.multiplayer.Multiplayer
import com.unciv.models.metadata.GameSettings
import com.unciv.models.ruleset.RulesetCache
import com.unciv.models.skins.SkinCache
@ -67,7 +67,7 @@ open class UncivGame(val isConsoleMode: Boolean = false) : Game(), PlatformSpeci
lateinit var settings: GameSettings
lateinit var musicController: MusicController
lateinit var onlineMultiplayer: OnlineMultiplayer
lateinit var onlineMultiplayer: Multiplayer
lateinit var files: UncivFiles
var isTutorialTaskCollapsed = false
@ -120,7 +120,7 @@ open class UncivGame(val isConsoleMode: Boolean = false) : Game(), PlatformSpeci
musicController = MusicController() // early, but at this point does only copy volume from settings
installAudioHooks()
onlineMultiplayer = OnlineMultiplayer()
onlineMultiplayer = Multiplayer()
Concurrency.run {
// Check if the server is available in case the feature set has changed

View File

@ -38,10 +38,10 @@ import kotlinx.serialization.json.Json
* - https://github.com/hopfenspace/runciv
*
* A particular server may implement multiple interfaces simultaneously.
* There's a server version check in the constructor of [OnlineMultiplayer]
* There's a server version check in the constructor of [Multiplayer]
* which handles API auto-detection. The precedence of various APIs is
* determined by that function:
* @see [OnlineMultiplayer.determineServerAPI]
* @see [Multiplayer.determineServerAPI]
*/
enum class ApiVersion {
APIv0, APIv1, APIv2;

View File

@ -10,7 +10,7 @@ import com.unciv.logic.event.EventBus
import com.unciv.logic.multiplayer.storage.FileStorageRateLimitReached
import com.unciv.logic.multiplayer.storage.MultiplayerAuthException
import com.unciv.logic.multiplayer.storage.MultiplayerFileNotFoundException
import com.unciv.logic.multiplayer.storage.OnlineMultiplayerServer
import com.unciv.logic.multiplayer.storage.MultiplayerServer
import com.unciv.models.metadata.GameSettings
import com.unciv.ui.components.extensions.isLargerThan
import com.unciv.utils.Concurrency
@ -38,9 +38,9 @@ private val FILE_UPDATE_THROTTLE_PERIOD = Duration.ofSeconds(60)
*
* See the file of [com.unciv.logic.multiplayer.HasMultiplayerGameName] for all available [EventBus] events.
*/
class OnlineMultiplayer {
class Multiplayer {
/** Handles SERVER DATA only */
val multiplayerServer = OnlineMultiplayerServer()
val multiplayerServer = MultiplayerServer()
/** Handles LOCAL FILES only */
val multiplayerFiles = MultiplayerFiles()
@ -49,7 +49,7 @@ class OnlineMultiplayer {
private val lastAllGamesRefresh: AtomicReference<Instant?> = AtomicReference()
private val lastCurGameRefresh: AtomicReference<Instant?> = AtomicReference()
val games: Set<OnlineMultiplayerGame> get() = multiplayerFiles.savedGames.values.toSet()
val games: Set<MultiplayerGame> get() = multiplayerFiles.savedGames.values.toSet()
val multiplayerGameUpdater: Job
init {
@ -79,7 +79,7 @@ class OnlineMultiplayer {
}.launchIn(CoroutineScope(Dispatcher.DAEMON))
}
private fun getCurrentGame(): OnlineMultiplayerGame? {
private fun getCurrentGame(): MultiplayerGame? {
val gameInfo = UncivGame.Current.gameInfo
return if (gameInfo != null && gameInfo.gameParameters.isOnlineMultiplayer) {
multiplayerFiles.getGameByGameId(gameInfo.gameId)
@ -93,7 +93,7 @@ class OnlineMultiplayer {
*
* Fires: [MultiplayerGameUpdateStarted], [MultiplayerGameUpdated], [MultiplayerGameUpdateUnchanged], [MultiplayerGameUpdateFailed]
*/
fun requestUpdate(forceUpdate: Boolean = false, doNotUpdate: List<OnlineMultiplayerGame> = listOf()) {
fun requestUpdate(forceUpdate: Boolean = false, doNotUpdate: List<MultiplayerGame> = listOf()) {
Concurrency.run("Update all multiplayer games") {
val fileThrottleInterval = if (forceUpdate) Duration.ZERO else FILE_UPDATE_THROTTLE_PERIOD
// An exception only happens here if the files can't be listed, should basically never happen
@ -146,7 +146,7 @@ class OnlineMultiplayer {
* @throws MultiplayerAuthException if the authentication failed
* @return false if it's not the user's turn and thus resigning did not happen
*/
suspend fun resign(game: OnlineMultiplayerGame): Boolean {
suspend fun resign(game: MultiplayerGame): Boolean {
val preview = game.preview ?: throw game.error!!
// download to work with the latest game state
val gameInfo = multiplayerServer.tryDownloadGame(preview.gameId)
@ -181,7 +181,7 @@ class OnlineMultiplayer {
* @throws FileStorageRateLimitReached if the file storage backend can't handle any additional actions for a time
* @throws MultiplayerFileNotFoundException if the file can't be found
*/
suspend fun loadGame(game: OnlineMultiplayerGame) {
suspend fun loadGame(game: MultiplayerGame) {
val preview = game.preview ?: throw game.error!!
loadGame(preview.gameId)
}

View File

@ -12,7 +12,7 @@ import java.util.*
/** Files that are stored locally */
class MultiplayerFiles {
internal val files = UncivGame.Current.files
internal val savedGames: MutableMap<FileHandle, OnlineMultiplayerGame> = Collections.synchronizedMap(mutableMapOf())
internal val savedGames: MutableMap<FileHandle, MultiplayerGame> = Collections.synchronizedMap(mutableMapOf())
internal fun updateSavesFromFiles() {
val saves = files.getMultiplayerSaves()
@ -31,8 +31,8 @@ class MultiplayerFiles {
/**
* Deletes the game from disk, does not delete it remotely.
*/
fun deleteGame(onlineMultiplayerGame: OnlineMultiplayerGame) {
deleteGame(onlineMultiplayerGame.fileHandle)
fun deleteGame(multiplayerGame: MultiplayerGame) {
deleteGame(multiplayerGame.fileHandle)
}
private fun deleteGame(fileHandle: FileHandle) {
@ -56,15 +56,15 @@ class MultiplayerFiles {
private fun addGame(fileHandle: FileHandle, preview: GameInfoPreview? = null) {
debug("Adding game %s", fileHandle.name())
val game = OnlineMultiplayerGame(fileHandle, preview, if (preview != null) Instant.now() else null)
val game = MultiplayerGame(fileHandle, preview, if (preview != null) Instant.now() else null)
savedGames[fileHandle] = game
}
fun getGameByName(name: String): OnlineMultiplayerGame? {
fun getGameByName(name: String): MultiplayerGame? {
return savedGames.values.firstOrNull { it.name == name }
}
fun getGameByGameId(gameId: String): OnlineMultiplayerGame? {
fun getGameByGameId(gameId: String): MultiplayerGame? {
return savedGames.values.firstOrNull { it.preview?.gameId == gameId }
}
@ -72,14 +72,14 @@ class MultiplayerFiles {
/**
* Fires [MultiplayerGameNameChanged]
*/
fun changeGameName(game: OnlineMultiplayerGame, newName: String, onException: (Exception?)->Unit) {
fun changeGameName(game: MultiplayerGame, newName: String, onException: (Exception?)->Unit) {
debug("Changing name of game %s to", game.name, newName)
val oldPreview = game.preview ?: throw game.error!!
val oldLastUpdate = game.getLastUpdate()
val oldName = game.name
val newFileHandle = files.saveGame(oldPreview, newName, onException)
val newGame = OnlineMultiplayerGame(newFileHandle, oldPreview, oldLastUpdate)
val newGame = MultiplayerGame(newFileHandle, oldPreview, oldLastUpdate)
savedGames[newFileHandle] = newGame
savedGames.remove(game.fileHandle)

View File

@ -8,7 +8,7 @@ import com.unciv.logic.multiplayer.GameUpdateResult.Type.CHANGED
import com.unciv.logic.multiplayer.GameUpdateResult.Type.FAILURE
import com.unciv.logic.multiplayer.GameUpdateResult.Type.UNCHANGED
import com.unciv.logic.multiplayer.storage.FileStorageRateLimitReached
import com.unciv.logic.multiplayer.storage.OnlineMultiplayerServer
import com.unciv.logic.multiplayer.storage.MultiplayerServer
import com.unciv.ui.audio.SoundPlayer
import com.unciv.ui.components.extensions.isLargerThan
import com.unciv.utils.debug
@ -25,7 +25,7 @@ private const val DROPBOX_THROTTLE_PERIOD = 8L
/** @see getUpdateThrottleInterval */
private const val CUSTOM_SERVER_THROTTLE_PERIOD = 1L
class OnlineMultiplayerGame(
class MultiplayerGame(
val fileHandle: FileHandle,
var preview: GameInfoPreview? = null,
lastOnlineUpdate: Instant? = null
@ -107,7 +107,7 @@ class OnlineMultiplayerGame(
private suspend fun update(): GameUpdateResult {
val curPreview = if (preview != null) preview!! else loadPreviewFromFile()
val serverIdentifier = curPreview.gameParameters.multiplayerServerUrl
val newPreview = OnlineMultiplayerServer(serverIdentifier).tryDownloadGamePreview(curPreview.gameId)
val newPreview = MultiplayerServer(serverIdentifier).tryDownloadGamePreview(curPreview.gameId)
if (newPreview.turns == curPreview.turns && newPreview.currentPlayer == curPreview.currentPlayer) return GameUpdateResult(UNCHANGED, newPreview)
UncivGame.Current.files.saveGame(newPreview, fileHandle)
preview = newPreview
@ -138,7 +138,7 @@ class OnlineMultiplayerGame(
SoundPlayer.play(sound)
}
override fun equals(other: Any?): Boolean = other is OnlineMultiplayerGame && fileHandle == other.fileHandle
override fun equals(other: Any?): Boolean = other is MultiplayerGame && fileHandle == other.fileHandle
override fun hashCode(): Int = fileHandle.hashCode()
}
@ -157,5 +157,5 @@ private class GameUpdateResult private constructor(
* How often games can be checked for remote updates. More attempted checks within this time period will do nothing.
*/
private fun getUpdateThrottleInterval(): Duration {
return Duration.ofSeconds(if (OnlineMultiplayer.usesCustomServer()) CUSTOM_SERVER_THROTTLE_PERIOD else DROPBOX_THROTTLE_PERIOD)
return Duration.ofSeconds(if (Multiplayer.usesCustomServer()) CUSTOM_SERVER_THROTTLE_PERIOD else DROPBOX_THROTTLE_PERIOD)
}

View File

@ -19,7 +19,7 @@ import com.unciv.logic.multiplayer.ServerFeatureSet
* @see UncivGame.settings.multiplayer.server
*/
@Suppress("RedundantSuspendModifier") // Methods can take a long time, so force users to use them in a coroutine to not get ANRs on Android
class OnlineMultiplayerServer(
class MultiplayerServer(
val fileStorageIdentifier: String? = null,
private var authenticationHeader: Map<String, String>? = null
) {
@ -34,7 +34,7 @@ class OnlineMultiplayerServer(
return if (getServerUrl() == Constants.dropboxMultiplayerServer) DropBox
else UncivServerFileStorage.apply {
serverUrl = this@OnlineMultiplayerServer.getServerUrl()
serverUrl = this@MultiplayerServer.getServerUrl()
this.authHeader = authHeader
}
}

View File

@ -6,7 +6,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.ui.TextField
import com.unciv.UncivGame
import com.unciv.logic.files.IMediaFinder
import com.unciv.logic.multiplayer.OnlineMultiplayer
import com.unciv.logic.multiplayer.Multiplayer
import com.unciv.logic.multiplayer.storage.FileStorageRateLimitReached
import com.unciv.logic.multiplayer.storage.MultiplayerAuthException
import com.unciv.models.metadata.GameSettings
@ -106,7 +106,7 @@ private fun addMultiplayerServerOptions(
val connectionToServerButton = "Check connection to server".toTextButton()
val textToShowForOnlineMultiplayerAddress = if (OnlineMultiplayer.usesCustomServer()) {
val textToShowForOnlineMultiplayerAddress = if (Multiplayer.usesCustomServer()) {
settings.multiplayer.server
} else {
"https://"
@ -124,7 +124,7 @@ private fun addMultiplayerServerOptions(
// we can't trim on 'fixTextFieldUrlOnType' for reasons
settings.multiplayer.server = multiplayerServerTextField.text.trimEnd('/')
val isCustomServer = OnlineMultiplayer.usesCustomServer()
val isCustomServer = Multiplayer.usesCustomServer()
connectionToServerButton.isEnabled = isCustomServer
for (refreshSelect in toUpdate) refreshSelect.update(isCustomServer)
@ -326,7 +326,7 @@ private class RefreshSelect(
private fun getInitialOptions(extraCustomServerOptions: List<SelectItem<Duration>>, dropboxOptions: List<SelectItem<Duration>>): Iterable<SelectItem<Duration>> {
val customServerItems = (extraCustomServerOptions + dropboxOptions).toGdxArray()
val dropboxItems = dropboxOptions.toGdxArray()
return if (OnlineMultiplayer.usesCustomServer()) customServerItems else dropboxItems
return if (Multiplayer.usesCustomServer()) customServerItems else dropboxItems
}
private fun fixTextFieldUrlOnType(textField: TextField) {

View File

@ -3,8 +3,8 @@ package com.unciv.ui.screens.multiplayerscreens
import com.badlogic.gdx.Gdx
import com.unciv.Constants
import com.unciv.UncivGame
import com.unciv.logic.multiplayer.OnlineMultiplayer
import com.unciv.logic.multiplayer.OnlineMultiplayerGame
import com.unciv.logic.multiplayer.Multiplayer
import com.unciv.logic.multiplayer.MultiplayerGame
import com.unciv.models.translations.tr
import com.unciv.ui.components.extensions.formatShort
import com.unciv.ui.components.extensions.toCheckBox
@ -18,7 +18,7 @@ import java.time.Instant
object MultiplayerHelpers {
fun loadMultiplayerGame(screen: BaseScreen, selectedGame: OnlineMultiplayerGame) {
fun loadMultiplayerGame(screen: BaseScreen, selectedGame: MultiplayerGame) {
val loadingGamePopup = Popup(screen)
loadingGamePopup.addGoodSizedLabel("Loading latest game state...")
loadingGamePopup.open()
@ -35,16 +35,16 @@ object MultiplayerHelpers {
}
}
fun buildDescriptionText(onlineMultiplayerGame: OnlineMultiplayerGame): StringBuilder {
fun buildDescriptionText(multiplayerGame: MultiplayerGame): StringBuilder {
val descriptionText = StringBuilder()
val ex = onlineMultiplayerGame.error
val ex = multiplayerGame.error
if (ex != null) {
val (message) = LoadGameScreen.getLoadExceptionMessage(ex, "Error while refreshing:")
descriptionText.appendLine(message)
}
val lastUpdate = onlineMultiplayerGame.getLastUpdate()
val lastUpdate = multiplayerGame.getLastUpdate()
descriptionText.appendLine("Last refresh: [${Duration.between(lastUpdate, Instant.now()).formatShort()}] ago".tr())
val preview = onlineMultiplayerGame.preview
val preview = multiplayerGame.preview
if (preview?.currentPlayer != null) {
val currentTurnStartTime = Instant.ofEpochMilli(preview.currentTurnStartTime)
descriptionText.appendLine("Current Turn: [${preview.currentPlayer}] since [${Duration.between(currentTurnStartTime, Instant.now()).formatShort()}] ago".tr())
@ -53,7 +53,7 @@ object MultiplayerHelpers {
}
fun showDropboxWarning(screen: BaseScreen) {
if (!OnlineMultiplayer.usesDropbox() || UncivGame.Current.settings.multiplayer.hideDropboxWarning) return
if (!Multiplayer.usesDropbox() || UncivGame.Current.settings.multiplayer.hideDropboxWarning) return
val dropboxWarning = Popup(screen)
dropboxWarning.addGoodSizedLabel(

View File

@ -4,7 +4,7 @@ import com.badlogic.gdx.Gdx
import com.badlogic.gdx.scenes.scene2d.ui.Table
import com.badlogic.gdx.scenes.scene2d.ui.TextButton
import com.unciv.Constants
import com.unciv.logic.multiplayer.OnlineMultiplayerGame
import com.unciv.logic.multiplayer.MultiplayerGame
import com.unciv.logic.multiplayer.storage.MultiplayerAuthException
import com.unciv.models.translations.tr
import com.unciv.ui.components.widgets.UncivTextField
@ -27,7 +27,7 @@ import com.unciv.utils.launchOnGLThread
import com.unciv.ui.components.widgets.AutoScrollPane as ScrollPane
class MultiplayerScreen : PickerScreen() {
private var selectedGame: OnlineMultiplayerGame? = null
private var selectedGame: MultiplayerGame? = null
private val copyGameIdButton = createCopyGameIdButton()
private val resignButton = createResignButton()
@ -127,7 +127,7 @@ class MultiplayerScreen : PickerScreen() {
* Helper function to decrease indentation
* Turns the current playerCiv into an AI civ and uploads the game afterwards.
*/
private fun resign(onlineMultiplayerGame: OnlineMultiplayerGame) {
private fun resign(multiplayerGame: MultiplayerGame) {
//Create a popup
val popup = Popup(this)
popup.addGoodSizedLabel(Constants.working).row()
@ -135,7 +135,7 @@ class MultiplayerScreen : PickerScreen() {
Concurrency.runOnNonDaemonThreadPool("Resign") {
try {
val resignSuccess = game.onlineMultiplayer.resign(onlineMultiplayerGame)
val resignSuccess = game.onlineMultiplayer.resign(multiplayerGame)
launchOnGLThread {
if (resignSuccess) {
@ -151,7 +151,7 @@ class MultiplayerScreen : PickerScreen() {
if (ex is MultiplayerAuthException) {
launchOnGLThread {
AuthPopup(this@MultiplayerScreen) { success ->
if (success) resign(onlineMultiplayerGame)
if (success) resign(multiplayerGame)
}.open(true)
}
return@runOnNonDaemonThreadPool

View File

@ -12,7 +12,7 @@ import com.unciv.logic.UncivShowableException
import com.unciv.logic.civilization.PlayerType
import com.unciv.logic.files.MapSaver
import com.unciv.logic.map.MapGeneratedMainType
import com.unciv.logic.multiplayer.OnlineMultiplayer
import com.unciv.logic.multiplayer.Multiplayer
import com.unciv.logic.multiplayer.storage.FileStorageRateLimitReached
import com.unciv.models.metadata.BaseRuleset
import com.unciv.models.metadata.GameSetupInfo
@ -115,7 +115,7 @@ class NewGameScreen(
if (gameSetupInfo.gameParameters.isOnlineMultiplayer) {
if (!checkConnectionToMultiplayerServer()) {
val noInternetConnectionPopup = Popup(this)
val label = if (OnlineMultiplayer.usesCustomServer()) "Couldn't connect to Multiplayer Server!" else "Couldn't connect to Dropbox!"
val label = if (Multiplayer.usesCustomServer()) "Couldn't connect to Multiplayer Server!" else "Couldn't connect to Dropbox!"
noInternetConnectionPopup.addGoodSizedLabel(label.tr()).row()
noInternetConnectionPopup.addCloseButton()
noInternetConnectionPopup.open()
@ -279,7 +279,7 @@ class NewGameScreen(
private fun checkConnectionToMultiplayerServer(): Boolean {
return try {
val multiplayerServer = UncivGame.Current.settings.multiplayer.server
val u = URL(if (OnlineMultiplayer.usesDropbox()) "https://content.dropboxapi.com" else multiplayerServer)
val u = URL(if (Multiplayer.usesDropbox()) "https://content.dropboxapi.com" else multiplayerServer)
val con = u.openConnection()
con.connectTimeout = 3000
con.connect()

View File

@ -15,7 +15,7 @@ import com.unciv.logic.multiplayer.MultiplayerGameNameChanged
import com.unciv.logic.multiplayer.MultiplayerGameUpdateEnded
import com.unciv.logic.multiplayer.MultiplayerGameUpdateStarted
import com.unciv.logic.multiplayer.MultiplayerGameUpdated
import com.unciv.logic.multiplayer.OnlineMultiplayerGame
import com.unciv.logic.multiplayer.MultiplayerGame
import com.unciv.logic.multiplayer.isUsersTurn
import com.unciv.models.translations.tr
import com.unciv.ui.components.extensions.setSize
@ -30,7 +30,7 @@ import kotlinx.coroutines.delay
class MultiplayerStatusButton(
screen: BaseScreen,
curGame: OnlineMultiplayerGame?
curGame: MultiplayerGame?
) : Button(BaseScreen.skin), Disposable {
private var curGameName = curGame?.name
private val loadingImage = LoadingImage(style = LoadingImage.Style(
@ -87,7 +87,7 @@ class MultiplayerStatusButton(
}
/** @return set of gameIds */
private fun findGamesToBeNotifiedAbout(games: Iterable<OnlineMultiplayerGame>): MutableSet<String> {
private fun findGamesToBeNotifiedAbout(games: Iterable<MultiplayerGame>): MutableSet<String> {
return games
.filter { it.name != curGameName }
.filter { it.preview?.isUsersTurn() == true }

View File

@ -1,7 +1,7 @@
package com.unciv.ui.screens.worldscreen.status
import com.unciv.UncivGame
import com.unciv.logic.multiplayer.OnlineMultiplayerGame
import com.unciv.logic.multiplayer.MultiplayerGame
import com.unciv.models.translations.tr
import com.unciv.ui.screens.multiplayerscreens.GameList
import com.unciv.ui.screens.multiplayerscreens.MultiplayerHelpers
@ -15,7 +15,7 @@ class MultiplayerStatusPopup(
) : Popup(screen) {
val pickerPane = PickerPane()
var selectedGame: OnlineMultiplayerGame? = null
var selectedGame: MultiplayerGame? = null
init {
val pickerCell = add()