make cheat system not so flaky with respect to numbers of cheats. it is my hypothesis that every single person whose cheats slay the emulator has entered more than 100 cheats and until now, 10,000 crashed emulator users later, nobody has bothered to tell us. should support unlimited cheats now, but i refuse to test cheats so someone else tell me if i broke something.

This commit is contained in:
zeromus 2010-07-16 02:40:54 +00:00
parent c5643835a1
commit fb7b9a2104
3 changed files with 76 additions and 87 deletions

View File

@ -1,8 +1,4 @@
/* Copyright (C) 2006 yopyop
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright 2009 DeSmuME team
/* Copyright 2009-2010 DeSmuME team
This file is part of DeSmuME
@ -34,10 +30,7 @@ CHEATSEARCH *cheatSearch = NULL;
void CHEATS::clear()
{
memset(list, 0, sizeof(list));
for (int i = 0; i < MAX_CHEAT_LIST; i++)
list[i].type = 0xFF;
num = 0;
list.resize(0);
currentGet = 0;
}
@ -54,7 +47,8 @@ void CHEATS::init(char *path)
BOOL CHEATS::add(u8 size, u32 address, u32 val, char *description, BOOL enabled)
{
if (num == MAX_CHEAT_LIST) return FALSE;
size_t num = list.size();
list.push_back(CHEATS_LIST());
list[num].code[0][0] = address & 0x00FFFFFF;
list[num].code[0][1] = val;
list[num].num = 1;
@ -62,13 +56,12 @@ BOOL CHEATS::add(u8 size, u32 address, u32 val, char *description, BOOL enabled)
list[num].size = size;
strcpy(list[num].description, description);
list[num].enabled = enabled;
num++;
return TRUE;
}
BOOL CHEATS::update(u8 size, u32 address, u32 val, char *description, BOOL enabled, u32 pos)
{
if (pos > num) return FALSE;
if (pos >= list.size()) return FALSE;
list[pos].code[0][0] = address & 0x00FFFFFF;
list[pos].code[0][1] = val;
list[pos].num = 1;
@ -79,7 +72,7 @@ BOOL CHEATS::update(u8 size, u32 address, u32 val, char *description, BOOL enabl
return TRUE;
}
void CHEATS::ARparser(CHEATS_LIST list)
void CHEATS::ARparser(CHEATS_LIST& list)
{
u8 type = 0;
u8 subtype = 0;
@ -432,7 +425,8 @@ BOOL CHEATS::XXcodePreParser(CHEATS_LIST *list, char *code)
BOOL CHEATS::add_AR(char *code, char *description, BOOL enabled)
{
if (num == MAX_CHEAT_LIST) return FALSE;
//if (num == MAX_CHEAT_LIST) return FALSE;
size_t num = list.size();
if (!XXcodePreParser(&list[num], code)) return FALSE;
@ -440,13 +434,12 @@ BOOL CHEATS::add_AR(char *code, char *description, BOOL enabled)
strcpy(list[num].description, description);
list[num].enabled = enabled;
num++;
return TRUE;
}
BOOL CHEATS::update_AR(char *code, char *description, BOOL enabled, u32 pos)
{
if (pos > num) return FALSE;
if (pos >= list.size()) return FALSE;
if (code != NULL)
{
@ -461,7 +454,8 @@ BOOL CHEATS::update_AR(char *code, char *description, BOOL enabled, u32 pos)
BOOL CHEATS::add_CB(char *code, char *description, BOOL enabled)
{
if (num == MAX_CHEAT_LIST) return FALSE;
//if (num == MAX_CHEAT_LIST) return FALSE;
size_t num = list.size();
if (!XXcodePreParser(&list[num], code)) return FALSE;
@ -469,13 +463,12 @@ BOOL CHEATS::add_CB(char *code, char *description, BOOL enabled)
strcpy(list[num].description, description);
list[num].enabled = enabled;
num++;
return TRUE;
}
BOOL CHEATS::update_CB(char *code, char *description, BOOL enabled, u32 pos)
{
if (pos > num) return FALSE;
if (pos >= list.size()) return FALSE;
if (code != NULL)
{
@ -489,15 +482,11 @@ BOOL CHEATS::update_CB(char *code, char *description, BOOL enabled, u32 pos)
BOOL CHEATS::remove(u32 pos)
{
if (pos > num) return FALSE;
if (num == 0) return FALSE;
if (pos >= list.size()) return FALSE;
if (list.size() == 0) return FALSE;
for (int i = pos; i < num; i++)
memcpy(&list[i], &list[i+1], sizeof(CHEATS_LIST));
list.erase(list.begin()+pos);
memset(&list[num], 0, sizeof(CHEATS_LIST));
num--;
return TRUE;
}
@ -509,13 +498,14 @@ void CHEATS::getListReset()
BOOL CHEATS::getList(CHEATS_LIST *cheat)
{
if (currentGet > num)
if (currentGet >= list.size())
{
currentGet = 0;
return FALSE;
}
memcpy(cheat, &list[currentGet++], sizeof(CHEATS_LIST));
if (currentGet > num)
//memcpy(cheat, &list[currentGet++], sizeof(CHEATS_LIST));
*cheat = list[currentGet++];
if (currentGet >= list.size())
{
currentGet = 0;
return FALSE;
@ -525,14 +515,14 @@ BOOL CHEATS::getList(CHEATS_LIST *cheat)
BOOL CHEATS::get(CHEATS_LIST *cheat, u32 pos)
{
if (pos > num) return FALSE;
memcpy(cheat, &list[pos], sizeof(CHEATS_LIST));
if (pos >= list.size()) return FALSE;
*cheat = list[pos];
return TRUE;
}
u32 CHEATS::getSize()
{
return num;
return list.size();
}
BOOL CHEATS::save()
@ -552,7 +542,7 @@ BOOL CHEATS::save()
fprintf(flist, "Name=%s\n", buf);
fprintf(flist, "Serial=%s\n", gameInfo.ROMserial);
fputs("\n; cheats list\n", flist);
for (int i = 0; i < num; i++)
for (size_t i = 0; i < list.size(); i++)
{
if (list[i].num == 0) continue;
memset(buf, 0, sizeof(buf));
@ -612,7 +602,6 @@ BOOL CHEATS::load()
FILE *flist = fopen((char *)filename, "r");
char buf[sizeof(list[0].code) * 2 + 200] = { 0 };
u32 last = 0;
CHEATS_LIST tmp_cht = { 0 };
char tmp_code[sizeof(list[0].code) * 2] = { 0 };
u32 line = 0;
@ -623,6 +612,7 @@ BOOL CHEATS::load()
last = 0; line = 0;
while (!feof(flist))
{
CHEATS_LIST tmp_cht;
line++; // only for debug
memset(buf, 0, sizeof(buf));
if (fgets(buf, sizeof(buf), flist) == NULL) {
@ -687,49 +677,49 @@ BOOL CHEATS::load()
sscanf_s(tmp_buf, "%x", &tmp_cht.code[i][1]);
}
memcpy(&list[last], &tmp_cht, sizeof(tmp_cht));
list.push_back(tmp_cht);
last++;
}
fclose(flist);
num = last;
INFO("Added %i cheat codes\n", num);
INFO("Added %i cheat codes\n", list.size());
return TRUE;
}
return FALSE;
}
BOOL CHEATS::push()
{
if (stack) return FALSE;
stack = new u8 [sizeof(list)];
memcpy(stack, list, sizeof(list));
numStack = num;
return TRUE;
}
BOOL CHEATS::pop()
{
if (!stack) return FALSE;
memcpy(list, stack, sizeof(list));
num = numStack;
delete [] stack;
stack = NULL;
return TRUE;
}
void CHEATS::stackClear()
{
if (!stack) return;
delete [] stack;
stack = NULL;
}
//BOOL CHEATS::push()
//{
// if (stack) return FALSE;
// stack = new u8 [sizeof(list)];
// memcpy(stack, list, sizeof(list));
// numStack = num;
// return TRUE;
//}
//
//BOOL CHEATS::pop()
//{
// if (!stack) return FALSE;
// memcpy(list, stack, sizeof(list));
// num = numStack;
// delete [] stack;
// stack = NULL;
// return TRUE;
//}
//
//void CHEATS::stackClear()
//{
// if (!stack) return;
// delete [] stack;
// stack = NULL;
//}
void CHEATS::process()
{
if (CommonSettings.cheatsDisable) return;
if (!num) return;
for (int i = 0; i < num; i++)
if (!list.size() == 0) return;
size_t num = list.size();
for (size_t i = 0; i < num; i++)
{
if (!list[i].enabled) continue;

View File

@ -1,8 +1,4 @@
/* Copyright (C) 2006 yopyop
yopyop156@ifrance.com
yopyop156.ifrance.com
Copyright 2009 DeSmuME team
/* Copyright (C) 2009-2010 DeSmuME team
This file is part of DeSmuME
@ -23,14 +19,20 @@
#include <string.h>
#include "common.h"
#include <vector>
#define CHEAT_VERSION_MAJOR 2
#define CHEAT_VERSION_MINOR 0
#define MAX_CHEAT_LIST 100
#define MAX_XX_CODE 255
typedef struct
struct CHEATS_LIST
{
CHEATS_LIST()
{
memset(this,0,sizeof(*this));
type = 0xFF;
}
u8 type; // 0 - internal cheat system
// 1 - Action Replay
// 2 - Codebreakers
@ -39,14 +41,12 @@ typedef struct
char description[75];
int num;
u8 size;
} CHEATS_LIST;
};
class CHEATS
{
private:
CHEATS_LIST list[MAX_CHEAT_LIST];
u16 num;
std::vector<CHEATS_LIST> list;
u8 filename[MAX_PATH];
u32 currentGet;
@ -54,15 +54,16 @@ private:
u16 numStack;
void clear();
void ARparser(CHEATS_LIST cheat);
void ARparser(CHEATS_LIST& cheat);
BOOL XXcodePreParser(CHEATS_LIST *cheat, char *code);
char *clearCode(char *s);
public:
CHEATS():
num(0), currentGet(0), stack(0), numStack(0)
CHEATS()
: currentGet(0)
, stack(0)
, numStack(0)
{
memset(list, 0, sizeof(list));
memset(filename, 0, sizeof(filename));
}
~CHEATS() {}
@ -81,9 +82,9 @@ public:
u32 getSize();
BOOL save();
BOOL load();
BOOL push();
BOOL pop();
void stackClear();
//BOOL push();
//BOOL pop();
//void stackClear();
void process();
void getXXcodeString(CHEATS_LIST cheat, char *res_buf);
};

View File

@ -1,4 +1,4 @@
/* Copyright 2009 DeSmuME team
/* Copyright 2009-2010 DeSmuME team
This file is part of DeSmuME
@ -967,17 +967,15 @@ INT_PTR CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM l
void CheatsListDialog(HWND hwnd)
{
if (!cheats->push()) return;
memset(&tempCheat, 0, sizeof(tempCheat));
CHEATS save = *cheats;
tempCheat = CHEATS_LIST();
u32 res=DialogBoxW(hAppInst, MAKEINTRESOURCEW(IDD_CHEAT_LIST), hwnd, (DLGPROC) CheatsListBox_Proc);
if (res)
{
cheats->save();
cheats->stackClear();
}
else
{
cheats->pop();
*cheats = save;
}
}