#ifndef DNG_LUA_API_H #define DNG_LUA_API_H #include #include struct LState { lua_State *onkeypress; lua_State *onupdate; lua_State *onintro; lua_State *onwin; lua_State *onloss; } typedef LState; const char *ON_KEYPRESS = "onKeypress"; const char *ON_UPDATE = "onUpdate"; const char *ON_INTRO = "onIntro"; const char *ON_WIN = "onWin"; const char *ON_LOSS = "onLoss"; LState *init_default(lua_State *L) { auto *state = static_cast(malloc(sizeof(LState))); state->onkeypress = L; state->onupdate = L; state->onintro = L; state->onwin = L; state->onloss = L; return state; } bool check_fn(lua_State *L, const char *fn) { lua_getglobal(L, fn); return lua_isfunction(L, -1); } void override_file_fns(lua_State *L, LState *state) { if (check_fn(L, ON_KEYPRESS)) { state->onkeypress = L; } if (check_fn(L, ON_UPDATE)) { state->onupdate = L; } if (check_fn(L, ON_INTRO)) { state->onintro = L; } if (check_fn(L, ON_WIN)) { state->onwin = L; } if (check_fn(L, ON_LOSS)) { state->onloss = L; } } bool lua_dofn(lua_State *L, const char *fn) { lua_getglobal(L, fn); if (!lua_isfunction(L, -1)) { std::cout << "[C] Error " << fn << " not function | not found" << std::endl; return false; } lua_pcall(L, 0, 1, 0); return true; } bool lua_dofn_with_key(lua_State *L, const char *fn, char pressedKey) { lua_getglobal(L, fn); if (!lua_isfunction(L, -1)) { std::cout << "[C] Error " << fn << " not function | not found" << std::endl; return false; } lua_pushinteger(L, pressedKey); lua_pcall(L, 1, 1, 0); return true; } bool lua_onkeypress(lua_State *L, char pressedKey) { return lua_dofn_with_key(L, "onKeyPress", pressedKey); } bool lua_onupdate(lua_State *L) { return lua_dofn(L, "onUpdate"); } bool lua_onintro(lua_State *L) { return lua_dofn(L, "onIntro"); } bool lua_onwin(lua_State *L) { return lua_dofn(L, "onWin"); } bool lua_onloss(lua_State *L) { return lua_dofn(L, "onLoss"); } #endif // DNG_LUA_API_H