From 08c0d291fb24f21e592569f62e0130faa7d6e03c Mon Sep 17 00:00:00 2001 From: auria Date: Thu, 25 Feb 2010 01:48:32 +0000 Subject: [PATCH] 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 --- src/karts/kart.cpp | 24 ++++++++++++++---- src/modes/three_strikes_battle.cpp | 35 ++++++++++++++++++++++----- src/modes/three_strikes_battle.hpp | 10 +++++++- src/modes/world.cpp | 39 ++++++++++++++++++------------ src/modes/world.hpp | 2 +- src/states_screens/race_gui.cpp | 3 +-- src/states_screens/race_gui.hpp | 8 +++--- 7 files changed, 87 insertions(+), 34 deletions(-) diff --git a/src/karts/kart.cpp b/src/karts/kart.cpp index f40222f1d..7e092cdc1 100644 --- a/src/karts/kart.cpp +++ b/src/karts/kart.cpp @@ -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 //----------------------------------------------------------------------------- diff --git a/src/modes/three_strikes_battle.cpp b/src/modes/three_strikes_battle.cpp index a2e7de465..9c481de24 100644 --- a/src/modes/three_strikes_battle.cpp +++ b/src/modes/three_strikes_battle.cpp @@ -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; ngetIdent().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 //----------------------------------------------------------------------------- diff --git a/src/modes/three_strikes_battle.hpp b/src/modes/three_strikes_battle.hpp index abf00d787..d4c096a79 100644 --- a/src/modes/three_strikes_battle.hpp +++ b/src/modes/three_strikes_battle.hpp @@ -41,7 +41,15 @@ private: std::vector m_kart_info; public: - + + /** Used to show a nice graph when battle is over */ + struct BattleEvent + { + float m_time; + std::vector m_kart_info; + }; + std::vector m_battle_events; + ThreeStrikesBattle(); virtual ~ThreeStrikesBattle(); diff --git a/src/modes/world.cpp b/src/modes/world.cpp index 12d96a085..4f12a8fef 100644 --- a/src/modes/world.cpp +++ b/src/modes/world.cpp @@ -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 diff --git a/src/modes/world.hpp b/src/modes/world.hpp index faf332f0b..01b9de821 100644 --- a/src/modes/world.hpp +++ b/src/modes/world.hpp @@ -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); diff --git a/src/states_screens/race_gui.cpp b/src/states_screens/race_gui.cpp index db9492a59..64782279e 100644 --- a/src/states_screens/race_gui.cpp +++ b/src/states_screens/race_gui.cpp @@ -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; diff --git a/src/states_screens/race_gui.hpp b/src/states_screens/race_gui.hpp index b813ea3ca..4eda7fda5 100644 --- a/src/states_screens/race_gui.hpp +++ b/src/states_screens/race_gui.hpp @@ -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.