diff options
Diffstat (limited to 'newgrf.c')
-rw-r--r-- | newgrf.c | 65 |
1 files changed, 43 insertions, 22 deletions
@@ -2471,8 +2471,8 @@ static void SkipIf(byte *buf, int len) } -/* Action 0x08 (GLS_FILESCAN) */ -static void ScanInfo(byte *buf, int len) +/* Action 0x08 (GLS_SAFETYSCAN) */ +static void SafeInfo(byte *buf, int len) { uint8 version; uint32 grfid; @@ -2487,6 +2487,9 @@ static void ScanInfo(byte *buf, int len) _cur_grfconfig->grfid = grfid; + /* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */ + if (GB(grfid, 24, 8) == 0xFF) SETBIT(_cur_grfconfig->flags, GCF_SYSTEM); + len -= 6; name = (const char*)buf; name_len = ttd_strnlen(name, len); @@ -2502,7 +2505,14 @@ static void ScanInfo(byte *buf, int len) _cur_grfconfig->info = TranslateTTDPatchCodes(info); } } +} + +/* Action 0x08 (GLS_INFOSCAN) */ +static void ScanInfo(byte *buf, int len) +{ + SafeInfo(buf, len); + /* GLS_INFOSCAN only looks for the action 8, so we can skip the rest of the file */ _skip_sprites = -1; } @@ -3177,6 +3187,17 @@ static void GRFDataBlock(byte *buf, int len) } } + +/* Used during safety scan on unsafe actions */ +static void GRFUnsafe(byte *buf, int len) +{ + SETBIT(_cur_grfconfig->flags, GCF_UNSAFE); + + /* Skip remainder of GRF if GRF ID is set */ + if (_cur_grfconfig->grfid != 0) _skip_sprites = -1; +} + + static void InitializeGRFSpecial(void) { _ttdpatch_flags[0] = ((_patches.always_small_airport ? 1 : 0) << 0x0C) // keepsmallairport @@ -3517,25 +3538,25 @@ static void DecodeSpecialSprite(uint num, GrfLoadingStage stage) * is not in memory and scanning the file every time would be too expensive. * In other stages we skip action 0x10 since it's already dealt with. */ static const SpecialSpriteHandler handlers[][GLS_END] = { - /* 0x00 */ { NULL, NULL, NULL, FeatureChangeInfo, }, - /* 0x01 */ { NULL, NULL, NULL, NewSpriteSet, }, - /* 0x02 */ { NULL, NULL, NULL, NewSpriteGroup, }, - /* 0x03 */ { NULL, NULL, NULL, FeatureMapSpriteGroup, }, - /* 0x04 */ { NULL, NULL, NULL, FeatureNewName, }, - /* 0x05 */ { NULL, NULL, NULL, GraphicsNew, }, - /* 0x06 */ { NULL, NULL, CfgApply, CfgApply, }, - /* 0x07 */ { NULL, NULL, NULL, SkipIf, }, - /* 0x08 */ { ScanInfo, NULL, GRFInfo, GRFInfo, }, - /* 0x09 */ { NULL, NULL, SkipIf, SkipIf, }, - /* 0x0A */ { NULL, NULL, NULL, SpriteReplace, }, - /* 0x0B */ { NULL, NULL, GRFError, GRFError, }, - /* 0x0C */ { NULL, NULL, GRFComment, GRFComment, }, - /* 0x0D */ { NULL, NULL, ParamSet, ParamSet, }, - /* 0x0E */ { NULL, NULL, GRFInhibit, GRFInhibit, }, - /* 0x0F */ { NULL, NULL, NULL, NULL, }, - /* 0x10 */ { NULL, DefineGotoLabel, NULL, NULL, }, - /* 0x11 */ { NULL, NULL, NULL, GRFSound, }, - /* 0x12 */ { NULL, NULL, NULL, LoadFontGlyph, }, + /* 0x00 */ { NULL, GRFUnsafe, NULL, NULL, FeatureChangeInfo, }, + /* 0x01 */ { NULL, GRFUnsafe, NULL, NULL, NewSpriteSet, }, + /* 0x02 */ { NULL, GRFUnsafe, NULL, NULL, NewSpriteGroup, }, + /* 0x03 */ { NULL, GRFUnsafe, NULL, NULL, FeatureMapSpriteGroup, }, + /* 0x04 */ { NULL, NULL, NULL, NULL, FeatureNewName, }, + /* 0x05 */ { NULL, NULL, NULL, NULL, GraphicsNew, }, + /* 0x06 */ { NULL, NULL, NULL, CfgApply, CfgApply, }, + /* 0x07 */ { NULL, NULL, NULL, NULL, SkipIf, }, + /* 0x08 */ { ScanInfo, SafeInfo, NULL, GRFInfo, GRFInfo, }, + /* 0x09 */ { NULL, NULL, NULL, SkipIf, SkipIf, }, + /* 0x0A */ { NULL, NULL, NULL, NULL, SpriteReplace, }, + /* 0x0B */ { NULL, NULL, NULL, GRFError, GRFError, }, + /* 0x0C */ { NULL, NULL, NULL, GRFComment, GRFComment, }, + /* 0x0D */ { NULL, GRFUnsafe, NULL, ParamSet, ParamSet, }, + /* 0x0E */ { NULL, GRFUnsafe, NULL, GRFInhibit, GRFInhibit, }, + /* 0x0F */ { NULL, NULL, NULL, NULL, NULL, }, + /* 0x10 */ { NULL, NULL, DefineGotoLabel, NULL, NULL, }, + /* 0x11 */ { NULL, GRFUnsafe, NULL, NULL, GRFSound, }, + /* 0x12 */ { NULL, NULL, NULL, NULL, LoadFontGlyph, }, }; byte* buf; @@ -3591,7 +3612,7 @@ void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage) * During activation, only actions 0, 1, 2, 3, 4, 5, 7, 8, 9, 0A and 0B are * carried out. All others are ignored, because they only need to be * processed once at initialization. */ - if (stage != GLS_FILESCAN && stage != GLS_LABELSCAN) { + if (stage != GLS_FILESCAN && stage != GLS_SAFETYSCAN && stage != GLS_LABELSCAN) { _cur_grffile = GetFileByFilename(filename); if (_cur_grffile == NULL) error("File ``%s'' lost in cache.\n", filename); if (stage == GLS_ACTIVATION && !HASBIT(config->flags, GCF_ACTIVATED)) return; |