From c092fa33e13251fd8cf307aa3fda3b236bc99d41 Mon Sep 17 00:00:00 2001 From: Jamiras <32680403+Jamiras@users.noreply.github.com> Date: Mon, 31 Jan 2022 08:33:23 -0700 Subject: [PATCH] add mastery placard (#13575) --- cheevos/cheevos.c | 60 ++++++++++++++++++++++++++++++++++++++++ cheevos/cheevos_client.c | 3 ++ cheevos/cheevos_locals.h | 3 ++ intl/msg_hash_us.h | 8 ++++++ msg_hash.h | 2 ++ 5 files changed, 76 insertions(+) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 5474b3b1e2..2a37f133ba 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -65,6 +65,7 @@ #include "../performance_counters.h" #include "../msg_hash.h" #include "../retroarch.h" +#include "../runtime_file.h" #include "../core.h" #include "../core_option_manager.h" @@ -1322,6 +1323,64 @@ static void rc_hash_handle_cd_close_track(void* track_handle) /* end hooks */ +void rcheevos_show_mastery_placard() +{ + const settings_t* settings = config_get_ptr(); + char title[256]; + + if (rcheevos_locals.game.mastery_placard_shown) + return; + + rcheevos_locals.game.mastery_placard_shown = true; + + snprintf(title, sizeof(title), + msg_hash_to_str(rcheevos_locals.hardcore_active ? MSG_CHEEVOS_MASTERED_GAME : MSG_CHEEVOS_COMPLETED_GAME), + rcheevos_locals.game.title); + title[sizeof(title) - 1] = '\0'; + CHEEVOS_LOG(RCHEEVOS_TAG "%s\n", title); + +#if defined (HAVE_GFX_WIDGETS) + if (gfx_widgets_ready()) + { + const bool content_runtime_log = settings->bools.content_runtime_log; + const bool content_runtime_log_aggr = settings->bools.content_runtime_log_aggregate; + char msg[128]; + size_t len; + + len = snprintf(msg, sizeof(msg), "%s", rcheevos_locals.username); + + if (len < sizeof(msg) - 12 && + (content_runtime_log || content_runtime_log_aggr)) + { + const char* content_path = path_get(RARCH_PATH_CONTENT); + const char* core_path = path_get(RARCH_PATH_CORE); + runtime_log_t* runtime_log = runtime_log_init( + content_path, core_path, + settings->paths.directory_runtime_log, + settings->paths.directory_playlist, + !content_runtime_log_aggr); + + if (runtime_log) + { + const runloop_state_t* runloop_state = runloop_state_get_ptr(); + runtime_log_add_runtime_usec(runtime_log, + runloop_state->core_runtime_usec); + + len += snprintf(msg + len, sizeof(msg) - len, " | "); + runtime_log_get_runtime_str(runtime_log, msg + len, sizeof(msg) - len); + msg[sizeof(msg) - 1] = '\0'; + + free(runtime_log); + } + } + + gfx_widgets_push_achievement(title, msg, rcheevos_locals.game.badge_name); + } + else +#endif + runloop_msg_queue_push(title, 0, 3 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); +} + static void rcheevos_show_game_placard() { char msg[256]; @@ -1794,6 +1853,7 @@ bool rcheevos_load(const void *data) rcheevos_locals.loaded = false; rcheevos_locals.game.id = -1; rcheevos_locals.game.console_id = 0; + rcheevos_locals.game.mastery_placard_shown = false; #ifdef HAVE_THREADS rcheevos_locals.queued_command = CMD_EVENT_NONE; #endif diff --git a/cheevos/cheevos_client.c b/cheevos/cheevos_client.c index b326d8e6bf..224829ad22 100644 --- a/cheevos/cheevos_client.c +++ b/cheevos/cheevos_client.c @@ -1746,6 +1746,9 @@ static void rcheevos_async_award_achievement_callback( CHEEVOS_LOG(RCHEEVOS_TAG "Achievement %u: %s\n", request->id, api_response.response.error_message); } + + if (api_response.achievements_remaining == 0) + rcheevos_show_mastery_placard(); } rc_api_destroy_award_achievement_response(&api_response); diff --git a/cheevos/cheevos_locals.h b/cheevos/cheevos_locals.h index 9cc07aad34..90d1e5613f 100644 --- a/cheevos/cheevos_locals.h +++ b/cheevos/cheevos_locals.h @@ -135,6 +135,7 @@ typedef struct rcheevos_game_info_t char* title; char badge_name[16]; char* hash; + bool mastery_placard_shown; rcheevos_hash_entry_t* hashes; @@ -194,6 +195,8 @@ void rcheevos_begin_load_state(enum rcheevos_load_state state); int rcheevos_end_load_state(void); bool rcheevos_load_aborted(void); +void rcheevos_show_mastery_placard(void); + #ifdef HAVE_THREADS #define CHEEVOS_LOCK(l) do { slock_lock(l); } while (0) #define CHEEVOS_UNLOCK(l) do { slock_unlock(l); } while (0) diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 5dde5fff9c..f16edf6fc7 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -12278,6 +12278,14 @@ MSG_HASH( MSG_CHEEVOS_HARDCORE_MODE_DISABLED_CHEAT, "A cheat was activated. Achievements Hardcore Mode disabled for the current session." ) +MSG_HASH( + MSG_CHEEVOS_MASTERED_GAME, + "Mastered %s" + ) +MSG_HASH( + MSG_CHEEVOS_COMPLETED_GAME, + "Completed %s" + ) MSG_HASH( MSG_RESAMPLER_QUALITY_LOWEST, "Lowest" diff --git a/msg_hash.h b/msg_hash.h index e8c7b62164..2a81cb43c9 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -3174,6 +3174,8 @@ enum msg_hash_enums MSG_CHEEVOS_LOAD_STATE_PREVENTED_BY_HARDCORE_MODE, MSG_CHEEVOS_HARDCORE_MODE_DISABLED, MSG_CHEEVOS_HARDCORE_MODE_DISABLED_CHEAT, + MSG_CHEEVOS_MASTERED_GAME, + MSG_CHEEVOS_COMPLETED_GAME, MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD_HMS, MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD_HM, MENU_ENUM_LABEL_VALUE_TIMEDATE_YMD,