summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-02-08 01:51:48 +0000
committerrubidium <rubidium@openttd.org>2009-02-08 01:51:48 +0000
commite1b1fd18b538e7cbe9b8c5b757b683c4a79f4637 (patch)
tree90b4e755d074b6d4d949c4938eb3d5177c238609
parent8bd5f10a2c833b51380ef3f0326071b1de3a8f0d (diff)
downloadopenttd-e1b1fd18b538e7cbe9b8c5b757b683c4a79f4637.tar.xz
(svn r15406) -Fix: make Valuate actually cost a few opcodes to not make it a single opcode method of doing lots of the same thing. This should resolve most of the hiccups caused by AIs.
-rw-r--r--src/ai/api/ai_abstractlist.cpp3
-rw-r--r--src/script/squirrel.cpp5
-rw-r--r--src/script/squirrel.hpp5
3 files changed, 13 insertions, 0 deletions
diff --git a/src/ai/api/ai_abstractlist.cpp b/src/ai/api/ai_abstractlist.cpp
index 9357f39c5..5fa0a1b23 100644
--- a/src/ai/api/ai_abstractlist.cpp
+++ b/src/ai/api/ai_abstractlist.cpp
@@ -6,6 +6,7 @@
#include "ai_abstractlist.hpp"
#include "../../debug.h"
#include "../../core/alloc_func.hpp"
+#include "../../script/squirrel.hpp"
/**
* Base class for any AIAbstractList sorter.
@@ -818,6 +819,8 @@ SQInteger AIAbstractList::Valuate(HSQUIRRELVM vm) {
(*iter).second = (int32)value;
this->buckets[(int32)value].insert((*iter).first);
+
+ Squirrel::DecreaseOps(vm, 5);
}
sq_release(vm, &obj_func);
diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp
index 1400eaf0a..602cc593d 100644
--- a/src/script/squirrel.cpp
+++ b/src/script/squirrel.cpp
@@ -454,3 +454,8 @@ void Squirrel::InsertResult(int result)
vm->GetAt(vm->_stackbase + vm->_suspended_target) = vm->GetUp(-1);
vm->Pop();
}
+
+/* static */ void Squirrel::DecreaseOps(HSQUIRRELVM vm, int ops)
+{
+ vm->DecreaseOps(ops);
+}
diff --git a/src/script/squirrel.hpp b/src/script/squirrel.hpp
index fc7472e96..b5b352bd0 100644
--- a/src/script/squirrel.hpp
+++ b/src/script/squirrel.hpp
@@ -186,6 +186,11 @@ public:
* Release a SQ object.
*/
void ReleaseObject(HSQOBJECT *ptr) { sq_release(this->vm, ptr); }
+
+ /**
+ * Tell the VM to remove \c amount ops from the number of ops till suspend.
+ */
+ static void DecreaseOps(HSQUIRRELVM vm, int amount);
};
#endif /* SQUIRREL_HPP */