src/ai/squirrel/squirrel.cpp
author truelight
Tue, 13 Mar 2007 23:01:21 +0000
branchnoai
changeset 9368 55bdc4215a68
parent 9367 f8f43e231acf
child 9373 d03563181088
permissions -rw-r--r--
(svn r9155) [NoAI] -Fix: forgot a line of comments
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
}