mirror of https://github.com/OpenTTD/OpenTTD
(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".
parent
7d24d642d9
commit
e9fe58d7bf
|
@ -188,7 +188,19 @@ bool Squirrel::MethodExists(HSQOBJECT instance, const char *method_name)
|
||||||
bool Squirrel::Resume(int suspend)
|
bool Squirrel::Resume(int suspend)
|
||||||
{
|
{
|
||||||
assert(!this->crashed);
|
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->crashed = !sq_resumecatch(this->vm, suspend);
|
||||||
|
this->overdrawn_ops = -this->vm->_ops_till_suspend;
|
||||||
return this->vm->_suspended != 0;
|
return this->vm->_suspended != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -310,6 +322,7 @@ Squirrel::Squirrel()
|
||||||
this->print_func = NULL;
|
this->print_func = NULL;
|
||||||
this->global_pointer = NULL;
|
this->global_pointer = NULL;
|
||||||
this->crashed = false;
|
this->crashed = false;
|
||||||
|
this->overdrawn_ops = 0;
|
||||||
|
|
||||||
/* Handle compile-errors ourself, so we can display it nicely */
|
/* Handle compile-errors ourself, so we can display it nicely */
|
||||||
sq_setcompilererrorhandler(this->vm, &Squirrel::CompileError);
|
sq_setcompilererrorhandler(this->vm, &Squirrel::CompileError);
|
||||||
|
|
|
@ -22,6 +22,7 @@ private:
|
||||||
void *global_pointer; ///< Can be set by who ever initializes Squirrel
|
void *global_pointer; ///< Can be set by who ever initializes Squirrel
|
||||||
SQPrintFunc *print_func; ///< Points to either NULL, or a custom print handler
|
SQPrintFunc *print_func; ///< Points to either NULL, or a custom print handler
|
||||||
bool crashed; ///< True if the squirrel script made an error.
|
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.
|
* The internal RunError handler. It looks up the real error and calls RunError with it.
|
||||||
|
|
Loading…
Reference in New Issue