diff --git a/activeGameState.cpp b/activeGameState.cpp index 89d8719..9032f92 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -16,6 +16,7 @@ #include "activeGameState.h" #include "inGameAppState.h" #include "defConfigs.h" +#include "structure.h" #include "util.h" #include "tooltip.h" @@ -328,7 +329,15 @@ namespace battleship{ vector ancestors = results[0].mesh->getNode()->getAncestors(); Node *node = ancestors[ancestors.size() - 2]; std::map::iterator it = unitData.find(node); - targets.push_back(Order::Target((it != unitData.end() ? unitData[node] : nullptr), results[0].pos)); + + Unit *unit = nullptr; + + if(placingStructures){ + unit = new Structure(mainPlayer, structureFrames[0].id, results[0].pos, Quaternion::QUAT_W); + mainPlayer->addUnit(unit); + } + + targets.push_back(Order::Target((it != unitData.end() ? unitData[node] : unit), results[0].pos)); } } @@ -354,6 +363,7 @@ namespace battleship{ else if(placingStructures){ type = Order::TYPE::BUILD; placingStructures = false; + removeStructtureFrames(); } issueOrder(type, shiftPressed); @@ -463,17 +473,21 @@ namespace battleship{ break; } case Bind::DESELECT_STRUCTURE: - for(StructureFrame s : structureFrames){ - Root::getSingleton()->getRootNode()->dettachChild(s.model); - delete s.model; - } - - structureFrames.clear(); + removeStructtureFrames(); placingStructures = false; break; } } + void ActiveGameState::removeStructtureFrames(){ + for(StructureFrame s : structureFrames){ + Root::getSingleton()->getRootNode()->dettachChild(s.model); + delete s.model; + } + + structureFrames.clear(); + } + void ActiveGameState::orientCamera(Vector3 rotAxis, double str){ float minStr = .001; Quaternion rotQuat = Quaternion(.5 * (fabs(str) > minStr ? str : 0), rotAxis); diff --git a/activeGameState.h b/activeGameState.h index 6ea5b77..4f19399 100755 --- a/activeGameState.h +++ b/activeGameState.h @@ -46,6 +46,7 @@ namespace battleship{ void issueOrder(Order::TYPE, bool); void lookAround(bool); void orientCamera(vb01::Vector3, double); + void removeStructtureFrames(); bool isInLineOfSight(vb01::Vector3, float, Unit*); GuiAppState *guiState; diff --git a/consoleCommand.cpp b/consoleCommand.cpp index dc28c60..c15ff98 100755 --- a/consoleCommand.cpp +++ b/consoleCommand.cpp @@ -9,7 +9,7 @@ #include "consoleCommand.h" #include "inGameAppState.h" #include "player.h" -#include "vehicle.h" +#include "engineer.h" using namespace std; using namespace vb01; @@ -71,9 +71,25 @@ namespace battleship{ } void ConsoleCommand::executeAddUnit(int playerId, int unitId, Vector3 pos, Quaternion rot) { - StateManager *stateManager = GameManager::getSingleton()->getStateManager(); + GameManager *gm = GameManager::getSingleton(); + StateManager *stateManager = gm->getStateManager(); InGameAppState *inGameState = (InGameAppState*)stateManager->getAppStateByType(AppStateType::IN_GAME_STATE); vector players = inGameState->getPlayers(); - players[playerId]->addUnit(new Vehicle(players[playerId], unitId, pos, rot)); + Vehicle *vehicle = nullptr; + + LuaManager *luaManager = LuaManager::getSingleton(); + luaManager->buildScript(vector{gm->getPath() + "Scripts/unitData.lua"}); + int unitClass = luaManager->getIntFromTable("unitClass", vector{Index(unitId + 1)}); + + switch((UnitClass)unitClass){ + case UnitClass::ENGINEER: + vehicle = new Engineer(players[playerId], unitId, pos, rot); + break; + default: + vehicle = new Vehicle(players[playerId], unitId, pos, rot); + break; + } + + players[playerId]->addUnit(vehicle); } } diff --git a/engineer.cpp b/engineer.cpp new file mode 100644 index 0000000..3bfa9d6 --- /dev/null +++ b/engineer.cpp @@ -0,0 +1,35 @@ +#include "engineer.h" +#include "map.h" +#include "player.h" +#include "structure.h" + +namespace battleship{ + using namespace vb01; + + Engineer::Engineer(Player *player, int id, Vector3 pos, Quaternion rot) : Vehicle(player, id, pos, rot){ + } + + void Engineer::build(Order order){ + navigate(order, 0.5 * Map::getSingleton()->getCellSize().x); + + if(type == UnitType::LAND) + alignToSurface(); + + if(pathPoints.empty()){ + if(!order.targets[0].unit){ + //TODO fix quaternion literal + player->addUnit(order.targets[0].unit); + } + else { + Structure *structure = (Structure*)order.targets[0].unit; + + if(structure->getBuildStatus() < 100 && canIncrementStructureStatus()){ + structure->incrementBuildStatus(); + lastIncrementTime = getTime(); + } + else if(structure->getBuildStatus() >= 100) + removeOrder(0); + } + } + } +} diff --git a/engineer.h b/engineer.h new file mode 100644 index 0000000..b5ad828 --- /dev/null +++ b/engineer.h @@ -0,0 +1,23 @@ +#ifndef ENGINEER_H +#define ENGINEER_H + +#include + +#include "vehicle.h" + +namespace battleship{ + class Structure; + + class Engineer : public Vehicle{ + public: + Engineer(Player*, int, vb01::Vector3, vb01::Quaternion); + void build(Order); + private: + vb01::s64 lastIncrementTime = 0; + int incrementRate = 50; + + bool canIncrementStructureStatus(){return vb01::getTime() - lastIncrementTime > incrementRate;} + }; +} + +#endif diff --git a/structure.cpp b/structure.cpp index 3e8081c..45e632d 100644 --- a/structure.cpp +++ b/structure.cpp @@ -5,6 +5,7 @@ using namespace vb01; using namespace std; namespace battleship{ - Structure::Structure(Player *player, int id, Vector3 pos, Quaternion rot) : Unit(player, id, pos, rot){ + Structure::Structure(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus) : Unit(player, id, pos, rot){ + this->buildStatus = buildStatus; } } diff --git a/structure.h b/structure.h index 36f833e..a31deb0 100644 --- a/structure.h +++ b/structure.h @@ -6,8 +6,11 @@ namespace battleship{ class Structure : public Unit{ public: - Structure(Player*, int, vb01::Vector3, vb01::Quaternion); + Structure(Player*, int, vb01::Vector3, vb01::Quaternion, int = 0); + inline int getBuildStatus(){return buildStatus;} + inline void incrementBuildStatus(){buildStatus++;} private: + int buildStatus = 0; }; } diff --git a/vehicle.cpp b/vehicle.cpp index c143ad9..48a87b7 100644 --- a/vehicle.cpp +++ b/vehicle.cpp @@ -108,9 +108,6 @@ namespace battleship{ else if(type == UnitType::UNDERWATER && fabs(pos.y - pathPoints[0].y) < 0.5 * height && pos.getDistanceFrom(linDest) <= destOffset) pathPoints.erase(pathPoints.begin()); } - - if(pathPoints.empty()) - removeOrder(0); } void Vehicle::alignToSurface(){ @@ -135,6 +132,9 @@ namespace battleship{ if(type == UnitType::LAND) alignToSurface(); + + if(pathPoints.empty()) + removeOrder(0); } void Vehicle::preparePathpoints(Order order){ diff --git a/vehicle.h b/vehicle.h index f6d4501..5f85ffe 100644 --- a/vehicle.h +++ b/vehicle.h @@ -11,7 +11,6 @@ namespace battleship{ private: int patrolPointId = 0; float speed, maxTurnAngle, anglePrecision; - std::vector pathPoints; inline int getNextPatrolPointId(int numPoints) {return patrolPointId == numPoints - 1 ? 0 : patrolPointId + 1;} void halt(); @@ -20,6 +19,9 @@ namespace battleship{ void initProperties(); void advance(float, MoveDir = MoveDir::FORW); void preparePathpoints(Order); + protected: + std::vector pathPoints; + void navigate(Order, float = 0.); void alignToSurface(); };