diff --git a/src/config/saved_grand_prix.cpp b/src/config/saved_grand_prix.cpp index 8f01643a6..e80714edd 100644 --- a/src/config/saved_grand_prix.cpp +++ b/src/config/saved_grand_prix.cpp @@ -143,29 +143,27 @@ void SavedGrandPrix::setKarts(const std::vector &kart_l //------------------------------------------------------------------------------ void SavedGrandPrix::loadKarts(std::vector & kart_list) { - //Fix aikarts int aikarts = 0; for(unsigned int i = 0; i < m_karts.size(); i++) { const KartProperties *kp = kart_properties_manager->getKart(m_karts[i].m_ident); - if(m_karts[i].m_local_player_id == -1) + if(m_karts[i].m_local_player_id == -1) // AI kart { - //AI kart found if(kp) kart_list[aikarts].m_ident = m_karts[i].m_ident; - kart_list[aikarts].m_score = m_karts[i].m_score; + kart_list[aikarts].m_score = m_karts[i].m_score; kart_list[aikarts].m_overall_time = m_karts[i].m_overall_time; aikarts++; } else { - //Get correct player + // Get correct player for(unsigned int x = kart_list.size()-m_player_karts; x < kart_list.size(); x++) { if(kart_list[x].m_local_player_id == m_karts[i].m_local_player_id) { - kart_list[x].m_score = m_karts[i].m_score; + kart_list[x].m_score = m_karts[i].m_score; kart_list[x].m_overall_time = m_karts[i].m_overall_time; } // if kart_list[x].m_local_player_id == m_karts[i].,_local } // for x diff --git a/src/config/saved_grand_prix.hpp b/src/config/saved_grand_prix.hpp index 840da10c7..f06f0ff0c 100644 --- a/src/config/saved_grand_prix.hpp +++ b/src/config/saved_grand_prix.hpp @@ -135,25 +135,19 @@ public: // ------------------------------------------------------------------------ /** Finds the right SavedGrandPrix given the specified data, or - * NULL if no matching GP was found. - */ + * NULL if no matching GP was found. */ static SavedGrandPrix* getSavedGP(unsigned int player, - const std::string &gpid, - int difficulty, int total_karts, - int player_karts) + const std::string &gpid, + const unsigned int number_of_players) { for (unsigned int n=0; ngetGPID() == gpid) && - (gp->getPlayerID() == player) && - (gp->getDifficulty() == difficulty) && - (gp->getTotalKarts() == total_karts) && - (gp->getPlayerKarts() == player_karts)){ + if (gp->getGPID() == gpid && + gp->getPlayerID() == player && + gp->getPlayerKarts() == (int)number_of_players) return gp; - } // if - } // for n + } return NULL; } // getSavedGP // ------------------------------------------------------------------------ diff --git a/src/race/race_manager.cpp b/src/race/race_manager.cpp index 539466de3..11bdfe29b 100644 --- a/src/race/race_manager.cpp +++ b/src/race/race_manager.cpp @@ -279,15 +279,38 @@ void RaceManager::computeRandomKartList() void RaceManager::startNew(bool from_overworld) { m_started_from_overworld = from_overworld; + m_saved_gp = NULL; // There will be checks for this being NULL done later - if(m_major_mode==MAJOR_MODE_GRAND_PRIX) + if (m_major_mode==MAJOR_MODE_GRAND_PRIX) { // GP: get tracks, laps and reverse info from grand prix m_tracks = m_grand_prix.getTrackNames(); m_num_laps = m_grand_prix.getLaps(); m_reverse_track = m_grand_prix.getReverse(); + + // Saved GP only in offline mode + if (m_continue_saved_gp && !NetworkWorld::getInstance()->isRunning()) + { + // We look if Player 1 has a saved version of this GP. + m_saved_gp = SavedGrandPrix::getSavedGP( + StateManager::get() + ->getActivePlayerProfile(0) + ->getUniqueID(), + m_grand_prix.getId(), + m_player_karts.size()); + + if (m_saved_gp == NULL) + { + Log::error("Race Manager", "Can not continue Grand Prix '%s'" + "because it could not exist", + m_grand_prix.getId().c_str()); + m_continue_saved_gp = false; // simple and working + } else { + setNumKarts(m_saved_gp->getTotalKarts()); + setupPlayerKartInfo(); + } + } } - //assert(m_player_karts.size() > 0); // command line parameters: negative numbers=all karts if(m_num_karts < 0 ) m_num_karts = stk_config->m_max_karts; @@ -308,8 +331,8 @@ void RaceManager::startNew(bool from_overworld) race_manager->getMinorMode()==RaceManager::MINOR_MODE_FOLLOW_LEADER ? -1 : 0; - const unsigned int ai_kart_count = (unsigned int) m_ai_kart_list.size(); - for(unsigned int i=0; i()->isRunning()) // offline mode only + if (MAJOR_MODE_GRAND_PRIX) { - //We look if Player 1 has a saved version of this GP. - // ================================================= - SavedGrandPrix* gp = SavedGrandPrix::getSavedGP( StateManager::get() - ->getActivePlayerProfile(0) - ->getUniqueID(), - m_grand_prix.getId(), - m_difficulty, - m_num_karts, - (int)m_player_karts.size()); - - // Start the race with the appropriate track - // ========================================= - if(gp != NULL) + if (m_continue_saved_gp) { - if (m_continue_saved_gp) - { - m_track_number = gp->getNextTrack(); - gp->loadKarts(m_kart_status); - } - else - { - gp->remove(); - } + m_track_number = m_saved_gp->getNextTrack(); + m_saved_gp->loadKarts(m_kart_status); + } + else + { + m_track_number = 0; + m_saved_gp->remove(); } } + startNextRace(); } // startNew @@ -493,25 +501,16 @@ void RaceManager::next() { if(m_major_mode==MAJOR_MODE_GRAND_PRIX && !NetworkWorld::getInstance()->isRunning()) { - //Saving GP state - //We look if Player 1 has already saved this GP. - SavedGrandPrix* gp = - SavedGrandPrix::getSavedGP(StateManager::get() - ->getActivePlayerProfile(0) - ->getUniqueID(), - m_grand_prix.getId(), - m_difficulty, - m_num_karts, - (int)m_player_karts.size()); - if(gp != NULL) + // Saving GP state + // If Player 1 has already saved a GP, we adapt it + if(m_saved_gp != NULL) { - //if so addept it - gp->setKarts(m_kart_status); - gp->setNextTrack(m_track_number); + m_saved_gp->setKarts(m_kart_status); + m_saved_gp->setNextTrack(m_track_number); } else { - //create a new entry + // Otherwise we create a new entry UserConfigParams::m_saved_grand_prix_list.push_back( new SavedGrandPrix( StateManager::get()->getActivePlayerProfile(0) @@ -630,16 +629,8 @@ void RaceManager::exitRace(bool delete_world) PlayerManager::getCurrentPlayer()->grandPrixFinished(); if(m_major_mode==MAJOR_MODE_GRAND_PRIX&& !NetworkWorld::getInstance()->isRunning()) { - //Delete saved GP - SavedGrandPrix* gp = - SavedGrandPrix::getSavedGP(StateManager::get() - ->getActivePlayerProfile(0) - ->getUniqueID(), - m_grand_prix.getId(), - m_difficulty, - m_num_karts, - (int)m_player_karts.size()); - if(gp != NULL) gp->remove(); + if(m_saved_gp != NULL) + m_saved_gp->remove(); } StateManager::get()->resetAndGoToScreen( MainMenuScreen::getInstance() ); @@ -717,6 +708,7 @@ void RaceManager::exitRace(bool delete_world) if (delete_world) World::deleteWorld(); + m_saved_gp = NULL; m_track_number = 0; } // exitRace @@ -766,7 +758,6 @@ void RaceManager::startGP(const GrandPrixData &gp, bool from_overworld, { StateManager::get()->enterGameState(); setGrandPrix(gp); - setCoinTarget( 0 ); // Might still be set from a previous challenge race_manager->setupPlayerKartInfo(); m_continue_saved_gp = continue_saved_gp; diff --git a/src/race/race_manager.hpp b/src/race/race_manager.hpp index 2d47aef98..5e7d9feca 100644 --- a/src/race/race_manager.hpp +++ b/src/race/race_manager.hpp @@ -36,6 +36,7 @@ #include "utils/vec3.hpp" class AbstractKart; +class SavedGrandPrix; class Track; static const std::string IDENT_STD ("STANDARD" ); @@ -326,6 +327,7 @@ private: std::vector m_ai_kart_list; int m_track_number; GrandPrixData m_grand_prix; + SavedGrandPrix* m_saved_gp; int m_num_karts; unsigned int m_num_finished_karts; unsigned int m_num_finished_players; @@ -410,11 +412,13 @@ public: */ void setDifficulty(Difficulty diff); + // ------------------------------------------------------------------------ + void setCoinTarget(int num) { m_coin_target = num; } // ------------------------------------------------------------------------ void setGrandPrix(const GrandPrixData &gp) { m_grand_prix = gp; - m_coin_target = 0; + setCoinTarget(0); } // ------------------------------------------------------------------------ void setAIKartOverride(const std::string& kart) @@ -453,8 +457,6 @@ public: m_ai_superpower = SUPERPOWER_NONE; } // ------------------------------------------------------------------------ - void setCoinTarget(int num) { m_coin_target = num; } - // ------------------------------------------------------------------------ void setTimeTarget(float num) { m_has_time_target = true; m_time_target = num; } /** \} */ diff --git a/src/states_screens/dialogs/gp_info_dialog.cpp b/src/states_screens/dialogs/gp_info_dialog.cpp index a283cae3c..464e9af30 100644 --- a/src/states_screens/dialogs/gp_info_dialog.cpp +++ b/src/states_screens/dialogs/gp_info_dialog.cpp @@ -203,8 +203,6 @@ void GPInfoDialog::addButtons() ->getActivePlayerProfile(0) ->getUniqueID(), m_gp.getId(), - race_manager->getDifficulty(), - race_manager->getNumberOfKarts(), race_manager->getNumLocalPlayers()); okBtn->m_properties[PROP_ID] = "start"; diff --git a/src/states_screens/gp_info_screen.cpp b/src/states_screens/gp_info_screen.cpp index d36133c92..8fc0c7422 100644 --- a/src/states_screens/gp_info_screen.cpp +++ b/src/states_screens/gp_info_screen.cpp @@ -81,7 +81,7 @@ void GPInfoScreen::loadedFromFile() // Only init the number of tracks here, this way the previously selected // number of tracks will be the default. m_num_tracks_spinner->setValue(1); - + m_ai_kart_spinner = getWidget("ai-spinner"); } // loadedFromFile @@ -97,14 +97,14 @@ void GPInfoScreen::setGP(const std::string &gp_ident) { // Doesn't matter what kind of GP we create, it just gets the // right id ("random"). - m_gp.createRandomGP(1, "standard", + m_gp.createRandomGP(1, "standard", m_reverse_spinner ? getReverse() : GrandPrixData::GP_NO_REVERSE); } } // setGP // ---------------------------------------------------------------------------- -/** Converts the currently selected reverse status into a value of type +/** Converts the currently selected reverse status into a value of type * GPReverseType . */ GrandPrixData::GPReverseType GPInfoScreen::getReverse() const @@ -130,8 +130,6 @@ void GPInfoScreen::beforeAddingWidget() SavedGrandPrix* saved_gp = SavedGrandPrix::getSavedGP( StateManager::get()->getActivePlayerProfile(0)->getUniqueID(), m_gp.getId(), - race_manager->getDifficulty(), - race_manager->getNumberOfKarts(), race_manager->getNumLocalPlayers()); RibbonWidget* ribbonButtons = getWidget("buttons"); @@ -194,10 +192,10 @@ void GPInfoScreen::init() else m_group_name = stringc(m_group_spinner->getStringValue().c_str()).c_str(); - // If there are more tracks selected atm as in the group (which can + // If there are more tracks selected atm as in the group (which can // happen if the group has been changed since last time this screen // was shown), adjust it: - int max_num_tracks = m_group_name=="all" + int max_num_tracks = m_group_name=="all" ? track_manager->getNumberOfRaceTracks() : (int)track_manager->getTracksInGroup(m_group_name).size(); m_num_tracks_spinner->setMax(max_num_tracks); @@ -207,7 +205,7 @@ void GPInfoScreen::init() } // Now create the random GP: - m_gp.createRandomGP(m_num_tracks_spinner->getValue(), + m_gp.createRandomGP(m_num_tracks_spinner->getValue(), m_group_name, getReverse(), true); } else @@ -215,7 +213,7 @@ void GPInfoScreen::init() getWidget("name")->setText(m_gp.getName(), false); m_gp.checkConsistency(); } - + // Number of AIs // ------------- const bool has_AI = race_manager->hasAI(); @@ -288,7 +286,7 @@ void GPInfoScreen::addScreenshot() m_screenshot_widget->m_h = screenshot_div->m_h; - // Temporary icon, will replace it just after + // Temporary icon, will replace it just after // (but it will be shown if the given icon is not found) m_screenshot_widget->m_properties[PROP_ICON] = "gui/main_help.png"; m_screenshot_widget->add(); @@ -336,7 +334,7 @@ void GPInfoScreen::eventCallback(Widget *, const std::string &name, // the current track. The current value in the Number-of-tracks-spinner // has to be updated, since otherwise the displayed (and used) value // can be bigger than the maximum. (Might be a TODO to fix this) - int max_num_tracks = m_group_name=="all" + int max_num_tracks = m_group_name=="all" ? track_manager->getNumberOfRaceTracks() : (int)track_manager->getTracksInGroup(m_group_name).size(); m_num_tracks_spinner->setMax(max_num_tracks); @@ -344,7 +342,7 @@ void GPInfoScreen::eventCallback(Widget *, const std::string &name, m_num_tracks_spinner->setValue(max_num_tracks); // Create a new (i.e. with new tracks) random gp, since the old // tracks might not all belong to the newly selected group. - + m_gp.createRandomGP(m_num_tracks_spinner->getValue(), m_group_name, getReverse(), /*new_tracks*/true); addTracks(); @@ -359,7 +357,7 @@ void GPInfoScreen::eventCallback(Widget *, const std::string &name, const int num_ai = m_ai_kart_spinner->getValue(); race_manager->setNumKarts( race_manager->getNumLocalPlayers() + num_ai ); UserConfigParams::m_num_karts = race_manager->getNumLocalPlayers() + num_ai; - + //Redraw scene because available buttons depend on current settings getWidget("buttons")->setSelection(0, PLAYER_ID_GAME_MASTER); reshowCurrentScreen();