Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
7c2039c37a |
20
ChangeLog
20
ChangeLog
@@ -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)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
* Added new kart ("Puffy"), new battle map ("Cave"), and new music
|
||||
|
13
NEWS
13
NEWS
@@ -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)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
* Six new tracks and one improved track: Fort Magma, SnowTux Peak, Amazonian Journey, City,
|
||||
|
@@ -1,6 +1,6 @@
|
||||
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_PREREQ(2.61)
|
||||
|
@@ -1,4 +1,4 @@
|
||||
Super TuxKart - 0.6.2
|
||||
Super TuxKart - 0.6.1
|
||||
=====================
|
||||
Visit us at http://supertuxkart.sourceforge.net
|
||||
|
||||
|
@@ -48,7 +48,7 @@ void GLDebugDrawer::draw3dText(const btVector3& location,const char* textString)
|
||||
|
||||
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)
|
||||
|
@@ -219,7 +219,6 @@ void ChallengeData::setRace() const
|
||||
race_manager->setNumLaps(m_num_laps);
|
||||
race_manager->setNumKarts(m_num_karts);
|
||||
race_manager->setNumPlayers(1);
|
||||
race_manager->setNumLocalPlayers(1);
|
||||
race_manager->setCoinTarget(m_energy);
|
||||
}
|
||||
else // GP
|
||||
@@ -230,7 +229,6 @@ void ChallengeData::setRace() const
|
||||
race_manager->setDifficulty(m_difficulty);
|
||||
race_manager->setNumKarts(m_num_karts);
|
||||
race_manager->setNumPlayers(1);
|
||||
race_manager->setNumLocalPlayers(1);
|
||||
//race_manager->setGrandPrix();
|
||||
}
|
||||
} // setRace
|
||||
|
@@ -52,7 +52,7 @@ GrandPrixData::GrandPrixData(const std::string filename)
|
||||
catch(std::exception& err)
|
||||
{
|
||||
fprintf(stderr, "Error while reading grandprix file '%s'\n", filename.c_str());
|
||||
fprintf(stderr, "%s", err.what());
|
||||
fprintf(stderr, err.what());
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
|
@@ -80,11 +80,8 @@ GrandPrixEnd::GrandPrixEnd()
|
||||
}
|
||||
|
||||
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),
|
||||
_("The winner is %s!"),winning_kart->getName().c_str());
|
||||
snprintf(output, sizeof(output),
|
||||
_("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->showWgtRect(WTOK_TITLE);
|
||||
widget_manager->showWgtText(WTOK_TITLE);
|
||||
|
@@ -91,7 +91,7 @@ void RaceMenu::select()
|
||||
case WTOK_RESTART_RACE:
|
||||
menu_manager->popMenu();
|
||||
if(user_config->m_fullscreen) SDL_ShowCursor(SDL_DISABLE);
|
||||
race_manager->rerunRace();
|
||||
RaceManager::getWorld()->restartRace();
|
||||
break;
|
||||
|
||||
case WTOK_OPTIONS:
|
||||
|
@@ -31,18 +31,8 @@
|
||||
#include "network/network_manager.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()
|
||||
{
|
||||
m_waiting_time = WAITING_TIME;
|
||||
m_first_time = true;
|
||||
m_selected_widget = WTOK_NONE;
|
||||
|
||||
@@ -227,10 +217,6 @@ RaceResultsGUI::~RaceResultsGUI()
|
||||
*/
|
||||
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
|
||||
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
|
||||
// in update().
|
||||
m_selected_widget = (WidgetTokens)widget_manager->getSelectedWgt();
|
||||
|
||||
// Clients send the ack to the server
|
||||
if(network_manager->getMode()==NetworkManager::NW_CLIENT)
|
||||
network_manager->sendRaceResultAck();
|
||||
@@ -286,7 +273,6 @@ void RaceResultsGUI::setSelectedWidget(int token)
|
||||
*/
|
||||
void RaceResultsGUI::update(float dt)
|
||||
{
|
||||
m_waiting_time -= dt;
|
||||
BaseGUI::update(dt);
|
||||
// If an item is selected (for the first time), change the text
|
||||
// so that the user has feedback about his selection.
|
||||
|
@@ -51,8 +51,6 @@ private:
|
||||
WidgetTokens m_selected_widget;
|
||||
Widget *displayRaceResults();
|
||||
Widget *displayKartList(Widget *w_prev, int *order, float horizontal);
|
||||
/** Waiting time before this menu can be left. */
|
||||
float m_waiting_time;
|
||||
public:
|
||||
RaceResultsGUI();
|
||||
~RaceResultsGUI();
|
||||
|
@@ -166,16 +166,17 @@ void TrackSel::updateScrollPosition()
|
||||
void TrackSel::switchGroup()
|
||||
{
|
||||
m_index_avail_tracks.clear();
|
||||
bool is_battle_mode = RaceManager::isBattleMode(race_manager->getMinorMode());
|
||||
bool group_available = is_battle_mode
|
||||
? track_manager->getArenasInGroup(user_config->m_track_group).size()>0
|
||||
: track_manager->getTracksInGroup(user_config->m_track_group).size()>0;
|
||||
bool group_available =
|
||||
(RaceManager::isBattleMode( race_manager->getMinorMode() )
|
||||
? track_manager->getArenasInGroup(user_config->m_track_group)
|
||||
: track_manager->getTracksInGroup(user_config->m_track_group)).size()>0;
|
||||
if(!group_available)
|
||||
user_config->m_track_group = "standard";
|
||||
|
||||
const std::vector<int> &tracks = is_battle_mode
|
||||
? track_manager->getArenasInGroup(user_config->m_track_group)
|
||||
: track_manager->getTracksInGroup(user_config->m_track_group);
|
||||
const std::vector<int> &tracks =
|
||||
RaceManager::isBattleMode( race_manager->getMinorMode() ) ?
|
||||
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++)
|
||||
{
|
||||
@@ -196,9 +197,7 @@ void TrackSel::switchGroup()
|
||||
|
||||
// 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).
|
||||
const std::vector<int> &tracks_in_group = is_battle_mode
|
||||
? track_manager->getArenasInGroup(groups[i])
|
||||
: track_manager->getTracksInGroup(groups[i]);
|
||||
const std::vector<int> &tracks_in_group = track_manager->getTracksInGroup(groups[i]);
|
||||
bool ignore_group=true;
|
||||
for(unsigned int j=0; j<tracks_in_group.size(); j++)
|
||||
{
|
||||
@@ -206,7 +205,8 @@ void TrackSel::switchGroup()
|
||||
// Locked tracks are not available
|
||||
if(unlock_manager->isLocked(track->getIdent())) continue;
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
@@ -150,7 +150,7 @@ void HighscoreManager::Load()
|
||||
{
|
||||
fprintf(stderr, "Error while parsing highscore file '%s':\n",
|
||||
m_filename.c_str());
|
||||
fprintf(stderr, "%s", err.what());
|
||||
fprintf(stderr, err.what());
|
||||
fprintf(stderr, "\n");
|
||||
fprintf(stderr, "No old highscores will be available.\n");
|
||||
}
|
||||
@@ -188,7 +188,8 @@ void HighscoreManager::Save()
|
||||
{
|
||||
printf("Problems saving highscores in '%s'\n",
|
||||
m_filename.c_str());
|
||||
puts(e.what());
|
||||
printf(e.what());
|
||||
printf("\n");
|
||||
m_can_write=false;
|
||||
}
|
||||
} // Save
|
||||
|
@@ -15,20 +15,46 @@ Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
BulletDebug|Win32 = BulletDebug|Win32
|
||||
BulletRelease|Win32 = BulletRelease|Win32
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
ReplayDebug|Win32 = ReplayDebug|Win32
|
||||
ReplayRelease|Win32 = ReplayRelease|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{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}.BulletRelease|Win32.ActiveCfg = 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.Build.0 = Debug|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}.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.Build.0 = 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}.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
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@@ -517,7 +517,7 @@
|
||||
Optimization="0"
|
||||
WholeProgramOptimization="false"
|
||||
AdditionalIncludeDirectories="../../../src;../../../src/bullet/src;"$(STK_INCLUDE)";../../../src/enet/include"
|
||||
PreprocessorDefinitions="BT_NO_PROFILE;HAVE_OPENAL;HAVE_OGGVORBIS;_DEBUG;_CONSOLE;WIN32;NOMINMAX;VERSION=\"0.6.2\";_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;DEBUG;PACKAGE=\"supertuxkart\";HAVE_GETTEXT;ENABLE_NLS;HAVE_GLUT"
|
||||
PreprocessorDefinitions="BT_NO_PROFILE;HAVE_OPENAL;HAVE_OGGVORBIS;_DEBUG;_CONSOLE;WIN32;NOMINMAX;VERSION=\"0.6.1\";_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;DEBUG;PACKAGE=\"supertuxkart\";HAVE_GETTEXT;ENABLE_NLS;HAVE_GLUT"
|
||||
GeneratePreprocessedFile="0"
|
||||
MinimalRebuild="true"
|
||||
BasicRuntimeChecks="3"
|
||||
@@ -605,7 +605,7 @@
|
||||
Name="VCCLCompilerTool"
|
||||
WholeProgramOptimization="true"
|
||||
AdditionalIncludeDirectories="../../../src;../../../src/bullet/src;"$(STK_INCLUDE)";../../../src/enet/include"
|
||||
PreprocessorDefinitions="HAVE_OPENAL;HAVE_OGGVORBIS;NDEBUG;_CONSOLE;WIN32;NOMINMAX;VERSION=\"0.6.2\";_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;BT_NO_PROFILE;PACKAGE=\"supertuxkart\";HAVE_GETTEXT;ENABLE_NLS;HAVE_GLUT"
|
||||
PreprocessorDefinitions="HAVE_OPENAL;HAVE_OGGVORBIS;NDEBUG;_CONSOLE;WIN32;NOMINMAX;VERSION=\"0.6.1\";_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;BT_NO_PROFILE;PACKAGE=\"supertuxkart\";HAVE_GETTEXT;ENABLE_NLS;HAVE_GLUT"
|
||||
RuntimeLibrary="2"
|
||||
UsePrecompiledHeader="0"
|
||||
WarningLevel="3"
|
||||
|
@@ -197,14 +197,7 @@ void Flyable::update (float dt)
|
||||
|
||||
Vec3 pos=getBody()->getWorldTransform().getOrigin();
|
||||
TerrainInfo::update(pos);
|
||||
// Check if the flyable is out of the track boundary.
|
||||
// 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] )
|
||||
if(getHoT()==Track::NOHIT)
|
||||
{
|
||||
hit(NULL); // flyable out of track boundary
|
||||
return;
|
||||
|
@@ -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);
|
||||
m_attached_state = RB_TO_PLUNGER;
|
||||
updatePosition();
|
||||
update(0);
|
||||
|
||||
sgVec3 norm;
|
||||
sgSetVec3(norm, 1/sqrt(2.0f), 0, 1/sqrt(2.0f));
|
||||
@@ -79,42 +79,6 @@ void RubberBand::removeFromScene()
|
||||
scene->remove(this);
|
||||
} // 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
|
||||
* plunger, and sets the quad representing the rubber band appropriately.
|
||||
@@ -133,12 +97,38 @@ void RubberBand::update(float dt)
|
||||
return;
|
||||
}
|
||||
|
||||
updatePosition();
|
||||
Vec3 p;
|
||||
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
|
||||
// ------------------------------
|
||||
float l = (m_end_position-k).length2();
|
||||
float l = (p-k).length2();
|
||||
float max_len = m_owner.getKartProperties()->getRubberBandMaxLength();
|
||||
if(l>max_len*max_len)
|
||||
{
|
||||
@@ -153,7 +143,7 @@ void RubberBand::update(float dt)
|
||||
if(m_attached_state!=RB_TO_PLUNGER)
|
||||
{
|
||||
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
|
||||
if(m_attached_state==RB_TO_TRACK && diff.length2() < 10*10)
|
||||
|
@@ -50,12 +50,7 @@ private:
|
||||
/** State for rubber band. */
|
||||
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 updatePosition();
|
||||
|
||||
public:
|
||||
RubberBand(Plunger *plunger, const Kart &kart);
|
||||
|
@@ -117,7 +117,8 @@ void KartProperties::load(const std::string &filename, const std::string &node,
|
||||
{
|
||||
fprintf(stderr, "Error while parsing KartProperties '%s':\n",
|
||||
filename.c_str());
|
||||
fprintf(stderr, "%s\n", err.what());
|
||||
fprintf(stderr, err.what());
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
delete root;
|
||||
|
||||
|
@@ -622,7 +622,7 @@ int main(int argc, char *argv[] )
|
||||
} // try
|
||||
catch (std::exception &e)
|
||||
{
|
||||
fprintf(stderr,"%s",e.what());
|
||||
fprintf(stderr,e.what());
|
||||
fprintf(stderr,"\nAborting SuperTuxKart\n");
|
||||
}
|
||||
|
||||
|
@@ -187,9 +187,8 @@ void LinearWorld::update(float delta)
|
||||
|
||||
// Lap counting, based on the new position, but only if the kart
|
||||
// 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
|
||||
// being rescued (which can happen as a result of a shortcut)
|
||||
if(!kart->hasFinishedRace() && !kart->isRescue())
|
||||
// once for the number of finished karts).
|
||||
if(!kart->hasFinishedRace())
|
||||
doLapCounting(kart_info, kart);
|
||||
} // for n
|
||||
|
||||
|
@@ -257,17 +257,6 @@ void RaceManager::startNextRace()
|
||||
else if(m_minor_mode==MINOR_MODE_3_STRIKES) new ThreeStrikesBattle();
|
||||
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;
|
||||
} // startNextRace
|
||||
|
||||
|
@@ -58,7 +58,7 @@ void STKConfig::load(const std::string &filename)
|
||||
{
|
||||
fprintf(stderr, "Error while parsing KartProperties '%s':\n",
|
||||
filename.c_str());
|
||||
fprintf(stderr, "%s", err.what());
|
||||
fprintf(stderr, err.what());
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
delete root;
|
||||
|
@@ -1413,8 +1413,9 @@ void Track::loadTrackModel()
|
||||
file_manager->popTextureSearchPath();
|
||||
file_manager->popModelSearchPath ();
|
||||
|
||||
SSGHelp::MinMax(m_model, &m_aabb_min, &m_aabb_max);
|
||||
RaceManager::getWorld()->getPhysics()->init(m_aabb_min, m_aabb_max);
|
||||
Vec3 min, max;
|
||||
SSGHelp::MinMax(m_model, &min, &max);
|
||||
RaceManager::getWorld()->getPhysics()->init(min, max);
|
||||
createPhysicsModel();
|
||||
} // loadTrack
|
||||
|
||||
|
@@ -60,8 +60,6 @@ private:
|
||||
Vec3 m_camera_final_hpr;
|
||||
bool m_is_arena;
|
||||
int m_version;
|
||||
Vec3 m_aabb_min;
|
||||
Vec3 m_aabb_max;
|
||||
|
||||
public:
|
||||
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);
|
||||
}
|
||||
|
||||
void getAABB(Vec3 *min, Vec3 *max) const {*min=m_aabb_min; *max=m_aabb_max; }
|
||||
private:
|
||||
void loadTrack (std::string filename);
|
||||
void itemCommand (sgVec3 *xyz, int item_type, int bNeedHeight);
|
||||
|
@@ -514,7 +514,7 @@ void UserConfig::loadConfig(const std::string& filename)
|
||||
catch(std::exception& e)
|
||||
{
|
||||
fprintf(stderr, "Error while parsing config '%s':\n", filename.c_str());
|
||||
fprintf(stderr, "%s", e.what());
|
||||
fprintf(stderr, e.what());
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
@@ -786,7 +786,7 @@ void UserConfig::saveConfig(const std::string& filename)
|
||||
catch(std::exception& e)
|
||||
{
|
||||
fprintf(stderr, "Couldn't write config: ");
|
||||
fprintf(stderr, "%s",e.what());
|
||||
fprintf(stderr, e.what());
|
||||
fprintf(stderr, "\n");
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user