From 78f50b0245229b68d6900114186acf104e938a1d Mon Sep 17 00:00:00 2001 From: auria Date: Thu, 11 Dec 2008 00:45:54 +0000 Subject: [PATCH] fixed shortcut detection bugs git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@2603 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- src/modes/linear_world.cpp | 29 +++++++++++++++++++++++------ src/track.cpp | 5 ++++- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/modes/linear_world.cpp b/src/modes/linear_world.cpp index 47d88384a..9dff5134b 100644 --- a/src/modes/linear_world.cpp +++ b/src/modes/linear_world.cpp @@ -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 --; diff --git a/src/track.cpp b/src/track.cpp index b7a6d6b08..9ba0a531b 100644 --- a/src/track.cpp +++ b/src/track.cpp @@ -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