OpenTTD Source 20241224-master-gf74b0cf984
newgrf_config.cpp File Reference

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 "string_func.h"
#include "strings_func.h"
#include "textfile_gui.h"
#include "thread.h"
#include "newgrf_config.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...
 

Functions

void UpdateNewGRFConfigPalette (int32_t)
 Update the palettes of the graphics from the config file.
 
size_t GRFGetSizeOfDataSection (FileHandle &f)
 Get the data section size of a GRF.
 
static bool CalcGRFMD5Sum (GRFConfig *config, Subdirectory subdir)
 Calculate the MD5 sum for a GRF, and store it in the config.
 
bool FillGRFDetails (GRFConfig *config, bool is_static, Subdirectory subdir)
 Find the GRFID of a given grf, and calculate its md5sum.
 
void ClearGRFConfigList (GRFConfig **config)
 Clear a GRF Config list, freeing all nodes.
 
GRFConfig ** CopyGRFConfigList (GRFConfig **dst, const GRFConfig *src, bool init_only)
 Copy a GRF Config list.
 
static void RemoveDuplicatesFromGRFConfigList (GRFConfig *list)
 Removes duplicates from lists of GRFConfigs.
 
void AppendStaticGRFConfigs (GRFConfig **dst)
 Appends the static GRFs to a list of GRFs.
 
void AppendToGRFConfigList (GRFConfig **dst, GRFConfig *el)
 Appends an element to a list of GRFs.
 
void ResetGRFConfig (bool defaults)
 Reset the current GRF Config to either blank or newgame settings.
 
GRFListCompatibility IsGoodGRFConfigList (GRFConfig *grfconfig)
 Check if all GRFs in the GRF config from a savegame can be loaded.
 
static bool GRFSorter (GRFConfig *const &c1, GRFConfig *const &c2)
 Simple sorter for GRFS.
 
void DoScanNewGRFFiles (NewGRFScanCallback *callback)
 Really perform the scan for all NewGRFs.
 
void ScanNewGRFFiles (NewGRFScanCallback *callback)
 Scan for all NewGRFs.
 
const GRFConfigFindGRFConfig (uint32_t grfid, FindGRFConfigMode mode, const MD5Hash *md5sum, uint32_t desired_version)
 Find a NewGRF in the scanned list.
 
GRFConfigGetGRFConfig (uint32_t grfid, uint32_t mask)
 Retrieve a NewGRF from the current config by its grfid.
 
std::string GRFBuildParamList (const GRFConfig *c)
 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.
 
int _skip_all_newgrf_scanning = 0
 Set this flag to prevent any NewGRF scanning from being done.
 

Detailed Description

Finding NewGRFs and configuring them.

Definition in file newgrf_config.cpp.

Function Documentation

◆ AppendStaticGRFConfigs()

void AppendStaticGRFConfigs ( GRFConfig **  dst)

Appends the static GRFs to a list of GRFs.

Parameters
dstthe head of the list to add to

Definition at line 406 of file newgrf_config.cpp.

References _grfconfig_static, CopyGRFConfigList(), GRFConfig::next, and RemoveDuplicatesFromGRFConfigList().

Referenced by NGRFChunkHandler::Load(), and ResetGRFConfig().

◆ AppendToGRFConfigList()

void AppendToGRFConfigList ( GRFConfig **  dst,
GRFConfig el 
)

Appends an element to a list of GRFs.

Parameters
dstthe head of the list to add to
elthe new tail to be

Definition at line 420 of file newgrf_config.cpp.

References GRFConfig::next, and RemoveDuplicatesFromGRFConfigList().

◆ CalcGRFMD5Sum()

static bool CalcGRFMD5Sum ( GRFConfig config,
Subdirectory  subdir 
)
static

Calculate the MD5 sum for a GRF, and store it in the config.

Parameters
configGRF to compute.
subdirThe subdirectory to look in.
Returns
MD5 sum was successfully computed

Definition at line 269 of file newgrf_config.cpp.

References GRFConfig::filename, FioFOpenFile(), GRFGetSizeOfDataSection(), GRFConfig::ident, and GRFIdentifier::md5sum.

Referenced by FillGRFDetails().

◆ ClearGRFConfigList()

void ClearGRFConfigList ( GRFConfig **  config)

◆ CopyGRFConfigList()

GRFConfig ** CopyGRFConfigList ( GRFConfig **  dst,
const GRFConfig src,
bool  init_only 
)

Copy a GRF Config list.

Parameters
dstpointer to destination list
srcpointer to source list values
init_onlythe copied GRF will be processed up to GLS_INIT
Returns
pointer to the last value added to the destination list

