HDB: Add LuaScript::initScript

It creates a new Lua environment whenever a new
Lua script is loaded
This commit is contained in:
Nipun Garg 2019-06-05 01:10:57 +05:30 committed by Eugene Sandulenko
parent fd666efd6a
commit bc638cf251
5 changed files with 143 additions and 17 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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()) {
@ -50,10 +50,118 @@ 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;
}

View File

@ -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;
};