#pragma once #ifndef SCRIPTFACTORY_H #define SCRIPTFACTORY_H #define SCRIPTSYS_HASV8 template struct ScriptConstructorId { static constexpr auto result = ""; }; #define SCRIPTFACTORY_CONSTRUCTOR(CLASS_NAME, KEY) \ class CLASS_NAME; \ template<> struct ScriptConstructorId { \ static constexpr auto result = #KEY; \ }; SCRIPTFACTORY_CONSTRUCTOR(TLevel, level) SCRIPTFACTORY_CONSTRUCTOR(TLevelLink, link) SCRIPTFACTORY_CONSTRUCTOR(TLevelSign, sign) SCRIPTFACTORY_CONSTRUCTOR(TLevelChest, chest) SCRIPTFACTORY_CONSTRUCTOR(TNPC, npc) SCRIPTFACTORY_CONSTRUCTOR(TPlayer, player) SCRIPTFACTORY_CONSTRUCTOR(TWeapon, weapon) #undef SCRIPTFACTORY_CONSTRUCTOR #ifdef SCRIPTSYS_HASV8 #include "V8ScriptArguments.h" #endif #include struct ScriptFactory { /* Create Script Arguments */ template static inline ScriptArguments * CreateArguments(T *env, Args&&... An) { return nullptr; } template static inline ScriptArguments * CreateArguments(IScriptEnv *env, Args&&... An) { switch (env->GetType()) { #ifdef SCRIPTSYS_HASV8 case 1: // v8 return CreateArguments(static_cast(env), std::forward(An)...); #endif default: // couldn't deduce type return nullptr; } } #ifdef SCRIPTSYS_HASV8 template static inline ScriptArguments * CreateArguments(V8ScriptEnv *env, Args&&... An) { return new V8ScriptArguments(std::forward(An)...); } #endif /* Wrap Object */ template static inline std::unique_ptr> WrapObject(T *env, const std::string& ctor_name, Cls *obj) { return {}; } template static inline std::unique_ptr> WrapObject(IScriptEnv *env, const std::string& ctor_name, Cls *obj) { switch (env->GetType()) { #ifdef SCRIPTSYS_HASV8 case 1: // v8 return WrapObject(static_cast(env), ctor_name, obj); #endif default: // couldn't deduce type return {}; } } #ifdef SCRIPTSYS_HASV8 template static inline std::unique_ptr> WrapObject(V8ScriptEnv *env, const std::string& ctor_name, Cls *obj) { return env->Wrap(ctor_name, obj); } #endif }; #endif