diff --git a/activeGameState.cpp b/activeGameState.cpp index ecede1c..59141b7 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -719,7 +719,18 @@ namespace battleship{ else if(cursorState == CursorState::HACK){ if(orderPossible) issueOrder(Order::TYPE::HACK, vector{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed); } - else if((selectedUnits[0]->getUnitClass() == UnitClass::ENGINEER || selectedUnits[0]->getUnitClass() == UnitClass::FREEZER) && ufCtr->isPlacingOnSurface()){ + else if(ufCtr->isPlacingOnSurface()){ + Order::TYPE type; + + switch(selectedUnits[0]->getUnitClass()){ + case UnitClass::ENGINEER: + case UnitClass::FREEZER: + type = Order::TYPE::BUILD; + break; + default: + return; + } + targets.clear(); for(int i = 0; i < ufCtr->getNumGameObjectFrames(); i++){ @@ -728,7 +739,7 @@ namespace battleship{ if(gmObjFr.status == GameObjectFrame::NOT_PLACEABLE) continue; Unit *buildStruct = GameObjectFactory::createUnit(mainPlayer, gmObjFr.getId(), gmObjFr.getPos(), gmObjFr.getRot()); - issueOrder(Order::TYPE::BUILD, vector{Order::Target(buildStruct, gmObjFr.getPos())}, shiftPressed); + issueOrder(type, vector{Order::Target(buildStruct, gmObjFr.getPos())}, shiftPressed); mainPlayer->addUnit(buildStruct); } diff --git a/freezer.cpp b/freezer.cpp index d3df3ab..1cd5c8c 100644 --- a/freezer.cpp +++ b/freezer.cpp @@ -1,8 +1,13 @@ #include "freezer.h" +#include "weapon.h" +#include "structure.h" #include "destructable.h" +#include + namespace battleship{ using namespace vb01; + using namespace std; //TODO rename the class to a more generic name Freezer::Freezer(Player *player, int id, Vector3 pos, Quaternion rot, Unit::State state) : Vehicle(player, id, pos, rot, state){} @@ -12,7 +17,23 @@ namespace battleship{ Destructable *target = order.targets[0].unit->getDestructable(); - if(target && target->getFreezeStatus() == 100) + if(target && target->getFreezeStatus() >= 100) + removeOrder(0); + } + + void Freezer::build(Order order){ + vector weapons = getWeaponsByType((int)Weapon::Type::FREEZER); + + if(weapons.empty()) return; + + Unit *targ = (Unit*)order.targets[0].unit; + + for(Weapon *w : weapons) + w->trackTarget(targ->getPos()); + + Vehicle::build(order); + + if(targ->getUnitClass() == UnitClass::ICE_SHEET && ((Structure*)targ)->getBuildStatus() >= 100) removeOrder(0); } } diff --git a/freezer.h b/freezer.h index 49a3ffb..89459aa 100644 --- a/freezer.h +++ b/freezer.h @@ -9,6 +9,7 @@ namespace battleship{ Freezer(Player*, int, vb01::Vector3, vb01::Quaternion, Unit::State); private: void attack(Order); + void build(Order); }; } diff --git a/unit.cpp b/unit.cpp index d92e422..53ed7fd 100755 --- a/unit.cpp +++ b/unit.cpp @@ -420,6 +420,16 @@ namespace battleship{ return weaps; } + vector Unit::getWeaponsByType(int type){ + vector weaps; + + for(Weapon *w : weapons) + if(w->getType() == (Weapon::Type)type) + weaps.push_back(w); + + return weaps; + } + void Unit::receiveOrder(Order order, bool add) { if(!validateOrder(order)) return; diff --git a/unit.h b/unit.h index e067462..da424bf 100755 --- a/unit.h +++ b/unit.h @@ -196,6 +196,7 @@ namespace battleship{ virtual void freeze(Order){} float calculateRotation(vb01::Vector3, float, float); std::vector getWeaponsByOrder(Order::TYPE); + std::vector getWeaponsByType(int); }; } diff --git a/vehicle.h b/vehicle.h index 3479f2b..056199f 100644 --- a/vehicle.h +++ b/vehicle.h @@ -34,7 +34,6 @@ namespace battleship{ void addPathpoint(vb01::Vector3); void removePathpoint(int = 0); void removeAllPathpoints(); - void build(Order); void select(); void reinit(); protected: @@ -48,6 +47,7 @@ namespace battleship{ void navigateToTarget(float); void preparePathpoints(Order&, vb01::Vector3, bool = false); virtual void attack(Order); + virtual void build(Order); void garrison(Order); void patrol(Order); virtual void initProperties(); diff --git a/weapon.cpp b/weapon.cpp index a5c44b2..e0326f0 100644 --- a/weapon.cpp +++ b/weapon.cpp @@ -9,6 +9,7 @@ #include "player.h" #include "fxManager.h" #include "destructable.h" +#include "structure.h" #include "gameObjectFactory.h" #include "projectile.h" @@ -212,7 +213,11 @@ namespace battleship{ switch(type){ case Type::FREEZER: - destr->setFreezeStatus(destr->getFreezeStatus() + 1); + if(target->getType() == GameObject::Type::UNIT && ((Unit*)target)->getUnitClass() == UnitClass::ICE_SHEET) + ((Structure*)target)->incrementBuildStatus(); + else + destr->setFreezeStatus(destr->getFreezeStatus() + 1); + break; default: destr->takeDamage(damage); diff --git a/weapon.h b/weapon.h index 146eedd..97b3e0a 100644 --- a/weapon.h +++ b/weapon.h @@ -46,6 +46,7 @@ namespace battleship{ inline int getMinRange(){return minRange;} inline int getMaxRange(){return maxRange;} inline Unit* getUnit(){return unit;} + inline Type getType(){return type;} inline Order::TYPE getOrderType(){return orderType;} private: Unit *unit = nullptr;