3 strikes now has some ending instead of crashing (more to come)

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@4838 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2010-02-25 01:48:32 +00:00
parent 616a3b3719
commit 08c0d291fb
7 changed files with 87 additions and 34 deletions

View File

@ -467,11 +467,25 @@ void Kart::finishedRace(float time)
m_kart_mode = KM_END_ANIM;
m_controller->finishedRace(time);
race_manager->kartFinishedRace(this, time);
setController(new EndController(this, m_controller->getPlayer()));
m_kart_properties->getKartModel()->setEndAnimation(true);
// Not all karts have a camera
if(m_camera)
m_camera->setMode(Camera::CM_REVERSE);
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_NORMAL_RACE ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_TIME_TRIAL)
{
// in modes that support it, start end animation
setController(new EndController(this, m_controller->getPlayer()));
m_kart_properties->getKartModel()->setEndAnimation(true);
// Not all karts have a camera
if (m_camera) m_camera->setMode(Camera::CM_REVERSE);
}
else if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_FOLLOW_LEADER)
{
//TODO: what to do on FTL end?
}
else if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES)
{
}
} // finishedRace
//-----------------------------------------------------------------------------

View File

@ -53,6 +53,13 @@ void ThreeStrikesBattle::init()
// no positions in this mode
m_karts[n]->setPosition(-1);
}// next kart
BattleEvent evt;
evt.m_time = 0.0f;
evt.m_kart_info = m_kart_info;
m_battle_events.push_back(evt);
} // ThreeStrikesBattle
//-----------------------------------------------------------------------------
@ -70,24 +77,27 @@ void ThreeStrikesBattle::kartHit(const int kart_id)
// make kart lose a life
m_kart_info[kart_id].m_lives--;
// record event
BattleEvent evt;
evt.m_time = getTime();
evt.m_kart_info = m_kart_info;
m_battle_events.push_back(evt);
updateKartRanks();
// check if kart is 'dead'
if(m_kart_info[kart_id].m_lives < 1)
if (m_kart_info[kart_id].m_lives < 1)
{
m_karts[kart_id]->finishedRace(WorldStatus::getTime());
removeKart(kart_id);
// FIXME - what about end camera here??
// createEndCamera(kart_id)
}
const unsigned int NUM_KARTS = getNumKarts();
int num_karts_many_lives = 0;
for( unsigned int n = 0; n < NUM_KARTS; ++n )
for (unsigned int n = 0; n < NUM_KARTS; ++n)
{
if (m_kart_info[n].m_lives > 1)
num_karts_many_lives++;
if (m_kart_info[n].m_lives > 1) num_karts_many_lives++;
}
// when almost over, use fast music
@ -168,6 +178,17 @@ bool ThreeStrikesBattle::isRaceOver()
*/
void ThreeStrikesBattle::terminateRace()
{
for (unsigned int n=0; n<m_battle_events.size(); n++)
{
const float time = m_battle_events[n].m_time;
printf("At time %f :\n", time);
for (unsigned int k=0; k<m_battle_events[n].m_kart_info.size(); k++)
{
printf(" kart %s had %i lives\n", m_karts[k]->getIdent().c_str(), m_battle_events[n].m_kart_info[k].m_lives);
}
}
updateKartRanks();
World::terminateRace();
} // terminateRace
@ -186,6 +207,8 @@ void ThreeStrikesBattle::restartRace()
// no positions in this mode
m_karts[n]->setPosition(-1);
}// next kart
m_battle_events.clear();
} // restartRace
//-----------------------------------------------------------------------------

View File

@ -41,7 +41,15 @@ private:
std::vector<BattleInfo> m_kart_info;
public:
/** Used to show a nice graph when battle is over */
struct BattleEvent
{
float m_time;
std::vector<BattleInfo> m_kart_info;
};
std::vector<BattleEvent> m_battle_events;
ThreeStrikesBattle();
virtual ~ThreeStrikesBattle();

View File

@ -561,27 +561,36 @@ Kart *World::getLocalPlayerKart(unsigned int n) const
} // getLocalPlayerKart
//-----------------------------------------------------------------------------
/** Called in follow-leader-mode to remove the last kart
*/
void World::removeKart(int kart_number)
/** Remove (eliminate) a kart from the race */
void World::removeKart(int kart_number, bool notifyOfElimination)
{
Kart *kart = m_karts[kart_number];
std::cout << "==== World::removeKart ====\n";
// Display a message about the eliminated kart in the race gui
for (KartList::iterator i = m_karts.begin(); i != m_karts.end(); i++ )
if (notifyOfElimination)
{
if(!(*i)->getCamera()) continue;
if(*i==kart)
for (KartList::iterator i = m_karts.begin(); i != m_karts.end(); i++ )
{
m_race_gui->addMessage(_("You have been\neliminated!"), *i, 2.0f, 60);
}
else
{
m_race_gui->addMessage(StringUtils::insertValues(_("'%s' has\nbeen eliminated."),
kart->getName().c_str()),
*i, 2.0f, 60);
}
} // for i in kart
if(!(*i)->getCamera()) continue;
if(*i==kart)
{
std::cout << "You have been eliminated (i = " << (*i)->getIdent() << ")\n";
m_race_gui->addMessage(_("You have been\neliminated!"), *i, 2.0f, 60);
}
else
{
std::cout << kart->getIdent().c_str() << " has been eliminated (i = " << (*i)->getIdent() << ")\n";
m_race_gui->addMessage(StringUtils::insertValues(_("'%s' has\nbeen eliminated."),
kart->getName().c_str()),
*i, 2.0f, 60);
}
} // for i in kart
}
std::cout << "=========================\n";
if(kart->getController()->isPlayerController())
{
// Change the camera so that it will be attached to the leader

View File

@ -107,7 +107,7 @@ protected:
void updateHighscores ();
void resetAllKarts ();
void removeKart (int kart_number);
void removeKart (int kart_number, bool notifyOfElimination=true);
Controller*
loadAIController (Kart *kart);

View File

@ -649,8 +649,7 @@ void RaceGUI::drawAllMessages(const Kart* kart,
// First line of text somewhat under the top of the screen. For now
// start just under the timer display
int y = (int)(scaling.Y*164 + UserConfigParams::m_height
- viewport.LowerRightCorner.Y );
int y = (int)(viewport.UpperLeftCorner.Y + 164*scaling.Y);
const int x = (viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X)/2;
const int w = (viewport.LowerRightCorner.X + viewport.UpperLeftCorner.X)/2;

View File

@ -56,10 +56,10 @@ private:
class TimedMessage
{
public:
irr::core::stringw m_message; // message to display
float m_remaining_time; // time remaining before removing this message from screen
video::SColor m_color; // color of message
int m_font_size; // size
irr::core::stringw m_message; //!< message to display
float m_remaining_time; //!< time remaining before removing this message from screen
video::SColor m_color; //!< color of message
int m_font_size; //!< size
const Kart *m_kart;
// -----------------------------------------------------
// std::vector needs standard copy-ctor and std-assignment op.