aboutsummaryrefslogtreecommitdiff
path: root/backends/wince/findgame.cpp
diff options
context:
space:
mode:
authorNicolas Bacca2002-10-22 22:56:26 +0000
committerNicolas Bacca2002-10-22 22:56:26 +0000
commit3b8905d1bde4cb07f14d906cac41ba4e5d70130d (patch)
tree2e1d583e8d4a000aa63b7431cf514311ec7e7310 /backends/wince/findgame.cpp
parenta2e7b4b16527aaa7e36884788869051442095c8b (diff)
downloadscummvm-rg350-3b8905d1bde4cb07f14d906cac41ba4e5d70130d.tar.gz
scummvm-rg350-3b8905d1bde4cb07f14d906cac41ba4e5d70130d.tar.bz2
scummvm-rg350-3b8905d1bde4cb07f14d906cac41ba4e5d70130d.zip
Switch to new launcher
svn-id: r5258
Diffstat (limited to 'backends/wince/findgame.cpp')
-rw-r--r--backends/wince/findgame.cpp421
1 files changed, 378 insertions, 43 deletions
diff --git a/backends/wince/findgame.cpp b/backends/wince/findgame.cpp
index a1bc96b7de..6b822e8caa 100644
--- a/backends/wince/findgame.cpp
+++ b/backends/wince/findgame.cpp
@@ -30,10 +30,15 @@
#include "resource.h"
#include "scumm.h"
#include "config-file.h"
+#include "screen.h"
extern Config *g_config;
#define MAX_GAMES 20
+#define MAX_DIRECTORY 40
+
+#define MAX_DISPLAYED_DIRECTORIES 7
+#define MAX_DISPLAYED_GAMES 7
struct ScummGame {
const char *gamename;
@@ -50,23 +55,39 @@ struct InstalledScummGame {
TCHAR directory[MAX_PATH];
};
+struct DirectoryName {
+ TCHAR name[MAX_PATH];
+};
+
+struct GameReference {
+ char name[100];
+ unsigned char reference;
+};
+
static const ScummGame GameList[] = {
{
- "Simon The Sorcerer 1 (dos)",
+ "Simon 1 (dos)",
"Completable",
"", "1631.VGA", "GAMEPC",
"simon1dos",
0
},
{
- "Simon The Sorcerer 1 (win)",
+ "Simon 1 (win)",
"Completable",
"", "SIMON.GME", "GAMEPC",
"simon1win",
0
},
{
- "Simon The Sorcerer 2 (win)",
+ "Simon 2 (dos)",
+ "To be tested",
+ "", "SIMON2.GME", "GAME32",
+ "simon2dos",
+ 0
+ },
+ {
+ "Simon 2 (win)",
"To be tested",
"", "SIMON2.GME", "GSPTR30",
"simon2win",
@@ -115,6 +136,13 @@ static const ScummGame GameList[] = {
0
},
{
+ "Monkey Island 1 (VGA)",
+ "Completable, MP3 music",
+ "", "MONKEY1.000", "MONKEY1.001",
+ "monkey1",
+ 0
+ },
+ {
"Monkey Island 2 (VGA)",
"Completable",
"", "MONKEY2.000", "MONKEY2.001",
@@ -143,7 +171,7 @@ static const ScummGame GameList[] = {
1
},
{
- "Day of the Tentacle demo",
+ "Day of Tentacle demo",
"Completable",
"", "DOTTDEMO.000", "DOTTDEMO.001",
"dottdemo",
@@ -151,7 +179,7 @@ static const ScummGame GameList[] = {
},
{
"Sam & Max",
- "Completable, music glitches",
+ "Completable",
"", "SAMNMAX.000", "SAMNMAX.001",
"samnmax",
1
@@ -172,7 +200,7 @@ static const ScummGame GameList[] = {
},
{
"The Dig",
- "Partially working",
+ "Completable",
"", "DIG.LA0", "DIG.LA1",
"dig",
0
@@ -184,11 +212,14 @@ static const ScummGame GameList[] = {
void findGame(TCHAR*);
int displayFoundGames(void);
-void doScan();
-void startFindGame();
+void displayDirectoryList(void);
+void displayGamesList(void);
+void doScan(void);
+void startFindGame(void);
+bool loadGameSettings(void);
char gamesFound[MAX_GAMES];
-unsigned char listIndex[MAX_GAMES];
+GameReference listIndex[MAX_GAMES];
InstalledScummGame gamesInstalled[MAX_GAMES];
int installedGamesNumber;
HWND hwndDlg;
@@ -196,9 +227,43 @@ TCHAR basePath[MAX_PATH];
TCHAR old_basePath[MAX_PATH];
BOOL prescanning;
+DirectoryName directories[MAX_DIRECTORY];
+int _first_index;
+int _total_directories;
+int _first_index_games;
+int _total_games;
+bool _scanning;
+int _last_selected = -1;
+bool _game_selected;
+
+extern int _game_selection_X_offset;
+extern int _game_selection_Y_offset;
+
+int chooseGame(bool need_rescan) {
+ drawBlankGameSelection();
+
+ if (!need_rescan)
+ loadGameSettings();
+ _game_selected = false;
+ while (!_game_selected) {
+ MSG msg;
+
+ if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+ Sleep(100);
+ else {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+
+ return _last_selected;
+}
+
+/*
BOOL isPrescanning() {
return prescanning;
}
+*/
void setFindGameDlgHandle(HWND x) {
hwndDlg = x;
@@ -209,7 +274,8 @@ bool loadGameSettings() {
int i;
const char *current;
- prescanning = FALSE;
+ /*prescanning = FALSE;*/
+ _scanning = false;
current = g_config->get("GamesInstalled", "wince");
if (!current)
@@ -265,13 +331,15 @@ int countGameReferenced(int reference, int *infos) {
int displayFoundGames() {
- int i;
- int index = 0;
+ int i;
+
+ _total_games = 0;
+ _first_index_games = 0;
for (i = 0; i< MAX_GAMES; i++) {
ScummGame current_game;
char work[400];
- TCHAR desc[400];
+ //TCHAR desc[400];
int numberReferenced;
int infos[10];
int j;
@@ -289,25 +357,118 @@ int displayFoundGames() {
sprintf(work, "%s (%d)", current_game.gamename, j + 1);
else
strcpy(work, current_game.gamename);
- MultiByteToWideChar(CP_ACP, 0, work, strlen(work) + 1, desc, sizeof(desc));
- SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_ADDSTRING, 0, (LPARAM)desc);
- listIndex[index++] = infos[j];
+ //MultiByteToWideChar(CP_ACP, 0, work, strlen(work) + 1, desc, sizeof(desc));
+ //SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_ADDSTRING, 0, (LPARAM)desc);
+ strcpy(listIndex[_total_games].name, work);
+ listIndex[_total_games].reference = infos[j];
+ _total_games++;
}
}
- return index;
+ displayGamesList();
+
+ return _total_games;
}
-void changeScanPath() {
- int item;
+void changeSelectedGame(int index) {
+
+ int array_index;
+ ScummGame game;
+
+ if (index > MAX_DISPLAYED_GAMES - 1)
+ return;
+
+ if (_first_index_games)
+ array_index = _first_index_games + index - 1;
+ else
+ array_index = index;
+
+ if (array_index >= _total_games)
+ return;
+
+ // See if it's a previous/next link
+ if (index == 0) {
+ // potential previous
+ if (_first_index_games) {
+ _first_index_games -= (MAX_DISPLAYED_GAMES - 2);
+ if (_first_index_games < 0 || _first_index_games - (MAX_DISPLAYED_GAMES - 2) < 0)
+ _first_index_games = 0;
+ resetLastHighlighted();
+ displayGamesList();
+ return;
+ }
+ }
+ if (index == MAX_DISPLAYED_GAMES - 1) {
+ char work[100];
+
+ sprintf(work, "X %d Total %d", array_index, _total_games - 1);
+ drawCommentString(work);
+ // potential next
+ if (array_index != _total_games) {
+ if (!_first_index_games)
+ _first_index_games += (MAX_DISPLAYED_GAMES - 1);
+ else
+ _first_index_games += (MAX_DISPLAYED_GAMES - 2);
+ resetLastHighlighted();
+ displayGamesList();
+ return;
+ }
+ }
+
+ // Highlight the current game and displays game informations
+
+ drawHighlightedString(listIndex[array_index].name, index);
+
+ game = GameList[gamesInstalled[listIndex[array_index].reference].reference];
+ drawCommentString((char*)game.description);
+
+ _last_selected = array_index;
+}
+
+
+void changeScanPath(int index) {
+ //int item;
TCHAR path[MAX_PATH];
+ int array_index;
- item = SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_GETCURSEL, 0, 0);
- if (item == LB_ERR)
+ if (index > MAX_DISPLAYED_DIRECTORIES - 1)
+ return;
+
+ if (_first_index)
+ array_index = _first_index + index - 1;
+ else
+ array_index = index;
+
+ if (array_index >= _total_directories)
return;
- SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_GETTEXT, item, (LPARAM)path);
+ // See if it's a previous/next link
+ if (index == 0) {
+ // potential previous
+ if (_first_index) {
+ _first_index -= (MAX_DISPLAYED_DIRECTORIES - 2);
+ if (_first_index < 0 || _first_index - (MAX_DISPLAYED_DIRECTORIES - 2) < 0)
+ _first_index = 0;
+ resetLastHighlighted();
+ displayDirectoryList();
+ return;
+ }
+ }
+ if (index == MAX_DISPLAYED_DIRECTORIES - 1) {
+ // potential next
+ if (array_index != _total_directories) {
+ if (!_first_index)
+ _first_index += (MAX_DISPLAYED_DIRECTORIES - 1);
+ else
+ _first_index += (MAX_DISPLAYED_DIRECTORIES - 2);
+ resetLastHighlighted();
+ displayDirectoryList();
+ return;
+ }
+ }
+
+ wcscpy(path, directories[array_index].name);
if (wcscmp(path, TEXT("..")) != 0) {
wcscat(basePath, TEXT("\\"));
@@ -329,58 +490,140 @@ void doScan() {
TCHAR searchPath[MAX_PATH];
HANDLE x;
- SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_RESETCONTENT, 0, 0);
+ //SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_RESETCONTENT, 0, 0);
- if (wcslen(basePath) != 0)
- SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_ADDSTRING, 0, (LPARAM)TEXT(".."));
+ _total_directories = 0;
+ _first_index = 0;
+
+ if (wcslen(basePath) != 0) {
+ //SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_ADDSTRING, 0, (LPARAM)TEXT(".."));
+ wcscpy(directories[_total_directories++].name, TEXT(".."));
+ }
wsprintf(searchPath, TEXT("%s\\*"), basePath);
x = FindFirstFile(searchPath, &desc);
- if (x == INVALID_HANDLE_VALUE)
+ if (x == INVALID_HANDLE_VALUE) {
+ FindClose(x);
+ displayDirectoryList();
return;
+ }
if (desc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
TCHAR *work;
work = wcsrchr(desc.cFileName, '\\');
+ /*
SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE),
LB_ADDSTRING, 0, (LPARAM)(work ? work + 1 : desc.cFileName));
+ */
+ wcscpy(directories[_total_directories++].name, (work ? work + 1 : desc.cFileName));
}
while (FindNextFile(x, &desc))
if (desc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
TCHAR *work;
work = wcsrchr(desc.cFileName, '\\');
+ /*
SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE),
LB_ADDSTRING, 0, (LPARAM)(work ? work + 1 : desc.cFileName));
+ */
+ wcscpy(directories[_total_directories++].name, (work ? work + 1 : desc.cFileName));
}
+
FindClose(x);
+ displayDirectoryList();
+}
+
+void displayGamesList() {
+ int current = _first_index_games;
+ int index_games = 0;
+
+ _last_selected = -1;
+
+ drawBlankGameSelection();
+ drawCommentString("Choose a game");
+
+ if (_first_index_games) {
+ // include "previous" link
+ drawStandardString("***[PREVIOUS]***", index_games++);
+ }
+
+ while (current < _total_games && index_games < MAX_DISPLAYED_GAMES - 1)
+ drawStandardString(listIndex[current++].name, index_games++);
+
+
+ if (current != _total_games) {
+ // add "next" link
+ drawStandardString("***[NEXT]***", index_games);
+ }
+}
+
+void displayDirectoryList() {
+ int current = _first_index;
+ int index_link = 0;
+
+ _last_selected = -1;
+
+ drawBlankGameSelection();
+ drawCommentString("Choose root directory");
+
+ if (_first_index) {
+ // include "previous" link
+ drawStandardString("***[PREVIOUS]***", index_link++);
+ }
+
+ while (current < _total_directories && index_link < MAX_DISPLAYED_DIRECTORIES - 1) {
+ char work[MAX_PATH];
+
+ WideCharToMultiByte(CP_ACP, 0, directories[current].name, wcslen(directories[current].name) + 1, work, sizeof(work), NULL, NULL);
+ if (strlen(work) > 17) {
+ strcpy(work + 17, "[...]");
+ }
+ drawStandardString(work, index_link++);
+ current++;
+ }
+
+ if (current != _total_directories) {
+ // add "next" link
+ drawStandardString("***[NEXT]***", index_link);
+ }
}
void startScan() {
- prescanning = TRUE;
+ /*prescanning = TRUE;*/
+ _scanning = true;
wcscpy(old_basePath, basePath);
- SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT("Choose the games root directory"));
+ //SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT("Choose the games root directory"));
+ drawCommentString("Choose root directory");
+ /*
SetDlgItemText(hwndDlg, IDC_SCAN, TEXT("OK"));
SetDlgItemText(hwndDlg, IDC_GAMEDESC, TEXT(""));
ShowWindow(GetDlgItem(hwndDlg, IDC_PLAY), SW_HIDE);
+ */
doScan();
}
void endScanPath() {
- prescanning = FALSE;
+ /*prescanning = FALSE;*/
+ _scanning = false;
+ /*
SetDlgItemText(hwndDlg, IDC_SCAN, TEXT("Scan"));
ShowWindow(GetDlgItem(hwndDlg, IDC_PLAY), SW_SHOW);
+ */
startFindGame();
}
void abortScanPath() {
- prescanning = FALSE;
+ /*prescanning = FALSE;*/
+ _scanning = false;
wcscpy(basePath, old_basePath);
- SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT(""));
+ //SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT(""));
+ drawCommentString("");
+ /*
SetDlgItemText(hwndDlg, IDC_SCAN, TEXT("Scan"));
SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_RESETCONTENT, 0, 0);
ShowWindow(GetDlgItem(hwndDlg, IDC_PLAY), SW_SHOW);
+ */
displayFoundGames();
}
@@ -392,11 +635,14 @@ void startFindGame() {
char tempo[1024];
char workdir[MAX_PATH];
- prescanning = FALSE;
+ //prescanning = FALSE;
+ _scanning = false;
- SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT("Scanning, please wait"));
+ //SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT("Scanning, please wait"));
+ drawBlankGameSelection();
+ drawCommentString("Scanning, please wait");
- SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_RESETCONTENT, 0, 0);
+ //SendMessage(GetDlgItem(hwndDlg, IDC_LISTAVAILABLE), LB_RESETCONTENT, 0, 0);
memset(gamesFound, 0, MAX_GAMES);
/*
@@ -414,9 +660,10 @@ void startFindGame() {
index = displayFoundGames();
// Save the results in the registry
- SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT("Saving the results"));
+ //SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT("Saving the results"));
+ drawCommentString("Saving the results");
- g_config->set("GamesInstalled", index, "wince");
+ g_config->setInt("GamesInstalled", index, "wince");
tempo[0] = '\0';
for (i=0; i<index; i++) {
@@ -441,33 +688,39 @@ void startFindGame() {
g_config->flush();
- SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT("Scan finished"));
+ //SetDlgItemText(hwndDlg, IDC_FILEPATH, TEXT("Scan finished"));
+ drawCommentString("Scan finished");
}
void getSelectedGame(int result, char *id, TCHAR *directory) {
ScummGame game;
- game = GameList[gamesInstalled[listIndex[result]].reference];
+ game = GameList[gamesInstalled[listIndex[result].reference].reference];
strcpy(id, game.filename);
- wcscpy(directory, gamesInstalled[listIndex[result]].directory);
+ wcscpy(directory, gamesInstalled[listIndex[result].reference].directory);
}
-void displayGameInfo() {
- int item;
- TCHAR work[400];
+void displayGameInfo(int index) {
+ //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];
+ game = GameList[gamesInstalled[listIndex[_last_selected].reference].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);
+ */
+ drawCommentString((char*)game.description);
}
void findGame(TCHAR *directory) {
@@ -553,4 +806,86 @@ void findGame(TCHAR *directory) {
FindClose(x);
}
+void handleSelectGameDown() {
+ if (!_scanning) {
+ if (_last_selected == -1) {
+ if (_first_index_games)
+ changeSelectedGame(1);
+ else
+ changeSelectedGame(0);
+ }
+ else
+ changeSelectedGame(_last_selected - _first_index_games + 1);
+ }
+}
+
+void handleSelectGameUp() {
+ if (!_scanning) {
+ if (_last_selected != -1 && _last_selected) {
+ if (_last_selected == _first_index_games)
+ changeSelectedGame(0);
+ else
+ changeSelectedGame(_last_selected - _first_index_games - 1);
+ }
+ }
+}
+
+void handleSelectGameButton() {
+ if (!_scanning) {
+ if (_last_selected == -1)
+ drawCommentString("Please select a game");
+ else
+ _game_selected = true;
+ }
+}
+
+void handleSelectGame(int x, int y) {
+
+ int start = 70;
+ int i;
+
+ x -= _game_selection_X_offset;
+ y -= _game_selection_Y_offset;
+
+ /* See if it's a selection */
+
+ for (i=0; i<MAX_DISPLAYED_GAMES; i++) {
+ if (y >= start && y <= start + 8) {
+ if (!_scanning)
+ changeSelectedGame(i);
+ else
+ changeScanPath(i);
+ return;
+ }
+ start += 15;
+ }
+
+ /* See if it's a button */
+
+ if (y>=217 && y<=238) {
+ if (x>=8 && x<=45) {
+ if (!_scanning)
+ startScan();
+ else
+ startFindGame();
+ }
+ if ((x>=93 && x<=129)) {
+ if (!_scanning) {
+ if (_last_selected == -1)
+ drawCommentString("Please select a game");
+ else
+ _game_selected = true;
+ }
+ else
+ startFindGame();
+ }
+ if (x>=175 && x<=208) {
+ if (!_scanning)
+ exit(1);
+ else
+ abortScanPath();
+ }
+ }
+}
+
#endif \ No newline at end of file