OpenTTD Source
20240919-master-gdf0233f4c2
|
Go to the documentation of this file.
10 #include "../stdafx.h"
12 #include "../string_func.h"
13 #include "../settings_type.h"
15 #include "../script/squirrel.hpp"
20 #include "../network/network_content.h"
21 #include "../3rdparty/md5/md5.h"
22 #include "../tar_type.h"
24 #include "../safeguards.h"
31 auto p = this->
main_script.find_last_of(PATHSEPCHAR);
32 this->
main_script.erase(p != std::string::npos ? p + 1 : 0);
41 Debug(script, 0,
"Fatal error '{}' when trying to load the script '{}'.", e.
GetErrorMessage(), filename);
47 ScriptScanner::ScriptScanner() :
59 void ScriptScanner::Initialize(
const char *name)
68 ScriptScanner::~ScriptScanner()
86 for (
const auto &item : this->
info_list) {
90 this->info_list.clear();
97 std::string script_name = fmt::format(
"{}.{}", script_original_name, info->
GetVersion());
101 Debug(script, 0,
"The script '{}' returned a string from GetShortName() which is not four characters. Unable to load the script.", info->
GetName());
106 if (this->
info_list.find(script_name) != this->info_list.end()) {
118 Debug(script, 1,
"Registering two scripts with the same name and version");
121 Debug(script, 1,
"The first is taking precedence.");
135 }
else if (it->second->GetVersion() < info->
GetVersion()) {
143 fmt::format_to(output_iterator,
"List of {}:\n", this->
GetScannerName());
145 for (
const auto &item : list) {
149 fmt::format_to(output_iterator,
"\n");
164 bool AddFile(
const std::string &filename,
size_t,
const std::string &)
override
167 uint8_t buffer[1024];
171 auto f =
FioFOpenFile(filename,
"rb", this->dir, &size);
172 if (!f.has_value())
return false;
175 while ((len = fread(buffer, 1, (size >
sizeof(buffer)) ?
sizeof(buffer) : size, *f)) != 0 && size != 0) {
177 checksum.Append(buffer, len);
181 checksum.Finish(tmp_md5sum);
184 this->md5sum ^= tmp_md5sum;
202 for (
int j = 0; j < 4 && *str !=
'\0'; j++, str++)
id |= *str << (8 * j);
205 if (!md5sum)
return true;
209 TarList::iterator iter;
210 if (!tar_filename.empty() && (iter = _tar_list[dir].find(tar_filename)) != _tar_list[dir].end()) {
213 for (
const auto &tar : _tar_filelist[dir]) {
215 if (tar.second.tar_filename != iter->first)
continue;
218 const char *ext = strrchr(tar.first.c_str(),
'.');
221 checksum.
AddFile(tar.first, 0, tar_filename);
229 checksum.
Scan(
".nut", path);
237 for (
const auto &item : this->
info_list) {
238 if (
IsSameScript(ci, md5sum, item.second, this->GetDirectory()))
return true;
245 for (
const auto &item : this->
info_list) {
246 if (
IsSameScript(ci, md5sum, item.second, this->GetDirectory()))
return item.second->GetMainScript().c_str();
std::map< std::string, class ScriptInfo *, CaseInsensitiveComparator > ScriptInfoList
Type for the list of scripts.
Helper for creating a MD5sum of all files within of a script.
class Squirrel * engine
The engine we're scanning with.
ScriptFileChecksumCreator(Subdirectory dir)
Initialise the md5sum to be all zeroes, so we can easily xor the data.
std::string GetMainScript()
Get the current main script the ScanDir is currently tracking.
virtual void RegisterAPI(class Squirrel *engine)=0
Register the API for this ScriptInfo.
void GetConsoleList(std::back_insert_iterator< std::string > &output_iterator, bool newest_only) const
Get the list of registered scripts to print on the console.
const std::string & GetMainScript() const
Get the filename of the main.nut script.
ClientSettings _settings_client
The current settings for this game.
std::string tar_file
If, which tar file the script was in.
void Reset()
Completely reset the engine; start from scratch.
virtual std::string GetScriptName(ScriptInfo *info)=0
Get the script name how to store the script in memory.
const std::string & GetErrorMessage() const
The error message associated with the fatal error.
MD5Hash md5sum
The MD5 checksum.
virtual bool IsDeveloperOnly() const
Can this script be selected by developers only?
void RescanDir()
Rescan the script dir.
#define Debug(category, level, format_string,...)
Ouptut a line of debugging information.
void ResetEngine()
Reset the engine to ensure a clean environment for further steps.
bool ai_developer_tools
activate AI/GS developer tools
virtual const char * GetFileName() const =0
Get the filename to scan for this type of script.
Container for all important information about a piece of content.
bool AddFile(const std::string &filename, size_t basepath_length, const std::string &tar_filename) override
Add a file with the given filename.
void SetGlobalPointer(void *ptr)
Sets a pointer in the VM that is reachable from where ever you are in SQ.
const std::string & GetName() const
Get the Name of the script.
Subdirectory subdir
The current sub directory we are searching through.
std::string main_script
The full path of the script.
const std::string & GetDescription() const
Get the description of the script.
bool LoadScript(const std::string &script)
Load a script.
uint Scan(std::string_view extension, Subdirectory sd, bool tars=true, bool recursive=true)
Scan for files with the given extension in the given search path.
bool HasScript(const struct ContentInfo *ci, bool md5sum)
Check whether we have a script with the exact characteristics as ci.
ScriptInfoList info_list
The list of all script.
bool FioCheckFileExists(const std::string &filename, Subdirectory subdir)
Check whether the given file exists.
virtual const char * GetScannerName() const =0
Get the type of the script, in plural.
void RegisterScript(class ScriptInfo *info)
Register a ScriptInfo to the scanner.
int GetVersion() const
Get the version of the script.
void Reset()
Reset all allocated lists.
virtual Subdirectory GetDirectory() const =0
Get the directory to scan in.
bool StrEqualsIgnoreCase(const std::string_view str1, const std::string_view str2)
Compares two string( view)s for equality, while ignoring the case of the characters.
const std::string & GetTarFile() const
Get the filename of the tar the script is in.
Subdirectory
The different kinds of subdirectories OpenTTD uses.
std::optional< FileHandle > FioFOpenFile(const std::string &filename, const char *mode, Subdirectory subdir, size_t *filesize)
Opens a OpenTTD file somewhere in a personal or global directory.
A throw-class that is given when the script made a fatal error.
const std::string & GetShortName() const
Get the 4 character long short name of the script.
Subdirectory dir
The directory to look in.
Helper for scanning for files with a given name.
MD5Hash md5sum
The final md5sum.
const char * FindMainScript(const ContentInfo *ci, bool md5sum)
Find a script of a ContentInfo.
All static information from an Script like name, version, etc.
static bool IsSameScript(const ContentInfo *ci, bool md5sum, ScriptInfo *info, Subdirectory dir)
Check whether the script given in info is the same as in ci based on the shortname and md5 sum.
ScriptInfoList info_single_list
The list of all unique script. The best script (highest version) is shown.
uint32_t unique_id
Unique ID; either GRF ID or shortname.
GUISettings gui
settings related to the GUI
bool AddFile(const std::string &filename, size_t, const std::string &) override
Add a file with the given filename.