changeset 18282:510b749ba70b draft

(svn r23118) -Feature: [NoAI] Allow AIs to query the amount of remaining operations for the current tick
author rubidium <rubidium@openttd.org>
date Fri, 04 Nov 2011 23:20:14 +0000
parents 53b4895476ee
children 0e2e0050b70a
files bin/ai/regression/regression.nut bin/ai/regression/regression.txt src/ai/ai_instance.cpp src/ai/ai_instance.hpp src/ai/api/ai_changelog.hpp src/ai/api/ai_controller.cpp src/ai/api/ai_controller.hpp src/ai/api/ai_controller.hpp.sq src/script/squirrel.cpp src/script/squirrel.hpp
diffstat 10 files changed, 52 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/bin/ai/regression/regression.nut
+++ b/bin/ai/regression/regression.nut
@@ -10,9 +10,11 @@
 {
 	print("");
 	print("--TestInit--");
+	print(" Ops:      " + this.GetOpsTillSuspend());
 	print(" TickTest: " + this.GetTick());
 	this.Sleep(1);
 	print(" TickTest: " + this.GetTick());
+	print(" Ops:      " + this.GetOpsTillSuspend());
 	print(" SetCommandDelay: " + AIController.SetCommandDelay(1));
 	print(" IsValid(vehicle.plane_speed): " + AIGameSettings.IsValid("vehicle.plane_speed"));
 	print(" vehicle.plane_speed: " + AIGameSettings.GetValue("vehicle.plane_speed"));
@@ -166,6 +168,8 @@
 	foreach (idx, val in list) {
 		print("   " + idx);
 	}
+
+	print(" Ops:      " + this.GetOpsTillSuspend());
 }
 
 function Regression::Std()
--- a/bin/ai/regression/regression.txt
+++ b/bin/ai/regression/regression.txt
@@ -1,7 +1,9 @@
 
 --TestInit--
+ Ops:      9988
  TickTest: 1
  TickTest: 2
+ Ops:      9990
  SetCommandDelay: (null : 0x00000000)
  IsValid(vehicle.plane_speed): true
  vehicle.plane_speed: 2
@@ -79,6 +81,7 @@
    20
    30
    40
+ Ops:      8673
 
 --Std--
  abs(-21): 21
--- a/src/ai/ai_instance.cpp
+++ b/src/ai/ai_instance.cpp
@@ -789,3 +789,8 @@
 	sq_pop(vm, 4);
 	return true;
 }
+
+SQInteger AIInstance::GetOpsTillSuspend()
+{
+	return this->engine->GetOpsTillSuspend();
+}
--- a/src/ai/ai_instance.hpp
+++ b/src/ai/ai_instance.hpp
@@ -172,6 +172,13 @@
 	 * call from within a function called by the AI.
 	 */
 	void Suspend();
+
+	/**
+	 * Get the number of operations the AI can execute before being suspended.
+	 * This function is safe to call from within a function called by the AI.
+	 * @return The number of operations to execute.
+	 */
+	SQInteger GetOpsTillSuspend();
 private:
 	class AIController *controller;  ///< The AI main class.
 	class AIStorage *storage;        ///< Some global information for each running AI.
--- a/src/ai/api/ai_changelog.hpp
+++ b/src/ai/api/ai_changelog.hpp
@@ -26,6 +26,7 @@
  * \li AICompany::GetQuarterlyCargoDelivered
  * \li AICompany::GetQuarterlyPerformanceRating
  * \li AICompany::GetQuarterlyCompanyValue
+ * \li AIController::GetOpsTillSuspend
  * \li AITown::GetTownAuthority
  * \li AIVehicle::ERR_VEHICLE_TOO_LONG in case vehicle length limit is reached
  *
--- a/src/ai/api/ai_controller.cpp
+++ b/src/ai/api/ai_controller.cpp
@@ -66,6 +66,11 @@
 	return ::Company::Get(_current_company)->ai_instance->GetController()->ticks;
 }
 
+/* static */ int AIController::GetOpsTillSuspend()
+{
+	return ::Company::Get(_current_company)->ai_instance->GetOpsTillSuspend();
+}
+
 /* static */ int AIController::GetSetting(const char *name)
 {
 	return AIConfig::GetConfig(_current_company)->GetSetting(name);
--- a/src/ai/api/ai_controller.hpp
+++ b/src/ai/api/ai_controller.hpp
@@ -52,6 +52,16 @@
 	static uint GetTick();
 
 	/**
+	 * Get the number of operations the AI may still execute this tick.
+	 * @return The amount of operations left to execute.
+	 * @note This number can go negative when certain uninteruptable
+	 *   operations are executed. The amount of operations that you go
+	 *   over the limit will be deducted from the next tick you would
+	 *   be allowed to run.
+	 */
+	static int GetOpsTillSuspend();
+
+	/**
 	 * Get the value of one of your settings you set via info.nut.
 	 * @param name The name of the setting.
 	 * @return the value for the setting, or -1 if the setting is not known.
--- a/src/ai/api/ai_controller.hpp.sq
+++ b/src/ai/api/ai_controller.hpp.sq
@@ -13,11 +13,12 @@
 {
 	DefSQClass <AIController> SQAIController("AIController");
 	SQAIController.PreRegister(engine);
-	SQAIController.DefSQStaticMethod(engine, &AIController::GetTick,         "GetTick",         1, ".");
-	SQAIController.DefSQStaticMethod(engine, &AIController::SetCommandDelay, "SetCommandDelay", 2, ".i");
-	SQAIController.DefSQStaticMethod(engine, &AIController::Sleep,           "Sleep",           2, ".i");
-	SQAIController.DefSQStaticMethod(engine, &AIController::GetSetting,      "GetSetting",      2, ".s");
-	SQAIController.DefSQStaticMethod(engine, &AIController::GetVersion,      "GetVersion",      1, ".");
-	SQAIController.DefSQStaticMethod(engine, &AIController::Print,           "Print",           3, ".bs");
+	SQAIController.DefSQStaticMethod(engine, &AIController::GetTick,           "GetTick",           1, ".");
+	SQAIController.DefSQStaticMethod(engine, &AIController::GetOpsTillSuspend, "GetOpsTillSuspend", 1, ".");
+	SQAIController.DefSQStaticMethod(engine, &AIController::SetCommandDelay,   "SetCommandDelay",   2, ".i");
+	SQAIController.DefSQStaticMethod(engine, &AIController::Sleep,             "Sleep",             2, ".i");
+	SQAIController.DefSQStaticMethod(engine, &AIController::GetSetting,        "GetSetting",        2, ".s");
+	SQAIController.DefSQStaticMethod(engine, &AIController::GetVersion,        "GetVersion",        1, ".");
+	SQAIController.DefSQStaticMethod(engine, &AIController::Print,             "Print",             3, ".bs");
 	SQAIController.PostRegister(engine);
 }
--- a/src/script/squirrel.cpp
+++ b/src/script/squirrel.cpp
@@ -553,3 +553,8 @@
 {
 	return sq_can_suspend(this->vm);
 }
+
+SQInteger Squirrel::GetOpsTillSuspend()
+{
+	return this->vm->_ops_till_suspend;
+}
--- a/src/script/squirrel.hpp
+++ b/src/script/squirrel.hpp
@@ -253,6 +253,11 @@
 	 * Are we allowed to suspend the squirrel script at this moment?
 	 */
 	bool CanSuspend();
+
+	/**
+	 * How many operations can we execute till suspension?
+	 */
+	SQInteger GetOpsTillSuspend();
 };
 
 #endif /* SQUIRREL_HPP */