From 91361f26de8f6a8b91452a2aac81a896c582037a Mon Sep 17 00:00:00 2001 From: David Skywalker Date: Mon, 14 Mar 2016 11:51:54 +0100 Subject: [PATCH] cheevos - added hardcore mode, in this mode savestates and rewind are disabled. --- cheevos.c | 18 +++++++++++++++++- command_event.c | 30 ++++++++++++++++++++++++++++++ configuration.c | 3 +++ configuration.h | 1 + intl/msg_hash_es.c | 2 ++ intl/msg_hash_us.c | 2 ++ menu/intl/menu_hash_es.c | 2 ++ menu/intl/menu_hash_us.c | 4 ++++ menu/menu_hash.h | 3 +++ menu/menu_setting.c | 14 ++++++++++++++ msg_hash.h | 2 ++ 11 files changed, 80 insertions(+), 1 deletion(-) diff --git a/cheevos.c b/cheevos.c index d13a0b13f0..b65435e764 100644 --- a/cheevos.c +++ b/cheevos.c @@ -27,6 +27,7 @@ #include "net_http_special.h" #include "configuration.h" #include "performance.h" +#include "msg_hash.h" #include "runloop.h" #include "libretro_version_1.h" @@ -239,6 +240,7 @@ static cheevos_locals_t cheevos_locals = {0}, }; +static bool last_hardcore_mode_value = false; /* forward declaration */ @@ -1369,7 +1371,7 @@ static void cheevos_unlocker(void *payload) snprintf( request, sizeof(request), "http://retroachievements.org/dorequest.php?r=awardachievement&u=%s&t=%s&a=%u&h=%d", - settings->cheevos.username, cheevos_locals.token, cheevo_id, 0 + settings->cheevos.username, cheevos_locals.token, cheevo_id, settings->cheevos.hardcore_mode_enable ); request[sizeof(request) - 1] = 0; @@ -2197,6 +2199,8 @@ bool cheevos_ctl(enum cheevos_ctl_state state, void *data) case CHEEVOS_CTL_LOAD: if (!cheevos_load((const void*)data)) return false; + + last_hardcore_mode_value = settings->cheevos.hardcore_mode_enable; break; case CHEEVOS_CTL_UNLOAD: if (!cheevos_locals.loaded) @@ -2216,6 +2220,18 @@ bool cheevos_ctl(enum cheevos_ctl_state state, void *data) if (!settings->cheevos.enable) return false; + /* just a quick check on hardcore last value to avoid cheat the score */ + if (last_hardcore_mode_value == false + && last_hardcore_mode_value != settings->cheevos.hardcore_mode_enable) + { + last_hardcore_mode_value = settings->cheevos.hardcore_mode_enable; + /* send reset core cmd to avoid any user savestate previusly loaded */ + event_cmd_ctl(EVENT_CMD_RESET, NULL); + + RARCH_LOG("%s\n", msg_hash_to_str(MSG_CHEEVOS_HARDCORE_MODE_ENABLE)); + runloop_msg_queue_push(msg_hash_to_str(MSG_CHEEVOS_HARDCORE_MODE_ENABLE), 0, 3 * 60, true); + } + cheevos_test_cheevo_set(&cheevos_locals.core); if (settings->cheevos.test_unofficial) diff --git a/command_event.c b/command_event.c index 82b120c6f5..79b4f026a5 100644 --- a/command_event.c +++ b/command_event.c @@ -465,6 +465,11 @@ static void event_load_auto_state(void) return; #endif +#ifdef HAVE_CHEEVOS + if (settings->cheevos.hardcore_mode_enable) + return; +#endif + if (!settings->savestate_auto_load) return; @@ -628,6 +633,11 @@ static bool event_save_auto_state(void) if (content_ctl(CONTENT_CTL_DOES_NOT_NEED_CONTENT, NULL)) return false; +#ifdef HAVE_CHEEVOS + if (settings->cheevos.hardcore_mode_enable) + return false; +#endif + fill_pathname_noext(savestate_name_auto, global->name.savestate, ".auto", sizeof(savestate_name_auto)); @@ -1029,6 +1039,12 @@ bool event_cmd_ctl(enum event_command cmd, void *data) if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) return false; #endif + +#ifdef HAVE_CHEEVOS + if (settings->cheevos.hardcore_mode_enable) + return false; +#endif + event_main_state(cmd); break; case EVENT_CMD_RESIZE_WINDOWED_SCALE: @@ -1070,6 +1086,11 @@ bool event_cmd_ctl(enum event_command cmd, void *data) core_ctl(CORE_CTL_RETRO_RESET, NULL); break; case EVENT_CMD_SAVE_STATE: +#ifdef HAVE_CHEEVOS + if (settings->cheevos.hardcore_mode_enable) + return false; +#endif + if (settings->savestate_auto_index) settings->state_slot++; @@ -1139,9 +1160,18 @@ bool event_cmd_ctl(enum event_command cmd, void *data) if (netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) return false; #endif +#ifdef HAVE_CHEEVOS + if (settings->cheevos.hardcore_mode_enable) + return false; +#endif + state_manager_event_deinit(); break; case EVENT_CMD_REWIND_INIT: +#ifdef HAVE_CHEEVOS + if (settings->cheevos.hardcore_mode_enable) + return false; +#endif #ifdef HAVE_NETPLAY if (!netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_DATA_INITED, NULL)) #endif diff --git a/configuration.c b/configuration.c index 7a2cdf8084..59960b4ff2 100644 --- a/configuration.c +++ b/configuration.c @@ -630,6 +630,7 @@ static void config_set_defaults(void) #ifdef HAVE_CHEEVOS settings->cheevos.enable = false; settings->cheevos.test_unofficial = false; + settings->cheevos.hardcore_mode_enable = false; *settings->cheevos.username = '\0'; *settings->cheevos.password = '\0'; #endif @@ -1512,6 +1513,7 @@ static bool config_load_file(const char *path, bool set_defaults) #ifdef HAVE_CHEEVOS CONFIG_GET_BOOL_BASE(conf, settings, cheevos.enable, "cheevos_enable"); CONFIG_GET_BOOL_BASE(conf, settings, cheevos.test_unofficial, "cheevos_test_unofficial"); + CONFIG_GET_BOOL_BASE(conf, settings, cheevos.hardcore_mode_enable, "cheevos_hardcore_mode_enable"); config_get_array(conf, "cheevos_username", settings->cheevos.username, sizeof(settings->cheevos.username)); config_get_array(conf, "cheevos_password", settings->cheevos.password, sizeof(settings->cheevos.password)); #endif @@ -2668,6 +2670,7 @@ bool config_save_file(const char *path) #ifdef HAVE_CHEEVOS config_set_bool(conf, "cheevos_enable", settings->cheevos.enable); config_set_bool(conf, "cheevos_test_unofficial", settings->cheevos.test_unofficial); + config_set_bool(conf, "cheevos_hardcore_mode_enable", settings->cheevos.hardcore_mode_enable); config_set_string(conf, "cheevos_username", settings->cheevos.username); config_set_string(conf, "cheevos_password", settings->cheevos.password); #endif diff --git a/configuration.h b/configuration.h index bdf9b5b5c8..afec18fd94 100644 --- a/configuration.h +++ b/configuration.h @@ -302,6 +302,7 @@ typedef struct settings { bool enable; bool test_unofficial; + bool hardcore_mode_enable; char username[32]; char password[32]; } cheevos; diff --git a/intl/msg_hash_es.c b/intl/msg_hash_es.c index 3c5e3d255f..7844ded498 100644 --- a/intl/msg_hash_es.c +++ b/intl/msg_hash_es.c @@ -194,6 +194,8 @@ const char *msg_hash_to_str_es(uint32_t hash) return "Rebobinando."; case MSG_REWIND_REACHED_END: return "Se ha llegado al final del búfer de rebobinado."; + case MSG_CHEEVOS_HARDCORE_MODE_ENABLE: + return "Modo Extremo Activado: guardar estado y reboninar se han desactivado."; case MSG_TASK_FAILED: return "Error"; case MSG_DOWNLOADING: diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 5f9b12b7ba..2a270639f2 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -181,6 +181,8 @@ const char *msg_hash_to_str_us(uint32_t hash) return "Rewinding."; case MSG_REWIND_REACHED_END: return "Reached end of rewind buffer."; + case MSG_CHEEVOS_HARDCORE_MODE_ENABLE: + return "Hardcore Mode Enabled: savestate & rewind were disabled."; case MSG_TASK_FAILED: return "Failed"; case MSG_DOWNLOADING: diff --git a/menu/intl/menu_hash_es.c b/menu/intl/menu_hash_es.c index 032e0514d3..260cc4b281 100644 --- a/menu/intl/menu_hash_es.c +++ b/menu/intl/menu_hash_es.c @@ -54,6 +54,8 @@ const char *menu_hash_to_str_es(uint32_t hash) return "Guardar configuración actual"; case MENU_LABEL_VALUE_STATE_SLOT: return "Ranura de guardado"; + case MENU_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE: + return "Modo Extremo"; case MENU_LABEL_VALUE_ACCOUNTS_CHEEVOS_SETTINGS: return "Cuenta Cheevos"; case MENU_LABEL_VALUE_ACCOUNTS_CHEEVOS_USERNAME: diff --git a/menu/intl/menu_hash_us.c b/menu/intl/menu_hash_us.c index d6e850af0e..b56d2bcc57 100644 --- a/menu/intl/menu_hash_us.c +++ b/menu/intl/menu_hash_us.c @@ -32,6 +32,8 @@ static const char *menu_hash_to_str_us_label(uint32_t hash) return "menu_throttle_framerate"; case MENU_LABEL_START_CORE: return "start_core"; + case MENU_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE: + return "cheevos_hardcore_mode_enable"; case MENU_LABEL_CHEEVOS_TEST_UNOFFICIAL: return "cheevos_test_unofficial"; case MENU_LABEL_CHEEVOS_ENABLE: @@ -738,6 +740,8 @@ const char *menu_hash_to_str_us(uint32_t hash) return "Menu Linear Filter"; case MENU_LABEL_VALUE_MENU_THROTTLE_FRAMERATE: return "Throttle Menu Framerate"; + case MENU_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE: + return "Hardcore Mode"; case MENU_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL: return "Test unofficial"; case MENU_LABEL_VALUE_CHEEVOS_SETTINGS: diff --git a/menu/menu_hash.h b/menu/menu_hash.h index 7dfd56dc73..15c46ea3a4 100644 --- a/menu/menu_hash.h +++ b/menu/menu_hash.h @@ -36,6 +36,9 @@ extern "C" { #define MENU_LABEL_UI_COMPANION_ENABLE 0xb2d7a20cU #define MENU_LABEL_VALUE_UI_COMPANION_ENABLE 0xee4933ceU +#define MENU_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE 0xf71b3b16U +#define MENU_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE 0xa4d69592U + #define MENU_LABEL_CHEEVOS_TEST_UNOFFICIAL 0xa1ae28f0U #define MENU_LABEL_VALUE_CHEEVOS_TEST_UNOFFICIAL 0x0698e665U diff --git a/menu/menu_setting.c b/menu/menu_setting.c index dbb3fdf9a8..beb8c53593 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -6243,6 +6243,20 @@ static bool setting_append_list_cheevos_options( general_write_handler, general_read_handler); + CONFIG_BOOL( + list, list_info, + &settings->cheevos.hardcore_mode_enable, + menu_hash_to_str(MENU_LABEL_CHEEVOS_HARDCORE_MODE_ENABLE), + menu_hash_to_str(MENU_LABEL_VALUE_CHEEVOS_HARDCORE_MODE_ENABLE), + false, + menu_hash_to_str(MENU_VALUE_OFF), + menu_hash_to_str(MENU_VALUE_ON), + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + END_SUB_GROUP(list, list_info, parent_group); END_GROUP(list, list_info, parent_group); #endif diff --git a/msg_hash.h b/msg_hash.h index cb36869e96..5767f2ed0d 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -86,6 +86,8 @@ #define MSG_REWIND_REACHED_END 0x4f1aab8fU #define MSG_FAILED_TO_START_MOVIE_RECORD 0x61221776U +#define MSG_CHEEVOS_HARDCORE_MODE_ENABLE 0x0d212ca9U + #define MSG_STATE_SLOT 0x27b67f67U #define MSG_STARTING_MOVIE_RECORD_TO 0x6a7e0d50U #define MSG_FAILED_TO_START_MOVIE_RECORD 0x61221776U