#include #include extern "C" { #include #include } #include #ifdef _WIN32 #define WINDOWS_LEAN_AND_MEAN #include #define CHANGE_WORKING_DIRECTORY(path) !(SetCurrentDirectory(path)) #else #include #define CHANGE_WORKING_DIRECTORY(path) chdir(path) #endif namespace { int lglerminal_quit(lua_State* L) { glerminal_quit(); return 0; } int lglerminal_flush(lua_State* L) { glerminal_flush(); return 0; } int lglerminal_set(lua_State* L) { const unsigned char x = luaL_checkinteger(L, 1) - 1; const unsigned char y = luaL_checkinteger(L, 2) - 1; const unsigned char layer = luaL_checkinteger(L, 3) - 1; const unsigned char sprite = luaL_checkinteger(L, 4) - 1; glerminal_set(x, y, layer, sprite); return 0; } int lglerminal_get(lua_State* L) { const unsigned char x = luaL_checkinteger(L, 1) - 1; const unsigned char y = luaL_checkinteger(L, 2) - 1; const unsigned char layer = luaL_checkinteger(L, 3) - 1; lua_pushnumber(L, glerminal_get(x, y, layer) + 1); return 1; } int lglerminal_offset(lua_State* L) { const unsigned char x = luaL_checkinteger(L, 1) - 1; const unsigned char y = luaL_checkinteger(L, 2) - 1; const unsigned char layer = luaL_checkinteger(L, 3) - 1; const float ox = luaL_checknumber(L, 4); const float oy = luaL_checknumber(L, 5); glerminal_offset(x, y, layer, ox, oy); return 0; } int lglerminal_layer_color(lua_State* L) { const unsigned char layer = luaL_checkinteger(L, 1) - 1; const unsigned int color = luaL_checkinteger(L, 2); glerminal_layer_color(layer, color); return 0; } int lglerminal_layer_scale(lua_State* L) { const unsigned char layer = luaL_checkinteger(L, 1) - 1; const float scale = luaL_checknumber(L, 2); glerminal_layer_scale(layer, scale); return 0; } int lglerminal_load_sprites_file(lua_State* L) { const char* path = luaL_checkstring(L, 1); lua_pushboolean(L, glerminal_load_sprites_file(path)); return 1; } const luaL_Reg lglerminal_methods[] = { { "quit", lglerminal_quit }, { "flush", lglerminal_flush }, { "set", lglerminal_set }, { "get", lglerminal_get }, { "offset", lglerminal_offset }, { "tint", lglerminal_layer_color }, { "scale", lglerminal_layer_scale }, { "sprites", lglerminal_load_sprites_file }, { nullptr, nullptr } }; lua_State* L; void init() { lua_getglobal(L, "glerminal"); lua_getfield(L, -1, "init"); lua_remove(L, -2); if (lua_pcall(L, 0, 0, 0) != LUA_OK) { // ignore error for now lua_remove(L, -1); } } void mainloop(float dt) { lua_getglobal(L, "glerminal"); lua_getfield(L, -1, "main"); lua_remove(L, -2); lua_pushnumber(L, dt); if (lua_pcall(L, 1, 0, 0) != LUA_OK) { // ignore error for now lua_remove(L, -1); } } void pressed(int key) { const char* const name = glfwGetKeyName(key, 0); if (name) { lua_getglobal(L, "glerminal"); lua_getfield(L, -1, "pressed"); lua_remove(L, -2); lua_pushstring(L, name); if (lua_pcall(L, 1, 0, 0) != LUA_OK) { // ignore error for now lua_remove(L, -1); } } } void released(int key) { const char* const name = glfwGetKeyName(key, 0); if (name) { lua_getglobal(L, "glerminal"); lua_getfield(L, -1, "released"); lua_remove(L, -2); lua_pushstring(L, name); if (lua_pcall(L, 1, 0, 0) != LUA_OK) { // ignore error for now lua_remove(L, -1); } } } } int main(int argc, char** argv) { if (argc == 1) { std::cout << "Usage: " << argv[0] << " " << std::endl; return 0; } if (CHANGE_WORKING_DIRECTORY(argv[1])) { std::cout << "Failed to find project directory" << std::endl; return 1; } L = luaL_newstate(); luaL_openlibs(L); luaL_newlib(L, lglerminal_methods); lua_setglobal(L, "glerminal"); luaL_dofile(L, "main.lua"); glerminal_run(init, mainloop, pressed, released); lua_close(L); return 0; }