mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-14 13:50:13 +00:00
HDB: Add LuaScript::initScript
It creates a new Lua environment whenever a new Lua script is loaded
This commit is contained in:
parent
fd666efd6a
commit
bc638cf251
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user