diff --git a/activeGameState.cpp b/activeGameState.cpp index 463e7b5..0d676c5 100755 --- a/activeGameState.cpp +++ b/activeGameState.cpp @@ -355,7 +355,7 @@ namespace battleship{ if(canGarrison) issueOrder(Order::TYPE::GARRISON, vector{Order::Target((Unit*)gameObjHoveredOn, gameObjHoveredOn->getPos())}, shiftPressed); } - else if(gameObjHoveredOn && ownGameObj && ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::EXTRACTOR){ + else if(gameObjHoveredOn && ownGameObj && ((Unit*)gameObjHoveredOn)->getUnitClass() == UnitClass::EXTRACTOR && !controlPressed){ issueOrder(Order::TYPE::SUPPLY, vector{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed); } else if(gameObjHoveredOn && (controlPressed || (!ownGameObj && gameObjHoveredOn->getType() == GameObject::Type::UNIT))) diff --git a/cruiseMissile.cpp b/cruiseMissile.cpp index e53d3c6..e4014b0 100644 --- a/cruiseMissile.cpp +++ b/cruiseMissile.cpp @@ -52,9 +52,8 @@ namespace battleship{ int cellId = map->getCellId(pos, false); if((pos + dirVec * rayLength).y <= map->getCells()[cellId].pos.y){ - exploded = true; Game::getSingleton()->explode(pos, explosionDamage, explosionRadius, explosionSfx); - player->removeProjectile(this); + remove = true; } } @@ -74,9 +73,9 @@ namespace battleship{ break; } - if(!exploded && flightStage == FlightStage::DESCENT){ + if(!remove && flightStage == FlightStage::DESCENT){ checkSurfaceCollision(); - if(exploded) return; + if(remove) return; checkUnitCollision(); } } diff --git a/gameObject.h b/gameObject.h index 4839e8b..48fa3d6 100644 --- a/gameObject.h +++ b/gameObject.h @@ -46,6 +46,7 @@ namespace battleship{ inline int getId() {return id;} inline Type getType(){return type;} inline vb01::Node* getHitbox(){return hitbox;} + inline bool isRemove(){return remove;} private: int sortCorners(std::vector&, bool, bool); protected: @@ -67,7 +68,7 @@ namespace battleship{ vb01::Vector3 pos = vb01::Vector3(0, 0, 0), upVec = vb01::Vector3(0, 1, 0), dirVec = vb01::Vector3(0, 0, 1), leftVec = vb01::Vector3(1, 0, 0), corners[8]; vb01::Vector2 screenPos; vb01::Quaternion rot; - bool selectable = false, debugging = false; + bool selectable = false, debugging = false, remove = false; float width, height, length; }; } diff --git a/player.cpp b/player.cpp index 0fb0019..f7a2be1 100755 --- a/player.cpp +++ b/player.cpp @@ -16,13 +16,21 @@ namespace battleship{ Player::~Player() {} void Player::update() { - vector units = this->units; + vector units = this->units; + for(Unit *u : units){ + if(!u->isRemove()) + u->update(); + else + removeUnit(u); + } - for(Unit *u : units) - u->update(); - - for(Projectile *proj : projectiles) - proj->update(); + vector projectiles = this->projectiles; + for(Projectile *proj : projectiles){ + if(!proj->isRemove()) + proj->update(); + else + removeProjectile(proj); + } for(ResourceDeposit *rd : resourceDeposits) rd->update(); diff --git a/projectile.cpp b/projectile.cpp index 27a55d1..43d4728 100755 --- a/projectile.cpp +++ b/projectile.cpp @@ -62,9 +62,9 @@ namespace battleship{ GameObject::update(); placeAt(pos + speed * dirVec); - if(!exploded){ + if(!remove){ checkSurfaceCollision(); - if(exploded) return; + if(remove) return; checkUnitCollision(); } } @@ -89,10 +89,9 @@ namespace battleship{ if(!results.empty()){ for(int i = 0; i < targetNodes.size(); i++) if(targetNodes[i]->getMesh(0) == results[0].mesh){ - exploded = true; targetUnits[i]->takeDamage(directHitDamage); Game::getSingleton()->explode(pos, explosionDamage, explosionRadius, explosionSfx); - player->removeProjectile(this); + remove = true; } } } @@ -101,10 +100,8 @@ namespace battleship{ Map *map = Map::getSingleton(); int cellId = map->getCellId(pos, false); - if(map->getCells()[cellId].type == Map::Cell::LAND){ - exploded = true; - player->removeProjectile(this); - } + if(map->getCells()[cellId].type == Map::Cell::LAND) + remove = true; } void Projectile::debug(){ diff --git a/projectile.h b/projectile.h index 99892c2..e29c028 100755 --- a/projectile.h +++ b/projectile.h @@ -21,7 +21,6 @@ namespace battleship { virtual ~Projectile(); virtual void update(); virtual void debug(); - inline bool isExploded() {return exploded;} private: void initProperties(); void initSound(); @@ -30,7 +29,6 @@ namespace battleship { virtual void checkUnitCollision(); virtual void checkSurfaceCollision(); - bool exploded = false; float speed, rayLength, explosionRadius, rotAngle; int directHitDamage, explosionDamage; vb01::Vector3 initPos; diff --git a/resourceRover.cpp b/resourceRover.cpp index 7b453d1..5333937 100644 --- a/resourceRover.cpp +++ b/resourceRover.cpp @@ -28,7 +28,7 @@ namespace battleship{ } void ResourceRover::supply(Order order){ - float minDist = .6 * Map::getSingleton()->getCellSize().x; + float minDist = .5 * Map::getSingleton()->getCellSize().x; if(!pathPoints.empty()) navigate(minDist); @@ -46,18 +46,24 @@ namespace battleship{ nearestExtractor = getClosestUnit(extractors); nearestRefinery = getClosestUnit(refineries); - if(nearestExtractor->getPos().getDistanceFrom(pos) <= minDist){ + if(!nearestExtractor){ + removeOrder(0); + return; + } + + if(nearestExtractor && nearestExtractor->getPos().getDistanceFrom(pos) <= minDist){ if(canLoad()){ ((Extractor*)nearestExtractor)->draw(); load++; lastLoadTime = getTime(); } else if(load == capacity && nearestRefinery) - preparePathpoints(order, nearestRefinery->getPos()); + preparePathpoints(order, nearestRefinery->getPos(), true); } - else if(nearestRefinery->getPos().getDistanceFrom(pos) <= minDist){ + else if(nearestRefinery && nearestRefinery->getPos().getDistanceFrom(pos) <= minDist){ if(canUnload()){ load--; + player->addRefineds(1); lastLoadTime = getTime(); } else if(load == 0 && nearestExtractor) @@ -69,6 +75,10 @@ namespace battleship{ void ResourceRover::update(){ Vehicle::update(); + vector units = player->getUnits(); + nearestExtractor = (find(units.begin(), units.end(), nearestExtractor) != units.end() ? nearestExtractor : nullptr); + nearestRefinery = (find(units.begin(), units.end(), nearestRefinery) != units.end() ? nearestRefinery : nullptr); + ActiveGameState *activeState = (ActiveGameState*)GameManager::getSingleton()->getStateManager()->getAppStateByType(AppStateType::ACTIVE_STATE); Player *mainPlayer = (activeState ? activeState->getPlayer() : nullptr); diff --git a/unit.cpp b/unit.cpp index 7560777..385d8a6 100755 --- a/unit.cpp +++ b/unit.cpp @@ -295,7 +295,7 @@ namespace battleship{ if (health <= DEATH_HP){ Game::getSingleton()->explode(pos, 0, 0, deathSfx); - player->removeUnit(this); + remove = true; } } diff --git a/vehicle.cpp b/vehicle.cpp index ababf40..cbe4552 100644 --- a/vehicle.cpp +++ b/vehicle.cpp @@ -227,7 +227,7 @@ namespace battleship{ debugPathPoints.push_back(n); } - void Vehicle::preparePathpoints(Order &order, Vector3 destPos){ + void Vehicle::preparePathpoints(Order &order, Vector3 destPos, bool appendDestPos){ removeAllPathpoints(); Map *map = Map::getSingleton(); @@ -243,12 +243,14 @@ namespace battleship{ Pathfinder *pathfinder = Pathfinder::getSingleton(); int dest = map->getCellId(destPos); vector path = pathfinder->findPath(cells, source, dest, (int)type); + bool pathTruncated = false; for(int i = 0; i < path.size(); i++){ if((ship && cells[path[i]].type != Map::Cell::WATER) || (order.type != Order::TYPE::GARRISON && type == UnitType::LAND && cells[path[i]].type != Map::Cell::LAND)){ path = vector(path.begin(), path.begin() + i); order.targets[0].unit = nullptr; order.targets[0].pos = cells[path[i - 1]].pos; + pathTruncated = true; break; } else if(order.type == Order::TYPE::GARRISON && type == UnitType::LAND && cells[path[i]].type != Map::Cell::LAND && path.size() - 1 != i) @@ -257,6 +259,9 @@ namespace battleship{ for(int p : path) addPathpoint(cells[p].pos); + + if(appendDestPos && !pathTruncated) + addPathpoint(destPos); } void Vehicle::removePathpoint(int i){ diff --git a/vehicle.h b/vehicle.h index 6403ff2..241c58c 100644 --- a/vehicle.h +++ b/vehicle.h @@ -40,7 +40,7 @@ namespace battleship{ std::vector pathPoints; void navigate(float = 0.); - void preparePathpoints(Order&, vb01::Vector3); + void preparePathpoints(Order&, vb01::Vector3, bool = false); void alignToSurface(); void attack(Order); void garrison(Order);