diff options
Diffstat (limited to 'crawl-ref/source/hiscores.h')
-rw-r--r-- | crawl-ref/source/hiscores.h | 139 |
1 files changed, 138 insertions, 1 deletions
diff --git a/crawl-ref/source/hiscores.h b/crawl-ref/source/hiscores.h index 5332b42baf..3acf677c89 100644 --- a/crawl-ref/source/hiscores.h +++ b/crawl-ref/source/hiscores.h @@ -12,6 +12,8 @@ #ifndef HISCORES_H #define HISCORES_H +struct scorefile_entry; + // last updated 16feb2001 {gdl} /* *********************************************************************** * called from: ouch @@ -37,6 +39,141 @@ void hiscores_print_all(int display_count = -1, int format = SCORE_TERSE); * *********************************************************************** */ std::string hiscores_format_single( const scorefile_entry &se ); std::string hiscores_format_single_long( const scorefile_entry &se, - bool verbose = false ); + bool verbose = false ); + +class xlog_fields +{ +public: + xlog_fields(); + xlog_fields(const std::string &line); + + void init(const std::string &line); + std::string xlog_line() const; + + void add_field(const std::string &key, + const char *format, ...); + + std::string str_field(const std::string &) const; + int int_field(const std::string &) const; + long long_field(const std::string &) const; + +private: + std::string xlog_unescape(const std::string &) const; + std::string xlog_escape(const std::string &) const; + void map_fields() const; + std::string::size_type next_separator(const std::string &s, + std::string::size_type start) const; + std::vector<std::string> split_fields(const std::string &s) const; + +private: + typedef std::vector< std::pair<std::string, std::string> > xl_fields; + typedef std::map<std::string, std::string> xl_map; + + xl_fields fields; + mutable xl_map fieldmap; +}; + +struct scorefile_entry +{ +public: + char version; + char release; + long points; + std::string name; + long uid; // for multiuser systems + char race; + char cls; + std::string race_class_name; // overrides race & cls if non-empty. + char lvl; // player level. + char best_skill; // best skill # + char best_skill_lvl; // best skill level + int death_type; + int death_source; // 0 or monster TYPE + int mon_num; // sigh... + std::string death_source_name; // overrides death_source + std::string auxkilldata; // weapon wielded, spell cast, etc + char dlvl; // dungeon level (relative) + char level_type; // what kind of level died on.. + char branch; // dungeon branch + int final_hp; // actual current HPs (probably <= 0) + int final_max_hp; // net HPs after rot + int final_max_max_hp; // gross HPs before rot + int damage; // damage of final attack + int str; // final str (useful for nickname) + int intel; // final int + int dex; // final dex (useful for nickname) + int god; // god + int piety; // piety + int penance; // penance + char wiz_mode; // character used wiz mode + time_t birth_time; // start time of character + time_t death_time; // end time of character + long real_time; // real playing time in seconds + long num_turns; // number of turns taken + int num_diff_runes; // number of rune types in inventory + int num_runes; // total number of runes in inventory + +public: + scorefile_entry(); + scorefile_entry(int damage, int death_source, int death_type, + const char *aux, bool death_cause_only = false); + scorefile_entry(const scorefile_entry &se); + + scorefile_entry &operator = (const scorefile_entry &other); + + void init_death_cause(int damage, int death_source, int death_type, + const char *aux); + void init(); + void reset(); + + enum death_desc_verbosity { + DDV_TERSE, + DDV_ONELINE, + DDV_NORMAL, + DDV_VERBOSE, + DDV_LOGVERBOSE // Semi-verbose for logging purposes + }; + + std::string raw_string() const; + bool parse(const std::string &line); + + std::string hiscore_line(death_desc_verbosity verbosity) const; + + std::string character_description(death_desc_verbosity) const; + // Full description of death: Killed by an xyz wielding foo + std::string death_description(death_desc_verbosity) const; + std::string death_place(death_desc_verbosity) const; + std::string game_time(death_desc_verbosity) const; + +private: + mutable std::auto_ptr<xlog_fields> fields; + +private: + std::string single_cdesc() const; + std::string strip_article_a(const std::string &s) const; + std::string terse_missile_cause() const; + std::string terse_missile_name() const; + std::string terse_beam_cause() const; + std::string terse_wild_magic() const; + std::string terse_trap() const; + const char *damage_verb() const; + const char *death_source_desc() const; + std::string damage_string(bool terse = false) const; + + bool parse_obsolete_scoreline(const std::string &line); + bool parse_scoreline(const std::string &line); + + void init_with_fields(); + void add_auxkill_field() const; + void set_score_fields() const; + + std::string short_kill_message() const; + std::string long_kill_message() const; + std::string make_oneline(const std::string &s) const; + + void init_from(const scorefile_entry &other); + + int kludge_branch(int branch_01) const; +}; #endif // HISCORES_H |