// TODO Lab2: Find and fix the bug in this function (BUG #12)
void LevelState::UpdateGameplayObjects(int _delta)
{
unsigned int cur;
// Update ship
if(playerShip)
{
playerShip->SetLastFired(playerShip->GetLastFired() + _delta);
if(playerShip->GetBattery() > SaiphApp::GetPropulsionFlyweight(SaiphApp::GetPropulsionID()).energy * _delta)
{
if(playerShip->GetAfterburnerFlag())
{
if(playerShip->GetAfterburner() > SaiphApp::GetPropulsionFlyweight(SaiphApp::GetPropulsionID()).energy * _delta)
playerShip->SetAfterburner(playerShip->GetAfterburner() - SaiphApp::GetPropulsionFlyweight(SaiphApp::GetPropulsionID()).energy * _delta);
else
playerShip->SetAfterburnerFlag(false);
}
playerShip->SetBattery(playerShip->GetBattery() - SaiphApp::GetPropulsionFlyweight(SaiphApp::GetPropulsionID()).energy * _delta);
}
else
playerShip->SetVelocity(Vec2f());
if(playerShip->GetAfterburnerFlag())
playerShip->SetVelocity(playerShip->GetVelocity()*2);
playerShip->Heartbeat(_delta);
// keep player on screen
if(playerShip->GetXPosition() > BOUNDS_SIZE)
playerShip->SetXPosition(BOUNDS_SIZE);
if(playerShip->GetXPosition() < 0)
playerShip->SetXPosition(0);
if(playerShip->GetYPosition() > BOUNDS_SIZE)
playerShip->SetYPosition(BOUNDS_SIZE);
if(playerShip->GetYPosition() < 0)
playerShip->SetYPosition(0);
// update shielding
if(playerShip->GetShield() != SaiphApp::GetShieldFlyweight(SaiphApp::GetShieldID()).strength)
{
if(playerShip->GetBattery() > SaiphApp::GetShieldFlyweight(SaiphApp::GetShieldID()).energy * _delta)
{
playerShip->SetBattery(playerShip->GetBattery() - SaiphApp::GetShieldFlyweight(SaiphApp::GetShieldID()).energy * _delta);
playerShip->SetShield(playerShip->GetShield() + SaiphApp::GetShieldFlyweight(SaiphApp::GetShieldID()).recharge * _delta);
if(playerShip->GetShield() > SaiphApp::GetShieldFlyweight(SaiphApp::GetShieldID()).strength)
playerShip->SetShield(SaiphApp::GetShieldFlyweight(SaiphApp::GetShieldID()).strength);
}
}
// update battery
playerShip->SetBattery(playerShip->GetBattery() + SaiphApp::GetGeneratorFlyweight(SaiphApp::GetGeneratorID()).energy * _delta);
if(playerShip->GetBattery() > SaiphApp::GetGeneratorFlyweight(SaiphApp::GetGeneratorID()).battery)
{
if(!playerShip->GetAfterburnerFlag())
{
playerShip->SetAfterburner(playerShip->GetAfterburner() + playerShip->GetBattery() - SaiphApp::GetGeneratorFlyweight(SaiphApp::GetGeneratorID()).battery);
if(playerShip->GetAfterburner() > SaiphApp::GetPropulsionFlyweight(SaiphApp::GetPropulsionID()).afterburnerEnergy)
playerShip->SetAfterburner(SaiphApp::GetPropulsionFlyweight(SaiphApp::GetPropulsionID()).afterburnerEnergy);
}
playerShip->SetBattery(SaiphApp::GetGeneratorFlyweight(SaiphApp::GetGeneratorID()).battery);
}
}
// Update power ups
for(cur=0;cur<powerUps.size();++cur)
if(powerUps[cur]->GetActive())
powerUps[cur]->Heartbeat(_delta);
// Update bullets
for(cur=0;cur<playerBullets.size();++cur)
{
if(playerBullets[cur]->GetActive())
{
// Perform tracking for bullets that track
if(playerBullets[cur]->GetTracking())
BulletTracking(playerBullets[cur], _delta);
playerBullets[cur]->Heartbeat(_delta);
}
}
for(cur=0;cur<enemyBullets.size();++cur)
{
if(enemyBullets[cur]->GetActive())
{
if(enemyBullets[cur]->GetTracking())
BulletTracking(enemyBullets[cur], _delta, true);
enemyBullets[cur]->Heartbeat(_delta);
}
}
// Update enemies
enemyHealth->Hide();
for(cur=0;cur<enemies.size();++cur)
{
if(!enemies[cur]->GetShip() || enemies[cur]->GetShip()->GetActive())
{
enemies[cur]->Heartbeat(_delta);
if(enemies[cur]->GetFireReady())
{
if(enemies[cur]->GetMovementBehavior() == Enemy::FLEE)
FireWeapon(enemies[cur]->GetShip(), enemies[cur]->GetShip()->GetHeading() + PI,
enemies[cur]->GetWeaponID(), enemies[cur]->GetWeaponLevel());
else
FireWeapon(enemies[cur]->GetShip(), enemies[cur]->GetShip()->GetHeading(),
enemies[cur]->GetWeaponID(), enemies[cur]->GetWeaponLevel());
enemies[cur]->SetFireReady(false);
}
if(enemies[cur]->GetRetargetReady())
{
enemies[cur]->SetTarget(playerShip->GetPosition());
enemies[cur]->SetRetargetReady(false);
}
}
}
// Update effects
for(cur=0;cur<effects.size();++cur)
{
if(effects[cur]->GetActive())
effects[cur]->Heartbeat(_delta);
}
// Update spawn points
for(unsigned int i=0;i<spawnPoints.size();++i)
{
if(spawnPoints[i]->GetWaitTime() > 0)
spawnPoints[i]->SetWaitTime(spawnPoints[i]->GetWaitTime() - _delta);
if(spawnPoints[i]->GetWaitTime() <= 0)
{
Enemy *enemy = spawnPoints[i]->Spawn(_delta);
if(enemy)
enemies.push_back(enemy);
}
}
// Prevent wait time filler
if(!enemies.size() && spawnPoints.size())
{
float leastTime = spawnPoints[0]->GetWaitTime();
unsigned int index = 0;
for(unsigned int i=0;i<spawnPoints.size();++i)
{
if(leastTime > spawnPoints[i]->GetWaitTime())
{
leastTime = spawnPoints[i]->GetWaitTime();
index = i;
}
}
spawnPoints[index]->SetWaitTime(0);
}
}