#include "Api.h" #include "Level.h" #include #include #include #include const char *DEFAULT_PROC = "include/defaults.lua"; std::shared_ptr lvl; struct LState { lua_State *onkeypress; lua_State *onupdate; } typedef LState; bool call_onkeypress(lua_State *L, char pressedKey); bool call_onupdate(lua_State *L); int main(int argc, char **argv) { if (argc <= 1) { return -1; } std::string lvl_pfx = argv[1]; std::filesystem::path mapFile{lvl_pfx + "/dng.map"}; std::filesystem::path luaFile{lvl_pfx + "/proc.lua"}; lvl = std::make_shared(); lvl->loadLevelFromFile(mapFile.c_str()); lua_State *L_lvl = luaL_newstate(); luaL_openlibs(L_lvl); init_c_api(L_lvl); lua_State *L_default = luaL_newstate(); luaL_openlibs(L_default); init_c_api(L_default); if (std::filesystem::exists(luaFile) && luaL_dofile(L_default, DEFAULT_PROC) != LUA_OK) { std::cout << "Failed to load default proc" << std::endl; luaL_error(L_default, "Error: %s", lua_tostring(L_default, -1)); return EXIT_FAILURE; } // Initialize to default LState l_state = {.onkeypress = L_default, .onupdate = L_default}; if (std::filesystem::exists(luaFile) && luaL_dofile(L_lvl, luaFile.c_str()) == LUA_OK) { // overwrite defaults lua_getglobal(L_lvl, "onKeyPress"); if (lua_isfunction(L_lvl, -1)) { l_state.onkeypress = L_lvl; } lua_getglobal(L_lvl, "onUpdate"); if (lua_isfunction(L_lvl, -1)) { l_state.onupdate = L_lvl; } } else if (std::filesystem::exists(luaFile)) { std::cout << "[C] No Good" << std::endl; luaL_error(L_lvl, "Error: %s\n", lua_tostring(L_lvl, -1)); return EXIT_FAILURE; } bool quit = false; char in; do { lvl->print(); std::cin >> in; if (!call_onkeypress(l_state.onkeypress, in)) { quit = true; } if (!call_onupdate(l_state.onupdate)) { quit = true; } if (!quit && in == 'q') { quit = true; } } while (!quit); std::cout << "[C] Quit" << std::endl; return EXIT_SUCCESS; } bool call_onkeypress(lua_State *L, char pressedKey) { lua_getglobal(L, "onKeyPress"); if (!lua_isfunction(L, -1)) { std::cout << "[C] Error onKeyPress not function | not found" << std::endl; return false; } lua_pushinteger(L, pressedKey); lua_pcall(L, 1, 1, 0); return true; } bool call_onupdate(lua_State *L) { lua_getglobal(L, "onUpdate"); if (!lua_isfunction(L, -1)) { std::cout << "[C] Error onUpdate not function | not found" << std::endl; return false; } lua_pcall(L, 0, 1, 0); return true; }