4 // TODO: rename to 'netvars'
12 /** Get all stats and store them as globals, access with `STAT(ID)` */
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))
18 #define getstat_int(id) getstati(id, 0, 24)
19 #define getstat_bool(id) boolean(getstati(id))
20 #define getstat_float(id) getstatf(id)
22 #define _STAT(id) g_stat_##id
23 #define REGISTER_STAT(id, type) \
25 REGISTER(RegisterStats, STAT, Stats, id, m_id, new(stat)) \
29 [[accumulate]] void stats_get() \
31 _STAT(id) = getstat_##type(STAT_##id.m_id); \
34 /** Add all registered stats, access with `STAT(ID, player)` or `.type stat = _STAT(ID); player.stat` */
36 #define STAT(id, cl) (cl._STAT(id))
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;
43 const int AS_FLOAT = 8;
45 #define _STAT(id) stat_##id
46 #define REGISTER_STAT(id, type) \
48 REGISTER(RegisterStats, STAT, Stats, id, m_id, new(stat)) \
52 [[accumulate]] void stats_add() \
54 addstat_##type(STAT_##id.m_id, _STAT(id)); \
57 #define REGISTER_STAT(id, type)
60 const int STATS_ENGINE_RESERVE = 32 + (8 * 3); // Not sure how to handle vector stats yet, reserve them too
62 REGISTRY(Stats, 220 - STATS_ENGINE_RESERVE)
63 REGISTER_REGISTRY(RegisterStats)
64 REGISTRY_SORT(Stats, 0)
66 STATIC_INIT(RegisterStats_renumber)
68 FOREACH(Stats, true, LAMBDA(it.m_id = STATS_ENGINE_RESERVE + i));
71 STATIC_INIT(stats_add) { stats_add(); }