mirror of
https://github.com/libretro/RetroArch.git
synced 2025-03-04 16:07:24 +00:00
(Cheat manager)
- Cleanups - Functional improvement: don't attempt to create the 'core directory' inside the cheats directory for game-specific cheats when we are only trying to load the cheat - if we are loading and the directory doesn't exist, that means the cheat file doesn't exist either
This commit is contained in:
parent
352be447df
commit
9fd4ff7a8d
@ -647,15 +647,17 @@ bool cheat_manager_get_code_state(unsigned i)
|
||||
return cheat_manager_state.cheats[i].state;
|
||||
}
|
||||
|
||||
bool cheat_manager_get_game_specific_filename(char * cheat_filename, size_t max_length)
|
||||
static bool cheat_manager_get_game_specific_filename(
|
||||
char *s, size_t len,
|
||||
bool saving)
|
||||
{
|
||||
settings_t *settings = config_get_ptr();
|
||||
global_t *global = global_get_ptr();
|
||||
const char *core_name = NULL;
|
||||
const char *game_name = NULL;
|
||||
struct retro_system_info system_info;
|
||||
settings_t *settings = config_get_ptr();
|
||||
global_t *global = global_get_ptr();
|
||||
const char *core_name = NULL;
|
||||
const char *game_name = NULL;
|
||||
|
||||
if (!settings || !global || !cheat_filename)
|
||||
if (!settings || !global)
|
||||
return false;
|
||||
|
||||
if (!core_get_system_info(&system_info))
|
||||
@ -669,35 +671,47 @@ bool cheat_manager_get_game_specific_filename(char * cheat_filename, size_t max_
|
||||
string_is_empty(game_name))
|
||||
return false;
|
||||
|
||||
cheat_filename[0] = '\0';
|
||||
strlcat(cheat_filename, settings->paths.path_cheat_database, max_length);
|
||||
fill_pathname_slash(cheat_filename, max_length);
|
||||
strlcat(cheat_filename, core_name, max_length);
|
||||
fill_pathname_slash(cheat_filename, max_length);
|
||||
s[0] = '\0';
|
||||
|
||||
if (!path_is_valid(cheat_filename))
|
||||
path_mkdir(cheat_filename);
|
||||
fill_pathname_join(s,
|
||||
settings->paths.path_cheat_database, core_name,
|
||||
len);
|
||||
|
||||
strlcat(cheat_filename, game_name, max_length);
|
||||
if (saving)
|
||||
{
|
||||
/* Check if directory is valid, if not, create it */
|
||||
if (!path_is_valid(s))
|
||||
path_mkdir(s);
|
||||
}
|
||||
|
||||
fill_pathname_slash(s, len);
|
||||
strlcat(s, game_name, len);
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
void cheat_manager_load_game_specific_cheats()
|
||||
|
||||
void cheat_manager_load_game_specific_cheats(void)
|
||||
{
|
||||
char cheat_file[PATH_MAX_LENGTH];
|
||||
|
||||
if (cheat_manager_get_game_specific_filename(cheat_file, PATH_MAX_LENGTH))
|
||||
if (cheat_manager_get_game_specific_filename(
|
||||
cheat_file, sizeof(cheat_file), false))
|
||||
{
|
||||
RARCH_LOG("[Cheats]: Load game-specific cheatfile: %s\n", cheat_file);
|
||||
cheat_manager_load(cheat_file, true);
|
||||
|
||||
}
|
||||
}
|
||||
void cheat_manager_save_game_specific_cheats()
|
||||
|
||||
void cheat_manager_save_game_specific_cheats(void)
|
||||
{
|
||||
char cheat_file[PATH_MAX_LENGTH];
|
||||
|
||||
if (cheat_manager_get_game_specific_filename(cheat_file, PATH_MAX_LENGTH))
|
||||
if (cheat_manager_get_game_specific_filename(
|
||||
cheat_file, sizeof(cheat_file), true))
|
||||
{
|
||||
RARCH_LOG("[Cheats]: Save game-specific cheatfile: %s\n", cheat_file);
|
||||
cheat_manager_save(cheat_file, NULL, true);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void cheat_manager_state_free(void)
|
||||
@ -717,14 +731,14 @@ int cheat_manager_initialize_memory(rarch_setting_t *setting, bool wraparound)
|
||||
{
|
||||
unsigned i;
|
||||
retro_ctx_memory_info_t meminfo;
|
||||
bool refresh = false;
|
||||
bool is_search_initialization = (setting != NULL);
|
||||
rarch_system_info_t *system = runloop_get_system_info();
|
||||
unsigned offset = 0;
|
||||
bool refresh = false;
|
||||
bool is_search_initialization = (setting != NULL);
|
||||
rarch_system_info_t *system = runloop_get_system_info();
|
||||
unsigned offset = 0;
|
||||
|
||||
cheat_manager_state.num_memory_buffers = 0;
|
||||
cheat_manager_state.total_memory_size = 0;
|
||||
cheat_manager_state.curr_memory_buf = NULL;
|
||||
cheat_manager_state.total_memory_size = 0;
|
||||
cheat_manager_state.curr_memory_buf = NULL;
|
||||
|
||||
if (cheat_manager_state.memory_buf_list)
|
||||
{
|
||||
@ -751,7 +765,8 @@ int cheat_manager_initialize_memory(rarch_setting_t *setting, bool wraparound)
|
||||
if (!cheat_manager_state.memory_buf_list)
|
||||
cheat_manager_state.memory_buf_list = (uint8_t**)calloc(1, sizeof(uint8_t *));
|
||||
else
|
||||
cheat_manager_state.memory_buf_list = (uint8_t**)realloc(cheat_manager_state.memory_buf_list, sizeof(uint8_t *) * cheat_manager_state.num_memory_buffers);
|
||||
cheat_manager_state.memory_buf_list = (uint8_t**)realloc(
|
||||
cheat_manager_state.memory_buf_list, sizeof(uint8_t *) * cheat_manager_state.num_memory_buffers);
|
||||
|
||||
if (!cheat_manager_state.memory_size_list)
|
||||
cheat_manager_state.memory_size_list = (unsigned*)calloc(1, sizeof(unsigned));
|
||||
@ -889,36 +904,36 @@ static void cheat_manager_setup_search_meta(unsigned int bitsize, unsigned int *
|
||||
{
|
||||
switch (bitsize)
|
||||
{
|
||||
case 0:
|
||||
*bytes_per_item = 1;
|
||||
*bits = 1;
|
||||
*mask = 0x01;
|
||||
break;
|
||||
case 1:
|
||||
*bytes_per_item = 1;
|
||||
*bits = 2;
|
||||
*mask = 0x03;
|
||||
break;
|
||||
case 2:
|
||||
*bytes_per_item = 1;
|
||||
*bits = 4;
|
||||
*mask = 0x0F;
|
||||
break;
|
||||
case 3:
|
||||
*bytes_per_item = 1;
|
||||
*bits = 8;
|
||||
*mask = 0xFF;
|
||||
break;
|
||||
case 4:
|
||||
*bytes_per_item = 2;
|
||||
*bits = 8;
|
||||
*mask = 0xFFFF;
|
||||
break;
|
||||
case 5:
|
||||
*bytes_per_item = 4;
|
||||
*bits = 8;
|
||||
*mask = 0xFFFFFFFF;
|
||||
break;
|
||||
case 0:
|
||||
*bytes_per_item = 1;
|
||||
*bits = 1;
|
||||
*mask = 0x01;
|
||||
break;
|
||||
case 1:
|
||||
*bytes_per_item = 1;
|
||||
*bits = 2;
|
||||
*mask = 0x03;
|
||||
break;
|
||||
case 2:
|
||||
*bytes_per_item = 1;
|
||||
*bits = 4;
|
||||
*mask = 0x0F;
|
||||
break;
|
||||
case 3:
|
||||
*bytes_per_item = 1;
|
||||
*bits = 8;
|
||||
*mask = 0xFF;
|
||||
break;
|
||||
case 4:
|
||||
*bytes_per_item = 2;
|
||||
*bits = 8;
|
||||
*mask = 0xFFFF;
|
||||
break;
|
||||
case 5:
|
||||
*bytes_per_item = 4;
|
||||
*bits = 8;
|
||||
*mask = 0xFFFFFFFF;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -926,34 +941,42 @@ int cheat_manager_search_exact(rarch_setting_t *setting, bool wraparound)
|
||||
{
|
||||
return cheat_manager_search(CHEAT_SEARCH_TYPE_EXACT);
|
||||
}
|
||||
|
||||
int cheat_manager_search_lt(rarch_setting_t *setting, bool wraparound)
|
||||
{
|
||||
return cheat_manager_search(CHEAT_SEARCH_TYPE_LT);
|
||||
}
|
||||
|
||||
int cheat_manager_search_gt(rarch_setting_t *setting, bool wraparound)
|
||||
{
|
||||
return cheat_manager_search(CHEAT_SEARCH_TYPE_GT);
|
||||
}
|
||||
|
||||
int cheat_manager_search_lte(rarch_setting_t *setting, bool wraparound)
|
||||
{
|
||||
return cheat_manager_search(CHEAT_SEARCH_TYPE_LTE);
|
||||
}
|
||||
|
||||
int cheat_manager_search_gte(rarch_setting_t *setting, bool wraparound)
|
||||
{
|
||||
return cheat_manager_search(CHEAT_SEARCH_TYPE_GTE);
|
||||
}
|
||||
|
||||
int cheat_manager_search_eq(rarch_setting_t *setting, bool wraparound)
|
||||
{
|
||||
return cheat_manager_search(CHEAT_SEARCH_TYPE_EQ);
|
||||
}
|
||||
|
||||
int cheat_manager_search_neq(rarch_setting_t *setting, bool wraparound)
|
||||
{
|
||||
return cheat_manager_search(CHEAT_SEARCH_TYPE_NEQ);
|
||||
}
|
||||
|
||||
int cheat_manager_search_eqplus(rarch_setting_t *setting, bool wraparound)
|
||||
{
|
||||
return cheat_manager_search(CHEAT_SEARCH_TYPE_EQPLUS);
|
||||
}
|
||||
|
||||
int cheat_manager_search_eqminus(rarch_setting_t *setting, bool wraparound)
|
||||
{
|
||||
return cheat_manager_search(CHEAT_SEARCH_TYPE_EQMINUS);
|
||||
@ -991,27 +1014,27 @@ int cheat_manager_search(enum cheat_search_type search_type)
|
||||
|
||||
switch (bytes_per_item)
|
||||
{
|
||||
case 2:
|
||||
curr_val = cheat_manager_state.big_endian ?
|
||||
case 2:
|
||||
curr_val = cheat_manager_state.big_endian ?
|
||||
(*(curr + idx - offset) * 256) + *(curr + idx + 1 - offset) :
|
||||
*(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256);
|
||||
prev_val = cheat_manager_state.big_endian ?
|
||||
prev_val = cheat_manager_state.big_endian ?
|
||||
(*(prev + idx) * 256) + *(prev + idx + 1) :
|
||||
*(prev + idx) + (*(prev + idx + 1) * 256);
|
||||
break;
|
||||
case 4:
|
||||
curr_val = cheat_manager_state.big_endian ?
|
||||
break;
|
||||
case 4:
|
||||
curr_val = cheat_manager_state.big_endian ?
|
||||
(*(curr + idx - offset) * 256 * 256 * 256) + (*(curr + idx + 1 - offset) * 256 * 256) + (*(curr + idx + 2 - offset) * 256) + *(curr + idx + 3 - offset) :
|
||||
*(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256) + (*(curr + idx + 2 - offset) * 256 * 256) + (*(curr + idx + 3 - offset) * 256 * 256 * 256);
|
||||
prev_val = cheat_manager_state.big_endian ?
|
||||
prev_val = cheat_manager_state.big_endian ?
|
||||
(*(prev + idx) * 256 * 256 * 256) + (*(prev + idx + 1) * 256 * 256) + (*(prev + idx + 2) * 256) + *(prev + idx + 3) :
|
||||
*(prev + idx) + (*(prev + idx + 1) * 256) + (*(prev + idx + 2) * 256 * 256) + (*(prev + idx + 3) * 256 * 256 * 256);
|
||||
break;
|
||||
case 1:
|
||||
default:
|
||||
curr_val = *(curr - offset + idx);
|
||||
prev_val = *(prev + idx);
|
||||
break;
|
||||
break;
|
||||
case 1:
|
||||
default:
|
||||
curr_val = *(curr - offset + idx);
|
||||
prev_val = *(prev + idx);
|
||||
break;
|
||||
}
|
||||
|
||||
for (byte_part = 0; byte_part < 8 / bits; byte_part++)
|
||||
@ -1030,39 +1053,40 @@ int cheat_manager_search(enum cheat_search_type search_type)
|
||||
bool match = false;
|
||||
switch (search_type)
|
||||
{
|
||||
case CHEAT_SEARCH_TYPE_EXACT:
|
||||
match = (curr_subval == cheat_manager_state.search_exact_value);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_LT:
|
||||
match = (curr_subval < prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_GT:
|
||||
match = (curr_subval > prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_LTE:
|
||||
match = (curr_subval <= prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_GTE:
|
||||
match = (curr_subval >= prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_EQ:
|
||||
match = (curr_subval == prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_NEQ:
|
||||
match = (curr_subval != prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_EQPLUS:
|
||||
match = (curr_subval == prev_subval + cheat_manager_state.search_eqplus_value);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_EQMINUS:
|
||||
match = (curr_subval == prev_subval - cheat_manager_state.search_eqminus_value);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_EXACT:
|
||||
match = (curr_subval == cheat_manager_state.search_exact_value);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_LT:
|
||||
match = (curr_subval < prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_GT:
|
||||
match = (curr_subval > prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_LTE:
|
||||
match = (curr_subval <= prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_GTE:
|
||||
match = (curr_subval >= prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_EQ:
|
||||
match = (curr_subval == prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_NEQ:
|
||||
match = (curr_subval != prev_subval);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_EQPLUS:
|
||||
match = (curr_subval == prev_subval + cheat_manager_state.search_eqplus_value);
|
||||
break;
|
||||
case CHEAT_SEARCH_TYPE_EQMINUS:
|
||||
match = (curr_subval == prev_subval - cheat_manager_state.search_eqminus_value);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!match)
|
||||
{
|
||||
if (bits < 8)
|
||||
*(cheat_manager_state.matches + idx) = *(cheat_manager_state.matches + idx) &
|
||||
((~(mask << (byte_part * bits))) & 0xFF);
|
||||
((~(mask << (byte_part * bits))) & 0xFF);
|
||||
else
|
||||
memset(cheat_manager_state.matches + idx, 0, bytes_per_item);
|
||||
if (cheat_manager_state.num_matches > 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user