]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/menu/oo/classes.qc
Sort menu classes
[xonotic/xonotic-data.pk3dir.git] / qcsrc / menu / oo / classes.qc
diff --git a/qcsrc/menu/oo/classes.qc b/qcsrc/menu/oo/classes.qc
new file mode 100644 (file)
index 0000000..e6182ca
--- /dev/null
@@ -0,0 +1,55 @@
+#include "base.qh"
+
+#ifdef CLASS
+#undef CLASS
+#undef METHOD
+#undef ATTRIB
+#undef ATTRIBARRAY
+#undef ENDCLASS
+#undef SUPER
+#endif
+
+#define CLASS(cname, base)                                          \
+[[accumulate]] entity spawn##cname(entity this, entity basevtbl) {  \
+    this = NEW(base); basevtbl = base##_vtbl;                       \
+}
+
+#define METHOD(cname, name, prototype)                              \
+prototype cname##_##name;                                           \
+.prototype name;                                                    \
+[[accumulate]] entity spawn##cname(entity this, entity basevtbl) {  \
+    this.name = cname##_##name;                                     \
+}
+
+#define ATTRIB(cname, name, type, val)                              \
+.type name;                                                         \
+[[accumulate]] entity spawn##cname(entity this, entity basevtbl) {  \
+    this.name = val;                                                \
+}
+
+#define ATTRIBARRAY(cname, name, type, cnt)                         \
+.type name[cnt];
+
+#define ENDCLASS(cname)                                             \
+.bool instanceOf##cname;                                            \
+entity cname##_vtbl;                                                \
+[[last]] entity spawn##cname(entity this, entity basevtbl) {        \
+    this.instanceOf##cname = true;                                  \
+    this.classname = #cname;                                        \
+    if (!cname##_vtbl) cname##_vtbl = spawnVtbl(this, basevtbl);    \
+    return this;                                                    \
+}
+
+#define SUPER(cname) (cname##_vtbl.vtblbase)
+
+#ifdef IMPLEMENTATION
+#undef IMPLEMENTATION
+#endif
+
+#include "../classes.inc"
+
+#ifndef IMPLEMENTATION
+#define IMPLEMENTATION
+#endif
+
+#include "../classes.inc"