parent
595089187d
commit
c14b461612
@ -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();
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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());
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
Reference in New Issue
Block a user