diff --git a/parallel-rdp/interface.cpp b/parallel-rdp/interface.cpp index f4ad2e09..20f713a5 100644 --- a/parallel-rdp/interface.cpp +++ b/parallel-rdp/interface.cpp @@ -818,8 +818,9 @@ static void update_leaderboard_tracker() { message += leaderboard_tracker.second; message += '\n'; } - leaderboard_tracker_image = - create_message_image(wsi->get_device(), 0, message_font, message.c_str()); + leaderboard_tracker_image = create_message_image( + wsi->get_device(), 0, achievement_challenge_indicator_font, + message.c_str()); } void achievement_challenge_indicator_add(const char *achievement_title) { @@ -838,18 +839,18 @@ void achievement_challenge_indicator_remove(const char *achievement_title) { void achievement_progress_add(const char *achievement_title, const char *progress) { - char message[512]; - snprintf(message, sizeof(message), "%s: %s", achievement_title, progress); + std::string message = std::format("{}: {}", achievement_title, progress); achievement_progress_indicator_image = - create_message_image(wsi->get_device(), 0, message_font, message); + create_message_image(wsi->get_device(), 0, message_font, message.c_str()); } -void achievement_progress_remove(const char *achievement_title) { +void achievement_progress_remove() { achievement_progress_indicator_image = Vulkan::ImageHandle(); } -void leaderboard_tracker_add(uint32_t id, const char *display) { - std::string message = display; +void leaderboard_tracker_add(uint32_t id, const char *title, + const char *display) { + std::string message = std::format("{}: {}", title, display); leaderboard_trackers[id] = message; update_leaderboard_tracker(); } diff --git a/parallel-rdp/interface.hpp b/parallel-rdp/interface.hpp index 46290674..f1c4aaee 100644 --- a/parallel-rdp/interface.hpp +++ b/parallel-rdp/interface.hpp @@ -55,8 +55,9 @@ void achievement_challenge_indicator_add(const char *achievement_title); void achievement_challenge_indicator_remove(const char *achievement_title); void achievement_progress_add(const char *achievement_title, const char *progress); -void achievement_progress_remove(const char *achievement_title); -void leaderboard_tracker_add(uint32_t id, const char *display); +void achievement_progress_remove(); +void leaderboard_tracker_add(uint32_t id, const char *title, + const char *display); void leaderboard_tracker_remove(uint32_t id); #ifdef __cplusplus diff --git a/retroachievements/retroachievements.c b/retroachievements/retroachievements.c index 29432d7a..f9e92f68 100644 --- a/retroachievements/retroachievements.c +++ b/retroachievements/retroachievements.c @@ -24,6 +24,7 @@ static bool g_leaderboard = false; static const char *g_username = NULL; static const char *g_token = NULL; static char load_game_error_message[512]; +static rc_client_leaderboard_list_t *g_leaderboard_list = NULL; static uint32_t read_memory(uint32_t address, uint8_t *buffer, uint32_t num_bytes, rc_client_t *client) { @@ -129,6 +130,9 @@ static void load_game_callback(int result, const char *error_message, rc_client_set_hardcore_enabled(client, false); } + g_leaderboard_list = rc_client_create_leaderboard_list( + client, RC_CLIENT_LEADERBOARD_LIST_GROUPING_NONE); + g_game_loaded = true; notify_load_game(userdata); } @@ -179,22 +183,6 @@ void ra_set_dmem(const uint8_t *dmem, size_t dmem_size) { g_dmem_size = dmem_size; } -static void leaderboard_started(const rc_client_leaderboard_t *leaderboard) { - char buffer[512]; - - snprintf(buffer, sizeof(buffer), "Leaderboard started: %s", - leaderboard->title); - rdp_onscreen_message(buffer); -} - -static void leaderboard_failed(const rc_client_leaderboard_t *leaderboard) { - char buffer[512]; - - snprintf(buffer, sizeof(buffer), "Leaderboard failed: %s", - leaderboard->title); - rdp_onscreen_message(buffer); -} - static void leaderboard_submitted(const rc_client_leaderboard_t *leaderboard) { char buffer[512]; @@ -238,18 +226,27 @@ static void server_error(const rc_client_server_error_t *server_error) { rdp_onscreen_message(buffer); } +static const char *get_leaderboard_title(const char *display) { + for (uint32_t i = 0; i < g_leaderboard_list->num_buckets; i++) { + for (uint32_t j = 0; j < g_leaderboard_list->buckets[i].num_leaderboards; + j++) { + if (g_leaderboard_list->buckets[i].leaderboards[j]->tracker_value == + display) { + return g_leaderboard_list->buckets[i].leaderboards[j]->title; + } + } + } + return NULL; +} + static void event_handler(const rc_client_event_t *event, rc_client_t *client) { switch (event->type) { case RC_CLIENT_EVENT_ACHIEVEMENT_TRIGGERED: achievement_triggered(event->achievement); break; case RC_CLIENT_EVENT_LEADERBOARD_STARTED: - if (g_leaderboard) - leaderboard_started(event->leaderboard); break; case RC_CLIENT_EVENT_LEADERBOARD_FAILED: - if (g_leaderboard) - leaderboard_failed(event->leaderboard); break; case RC_CLIENT_EVENT_LEADERBOARD_SUBMITTED: if (g_leaderboard) @@ -268,7 +265,7 @@ static void event_handler(const rc_client_event_t *event, rc_client_t *client) { event->achievement->measured_progress); break; case RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_HIDE: - achievement_progress_remove(event->achievement->title); + achievement_progress_remove(); break; case RC_CLIENT_EVENT_ACHIEVEMENT_PROGRESS_INDICATOR_UPDATE: achievement_progress_add(event->achievement->title, @@ -276,8 +273,10 @@ static void event_handler(const rc_client_event_t *event, rc_client_t *client) { break; case RC_CLIENT_EVENT_LEADERBOARD_TRACKER_SHOW: if (g_leaderboard) - leaderboard_tracker_add(event->leaderboard_tracker->id, - event->leaderboard_tracker->display); + leaderboard_tracker_add( + event->leaderboard_tracker->id, + get_leaderboard_title(event->leaderboard_tracker->display), + event->leaderboard_tracker->display); break; case RC_CLIENT_EVENT_LEADERBOARD_TRACKER_HIDE: if (g_leaderboard) @@ -285,8 +284,10 @@ static void event_handler(const rc_client_event_t *event, rc_client_t *client) { break; case RC_CLIENT_EVENT_LEADERBOARD_TRACKER_UPDATE: if (g_leaderboard) - leaderboard_tracker_add(event->leaderboard_tracker->id, - event->leaderboard_tracker->display); + leaderboard_tracker_add( + event->leaderboard_tracker->id, + get_leaderboard_title(event->leaderboard_tracker->display), + event->leaderboard_tracker->display); break; case RC_CLIENT_EVENT_LEADERBOARD_SCOREBOARD: break; @@ -333,6 +334,10 @@ bool ra_get_hardcore() { } void ra_shutdown_client() { + if (g_leaderboard_list) { + rc_client_destroy_leaderboard_list(g_leaderboard_list); + g_leaderboard_list = NULL; + } if (g_client) { // Release resources associated to the client instance rc_client_destroy(g_client); diff --git a/src/device.rs b/src/device.rs index 66db74cd..c4895556 100644 --- a/src/device.rs +++ b/src/device.rs @@ -90,6 +90,7 @@ pub fn run_game(device: &mut Device, rom_contents: &[u8], game_settings: ui::gui cpu::run(device); ui::storage::write_saves(device); + retroachievements::shutdown_client(); ui::input::close(&mut device.ui); ui::audio::close(&mut device.ui); ui::video::close(&device.ui); diff --git a/src/main.rs b/src/main.rs index 24a05530..be3cd0f6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -224,7 +224,6 @@ async fn main() -> std::io::Result<()> { load_savestate_slot: args.load_state, }, ); - retroachievements::shutdown_client(); if device.netplay.is_some() { netplay::close(&mut device); diff --git a/src/ui/gui.rs b/src/ui/gui.rs index 4009434e..fe84e3c7 100644 --- a/src/ui/gui.rs +++ b/src/ui/gui.rs @@ -234,7 +234,9 @@ fn controller_window( if dinput { command.arg("--use-dinput"); } - command.status().unwrap(); + if !command.status().unwrap().success() { + eprintln!("Failed to configure input profile"); + } let game_ui = ui::Ui::new(); update_input_profiles(&weak_app, &game_ui.config); }); @@ -387,7 +389,14 @@ pub fn run_rom( } } - command.arg(file_path.to_str().unwrap()).status().unwrap(); + if !command + .arg(file_path.to_str().unwrap()) + .status() + .unwrap() + .success() + { + eprintln!("Failed to run game"); + } let _ = std::fs::remove_file(cheats_path.to_str().unwrap()); diff --git a/src/ui/input.rs b/src/ui/input.rs index a989a611..fb957137 100644 --- a/src/ui/input.rs +++ b/src/ui/input.rs @@ -543,7 +543,7 @@ pub fn configure_input_profile(ui: &mut ui::Ui, profile: String, dinput: bool, d if !unsafe { sdl3_sys::render::SDL_CreateWindowAndRenderer( title.as_ptr(), - 640, + 852, 480, sdl3_sys::video::SDL_WindowFlags(0), &mut window,