bool LuaConstCMD::PushEntries(lua_State* L) { LuaPushNamedNumber(L, "OPT_ALT", ALT_KEY); LuaPushNamedNumber(L, "OPT_CTRL", CONTROL_KEY); LuaPushNamedNumber(L, "OPT_SHIFT", SHIFT_KEY); LuaPushNamedNumber(L, "OPT_RIGHT", RIGHT_MOUSE_KEY); LuaPushNamedNumber(L, "OPT_INTERNAL", INTERNAL_ORDER); LuaPushNamedNumber(L, "WAITCODE_TIME", CMD_WAITCODE_TIMEWAIT); LuaPushNamedNumber(L, "WAITCODE_DEATH", CMD_WAITCODE_DEATHWAIT); LuaPushNamedNumber(L, "WAITCODE_SQUAD", CMD_WAITCODE_SQUADWAIT); LuaPushNamedNumber(L, "WAITCODE_GATHER", CMD_WAITCODE_GATHERWAIT); #define PUSH_CMD(cmd) InsertDualMapPair(L, #cmd, CMD_ ## cmd); PUSH_CMD(STOP); PUSH_CMD(INSERT); PUSH_CMD(REMOVE); PUSH_CMD(WAIT); PUSH_CMD(TIMEWAIT); PUSH_CMD(DEATHWAIT); PUSH_CMD(SQUADWAIT); PUSH_CMD(GATHERWAIT); PUSH_CMD(MOVE); PUSH_CMD(PATROL); PUSH_CMD(FIGHT); PUSH_CMD(ATTACK); PUSH_CMD(AREA_ATTACK); PUSH_CMD(GUARD); PUSH_CMD(AISELECT); PUSH_CMD(GROUPSELECT); PUSH_CMD(GROUPADD); PUSH_CMD(GROUPCLEAR); PUSH_CMD(REPAIR); PUSH_CMD(FIRE_STATE); PUSH_CMD(MOVE_STATE); PUSH_CMD(SETBASE); PUSH_CMD(INTERNAL); PUSH_CMD(SELFD); PUSH_CMD(SET_WANTED_MAX_SPEED); PUSH_CMD(LOAD_UNITS); PUSH_CMD(LOAD_ONTO); PUSH_CMD(UNLOAD_UNITS); PUSH_CMD(UNLOAD_UNIT); PUSH_CMD(ONOFF); PUSH_CMD(RECLAIM); PUSH_CMD(CLOAK); PUSH_CMD(STOCKPILE); PUSH_CMD(DGUN); PUSH_CMD(RESTORE); PUSH_CMD(REPEAT); PUSH_CMD(TRAJECTORY); PUSH_CMD(RESURRECT); PUSH_CMD(CAPTURE); PUSH_CMD(AUTOREPAIRLEVEL); PUSH_CMD(LOOPBACKATTACK); PUSH_CMD(IDLEMODE); return true; }
bool LuaConstEngine::PushEntries(lua_State* L) { LuaPushNamedString(L, "version" , SpringVersion::GetSync() ); LuaPushNamedString(L, "versionFull" , (!CLuaHandle::GetHandleSynced(L))? SpringVersion::GetFull() : ""); LuaPushNamedString(L, "versionPatchSet", (!CLuaHandle::GetHandleSynced(L))? SpringVersion::GetPatchSet() : ""); LuaPushNamedString(L, "buildFlags" , (!CLuaHandle::GetHandleSynced(L))? SpringVersion::GetAdditional(): ""); #if 0 LuaPushNamedNumber(L, "nativeWordSize", (!CLuaHandle::GetHandleSynced(L))? Platform::NativeWordSize() * 8: 0); // engine LuaPushNamedNumber(L, "systemWordSize", (!CLuaHandle::GetHandleSynced(L))? Platform::SystemWordSize() * 8: 0); // op-sys #else LuaPushNamedNumber(L, "wordSize", (!CLuaHandle::GetHandleSynced(L))? Platform::NativeWordSize() * 8: 0); #endif return true; }
bool CLuaHandleSynced::SetupSynced(const string& code, const string& filename) { if ((L == NULL) || code.empty()) { return false; } lua_pushvalue(L, LUA_GLOBALSINDEX); AddBasicCalls(); // into Global lua_pushstring(L, "Script"); lua_rawget(L, -2); LuaPushNamedCFunc(L, "AddActionFallback", AddSyncedActionFallback); LuaPushNamedCFunc(L, "RemoveActionFallback", RemoveSyncedActionFallback); LuaPushNamedCFunc(L, "UpdateCallIn", CallOutSyncedUpdateCallIn); LuaPushNamedCFunc(L, "GetWatchWeapon", GetWatchWeapon); LuaPushNamedCFunc(L, "SetWatchWeapon", SetWatchWeapon); lua_pop(L, 1); // add the custom file loader LuaPushNamedCFunc(L, "SendToUnsynced", SendToUnsynced); LuaPushNamedCFunc(L, "loadstring", LoadStringData); LuaPushNamedCFunc(L, "CallAsTeam", CallAsTeam); LuaPushNamedCFunc(L, "AllowUnsafeChanges", AllowUnsafeChanges); LuaPushNamedNumber(L, "COBSCALE", COBSCALE); // load our libraries (LuaSyncedCtrl overrides some LuaUnsyncedCtrl entries) if (!AddEntriesToTable(L, "VFS", LuaVFS::PushSynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaSyncedCall::PushEntries) || !AddEntriesToTable(L, "Spring", LuaUnsyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedRead::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries)) { KillLua(); return false; } // add code from the sub-class if (!AddSyncedCode()) { KillLua(); return false; } lua_settop(L, 0); if (!LoadCode(code, filename)) { KillLua(); return false; } return true; }
bool LuaConstPlatform::PushEntries(lua_State* L) { LuaPushNamedString(L, "gpu", globalRenderingInfo.gpuName); LuaPushNamedString(L, "gpuVendor", globalRenderingInfo.gpuVendor); LuaPushNamedNumber(L, "gpuMemorySize", globalRendering->gpuMemorySize); LuaPushNamedString(L, "glVersionShort", globalRenderingInfo.glVersionShort); LuaPushNamedString(L, "glslVersionShort", globalRenderingInfo.glslVersionShort); LuaPushNamedString(L, "glVersion", globalRenderingInfo.glVersion); LuaPushNamedString(L, "glVendor", globalRenderingInfo.glVendor); LuaPushNamedString(L, "glRenderer", globalRenderingInfo.glRenderer); LuaPushNamedString(L, "glslVersion", globalRenderingInfo.glslVersion); LuaPushNamedString(L, "glewVersion", globalRenderingInfo.glewVersion); LuaPushNamedNumber(L, "sdlVersionCompiledMajor", globalRenderingInfo.sdlVersionCompiled.major); LuaPushNamedNumber(L, "sdlVersionCompiledMinor", globalRenderingInfo.sdlVersionCompiled.minor); LuaPushNamedNumber(L, "sdlVersionCompiledPatch", globalRenderingInfo.sdlVersionCompiled.patch); LuaPushNamedNumber(L, "sdlVersionLinkedMajor", globalRenderingInfo.sdlVersionLinked.major); LuaPushNamedNumber(L, "sdlVersionLinkedMinor", globalRenderingInfo.sdlVersionLinked.minor); LuaPushNamedNumber(L, "sdlVersionLinkedPatch", globalRenderingInfo.sdlVersionLinked.patch); LuaPushNamedBool(L, "glSupportNonPowerOfTwoTex", globalRendering->supportNonPowerOfTwoTex); LuaPushNamedBool(L, "glSupportTextureQueryLOD" , globalRendering->supportTextureQueryLOD); LuaPushNamedBool(L, "glSupport24bitDepthBuffer", globalRendering->support24bitDepthBuffer); LuaPushNamedBool(L, "glSupportRestartPrimitive", globalRendering->supportRestartPrimitive); LuaPushNamedBool(L, "glSupportClipSpaceControl", globalRendering->supportClipSpaceControl); LuaPushNamedBool(L, "glSupportFragDepthLayout" , globalRendering->supportFragDepthLayout); LuaPushNamedString(L, "osName", Platform::GetOS()); LuaPushNamedString(L, "osFamily", Platform::GetOSFamily()); return true; }
void CLuaHandle::ViewResize() { LUA_CALL_IN_CHECK(L); lua_checkstack(L, 5); static const LuaHashString cmdStr("ViewResize"); if (!PushUnsyncedCallIn(cmdStr)) { return; } lua_newtable(L); LuaPushNamedNumber(L, "screenSizeX", gu->screenSizeX); LuaPushNamedNumber(L, "screenSizeY", gu->screenSizeY); LuaPushNamedNumber(L, "screenPosX", 0.0f); LuaPushNamedNumber(L, "screenPosY", 0.0f); LuaPushNamedNumber(L, "windowSizeX", gu->winSizeX); LuaPushNamedNumber(L, "windowSizeY", gu->winSizeY); LuaPushNamedNumber(L, "windowPosX", gu->winPosX); LuaPushNamedNumber(L, "windowPosY", gu->winPosY); LuaPushNamedNumber(L, "viewSizeX", gu->viewSizeX); LuaPushNamedNumber(L, "viewSizeY", gu->viewSizeY); LuaPushNamedNumber(L, "viewPosX", gu->viewPosX); LuaPushNamedNumber(L, "viewPosY", gu->viewPosY); // call the routine RunCallInUnsynced(cmdStr, 1, 0); return; }
bool LuaConstGL::PushEntries(lua_State* L) { #define PUSH_GL(cmd) LuaPushNamedNumber(L, #cmd, GL_ ## cmd) // Drawing Primitives PUSH_GL(POINTS); PUSH_GL(LINES); PUSH_GL(LINE_LOOP); PUSH_GL(LINE_STRIP); PUSH_GL(TRIANGLES); PUSH_GL(TRIANGLE_STRIP); PUSH_GL(TRIANGLE_FAN); PUSH_GL(QUADS); PUSH_GL(QUAD_STRIP); PUSH_GL(POLYGON); // BlendingFactorDest PUSH_GL(ZERO); PUSH_GL(ONE); PUSH_GL(SRC_COLOR); PUSH_GL(ONE_MINUS_SRC_COLOR); PUSH_GL(SRC_ALPHA); PUSH_GL(ONE_MINUS_SRC_ALPHA); PUSH_GL(DST_ALPHA); PUSH_GL(ONE_MINUS_DST_ALPHA); // BlendingFactorSrc // GL_ZERO // GL_ONE PUSH_GL(DST_COLOR); PUSH_GL(ONE_MINUS_DST_COLOR); PUSH_GL(SRC_ALPHA_SATURATE); // AlphaFunction and DepthFunction PUSH_GL(NEVER); PUSH_GL(LESS); PUSH_GL(EQUAL); PUSH_GL(LEQUAL); PUSH_GL(GREATER); PUSH_GL(NOTEQUAL); PUSH_GL(GEQUAL); PUSH_GL(ALWAYS); // LogicOp PUSH_GL(CLEAR); PUSH_GL(AND); PUSH_GL(AND_REVERSE); PUSH_GL(COPY); PUSH_GL(AND_INVERTED); PUSH_GL(NOOP); PUSH_GL(XOR); PUSH_GL(OR); PUSH_GL(NOR); PUSH_GL(EQUIV); PUSH_GL(INVERT); PUSH_GL(OR_REVERSE); PUSH_GL(COPY_INVERTED); PUSH_GL(OR_INVERTED); PUSH_GL(NAND); PUSH_GL(SET); // Culling PUSH_GL(BACK); PUSH_GL(FRONT); PUSH_GL(FRONT_AND_BACK); // PolygonMode PUSH_GL(POINT); PUSH_GL(LINE); PUSH_GL(FILL); // Clear Bits PUSH_GL(DEPTH_BUFFER_BIT); PUSH_GL(ACCUM_BUFFER_BIT); PUSH_GL(STENCIL_BUFFER_BIT); PUSH_GL(COLOR_BUFFER_BIT); // ShadeModel PUSH_GL(FLAT); PUSH_GL(SMOOTH); // MatrixMode PUSH_GL(MODELVIEW); PUSH_GL(PROJECTION); PUSH_GL(TEXTURE); // Texture Filtering PUSH_GL(NEAREST); PUSH_GL(LINEAR); PUSH_GL(NEAREST_MIPMAP_NEAREST); PUSH_GL(LINEAR_MIPMAP_NEAREST); PUSH_GL(NEAREST_MIPMAP_LINEAR); PUSH_GL(LINEAR_MIPMAP_LINEAR); // Texture Clamping PUSH_GL(REPEAT); PUSH_GL(MIRRORED_REPEAT); PUSH_GL(CLAMP); PUSH_GL(CLAMP_TO_EDGE); PUSH_GL(CLAMP_TO_BORDER); // Texture Environment PUSH_GL(TEXTURE_ENV); PUSH_GL(TEXTURE_ENV_MODE); PUSH_GL(TEXTURE_ENV_COLOR); PUSH_GL(MODULATE); PUSH_GL(DECAL); PUSH_GL(BLEND); PUSH_GL(REPLACE); PUSH_GL(TEXTURE_FILTER_CONTROL); PUSH_GL(TEXTURE_LOD_BIAS); // Texture Generation PUSH_GL(TEXTURE_GEN_MODE); PUSH_GL(EYE_PLANE); PUSH_GL(OBJECT_PLANE); PUSH_GL(EYE_LINEAR); PUSH_GL(OBJECT_LINEAR); PUSH_GL(SPHERE_MAP); PUSH_GL(NORMAL_MAP); PUSH_GL(REFLECTION_MAP); PUSH_GL(S); PUSH_GL(T); PUSH_GL(R); PUSH_GL(Q); // glPushAttrib() bits PUSH_GL(CURRENT_BIT); PUSH_GL(POINT_BIT); PUSH_GL(LINE_BIT); PUSH_GL(POLYGON_BIT); PUSH_GL(POLYGON_STIPPLE_BIT); PUSH_GL(PIXEL_MODE_BIT); PUSH_GL(LIGHTING_BIT); PUSH_GL(FOG_BIT); PUSH_GL(DEPTH_BUFFER_BIT); PUSH_GL(ACCUM_BUFFER_BIT); PUSH_GL(STENCIL_BUFFER_BIT); PUSH_GL(VIEWPORT_BIT); PUSH_GL(TRANSFORM_BIT); PUSH_GL(ENABLE_BIT); PUSH_GL(COLOR_BUFFER_BIT); PUSH_GL(HINT_BIT); PUSH_GL(EVAL_BIT); PUSH_GL(LIST_BIT); PUSH_GL(TEXTURE_BIT); PUSH_GL(SCISSOR_BIT); //PUSH_GL(ALL_ATTRIB_BITS); // floating point clip LuaPushNamedNumber(L, "ALL_ATTRIB_BITS", -1.0f); // glHint() targets PUSH_GL(FOG_HINT); PUSH_GL(PERSPECTIVE_CORRECTION_HINT); // glHint() modes PUSH_GL(DONT_CARE); PUSH_GL(FASTEST); PUSH_GL(NICEST); // Light Specification PUSH_GL(AMBIENT); PUSH_GL(DIFFUSE); PUSH_GL(SPECULAR); PUSH_GL(POSITION); PUSH_GL(SPOT_DIRECTION); PUSH_GL(SPOT_EXPONENT); PUSH_GL(SPOT_CUTOFF); PUSH_GL(CONSTANT_ATTENUATION); PUSH_GL(LINEAR_ATTENUATION); PUSH_GL(QUADRATIC_ATTENUATION); return true; }
bool LuaConstGame::PushEntries(lua_State* L) { // FIXME -- this is getting silly, convert to userdata? const float gravity = -(mapInfo->map.gravity * GAME_SPEED * GAME_SPEED); const bool limitDGun = gameSetup ? gameSetup->limitDgun : false; const bool diminishingMMs = gameSetup ? gameSetup->diminishingMMs : false; const bool ghostedBuildings = gameSetup ? gameSetup->ghostedBuildings : false; const int startPosType = gameSetup ? gameSetup->startPosType : 0; // FIXME -- loaded too early - not set yet (another reason to use userdata) lua_pushliteral(L, "gameID"); lua_pushlstring(L, (const char*)game->gameID, sizeof(game->gameID)); lua_rawset(L, -3); LuaPushNamedString(L, "version", SpringVersion::GetFull()); LuaPushNamedNumber(L, "maxUnits", uh->MaxUnits()); LuaPushNamedNumber(L, "maxTeams", MAX_TEAMS); LuaPushNamedNumber(L, "maxPlayers", MAX_PLAYERS); LuaPushNamedNumber(L, "gameSpeed", GAME_SPEED); LuaPushNamedNumber(L, "squareSize", SQUARE_SIZE); LuaPushNamedNumber(L, "gameMode", gameSetup->gameMode); LuaPushNamedNumber(L, "startPosType", startPosType); LuaPushNamedBool(L, "commEnds", (gameSetup->gameMode >= 1)); LuaPushNamedBool(L, "limitDGun", limitDGun); LuaPushNamedBool(L, "diminishingMetal", diminishingMMs); LuaPushNamedBool(L, "ghostedBuildings", ghostedBuildings); const CMapInfo* mi = mapInfo; LuaPushNamedBool(L, "mapDamage", !mapDamage->disabled); LuaPushNamedNumber(L, "gravity", gravity); LuaPushNamedNumber(L, "windMin", wind.GetMinWind()); LuaPushNamedNumber(L, "windMax", wind.GetMaxWind()); LuaPushNamedString(L, "mapName", mi->map.name); LuaPushNamedString(L, "mapHumanName", mi->map.humanName); LuaPushNamedNumber(L, "mapX", readmap->width / 64); LuaPushNamedNumber(L, "mapY", readmap->height / 64); LuaPushNamedNumber(L, "mapSizeX", readmap->width * SQUARE_SIZE); LuaPushNamedNumber(L, "mapSizeZ", readmap->height * SQUARE_SIZE); LuaPushNamedNumber(L, "extractorRadius", mi->map.extractorRadius); LuaPushNamedNumber(L, "tidal", mi->map.tidalStrength); LuaPushNamedNumber(L, "waterDamage", mi->water.damage); LuaPushNamedString(L, "waterTexture", mi->water.texture); LuaPushNamedNumber(L, "waterRepeatX", mi->water.repeatX); LuaPushNamedNumber(L, "waterRepeatY", mi->water.repeatY); LuaPushNamedString(L, "waterFoamTexture", mi->water.foamTexture); LuaPushNamedString(L, "waterNormalTexture", mi->water.normalTexture); LuaPushNamedNumber(L, "waterNumTiles", mi->water.numTiles); LuaPushNamedBool(L, "waterVoid", mi->map.voidWater); LuaPushNamedBool(L, "waterHasWaterPlane", mi->water.hasWaterPlane); LuaPushNamedBool(L, "waterForceRendering", mi->water.forceRendering); LuaPushNamedColor(L, "waterAbsorb", mi->water.absorb); LuaPushNamedColor(L, "waterBaseColor", mi->water.baseColor); LuaPushNamedColor(L, "waterMinColor", mi->water.minColor); LuaPushNamedColor(L, "waterSurfaceColor", mi->water.surfaceColor); LuaPushNamedNumber(L, "waterSurfaceAlpha", mi->water.surfaceAlpha); LuaPushNamedColor(L, "waterDiffuseColor", mi->water.diffuseColor); LuaPushNamedNumber(L, "waterDiffuseFactor", mi->water.diffuseFactor); LuaPushNamedColor(L, "waterSpecularColor", mi->water.specularColor); LuaPushNamedNumber(L, "waterSpecularFactor", mi->water.specularFactor); LuaPushNamedNumber(L, "waterAmbientFactor", mi->water.ambientFactor); LuaPushNamedColor(L, "waterPlaneColor", mi->water.planeColor); LuaPushNamedNumber(L, "waterFresnelMin", mi->water.fresnelMin); LuaPushNamedNumber(L, "waterFresnelMax", mi->water.fresnelMax); LuaPushNamedNumber(L, "waterFresnelPower", mi->water.fresnelPower); LuaPushNamedNumber(L, "waterReflectionDistortion", mi->water.reflDistortion); LuaPushNamedColor(L, "fogColor", mi->atmosphere.fogColor); LuaPushNamedColor(L, "groundAmbientColor", mi->light.groundAmbientColor); LuaPushNamedColor(L, "groundSpecularColor", mi->light.groundSpecularColor); LuaPushNamedColor(L, "groundSunColor", mi->light.groundSunColor); const vector<string>& causticTexs = mi->water.causticTextures; lua_pushstring(L, "waterCausticTextures"); lua_newtable(L); for (int i = 0; i < (int)causticTexs.size(); i++) { lua_pushnumber(L, i + 1); lua_pushstring(L, causticTexs[i].c_str()); lua_rawset(L, -3); } lua_rawset(L, -3); LuaPushNamedString(L, "modName", modInfo.humanName); LuaPushNamedString(L, "modShortName", modInfo.shortName); LuaPushNamedString(L, "modVersion", modInfo.version); LuaPushNamedString(L, "modMutator", modInfo.mutator); LuaPushNamedString(L, "modDesc", modInfo.description); LuaPushNamedBool(L, "allowTeamColors", modInfo.allowTeamColors); LuaPushNamedBool(L, "constructionDecay", modInfo.constructionDecay); LuaPushNamedNumber(L, "constructionDecayTime", modInfo.constructionDecayTime); LuaPushNamedNumber(L, "constructionDecaySpeed", modInfo.constructionDecaySpeed); LuaPushNamedNumber(L, "multiReclaim", modInfo.multiReclaim); LuaPushNamedNumber(L, "reclaimMethod", modInfo.reclaimMethod); LuaPushNamedNumber(L, "reclaimUnitMethod", modInfo.reclaimUnitMethod); LuaPushNamedNumber(L, "reclaimUnitEnergyCostFactor", modInfo.reclaimUnitEnergyCostFactor); LuaPushNamedNumber(L, "reclaimUnitEfficiency", modInfo.reclaimUnitEfficiency); LuaPushNamedNumber(L, "reclaimFeatureEnergyCostFactor", modInfo.reclaimFeatureEnergyCostFactor); LuaPushNamedBool(L, "reclaimAllowEnemies", modInfo.reclaimAllowEnemies); LuaPushNamedBool(L, "reclaimAllowAllies", modInfo.reclaimAllowAllies); LuaPushNamedNumber(L, "repairEnergyCostFactor", modInfo.repairEnergyCostFactor); LuaPushNamedNumber(L, "resurrectEnergyCostFactor", modInfo.resurrectEnergyCostFactor); LuaPushNamedNumber(L, "captureEnergyCostFactor", modInfo.captureEnergyCostFactor); LuaPushNamedNumber(L, "transportAir", modInfo.transportAir); LuaPushNamedNumber(L, "transportShip", modInfo.transportShip); LuaPushNamedNumber(L, "transportHover", modInfo.transportHover); LuaPushNamedNumber(L, "transportGround", modInfo.transportGround); LuaPushNamedNumber(L, "fireAtKilled", modInfo.fireAtKilled); LuaPushNamedNumber(L, "fireAtCrashing", modInfo.fireAtCrashing); LuaPushNamedNumber(L, "requireSonarUnderWater", modInfo.requireSonarUnderWater); char buf[64]; SNPRINTF(buf, sizeof(buf), "0x%08X", archiveScanner->GetArchiveCompleteChecksum(mapInfo->map.name)); LuaPushNamedString(L, "mapChecksum", buf); SNPRINTF(buf, sizeof(buf), "0x%08X", archiveScanner->GetArchiveCompleteChecksum(modInfo.filename)); LuaPushNamedString(L, "modChecksum", buf); const vector<string> cats = CCategoryHandler::Instance()->GetCategoryNames(~0); lua_pushstring(L, "springCategories"); lua_newtable(L); for (int i = 0; i < (int)cats.size(); i++) { LuaPushNamedNumber(L, StringToLower(cats[i]), i); } lua_rawset(L, -3); lua_pushstring(L, "armorTypes"); lua_newtable(L); const std::vector<std::string>& typeList = damageArrayHandler->GetTypeList(); const int typeCount = (int)typeList.size(); for (int i = 0; i < typeCount; i++) { // bidirectional map lua_pushstring(L, typeList[i].c_str()); lua_pushnumber(L, i); lua_rawset(L, -3); lua_pushnumber(L, i); lua_pushstring(L, typeList[i].c_str()); lua_rawset(L, -3); } lua_rawset(L, -3); return true; }
bool LuaConstGame::PushEntries(lua_State* L) { assert(mapInfo); assert(gameSetup); // FIXME -- this is getting silly, convert to userdata? LuaPushNamedString(L, "version", SpringVersion::GetSync()); LuaPushNamedString(L, "buildFlags", (!CLuaHandle::GetHandleSynced(L))? SpringVersion::GetAdditional(): ""); if (unitHandler != NULL) { LuaPushNamedNumber(L, "maxUnits", unitHandler->MaxUnits()); } LuaPushNamedNumber(L, "maxTeams", MAX_TEAMS); LuaPushNamedNumber(L, "maxPlayers", MAX_PLAYERS); LuaPushNamedNumber(L, "gameSpeed", GAME_SPEED); LuaPushNamedNumber(L, "squareSize", SQUARE_SIZE); LuaPushNamedNumber(L, "startPosType", gameSetup->startPosType); LuaPushNamedBool(L, "ghostedBuildings", gameSetup->ghostedBuildings); LuaPushNamedNumber(L, "gravity", -mapInfo->map.gravity * GAME_SPEED * GAME_SPEED); LuaPushNamedNumber(L, "windMin", wind.GetMinWind()); LuaPushNamedNumber(L, "windMax", wind.GetMaxWind()); LuaPushNamedString(L, "mapName", mapInfo->map.name); LuaPushNamedString(L, "mapHumanName", mapInfo->map.description); //! deprecated LuaPushNamedString(L, "mapDescription", mapInfo->map.description); LuaPushNamedNumber(L, "mapHardness", mapInfo->map.hardness); if (mapDamage) { // damage is enabled iff !mapInfo->map.notDeformable LuaPushNamedBool(L, "mapDamage", !mapDamage->disabled); } if (readmap) { //FIXME make this available in LoadScreen already! LuaPushNamedNumber(L, "mapX", readmap->width / 64); LuaPushNamedNumber(L, "mapY", readmap->height / 64); LuaPushNamedNumber(L, "mapSizeX", readmap->width * SQUARE_SIZE); LuaPushNamedNumber(L, "mapSizeZ", readmap->height * SQUARE_SIZE); } LuaPushNamedNumber(L, "extractorRadius", mapInfo->map.extractorRadius); LuaPushNamedNumber(L, "tidal", mapInfo->map.tidalStrength); LuaPushNamedNumber(L, "waterDamage", mapInfo->water.damage); LuaPushNamedString(L, "waterTexture", mapInfo->water.texture); LuaPushNamedNumber(L, "waterRepeatX", mapInfo->water.repeatX); LuaPushNamedNumber(L, "waterRepeatY", mapInfo->water.repeatY); LuaPushNamedString(L, "waterFoamTexture", mapInfo->water.foamTexture); LuaPushNamedString(L, "waterNormalTexture", mapInfo->water.normalTexture); LuaPushNamedNumber(L, "waterNumTiles", mapInfo->water.numTiles); LuaPushNamedBool(L, "voidWater", mapInfo->map.voidWater); LuaPushNamedBool(L, "voidGround", mapInfo->map.voidGround); LuaPushNamedBool(L, "waterHasWaterPlane", mapInfo->water.hasWaterPlane); LuaPushNamedBool(L, "waterForceRendering", mapInfo->water.forceRendering); LuaPushNamedColor(L, "waterAbsorb", mapInfo->water.absorb); LuaPushNamedColor(L, "waterBaseColor", mapInfo->water.baseColor); LuaPushNamedColor(L, "waterMinColor", mapInfo->water.minColor); LuaPushNamedColor(L, "waterSurfaceColor", mapInfo->water.surfaceColor); LuaPushNamedNumber(L, "waterSurfaceAlpha", mapInfo->water.surfaceAlpha); LuaPushNamedColor(L, "waterDiffuseColor", mapInfo->water.diffuseColor); LuaPushNamedNumber(L, "waterDiffuseFactor", mapInfo->water.diffuseFactor); LuaPushNamedColor(L, "waterSpecularColor", mapInfo->water.specularColor); LuaPushNamedNumber(L, "waterSpecularFactor", mapInfo->water.specularFactor); LuaPushNamedNumber(L, "waterAmbientFactor", mapInfo->water.ambientFactor); LuaPushNamedColor(L, "waterPlaneColor", mapInfo->water.planeColor); LuaPushNamedNumber(L, "waterFresnelMin", mapInfo->water.fresnelMin); LuaPushNamedNumber(L, "waterFresnelMax", mapInfo->water.fresnelMax); LuaPushNamedNumber(L, "waterFresnelPower", mapInfo->water.fresnelPower); LuaPushNamedNumber(L, "waterReflectionDistortion", mapInfo->water.reflDistortion); LuaPushNamedColor(L, "fogColor", mapInfo->atmosphere.fogColor); LuaPushNamedColor(L, "groundAmbientColor", mapInfo->light.groundAmbientColor); LuaPushNamedColor(L, "groundSpecularColor", mapInfo->light.groundSpecularColor); LuaPushNamedColor(L, "groundSunColor", mapInfo->light.groundSunColor); const vector<string>& causticTexs = mapInfo->water.causticTextures; lua_pushliteral(L, "waterCausticTextures"); lua_newtable(L); for (int i = 0; i < (int)causticTexs.size(); i++) { lua_pushnumber(L, i + 1); lua_pushsstring(L, causticTexs[i]); lua_rawset(L, -3); } lua_rawset(L, -3); LuaPushNamedBool(L, "allowTeamColors", true); LuaPushNamedString(L, "modName", modInfo.humanName); LuaPushNamedString(L, "modShortName", modInfo.shortName); LuaPushNamedString(L, "modVersion", modInfo.version); LuaPushNamedString(L, "modMutator", modInfo.mutator); LuaPushNamedString(L, "modDesc", modInfo.description); LuaPushNamedBool(L, "constructionDecay", modInfo.constructionDecay); LuaPushNamedNumber(L, "constructionDecayTime", modInfo.constructionDecayTime); LuaPushNamedNumber(L, "constructionDecaySpeed", modInfo.constructionDecaySpeed); LuaPushNamedNumber(L, "multiReclaim", modInfo.multiReclaim); LuaPushNamedNumber(L, "reclaimMethod", modInfo.reclaimMethod); LuaPushNamedNumber(L, "reclaimUnitMethod", modInfo.reclaimUnitMethod); LuaPushNamedNumber(L, "reclaimUnitEnergyCostFactor", modInfo.reclaimUnitEnergyCostFactor); LuaPushNamedNumber(L, "reclaimUnitEfficiency", modInfo.reclaimUnitEfficiency); LuaPushNamedNumber(L, "reclaimFeatureEnergyCostFactor", modInfo.reclaimFeatureEnergyCostFactor); LuaPushNamedBool(L, "reclaimAllowEnemies", modInfo.reclaimAllowEnemies); LuaPushNamedBool(L, "reclaimAllowAllies", modInfo.reclaimAllowAllies); LuaPushNamedNumber(L, "repairEnergyCostFactor", modInfo.repairEnergyCostFactor); LuaPushNamedNumber(L, "resurrectEnergyCostFactor", modInfo.resurrectEnergyCostFactor); LuaPushNamedNumber(L, "captureEnergyCostFactor", modInfo.captureEnergyCostFactor); LuaPushNamedNumber(L, "transportAir", modInfo.transportAir); LuaPushNamedNumber(L, "transportShip", modInfo.transportShip); LuaPushNamedNumber(L, "transportHover", modInfo.transportHover); LuaPushNamedNumber(L, "transportGround", modInfo.transportGround); LuaPushNamedNumber(L, "fireAtKilled", modInfo.fireAtKilled); LuaPushNamedNumber(L, "fireAtCrashing", modInfo.fireAtCrashing); LuaPushNamedNumber(L, "requireSonarUnderWater", modInfo.requireSonarUnderWater); char buf[64]; SNPRINTF(buf, sizeof(buf), "0x%08X", archiveScanner->GetArchiveCompleteChecksum(mapInfo->map.name)); LuaPushNamedString(L, "mapChecksum", buf); SNPRINTF(buf, sizeof(buf), "0x%08X", archiveScanner->GetArchiveCompleteChecksum(modInfo.filename)); LuaPushNamedString(L, "modChecksum", buf); const vector<string> &cats = CCategoryHandler::Instance()->GetCategoryNames(~0); lua_pushliteral(L, "springCategories"); lua_newtable(L); for (int i = 0; i < (int)cats.size(); i++) { LuaPushNamedNumber(L, StringToLower(cats[i]), i); } lua_rawset(L, -3); lua_pushliteral(L, "armorTypes"); lua_newtable(L); if (damageArrayHandler) { const std::vector<std::string>& typeList = damageArrayHandler->GetTypeList(); const int typeCount = (int)typeList.size(); for (int i = 0; i < typeCount; i++) { // bidirectional map lua_pushsstring(L, typeList[i]); lua_pushnumber(L, i); lua_rawset(L, -3); lua_pushnumber(L, i); lua_pushsstring(L, typeList[i]); lua_rawset(L, -3); } } lua_rawset(L, -3); return true; }
bool LuaConstSFX::PushEntries(lua_State* L) { // Piece Flags for Spring.UnitScript.Explode LuaPushNamedNumber(L, "SHATTER", PF_Shatter); LuaPushNamedNumber(L, "EXPLODE", PF_Explode); LuaPushNamedNumber(L, "EXPLODE_ON_HIT", PF_Explode); LuaPushNamedNumber(L, "FALL", PF_Fall); LuaPushNamedNumber(L, "SMOKE", PF_Smoke); LuaPushNamedNumber(L, "FIRE", PF_Fire); LuaPushNamedNumber(L, "NONE", PF_NONE); // BITMAP_ONLY LuaPushNamedNumber(L, "NO_CEG_TRAIL", PF_NoCEGTrail); LuaPushNamedNumber(L, "NO_HEATCLOUD", PF_NoHeatCloud); // For Spring.UnitScript.EmitSfx LuaPushNamedNumber(L, "VTOL", SFX_VTOL); LuaPushNamedNumber(L, "WAKE", SFX_WAKE); LuaPushNamedNumber(L, "REVERSE_WAKE", SFX_REVERSE_WAKE); // no need for WAKE_2 and REVERSE_WAKE_2 as they are same as WAKE and REVERSE_WAKE //LuaPushNamedNumber(L, "WAKE_2", SFX_WAKE_2); //LuaPushNamedNumber(L, "REVERSE_WAKE_2", SFX_REVERSE_WAKE_2); LuaPushNamedNumber(L, "WHITE_SMOKE", SFX_WHITE_SMOKE); LuaPushNamedNumber(L, "BLACK_SMOKE", SFX_BLACK_SMOKE); LuaPushNamedNumber(L, "BUBBLE", SFX_BUBBLE); LuaPushNamedNumber(L, "CEG", SFX_CEG); LuaPushNamedNumber(L, "FIRE_WEAPON", SFX_FIRE_WEAPON); LuaPushNamedNumber(L, "DETONATE_WEAPON", SFX_DETONATE_WEAPON); return true; }
bool CUnsyncedLuaHandle::Init(const string& code, const string& file) { if (!IsValid()) { return false; } // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); //LUA_OPEN_LIB(L, luaopen_debug); // delete some dangerous functions lua_pushnil(L); lua_setglobal(L, "dofile"); lua_pushnil(L); lua_setglobal(L, "loadfile"); lua_pushnil(L); lua_setglobal(L, "loadlib"); lua_pushnil(L); lua_setglobal(L, "loadstring"); // replaced lua_pushnil(L); lua_setglobal(L, "require"); lua_pushvalue(L, LUA_GLOBALSINDEX); AddBasicCalls(L); // remove Script.Kill() lua_getglobal(L, "Script"); LuaPushNamedNil(L, "Kill"); lua_pop(L, 1); LuaPushNamedCFunc(L, "loadstring", CLuaHandleSynced::LoadStringData); LuaPushNamedCFunc(L, "CallAsTeam", CLuaHandleSynced::CallAsTeam); LuaPushNamedNumber(L, "COBSCALE", COBSCALE); // load our libraries if (!LuaSyncedTable::PushEntries(L) || !AddEntriesToTable(L, "VFS", LuaVFS::PushUnsynced) || !AddEntriesToTable(L, "VFS", LuaZipFileReader::PushUnsynced) || !AddEntriesToTable(L, "VFS", LuaZipFileWriter::PushUnsynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaInterCall::PushEntriesUnsynced) || !AddEntriesToTable(L, "Script", LuaScream::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedRead::PushEntries) || !AddEntriesToTable(L, "Spring", LuaUnsyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaUnsyncedRead::PushEntries) || !AddEntriesToTable(L, "gl", LuaOpenGL::PushEntries) || !AddEntriesToTable(L, "GL", LuaConstGL::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries) || !AddEntriesToTable(L, "LOG", LuaUtils::PushLogEntries) ) { KillLua(); return false; } lua_settop(L, 0); // add code from the sub-class if (!base.AddUnsyncedCode(L)) { KillLua(); return false; } lua_settop(L, 0); if (!LoadCode(L, code, file)) { KillLua(); return false; } lua_settop(L, 0); eventHandler.AddClient(this); return true; }
bool CSyncedLuaHandle::Init(const string& code, const string& file) { if (!IsValid()) return false; watchUnitDefs.resize(unitDefHandler->unitDefs.size() + 1, false); watchFeatureDefs.resize(featureHandler->GetFeatureDefs().size(), false); watchWeaponDefs.resize(weaponDefHandler->weaponDefs.size(), false); // load the standard libraries LUA_OPEN_LIB(L, luaopen_base); LUA_OPEN_LIB(L, luaopen_math); LUA_OPEN_LIB(L, luaopen_table); LUA_OPEN_LIB(L, luaopen_string); //LUA_OPEN_LIB(L, luaopen_io); //LUA_OPEN_LIB(L, luaopen_os); //LUA_OPEN_LIB(L, luaopen_package); //LUA_OPEN_LIB(L, luaopen_debug); lua_getglobal(L, "next"); origNextRef = luaL_ref(L, LUA_REGISTRYINDEX); // delete/replace some dangerous functions lua_pushnil(L); lua_setglobal(L, "dofile"); lua_pushnil(L); lua_setglobal(L, "loadfile"); lua_pushnil(L); lua_setglobal(L, "loadlib"); lua_pushnil(L); lua_setglobal(L, "require"); lua_pushnil(L); lua_setglobal(L, "rawequal"); //FIXME not unsafe anymore since split? lua_pushnil(L); lua_setglobal(L, "rawget"); //FIXME not unsafe anymore since split? lua_pushnil(L); lua_setglobal(L, "rawset"); //FIXME not unsafe anymore since split? // lua_pushnil(L); lua_setglobal(L, "getfenv"); // lua_pushnil(L); lua_setglobal(L, "setfenv"); lua_pushnil(L); lua_setglobal(L, "newproxy"); // sync unsafe cause of __gc lua_pushnil(L); lua_setglobal(L, "gcinfo"); lua_pushnil(L); lua_setglobal(L, "collectgarbage"); lua_pushvalue(L, LUA_GLOBALSINDEX); LuaPushNamedCFunc(L, "loadstring", CLuaHandleSynced::LoadStringData); LuaPushNamedCFunc(L, "pairs", SyncedPairs); LuaPushNamedCFunc(L, "next", SyncedNext); lua_pop(L, 1); lua_pushvalue(L, LUA_GLOBALSINDEX); AddBasicCalls(L); // into Global // adjust the math.random() and math.randomseed() calls lua_getglobal(L, "math"); LuaPushNamedCFunc(L, "random", SyncedRandom); LuaPushNamedCFunc(L, "randomseed", SyncedRandomSeed); lua_pop(L, 1); // pop the global math table lua_getglobal(L, "Script"); LuaPushNamedCFunc(L, "AddActionFallback", AddSyncedActionFallback); LuaPushNamedCFunc(L, "RemoveActionFallback", RemoveSyncedActionFallback); LuaPushNamedCFunc(L, "GetWatchUnit", GetWatchUnitDef); LuaPushNamedCFunc(L, "SetWatchUnit", SetWatchUnitDef); LuaPushNamedCFunc(L, "GetWatchFeature", GetWatchFeatureDef); LuaPushNamedCFunc(L, "SetWatchFeature", SetWatchFeatureDef); LuaPushNamedCFunc(L, "GetWatchWeapon", GetWatchWeaponDef); LuaPushNamedCFunc(L, "SetWatchWeapon", SetWatchWeaponDef); lua_pop(L, 1); // add the custom file loader LuaPushNamedCFunc(L, "SendToUnsynced", SendToUnsynced); LuaPushNamedCFunc(L, "CallAsTeam", CLuaHandleSynced::CallAsTeam); LuaPushNamedNumber(L, "COBSCALE", COBSCALE); // load our libraries (LuaSyncedCtrl overrides some LuaUnsyncedCtrl entries) if ( !AddEntriesToTable(L, "VFS", LuaVFS::PushSynced) || !AddEntriesToTable(L, "VFS", LuaZipFileReader::PushSynced) || !AddEntriesToTable(L, "VFS", LuaZipFileWriter::PushSynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaInterCall::PushEntriesSynced) || !AddEntriesToTable(L, "Spring", LuaUnsyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedRead::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries) || !AddEntriesToTable(L, "COB", LuaConstCOB::PushEntries) || !AddEntriesToTable(L, "SFX", LuaConstSFX::PushEntries) || !AddEntriesToTable(L, "LOG", LuaUtils::PushLogEntries) ) { KillLua(); return false; } // add code from the sub-class if (!base.AddSyncedCode(L)) { KillLua(); return false; } lua_settop(L, 0); if (!LoadCode(L, code, file)) { KillLua(); return false; } lua_settop(L, 0); eventHandler.AddClient(this); return true; }
bool LuaConstGame::PushEntries(lua_State* L) { const float gravity = -(gs->gravity * GAME_SPEED * GAME_SPEED); const bool limitDGun = gameSetup ? gameSetup->limitDgun : false; const bool diminishingMMs = gameSetup ? gameSetup->diminishingMMs : false; const int startPosType = gameSetup ? gameSetup->startPosType : 0; LuaPushNamedString(L, "version", VERSION_STRING); LuaPushNamedNumber(L, "maxUnits", MAX_UNITS); LuaPushNamedNumber(L, "maxTeams", MAX_TEAMS); LuaPushNamedNumber(L, "maxPlayers", MAX_PLAYERS); LuaPushNamedNumber(L, "gameSpeed", GAME_SPEED); LuaPushNamedNumber(L, "squareSize", SQUARE_SIZE); LuaPushNamedNumber(L, "gameMode", gs->gameMode); LuaPushNamedNumber(L, "startPosType", startPosType); LuaPushNamedBool(L, "commEnds", (gs->gameMode >= 1)); LuaPushNamedBool(L, "limitDGun", limitDGun); LuaPushNamedBool(L, "diminishingMetal", diminishingMMs); LuaPushNamedString(L, "mapName", readmap->mapName); LuaPushNamedString(L, "mapHumanName", readmap->mapHumanName); LuaPushNamedNumber(L, "mapX", readmap->width / 64); LuaPushNamedNumber(L, "mapY", readmap->height / 64); LuaPushNamedNumber(L, "gravity", gravity); LuaPushNamedNumber(L, "tidal", readmap->tidalStrength); LuaPushNamedNumber(L, "windMin", wind.minWind); LuaPushNamedNumber(L, "windMax", wind.maxWind); LuaPushNamedBool(L, "mapDamage", !mapDamage->disabled); LuaPushNamedBool(L, "mapWaterVoid", readmap->voidWater); LuaPushNamedBool(L, "mapWaterPlane", readmap->hasWaterPlane); LuaPushNamedString(L, "modName", modInfo->name); LuaPushNamedString(L, "modHumanName", modInfo->humanName); LuaPushNamedBool(L, "allowTeamColors", modInfo->allowTeamColors); LuaPushNamedNumber(L, "multiReclaim", modInfo->multiReclaim); LuaPushNamedNumber(L, "reclaimMethod", modInfo->reclaimMethod); LuaPushNamedNumber(L, "transportAir", modInfo->transportAir); LuaPushNamedNumber(L, "transportShip", modInfo->transportShip); LuaPushNamedNumber(L, "transportHover", modInfo->transportHover); LuaPushNamedNumber(L, "transportGround", modInfo->transportGround); char buf[64]; SNPRINTF(buf, sizeof(buf), "0x%08X", archiveScanner->GetMapChecksum(readmap->mapName)); LuaPushNamedString(L, "mapChecksum", buf); SNPRINTF(buf, sizeof(buf), "0x%08X", archiveScanner->GetModChecksum(modInfo->name)); LuaPushNamedString(L, "modChecksum", buf); const vector<string> cats = CCategoryHandler::Instance()->GetCategoryNames(~0); lua_pushstring(L, "springCategories"); lua_newtable(L); for (int i = 0; i < (int)cats.size(); i++) { LuaPushNamedBool(L, cats[i], true); } lua_rawset(L, -3); lua_pushstring(L, "armorTypes"); lua_newtable(L); const std::vector<std::string>& typeList = damageArrayHandler->typeList; const int typeCount = (int)typeList.size(); for (int i = 0; i < typeCount; i++) { LuaPushNamedNumber(L, typeList[i].c_str(), i); } lua_rawset(L, -3); return true; }
bool CLuaHandleSynced::SetupSynced(lua_State *L, const string& code, const string& filename) { if (!IsValid() || code.empty()) { return false; } lua_pushvalue(L, LUA_GLOBALSINDEX); HSTR_PUSH(L, "EXPORT"); lua_newtable(L); lua_rawset(L, -3); AddBasicCalls(L); // into Global lua_pushliteral(L, "Script"); lua_rawget(L, -2); LuaPushNamedCFunc(L, "AddActionFallback", AddSyncedActionFallback); LuaPushNamedCFunc(L, "RemoveActionFallback", RemoveSyncedActionFallback); LuaPushNamedCFunc(L, "UpdateCallIn", CallOutSyncedUpdateCallIn); LuaPushNamedCFunc(L, "GetWatchUnit", GetWatchUnitDef); LuaPushNamedCFunc(L, "SetWatchUnit", SetWatchUnitDef); LuaPushNamedCFunc(L, "GetWatchFeature", GetWatchFeatureDef); LuaPushNamedCFunc(L, "SetWatchFeature", SetWatchFeatureDef); LuaPushNamedCFunc(L, "GetWatchWeapon", GetWatchWeaponDef); LuaPushNamedCFunc(L, "SetWatchWeapon", SetWatchWeaponDef); lua_pop(L, 1); // add the custom file loader LuaPushNamedCFunc(L, "SendToUnsynced", SendToUnsynced); LuaPushNamedCFunc(L, "loadstring", LoadStringData); LuaPushNamedCFunc(L, "CallAsTeam", CallAsTeam); LuaPushNamedNumber(L, "COBSCALE", COBSCALE); // load our libraries (LuaSyncedCtrl overrides some LuaUnsyncedCtrl entries) if (!AddEntriesToTable(L, "VFS", LuaVFS::PushSynced) || !AddEntriesToTable(L, "VFS", LuaZipFileReader::PushSynced) || !AddEntriesToTable(L, "VFS", LuaZipFileWriter::PushSynced) || !AddEntriesToTable(L, "UnitDefs", LuaUnitDefs::PushEntries) || !AddEntriesToTable(L, "WeaponDefs", LuaWeaponDefs::PushEntries) || !AddEntriesToTable(L, "FeatureDefs", LuaFeatureDefs::PushEntries) || !AddEntriesToTable(L, "Script", LuaSyncedCall::PushEntries) || !AddEntriesToTable(L, "Spring", LuaUnsyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedCtrl::PushEntries) || !AddEntriesToTable(L, "Spring", LuaSyncedRead::PushEntries) || !AddEntriesToTable(L, "Game", LuaConstGame::PushEntries) || !AddEntriesToTable(L, "CMD", LuaConstCMD::PushEntries) || !AddEntriesToTable(L, "CMDTYPE", LuaConstCMDTYPE::PushEntries) || !AddEntriesToTable(L, "COB", LuaConstCOB::PushEntries) || !AddEntriesToTable(L, "SFX", LuaConstSFX::PushEntries) || !AddEntriesToTable(L, "LOG", LuaUtils::PushLogEntries) ) { KillLua(); return false; } // add code from the sub-class if (!AddSyncedCode(L)) { KillLua(); return false; } lua_settop(L, 0); if (!LoadCode(L, code, filename)) { KillLua(); return false; } return true; }