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