From 84de1ce2f26bd267fc0e1b336d14014267ab427e Mon Sep 17 00:00:00 2001 From: Jamiras Date: Sun, 10 Nov 2019 19:42:00 -0700 Subject: [PATCH] display Unofficial and Unsupported achievement states --- cheevos-new/cheevos.c | 121 ++++++++++++++-------------------- intl/msg_hash_us.h | 8 +++ menu/cbs/menu_cbs_get_value.c | 36 ++++++++++ menu/cbs/menu_cbs_sublabel.c | 2 + msg_hash.h | 2 + 5 files changed, 96 insertions(+), 73 deletions(-) diff --git a/cheevos-new/cheevos.c b/cheevos-new/cheevos.c index 829221c758..3e5e347c1c 100644 --- a/cheevos-new/cheevos.c +++ b/cheevos-new/cheevos.c @@ -433,9 +433,17 @@ static int rcheevos_parse(const char* json) if (res < 0) { - CHEEVOS_ERR(RCHEEVOS_TAG "Error in cheevo memaddr %s: %s", - cheevo->info->memaddr, rcheevos_rc_error(res)); - goto error; + snprintf(buffer, sizeof(buffer), "Error in achievement %d \"%s\": %s", + cheevo->info->id, cheevo->info->title, rcheevos_rc_error(res)); + + if (settings->bools.cheevos_verbose_enable) + runloop_msg_queue_push(buffer, 0, 4 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + + CHEEVOS_ERR(RCHEEVOS_TAG "%s: mem %s\n", buffer, cheevo->info->memaddr); + cheevo->trigger = NULL; + cheevo->active = 0; + cheevo->last = 1; + continue; } cheevo->trigger = (rc_trigger_t*)calloc(1, res); @@ -832,6 +840,38 @@ 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) +{ + bool active = false; + + if (cheevo->trigger == NULL) + { + enum_idx = MENU_ENUM_LABEL_CHEEVOS_UNSUPPORTED_ENTRY; + active = true; /* not really, but forces the badge to appear disabled */ + } + 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; + } + + menu_entries_append_enum(info->list, cheevo->info->title, + cheevo->info->description, enum_idx, + MENU_SETTINGS_CHEEVOS_START + idx, 0, 0); + + set_badge_info(&badges_ctx, idx, cheevo->info->badge, active); +} +#endif + void rcheevos_populate_menu(void* data) { #ifdef HAVE_MENU @@ -860,86 +900,21 @@ void rcheevos_populate_menu(void* data) } cheevo = rcheevos_locals.core; - - for (i = 0, count = rcheevos_locals.patchdata.core_count; i < count; i++, cheevo++) + for (count = rcheevos_locals.patchdata.core_count; count > 0; count--) { - if (!(cheevo->active & RCHEEVOS_ACTIVE_HARDCORE)) - { - menu_entries_append_enum(info->list, cheevo->info->title, - cheevo->info->description, - MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - - set_badge_info(&badges_ctx, i, cheevo->info->badge, - (cheevo->active & RCHEEVOS_ACTIVE_HARDCORE)); - } - else if (!(cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->info->title, - cheevo->info->description, - MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - - set_badge_info(&badges_ctx, i, cheevo->info->badge, - (cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE)); - } - else - { - menu_entries_append_enum(info->list, cheevo->info->title, - cheevo->info->description, - MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - - set_badge_info(&badges_ctx, i, cheevo->info->badge, - (cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE)); - } + rcheevos_append_menu_achievement(info, i++, MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, cheevo++); } if (settings->bools.cheevos_test_unofficial) { cheevo = rcheevos_locals.unofficial; - - for (i = 0, count = rcheevos_locals.patchdata.unofficial_count; i < count; i++, cheevo++) + for (count = rcheevos_locals.patchdata.unofficial_count; count > 0; count--) { - if (!(cheevo->active & RCHEEVOS_ACTIVE_HARDCORE)) - { - menu_entries_append_enum(info->list, cheevo->info->title, - cheevo->info->description, - MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - - set_badge_info(&badges_ctx, i, cheevo->info->badge, - (cheevo->active & RCHEEVOS_ACTIVE_HARDCORE)); - } - else if (!(cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE)) - { - menu_entries_append_enum(info->list, cheevo->info->title, - cheevo->info->description, - MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - - set_badge_info(&badges_ctx, i, cheevo->info->badge, - (cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE)); - } - else - { - menu_entries_append_enum(info->list, cheevo->info->title, - cheevo->info->description, - MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY, - MENU_SETTINGS_CHEEVOS_START + i, 0, 0); - - set_badge_info(&badges_ctx, i, cheevo->info->badge, - (cheevo->active & RCHEEVOS_ACTIVE_SOFTCORE)); - } + rcheevos_append_menu_achievement(info, i++, MENU_ENUM_LABEL_CHEEVOS_UNOFFICIAL_ENTRY, cheevo++); } } - count = rcheevos_locals.patchdata.core_count; - - if (settings->bools.cheevos_test_unofficial) - count += rcheevos_locals.patchdata.unofficial_count; - - if (count == 0) + if (i == 0) { menu_entries_append_enum(info->list, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NO_ACHIEVEMENTS_TO_DISPLAY), diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 715aca426b..ab21a2ad3d 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -552,6 +552,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_LOCKED_ENTRY, "Locked" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNSUPPORTED_ENTRY, + "Unsupported" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_SETTINGS, "RetroAchievements" @@ -560,6 +564,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL, "Test Unofficial Achievements" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_UNOFFICIAL_ENTRY, + "Unofficial" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCKED_ACHIEVEMENTS, "Unlocked Achievements:" diff --git a/menu/cbs/menu_cbs_get_value.c b/menu/cbs/menu_cbs_get_value.c index c7819a5102..934b44ba37 100644 --- a/menu/cbs/menu_cbs_get_value.c +++ b/menu/cbs/menu_cbs_get_value.c @@ -109,6 +109,34 @@ 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( + 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_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, @@ -1714,6 +1742,14 @@ int menu_cbs_init_bind_get_string_representation(menu_file_list_cbs_t *cbs, 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); + return 0; case MENU_ENUM_LABEL_LOAD_CONTENT_HISTORY: case MENU_ENUM_LABEL_SYSTEM_INFORMATION: BIND_ACTION_GET_VALUE(cbs, diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index cc63d290d7..d687a1c0ba 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -2516,6 +2516,8 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY: case MENU_ENUM_LABEL_CHEEVOS_UNLOCKED_ENTRY_HARDCORE: case MENU_ENUM_LABEL_CHEEVOS_LOCKED_ENTRY: + case MENU_ENUM_LABEL_CHEEVOS_UNSUPPORTED_ENTRY: + case MENU_ENUM_LABEL_CHEEVOS_UNOFFICIAL_ENTRY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_entry); break; #ifdef HAVE_NETWORKING diff --git a/msg_hash.h b/msg_hash.h index 3a83ba9cc4..0cc5fde479 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -649,6 +649,8 @@ enum msg_hash_enums MENU_LABEL(CHEEVOS_UNLOCKED_ENTRY), MENU_LABEL(CHEEVOS_UNLOCKED_ENTRY_HARDCORE), MENU_LABEL(CHEEVOS_LOCKED_ENTRY), + MENU_LABEL(CHEEVOS_UNSUPPORTED_ENTRY), + MENU_LABEL(CHEEVOS_UNOFFICIAL_ENTRY), MENU_ENUM_LABEL_SHADER_PARAMETERS_ENTRY, MENU_ENUM_LABEL_RDB_ENTRY,