diff --git a/COMShip.h b/COMShip.h index 6a31730..671bd72 100644 --- a/COMShip.h +++ b/COMShip.h @@ -59,9 +59,7 @@ public: if (status == ATTACKING) { if (target != nullptr) { - dogFight(getShortestWeaponRange(), target); - - shoot(projectiles); + dogFight(getShortestWeaponRange(), target, projectiles); } else { status = MOVING; } @@ -83,7 +81,7 @@ public: return status; } - void dogFight(double dist, Ship *target) { + void dogFight(double dist, Ship *target, std::vector &projectiles) { destination = target->getPosition(); if (distance(getPosition(), target->getPosition()) > dist) targetVelo = spritePhysics.maxVelocity; @@ -91,6 +89,8 @@ public: turnTowardsTarget(); approachTargetVelocity(); + + shoot(projectiles); } double getShortestWeaponRange() { diff --git a/Game.cpp b/Game.cpp index be332d1..cd053d1 100644 --- a/Game.cpp +++ b/Game.cpp @@ -566,7 +566,7 @@ void Game::init() { for (auto s : ships) delete s; ships.clear(); roll = std::uniform_int_distribution(ceil(currentSystem->getPop() / 3), ceil(currentSystem->getPop() * 1.5)); - int numShips = roll(gen); + int numShips = 2;//roll(gen); for (int i = 0; i < numShips; i++) { roll = std::uniform_int_distribution(0, shipTextures.size() - 1); @@ -872,14 +872,34 @@ void Game::init() { s->update(); } + player->update(); + + for (COMShip *s : ships) { + COMShip::Status res = s->pathfind(window, gen, currentSystem, player, projectiles); + s->update(); + + if (res == COMShip::WARPING) { + sound.setBuffer(warp); + sound.setVolume((GameSprite::distance(player->getPosition(), s->getPosition()) > 2000) ? 0 : 100 *(2000 -GameSprite::distance(player->getPosition(),s->getPosition())) /2000); + sound.play(); + + if (player->getTarget() == s) { + player->setTarget(nullptr); + } + + delete s; + ships.erase(std::find(ships.begin(), ships.end(), s)); + + messageLog.push_front(new sf::Text("A ship left the system.", oxan, 18)); + } + } + for (Shootable *p : projectiles) { bool deleted = false; p->update(); for (Ship *s : ships) { - if ((Collision::PixelPerfectTest(*p, *s) || - (p->getLifetime() == 1 && p->getPosition() == p->getShooter()->getPosition())) && - p->getShooter()->getTarget() == s) { + if (p->getShooter()->getTarget() == s && ((p->getLifetime() == 1 && p->getGlobalBounds().intersects(s->getGlobalBounds())) || Collision::PixelPerfectTest(*p, *s))) { s->setHull(s->getHullRemaining() - p->getDamage()); for (COMShip *s : ships) { @@ -910,9 +930,7 @@ void Game::init() { if (deleted) break; - if ((Collision::PixelPerfectTest(*p, *player) || - (p->getLifetime() == 1 && p->getPosition() == p->getShooter()->getPosition())) && - p->getShooter()->getTarget() == player) { + if (p->getShooter()->getTarget() == player && ((p->getLifetime() == 1 && p->getGlobalBounds().intersects(player->getGlobalBounds())) || Collision::PixelPerfectTest(*p, *player))) { player->setHull(player->getHullRemaining() - p->getDamage()); hullLevel.setTextureRect(sf::IntRect(origGaugeRect.left, origGaugeRect.top, origGaugeRect.width / (float) player->getHullCap() * @@ -932,27 +950,6 @@ void Game::init() { break; } } - player->update(); - - for (COMShip *s : ships) { - COMShip::Status res = s->pathfind(window, gen, currentSystem, player, projectiles); - s->update(); - - if (res == COMShip::WARPING) { - sound.setBuffer(warp); - sound.setVolume((GameSprite::distance(player->getPosition(), s->getPosition()) > 2000) ? 0 : 100 *(2000 -GameSprite::distance(player->getPosition(),s->getPosition())) /2000); - sound.play(); - - if (player->getTarget() == s) { - player->setTarget(nullptr); - } - - delete s; - ships.erase(std::find(ships.begin(), ships.end(), s)); - - messageLog.push_front(new sf::Text("A ship left the system.", oxan, 18)); - } - } roll = std::uniform_int_distribution(1, 10000); if (roll(gen) < ceil(currentSystem->getPop() / 4) && ships.size() < currentSystem->getPop() * 1.5) { @@ -1483,22 +1480,20 @@ void Game::init() { window.display(); // display the window - //delete old spritesadddd - if (!projectiles.empty()) { - std::vector forDelete; - for (Shootable *p : projectiles) { - if (p->isPastLifetime()) { - forDelete.push_back(p); - } + //delete old sprites + std::vector forDelete; + for (Shootable *p : projectiles) { + if ((p->getLifetime() == 1) || p->isPastLifetime()) { + forDelete.push_back(p); } - - for (Shootable *p : forDelete) { - projectiles.erase(std::find(projectiles.begin(), projectiles.end(), p)); - delete p; - } - forDelete.clear(); } + for (Shootable *p: forDelete) { + projectiles.erase(std::find(projectiles.begin(), projectiles.end(), p)); + delete p; + } + forDelete.clear(); + sf::Event event{}; while (window.pollEvent(event)) { // ask the window if any events occurred