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