diff --git a/Assets/Scripts/Core/player.lua b/Assets/Scripts/Core/player.lua index cf4ba0f..748e28e 100644 --- a/Assets/Scripts/Core/player.lua +++ b/Assets/Scripts/Core/player.lua @@ -38,7 +38,7 @@ function Player:trainEngineers() dirToCenter = Vector3:new(0, 0, 0):subtr(fort:getPos()):norm() while #fort:getQueue() + #self:getUnitsByClass(UnitClass.ENGINEER, -1) < self.numStartEngis do - fort:appendToQueue(UnitId.ENGINEER) + fort:appendToQueue(0) end return #self:getUnitsByClass(UnitClass.ENGINEER, -1) == self.numStartEngis @@ -132,7 +132,7 @@ function Player:buildHarvester() factory = landFactories[1]:toFactory() if #factory:getQueue() == 0 then - factory:appendToQueue(UnitId.RESOURCE_ROVER) + factory:appendToQueue(3) end return false @@ -157,10 +157,10 @@ function Player:startHarvesting() return true end -function Player:buildTaskforceUnitGroup(numUnits, currNumUnits, factory, unitId) +function Player:buildTaskforceUnitGroup(numUnits, currNumUnits, factory, buId) if currNumUnits < numUnits then for i = 1, numUnits - currNumUnits do - factory:appendToQueue(unitId) + factory:appendToQueue(buId) end end end @@ -175,9 +175,9 @@ function Player:buildTaskforce() currLandFactories = self:getUnitsByClass(UnitClass.LAND_FACTORY, -1) for i = 1, #currLandFactories do - currNumWarMechs = currNumWarMechs + currLandFactories[i]:toFactory():getNumQueueUnitsById(UnitId.WAR_MECH) - currNumTanks = currNumTanks + currLandFactories[i]:toFactory():getNumQueueUnitsById(UnitId.TANK) - currNumArtillery = currNumArtillery + currLandFactories[i]:toFactory():getNumQueueUnitsById(UnitId.ARTILLERY) + currNumWarMechs = currNumWarMechs + currLandFactories[i]:toFactory():getNumQueueUnitsById(0) + currNumTanks = currNumTanks + currLandFactories[i]:toFactory():getNumQueueUnitsById(1) + currNumArtillery = currNumArtillery + currLandFactories[i]:toFactory():getNumQueueUnitsById(2) end numWarMechs = self.numDefWarMechs + self.numTaskForceWarMechs @@ -190,9 +190,9 @@ function Player:buildTaskforce() landFactory = currLandFactories[1]:toFactory() - self:buildTaskforceUnitGroup(numWarMechs, currNumWarMechs, landFactory, UnitId.WAR_MECH) - self:buildTaskforceUnitGroup(numTanks, currNumTanks, landFactory, UnitId.TANK) - self:buildTaskforceUnitGroup(numArtillery, currNumArtillery, landFactory, UnitId.ARTILLERY) + self:buildTaskforceUnitGroup(numWarMechs, currNumWarMechs, landFactory, 0) + self:buildTaskforceUnitGroup(numTanks, currNumTanks, landFactory, 1) + self:buildTaskforceUnitGroup(numArtillery, currNumArtillery, landFactory, 2) return false end diff --git a/Assets/Scripts/GameObjects/Units/unitData.lua b/Assets/Scripts/GameObjects/Units/unitData.lua index 364ee66..27d0022 100644 --- a/Assets/Scripts/GameObjects/Units/unitData.lua +++ b/Assets/Scripts/GameObjects/Units/unitData.lua @@ -73,6 +73,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 1 }, { @@ -96,6 +97,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 2 }, { @@ -119,12 +121,21 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 2 }, { weapons = { {type = WeaponClass.HITSCAN, rateOfFire = 2000, fireSfx = PATH .. 'Sounds/Units/WarMechs/fire.ogg', damage = 20, maxRange = 8}, }, + buildableUnits = { + {id = UnitId.LAND_FACTORY, buildable = true}, + {id = UnitId.NAVAL_FACTORY, buildable = true}, + {id = UnitId.MARKET, buildable = true}, + {id = UnitId.LAB, buildable = true}, + {id = UnitId.POINT_DEFENSE, buildable = true}, + {id = UnitId.FORT, buildable = true}, + }, unitClass = UnitClass.ENGINEER, unitType = UnitType.HOVER, armor = {ArmorType.MECHANIC}, @@ -140,6 +151,7 @@ units = { name = 'Engineer', basePath = PATH .. vehiclePrefix .. 'Engineers/', meshPath = 'engineer.xml', + guiScreen = 'engineerCommands.lua', selectionSfx = PATH .. 'Sounds/Units/Engineers/selection.ogg', deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg', speed = .1, @@ -169,6 +181,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { @@ -193,6 +206,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { @@ -219,6 +233,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { @@ -242,6 +257,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { @@ -266,6 +282,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { @@ -289,6 +306,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { @@ -312,6 +330,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { @@ -334,6 +353,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { @@ -365,6 +385,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { @@ -403,6 +424,7 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { @@ -434,9 +456,16 @@ units = { destinationOffset = .1, anglePrecision = .1, maxTurnAngle = .1, + guiScreen = '', garrisonCategory = 3 }, { + buildableUnits = { + {id = UnitId.WAR_MECH, buildable = true}, + {id = UnitId.TANK, buildable = true}, + {id = UnitId.ARTILLERY, buildable = true}, + {id = UnitId.RESOURCE_ROVER, buildable = true} + }, unitClass = UnitClass.LAND_FACTORY, unitType = UnitType.LAND, isVehicle = false, @@ -449,6 +478,7 @@ units = { name = 'Land factory', basePath = PATH .. structurePrefix .. 'LandFactories/', meshPath = 'landFactory.xml', + guiScreen = 'landFactoryCommands.lua', selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg', deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg', }, @@ -465,6 +495,7 @@ units = { name = 'Naval factory', basePath = PATH .. structurePrefix .. 'NavalFactories/', meshPath = 'navalFactory.xml', + guiScreen = 'navalFactoryCommands.lua', selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg', deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg', }, @@ -482,6 +513,7 @@ units = { basePath = PATH .. structurePrefix .. 'Markets/', meshPath = 'market.xml', selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg', + guiScreen = '', deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg', }, { @@ -500,6 +532,7 @@ units = { name = 'Lab', basePath = PATH .. structurePrefix .. 'Labs/', meshPath = 'lab.xml', + guiScreen = '', selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg', deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg', }, @@ -518,6 +551,7 @@ units = { basePath = PATH .. structurePrefix .. 'PointDefenses/', meshPath = 'pointDefense.xml', selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg', + guiScreen = '', deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg', }, { @@ -536,6 +570,7 @@ units = { basePath = PATH .. structurePrefix .. 'Extractors/', meshPath = 'extractor.xml', selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg', + guiScreen = '', deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg', }, { @@ -551,10 +586,12 @@ units = { name = 'Refinery', basePath = PATH .. structurePrefix .. 'Refineries/', meshPath = 'refinery.xml', + guiScreen = '', selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg', deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg', }, { + buildableUnits = {{id = UnitId.ENGINEER, buildable = true}}, unitClass = UnitClass.FORT, unitType = UnitType.LAND, isVehicle = false, @@ -567,6 +604,7 @@ units = { name = 'Fort', basePath = PATH .. structurePrefix .. 'Forts/', meshPath = 'fort.xml', + guiScreen = 'fortCommands.lua', selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg', deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg', }, diff --git a/Assets/Scripts/Gui/engineerCommands.lua b/Assets/Scripts/Gui/engineerCommands.lua index 8fe31c5..d9cd565 100644 --- a/Assets/Scripts/Gui/engineerCommands.lua +++ b/Assets/Scripts/Gui/engineerCommands.lua @@ -9,7 +9,6 @@ gui = { guiType = GuiType.BUTTON, buttonType = ButtonType.BUILD, trigger = 76, - structureId = UnitId.LAND_FACTORY }, { pos = {x = res.x - Size.x - 200, y = res.y - 200}, @@ -18,7 +17,6 @@ gui = { guiType = GuiType.BUTTON, buttonType = ButtonType.BUILD, trigger = 78, - structureId = UnitId.NAVAL_FACTORY }, { pos = {x = res.x - 2 * Size.x - 200, y = res.y - 200}, @@ -27,7 +25,6 @@ gui = { guiType = GuiType.BUTTON, buttonType = ButtonType.BUILD, trigger = 77, - structureId = UnitId.MARKET }, { pos = {x = res.x - 3 * Size.x - 200, y = res.y - 200}, @@ -36,7 +33,6 @@ gui = { guiType = GuiType.BUTTON, buttonType = ButtonType.BUILD, trigger = 84, - structureId = UnitId.LAB }, { pos = {x = res.x - 4 * Size.x - 200, y = res.y - 200}, @@ -45,7 +41,6 @@ gui = { guiType = GuiType.BUTTON, buttonType = ButtonType.BUILD, trigger = 68, - structureId = UnitId.POINT_DEFENSE }, { pos = {x = res.x - 5 * Size.x - 200, y = res.y - 200}, @@ -54,6 +49,5 @@ gui = { guiType = GuiType.BUTTON, buttonType = ButtonType.BUILD, trigger = 70, - structureId = UnitId.FORT }, } diff --git a/Assets/Scripts/Gui/fortCommands.lua b/Assets/Scripts/Gui/fortCommands.lua index a9f985e..2600775 100644 --- a/Assets/Scripts/Gui/fortCommands.lua +++ b/Assets/Scripts/Gui/fortCommands.lua @@ -8,7 +8,6 @@ gui = { imagePath = '', guiType = GuiType.BUTTON, buttonType = ButtonType.FORT_TRAIN, - trigger = 82, - unitId = UnitId.ENGINEER + trigger = 82 }, } diff --git a/Assets/Scripts/Gui/landFactoryCommands.lua b/Assets/Scripts/Gui/landFactoryCommands.lua index abece5c..8ad889f 100644 --- a/Assets/Scripts/Gui/landFactoryCommands.lua +++ b/Assets/Scripts/Gui/landFactoryCommands.lua @@ -1,4 +1,3 @@ -numGui = 2 res = graphics.resolution Size = {x = 100, y = 100} @@ -9,8 +8,7 @@ gui = { imagePath = '', guiType = GuiType.BUTTON, buttonType = ButtonType.LAND_FACTORY_TRAIN, - trigger = 84, - unitId = UnitId.TANK + trigger = 87 }, { pos = {x = res.x - Size.x - 200, y = res.y - 200}, @@ -18,7 +16,14 @@ gui = { imagePath = '', guiType = GuiType.BUTTON, buttonType = ButtonType.LAND_FACTORY_TRAIN, - trigger = 65, - unitId = UnitId.ARTILLERY + trigger = 84 + }, + { + pos = {x = res.x - 2 * Size.x - 200, y = res.y - 200}, + size = Size, + imagePath = '', + guiType = GuiType.BUTTON, + buttonType = ButtonType.LAND_FACTORY_TRAIN, + trigger = 65 } } diff --git a/Assets/Scripts/Gui/navalFactoryCommands.lua b/Assets/Scripts/Gui/navalFactoryCommands.lua index 2ffedbd..652031d 100644 --- a/Assets/Scripts/Gui/navalFactoryCommands.lua +++ b/Assets/Scripts/Gui/navalFactoryCommands.lua @@ -1,4 +1,3 @@ -numGui = 1 res = graphics.resolution gui = { @@ -8,7 +7,6 @@ gui = { imagePath = '', guiType = GuiType.BUTTON, buttonType = ButtonType.NAVAL_FACTORY_TRAIN, - trigger = 66, - unitId = UnitId.SCOUT_TRANSPORT + trigger = 66 } } diff --git a/activeGameState.cpp b/activeGameState.cpp index 4692a9f..8cbdb43 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -161,6 +161,7 @@ namespace battleship{ ConcreteGuiManager::getSingleton()->removeAllButtons(); buttons.clear(); + unitGuiScreen = ""; } bool ActiveGameState::selectedUnitsAmongst(vector units){ @@ -193,6 +194,7 @@ namespace battleship{ guiManager->getText("wealth"), guiManager->getText("research") }; + vector selUnits = mainPlayer->getSelectedUnits(); for (Unit *u : units) { @@ -200,16 +202,11 @@ namespace battleship{ Vector3 dragboxSize = ((Quad*)dragboxNode->getMesh(0))->getSize(); Vector3 dragboxOrigin = dragboxNode->getPosition(), dragboxEnd = dragboxOrigin + dragboxSize; Vector2 pos = u->getScreenPos(); + string guiScreen = u->getBuildableUnitGuiScreen(); - if(buttons.empty()){ - if(selectedUnitsAmongst(mainPlayer->getUnitsByClass(UnitClass::ENGINEER))) - guiManager->readLuaScreenScript("engineerCommands.lua", buttons, listboxes, checkboxes, sliders, textboxes, guiRects, texts); - else if(selectedUnitsAmongst(mainPlayer->getUnitsByClass(UnitClass::FORT))) - guiManager->readLuaScreenScript("fortCommands.lua", buttons, listboxes, checkboxes, sliders, textboxes, guiRects, texts); - else if(selectedUnitsAmongst(mainPlayer->getUnitsByClass(UnitClass::LAND_FACTORY))) - guiManager->readLuaScreenScript("landFactoryCommands.lua", buttons, listboxes, checkboxes, sliders, textboxes, guiRects, texts); - else if(selectedUnitsAmongst(mainPlayer->getUnitsByClass(UnitClass::NAVAL_FACTORY))) - guiManager->readLuaScreenScript("navalFactoryCommands.lua", buttons, listboxes, checkboxes, sliders, textboxes, guiRects, texts); + if(!selUnits.empty() && u == selUnits[0] && guiScreen != "" && guiScreen != unitGuiScreen){ + guiManager->readLuaScreenScript(u->getBuildableUnitGuiScreen(), buttons, listboxes, checkboxes, sliders, textboxes, guiRects, texts); + unitGuiScreen = guiScreen; } if(isSelectionBox && fabs(pos.x - dragboxOrigin.x) < .5 * dragboxSize.x && fabs(pos.y - dragboxOrigin.y) < .5 * dragboxSize.y){ diff --git a/activeGameState.h b/activeGameState.h index 1b01121..6de8d1b 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -47,6 +47,7 @@ namespace battleship{ GuiAppState *guiState; Player *mainPlayer; + std::string unitGuiScreen = ""; GameObject *gameObjHoveredOn = nullptr; vb01::Node *dragboxNode = nullptr; vb01::Vector2 clickPoint; diff --git a/buildButton.cpp b/buildButton.cpp index e36c9ec..29f57e0 100644 --- a/buildButton.cpp +++ b/buildButton.cpp @@ -1,8 +1,12 @@ #include "buildButton.h" #include "gameManager.h" #include "gameObject.h" +#include "unit.h" +#include "activeGameState.h" +#include "buildableUnit.h" #include "gameObjectFrameController.h" +#include #include namespace battleship{ @@ -12,13 +16,18 @@ namespace battleship{ using namespace vb01Gui; using namespace gameBase; - BuildButton::BuildButton(Vector2 pos, Vector2 size, int structureId, string name, int trigger, string imagePath) : UnitButton(pos, size, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", trigger, imagePath){ - this->structureId = structureId; - } + BuildButton::BuildButton(Vector2 pos, Vector2 size, string name, int trigger, string imagePath, int uid, int slId) : + UnitButton(pos, size, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", trigger, imagePath, uid), slotId(slId){} void BuildButton::onClick(){ - GameObjectFrameController *ufCtr = GameObjectFrameController::getSingleton(); - ufCtr->addGameObjectFrame(GameObjectFrame(structureId, GameObject::Type::UNIT)); - ufCtr->setPlacingFrames(true); + ActiveGameState *activeState = (ActiveGameState*)(GameManager::getSingleton()->getStateManager()->getAppStateByType((int)AppStateType::ACTIVE_STATE)); + Player *player = activeState->getPlayer(); + Unit* builder = player->getUnitsById(unitId)[0]; + + if(builder->getBuildableUnit(slotId).buildable){ + GameObjectFrameController *ufCtr = GameObjectFrameController::getSingleton(); + ufCtr->addGameObjectFrame(GameObjectFrame(builder->getBuildableUnit(slotId).id, GameObject::Type::UNIT)); + ufCtr->setPlacingFrames(true); + } } } diff --git a/buildButton.h b/buildButton.h index ae4802b..b4cd97b 100644 --- a/buildButton.h +++ b/buildButton.h @@ -6,10 +6,10 @@ namespace battleship{ class BuildButton : public UnitButton{ public: - BuildButton(vb01::Vector2, vb01::Vector2, int, std::string, int, std::string); + BuildButton(vb01::Vector2, vb01::Vector2, std::string, int, std::string, int, int); void onClick(); private: - int structureId; + int slotId; }; } diff --git a/concreteGuiManager.cpp b/concreteGuiManager.cpp index b48b393..404e6ba 100644 --- a/concreteGuiManager.cpp +++ b/concreteGuiManager.cpp @@ -163,30 +163,34 @@ namespace battleship{ } case BUILD: { - int strId = guiTable["structureId"]; + int unitId = SOL_LUA_STATE["UnitId"]["ENGINEER"]; + int strId = SOL_LUA_STATE["units"][unitId + 1]["buildableUnits"][guiId + 1]["id"]; string buttonName = SOL_LUA_STATE["units"][strId + 1]["name"]; - button = new BuildButton(pos, size, strId, buttonName, (int)guiTable["trigger"], (string)guiTable["imagePath"]); + button = new BuildButton(pos, size, buttonName, (int)guiTable["trigger"], (string)guiTable["imagePath"], unitId, guiId); break; } case LAND_FACTORY_TRAIN: { - int unitId = guiTable["unitId"]; + int facId = SOL_LUA_STATE["UnitId"]["LAND_FACTORY"]; + int unitId = SOL_LUA_STATE["units"][facId + 1]["buildableUnits"][guiId + 1]["id"]; string buttonName = SOL_LUA_STATE["units"][unitId + 1]["name"]; - button = new TrainButton(pos, size, buttonName, (int)guiTable["trigger"], (string)guiTable["imagePath"], (int)SOL_LUA_STATE["UnitId"]["LAND_FACTORY"], unitId); + button = new TrainButton(pos, size, buttonName, (int)guiTable["trigger"], (string)guiTable["imagePath"], facId, guiId); break; } case NAVAL_FACTORY_TRAIN: { - int unitId = guiTable["unitId"]; + int facId = SOL_LUA_STATE["UnitId"]["NAVAL_FACTORY"]; + int unitId = SOL_LUA_STATE["units"][facId + 1]["buildableUnits"][guiId + 1]["id"]; string buttonName = SOL_LUA_STATE["units"][unitId + 1]["name"]; - button = new TrainButton(pos, size, buttonName, (int)guiTable["trigger"], (string)guiTable["imagePath"], (int)SOL_LUA_STATE["UnitId"]["NAVAL_FACTORY"], unitId); + button = new TrainButton(pos, size, buttonName, (int)guiTable["trigger"], (string)guiTable["imagePath"], facId, guiId); break; } case FORT_TRAIN: { - int unitId = guiTable["unitId"]; + int facId = SOL_LUA_STATE["UnitId"]["FORT"]; + int unitId = SOL_LUA_STATE["units"][facId + 1]["buildableUnits"][guiId + 1]["id"]; string buttonName = SOL_LUA_STATE["units"][unitId + 1]["name"]; - button = new TrainButton(pos, size, buttonName, (int)guiTable["trigger"], (string)guiTable["imagePath"], (int)SOL_LUA_STATE["UnitId"]["FORT"], unitId); + button = new TrainButton(pos, size, buttonName, (int)guiTable["trigger"], (string)guiTable["imagePath"], facId, guiId); break; } case STATISTICS: diff --git a/factory.cpp b/factory.cpp index 4554904..0c02245 100644 --- a/factory.cpp +++ b/factory.cpp @@ -1,5 +1,6 @@ #include "factory.h" #include "player.h" +#include "game.h" #include "gameObjectFactory.h" #include "activeGameState.h" @@ -24,6 +25,14 @@ namespace battleship{ train(); } + //TODO replace repetetive string literals + void Factory::initProperties(){ + Structure::initProperties(); + Game *game = Game::getSingleton(); + vector currTechs = player->getTechnologies(); + + } + int Factory::getNumQueueUnitsById(int unitId){ int numUnits = 0; @@ -34,6 +43,11 @@ namespace battleship{ return numUnits; } + void Factory::appendToQueue(int buId){ + if(buId < buildableUnits.size() && buildableUnits[buId].buildable) + unitQueue.push_back(buildableUnits[buId].id); + } + void Factory::train(){ bool training = !unitQueue.empty(); buildStatusForeground->setVisible(training); diff --git a/factory.h b/factory.h index 851ae22..586eab8 100644 --- a/factory.h +++ b/factory.h @@ -19,14 +19,14 @@ namespace battleship{ ~Factory(){} void update(); int getNumQueueUnitsById(int); - void appendToQueue(int uid){unitQueue.push_back(uid);} + void appendToQueue(int); inline std::vector getQueue(){return unitQueue;} private: - const int MAX_LEN_QUEUE = 10; - int trainingStatus = 0; - vb01::s64 lastTrainTime = 0; std::vector unitQueue; + int maxLenQueue, trainingStatus = 0; + vb01::s64 lastTrainTime = 0; + void initProperties(); void train(); }; } diff --git a/trainButton.cpp b/trainButton.cpp index 436c84c..bab5d5e 100644 --- a/trainButton.cpp +++ b/trainButton.cpp @@ -1,5 +1,6 @@ #include "trainButton.h" #include "activeGameState.h" +#include "buildableUnit.h" #include "factory.h" #include @@ -10,19 +11,17 @@ namespace battleship{ using namespace vb01; using namespace gameBase; - TrainButton::TrainButton(Vector2 pos, Vector2 size, string name, int trigger, string imagePath, int fid, int tuid) : - factoryId(fid), - trainableUnitId(tuid), - UnitButton(pos, size, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", trigger, imagePath){} + TrainButton::TrainButton(Vector2 pos, Vector2 size, string name, int trigger, string imagePath, int uid, int slId) : + UnitButton(pos, size, name, GameManager::getSingleton()->getPath() + "Fonts/batang.ttf", trigger, imagePath, uid), + slotId(slId) {} void TrainButton::onClick(){ ActiveGameState *activeState = (ActiveGameState*)(GameManager::getSingleton()->getStateManager()->getAppStateByType((int)AppStateType::ACTIVE_STATE)); Player *player = activeState->getPlayer(); - UnitClass facClass = (UnitClass)generateView()["units"][factoryId + 1]["unitClass"]; - vector selUnits = player->getSelectedUnits(), factories = player->getUnitsByClass(facClass); + vector selUnits = player->getSelectedUnits(), factories = player->getUnitsById(unitId); for(Unit *fac : factories) - if(find(selUnits.begin(), selUnits.end(), fac) != selUnits.end()) - ((Factory*)fac)->appendToQueue(trainableUnitId); + if(fac->getBuildableUnit(slotId).buildable && find(selUnits.begin(), selUnits.end(), fac) != selUnits.end()) + ((Factory*)fac)->appendToQueue(slotId); } } diff --git a/trainButton.h b/trainButton.h index e600dd1..149c906 100644 --- a/trainButton.h +++ b/trainButton.h @@ -9,7 +9,7 @@ namespace battleship{ TrainButton(vb01::Vector2, vb01::Vector2, std::string, int, std::string, int, int); void onClick(); private: - int factoryId, trainableUnitId; + int slotId; }; } diff --git a/unit.cpp b/unit.cpp index 2c34719..27b67f0 100755 --- a/unit.cpp +++ b/unit.cpp @@ -16,6 +16,8 @@ #include "vehicle.h" #include "gameObjectFactory.h" #include "activeGameState.h" +#include "gameManager.h" +#include "projectile.h" #include "defConfigs.h" #include "pathfinder.h" #include "ability.h" @@ -171,6 +173,20 @@ namespace battleship{ armorTypes.push_back(arm); } } + + tblName = "buildableUnits"; + sol::optional bu = unitTable[tblName]; + + if(bu != sol::nullopt){ + SOL_LUA_VIEW.script("numBuildableUnits = #units[" + to_string(id + 1) + "]." + tblName); + int numBuildableUnits = SOL_LUA_VIEW["numBuildableUnits"]; + buildableUnitGuiScreen = unitTable["guiScreen"]; + + for(int i = 0; i < numBuildableUnits; i++){ + sol::table buTable = unitTable[tblName][i + 1]; + buildableUnits.push_back(BuildableUnit(buTable["id"], buTable["buildable"])); + } + } } void Unit::initWeapons(){ diff --git a/unit.h b/unit.h index 2052d9e..815c6f9 100755 --- a/unit.h +++ b/unit.h @@ -8,9 +8,8 @@ #include -#include "gameManager.h" #include "gameObject.h" -#include "projectile.h" +#include "buildableUnit.h" namespace sf{ class SoundBuffer; @@ -31,8 +30,9 @@ namespace battleship{ class Structure; class Factory; class Cruiser; - class PointDefense; class Engineer; + class PointDefense; + class Projectile; struct Order { enum class TYPE {ATTACK, BUILD, MOVE, GARRISON, EJECT, PATROL, LAUNCH, SUPPLY, HACK}; @@ -149,6 +149,8 @@ namespace battleship{ inline bool isTargetToTheRight(vb01::Vector3 dir, vb01::Vector3 lv){return lv.getAngleBetween(dir) > vb01::PI / 2;} inline Order getOrder(int i){return orders[i];} inline int getNumOrders(){return orders.size();} + inline std::string getBuildableUnitGuiScreen(){return buildableUnitGuiScreen;} + inline BuildableUnit getBuildableUnit(int i){return buildableUnits[i];} private: void renderOrderLine(bool); void updateScreenCoordinates(); @@ -165,12 +167,14 @@ namespace battleship{ UnitClass unitClass; UnitType type; std::vector orders; + std::string buildableUnitGuiScreen = ""; int health, maxHealth, playerId, lenHpBar = 200; - s64 orderLineDispTime = 0, lastFireTime = 0; + vb01::s64 orderLineDispTime = 0, lastFireTime = 0; float lineOfSight; - std::vector garrisonSlots; std::vector armorTypes; std::vector weapons; + std::vector garrisonSlots; + std::vector buildableUnits; State state = State::STAND_GROUND; std::vector getSelectingPlayers(); diff --git a/unitButton.cpp b/unitButton.cpp index 3a0d8ba..bb568a1 100644 --- a/unitButton.cpp +++ b/unitButton.cpp @@ -10,7 +10,7 @@ namespace battleship{ using namespace vb01Gui; using namespace gameBase; - UnitButton::UnitButton(Vector2 pos, Vector2 size, string name, string fontPath, int trigger, string imagePath) : Button(pos, size, name, fontPath, trigger, true, imagePath){ + UnitButton::UnitButton(Vector2 pos, Vector2 size, string name, string fontPath, int trigger, string imagePath, int uid) : Button(pos, size, name, fontPath, trigger, true, imagePath), unitId(uid){ StateManager *stateManager = GameManager::getSingleton()->getStateManager(); ActiveGameState *activeState = (ActiveGameState*)stateManager->getAppStateByType((int)AppStateType::ACTIVE_STATE); diff --git a/unitButton.h b/unitButton.h index 696ae1e..db682e5 100644 --- a/unitButton.h +++ b/unitButton.h @@ -8,8 +8,9 @@ namespace battleship{ class UnitButton : public vb01Gui::Button{ public: - UnitButton(vb01::Vector2, vb01::Vector2, std::string, std::string, int, std::string); + UnitButton(vb01::Vector2, vb01::Vector2, std::string, std::string, int, std::string, int); protected: + int unitId; std::vector units; }; }