The kart start order now depends on the ranking in the

grand prix. It can be set to 'lowest points first'
or 'highest points first' in stk_config (patch by
Paul Elms).


git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@1300 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
hikerstk 2007-11-21 13:54:40 +00:00
parent dc130b5a10
commit 7721c5dd1c
5 changed files with 52 additions and 15 deletions

View File

@ -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
;; -----------------------------

View File

@ -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

View File

@ -22,6 +22,7 @@
#include <vector>
#include <string>
#include <algorithm>
#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<std::string> m_players;
CupData m_cup;
std::vector<KartStatus> m_karts;
int m_track;
GrandPrixMode(const std::vector<std::string>& 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:

View File

@ -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
// ------------------------------

View File

@ -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 ();