units without horizontally rotatable weapons also consider the angle to the target

only selecting cells blocked by other units
bugfix for issuing orders to (in)complete buildings
This commit is contained in:
devZoGok
2026-05-13 19:06:02 +03:00
parent c53eb2a022
commit 0628ccf4a3
3 changed files with 16 additions and 4 deletions
+1 -1
View File
@@ -123,7 +123,7 @@ namespace battleship{
} }
if(!u->isVehicle() && ((Structure*)u)->isComplete()){ if(!u->isVehicle() && ((Structure*)u)->isComplete()){
structBuilt = false; structBuilt = true;
break; break;
} }
} }
+13 -3
View File
@@ -276,7 +276,7 @@ namespace battleship{
void Vehicle::navigateToTarget(float minDist){ void Vehicle::navigateToTarget(float minDist){
if(!pursuingTarget){ if(!pursuingTarget){
Vector3 targPos = (orders[0].targets[0].unit ? orders[0].targets[0].unit->getPos() : orders[0].targets[0].pos); Vector3 targPos = (orders[0].targets[0].unit ? orders[0].targets[0].unit->getPos() : orders[0].targets[0].pos);
preparePathpoints(orders[0], targPos); preparePathpoints(orders[0], targPos, true);
pursuingTarget = true; pursuingTarget = true;
if(orders[0].type == Order::TYPE::GARRISON) addPathpoint(targPos); if(orders[0].type == Order::TYPE::GARRISON) addPathpoint(targPos);
@@ -340,7 +340,7 @@ namespace battleship{
if(type != UnitType::HOVER) if(type != UnitType::HOVER)
dest = pf->clampDestToSourceRegion(source, dest); dest = pf->clampDestToSourceRegion(source, dest);
if(cells[dest].blockedBy){ if(cells[dest].blockedBy && cells[dest].blockedBy != this){
vector<int> surrCellIds = map->getSurroundingCells(cells[dest].pos, 1); vector<int> surrCellIds = map->getSurroundingCells(cells[dest].pos, 1);
int altDest = -1; int altDest = -1;
@@ -461,6 +461,7 @@ namespace battleship{
Order::Target target = order.targets[0]; Order::Target target = order.targets[0];
Vector3 targVec = (target.unit ? target.unit->getPos() : target.pos) - pos; Vector3 targVec = (target.unit ? target.unit->getPos() : target.pos) - pos;
float distToTarg = targVec.getLength(); float distToTarg = targVec.getLength();
float angleToTarg = dirVec.getAngleBetween(targVec.norm());
vector<Weapon*> attackWeapons = getWeaponsByOrder(Order::TYPE::ATTACK); vector<Weapon*> attackWeapons = getWeaponsByOrder(Order::TYPE::ATTACK);
Weapon *weapon = attackWeapons[0]; Weapon *weapon = attackWeapons[0];
@@ -470,9 +471,18 @@ namespace battleship{
weapon = w; weapon = w;
float minDist = weapon->getMaxRange(); float minDist = weapon->getMaxRange();
float minAngle = weapon->getMaxFireAngle();
if(order.playerAssigned || (!order.playerAssigned && state == Unit::State::CHASE)){ if(order.playerAssigned || (!order.playerAssigned && state == Unit::State::CHASE)){
if(distToTarg > minDist) bool horizontal = false;
for(const Weapon::Component &comp : weapon->getComponents())
if(!comp.vertical){
horizontal = true;
break;
}
if(distToTarg > minDist || (!horizontal && angleToTarg > minAngle))
navigateToTarget(.5 * Map::getSingleton()->getCellSize().x); navigateToTarget(.5 * Map::getSingleton()->getCellSize().x);
else else
pursuingTarget = false; pursuingTarget = false;
+2
View File
@@ -41,11 +41,13 @@ namespace battleship{
virtual void fire(Order); virtual void fire(Order);
void trackTarget(vb01::Vector3); void trackTarget(vb01::Vector3);
bool canAttackTarget(int, int); bool canAttackTarget(int, int);
inline const std::vector<Component>& getComponents(){return components;}
inline int getProjectileId(){return projId;} inline int getProjectileId(){return projId;}
inline int getRateOfFire(){return rateOfFire;} inline int getRateOfFire(){return rateOfFire;}
inline int getDamage(){return damage;} inline int getDamage(){return damage;}
inline int getMinRange(){return minRange;} inline int getMinRange(){return minRange;}
inline int getMaxRange(){return maxRange;} inline int getMaxRange(){return maxRange;}
inline float getMaxFireAngle(){return maxFireAngle;}
inline Unit* getUnit(){return unit;} inline Unit* getUnit(){return unit;}
inline Type getType(){return type;} inline Type getType(){return type;}
inline Order::TYPE getOrderType(){return orderType;} inline Order::TYPE getOrderType(){return orderType;}