diff --git a/cheevos-new/cheevos.c b/cheevos-new/cheevos.c index 47b3bc3b54..14147edd59 100644 --- a/cheevos-new/cheevos.c +++ b/cheevos-new/cheevos.c @@ -1133,30 +1133,84 @@ void rcheevos_reset_game(void) } #ifdef HAVE_MENU -static void rcheevos_append_menu_achievement(menu_displaylist_info_t* info, size_t idx, enum msg_hash_enums enum_idx, rcheevos_cheevo_t* cheevo) +void rcheevos_get_achievement_state(unsigned index, char *buffer, size_t buffer_size) { - bool active = false; + rcheevos_cheevo_t* cheevo; + enum msg_hash_enums enum_idx; + bool check_measured = false; + + if (index < rcheevos_locals.patchdata.core_count) + { + enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY; + cheevo = &rcheevos_locals.core[index]; + } + else + { + enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNOFFICIAL_ENTRY; + cheevo = &rcheevos_locals.unofficial[index - rcheevos_locals.patchdata.core_count]; + } + + if (!cheevo || !cheevo->trigger) + { + enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNSUPPORTED_ENTRY; + } + else + { + settings_t* settings = config_get_ptr(); + bool hardcore = settings->bools.cheevos_hardcore_mode_enable; + if (hardcore && !(cheevo->active & RCHEEVOS_ACTIVE_HARDCORE)) + enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE; + else if (!hardcore && !(cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE)) + enum_idx = MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY; + else + { + /* use either "Locked" for core or "Unofficial" for unofficial as set above */ + check_measured = true; + } + } + + strlcpy(buffer, msg_hash_to_str(enum_idx), buffer_size); + + if (check_measured) + { + const unsigned int target = cheevo->trigger->measured_target; + if (target > 0 && cheevo->trigger->measured_value > 0) + { + char measured_buffer[12]; + const unsigned int value = MIN(cheevo->trigger->measured_value, target); + const int percent = (int)(((unsigned long)value) * 100 / target); + + snprintf(measured_buffer, sizeof(measured_buffer), " - %d%%", percent); + strlcat(buffer, measured_buffer, buffer_size); + } + } +} + +static void rcheevos_append_menu_achievement(menu_displaylist_info_t* info, size_t idx, rcheevos_cheevo_t* cheevo) +{ + bool badge_grayscale; + + menu_entries_append_enum(info->list, cheevo->info->title, + cheevo->info->description, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, + MENU_SETTINGS_CHEEVOS_START + idx, 0, 0); if (!cheevo->trigger) { - enum_idx = MENU_ENUM_LABEL_CHEEVOS_UNSUPPORTED_ENTRY; - active = true; /* not really, but forces the badge to appear disabled */ + /* unsupported */ + badge_grayscale = true; + } + else if (!(cheevo->active & RCHEEVOS_ACTIVE_HARDCORE) || !(cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE)) + { + /* unlocked */ + badge_grayscale = false; } - else if (!(cheevo->active & RCHEEVOS_ACTIVE_HARDCORE)) - enum_idx = MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE; - else if (!(cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE)) - enum_idx = MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY; else { - /* use enum passed in - either "Locked" for core or "Unofficial" for unofficial */ - active = true; + /* locked */ + badge_grayscale = true; } - menu_entries_append_enum(info->list, cheevo->info->title, - cheevo->info->description, enum_idx, - MENU_SETTINGS_CHEEVOS_START + idx, 0, 0); - - cheevos_set_menu_badge(idx, cheevo->info->badge, active); + cheevos_set_menu_badge(idx, cheevo->info->badge, badge_grayscale); } #endif @@ -1193,7 +1247,7 @@ void rcheevos_populate_menu(void* data) cheevo = rcheevos_locals.core; for (count = rcheevos_locals.patchdata.core_count; count > 0; count--) { - rcheevos_append_menu_achievement(info, i++, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, cheevo++); + rcheevos_append_menu_achievement(info, i++, cheevo++); } if (cheevos_test_unofficial) @@ -1201,7 +1255,7 @@ void rcheevos_populate_menu(void* data) cheevo = rcheevos_locals.unofficial; for (count = rcheevos_locals.patchdata.unofficial_count; count > 0; count--) { - rcheevos_append_menu_achievement(info, i++, MENU_ENUM_LABEL_CHEEVOS_UNOFFICIAL_ENTRY, cheevo++); + rcheevos_append_menu_achievement(info, i++, cheevo++); } } diff --git a/cheevos-new/cheevos.h b/cheevos-new/cheevos.h index 036641e169..952a760436 100644 --- a/cheevos-new/cheevos.h +++ b/cheevos-new/cheevos.h @@ -45,6 +45,7 @@ bool rcheevos_load(const void *data); void rcheevos_reset_game(void); void rcheevos_populate_menu(void *data); +void rcheevos_get_achievement_state(unsigned index, char* buffer, size_t buffer_size); bool rcheevos_get_description(rcheevos_ctx_desc_t *desc); diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index bb9ab16fd4..e536eb24d8 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -48,6 +48,10 @@ #include "../../network/netplay/netplay.h" #endif +#ifdef HAVE_CHEEVOS +#include "../../cheevos-new/cheevos.h" +#endif + #ifndef BIND_ACTION_GET_VALUE #define BIND_ACTION_GET_VALUE(cbs, name) \ cbs->action_get_value = name; \ @@ -109,7 +113,7 @@ static void menu_action_setting_disp_set_label_cheat_num_passes( snprintf(s, len, "%u", cheat_manager_get_buf_size()); } -static void menu_action_setting_disp_set_label_cheevos_unsupported_entry( +static void menu_action_setting_disp_set_label_cheevos_entry( file_list_t* list, unsigned *w, unsigned type, unsigned i, const char *label, @@ -119,64 +123,8 @@ static void menu_action_setting_disp_set_label_cheevos_unsupported_entry( { *w = 19; strlcpy(s2, path, len2); - strlcpy(s, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNSUPPORTED_ENTRY), len); -} -static void menu_action_setting_disp_set_label_cheevos_unofficial_entry( - file_list_t* list, - unsigned *w, unsigned type, unsigned i, - const char *label, - char *s, size_t len, - const char *path, - char *s2, size_t len2) -{ - *w = 19; - strlcpy(s2, path, len2); - strlcpy(s, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNOFFICIAL_ENTRY), len); -} - -static void menu_action_setting_disp_set_label_cheevos_locked_entry( - file_list_t* list, - unsigned *w, unsigned type, unsigned i, - const char *label, - char *s, size_t len, - const char *path, - char *s2, size_t len2) -{ - *w = 19; - strlcpy(s2, path, len2); - strlcpy(s, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY), len); -} - -static void menu_action_setting_disp_set_label_cheevos_unlocked_entry( - file_list_t* list, - unsigned *w, unsigned type, unsigned i, - const char *label, - char *s, size_t len, - const char *path, - char *s2, size_t len2) -{ - *w = 19; - strlcpy(s2, path, len2); - strlcpy(s, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY), len); -} - -static void menu_action_setting_disp_set_label_cheevos_unlocked_entry_hardcore( - file_list_t* list, - unsigned *w, unsigned type, unsigned i, - const char *label, - char *s, size_t len, - const char *path, - char *s2, size_t len2) -{ - *w = 19; - strlcpy(s2, path, len2); - strlcpy(s, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ENTRY_HARDCORE), len); + rcheevos_get_achievement_state(type - MENU_SETTINGS_CHEEVOS_START, s, len); } static void menu_action_setting_disp_set_label_remap_file_load( @@ -1810,25 +1758,9 @@ int menu_cbs_init_bind_get_string_representation(menu_file_list_cbs_t *cbs, { switch (cbs->enum_idx) { - case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY: - BIND_ACTION_GET_VALUE(cbs, - menu_action_setting_disp_set_label_cheevos_unlocked_entry); - return 0; - case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE: - BIND_ACTION_GET_VALUE(cbs, - menu_action_setting_disp_set_label_cheevos_unlocked_entry_hardcore); - return 0; case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: BIND_ACTION_GET_VALUE(cbs, - menu_action_setting_disp_set_label_cheevos_locked_entry); - return 0; - case MENU_ENUM_LABEL_CHEEVOS_UNSUPPORTED_ENTRY: - BIND_ACTION_GET_VALUE(cbs, - menu_action_setting_disp_set_label_cheevos_unsupported_entry); - return 0; - case MENU_ENUM_LABEL_CHEEVOS_UNOFFICIAL_ENTRY: - BIND_ACTION_GET_VALUE(cbs, - menu_action_setting_disp_set_label_cheevos_unofficial_entry); + menu_action_setting_disp_set_label_cheevos_entry); return 0; case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: case MENU_ENUM_LABEL_SYSTEM_INFORMATION: @@ -1836,9 +1768,6 @@ int menu_cbs_init_bind_get_string_representation(menu_file_list_cbs_t *cbs, menu_action_setting_disp_set_label_menu_more); return 0; case MENU_ENUM_LABEL_ACHIEVEMENT_LIST: - BIND_ACTION_GET_VALUE(cbs, - menu_action_setting_disp_set_label_achievement_information); - return 0; case MENU_ENUM_LABEL_ACHIEVEMENT_LIST_HARDCORE: BIND_ACTION_GET_VALUE(cbs, menu_action_setting_disp_set_label_achievement_information);