winport:
- it is now possible to add Action Replay to the cheats (THIS IS ONLY ADD TO CHEATS and NOT EXECUTE AR CODE)
This commit is contained in:
parent
e585142003
commit
654952bcf8
|
@ -28,6 +28,8 @@
|
|||
#include "MMU.h"
|
||||
#include "debug.h"
|
||||
|
||||
//#define AR_DISASM 1
|
||||
|
||||
static CHEATS_LIST cheats[MAX_CHEAT_LIST];
|
||||
static u16 cheatsNum = 0;
|
||||
static u8 cheatFilename[MAX_PATH];
|
||||
|
@ -83,14 +85,207 @@ BOOL cheatsUpdate(u8 size, u32 address, u32 val, char *description, BOOL enabled
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef AR_DISASM
|
||||
void cheatsDisassemble_AR(u32 hi, u32 lo)
|
||||
{
|
||||
u8 type = (hi >> 28);
|
||||
u32 hi_save = hi;
|
||||
|
||||
hi &= 0x0FFFFFFF;
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case 0x00:
|
||||
if (hi==0)
|
||||
INFO("AR: manual hook\n");
|
||||
else
|
||||
if ((hi==0x0000AA99) && (lo=0))
|
||||
INFO("AR: parameter bytes 9..10 for above code (padded with 00s)\n");
|
||||
else
|
||||
INFO("AR: word [%07X+%07X] = %08X\n", hi, 0, lo);
|
||||
break;
|
||||
case 0x01: INFO("AR: half [%07X+%07X] = %04X\n", hi, 0, lo); break;
|
||||
case 0x02: INFO("AR: byte [%07X+%07X] = %02X\n", hi, 0, lo); break;
|
||||
case 0x03: INFO("AR: IF %08X > word[%07X] ; unsigned\n", lo, hi); break;
|
||||
case 0x04:
|
||||
{
|
||||
if ((hi == 04332211) && (lo == 88776655))
|
||||
{
|
||||
INFO("AR: parameter bytes 1..8 for above code (example)\n");
|
||||
}
|
||||
else
|
||||
INFO("AR: IF %08X < word[%07X] ; unsigned\n", lo, hi);
|
||||
}
|
||||
break;
|
||||
case 0x05: INFO("AR: IF %08X = word[%07X]\n", lo, hi); break;
|
||||
case 0x06: INFO("AR: IF %08X <> word[%07X]\n", lo, hi); break;
|
||||
case 0x07: INFO("AR: IF %04X > ((not %04X) AND half[%07X])\n", hi, (lo >> 4), (lo & 0xF)); break;
|
||||
case 0x08: INFO("AR: IF %04X < ((not %04X) AND half[%07X])\n", hi, (lo >> 4), (lo & 0xF)); break;
|
||||
case 0x09: INFO("AR: IF %04X = ((not %04X) AND half[%07X])\n", hi, (lo >> 4), (lo & 0xF)); break;
|
||||
case 0x0A: INFO("AR: IF %04X <> ((not %04X) AND half[%07X])\n", hi, (lo >> 4), (lo & 0xF)); break;
|
||||
case 0x0B: INFO("AR: offset = word[%07X + %07X]\n", hi, 0); break;
|
||||
case 0x0C:
|
||||
{
|
||||
switch (hi >> 24)
|
||||
{
|
||||
case 0x0:INFO("AR: FOR loopcount=0 to %08X ;execute %08X times\n", lo, (lo+1)); break;
|
||||
case 0x2:INFO("AR: offset = address of the C4000000 code ???\n");break;
|
||||
case 0x5:INFO("AR: counter=counter+1, IF (counter AND YYY) = XXX\n");break;
|
||||
case 0x6:INFO("AR: [%07X]=%07 (offset)\n", hi, 0);break;
|
||||
default: INFO("AR: ERROR uknown command 0x%2X at %08X:%08X\n", type, hi, lo); break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x0D:
|
||||
{
|
||||
switch (hi >> 24)
|
||||
{
|
||||
case 0x0:INFO("AR: ENDIF\n");break;
|
||||
case 0x1:INFO("AR: NEXT loopcount\n");break;
|
||||
case 0x2:INFO("AR: NEXT loopcount & Flush\n");break;
|
||||
case 0x3:INFO("AR: offset = %07X\n", hi);break;
|
||||
case 0x4:INFO("AR: datareg = datareg + %07X\n", hi);break;
|
||||
case 0x5:INFO("AR: datareg = %07X\n",hi);break;
|
||||
case 0x6:INFO("AR: \n");break;
|
||||
case 0x7:INFO("AR: \n");break;
|
||||
case 0x8:INFO("AR: \n");break;
|
||||
case 0x9:INFO("AR: \n");break;
|
||||
case 0xA:INFO("AR: \n");break;
|
||||
case 0xB:INFO("AR: \n");break;
|
||||
case 0xC:INFO("AR: \n");break;
|
||||
default: INFO("AR: ERROR uknown command 0x%2X at %08X:%08X\n", type, hi, lo); break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0x0E: INFO("AR: copy %08X parameter bytes to [%08X + %07X...]\n", lo, hi, 0); break;
|
||||
case 0x0F: INFO("AR: copy %08X bytes from [%07X...] to [%07X...]\n", lo, 0, hi); break;
|
||||
default: INFO("AR: ERROR uknown command 0x%2X at %08X:%08X\n", type, hi, lo); break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void cheats_ARparser(CHEATS_LIST cheat)
|
||||
{
|
||||
for (int i=0; i < cheat.num; i++)
|
||||
{
|
||||
#ifdef AR_DISASM
|
||||
cheatsDisassemble_AR(cheat.hi[i], cheat.lo[i]);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
BOOL cheatsXXcodePreparser(CHEATS_LIST *cheat, char *code)
|
||||
{
|
||||
u16 count = 0;
|
||||
u16 t = 0;
|
||||
char tmp_buf[sizeof(cheat->hi)+sizeof(cheat->lo)];
|
||||
|
||||
memset(tmp_buf, 0, sizeof(tmp_buf));
|
||||
// remove wrong chars
|
||||
for (int i=0; i < strlen(code); i++)
|
||||
{
|
||||
switch (code[i])
|
||||
{
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
case 'A':
|
||||
case 'a':
|
||||
case 'B':
|
||||
case 'b':
|
||||
case 'C':
|
||||
case 'c':
|
||||
case 'D':
|
||||
case 'd':
|
||||
case 'E':
|
||||
case 'e':
|
||||
case 'F':
|
||||
case 'f':
|
||||
tmp_buf[t] = code[i];
|
||||
t++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ((strlen(tmp_buf) % 8) != 0) return FALSE; // error
|
||||
if ((strlen(tmp_buf) % 16) != 0) return FALSE; // error
|
||||
|
||||
// TODO: syntax check
|
||||
count = (strlen(tmp_buf) / 16);
|
||||
for (int i=0; i < count; i++)
|
||||
{
|
||||
char buf[8] = {0};
|
||||
strncpy(buf, tmp_buf+(i*16), 8);
|
||||
sscanf_s(buf, "%x", &cheat->hi[i]);
|
||||
strncpy(buf, tmp_buf+(i*16) + 8, 8);
|
||||
sscanf_s(buf, "%x", &cheat->lo[i]);
|
||||
}
|
||||
|
||||
cheat->num = count;
|
||||
cheat->size = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL cheatsAdd_AR(char *code, char *description, BOOL enabled)
|
||||
{
|
||||
return FALSE;
|
||||
if (cheatsNum == MAX_CHEAT_LIST) return FALSE;
|
||||
|
||||
if (!cheatsXXcodePreparser(&cheats[cheatsNum], code)) return FALSE;
|
||||
|
||||
cheats[cheatsNum].type = 1;
|
||||
|
||||
strcpy(cheats[cheatsNum].description, description);
|
||||
cheats[cheatsNum].enabled = enabled;
|
||||
cheatsNum++;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL cheatsUpdate_AR(char *code, char *description, BOOL enabled, u32 pos)
|
||||
{
|
||||
if (pos > cheatsNum) return FALSE;
|
||||
|
||||
if (!cheatsXXcodePreparser(&cheats[pos], code)) return FALSE;
|
||||
|
||||
cheats[pos].type = 1;
|
||||
|
||||
strcpy(cheats[pos].description, description);
|
||||
cheats[pos].enabled = enabled;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL cheatsAdd_CB(char *code, char *description, BOOL enabled)
|
||||
{
|
||||
return FALSE;
|
||||
if (cheatsNum == MAX_CHEAT_LIST) return FALSE;
|
||||
|
||||
if (!cheatsXXcodePreparser(&cheats[cheatsNum], code)) return FALSE;
|
||||
|
||||
cheats[cheatsNum].type = 2;
|
||||
|
||||
strcpy(cheats[cheatsNum].description, description);
|
||||
cheats[cheatsNum].enabled = enabled;
|
||||
cheatsNum++;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL cheatsUpdate_CB(char *code, char *description, BOOL enabled, u32 pos)
|
||||
{
|
||||
if (pos > cheatsNum) return FALSE;
|
||||
|
||||
if (!cheatsXXcodePreparser(&cheats[pos], code)) return FALSE;
|
||||
|
||||
cheats[pos].type = 2;
|
||||
|
||||
strcpy(cheats[pos].description, description);
|
||||
cheats[pos].enabled = enabled;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL cheatsRemove(u32 pos)
|
||||
|
@ -157,9 +352,10 @@ BOOL cheatsSave()
|
|||
|
||||
if (cheats[i].num > 0)
|
||||
{
|
||||
fprintf(fcheat, "Data=");
|
||||
for (int t = 0; t < cheats[i].num; t++)
|
||||
{
|
||||
fprintf(fcheat, "Data=%08X%08X", cheats[i].hi[t], cheats[i].lo[t]);
|
||||
fprintf(fcheat, "%08X%08X", cheats[i].hi[t], cheats[i].lo[t]);
|
||||
if (t < (cheats[i].num - 1)) fputs(",", fcheat);
|
||||
}
|
||||
fputs("\n", fcheat);
|
||||
|
@ -230,6 +426,8 @@ BOOL cheatsLoad()
|
|||
offs+=8;
|
||||
strncpy(tmp_buf, (char *)buf+offs, 8);
|
||||
sscanf_s(tmp_buf, "%x", &cheats[last].lo[j]);
|
||||
offs+=8;
|
||||
if (buf[offs] != ',') continue; //error
|
||||
offs++; // skip comma
|
||||
}
|
||||
}
|
||||
|
@ -305,6 +503,7 @@ void cheatsProcess()
|
|||
break;
|
||||
|
||||
case 1: // Action Replay
|
||||
cheats_ARparser(cheats[i]);
|
||||
break;
|
||||
case 2: // Codebreaker
|
||||
break;
|
||||
|
@ -313,6 +512,17 @@ void cheatsProcess()
|
|||
}
|
||||
}
|
||||
|
||||
void cheatGetXXcodeString(CHEATS_LIST cheat, char *res_buf)
|
||||
{
|
||||
char buf[50] = { 0 };
|
||||
|
||||
for (int i=0; i < cheat.num; i++)
|
||||
{
|
||||
sprintf(buf, "%08X %08X\n", cheat.hi[i], cheat.lo[i]);
|
||||
strcat(res_buf, buf);
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================== search
|
||||
u8 *searchStatMem = NULL;
|
||||
u8 *searchMem = NULL;
|
||||
|
|
|
@ -45,7 +45,9 @@ extern void cheatsInit(char *path);
|
|||
extern BOOL cheatsAdd(u8 size, u32 address, u32 val, char *description, BOOL enabled);
|
||||
extern BOOL cheatsUpdate(u8 size, u32 address, u32 val, char *description, BOOL enabled, u32 pos);
|
||||
extern BOOL cheatsAdd_AR(char *code, char *description, BOOL enabled);
|
||||
extern BOOL cheatsUpdate_AR(char *code, char *description, BOOL enabled, u32 pos);
|
||||
extern BOOL cheatsAdd_CB(char *code, char *description, BOOL enabled);
|
||||
extern BOOL cheatsUpdate_CB(char *code, char *description, BOOL enabled, u32 pos);
|
||||
extern BOOL cheatsRemove(u32 pos);
|
||||
extern void cheatsGetListReset();
|
||||
extern BOOL cheatsGetList(CHEATS_LIST *cheat);
|
||||
|
@ -57,6 +59,7 @@ extern BOOL cheatsPush();
|
|||
extern BOOL cheatsPop();
|
||||
extern void cheatsStackClear();
|
||||
extern void cheatsProcess();
|
||||
extern void cheatGetXXcodeString(CHEATS_LIST cheat, char *res_buf);
|
||||
|
||||
// ==================================================== cheat search
|
||||
extern void cheatsSearchInit(u8 type, u8 size, u8 sign);
|
||||
|
|
|
@ -45,6 +45,8 @@ static u8 searchAddFreeze = 1;
|
|||
static u8 searchAddSize = 0;
|
||||
static char editBuf[3][75] = { 0 };
|
||||
static u32 cheatEditPos = 0;
|
||||
static u8 cheatXXtype = 0;
|
||||
static u8 cheatXXaction = 0;
|
||||
|
||||
static HWND searchWnd = NULL;
|
||||
static HWND searchListView = NULL;
|
||||
|
@ -447,6 +449,155 @@ BOOL CALLBACK CheatsEditProc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
|
|||
}
|
||||
return FALSE;
|
||||
}
|
||||
//============================================================================== Action Replay
|
||||
BOOL CALLBACK CheatsAdd_XX_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
|
||||
{
|
||||
switch(msg)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
SendMessage(GetDlgItem(dialog, IDC_EDIT2), EM_FMTLINES, (WPARAM)TRUE, (LPARAM)0);
|
||||
|
||||
if (cheatXXtype == 0)
|
||||
{
|
||||
if (cheatXXaction == 0) // add
|
||||
{
|
||||
SetWindowText(dialog, "Add Action Replay code");
|
||||
tempCheat.enabled = TRUE;
|
||||
}
|
||||
else // edit
|
||||
{
|
||||
SetWindowText(dialog, "Edit Action Replay code");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cheatXXaction == 0) // add
|
||||
{
|
||||
SetWindowText(dialog, "Add Codebreaker code");
|
||||
tempCheat.enabled = TRUE;
|
||||
}
|
||||
else // edit
|
||||
{
|
||||
SetWindowText(dialog, "Edit Codebreaker code");
|
||||
}
|
||||
}
|
||||
|
||||
if (cheatXXaction != 0)
|
||||
{
|
||||
char buf[sizeof(tempCheat.hi)+sizeof(tempCheat.lo)] = { 0 };
|
||||
memset(buf, 0, sizeof(buf));
|
||||
|
||||
cheatGetXXcodeString(tempCheat, buf);
|
||||
SetWindowText(GetDlgItem(dialog, IDC_EDIT2), buf);
|
||||
SetWindowText(GetDlgItem(dialog, IDC_EDIT3), tempCheat.description);
|
||||
|
||||
EnableWindow(GetDlgItem(dialog, IDOK), (strlen(buf) > 16)?TRUE:FALSE);
|
||||
SetWindowText(GetDlgItem(dialog, IDOK), "Update");
|
||||
}
|
||||
CheckDlgButton(dialog, IDC_CHECK1, tempCheat.enabled?BST_CHECKED:BST_UNCHECKED);
|
||||
|
||||
SendMessage(GetDlgItem(dialog, IDC_EDIT2), EM_SETLIMITTEXT, sizeof(tempCheat.hi)+sizeof(tempCheat.lo), 0);
|
||||
SendMessage(GetDlgItem(dialog, IDC_EDIT3), EM_SETLIMITTEXT, sizeof(tempCheat.description), 0);
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
case WM_COMMAND:
|
||||
{
|
||||
switch (LOWORD(wparam))
|
||||
{
|
||||
case IDOK:
|
||||
{
|
||||
char buf[sizeof(tempCheat.hi)+sizeof(tempCheat.lo)] = { 0 };
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
GetWindowText(GetDlgItem(dialog, IDC_EDIT2), buf, sizeof(buf));
|
||||
|
||||
if (cheatXXtype == 0) // Action Replay
|
||||
{
|
||||
if (cheatXXaction == 0) // add
|
||||
{
|
||||
if (!cheatsAdd_AR(buf, tempCheat.description, tempCheat.enabled))
|
||||
{
|
||||
MessageBox(dialog, "Syntax error in Action Replay code.\nTry again", "DeSmuME",
|
||||
MB_OK | MB_ICONERROR);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else // edit
|
||||
{
|
||||
if (!cheatsUpdate_AR(buf, tempCheat.description, tempCheat.enabled, cheatEditPos))
|
||||
{
|
||||
MessageBox(dialog, "Syntax error in Action Replay code.\nTry again", "DeSmuME",
|
||||
MB_OK | MB_ICONERROR);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (cheatXXaction == 0) // add
|
||||
{
|
||||
if (!cheatsAdd_CB(buf, tempCheat.description, tempCheat.enabled))
|
||||
{
|
||||
MessageBox(dialog, "Syntax error in Codebreaker code.\nTry again", "DeSmuME",
|
||||
MB_OK | MB_ICONERROR);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else // edit
|
||||
{
|
||||
if (!cheatsUpdate_CB(buf, tempCheat.description, tempCheat.enabled, cheatEditPos))
|
||||
{
|
||||
MessageBox(dialog, "Syntax error in Codebreaker code.\nTry again", "DeSmuME",
|
||||
MB_OK | MB_ICONERROR);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
EndDialog(dialog, TRUE);
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
case IDCANCEL:
|
||||
EndDialog(dialog, FALSE);
|
||||
return TRUE;
|
||||
|
||||
case IDC_EDIT2: // code
|
||||
if (HIWORD(wparam) == EN_UPDATE)
|
||||
{
|
||||
char buf[sizeof(tempCheat.hi)+sizeof(tempCheat.lo)] = { 0 };
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
GetWindowText(GetDlgItem(dialog, IDC_EDIT2), buf, sizeof(buf));
|
||||
if (strlen(buf) < 18) // min size of code "CXXXXXXX YYYYYYYY"
|
||||
{
|
||||
EnableWindow(GetDlgItem(dialog, IDOK), FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
EnableWindow(GetDlgItem(dialog, IDOK), TRUE);
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
case IDC_EDIT3: // description
|
||||
if (HIWORD(wparam) == EN_UPDATE)
|
||||
{
|
||||
memset(tempCheat.description, 0, sizeof(tempCheat.description));
|
||||
GetWindowText(GetDlgItem(dialog, IDC_EDIT3), tempCheat.description, sizeof(tempCheat.description));
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
case IDC_CHECK1:
|
||||
if (IsDlgButtonChecked(dialog, IDC_CHECK1) == BST_CHECKED)
|
||||
tempCheat.enabled = 1;
|
||||
else
|
||||
tempCheat.enabled = 0;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
//==============================================================================
|
||||
BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
|
||||
{
|
||||
|
@ -496,12 +647,37 @@ BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpar
|
|||
lvi.pszText= "X";
|
||||
else
|
||||
lvi.pszText= "";
|
||||
switch (tempCheat.type)
|
||||
{
|
||||
case 0: // Internal
|
||||
{
|
||||
u32 row = ListView_InsertItem(cheatListView, &lvi);
|
||||
wsprintf(buf, "0x02%06X", tempCheat.hi[0]);
|
||||
ListView_SetItemText(cheatListView, row, 1, buf);
|
||||
ltoa(tempCheat.lo[0], buf, 10);
|
||||
ListView_SetItemText(cheatListView, row, 2, buf);
|
||||
ListView_SetItemText(cheatListView, row, 3, tempCheat.description);
|
||||
break;
|
||||
}
|
||||
|
||||
case 1: // Action Replay
|
||||
{
|
||||
u32 row = ListView_InsertItem(cheatListView, &lvi);
|
||||
ListView_SetItemText(cheatListView, row, 1, "Action");
|
||||
ListView_SetItemText(cheatListView, row, 2, "Replay");
|
||||
ListView_SetItemText(cheatListView, row, 3, tempCheat.description);
|
||||
break;
|
||||
}
|
||||
|
||||
case 2: // Codebreaker
|
||||
{
|
||||
u32 row = ListView_InsertItem(cheatListView, &lvi);
|
||||
ListView_SetItemText(cheatListView, row, 1, "Code");
|
||||
ListView_SetItemText(cheatListView, row, 2, "breaker");
|
||||
ListView_SetItemText(cheatListView, row, 3, tempCheat.description);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
SendMessage(cheatListView, WM_SETREDRAW, (WPARAM)TRUE,0);
|
||||
|
||||
|
@ -592,14 +768,67 @@ BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpar
|
|||
}
|
||||
return TRUE;
|
||||
|
||||
case IDC_BADD_AR:
|
||||
{
|
||||
if (LOWORD(wparam) == IDC_BADD_AR)
|
||||
{
|
||||
cheatXXtype = 0;
|
||||
}
|
||||
else
|
||||
if (LOWORD(wparam) == IDC_BADD_CB)
|
||||
{
|
||||
cheatXXtype = 1;
|
||||
}
|
||||
else
|
||||
return TRUE;
|
||||
cheatXXaction = 0; // 0 = add
|
||||
|
||||
if (DialogBox(hAppInst, MAKEINTRESOURCE(IDD_CHEAT_ADD_XX_CODE), dialog, (DLGPROC) CheatsAdd_XX_Proc))
|
||||
{
|
||||
LVITEM lvi;
|
||||
|
||||
memset(&lvi,0,sizeof(LVITEM));
|
||||
lvi.mask = LVIF_TEXT|LVIF_STATE;
|
||||
lvi.iItem = INT_MAX;
|
||||
|
||||
if (tempCheat.enabled)
|
||||
lvi.pszText= "X";
|
||||
else
|
||||
lvi.pszText= " ";
|
||||
u32 row = ListView_InsertItem(cheatListView, &lvi);
|
||||
if (cheatXXtype == 0)
|
||||
{
|
||||
ListView_SetItemText(cheatListView, row, 1, "Action");
|
||||
ListView_SetItemText(cheatListView, row, 2, "Replay");
|
||||
}
|
||||
else
|
||||
{
|
||||
ListView_SetItemText(cheatListView, row, 1, "Code");
|
||||
ListView_SetItemText(cheatListView, row, 2, "breaker");
|
||||
}
|
||||
ListView_SetItemText(cheatListView, row, 3, tempCheat.description);
|
||||
|
||||
EnableWindow(GetDlgItem(dialog, IDOK), TRUE);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
case IDC_BEDIT:
|
||||
{
|
||||
cheatEditPos = ListView_GetNextItem(cheatListView, -1, LVNI_SELECTED|LVNI_FOCUSED);
|
||||
if (cheatEditPos > cheatsGetSize()) return TRUE;
|
||||
|
||||
cheatsGet(&tempCheat, cheatEditPos);
|
||||
|
||||
switch (tempCheat.type)
|
||||
{
|
||||
case 0: // internal
|
||||
if (DialogBox(hAppInst, MAKEINTRESOURCE(IDD_CHEAT_ADD), dialog, (DLGPROC) CheatsEditProc))
|
||||
{
|
||||
char buf[256];
|
||||
cheatsGet(&tempCheat, cheatEditPos);
|
||||
if (tempCheat.enabled)
|
||||
ListView_SetItemText(cheatListView, cheatEditPos, 0, "X");
|
||||
wsprintf(buf, "0x02%06X", tempCheat.hi[0]);
|
||||
ListView_SetItemText(cheatListView, cheatEditPos, 1, buf);
|
||||
ltoa(tempCheat.lo[0], buf, 10);
|
||||
|
@ -607,6 +836,38 @@ BOOL CALLBACK CheatsListBox_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lpar
|
|||
ListView_SetItemText(cheatListView, cheatEditPos, 3, tempCheat.description);
|
||||
EnableWindow(GetDlgItem(dialog, IDOK), TRUE);
|
||||
}
|
||||
break;
|
||||
|
||||
case 1: // Action replay
|
||||
case 2: // Codebreaker
|
||||
if (tempCheat.type == 1)
|
||||
cheatXXtype = 0;
|
||||
else
|
||||
cheatXXtype = 1;
|
||||
cheatXXaction = 1; // 1 = edit
|
||||
|
||||
if (DialogBox(hAppInst, MAKEINTRESOURCE(IDD_CHEAT_ADD_XX_CODE), dialog, (DLGPROC) CheatsAdd_XX_Proc))
|
||||
{
|
||||
cheatsGet(&tempCheat, cheatEditPos);
|
||||
if (tempCheat.enabled)
|
||||
ListView_SetItemText(cheatListView, cheatEditPos, 0, "X");
|
||||
|
||||
if (cheatXXtype == 0)
|
||||
{
|
||||
ListView_SetItemText(cheatListView, cheatEditPos, 1, "Action");
|
||||
ListView_SetItemText(cheatListView, cheatEditPos, 2, "Replay");
|
||||
}
|
||||
else
|
||||
{
|
||||
ListView_SetItemText(cheatListView, cheatEditPos, 1, "Code");
|
||||
ListView_SetItemText(cheatListView, cheatEditPos, 2, "breaker");
|
||||
}
|
||||
|
||||
ListView_SetItemText(cheatListView, cheatEditPos, 3, tempCheat.description);
|
||||
EnableWindow(GetDlgItem(dialog, IDOK), TRUE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
|
||||
|
|
|
@ -155,6 +155,7 @@
|
|||
#define IDD_EMULATIONSETTINGS 916
|
||||
#define IDD_WIFISETTINGS 918
|
||||
#define IDD_MEM_VIEW 920
|
||||
#define IDD_CHEAT_ADD_XX_CODE 921
|
||||
#define IDC_BGMAP_SEL 1000
|
||||
#define IDC_BRIDGEADAPTER 1000
|
||||
#define IDC_EDIT03 1000
|
||||
|
@ -370,9 +371,7 @@
|
|||
#define IDC_LIGHT_VIEWER_LIGHT1COLOR_COLORCTRL 1312
|
||||
#define IDD_CHEAT_SEARCH 1312
|
||||
#define IDC_LIGHT_VIEWER_LIGHT1COLOR_EDIT 1313
|
||||
#define IDD_CHEAT_ADD_AR_CODE 1313
|
||||
#define IDC_LIGHT_VIEWER_LIGHT1VECTOR_EDIT 1314
|
||||
#define IDD_CHEAT_ADD_BC_CODE 1314
|
||||
#define IDC_LIGHT_VIWER_LIGHT2_GROUP 1321
|
||||
#define IDC_LIGHT_VIEWER_LIGHT2COLOR_COLORCTRL 1322
|
||||
#define IDC_LIGHT_VIEWER_LIGHT2COLOR_EDIT 1323
|
||||
|
|
|
@ -720,32 +720,15 @@ FONT 8, "MS Shell Dlg", 400, 0, 1
|
|||
|
||||
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
IDD_CHEAT_ADD_AR_CODE DIALOGEX 0, 0, 121, 193
|
||||
IDD_CHEAT_ADD_XX_CODE DIALOGEX 0, 0, 121, 193
|
||||
STYLE DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
|
||||
CAPTION "Add Action Replay code"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 1
|
||||
{
|
||||
EDITTEXT IDC_EDIT2, 7, 17, 107, 97, ES_AUTOHSCROLL
|
||||
EDITTEXT IDC_EDIT2, 7, 17, 107, 97, WS_VSCROLL | ES_AUTOVSCROLL | ES_UPPERCASE | ES_MULTILINE | ES_WANTRETURN
|
||||
EDITTEXT IDC_EDIT3, 7, 124, 107, 30, ES_MULTILINE
|
||||
AUTOCHECKBOX "turn on code", IDC_CHECK1, 47, 159, 67, 10, BS_AUTOCHECKBOX
|
||||
DEFPUSHBUTTON "Add", IDOK, 7, 172, 50, 14, BS_DEFPUSHBUTTON
|
||||
PUSHBUTTON "Cancel", IDCANCEL, 64, 172, 50, 14, BS_PUSHBUTTON
|
||||
LTEXT "Code:", -1, 7, 7, 20, 8, SS_LEFT
|
||||
LTEXT "Description:", -1, 9, 116, 39, 8, SS_LEFT
|
||||
}
|
||||
|
||||
|
||||
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
IDD_CHEAT_ADD_BC_CODE DIALOGEX 0, 0, 121, 193
|
||||
STYLE DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
|
||||
CAPTION "Add Action Replay code"
|
||||
FONT 8, "MS Shell Dlg", 400, 0, 1
|
||||
{
|
||||
EDITTEXT IDC_EDIT2, 7, 17, 107, 97, ES_AUTOHSCROLL
|
||||
EDITTEXT IDC_EDIT3, 7, 124, 107, 30, ES_MULTILINE
|
||||
AUTOCHECKBOX "turn on code", IDC_CHECK1, 47, 159, 67, 10, BS_AUTOCHECKBOX
|
||||
DEFPUSHBUTTON "Add", IDOK, 7, 172, 50, 14, BS_DEFPUSHBUTTON
|
||||
DEFPUSHBUTTON "Add", IDOK, 7, 172, 50, 14, WS_DISABLED | BS_DEFPUSHBUTTON
|
||||
PUSHBUTTON "Cancel", IDCANCEL, 64, 172, 50, 14, BS_PUSHBUTTON
|
||||
LTEXT "Code:", -1, 7, 7, 20, 8, SS_LEFT
|
||||
LTEXT "Description:", -1, 9, 116, 39, 8, SS_LEFT
|
||||
|
@ -761,7 +744,7 @@ FONT 8, "MS Shell Dlg", 400, 0, 1
|
|||
{
|
||||
CONTROL "", IDC_LIST1, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_REPORT, 7, 7, 302, 103
|
||||
PUSHBUTTON "internal", IDC_BADD, 10, 125, 50, 14, BS_PUSHBUTTON
|
||||
PUSHBUTTON "Action Replay", IDC_BADD_AR, 66, 125, 67, 14, WS_DISABLED | BS_PUSHBUTTON
|
||||
PUSHBUTTON "Action Replay", IDC_BADD_AR, 66, 125, 67, 14, BS_PUSHBUTTON
|
||||
PUSHBUTTON "Codebreaker", IDC_BADD_CB, 139, 125, 67, 14, WS_DISABLED | BS_PUSHBUTTON
|
||||
PUSHBUTTON "Edit", IDC_BEDIT, 245, 113, 64, 14, WS_DISABLED | BS_PUSHBUTTON
|
||||
PUSHBUTTON "Remove", IDC_BREMOVE, 246, 129, 63, 14, WS_DISABLED | BS_PUSHBUTTON
|
||||
|
|
Loading…
Reference in New Issue