summaryrefslogtreecommitdiff
path: root/src/script-squirrel.cpp
diff options
context:
space:
mode:
authorAaron Marks <nymacro@gmail.com>2005-05-09 09:47:20 +0000
committerAaron Marks <nymacro@gmail.com>2005-05-09 09:47:20 +0000
commitef30b72e8ad5379a7c7ee49b0ff680bde15daa66 (patch)
tree1fbe0f0ce2125bad89e548b1f2a1d392ee751205 /src/script-squirrel.cpp
parentb6f88ad42d2acf514804777e9cf0f4979566c163 (diff)
downloadmanaserv-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.cpp108
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);
+}
+