AI beams don't duplicate anymore
This commit is contained in:
parent
8016bab3e8
commit
0c2a21e4da
2 changed files with 40 additions and 45 deletions
|
|
@ -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<Shootable*> &projectiles) {
|
||||
destination = target->getPosition();
|
||||
|
||||
if (distance(getPosition(), target->getPosition()) > dist) targetVelo = spritePhysics.maxVelocity;
|
||||
|
|
@ -91,6 +89,8 @@ public:
|
|||
|
||||
turnTowardsTarget();
|
||||
approachTargetVelocity();
|
||||
|
||||
shoot(projectiles);
|
||||
}
|
||||
|
||||
double getShortestWeaponRange() {
|
||||
|
|
|
|||
77
Game.cpp
77
Game.cpp
|
|
@ -566,7 +566,7 @@ void Game::init() {
|
|||
for (auto s : ships) delete s;
|
||||
ships.clear();
|
||||
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++) {
|
||||
roll = std::uniform_int_distribution<int>(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<int>(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<Shootable *> forDelete;
|
||||
for (Shootable *p : projectiles) {
|
||||
if (p->isPastLifetime()) {
|
||||
forDelete.push_back(p);
|
||||
}
|
||||
//delete old sprites
|
||||
std::vector<Shootable*> 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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue