diff --git a/bin/ai/library/graph/aystar/library.nut b/bin/ai/library/graph/aystar/library.nut index 5227601359..f1c84748cf 100644 --- a/bin/ai/library/graph/aystar/library.nut +++ b/bin/ai/library/graph/aystar/library.nut @@ -3,6 +3,7 @@ class AyStar extends AILibrary { function GetAuthor() { return "OpenTTD NoAI Developers Team"; } function GetName() { return "AyStar"; } + function GetShortName() { return "GRA*"; } function GetDescription() { return "An implementation of AyStar"; } function GetVersion() { return 4; } function GetDate() { return "2008-06-11"; } diff --git a/bin/ai/library/pathfinder/rail/library.nut b/bin/ai/library/pathfinder/rail/library.nut index 2d50557e24..155adaad15 100644 --- a/bin/ai/library/pathfinder/rail/library.nut +++ b/bin/ai/library/pathfinder/rail/library.nut @@ -3,6 +3,7 @@ class Rail extends AILibrary { function GetAuthor() { return "OpenTTD NoAI Developers Team"; } function GetName() { return "Rail"; } + function GetShortName() { return "PFRL"; } function GetDescription() { return "An implementation of a rail pathfinder"; } function GetVersion() { return 1; } function GetDate() { return "2008-09-22"; } diff --git a/bin/ai/library/pathfinder/road/library.nut b/bin/ai/library/pathfinder/road/library.nut index b3c6f1f547..06c21f1def 100644 --- a/bin/ai/library/pathfinder/road/library.nut +++ b/bin/ai/library/pathfinder/road/library.nut @@ -3,6 +3,7 @@ class Road extends AILibrary { function GetAuthor() { return "OpenTTD NoAI Developers Team"; } function GetName() { return "Road"; } + function GetShortName() { return "PFRO"; } function GetDescription() { return "An implementation of a road pathfinder"; } function GetVersion() { return 3; } function GetDate() { return "2008-06-18"; } diff --git a/bin/ai/library/queue/binary_heap/library.nut b/bin/ai/library/queue/binary_heap/library.nut index 3a96617a91..30489cbc27 100644 --- a/bin/ai/library/queue/binary_heap/library.nut +++ b/bin/ai/library/queue/binary_heap/library.nut @@ -3,6 +3,7 @@ class BinaryHeap extends AILibrary { function GetAuthor() { return "OpenTTD NoAI Developers Team"; } function GetName() { return "Binary Heap"; } + function GetShortName() { return "QUBH"; } function GetDescription() { return "An implementation of a Binary Heap"; } function GetVersion() { return 1; } function GetDate() { return "2008-06-10"; } diff --git a/bin/ai/library/queue/fibonacci_heap/library.nut b/bin/ai/library/queue/fibonacci_heap/library.nut index 1ea7260e02..244228788a 100644 --- a/bin/ai/library/queue/fibonacci_heap/library.nut +++ b/bin/ai/library/queue/fibonacci_heap/library.nut @@ -3,6 +3,7 @@ class FibonacciHeap extends AILibrary { function GetAuthor() { return "OpenTTD NoAI Developers Team"; } function GetName() { return "Fibonacci Heap"; } + function GetShortName() { return "QUFH"; } function GetDescription() { return "An implementation of a Fibonacci Heap"; } function GetVersion() { return 1; } function GetDate() { return "2008-08-22"; } diff --git a/bin/ai/library/queue/priority_queue/library.nut b/bin/ai/library/queue/priority_queue/library.nut index a8c615ed1d..1c17848bf3 100644 --- a/bin/ai/library/queue/priority_queue/library.nut +++ b/bin/ai/library/queue/priority_queue/library.nut @@ -3,6 +3,7 @@ class PriorityQueue extends AILibrary { function GetAuthor() { return "OpenTTD NoAI Developers Team"; } function GetName() { return "Priority Queue"; } + function GetShortName() { return "QUPQ"; } function GetDescription() { return "An implementation of a Priority Queue"; } function GetVersion() { return 2; } function GetDate() { return "2008-06-10"; } diff --git a/bin/ai/regression/regression_info.nut b/bin/ai/regression/regression_info.nut index 212f2a50a9..5eb8201c77 100644 --- a/bin/ai/regression/regression_info.nut +++ b/bin/ai/regression/regression_info.nut @@ -3,6 +3,7 @@ class Regression extends AIInfo { function GetAuthor() { return "OpenTTD NoAI Developers Team"; } function GetName() { return "Regression"; } + function GetShortName() { return "REGR"; } function GetDescription() { return "This runs regression-tests on all commands. On the same map the result should always be the same."; } function GetVersion() { return 1; } function GetDate() { return "2007-03-18"; } diff --git a/bin/ai/wrightai/info.nut b/bin/ai/wrightai/info.nut index 3cd7cfa90f..7a3feb8c51 100644 --- a/bin/ai/wrightai/info.nut +++ b/bin/ai/wrightai/info.nut @@ -3,6 +3,7 @@ class WrightAI extends AIInfo { function GetAuthor() { return "OpenTTD NoAI Developers Team"; } function GetName() { return "WrightAI"; } + function GetShortName() { return "WRAI"; } function GetDescription() { return "A simple AI that tries to beat you with only aircrafts"; } function GetVersion() { return 2; } function GetDate() { return "2008-02-24"; } diff --git a/src/ai/ai_info.cpp b/src/ai/ai_info.cpp index b2c653826d..a9bf22eae3 100644 --- a/src/ai/ai_info.cpp +++ b/src/ai/ai_info.cpp @@ -42,6 +42,12 @@ const char *AIFileInfo::GetName() return this->name; } +const char *AIFileInfo::GetShortName() +{ + if (this->short_name == NULL) this->short_name = this->engine->CallStringMethodStrdup(*this->SQ_instance, "GetShortName"); + return this->short_name; +} + const char *AIFileInfo::GetDescription() { if (this->description == NULL) this->description = this->engine->CallStringMethodStrdup(*this->SQ_instance, "GetDescription"); @@ -106,7 +112,7 @@ void AIFileInfo::CheckMethods(SQInteger *res, const char *name) { if (!this->engine->MethodExists(*this->SQ_instance, name)) { char error[1024]; - snprintf(error, sizeof(error), "your AIFileInfo doesn't have the method '%s'", name); + snprintf(error, sizeof(error), "your info.nut/library.nut doesn't have the method '%s'", name); this->engine->ThrowError(error); *res = SQ_ERROR; } @@ -127,6 +133,7 @@ void AIFileInfo::CheckMethods(SQInteger *res, const char *name) /* Check if all needed fields are there */ info->CheckMethods(&res, "GetAuthor"); info->CheckMethods(&res, "GetName"); + info->CheckMethods(&res, "GetShortName"); info->CheckMethods(&res, "GetDescription"); info->CheckMethods(&res, "GetVersion"); info->CheckMethods(&res, "GetDate"); diff --git a/src/ai/ai_info.hpp b/src/ai/ai_info.hpp index 71691ae3a9..223fbeaf32 100644 --- a/src/ai/ai_info.hpp +++ b/src/ai/ai_info.hpp @@ -35,7 +35,7 @@ public: friend class AIInfo; friend class AILibrary; - AIFileInfo() : author(NULL), name(NULL), description(NULL), date(NULL), instance_name(NULL) {}; + AIFileInfo() : author(NULL), name(NULL), short_name(NULL), description(NULL), date(NULL), instance_name(NULL) {}; ~AIFileInfo(); /** @@ -48,6 +48,11 @@ public: */ const char *GetName(); + /** + * Get the 4 character long short name of the AI. + */ + const char *GetShortName(); + /** * Get the description of the AI. */ @@ -106,6 +111,7 @@ private: class AIScanner *base; const char *author; const char *name; + const char *short_name; const char *description; const char *date; const char *instance_name; diff --git a/src/ai/ai_info_dummy.cpp b/src/ai/ai_info_dummy.cpp index a060a0a650..7865c52b75 100644 --- a/src/ai/ai_info_dummy.cpp +++ b/src/ai/ai_info_dummy.cpp @@ -16,6 +16,7 @@ const SQChar dummy_script_info[] = _SC(" class DummyAI extends AIInfo { \n\ function GetAuthor() { return \"OpenTTD NoAI Developers Team\"; } \n\ function GetName() { return \"DummyAI\"; } \n\ + function GetShortName() { return \"DUMM\"; } \n\ function GetDescription() { return \"A Dummy AI that is loaded when your ai/ dir is empty\"; }\n\ function GetVersion() { return 1; } \n\ function GetDate() { return \"2008-07-26\"; } \n\ diff --git a/src/ai/ai_scanner.cpp b/src/ai/ai_scanner.cpp index 2a389fa9dc..46a89511be 100644 --- a/src/ai/ai_scanner.cpp +++ b/src/ai/ai_scanner.cpp @@ -308,6 +308,13 @@ void AIScanner::RegisterAI(AIInfo *info) { const char *ai_name = info->GetDirName(); + /* Check if GetShortName follows the rules */ + if (strlen(info->GetShortName()) != 4) { + DEBUG(ai, 0, "The AI '%s' returned a string from GetShortName() which is not four characaters. Unable to load the AI.", info->GetDirName()); + delete info; + return; + } + /* Check if we register twice; than the first always wins */ if (this->info_list.find(ai_name) != this->info_list.end()) { /* In case they are not the same dir, give a warning */