#ifdef _WIN32_WCE // Browse directories to locate SCUMM games #include "stdafx.h" #include #include #include #include "resource.h" #include "scumm.h" extern Config *scummcfg; #define MAX_GAMES 20 struct ScummGame { const char *gamename; const char *description; const char *directory; const char *check_file_1; const char *check_file_2; const char *filename; unsigned char next_demo; }; struct InstalledScummGame { unsigned char reference; TCHAR directory[MAX_PATH]; }; static const ScummGame GameList[] = { { "Simon The Sorcerer 1 (dos)", "Completable", "", "1631.VGA", "GAMEPC", "simon1dos", 0 }, { "Simon The Sorcerer 1 (win)", "Completable", "", "SIMON.GME", "GAMEPC", "simon1win", 0 }, { "Simon The Sorcerer 2 (win)", "To be tested", "", "SIMON2.GME", "GSPTR30", "simon2win", 0 }, { "Indiana Jones 3 (new)", "Buggy, playable a bit", "indy3", "", "", "indy3", 0 }, { "Zak Mc Kracken (new)", "Completable", "zak256", "", "", "zak256", 0 }, { "Loom (old)", "Not working", "loom", "", "", "loom", 0 }, { "Monkey Island 1 (EGA)", "Not tested", "monkeyEGA", "", "", "monkeyEGA", 0 }, { "Loom (VGA)", "Completable, MP3 audio", "loomcd", "", "", "loomcd", 0 }, { "Monkey Island 1 (VGA)", "Completable, MP3 music", "", "MONKEY.000", "MONKEY.001", "monkey", 0 }, { "Monkey Island 2 (VGA)", "Completable", "", "MONKEY2.000", "MONKEY2.001", "monkey2", 0 }, { "Indiana Jones 4", "Completable", "", "ATLANTIS.000", "ATLANTIS.001", "atlantis", 1 }, { "Indiana Jones 4 demo", "Completable", "", "PLAYFATE.000", "PLAYFATE.001", "playfate", 0 }, { "Day of the Tentacle", "Completable", "", "TENTACLE.000", "TENTACLE.001", "tentacle", 1 }, { "Day of the Tentacle demo", "Completable", "", "DOTTDEMO.000", "DOTTDEMO.001", "dottdemo", 0 }, { "Sam & Max", "Completable, music glitches", "", "SAMNMAX.000", "SAMNMAX.001", "samnmax", 1 }, { "Sam & Max demo", "Completable", "", "SNMDEMO.000", "SNMDEMO.001", "snmdemo", 0 }, { "Full Throttle", "Partially working", "", "FT.LA0", "FT.LA1", "ft", 0 }, { "The Dig", "Partially working", "", "DIG.LA0", "DIG.LA1", "dig", 0 }, { NULL, NULL, NULL, NULL, NULL, NULL, 0 } }; void findGame(TCHAR*); int displayFoundGames(void); void doScan(); void startFindGame(); char gamesFound[MAX_GAMES]; unsigned char listIndex[MAX_GAMES]; InstalledScummGame gamesInstalled[MAX_GAMES]; int installedGamesNumber; HWND hwndDlg; TCHAR basePath[MAX_PATH]; TCHAR old_basePath[MAX_PATH]; BOOL prescanning; BOOL isPrescanning() { return prescanning; } void setFindGameDlgHandle(HWND x) { hwndDlg = x; } bool loadGameSettings() { int index; int i; const char *current; prescanning = FALSE; current = scummcfg->get("GamesInstalled", "wince"); if (!current) return FALSE; index = atoi(current); installedGamesNumber = index; current = scummcfg->get("GamesReferences", "wince"); if (!current) return FALSE; for (i=0; iget("BasePath", "wince"); if (!current) return FALSE; MultiByteToWideChar(CP_ACP, 0, current, strlen(current) + 1, basePath, sizeof(basePath)); for (i=0; iget(keyName, "wince"); if (!current) return FALSE; MultiByteToWideChar(CP_ACP, 0, current, strlen(current) + 1, gamesInstalled[i].directory, sizeof(gamesInstalled[i].directory)); } displayFoundGames(); return TRUE; } int countGameReferenced(int reference, int *infos) { int i; int number = 0; for (i=0; iset("GamesInstalled", index, "wince"); tempo[0] = '\0'; for (i=0; iset("GamesReferences", tempo, "wince"); WideCharToMultiByte(CP_ACP, 0, basePath, wcslen(basePath) + 1, workdir, sizeof(workdir), NULL, NULL); scummcfg->set("BasePath", workdir, "wince"); for (i=0; iset(keyName, workdir, "wince"); } scummcfg->flush(); SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT("Scan finished")); } void getSelectedGame(int result, char *id, TCHAR *directory) { ScummGame game; game = GameList[gamesInstalled[listIndex[result]].reference]; strcpy(id, game.filename); wcscpy(directory, gamesInstalled[listIndex[result]].directory); } void displayGameInfo() { int item; TCHAR work[400]; ScummGame game; item = SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_GETCURSEL, 0, 0); if (item == LB_ERR) return; game = GameList[gamesInstalled[listIndex[item]].reference]; wcscpy(work, TEXT("File path : ...")); wcscat(work, wcsrchr(gamesInstalled[listIndex[item]].directory, '\\')); SetDlgItemText(hwndDlg, IDC_FILEPATH, work); MultiByteToWideChar(CP_ACP, 0, game.description, strlen(game.description) + 1, work, sizeof(work)); SetDlgItemText(hwndDlg, IDC_GAMEDESC, work); } void findGame(TCHAR *directory) { TCHAR fileName[MAX_PATH]; TCHAR newDirectory[MAX_PATH]; WIN32_FIND_DATA desc; HANDLE x; int i; // Check for games in the current directory //MessageBox(NULL, directory, TEXT("Current"), MB_OK); for (i = 0 ; i < MAX_GAMES ; i++) { ScummGame current_game; current_game = GameList[i]; if (!current_game.filename) break; if (strlen(current_game.directory)) { // see if the last directory matches TCHAR *work; char curdir[MAX_PATH]; work = wcsrchr(directory, '\\'); WideCharToMultiByte(CP_ACP, 0, work + 1, wcslen(work + 1) + 1, curdir, sizeof(curdir), NULL, NULL); if (stricmp(curdir, current_game.directory) == 0) { //MessageBox(NULL, TEXT("Match directory !"), TEXT("..."), MB_OK); gamesFound[i] = 1; gamesInstalled[installedGamesNumber].reference = i; wcscpy(gamesInstalled[installedGamesNumber].directory, directory); installedGamesNumber++; } } else { TCHAR work[MAX_PATH]; TCHAR checkfile[MAX_PATH]; MultiByteToWideChar(CP_ACP, 0, current_game.check_file_1, strlen(current_game.check_file_1) + 1, checkfile, sizeof(checkfile)); wsprintf(work, TEXT("%s\\%s"), directory, checkfile); //MessageBox(NULL, work, TEXT("Checking file"), MB_OK); if (GetFileAttributes(work) == 0xFFFFFFFF) continue; //MessageBox(NULL, TEXT("Check OK"), TEXT("Checking file"), MB_OK); MultiByteToWideChar(CP_ACP, 0, current_game.check_file_2, strlen(current_game.check_file_2) + 1, checkfile, sizeof(checkfile)); wsprintf(work, TEXT("%s\\%s"), directory, checkfile); if (GetFileAttributes(work) == 0xFFFFFFFF) continue; //MessageBox(NULL, TEXT("Match file !"), TEXT("..."), MB_OK); gamesFound[i] = 1; gamesInstalled[installedGamesNumber].reference = i; wcscpy(gamesInstalled[installedGamesNumber].directory, directory); installedGamesNumber++; } } // Recurse wsprintf(fileName, TEXT("%s\\*"), directory); x = FindFirstFile(fileName, &desc); if (x == INVALID_HANDLE_VALUE) return; if (desc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { wsprintf(newDirectory, TEXT("%s\\%s"), directory, desc.cFileName); findGame(newDirectory); } while (FindNextFile(x, &desc)) if (desc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { wsprintf(newDirectory, TEXT("%s\\%s"), directory, desc.cFileName); findGame(newDirectory); } FindClose(x); } #endif