diff --git a/Assets/Scripts/Core/player.lua b/Assets/Scripts/Core/player.lua index 8195c91..6e5a1ce 100644 --- a/Assets/Scripts/Core/player.lua +++ b/Assets/Scripts/Core/player.lua @@ -1,106 +1,48 @@ -Player.sizeTaskForce = 5 -Player.trainingStarted = false -Player.taskForceSent = false -Player.buildOrdered = false +Player.numStartEngis = 3 +Player.startedFort = false -function Player:sendTaskForce() - if self.taskForceSent then +function Player:buildFort() + if self.startedFort then return true end - self:deselectUnits() - taskForce = {} + engis = self:getUnitsByClass(UnitClass.ENGINEER, 1) - for i = 1, self:getNumUnits() do - if self:getUnit(i - 1):getUnitClass() == UnitClass.TANK then - taskForce[#taskForce + 1] = self:getUnit(i - 1) - end - end - - if #taskForce >= self.sizeTaskForce then - self.taskForceSent = true - self:selectUnits(taskForce) - self:issueOrder(2, Vector3:new(0, 0, 0), {Target:new(nil, Vector3:new(0, 0, 0))}, false) - return true - else + if #engis == 0 then return false end + + engineer = engis[1] + self:selectUnits({engineer}) + + fort = GameObjectFactory.createUnit(self, UnitId.FORT, engineer:getPos(), Quaternion:new(1, 0, 0, 0), 0) + self:addUnit(fort) + self:issueOrder(1, Vector3:new(0, 0, 0), {Target:new(fort, Vector3:new(0, 0, 0))}, false) + + self.startedFort = true + return true end -function Player:trainTaskForce() - if self.trainingStarted then - return true - end +function Player:trainEngineers() + forts = self:getUnitsByClass(UnitClass.FORT, 1) - landFactory = nil - - for i = 1, self:getNumUnits() do - if self:getUnit(i - 1):getUnitClass() == UnitClass.LAND_FACTORY then - landFactory = self:getUnit(i - 1):toFactory() - break - end - end - - if landFactory ~= nil then - print('Training...') - for i = 1, self.sizeTaskForce do - landFactory:appendToQueue(UnitClass.TANK) - end - - self.trainingStarted = true - return true - else + if #forts == 0 or (#forts > 0 and forts[1]:toFactory():getBuildStatus() < 100) then return false end - -end -function Player:selectEngi() - taskForce = self:getSelectedUnitsByClass(UnitClass.ENGINEER) + fort = forts[1]:toFactory() - if #taskForce == 0 then - for i = 1, self:getNumUnits() do - if self:getUnit(i - 1):getUnitClass() == UnitClass.ENGINEER then - taskForce = {self:getUnit(i - 1)} - self:selectUnits(taskForce) - break - end - end + while #fort:getQueue() + #self:getUnitsByClass(UnitClass.ENGINEER, -1) < self.numStartEngis do + fort:appendToQueue(UnitId.ENGINEER) end - return #taskForce > 0 -end - -function Player:issueBuildOrder() - if self.buildOrdered then - return true - end - - for i = 1, self:getNumUnits() do - if self:getUnit(i - 1):getUnitClass() == UnitClass.LAND_FACTORY then - return true - end - end - - spawnPoint = self:getSpawnPoint() - structure = GameObjectFactory.createUnit(self, UnitId.LAND_FACTORY, spawnPoint, Quaternion:new(1, 0, 0, 0), 0) - self:addUnit(structure) - - self:issueOrder(1, Vector3:new(0, 0, 0), {Target:new(structure, Vector3:new(0, 0, 0))}, false) - self.buildOrdered = true return true end Player.behaviour = { - type = BTNodeType.SELECTOR, + type = BTNodeType.SEQUENCE, children = { - {type = BTNodeType.FUNCTION, func = 'sendTaskForce'}, - {type = BTNodeType.FUNCTION, func = 'trainTaskForce'}, - { - type = BTNodeType.SEQUENCE, children = { - {type = BTNodeType.FUNCTION, func = 'selectEngi'}, - {type = BTNodeType.FUNCTION, func = 'issueBuildOrder'}, - } - } + {type = BTNodeType.FUNCTION, func = 'buildFort'}, + {type = BTNodeType.FUNCTION, func = 'trainEngineers'}, } } diff --git a/activeGameState.cpp b/activeGameState.cpp index 0d9823d..8978eff 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -163,6 +163,16 @@ namespace battleship{ buttons.clear(); } + bool ActiveGameState::selectedUnitsAmongst(vector units){ + vector selUnits = mainPlayer->getSelectedUnits(); + + for(Unit *unit : units) + if(find(selUnits.begin(), selUnits.end(), unit) != selUnits.end()) + return true; + + return false; + } + //TODO fix fog of war for hostile units void ActiveGameState::renderUnits() { vector units; @@ -192,13 +202,13 @@ namespace battleship{ Vector2 pos = u->getScreenPos(); if(buttons.empty()){ - if(!mainPlayer->getSelectedUnitsByClass(UnitClass::ENGINEER).empty()) + if(selectedUnitsAmongst(mainPlayer->getUnitsByClass(UnitClass::ENGINEER))) guiManager->readLuaScreenScript("engineerCommands.lua", buttons, listboxes, checkboxes, sliders, textboxes, guiRects, texts); - else if(!mainPlayer->getSelectedUnitsByClass(UnitClass::FORT).empty()) + else if(selectedUnitsAmongst(mainPlayer->getUnitsByClass(UnitClass::FORT))) guiManager->readLuaScreenScript("fortCommands.lua", buttons, listboxes, checkboxes, sliders, textboxes, guiRects, texts); - else if(!mainPlayer->getSelectedUnitsByClass(UnitClass::LAND_FACTORY).empty()) + else if(selectedUnitsAmongst(mainPlayer->getUnitsByClass(UnitClass::LAND_FACTORY))) guiManager->readLuaScreenScript("landFactoryCommands.lua", buttons, listboxes, checkboxes, sliders, textboxes, guiRects, texts); - else if(!mainPlayer->getSelectedUnitsByClass(UnitClass::NAVAL_FACTORY).empty()) + else if(selectedUnitsAmongst(mainPlayer->getUnitsByClass(UnitClass::NAVAL_FACTORY))) guiManager->readLuaScreenScript("navalFactoryCommands.lua", buttons, listboxes, checkboxes, sliders, textboxes, guiRects, texts); } diff --git a/activeGameState.h b/activeGameState.h index 2298261..35196c4 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -31,6 +31,7 @@ namespace battleship{ inline Player* getPlayer(){return mainPlayer;} inline std::vector& getUnitGroup(int i){return unitGroups[i];} private: + bool selectedUnitsAmongst(std::vector); void updateGameObjHoveredOn(); void initDragbox(); void removeDragbox(); diff --git a/gameManager.cpp b/gameManager.cpp index 699552d..af5cc8b 100755 --- a/gameManager.cpp +++ b/gameManager.cpp @@ -54,6 +54,7 @@ namespace battleship{ SOL_LUA_STATE.new_usertype( "Unit", sol::constructors(), + "getPos", &GameObject::getPos, "getUnitClass", &Unit::getUnitClass, "toEngineer", &Unit::toEngineer, "toPointDefense", &Unit::toPointDefense, @@ -63,6 +64,7 @@ namespace battleship{ SOL_LUA_STATE.new_usertype( "Factory", sol::constructors(), "appendToQueue", &Factory::appendToQueue, + "getBuildStatus", &Structure::getBuildStatus, "getQueue", &Factory::getQueue ); @@ -75,7 +77,8 @@ namespace battleship{ "selectUnits", &Player::selectUnits, "deselectUnits", &Player::deselectUnits, "getSpawnPoint", &Player::getSpawnPoint, - "getSelectedUnitsByClass", &Player::getSelectedUnitsByClass + "getUnitsById", &Player::getUnitsById, + "getUnitsByClass", &Player::getUnitsByClass ); SOL_LUA_STATE.new_usertype( diff --git a/player.cpp b/player.cpp index f7a2be1..57dfca1 100755 --- a/player.cpp +++ b/player.cpp @@ -11,7 +11,7 @@ namespace battleship{ using namespace gameBase; using namespace std; - Player::Player(int diff, int fac, int t, Vector3 col, bool cpuPl, Vector3 sp, string n) : difficulty(diff), faction(fac), team(t), color(col), cpuPlayer(cpuPl), spawnPoint(sp), name(n) {} + Player::Player(int diff, int fac, int t, Vector3 col, bool cpuPl, Vector3 sp, string n) : difficulty(diff), faction(fac), team(t), color(col), cpuPlayer(cpuPl), spawnPoint(sp), name(n), refineds(10000) {} Player::~Player() {} @@ -144,20 +144,39 @@ namespace battleship{ projectiles.erase(projectiles.begin() + id); } - vector Player::getSelectedUnitsByClass(UnitClass uc){ - vector selectedUnits = getSelectedUnits(), unitsByClass; - - for(Unit *u : selectedUnits) - if(u->getUnitClass() == uc) - unitsByClass.push_back(u); - - return unitsByClass; + void Player::selectUnits(vector selUnits){ + for(Unit *u : selUnits) + if(find(selectedUnits.begin(), selectedUnits.end(), u) == selectedUnits.end()){ + selectedUnits.push_back(u); + u->select(); + } } - void Player::selectUnits(vector selUnits){ - for(Unit *u : selUnits){ - selectedUnits.push_back(u); - u->select(); + vector Player::getUnitsById(int id, int numUnits){ + vector idUnits; + + for(Unit *unit : units){ + if(numUnits != -1 && idUnits.size() == numUnits) + break; + + if(unit->getId() == id) + idUnits.push_back(unit); } + + return idUnits; + } + + vector Player::getUnitsByClass(UnitClass uc, int numUnits){ + vector ucUnits; + + for(Unit *unit : units){ + if(numUnits != -1 && ucUnits.size() == numUnits) + break; + + if(unit->getUnitClass() == uc) + ucUnits.push_back(unit); + } + + return ucUnits; } } diff --git a/player.h b/player.h index a1b39f3..a5af80b 100755 --- a/player.h +++ b/player.h @@ -22,8 +22,9 @@ namespace battleship{ void removeProjectile(int); void removeProjectile(Projectile*); bool isThisPlayersUnit(GameObject*); - std::vector getSelectedUnitsByClass(UnitClass); void selectUnits(std::vector); + std::vector getUnitsById(int, int = -1); + std::vector getUnitsByClass(UnitClass, int = -1); inline void deselectUnits(){selectedUnits.clear();} inline Unit* getSelectedUnit(int id){return selectedUnits[id];} inline std::vector getSelectedUnits(){return selectedUnits;} diff --git a/trainButton.cpp b/trainButton.cpp index 3bb3ab1..436c84c 100644 --- a/trainButton.cpp +++ b/trainButton.cpp @@ -19,9 +19,10 @@ namespace battleship{ ActiveGameState *activeState = (ActiveGameState*)(GameManager::getSingleton()->getStateManager()->getAppStateByType((int)AppStateType::ACTIVE_STATE)); Player *player = activeState->getPlayer(); UnitClass facClass = (UnitClass)generateView()["units"][factoryId + 1]["unitClass"]; - vector factories = player->getSelectedUnitsByClass(facClass); + vector selUnits = player->getSelectedUnits(), factories = player->getUnitsByClass(facClass); for(Unit *fac : factories) - ((Factory*)fac)->appendToQueue(trainableUnitId); + if(find(selUnits.begin(), selUnits.end(), fac) != selUnits.end()) + ((Factory*)fac)->appendToQueue(trainableUnitId); } }