1 Commits

Author SHA1 Message Date
hikerstk
7c2039c37a Moved supertuxkart branches to new directory.
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/0.6.1@3233 178a84e3-b1eb-0310-8ba1-8eac791a3b58
2009-03-12 01:56:24 +00:00
26 changed files with 93 additions and 155 deletions

View File

@@ -1,23 +1,3 @@
SuperTuxKart 0.6.2 (July 2009)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Bugfix: game could crash in rare circumstances.
* Bugfix: Restarting a GP (with the in-race menu ESC) would
not subtract already allocated points.
* Bugfix: A race could be finished with an invalid shortcut.
* Bugfix: Playing a challenge after a splitscreen game would
play the challenge in split screen.
* Bugfix: Items explode over void.
* Bugfix: Grass in castle arena slowed down the kart.
* Bugfix: GP result showed kart identifier instead of name.
* Improvement: there is now 1 1 sec. wait period for the race
result screen, avoiding the problem that someone
presses space/enter at the end of a race, immediately
quitting the menu before it can be read.
SuperTuxKart 0.6.1a (February 2009)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Bugfix: battle mode would not display track groups.
SuperTuxKart 0.6.1 (February 2009) SuperTuxKart 0.6.1 (February 2009)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Added new kart ("Puffy"), new battle map ("Cave"), and new music * Added new kart ("Puffy"), new battle map ("Cave"), and new music

13
NEWS
View File

@@ -1,16 +1,3 @@
SuperTuxkart 0.6.2 (July 2009)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Bugfix: battle mode would not display track groups.
SuperTuxkart 0.6.1 (Feburary 2009)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Added new kart ("Puffy"), new battle map ("Cave"), and new music
for Snow Mountain.
* Added slow-down for karts driving backwards.
* Somewhat reduced 'shaking' of AI driven karts.
* Fixed several bugs, including incorrect rescues, and track
and kart selection issues.
SuperTuxKart 0.5 (May 2008) SuperTuxKart 0.5 (May 2008)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Six new tracks and one improved track: Fort Magma, SnowTux Peak, Amazonian Journey, City, * Six new tracks and one improved track: Fort Magma, SnowTux Peak, Amazonian Journey, City,

View File

@@ -1,6 +1,6 @@
dnl Process this file with autogen.sh to produce a configure script. dnl Process this file with autogen.sh to produce a configure script.
AC_INIT(supertuxkart, 0.6.2) AC_INIT(supertuxkart, 0.6.1)
AC_CONFIG_SRCDIR([src/main.cpp]) AC_CONFIG_SRCDIR([src/main.cpp])
AC_PREREQ(2.61) AC_PREREQ(2.61)

View File

@@ -1,4 +1,4 @@
Super TuxKart - 0.6.2 Super TuxKart - 0.6.1
===================== =====================
Visit us at http://supertuxkart.sourceforge.net Visit us at http://supertuxkart.sourceforge.net

View File

@@ -48,7 +48,7 @@ void GLDebugDrawer::draw3dText(const btVector3& location,const char* textString)
void GLDebugDrawer::reportErrorWarning(const char* warningString) void GLDebugDrawer::reportErrorWarning(const char* warningString)
{ {
printf("%s", warningString); printf(warningString);
} }
void GLDebugDrawer::drawContactPoint(const btVector3& pointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color) void GLDebugDrawer::drawContactPoint(const btVector3& pointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color)

View File

@@ -219,7 +219,6 @@ void ChallengeData::setRace() const
race_manager->setNumLaps(m_num_laps); race_manager->setNumLaps(m_num_laps);
race_manager->setNumKarts(m_num_karts); race_manager->setNumKarts(m_num_karts);
race_manager->setNumPlayers(1); race_manager->setNumPlayers(1);
race_manager->setNumLocalPlayers(1);
race_manager->setCoinTarget(m_energy); race_manager->setCoinTarget(m_energy);
} }
else // GP else // GP
@@ -230,7 +229,6 @@ void ChallengeData::setRace() const
race_manager->setDifficulty(m_difficulty); race_manager->setDifficulty(m_difficulty);
race_manager->setNumKarts(m_num_karts); race_manager->setNumKarts(m_num_karts);
race_manager->setNumPlayers(1); race_manager->setNumPlayers(1);
race_manager->setNumLocalPlayers(1);
//race_manager->setGrandPrix(); //race_manager->setGrandPrix();
} }
} // setRace } // setRace