Definition at line 354 of file newgrf_config.cpp.

References ClearGRFConfigList(), ClrBit(), GRFConfig::flags, GCF_INIT_ONLY, GRFConfig::next, and SetBit().

Referenced by AppendStaticGRFConfigs(), NewGRFWindow::Close(), NewGRFConfirmationCallback(), NewGRFWindow::OnClick(), and ResetGRFConfig().

◆ DoScanNewGRFFiles()

◆ FillGRFDetails()

bool FillGRFDetails ( GRFConfig config,
bool  is_static,
Subdirectory  subdir 
)

Find the GRFID of a given grf, and calculate its md5sum.

Parameters
configgrf to fill.
is_staticgrf is static.
subdirthe subdirectory to search in.
Returns
Operation was successfully completed.

Definition at line 304 of file newgrf_config.cpp.

References CalcGRFMD5Sum(), GRFConfig::filename, GRFConfig::FinalizeParameterInfo(), FioCheckFileExists(), GRFConfig::flags, GCF_SYSTEM, GCF_UNSAFE, GCS_NOT_FOUND, GRFIdentifier::grfid, HasBit(), GRFConfig::ident, LoadNewGRFFile(), GRFConfig::SetSuitablePalette(), and GRFConfig::status.

Referenced by GRFFileScanner::AddFile(), GraphicsSet::GetOrCreateExtraConfig(), and GRFLoadConfig().

◆ FindGRFConfig()

const GRFConfig * FindGRFConfig ( uint32_t  grfid,
FindGRFConfigMode  mode,
const MD5Hash *  md5sum,
uint32_t  desired_version 
)

Find a NewGRF in the scanned list.

Parameters
grfidGRFID to look for,
modeRestrictions for matching grfs
md5sumExpected MD5 sum
desired_versionRequested version
Returns
The matching grf, if it exists in _all_grfs, else nullptr.

Definition at line 670 of file newgrf_config.cpp.

References _all_grfs, FGCM_ANY, FGCM_COMPATIBLE, FGCM_EXACT, FGCM_NEWEST, GCF_INVALID, HasBit(), GRFConfig::next, and GRFConfig::version.

Referenced by AddGrfInfo(), ContentInfo::GetTextfile(), GRFLoadConfig(), HasGRFConfig(), IsGoodGRFConfigList(), NetworkAfterNewGRFScan(), NewGRFWindow::OnInvalidateData(), and ClientNetworkGameSocketHandler::Receive_SERVER_CHECK_NEWGRFS().

◆ GetGRFConfig()

GRFConfig * GetGRFConfig ( uint32_t  grfid,
uint32_t  mask 
)

Retrieve a NewGRF from the current config by its grfid.

Parameters
grfidgrf to look for.
maskGRFID mask to allow for partial matching.
Returns
The grf config, if it exists, else nullptr.

Definition at line 696 of file newgrf_config.cpp.

References _grfconfig, GRFIdentifier::grfid, GRFConfig::ident, and GRFConfig::next.

Referenced by DrawVehiclePurchaseInfo(), ErrorUnknownCallbackResult(), ParamSet(), ShowNewGrfVehicleError(), TranslateGRFStrings(), and VehicleLengthChanged().

◆ GRFBuildParamList()

std::string GRFBuildParamList ( const GRFConfig c)

Build a string containing space separated parameter values, and terminate.

Definition at line 709 of file newgrf_config.cpp.

References GRFConfig::param.

Referenced by GraphicsSetSaveConfig().

◆ GRFGetSizeOfDataSection()

size_t GRFGetSizeOfDataSection ( FileHandle f)

Get the data section size of a GRF.

Parameters
fGRF.
Returns
Size of the data section or SIZE_MAX if the file has no separate data section.

Definition at line 239 of file newgrf_config.cpp.

References _grf_cont_v2_sig, Debug, and MemCmpT().

Referenced by CalcGRFMD5Sum(), and GraphicsSet::CheckMD5().

◆ GRFSorter()

static bool GRFSorter ( GRFConfig *const &  c1,
GRFConfig *const &  c2 
)
static

Simple sorter for GRFS.

Parameters
c1the first GRFConfig *
c2the second GRFConfig *
Returns
true if the name of first NewGRF is before the name of the second.

Definition at line 596 of file newgrf_config.cpp.

References GRFConfig::GetName(), and StrNaturalCompare().

Referenced by DoScanNewGRFFiles().

◆ IsGoodGRFConfigList()

