diff --git a/desmume/src/cheatSystem.cpp b/desmume/src/cheatSystem.cpp index a17cbfa14..4d2c4d8dd 100644 --- a/desmume/src/cheatSystem.cpp +++ b/desmume/src/cheatSystem.cpp @@ -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; diff --git a/desmume/src/cheatSystem.h b/desmume/src/cheatSystem.h index bcea4a1b5..e5982632e 100644 --- a/desmume/src/cheatSystem.h +++ b/desmume/src/cheatSystem.h @@ -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 #include "common.h" +#include #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 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); }; diff --git a/desmume/src/windows/cheatsWin.cpp b/desmume/src/windows/cheatsWin.cpp index e76d754b2..c0f37071c 100644 --- a/desmume/src/windows/cheatsWin.cpp +++ b/desmume/src/windows/cheatsWin.cpp @@ -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; } }