static bool CheckSetting(int i) { BurnDIPInfo bdi; BurnDrvGetDIPInfo(&bdi, i); struct GameInp* pgi = GameInp + bdi.nInput + nDIPOffset; if ((pgi->Input.Constant.nConst & bdi.nMask) == bdi.nSetting) { unsigned char nFlags = bdi.nFlags; if ((nFlags & 0x0F) <= 1) { return true; } else { for (int j = 1; j < (nFlags & 0x0F); j++) { BurnDrvGetDIPInfo(&bdi, i + j); pgi = GameInp + bdi.nInput + nDIPOffset; if (nFlags & 0x80) { if ((pgi->Input.Constant.nConst & bdi.nMask) == bdi.nSetting) { return false; } } else { if ((pgi->Input.Constant.nConst & bdi.nMask) != bdi.nSetting) { return false; } } } return true; } } return false; }
char *InpDIPSWGetCurrentValue(int dip_index,int *dip_current_value) { BurnDIPInfo bdi; unsigned int i = 0, j = 0, k = 0, dip_ofs=0; char* pDIPGroup = NULL; while (BurnDrvGetDIPInfo(&bdi, i) == 0) { if ((bdi.nFlags & 0xF0) == 0xF0) { if (bdi.nFlags == 0xFE || bdi.nFlags == 0xFD) { pDIPGroup = bdi.szText; k++; dip_ofs=i; } i++; } else { if (CheckSetting(i)) { if (k==(dip_index+1)) { if (dip_current_value) *dip_current_value=i-dip_ofs-1; return bdi.szText; } j++; } i += (bdi.nFlags & 0x0F); } } return NULL; }
unsigned char InpDIPSWGetDIPValue(int dip_idx, int val_idx) { BurnDIPInfo bdi; unsigned int i = 0, k = 0; while (BurnDrvGetDIPInfo(&bdi, i) == 0) { if ((bdi.nFlags & 0xF0) == 0xF0) { if (bdi.nFlags == 0xFE || bdi.nFlags == 0xFD) { if (k==dip_idx) { // if (BurnDrvGetDIPInfo(&bdi, i+val_idx+1)==0) return bdi.nSetting; } k++; } i++; } else { i += (bdi.nFlags & 0x0F); } } return 255; }
char *InpDIPSWGetValueString(int dip_idx,int val_idx) { BurnDIPInfo bdi; unsigned int i = 0, k = 0; while (BurnDrvGetDIPInfo(&bdi, i) == 0) { if ((bdi.nFlags & 0xF0) == 0xF0) { if (bdi.nFlags == 0xFE || bdi.nFlags == 0xFD) { if (k==dip_idx) { // if (BurnDrvGetDIPInfo(&bdi, i+val_idx+1)==0) return bdi.szText; } k++; } i++; } else { i += (bdi.nFlags & 0x0F); } } return NULL; }
static void InpDIPSWGetOffset() { BurnDIPInfo bdi; nDIPOffset = 0; for (int i = 0; BurnDrvGetDIPInfo(&bdi, i) == 0; i++) { if (bdi.nFlags == 0xF0) { nDIPOffset = bdi.nInput; break; } } }
// Create the list of possible values for a DIPswitch static void InpDIPSWSelect() { SendMessage(GetDlgItem(hInpDIPSWDlg, IDC_INPCX1_VALUE), CB_RESETCONTENT, 0, 0); int nSel = SendMessage(hInpDIPSWList, LVM_GETNEXTITEM, (WPARAM)-1, LVNI_SELECTED); if (nSel >= 0) { LVITEM LvItem; memset(&LvItem, 0, sizeof(LvItem)); LvItem.mask = LVIF_PARAM; LvItem.iItem = nSel; SendMessage(hInpDIPSWList, LVM_GETITEM, 0, (LPARAM)&LvItem); nDIPGroup = LvItem.lParam; BurnDIPInfo bdiGroup; BurnDrvGetDIPInfo(&bdiGroup, nDIPGroup); int nCurrentSetting = 0; for (int i = 0, j = 0; i < bdiGroup.nSetting; i++) { TCHAR szText[256]; BurnDIPInfo bdi; do { BurnDrvGetDIPInfo(&bdi, nDIPGroup + 1 + j++); } while (bdi.nFlags == 0); if (bdiGroup.szText) { _stprintf(szText, _T("%hs: %hs"), bdiGroup.szText, bdi.szText); } else { _stprintf(szText, _T("%hs"), bdi.szText); } SendMessage(GetDlgItem(hInpDIPSWDlg, IDC_INPCX1_VALUE), CB_ADDSTRING, 0, (LPARAM)szText); if (CheckSetting(nDIPGroup + j)) { nCurrentSetting = i; } } SendMessage(GetDlgItem(hInpDIPSWDlg, IDC_INPCX1_VALUE), CB_SETCURSEL, (WPARAM)nCurrentSetting, 0); } }
void InpDIPSWResetDIPs() { int i = 0; BurnDIPInfo bdi; struct GameInp* pgi; InpDIPSWGetOffset(); while (BurnDrvGetDIPInfo(&bdi, i) == 0) { if (bdi.nFlags == 0xFF) { pgi = GameInp + bdi.nInput + nDIPOffset; pgi->Input.Constant.nConst = (pgi->Input.Constant.nConst & ~bdi.nMask) | (bdi.nSetting & bdi.nMask); } i++; } }
static void InpDIPSWCancel() { if (!bOK) { int i = 0, j = 0; BurnDIPInfo bdi; struct GameInp *pgi; while (BurnDrvGetDIPInfo(&bdi, i) == 0) { if (bdi.nInput >= 0 && bdi.nFlags == 0xFF) { pgi = GameInp + bdi.nInput + nDIPOffset; pgi->Input.Constant.nConst = nPrevDIPSettings[j]; j++; } i++; } } }
static int InpDIPSWInit() { BurnDIPInfo bdi; struct GameInp *pgi; InpDIPSWGetOffset(); for (int i = 0, j = 0; BurnDrvGetDIPInfo(&bdi, i) == 0; i++) { if (bdi.nInput >= 0 && bdi.nFlags == 0xFF) { pgi = GameInp + bdi.nInput + nDIPOffset; nPrevDIPSettings[j] = pgi->Input.Constant.nConst; j++; } } return 0; }
int InpDIPSWGetValueNb(int dip_idx) { BurnDIPInfo bdi; unsigned int i = 0, k = 0; char* pDIPGroup = NULL; while (BurnDrvGetDIPInfo(&bdi, i) == 0) { if ((bdi.nFlags & 0xF0) == 0xF0) { if (bdi.nFlags == 0xFE || bdi.nFlags == 0xFD) { pDIPGroup = bdi.szText; if (k==dip_idx) return bdi.nSetting; k++; } i++; } else { i += (bdi.nFlags & 0x0F); } } return 0; }
int InpDIPSWGetNb() { BurnDIPInfo bdi; unsigned int i = 0, j = 0, k = 0; char* pDIPGroup = NULL; while (BurnDrvGetDIPInfo(&bdi, i) == 0) { if ((bdi.nFlags & 0xF0) == 0xF0) { if (bdi.nFlags == 0xFE || bdi.nFlags == 0xFD) { pDIPGroup = bdi.szText; k = i; } i++; } else { if (CheckSetting(i)) { j++; } i += (bdi.nFlags & 0x0F); } } return j; }
char *InpDIPSWGetDIPName(int dip_index) { BurnDIPInfo bdi; unsigned int i = 0, j = 0, k = 0; while (BurnDrvGetDIPInfo(&bdi, i) == 0) { if ((bdi.nFlags & 0xF0) == 0xF0) { if (bdi.nFlags == 0xFE || bdi.nFlags == 0xFD) { if (k==dip_index) return bdi.szText; k++; } i++; } else { if (CheckSetting(i)) { j++; } i += (bdi.nFlags & 0x0F); } } return NULL; }
static int InpDIPSWInit() { BurnDIPInfo bdi; struct GameInp *pgi; InpDIPSWGetOffset(); hInpDIPSWList = GetDlgItem(hInpDIPSWDlg, IDC_INPCHEAT_LIST); InpDIPSWListBegin(); InpDIPSWListMake(); for (int i = 0, j = 0; BurnDrvGetDIPInfo(&bdi, i) == 0; i++) { if (bdi.nInput >= 0 && bdi.nFlags == 0xFF) { pgi = GameInp + bdi.nInput + nDIPOffset; nPrevDIPSettings[j] = pgi->Input.Constant.nConst; j++; } } return 0; }
// Make a list view of the DIPswitches static int InpDIPSWListMake() { if (hInpDIPSWList == NULL) { return 1; } SendMessage(hInpDIPSWList, LVM_DELETEALLITEMS, 0, 0); BurnDIPInfo bdi; unsigned int i = 0, j = 0, k = 0; char* pDIPGroup = NULL; while (BurnDrvGetDIPInfo(&bdi, i) == 0) { if ((bdi.nFlags & 0xF0) == 0xF0) { if (bdi.nFlags == 0xFE || bdi.nFlags == 0xFD) { pDIPGroup = bdi.szText; k = i; } i++; } else { if (CheckSetting(i)) { LVITEM LvItem; memset(&LvItem, 0, sizeof(LvItem)); LvItem.mask = LVIF_TEXT | LVIF_PARAM; LvItem.iItem = j; LvItem.iSubItem = 0; LvItem.pszText = ANSIToTCHAR(pDIPGroup, NULL, 0); LvItem.lParam = (LPARAM)k; SendMessage(hInpDIPSWList, LVM_INSERTITEM, 0, (LPARAM)&LvItem); LvItem.mask = LVIF_TEXT; LvItem.iSubItem = 1; LvItem.pszText = ANSIToTCHAR(bdi.szText, NULL, 0); SendMessage(hInpDIPSWList, LVM_SETITEM, 0, (LPARAM)&LvItem); j++; } i += (bdi.nFlags & 0x0F); } } return 0; }
int InpDIPSWSetCurrentValue(int dip_index,unsigned char dip_new_value) { BurnDIPInfo bdi; unsigned int i = 0, j = 0, k = 0, dip_ofs=0; char* pDIPGroup = NULL; while (BurnDrvGetDIPInfo(&bdi, i) == 0) { if ((bdi.nFlags & 0xF0) == 0xF0) { if (bdi.nFlags == 0xFE || bdi.nFlags == 0xFD) { pDIPGroup = bdi.szText; k++; dip_ofs=i; } i++; } else { if (k==(dip_index+1)) { if (CheckUpdateSetting(i,dip_new_value)) { return 0; } } i += (bdi.nFlags & 0x0F); } } return 1; }
static BOOL CALLBACK DialogProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) { if (Msg == WM_INITDIALOG) { // EnableWindow(hScrnWnd, FALSE); hInpDIPSWDlg = hDlg; InpDIPSWInit(); if (!kNetGame && bAutoPause) { bRunPause = 1; } return TRUE; } if (Msg == WM_CLOSE) { EnableWindow(hScrnWnd, TRUE); DestroyWindow(hInpDIPSWDlg); return 0; } if (Msg == WM_DESTROY) { InpDIPSWCancel(); InpDIPSWExit(); return 0; } if (Msg == WM_COMMAND) { int Id = LOWORD(wParam); int Notify = HIWORD(wParam); if (Id == IDOK && Notify == BN_CLICKED) { // OK button bOK = true; SendMessage(hDlg, WM_CLOSE, 0, 0); return 0; } if (Id == IDCANCEL && Notify == BN_CLICKED) { // cancel = close SendMessage(hDlg, WM_CLOSE, 0, 0); return 0; } // New DIPswitch value selected if (Id == IDC_INPCX1_VALUE && Notify == CBN_SELCHANGE) { BurnDIPInfo bdi = {0, 0, 0, 0, NULL}; struct GameInp *pgi; int nSel = SendMessage(GetDlgItem(hInpDIPSWDlg, IDC_INPCX1_VALUE), CB_GETCURSEL, 0, 0); int j = 0; for (int i = 0; i <= nSel; i++) { do { BurnDrvGetDIPInfo(&bdi, nDIPGroup + 1 + j++); } while (bdi.nFlags == 0); } pgi = GameInp + bdi.nInput + nDIPOffset; pgi->Input.Constant.nConst = (pgi->Input.Constant.nConst & ~bdi.nMask) | (bdi.nSetting & bdi.nMask); if (bdi.nFlags & 0x40) { while (BurnDrvGetDIPInfo(&bdi, nDIPGroup + 1 + j++) == 0) { if (bdi.nFlags == 0) { pgi = GameInp + bdi.nInput + nDIPOffset; pgi->Input.Constant.nConst = (pgi->Input.Constant.nConst & ~bdi.nMask) | (bdi.nSetting & bdi.nMask); } else { break; } } } InpDIPSWListMake(); return 0; } // New DIPswitch selected if (Id == IDC_INPC_RESET && Notify == BN_CLICKED) { InpDIPSWResetDIPs(); InpDIPSWListMake(); // refresh view SendMessage(GetDlgItem(hInpDIPSWDlg, IDC_INPCX1_VALUE), CB_RESETCONTENT, 0, 0); return 0; } } if (Msg == WM_NOTIFY && lParam) { int Id = LOWORD(wParam); NMHDR* pnm = (NMHDR*)lParam; if (Id == IDC_INPCHEAT_LIST && pnm->code == LVN_ITEMCHANGED) { if (((NM_LISTVIEW*)lParam)->uNewState & LVIS_SELECTED) { InpDIPSWSelect(); } return 0; } if (Id == IDC_INPCHEAT_LIST && pnm->code == NM_CUSTOMDRAW) { NMLVCUSTOMDRAW* plvcd = (NMLVCUSTOMDRAW*)lParam; switch (plvcd->nmcd.dwDrawStage) { case CDDS_PREPAINT: { SetWindowLong(hInpDIPSWDlg, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW); return 1; } case CDDS_ITEMPREPAINT: { BurnDIPInfo bdi; BurnDrvGetDIPInfo(&bdi, plvcd->nmcd.lItemlParam); if (bdi.nFlags == 0xFD) { plvcd->clrTextBk = RGB(0xFF, 0xDF, 0xBB); SetWindowLong(hInpDIPSWDlg, DWL_MSGRESULT, CDRF_NEWFONT); } return 1; } } } } return 0; }