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 (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() {
|
||||||
|
|
|
||||||
77
Game.cpp
77
Game.cpp
|
|
@ -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,22 +1480,20 @@ 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->getLifetime() == 1) || p->isPastLifetime()) {
|
||||||
if (p->isPastLifetime()) {
|
forDelete.push_back(p);
|
||||||
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{};
|
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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue