summaryrefslogtreecommitdiff
path: root/newgrf_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'newgrf_config.c')
-rw-r--r--newgrf_config.c40
1 files changed, 30 insertions, 10 deletions
diff --git a/newgrf_config.c b/newgrf_config.c
index ac7b60fd5..ef607c2b8 100644
--- a/newgrf_config.c
+++ b/newgrf_config.c
@@ -28,6 +28,7 @@
GRFConfig *_all_grfs;
GRFConfig *_grfconfig;
GRFConfig *_grfconfig_newgame;
+GRFConfig *_grfconfig_static;
/* Calculate the MD5 Sum for a GRF */
@@ -58,7 +59,7 @@ static bool CalcGRFMD5Sum(GRFConfig *config)
/* Find the GRFID and calculate the md5sum */
-bool FillGRFDetails(GRFConfig *config)
+bool FillGRFDetails(GRFConfig *config, bool is_static)
{
if (!FioCheckFileExists(config->filename)) {
SETBIT(config->flags, GCF_NOT_FOUND);
@@ -68,7 +69,10 @@ bool FillGRFDetails(GRFConfig *config)
/* Find and load the Action 8 information */
/* 62 is the last file slot before sample.cat.
* Should perhaps be some "don't care" value */
- LoadNewGRFFile(config, 62, GLS_FILESCAN);
+ LoadNewGRFFile(config, 62, is_static ? GLS_SAFETYSCAN : GLS_FILESCAN);
+
+ /* GCF_UNSAFE is set if GLS_SAFETYSCAN finds unsafe actions */
+ if (HASBIT(config->flags, GCF_UNSAFE)) return false;
/* Skip if the grfid is 0 (not read) or 0xFFFFFFFF (ttdp system grf) */
if (config->grfid == 0 || config->grfid == 0xFFFFFFFF) return false;
@@ -77,22 +81,28 @@ bool FillGRFDetails(GRFConfig *config)
}
+void ClearGRFConfig(GRFConfig *config)
+{
+ free(config->filename);
+ free(config->name);
+ free(config->info);
+ free(config);
+}
+
+
/* Clear a GRF Config list */
void ClearGRFConfigList(GRFConfig *config)
{
GRFConfig *c, *next;
for (c = config; c != NULL; c = next) {
next = c->next;
- free(c->filename);
- free(c->name);
- free(c->info);
- free(c);
+ ClearGRFConfig(c);
}
}
/* Copy a GRF Config list */
-static void CopyGRFConfigList(GRFConfig **dst, GRFConfig *src)
+static GRFConfig **CopyGRFConfigList(GRFConfig **dst, GRFConfig *src)
{
GRFConfig *c;
@@ -106,15 +116,21 @@ static void CopyGRFConfigList(GRFConfig **dst, GRFConfig *src)
*dst = c;
dst = &c->next;
}
+
+ return dst;
}
/* Reset the current GRF Config to either blank or newgame settings */
void ResetGRFConfig(bool defaults)
{
+ GRFConfig **c = &_grfconfig;
+
ClearGRFConfigList(_grfconfig);
_grfconfig = NULL;
- if (defaults) CopyGRFConfigList(&_grfconfig, _grfconfig_newgame);
+
+ if (defaults) c = CopyGRFConfigList(c, _grfconfig_newgame);
+ CopyGRFConfigList(c, _grfconfig_static);
}
@@ -138,7 +154,7 @@ bool IsGoodGRFConfigList(void)
res = false;
} else {
- DEBUG(grf, 1) ("[GRF] Loading GRF %X from %s", BSWAP32(c->grfid), f->filename);
+ DEBUG(grf, 1) ("[GRF] Loading GRF %08X from %s", BSWAP32(c->grfid), f->filename);
c->filename = strdup(f->filename);
c->name = strdup(f->name);
c->info = strdup(f->info);
@@ -186,7 +202,7 @@ static uint ScanPath(const char *path)
c = calloc(1, sizeof(*c));
c->filename = strdup(file);
- if (FillGRFDetails(c)) {
+ if (FillGRFDetails(c, false)) {
if (_all_grfs == NULL) {
_all_grfs = c;
} else {
@@ -294,6 +310,7 @@ static void Save_NGRF(void)
int index = 0;
for (c = _grfconfig; c != NULL; c = c->next) {
+ if (HASBIT(c->flags, GCF_STATIC)) continue;
SlSetArrayIndex(index++);
SlObject(c, _grfconfig_desc);
}
@@ -314,6 +331,9 @@ static void Load_NGRF(void)
last = &c->next;
}
+ /* Append static NewGRF configuration */
+ CopyGRFConfigList(last, _grfconfig_static);
+
ClearGRFConfigList(_grfconfig);
_grfconfig = first;
}