summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/3rdparty/squirrel/include/squirrel.h1
-rw-r--r--src/3rdparty/squirrel/squirrel/sqapi.cpp5
-rw-r--r--src/ai/ai_instance.hpp1
-rw-r--r--src/ai/api/ai_object.cpp8
-rw-r--r--src/script/squirrel.cpp5
-rw-r--r--src/script/squirrel.hpp5
6 files changed, 24 insertions, 1 deletions
diff --git a/src/3rdparty/squirrel/include/squirrel.h b/src/3rdparty/squirrel/include/squirrel.h
index e611d0853..5623760fa 100644
--- a/src/3rdparty/squirrel/include/squirrel.h
+++ b/src/3rdparty/squirrel/include/squirrel.h
@@ -275,6 +275,7 @@ typedef struct tagSQRegFunction{
}SQRegFunction;
/*vm*/
+SQUIRREL_API bool sq_can_suspend(HSQUIRRELVM v);
SQUIRREL_API HSQUIRRELVM sq_open(SQInteger initialstacksize);
SQUIRREL_API HSQUIRRELVM sq_newthread(HSQUIRRELVM friendvm, SQInteger initialstacksize);
SQUIRREL_API void sq_seterrorhandler(HSQUIRRELVM v);
diff --git a/src/3rdparty/squirrel/squirrel/sqapi.cpp b/src/3rdparty/squirrel/squirrel/sqapi.cpp
index 10b3469f4..82527f4a7 100644
--- a/src/3rdparty/squirrel/squirrel/sqapi.cpp
+++ b/src/3rdparty/squirrel/squirrel/sqapi.cpp
@@ -90,6 +90,11 @@ SQInteger sq_getvmstate(HSQUIRRELVM v)
}
}
+bool sq_can_suspend(HSQUIRRELVM v)
+{
+ return v->_can_suspend;
+}
+
void sq_seterrorhandler(HSQUIRRELVM v)
{
SQObject o = stack_get(v, -1);
diff --git a/src/ai/ai_instance.hpp b/src/ai/ai_instance.hpp
index bf501dc23..3ae3aa152 100644
--- a/src/ai/ai_instance.hpp
+++ b/src/ai/ai_instance.hpp
@@ -30,6 +30,7 @@ private:
class AIInstance {
public:
+ friend class AIObject;
AIInstance(class AIInfo *info);
~AIInstance();
diff --git a/src/ai/api/ai_object.cpp b/src/ai/api/ai_object.cpp
index 7e531ac47..bb17e58f8 100644
--- a/src/ai/api/ai_object.cpp
+++ b/src/ai/api/ai_object.cpp
@@ -2,6 +2,11 @@
/** @file ai_object.cpp Implementation of AIObject. */
+#include "../../stdafx.h"
+#include <squirrel.h>
+#include "../../script/squirrel.hpp"
+#include "../../company_base.h"
+
#include "ai_log.hpp"
#include "table/strings.h"
#include "../ai.hpp"
@@ -158,7 +163,8 @@ void AIObject::SetAllowDoCommand(bool allow)
bool AIObject::GetAllowDoCommand()
{
- return GetStorage()->allow_do_command;
+ Squirrel *squirrel = Company::Get(_current_company)->ai_instance->engine;
+ return GetStorage()->allow_do_command && squirrel->CanSuspend();
}
void *&AIObject::GetEventPointer()
diff --git a/src/script/squirrel.cpp b/src/script/squirrel.cpp
index 6737fd3ef..6955d2d24 100644
--- a/src/script/squirrel.cpp
+++ b/src/script/squirrel.cpp
@@ -508,3 +508,8 @@ void Squirrel::ResetCrashed()
{
this->crashed = false;
}
+
+bool Squirrel::CanSuspend()
+{
+ return sq_can_suspend(this->vm);
+}
diff --git a/src/script/squirrel.hpp b/src/script/squirrel.hpp
index ee597f87a..b878c2b95 100644
--- a/src/script/squirrel.hpp
+++ b/src/script/squirrel.hpp
@@ -213,6 +213,11 @@ public:
* Reset the crashed status.
*/
void ResetCrashed();
+
+ /**
+ * Are we allowed to suspend the squirrel script at this moment?
+ */
+ bool CanSuspend();
};
#endif /* SQUIRREL_HPP */