adjusted building implementation for freezers

This commit is contained in:
devZoGok
2026-01-29 20:23:22 +02:00
parent a608273b57
commit 7ace63101b
8 changed files with 55 additions and 5 deletions
+13 -2
View File
@@ -719,7 +719,18 @@ namespace battleship{
else if(cursorState == CursorState::HACK){ else if(cursorState == CursorState::HACK){
if(orderPossible) issueOrder(Order::TYPE::HACK, vector<Order::Target>{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed); if(orderPossible) issueOrder(Order::TYPE::HACK, vector<Order::Target>{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(); targets.clear();
for(int i = 0; i < ufCtr->getNumGameObjectFrames(); i++){ for(int i = 0; i < ufCtr->getNumGameObjectFrames(); i++){
@@ -728,7 +739,7 @@ namespace battleship{
if(gmObjFr.status == GameObjectFrame::NOT_PLACEABLE) continue; if(gmObjFr.status == GameObjectFrame::NOT_PLACEABLE) continue;
Unit *buildStruct = GameObjectFactory::createUnit(mainPlayer, gmObjFr.getId(), gmObjFr.getPos(), gmObjFr.getRot()); Unit *buildStruct = GameObjectFactory::createUnit(mainPlayer, gmObjFr.getId(), gmObjFr.getPos(), gmObjFr.getRot());
issueOrder(Order::TYPE::BUILD, vector<Order::Target>{Order::Target(buildStruct, gmObjFr.getPos())}, shiftPressed); issueOrder(type, vector<Order::Target>{Order::Target(buildStruct, gmObjFr.getPos())}, shiftPressed);
mainPlayer->addUnit(buildStruct); mainPlayer->addUnit(buildStruct);
} }
+22 -1
View File
@@ -1,8 +1,13 @@
#include "freezer.h" #include "freezer.h"
#include "weapon.h"
#include "structure.h"
#include "destructable.h" #include "destructable.h"
#include <vector>
namespace battleship{ namespace battleship{
using namespace vb01; using namespace vb01;
using namespace std;
//TODO rename the class to a more generic name //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){} 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(); 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<Weapon*> 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); removeOrder(0);
} }
} }
+1
View File
@@ -9,6 +9,7 @@ namespace battleship{
Freezer(Player*, int, vb01::Vector3, vb01::Quaternion, Unit::State); Freezer(Player*, int, vb01::Vector3, vb01::Quaternion, Unit::State);
private: private:
void attack(Order); void attack(Order);
void build(Order);
}; };
} }
+10
View File
@@ -420,6 +420,16 @@ namespace battleship{
return weaps; return weaps;
} }
vector<Weapon*> Unit::getWeaponsByType(int type){
vector<Weapon*> weaps;
for(Weapon *w : weapons)
if(w->getType() == (Weapon::Type)type)
weaps.push_back(w);
return weaps;
}
void Unit::receiveOrder(Order order, bool add) { void Unit::receiveOrder(Order order, bool add) {
if(!validateOrder(order)) return; if(!validateOrder(order)) return;
+1
View File
@@ -196,6 +196,7 @@ namespace battleship{
virtual void freeze(Order){} virtual void freeze(Order){}
float calculateRotation(vb01::Vector3, float, float); float calculateRotation(vb01::Vector3, float, float);
std::vector<Weapon*> getWeaponsByOrder(Order::TYPE); std::vector<Weapon*> getWeaponsByOrder(Order::TYPE);
std::vector<Weapon*> getWeaponsByType(int);
}; };
} }
+1 -1
View File
@@ -34,7 +34,6 @@ namespace battleship{
void addPathpoint(vb01::Vector3); void addPathpoint(vb01::Vector3);
void removePathpoint(int = 0); void removePathpoint(int = 0);
void removeAllPathpoints(); void removeAllPathpoints();
void build(Order);
void select(); void select();
void reinit(); void reinit();
protected: protected:
@@ -48,6 +47,7 @@ namespace battleship{
void navigateToTarget(float); void navigateToTarget(float);
void preparePathpoints(Order&, vb01::Vector3, bool = false); void preparePathpoints(Order&, vb01::Vector3, bool = false);
virtual void attack(Order); virtual void attack(Order);
virtual void build(Order);
void garrison(Order); void garrison(Order);
void patrol(Order); void patrol(Order);
virtual void initProperties(); virtual void initProperties();
+6 -1
View File
@@ -9,6 +9,7 @@
#include "player.h" #include "player.h"
#include "fxManager.h" #include "fxManager.h"
#include "destructable.h" #include "destructable.h"
#include "structure.h"
#include "gameObjectFactory.h" #include "gameObjectFactory.h"
#include "projectile.h" #include "projectile.h"
@@ -212,7 +213,11 @@ namespace battleship{
switch(type){ switch(type){
case Type::FREEZER: 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; break;
default: default:
destr->takeDamage(damage); destr->takeDamage(damage);
+1
View File
@@ -46,6 +46,7 @@ namespace battleship{
inline int getMinRange(){return minRange;} inline int getMinRange(){return minRange;}
inline int getMaxRange(){return maxRange;} inline int getMaxRange(){return maxRange;}
inline Unit* getUnit(){return unit;} inline Unit* getUnit(){return unit;}
inline Type getType(){return type;}
inline Order::TYPE getOrderType(){return orderType;} inline Order::TYPE getOrderType(){return orderType;}
private: private:
Unit *unit = nullptr; Unit *unit = nullptr;