fixed shortcut detection bugs

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@2603 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2008-12-11 00:45:54 +00:00
parent 5091cf74b0
commit 78f50b0245
2 changed files with 27 additions and 7 deletions

View File

@ -177,7 +177,12 @@ void LinearWorld::update(float delta)
return;
}
if(kart_info.m_track_sector != Track::UNKNOWN_SECTOR && !kart->isRescue()) kart_info.m_last_valid_sector = kart_info.m_track_sector;
// --------- do lap counting ------
doLapCounting(kart_info, kart);
if(kart_info.m_track_sector != Track::UNKNOWN_SECTOR && !kart->isRescue())
kart_info.m_last_valid_sector = kart_info.m_track_sector;
// check if kart is on the road - if not, find the closest sector
if (kart_info.m_track_sector == Track::UNKNOWN_SECTOR && !kart->isRescue())
@ -230,15 +235,16 @@ void LinearWorld::update(float delta)
} // if difficulty easy
}// end if is player kart
// --------- do lap counting ------
doLapCounting(kart_info, kart);
}// next kart
}
//-----------------------------------------------------------------------------
void LinearWorld::doLapCounting ( KartInfo& kart_info, Kart* kart )
{
bool newLap = kart_info.m_last_track_coords[1] > 300.0f &&
kart_info.m_curr_track_coords.getY() < 20.0f;
//bool newLap = kart_info.m_last_track_coords[1] > 300.0f &&
// kart_info.m_curr_track_coords.getY() < 20.0f;
const bool newLap = kart_info.m_last_valid_sector == (int)RaceManager::getTrack()->m_distance_from_start.size()-1 &&
kart_info.m_track_sector == 0;
if ( newLap )
{
// Only increase the lap counter and set the new time if the
@ -488,7 +494,15 @@ void LinearWorld::forceRescue(Kart* kart, KartInfo& kart_info, bool shortcut)
// flag, so that this shortcut is not counted!
if(shortcut)
{
kart_info.m_track_sector = kart_info.m_last_valid_sector;
const bool warp_around = kart_info.m_last_valid_sector == 0;
kart_info.m_track_sector = kart_info.m_last_valid_sector+1; // add one because 'moveKartAfterRescue' removes 1
// don't let kart get a new free lap cause he was dropped at begin line...
if(warp_around)
{
kart_info.m_race_lap--;
kart_info.m_lap_start_time = -1; // invalidate time so he doesn't get a best time
}
}
kart->forceRescue();
@ -500,6 +514,9 @@ void LinearWorld::moveKartAfterRescue(Kart* kart, btRigidBody* body)
{
KartInfo& info = m_kart_info[kart->getWorldKartId()];
// FIXME - removing 1 here makes it less likely to fall in a rescue loop since the kart
// moves back on each attempt. This is still a weak hack. Also some other code depends
// on 1 being substracted, like 'forceRescue'
if ( info.m_track_sector > 0 ) info.m_track_sector-- ;
info.m_last_valid_sector = info.m_track_sector;
if ( info.m_last_valid_sector > 0 ) info.m_last_valid_sector --;

View File

@ -468,7 +468,10 @@ bool Track::isShortcut(const int OLDSEC, const int NEWSEC) const
// Handle 'warp around'
const int track_length = (int)m_distance_from_start[m_driveline.size()-1];
if( distance_sectors < 0 ) distance_sectors += track_length;
else if( distance_sectors > track_length/2) distance_sectors -= track_length;
//else if( distance_sectors > track_length*3.0f/4.0f) distance_sectors -= track_length;
if(std::max(NEWSEC, OLDSEC) > (int)RaceManager::getTrack()->m_distance_from_start.size()-6 &&
std::min(NEWSEC, OLDSEC) < 6) distance_sectors -= track_length; // crossed start line
return (distance_sectors > stk_config->m_shortcut_length);
} // isShortcut