summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/hiscores.h
blob: 6e29a5fd08ac56763764aa7b7e71707c74f2f8d7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/**
 * @file
 * @brief Scorefile manipulation functions
**/

#ifndef HISCORES_H
#define HISCORES_H

class 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);
void show_hiscore_table();

string hiscores_format_single(const scorefile_entry &se);
string hiscores_format_single_long(const scorefile_entry &se,
                                   bool verbose = false);

void mark_milestone(const string &type, const string &milestone,
                    const string &origin_level = "", time_t t = 0);

#ifdef DGL_WHEREIS
string xlog_status_line();
#endif

class xlog_fields
{
public:
    xlog_fields();
    xlog_fields(const string &line);

    void init(const string &line);
    string xlog_line() const;

    void add_field(const string &key, PRINTF(2, ));

    string str_field(const string &) const;
    int int_field(const string &) const;

private:
    void map_fields() const;

private:
    typedef vector< pair<string, string> > xl_fields;
    typedef map<string, string> xl_map;

    xl_fields fields;
    mutable xl_map fieldmap;
};

class scorefile_entry
{
private:
    string      raw_line;

    string      version;
    uint8_t     tiles;
    int         points;
    string      name;
    species_type race;
    int         job;                // job_type + legacy values
    string      race_class_name;    // overrides race & cls if non-empty.
    uint8_t     lvl;                // player level.
    skill_type  best_skill;         // best skill #
    uint8_t     best_skill_lvl;     // best skill level
    string      title;              // title
    int         death_type;
    int         death_source;       // NON_MONSTER or monster type
    string      death_source_name;  // overrides death_source
    set<string> death_source_flags; // misc flags about killer
    string      auxkilldata;        // weapon wielded, spell cast, etc
    string      indirectkiller;     // the effect or real monster that summoned
    string      killerpath;         // colon-separated intermediate killers
    uint8_t     dlvl;               // dungeon level (relative)
    short       absdepth;           // 1-based absolute depth
    branch_type branch;             // dungeon branch
    string      map;                // the vault (if any) the player is in
    string      mapdesc;            // DESC: of the vault the player is in.
    string      killer_map;         // the vault (if any) that placed the killer
    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         source_damage;      // total damage done by death_source
    int         turn_damage;        // total damage done last turn
    int         str;                // final str (useful for nickname)
    int         intel;              // final int
    int         dex;                // final dex (useful for nickname)
    int         ac;                 // AC
    int         ev;                 // EV
    int         sh;                 // SH
    god_type    god;                // god
    int         piety;              // piety
    int         penance;            // penance
    uint8_t     wiz_mode;           // character used wiz mode
    time_t      birth_time;         // start time of character
    time_t      death_time;         // end time of character
    time_t      real_time;          // real playing time in seconds
    int         num_turns;          // number of turns taken
    int         num_aut;            // quantity of aut taken
    int         num_diff_runes;     // number of rune types in inventory
    int         num_runes;          // total number of runes in inventory
    int         kills;              // number of monsters killed
    string      maxed_skills;       // comma-separated list of skills
                                    // at level 27
    string      fifteen_skills;     // comma-separated list of skills
                                    // at level >= 15
    string      status_effects;     // comma-separated list of status effects
    int         gold;               // Remaining gold.
    int         gold_found;         // Gold found.
    int         gold_spent;         // Gold spent shopping.

    int         zigs;               // Ziggurats completed.
    int         zigmax;             // Max level reached in a ziggurat.

    mutable unique_ptr<xlog_fields> fields;

public:
    scorefile_entry();
    scorefile_entry(int damage, int death_source, int death_type,
                    const char *aux, bool death_cause_only = false,
                    const char *death_source_name = NULL,
                    time_t death_time = 0);
    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, const char *death_source_name);
    void init(time_t death_time = 0);
    void reset();

    enum death_desc_verbosity
    {
        DDV_TERSE,
        DDV_ONELINE,
        DDV_NORMAL,
        DDV_VERBOSE,
        DDV_LOGVERBOSE     // Semi-verbose for logging purposes
    };

    string raw_string() const;
    bool parse(const string &line);

    string hiscore_line(death_desc_verbosity verbosity) const;

    string character_description(death_desc_verbosity) const;
    // Full description of death: Killed by an xyz wielding foo
    string death_description(death_desc_verbosity) const;
    string death_place(death_desc_verbosity) const;
    string game_time(death_desc_verbosity) const;

    string get_name() const       { return name; }
    int    get_score() const      { return points; }
    int    get_death_type() const { return death_type; }
    time_t get_death_time() const { return death_time; }
    xlog_fields get_fields() const;

    void set_base_xlog_fields() const;
    string short_kill_message() const;
    string long_kill_message() const;

private:
    string single_cdesc() const;
    string strip_article_a(const string &s) const;
    string terse_missile_cause() const;
    string terse_missile_name() const;
    string terse_beam_cause() const;
    string terse_wild_magic() const;
    const char *damage_verb() const;
    string death_source_desc() const;
    string damage_string(bool terse = false) const;

    bool parse_scoreline(const string &line);

    void init_with_fields();
    void add_auxkill_field() const;
    void set_score_fields() const;
    void fixup_char_name();

    string make_oneline(const string &s) const;

    void init_from(const scorefile_entry &other);
};

#endif  // HISCORES_H