Improve spawn formula

This commit is contained in:
Benau 2016-10-07 21:49:05 +08:00
parent c907442bb4
commit 71662df159
2 changed files with 57 additions and 33 deletions

View File

@ -101,7 +101,12 @@ void ThreeStrikesBattle::reset()
{
WorldWithRank::reset();
m_sta_spawned_count = 1;
m_next_sta_spawn_time =
race_manager->getDifficulty() == RaceManager::DIFFICULTY_BEST ? 40.0f :
race_manager->getDifficulty() == RaceManager::DIFFICULTY_HARD ? 30.0f :
race_manager->getDifficulty() == RaceManager::DIFFICULTY_MEDIUM ?
25.0f : 20.0f;
const unsigned int kart_amount = (unsigned int)m_karts.size();
for(unsigned int n=0; n<kart_amount; n++)
@ -362,37 +367,7 @@ void ThreeStrikesBattle::update(float dt)
}
}
const float period = 20.0f;
if (!m_spare_tire_karts.empty() &&
period < getTimeSinceStart() / float(m_sta_spawned_count))
{
// Spawn spare tire kart when necessary
m_sta_spawned_count++;
// Formula : Total num of karts with life != 3 *
// time period / time since start, so towards the end of game,
// karts are less likely to gain back a life.
int kart_has_few_lives = 0;
for (unsigned int i = 0; i < m_kart_info.size(); i++)
m_kart_info[i].m_lives != 3 ? kart_has_few_lives++ : 0;
float ratio = kart_has_few_lives * period / getTimeSinceStart();
if (ratio > 1.0f)
{
unsigned int spawn_sta = unsigned(ratio);
if (spawn_sta > m_spare_tire_karts.size())
spawn_sta = m_spare_tire_karts.size();
m_race_gui->addMessage(_P("%i spare tire kart has been spawned!",
"%i spare tire karts have been spawned!",
spawn_sta), NULL, 2.0f);
for (unsigned int i = 0; i < spawn_sta; i++)
{
SpareTireAI* sta = dynamic_cast<SpareTireAI*>
(m_spare_tire_karts[i]->getController());
assert(sta);
sta->spawn(period / 2);
}
}
}
spawnSpareTireKarts();
if (m_track->hasNavMesh())
updateSectorForKarts();
@ -656,3 +631,51 @@ void ThreeStrikesBattle::addKartLife(unsigned int id)
}
} // addKartLife
//-----------------------------------------------------------------------------
void ThreeStrikesBattle::spawnSpareTireKarts()
{
if (m_spare_tire_karts.empty() ||
getTimeSinceStart() < m_next_sta_spawn_time)
return;
const float period =
race_manager->getDifficulty() == RaceManager::DIFFICULTY_BEST ? 40.0f :
race_manager->getDifficulty() == RaceManager::DIFFICULTY_HARD ? 30.0f :
race_manager->getDifficulty() == RaceManager::DIFFICULTY_MEDIUM ?
25.0f : 20.0f;
const float inc_factor =
race_manager->getDifficulty() == RaceManager::DIFFICULTY_BEST ? 0.7f :
race_manager->getDifficulty() == RaceManager::DIFFICULTY_HARD ? 0.65f :
race_manager->getDifficulty() == RaceManager::DIFFICULTY_MEDIUM ?
0.6f : 0.55f;
// Spawn spare tire kart when necessary
// The lifespan for sta: inc_factor / period * 1000 / 2
// So in easier mode the sta lasts longer than spawn period
const float lifespan = inc_factor / period * 1000;
m_next_sta_spawn_time = lifespan + (getTimeSinceStart() * inc_factor) +
getTimeSinceStart();
int kart_has_few_lives = 0;
for (unsigned int i = 0; i < m_kart_info.size(); i++)
{
if (m_kart_info[i].m_lives > 0 && m_kart_info[i].m_lives < 3)
kart_has_few_lives++;
}
float ratio = kart_has_few_lives / (inc_factor * 2);
if (ratio < 1.5f) return;
unsigned int spawn_sta = unsigned(ratio);
if (spawn_sta > m_spare_tire_karts.size())
spawn_sta = m_spare_tire_karts.size();
m_race_gui->addMessage(_P("%i spare tire kart has been spawned!",
"%i spare tire karts have been spawned!",
spawn_sta), NULL, 2.0f);
for (unsigned int i = 0; i < spawn_sta; i++)
{
SpareTireAI* sta = dynamic_cast<SpareTireAI*>
(m_spare_tire_karts[i]->getController());
assert(sta);
sta->spawn(lifespan);
}
} // spawnSpareTireKarts

View File

@ -78,7 +78,7 @@ private:
int m_total_hit;
std::vector<AbstractKart*> m_spare_tire_karts;
int m_sta_spawned_count;
float m_next_sta_spawn_time;
public:
@ -121,6 +121,7 @@ public:
void addKartLife(unsigned int id);
int getKartLife(unsigned int id) const { return m_kart_info[id].m_lives; }
bool spareTireKartsSpawned() const;
void spawnSpareTireKarts();
unsigned int getNumSpareTireKarts() const { return m_spare_tire_karts.size(); }
}; // ThreeStrikesBattles