OpenTTD
|
Finding NewGRFs and configuring them. More...
#include "stdafx.h"
#include "debug.h"
#include "3rdparty/md5/md5.h"
#include "newgrf.h"
#include "network/network_func.h"
#include "gfx_func.h"
#include "newgrf_text.h"
#include "window_func.h"
#include "progress.h"
#include "video/video_driver.hpp"
#include "strings_func.h"
#include "textfile_gui.h"
#include "fileio_func.h"
#include "fios.h"
#include "safeguards.h"
Go to the source code of this file.
Data Structures | |
class | GRFFileScanner |
Helper for scanning for files with GRF as extension. More... | |
struct | UnknownGRF |
Structure for UnknownGRFs; this is a lightweight variant of GRFConfig. More... | |
Functions | |
bool | UpdateNewGRFConfigPalette (int32 p1) |
Update the palettes of the graphics from the config file. More... | |
size_t | GRFGetSizeOfDataSection (FILE *f) |
Get the data section size of a GRF. More... | |
static bool | CalcGRFMD5Sum (GRFConfig *config, Subdirectory subdir) |
Calculate the MD5 sum for a GRF, and store it in the config. More... | |
bool | FillGRFDetails (GRFConfig *config, bool is_static, Subdirectory subdir) |
Find the GRFID of a given grf, and calculate its md5sum. More... | |
void | ClearGRFConfigList (GRFConfig **config) |
Clear a GRF Config list, freeing all nodes. More... | |
GRFConfig ** | CopyGRFConfigList (GRFConfig **dst, const GRFConfig *src, bool init_only) |
Copy a GRF Config list. More... | |
static void | RemoveDuplicatesFromGRFConfigList (GRFConfig *list) |
Removes duplicates from lists of GRFConfigs. More... | |
void | AppendStaticGRFConfigs (GRFConfig **dst) |
Appends the static GRFs to a list of GRFs. More... | |
void | AppendToGRFConfigList (GRFConfig **dst, GRFConfig *el) |
Appends an element to a list of GRFs. More... | |
void | ResetGRFConfig (bool defaults) |
Reset the current GRF Config to either blank or newgame settings. More... | |
GRFListCompatibility | IsGoodGRFConfigList (GRFConfig *grfconfig) |
Check if all GRFs in the GRF config from a savegame can be loaded. More... | |
static int CDECL | GRFSorter (GRFConfig *const *p1, GRFConfig *const *p2) |
Simple sorter for GRFS. More... | |
void | DoScanNewGRFFiles (void *callback) |
Really perform the scan for all NewGRFs. More... | |
void | ScanNewGRFFiles (NewGRFScanCallback *callback) |
Scan for all NewGRFs. More... | |
const GRFConfig * | FindGRFConfig (uint32 grfid, FindGRFConfigMode mode, const uint8 *md5sum, uint32 desired_version) |
Find a NewGRF in the scanned list. More... | |
GRFTextWrapper * | FindUnknownGRFName (uint32 grfid, uint8 *md5sum, bool create) |
Finds the name of a NewGRF in the list of names for unknown GRFs. More... | |
GRFConfig * | GetGRFConfig (uint32 grfid, uint32 mask) |
Retrieve a NewGRF from the current config by its grfid. More... | |
char * | GRFBuildParamList (char *dst, const GRFConfig *c, const char *last) |
Build a string containing space separated parameter values, and terminate. | |
Variables | |
GRFConfig * | _all_grfs |
First item in list of all scanned NewGRFs. | |
GRFConfig * | _grfconfig |
First item in list of current GRF set up. | |
GRFConfig * | _grfconfig_newgame |
First item in list of default GRF set up. | |
GRFConfig * | _grfconfig_static |
First item in list of static GRF set up. | |
uint | _missing_extra_graphics = 0 |
Number of sprites provided by the fallback extra GRF, i.e. missing in the baseset. | |
static const uint32 | OPENTTD_GRAPHICS_BASE_GRF_ID = BSWAP32(0xFF4F5400) |
Base GRF ID for OpenTTD's base graphics GRFs. More... | |
Finding NewGRFs and configuring them.
Definition in file newgrf_config.cpp.
void AppendStaticGRFConfigs | ( | GRFConfig ** | dst | ) |
Appends the static GRFs to a list of GRFs.
dst | the head of the list to add to |
Definition at line 514 of file newgrf_config.cpp.
References CopyGRFConfigList(), GRFConfig::next, and RemoveDuplicatesFromGRFConfigList().
Referenced by ResetGRFConfig(), and NewGRFScanCallback::~NewGRFScanCallback().
Appends an element to a list of GRFs.
dst | the head of the list to add to |
el | the new tail to be |
Definition at line 528 of file newgrf_config.cpp.
References GRFConfig::next, and RemoveDuplicatesFromGRFConfigList().
Referenced by NewGRFScanCallback::~NewGRFScanCallback().
|
static |
Calculate the MD5 sum for a GRF, and store it in the config.
config | GRF to compute. |
subdir | The subdirectory to look in. |
Definition at line 373 of file newgrf_config.cpp.
References GRFConfig::filename, FioFCloseFile(), FioFOpenFile(), GRFGetSizeOfDataSection(), GRFConfig::ident, GRFIdentifier::md5sum, and min().
void ClearGRFConfigList | ( | GRFConfig ** | config | ) |
Clear a GRF Config list, freeing all nodes.
config | Start of the list. |
NULL
. Definition at line 444 of file newgrf_config.cpp.
References GRFConfig::next.
Referenced by LoadCheckData::Clear(), CopyGRFConfigList(), DoScanNewGRFFiles(), NetworkGameListHandleDelayedInsert(), NetworkGameListRemoveItem(), NewGRFWindow::OnDropdownSelect(), ClientNetworkUDPSocketHandler::Receive_SERVER_RESPONSE(), and NewGRFScanCallback::~NewGRFScanCallback().
Copy a GRF Config list.
dst | pointer to destination list |
src | pointer to source list values |
init_only | the copied GRF will be processed up to GLS_INIT |
Definition at line 462 of file newgrf_config.cpp.
References ClearGRFConfigList(), ClrBit(), GRFConfig::flags, GCF_INIT_ONLY, GRFConfig::next, and SetBit().
Referenced by AppendStaticGRFConfigs(), NewGRFConfirmationCallback(), ResetGRFConfig(), and NewGRFScanCallback::~NewGRFScanCallback().
void DoScanNewGRFFiles | ( | void * | callback | ) |
Really perform the scan for all NewGRFs.
callback | The callback to call after the scanning is complete. |
Definition at line 726 of file newgrf_config.cpp.
References _modal_progress_paint_mutex, _modal_progress_work_mutex, ThreadMutex::BeginCritical(), ClearGRFConfigList(), DEBUG, DeleteWindowByClass(), TarScanner::DoScan(), GRFFileScanner::DoScan(), ThreadMutex::EndCritical(), free(), GOID_NEWGRF_RESCANNED, GRFSorter(), InvalidateWindowClassesData(), InvalidateWindowData(), MarkWholeScreenDirty(), NetworkAfterNewGRFScan(), TarScanner::NEWGRF, GRFConfig::next, QSortT(), SetModalProgress(), WC_GAME_OPTIONS, WC_MODAL_PROGRESS, WC_SAVELOAD, and WN_GAME_OPTIONS_NEWGRF_STATE.
Referenced by ScanNewGRFFiles().
bool FillGRFDetails | ( | GRFConfig * | config, |
bool | is_static, | ||
Subdirectory | subdir | ||
) |
Find the GRFID of a given grf, and calculate its md5sum.
config | grf to fill. |
is_static | grf is static. |
subdir | the subdirectory to search in. |
Definition at line 412 of file newgrf_config.cpp.
References CONFIG_SLOT, GRFConfig::filename, FioCheckFileExists(), GCS_NOT_FOUND, LoadNewGRFFile(), and GRFConfig::status.
Referenced by GRFFileScanner::AddFile(), GRFLoadConfig(), and NewGRFScanCallback::~NewGRFScanCallback().
const GRFConfig* FindGRFConfig | ( | uint32 | grfid, |
FindGRFConfigMode | mode, | ||
const uint8 * | md5sum, | ||
uint32 | desired_version | ||
) |
Find a NewGRF in the scanned list.
grfid | GRFID to look for, |
mode | Restrictions for matching grfs |
md5sum | Expected MD5 sum |
desired_version | Requested version |
NULL
. Definition at line 809 of file newgrf_config.cpp.
Referenced by GRFLoadConfig(), ClientNetworkUDPSocketHandler::HandleIncomingNetworkGameInfoGRFConfig(), HasGRFConfig(), IsGoodGRFConfigList(), NewGRFWindow::OnInvalidateData(), PrintGrfInfo(), ServerNetworkUDPSocketHandler::Receive_CLIENT_GET_NEWGRFS(), ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS(), NewGRFWindow::TagNameFilter(), and NewGRFScanCallback::~NewGRFScanCallback().
GRFTextWrapper* FindUnknownGRFName | ( | uint32 | grfid, |
uint8 * | md5sum, | ||
bool | create | ||
) |
Finds the name of a NewGRF in the list of names for unknown GRFs.
An unknown GRF is a GRF where the .grf is not found during scanning.
The names are resolved via UDP calls to servers that should know the name, though the replies may not come. This leaves "<Unknown>" as name, though that shouldn't matter very much as they need GRF crawler or so to look up the GRF anyway and that works better with the GRF ID.
grfid | the GRF ID part of the 'unique' GRF identifier |
md5sum | the MD5 checksum part of the 'unique' GRF identifier |
create | whether to create a new GRFConfig if the GRFConfig did not exist in the fake list of GRFConfigs. |
Definition at line 854 of file newgrf_config.cpp.
References AddGRFTextToList(), GRFIdentifier::grfid, GRFIdentifier::md5sum, UnknownGRF::name, UnknownGRF::next, GRFTextWrapper::text, and UNKNOWN_GRF_NAME_PLACEHOLDER.
Referenced by ClientNetworkUDPSocketHandler::HandleIncomingNetworkGameInfoGRFConfig(), and ClientNetworkUDPSocketHandler::Receive_SERVER_NEWGRFS().
GRFConfig* GetGRFConfig | ( | uint32 | grfid, |
uint32 | mask | ||
) |
Retrieve a NewGRF from the current config by its grfid.
grfid | grf to look for. |
mask | GRFID mask to allow for partial matching. |
NULL
. Definition at line 889 of file newgrf_config.cpp.
References GRFIdentifier::grfid, GRFConfig::ident, and GRFConfig::next.
Referenced by ErrorUnknownCallbackResult(), ShowNewGrfVehicleError(), TranslateGRFStrings(), VehicleLengthChanged(), and NewGRFScanCallback::~NewGRFScanCallback().
size_t GRFGetSizeOfDataSection | ( | FILE * | f | ) |
Get the data section size of a GRF.
f | GRF. |
Definition at line 343 of file newgrf_config.cpp.
References _grf_cont_v2_sig, DEBUG, and MemCmpT().
Referenced by CalcGRFMD5Sum(), GraphicsSet::CheckMD5(), and NewGRFScanCallback::~NewGRFScanCallback().
Simple sorter for GRFS.
Definition at line 714 of file newgrf_config.cpp.
References GRFConfig::GetName(), and strnatcmp().
Referenced by DoScanNewGRFFiles().
GRFListCompatibility IsGoodGRFConfigList | ( | GRFConfig * | grfconfig | ) |
Check if all GRFs in the GRF config from a savegame can be loaded.
grfconfig | GrfConfig to check |
Definition at line 557 of file newgrf_config.cpp.
References BSWAP32(), DEBUG, FGCM_COMPATIBLE, FGCM_EXACT, GRFConfig::filename, FindGRFConfig(), GRFConfig::flags, free(), GCF_COMPATIBLE, GCF_COPY, GCF_INVALID, GCS_NOT_FOUND, GLC_ALL_GOOD, GLC_COMPATIBLE, GLC_NOT_FOUND, GRFIdentifier::grfid, GRFParameterInfo::GRFParameterInfo(), GRFConfig::has_param_defaults, HasBit(), GRFConfig::ident, lastof, SmallVector< T, S >::Length(), GRFIdentifier::md5sum, md5sumToString(), GRFConfig::min_loadable_version, GRFConfig::name, GRFConfig::next, GRFConfig::num_valid_params, GRFConfig::param_info, SetBit(), stredup(), and GRFConfig::version.
Referenced by NewGRFScanCallback::~NewGRFScanCallback().
|
static |
Removes duplicates from lists of GRFConfigs.
These duplicates are introduced when the _grfconfig_static GRFs are appended to the _grfconfig on a newgame or savegame. As the parameters of the static GRFs could be different that the parameters of the ones used non-statically. This can result in desyncs in multiplayers, so the duplicate static GRFs have to be removed.
This function assumes that all static GRFs are placed after the non-static GRFs.
list | the list to remove the duplicates from |
Definition at line 492 of file newgrf_config.cpp.
References GRFIdentifier::grfid, GRFConfig::ident, and GRFConfig::next.
Referenced by AppendStaticGRFConfigs(), and AppendToGRFConfigList().
void ResetGRFConfig | ( | bool | defaults | ) |
Reset the current GRF Config to either blank or newgame settings.
Definition at line 539 of file newgrf_config.cpp.
References AppendStaticGRFConfigs(), and CopyGRFConfigList().
Referenced by AfterNewGRFScan::OnNewGRFsScanned(), and NewGRFScanCallback::~NewGRFScanCallback().
void ScanNewGRFFiles | ( | NewGRFScanCallback * | callback | ) |
Scan for all NewGRFs.
callback | The callback to call after the scanning is complete. |
Definition at line 783 of file newgrf_config.cpp.
References _modal_progress_paint_mutex, _modal_progress_work_mutex, ThreadMutex::BeginCritical(), DoScanNewGRFFiles(), ThreadMutex::EndCritical(), VideoDriver::GetInstance(), MarkWholeScreenDirty(), ThreadObject::New(), SetModalProgress(), and UpdateNewGRFScanStatus().
Referenced by NetworkContentDownloadStatusWindow::~NetworkContentDownloadStatusWindow(), and NewGRFScanCallback::~NewGRFScanCallback().
bool UpdateNewGRFConfigPalette | ( | int32 | p1 | ) |
Update the palettes of the graphics from the config file.
Called when changing the default palette in advanced settings.
p1 | Unused. |
Definition at line 330 of file newgrf_config.cpp.
References GRFConfig::next.
Referenced by AfterNewGRFScan::OnNewGRFsScanned().
|
static |
Base GRF ID for OpenTTD's base graphics GRFs.
Definition at line 917 of file newgrf_config.cpp.