2012-02-28 17:33:49 -05:00
|
|
|
//
|
|
|
|
// SuperTuxKart - a fun racing game with go-kart
|
2015-03-29 20:31:42 -04:00
|
|
|
// Copyright (C) 2012-2015 Joerg Henrichs
|
2012-02-28 17:33:49 -05:00
|
|
|
//
|
|
|
|
// This program is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU General Public License
|
|
|
|
// as published by the Free Software Foundation; either version 3
|
|
|
|
// of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
|
|
|
|
#ifndef HEADER_REPLAY__PLAY_HPP
|
|
|
|
#define HEADER_REPLAY__PLAY_HPP
|
|
|
|
|
|
|
|
#include "replay/replay_base.hpp"
|
2012-03-06 21:41:41 -05:00
|
|
|
#include "utils/ptr_vector.hpp"
|
2012-02-28 17:33:49 -05:00
|
|
|
|
2018-05-31 19:37:13 -04:00
|
|
|
#include "irrString.h"
|
2016-02-14 12:12:13 -05:00
|
|
|
#include <algorithm>
|
2012-02-28 17:33:49 -05:00
|
|
|
#include <string>
|
|
|
|
#include <vector>
|
|
|
|
|
2018-05-31 19:37:13 -04:00
|
|
|
using namespace irr;
|
|
|
|
|
2012-02-28 17:33:49 -05:00
|
|
|
class GhostKart;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \ingroup replay
|
|
|
|
*/
|
|
|
|
class ReplayPlay : public ReplayBase
|
|
|
|
{
|
2016-02-14 12:12:13 -05:00
|
|
|
|
|
|
|
public:
|
|
|
|
/** Order of sort for ReplayData */
|
|
|
|
enum SortOrder
|
|
|
|
{
|
|
|
|
SO_DEFAULT,
|
|
|
|
SO_TRACK = SO_DEFAULT,
|
|
|
|
SO_REV,
|
|
|
|
SO_KART_NUM,
|
|
|
|
SO_DIFF,
|
|
|
|
SO_LAPS,
|
2017-08-03 19:51:42 -04:00
|
|
|
SO_TIME,
|
2018-05-13 20:51:52 -04:00
|
|
|
SO_USER,
|
|
|
|
SO_VERSION
|
2016-02-14 12:12:13 -05:00
|
|
|
};
|
|
|
|
|
|
|
|
class ReplayData
|
|
|
|
{
|
|
|
|
public:
|
2017-08-03 19:51:42 -04:00
|
|
|
std::string m_filename;
|
|
|
|
std::string m_track_name;
|
2018-05-13 20:51:52 -04:00
|
|
|
std::string m_minor_mode;
|
|
|
|
core::stringw m_stk_version;
|
2017-08-03 19:51:42 -04:00
|
|
|
core::stringw m_user_name;
|
|
|
|
std::vector<std::string> m_kart_list;
|
|
|
|
std::vector<core::stringw> m_name_list;
|
2018-05-13 20:51:52 -04:00
|
|
|
std::vector<float> m_kart_color; //no sorting for this
|
2017-08-03 19:51:42 -04:00
|
|
|
bool m_reverse;
|
|
|
|
bool m_custom_replay_file;
|
|
|
|
unsigned int m_difficulty;
|
|
|
|
unsigned int m_laps;
|
2018-05-13 20:51:52 -04:00
|
|
|
unsigned int m_replay_version; //no sorting for this
|
|
|
|
uint64_t m_replay_uid; //no sorting for this
|
2017-08-03 19:51:42 -04:00
|
|
|
float m_min_time;
|
2016-02-14 12:12:13 -05:00
|
|
|
|
|
|
|
bool operator < (const ReplayData& r) const
|
|
|
|
{
|
|
|
|
switch (m_sort_order)
|
|
|
|
{
|
|
|
|
case SO_TRACK:
|
|
|
|
return m_track_name < r.m_track_name;
|
|
|
|
break;
|
|
|
|
case SO_KART_NUM:
|
|
|
|
return m_kart_list.size() < r.m_kart_list.size();
|
|
|
|
break;
|
|
|
|
case SO_REV:
|
|
|
|
return m_reverse < r.m_reverse;
|
|
|
|
break;
|
|
|
|
case SO_DIFF:
|
|
|
|
return m_difficulty < r.m_difficulty;
|
|
|
|
break;
|
|
|
|
case SO_LAPS:
|
|
|
|
return m_laps < r.m_laps;
|
|
|
|
break;
|
|
|
|
case SO_TIME:
|
|
|
|
return m_min_time < r.m_min_time;
|
|
|
|
break;
|
2017-08-03 19:51:42 -04:00
|
|
|
case SO_USER:
|
|
|
|
return m_user_name < r.m_user_name;
|
|
|
|
break;
|
2018-05-13 20:51:52 -04:00
|
|
|
case SO_VERSION:
|
|
|
|
return m_stk_version < r.m_stk_version;
|
|
|
|
break;
|
2016-02-14 12:12:13 -05:00
|
|
|
} // switch
|
|
|
|
return true;
|
|
|
|
} // operator <
|
|
|
|
}; // ReplayData
|
|
|
|
|
2012-02-28 17:33:49 -05:00
|
|
|
private:
|
2016-02-12 12:34:00 -05:00
|
|
|
static ReplayPlay *m_replay_play;
|
2012-02-28 17:33:49 -05:00
|
|
|
|
2016-02-14 12:12:13 -05:00
|
|
|
static SortOrder m_sort_order;
|
|
|
|
|
2016-02-12 12:34:00 -05:00
|
|
|
unsigned int m_current_replay_file;
|
2013-05-30 15:47:39 -04:00
|
|
|
|
2018-05-13 20:51:52 -04:00
|
|
|
unsigned int m_second_replay_file;
|
|
|
|
|
|
|
|
bool m_second_replay_enabled;
|
|
|
|
|
2016-02-12 12:34:00 -05:00
|
|
|
std::vector<ReplayData> m_replay_file_list;
|
2016-02-06 01:52:50 -05:00
|
|
|
|
2012-02-28 17:33:49 -05:00
|
|
|
/** All ghost karts. */
|
2016-02-12 12:34:00 -05:00
|
|
|
PtrVector<GhostKart> m_ghost_karts;
|
2012-02-28 17:33:49 -05:00
|
|
|
|
|
|
|
ReplayPlay();
|
|
|
|
~ReplayPlay();
|
2018-05-13 20:51:52 -04:00
|
|
|
void readKartData(FILE *fd, char *next_line, bool second_replay);
|
2012-02-28 17:33:49 -05:00
|
|
|
public:
|
|
|
|
void reset();
|
2016-02-06 01:52:50 -05:00
|
|
|
void load();
|
2018-05-13 20:51:52 -04:00
|
|
|
void loadFile(bool second_replay);
|
2016-02-12 12:34:00 -05:00
|
|
|
void loadAllReplayFile();
|
|
|
|
// ------------------------------------------------------------------------
|
2016-02-14 12:12:13 -05:00
|
|
|
static void setSortOrder(SortOrder so) { m_sort_order = so; }
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
void sortReplay(bool reverse)
|
|
|
|
{
|
|
|
|
(reverse ? std::sort(m_replay_file_list.rbegin(),
|
|
|
|
m_replay_file_list.rend()) : std::sort(m_replay_file_list.begin(),
|
|
|
|
m_replay_file_list.end()));
|
|
|
|
}
|
|
|
|
// ------------------------------------------------------------------------
|
2016-02-12 12:34:00 -05:00
|
|
|
void setReplayFile(unsigned int n)
|
|
|
|
{ m_current_replay_file = n; }
|
2018-05-13 20:51:52 -04:00
|
|
|
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
void setSecondReplayFile(unsigned int n, bool second_replay_enabled)
|
|
|
|
{ m_second_replay_file = n;
|
|
|
|
m_second_replay_enabled = second_replay_enabled;}
|
|
|
|
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
void setReplayFileByUID(uint64_t uid);
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
unsigned int getReplayIdByUID(uint64_t uid);
|
|
|
|
|
2016-02-12 12:34:00 -05:00
|
|
|
// ------------------------------------------------------------------------
|
2016-03-23 02:26:48 -04:00
|
|
|
bool addReplayFile(const std::string& fn,
|
2018-05-13 20:51:52 -04:00
|
|
|
bool custom_replay = false,
|
|
|
|
int call_index = 0);
|
2016-03-23 02:26:48 -04:00
|
|
|
// ------------------------------------------------------------------------
|
2016-02-12 12:34:00 -05:00
|
|
|
const ReplayData& getReplayData(unsigned int n) const
|
|
|
|
{ return m_replay_file_list.at(n); }
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
const unsigned int getNumReplayFile() const
|
2017-04-07 09:25:52 -04:00
|
|
|
{ return (unsigned int)m_replay_file_list.size(); }
|
2016-02-06 01:52:50 -05:00
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
GhostKart* getGhostKart(int n) { return m_ghost_karts.get(n); }
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
const unsigned int getNumGhostKart() const
|
2016-02-12 12:34:00 -05:00
|
|
|
{
|
|
|
|
assert(m_replay_file_list.size() > 0);
|
2018-05-13 20:51:52 -04:00
|
|
|
unsigned int num = m_replay_file_list.at(m_current_replay_file)
|
|
|
|
.m_kart_list.size();
|
|
|
|
unsigned int second_file_num = m_replay_file_list.at(m_second_replay_file)
|
2017-04-07 09:25:52 -04:00
|
|
|
.m_kart_list.size();
|
2018-05-13 20:51:52 -04:00
|
|
|
|
|
|
|
num = (m_second_replay_enabled) ? num + second_file_num : num;
|
|
|
|
|
|
|
|
return num;
|
2017-04-07 09:25:52 -04:00
|
|
|
} // getNumGhostKart
|
2016-02-06 01:52:50 -05:00
|
|
|
// ------------------------------------------------------------------------
|
2018-05-13 20:51:52 -04:00
|
|
|
const std::string& getGhostKartName(unsigned int n) const
|
2016-02-12 12:34:00 -05:00
|
|
|
{
|
|
|
|
assert(m_replay_file_list.size() > 0);
|
2018-05-13 20:51:52 -04:00
|
|
|
|
|
|
|
unsigned int fkn = m_replay_file_list.at(m_current_replay_file).m_kart_list.size();
|
|
|
|
if (n < fkn)
|
|
|
|
return m_replay_file_list.at(m_current_replay_file).m_kart_list.at(n);
|
|
|
|
else
|
|
|
|
return m_replay_file_list.at(m_second_replay_file).m_kart_list.at(n-fkn);
|
2016-02-12 12:34:00 -05:00
|
|
|
}
|
2012-02-28 17:33:49 -05:00
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
/** Creates a new instance of the replay object. */
|
2016-02-06 01:52:50 -05:00
|
|
|
static void create() { m_replay_play = new ReplayPlay(); }
|
2012-02-28 17:33:49 -05:00
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
/** Returns the instance of the replay object. */
|
2016-02-06 01:52:50 -05:00
|
|
|
static ReplayPlay *get() { return m_replay_play; }
|
2012-02-28 17:33:49 -05:00
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
/** Delete the instance of the replay object. */
|
2016-02-06 01:52:50 -05:00
|
|
|
static void destroy()
|
|
|
|
{ delete m_replay_play; m_replay_play = NULL; }
|
|
|
|
// ------------------------------------------------------------------------
|
2016-02-12 12:34:00 -05:00
|
|
|
/** Returns the filename that was opened. */
|
2018-05-13 20:51:52 -04:00
|
|
|
virtual const std::string& getReplayFilename(int replay_file_number = 1) const
|
2016-02-12 12:34:00 -05:00
|
|
|
{
|
|
|
|
assert(m_replay_file_list.size() > 0);
|
2018-05-13 20:51:52 -04:00
|
|
|
if (replay_file_number == 2)
|
|
|
|
return m_replay_file_list.at(m_second_replay_file).m_filename;
|
|
|
|
else
|
|
|
|
return m_replay_file_list.at(m_current_replay_file).m_filename;
|
2016-02-12 12:34:00 -05:00
|
|
|
}
|
|
|
|
// ------------------------------------------------------------------------
|
2012-02-28 17:33:49 -05:00
|
|
|
}; // Replay
|
|
|
|
|
|
|
|
#endif
|