GRFListCompatibility IsGoodGRFConfigList ( GRFConfig grfconfig)

Check if all GRFs in the GRF config from a savegame can be loaded.

Parameters
grfconfigGrfConfig to check
Returns
will return any of the following 3 values:
  • GLC_ALL_GOOD: No problems occurred, all GRF files were found and loaded
  • GLC_COMPATIBLE: For one or more GRF's no exact match was found, but a compatible GRF with the same grfid was found and used instead
  • GLC_NOT_FOUND: For one or more GRF's no match was found at all

Definition at line 449 of file newgrf_config.cpp.

References BSWAP32(), Debug, FGCM_COMPATIBLE, FGCM_EXACT, GRFConfig::filename, FindGRFConfig(), GRFConfig::flags, FormatArrayAsHex(), GCF_COMPATIBLE, GCF_COPY, GCF_INVALID, GCS_NOT_FOUND, GLC_ALL_GOOD, GLC_COMPATIBLE, GLC_NOT_FOUND, GRFIdentifier::grfid, GRFConfig::has_param_defaults, HasBit(), GRFConfig::ident, GRFIdentifier::md5sum, GRFConfig::min_loadable_version, GRFConfig::name, GRFConfig::next, GRFConfig::num_valid_params, GRFConfig::param_info, SetBit(), and GRFConfig::version.

Referenced by AfterLoadGame(), and DoLoad().

◆ RemoveDuplicatesFromGRFConfigList()

static void RemoveDuplicatesFromGRFConfigList ( GRFConfig list)
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.

Parameters
listthe list to remove the duplicates from

Definition at line 384 of file newgrf_config.cpp.

References GRFIdentifier::grfid, GRFConfig::ident, GRFConfig::next, and RemoveDuplicatesFromGRFConfigList().

Referenced by AppendStaticGRFConfigs(), AppendToGRFConfigList(), and RemoveDuplicatesFromGRFConfigList().

◆ ResetGRFConfig()

void ResetGRFConfig ( bool  defaults)

Reset the current GRF Config to either blank or newgame settings.

Definition at line 431 of file newgrf_config.cpp.

References _grfconfig, _grfconfig_newgame, AppendStaticGRFConfigs(), and CopyGRFConfigList().

Referenced by NewGRFWindow::Close(), NGRFChunkHandler::Load(), LoadIntroGame(), NewGRFWindow::OnClick(), and AfterNewGRFScan::OnNewGRFsScanned().

◆ ScanNewGRFFiles()

void ScanNewGRFFiles ( NewGRFScanCallback callback)

Scan for all NewGRFs.

Parameters
callbackThe callback to call after the scanning is complete.

Definition at line 652 of file newgrf_config.cpp.

References DoScanNewGRFFiles(), MarkWholeScreenDirty(), and SetModalProgress().

◆ UpdateNewGRFConfigPalette()

void UpdateNewGRFConfigPalette ( int32_t  new_value)

Update the palettes of the graphics from the config file.

Called when changing the default palette in advanced settings.

Definition at line 227 of file newgrf_config.cpp.

References _all_grfs, _grfconfig_newgame, _grfconfig_static, and GRFConfig::next.

Referenced by AfterNewGRFScan::OnNewGRFsScanned().

Variable Documentation

◆ _all_grfs

◆ _grfconfig

◆ _grfconfig_newgame

GRFConfig* _grfconfig_newgame

First item in list of default GRF set up.

Definition at line 158 of file newgrf_config.cpp.

Referenced by LoadFromConfig(), GenerateLandscapeWindow::OnClick(), SelectGameWindow::OnClick(), ResetGRFConfig(), SaveToConfig(), and UpdateNewGRFConfigPalette().

◆ _grfconfig_static

GRFConfig* _grfconfig_static

First item in list of static GRF set up.

Definition at line 159 of file newgrf_config.cpp.

Referenced by AppendStaticGRFConfigs(), LoadFromConfig(), SaveToConfig(), and UpdateNewGRFConfigPalette().

◆ _missing_extra_graphics

uint _missing_extra_graphics = 0

Number of sprites provided by the fallback extra GRF, i.e. missing in the baseset.

Definition at line 160 of file newgrf_config.cpp.

Referenced by SelectGameWindow::DrawWidget(), SelectGameWindow::OnInit(), and SelectGameWindow::OnResize().

◆ _skip_all_newgrf_scanning

int _skip_all_newgrf_scanning = 0

Set this flag to prevent any NewGRF scanning from being done.

Definition at line 505 of file newgrf_config.cpp.

Referenced by GRFFileScanner::DoScan(), and openttd_main().