1
0
mirror of https://github.com/libretro/RetroArch synced 2024-07-08 20:25:47 +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:
twinaphex 2019-09-16 16:57:50 +02:00
parent 352be447df
commit 9fd4ff7a8d

View File

@ -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)