#pragma once #undef ChangeYaw #undef checkclient #undef droptofloor #undef error #undef movetogoal #undef objerror #undef remove #undef walkmove #undef setcolor #ifdef MENUQC #define NULL (RVALUE, null_entity) #define world NULL #else #define NULL (RVALUE, world) #endif #include "lib/accumulate.qh" #include "lib/misc.qh" #include "lib/static.qh" #include "lib/vector.qh" void(vector) _vectorvectors; #ifdef GAMEQC STATIC_INIT(globals) { _vectorvectors = vectorvectors; // set to NaN to more easily detect uninitialized use v_forward = VEC_NAN; v_right = VEC_NAN; v_up = VEC_NAN; } /// Same as the `makevectors` builtin but uses the provided locals instead of the `v_*` globals. /// Always use this instead of raw `makevectors` to make the data flow clear. /// It's 2018, they even teach that globals are bad at my uni... though for some reason they never explained why. Sigh. #define MAKEVECTORS(angles, forward, right, up) MACRO_BEGIN { \ makevectors(angles); \ forward = v_forward; \ right = v_right; \ up = v_up; \ v_forward = VEC_NAN; \ v_right = VEC_NAN; \ v_up = VEC_NAN; \ } MACRO_END // Same as `MAKEVECTORS` but also creates the locals for convenience. #define MAKEVECTORS_NEW(angles, forward, right, up) \ vector forward = '0 0 0'; \ vector right = '0 0 0'; \ vector up = '0 0 0'; \ MAKEVECTORS(angles, forward, right, up); #define VECTOR_VECTORS(forward_in, forward, right, up) MACRO_BEGIN { \ _vectorvectors(forward_in); \ forward = v_forward; \ right = v_right; \ up = v_up; \ v_forward = VEC_NAN; \ v_right = VEC_NAN; \ v_up = VEC_NAN; \ } MACRO_END #define VECTOR_VECTORS_NEW(forward_in, forward, right, up) \ vector forward = '0 0 0'; \ vector right = '0 0 0'; \ vector up = '0 0 0'; \ VECTOR_VECTORS(forward_in, forward, right, up); #define vectorvectors DO_NOT_USE_GLOBALS // FIXME find a good place for this // FIXME MAKE_VECTORS because current naming sucks // FIXME ban vectorvectors // TODO when raw makevectors and similar functions are not used anywhere else anymore, // assert that the global vectors are NaN before calling makevectors in MAKEVECTORS // to make sure nobody (even builtins) is accidentally using them - NaN is the most liekly value to expose values clearly // also uncomment these: //#define makevectors DO_NOT_USE_GLOBALS //#define v_forward DO_NOT_USE_GLOBALS //#define v_right DO_NOT_USE_GLOBALS //#define v_up DO_NOT_USE_GLOBALS // FIXME ^ won't work #endif