From c02c90427ba8159d79e8d76296ccc2ea843e6e94 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Fri, 30 Mar 2012 07:10:14 +0000 Subject: [PATCH] - added some more lua commands: vector getUnitsForFaction(factionIndex,commandTypeName, field) int getUnitCurrentField(unitId) --- source/glest_game/game/script_manager.cpp | 60 +++++++++----------- source/glest_game/game/script_manager.h | 6 ++ source/glest_game/world/world.cpp | 57 +++++++++++++++++++ source/glest_game/world/world.h | 2 + source/shared_lib/include/lua/lua_script.h | 1 + source/shared_lib/sources/lua/lua_script.cpp | 13 +++++ 6 files changed, 106 insertions(+), 33 deletions(-) diff --git a/source/glest_game/game/script_manager.cpp b/source/glest_game/game/script_manager.cpp index 5db9b9cf9..1e4ef1e4b 100644 --- a/source/glest_game/game/script_manager.cpp +++ b/source/glest_game/game/script_manager.cpp @@ -324,6 +324,9 @@ void ScriptManager::init(World* world, GameCamera *gameCamera, const XmlNode *ro luaScript.registerFunction(loadScenario, "loadScenario"); + luaScript.registerFunction(getUnitsForFaction, "getUnitsForFaction"); + luaScript.registerFunction(getUnitCurrentField, "getUnitCurrentField"); + //load code for(int i= 0; igetScriptCount(); ++i){ const Script* script= scenario->getScript(i); @@ -1294,45 +1297,24 @@ const string ScriptManager::getPlayerName(int factionIndex) { } void ScriptManager::loadScenario(const string &name, bool keepFactions) { - //printf("[%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__); - if(SystemFlags::getSystemSettingType(SystemFlags::debugLUA).enabled) SystemFlags::OutputDebug(SystemFlags::debugLUA,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); ScriptManager_STREFLOP_Wrapper streflopWrapper; world->setQueuedScenario(name,keepFactions); -/* - vector results; - const vector &dirList = Config::getInstance().getPathListForType(ptScenarios); - //findDirs(dirList, results); - string scenarioFile = Scenario::getScenarioPath(dirList, name); +} - //printf("\nname [%s] scenarioFile [%s] results.size() = %lu\n",name.c_str(),scenarioFile.c_str(),results.size()); +vector ScriptManager::getUnitsForFaction(int factionIndex,const string& commandTypeName, int field) { + if(SystemFlags::getSystemSettingType(SystemFlags::debugLUA).enabled) SystemFlags::OutputDebug(SystemFlags::debugLUA,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + ScriptManager_STREFLOP_Wrapper streflopWrapper; - //printf("[%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__); - ScenarioInfo scenarioInfo; - Scenario::loadScenarioInfo(scenarioFile, &scenarioInfo); + return world->getUnitsForFaction(factionIndex,commandTypeName, field); +} - //printf("[%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__); - GameSettings gameSettings; - Scenario::loadGameSettings(dirList,&scenarioInfo, &gameSettings, scenarioFile); +int ScriptManager::getUnitCurrentField(int unitId) { + if(SystemFlags::getSystemSettingType(SystemFlags::debugLUA).enabled) SystemFlags::OutputDebug(SystemFlags::debugLUA,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + ScriptManager_STREFLOP_Wrapper streflopWrapper; - //Program *program = world->getGame()->getProgram(); - //program->setState(new Game(program, &gameSettings, false)); - - //world->end(); - world->getGame()->setGameSettings(&gameSettings); - //world->getMapPtr()->end(); - world->end(); - world->clearTileset(); - world->getGame()->load(); - world->getGame()->init(); - - //printf("[%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__); - //Checksum checksum; - //world->loadScenario(scenarioFile, &checksum, true); - - //printf("[%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__); - */ + return world->getUnitCurrentField(unitId); } // ========================== lua callbacks =============================================== @@ -2095,13 +2077,25 @@ int ScriptManager::getGameWon(LuaHandle* luaHandle){ } int ScriptManager::loadScenario(LuaHandle* luaHandle) { - //printf("[%s:%s] Line: %d\n",__FILE__,__FUNCTION__,__LINE__); - LuaArguments luaArguments(luaHandle); thisScriptManager->loadScenario(luaArguments.getString(-2),luaArguments.getInt(-1)); return luaArguments.getReturnCount(); } +int ScriptManager::getUnitsForFaction(LuaHandle* luaHandle) { + LuaArguments luaArguments(luaHandle); + vector units= thisScriptManager->getUnitsForFaction(luaArguments.getInt(-3),luaArguments.getString(-2), luaArguments.getInt(-1)); + luaArguments.returnVectorInt(units); + return luaArguments.getReturnCount(); + +} + +int ScriptManager::getUnitCurrentField(LuaHandle* luaHandle) { + LuaArguments luaArguments(luaHandle); + luaArguments.returnInt(thisScriptManager->getUnitCurrentField(luaArguments.getInt(-1))); + return luaArguments.getReturnCount(); +} + void ScriptManager::saveGame(XmlNode *rootNode) { std::map mapTagReplacements; XmlNode *scriptManagerNode = rootNode->addChild("ScriptManager"); diff --git a/source/glest_game/game/script_manager.h b/source/glest_game/game/script_manager.h index 12bc57f76..c8da5990f 100644 --- a/source/glest_game/game/script_manager.h +++ b/source/glest_game/game/script_manager.h @@ -316,6 +316,9 @@ private: const string getSystemMacroValue(const string &key); const string getPlayerName(int factionIndex); + vector getUnitsForFaction(int factionIndex,const string& commandTypeName, int field); + int getUnitCurrentField(int unitId); + void loadScenario(const string &name, bool keepFactions); //callbacks, commands @@ -415,6 +418,9 @@ private: static int scenarioDir(LuaHandle* luaHandle); static int loadScenario(LuaHandle* luaHandle); + + static int getUnitsForFaction(LuaHandle* luaHandle); + static int getUnitCurrentField(LuaHandle* luaHandle); }; }}//end namespace diff --git a/source/glest_game/world/world.cpp b/source/glest_game/world/world.cpp index 17eb32769..2567a46d2 100644 --- a/source/glest_game/world/world.cpp +++ b/source/glest_game/world/world.cpp @@ -926,6 +926,63 @@ void World::giveResource(const string &resourceName, int factionIndex, int amoun } } +int World::getUnitCurrentField(int unitId) { + int field = -1; + if(SystemFlags::getSystemSettingType(SystemFlags::debugLUA).enabled) SystemFlags::OutputDebug(SystemFlags::debugLUA,"In [%s::%s Line: %d] unit [%d]\n",__FILE__,__FUNCTION__,__LINE__,unitId); + Unit* unit= findUnitById(unitId); + if(unit != NULL) { + field = unit->getCurrField(); + } + + return field; +} + +vector World::getUnitsForFaction(int factionIndex,const string& commandTypeName, int field) { + vector units; + + if(factionIndex < 0 || factionIndex > getFactionCount()) { + throw runtime_error("Invalid faction index in getUnitsForFaction: " + intToStr(factionIndex)); + } + Faction *faction = getFaction(factionIndex); + if(faction != NULL) { + CommandType *commandType = NULL; + if(commandTypeName != "") { + commandType = CommandTypeFactory::getInstance().newInstance(commandTypeName); + } + int unitCount = faction->getUnitCount(); + for(int i = 0; i < unitCount; ++i) { + Unit *unit = faction->getUnit(i); + if(unit != NULL) { + bool addToList = true; + if(commandType != NULL) { + if(commandType->getClass() == ccAttack && field >= 0) { + const AttackCommandType *act = unit->getType()->getFirstAttackCommand(static_cast(field)); + addToList = (act != NULL); + } + else if(commandType->getClass() == ccAttackStopped && field >= 0) { + const AttackStoppedCommandType *asct = unit->getType()->getFirstAttackStoppedCommand(static_cast(field)); + addToList = (asct != NULL); + } + else { + addToList = unit->getType()->hasCommandClass(commandType->getClass()); + } + } + else if(field >= 0) { + addToList = (unit->getCurrField() == static_cast(field)); + } + + if(addToList == true) { + units.push_back(unit->getId()); + } + } + } + + delete commandType; + commandType = NULL; + } + return units; +} + void World::givePositionCommand(int unitId, const string &commandName, const Vec2i &pos) { Unit* unit= findUnitById(unitId); if(unit != NULL) { diff --git a/source/glest_game/world/world.h b/source/glest_game/world/world.h index 4d6cfad75..7f5e36be5 100644 --- a/source/glest_game/world/world.h +++ b/source/glest_game/world/world.h @@ -220,6 +220,8 @@ public: void morphToUnit(int unitId,const string &morphName,bool ignoreRequirements); void createUnit(const string &unitName, int factionIndex, const Vec2i &pos,bool spaciated = true); void givePositionCommand(int unitId, const string &commandName, const Vec2i &pos); + vector getUnitsForFaction(int factionIndex,const string& commandTypeName,int field); + int getUnitCurrentField(int unitId); void giveAttackCommand(int unitId, int unitToAttackId); void giveProductionCommand(int unitId, const string &producedName); void giveUpgradeCommand(int unitId, const string &upgradeName); diff --git a/source/shared_lib/include/lua/lua_script.h b/source/shared_lib/include/lua/lua_script.h index b47719457..e75c6e722 100644 --- a/source/shared_lib/include/lua/lua_script.h +++ b/source/shared_lib/include/lua/lua_script.h @@ -80,6 +80,7 @@ public: void returnInt(int value); void returnString(const string &value); void returnVec2i(const Vec2i &value); + void returnVectorInt(const vector &value); private: void throwLuaError(const string &message) const; diff --git a/source/shared_lib/sources/lua/lua_script.cpp b/source/shared_lib/sources/lua/lua_script.cpp index 916aa0c7b..7ff0f94b9 100644 --- a/source/shared_lib/sources/lua/lua_script.cpp +++ b/source/shared_lib/sources/lua/lua_script.cpp @@ -614,6 +614,19 @@ void LuaArguments::returnVec2i(const Vec2i &value){ lua_rawseti(luaState, -2, 2); } +void LuaArguments::returnVectorInt(const vector &value) { + //Lua_STREFLOP_Wrapper streflopWrapper; + + ++returnCount; + + lua_newtable(luaState); + + for(unsigned int i = 0; i < value.size(); ++i) { + lua_pushnumber(luaState, value[i]); + lua_rawseti(luaState, -2, i+1); + } +} + void LuaArguments::throwLuaError(const string &message) const{ Lua_STREFLOP_Wrapper streflopWrapper;