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. */
|
/* Loads core. */
|
||||||
CMD_EVENT_LOAD_CORE,
|
CMD_EVENT_LOAD_CORE,
|
||||||
CMD_EVENT_LOAD_CORE_PERSIST,
|
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_UNLOAD_CORE,
|
||||||
CMD_EVENT_CLOSE_CONTENT,
|
CMD_EVENT_CLOSE_CONTENT,
|
||||||
CMD_EVENT_LOAD_STATE,
|
CMD_EVENT_LOAD_STATE,
|
||||||
|
@ -8192,6 +8192,31 @@ static void general_write_handler(rarch_setting_t *setting)
|
|||||||
default_aspect;
|
default_aspect;
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
/* Special cases */
|
/* Special cases */
|
||||||
|
|
||||||
|
85
retroarch.c
85
retroarch.c
@ -12207,6 +12207,21 @@ bool command_event(enum event_command cmd, void *data)
|
|||||||
#endif
|
#endif
|
||||||
break;
|
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:
|
case CMD_EVENT_LOAD_STATE:
|
||||||
#ifdef HAVE_BSV_MOVIE
|
#ifdef HAVE_BSV_MOVIE
|
||||||
/* Immutable - disallow savestate load when
|
/* Immutable - disallow savestate load when
|
||||||
@ -33523,6 +33538,14 @@ bool rarch_ctl(enum rarch_ctl_state state, void *data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
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:
|
case RARCH_CTL_HAS_SET_USERNAME:
|
||||||
return p_rarch->has_set_username;
|
return p_rarch->has_set_username;
|
||||||
case RARCH_CTL_IS_INITED:
|
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)
|
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);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool core_reset_cheat(void)
|
bool core_reset_cheat(void)
|
||||||
{
|
{
|
||||||
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_reset();
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +94,11 @@ enum rarch_ctl_state
|
|||||||
RARCH_CTL_IS_DUMMY_CORE,
|
RARCH_CTL_IS_DUMMY_CORE,
|
||||||
RARCH_CTL_IS_CORE_LOADED,
|
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_IS_BPS_PREF,
|
||||||
RARCH_CTL_UNSET_BPS_PREF,
|
RARCH_CTL_UNSET_BPS_PREF,
|
||||||
|
|
||||||
|
@ -56,6 +56,9 @@ static void rarch_init_core_options(
|
|||||||
#if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
|
#if defined(HAVE_DYNAMIC) || defined(HAVE_DYLIB)
|
||||||
static bool secondary_core_create(struct rarch_state *p_rarch,
|
static bool secondary_core_create(struct rarch_state *p_rarch,
|
||||||
settings_t *settings);
|
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
|
#endif
|
||||||
static int16_t input_state_get_last(unsigned port,
|
static int16_t input_state_get_last(unsigned port,
|
||||||
unsigned device, unsigned index, unsigned id);
|
unsigned device, unsigned index, unsigned id);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user