Files
@ r27835:eabfaa878ced
Branch filter:
Location: cpp/openttd-patchpack/source/src/ai/ai_scanner.cpp - annotation
r27835:eabfaa878ced
4.4 KiB
text/x-c
Add: calendar date for Survey results
This means no heuristics is possible on around which date people
play the game.
This means no heuristics is possible on around which date people
play the game.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r12768:980ae0491352 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r26641:01889b29735a r10696:8dfe83e30d01 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r26762:14abbe7f86c2 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r21383:942c32fb8b0e r21383:942c32fb8b0e r10696:8dfe83e30d01 r18508:f893337ab5c7 r11380:8edd3e28a734 r23607:36c15679007d r10696:8dfe83e30d01 r18508:f893337ab5c7 r10762:c26063cf0293 r18666:f05d7caba088 r18508:f893337ab5c7 r18666:f05d7caba088 r10696:8dfe83e30d01 r23730:3b11f535de42 r23730:3b11f535de42 r10696:8dfe83e30d01 r24529:3dec691db49a r18512:1adfa053a958 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r18508:f893337ab5c7 r10696:8dfe83e30d01 r18508:f893337ab5c7 r16514:bf011466da17 r16514:bf011466da17 r18508:f893337ab5c7 r16514:bf011466da17 r10788:e413614a4b4e r10696:8dfe83e30d01 r10696:8dfe83e30d01 r27307:3787f9679f95 r10696:8dfe83e30d01 r27307:3787f9679f95 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r18508:f893337ab5c7 r10696:8dfe83e30d01 r18508:f893337ab5c7 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r18508:f893337ab5c7 r10696:8dfe83e30d01 r26641:01889b29735a r26641:01889b29735a r26641:01889b29735a r26641:01889b29735a r26641:01889b29735a r11720:a2a7bf20700e r24500:deda806a71a7 r24500:deda806a71a7 r18508:f893337ab5c7 r11720:a2a7bf20700e r11720:a2a7bf20700e r11720:a2a7bf20700e r25655:1030dcb7eb52 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r26762:14abbe7f86c2 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r18508:f893337ab5c7 r18545:ddf2ea86fdad r18545:ddf2ea86fdad r18545:ddf2ea86fdad r11720:a2a7bf20700e r11720:a2a7bf20700e r18545:ddf2ea86fdad r11720:a2a7bf20700e r18545:ddf2ea86fdad r18545:ddf2ea86fdad r10696:8dfe83e30d01 r10696:8dfe83e30d01 r27354:7a607c98c943 r10696:8dfe83e30d01 r23607:36c15679007d r27354:7a607c98c943 r10762:c26063cf0293 r27308:abc0eb023c25 r10762:c26063cf0293 r27308:abc0eb023c25 r27308:abc0eb023c25 r24498:e9114d9ab04a r10762:c26063cf0293 r10762:c26063cf0293 r14377:f63ba65f9d57 r14377:f63ba65f9d57 r27308:abc0eb023c25 r27308:abc0eb023c25 r27308:abc0eb023c25 r24498:e9114d9ab04a r14377:f63ba65f9d57 r10762:c26063cf0293 r24498:e9114d9ab04a r27308:abc0eb023c25 r24498:e9114d9ab04a r10762:c26063cf0293 r10762:c26063cf0293 r24500:deda806a71a7 r24500:deda806a71a7 r27308:abc0eb023c25 r27308:abc0eb023c25 r18508:f893337ab5c7 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r10762:c26063cf0293 r10696:8dfe83e30d01 r10696:8dfe83e30d01 r18508:f893337ab5c7 r18666:f05d7caba088 r18666:f05d7caba088 r18666:f05d7caba088 r18666:f05d7caba088 r18666:f05d7caba088 r27307:3787f9679f95 r10696:8dfe83e30d01 r18508:f893337ab5c7 r27307:3787f9679f95 r10696:8dfe83e30d01 r10793:5ba2151e71e9 r18508:f893337ab5c7 r16957:b73e503c5e41 r18508:f893337ab5c7 r16957:b73e503c5e41 r16957:b73e503c5e41 r27354:7a607c98c943 r10793:5ba2151e71e9 r18508:f893337ab5c7 r27308:abc0eb023c25 r10793:5ba2151e71e9 r18508:f893337ab5c7 r24500:deda806a71a7 r24500:deda806a71a7 r10793:5ba2151e71e9 r24500:deda806a71a7 r10793:5ba2151e71e9 | /*
* This file is part of OpenTTD.
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file ai_scanner.cpp allows scanning AI scripts */
#include "../stdafx.h"
#include "../debug.h"
#include "../network/network.h"
#include "../openttd.h"
#include "../core/random_func.hpp"
#include "../script/squirrel_class.hpp"
#include "../script/api/script_object.hpp"
#include "ai_info.hpp"
#include "ai_scanner.hpp"
#include "../safeguards.h"
AIScannerInfo::AIScannerInfo() :
ScriptScanner(),
info_dummy(nullptr)
{
}
void AIScannerInfo::Initialize()
{
ScriptScanner::Initialize("AIScanner");
ScriptAllocatorScope alloc_scope(this->engine);
/* Create the dummy AI */
this->main_script = "%_dummy";
Script_CreateDummyInfo(this->engine->GetVM(), "AI", "ai");
}
void AIScannerInfo::SetDummyAI(class AIInfo *info)
{
this->info_dummy = info;
}
AIScannerInfo::~AIScannerInfo()
{
delete this->info_dummy;
}
std::string AIScannerInfo::GetScriptName(ScriptInfo *info)
{
return info->GetName();
}
void AIScannerInfo::RegisterAPI(class Squirrel *engine)
{
AIInfo::RegisterAPI(engine);
}
AIInfo *AIScannerInfo::SelectRandomAI() const
{
if (_game_mode == GM_MENU) {
Debug(script, 0, "The intro game should not use AI, loading 'dummy' AI.");
return this->info_dummy;
}
uint num_random_ais = 0;
for (const auto &item : info_single_list) {
AIInfo *i = static_cast<AIInfo *>(item.second);
if (i->UseAsRandomAI()) num_random_ais++;
}
if (num_random_ais == 0) {
Debug(script, 0, "No suitable AI found, loading 'dummy' AI.");
return this->info_dummy;
}
/* Find a random AI */
uint pos = ScriptObject::GetRandomizer(OWNER_NONE).Next(num_random_ais);
/* Find the Nth item from the array */
ScriptInfoList::const_iterator it = this->info_single_list.begin();
#define GetAIInfo(it) static_cast<AIInfo *>((*it).second)
while (!GetAIInfo(it)->UseAsRandomAI()) it++;
for (; pos > 0; pos--) {
it++;
while (!GetAIInfo(it)->UseAsRandomAI()) it++;
}
return GetAIInfo(it);
#undef GetAIInfo
}
AIInfo *AIScannerInfo::FindInfo(const std::string &name, int version, bool force_exact_match)
{
if (this->info_list.size() == 0) return nullptr;
if (name.empty()) return nullptr;
if (version == -1) {
/* We want to load the latest version of this AI; so find it */
auto it = this->info_single_list.find(name);
if (it != this->info_single_list.end()) return static_cast<AIInfo *>(it->second);
return nullptr;
}
if (force_exact_match) {
/* Try to find a direct 'name.version' match */
std::string name_with_version = fmt::format("{}.{}", name, version);
auto it = this->info_list.find(name_with_version);
if (it != this->info_list.end()) return static_cast<AIInfo *>(it->second);
return nullptr;
}
AIInfo *info = nullptr;
int highest_version = -1;
/* See if there is a compatible AI which goes by that name, with the highest
* version which allows loading the requested version */
for (const auto &item : this->info_list) {
AIInfo *i = static_cast<AIInfo *>(item.second);
if (StrEqualsIgnoreCase(name, i->GetName()) && i->CanLoadFromVersion(version) && (highest_version == -1 || i->GetVersion() > highest_version)) {
highest_version = item.second->GetVersion();
info = i;
}
}
return info;
}
void AIScannerLibrary::Initialize()
{
ScriptScanner::Initialize("AIScanner");
}
std::string AIScannerLibrary::GetScriptName(ScriptInfo *info)
{
AILibrary *library = static_cast<AILibrary *>(info);
return fmt::format("{}.{}", library->GetCategory(), library->GetInstanceName());
}
void AIScannerLibrary::RegisterAPI(class Squirrel *engine)
{
AILibrary::RegisterAPI(engine);
}
AILibrary *AIScannerLibrary::FindLibrary(const std::string &library, int version)
{
/* Internally we store libraries as 'library.version' */
std::string library_name = fmt::format("{}.{}", library, version);
/* Check if the library + version exists */
ScriptInfoList::iterator it = this->info_list.find(library_name);
if (it == this->info_list.end()) return nullptr;
return static_cast<AILibrary *>((*it).second);
}
|