2012-04-21 21:13:50 +00:00
|
|
|
/* RetroArch - A frontend for libretro.
|
2014-01-01 00:50:59 +00:00
|
|
|
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
|
2017-01-22 12:40:32 +00:00
|
|
|
* Copyright (C) 2011-2017 - Daniel De Matteis
|
2016-10-27 09:27:02 +00:00
|
|
|
*
|
2012-04-21 21:13:50 +00:00
|
|
|
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
2011-04-17 11:30:59 +00:00
|
|
|
* of the GNU General Public License as published by the Free Software Found-
|
|
|
|
* ation, either version 3 of the License, or (at your option) any later version.
|
|
|
|
*
|
2012-04-21 21:13:50 +00:00
|
|
|
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
2011-04-17 11:30:59 +00:00
|
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE. See the GNU General Public License for more details.
|
|
|
|
*
|
2012-04-21 21:31:57 +00:00
|
|
|
* You should have received a copy of the GNU General Public License along with RetroArch.
|
2011-04-17 11:30:59 +00:00
|
|
|
* If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
2015-09-04 19:11:00 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stddef.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2014-12-15 21:40:23 +00:00
|
|
|
#include <file/config_file.h>
|
2015-01-19 18:00:26 +00:00
|
|
|
#include <file/file_path.h>
|
2014-10-21 05:58:58 +00:00
|
|
|
#include <compat/strl.h>
|
|
|
|
#include <compat/posix_string.h>
|
2017-01-11 06:25:42 +00:00
|
|
|
#include <string/stdstring.h>
|
2017-01-17 18:39:12 +00:00
|
|
|
#include <retro_miscellaneous.h>
|
2011-04-17 11:30:59 +00:00
|
|
|
|
2011-09-05 15:57:30 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
2016-05-09 16:20:52 +00:00
|
|
|
#include "../config.h"
|
2011-09-05 15:57:30 +00:00
|
|
|
#endif
|
|
|
|
|
2015-10-27 17:50:41 +00:00
|
|
|
#ifdef HAVE_CHEEVOS
|
2017-05-07 18:06:03 +00:00
|
|
|
#include "../cheevos/cheevos.h"
|
2015-10-27 17:50:41 +00:00
|
|
|
#endif
|
|
|
|
|
2016-09-08 06:13:09 +00:00
|
|
|
#include "cheat_manager.h"
|
2017-01-17 18:39:12 +00:00
|
|
|
|
|
|
|
#include "../msg_hash.h"
|
2017-05-11 07:11:46 +00:00
|
|
|
#include "../retroarch.h"
|
2016-09-08 06:13:09 +00:00
|
|
|
#include "../dynamic.h"
|
|
|
|
#include "../core.h"
|
|
|
|
#include "../verbosity.h"
|
|
|
|
|
2015-09-06 01:51:08 +00:00
|
|
|
struct item_cheat
|
|
|
|
{
|
|
|
|
char *desc;
|
|
|
|
bool state;
|
|
|
|
char *code;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct cheat_manager
|
|
|
|
{
|
|
|
|
struct item_cheat *cheats;
|
|
|
|
unsigned ptr;
|
|
|
|
unsigned size;
|
|
|
|
unsigned buf_size;
|
|
|
|
};
|
|
|
|
|
2015-12-01 02:29:32 +00:00
|
|
|
static cheat_manager_t *cheat_manager_state;
|
|
|
|
|
2015-12-01 01:43:34 +00:00
|
|
|
unsigned cheat_manager_get_buf_size(void)
|
2015-09-06 01:51:08 +00:00
|
|
|
{
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2015-09-06 01:51:08 +00:00
|
|
|
if (!handle)
|
|
|
|
return 0;
|
|
|
|
return handle->buf_size;
|
|
|
|
}
|
|
|
|
|
2015-12-01 01:55:07 +00:00
|
|
|
unsigned cheat_manager_get_size(void)
|
2015-09-06 01:51:08 +00:00
|
|
|
{
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2015-09-06 01:51:08 +00:00
|
|
|
if (!handle)
|
|
|
|
return 0;
|
|
|
|
return handle->size;
|
|
|
|
}
|
2011-04-17 11:30:59 +00:00
|
|
|
|
2015-12-01 01:43:34 +00:00
|
|
|
void cheat_manager_apply_cheats(void)
|
2011-09-05 15:57:30 +00:00
|
|
|
{
|
2016-02-13 05:24:49 +00:00
|
|
|
#ifdef HAVE_CHEEVOS
|
|
|
|
bool data_bool = false;
|
|
|
|
#endif
|
2015-01-09 14:33:58 +00:00
|
|
|
unsigned i, idx = 0;
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2014-10-20 22:14:38 +00:00
|
|
|
|
2015-04-03 17:53:20 +00:00
|
|
|
if (!handle)
|
|
|
|
return;
|
|
|
|
|
2016-05-07 23:33:57 +00:00
|
|
|
core_reset_cheat();
|
2015-01-09 14:33:58 +00:00
|
|
|
|
2013-10-22 13:08:17 +00:00
|
|
|
for (i = 0; i < handle->size; i++)
|
2011-09-05 15:57:30 +00:00
|
|
|
{
|
2011-09-07 16:59:01 +00:00
|
|
|
if (handle->cheats[i].state)
|
2016-01-28 03:34:39 +00:00
|
|
|
{
|
|
|
|
retro_ctx_cheat_info_t cheat_info;
|
|
|
|
|
|
|
|
cheat_info.index = idx++;
|
|
|
|
cheat_info.enabled = true;
|
|
|
|
cheat_info.code = handle->cheats[i].code;
|
|
|
|
|
2017-11-13 04:18:11 +00:00
|
|
|
if (!string_is_empty(cheat_info.code))
|
|
|
|
core_set_cheat(&cheat_info);
|
2016-01-28 03:34:39 +00:00
|
|
|
}
|
2011-09-05 15:57:30 +00:00
|
|
|
}
|
2016-12-22 22:36:11 +00:00
|
|
|
runloop_msg_queue_push(msg_hash_to_str(MSG_APPLYING_CHEAT), 1, 180, true);
|
|
|
|
RARCH_LOG("%s\n", msg_hash_to_str(MSG_APPLYING_CHEAT));
|
2016-10-27 09:27:02 +00:00
|
|
|
|
2015-10-27 17:50:41 +00:00
|
|
|
#ifdef HAVE_CHEEVOS
|
2016-02-13 05:24:49 +00:00
|
|
|
data_bool = idx != 0;
|
2016-05-07 22:15:04 +00:00
|
|
|
cheevos_apply_cheats(&data_bool);
|
2015-10-27 17:50:41 +00:00
|
|
|
#endif
|
2011-09-05 15:57:30 +00:00
|
|
|
}
|
|
|
|
|
2015-12-01 01:55:07 +00:00
|
|
|
void cheat_manager_set_code(unsigned i, const char *str)
|
2015-09-06 01:51:08 +00:00
|
|
|
{
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2015-09-06 01:51:08 +00:00
|
|
|
if (!handle)
|
|
|
|
return;
|
2017-01-11 06:25:42 +00:00
|
|
|
|
|
|
|
if (!string_is_empty(str))
|
|
|
|
handle->cheats[i].code = strdup(str);
|
|
|
|
|
|
|
|
handle->cheats[i].state = true;
|
2015-09-06 01:51:08 +00:00
|
|
|
}
|
|
|
|
|
2015-01-19 18:00:26 +00:00
|
|
|
/**
|
|
|
|
* cheat_manager_save:
|
|
|
|
* @path : Path to cheats file (relative path).
|
|
|
|
*
|
|
|
|
* Saves cheats to file on disk.
|
|
|
|
*
|
|
|
|
* Returns: true (1) if successful, otherwise false (0).
|
|
|
|
**/
|
2017-01-17 18:39:12 +00:00
|
|
|
bool cheat_manager_save(const char *path, const char *cheat_database)
|
2015-01-19 18:00:26 +00:00
|
|
|
{
|
|
|
|
bool ret;
|
|
|
|
unsigned i;
|
2016-10-21 03:57:40 +00:00
|
|
|
char buf[PATH_MAX_LENGTH];
|
|
|
|
char cheats_file[PATH_MAX_LENGTH];
|
2015-06-12 21:14:55 +00:00
|
|
|
config_file_t *conf = NULL;
|
2016-10-21 03:57:40 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
|
|
|
|
|
|
|
buf[0] = cheats_file[0] = '\0';
|
2015-01-19 18:00:26 +00:00
|
|
|
|
2017-01-17 18:39:12 +00:00
|
|
|
fill_pathname_join(buf, cheat_database, path, sizeof(buf));
|
2015-01-19 18:00:26 +00:00
|
|
|
|
|
|
|
fill_pathname_noext(cheats_file, buf, ".cht", sizeof(cheats_file));
|
2016-10-27 09:27:02 +00:00
|
|
|
|
2015-01-19 18:00:26 +00:00
|
|
|
conf = config_file_new(cheats_file);
|
|
|
|
|
|
|
|
if (!conf)
|
|
|
|
conf = config_file_new(NULL);
|
|
|
|
|
|
|
|
if (!conf)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
if (!handle)
|
2015-01-27 14:35:31 +00:00
|
|
|
{
|
|
|
|
config_file_free(conf);
|
2015-01-19 18:00:26 +00:00
|
|
|
return false;
|
2015-01-27 14:35:31 +00:00
|
|
|
}
|
2015-01-19 18:00:26 +00:00
|
|
|
|
|
|
|
config_set_int(conf, "cheats", handle->size);
|
|
|
|
|
|
|
|
for (i = 0; i < handle->size; i++)
|
|
|
|
{
|
2016-10-21 03:57:40 +00:00
|
|
|
char key[64];
|
|
|
|
char desc_key[256];
|
|
|
|
char code_key[256];
|
|
|
|
char enable_key[256];
|
|
|
|
|
|
|
|
key[0] = desc_key[0] = code_key[0] = enable_key[0] = '\0';
|
2015-01-19 18:00:26 +00:00
|
|
|
|
2016-06-20 03:03:41 +00:00
|
|
|
snprintf(key, sizeof(key), "cheat%u", i);
|
|
|
|
snprintf(desc_key, sizeof(desc_key), "cheat%u_desc", i);
|
|
|
|
snprintf(code_key, sizeof(code_key), "cheat%u_code", i);
|
2015-01-19 18:00:26 +00:00
|
|
|
snprintf(enable_key, sizeof(enable_key), "cheat%u_enable", i);
|
|
|
|
|
|
|
|
if (handle->cheats[i].desc)
|
2016-06-20 03:03:41 +00:00
|
|
|
config_set_string(conf, desc_key, handle->cheats[i].desc);
|
2015-01-19 18:00:26 +00:00
|
|
|
else
|
2016-06-20 03:03:41 +00:00
|
|
|
config_set_string(conf, desc_key, handle->cheats[i].code);
|
|
|
|
config_set_string(conf, code_key, handle->cheats[i].code);
|
|
|
|
config_set_bool(conf, enable_key, handle->cheats[i].state);
|
2015-01-19 18:00:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
ret = config_file_write(conf, cheats_file);
|
|
|
|
config_file_free(conf);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2016-03-24 03:51:45 +00:00
|
|
|
static cheat_manager_t *cheat_manager_new(unsigned size)
|
|
|
|
{
|
|
|
|
unsigned i;
|
|
|
|
cheat_manager_t *handle = (cheat_manager_t*)
|
|
|
|
calloc(1, sizeof(struct cheat_manager));
|
|
|
|
|
|
|
|
if (!handle)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
handle->buf_size = size;
|
|
|
|
handle->size = size;
|
|
|
|
handle->cheats = (struct item_cheat*)
|
|
|
|
calloc(handle->buf_size, sizeof(struct item_cheat));
|
|
|
|
|
|
|
|
if (!handle->cheats)
|
|
|
|
{
|
|
|
|
handle->buf_size = 0;
|
|
|
|
handle->size = 0;
|
|
|
|
handle->cheats = NULL;
|
|
|
|
return handle;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < handle->size; i++)
|
|
|
|
{
|
|
|
|
handle->cheats[i].desc = NULL;
|
|
|
|
handle->cheats[i].code = NULL;
|
|
|
|
handle->cheats[i].state = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return handle;
|
|
|
|
}
|
|
|
|
|
2015-12-01 02:00:31 +00:00
|
|
|
bool cheat_manager_load(const char *path)
|
2014-12-15 21:40:23 +00:00
|
|
|
{
|
|
|
|
unsigned cheats = 0, i;
|
2015-12-01 02:00:31 +00:00
|
|
|
cheat_manager_t *cheat;
|
|
|
|
config_file_t *conf = config_file_new(path);
|
2014-12-15 21:40:23 +00:00
|
|
|
|
|
|
|
if (!conf)
|
2015-12-01 02:00:31 +00:00
|
|
|
return false;
|
2014-12-15 21:40:23 +00:00
|
|
|
|
|
|
|
config_get_uint(conf, "cheats", &cheats);
|
|
|
|
|
|
|
|
if (cheats == 0)
|
2016-05-24 20:01:43 +00:00
|
|
|
goto error;
|
2014-12-15 21:40:23 +00:00
|
|
|
|
|
|
|
cheat = cheat_manager_new(cheats);
|
|
|
|
|
|
|
|
if (!cheat)
|
2016-05-24 20:01:43 +00:00
|
|
|
goto error;
|
2014-12-15 21:40:23 +00:00
|
|
|
|
|
|
|
for (i = 0; i < cheats; i++)
|
|
|
|
{
|
2016-10-21 03:57:40 +00:00
|
|
|
char key[64];
|
|
|
|
char desc_key[256];
|
|
|
|
char code_key[256];
|
|
|
|
char enable_key[256];
|
2015-06-12 21:14:55 +00:00
|
|
|
char *tmp = NULL;
|
|
|
|
bool tmp_bool = false;
|
2014-12-15 21:40:23 +00:00
|
|
|
|
2016-10-21 03:57:40 +00:00
|
|
|
key[0] = desc_key[0] = code_key[0] = enable_key[0] = '\0';
|
|
|
|
|
2016-06-20 03:03:41 +00:00
|
|
|
snprintf(key, sizeof(key), "cheat%u", i);
|
|
|
|
snprintf(desc_key, sizeof(desc_key), "cheat%u_desc", i);
|
|
|
|
snprintf(code_key, sizeof(code_key), "cheat%u_code", i);
|
2014-12-15 21:40:23 +00:00
|
|
|
snprintf(enable_key, sizeof(enable_key), "cheat%u_enable", i);
|
|
|
|
|
2017-01-11 06:25:42 +00:00
|
|
|
if (config_get_string(conf, desc_key, &tmp) && !string_is_empty(tmp))
|
2014-12-15 21:40:23 +00:00
|
|
|
cheat->cheats[i].desc = strdup(tmp);
|
|
|
|
|
2017-01-11 06:25:42 +00:00
|
|
|
if (config_get_string(conf, code_key, &tmp) && !string_is_empty(tmp))
|
2014-12-15 21:40:23 +00:00
|
|
|
cheat->cheats[i].code = strdup(tmp);
|
|
|
|
|
|
|
|
if (config_get_bool(conf, enable_key, &tmp_bool))
|
|
|
|
cheat->cheats[i].state = tmp_bool;
|
2015-07-09 18:16:30 +00:00
|
|
|
|
|
|
|
if (tmp)
|
|
|
|
free(tmp);
|
2014-12-15 21:40:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
config_file_free(conf);
|
|
|
|
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_state = cheat;
|
2015-12-01 02:00:31 +00:00
|
|
|
|
|
|
|
return true;
|
2016-05-24 20:01:43 +00:00
|
|
|
|
|
|
|
error:
|
|
|
|
config_file_free(conf);
|
|
|
|
return false;
|
2014-12-15 21:40:23 +00:00
|
|
|
}
|
|
|
|
|
2014-12-06 14:47:25 +00:00
|
|
|
|
2015-12-01 01:55:07 +00:00
|
|
|
bool cheat_manager_realloc(unsigned new_size)
|
2014-12-06 14:47:25 +00:00
|
|
|
{
|
|
|
|
unsigned i;
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2014-12-06 14:47:25 +00:00
|
|
|
|
2015-04-03 17:53:20 +00:00
|
|
|
if (!handle)
|
|
|
|
return false;
|
|
|
|
|
2014-12-06 14:47:25 +00:00
|
|
|
if (!handle->cheats)
|
|
|
|
handle->cheats = (struct item_cheat*)
|
|
|
|
calloc(new_size, sizeof(struct item_cheat));
|
|
|
|
else
|
|
|
|
handle->cheats = (struct item_cheat*)
|
|
|
|
realloc(handle->cheats, new_size * sizeof(struct item_cheat));
|
|
|
|
|
|
|
|
if (!handle->cheats)
|
|
|
|
{
|
|
|
|
handle->buf_size = handle->size = 0;
|
|
|
|
handle->cheats = NULL;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
handle->buf_size = new_size;
|
2014-12-15 19:53:23 +00:00
|
|
|
handle->size = new_size;
|
2014-12-06 14:47:25 +00:00
|
|
|
|
2014-12-15 19:53:23 +00:00
|
|
|
for (i = 0; i < handle->size; i++)
|
2014-12-06 14:47:25 +00:00
|
|
|
{
|
|
|
|
handle->cheats[i].desc = NULL;
|
|
|
|
handle->cheats[i].code = NULL;
|
|
|
|
handle->cheats[i].state = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-12-01 02:00:31 +00:00
|
|
|
void cheat_manager_free(void)
|
2011-04-17 11:30:59 +00:00
|
|
|
{
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2011-04-17 11:30:59 +00:00
|
|
|
if (!handle)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (handle->cheats)
|
|
|
|
{
|
2015-09-28 16:22:27 +00:00
|
|
|
unsigned i;
|
|
|
|
|
2013-10-22 13:08:17 +00:00
|
|
|
for (i = 0; i < handle->size; i++)
|
2011-04-17 11:30:59 +00:00
|
|
|
{
|
2014-12-15 20:03:00 +00:00
|
|
|
free(handle->cheats[i].desc);
|
2011-04-17 13:58:18 +00:00
|
|
|
free(handle->cheats[i].code);
|
2011-04-17 11:30:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
free(handle->cheats);
|
|
|
|
}
|
|
|
|
|
|
|
|
free(handle);
|
|
|
|
}
|
|
|
|
|
2014-12-16 04:14:22 +00:00
|
|
|
void cheat_manager_update(cheat_manager_t *handle, unsigned handle_idx)
|
2011-04-17 14:53:19 +00:00
|
|
|
{
|
2015-12-07 14:32:14 +00:00
|
|
|
char msg[256];
|
2015-01-09 14:33:58 +00:00
|
|
|
|
2015-04-03 17:53:20 +00:00
|
|
|
if (!handle)
|
|
|
|
return;
|
|
|
|
|
2014-09-02 03:32:04 +00:00
|
|
|
snprintf(msg, sizeof(msg), "Cheat: #%u [%s]: %s",
|
2014-12-16 04:14:22 +00:00
|
|
|
handle_idx, handle->cheats[handle_idx].state ? "ON" : "OFF",
|
2016-10-27 09:27:02 +00:00
|
|
|
(handle->cheats[handle_idx].desc) ?
|
2014-12-16 04:14:22 +00:00
|
|
|
(handle->cheats[handle_idx].desc) : (handle->cheats[handle_idx].code)
|
2014-12-16 01:20:06 +00:00
|
|
|
);
|
2016-12-22 22:36:11 +00:00
|
|
|
runloop_msg_queue_push(msg, 1, 180, true);
|
2012-04-21 21:25:32 +00:00
|
|
|
RARCH_LOG("%s\n", msg);
|
2011-04-17 14:53:19 +00:00
|
|
|
}
|
|
|
|
|
2015-12-01 02:03:33 +00:00
|
|
|
void cheat_manager_toggle_index(unsigned i)
|
2015-09-06 01:51:08 +00:00
|
|
|
{
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2015-09-06 01:51:08 +00:00
|
|
|
if (!handle)
|
|
|
|
return;
|
|
|
|
|
|
|
|
handle->cheats[i].state = !handle->cheats[i].state;
|
|
|
|
cheat_manager_update(handle, i);
|
|
|
|
}
|
2011-09-05 15:57:30 +00:00
|
|
|
|
2017-05-21 11:14:21 +00:00
|
|
|
void cheat_manager_toggle(void)
|
2011-04-17 11:30:59 +00:00
|
|
|
{
|
2017-05-21 11:14:21 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
|
|
|
|
2014-10-03 13:13:37 +00:00
|
|
|
if (!handle)
|
|
|
|
return;
|
|
|
|
|
2011-04-17 11:30:59 +00:00
|
|
|
handle->cheats[handle->ptr].state ^= true;
|
2015-12-01 01:43:34 +00:00
|
|
|
cheat_manager_apply_cheats();
|
2014-12-16 04:14:22 +00:00
|
|
|
cheat_manager_update(handle, handle->ptr);
|
2011-04-17 14:53:19 +00:00
|
|
|
}
|
|
|
|
|
2017-05-21 11:14:21 +00:00
|
|
|
void cheat_manager_index_next(void)
|
2011-04-17 14:53:19 +00:00
|
|
|
{
|
2017-05-21 11:14:21 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
|
|
|
|
2014-10-03 13:13:37 +00:00
|
|
|
if (!handle)
|
|
|
|
return;
|
2015-01-09 14:33:58 +00:00
|
|
|
|
2011-04-17 14:53:19 +00:00
|
|
|
handle->ptr = (handle->ptr + 1) % handle->size;
|
2014-12-16 04:14:22 +00:00
|
|
|
cheat_manager_update(handle, handle->ptr);
|
2011-04-17 14:53:19 +00:00
|
|
|
}
|
|
|
|
|
2017-05-21 11:14:21 +00:00
|
|
|
void cheat_manager_index_prev(void)
|
2011-04-17 14:53:19 +00:00
|
|
|
{
|
2017-05-21 11:14:21 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
|
|
|
|
2014-10-03 13:13:37 +00:00
|
|
|
if (!handle)
|
|
|
|
return;
|
|
|
|
|
2011-04-17 14:53:19 +00:00
|
|
|
if (handle->ptr == 0)
|
|
|
|
handle->ptr = handle->size - 1;
|
|
|
|
else
|
|
|
|
handle->ptr--;
|
|
|
|
|
2014-12-16 04:14:22 +00:00
|
|
|
cheat_manager_update(handle, handle->ptr);
|
2011-04-17 11:30:59 +00:00
|
|
|
}
|
2015-09-06 01:51:08 +00:00
|
|
|
|
2015-12-01 01:49:27 +00:00
|
|
|
const char *cheat_manager_get_code(unsigned i)
|
2015-09-06 01:51:08 +00:00
|
|
|
{
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2015-09-06 01:51:08 +00:00
|
|
|
if (!handle)
|
|
|
|
return NULL;
|
|
|
|
return handle->cheats[i].code;
|
|
|
|
}
|
|
|
|
|
2015-12-01 02:07:16 +00:00
|
|
|
const char *cheat_manager_get_desc(unsigned i)
|
2015-09-06 01:51:08 +00:00
|
|
|
{
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2015-09-06 01:51:08 +00:00
|
|
|
if (!handle)
|
|
|
|
return NULL;
|
|
|
|
return handle->cheats[i].desc;
|
|
|
|
}
|
|
|
|
|
2015-12-01 01:49:27 +00:00
|
|
|
bool cheat_manager_get_code_state(unsigned i)
|
2015-09-06 01:51:08 +00:00
|
|
|
{
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2015-09-06 01:51:08 +00:00
|
|
|
if (!handle)
|
|
|
|
return false;
|
|
|
|
return handle->cheats[i].state;
|
|
|
|
}
|
2015-12-01 01:43:34 +00:00
|
|
|
|
|
|
|
void cheat_manager_state_free(void)
|
|
|
|
{
|
2015-12-01 02:00:31 +00:00
|
|
|
cheat_manager_free();
|
|
|
|
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_state = NULL;
|
2015-12-01 01:43:34 +00:00
|
|
|
}
|
2015-12-01 02:07:16 +00:00
|
|
|
|
|
|
|
bool cheat_manager_alloc_if_empty(void)
|
|
|
|
{
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *handle = cheat_manager_state;
|
2015-12-01 02:07:16 +00:00
|
|
|
|
2015-12-01 02:29:32 +00:00
|
|
|
if (!handle)
|
2015-12-01 02:07:16 +00:00
|
|
|
{
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_t *tmp = cheat_manager_new(0);
|
2015-12-01 02:07:16 +00:00
|
|
|
|
2015-12-01 02:29:32 +00:00
|
|
|
if (!tmp)
|
2015-12-01 02:07:16 +00:00
|
|
|
return false;
|
2015-12-01 02:29:32 +00:00
|
|
|
cheat_manager_state = tmp;
|
2015-12-01 02:07:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|