1 // ==============================================================
2 //	This file is part of Glest (www.glest.org)
3 //
4 //	Copyright (C) 2001-2005 Marti�o Figueroa
5 //
6 //	You can redistribute this code and/or modify it under
7 //	the terms of the GNU General Public License as published
8 //	by the Free Software Foundation; either version 2 of the
9 //	License, or (at your option) any later version
10 // ==============================================================
11 
12 #include "script_manager.h"
13 
14 #include "world.h"
15 #include "lang.h"
16 #include "game_camera.h"
17 
18 #include "leak_dumper.h"
19 
20 using namespace Shared::Platform;
21 using namespace Shared::Lua;
22 
23 namespace Glest{ namespace Game{
24 
25 // =====================================================
26 //	class PlayerModifiers
27 // =====================================================
28 
PlayerModifiers()29 PlayerModifiers::PlayerModifiers(){
30 	winner= false;
31 	aiEnabled= true;
32 }
33 
34 // =====================================================
35 //	class ScriptManager
36 // =====================================================
37 
38 ScriptManager* ScriptManager::thisScriptManager= NULL;
39 const int ScriptManager::messageWrapCount= 30;
40 const int ScriptManager::displayTextWrapCount= 64;
41 
init(World * world,GameCamera * gameCamera)42 void ScriptManager::init(World* world, GameCamera *gameCamera){
43 	const Scenario*	scenario= world->getScenario();
44 
45 	this->world= world;
46 	this->gameCamera= gameCamera;
47 
48 	//set static instance
49 	thisScriptManager= this;
50 
51 	//register functions
52 	luaScript.registerFunction(showMessage, "showMessage");
53 	luaScript.registerFunction(setDisplayText, "setDisplayText");
54 	luaScript.registerFunction(clearDisplayText, "clearDisplayText");
55 	luaScript.registerFunction(setCameraPosition, "setCameraPosition");
56 	luaScript.registerFunction(createUnit, "createUnit");
57 	luaScript.registerFunction(giveResource, "giveResource");
58 	luaScript.registerFunction(givePositionCommand, "givePositionCommand");
59 	luaScript.registerFunction(giveProductionCommand, "giveProductionCommand");
60 	luaScript.registerFunction(giveUpgradeCommand, "giveUpgradeCommand");
61 	luaScript.registerFunction(disableAi, "disableAi");
62 	luaScript.registerFunction(setPlayerAsWinner, "setPlayerAsWinner");
63 	luaScript.registerFunction(endGame, "endGame");
64 
65 	luaScript.registerFunction(getStartLocation, "startLocation");
66 	luaScript.registerFunction(getUnitPosition, "unitPosition");
67 	luaScript.registerFunction(getUnitFaction, "unitFaction");
68 	luaScript.registerFunction(getResourceAmount, "resourceAmount");
69 	luaScript.registerFunction(getLastCreatedUnitName, "lastCreatedUnitName");
70 	luaScript.registerFunction(getLastCreatedUnitId, "lastCreatedUnit");
71 	luaScript.registerFunction(getLastDeadUnitName, "lastDeadUnitName");
72 	luaScript.registerFunction(getLastDeadUnitId, "lastDeadUnit");
73 	luaScript.registerFunction(getUnitCount, "unitCount");
74 	luaScript.registerFunction(getUnitCountOfType, "unitCountOfType");
75 
76 
77 	//load code
78 	for(int i= 0; i<scenario->getScriptCount(); ++i){
79 		const Script* script= scenario->getScript(i);
80 		luaScript.loadCode("function " + script->getName() + "()" + script->getCode() + "end\n", script->getName());
81 	}
82 
83 	//setup message box
84 	messageBox.init( Lang::getInstance().get("Ok") );
85 	messageBox.setEnabled(false);
86 
87 	//last created unit
88 	lastCreatedUnitId= -1;
89 	lastDeadUnitId= -1;
90 	gameOver= false;
91 
92 	//call startup function
93 	luaScript.beginCall("startup");
94 	luaScript.endCall();
95 }
96 
97 // ========================== events ===============================================
98 
onMessageBoxOk()99 void ScriptManager::onMessageBoxOk(){
100 	Lang &lang= Lang::getInstance();
101 
102 	if(!messageQueue.empty()){
103 		messageQueue.pop();
104 		if(!messageQueue.empty()){
105 			messageBox.setText(wrapString(lang.getScenarioString(messageQueue.front().getText()), messageWrapCount));
106 			messageBox.setHeader(lang.getScenarioString(messageQueue.front().getHeader()));
107 		}
108 	}
109 }
110 
onResourceHarvested()111 void ScriptManager::onResourceHarvested(){
112 	luaScript.beginCall("resourceHarvested");
113 	luaScript.endCall();
114 }
115 
onUnitCreated(const Unit * unit)116 void ScriptManager::onUnitCreated(const Unit* unit){
117 	lastCreatedUnitName= unit->getType()->getName();
118 	lastCreatedUnitId= unit->getId();
119 	luaScript.beginCall("unitCreated");
120 	luaScript.endCall();
121 	luaScript.beginCall("unitCreatedOfType_"+unit->getType()->getName());
122 	luaScript.endCall();
123 }
124 
onUnitDied(const Unit * unit)125 void ScriptManager::onUnitDied(const Unit* unit){
126 	lastDeadUnitName= unit->getType()->getName();
127 	lastDeadUnitId= unit->getId();
128 	luaScript.beginCall("unitDied");
129 	luaScript.endCall();
130 }
131 
132 // ========================== lua wrappers ===============================================
133 
wrapString(const string & str,int wrapCount)134 string ScriptManager::wrapString(const string &str, int wrapCount){
135 
136 	string returnString;
137 
138 	int letterCount= 0;
139 	for(int i= 0; i<str.size(); ++i){
140 		if(letterCount>wrapCount && str[i]==' '){
141 			returnString+= '\n';
142 			letterCount= 0;
143 		}
144 		else
145 		{
146 			returnString+= str[i];
147 		}
148 		++letterCount;
149 	}
150 
151 	return returnString;
152 }
153 
showMessage(const string & text,const string & header)154 void ScriptManager::showMessage(const string &text, const string &header){
155 	Lang &lang= Lang::getInstance();
156 
157 	messageQueue.push(ScriptManagerMessage(text, header));
158 	messageBox.setEnabled(true);
159 	messageBox.setText(wrapString(lang.getScenarioString(messageQueue.front().getText()), messageWrapCount));
160 	messageBox.setHeader(lang.getScenarioString(messageQueue.front().getHeader()));
161 }
162 
clearDisplayText()163 void ScriptManager::clearDisplayText(){
164 	displayText= "";
165 }
166 
setDisplayText(const string & text)167 void ScriptManager::setDisplayText(const string &text){
168 	displayText= wrapString(Lang::getInstance().getScenarioString(text), displayTextWrapCount);
169 }
170 
setCameraPosition(const Vec2i & pos)171 void ScriptManager::setCameraPosition(const Vec2i &pos){
172 	gameCamera->centerXZ(pos.x, pos.y);
173 }
174 
createUnit(const string & unitName,int factionIndex,Vec2i pos)175 void ScriptManager::createUnit(const string &unitName, int factionIndex, Vec2i pos){
176 	world->createUnit(unitName, factionIndex, pos);
177 }
178 
giveResource(const string & resourceName,int factionIndex,int amount)179 void ScriptManager::giveResource(const string &resourceName, int factionIndex, int amount){
180 	world->giveResource(resourceName, factionIndex, amount);
181 }
182 
givePositionCommand(int unitId,const string & commandName,const Vec2i & pos)183 void ScriptManager::givePositionCommand(int unitId, const string &commandName, const Vec2i &pos){
184 	world->givePositionCommand(unitId, commandName, pos);
185 }
186 
giveProductionCommand(int unitId,const string & producedName)187 void ScriptManager::giveProductionCommand(int unitId, const string &producedName){
188 	world->giveProductionCommand(unitId, producedName);
189 }
190 
giveUpgradeCommand(int unitId,const string & producedName)191 void ScriptManager::giveUpgradeCommand(int unitId, const string &producedName){
192 	world->giveUpgradeCommand(unitId, producedName);
193 }
194 
disableAi(int factionIndex)195 void ScriptManager::disableAi(int factionIndex){
196 	if(factionIndex<GameConstants::maxPlayers){
197 		playerModifiers[factionIndex].disableAi();
198 	}
199 }
200 
setPlayerAsWinner(int factionIndex)201 void ScriptManager::setPlayerAsWinner(int factionIndex){
202 	if(factionIndex<GameConstants::maxPlayers){
203 		playerModifiers[factionIndex].setAsWinner();
204 	}
205 }
206 
endGame()207 void ScriptManager::endGame(){
208 	gameOver= true;
209 }
210 
getStartLocation(int factionIndex)211 Vec2i ScriptManager::getStartLocation(int factionIndex){
212 	return world->getStartLocation(factionIndex);
213 }
214 
215 
getUnitPosition(int unitId)216 Vec2i ScriptManager::getUnitPosition(int unitId){
217 	return world->getUnitPosition(unitId);
218 }
219 
getUnitFaction(int unitId)220 int ScriptManager::getUnitFaction(int unitId){
221 	return world->getUnitFactionIndex(unitId);
222 }
223 
getResourceAmount(const string & resourceName,int factionIndex)224 int ScriptManager::getResourceAmount(const string &resourceName, int factionIndex){
225 	return world->getResourceAmount(resourceName, factionIndex);
226 }
227 
getLastCreatedUnitName()228 const string &ScriptManager::getLastCreatedUnitName(){
229 	return lastCreatedUnitName;
230 }
231 
getLastCreatedUnitId()232 int ScriptManager::getLastCreatedUnitId(){
233 	return lastCreatedUnitId;
234 }
235 
getLastDeadUnitName()236 const string &ScriptManager::getLastDeadUnitName(){
237 	return lastDeadUnitName;
238 }
239 
getLastDeadUnitId()240 int ScriptManager::getLastDeadUnitId(){
241 	return lastDeadUnitId;
242 }
243 
getUnitCount(int factionIndex)244 int ScriptManager::getUnitCount(int factionIndex){
245 	return world->getUnitCount(factionIndex);
246 }
247 
getUnitCountOfType(int factionIndex,const string & typeName)248 int ScriptManager::getUnitCountOfType(int factionIndex, const string &typeName){
249 	return world->getUnitCountOfType(factionIndex, typeName);
250 }
251 
252 // ========================== lua callbacks ===============================================
253 
showMessage(LuaHandle * luaHandle)254 int ScriptManager::showMessage(LuaHandle* luaHandle){
255 	LuaArguments luaArguments(luaHandle);
256 	thisScriptManager->showMessage(luaArguments.getString(-2), luaArguments.getString(-1));
257 	return luaArguments.getReturnCount();
258 }
259 
setDisplayText(LuaHandle * luaHandle)260 int ScriptManager::setDisplayText(LuaHandle* luaHandle){
261 	LuaArguments luaArguments(luaHandle);
262 	thisScriptManager->setDisplayText(luaArguments.getString(-1));
263 	return luaArguments.getReturnCount();
264 }
265 
clearDisplayText(LuaHandle * luaHandle)266 int ScriptManager::clearDisplayText(LuaHandle* luaHandle){
267 	LuaArguments luaArguments(luaHandle);
268 	thisScriptManager->clearDisplayText();
269 	return luaArguments.getReturnCount();
270 }
271 
setCameraPosition(LuaHandle * luaHandle)272 int ScriptManager::setCameraPosition(LuaHandle* luaHandle){
273 	LuaArguments luaArguments(luaHandle);
274 	thisScriptManager->setCameraPosition(Vec2i(luaArguments.getVec2i(-1)));
275 	return luaArguments.getReturnCount();
276 }
277 
createUnit(LuaHandle * luaHandle)278 int ScriptManager::createUnit(LuaHandle* luaHandle){
279 	LuaArguments luaArguments(luaHandle);
280 	thisScriptManager->createUnit(
281 		luaArguments.getString(-3),
282 		luaArguments.getInt(-2),
283 		luaArguments.getVec2i(-1));
284 	return luaArguments.getReturnCount();
285 }
286 
giveResource(LuaHandle * luaHandle)287 int ScriptManager::giveResource(LuaHandle* luaHandle){
288 	LuaArguments luaArguments(luaHandle);
289 	thisScriptManager->giveResource(luaArguments.getString(-3), luaArguments.getInt(-2), luaArguments.getInt(-1));
290 	return luaArguments.getReturnCount();
291 }
292 
givePositionCommand(LuaHandle * luaHandle)293 int ScriptManager::givePositionCommand(LuaHandle* luaHandle){
294 	LuaArguments luaArguments(luaHandle);
295 	thisScriptManager->givePositionCommand(
296 		luaArguments.getInt(-3),
297 		luaArguments.getString(-2),
298 		luaArguments.getVec2i(-1));
299 	return luaArguments.getReturnCount();
300 }
301 
302 
giveProductionCommand(LuaHandle * luaHandle)303 int ScriptManager::giveProductionCommand(LuaHandle* luaHandle){
304 	LuaArguments luaArguments(luaHandle);
305 	thisScriptManager->giveProductionCommand(
306 		luaArguments.getInt(-2),
307 		luaArguments.getString(-1));
308 	return luaArguments.getReturnCount();
309 }
310 
giveUpgradeCommand(LuaHandle * luaHandle)311 int ScriptManager::giveUpgradeCommand(LuaHandle* luaHandle){
312 	LuaArguments luaArguments(luaHandle);
313 	thisScriptManager->giveUpgradeCommand(
314 		luaArguments.getInt(-2),
315 		luaArguments.getString(-1));
316 	return luaArguments.getReturnCount();
317 }
318 
disableAi(LuaHandle * luaHandle)319 int ScriptManager::disableAi(LuaHandle* luaHandle){
320 	LuaArguments luaArguments(luaHandle);
321 	thisScriptManager->disableAi(luaArguments.getInt(-1));
322 	return luaArguments.getReturnCount();
323 }
324 
setPlayerAsWinner(LuaHandle * luaHandle)325 int ScriptManager::setPlayerAsWinner(LuaHandle* luaHandle){
326 	LuaArguments luaArguments(luaHandle);
327 	thisScriptManager->setPlayerAsWinner(luaArguments.getInt(-1));
328 	return luaArguments.getReturnCount();
329 }
330 
endGame(LuaHandle * luaHandle)331 int ScriptManager::endGame(LuaHandle* luaHandle){
332 	LuaArguments luaArguments(luaHandle);
333 	thisScriptManager->endGame();
334 	return luaArguments.getReturnCount();
335 }
336 
getStartLocation(LuaHandle * luaHandle)337 int ScriptManager::getStartLocation(LuaHandle* luaHandle){
338 	LuaArguments luaArguments(luaHandle);
339 	Vec2i pos= thisScriptManager->getStartLocation(luaArguments.getInt(-1));
340 	luaArguments.returnVec2i(pos);
341 	return luaArguments.getReturnCount();
342 }
343 
getUnitPosition(LuaHandle * luaHandle)344 int ScriptManager::getUnitPosition(LuaHandle* luaHandle){
345 	LuaArguments luaArguments(luaHandle);
346 	Vec2i pos= thisScriptManager->getUnitPosition(luaArguments.getInt(-1));
347 	luaArguments.returnVec2i(pos);
348 	return luaArguments.getReturnCount();
349 }
350 
getUnitFaction(LuaHandle * luaHandle)351 int ScriptManager::getUnitFaction(LuaHandle* luaHandle){
352 	LuaArguments luaArguments(luaHandle);
353 	int factionIndex= thisScriptManager->getUnitFaction(luaArguments.getInt(-1));
354 	luaArguments.returnInt(factionIndex);
355 	return luaArguments.getReturnCount();
356 }
357 
getResourceAmount(LuaHandle * luaHandle)358 int ScriptManager::getResourceAmount(LuaHandle* luaHandle){
359 	LuaArguments luaArguments(luaHandle);
360 	luaArguments.returnInt(thisScriptManager->getResourceAmount(luaArguments.getString(-2), luaArguments.getInt(-1)));
361 	return luaArguments.getReturnCount();
362 }
363 
getLastCreatedUnitName(LuaHandle * luaHandle)364 int ScriptManager::getLastCreatedUnitName(LuaHandle* luaHandle){
365 	LuaArguments luaArguments(luaHandle);
366 	luaArguments.returnString(thisScriptManager->getLastCreatedUnitName());
367 	return luaArguments.getReturnCount();
368 }
369 
getLastCreatedUnitId(LuaHandle * luaHandle)370 int ScriptManager::getLastCreatedUnitId(LuaHandle* luaHandle){
371 	LuaArguments luaArguments(luaHandle);
372 	luaArguments.returnInt(thisScriptManager->getLastCreatedUnitId());
373 	return luaArguments.getReturnCount();
374 }
375 
getLastDeadUnitName(LuaHandle * luaHandle)376 int ScriptManager::getLastDeadUnitName(LuaHandle* luaHandle){
377 	LuaArguments luaArguments(luaHandle);
378 	luaArguments.returnString(thisScriptManager->getLastDeadUnitName());
379 	return luaArguments.getReturnCount();
380 }
381 
getLastDeadUnitId(LuaHandle * luaHandle)382 int ScriptManager::getLastDeadUnitId(LuaHandle* luaHandle){
383 	LuaArguments luaArguments(luaHandle);
384 	luaArguments.returnInt(thisScriptManager->getLastDeadUnitId());
385 	return luaArguments.getReturnCount();
386 }
387 
getUnitCount(LuaHandle * luaHandle)388 int ScriptManager::getUnitCount(LuaHandle* luaHandle){
389 	LuaArguments luaArguments(luaHandle);
390 	luaArguments.returnInt(thisScriptManager->getUnitCount(luaArguments.getInt(-1)));
391 	return luaArguments.getReturnCount();
392 }
393 
getUnitCountOfType(LuaHandle * luaHandle)394 int ScriptManager::getUnitCountOfType(LuaHandle* luaHandle){
395 	LuaArguments luaArguments(luaHandle);
396 	luaArguments.returnInt(thisScriptManager->getUnitCountOfType(luaArguments.getInt(-2), luaArguments.getString(-1)));
397 	return luaArguments.getReturnCount();
398 }
399 
400 }}//end namespace
401