From d1cff1f1c4003095b19743dc661c7906d03acb49 Mon Sep 17 00:00:00 2001 From: auria Date: Tue, 1 Sep 2009 21:02:31 +0000 Subject: [PATCH] More work on dialogs (race end dialog further re-implemented) git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/irrlicht@3977 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- .../dialogs/enter_player_name_dialog.cpp | 6 - .../dialogs/player_info_dialog.cpp | 9 +- .../dialogs/press_a_key_dialog.cpp | 1 + .../dialogs/race_over_dialog.cpp | 158 +++++++++++++++++- .../dialogs/track_info_dialog.cpp | 4 +- .../dialogs/track_info_dialog.hpp | 4 +- 6 files changed, 167 insertions(+), 15 deletions(-) diff --git a/src/states_screens/dialogs/enter_player_name_dialog.cpp b/src/states_screens/dialogs/enter_player_name_dialog.cpp index 138efb303..851160086 100644 --- a/src/states_screens/dialogs/enter_player_name_dialog.cpp +++ b/src/states_screens/dialogs/enter_player_name_dialog.cpp @@ -26,12 +26,6 @@ using namespace GUIEngine; EnterPlayerNameDialog::EnterPlayerNameDialog(const float w, const float h) : ModalDialog(w, h) { - //core::rect< s32 > area_top(0, 0, m_area.getWidth(), m_area.getHeight()/2); - //IGUIStaticText* label = GUIEngine::getGUIEnv()->addStaticText( stringw(_("Enter the new player's name")).c_str(), - // area_top, false /* border */, true /* word wrap */, - // m_irrlicht_window); - // label->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER); - LabelWidget* widget = new LabelWidget(); //I18N: In the 'add new player' dialog diff --git a/src/states_screens/dialogs/player_info_dialog.cpp b/src/states_screens/dialogs/player_info_dialog.cpp index f8e999c19..bfa318e45 100644 --- a/src/states_screens/dialogs/player_info_dialog.cpp +++ b/src/states_screens/dialogs/player_info_dialog.cpp @@ -33,6 +33,7 @@ PlayerInfoDialog::PlayerInfoDialog(PlayerProfile* player, const float w, const f showRegularDialog(); } +// ------------------------------------------------------------------------------------------------------ void PlayerInfoDialog::showRegularDialog() { clearWindow(); @@ -112,7 +113,7 @@ void PlayerInfoDialog::showRegularDialog() } } - +// ------------------------------------------------------------------------------------------------------ void PlayerInfoDialog::showConfirmDialog() { clearWindow(); @@ -128,6 +129,9 @@ void PlayerInfoDialog::showConfirmDialog() StringUtils::insertValues( _("Do you really want to delete player '%s' ?"), m_player->getName()); core::rect< s32 > area_left(5, 0, m_area.getWidth()-5, m_area.getHeight()/2); + + // When there is no need to tab through / click on images/labels, we can add directly + // irrlicht labels (more complicated uses require the use of our widget set) IGUIStaticText* a = GUIEngine::getGUIEnv()->addStaticText( message.c_str(), area_left, false /* border */, true /* word wrap */, m_irrlicht_window); @@ -172,10 +176,11 @@ void PlayerInfoDialog::showConfirmDialog() } } - +// ------------------------------------------------------------------------------------------------------ void PlayerInfoDialog::onEnterPressedInternal() { } +// ------------------------------------------------------------------------------------------------------ void PlayerInfoDialog::processEvent(std::string& eventSource) { if(eventSource == "renameplayer") diff --git a/src/states_screens/dialogs/press_a_key_dialog.cpp b/src/states_screens/dialogs/press_a_key_dialog.cpp index 34de26dbc..2a144b826 100644 --- a/src/states_screens/dialogs/press_a_key_dialog.cpp +++ b/src/states_screens/dialogs/press_a_key_dialog.cpp @@ -55,6 +55,7 @@ PressAKeyDialog::PressAKeyDialog(const float w, const float h) : m_children.push_back(widget2); widget2->add(); } +// ------------------------------------------------------------------------------------------------------ void PressAKeyDialog::processEvent(std::string& eventSource) { if(eventSource == "cancel") diff --git a/src/states_screens/dialogs/race_over_dialog.cpp b/src/states_screens/dialogs/race_over_dialog.cpp index 61ee2b542..2c1e13bd7 100644 --- a/src/states_screens/dialogs/race_over_dialog.cpp +++ b/src/states_screens/dialogs/race_over_dialog.cpp @@ -15,19 +15,169 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +#include "challenges/unlock_manager.hpp" #include "guiengine/engine.hpp" +#include "io/file_manager.hpp" +#include "karts/kart.hpp" +#include "modes/world.hpp" +#include "network/network_manager.hpp" +#include "race/race_manager.hpp" #include "states_screens/dialogs/race_over_dialog.hpp" +#include "utils/string_utils.hpp" #include "utils/translation.hpp" RaceOverDialog::RaceOverDialog(const float percentWidth, const float percentHeight) : ModalDialog(percentWidth, percentHeight) { - const int y1 = m_area.getHeight()/2; + // Switch to barrier mode: server waits for ack from each client + network_manager->beginRaceResultBarrier(); + + //const int w = m_area.getWidth(); + //const int h = m_area.getHeight(); - core::rect< s32 > area(0, y1 - 100, m_area.getWidth(), y1 + 100); - IGUIStaticText* a = GUIEngine::getGUIEnv()->addStaticText( _("Race Results"), + IGUIFont* font = GUIEngine::getFont(); + const int textHeight = font->getDimension(L"X").Height; + + + if (unlock_manager->getUnlockedFeatures().size()>0) + { + // TODO: unlocked features + } + + core::rect< s32 > area(0, 0, m_area.getWidth(), textHeight); + IGUIStaticText* caption = GUIEngine::getGUIEnv()->addStaticText( _("Race Results"), area, false, false, // border, word warp m_irrlicht_window); - a->setTabStop(false); + caption->setTabStop(false); + caption->setTextAlignment(EGUIA_CENTER, EGUIA_CENTER); + + if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) + { + // TODO: offer to continue GP + // _("Continue Grand Prix") + } + else + { + // TODO: offer to go back to menu + // _("Back to the main menu") + } + + // TODO : _("Race in this track again") + + if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_SINGLE) + { + // TODO + // _("Setup New Race") + } + + // _("Race results") + // const unsigned int MAX_STR_LEN = 60; + const unsigned int num_karts = race_manager->getNumKarts(); + + int* order = new int [num_karts]; + RaceManager::getWorld()->raceResultOrder( order ); + + const bool display_time = (RaceManager::getWorld()->getClockMode() == CHRONO); + + const int line_h = textHeight + 15; + const int lines_from_y = textHeight + 15; + int kart_id = 0; // 'i' below is not reliable because some karts (e.g. leader) will be skipped + for (unsigned int i = 0; i < num_karts; ++i) + { + if (order[i] == -1) continue; + + stringw kart_results_line; + + const Kart *current_kart = RaceManager::getKart(order[i]); + const stringw& kart_name = current_kart->getName(); + + char sTime[20]; + sTime[0]=0; + + const float time = current_kart->getFinishTime(); + + if (display_time) + { + const int min = (int) floor ( time / 60.0 ) ; + const int sec = (int) floor ( time - (double) ( 60 * min ) ) ; + const int tenths = (int) floor ( 10.0f * (time - (double)(sec + 60* min))); + sprintf ( sTime, "%d:%02d:%d", min, sec, tenths ) ; + } + + //This shows position + driver name + time + points earned + total points + if (race_manager->getMajorMode() == RaceManager::MAJOR_MODE_GRAND_PRIX) + { + const int prev_score = race_manager->getKartPrevScore(order[i]); + const int new_score = race_manager->getKartScore(order[i]); + + kart_results_line = StringUtils::insertValues( L"#%i. %s (%i + %i = %i)", + current_kart->getPosition(), kart_name.c_str(), // FIXME: insertValues & wide strings + prev_score, (new_score - prev_score), new_score); + } + else + { + std::wcout << kart_name.c_str() << std::endl; + + kart_results_line = StringUtils::insertValues( L"%i. %s %s", // FIXME: insertValues & wide strings + current_kart->getPosition(), kart_name.c_str(), sTime); + } + + const KartProperties* prop = current_kart->getKartProperties(); + std::string icon_path = file_manager->getDataDir() ; + icon_path += "/karts/" + prop->getIdent() + "/" + prop->getIconFile(); + ITexture* kart_icon_texture = irr_driver->getTexture( icon_path ); + + const int icon_size = textHeight; + core::rect< s32 > entry_area(10 + icon_size, lines_from_y+line_h*i, m_area.getWidth(), lines_from_y+line_h*(i+1)); + core::rect< s32 > icon_area(5, lines_from_y + line_h*i, 5+icon_size, lines_from_y+icon_size); + + std::wcout << kart_results_line.c_str() << std::endl; + + GUIEngine::getGUIEnv()->addStaticText( kart_results_line.c_str(), entry_area, + false , true , // border, word warp + m_irrlicht_window); + IGUIImage* img = GUIEngine::getGUIEnv()->addImage( icon_area, m_irrlicht_window ); + img->setImage(kart_icon_texture); + img->setScaleImage(true); + img->setTabStop(false); + + kart_id++; + } + + delete[] order; + + /* + const HighscoreEntry *hs = RaceManager::getWorld()->getHighscores(); + if (hs != NULL) + { + w_prev=widget_manager->addTextWgt( WTOK_HIGHSCORES, 5, 7, _("Highscores") ); + widget_manager->hideWgtRect(WTOK_HIGHSCORES); + w_prev->setPosition(WGT_DIR_FROM_RIGHT, 0.01f, NULL, WGT_DIR_FROM_TOP, 0.01f, NULL); + + unsigned int num_scores = hs->getNumberEntries(); + char *highscores = new char[num_scores * MAX_STR_LEN]; + + for(unsigned int i=0; igetEntry(i, kart_name, name, &T); + const int MINS = (int) floor ( T / 60.0 ) ; + const int SECS = (int) floor ( T - (float) ( 60 * MINS ) ) ; + const int TENTHS = (int) floor ( 10.0f * (T - (float)(SECS + 60*MINS))); + sprintf((char*)( highscores + MAX_STR_LEN * i ), + "%s: %3d:%02d.%01d", name.c_str(), MINS, SECS, TENTHS); + + Widget *w=widget_manager->addTextWgt(WTOK_FIRST_HIGHSCORE + i, 5, 7, + (char*)( highscores+MAX_STR_LEN*i ) ); + w->setPosition(WGT_DIR_FROM_RIGHT, 0.05f, NULL, WGT_DIR_UNDER_WIDGET, 0, w_prev); + w_prev=w; + } // next score + + widget_manager->sameWidth(WTOK_HIGHSCORES, WTOK_FIRST_HIGHSCORE+num_scores-1); + + bottom_of_list = (num_scores > num_karts) ? w_prev : bottom_of_list; + } // end if hs != NULL + */ } void RaceOverDialog::onEnterPressedInternal() diff --git a/src/states_screens/dialogs/track_info_dialog.cpp b/src/states_screens/dialogs/track_info_dialog.cpp index 14a03d1a3..3a1c7792f 100644 --- a/src/states_screens/dialogs/track_info_dialog.cpp +++ b/src/states_screens/dialogs/track_info_dialog.cpp @@ -223,13 +223,13 @@ void startGame(const std::string trackIdent, const int num_laps) race_manager->startNew(); } - +// ------------------------------------------------------------------------------------------------------ void TrackInfoDialog::onEnterPressedInternal() { const int num_laps = m_spinner->getValue(); startGame(m_track_ident, num_laps); } - +// ------------------------------------------------------------------------------------------------------ void TrackInfoDialog::processEvent(std::string& eventSource) { if (eventSource == "start" ) diff --git a/src/states_screens/dialogs/track_info_dialog.hpp b/src/states_screens/dialogs/track_info_dialog.hpp index 154f1722f..15140674e 100644 --- a/src/states_screens/dialogs/track_info_dialog.hpp +++ b/src/states_screens/dialogs/track_info_dialog.hpp @@ -29,10 +29,12 @@ class TrackInfoDialog : public GUIEngine::ModalDialog { std::string m_track_ident; + // When there is no need to tab through / click on images/labels, we can add directly + // irrlicht labels (more complicated uses require the use of our widget set) GUIEngine::SpinnerWidget* m_spinner; - irr::gui::IGUIImage* m_kart_icons[HIGHSCORE_COUNT]; irr::gui::IGUIStaticText* m_highscore_entries[HIGHSCORE_COUNT]; + public: /** * Creates a modal dialog with given percentage of screen width and height