mirror of
https://github.com/libretro/RetroArch
synced 2025-02-01 00:32:46 +00:00
Merge pull request #12931 from jdgleaver/runahead-cheats
Fix cheats when using second instance runahead
This commit is contained in:
commit
588c1305c8
@ -73,6 +73,9 @@ enum event_command
|
||||
/* Loads core. */
|
||||
CMD_EVENT_LOAD_CORE,
|
||||
CMD_EVENT_LOAD_CORE_PERSIST,
|
||||
#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB))
|
||||
CMD_EVENT_LOAD_SECOND_CORE,
|
||||
#endif
|
||||
CMD_EVENT_UNLOAD_CORE,
|
||||
CMD_EVENT_CLOSE_CONTENT,
|
||||
CMD_EVENT_LOAD_STATE,
|
||||
|
@ -8192,6 +8192,31 @@ static void general_write_handler(rarch_setting_t *setting)
|
||||
default_aspect;
|
||||
}
|
||||
break;
|
||||
#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB))
|
||||
case MENU_ENUM_LABEL_RUN_AHEAD_ENABLED:
|
||||
case MENU_ENUM_LABEL_RUN_AHEAD_FRAMES:
|
||||
case MENU_ENUM_LABEL_RUN_AHEAD_SECONDARY_INSTANCE:
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
bool run_ahead_enabled = settings->bools.run_ahead_enabled;
|
||||
unsigned run_ahead_frames = settings->uints.run_ahead_frames;
|
||||
bool run_ahead_secondary_instance = settings->bools.run_ahead_secondary_instance;
|
||||
|
||||
/* If any changes here will cause second
|
||||
* instance runahead to be enabled, must
|
||||
* re-apply cheats to ensure that they
|
||||
* propagate to the newly-created secondary
|
||||
* core */
|
||||
if (run_ahead_enabled &&
|
||||
(run_ahead_frames > 0) &&
|
||||
run_ahead_secondary_instance &&
|
||||
!rarch_ctl(RARCH_CTL_IS_SECOND_CORE_LOADED, NULL) &&
|
||||
rarch_ctl(RARCH_CTL_IS_SECOND_CORE_AVAILABLE, NULL) &&
|
||||
command_event(CMD_EVENT_LOAD_SECOND_CORE, NULL))
|
||||
command_event(CMD_EVENT_CHEATS_APPLY, NULL);
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
/* Special cases */
|
||||
|
||||
|
85
retroarch.c
85
retroarch.c
@ -12207,6 +12207,21 @@ bool command_event(enum event_command cmd, void *data)
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB))
|
||||
case CMD_EVENT_LOAD_SECOND_CORE:
|
||||
if (!runloop_state.core_running ||
|
||||
!p_rarch->runahead_secondary_core_available)
|
||||
return false;
|
||||
if (p_rarch->secondary_lib_handle)
|
||||
return true;
|
||||
if (!secondary_core_ensure_exists(p_rarch, settings))
|
||||
{
|
||||
secondary_core_destroy(p_rarch);
|
||||
p_rarch->runahead_secondary_core_available = false;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
#endif
|
||||
case CMD_EVENT_LOAD_STATE:
|
||||
#ifdef HAVE_BSV_MOVIE
|
||||
/* Immutable - disallow savestate load when
|
||||
@ -33523,6 +33538,14 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data)
|
||||
}
|
||||
}
|
||||
return false;
|
||||
#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB))
|
||||
case RARCH_CTL_IS_SECOND_CORE_AVAILABLE:
|
||||
return runloop_state.core_running &&
|
||||
p_rarch->runahead_secondary_core_available;
|
||||
case RARCH_CTL_IS_SECOND_CORE_LOADED:
|
||||
return runloop_state.core_running &&
|
||||
(p_rarch->secondary_lib_handle != NULL);
|
||||
#endif
|
||||
case RARCH_CTL_HAS_SET_USERNAME:
|
||||
return p_rarch->has_set_username;
|
||||
case RARCH_CTL_IS_INITED:
|
||||
@ -36546,15 +36569,75 @@ bool core_unset_netplay_callbacks(void)
|
||||
|
||||
bool core_set_cheat(retro_ctx_cheat_info_t *info)
|
||||
{
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB))
|
||||
settings_t *settings = p_rarch->configuration_settings;
|
||||
bool run_ahead_enabled = false;
|
||||
unsigned run_ahead_frames = 0;
|
||||
bool run_ahead_secondary_instance = false;
|
||||
bool want_runahead = false;
|
||||
|
||||
if (settings)
|
||||
{
|
||||
run_ahead_enabled = settings->bools.run_ahead_enabled;
|
||||
run_ahead_frames = settings->uints.run_ahead_frames;
|
||||
run_ahead_secondary_instance = settings->bools.run_ahead_secondary_instance;
|
||||
want_runahead = run_ahead_enabled && (run_ahead_frames > 0);
|
||||
#ifdef HAVE_NETWORKING
|
||||
if (want_runahead)
|
||||
want_runahead = !netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
p_rarch->current_core.retro_cheat_set(info->index, info->enabled, info->code);
|
||||
|
||||
#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB))
|
||||
if (want_runahead &&
|
||||
run_ahead_secondary_instance &&
|
||||
p_rarch->runahead_secondary_core_available &&
|
||||
secondary_core_ensure_exists(p_rarch, settings) &&
|
||||
p_rarch->secondary_core.retro_cheat_set)
|
||||
p_rarch->secondary_core.retro_cheat_set(info->index, info->enabled, info->code);
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool core_reset_cheat(void)
|
||||
{
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB))
|
||||
settings_t *settings = p_rarch->configuration_settings;
|
||||
bool run_ahead_enabled = false;
|
||||
unsigned run_ahead_frames = 0;
|
||||
bool run_ahead_secondary_instance = false;
|
||||
bool want_runahead = false;
|
||||
|
||||
if (settings)
|
||||
{
|
||||
run_ahead_enabled = settings->bools.run_ahead_enabled;
|
||||
run_ahead_frames = settings->uints.run_ahead_frames;
|
||||
run_ahead_secondary_instance = settings->bools.run_ahead_secondary_instance;
|
||||
want_runahead = run_ahead_enabled && (run_ahead_frames > 0);
|
||||
#ifdef HAVE_NETWORKING
|
||||
if (want_runahead)
|
||||
want_runahead = !netplay_driver_ctl(RARCH_NETPLAY_CTL_IS_ENABLED, NULL);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
p_rarch->current_core.retro_cheat_reset();
|
||||
|
||||
#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB))
|
||||
if (want_runahead &&
|
||||
run_ahead_secondary_instance &&
|
||||
p_rarch->runahead_secondary_core_available &&
|
||||
secondary_core_ensure_exists(p_rarch, settings) &&
|
||||
p_rarch->secondary_core.retro_cheat_reset)
|
||||
p_rarch->secondary_core.retro_cheat_reset();
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -94,6 +94,11 @@ enum rarch_ctl_state
|
||||
RARCH_CTL_IS_DUMMY_CORE,
|
||||
RARCH_CTL_IS_CORE_LOADED,
|
||||
|
||||
#if defined(HAVE_RUNAHEAD) && (defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB))
|
||||
RARCH_CTL_IS_SECOND_CORE_AVAILABLE,
|
||||
RARCH_CTL_IS_SECOND_CORE_LOADED,
|
||||
#endif
|
||||
|
||||
RARCH_CTL_IS_BPS_PREF,
|
||||
RARCH_CTL_UNSET_BPS_PREF,
|
||||
|
||||
|
@ -56,6 +56,9 @@ static void rarch_init_core_options(
|
||||
#if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
|
||||
static bool secondary_core_create(struct rarch_state *p_rarch,
|
||||
settings_t *settings);
|
||||
static void secondary_core_destroy(struct rarch_state *p_rarch);
|
||||
static bool secondary_core_ensure_exists(struct rarch_state *p_rarch,
|
||||
settings_t *settings);
|
||||
#endif
|
||||
static int16_t input_state_get_last(unsigned port,
|
||||
unsigned device, unsigned index, unsigned id);
|
||||
|
Loading…
x
Reference in New Issue
Block a user