author | truelight |
Tue, 13 Mar 2007 23:01:21 +0000 | |
branch | noai |
changeset 9368 | 55bdc4215a68 |
parent 9367 | f8f43e231acf |
child 9373 | d03563181088 |
permissions | -rw-r--r-- |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
1 |
/* $Id$ */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
2 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
3 |
/** @file squirrel.cpp allows loading squirrel scripts to control an AI */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
4 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
5 |
#include "squirrel.hpp" |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
6 |
#include <sqstdio.h> |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
7 |
#include <sqstdaux.h> |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
8 |
#include <stdarg.h> |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
9 |
#include "../../debug.h" |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
10 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
11 |
/** |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
12 |
* Here we handle errors that come from squirrel. |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
13 |
*/ |
9367
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
14 |
static void Squirrel_CompileError(HSQUIRRELVM vm, const SQChar *desc, const SQChar *source, SQInteger line, SQInteger column) |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
15 |
{ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
16 |
#ifdef _SQ64 |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
17 |
printf("Error %s:%ld/%ld: %s\n", source, line, column, desc); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
18 |
#else |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
19 |
printf("Error %s:%d/%d: %s\n", source, line, column, desc); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
20 |
#endif |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
21 |
} |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
22 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
23 |
/** |
9367
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
24 |
* Here we handle run-time errors that come from squirrel. |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
25 |
*/ |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
26 |
static SQInteger Squirrel_RunError(HSQUIRRELVM vm) |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
27 |
{ |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
28 |
const SQChar *sErr = 0; |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
29 |
|
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
30 |
if (sq_gettop(vm) >= 1) { |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
31 |
if (SQ_SUCCEEDED(sq_getstring(vm, -1, &sErr))) { |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
32 |
printf("%s\n", sErr); |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
33 |
} else { |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
34 |
printf("Unknown error\n"); |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
35 |
} |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
36 |
} |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
37 |
|
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
38 |
return 0; |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
39 |
} |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
40 |
|
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
41 |
/** |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
42 |
* Here we handle 'print' command within squirrel script. |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
43 |
*/ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
44 |
static void Squirrel_PrintFunc(HSQUIRRELVM vm, const SQChar *s, ...) |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
45 |
{ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
46 |
va_list arglist; |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
47 |
va_start(arglist, s); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
48 |
vprintf(s, arglist); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
49 |
va_end(arglist); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
50 |
printf("\n"); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
51 |
} |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
52 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
53 |
Squirrel::Squirrel(const char *script_dir) |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
54 |
{ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
55 |
char filename[1024]; |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
56 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
57 |
this->vm = sq_open(1024); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
58 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
59 |
/* Handle compile-errors ourself, so we can display it nicely */ |
9367
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
60 |
sq_setcompilererrorhandler(this->vm, Squirrel_CompileError); |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
61 |
sq_notifyallexceptions(this->vm, SQTrue); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
62 |
/* Set a good print-function */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
63 |
sq_setprintfunc(this->vm, Squirrel_PrintFunc); |
9368
55bdc4215a68
(svn r9155) [NoAI] -Fix: forgot a line of comments
truelight
parents:
9367
diff
changeset
|
64 |
/* Handle runtime-errors ourself, so we can display it nicely */ |
9367
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
65 |
sq_newclosure(this->vm, &Squirrel_RunError, 0); |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
66 |
sq_seterrorhandler(this->vm); |
f8f43e231acf
(svn r9154) [NoAI] -Fix: print compile-time errors too
truelight
parents:
9366
diff
changeset
|
67 |
|
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
68 |
/* TODO -- This is ugly! */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
69 |
strcpy(filename, "ai/"); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
70 |
strcat(filename, script_dir); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
71 |
strcat(filename, PATHSEP); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
72 |
strcat(filename, "main.sq"); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
73 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
74 |
DEBUG(ai, 1, "[squirrel] Starting AI with script in '%s'", filename); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
75 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
76 |
/* Load and run the script */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
77 |
sq_pushroottable(this->vm); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
78 |
if (!SQ_SUCCEEDED(sqstd_dofile(this->vm, filename, SQFalse, SQTrue))) { |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
79 |
DEBUG(ai, 0, "[squirrel] Failed to compile '%s'", filename); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
80 |
return; |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
81 |
} |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
82 |
} |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
83 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
84 |
Squirrel::~Squirrel() |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
85 |
{ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
86 |
/* Clean up the stuff */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
87 |
sq_pop(this->vm, 1); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
88 |
sq_close(this->vm); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
89 |
} |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
90 |
|
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
91 |
/* virtual */ void Squirrel::GameLoop() |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
92 |
{ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
93 |
/* Store the current top */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
94 |
int top = sq_gettop(this->vm); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
95 |
/* Go back to root-table */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
96 |
sq_pushroottable(this->vm); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
97 |
/* Find the function-name inside the script */ |
9366
d30036300fe7
(svn r9153) [NoAI] -Add: added a bit more code to the script to show how classes work (and that instances stay alive)
truelight
parents:
9365
diff
changeset
|
98 |
sq_pushstring(this->vm,_SC("GameLoop"), -1); |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
99 |
if (!SQ_SUCCEEDED(sq_get(this->vm, -2))) { |
9366
d30036300fe7
(svn r9153) [NoAI] -Add: added a bit more code to the script to show how classes work (and that instances stay alive)
truelight
parents:
9365
diff
changeset
|
100 |
DEBUG(ai, 0, "[squirrel] Failed to run GameLoop"); |
9365
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
101 |
sq_settop(this->vm, top); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
102 |
return; |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
103 |
} |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
104 |
/* Call the function */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
105 |
sq_pushroottable(this->vm); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
106 |
sq_call(this->vm, 1, 0, 0); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
107 |
/* Reset the top */ |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
108 |
sq_settop(this->vm, top); |
c3d08e0b1083
(svn r9151) [NoAI] -Add: added squirrel module that loads squirrel scripts and
truelight
parents:
diff
changeset
|
109 |
} |