mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 22:28:56 +00:00
(svn r15464) -Codechange [NoAI]: Call all info.nut functions exactly once and only during initialization.
This commit is contained in:
parent
b9c66aa750
commit
9292c90360
@ -48,31 +48,27 @@ AILibrary::~AILibrary()
|
|||||||
|
|
||||||
const char *AIFileInfo::GetAuthor()
|
const char *AIFileInfo::GetAuthor()
|
||||||
{
|
{
|
||||||
if (this->author == NULL) this->author = this->engine->CallStringMethodStrdup(*this->SQ_instance, "GetAuthor");
|
|
||||||
return this->author;
|
return this->author;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *AIFileInfo::GetName()
|
const char *AIFileInfo::GetName()
|
||||||
{
|
{
|
||||||
if (this->name == NULL) this->name = this->engine->CallStringMethodStrdup(*this->SQ_instance, "GetName");
|
|
||||||
return this->name;
|
return this->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *AIFileInfo::GetShortName()
|
const char *AIFileInfo::GetShortName()
|
||||||
{
|
{
|
||||||
if (this->short_name == NULL) this->short_name = this->engine->CallStringMethodStrdup(*this->SQ_instance, "GetShortName");
|
|
||||||
return this->short_name;
|
return this->short_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *AIFileInfo::GetDescription()
|
const char *AIFileInfo::GetDescription()
|
||||||
{
|
{
|
||||||
if (this->description == NULL) this->description = this->engine->CallStringMethodStrdup(*this->SQ_instance, "GetDescription");
|
|
||||||
return this->description;
|
return this->description;
|
||||||
}
|
}
|
||||||
|
|
||||||
int AIFileInfo::GetVersion()
|
int AIFileInfo::GetVersion()
|
||||||
{
|
{
|
||||||
return this->engine->CallIntegerMethod(*this->SQ_instance, "GetVersion");
|
return this->version;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AIFileInfo::GetSettings()
|
void AIFileInfo::GetSettings()
|
||||||
@ -82,24 +78,14 @@ void AIFileInfo::GetSettings()
|
|||||||
|
|
||||||
const char *AIFileInfo::GetDate()
|
const char *AIFileInfo::GetDate()
|
||||||
{
|
{
|
||||||
if (this->date == NULL) this->date = this->engine->CallStringMethodStrdup(*this->SQ_instance, "GetDate");
|
|
||||||
return this->date;
|
return this->date;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *AIFileInfo::GetInstanceName()
|
const char *AIFileInfo::GetInstanceName()
|
||||||
{
|
{
|
||||||
if (this->instance_name == NULL) this->instance_name = this->engine->CallStringMethodStrdup(*this->SQ_instance, "CreateInstance");
|
|
||||||
return this->instance_name;
|
return this->instance_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AIFileInfo::CanLoadFromVersion(int version)
|
|
||||||
{
|
|
||||||
if (version == -1) return true;
|
|
||||||
if (!this->engine->MethodExists(*this->SQ_instance, "MinVersionToLoad")) return (version == this->GetVersion());
|
|
||||||
|
|
||||||
return version >= this->engine->CallIntegerMethod(*this->SQ_instance, "MinVersionToLoad") && version <= this->GetVersion();
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *AIFileInfo::GetMainScript()
|
const char *AIFileInfo::GetMainScript()
|
||||||
{
|
{
|
||||||
return this->main_script;
|
return this->main_script;
|
||||||
@ -144,6 +130,15 @@ bool AIFileInfo::CheckMethod(const char *name)
|
|||||||
|
|
||||||
info->main_script = strdup(info->base->GetMainScript());
|
info->main_script = strdup(info->base->GetMainScript());
|
||||||
|
|
||||||
|
/* Cache the data the info file gives us. */
|
||||||
|
info->author = info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetAuthor");
|
||||||
|
info->name = info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetName");
|
||||||
|
info->short_name = info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetShortName");
|
||||||
|
info->description = info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetDescription");
|
||||||
|
info->date = info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetDate");
|
||||||
|
info->version = info->engine->CallIntegerMethod(*info->SQ_instance, "GetVersion");
|
||||||
|
info->instance_name = info->engine->CallStringMethodStrdup(*info->SQ_instance, "CreateInstance");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,6 +161,11 @@ bool AIFileInfo::CheckMethod(const char *name)
|
|||||||
if (info->engine->MethodExists(*info->SQ_instance, "GetSettings")) {
|
if (info->engine->MethodExists(*info->SQ_instance, "GetSettings")) {
|
||||||
info->GetSettings();
|
info->GetSettings();
|
||||||
}
|
}
|
||||||
|
if (info->engine->MethodExists(*info->SQ_instance, "MinVersionToLoad")) {
|
||||||
|
info->min_loadable_version = info->engine->CallIntegerMethod(*info->SQ_instance, "MinVersionToLoad");
|
||||||
|
} else {
|
||||||
|
info->min_loadable_version = info->GetVersion();
|
||||||
|
}
|
||||||
|
|
||||||
/* Remove the link to the real instance, else it might get deleted by RegisterAI() */
|
/* Remove the link to the real instance, else it might get deleted by RegisterAI() */
|
||||||
sq_setinstanceup(vm, 2, NULL);
|
sq_setinstanceup(vm, 2, NULL);
|
||||||
@ -207,6 +207,12 @@ AIInfo::~AIInfo()
|
|||||||
this->config_list.clear();
|
this->config_list.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AIInfo::CanLoadFromVersion(int version)
|
||||||
|
{
|
||||||
|
if (version == -1) return true;
|
||||||
|
return version >= this->min_loadable_version && version <= this->GetVersion();
|
||||||
|
}
|
||||||
|
|
||||||
SQInteger AIInfo::AddSetting(HSQUIRRELVM vm)
|
SQInteger AIInfo::AddSetting(HSQUIRRELVM vm)
|
||||||
{
|
{
|
||||||
AIConfigItem config;
|
AIConfigItem config;
|
||||||
@ -401,6 +407,9 @@ int AIInfo::GetSettingDefaultValue(const char *name)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Cache the category */
|
||||||
|
library->category = library->engine->CallStringMethodStrdup(*library->SQ_instance, "GetCategory");
|
||||||
|
|
||||||
/* Register the Library to the base system */
|
/* Register the Library to the base system */
|
||||||
library->base->RegisterLibrary(library);
|
library->base->RegisterLibrary(library);
|
||||||
|
|
||||||
@ -409,7 +418,6 @@ int AIInfo::GetSettingDefaultValue(const char *name)
|
|||||||
|
|
||||||
const char *AILibrary::GetCategory()
|
const char *AILibrary::GetCategory()
|
||||||
{
|
{
|
||||||
if (this->category == NULL) this->category = this->engine->CallStringMethodStrdup(*this->SQ_instance, "GetCategory");
|
|
||||||
return this->category;
|
return this->category;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,11 +84,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
const char *GetInstanceName();
|
const char *GetInstanceName();
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if we can start this AI.
|
|
||||||
*/
|
|
||||||
bool CanLoadFromVersion(int version);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the filename of the main.nut script.
|
* Get the filename of the main.nut script.
|
||||||
*/
|
*/
|
||||||
@ -115,6 +110,7 @@ private:
|
|||||||
const char *description;
|
const char *description;
|
||||||
const char *date;
|
const char *date;
|
||||||
const char *instance_name;
|
const char *instance_name;
|
||||||
|
int version;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AIInfo : public AIFileInfo {
|
class AIInfo : public AIFileInfo {
|
||||||
@ -139,6 +135,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
const AIConfigItem *GetConfigItem(const char *name);
|
const AIConfigItem *GetConfigItem(const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if we can start this AI.
|
||||||
|
*/
|
||||||
|
bool CanLoadFromVersion(int version);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a setting.
|
* Set a setting.
|
||||||
*/
|
*/
|
||||||
@ -156,6 +157,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
AIConfigItemList config_list;
|
AIConfigItemList config_list;
|
||||||
|
int min_loadable_version;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AILibrary : public AIFileInfo {
|
class AILibrary : public AIFileInfo {
|
||||||
|
@ -404,7 +404,7 @@ AIInfo *AIScanner::FindInfo(const char *nameParam, int versionParam)
|
|||||||
snprintf(ai_name_compare, sizeof(ai_name_compare), "%s", (*it).second->GetInstanceName());
|
snprintf(ai_name_compare, sizeof(ai_name_compare), "%s", (*it).second->GetInstanceName());
|
||||||
strtolower(ai_name_compare);
|
strtolower(ai_name_compare);
|
||||||
|
|
||||||
if (strcasecmp(ai_name, ai_name_compare) == 0 && (*it).second->CanLoadFromVersion(versionParam) && (*it).second->GetVersion() > version) {
|
if (strcasecmp(ai_name, ai_name_compare) == 0 && (*it).second->CanLoadFromVersion(versionParam)) {
|
||||||
version = (*it).second->GetVersion();
|
version = (*it).second->GetVersion();
|
||||||
info = (*it).second;
|
info = (*it).second;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user