diff options
author | Aaron Marks <nymacro@gmail.com> | 2005-04-19 09:30:43 +0000 |
---|---|---|
committer | Aaron Marks <nymacro@gmail.com> | 2005-04-19 09:30:43 +0000 |
commit | e2ad3e13fb1163f53304bbdbab4c44f12c16731d (patch) | |
tree | 56ba9fbb5f89ad0e39d22497231cb09c044e38d0 /src/script-sq.cpp | |
parent | 3370b59fe2c9544fddebb1281505ddec3d22c0e1 (diff) | |
download | manaserv-e2ad3e13fb1163f53304bbdbab4c44f12c16731d.tar.gz manaserv-e2ad3e13fb1163f53304bbdbab4c44f12c16731d.tar.bz2 manaserv-e2ad3e13fb1163f53304bbdbab4c44f12c16731d.tar.xz manaserv-e2ad3e13fb1163f53304bbdbab4c44f12c16731d.zip |
Added basic object definition for reviewal.
Added basic scripting interface & Squirrel (squirrel.sf.net).
Diffstat (limited to 'src/script-sq.cpp')
-rw-r--r-- | src/script-sq.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/script-sq.cpp b/src/script-sq.cpp new file mode 100644 index 00000000..fc02616e --- /dev/null +++ b/src/script-sq.cpp @@ -0,0 +1,103 @@ +#include "script-sq.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() +{ + 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("test.nut"), 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); +} + |