Difference between revisions of "Sword25/TODO"
< Sword25
(Added note about running with extracted game data) |
m (Text replacement - "<source lang=" to "<syntaxhighlight lang=") |
||
(48 intermediate revisions by 10 users not shown) | |||
Line 1: | Line 1: | ||
== | {{Infobox_TODO| | ||
taskname=Sword25 Engine TODO| | |||
techcontact=[[Sword25]] Engine Team| | |||
subsystem=Engine| | |||
}} | |||
== Regressions == | |||
== TODOs == | == TODOs == | ||
* Enhance package manager to allow running with extracted data just like original did | * 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. | ||
* There may still be locale-related bugs. There have been at least two relating to the decimal mark being a comma instead of a point in my locale. However, there are currently no known ones. | |||
* 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). | |||
<syntaxhighlight lang="cpp"> | |||
// 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; | |||
} | |||
</syntaxhighlight> | |||
== 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. |
Latest revision as of 15:15, 25 October 2018
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.
- There may still be locale-related bugs. There have been at least two relating to the decimal mark being a comma instead of a point in my locale. However, there are currently no known ones.
- 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).
// 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: