Reset min nitro time when no nitro and fix #3180

This commit is contained in:
Alayan 2018-09-17 14:40:23 +02:00
parent 75127fc044
commit 025c60033d
2 changed files with 21 additions and 5 deletions

View File

@ -142,6 +142,9 @@ Kart::Kart (const std::string& ident, unsigned int world_kart_id,
m_stars_effect = NULL; m_stars_effect = NULL;
m_is_jumping = false; m_is_jumping = false;
m_min_nitro_ticks = 0; m_min_nitro_ticks = 0;
m_energy_to_min_ratio = 0;
m_consumption_per_tick = stk_config->ticks2Time(1) *
m_kart_properties->getNitroConsumption();
m_fire_clicked = 0; m_fire_clicked = 0;
m_boosted_ai = false; m_boosted_ai = false;
m_type = RaceManager::KT_AI; m_type = RaceManager::KT_AI;
@ -330,6 +333,9 @@ void Kart::reset()
} }
m_min_nitro_ticks = 0; m_min_nitro_ticks = 0;
m_energy_to_min_ratio = 0;
m_consumption_per_tick = stk_config->ticks2Time(1) *
m_kart_properties->getNitroConsumption();
// Reset star effect in case that it is currently being shown. // Reset star effect in case that it is currently being shown.
m_stars_effect->reset(); m_stars_effect->reset();
@ -2122,9 +2128,14 @@ void Kart::handleZipper(const Material *material, bool play_sound)
*/ */
void Kart::updateNitro(int ticks) void Kart::updateNitro(int ticks)
{ {
if (m_controls.getNitro() && m_min_nitro_ticks <= 0) if (m_collected_energy == 0)
m_min_nitro_ticks = 0;
if (m_controls.getNitro() && m_min_nitro_ticks <= 0 && m_collected_energy > 0)
{ {
m_min_nitro_ticks = m_kart_properties->getNitroMinConsumptionTicks(); m_min_nitro_ticks = m_kart_properties->getNitroMinConsumptionTicks();
float min_consumption = m_min_nitro_ticks * m_consumption_per_tick;
m_energy_to_min_ratio = std::min<float>(1, m_collected_energy/min_consumption);
} }
if (m_min_nitro_ticks > 0) if (m_min_nitro_ticks > 0)
{ {
@ -2147,8 +2158,8 @@ void Kart::updateNitro(int ticks)
return; return;
} }
float dt = stk_config->ticks2Time(ticks);
m_collected_energy -= dt * m_kart_properties->getNitroConsumption(); m_collected_energy -= m_consumption_per_tick*ticks;
if (m_collected_energy < 0) if (m_collected_energy < 0)
{ {
if(m_nitro_sound->getStatus() == SFXBase::SFX_PLAYING && !rewinding) if(m_nitro_sound->getStatus() == SFXBase::SFX_PLAYING && !rewinding)
@ -2161,10 +2172,11 @@ void Kart::updateNitro(int ticks)
{ {
if(m_nitro_sound->getStatus() != SFXBase::SFX_PLAYING && !rewinding) if(m_nitro_sound->getStatus() != SFXBase::SFX_PLAYING && !rewinding)
m_nitro_sound->play(); m_nitro_sound->play();
m_max_speed->increaseMaxSpeed(MaxSpeed::MS_INCREASE_NITRO, m_max_speed->increaseMaxSpeed(MaxSpeed::MS_INCREASE_NITRO,
m_kart_properties->getNitroMaxSpeedIncrease(), m_kart_properties->getNitroMaxSpeedIncrease(),
m_kart_properties->getNitroEngineForce(), m_kart_properties->getNitroEngineForce(),
stk_config->time2Ticks(m_kart_properties->getNitroDuration()), stk_config->time2Ticks(m_kart_properties->getNitroDuration()*m_energy_to_min_ratio),
stk_config->time2Ticks(m_kart_properties->getNitroFadeOutTime())); stk_config->time2Ticks(m_kart_properties->getNitroFadeOutTime()));
} }
else else

View File

@ -186,10 +186,14 @@ protected:
btVehicleRaycaster *m_vehicle_raycaster; btVehicleRaycaster *m_vehicle_raycaster;
btKart *m_vehicle; btKart *m_vehicle;
/** The amount of energy collected by hitting coins. Note that it /** The amount of energy collected with nitro cans. Note that it
* must be float, since dt is subtraced in each timestep. */ * must be float, since dt is subtraced in each timestep. */
float m_collected_energy; float m_collected_energy;
float m_consumption_per_tick;
float m_energy_to_min_ratio;
// Graphical effects // Graphical effects
// ----------------- // -----------------