aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/hdb/file-manager.cpp22
-rw-r--r--engines/hdb/file-manager.h1
-rw-r--r--engines/hdb/hdb.cpp11
-rw-r--r--engines/hdb/lua-script.cpp121
-rw-r--r--engines/hdb/lua-script.h5
5 files changed, 143 insertions, 17 deletions
diff --git a/engines/hdb/file-manager.cpp b/engines/hdb/file-manager.cpp
index b67d95e4a2..3ad0e93216 100644
--- a/engines/hdb/file-manager.cpp
+++ b/engines/hdb/file-manager.cpp
@@ -120,6 +120,28 @@ Common::SeekableReadStream *FileMan::findFirstData(const char *string, DataType
return new Common::MemoryReadStream(buffer, file->ulength, DisposeAfterUse::YES);
}
+int32 FileMan::getLength(const char *string, DataType type) {
+ Common::String fileString;
+ MPCEntry *file = NULL;
+
+ // Find MPC Entry
+ for (MPCIterator it = _dir.begin(); it != _dir.end(); it++) {
+ fileString = (*it)->filename;
+ if (fileString.contains(string)) {
+ if ((*it)->type == type) {
+ file = *it;
+ break;
+ }
+ }
+ }
+
+ if (file == NULL) {
+ return 0;
+ }
+
+ return file->ulength;
+}
+
/*
MPCEntry **FileMan::findNextData(MPCIterator begin) {
Common::String fileString;
diff --git a/engines/hdb/file-manager.h b/engines/hdb/file-manager.h
index 52a49c66e8..f50bfc31e4 100644
--- a/engines/hdb/file-manager.h
+++ b/engines/hdb/file-manager.h
@@ -84,6 +84,7 @@ public:
*/
Common::SeekableReadStream *findFirstData(const char *string, DataType type);
+ int32 getLength(const char *string, DataType type);
//MPCEntry **findNextData(MPCIterator it);
//int findAmount(char *string, DataType type);
diff --git a/engines/hdb/hdb.cpp b/engines/hdb/hdb.cpp
index e929835598..06fa6a9997 100644
--- a/engines/hdb/hdb.cpp
+++ b/engines/hdb/hdb.cpp
@@ -141,15 +141,16 @@ Common::Error HDBGame::run() {
Tile *tile = new Tile;
Graphics::Surface surf2 = tile->load(tileStream);
- /*Common::SeekableReadStream *luaStream = fileMan->findFirstData("CINE_INTRO_DEMO_LUA", TYPE_BINARY);
- int32 luaLength = fileMan->getLength("CINE_INTRO_DEMO_LUA", TYPE_BINARY);
+ Common::SeekableReadStream *luaStream = fileMan->findFirstData("MAP00_DEMO_LUA", TYPE_BINARY);
+ int32 luaLength = fileMan->getLength("MAP00_DEMO_LUA", TYPE_BINARY);
if (luaStream == NULL) {
- debug("The CINE_INTRO_DEMO_LUA MPC entry can't be found.");
+ debug("The MAP00_DEMO_LUA MPC entry can't be found.");
return Common::kReadingFailed;
}
- lua->executeMPC(luaStream, "CINE_INTRO_DEMO_LUA", luaLength);
- */
+ lua->initScript(luaStream, "MAP00_DEMO_LUA", luaLength);
+ //lua->executeMPC(luaStream, "CINE_INTRO_DEMO_LUA", luaLength);
+
while (!shouldQuit()) {
Common::Event event;
diff --git a/engines/hdb/lua-script.cpp b/engines/hdb/lua-script.cpp
index 3793b903a9..3dfb53a436 100644
--- a/engines/hdb/lua-script.cpp
+++ b/engines/hdb/lua-script.cpp
@@ -40,7 +40,7 @@ LuaScript::~LuaScript() {
}
}
-bool LuaScript::init() {
+/*bool LuaScript::init() {
// Create new lua_State and initialize the Std Libs
_state = luaL_newstate();
if (!_state || !registerStdLibs()) {
@@ -51,9 +51,117 @@ bool LuaScript::init() {
_systemInit = true;
return true;
+}*/
+
+struct VarInit {
+ char *realName;
+ char *luaName;
+} luaGlobalStrings[] = {
+ { "Map00", "MAP00"},
+ {NULL, NULL}
+};
+
+// For AI States, to be implemented
+struct NumberInit {
+ int value;
+ char *luaName;
+} luaGlobalValues[] = {
+ {NULL, NULL}
+};
+
+struct FuncInit {
+ char *luaName;
+ int (*function) (lua_State *L);
+} luaFuncs[] = {
+ {NULL, NULL}
+};
+
+bool LuaScript::initScript(Common::SeekableReadStream *stream, const char *name, int32 length) {
+
+ if (_systemInit) {
+ return false;
+ }
+
+ // Initialize Lua Environment
+ _state = lua_open();
+ if (_state == NULL) {
+ error("Couldn't initialize Lua script.");
+ return false;
+ }
+ luaL_openlibs(_state);
+
+ _systemInit = true;
+
+ // Register Extensions
+ for (int i = 0; luaFuncs[i].luaName; i++) {
+ lua_register(_state, luaFuncs[i].luaName, luaFuncs[i].function);
+ }
+
+ // Register Lua Globals
+
+ for (int i = 0; luaGlobalStrings[i].realName; i++) {
+ lua_pushstring(_state, luaGlobalStrings[i].realName);
+ lua_setglobal(_state, luaGlobalStrings[i].luaName);
+ }
+
+ for (int j = 0; luaGlobalValues[j].luaName; j++) {
+ lua_pushnumber(_state, luaGlobalValues[j].value);
+ lua_setglobal(_state, luaGlobalValues[j].luaName);
+ }
+
+ /*
+ TODO: Set the last mapName as a global
+ after implementing the map-manager.
+ */
+
+ // Set the lowest printable line
+ lua_pushnumber(_state, 480 - 14);
+ lua_setglobal(_state, "BOTTOM_Y");
+
+ /*
+ TODO: Load the sound names and entity
+ spawn names into Lua once they are implemented.
+ */
+
+ /*
+ TODO: Find what from where the global.lua
+ is to be loaded, and execute it.
+ */
+
+ // Load script and execute it
+
+ if (!executeMPC(stream, "level code", length)) {
+ error("LuaScript::initScript: 'level code' failed to execute");
+ return false;
+ }
+
+ lua_getglobal(_state, "level_init");
+ lua_pcall(_state, 0, 0, 0);
+
+ return true;
}
-bool LuaScript::executeFile(const Common::String &filename) {
+bool LuaScript::executeMPC(Common::SeekableReadStream *stream, const char *name, int32 length) {
+
+ if (!_systemInit) {
+ return false;
+ }
+
+ const char *chunk = new char[length];
+ stream->read((void *)chunk, length);
+
+ if (!executeChunk(chunk, length, name)) {
+ delete[] chunk;
+
+ return false;
+ }
+
+ delete[] chunk;
+
+ return true;
+}
+
+/*bool LuaScript::executeFile(const Common::String &filename) {
if (!_systemInit) {
return false;
@@ -80,13 +188,7 @@ bool LuaScript::executeFile(const Common::String &filename) {
delete file;
return true;
-}
-
-bool LuaScript::registerStdLibs() {
- luaL_openlibs(_state);
-
- return true;
-}
+}*/
bool LuaScript::executeChunk(const char *chunk, uint chunkSize, const Common::String &chunkName) const {
@@ -110,7 +212,6 @@ bool LuaScript::executeChunk(const char *chunk, uint chunkSize, const Common::St
return false;
}
- debug("Chunk successfully executed");
return true;
}
diff --git a/engines/hdb/lua-script.h b/engines/hdb/lua-script.h
index 8a9441a240..42e905d139 100644
--- a/engines/hdb/lua-script.h
+++ b/engines/hdb/lua-script.h
@@ -38,14 +38,15 @@ public:
~LuaScript();
bool init();
- //bool executeMPC(Common::SeekableReadStream *stream);
+ bool initScript(Common::SeekableReadStream *stream, const char *name, int32 length);
+ bool executeMPC(Common::SeekableReadStream *stream, const char *name, int32 length);
bool executeFile(const Common::String &filename);
private:
lua_State *_state;
bool _systemInit;
- bool registerStdLibs();
+ bool registerExtensions();
bool executeChunk(const char *chunk, uint chunkSize, const Common::String &chunkName) const;
};