File: LuaConstGame.cpp

package info (click to toggle)
spring 0.81.2.1%2Bdfsg1-6
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 28,496 kB
  • ctags: 37,096
  • sloc: cpp: 238,659; ansic: 13,784; java: 12,175; awk: 3,428; python: 1,159; xml: 738; perl: 405; sh: 297; makefile: 267; pascal: 228; objc: 192
file content (201 lines) | stat: -rw-r--r-- 9,064 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include "StdAfx.h"
// LuaConstGame.cpp: implementation of the LuaConstGame class.
//
//////////////////////////////////////////////////////////////////////
#include "mmgr.h"

#include "LuaConstGame.h"

#include "LuaInclude.h"

#include "LuaUtils.h"
#include "Game/Game.h"
#include "Game/GameSetup.h"
#include "Game/GameVersion.h"
#include "Map/MapDamage.h"
#include "Map/MapInfo.h"
#include "Map/ReadMap.h"
#include "Sim/Misc/ModInfo.h"
#include "Sim/Misc/CategoryHandler.h"
#include "Sim/Misc/DamageArrayHandler.h"
#include "Sim/Misc/Wind.h"
#include "Sim/Units/UnitHandler.h"
#include "Sim/Units/CommandAI/Command.h"
#include "FileSystem/ArchiveScanner.h"
#include "Util.h"


/******************************************************************************/
/******************************************************************************/

static void LuaPushNamedColor(lua_State* L,
                              const string& name, const float3& color)
{
	lua_pushlstring(L, name.c_str(), name.size());
	lua_newtable(L);
	lua_pushnumber(L, color.x); lua_rawseti(L, -2, 1);
	lua_pushnumber(L, color.y); lua_rawseti(L, -2, 2);
	lua_pushnumber(L, color.z); lua_rawseti(L, -2, 3);
	lua_rawset(L, -3);
}


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->GetMapChecksum(mapInfo->map.name));
	LuaPushNamedString(L, "mapChecksum", buf);
	SNPRINTF(buf, sizeof(buf), "0x%08X",
	         archiveScanner->GetModChecksum(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;
}


/******************************************************************************/
/******************************************************************************/