View File

@@ -52,7 +52,7 @@ GrandPrixData::GrandPrixData(const std::string filename)
catch(std::exception& err) catch(std::exception& err)
{ {
fprintf(stderr, "Error while reading grandprix file '%s'\n", filename.c_str()); fprintf(stderr, "Error while reading grandprix file '%s'\n", filename.c_str());
fprintf(stderr, "%s", err.what()); fprintf(stderr, err.what());
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }

View File

@@ -80,11 +80,8 @@ GrandPrixEnd::GrandPrixEnd()
} }
static char output[MAX_MESSAGE_LENGTH]; static char output[MAX_MESSAGE_LENGTH];
const std::string kart_id = race_manager->getKartName(winner_kart_id);
const KartProperties* winning_kart = kart_properties_manager->getKart(kart_id);
snprintf(output, sizeof(output), snprintf(output, sizeof(output),
_("The winner is %s!"),winning_kart->getName().c_str()); _("The winner is %s!"),race_manager->getKartName(winner_kart_id).c_str()); // FIXME - uses inner-name and not user name
widget_manager->addWgt( WTOK_TITLE, 60, 10); widget_manager->addWgt( WTOK_TITLE, 60, 10);
widget_manager->showWgtRect(WTOK_TITLE); widget_manager->showWgtRect(WTOK_TITLE);
widget_manager->showWgtText(WTOK_TITLE); widget_manager->showWgtText(WTOK_TITLE);

View File

@@ -91,7 +91,7 @@ void RaceMenu::select()
case WTOK_RESTART_RACE: case WTOK_RESTART_RACE:
menu_manager->popMenu(); menu_manager->popMenu();
if(user_config->m_fullscreen) SDL_ShowCursor(SDL_DISABLE); if(user_config->m_fullscreen) SDL_ShowCursor(SDL_DISABLE);
race_manager->rerunRace(); RaceManager::getWorld()->restartRace();
break; break;
case WTOK_OPTIONS: case WTOK_OPTIONS:

View File

