SWORD25: Converted the input engine to use the ScummVM event manager

svn-id: r53203
This commit is contained in:
Paul Gilbert 2010-08-03 09:47:45 +00:00 committed by Eugene Sandulenko
parent fab86ba222
commit 86bef1508c
6 changed files with 175 additions and 197 deletions

View File

@ -32,36 +32,41 @@
*
*/
#include "common/algorithm.h"
#include "common/events.h"
#include "common/system.h"
#include "common/util.h"
#include "sword25/kernel/kernel.h"
#include "sword25/kernel/callbackregistry.h"
#include "sword25/kernel/inputpersistenceblock.h"
#include "sword25/kernel/outputpersistenceblock.h"
#include "sword25/input/stdwininput.h"
#include "sword25/input/scummvminput.h"
#include <algorithm>
using namespace std;
#define BS_LOG_PREFIX "SCUMMVMINPUT"
#define BS_LOG_PREFIX "WININPUT"
namespace Sword25 {
#define DOUBLE_CLICK_TIME 500
#define DOUBLE_CLICK_RECT_SIZE 4
// -----------------------------------------------------------------------------
// Konstruktion / Destruktion
// Constructor / Destructor
// -----------------------------------------------------------------------------
BS_StdWinInput::BS_StdWinInput(BS_Kernel* pKernel) :
m_CurrentState(0),
m_LeftMouseDown(false),
m_RightMouseDown(false),
m_MouseX(0),
m_MouseY(0),
m_LeftDoubleClick(false),
m_DoubleClickTime(GetDoubleClickTime()),
m_DoubleClickRectWidth(GetSystemMetrics(SM_CXDOUBLECLK)),
m_DoubleClickRectHeight(GetSystemMetrics(SM_CYDOUBLECLK)),
m_LastLeftClickTime(0),
m_LastLeftClickMouseX(0),
m_LastLeftClickMouseY(0),
BS_InputEngine(pKernel)
{
ScummVMInput::ScummVMInput(BS_Kernel *pKernel) :
m_CurrentState(0),
m_LeftMouseDown(false),
m_RightMouseDown(false),
m_MouseX(0),
m_MouseY(0),
m_LeftDoubleClick(false),
m_DoubleClickTime(DOUBLE_CLICK_TIME),
m_DoubleClickRectWidth(DOUBLE_CLICK_RECT_SIZE),
m_DoubleClickRectHeight(DOUBLE_CLICK_RECT_SIZE),
m_LastLeftClickTime(0),
m_LastLeftClickMouseX(0),
m_LastLeftClickMouseY(0),
BS_InputEngine(pKernel) {
memset(m_KeyboardState[0], 0, sizeof(m_KeyboardState[0]));
memset(m_KeyboardState[1], 0, sizeof(m_KeyboardState[1]));
m_LeftMouseState[0] = false;
@ -70,105 +75,101 @@ BS_StdWinInput::BS_StdWinInput(BS_Kernel* pKernel) :
m_RightMouseState[1] = false;
}
BS_StdWinInput::~BS_StdWinInput()
{
ScummVMInput::~ScummVMInput() {
}
// -----------------------------------------------------------------------------
BS_Service * BS_StdWinInput_CreateObject(BS_Kernel* pKernel) { return new BS_StdWinInput(pKernel); }
BS_Service *ScummVMInput_CreateObject(BS_Kernel *pKernel) { return new ScummVMInput(pKernel); }
// -----------------------------------------------------------------------------
bool BS_StdWinInput::Init()
{
// Keine Inialisierung notwendig
bool ScummVMInput::Init() {
// No initialisation needed
return true;
}
// -----------------------------------------------------------------------------
void BS_StdWinInput::Update()
{
// Der Status wird nur aktualisiert, wenn das Applikationsfenster den Fokus hat, so wird verhindert, dass
// Eingaben verarbeitet werden, die eigentlich für eine andere Applikation gedacht waren.
if (BS_Kernel::GetInstance()->GetWindow()->HasFocus())
{
m_CurrentState ^= 1;
void ScummVMInput::Update() {
Common::Event event;
m_CurrentState ^= 1;
// Der Status der Eingabegeräte wird nur einmal pro Frame ausgelesen, damit für
// jeden Frame gleiche Anfragen die gleiche Antwort erhalten.
// Loop through processing any pending events
bool handleEvents = true;
while (handleEvents && g_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_LBUTTONDOWN:
case Common::EVENT_LBUTTONUP:
m_LeftMouseDown = event.type == Common::EVENT_LBUTTONDOWN;
m_MouseX = event.mouse.x; m_MouseY = event.mouse.y;
handleEvents = false;
break;
case Common::EVENT_RBUTTONDOWN:
case Common::EVENT_RBUTTONUP:
m_RightMouseDown = event.type == Common::EVENT_RBUTTONDOWN;
m_MouseX = event.mouse.x; m_MouseY = event.mouse.y;
handleEvents = false;
break;
POINT MousePos;
if (GetCursorPos(&MousePos))
{
m_MouseX = MousePos.x - BS_Kernel::GetInstance()->GetWindow()->GetClientX();
m_MouseY = MousePos.y - BS_Kernel::GetInstance()->GetWindow()->GetClientY();
case Common::EVENT_MOUSEMOVE:
m_MouseX = event.mouse.x; m_MouseY = event.mouse.y;
break;
case Common::EVENT_KEYDOWN:
case Common::EVENT_KEYUP:
AlterKeyboardState(event.kbd.keycode, (event.type == Common::EVENT_KEYDOWN) ? 0x80 : 0);
break;
default:
break;
}
else
{
BS_LOG_ERRORLN("Call to GetCursorPos() failed.");
m_MouseX = 0;
m_MouseY = 0;
}
GetKeyboardState(m_KeyboardState[m_CurrentState]);
m_LeftMouseDown = (GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0;
m_RightMouseDown = (GetAsyncKeyState(VK_RBUTTON) & 0x8000) != 0;
m_LeftMouseState[m_CurrentState] = m_LeftMouseDown;
m_RightMouseState[m_CurrentState] = m_RightMouseDown;
TestForLeftDoubleClick();
}
m_LeftMouseState[m_CurrentState] = m_LeftMouseDown;
m_RightMouseState[m_CurrentState] = m_RightMouseDown;
TestForLeftDoubleClick();
}
// -----------------------------------------------------------------------------
bool BS_StdWinInput::IsLeftMouseDown()
{
bool ScummVMInput::IsLeftMouseDown() {
return m_LeftMouseDown;
}
// -----------------------------------------------------------------------------
bool BS_StdWinInput::IsRightMouseDown()
{
bool ScummVMInput::IsRightMouseDown() {
return m_RightMouseDown;
}
// -----------------------------------------------------------------------------
void BS_StdWinInput::TestForLeftDoubleClick()
{
// Das Doppelklick-Flag wird gelöscht, für den Fall, dass im letzten Frame ein Doppelklick ausgetreten ist.
void ScummVMInput::TestForLeftDoubleClick() {
m_LeftDoubleClick = false;
// Die linke Maustaste wurde geklickt, also muss getestet werden, ob ein Doppelklick vorliegt.
if (WasLeftMouseDown())
{
// Die Zeit auslesen.
// Only bother checking for a double click if the left mouse button was clicked
if (WasLeftMouseDown()) {
// Get the time now
unsigned int Now = BS_Kernel::GetInstance()->GetMilliTicks();
// Ein Doppelklick wird erkannt, wenn:
// 1. Die zwei Klicks liegen nah genug zusammen.
// 2. Der Mauscursor wurde zwischen den Klicks nicht zu viel bewegt.
// A double click is signalled if
// 1. The two clicks are close enough together
// 2. The mouse cursor hasn't moved much
if (Now - m_LastLeftClickTime <= m_DoubleClickTime &&
abs(m_MouseX - m_LastLeftClickMouseX) <= m_DoubleClickRectWidth / 2 &&
abs(m_MouseY - m_LastLeftClickMouseY) <= m_DoubleClickRectHeight / 2)
{
ABS(m_MouseX - m_LastLeftClickMouseX) <= m_DoubleClickRectWidth / 2 &&
ABS(m_MouseY - m_LastLeftClickMouseY) <= m_DoubleClickRectHeight / 2) {
m_LeftDoubleClick = true;
// Die Zeit und Position des letzten Linksklicks zurücksetzen, damit dieser Klick nicht als erster Klick eines weiteren Doppelklicks
// interpretiert wird.
// Reset the time and position of the last click, so that clicking is not
// interpreted as the first click of a further double-click
m_LastLeftClickTime = 0;
m_LastLeftClickMouseX = 0;
m_LastLeftClickMouseY = 0;
}
else
{
// Es liegt kein Doppelklick vor, die Zeit und die Position dieses Klicks merken, für den Fall das dies der erste Klick eines
// zukünftigen Doppelklicks wird.
} else {
// There is no double click. Remember the position and time of the click,
// in case it's the first click of a double-click sequence
m_LastLeftClickTime = Now;
m_LastLeftClickMouseX = m_MouseX;
m_LastLeftClickMouseY = m_MouseY;
@ -178,80 +179,74 @@ void BS_StdWinInput::TestForLeftDoubleClick()
// -----------------------------------------------------------------------------
bool BS_StdWinInput::IsLeftDoubleClick()
{
void AlterKeyboardState(int keycode, byte newState) {
}
// -----------------------------------------------------------------------------
bool ScummVMInput::IsLeftDoubleClick() {
return m_LeftDoubleClick;
}
// -----------------------------------------------------------------------------
bool BS_StdWinInput::WasLeftMouseDown()
{
bool ScummVMInput::WasLeftMouseDown() {
return (m_LeftMouseState[m_CurrentState] == false) && (m_LeftMouseState[m_CurrentState ^ 1] == true);
}
// -----------------------------------------------------------------------------
bool BS_StdWinInput::WasRightMouseDown()
{
bool ScummVMInput::WasRightMouseDown() {
return (m_RightMouseState[m_CurrentState] == false) && (m_RightMouseState[m_CurrentState ^ 1] == true);
}
// -----------------------------------------------------------------------------
int BS_StdWinInput::GetMouseX()
{
int ScummVMInput::GetMouseX() {
return m_MouseX;
}
// -----------------------------------------------------------------------------
int BS_StdWinInput::GetMouseY()
{
int ScummVMInput::GetMouseY() {
return m_MouseY;
}
// -----------------------------------------------------------------------------
bool BS_StdWinInput::IsKeyDown(unsigned int KeyCode)
{
bool ScummVMInput::IsKeyDown(unsigned int KeyCode) {
return (m_KeyboardState[m_CurrentState][KeyCode] & 0x80) != 0;
}
// -----------------------------------------------------------------------------
bool BS_StdWinInput::WasKeyDown(unsigned int KeyCode)
{
return ((m_KeyboardState[m_CurrentState][KeyCode] & 0x80) == 0) && ((m_KeyboardState[m_CurrentState ^ 1][KeyCode] & 0x80) != 0);
bool ScummVMInput::WasKeyDown(unsigned int KeyCode) {
return ((m_KeyboardState[m_CurrentState][KeyCode] & 0x80) == 0) &&
((m_KeyboardState[m_CurrentState ^ 1][KeyCode] & 0x80) != 0);
}
// -----------------------------------------------------------------------------
void BS_StdWinInput::SetMouseX(int PosX)
{
void ScummVMInput::SetMouseX(int PosX) {
m_MouseX = PosX;
SetCursorPos(m_MouseX + BS_Kernel::GetInstance()->GetWindow()->GetClientX(), m_MouseY + BS_Kernel::GetInstance()->GetWindow()->GetClientY());
g_system->warpMouse(m_MouseX, m_MouseY);
}
// -----------------------------------------------------------------------------
void BS_StdWinInput::SetMouseY(int PosY)
{
void ScummVMInput::SetMouseY(int PosY) {
m_MouseY = PosY;
SetCursorPos(m_MouseX + BS_Kernel::GetInstance()->GetWindow()->GetClientX(), m_MouseY + BS_Kernel::GetInstance()->GetWindow()->GetClientY());
g_system->warpMouse(m_MouseX, m_MouseY);
}
// -----------------------------------------------------------------------------
bool BS_StdWinInput::RegisterCharacterCallback(CharacterCallback Callback)
{
if (find(m_CharacterCallbacks.begin(), m_CharacterCallbacks.end(), Callback) == m_CharacterCallbacks.end())
{
bool ScummVMInput::RegisterCharacterCallback(CharacterCallback Callback) {
if (Common::find(m_CharacterCallbacks.begin(), m_CharacterCallbacks.end(), Callback) == m_CharacterCallbacks.end()) {
m_CharacterCallbacks.push_back(Callback);
return true;
}
else
{
} else {
BS_LOG_WARNINGLN("Tried to register an CharacterCallback that was already registered.");
return false;
}
@ -259,16 +254,13 @@ bool BS_StdWinInput::RegisterCharacterCallback(CharacterCallback Callback)
// -----------------------------------------------------------------------------
bool BS_StdWinInput::UnregisterCharacterCallback(CharacterCallback Callback)
{
list<CharacterCallback>::iterator CallbackIter = find(m_CharacterCallbacks.begin(), m_CharacterCallbacks.end(), Callback);
if (CallbackIter != m_CharacterCallbacks.end())
{
bool ScummVMInput::UnregisterCharacterCallback(CharacterCallback Callback) {
Common::List<CharacterCallback>::iterator CallbackIter = Common::find(m_CharacterCallbacks.begin(),
m_CharacterCallbacks.end(), Callback);
if (CallbackIter != m_CharacterCallbacks.end()) {
m_CharacterCallbacks.erase(CallbackIter);
return true;
}
else
{
} else {
BS_LOG_WARNINGLN("Tried to unregister an CharacterCallback that was not previously registered.");
return false;
}
@ -276,15 +268,11 @@ bool BS_StdWinInput::UnregisterCharacterCallback(CharacterCallback Callback)
// -----------------------------------------------------------------------------
bool BS_StdWinInput::RegisterCommandCallback(CommandCallback Callback)
{
if (find(m_CommandCallbacks.begin(), m_CommandCallbacks.end(), Callback) == m_CommandCallbacks.end())
{
bool ScummVMInput::RegisterCommandCallback(CommandCallback Callback) {
if (Common::find(m_CommandCallbacks.begin(), m_CommandCallbacks.end(), Callback) == m_CommandCallbacks.end()) {
m_CommandCallbacks.push_back(Callback);
return true;
}
else
{
} else {
BS_LOG_WARNINGLN("Tried to register an CommandCallback that was already registered.");
return false;
}
@ -292,16 +280,13 @@ bool BS_StdWinInput::RegisterCommandCallback(CommandCallback Callback)
// -----------------------------------------------------------------------------
bool BS_StdWinInput::UnregisterCommandCallback(CommandCallback Callback)
{
list<CommandCallback>::iterator CallbackIter = find(m_CommandCallbacks.begin(), m_CommandCallbacks.end(), Callback);
if (CallbackIter != m_CommandCallbacks.end())
{
bool ScummVMInput::UnregisterCommandCallback(CommandCallback Callback) {
Common::List<CommandCallback>::iterator CallbackIter =
Common::find(m_CommandCallbacks.begin(), m_CommandCallbacks.end(), Callback);
if (CallbackIter != m_CommandCallbacks.end()) {
m_CommandCallbacks.erase(CallbackIter);
return true;
}
else
{
} else {
BS_LOG_WARNINGLN("Tried to unregister an CommandCallback that was not previously registered.");
return false;
}
@ -309,15 +294,13 @@ bool BS_StdWinInput::UnregisterCommandCallback(CommandCallback Callback)
// -----------------------------------------------------------------------------
void BS_StdWinInput::ReportCharacter(unsigned char Character)
{
list<CharacterCallback>::const_iterator CallbackIter = m_CharacterCallbacks.begin();
while (CallbackIter != m_CharacterCallbacks.end())
{
void ScummVMInput::ReportCharacter(unsigned char Character) {
Common::List<CharacterCallback>::const_iterator CallbackIter = m_CharacterCallbacks.begin();
while (CallbackIter != m_CharacterCallbacks.end()) {
// Iterator vor dem Aufruf erhöhen und im Folgendem auf einer Kopie arbeiten.
// Dieses Vorgehen ist notwendig da der Iterator möglicherweise von der Callbackfunktion durch das Deregistrieren des Callbacks
// invalidiert wird.
list<CharacterCallback>::const_iterator CurCallbackIter = CallbackIter;
Common::List<CharacterCallback>::const_iterator CurCallbackIter = CallbackIter;
++CallbackIter;
(*CurCallbackIter)(Character);
@ -326,15 +309,13 @@ void BS_StdWinInput::ReportCharacter(unsigned char Character)
// -----------------------------------------------------------------------------
void BS_StdWinInput::ReportCommand(KEY_COMMANDS Command)
{
list<CommandCallback>::const_iterator CallbackIter = m_CommandCallbacks.begin();
while (CallbackIter != m_CommandCallbacks.end())
{
void ScummVMInput::ReportCommand(KEY_COMMANDS Command) {
Common::List<CommandCallback>::const_iterator CallbackIter = m_CommandCallbacks.begin();
while (CallbackIter != m_CommandCallbacks.end()) {
// Iterator vor dem Aufruf erhöhen und im Folgendem auf einer Kopie arbeiten.
// Dieses Vorgehen ist notwendig da der Iterator möglicherweise von der Callbackfunktion durch das Deregistrieren des Callbacks
// invalidiert wird.
list<CommandCallback>::const_iterator CurCallbackIter = CallbackIter;
Common::List<CommandCallback>::const_iterator CurCallbackIter = CallbackIter;
++CallbackIter;
(*CurCallbackIter)(Command);
@ -345,16 +326,14 @@ void BS_StdWinInput::ReportCommand(KEY_COMMANDS Command)
// Persistenz
// -----------------------------------------------------------------------------
bool BS_StdWinInput::Persist(BS_OutputPersistenceBlock & Writer)
{
bool ScummVMInput::Persist(BS_OutputPersistenceBlock &Writer) {
// Anzahl an Command-Callbacks persistieren.
Writer.Write(m_CommandCallbacks.size());
// Alle Command-Callbacks einzeln persistieren.
{
list<CommandCallback>::const_iterator It = m_CommandCallbacks.begin();
while (It != m_CommandCallbacks.end())
{
Common::List<CommandCallback>::const_iterator It = m_CommandCallbacks.begin();
while (It != m_CommandCallbacks.end()) {
Writer.Write(BS_CallbackRegistry::GetInstance().ResolveCallbackPointer(*It));
++It;
}
@ -365,9 +344,8 @@ bool BS_StdWinInput::Persist(BS_OutputPersistenceBlock & Writer)
// Alle Character-Callbacks einzeln persistieren.
{
list<CharacterCallback>::const_iterator It = m_CharacterCallbacks.begin();
while (It != m_CharacterCallbacks.end())
{
Common::List<CharacterCallback>::const_iterator It = m_CharacterCallbacks.begin();
while (It != m_CharacterCallbacks.end()) {
Writer.Write(BS_CallbackRegistry::GetInstance().ResolveCallbackPointer(*It));
++It;
}
@ -378,8 +356,7 @@ bool BS_StdWinInput::Persist(BS_OutputPersistenceBlock & Writer)
// -----------------------------------------------------------------------------
bool BS_StdWinInput::Unpersist(BS_InputPersistenceBlock & Reader)
{
bool ScummVMInput::Unpersist(BS_InputPersistenceBlock &Reader) {
// Command-Callbackliste leeren.
m_CommandCallbacks.clear();
@ -388,12 +365,12 @@ bool BS_StdWinInput::Unpersist(BS_InputPersistenceBlock & Reader)
Reader.Read(CommandCallbackCount);
// Alle Command-Callbacks wieder herstellen.
for (unsigned int i = 0; i < CommandCallbackCount; ++i)
{
std::string CallbackFunctionName;
for (unsigned int i = 0; i < CommandCallbackCount; ++i) {
Common::String CallbackFunctionName;
Reader.Read(CallbackFunctionName);
m_CommandCallbacks.push_back(reinterpret_cast<CommandCallback>(BS_CallbackRegistry::GetInstance().ResolveCallbackFunction(CallbackFunctionName)));
m_CommandCallbacks.push_back(reinterpret_cast<CommandCallback>(
BS_CallbackRegistry::GetInstance().ResolveCallbackFunction(CallbackFunctionName)));
}
// Character-Callbackliste leeren.
@ -404,9 +381,8 @@ bool BS_StdWinInput::Unpersist(BS_InputPersistenceBlock & Reader)
Reader.Read(CharacterCallbackCount);
// Alle Character-Callbacks wieder herstellen.
for (unsigned int i = 0; i < CharacterCallbackCount; ++i)
{
std::string CallbackFunctionName;
for (unsigned int i = 0; i < CharacterCallbackCount; ++i) {
Common::String CallbackFunctionName;
Reader.Read(CallbackFunctionName);
m_CharacterCallbacks.push_back(reinterpret_cast<CharacterCallback>(BS_CallbackRegistry::GetInstance().ResolveCallbackFunction(CallbackFunctionName)));
@ -414,3 +390,5 @@ bool BS_StdWinInput::Unpersist(BS_InputPersistenceBlock & Reader)
return Reader.IsGood();
}
} // End of namespace Sword25

View File

@ -47,10 +47,10 @@ namespace Sword25 {
class BS_Kernel;
/// Class definitions
class BS_StdWinInput : public BS_InputEngine {
class ScummVMInput : public BS_InputEngine {
public:
BS_StdWinInput(BS_Kernel *pKernel);
virtual ~BS_StdWinInput();
ScummVMInput(BS_Kernel *pKernel);
virtual ~ScummVMInput();
virtual bool Init();
virtual void Update();
@ -77,6 +77,7 @@ public:
private:
void TestForLeftDoubleClick();
void AlterKeyboardState(int keycode, byte newState);
byte m_KeyboardState[2][256];
bool m_LeftMouseState[2];

View File

@ -39,39 +39,40 @@
// Includes
// -----------------------------------------------------------------------------
#include "common/scummsys.h"
#include "common/str.h"
#include "common/hash-str.h"
#include "common/hashmap.h"
#include "sword25/kernel/common.h"
#include "sword25/kernel/memlog_off.h"
#include <map>
#include "sword25/kernel/memlog_on.h"
namespace Sword25 {
// -----------------------------------------------------------------------------
// Klassendeklaration
// -----------------------------------------------------------------------------
class BS_CallbackRegistry
{
class BS_CallbackRegistry {
public:
static BS_CallbackRegistry & GetInstance()
{
static BS_CallbackRegistry & GetInstance() {
static BS_CallbackRegistry Instance;
return Instance;
}
bool RegisterCallbackFunction(const std::string & Name, void * Ptr);
void * ResolveCallbackFunction(const std::string & Name) const;
std::string ResolveCallbackPointer(void * Ptr) const;
bool RegisterCallbackFunction(const Common::String &Name, void * Ptr);
void * ResolveCallbackFunction(const Common::String &Name) const;
Common::String ResolveCallbackPointer(void *Ptr) const;
private:
typedef std::map<std::string, void *> NameToPtrMap;
typedef Common::HashMap<Common::String, void *, Common::CaseSensitiveString_Hash, Common::CaseSensitiveString_EqualTo> NameToPtrMap;
NameToPtrMap m_NameToPtrMap;
typedef std::map<void *, std::string> PtrToNameMap;
typedef Common::HashMap<void *, Common::String, Common::CaseSensitiveString_Hash, Common::CaseSensitiveString_EqualTo> PtrToNameMap;
PtrToNameMap m_PtrToNameMap;
void * FindPtrByName(const std::string & Name) const;
std::string FindNameByPtr(void * Ptr) const;
void StoreCallbackFunction(const std::string & Name, void * Ptr);
void * FindPtrByName(const Common::String &Name) const;
Common::String FindNameByPtr(void * Ptr) const;
void StoreCallbackFunction(const Common::String & Name, void * Ptr);
};
} // End of namespace Sword25
#endif

View File

@ -39,11 +39,9 @@
// Includes
// -----------------------------------------------------------------------------
#include "common/array.h"
#include "sword25/kernel/common.h"
#include "sword25/kernel/persistenceblock.h"
#include "sword25/kernel/memlog_off.h"
#include <vector>
#include "sword25/kernel/memlog_on.h"
namespace Sword25 {

View File

@ -49,24 +49,24 @@
namespace Sword25 {
BS_Service *BS_OpenGLGfx_CreateObject(BS_Kernel* pKernel);
BS_Service *BS_ScummVMPackageManager_CreateObject(BS_Kernel* pKernel);
BS_Service *BS_StdWinInput_CreateObject(BS_Kernel* pKernel);
BS_Service *BS_FMODExSound_CreateObject(BS_Kernel* pKernel);
BS_Service *BS_LuaScriptEngine_CreateObject(BS_Kernel* pKernel);
BS_Service *BS_Geometry_CreateObject(BS_Kernel* pKernel);
BS_Service *BS_OggTheora_CreateObject(BS_Kernel* pKernel);
BS_Service *BS_OpenGLGfx_CreateObject(BS_Kernel *pKernel);
BS_Service *BS_ScummVMPackageManager_CreateObject(BS_Kernel *pKernel);
BS_Service *BS_ScummVMInput_CreateObject(BS_Kernel *pKernel);
BS_Service *BS_FMODExSound_CreateObject(BS_Kernel *pKernel);
BS_Service *BS_LuaScriptEngine_CreateObject(BS_Kernel *pKernel);
BS_Service *BS_Geometry_CreateObject(BS_Kernel *pKernel);
BS_Service *BS_OggTheora_CreateObject(BS_Kernel *pKernel);
// Services are recorded in this table
const BS_ServiceInfo BS_SERVICE_TABLE[] =
{
// Die ersten beiden Parameter sind die Namen der Superclass und des Services.
// Der dritte Parameter ist die statische Methode der Klasse, die ein Objekt der Klasse erzeugt und zurückgibt.
// Beispiel:
const BS_ServiceInfo BS_SERVICE_TABLE[] = {
// The first two parameters are the name of the superclass and service
// The third parameter is the static method of the class that creates an object
// of the class and returns it
// Example:
// BS_ServiceInfo("Superclass", "Service", CreateMethod)
BS_ServiceInfo("gfx", "opengl", BS_OpenGLGfx_CreateObject),
BS_ServiceInfo("package", "archiveFS", BS_ScummVMPackageManager_CreateObject),
BS_ServiceInfo("input", "winapi", BS_StdWinInput_CreateObject),
BS_ServiceInfo("input", "winapi", BS_ScummVMInput_CreateObject),
BS_ServiceInfo("sfx", "fmodex", BS_FMODExSound_CreateObject),
BS_ServiceInfo("script", "lua", BS_LuaScriptEngine_CreateObject),
BS_ServiceInfo("geometry", "std", BS_Geometry_CreateObject),

View File

@ -38,6 +38,7 @@
// Includes
// -----------------------------------------------------------------------------
#include "common/array.h"
#include "sword25/package/packagemanager.h"
#include "sword25/script/luascript.h"
#include "sword25/script/luabindhelper.h"
@ -58,7 +59,6 @@ extern "C" {
namespace Sword25 {
using namespace std;
using namespace Lua;
// -----------------------------------------------------------------------------
@ -410,7 +410,7 @@ namespace {
namespace {
int Chunkwriter(lua_State *L, const void *p, size_t sz, void *ud) {
vector<unsigned char> & chunkData = *reinterpret_cast<vector<unsigned char> * >(ud);
Common::Array<unsigned char> & chunkData = *reinterpret_cast<Common::Array<unsigned char> * >(ud);
const unsigned char *buffer = reinterpret_cast<const unsigned char *>(p);
while (sz--) chunkData.push_back(*buffer++) ;
@ -431,8 +431,8 @@ bool BS_LuaScriptEngine::Persist(BS_OutputPersistenceBlock &Writer) {
PushPermanentsTable(m_State, PTT_PERSIST);
lua_getglobal(m_State, "_G");
// Lua persists and stores the data in a vector
vector<unsigned char> chunkData;
// Lua persists and stores the data in a Common::Array
Common::Array<unsigned char> chunkData;
pluto_persist(m_State, Chunkwriter, &chunkData);
// Persistenzdaten in den Writer schreiben.