]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Mutator registry
authorTimePath <andrew.hardaker1995@gmail.com>
Wed, 19 Aug 2015 10:55:21 +0000 (20:55 +1000)
committerTimePath <andrew.hardaker1995@gmail.com>
Wed, 19 Aug 2015 10:55:21 +0000 (20:55 +1000)
mod/server/main.qc
qcsrc/Makefile
qcsrc/common/mutators/base.qh
qcsrc/server/mutators/mutators.qc

index f6c94ca653f78283d6f2908b1450a44e83e2c3bd..d84239c0bfbba30cf7ccb3b55b3f27f13612122c 100644 (file)
@@ -1,25 +1,9 @@
-MUTATOR_HOOKFUNCTION(mod_BuildMutatorsString)
-{
+REGISTER_MUTATOR(mutator_mod, cvar("g_mod"));
+
+MUTATOR_HOOKFUNCTION(mutator_mod, BuildMutatorsString) {
     ret_string = strcat(ret_string, ":mod");
-    return false;
 }
 
-MUTATOR_HOOKFUNCTION(mod_BuildMutatorsPrettyString)
-{
+MUTATOR_HOOKFUNCTION(mutator_mod, BuildMutatorsPrettyString) {
     ret_string = strcat(ret_string, ", Mod");
-    return false;
-}
-
-MUTATOR_DECLARATION(mutator_mod);
-MUTATOR_DEFINITION(mutator_mod)
-{
-    MUTATOR_HOOK(BuildMutatorsString, mod_BuildMutatorsString, CBC_ORDER_ANY);
-    MUTATOR_HOOK(BuildMutatorsPrettyString, mod_BuildMutatorsPrettyString, CBC_ORDER_ANY);
-    return false;
-}
-
-[[accumulate]]
-void mutators_add()
-{
-    MUTATOR_ADD(mutator_mod);
 }
index 0ccf4f97163f46b878f38997e525b05f8716077a..3f58e672cbb83f67c7e8ab4a929123fcfb7787fd 100644 (file)
@@ -13,7 +13,7 @@ QCCFLAGS ?= \
        -std=gmqcc \
        -O3 -flno \
        -Werror -fno-bail-on-werror -Wall \
-       -fftepp -fftepp-predefs -Wcpp -futf8 \
+       -fftepp -fftepp-predefs -Wcpp -futf8 -freturn-assignments \
        $(QCCFLAGS_WTFS) \
        $(QCCFLAGS_FEATURES) \
        $(QCCFLAGS_EXTRA) $(QCCFLAGS_WATERMARK)
index dfd73a7eded0352cf0850b6002fbf9b447e4aa1c..270e1d8740fc915c393003e9345207c2eccdf2a2 100644 (file)
@@ -143,8 +143,10 @@ enum {
 typedef bool(int) mutatorfunc_t;
 
 CLASS(Mutator, Object)
+    ATTRIB(Mutator, m_id, int, 0)
     ATTRIB(Mutator, mutatorname, string, string_null)
     ATTRIB(Mutator, mutatorfunc, mutatorfunc_t, func_null)
+    METHOD(Mutator, mutatorcheck, bool())
     CONSTRUCTOR(Mutator, string name, mutatorfunc_t func) {
         CONSTRUCT(Mutator);
         this.mutatorname = name;
@@ -206,17 +208,52 @@ void Mutator_Remove(Mutator mut)
 #define MUTATOR_DEFINITION(name) \
     bool MUTATORFUNCTION_##name(int mode); \
     STATIC_INIT(MUTATOR_##name) { MUTATOR_##name = NEW(Mutator, #name, MUTATORFUNCTION_##name); } \
-    bool MUTATORFUNCTION_##name(int mode)
+    [[last]] bool MUTATORFUNCTION_##name(int mode)
+
+void RegisterMutators();
+const int MUTATORS_MAX = MAX_MUTATORS;
+entity MUTATORS[MUTATORS_MAX], MUTATORS_first, MUTATORS_last;
+int MUTATORS_COUNT;
+#define REGISTER_MUTATOR(id, dependence) \
+    bool MUTATORFUNCTION_##id##_hooks(int mode) { return = false; } \
+    bool MUTATORFUNCTION_##id(int mode) { \
+        return = false; \
+        bool ret = MUTATORFUNCTION_##id##_hooks(mode); if (ret) return ret; \
+    } \
+    bool MUTATOR_##id##_check() { return dependence; } \
+    REGISTER(RegisterMutators, MUTATOR, MUTATORS, MUTATORS_COUNT, id, m_id, NEW(Mutator, #id, MUTATORFUNCTION_##id)) \
+    { this.mutatorcheck = MUTATOR_##id##_check; } \
+    [[accumulate]] bool MUTATORFUNCTION_##id(int mode)
+REGISTER_REGISTRY(RegisterMutators)
+
 #define MUTATOR_ONADD                   if (mode == MUTATOR_ADDING)
 #define MUTATOR_ONREMOVE                if (mode == MUTATOR_REMOVING)
 #define MUTATOR_ONROLLBACK_OR_REMOVE    if (mode == MUTATOR_REMOVING || mode == MUTATOR_ROLLING_BACK)
 #define MUTATOR_ADD(name)               Mutator_Add(MUTATOR_##name)
 #define MUTATOR_REMOVE(name)            Mutator_Remove(MUTATOR_##name)
 #define MUTATOR_RETURNVALUE             CallbackChain_ReturnValue
-#define MUTATOR_HOOKFUNCTION(name) \
-    bool HOOKFUNCTION_##name(); \
-    Callback CALLBACK_##name; STATIC_INIT(CALLBACK_##name) { CALLBACK_##name = NEW(Callback, HOOKFUNCTION_##name); } \
+
+#define _MUTATOR_CALLBACK(name, func) \
+    Callback CALLBACK_##name; \
+    bool func(); \
+    STATIC_INIT(CALLBACK_##name) { CALLBACK_##name = NEW(Callback, func); }
+
+#define MUTATOR_HOOKFUNCTION(...) \
+    OVERLOAD(MUTATOR_HOOKFUNCTION, __VA_ARGS__)
+
+#define MUTATOR_HOOKFUNCTION_1(name) \
+    _MUTATOR_CALLBACK(name, HOOKFUNCTION_##name) \
     bool HOOKFUNCTION_##name()
+
+#define MUTATOR_HOOKFUNCTION_2(mut, cb) \
+    MUTATOR_HOOKFUNCTION(mut, cb, CBC_ORDER_ANY)
+
+#define MUTATOR_HOOKFUNCTION_3(mut, cb, order) \
+    _MUTATOR_CALLBACK(mut##_##cb, mut##_##cb) \
+    [[accumulate]] bool MUTATORFUNCTION_##mut##_hooks(int mode) { MUTATOR_HOOK(cb, mut##_##cb, order); } \
+    bool mut##_##cb() { return = false; } \
+    [[accumulate]] bool mut##_##cb()
+
 #define MUTATOR_HOOK(cb, func, order) do {                              \
     MUTATOR_ONADD {                                                     \
         if (!CallbackChain_Add(HOOK_##cb, CALLBACK_##func, order)) {    \
index 0c63015320dc2c2d0b217a8c7aad403cf3ce4f48..b039cf37f125b7d64f98ad435aa80f71dd3015ef 100644 (file)
@@ -34,5 +34,9 @@ void mutators_add()
        CHECK_MUTATOR_ADD("g_overkill", mutator_overkill, !cvar("g_instagib") && !g_nexball && cvar_string("g_mod_balance") == "Overkill");
        CHECK_MUTATOR_ADD("g_buffs", mutator_buffs, 1);
 
+       FOREACH(MUTATORS, it.mutatorcheck(), LAMBDA(
+               Mutator_Add(it)
+       ));
+
        #undef CHECK_MUTATOR_ADD
 }