#pragma once #define WEAK __declspec(selectany) #define NAKED __declspec(naked) #define SELECT(mp, sp) (game::environment::t4mp() ? mp : sp) #define ASSIGN(type, mp, sp) reinterpret_cast(SELECT(mp, sp)) #define CALL_ADDR(mp, sp) ASSIGN(void*, mp, sp) #define ARRAY_COUNT(arrayn) \ ((sizeof(arrayn)) / (sizeof(arrayn[0]))) #ifndef NDEBUG #undef assert #define assert(expr) \ if (!!!(expr)) \ { \ utils::io::write_file("t4sp-server-plugin/gsc_state_assert.json", get_full_gsc_state_str(game::SCRIPTINSTANCE_SERVER)); \ _wassert(_CRT_WIDE(#expr), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)); \ } #endif namespace game { enum gamemode { multiplayer, singleplayer, none }; extern gamemode current; namespace environment { bool t4mp(); bool t4sp(); } template class symbol { public: symbol(const size_t t4mp, const size_t t4sp) : t4mp_(reinterpret_cast(t4mp)) , t4sp_(reinterpret_cast(t4sp)) { } T* get() const { if (environment::t4mp()) { return t4mp_; } return t4sp_; } void set(const size_t ptr) { this->t4mp_ = reinterpret_cast(ptr); this->t4sp_ = reinterpret_cast(ptr); } operator T* () const { return this->get(); } T* operator->() const { return this->get(); } private: T* t4mp_; T* t4sp_; }; }