display measured progress on locked achievements

This commit is contained in:
Jamiras 2020-02-24 07:15:37 -07:00
parent ad03277e3c
commit 1557b15c40
3 changed files with 79 additions and 95 deletions

View File

@ -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++);
}
}

View File

@ -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);

View File

@ -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);