From b648d70f2731753143c505a36384c9c7b38ce4a7 Mon Sep 17 00:00:00 2001 From: Sven <40953353+RetroSven@users.noreply.github.com> Date: Tue, 7 Aug 2018 17:34:46 -0400 Subject: [PATCH] add option to auto-apply cheat codes when a game loads ; fix some misc bugs in cheat engine --- command.c | 8 ++++++-- config.def.h | 3 +++ configuration.c | 1 + configuration.h | 1 + intl/msg_hash_lbl.h | 2 ++ intl/msg_hash_us.c | 4 ++++ intl/msg_hash_us.h | 6 ++++++ managers/cheat_manager.c | 10 +++++----- menu/cbs/menu_cbs_sublabel.c | 1 + menu/menu_displaylist.c | 3 +++ menu/menu_setting.c | 17 ++++++++++++++++- msg_hash.h | 1 + 12 files changed, 49 insertions(+), 8 deletions(-) diff --git a/command.c b/command.c index 768fa2b77b..647d8cf2ec 100644 --- a/command.c +++ b/command.c @@ -1089,7 +1089,8 @@ static void command_event_deinit_core(bool reinit) static void command_event_init_cheats(void) { - bool allow_cheats = true; + settings_t *settings = config_get_ptr(); + bool allow_cheats = true; #ifdef HAVE_NETWORKING allow_cheats &= !netplay_driver_ctl( @@ -1102,7 +1103,10 @@ static void command_event_init_cheats(void) cheat_manager_alloc_if_empty() ; cheat_manager_load_game_specific_cheats() ; - /* TODO/FIXME - add some stuff here. */ + + + if (settings != NULL && settings->bools.apply_cheats_after_load) + cheat_manager_apply_cheats(); } static void command_event_load_auto_state(void) diff --git a/config.def.h b/config.def.h index b0502d3488..856df13675 100644 --- a/config.def.h +++ b/config.def.h @@ -529,6 +529,9 @@ static const bool rewind_enable = false; /* When set, any time a cheat is toggled it is immediately applied. */ static const bool apply_cheats_after_toggle = false; +/* When set, all enabled cheats are auto-applied when a game is loaded. */ +static const bool apply_cheats_after_load = false; + /* The buffer size for the rewind buffer. This needs to be about * 15-20MB per minute. Very game dependant. */ static const unsigned rewind_buffer_size = 20 << 20; /* 20MiB */ diff --git a/configuration.c b/configuration.c index e01540759a..2e4e8123d8 100644 --- a/configuration.c +++ b/configuration.c @@ -1281,6 +1281,7 @@ static struct config_bool_setting *populate_settings_bool(settings_t *settings, SETTING_BOOL("suspend_screensaver_enable", &settings->bools.ui_suspend_screensaver_enable, true, true, false); SETTING_BOOL("rewind_enable", &settings->bools.rewind_enable, true, rewind_enable, false); SETTING_BOOL("apply_cheats_after_toggle", &settings->bools.apply_cheats_after_toggle, true, apply_cheats_after_toggle, false); + SETTING_BOOL("apply_cheats_after_load", &settings->bools.apply_cheats_after_load, true, apply_cheats_after_load, false); SETTING_BOOL("run_ahead_enabled", &settings->bools.run_ahead_enabled, true, false, false); SETTING_BOOL("run_ahead_secondary_instance", &settings->bools.run_ahead_secondary_instance, true, false, false); SETTING_BOOL("run_ahead_hide_warnings", &settings->bools.run_ahead_hide_warnings, true, false, false); diff --git a/configuration.h b/configuration.h index dd0d930470..5d61404105 100644 --- a/configuration.h +++ b/configuration.h @@ -240,6 +240,7 @@ typedef struct settings bool playlist_entry_rename; bool rewind_enable; bool apply_cheats_after_toggle; + bool apply_cheats_after_load; bool run_ahead_enabled; bool run_ahead_secondary_instance; bool run_ahead_hide_warnings; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 6b763f6c47..921522eefc 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -939,6 +939,8 @@ MSG_HASH(MENU_ENUM_LABEL_REWIND_ENABLE, "rewind_enable") MSG_HASH(MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_TOGGLE, "cheat_apply_after_toggle") +MSG_HASH(MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_LOAD, + "cheat_apply_after_load") MSG_HASH(MENU_ENUM_LABEL_REWIND_GRANULARITY, "rewind_granularity") MSG_HASH(MENU_ENUM_LABEL_REWIND_BUFFER_SIZE, diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 41529f2284..6170f879cb 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -1185,6 +1185,10 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Apply cheat immediately after toggling."); break; + case MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_LOAD: + snprintf(s, len, + "Auto-apply cheats when game loads."); + break; case MENU_ENUM_LABEL_LIBRETRO_DIR_PATH: snprintf(s, len, "Core Directory. \n" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index fdf7e53f45..0c1d28a26d 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -1401,6 +1401,8 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_ENABLE, "Rewind Enable") MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_AFTER_TOGGLE, "Apply After Toggle") +MSG_HASH(MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_AFTER_LOAD, + "Auto-Apply Cheats During Game Load") MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_GRANULARITY, "Rewind Granularity") MSG_HASH(MENU_ENUM_LABEL_VALUE_REWIND_BUFFER_SIZE, @@ -2834,6 +2836,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CHEAT_APPLY_AFTER_TOGGLE, "Apply cheat immediately after toggling." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CHEAT_APPLY_AFTER_LOAD, + "Auto-apply cheats when game loads." +) MSG_HASH( MENU_ENUM_SUBLABEL_REWIND_GRANULARITY, "When rewinding a defined number of frames, you can rewind several frames at a time, increasing the rewind speed." diff --git a/managers/cheat_manager.c b/managers/cheat_manager.c index 95db5031b6..bfed78ddf3 100644 --- a/managers/cheat_manager.c +++ b/managers/cheat_manager.c @@ -511,7 +511,7 @@ void cheat_manager_update(cheat_manager_t *handle, unsigned handle_idx) { char msg[256]; - if (!handle || !handle->cheats) + if (!handle || !handle->cheats || handle->size == 0) return; snprintf(msg, sizeof(msg), "Cheat: #%u [%s]: %s", @@ -526,7 +526,7 @@ void cheat_manager_update(cheat_manager_t *handle, unsigned handle_idx) void cheat_manager_toggle_index(unsigned i) { settings_t *settings = config_get_ptr(); - if (!cheat_manager_state.cheats) + if (!cheat_manager_state.cheats || cheat_manager_state.size == 0 ) return; cheat_manager_state.cheats[i].state = !cheat_manager_state.cheats[i].state; @@ -542,7 +542,7 @@ void cheat_manager_toggle_index(unsigned i) void cheat_manager_toggle(void) { - if (!cheat_manager_state.cheats) + if (!cheat_manager_state.cheats || cheat_manager_state.size == 0) return; cheat_manager_state.cheats[cheat_manager_state.ptr].state ^= true; @@ -552,7 +552,7 @@ void cheat_manager_toggle(void) void cheat_manager_index_next(void) { - if (!cheat_manager_state.cheats) + if (!cheat_manager_state.cheats || cheat_manager_state.size == 0) return; cheat_manager_state.ptr = (cheat_manager_state.ptr + 1) % cheat_manager_state.size; @@ -561,7 +561,7 @@ void cheat_manager_index_next(void) void cheat_manager_index_prev(void) { - if (!cheat_manager_state.cheats) + if (!cheat_manager_state.cheats || cheat_manager_state.size == 0) return; if (cheat_manager_state.ptr == 0) diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index edccb8b17e..6468685442 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -207,6 +207,7 @@ default_sublabel_macro(action_bind_sublabel_run_ahead_hide_warnings, MENU_ default_sublabel_macro(action_bind_sublabel_run_ahead_frames, MENU_ENUM_SUBLABEL_RUN_AHEAD_FRAMES) default_sublabel_macro(action_bind_sublabel_rewind, MENU_ENUM_SUBLABEL_REWIND_ENABLE) default_sublabel_macro(action_bind_sublabel_cheat_apply_after_toggle, MENU_ENUM_SUBLABEL_CHEAT_APPLY_AFTER_TOGGLE) +default_sublabel_macro(action_bind_sublabel_cheat_apply_after_load, MENU_ENUM_SUBLABEL_CHEAT_APPLY_AFTER_LOAD) default_sublabel_macro(action_bind_sublabel_rewind_granularity, MENU_ENUM_SUBLABEL_REWIND_GRANULARITY) default_sublabel_macro(action_bind_sublabel_rewind_buffer_size, MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE) default_sublabel_macro(action_bind_sublabel_rewind_buffer_size_step, MENU_ENUM_SUBLABEL_REWIND_BUFFER_SIZE_STEP) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 1c5cb1d006..2b72103e9d 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -3204,6 +3204,9 @@ static int menu_displaylist_parse_options_cheats( msg_hash_to_str(MENU_ENUM_LABEL_CHEAT_DELETE_ALL), MENU_ENUM_LABEL_CHEAT_DELETE_ALL, MENU_SETTING_ACTION, 0, 0); + menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_LOAD, + PARSE_ONLY_BOOL, false); menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_TOGGLE, PARSE_ONLY_BOOL, false); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index b2d84ee582..2716fdbc14 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -3321,12 +3321,27 @@ static bool setting_append_list( START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group); + CONFIG_BOOL( + list, list_info, + &settings->bools.apply_cheats_after_load, + MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_LOAD, + MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_AFTER_LOAD, + apply_cheats_after_load, + MENU_ENUM_LABEL_VALUE_OFF, + MENU_ENUM_LABEL_VALUE_ON, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler, + SD_FLAG_CMD_APPLY_AUTO); + CONFIG_BOOL( list, list_info, &settings->bools.apply_cheats_after_toggle, MENU_ENUM_LABEL_CHEAT_APPLY_AFTER_TOGGLE, MENU_ENUM_LABEL_VALUE_CHEAT_APPLY_AFTER_TOGGLE, - rewind_enable, + apply_cheats_after_toggle, MENU_ENUM_LABEL_VALUE_OFF, MENU_ENUM_LABEL_VALUE_ON, &group_info, diff --git a/msg_hash.h b/msg_hash.h index f5adeca60b..c33c066874 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1313,6 +1313,7 @@ enum msg_hash_enums MENU_LABEL(FASTFORWARD_RATIO), MENU_LABEL(REWIND_ENABLE), MENU_LABEL(CHEAT_APPLY_AFTER_TOGGLE), + MENU_LABEL(CHEAT_APPLY_AFTER_LOAD), MENU_ENUM_LABEL_ENABLE_HOTKEY, MENU_ENUM_LABEL_DISK_EJECT_TOGGLE,