@@ -31,18 +31,8 @@
#include "network/network_manager.hpp" #include "network/network_manager.hpp"
#include "utils/translation.hpp" #include "utils/translation.hpp"
/** It can happen (e.g. if a player has skidding assigned to space or enter)
* that a selection key is still pressed when this menu is shown (e.g. follow
* the leader race which doesn't have a end-race-camera). To avoid that this
* menu is left as soon as it is entered (since back to main menu is selected
* as default), WAITING_TIME seconds have to pass before a selection is
* accepted. Admittedly a somehwat ugly work around.
*/
#define WAITING_TIME 1
RaceResultsGUI::RaceResultsGUI() RaceResultsGUI::RaceResultsGUI()
{ {
m_waiting_time = WAITING_TIME;
m_first_time = true; m_first_time = true;
m_selected_widget = WTOK_NONE; m_selected_widget = WTOK_NONE;
@@ -227,10 +217,6 @@ RaceResultsGUI::~RaceResultsGUI()
*/ */
void RaceResultsGUI::select() void RaceResultsGUI::select()
{ {
// Ignore a selection if the menu is still in 'waiting' mode. This helps
// in case that someone presses space or enter while a FTL race finishes
// --> this menu isn't immediately canceled.
if(m_waiting_time>=0) return;
// Push the unlocked-feature menu in for now // Push the unlocked-feature menu in for now
if(unlock_manager->getUnlockedFeatures().size()>0) if(unlock_manager->getUnlockedFeatures().size()>0)
{ {
@@ -242,6 +228,7 @@ void RaceResultsGUI::select()
// The selected token is saved here, which triggers a change of the text // The selected token is saved here, which triggers a change of the text
// in update(). // in update().
m_selected_widget = (WidgetTokens)widget_manager->getSelectedWgt(); m_selected_widget = (WidgetTokens)widget_manager->getSelectedWgt();
// Clients send the ack to the server // Clients send the ack to the server
if(network_manager->getMode()==NetworkManager::NW_CLIENT) if(network_manager->getMode()==NetworkManager::NW_CLIENT)
network_manager->sendRaceResultAck(); network_manager->sendRaceResultAck();
@@ -286,7 +273,6 @@ void RaceResultsGUI::setSelectedWidget(int token)
*/ */
void RaceResultsGUI::update(float dt) void RaceResultsGUI::update(float dt)
{ {
m_waiting_time -= dt;
BaseGUI::update(dt); BaseGUI::update(dt);
// If an item is selected (for the first time), change the text // If an item is selected (for the first time), change the text
// so that the user has feedback about his selection. // so that the user has feedback about his selection.

View File

@@ -51,8 +51,6 @@ private:
WidgetTokens m_selected_widget; WidgetTokens m_selected_widget;
Widget *displayRaceResults(); Widget *displayRaceResults();
Widget *displayKartList(Widget *w_prev, int *order, float horizontal); Widget *displayKartList(Widget *w_prev, int *order, float horizontal);
/** Waiting time before this menu can be left. */
float m_waiting_time;
public: public:
RaceResultsGUI(); RaceResultsGUI();
~RaceResultsGUI(); ~RaceResultsGUI();

View File

@@ -166,16 +166,17 @@ void TrackSel::updateScrollPosition()
void TrackSel::switchGroup() void TrackSel::switchGroup()
{ {
m_index_avail_tracks.clear(); m_index_avail_tracks.clear();
bool is_battle_mode = RaceManager::isBattleMode(race_manager->getMinorMode()); bool group_available =
bool group_available = is_battle_mode (RaceManager::isBattleMode( race_manager->getMinorMode() )
? track_manager->getArenasInGroup(user_config->m_track_group).size()>0 ? track_manager->getArenasInGroup(user_config->m_track_group)
: track_manager->getTracksInGroup(user_config->m_track_group).size()>0; : track_manager->getTracksInGroup(user_config->m_track_group)).size()>0;
if(!group_available) if(!group_available)
user_config->m_track_group = "standard"; user_config->m_track_group = "standard";
const std::vector<int> &tracks = is_battle_mode const std::vector<int> &tracks =
? track_manager->getArenasInGroup(user_config->m_track_group) RaceManager::isBattleMode( race_manager->getMinorMode() ) ?
: track_manager->getTracksInGroup(user_config->m_track_group); track_manager->getArenasInGroup(user_config->m_track_group) :
track_manager->getTracksInGroup(user_config->m_track_group);
for(unsigned int i=0; i<tracks.size(); i++) for(unsigned int i=0; i<tracks.size(); i++)
{ {
@@ -196,9 +197,7 @@ void TrackSel::switchGroup()
// Check if there are any tracks available in this group - i.e. not only locked // Check if there are any tracks available in this group - i.e. not only locked
// tracks, and not only non-arena if arena mode (and vice versa). // tracks, and not only non-arena if arena mode (and vice versa).
const std::vector<int> &tracks_in_group = is_battle_mode const std::vector<int> &tracks_in_group = track_manager->getTracksInGroup(groups[i]);
? track_manager->getArenasInGroup(groups[i])
: track_manager->getTracksInGroup(groups[i]);
bool ignore_group=true; bool ignore_group=true;
for(unsigned int j=0; j<tracks_in_group.size(); j++) for(unsigned int j=0; j<tracks_in_group.size(); j++)
{ {
@@ -206,7 +205,8 @@ void TrackSel::switchGroup()
// Locked tracks are not available // Locked tracks are not available
if(unlock_manager->isLocked(track->getIdent())) continue; if(unlock_manager->isLocked(track->getIdent())) continue;
// Tracks of a different type are not available // Tracks of a different type are not available
ignore_group = is_battle_mode != track->isArena(); ignore_group = RaceManager::isBattleMode(race_manager->getMinorMode()) !=
track->isArena();
if(!ignore_group) break; if(!ignore_group) break;
} }

View File

@@ -150,7 +150,7 @@ void HighscoreManager::Load()
{ {
fprintf(stderr, "Error while parsing highscore file '%s':\n", fprintf(stderr, "Error while parsing highscore file '%s':\n",
m_filename.c_str()); m_filename.c_str());
fprintf(stderr, "%s", err.what()); fprintf(stderr, err.what());
fprintf(stderr, "\n"); fprintf(stderr, "\n");
fprintf(stderr, "No old highscores will be available.\n"); fprintf(stderr, "No old highscores will be available.\n");
} }
@@ -188,7 +188,8 @@ void HighscoreManager::Save()
{ {
printf("Problems saving highscores in '%s'\n", printf("Problems saving highscores in '%s'\n",
m_filename.c_str()); m_filename.c_str());
puts(e.what()); printf(e.what());
printf("\n");
m_can_write=false; m_can_write=false;
} }
} // Save } // Save

View File

@@ -15,20 +15,46 @@ Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
BulletDebug|Win32 = BulletDebug|Win32 BulletDebug|Win32 = BulletDebug|Win32
BulletRelease|Win32 = BulletRelease|Win32 BulletRelease|Win32 = BulletRelease|Win32
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
ReplayDebug|Win32 = ReplayDebug|Win32
ReplayRelease|Win32 = ReplayRelease|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.BulletDebug|Win32.ActiveCfg = BulletDebug|Win32 {B1BC2764-1A43-4800-A654-788B0D05EDA2}.BulletDebug|Win32.ActiveCfg = BulletDebug|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.BulletDebug|Win32.Build.0 = BulletDebug|Win32 {B1BC2764-1A43-4800-A654-788B0D05EDA2}.BulletDebug|Win32.Build.0 = BulletDebug|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.BulletRelease|Win32.ActiveCfg = BulletRelease|Win32 {B1BC2764-1A43-4800-A654-788B0D05EDA2}.BulletRelease|Win32.ActiveCfg = BulletRelease|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.BulletRelease|Win32.Build.0 = BulletRelease|Win32 {B1BC2764-1A43-4800-A654-788B0D05EDA2}.BulletRelease|Win32.Build.0 = BulletRelease|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.Debug|Win32.ActiveCfg = Debug|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.Debug|Win32.Build.0 = Debug|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.Release|Win32.ActiveCfg = Release|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.Release|Win32.Build.0 = Release|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.ReplayDebug|Win32.ActiveCfg = ReplayDebug|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.ReplayDebug|Win32.Build.0 = ReplayDebug|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.ReplayRelease|Win32.ActiveCfg = ReplayRelease|Win32
{B1BC2764-1A43-4800-A654-788B0D05EDA2}.ReplayRelease|Win32.Build.0 = ReplayRelease|Win32
{54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.BulletDebug|Win32.ActiveCfg = Debug|Win32 {54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.BulletDebug|Win32.ActiveCfg = Debug|Win32
{54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.BulletDebug|Win32.Build.0 = Debug|Win32 {54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.BulletDebug|Win32.Build.0 = Debug|Win32
{54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.BulletRelease|Win32.ActiveCfg = Release|Win32 {54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.BulletRelease|Win32.ActiveCfg = Release|Win32
{54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.BulletRelease|Win32.Build.0 = Release|Win32 {54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.BulletRelease|Win32.Build.0 = Release|Win32
{54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.Debug|Win32.ActiveCfg = Debug|Win32
{54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.Debug|Win32.Build.0 = Debug|Win32
{54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.Release|Win32.ActiveCfg = Release|Win32
{54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.Release|Win32.Build.0 = Release|Win32
{54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.ReplayDebug|Win32.ActiveCfg = Debug|Win32
{54AA44B9-B07B-49DA-8B1A-05BBFE8AD5D4}.ReplayRelease|Win32.ActiveCfg = Release|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.BulletDebug|Win32.ActiveCfg = Release|Win32 {B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.BulletDebug|Win32.ActiveCfg = Release|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.BulletDebug|Win32.Build.0 = Release|Win32 {B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.BulletDebug|Win32.Build.0 = Release|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.BulletRelease|Win32.ActiveCfg = Release|Win32 {B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.BulletRelease|Win32.ActiveCfg = Release|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.BulletRelease|Win32.Build.0 = Release|Win32 {B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.BulletRelease|Win32.Build.0 = Release|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.Debug|Win32.ActiveCfg = Debug|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.Debug|Win32.Build.0 = Debug|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.Release|Win32.ActiveCfg = Release|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.Release|Win32.Build.0 = Release|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.ReplayDebug|Win32.ActiveCfg = Debug|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.ReplayDebug|Win32.Build.0 = Debug|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.ReplayRelease|Win32.ActiveCfg = Release|Win32
{B0E92B97-089A-4D5B-BF17-77F1BC5DAEEF}.ReplayRelease|Win32.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@@ -517,7 +517,7 @@
Optimization="0" Optimization="0"
WholeProgramOptimization="false" WholeProgramOptimization="false"
AdditionalIncludeDirectories="../../../src;../../../src/bullet/src;&quot;$(STK_INCLUDE)&quot;;../../../src/enet/include" AdditionalIncludeDirectories="../../../src;../../../src/bullet/src;&quot;$(STK_INCLUDE)&quot;;../../../src/enet/include"
PreprocessorDefinitions="BT_NO_PROFILE;HAVE_OPENAL;HAVE_OGGVORBIS;_DEBUG;_CONSOLE;WIN32;NOMINMAX;VERSION=\&quot;0.6.2\&quot;;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;DEBUG;PACKAGE=\&quot;supertuxkart\&quot;;HAVE_GETTEXT;ENABLE_NLS;HAVE_GLUT" PreprocessorDefinitions="BT_NO_PROFILE;HAVE_OPENAL;HAVE_OGGVORBIS;_DEBUG;_CONSOLE;WIN32;NOMINMAX;VERSION=\&quot;0.6.1\&quot;;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;DEBUG;PACKAGE=\&quot;supertuxkart\&quot;;HAVE_GETTEXT;ENABLE_NLS;HAVE_GLUT"
GeneratePreprocessedFile="0" GeneratePreprocessedFile="0"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
@@ -605,7 +605,7 @@
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
WholeProgramOptimization="true" WholeProgramOptimization="true"
AdditionalIncludeDirectories="../../../src;../../../src/bullet/src;&quot;$(STK_INCLUDE)&quot;;../../../src/enet/include" AdditionalIncludeDirectories="../../../src;../../../src/bullet/src;&quot;$(STK_INCLUDE)&quot;;../../../src/enet/include"
PreprocessorDefinitions="HAVE_OPENAL;HAVE_OGGVORBIS;NDEBUG;_CONSOLE;WIN32;NOMINMAX;VERSION=\&quot;0.6.2\&quot;;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;BT_NO_PROFILE;PACKAGE=\&quot;supertuxkart\&quot;;HAVE_GETTEXT;ENABLE_NLS;HAVE_GLUT" PreprocessorDefinitions="HAVE_OPENAL;HAVE_OGGVORBIS;NDEBUG;_CONSOLE;WIN32;NOMINMAX;VERSION=\&quot;0.6.1\&quot;;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;BT_NO_PROFILE;PACKAGE=\&quot;supertuxkart\&quot;;HAVE_GETTEXT;ENABLE_NLS;HAVE_GLUT"
RuntimeLibrary="2" RuntimeLibrary="2"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"

View File

@@ -197,14 +197,7 @@ void Flyable::update (float dt)
Vec3 pos=getBody()->getWorldTransform().getOrigin(); Vec3 pos=getBody()->getWorldTransform().getOrigin();
TerrainInfo::update(pos); TerrainInfo::update(pos);
// Check if the flyable is out of the track boundary. if(getHoT()==Track::NOHIT)
// If so, let it explode. Note: height is not tested,
// so that things can fly as high as they want to.
Vec3 min, max;
RaceManager::getTrack()->getAABB(&min, &max);
Vec3 xyz=getXYZ();
if( xyz[0]<min[0] || xyz[1]<min[1] || xyz[2]<min[2] ||
xyz[0]>max[0] || xyz[1]>max[1] )
{ {
hit(NULL); // flyable out of track boundary hit(NULL); // flyable out of track boundary
return; return;

View File

@@ -51,7 +51,7 @@ RubberBand::RubberBand(Plunger *plunger, const Kart &kart)
vertices->add(0, 0, 0); vertices->add(0, 0, 0); vertices->add(0, 0, 0); vertices->add(0, 0, 0);
vertices->add(0, 0, 0); vertices->add(0, 0, 0); vertices->add(0, 0, 0); vertices->add(0, 0, 0);
m_attached_state = RB_TO_PLUNGER; m_attached_state = RB_TO_PLUNGER;
updatePosition(); update(0);
sgVec3 norm; sgVec3 norm;
sgSetVec3(norm, 1/sqrt(2.0f), 0, 1/sqrt(2.0f)); sgSetVec3(norm, 1/sqrt(2.0f), 0, 1/sqrt(2.0f));
@@ -79,42 +79,6 @@ void RubberBand::removeFromScene()
scene->remove(this); scene->remove(this);
} // removeFromScene } // removeFromScene
// ----------------------------------------------------------------------------
/** Updates the position of the rubber band. It especially sets the
* end position of the rubber band, i.e. the side attached to the plunger,
* track, or kart hit.
*/
void RubberBand::updatePosition()
{
const Vec3 &k = m_owner.getXYZ();
// Get the position to which the band is attached
// ----------------------------------------------
switch(m_attached_state)
{
case RB_TO_KART: m_end_position = m_hit_kart->getXYZ(); break;
case RB_TO_TRACK: m_end_position = m_hit_position; break;
case RB_TO_PLUNGER: m_end_position = m_plunger->getXYZ();
checkForHit(k, m_end_position); break;
} // switch(m_attached_state);
// Update the rubber band positions
// --------------------------------
// Todo: make height dependent on length (i.e. rubber band gets
// thinner). And call explosion if the band is too long.
const float hh=.1f; // half height of the band
const Vec3 &p=m_end_position; // for shorter typing
float *f = vertices->get(0);
f[0] = p.getX()-hh; f[1] = p.getY(); f[2] = p.getZ()-hh;
f = vertices->get(1);
f[0] = p.getX()+hh; f[1] = p.getY(); f[2] = p.getZ()+hh;
f = vertices->get(2);
f[0] = k.getX()+hh; f[1] = k.getY(); f[2] = k.getZ()+hh;
f = vertices->get(3);
f[0] = k.getX()-hh; f[1] = k.getY(); f[2] = k.getZ()-hh;
dirtyBSphere();
} // updatePosition
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/** Updates the rubber band. It takes the new position of the kart and the /** Updates the rubber band. It takes the new position of the kart and the
* plunger, and sets the quad representing the rubber band appropriately. * plunger, and sets the quad representing the rubber band appropriately.
@@ -133,12 +97,38 @@ void RubberBand::update(float dt)
return; return;
} }
updatePosition(); Vec3 p;
const Vec3 &k = m_owner.getXYZ(); const Vec3 &k = m_owner.getXYZ();
// Get the position to which the band is attached
// ----------------------------------------------
switch(m_attached_state)
{
case RB_TO_KART: p = m_hit_kart->getXYZ(); break;
case RB_TO_TRACK: p = m_hit_position; break;
case RB_TO_PLUNGER: p = m_plunger->getXYZ();
checkForHit(k, p); break;
} // switch(m_attached_state);
// Draw the rubber band
// --------------------
// Todo: make height dependent on length (i.e. rubber band gets
// thinner). And call explosion if the band is too long.
const float hh=.1f; // half height of the band
float *f = vertices->get(0);
f[0] = p.getX()-hh; f[1] = p.getY(); f[2] = p.getZ()-hh;
f = vertices->get(1);
f[0] = p.getX()+hh; f[1] = p.getY(); f[2] = p.getZ()+hh;
f = vertices->get(2);
f[0] = k.getX()+hh; f[1] = k.getY(); f[2] = k.getZ()+hh;
f = vertices->get(3);
f[0] = k.getX()-hh; f[1] = k.getY(); f[2] = k.getZ()-hh;
dirtyBSphere();
// Check for rubber band snapping // Check for rubber band snapping
// ------------------------------ // ------------------------------
float l = (m_end_position-k).length2(); float l = (p-k).length2();
float max_len = m_owner.getKartProperties()->getRubberBandMaxLength(); float max_len = m_owner.getKartProperties()->getRubberBandMaxLength();
if(l>max_len*max_len) if(l>max_len*max_len)
{ {
@@ -153,7 +143,7 @@ void RubberBand::update(float dt)
if(m_attached_state!=RB_TO_PLUNGER) if(m_attached_state!=RB_TO_PLUNGER)
{ {
float force = m_owner.getKartProperties()->getRubberBandForce(); float force = m_owner.getKartProperties()->getRubberBandForce();
Vec3 diff = m_end_position-k; Vec3 diff = p-k;
// detach rubber band if kart gets very close to hit point // detach rubber band if kart gets very close to hit point
if(m_attached_state==RB_TO_TRACK && diff.length2() < 10*10) if(m_attached_state==RB_TO_TRACK && diff.length2() < 10*10)

View File

@@ -50,12 +50,7 @@ private:
/** State for rubber band. */ /** State for rubber band. */
ssgSimpleState *m_state; ssgSimpleState *m_state;
/** Stores the end of the rubber band (i.e. the side attached to the
* plunger. */
Vec3 m_end_position;
void checkForHit(const Vec3 &k, const Vec3 &p); void checkForHit(const Vec3 &k, const Vec3 &p);
void updatePosition();
public: public:
RubberBand(Plunger *plunger, const Kart &kart); RubberBand(Plunger *plunger, const Kart &kart);

View File

@@ -117,7 +117,8 @@ void KartProperties::load(const std::string &filename, const std::string &node,
{ {
fprintf(stderr, "Error while parsing KartProperties '%s':\n", fprintf(stderr, "Error while parsing KartProperties '%s':\n",
filename.c_str()); filename.c_str());
fprintf(stderr, "%s\n", err.what()); fprintf(stderr, err.what());
fprintf(stderr, "\n");
} }
delete root; delete root;

View File

@@ -622,7 +622,7 @@ int main(int argc, char *argv[] )
} // try } // try
catch (std::exception &e) catch (std::exception &e)
{ {
fprintf(stderr,"%s",e.what()); fprintf(stderr,e.what());
fprintf(stderr,"\nAborting SuperTuxKart\n"); fprintf(stderr,"\nAborting SuperTuxKart\n");
} }

View File

@@ -187,9 +187,8 @@ void LinearWorld::update(float delta)
// Lap counting, based on the new position, but only if the kart // Lap counting, based on the new position, but only if the kart
// hasn't finished the race (otherwise it would be counted more than // hasn't finished the race (otherwise it would be counted more than
// once for the number of finished karts), and not if the kart is // once for the number of finished karts).
// being rescued (which can happen as a result of a shortcut) if(!kart->hasFinishedRace())
if(!kart->hasFinishedRace() && !kart->isRescue())
doLapCounting(kart_info, kart); doLapCounting(kart_info, kart);
} // for n } // for n

View File

@@ -257,17 +257,6 @@ void RaceManager::startNextRace()
else if(m_minor_mode==MINOR_MODE_3_STRIKES) new ThreeStrikesBattle(); else if(m_minor_mode==MINOR_MODE_3_STRIKES) new ThreeStrikesBattle();
else{ fprintf(stderr,"Could not create given race mode\n"); assert(0); } else{ fprintf(stderr,"Could not create given race mode\n"); assert(0); }
// Save the current score and set last time to zero. This is necessary
// if someone presses esc after finishing a gp, and selects restart:
// The race is rerun, and the points and scores get reset ... but if
// a kart hasn't finished the race at this stage, last_score and time
// would be undefined.
for(int i=0; i<m_num_karts; i++)
{
m_kart_status[i].m_last_score = m_kart_status[i].m_score;
m_kart_status[i].m_last_time = 0;
}
m_active_race = true; m_active_race = true;
} // startNextRace } // startNextRace

View File

@@ -58,7 +58,7 @@ void STKConfig::load(const std::string &filename)
{ {
fprintf(stderr, "Error while parsing KartProperties '%s':\n", fprintf(stderr, "Error while parsing KartProperties '%s':\n",
filename.c_str()); filename.c_str());
fprintf(stderr, "%s", err.what()); fprintf(stderr, err.what());
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }
delete root; delete root;

View File

@@ -1413,8 +1413,9 @@ void Track::loadTrackModel()
file_manager->popTextureSearchPath(); file_manager->popTextureSearchPath();
file_manager->popModelSearchPath (); file_manager->popModelSearchPath ();
SSGHelp::MinMax(m_model, &m_aabb_min, &m_aabb_max); Vec3 min, max;
RaceManager::getWorld()->getPhysics()->init(m_aabb_min, m_aabb_max); SSGHelp::MinMax(m_model, &min, &max);
RaceManager::getWorld()->getPhysics()->init(min, max);
createPhysicsModel(); createPhysicsModel();
} // loadTrack } // loadTrack

View File

@@ -60,8 +60,6 @@ private:
Vec3 m_camera_final_hpr; Vec3 m_camera_final_hpr;
bool m_is_arena; bool m_is_arena;
int m_version; int m_version;
Vec3 m_aabb_min;
Vec3 m_aabb_max;
public: public:
enum RoadSide{ RS_DONT_KNOW = -1, RS_LEFT = 0, RS_RIGHT = 1 }; enum RoadSide{ RS_DONT_KNOW = -1, RS_LEFT = 0, RS_RIGHT = 1 };
@@ -197,7 +195,6 @@ public:
y_offset+(v[1]-m_driveline_min[1])*m_scale_y); y_offset+(v[1]-m_driveline_min[1])*m_scale_y);
} }
void getAABB(Vec3 *min, Vec3 *max) const {*min=m_aabb_min; *max=m_aabb_max; }
private: private:
void loadTrack (std::string filename); void loadTrack (std::string filename);
void itemCommand (sgVec3 *xyz, int item_type, int bNeedHeight); void itemCommand (sgVec3 *xyz, int item_type, int bNeedHeight);

View File

@@ -514,7 +514,7 @@ void UserConfig::loadConfig(const std::string& filename)
catch(std::exception& e) catch(std::exception& e)
{ {
fprintf(stderr, "Error while parsing config '%s':\n", filename.c_str()); fprintf(stderr, "Error while parsing config '%s':\n", filename.c_str());
fprintf(stderr, "%s", e.what()); fprintf(stderr, e.what());
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }
@@ -786,7 +786,7 @@ void UserConfig::saveConfig(const std::string& filename)
catch(std::exception& e) catch(std::exception& e)
{ {
fprintf(stderr, "Couldn't write config: "); fprintf(stderr, "Couldn't write config: ");
fprintf(stderr, "%s",e.what()); fprintf(stderr, e.what());
fprintf(stderr, "\n"); fprintf(stderr, "\n");
} }