(svn r23651) -Feature: [NoGo] GSText now accepts string arguments as parameters to the constructor

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
yexo 13 years ago
parent a55478aaa6
commit 5988659eea

@ -19,7 +19,7 @@ void SQAIText_Register(Squirrel *engine)
{
DefSQClass<ScriptText, ST_AI> SQAIText("AIText");
SQAIText.PreRegister(engine);
SQAIText.AddConstructor<void (ScriptText::*)(StringID string), 2>(engine, "xi");
SQAIText.AddSQAdvancedConstructor(engine);
SQAIText.DefSQConst(engine, ScriptText::SCRIPT_TEXT_MAX_PARAMETERS, "SCRIPT_TEXT_MAX_PARAMETERS");

@ -19,7 +19,7 @@ void SQGSText_Register(Squirrel *engine)
{
DefSQClass<ScriptText, ST_GS> SQGSText("GSText");
SQGSText.PreRegister(engine);
SQGSText.AddConstructor<void (ScriptText::*)(StringID string), 2>(engine, "xi");
SQGSText.AddSQAdvancedConstructor(engine);
SQGSText.DefSQConst(engine, ScriptText::SCRIPT_TEXT_MAX_PARAMETERS, "SCRIPT_TEXT_MAX_PARAMETERS");

@ -15,10 +15,34 @@
#include "../squirrel.hpp"
#include "../../table/control_codes.h"
ScriptText::ScriptText(StringID string) :
ZeroedMemoryAllocator(),
string(string)
ScriptText::ScriptText(HSQUIRRELVM vm) :
ZeroedMemoryAllocator()
{
int nparam = sq_gettop(vm) - 1;
if (nparam < 1) {
throw sq_throwerror(vm, _SC("You need to pass at least a StringID to the constructor"));
}
/* First resolve the StringID. */
SQInteger sqstring;
if (SQ_FAILED(sq_getinteger(vm, 2, &sqstring))) {
throw sq_throwerror(vm, _SC("First argument must be a valid StringID"));
}
this->string = sqstring;
/* The rest of the parameters must be arguments. */
for (int i = 0; i < nparam - 1; i++) {
/* Push the parameter to the top of the stack. */
sq_push(vm, i + 3);
if (SQ_FAILED(this->_SetParam(i, vm))) {
this->~ScriptText();
throw sq_throwerror(vm, _SC("Invalid parameter"));
}
/* Pop the parameter again. */
sq_pop(vm, 1);
}
}
ScriptText::~ScriptText()

@ -59,8 +59,11 @@ private:
*
* If you use parameters in your strings, you will have to define those
* parameters, for example like this:
* local text = ScriptText(ScriptText.STR_NEWS); text.AddParam(1);
* This will set the {COMPANY} to the name of Company 1.
* \code local text = ScriptText(ScriptText.STR_NEWS);
* text.AddParam(1); \endcode
* This will set the {COMPANY} to the name of Company 1. Alternatively you
* can directly give those arguments to the ScriptText constructor, like this:
* \code local text = ScriptText(ScriptText.STR_NEWS, 1); \endcode
*
* @api ai game
*/
@ -68,12 +71,20 @@ class ScriptText : public Text , public ZeroedMemoryAllocator {
public:
static const int SCRIPT_TEXT_MAX_PARAMETERS = 20; ///< The maximum amount of parameters you can give to one object.
#ifndef DOXYGEN_API
/**
* The constructor wrapper from Squirrel.
*/
ScriptText(HSQUIRRELVM vm);
#else
/**
* Generate a text from string. You can set parameters to the instance which
* can be required for the string.
* @param string The string of the text.
* @param ... Optional arguments for this string.
*/
ScriptText(StringID string);
ScriptText(StringID string, ...);
#endif
~ScriptText();
#ifndef DOXYGEN_API

@ -341,7 +341,11 @@ BEGIN {
print " SQ" api_cls ".PreRegister(engine, \"" api_super_cls "\");"
}
if (virtual_class == "false" && super_cls != "ScriptEvent") {
print " SQ" api_cls ".AddConstructor<void (" cls "::*)(" cls_param[0] "), " cls_param[1]">(engine, \"" cls_param[2] "\");"
if (cls_param[2] == "v") {
print " SQ" api_cls ".AddSQAdvancedConstructor(engine);"
} else {
print " SQ" api_cls ".AddConstructor<void (" cls "::*)(" cls_param[0] "), " cls_param[1]">(engine, \"" cls_param[2] "\");"
}
}
print ""

@ -117,6 +117,12 @@ public:
engine->AddMethod("constructor", DefSQConstructorCallback<CL, Func, Tnparam>, Tnparam, params);
}
void AddSQAdvancedConstructor(Squirrel *engine)
{
using namespace SQConvert;
engine->AddMethod("constructor", DefSQAdvancedConstructorCallback<CL>, 0, NULL);
}
void PostRegister(Squirrel *engine)
{
engine->AddClassEnd();

@ -885,6 +885,28 @@ namespace SQConvert {
}
}
/**
* A general template to handle creating of an instance with a complex
* constructor.
*/
template <typename Tcls>
inline SQInteger DefSQAdvancedConstructorCallback(HSQUIRRELVM vm)
{
try {
/* Find the amount of params we got */
int nparam = sq_gettop(vm);
/* Create the real instance */
Tcls *instance = new Tcls(vm);
sq_setinstanceup(vm, -nparam, instance);
sq_setreleasehook(vm, -nparam, DefSQDestructorCallback<Tcls>);
instance->AddRef();
return 0;
} catch (SQInteger e) {
return e;
}
}
} // namespace SQConvert
#endif /* SQUIRREL_HELPER_HPP */

Loading…
Cancel
Save