diff options
-rw-r--r-- | engines/hdb/file-manager.cpp | 22 | ||||
-rw-r--r-- | engines/hdb/file-manager.h | 1 | ||||
-rw-r--r-- | engines/hdb/hdb.cpp | 11 | ||||
-rw-r--r-- | engines/hdb/lua-script.cpp | 121 | ||||
-rw-r--r-- | engines/hdb/lua-script.h | 5 |
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; }; |