#ifndef DNG_API_H #define DNG_API_H #include "Level.h" #include #include extern std::shared_ptr lvl; static int c_get_player_position(lua_State *L) { lua_createtable(L, 0, 2); lua_pushnumber(L, lvl->player.y + 1); lua_setfield(L, -2, "y"); lua_pushnumber(L, lvl->player.x + 1); lua_setfield(L, -2, "x"); return 1; } static int c_move_player(lua_State *L) { // stack ordering int dy = static_cast(lua_tonumber(L, -1)); int dx = static_cast(lua_tonumber(L, -2)); bool res = false; if (lvl->playerCanStep(dx, dy)) { lvl->player.x += dx; lvl->player.y += dy; res = true; } lua_pushboolean(L, res); return 1; } static int c_move_enemy(lua_State *L) { // stack ordering int dy = static_cast(lua_tonumber(L, -1)); int dx = static_cast(lua_tonumber(L, -2)); int id = static_cast(lua_tonumber(L, -3)); int i = lvl->getEnemyIndex(id); // guard against enemy not found if (i == -1) { lua_pushboolean(L, false); return 1; } bool res = false; if (lvl->enemyCanStep(lvl->enemyPositions[i], dx, dy)) { lvl->enemyPositions[i].x += dx; lvl->enemyPositions[i].y += dy; res = true; } lua_pushboolean(L, res); return 1; } static int c_get_enemies(lua_State *L) { lua_createtable(L, int(lvl->enemyPositions.size()), 0); int idx = 0; for (auto &pos : lvl->enemyPositions) { lua_pushnumber(L, ++idx); lua_createtable(L, 0, 3); lua_pushnumber(L, pos.id); lua_setfield(L, -2, "id"); lua_pushnumber(L, pos.x + 1); lua_setfield(L, -2, "x"); lua_pushnumber(L, pos.y + 1); lua_setfield(L, -2, "y"); lua_settable(L, -3); } return 1; } static int c_spawn_enemy(lua_State *L) { return 1; } static int c_destroy_enemy(lua_State *L) { return 1; } static int c_get_map(lua_State *L) { lua_createtable(L, int(lvl->map.size()), 0); int idx = 0; for (auto &vec : lvl->map) { lua_pushnumber(L, ++idx); lua_createtable(L, int(vec.size()), 0); int inner_idx = 0; for (auto &c : vec) { lua_pushnumber(L, ++inner_idx); lua_pushnumber(L, c == WALL_SPACE ? 1 : 0); lua_rawset(L, -3); } lua_rawset(L, -3); } return 1; } static void init_c_api(lua_State *L) { lua_register(L, "c_move_player", c_move_player); lua_register(L, "c_move_enemy", c_move_enemy); lua_register(L, "c_spawn_enemy", c_spawn_enemy); lua_register(L, "c_destroy_enemy", c_destroy_enemy); lua_register(L, "c_get_enemies", c_get_enemies); lua_register(L, "c_get_player_position", c_get_player_position); lua_register(L, "c_get_map", c_get_map); } #endif // DNG_API_H