#include "scripting/scripting.h" /** * IMPORTANT! * * For various compiler reasons, all scripting API classes and libraries need to be referenced here! The easiest way to * do this is to declare the API elements in the header with the DECLARE_* macros and then include them here */ #include "scripting/api/objs/enums.h" #include "scripting/api/objs/vecmath.h" #include "scripting/api/objs/event.h" #include "scripting/api/objs/file.h" #include "scripting/api/objs/font.h" #include "scripting/api/objs/gameevent.h" #include "scripting/api/objs/gamestate.h" #include "scripting/api/objs/hudgauge.h" #include "scripting/api/objs/eye.h" #include "scripting/api/objs/model.h" #include "scripting/api/objs/physics_info.h" #include "scripting/api/objs/sexpvar.h" #include "scripting/api/objs/shields.h" #include "scripting/api/objs/shiptype.h" #include "scripting/api/objs/species.h" #include "scripting/api/objs/team.h" #include "scripting/api/objs/streaminganim.h" #include "scripting/api/objs/texture.h" #include "scripting/api/objs/texturemap.h" #include "scripting/api/objs/weaponclass.h" #include "scripting/api/objs/mc_info.h" #include "scripting/api/objs/object.h" #include "scripting/api/objs/asteroid.h" #include "scripting/api/objs/cockpit_display.h" #include "scripting/api/objs/shipclass.h" #include "scripting/api/objs/debris.h" #include "scripting/api/objs/waypoint.h" #include "scripting/api/objs/ship_bank.h" #include "scripting/api/objs/subsystem.h" #include "scripting/api/objs/order.h" #include "scripting/api/objs/ship.h" #include "scripting/api/objs/sound.h" #include "scripting/api/objs/message.h" #include "scripting/api/objs/wing.h" #include "scripting/api/objs/beam.h" #include "scripting/api/objs/player.h" #include "scripting/api/objs/camera.h" #include "scripting/api/objs/control_info.h" #include "scripting/api/objs/particle.h" #include "scripting/api/objs/weapon.h" #include "scripting/api/objs/controls.h" #include "scripting/api/objs/graphics.h" #include "scripting/api/libs/bitops.h" #include "scripting/api/libs/audio.h" #include "scripting/api/libs/base.h" #include "scripting/api/libs/cfile.h" #include "scripting/api/libs/hud.h" #include "scripting/api/libs/hookvars.h" #include "scripting/api/libs/mission.h" #include "scripting/api/libs/tables.h" #include "scripting/api/libs/testing.h" // End of definitions includes using namespace scripting; using namespace scripting::api; // *************************Housekeeping************************* //WMC - The miraculous lines of code that make Lua debugging worth something. lua_Debug Ade_debug_info; char debug_stack[4][32]; void ade_debug_ret(lua_State *L, lua_Debug *ar) { Assert(L != NULL); Assert(ar != NULL); lua_getstack(L, 1, ar); lua_getinfo(L, "nSlu", ar); memcpy(&Ade_debug_info, ar, sizeof(lua_Debug)); int n; for (n = 0; n < 4; n++) { debug_stack[n][0] = '\0'; } for (n = 0; n < 4; n++) { if (lua_getstack(L,n+1, ar) == 0) break; lua_getinfo(L,"n", ar); if (ar->name == NULL) break; strcpy_s(debug_stack[n],ar->name); } } //WMC - because the behavior of the return keyword //was changed, I now have to use this in hooks. static int ade_return_hack(lua_State *L) { int i = 0; int num = lua_gettop(L); for(i = 0; i < num; i++) { lua_pushvalue(L, i+1); } return num; } static void *vm_lua_alloc(void*, void *ptr, size_t, size_t nsize) { if (nsize == 0) { vm_free(ptr); return NULL; } else { return vm_realloc(ptr, nsize); } } //Inits LUA //Note that "libraries" must end with a {NULL, NULL} //element int script_state::CreateLuaState() { mprintf(("LUA: Opening LUA state...\n")); lua_State *L = lua_newstate(vm_lua_alloc, nullptr); if(L == NULL) { Warning(LOCATION, "Could not initialize Lua"); return 0; } //*****INITIALIZE AUXILIARY LIBRARIES mprintf(("LUA: Initializing base Lua libraries...\n")); luaL_openlibs(L); //*****DISABLE DANGEROUS COMMANDS lua_pushstring(L, "os"); lua_rawget(L, LUA_GLOBALSINDEX); int os_ldx = lua_gettop(L); if(lua_istable(L, os_ldx)) { lua_pushstring(L, "execute"); lua_pushnil(L); lua_rawset(L, os_ldx); lua_pushstring(L, "remove"); lua_pushnil(L); lua_rawset(L, os_ldx); lua_pushstring(L, "rename"); lua_pushnil(L); lua_rawset(L, os_ldx); } lua_pop(L, 1); //os table //*****SET DEBUG HOOKS #ifndef NDEBUG lua_sethook(L, ade_debug_ret, LUA_MASKRET, 0); #endif //*****INITIALIZE ADE uint i; mprintf(("LUA: Beginning ADE initialization\n")); for(i = 0; i < ade_manager::getInstance()->getNumEntries(); i++) { //WMC - Do only toplevel table entries, doi if(ade_manager::getInstance()->getEntry(i).ParentIdx == UINT_MAX) //WMC - oh hey, we're done with the meaty point in < 10 lines. ade_manager::getInstance()->getEntry(i).SetTable(L, LUA_GLOBALSINDEX, LUA_GLOBALSINDEX); //Oh the miracles of OOP. } //*****INITIALIZE RETURN HACK FUNCTION lua_pushstring(L, "ade_return_hack"); lua_pushboolean(L, 0); lua_pushcclosure(L, ade_return_hack, 2); lua_setglobal(L, "ade_return_hack"); //*****INITIALIZE ENUMERATION CONSTANTS mprintf(("ADE: Initializing enumeration constants...\n")); enum_h eh; for(i = 0; i < Num_enumerations; i++) { eh.index = Enumerations[i].def; eh.is_constant = true; ade_set_args(L, "o", l_Enum.Set(eh)); lua_setglobal(L, Enumerations[i].name); } //*****ASSIGN LUA SESSION mprintf(("ADE: Assigning Lua session...\n")); SetLuaSession(L); // (void)l_BitOps.GetName(); return 1; } void script_state::EndLuaFrame() { scripting::api::graphics_on_frame(); } void ade_output_toc(FILE *fp, ade_table_entry *ate) { Assert(fp != NULL); Assert(ate != NULL); //WMC - sanity checking if(ate->Name == NULL && ate->ShortName == NULL) { Warning(LOCATION, "Found ade_table_entry with no name or shortname"); return; } fputs("