static void DoPatchGame(const char* patch_name, char* game_name, UINT8* base) { char s[MAX_PATH]; char* p = NULL; char* rom_name = NULL; char* ips_name = NULL; FILE* fp = NULL; unsigned long nIpsSize; if ((fp = fopen(patch_name, "rb")) != NULL) { // get ips size fseek(fp, 0, SEEK_END); nIpsSize = ftell(fp); fseek(fp, 0, SEEK_SET); while (!feof(fp)) { if (fgets(s, sizeof s, fp) != NULL) { p = s; // skip UTF-8 sig if (strncmp(p, UTF8_SIGNATURE, strlen(UTF8_SIGNATURE)) == 0) p += strlen(UTF8_SIGNATURE); if (p[0] == '[') // '[' break; rom_name = strtok(p, " \t\r\n"); if (!rom_name) continue; if (*rom_name == '#') continue; if (_stricmp(rom_name, game_name)) continue; ips_name = strtok(NULL, " \t\r\n"); if (!ips_name) continue; // skip CRC check strtok(NULL, "\r\n"); char ips_path[MAX_PATH]; char ips_dir[MAX_PATH]; TCHARToANSI(szAppIpsPath, ips_dir, sizeof(ips_dir)); if (strchr(ips_name, '\\')) { // ips in parent's folder sprintf(ips_path, "%s\\%s%s", ips_dir, ips_name, IPS_EXT); } else { sprintf(ips_path, "%s%s\\%s%s", ips_dir, BurnDrvGetTextA(DRV_NAME), ips_name, IPS_EXT); } PatchFile(ips_path, base); } } fclose(fp); } }
void IpsApplyPatches(UINT8* base, char* rom_name) { char ips_data[MAX_PATH]; int nActivePatches = GetIpsNumActivePatches(); for (int i = 0; i < nActivePatches; i++) { memset(ips_data, 0, MAX_PATH); TCHARToANSI(szIpsActivePatches[i], ips_data, sizeof(ips_data)); DoPatchGame(ips_data, rom_name, base); } }
static int AddFeedback(HWND hWindow, TCHAR* pszText) { #ifdef UNICODE SETTEXTEX settext = { ST_SELECTION, 1200 }; #else SETTEXTEX settext = { ST_SELECTION, 1252 }; #endif // Add the new info to the top SendMessage(hWindow, EM_SETSEL, (WPARAM)0, (LPARAM)0); // Doesn't work if you send it Unicode data... SendMessageA(hWindow, EM_SETTEXTEX, (WPARAM)&settext, (LPARAM)TCHARToANSI(pszText, NULL, 0)); // Trim the bottom lines SendMessage(hWindow, EM_SETSEL, (WPARAM)SendMessage(hWindow, EM_LINEINDEX, 18, 0) - 1, (LPARAM)-1); SendMessage(hWindow, EM_SETTEXTEX, (WPARAM)&settext, (LPARAM)_T("")); return 0; }
// The main message loop int RunMessageLoop() { int bRestartVideo; MSG Msg; do { bRestartVideo = 0; // Remove pending initialisation messages from the queue while (PeekMessage(&Msg, NULL, WM_APP + 0, WM_APP + 0, PM_NOREMOVE)) { if (Msg.message != WM_QUIT) { PeekMessage(&Msg, NULL, WM_APP + 0, WM_APP + 0, PM_REMOVE); } } RunInit(); ShowWindow(hScrnWnd, nAppShowCmd); // Show the screen window nAppShowCmd = SW_NORMAL; SetForegroundWindow(hScrnWnd); GameInpCheckLeftAlt(); GameInpCheckMouse(); // Hide the cursor while (1) { if (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { // A message is waiting to be processed if (Msg.message == WM_QUIT) { // Quit program break; } if (Msg.message == (WM_APP + 0)) { // Restart video bRestartVideo = 1; break; } if (bMenuEnabled && nVidFullscreen == 0) { // Handle keyboard messages for the menu if (MenuHandleKeyboard(&Msg)) { continue; } } if (Msg.message == WM_SYSKEYDOWN || Msg.message == WM_KEYDOWN) { if (Msg.lParam & 0x20000000) { // An Alt/AltGr-key was pressed switch (Msg.wParam) { #if defined (FBA_DEBUG) case 'C': { static int count = 0; if (count == 0) { count++; { char* p = NULL; if (*p) { printf("crash...\n"); } } } break; } #endif case VK_OEM_PLUS: { TCHAR buffer[15]; nAudVolume += 100; if (GetAsyncKeyState(VK_CONTROL) & 0x80000000) { nAudVolume += 900; } if (nAudVolume > 10000) { nAudVolume = 10000; } if (AudSoundSetVolume() == 0) { VidSNewShortMsg(FBALoadStringEx(hAppInst, IDS_SOUND_NOVOLUME, true)); } else { _stprintf(buffer, FBALoadStringEx(hAppInst, IDS_SOUND_VOLUMESET, true), nAudVolume / 100); VidSNewShortMsg(buffer); } break; } case VK_OEM_MINUS: { TCHAR buffer[15]; nAudVolume -= 100; if (GetAsyncKeyState(VK_CONTROL) & 0x80000000) { nAudVolume -= 900; } if (nAudVolume < 0) { nAudVolume = 0; } if (AudSoundSetVolume() == 0) { VidSNewShortMsg(FBALoadStringEx(hAppInst, IDS_SOUND_NOVOLUME, true)); } else { _stprintf(buffer, FBALoadStringEx(hAppInst, IDS_SOUND_VOLUMESET, true), nAudVolume / 100); VidSNewShortMsg(buffer); } break; } case VK_MENU: { continue; } } } else { switch (Msg.wParam) { #if defined (FBA_DEBUG) case 'N': counter--; bprintf(PRINT_IMPORTANT, _T("*** New counter value: %04X.\n"), counter); break; case 'M': counter++; bprintf(PRINT_IMPORTANT, _T("*** New counter value: %04X.\n"), counter); break; #endif case VK_ESCAPE: { if (hwndChat) { DeActivateChat(); } else { if (bCmdOptUsed) { PostQuitMessage(0); } else { if (nVidFullscreen) { nVidFullscreen = 0; POST_INITIALISE_MESSAGE; } } } break; } case VK_RETURN: { if (hwndChat) { int i = 0; while (EditText[i]) { if (EditText[i++] != 0x20) { break; } } if (i) { Kaillera_Chat_Send(TCHARToANSI(EditText, NULL, 0)); //kailleraChatSend(TCHARToANSI(EditText, NULL, 0)); } DeActivateChat(); break; } if (GetAsyncKeyState(VK_CONTROL) & 0x80000000) { bMenuEnabled = !bMenuEnabled; POST_INITIALISE_MESSAGE; break; } break; } case VK_F1: { if (kNetGame) { break; } if (((GetAsyncKeyState(VK_CONTROL) | GetAsyncKeyState(VK_SHIFT)) & 0x80000000) == 0) { if (bRunPause) { bAppDoStep = 1; } else { bAppDoFast = 1; } } break; } case VK_BACK: { bShowFPS = !bShowFPS; if (bShowFPS) { DisplayFPS(); } else { VidSKillShortMsg(); VidSKillOSDMsg(); } break; } case 'T': { if (kNetGame && hwndChat == NULL) { if (AppMessage(&Msg)) { ActivateChat(); } } break; } } } } else { if (Msg.message == WM_SYSKEYUP || Msg.message == WM_KEYUP) { switch (Msg.wParam) { case VK_MENU: continue; case VK_F1: bAppDoFast = 0; break; } } } // Check for messages for dialogs etc. if (AppMessage(&Msg)) { if (TranslateAccelerator(hScrnWnd, hAccel, &Msg) == 0) { if (hwndChat) { TranslateMessage(&Msg); } DispatchMessage(&Msg); } } } else { // No messages are waiting SplashDestroy(0); RunIdle(); } } RunExit(); MediaExit(); if (bRestartVideo) { MediaInit(); } } while (bRestartVideo); return 0; }
int BzipOpen(bool bootApp) { int nMemLen; // Zip name number nZipsFound = 0; // Haven't found zips yet nTotalSize = 0; if (szBzipName == NULL) { return 1; } BzipClose(); // Make sure nothing is open if(!bootApp) { // reset information strings BzipText.Reset(); BzipDetail.Reset(); } // Count the number of roms needed for (nRomCount = 0; ; nRomCount++) { if (BurnDrvGetRomInfo(NULL, nRomCount)) { break; } } if (nRomCount <= 0) { return 1; } // Create an array for holding lookups for each rom -> zip entries nMemLen = nRomCount * sizeof(struct RomFind); RomFind = (struct RomFind*)malloc(nMemLen); if (RomFind == NULL) { return 1; } memset(RomFind, 0, nMemLen); for (int z = 0; z < BZIP_MAX; z++) { char* szName = NULL; if (BurnDrvGetZipName(&szName, z)) { break; } for (int d = 0; d < DIRS_MAX; d++) { free(szBzipName[z]); szBzipName[z] = (TCHAR*)malloc(MAX_PATH * sizeof(TCHAR)); _stprintf(szBzipName[z], _T("%s%hs"), szAppRomPaths[d], szName); if (ZipOpen(TCHARToANSI(szBzipName[z], NULL, 0)) == 0) { // Open the rom zip file nZipsFound++; nCurrentZip = z; break; } } if (nCurrentZip >= 0) { if (!bootApp) { BzipText.Add(_T("Found %s;\n"), szBzipName[z]); } ZipGetList(&List, &nListCount); // Get the list of entries for (int i = 0; i < nRomCount; i++) { struct BurnRomInfo ri; int nFind; if (RomFind[i].nState == 1) { // Already found this and it's okay continue; } memset(&ri, 0, sizeof(ri)); nFind = FindRom(i); if (nFind < 0) { // Couldn't find this rom at all continue; } RomFind[i].nZip = z; // Remember which zip file it is in RomFind[i].nPos = nFind; RomFind[i].nState = 1; // Set to found okay BurnDrvGetRomInfo(&ri, i); // Get info about the rom if ((ri.nType & BRF_OPT) == 0 && (ri.nType & BRF_NODUMP) == 0) { nTotalSize += ri.nLen; } if (List[nFind].nLen == ri.nLen) { if (ri.nCrc) { // If we know the CRC if (List[nFind].nCrc != ri.nCrc) { // Length okay, but CRC wrong RomFind[i].nState = 2; } } } else { if (List[nFind].nLen < ri.nLen) { RomFind[i].nState = 3; // Too small } else { RomFind[i].nState = 4; // Too big } } if (!bootApp) { if (RomFind[i].nState != 1) { RomDescribe(&BzipDetail, &ri); if (RomFind[i].nState == 2) { BzipDetail.Add(_T("%hs has a CRC of %.8X. (It should be %.8X.)\n"), GetFilenameA(List[nFind].szName), List[nFind].nCrc, ri.nCrc); } if (RomFind[i].nState == 3) { BzipDetail.Add(_T("%hs is %dk which is incomplete. (It should be %dkB.)\n"), GetFilenameA(List[nFind].szName), List[nFind].nLen >> 10, ri.nLen >> 10); } if (RomFind[i].nState == 4) { BzipDetail.Add(_T("%hs is %dk which is too big. (It should be %dkB.)\n"), GetFilenameA(List[nFind].szName), List[nFind].nLen >> 10, ri.nLen >> 10); } } } }
static int __cdecl BzipBurnLoadRom(unsigned char* Dest, int* pnWrote, int i) { #if defined (BUILD_WIN32) MSG Msg; #endif struct BurnRomInfo ri; int nWantZip = 0; TCHAR szText[128]; char* pszRomName = NULL; int nRet = 0; if (i < 0 || i >= nRomCount) { return 1; } ri.nLen = 0; BurnDrvGetRomInfo(&ri, i); // Get info // show what we're doing BurnDrvGetRomName(&pszRomName, i, 0); if (pszRomName == NULL) { pszRomName = "unknown"; } _stprintf(szText, _T("Loading")); if (ri.nType & (BRF_PRG | BRF_GRA | BRF_SND | BRF_BIOS)) { if (ri.nType & BRF_BIOS) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("BIOS ")); } if (ri.nType & BRF_PRG) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("program ")); } if (ri.nType & BRF_GRA) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("graphics ")); } if (ri.nType & BRF_SND) { _stprintf (szText + _tcslen(szText), _T(" %s"), _T("sound ")); } _stprintf(szText + _tcslen(szText), _T("(%hs)..."), pszRomName); } else { _stprintf(szText + _tcslen(szText), _T(" %hs..."), pszRomName); } ProgressUpdateBurner(ri.nLen ? 1.0 / ((double)nTotalSize / ri.nLen) : 0, szText, 0); #if defined (BUILD_WIN32) // Check for messages: while (PeekMessage(&Msg, NULL, 0, 0, PM_REMOVE)) { DispatchMessage(&Msg); } #endif if (RomFind[i].nState == 0) { // Rom not found in zip at all TCHAR szTemp[128] = _T(""); _stprintf(szTemp, "%s (not found)\n",szText); fprintf(stderr, szTemp); AppError(szTemp, 1); return 1; } nWantZip = RomFind[i].nZip; // Which zip file it is in if (nCurrentZip != nWantZip) { // If we haven't got the right zip file currently open ZipClose(); nCurrentZip = -1; if (ZipOpen(TCHARToANSI(szBzipName[nWantZip], NULL, 0))) { return 1; } nCurrentZip = nWantZip; } // Read in file and return how many bytes we read if (ZipLoadFile(Dest, ri.nLen, pnWrote, RomFind[i].nPos)) { // Error loading from the zip file TCHAR szTemp[128] = _T(""); _stprintf(szTemp, _T("%s reading %.30hs from %.30s"), nRet == 2 ? _T("CRC error") : _T("Error"), pszRomName, GetFilenameW(szBzipName[nCurrentZip])); fprintf(stderr, szTemp); AppError(szTemp, 1); return 1; } fprintf(stderr, "%s (OK)\n", szText); return 0; }
static TCHAR* GetPatchDescByLangcode(FILE* fp, int nLang) { TCHAR* result = NULL; char* desc = NULL; char langtag[8]; sprintf(langtag, "[%s]", TCHARToANSI(szLanguageCodes[nLang], NULL, 0)); fseek(fp, 0, SEEK_SET); while (!feof(fp)) { char s[4096]; if (fgets(s, sizeof s, fp) != NULL) { if (strncmp(langtag, s, strlen(langtag)) != 0) continue; while (fgets(s, sizeof s, fp) != NULL) { char* p; if (*s == '[') { if (desc) { result = tstring_from_utf8(desc); if (desc) { free(desc); desc = NULL; } return result; } else return NULL; } for (p = s; *p; p++) { if (*p == '\r' || *p == '\n') { *p = '\0'; break; } } if (desc) { char* p1; int len = strlen(desc); len += strlen(s) + 2; p1 = (char*)malloc(len + 1); sprintf(p1, "%s\r\n%s", desc, s); if (desc) { free(desc); } desc = p1; } else { desc = (char*)malloc(strlen(s) + 1); if (desc != NULL) strcpy(desc, s); } } } } if (desc) { result = tstring_from_utf8(desc); if (desc) { free(desc); desc = NULL; } return result; } else return NULL; }
int BzipOpen(bool bootApp) { int nMemLen; // Zip name number nTotalSize = 0; nBzipError = 0; if (szBzipName == NULL) { return 1; } BzipClose(); // Make sure nothing is open // Count the number of roms needed for (nRomCount = 0; ; nRomCount++) { if (BurnDrvGetRomInfo(NULL, nRomCount)) { break; } } if (nRomCount <= 0) { return 1; } // Create an array for holding lookups for each rom -> zip entries nMemLen = nRomCount * sizeof(struct RomFind); RomFind = (struct RomFind*)malloc(nMemLen); if (RomFind == NULL) { return 1; } memset(RomFind, 0, nMemLen); for (int y = 0; y < BZIP_MAX; y++) { free(szBzipName[y]); szBzipName[y] = NULL; } // Locate each zip file for (int y = 0, z = 0; y < BZIP_MAX && z < BZIP_MAX; y++) { char* szName = NULL; bool bFound = false; if (BurnDrvGetZipName(&szName, y)) { break; } for (int d = 0; d < DIRS_MAX; d++) { TCHAR szFullName[MAX_PATH]; _stprintf(szFullName, _T("%s%hs"), szAppRomPaths[d], szName); if (ZipOpen(TCHARToANSI(szFullName, NULL, 0)) == 0) { // Open the rom zip file ZipClose(); bFound = true; szBzipName[z] = (TCHAR*)malloc(MAX_PATH * sizeof(TCHAR)); _tcscpy(szBzipName[z], szFullName); if (!bootApp) { FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_FOUND), szName, szBzipName[z]); } z++; // Look further in the last path specified, so you can put files with ROMs // used only by FB Alpha there without causing problems with dat files if (d < DIRS_MAX - 2) { d = DIRS_MAX - 2; } else { if (d >= DIRS_MAX - 1) { break; } } } } if (!bootApp && !bFound) { FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_NOTFOUND), szName); } } if (!bootApp) { FBAPopupAddText(PUF_TEXT_DEFAULT, _T("\n")); } // Locate the ROM data in the zip files for (int z = 0; z < BZIP_MAX; z++) { if (szBzipName[z] == NULL) { continue; } if (ZipOpen(TCHARToANSI(szBzipName[z], NULL, 0)) == 0) { // Open the rom zip file nCurrentZip = z; ZipGetList(&List, &nListCount); // Get the list of entries for (int i = 0; i < nRomCount; i++) { struct BurnRomInfo ri; int nFind; if (RomFind[i].nState == 1) { // Already found this and it's okay continue; } memset(&ri, 0, sizeof(ri)); nFind = FindRom(i); if (nFind < 0) { // Couldn't find this rom at all continue; } RomFind[i].nZip = z; // Remember which zip file it is in RomFind[i].nPos = nFind; RomFind[i].nState = 1; // Set to found okay BurnDrvGetRomInfo(&ri, i); // Get info about the rom if ((ri.nType & BRF_OPT) == 0 && (ri.nType & BRF_NODUMP) == 0) { nTotalSize += ri.nLen; } if (List[nFind].nLen == ri.nLen) { if (ri.nCrc) { // If we know the CRC if (List[nFind].nCrc != ri.nCrc) { // Length okay, but CRC wrong RomFind[i].nState = 2; } } } else { if (List[nFind].nLen < ri.nLen) { RomFind[i].nState = 3; // Too small } else { RomFind[i].nState = 4; // Too big } } if (!bootApp) { if (RomFind[i].nState != 1) { RomDescribe(&ri); if (RomFind[i].nState == 2) { FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_CRC), GetFilenameA(List[nFind].szName), List[nFind].nCrc, ri.nCrc); } if (RomFind[i].nState == 3) { FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_SMALL), GetFilenameA(List[nFind].szName), List[nFind].nLen >> 10, ri.nLen >> 10); } if (RomFind[i].nState == 4) { FBAPopupAddText(PUF_TEXT_DEFAULT, MAKEINTRESOURCE(IDS_ERR_LOAD_LARGE), GetFilenameA(List[nFind].szName), List[nFind].nLen >> 10, ri.nLen >> 10); } } }