diff --git a/src/newgrf.cpp b/src/newgrf.cpp --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -99,11 +99,10 @@ public: SpriteID spriteid; ///< First available SpriteID for loading realsprites. /* Local state in the file */ - uint file_index; ///< File index of currently processed GRF file. + SpriteFile *file; ///< File of currently processed GRF file. GRFFile *grffile; ///< Currently processed GRF file. GRFConfig *grfconfig; ///< Config of the currently processed GRF file. uint32 nfo_line; ///< Currently processed pseudo sprite number in the GRF. - byte grf_container_ver; ///< Container format of the current GRF file. /* Kind of return values when processing certain actions */ int skip_sprites; ///< Number of pseudo sprites to skip before processing the next one. (-1 to skip to end of file) @@ -4884,7 +4883,7 @@ static void NewSpriteSet(ByteReader *buf for (int i = 0; i < num_sets * num_ents; i++) { _cur.nfo_line++; - LoadNextSprite(_cur.spriteid++, _cur.file_index, _cur.nfo_line, _cur.grf_container_ver); + LoadNextSprite(_cur.spriteid++, *_cur.file, _cur.nfo_line); } } @@ -6120,16 +6119,16 @@ static void GraphicsNew(ByteReader *buf) /* Special not-TTDP-compatible case used in openttd.grf * Missing shore sprites and initialisation of SPR_SHORE_BASE */ grfmsg(2, "GraphicsNew: Loading 10 missing shore sprites from extra grf."); - LoadNextSprite(SPR_SHORE_BASE + 0, _cur.file_index, _cur.nfo_line++, _cur.grf_container_ver); // SLOPE_STEEP_S - LoadNextSprite(SPR_SHORE_BASE + 5, _cur.file_index, _cur.nfo_line++, _cur.grf_container_ver); // SLOPE_STEEP_W - LoadNextSprite(SPR_SHORE_BASE + 7, _cur.file_index, _cur.nfo_line++, _cur.grf_container_ver); // SLOPE_WSE - LoadNextSprite(SPR_SHORE_BASE + 10, _cur.file_index, _cur.nfo_line++, _cur.grf_container_ver); // SLOPE_STEEP_N - LoadNextSprite(SPR_SHORE_BASE + 11, _cur.file_index, _cur.nfo_line++, _cur.grf_container_ver); // SLOPE_NWS - LoadNextSprite(SPR_SHORE_BASE + 13, _cur.file_index, _cur.nfo_line++, _cur.grf_container_ver); // SLOPE_ENW - LoadNextSprite(SPR_SHORE_BASE + 14, _cur.file_index, _cur.nfo_line++, _cur.grf_container_ver); // SLOPE_SEN - LoadNextSprite(SPR_SHORE_BASE + 15, _cur.file_index, _cur.nfo_line++, _cur.grf_container_ver); // SLOPE_STEEP_E - LoadNextSprite(SPR_SHORE_BASE + 16, _cur.file_index, _cur.nfo_line++, _cur.grf_container_ver); // SLOPE_EW - LoadNextSprite(SPR_SHORE_BASE + 17, _cur.file_index, _cur.nfo_line++, _cur.grf_container_ver); // SLOPE_NS + LoadNextSprite(SPR_SHORE_BASE + 0, *_cur.file, _cur.nfo_line++); // SLOPE_STEEP_S + LoadNextSprite(SPR_SHORE_BASE + 5, *_cur.file, _cur.nfo_line++); // SLOPE_STEEP_W + LoadNextSprite(SPR_SHORE_BASE + 7, *_cur.file, _cur.nfo_line++); // SLOPE_WSE + LoadNextSprite(SPR_SHORE_BASE + 10, *_cur.file, _cur.nfo_line++); // SLOPE_STEEP_N + LoadNextSprite(SPR_SHORE_BASE + 11, *_cur.file, _cur.nfo_line++); // SLOPE_NWS + LoadNextSprite(SPR_SHORE_BASE + 13, *_cur.file, _cur.nfo_line++); // SLOPE_ENW + LoadNextSprite(SPR_SHORE_BASE + 14, *_cur.file, _cur.nfo_line++); // SLOPE_SEN + LoadNextSprite(SPR_SHORE_BASE + 15, *_cur.file, _cur.nfo_line++); // SLOPE_STEEP_E + LoadNextSprite(SPR_SHORE_BASE + 16, *_cur.file, _cur.nfo_line++); // SLOPE_EW + LoadNextSprite(SPR_SHORE_BASE + 17, *_cur.file, _cur.nfo_line++); // SLOPE_NS if (_loaded_newgrf_features.shore == SHORE_REPLACE_NONE) _loaded_newgrf_features.shore = SHORE_REPLACE_ONLY_NEW; return; } @@ -6177,7 +6176,7 @@ static void GraphicsNew(ByteReader *buf) for (; num > 0; num--) { _cur.nfo_line++; - LoadNextSprite(replace == 0 ? _cur.spriteid++ : replace++, _cur.file_index, _cur.nfo_line, _cur.grf_container_ver); + LoadNextSprite(replace == 0 ? _cur.spriteid++ : replace++, *_cur.file, _cur.nfo_line); } _cur.skip_sprites = skip_num; @@ -6397,7 +6396,7 @@ static void CfgApply(ByteReader *buf) /* Preload the next sprite */ size_t pos = FioGetPos(); - uint32 num = _cur.grf_container_ver >= 2 ? FioReadDword() : FioReadWord(); + uint32 num = _cur.file->GetContainerVersion() >= 2 ? FioReadDword() : FioReadWord(); uint8 type = FioReadByte(); byte *preload_sprite = nullptr; @@ -6758,7 +6757,7 @@ static void SpriteReplace(ByteReader *bu for (uint j = 0; j < num_sprites; j++) { int load_index = first_sprite + j; _cur.nfo_line++; - LoadNextSprite(load_index, _cur.file_index, _cur.nfo_line, _cur.grf_container_ver); // XXX + LoadNextSprite(load_index, *_cur.file, _cur.nfo_line); // XXX /* Shore sprites now located at different addresses. * So detect when the old ones get replaced. */ @@ -7553,9 +7552,9 @@ static void LoadGRFSound(size_t offs, So if (offs != SIZE_MAX) { /* Sound is present in the NewGRF. */ - sound->file = FioGetRandomAccessFile(_cur.file_index); + sound->file = _cur.file; sound->file_offset = offs; - sound->grf_container_ver = _cur.grf_container_ver; + sound->grf_container_ver = _cur.file->GetContainerVersion(); } } @@ -7587,10 +7586,11 @@ static void GRFSound(ByteReader *buf) size_t offs = FioGetPos(); - uint32 len = _cur.grf_container_ver >= 2 ? FioReadDword() : FioReadWord(); + byte grf_container_version = _cur.file->GetContainerVersion(); + uint32 len = grf_container_version >= 2 ? FioReadDword() : FioReadWord(); byte type = FioReadByte(); - if (_cur.grf_container_ver >= 2 && type == 0xFD) { + if (grf_container_version >= 2 && type == 0xFD) { /* Reference to sprite section. */ if (invalid) { grfmsg(1, "GRFSound: Sound index out of range (multiple Action 11?)"); @@ -7608,7 +7608,7 @@ static void GRFSound(ByteReader *buf) if (type != 0xFF) { grfmsg(1, "GRFSound: Unexpected RealSprite found, skipping"); FioSkipBytes(7); - SkipSpriteData(type, len - 8); + SkipSpriteData(*_cur.file, type, len - 8); continue; } @@ -7622,7 +7622,7 @@ static void GRFSound(ByteReader *buf) case 0xFF: /* Allocate sound only in init stage. */ if (_cur.stage == GLS_INIT) { - if (_cur.grf_container_ver >= 2) { + if (grf_container_version >= 2) { grfmsg(1, "GRFSound: Inline sounds are not supported for container version >= 2"); } else { LoadGRFSound(offs, sound + i); @@ -7688,7 +7688,7 @@ static void LoadFontGlyph(ByteReader *bu for (uint c = 0; c < num_char; c++) { if (size < FS_END) SetUnicodeGlyph(size, base_char + c, _cur.spriteid); _cur.nfo_line++; - LoadNextSprite(_cur.spriteid++, _cur.file_index, _cur.nfo_line, _cur.grf_container_ver); + LoadNextSprite(_cur.spriteid++, *_cur.file, _cur.nfo_line); } } } @@ -9269,32 +9269,6 @@ static void DecodeSpecialSprite(byte *bu } -/** Signature of a container version 2 GRF. */ -extern const byte _grf_cont_v2_sig[8] = {'G', 'R', 'F', 0x82, 0x0D, 0x0A, 0x1A, 0x0A}; - -/** - * Get the container version of the currently opened GRF file. - * @return Container version of the GRF file or 0 if the file is corrupt/no GRF file. - */ -byte GetGRFContainerVersion() -{ - size_t pos = FioGetPos(); - - if (FioReadWord() == 0) { - /* Check for GRF container version 2, which is identified by the bytes - * '47 52 46 82 0D 0A 1A 0A' at the start of the file. */ - for (uint i = 0; i < lengthof(_grf_cont_v2_sig); i++) { - if (FioReadByte() != _grf_cont_v2_sig[i]) return 0; // Invalid format - } - - return 2; - } - - /* Container version 1 has no header, rewind to start. */ - FioSeekTo(pos, SEEK_SET); - return 1; -} - /** * Load a particular NewGRF. * @param config The configuration of the to be loaded NewGRF. @@ -9329,16 +9303,13 @@ void LoadNewGRFFile(GRFConfig *config, u return; } - FioOpenFile(file_index, filename, subdir); - _cur.file_index = file_index; // XXX - _palette_remap_grf[_cur.file_index] = (config->palette & GRFP_USE_MASK); - + _cur.file = &FioOpenFile(file_index, filename, subdir, config->palette & GRFP_USE_MASK); _cur.grfconfig = config; DEBUG(grf, 2, "LoadNewGRFFile: Reading NewGRF-file '%s'", filename); - _cur.grf_container_ver = GetGRFContainerVersion(); - if (_cur.grf_container_ver == 0) { + byte grf_container_version = _cur.file->GetContainerVersion(); + if (grf_container_version == 0) { DEBUG(grf, 7, "LoadNewGRFFile: Custom .grf has invalid format"); return; } @@ -9346,13 +9317,13 @@ void LoadNewGRFFile(GRFConfig *config, u if (stage == GLS_INIT || stage == GLS_ACTIVATION) { /* We need the sprite offsets in the init stage for NewGRF sounds * and in the activation stage for real sprites. */ - ReadGRFSpriteOffsets(_cur.grf_container_ver); + ReadGRFSpriteOffsets(*_cur.file); } else { /* Skip sprite section offset if present. */ - if (_cur.grf_container_ver >= 2) FioReadDword(); - } - - if (_cur.grf_container_ver >= 2) { + if (grf_container_version >= 2) FioReadDword(); + } + + if (grf_container_version >= 2) { /* Read compression value. */ byte compression = FioReadByte(); if (compression != 0) { @@ -9364,7 +9335,7 @@ void LoadNewGRFFile(GRFConfig *config, u /* Skip the first sprite; we don't care about how many sprites this * does contain; newest TTDPatches and George's longvehicles don't * neither, apparently. */ - uint32 num = _cur.grf_container_ver >= 2 ? FioReadDword() : FioReadWord(); + uint32 num = grf_container_version >= 2 ? FioReadDword() : FioReadWord(); if (num == 4 && FioReadByte() == 0xFF) { FioReadDword(); } else { @@ -9376,7 +9347,7 @@ void LoadNewGRFFile(GRFConfig *config, u ReusableBuffer buf; - while ((num = (_cur.grf_container_ver >= 2 ? FioReadDword() : FioReadWord())) != 0) { + while ((num = (grf_container_version >= 2 ? FioReadDword() : FioReadWord())) != 0) { byte type = FioReadByte(); _cur.nfo_line++; @@ -9398,12 +9369,12 @@ void LoadNewGRFFile(GRFConfig *config, u break; } - if (_cur.grf_container_ver >= 2 && type == 0xFD) { + if (grf_container_version >= 2 && type == 0xFD) { /* Reference to data section. Container version >= 2 only. */ FioSkipBytes(num); } else { FioSkipBytes(7); - SkipSpriteData(type, num - 8); + SkipSpriteData(*_cur.file, type, num - 8); } }