mirror of
https://github.com/ApfelTeeSaft/PlanetFleet.git
synced 2026-08-26 19:33:38 +00:00
Merge pull request #220 from devZoGok/bf-210-rover-gathering
Bf 210 rover gathering
This commit is contained in:
+28
-17
@@ -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<Unit*> units = player->getUnits();
|
||||
vector<Structure*> 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(){
|
||||
|
||||
+2
-2
@@ -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<Structure*>);
|
||||
|
||||
|
||||
+44
-4
@@ -364,8 +364,49 @@ 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);
|
||||
pathTruncated = true;
|
||||
|
||||
break;
|
||||
}
|
||||
else removePathpoint(pathPoints.size() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
if(appendDestPos && !pathTruncated)
|
||||
addPathpoint(destPos);
|
||||
@@ -383,8 +424,7 @@ namespace battleship{
|
||||
|
||||
pathPoints.erase(pathPoints.begin() + i);
|
||||
|
||||
if(pathPoints.empty())
|
||||
pursuingTarget = false;
|
||||
if(pathPoints.empty()) pursuingTarget = false;
|
||||
}
|
||||
|
||||
void Vehicle::removeAllPathpoints(){
|
||||
|
||||
Reference in New Issue
Block a user