Sword25/TODO
< Sword25
Revision as of 04:29, 17 June 2011 by Eriktorbjorn (talk | contribs) (Added note about locale-related bugs.)
TODO List | |
Name | Sword25 Engine TODO |
Technical Contact(s) | Sword25 Engine Team |
Subsystem | Engine |
Regressions
TODOs
- Enhance package manager to allow running with extracted data just like original did
- Translate comments from German
- Check if it's completable on BE machine (first few scenes work now)
- Audio does not get saved with Persistence
- PersistenceService::saveGame and PersistenceService::loadGame contain code to (de)compress the save data using zlib. But we already compress savegames using zlib, so now we end up compressing them twice. Unless we need to do the compression to be compatible with saves from the original, we should get rid of this in-engine compression. If we can't get rid of it, we should add code comments that explain the reasons.
- The following commented out code used to be in kernel/scummvmwindow.cpp; I am keeping it here in case there is still something in there that needs to be handled (which I can't tell right now).
* Locale-related bugs. One example, though there may be others: At the time of writing, the music volume gets set to 0 by default, probably because it misinterprets 0.5 (which in my locale is formatted as "0,5") as 0. The other default volumes are 1, and it probably interprets everything up to the decimal comma in those cases. (I'm not sure why Sword25FileProxy::setupConfigFile() uses the default volumes, because I do have settings for them in my .scummvmrc.)
// FIXME: Special keys detected here need to be moved into the Input Engine
// Die WindowProc aller Fenster der Klasse
LRESULT CALLBACK BS_ScummVMWindow::WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT:
ValidateRect(hwnd, NULL);
break;
case WM_DESTROY:
// Das Fenster wird zerstört
PostQuitMessage(0);
break;
case WM_CLOSE:
{
BS_Window * WindowPtr = BS_Kernel::GetInstance()->GetWindow();
if (WindowPtr) {
WindowPtr->SetCloseWanted(true);
}
break;
}
case WM_KEYDOWN:
{
// Tastendrücke, die für das Inputmodul interessant sind, werden diesem gemeldet.
BS_InputEngine * InputPtr = BS_Kernel::GetInstance()->GetInput();
if (InputPtr)
{
switch (wParam)
{
case VK_RETURN:
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_ENTER);
break;
case VK_LEFT:
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_LEFT);
break;
case VK_RIGHT:
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_RIGHT);
break;
case VK_HOME:
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_HOME);
break;
case VK_END:
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_END);
break;
case VK_BACK:
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_BACKSPACE);
break;
case VK_TAB:
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_TAB);
break;
case VK_INSERT:
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_INSERT);
break;
case VK_DELETE:
InputPtr->ReportCommand(BS_InputEngine::KEY_COMMAND_DELETE);
break;
}
}
break;
}
case WM_KEYUP:
case WM_SYSKEYUP:
// Alle Tastendrücke werden ignoriert, damit Windows per DefWindowProc() nicht darauf
// reagieren kann und damit unerwartete Seiteneffekte auslöst.
// Zum Beispiel würden ALT und F10 Tastendrücke das "Menü" aktivieren und somit den Message-Loop zum Stillstand bringen.
break;
case WM_SYSCOMMAND:
// Verhindern, dass der Bildschirmschoner aktiviert wird, während das Spiel läuft
if (wParam != SC_SCREENSAVE) return DefWindowProc(hwnd,uMsg,wParam,lParam);
break;
case WM_CHAR:
{
byte theChar = static_cast<byte>(wParam & 0xff);
// Alle Zeichen, die keine Steuerzeichen sind, werden als Buchstaben dem Input-Service mitgeteilt.
if (theChar >= 32)
{
BS_InputEngine * InputPtr = BS_Kernel::GetInstance()->GetInput();
if (InputPtr) InputPtr->ReportCharacter(theChar);
}
}
break;
case WM_SETCURSOR:
{
// Der Systemcursor wird in der Client-Area des Fensters nicht angezeigt, jedoch in der nicht Client-Area, damit der Benutzer das Fenster wie gewohnt
// schließen und verschieben kann.
// Koordinaten des Cursors in der Client-Area berechnen.
POINT pt;
GetCursorPos(&pt);
ScreenToClient(hwnd, &pt);
// Feststellen, ob sich der Cursor in der Client-Area befindet.
// Get client rect
RECT rc;
GetClientRect(hwnd, &rc);
// See if cursor is in client area
if(PtInRect(&rc, pt))
// In der Client-Area keinen Cursor anzeigen.
SetCursor(NULL);
else
// Ausserhalb der Client-Area den Cursor anzeigen.
SetCursor(LoadCursor(NULL, IDC_ARROW));
return TRUE;
}
break;
default:
// Um alle anderen Vorkommnisse kümmert sich Windows
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
Lua TODO
- Lua exceptions require use of setjmp (not portable) or throw/catch (but we normally disable exceptions in ScummVM builds to reduce memory usage). This needs to be dealt with. E.g. we should add a configure check for setjmp, and only enable the engines on ports that support this.
- Lua makes use of several other potentially non-portable or "dangerous" routines, that should be avoided in ScummVM code. I noticed the following (but the list may not be complete):
- in loslib.cpp:
- strerror
- system (!!)
- remove
- rename
- tmpname / mktemp
- getenv
- clock
- gmtime
- localtime
- mktime
- time
- difftime
- setlocale
- exit (replace by a call to OSystem::quit, or "just" quit the engine?)
- in liolib.cpp and lauxlib.cpp:
- fopen, fread, fwrite, fclose, fseek, setvbuf, ... -> use our file API instead?
- in loadlib.cpp
- fopen / fclose
- this contains stuff for dealing with loadable modules (which we don't really need, do we?). So we might be able to just stub it out completely.
- in loslib.cpp: