diff options
author | Aaron Marks <nymacro@gmail.com> | 2005-05-09 09:47:20 +0000 |
---|---|---|
committer | Aaron Marks <nymacro@gmail.com> | 2005-05-09 09:47:20 +0000 |
commit | ef30b72e8ad5379a7c7ee49b0ff680bde15daa66 (patch) | |
tree | 1fbe0f0ce2125bad89e548b1f2a1d392ee751205 /src/script-squirrel.cpp | |
parent | b6f88ad42d2acf514804777e9cf0f4979566c163 (diff) | |
download | manaserv-ef30b72e8ad5379a7c7ee49b0ff680bde15daa66.tar.gz manaserv-ef30b72e8ad5379a7c7ee49b0ff680bde15daa66.tar.bz2 manaserv-ef30b72e8ad5379a7c7ee49b0ff680bde15daa66.tar.xz manaserv-ef30b72e8ad5379a7c7ee49b0ff680bde15daa66.zip |
Renamed script-sq.* script-squirrel.*.
Renamed ScriptingInterface to Script (to save typing :)).
Updated skill tree definition.
Diffstat (limited to 'src/script-squirrel.cpp')
-rw-r--r-- | src/script-squirrel.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/script-squirrel.cpp b/src/script-squirrel.cpp new file mode 100644 index 00000000..d8001de4 --- /dev/null +++ b/src/script-squirrel.cpp @@ -0,0 +1,108 @@ +#include "script-squirrel.h" +#include <cstring> + +/* + * printfunc - Print function for Squirrel + */ +void printfunc(HSQUIRRELVM v, const SQChar *s, ...) +{ + va_list arglist; + va_start(arglist, s); + vprintf(s, arglist); + va_end(arglist); +} + +/* + * functionCall - Call function with arguments + * fn - name of function + * args - string with argument types. + * 's' = String + * 'i' = Integer + * 'f' = Float + */ +void functionCall(HSQUIRRELVM v, char *fn, char *args, ...) +{ + int argCount = 0; + va_list arglist; + va_start(arglist, args); + + int top = sq_gettop(v); //save stack + sq_pushroottable(v); //pushes global table + sq_pushstring(v, _SC(fn), -1); + if (SQ_SUCCEEDED(sq_get(v, -2))) + { + sq_pushroottable(v); //push 'this' + + if (args != NULL) + { + for (int i = 0; i < strlen(args); i++) + { + switch (args[i]) + { + case 'S': + case 's': + //string + argCount++; + sq_pushstring(v, va_arg(arglist, char*), -1); + break; + case 'I': + case 'i': + //integer + argCount++; + sq_pushinteger(v, va_arg(arglist, int)); + break; + case 'F': + case 'f': + //float + argCount++; + sq_pushfloat(v, va_arg(arglist, float)); + break; + } + } + } + + sq_call(v, argCount + 1, 0); + } + sq_settop(v, top); + + va_end(arglist); +} + +ScriptSquirrel::ScriptSquirrel(const std::string &file) : + Script(file) +{ +} + +ScriptSquirrel::~ScriptSquirrel() +{ + sq_pop(vm, 1); + sq_close(vm); +} + +void ScriptSquirrel::init() +{ + vm = sq_open(2048); + sqstd_seterrorhandlers(vm); + sq_setprintfunc(vm, printfunc); + + sq_pushroottable(vm); + sqstd_dofile(vm, _SC(scriptName.c_str()), 0, 1); + if (SQ_SUCCEEDED(sqstd_dofile(vm, _SC("test.nut"), 0, 1))) + functionCall(vm, "init", NULL); +} + +void ScriptSquirrel::destroy() +{ + functionCall(vm, "destroy", NULL); +} + +void ScriptSquirrel::update() +{ + functionCall(vm, "update", NULL); +} + +void ScriptSquirrel::message(char *msg) +{ + functionCall(vm, "message", "s", msg); +} + |