10 /** Get all stats and store them as globals, access with `STAT(ID)` */
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))
16 #define getstat_int(id) getstati(id, 0, 24)
17 #define getstat_bool(id) boolean(getstati(id))
18 #define getstat_float(id) getstatf(id)
20 #define _STAT(id) g_stat_##id
21 #define REGISTER_STAT(id, type) \
23 REGISTER(RegisterStats, STAT, Stats, id, m_id, new(stat)) \
27 [[accumulate]] void stats_get() \
29 _STAT(id) = getstat_##type(STAT_##id.m_id); \
32 /** Add all registered stats, access with `STAT(ID, player)` or `.type stat = _STAT(ID); player.stat` */
34 #define STAT(id, cl) (cl._STAT(id))
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;
41 const int AS_FLOAT = 8;
43 #define _STAT(id) stat_##id
44 #define REGISTER_STAT(id, type) \
46 REGISTER(RegisterStats, STAT, Stats, id, m_id, new(stat)) \
50 [[accumulate]] void stats_add() \
52 addstat_##type(STAT_##id.m_id, _STAT(id)); \
55 #define REGISTER_STAT(id, type)
58 const int STATS_ENGINE_RESERVE = 32;
60 REGISTRY(Stats, BITS(8) - STATS_ENGINE_RESERVE)
61 REGISTER_REGISTRY(RegisterStats)
62 REGISTRY_SORT(Stats, 0)
64 STATIC_INIT(RegisterStats_renumber)
66 FOREACH(Stats, true, LAMBDA(it.m_id = STATS_ENGINE_RESERVE + i));
69 STATIC_INIT(stats_add) { stats_add(); }