aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/hdb/lua-script.cpp102
-rw-r--r--engines/hdb/lua-script.h53
-rw-r--r--engines/hdb/module.mk1
3 files changed, 156 insertions, 0 deletions
diff --git a/engines/hdb/lua-script.cpp b/engines/hdb/lua-script.cpp
new file mode 100644
index 0000000000..a844451998
--- /dev/null
+++ b/engines/hdb/lua-script.cpp
@@ -0,0 +1,102 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/lua/lua.h"
+#include "common/lua/lauxlib.h"
+#include "common/lua/lualib.h"
+#include "hdb/lua-script.h"
+
+namespace HDB {
+
+LuaScript::LuaScript() {
+ _state = NULL;
+}
+
+LuaScript::~LuaScript() {
+ if (_state) {
+ lua_close(_state);
+ }
+}
+
+bool LuaScript::init() {
+ // Create new lua_State and initialize the Std Libs
+ _state = luaL_newstate();
+ if (!_state || !registerStdLibs()) {
+ error("Cannot initialize Lua");
+ return false;
+ }
+
+ return true;
+}
+
+bool LuaScript::executeFile(const Common::String &filename) {
+
+ Common::File *file = new Common::File;
+
+ if (!file->open(filename)) {
+ error("Cannot find \"%s\"", filename.c_str());
+ }
+
+ uint fileSize = file->size();
+ const char *fileData = new char[fileSize];
+ file->read((void *)fileData, fileSize);
+
+ if (!executeChunk(fileData, fileSize, filename)) {
+ delete[] fileData;
+ delete file;
+
+ return false;
+ }
+
+ delete[] fileData;
+ 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 {
+ // Compile Chunk
+ if (luaL_loadbuffer(_state, chunk, chunkSize, chunkName.c_str())) {
+ error("Couldn't compile \"%s\": %s", chunkName.c_str(), lua_tostring(_state, -1));
+ lua_pop(_state, -1);
+
+ return false;
+ }
+
+ // Execute Chunk
+ if (lua_pcall(_state, 0, 0, 0)) {
+ error("An error occured while executing \"%s\": %s.", chunkName.c_str(), lua_tostring(_state, -1));
+ lua_pop(_state, -1);
+
+ return false;
+ }
+
+ return true;
+}
+
+} \ No newline at end of file
diff --git a/engines/hdb/lua-script.h b/engines/hdb/lua-script.h
new file mode 100644
index 0000000000..bf2277364e
--- /dev/null
+++ b/engines/hdb/lua-script.h
@@ -0,0 +1,53 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "common/system.h"
+#include "common/file.h"
+
+#include "hdb/file-manager.h"
+
+#ifndef HDB_LUA_SCRIPT_H
+#define HDB_LUA_SCRIPT_H
+
+struct lua_State;
+
+namespace HDB {
+
+class LuaScript {
+public:
+ LuaScript();
+ ~LuaScript();
+
+ bool init();
+ //bool executeMPC(Common::SeekableReadStream *stream);
+ bool executeFile(const Common::String &filename);
+
+private:
+ lua_State *_state;
+
+ bool registerStdLibs();
+ bool executeChunk(const char *chunk, uint chunkSize, const Common::String &chunkName) const;
+};
+
+}
+
+#endif // !HDB_LUA_SCRIPT_H
diff --git a/engines/hdb/module.mk b/engines/hdb/module.mk
index 89bac4da58..fda8f797c1 100644
--- a/engines/hdb/module.mk
+++ b/engines/hdb/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS := \
draw-manager.o \
file-manager.o \
hdb.o \
+ lua-script.o \
console.o
MODULE_DIRS += \