mirror of https://github.com/OpenTTD/OpenTTD
Add: [Scripts] "_typeof" metamethod
parent
35e58f68e4
commit
d7bd67cda3
|
@ -340,7 +340,7 @@ foreach(LINE IN LISTS SOURCE_LINES)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
string(APPEND SQUIRREL_EXPORT "\n")
|
string(APPEND SQUIRREL_EXPORT "\n")
|
||||||
string(APPEND SQUIRREL_EXPORT "\ntemplate <> const char *GetClassName<${CLS}, ScriptType::${APIUC}>() { return \"${API_CLS}\"; }")
|
string(APPEND SQUIRREL_EXPORT "\ntemplate <> SQInteger PushClassName<${CLS}, ScriptType::${APIUC}>(HSQUIRRELVM vm) { sq_pushstring(vm, \"${API_CLS}\", -1); return 1; }")
|
||||||
string(APPEND SQUIRREL_EXPORT "\n")
|
string(APPEND SQUIRREL_EXPORT "\n")
|
||||||
|
|
||||||
# Then do the registration functions of the class.
|
# Then do the registration functions of the class.
|
||||||
|
@ -484,9 +484,8 @@ foreach(LINE IN LISTS SOURCE_LINES)
|
||||||
string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.DefSQStaticMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\",${SPACES}${ARGC}, \"${TYPES}\");")
|
string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.DefSQStaticMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\",${SPACES}${ARGC}, \"${TYPES}\");")
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
if(MLEN)
|
string(APPEND SQUIRREL_EXPORT "\n SQ${API_CLS}.DefSQAdvancedStaticMethod(engine, &PushClassName<${CLS}, ScriptType::${APIUC}>, \"_typeof\");")
|
||||||
string(APPEND SQUIRREL_EXPORT "\n")
|
string(APPEND SQUIRREL_EXPORT "\n")
|
||||||
endif()
|
|
||||||
|
|
||||||
# Non-static methods
|
# Non-static methods
|
||||||
set(MLEN 0)
|
set(MLEN 0)
|
||||||
|
|
|
@ -27,10 +27,7 @@ static bool CheckAPIVersion(const std::string &api_version)
|
||||||
return std::ranges::find(AIInfo::ApiVersions, api_version) != std::end(AIInfo::ApiVersions);
|
return std::ranges::find(AIInfo::ApiVersions, api_version) != std::end(AIInfo::ApiVersions);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_WIN32)
|
template <> SQInteger PushClassName<AIInfo, ScriptType::AI>(HSQUIRRELVM vm) { sq_pushstring(vm, "AIInfo", -1); return 1; }
|
||||||
#undef GetClassName
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
template <> const char *GetClassName<AIInfo, ScriptType::AI>() { return "AIInfo"; }
|
|
||||||
|
|
||||||
/* static */ void AIInfo::RegisterAPI(Squirrel *engine)
|
/* static */ void AIInfo::RegisterAPI(Squirrel *engine)
|
||||||
{
|
{
|
||||||
|
@ -38,6 +35,7 @@ template <> const char *GetClassName<AIInfo, ScriptType::AI>() { return "AIInfo"
|
||||||
DefSQClass<AIInfo, ScriptType::AI> SQAIInfo("AIInfo");
|
DefSQClass<AIInfo, ScriptType::AI> SQAIInfo("AIInfo");
|
||||||
SQAIInfo.PreRegister(engine);
|
SQAIInfo.PreRegister(engine);
|
||||||
SQAIInfo.AddConstructor<void (AIInfo::*)(), 1>(engine, "x");
|
SQAIInfo.AddConstructor<void (AIInfo::*)(), 1>(engine, "x");
|
||||||
|
SQAIInfo.DefSQAdvancedStaticMethod(engine, &PushClassName<AIInfo, ScriptType::AI>, "_typeof");
|
||||||
SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddSetting, "AddSetting");
|
SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddSetting, "AddSetting");
|
||||||
SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddLabels, "AddLabels");
|
SQAIInfo.DefSQAdvancedMethod(engine, &AIInfo::AddLabels, "AddLabels");
|
||||||
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE");
|
SQAIInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE");
|
||||||
|
|
|
@ -25,10 +25,7 @@ static bool CheckAPIVersion(const std::string &api_version)
|
||||||
return std::ranges::find(GameInfo::ApiVersions, api_version) != std::end(GameInfo::ApiVersions);
|
return std::ranges::find(GameInfo::ApiVersions, api_version) != std::end(GameInfo::ApiVersions);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_WIN32)
|
template <> SQInteger PushClassName<GameInfo, ScriptType::GS>(HSQUIRRELVM vm) { sq_pushstring(vm, "GSInfo", -1); return 1; }
|
||||||
#undef GetClassName
|
|
||||||
#endif /* _WIN32 */
|
|
||||||
template <> const char *GetClassName<GameInfo, ScriptType::GS>() { return "GSInfo"; }
|
|
||||||
|
|
||||||
/* static */ void GameInfo::RegisterAPI(Squirrel *engine)
|
/* static */ void GameInfo::RegisterAPI(Squirrel *engine)
|
||||||
{
|
{
|
||||||
|
@ -36,6 +33,7 @@ template <> const char *GetClassName<GameInfo, ScriptType::GS>() { return "GSInf
|
||||||
DefSQClass<GameInfo, ScriptType::GS> SQGSInfo("GSInfo");
|
DefSQClass<GameInfo, ScriptType::GS> SQGSInfo("GSInfo");
|
||||||
SQGSInfo.PreRegister(engine);
|
SQGSInfo.PreRegister(engine);
|
||||||
SQGSInfo.AddConstructor<void (GameInfo::*)(), 1>(engine, "x");
|
SQGSInfo.AddConstructor<void (GameInfo::*)(), 1>(engine, "x");
|
||||||
|
SQGSInfo.DefSQAdvancedStaticMethod(engine, &PushClassName<GameInfo, ScriptType::GS>, "_typeof");
|
||||||
SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddSetting, "AddSetting");
|
SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddSetting, "AddSetting");
|
||||||
SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddLabels, "AddLabels");
|
SQGSInfo.DefSQAdvancedMethod(engine, &GameInfo::AddLabels, "AddLabels");
|
||||||
SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE");
|
SQGSInfo.DefSQConst(engine, SCRIPTCONFIG_NONE, "CONFIG_NONE");
|
||||||
|
|
|
@ -7,13 +7,15 @@
|
||||||
|
|
||||||
#include "../script_controller.hpp"
|
#include "../script_controller.hpp"
|
||||||
|
|
||||||
template <> const char *GetClassName<ScriptController, ScriptType::AI>() { return "AIController"; }
|
template <> SQInteger PushClassName<ScriptController, ScriptType::AI>(HSQUIRRELVM vm) { sq_pushstring(vm, "AIController", -1); return 1; }
|
||||||
|
|
||||||
void SQAIController_Register(Squirrel *engine)
|
void SQAIController_Register(Squirrel *engine)
|
||||||
{
|
{
|
||||||
DefSQClass<ScriptController, ScriptType::AI> SQAIController("AIController");
|
DefSQClass<ScriptController, ScriptType::AI> SQAIController("AIController");
|
||||||
SQAIController.PreRegister(engine);
|
SQAIController.PreRegister(engine);
|
||||||
|
|
||||||
|
SQAIController.DefSQAdvancedStaticMethod(engine, &PushClassName<ScriptController, ScriptType::AI>, "_typeof");
|
||||||
|
|
||||||
SQAIController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, ".");
|
SQAIController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, ".");
|
||||||
SQAIController.DefSQStaticMethod(engine, &ScriptController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, ".");
|
SQAIController.DefSQStaticMethod(engine, &ScriptController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, ".");
|
||||||
SQAIController.DefSQStaticMethod(engine, &ScriptController::SetCommandDelay, "SetCommandDelay", 2, ".i");
|
SQAIController.DefSQStaticMethod(engine, &ScriptController::SetCommandDelay, "SetCommandDelay", 2, ".i");
|
||||||
|
|
|
@ -7,13 +7,15 @@
|
||||||
|
|
||||||
#include "../script_controller.hpp"
|
#include "../script_controller.hpp"
|
||||||
|
|
||||||
template <> const char *GetClassName<ScriptController, ScriptType::GS>() { return "GSController"; }
|
template <> SQInteger PushClassName<ScriptController, ScriptType::GS>(HSQUIRRELVM vm) { sq_pushstring(vm, "GSController", -1); return 1; }
|
||||||
|
|
||||||
void SQGSController_Register(Squirrel *engine)
|
void SQGSController_Register(Squirrel *engine)
|
||||||
{
|
{
|
||||||
DefSQClass<ScriptController, ScriptType::GS> SQGSController("GSController");
|
DefSQClass<ScriptController, ScriptType::GS> SQGSController("GSController");
|
||||||
SQGSController.PreRegister(engine);
|
SQGSController.PreRegister(engine);
|
||||||
|
|
||||||
|
SQGSController.DefSQAdvancedStaticMethod(engine, &PushClassName<ScriptController, ScriptType::GS>, "_typeof");
|
||||||
|
|
||||||
SQGSController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, ".");
|
SQGSController.DefSQStaticMethod(engine, &ScriptController::GetTick, "GetTick", 1, ".");
|
||||||
SQGSController.DefSQStaticMethod(engine, &ScriptController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, ".");
|
SQGSController.DefSQStaticMethod(engine, &ScriptController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, ".");
|
||||||
SQGSController.DefSQStaticMethod(engine, &ScriptController::SetCommandDelay, "SetCommandDelay", 2, ".i");
|
SQGSController.DefSQStaticMethod(engine, &ScriptController::SetCommandDelay, "SetCommandDelay", 2, ".i");
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include "../core/convertible_through_base.hpp"
|
#include "../core/convertible_through_base.hpp"
|
||||||
#include "squirrel_helper_type.hpp"
|
#include "squirrel_helper_type.hpp"
|
||||||
|
|
||||||
template <class CL, ScriptType ST> const char *GetClassName();
|
template <class CL, ScriptType ST> SQInteger PushClassName(HSQUIRRELVM);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Squirrel convert routines
|
* The Squirrel convert routines
|
||||||
|
@ -240,8 +240,7 @@ namespace SQConvert {
|
||||||
|
|
||||||
/* Protect against calls to a non-static method in a static way */
|
/* Protect against calls to a non-static method in a static way */
|
||||||
sq_pushroottable(vm);
|
sq_pushroottable(vm);
|
||||||
const char *className = GetClassName<Tcls, Ttype>();
|
PushClassName<Tcls, Ttype>(vm);
|
||||||
sq_pushstring(vm, className, -1);
|
|
||||||
sq_get(vm, -2);
|
sq_get(vm, -2);
|
||||||
sq_pushobject(vm, instance);
|
sq_pushobject(vm, instance);
|
||||||
if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, "class method is non-static");
|
if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, "class method is non-static");
|
||||||
|
@ -284,8 +283,7 @@ namespace SQConvert {
|
||||||
|
|
||||||
/* Protect against calls to a non-static method in a static way */
|
/* Protect against calls to a non-static method in a static way */
|
||||||
sq_pushroottable(vm);
|
sq_pushroottable(vm);
|
||||||
const char *className = GetClassName<Tcls, Ttype>();
|
PushClassName<Tcls, Ttype>(vm);
|
||||||
sq_pushstring(vm, className, -1);
|
|
||||||
sq_get(vm, -2);
|
sq_get(vm, -2);
|
||||||
sq_pushobject(vm, instance);
|
sq_pushobject(vm, instance);
|
||||||
if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, "class method is non-static");
|
if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, "class method is non-static");
|
||||||
|
|
Loading…
Reference in New Issue