(svn r22120) -Change: [NoAI] Prevent AIs from getting consistently over their allowed amount of operations by subtracting the amount they went over "budget" from the budget for the next "tick".

This commit is contained in:
rubidium 2011-02-20 20:28:49 +00:00
parent 7d24d642d9
commit e9fe58d7bf
2 changed files with 14 additions and 0 deletions

View File

@ -188,7 +188,19 @@ bool Squirrel::MethodExists(HSQOBJECT instance, const char *method_name)
bool Squirrel::Resume(int suspend)
{
assert(!this->crashed);
/* Did we use more operations than we should have in the
* previous tick? If so, subtract that from the current run. */
if (this->overdrawn_ops > 0 && suspend > 0) {
this->overdrawn_ops -= suspend;
/* Do we need to wait even more? */
if (this->overdrawn_ops >= 0) return true;
/* We can now only run whatever is "left". */
suspend = -this->overdrawn_ops;
}
this->crashed = !sq_resumecatch(this->vm, suspend);
this->overdrawn_ops = -this->vm->_ops_till_suspend;
return this->vm->_suspended != 0;
}
@ -310,6 +322,7 @@ Squirrel::Squirrel()
this->print_func = NULL;
this->global_pointer = NULL;
this->crashed = false;
this->overdrawn_ops = 0;
/* Handle compile-errors ourself, so we can display it nicely */
sq_setcompilererrorhandler(this->vm, &Squirrel::CompileError);

View File

@ -22,6 +22,7 @@ private:
void *global_pointer; ///< Can be set by who ever initializes Squirrel
SQPrintFunc *print_func; ///< Points to either NULL, or a custom print handler
bool crashed; ///< True if the squirrel script made an error.
int overdrawn_ops; ///< The amount of operations we have overdrawn.
/**
* The internal RunError handler. It looks up the real error and calls RunError with it.