AI beams don't duplicate anymore

This commit is contained in:
bMorgan01 2021-04-28 22:22:33 -06:00
parent 8016bab3e8
commit 0c2a21e4da
2 changed files with 40 additions and 45 deletions

View file

@ -59,9 +59,7 @@ public:
if (status == ATTACKING) { if (status == ATTACKING) {
if (target != nullptr) { if (target != nullptr) {
dogFight(getShortestWeaponRange(), target); dogFight(getShortestWeaponRange(), target, projectiles);
shoot(projectiles);
} else { } else {
status = MOVING; status = MOVING;
} }
@ -83,7 +81,7 @@ public:
return status; return status;
} }
void dogFight(double dist, Ship *target) { void dogFight(double dist, Ship *target, std::vector<Shootable*> &projectiles) {
destination = target->getPosition(); destination = target->getPosition();
if (distance(getPosition(), target->getPosition()) > dist) targetVelo = spritePhysics.maxVelocity; if (distance(getPosition(), target->getPosition()) > dist) targetVelo = spritePhysics.maxVelocity;
@ -91,6 +89,8 @@ public:
turnTowardsTarget(); turnTowardsTarget();
approachTargetVelocity(); approachTargetVelocity();
shoot(projectiles);
} }
double getShortestWeaponRange() { double getShortestWeaponRange() {

View file

@ -566,7 +566,7 @@ void Game::init() {
for (auto s : ships) delete s; for (auto s : ships) delete s;
ships.clear(); ships.clear();
roll = std::uniform_int_distribution<int>(ceil(currentSystem->getPop() / 3), ceil(currentSystem->getPop() * 1.5)); roll = std::uniform_int_distribution<int>(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++) { for (int i = 0; i < numShips; i++) {
roll = std::uniform_int_distribution<int>(0, shipTextures.size() - 1); roll = std::uniform_int_distribution<int>(0, shipTextures.size() - 1);
@ -872,14 +872,34 @@ void Game::init() {
s->update(); 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) { for (Shootable *p : projectiles) {
bool deleted = false; bool deleted = false;
p->update(); p->update();
for (Ship *s : ships) { for (Ship *s : ships) {
if ((Collision::PixelPerfectTest(*p, *s) || if (p->getShooter()->getTarget() == s && ((p->getLifetime() == 1 && p->getGlobalBounds().intersects(s->getGlobalBounds())) || Collision::PixelPerfectTest(*p, *s))) {
(p->getLifetime() == 1 && p->getPosition() == p->getShooter()->getPosition())) &&
p->getShooter()->getTarget() == s) {
s->setHull(s->getHullRemaining() - p->getDamage()); s->setHull(s->getHullRemaining() - p->getDamage());
for (COMShip *s : ships) { for (COMShip *s : ships) {
@ -910,9 +930,7 @@ void Game::init() {
if (deleted) break; if (deleted) break;
if ((Collision::PixelPerfectTest(*p, *player) || if (p->getShooter()->getTarget() == player && ((p->getLifetime() == 1 && p->getGlobalBounds().intersects(player->getGlobalBounds())) || Collision::PixelPerfectTest(*p, *player))) {
(p->getLifetime() == 1 && p->getPosition() == p->getShooter()->getPosition())) &&
p->getShooter()->getTarget() == player) {
player->setHull(player->getHullRemaining() - p->getDamage()); player->setHull(player->getHullRemaining() - p->getDamage());
hullLevel.setTextureRect(sf::IntRect(origGaugeRect.left, origGaugeRect.top, hullLevel.setTextureRect(sf::IntRect(origGaugeRect.left, origGaugeRect.top,
origGaugeRect.width / (float) player->getHullCap() * origGaugeRect.width / (float) player->getHullCap() *
@ -932,27 +950,6 @@ void Game::init() {
break; 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<int>(1, 10000); roll = std::uniform_int_distribution<int>(1, 10000);
if (roll(gen) < ceil(currentSystem->getPop() / 4) && ships.size() < currentSystem->getPop() * 1.5) { if (roll(gen) < ceil(currentSystem->getPop() / 4) && ships.size() < currentSystem->getPop() * 1.5) {
@ -1483,21 +1480,19 @@ void Game::init() {
window.display(); // display the window window.display(); // display the window
//delete old spritesadddd //delete old sprites
if (!projectiles.empty()) { std::vector<Shootable*> forDelete;
std::vector<Shootable *> forDelete;
for (Shootable *p : projectiles) { for (Shootable *p : projectiles) {
if (p->isPastLifetime()) { if ((p->getLifetime() == 1) || p->isPastLifetime()) {
forDelete.push_back(p); forDelete.push_back(p);
} }
} }
for (Shootable *p : forDelete) { for (Shootable *p: forDelete) {
projectiles.erase(std::find(projectiles.begin(), projectiles.end(), p)); projectiles.erase(std::find(projectiles.begin(), projectiles.end(), p));
delete p; delete p;
} }
forDelete.clear(); forDelete.clear();
}
sf::Event event{}; sf::Event event{};
while (window.pollEvent(event)) { // ask the window if any events occurred while (window.pollEvent(event)) { // ask the window if any events occurred