From 687b4013f205136317c7a6761b21f4f084f7987a Mon Sep 17 00:00:00 2001 From: devZoGok Date: Thu, 15 Jan 2026 20:13:13 +0200 Subject: [PATCH 1/3] ending the path at the edge of the target game object --- vehicle.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/vehicle.cpp b/vehicle.cpp index 7b88bd0..8c58fb4 100644 --- a/vehicle.cpp +++ b/vehicle.cpp @@ -364,8 +364,47 @@ namespace battleship{ return; } - for(int p : path) - addPathpoint(cells[p].pos); + for(int p : path) addPathpoint(cells[p].pos); + + if(order.targets[0].unit && !pathTruncated){ + GameObject *targObj = order.targets[0].unit; + + for(int i = path.size() - 1; i >= 0; i--){ + Vector3 targPos = targObj->getPos(); + Vector3 pointDir = cells[path[i]].pos - targPos; + pointDir = Vector3(pointDir.x, 0, pointDir.z); + + float dirAngle = targObj->getDirVec().getAngleBetween(pointDir.norm()); + if(dirAngle > PI / 2) dirAngle = PI - dirAngle; + + float pointDist = pointDir.getLength(); + + float length = targObj->getLength(); + float lengthComp = pointDist * cos(dirAngle); + bool withinLength = (.5 * length >= lengthComp); + + float width = targObj->getWidth(); + float widthComp = pointDist * sin(dirAngle); + bool withinWidth = (.5 * width >= widthComp); + + if(!(withinLength && withinWidth)){ + float a1 = atan((.5 * width) / (.5 * length)); + float a2 = atan((.5 * length) / (.5 * width)); + + float leftAngle = targObj->getLeftVec().getAngleBetween(pointDir.norm()); + if(leftAngle > PI / 2) leftAngle = PI - leftAngle; + + float dist; + + if(dirAngle <= a1) dist = (.5 * length) / cos(dirAngle); + else if(leftAngle <= a2) dist = (.5 * width) / cos(leftAngle); + + addPathpoint(targPos + pointDir.norm() * dist); + break; + } + else removePathpoint(pathPoints.size() - 1); + } + } if(appendDestPos && !pathTruncated) addPathpoint(destPos); @@ -383,8 +422,7 @@ namespace battleship{ pathPoints.erase(pathPoints.begin() + i); - if(pathPoints.empty()) - pursuingTarget = false; + if(pathPoints.empty()) pursuingTarget = false; } void Vehicle::removeAllPathpoints(){ From 932f31158a620603b85fbd0547ff3e3b6ec8606c Mon Sep 17 00:00:00 2001 From: devZoGok Date: Mon, 2 Feb 2026 20:08:39 +0200 Subject: [PATCH 2/3] setting path as truncated --- vehicle.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vehicle.cpp b/vehicle.cpp index 8c58fb4..9017dc9 100644 --- a/vehicle.cpp +++ b/vehicle.cpp @@ -400,6 +400,8 @@ namespace battleship{ else if(leftAngle <= a2) dist = (.5 * width) / cos(leftAngle); addPathpoint(targPos + pointDir.norm() * dist); + pathTruncated = true; + break; } else removePathpoint(pathPoints.size() - 1); From a3e659eb6e128c9f4d311786352329fefca80539 Mon Sep 17 00:00:00 2001 From: devZoGok Date: Mon, 2 Feb 2026 20:09:03 +0200 Subject: [PATCH 3/3] bugfixed for resource gathering --- resourceRover.cpp | 45 ++++++++++++++++++++++++++++----------------- resourceRover.h | 4 ++-- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/resourceRover.cpp b/resourceRover.cpp index fe68a65..c4aec9d 100644 --- a/resourceRover.cpp +++ b/resourceRover.cpp @@ -39,7 +39,7 @@ namespace battleship{ } //TODO implement a check of whether a vehicle is next to a building's outline - void ResourceRover::loadResources(Structure *targStruct, float minDist, bool loadResource){ + void ResourceRover::loadResources(Structure *targStruct, bool loadResource){ float w = targStruct->getWidth(), l = targStruct->getLength(); bool closeEnough = (pos.getDistanceFrom(targStruct->getPos()) <= sqrt(l * l + w * w)); if(!closeEnough) return; @@ -98,7 +98,7 @@ namespace battleship{ } //TODO equate rover load and extractor draw rates - void ResourceRover::collectRefineds(Order order, float minDist){ + void ResourceRover::collectRefineds(Order order){ vector units = player->getUnits(); vector extractors, refineries; @@ -112,7 +112,16 @@ namespace battleship{ nearestExtractor = (Extractor*)getClosestUnit(extractors); nearestRefinery = getClosestUnit(refineries); - if(nearestExtractor && nearestExtractor->getPos().getDistanceFrom(pos) <= minDist){ + auto closeEnough = [](GameObject *obj, Vector3 pos){ + Vector3 neVec = pos - obj->getPos(); + float angle = obj->getDirVec().getAngleBetween(neVec.norm()); + + if(angle > PI / 2) angle = PI - angle; + + return cos(angle) * neVec.getLength() < .5 * obj->getLength(); + }; + + if(nearestExtractor && closeEnough(nearestExtractor, pos)){ ResourceDeposit *deposit = nearestExtractor->getDeposit(); if(canLoad() && deposit->getAmmount() > 0){ @@ -122,36 +131,38 @@ namespace battleship{ lastLoadTime = getTime(); } } - else if(calcTotalLoad() == capacity && nearestRefinery) - preparePathpoints(order, nearestRefinery->getPos(), true); + else if(calcTotalLoad() == capacity && nearestRefinery){ + order.targets[0].unit = nearestRefinery; + preparePathpoints(order, nearestRefinery->getPos()); + } } else if(!nearestExtractor){ - if(nearestRefinery && cargo[(int)ResourceType::REFINEDS] > 0) - preparePathpoints(order, nearestRefinery->getPos(), true); - else - removeOrder(0); + if(nearestRefinery && cargo[(int)ResourceType::REFINEDS] > 0){ + order.targets[0].unit = nearestRefinery; + preparePathpoints(order, nearestRefinery->getPos()); + } + else removeOrder(0); } - if(nearestRefinery && nearestRefinery->getPos().getDistanceFrom(pos) <= minDist){ + if(nearestRefinery && closeEnough(nearestRefinery, pos)){ if(canUnload((int)ResourceType::REFINEDS)){ cargo[(int)ResourceType::REFINEDS] -= loadSpeed; player->updateResource(ResourceType::REFINEDS, loadSpeed, true); lastLoadTime = getTime(); } - else if(cargo[(int)ResourceType::REFINEDS] == 0 && nearestExtractor) + else if(cargo[(int)ResourceType::REFINEDS] == 0 && nearestExtractor){ + order.targets[0].unit = nearestExtractor; preparePathpoints(order, nearestExtractor->getPos()); + } } } void ResourceRover::handleResources(Order order){ - float minDist = .5 * Map::getSingleton()->getCellSize().x; - - if(!pathPoints.empty()) - navigate(minDist); + if(!pathPoints.empty()) navigate(.01); else if(order.type == Order::TYPE::SUPPLY) - collectRefineds(order, minDist); + collectRefineds(order); else - loadResources((Structure*)order.targets[0].unit, minDist, order.type == Order::TYPE::LOAD); + loadResources((Structure*)order.targets[0].unit, order.type == Order::TYPE::LOAD); } void ResourceRover::update(){ diff --git a/resourceRover.h b/resourceRover.h index c8faf5c..183d0a1 100644 --- a/resourceRover.h +++ b/resourceRover.h @@ -21,8 +21,8 @@ namespace battleship{ inline bool canUnload(int id){return vb01::getTime() - lastLoadTime > loadRate && cargo[id] > 0;} private: void initProperties(); - void collectRefineds(Order, float); - void loadResources(Structure*, float, bool); + void collectRefineds(Order); + void loadResources(Structure*, bool); void handleResources(Order); Unit* getClosestUnit(std::vector);