bugfixed for resource gathering

This commit is contained in:
devZoGok
2026-02-02 20:09:03 +02:00
parent 932f31158a
commit a3e659eb6e
2 changed files with 30 additions and 19 deletions
+28 -17
View File
@@ -39,7 +39,7 @@ namespace battleship{
} }
//TODO implement a check of whether a vehicle is next to a building's outline //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(); float w = targStruct->getWidth(), l = targStruct->getLength();
bool closeEnough = (pos.getDistanceFrom(targStruct->getPos()) <= sqrt(l * l + w * w)); bool closeEnough = (pos.getDistanceFrom(targStruct->getPos()) <= sqrt(l * l + w * w));
if(!closeEnough) return; if(!closeEnough) return;
@@ -98,7 +98,7 @@ namespace battleship{
} }
//TODO equate rover load and extractor draw rates //TODO equate rover load and extractor draw rates
void ResourceRover::collectRefineds(Order order, float minDist){ void ResourceRover::collectRefineds(Order order){
vector<Unit*> units = player->getUnits(); vector<Unit*> units = player->getUnits();
vector<Structure*> extractors, refineries; vector<Structure*> extractors, refineries;
@@ -112,7 +112,16 @@ namespace battleship{
nearestExtractor = (Extractor*)getClosestUnit(extractors); nearestExtractor = (Extractor*)getClosestUnit(extractors);
nearestRefinery = getClosestUnit(refineries); 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(); ResourceDeposit *deposit = nearestExtractor->getDeposit();
if(canLoad() && deposit->getAmmount() > 0){ if(canLoad() && deposit->getAmmount() > 0){
@@ -122,36 +131,38 @@ namespace battleship{
lastLoadTime = getTime(); lastLoadTime = getTime();
} }
} }
else if(calcTotalLoad() == capacity && nearestRefinery) else if(calcTotalLoad() == capacity && nearestRefinery){
preparePathpoints(order, nearestRefinery->getPos(), true); order.targets[0].unit = nearestRefinery;
preparePathpoints(order, nearestRefinery->getPos());
}
} }
else if(!nearestExtractor){ else if(!nearestExtractor){
if(nearestRefinery && cargo[(int)ResourceType::REFINEDS] > 0) if(nearestRefinery && cargo[(int)ResourceType::REFINEDS] > 0){
preparePathpoints(order, nearestRefinery->getPos(), true); order.targets[0].unit = nearestRefinery;
else preparePathpoints(order, nearestRefinery->getPos());
removeOrder(0); }
else removeOrder(0);
} }
if(nearestRefinery && nearestRefinery->getPos().getDistanceFrom(pos) <= minDist){ if(nearestRefinery && closeEnough(nearestRefinery, pos)){
if(canUnload((int)ResourceType::REFINEDS)){ if(canUnload((int)ResourceType::REFINEDS)){
cargo[(int)ResourceType::REFINEDS] -= loadSpeed; cargo[(int)ResourceType::REFINEDS] -= loadSpeed;
player->updateResource(ResourceType::REFINEDS, loadSpeed, true); player->updateResource(ResourceType::REFINEDS, loadSpeed, true);
lastLoadTime = getTime(); 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()); preparePathpoints(order, nearestExtractor->getPos());
}
} }
} }
void ResourceRover::handleResources(Order order){ void ResourceRover::handleResources(Order order){
float minDist = .5 * Map::getSingleton()->getCellSize().x; if(!pathPoints.empty()) navigate(.01);
if(!pathPoints.empty())
navigate(minDist);
else if(order.type == Order::TYPE::SUPPLY) else if(order.type == Order::TYPE::SUPPLY)
collectRefineds(order, minDist); collectRefineds(order);
else 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(){ void ResourceRover::update(){
+2 -2
View File
@@ -21,8 +21,8 @@ namespace battleship{
inline bool canUnload(int id){return vb01::getTime() - lastLoadTime > loadRate && cargo[id] > 0;} inline bool canUnload(int id){return vb01::getTime() - lastLoadTime > loadRate && cargo[id] > 0;}
private: private:
void initProperties(); void initProperties();
void collectRefineds(Order, float); void collectRefineds(Order);
void loadResources(Structure*, float, bool); void loadResources(Structure*, bool);
void handleResources(Order); void handleResources(Order);
Unit* getClosestUnit(std::vector<Structure*>); Unit* getClosestUnit(std::vector<Structure*>);