1 /* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
2
3
4 #include "LuaConstGame.h"
5
6 #include "LuaInclude.h"
7
8 #include "LuaHandle.h"
9 #include "LuaUtils.h"
10 #include "Game/Game.h"
11 #include "Game/GameSetup.h"
12 #include "Game/GameVersion.h"
13 #include "Map/MapDamage.h"
14 #include "Map/MapInfo.h"
15 #include "Map/ReadMap.h"
16 #include "Sim/Misc/ModInfo.h"
17 #include "Sim/Misc/CategoryHandler.h"
18 #include "Sim/Misc/DamageArrayHandler.h"
19 #include "Sim/Misc/Wind.h"
20 #include "Sim/Units/UnitHandler.h"
21 #include "Sim/Units/CommandAI/Command.h"
22 #include "System/FileSystem/ArchiveScanner.h"
23 #include "System/Util.h"
24
25
26 /******************************************************************************/
27 /******************************************************************************/
28
LuaPushNamedColor(lua_State * L,const string & name,const float3 & color)29 static void LuaPushNamedColor(lua_State* L,
30 const string& name, const float3& color)
31 {
32 lua_pushsstring(L, name);
33 lua_newtable(L);
34 lua_pushnumber(L, color.x); lua_rawseti(L, -2, 1);
35 lua_pushnumber(L, color.y); lua_rawseti(L, -2, 2);
36 lua_pushnumber(L, color.z); lua_rawseti(L, -2, 3);
37 lua_rawset(L, -3);
38 }
39
40
PushEntries(lua_State * L)41 bool LuaConstGame::PushEntries(lua_State* L)
42 {
43 assert(mapInfo);
44 assert(gameSetup);
45
46 // FIXME -- this is getting silly, convert to userdata?
47 LuaPushNamedString(L, "version", SpringVersion::GetSync());
48 LuaPushNamedString(L, "versionFull", (!CLuaHandle::GetHandleSynced(L))? SpringVersion::GetFull(): "");
49 LuaPushNamedString(L, "versionPatchSet", (!CLuaHandle::GetHandleSynced(L))? SpringVersion::GetPatchSet(): "");
50 LuaPushNamedString(L, "buildFlags", (!CLuaHandle::GetHandleSynced(L))? SpringVersion::GetAdditional(): "");
51
52 if (unitHandler != NULL) {
53 LuaPushNamedNumber(L, "maxUnits", unitHandler->MaxUnits());
54 }
55 LuaPushNamedNumber(L, "maxTeams", MAX_TEAMS);
56 LuaPushNamedNumber(L, "maxPlayers", MAX_PLAYERS);
57 LuaPushNamedNumber(L, "gameSpeed", GAME_SPEED);
58 LuaPushNamedNumber(L, "squareSize", SQUARE_SIZE);
59
60 LuaPushNamedNumber(L, "startPosType", gameSetup->startPosType);
61 LuaPushNamedBool(L, "ghostedBuildings", gameSetup->ghostedBuildings);
62
63 LuaPushNamedNumber(L, "gravity", -mapInfo->map.gravity * GAME_SPEED * GAME_SPEED);
64 LuaPushNamedNumber(L, "windMin", wind.GetMinWind());
65 LuaPushNamedNumber(L, "windMax", wind.GetMaxWind());
66 LuaPushNamedString(L, "mapName", mapInfo->map.name);
67 LuaPushNamedString(L, "mapHumanName", mapInfo->map.description); //! deprecated
68 LuaPushNamedString(L, "mapDescription", mapInfo->map.description);
69 LuaPushNamedNumber(L, "mapHardness", mapInfo->map.hardness);
70
71 if (mapDamage) {
72 // damage is enabled iff !mapInfo->map.notDeformable
73 LuaPushNamedBool(L, "mapDamage", !mapDamage->disabled);
74 }
75
76
77 if (readMap) {
78 //FIXME make this available in LoadScreen already!
79 LuaPushNamedNumber(L, "mapX", gs->mapx / 64);
80 LuaPushNamedNumber(L, "mapY", gs->mapy / 64);
81 LuaPushNamedNumber(L, "mapSizeX", gs->mapx * SQUARE_SIZE);
82 LuaPushNamedNumber(L, "mapSizeZ", gs->mapy * SQUARE_SIZE);
83 }
84 LuaPushNamedNumber(L, "extractorRadius", mapInfo->map.extractorRadius);
85 LuaPushNamedNumber(L, "tidal", mapInfo->map.tidalStrength);
86
87 LuaPushNamedNumber(L, "waterDamage", mapInfo->water.damage);
88 LuaPushNamedString(L, "waterTexture", mapInfo->water.texture);
89 LuaPushNamedNumber(L, "waterRepeatX", mapInfo->water.repeatX);
90 LuaPushNamedNumber(L, "waterRepeatY", mapInfo->water.repeatY);
91 LuaPushNamedString(L, "waterFoamTexture", mapInfo->water.foamTexture);
92 LuaPushNamedString(L, "waterNormalTexture", mapInfo->water.normalTexture);
93 LuaPushNamedNumber(L, "waterNumTiles", mapInfo->water.numTiles);
94 LuaPushNamedBool(L, "voidWater", mapInfo->map.voidWater);
95 LuaPushNamedBool(L, "voidGround", mapInfo->map.voidGround);
96 LuaPushNamedBool(L, "waterHasWaterPlane", mapInfo->water.hasWaterPlane);
97 LuaPushNamedBool(L, "waterForceRendering", mapInfo->water.forceRendering);
98 LuaPushNamedColor(L, "waterAbsorb", mapInfo->water.absorb);
99 LuaPushNamedColor(L, "waterBaseColor", mapInfo->water.baseColor);
100 LuaPushNamedColor(L, "waterMinColor", mapInfo->water.minColor);
101 LuaPushNamedColor(L, "waterSurfaceColor", mapInfo->water.surfaceColor);
102 LuaPushNamedNumber(L, "waterSurfaceAlpha", mapInfo->water.surfaceAlpha);
103 LuaPushNamedColor(L, "waterDiffuseColor", mapInfo->water.diffuseColor);
104 LuaPushNamedNumber(L, "waterDiffuseFactor", mapInfo->water.diffuseFactor);
105 LuaPushNamedColor(L, "waterSpecularColor", mapInfo->water.specularColor);
106 LuaPushNamedNumber(L, "waterSpecularFactor", mapInfo->water.specularFactor);
107 LuaPushNamedNumber(L, "waterAmbientFactor", mapInfo->water.ambientFactor);
108 LuaPushNamedColor(L, "waterPlaneColor", mapInfo->water.planeColor);
109 LuaPushNamedNumber(L, "waterFresnelMin", mapInfo->water.fresnelMin);
110 LuaPushNamedNumber(L, "waterFresnelMax", mapInfo->water.fresnelMax);
111 LuaPushNamedNumber(L, "waterFresnelPower", mapInfo->water.fresnelPower);
112 LuaPushNamedNumber(L, "waterReflectionDistortion", mapInfo->water.reflDistortion);
113
114 LuaPushNamedColor(L, "fogColor", mapInfo->atmosphere.fogColor);
115 LuaPushNamedColor(L, "groundAmbientColor", mapInfo->light.groundAmbientColor);
116 LuaPushNamedColor(L, "groundSpecularColor", mapInfo->light.groundSpecularColor);
117 LuaPushNamedColor(L, "groundSunColor", mapInfo->light.groundSunColor);
118
119 const vector<string>& causticTexs = mapInfo->water.causticTextures;
120 lua_pushliteral(L, "waterCausticTextures");
121 lua_newtable(L);
122 for (int i = 0; i < (int)causticTexs.size(); i++) {
123 lua_pushsstring(L, causticTexs[i]);
124 lua_rawseti(L, -2, i + 1);
125 }
126 lua_rawset(L, -3);
127
128 LuaPushNamedBool(L, "allowTeamColors", true);
129
130 LuaPushNamedString(L, "gameName", modInfo.humanName);
131 LuaPushNamedString(L, "gameShortName", modInfo.shortName);
132 LuaPushNamedString(L, "gameVersion", modInfo.version);
133 LuaPushNamedString(L, "gameMutator", modInfo.mutator);
134 LuaPushNamedString(L, "gameDesc", modInfo.description);
135
136 LuaPushNamedString(L, "modName", modInfo.humanNameVersioned);
137 LuaPushNamedString(L, "modShortName", modInfo.shortName);
138 LuaPushNamedString(L, "modVersion", modInfo.version);
139 LuaPushNamedString(L, "modMutator", modInfo.mutator);
140 LuaPushNamedString(L, "modDesc", modInfo.description);
141
142 LuaPushNamedBool(L, "constructionDecay", modInfo.constructionDecay);
143 LuaPushNamedNumber(L, "constructionDecayTime", modInfo.constructionDecayTime);
144 LuaPushNamedNumber(L, "constructionDecaySpeed", modInfo.constructionDecaySpeed);
145
146 LuaPushNamedNumber(L, "multiReclaim", modInfo.multiReclaim);
147 LuaPushNamedNumber(L, "reclaimMethod", modInfo.reclaimMethod);
148 LuaPushNamedNumber(L, "reclaimUnitMethod", modInfo.reclaimUnitMethod);
149 LuaPushNamedNumber(L, "reclaimUnitEnergyCostFactor", modInfo.reclaimUnitEnergyCostFactor);
150 LuaPushNamedNumber(L, "reclaimUnitEfficiency", modInfo.reclaimUnitEfficiency);
151 LuaPushNamedNumber(L, "reclaimFeatureEnergyCostFactor", modInfo.reclaimFeatureEnergyCostFactor);
152 LuaPushNamedBool(L, "reclaimAllowEnemies", modInfo.reclaimAllowEnemies);
153 LuaPushNamedBool(L, "reclaimAllowAllies", modInfo.reclaimAllowAllies);
154 LuaPushNamedNumber(L, "repairEnergyCostFactor", modInfo.repairEnergyCostFactor);
155 LuaPushNamedNumber(L, "resurrectEnergyCostFactor", modInfo.resurrectEnergyCostFactor);
156 LuaPushNamedNumber(L, "captureEnergyCostFactor", modInfo.captureEnergyCostFactor);
157
158 LuaPushNamedNumber(L, "transportAir", modInfo.transportAir);
159 LuaPushNamedNumber(L, "transportShip", modInfo.transportShip);
160 LuaPushNamedNumber(L, "transportHover", modInfo.transportHover);
161 LuaPushNamedNumber(L, "transportGround", modInfo.transportGround);
162 LuaPushNamedNumber(L, "fireAtKilled", modInfo.fireAtKilled);
163 LuaPushNamedNumber(L, "fireAtCrashing", modInfo.fireAtCrashing);
164
165 LuaPushNamedNumber(L, "requireSonarUnderWater", modInfo.requireSonarUnderWater);
166
167 char buf[64];
168 SNPRINTF(buf, sizeof(buf), "0x%08X",
169 archiveScanner->GetArchiveCompleteChecksum(mapInfo->map.name));
170 LuaPushNamedString(L, "mapChecksum", buf);
171 SNPRINTF(buf, sizeof(buf), "0x%08X",
172 archiveScanner->GetArchiveCompleteChecksum(modInfo.filename));
173 LuaPushNamedString(L, "modChecksum", buf);
174
175 const vector<string> &cats =
176 CCategoryHandler::Instance()->GetCategoryNames(~0);
177 lua_pushliteral(L, "springCategories");
178 lua_newtable(L);
179 for (int i = 0; i < (int)cats.size(); i++) {
180 LuaPushNamedNumber(L, StringToLower(cats[i]), i);
181 }
182 lua_rawset(L, -3);
183
184 lua_pushliteral(L, "armorTypes");
185 lua_newtable(L);
186 if (damageArrayHandler) {
187 const std::vector<std::string>& typeList = damageArrayHandler->GetTypeList();
188 const int typeCount = (int)typeList.size();
189 for (int i = 0; i < typeCount; i++) {
190 // bidirectional map
191 lua_pushsstring(L, typeList[i]);
192 lua_pushnumber(L, i);
193 lua_rawset(L, -3);
194 lua_pushsstring(L, typeList[i]);
195 lua_rawseti(L, -2, i);
196 }
197 }
198 lua_rawset(L, -3);
199
200 return true;
201 }
202
203
204 /******************************************************************************/
205 /******************************************************************************/
206