|
@@ -5,24 +5,25 @@
|
|
|
#include "stdafx.h"
|
|
|
#include "openttd.h"
|
|
|
#include "debug.h"
|
|
|
#include "variables.h"
|
|
|
#include "saveload.h"
|
|
|
#include "md5.h"
|
|
|
#include "newgrf.h"
|
|
|
#include "newgrf_config.h"
|
|
|
#include "core/alloc_func.hpp"
|
|
|
#include "string_func.h"
|
|
|
#include "gamelog.h"
|
|
|
#include "network/network_type.h"
|
|
|
#include "gfx_func.h"
|
|
|
|
|
|
#include "fileio_func.h"
|
|
|
#include "fios.h"
|
|
|
|
|
|
|
|
|
GRFConfig *_all_grfs;
|
|
|
GRFConfig *_grfconfig;
|
|
|
GRFConfig *_grfconfig_newgame;
|
|
|
GRFConfig *_grfconfig_static;
|
|
|
|
|
|
|
|
|
/* Calculate the MD5 Sum for a GRF */
|
|
@@ -63,24 +64,26 @@ bool FillGRFDetails(GRFConfig *config, b
|
|
|
|
|
|
/* Skip if the grfid is 0 (not read) or 0xFFFFFFFF (ttdp system grf) */
|
|
|
if (config->grfid == 0 || config->grfid == 0xFFFFFFFF || config->IsOpenTTDBaseGRF()) return false;
|
|
|
|
|
|
if (is_static) {
|
|
|
/* Perform a 'safety scan' for static GRFs */
|
|
|
LoadNewGRFFile(config, 62, GLS_SAFETYSCAN);
|
|
|
|
|
|
/* GCF_UNSAFE is set if GLS_SAFETYSCAN finds unsafe actions */
|
|
|
if (HasBit(config->flags, GCF_UNSAFE)) return false;
|
|
|
}
|
|
|
|
|
|
config->windows_paletted = (_use_palette == PAL_WINDOWS);
|
|
|
|
|
|
return CalcGRFMD5Sum(config);
|
|
|
}
|
|
|
|
|
|
|
|
|
void ClearGRFConfig(GRFConfig **config)
|
|
|
{
|
|
|
/* GCF_COPY as in NOT strdupped/alloced the filename, name and info */
|
|
|
if (!HasBit((*config)->flags, GCF_COPY)) {
|
|
|
free((*config)->filename);
|
|
|
free((*config)->name);
|
|
|
free((*config)->info);
|
|
|
|
|
@@ -472,51 +475,53 @@ static const uint32 OPENTTD_GRAPHICS_BAS
|
|
|
|
|
|
/**
|
|
|
* Checks whether this GRF is a OpenTTD base graphic GRF.
|
|
|
* @return true if and only if it is a base GRF.
|
|
|
*/
|
|
|
bool GRFConfig::IsOpenTTDBaseGRF() const
|
|
|
{
|
|
|
return (this->grfid & 0x00FFFFFF) == OPENTTD_GRAPHICS_BASE_GRF_ID;
|
|
|
}
|
|
|
|
|
|
|
|
|
static const SaveLoad _grfconfig_desc[] = {
|
|
|
SLE_STR(GRFConfig, filename, SLE_STR, 0x40),
|
|
|
SLE_VAR(GRFConfig, grfid, SLE_UINT32),
|
|
|
SLE_ARR(GRFConfig, md5sum, SLE_UINT8, 16),
|
|
|
SLE_ARR(GRFConfig, param, SLE_UINT32, 0x80),
|
|
|
SLE_VAR(GRFConfig, num_params, SLE_UINT8),
|
|
|
SLE_STR(GRFConfig, filename, SLE_STR, 0x40),
|
|
|
SLE_VAR(GRFConfig, grfid, SLE_UINT32),
|
|
|
SLE_ARR(GRFConfig, md5sum, SLE_UINT8, 16),
|
|
|
SLE_ARR(GRFConfig, param, SLE_UINT32, 0x80),
|
|
|
SLE_VAR(GRFConfig, num_params, SLE_UINT8),
|
|
|
SLE_CONDVAR(GRFConfig, windows_paletted, SLE_BOOL, 101, SL_MAX_VERSION),
|
|
|
SLE_END()
|
|
|
};
|
|
|
|
|
|
|
|
|
static void Save_NGRF()
|
|
|
{
|
|
|
int index = 0;
|
|
|
|
|
|
for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
|
|
|
if (HasBit(c->flags, GCF_STATIC)) continue;
|
|
|
SlSetArrayIndex(index++);
|
|
|
SlObject(c, _grfconfig_desc);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
static void Load_NGRF()
|
|
|
{
|
|
|
ClearGRFConfigList(&_grfconfig);
|
|
|
while (SlIterateArray() != -1) {
|
|
|
GRFConfig *c = CallocT<GRFConfig>(1);
|
|
|
SlObject(c, _grfconfig_desc);
|
|
|
if (CheckSavegameVersion(101)) c->windows_paletted = (_use_palette == PAL_WINDOWS);
|
|
|
AppendToGRFConfigList(&_grfconfig, c);
|
|
|
}
|
|
|
|
|
|
/* Append static NewGRF configuration */
|
|
|
AppendStaticGRFConfigs(&_grfconfig);
|
|
|
}
|
|
|
|
|
|
extern const ChunkHandler _newgrf_chunk_handlers[] = {
|
|
|
{ 'NGRF', Save_NGRF, Load_NGRF, CH_ARRAY | CH_LAST }
|
|
|
};
|
|
|
|
|
|
|