#include "CApi.h" #include "Level.h" #include "LuaApi.h" //#include #include #include #include const char *DEFAULT_PROC = "include/defaults.lua"; std::shared_ptr lvl; Scene scene; 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(); scene = Scene::INTRO; 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(DEFAULT_PROC) && 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 = init_default(L_default); if (std::filesystem::exists(luaFile) && luaL_dofile(L_lvl, luaFile.c_str()) == LUA_OK) { override_file_fns(L_lvl, l_state); } 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 { if (scene == Scene::INTRO) { if (!lua_onintro(l_state->onintro)) { quit = true; } std::cin >> in; if (!lua_onkeypress(l_state->onkeypress, in)) { quit = true; } } else if (scene == Scene::LEVEL) { lvl->print(); std::cin >> in; if (!lua_onkeypress(l_state->onkeypress, in)) { quit = true; } if (!lua_onupdate(l_state->onupdate)) { quit = true; } } else if (scene == Scene::WIN) { lvl->player.x = -1; // hide lvl->player.y = -1; // hide lvl->print(); lua_onwin(l_state->onwin); quit = true; } else if (scene == Scene::LOSS) { lvl->player.x = -1; // hide lvl->player.y = -1; // hide lvl->print(); lua_onloss(l_state->onloss); quit = true; } if (!quit && in == 'q') { quit = true; } } while (!quit); std::cout << "[C] Quit" << std::endl; return EXIT_SUCCESS; }