fix ra init on android (#963)

* fix ra init on android

* more

* more
This commit is contained in:
Logan McNaughton
2026-05-27 15:39:37 +02:00
committed by GitHub
parent dc6138076f
commit 81a3cea9c7
3 changed files with 41 additions and 35 deletions
+2 -1
View File
@@ -327,7 +327,8 @@ static void event_handler(const rc_client_event_t *event, rc_client_t *client) {
void ra_init_client(bool hardcore, bool challenge, bool leaderboard) {
// Create the client instance (using a global variable simplifies this
// example)
g_client = rc_client_create(read_memory, server_call);
if (!g_client)
g_client = rc_client_create(read_memory, server_call);
g_rdram = NULL;
g_rdram_size = 0;
+7 -3
View File
@@ -51,7 +51,7 @@ pub async fn run_game(
device: &mut Device,
rom_contents: &[u8],
game_settings: ui::GameSettings,
discord_rich_presence: bool,
ra_config: retroachievements::RAConfig,
) {
device.cpu.overclock = game_settings.overclock;
if game_settings.disable_expansion_pak {
@@ -74,8 +74,12 @@ pub async fn run_game(
ui::input::init(&mut device.ui);
// must be after video init
let (discord_watch_tx, discord_handle) =
retroachievements::load_game(rom_contents, rom_contents.len(), discord_rich_presence).await;
let (discord_watch_tx, discord_handle) = if ra_config.enabled && device.netplay.is_none() {
retroachievements::load_game(rom_contents, rom_contents.len(), ra_config.rich_presence)
.await
} else {
(None, None)
};
mi::init(device);
pif::init(device);
+32 -31
View File
@@ -156,11 +156,10 @@ pub async fn run(args: Args, arg_count: usize) -> std::io::Result<()> {
let mut shutdown_tx = None;
let mut usb_handle = None;
let rich_presence = if let Some(peer_addr) = args.netplay_peer_addr
if let Some(peer_addr) = args.netplay_peer_addr
&& let Some(player_number) = args.netplay_player_number
{
device.netplay = Some(netplay::init(peer_addr.parse().unwrap(), player_number));
false
} else {
for i in 0..4 {
if device.ui.config.input.transfer_pak[i]
@@ -176,39 +175,39 @@ pub async fn run(args: Args, arg_count: usize) -> std::io::Result<()> {
if device.ui.config.emulation.usb {
(shutdown_tx, usb_handle, device.ui.usb) = ui::usb::init();
}
}
let file_path = dirs.config_dir.join("retroachievements.json");
if let ra_config = std::fs::read(&file_path).unwrap_or_default()
&& let ra_config =
serde_json::from_slice::<retroachievements::RAConfig>(ra_config.as_ref())
.unwrap_or_default()
&& (ra_config.enabled || args.ra_username.is_some())
{
let username = args.ra_username.unwrap_or(ra_config.username);
retroachievements::init_client(
if cfg!(ra_hardcore_enabled) {
ra_config.hardcore
} else {
false
},
ra_config.challenge,
ra_config.leaderboard,
);
let (tx, rx) = tokio::sync::oneshot::channel::<bool>();
if let Some(password) = args.ra_password {
retroachievements::login_user(username, password, tx);
} else if !ra_config.token.is_empty() {
retroachievements::login_token_user(username, ra_config.token, tx);
let file_path = dirs.config_dir.join("retroachievements.json");
let ra_config = if let ra_config = std::fs::read(&file_path).unwrap_or_default()
&& let ra_config =
serde_json::from_slice::<retroachievements::RAConfig>(ra_config.as_ref())
.unwrap_or_default()
&& (ra_config.enabled || args.ra_username.is_some())
{
let username = args.ra_username.unwrap_or(ra_config.username.clone());
retroachievements::init_client(
if cfg!(ra_hardcore_enabled) {
ra_config.hardcore
} else {
tx.send(false).unwrap();
}
false
},
ra_config.challenge,
ra_config.leaderboard,
);
rx.await.unwrap();
ra_config.rich_presence
let (tx, rx) = tokio::sync::oneshot::channel::<bool>();
if let Some(password) = args.ra_password {
retroachievements::login_user(username, password, tx);
} else if !ra_config.token.is_empty() {
retroachievements::login_token_user(username, ra_config.token.clone(), tx);
} else {
false
tx.send(false).unwrap();
}
rx.await.unwrap();
ra_config
} else {
retroachievements::RAConfig::default()
};
device::run_game(
@@ -220,10 +219,12 @@ pub async fn run(args: Args, arg_count: usize) -> std::io::Result<()> {
cheats,
load_savestate_slot: args.load_state,
},
rich_presence,
ra_config,
)
.await;
// on Android, the client is shut down in the app_window function
#[cfg(not(target_os = "android"))]
retroachievements::shutdown_client();
if device.netplay.is_some() {