From f88b1d0d6a67c226951f74ad3be6addd9bd7dbdc Mon Sep 17 00:00:00 2001 From: Nipun Garg Date: Sun, 2 Jun 2019 18:41:05 +0530 Subject: HDB: Add the LuaScript class to integrate Lua It creates lua_State (s), initializes them and executes Lua files in them --- engines/hdb/lua-script.cpp | 102 +++++++++++++++++++++++++++++++++++++++++++++ engines/hdb/lua-script.h | 53 +++++++++++++++++++++++ engines/hdb/module.mk | 1 + 3 files changed, 156 insertions(+) create mode 100644 engines/hdb/lua-script.cpp create mode 100644 engines/hdb/lua-script.h 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 += \ -- cgit v1.2.3