diff --git a/data/stk_config.data b/data/stk_config.data index d8f0d359e..d74efc987 100644 --- a/data/stk_config.data +++ b/data/stk_config.data @@ -5,6 +5,9 @@ ;; STK parameters ;; -------------- (max-karts 10 ) ;; maximum number of karts + (grid-order 1 ) ;; order for grand prix, 1 is most + ;; points 1st, 0 is least points + ;; 1st ;; Attachment related parameters ;; ----------------------------- diff --git a/src/race_manager.cpp b/src/race_manager.cpp index 872d50481..9f434fc13 100644 --- a/src/race_manager.cpp +++ b/src/race_manager.cpp @@ -29,6 +29,7 @@ #include "world.hpp" #include "scene.hpp" #include "user_config.hpp" +#include "stk_config.hpp" RaceManager* race_manager= NULL; @@ -95,22 +96,43 @@ GrandPrixMode::start_race(int n) RaceSetup raceSetup; raceSetup.m_mode = RaceSetup::RM_GRAND_PRIX; raceSetup.m_difficulty = m_difficulty; - raceSetup.m_num_laps = 2; + raceSetup.m_num_laps = 1; raceSetup.m_track = m_cup.getTrack(n); raceSetup.m_karts.resize(m_karts.size()); raceSetup.m_players.resize(m_players.size()); raceSetup.setHerringStyle(m_cup.getHerringStyle()); - - for(int i = 0; i < int(m_karts.size()); ++i) - { - raceSetup.m_karts[m_karts[i].prev_finish_pos] = m_karts[i].ident; - if (m_karts[i].player < int(m_players.size())) + if (n == 0) //The first race, Players start at the back + { + for(int i = 0; i < int(m_karts.size()); ++i) { - raceSetup.m_players[m_karts[i].player] = i; + raceSetup.m_karts[m_karts[i].prev_finish_pos] = m_karts[i].ident; + if (m_karts[i].player < int(m_players.size())) + { + raceSetup.m_players[m_karts[i].player] = m_karts[i].prev_finish_pos; + } } } - + else //subsequent races where order of grid is determined by score + { + std::sort(m_karts.begin(), m_karts.end());//sort karts by increasing score + + //reverse kart order if flagged in stk_config + if (stk_config->m_grid_order) + { + std::reverse(m_karts.begin(), m_karts.end()); + } + + for(int i = 0;i < int(m_karts.size()); ++i) + { + raceSetup.m_karts[i] = m_karts[i].ident; + if (m_karts[i].player < int(m_players.size())) + { + raceSetup.m_players[m_karts[i].player] = i; + } + } + } + // the constructor assigns this object to the global // variable world. Admittedly a bit ugly, but simplifies // handling of objects which get created in the constructor diff --git a/src/race_manager.hpp b/src/race_manager.hpp index dc5d4c342..451674831 100644 --- a/src/race_manager.hpp +++ b/src/race_manager.hpp @@ -22,6 +22,7 @@ #include #include +#include #include "race_setup.hpp" #include "cup_data.hpp" @@ -47,7 +48,7 @@ private: RaceDifficulty m_difficulty; int m_num_karts; - + struct KartStatus { std::string ident;//The .tkkf filename without the .tkkf @@ -59,15 +60,16 @@ private: KartStatus(const std::string& ident_, const int& score_, const int& prev_finish_pos_, const int& player_) : ident(ident_), score(score_), prev_finish_pos(prev_finish_pos_), - player(player_) {}} - ; - + player(player_) {} + + }; + public: std::vector m_players; CupData m_cup; std::vector m_karts; int m_track; - + GrandPrixMode(const std::vector& players_, const CupData& cup_, RaceDifficulty difficulty_, @@ -77,7 +79,7 @@ public: void start(); void next(); void exit_race(); - + int getKartScore (int kart) const { return m_karts[kart].score;} int getPositionScore(int pos) const { return pos>4 ? 0 : 4-pos;} std::string getKartName(int kart) const { return m_karts[kart].ident;} @@ -86,8 +88,14 @@ public: m_karts[kart].score += getPositionScore(pos); } + friend bool operator< (const KartStatus& left, const KartStatus& right) + { + if (left.score < right.score) return true; + return false; + } + }; - + class QuickRaceMode : public RaceMode { public: diff --git a/src/stk_config.cpp b/src/stk_config.cpp index 4993259dd..ec889fe0a 100644 --- a/src/stk_config.cpp +++ b/src/stk_config.cpp @@ -54,6 +54,7 @@ void STKConfig::load(const std::string filename) } #endif CHECK_NEG(m_max_karts, "max-karts" ); + CHECK_NEG(m_grid_order, "grid-order" ); CHECK_NEG(m_corn_r, "m_corn_r" ); CHECK_NEG(m_corn_f, "m_corn_f" ); @@ -143,6 +144,7 @@ void STKConfig::init_defaults() m_max_speed_reverse_ratio = m_explosion_impulse = m_jump_velocity = -99.9f; m_max_karts = -100; + m_grid_order = -100; m_air_res_reduce[0] = 1.0f; } // init_defaults @@ -170,6 +172,7 @@ void STKConfig::getAllData(const lisp::Lisp* lisp) lisp->get("anvil-time", m_anvil_time ); lisp->get("explosion-impulse", m_explosion_impulse ); lisp->get("max-karts", m_max_karts ); + lisp->get("grid-order", m_grid_order ); // Get the default KartProperties // ------------------------------ diff --git a/src/stk_config.hpp b/src/stk_config.hpp index e91a4079d..f553183d0 100644 --- a/src/stk_config.hpp +++ b/src/stk_config.hpp @@ -44,6 +44,7 @@ public: // considered to be a shortcut float m_explosion_impulse; // impulse affecting each non-hit kart int m_max_karts; // maximum number of karts + int m_grid_order; // whether grand prix grid is in point order or reverse point order STKConfig() : KartProperties() {}; void init_defaults ();