/* * File: hiscores.h * Summary: Scorefile manipulation functions * Written by: Gordon Lipford */ #ifndef HISCORES_H #define HISCORES_H struct scorefile_entry; void hiscores_new_entry( const scorefile_entry &se ); void logfile_new_entry( const scorefile_entry &se ); void hiscores_print_list( int display_count = -1, int format = SCORE_TERSE ); 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 ); #ifdef DGL_MILESTONES void mark_milestone(const std::string &type, const std::string &milestone); #endif #ifdef DGL_WHEREIS std::string xlog_status_line(); #endif std::string xlog_unescape(const std::string &); std::string xlog_escape(const std::string &); std::vector xlog_split_fields(const std::string &s); 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: void map_fields() const; private: typedef std::vector< std::pair > xl_fields; typedef std::map xl_map; xl_fields fields; mutable xl_map fieldmap; }; struct scorefile_entry { public: std::string version; long points; std::string name; long uid; // for multiuser systems species_type race; job_type 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; // NON_MONSTER or monster type int mon_num; // sigh... std::string death_source_name; // overrides death_source std::string auxkilldata; // weapon wielded, spell cast, etc std::string indirectkiller; // the effect or real monster that summoned std::string killerpath; // colon-separated intermediate killers char dlvl; // dungeon level (relative) level_area_type level_type; // what kind of level died on.. branch_type 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) god_type 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 long kills; // number of monsters killed std::string maxed_skills; // comma-separated list of skills // at level 27 int gold; // Remaining gold. int gold_found; // Gold found. int gold_spent; // Gold spent shopping. mutable std::auto_ptr fields; 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; void set_base_xlog_fields() const; 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; std::string death_source_desc() const; std::string damage_string(bool terse = false) const; 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); }; #endif // HISCORES_H