summaryrefslogtreecommitdiff
path: root/src/ai/ai_instance.cpp
diff options
context:
space:
mode:
authortruebrain <truebrain@openttd.org>2011-11-13 20:43:48 +0000
committertruebrain <truebrain@openttd.org>2011-11-13 20:43:48 +0000
commitb7a655bf4cafc68e14cade593e8b1aca7f04f7dd (patch)
tree1880bbb64896193511e72c23c9387af2bb19acae /src/ai/ai_instance.cpp
parent407514a590dc06c8b80c5304b5e9227c8c844f91 (diff)
downloadopenttd-b7a655bf4cafc68e14cade593e8b1aca7f04f7dd.tar.xz
(svn r23209) -Codechange: track the current active script instance directly, instead of assuming the current company points you to the right one.
Diffstat (limited to 'src/ai/ai_instance.cpp')
-rw-r--r--src/ai/ai_instance.cpp57
1 files changed, 47 insertions, 10 deletions
diff --git a/src/ai/ai_instance.cpp b/src/ai/ai_instance.cpp
index dbc8970b1..2333ddd2e 100644
--- a/src/ai/ai_instance.cpp
+++ b/src/ai/ai_instance.cpp
@@ -100,7 +100,7 @@ static void PrintFunc(bool error_msg, const SQChar *message)
AIController::Print(error_msg, SQ2OTTD(message));
}
-AIInstance::AIInstance(AIInfo *info) :
+AIInstance::AIInstance() :
controller(NULL),
storage(NULL),
engine(NULL),
@@ -111,13 +111,16 @@ AIInstance::AIInstance(AIInfo *info) :
suspend(0),
callback(NULL)
{
- /* Set the instance already, so we can use AIObject::Set commands */
- Company::Get(_current_company)->ai_instance = this;
+ this->storage = new AIStorage();
+ this->engine = new Squirrel();
+ this->engine->SetPrintFunction(&PrintFunc);
+}
+
+void AIInstance::Initialize(AIInfo *info)
+{
+ AIObject::ActiveInstance active(this);
this->controller = new AIController();
- this->storage = new AIStorage();
- this->engine = new Squirrel();
- this->engine->SetPrintFunction(&PrintFunc);
/* The import method is available at a very early stage */
this->engine->AddMethod("import", &AILibrary::Import, 4, ".ssi");
@@ -163,6 +166,8 @@ AIInstance::AIInstance(AIInfo *info) :
AIInstance::~AIInstance()
{
+ AIObject::ActiveInstance active(this);
+
if (instance != NULL) this->engine->ReleaseObject(this->instance);
if (engine != NULL) delete this->engine;
delete this->storage;
@@ -316,6 +321,8 @@ void AIInstance::Died()
void AIInstance::GameLoop()
{
+ AIObject::ActiveInstance active(this);
+
if (this->IsDead()) return;
if (this->engine->HasScriptCrashed()) {
/* The script crashed during saving, kill it here. */
@@ -423,10 +430,16 @@ void AIInstance::CollectGarbage() const
instance->engine->InsertResult(AIObject::GetNewGroupID());
}
-/* static */ AIStorage *AIInstance::GetStorage()
+AIStorage *AIInstance::GetStorage()
{
- assert(Company::IsValidAiID(_current_company));
- return Company::Get(_current_company)->ai_instance->storage;
+ return this->storage;
+}
+
+void *AIInstance::GetLogPointer()
+{
+ AIObject::ActiveInstance active(this);
+
+ return AIObject::GetLogPointer();
}
/*
@@ -598,6 +611,8 @@ static const uint AISAVE_MAX_DEPTH = 25; ///< The maximum recursive depth for it
void AIInstance::Save()
{
+ AIObject::ActiveInstance active(this);
+
/* Don't save data if the AI didn't start yet or if it crashed. */
if (this->engine == NULL || this->engine->HasScriptCrashed()) {
SaveEmpty();
@@ -662,7 +677,6 @@ void AIInstance::Save()
_ai_sl_byte = 0;
SlObject(NULL, _ai_byte);
}
-
}
void AIInstance::Suspend()
@@ -739,6 +753,8 @@ void AIInstance::Suspend()
void AIInstance::Load(int version)
{
+ AIObject::ActiveInstance active(this);
+
if (this->engine == NULL || version == -1) {
LoadEmpty();
return;
@@ -795,3 +811,24 @@ SQInteger AIInstance::GetOpsTillSuspend()
{
return this->engine->GetOpsTillSuspend();
}
+
+void AIInstance::DoCommandCallback(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
+{
+ AIObject::ActiveInstance active(this);
+
+ AIObject::SetLastCommandRes(result.Succeeded());
+
+ if (result.Failed()) {
+ AIObject::SetLastError(AIError::StringToError(result.GetErrorMessage()));
+ } else {
+ AIObject::IncreaseDoCommandCosts(result.GetCost());
+ AIObject::SetLastCost(result.GetCost());
+ }
+}
+
+void AIInstance::InsertEvent(class AIEvent *event)
+{
+ AIObject::ActiveInstance active(this);
+
+ AIEventController::InsertEvent(event);
+}