Handle desync messages

Show them in the chat window and also in a toast during game play.
This commit is contained in:
Tom Pratt authored and Tom Pratt committed 2026-05-19 12:02:58 +02:00
1 parent abd324e98d
commit 117d1d71ac
7 files changed
+45 -1

No files matched your search

@@ -95,6 +95,12 @@ class NetplaySession(
)
val padBuffer = _padBuffer.asSharedFlow()
private val _desyncMessages = MutableSharedFlow<NetplayMessage.Desync>(
extraBufferCapacity = 32,
onBufferOverflow = BufferOverflow.DROP_OLDEST
)
val desyncMessages = _desyncMessages.asSharedFlow()
private val _saveTransferProgress = MutableStateFlow<SaveTransferProgress?>(null)
val saveTransferProgress = _saveTransferProgress.asStateFlow()
@@ -148,6 +154,7 @@ class NetplaySession(
game.map { NetplayMessage.GameChanged(it) },
hostInputAuthorityEnabled.map { NetplayMessage.HostInputAuthorityChanged(it) },
padBuffer.map { NetplayMessage.BufferChanged(it) },
desyncMessages,
)
private fun releaseNativeResources() {
@@ -236,6 +243,11 @@ class NetplaySession(
_padBuffer.tryEmit(buffer)
}
@Keep
fun onDesync(frame: Int, player: String) {
_desyncMessages.tryEmit(NetplayMessage.Desync(player, frame))
}
@Keep
fun onShowChunkedProgressDialog(title: String, dataSize: Long, playerIds: IntArray) {
val players = _players.replayCache.firstOrNull()
@@ -26,4 +26,9 @@ sealed class NetplayMessage {
override fun message(context: Context) =
context.getString(R.string.netplay_message_buffer_changed, buffer)
}
class Desync(private val player: String, private val frame: Int) : NetplayMessage() {
override fun message(context: Context) =
context.getString(R.string.netplay_message_desync, player, frame)
}
}
@@ -9,9 +9,12 @@ import android.view.LayoutInflater
import android.view.SurfaceHolder
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
import org.dolphinemu.dolphinemu.NativeLibrary
import org.dolphinemu.dolphinemu.activities.EmulationActivity
@@ -231,6 +234,10 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
netplaySession.stopGame.first()
stopEmulation()
}
netplaySession
.desyncMessages
.onEach { Toast.makeText(requireContext(), it.message(requireContext()), Toast.LENGTH_SHORT).show() }
.launchIn(lifecycleScope)
NativeLibrary.RunNetPlay(
paths,
riivolution,
@@ -1002,6 +1002,7 @@ It can efficiently compress both junk data and encrypted Wii data.
<string name="netplay_message_game_changed">Game changed to %1$s</string>
<string name="netplay_message_buffer_changed">Buffer size changed to %1$d</string>
<string name="netplay_message_host_input_authority_changed">"Host input authority %1$s"</string>
<string name="netplay_message_desync">Possible desync detected: %1$s might have desynced at frame %2$d</string>
<string name="netplay_game_label">Game</string>
<string name="netplay_players_label">Players</string>
<string name="netplay_players_name">Name</string>