]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/lib/stats.qh
Merge branch 'master' into Mario/bulldozer
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / stats.qh
1 #ifndef LIB_STATS_H
2 #define LIB_STATS_H
3
4 #include "registry.qh"
5 #include "sort.qh"
6
7 .int m_id;
8
9 #if defined(CSQC)
10         /** Get all stats and store them as globals, access with `STAT(ID)` */
11         void stats_get() {}
12         #define STAT(...) EVAL(OVERLOAD(STAT, __VA_ARGS__))
13     #define STAT_1(id) STAT_2(id, NULL)
14         #define STAT_2(id, cl) (0, _STAT(id))
15
16         #define getstat_int(id) getstati(id, 0, 24)
17         #define getstat_bool(id) boolean(getstati(id))
18         #define getstat_float(id) getstatf(id)
19
20         #define _STAT(id) g_stat_##id
21         #define REGISTER_STAT(id, type) \
22                 type _STAT(id); \
23                 REGISTER(Stats, STAT, id, m_id, new(stat)) \
24                 { \
25                         make_pure(this); \
26                 } \
27                 [[accumulate]] void stats_get() \
28                 { \
29                         _STAT(id) = getstat_##type(STAT_##id.m_id); \
30                 }
31 #elif defined(SVQC)
32         /** Add all registered stats, access with `STAT(ID, player)` or `.type stat = _STAT(ID); player.stat` */
33         void stats_add() {}
34         #define STAT(id, cl) (cl._STAT(id))
35
36         #define addstat_int(id, fld) addstat(id, AS_INT, fld)
37         #define addstat_bool(id, fld) addstat(id, AS_INT, fld)
38         #define addstat_float(id, fld) addstat(id, AS_FLOAT, fld)
39         const int AS_STRING = 1;
40         const int AS_INT = 2;
41         const int AS_FLOAT = 8;
42
43         #define _STAT(id) stat_##id
44         #define REGISTER_STAT(id, type) \
45                 .type _STAT(id); \
46                 REGISTER(Stats, STAT, id, m_id, new(stat)) \
47                 { \
48                         make_pure(this); \
49                 } \
50                 [[accumulate]] void stats_add() \
51                 { \
52                         addstat_##type(STAT_##id.m_id, _STAT(id)); \
53                 }
54 #else
55         #define REGISTER_STAT(id, type)
56 #endif
57
58 const int STATS_ENGINE_RESERVE = 32 + (8 * 3); // Not sure how to handle vector stats yet, reserve them too
59
60 REGISTRY(Stats, 220 - STATS_ENGINE_RESERVE)
61 REGISTER_REGISTRY(Stats)
62 REGISTRY_SORT(Stats, 0)
63 REGISTRY_CHECK(Stats)
64 STATIC_INIT(RegisterStats_renumber)
65 {
66         FOREACH(Stats, true, LAMBDA(it.m_id = STATS_ENGINE_RESERVE + i));
67 }
68 #ifdef SVQC
69 STATIC_INIT(stats_add) { stats_add(); }
70 #endif
71
72 #endif