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