Codechange: introduce SpriteFile to be used by the sprite loader instead of the global FIO slot functionality
(cherry picked from commit fdc11a9f94
)
This commit is contained in:

committed by
Jonathan G Rennison

parent
04b38dbfca
commit
6bd12e24d7
@@ -103,11 +103,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)
|
||||
@@ -5029,7 +5028,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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6270,16 +6269,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;
|
||||
}
|
||||
@@ -6328,7 +6327,7 @@ static void GraphicsNew(ByteReader *buf)
|
||||
|
||||
for (uint16 n = num; n > 0; n--) {
|
||||
_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);
|
||||
}
|
||||
|
||||
if (type == 0x04 && ((_cur.grfconfig->ident.grfid & 0x00FFFFFF) == OPENTTD_GRAPHICS_BASE_GRF_ID || _cur.grfconfig->ident.grfid == BSWAP32(0xFF4F4701))) {
|
||||
@@ -6567,7 +6566,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;
|
||||
|
||||
@@ -6928,7 +6927,7 @@ static void SpriteReplace(ByteReader *buf)
|
||||
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. */
|
||||
@@ -7723,9 +7722,9 @@ static void LoadGRFSound(size_t offs, SoundEntry *sound)
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7757,10 +7756,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?)");
|
||||
@@ -7778,7 +7778,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;
|
||||
}
|
||||
|
||||
@@ -7792,7 +7792,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);
|
||||
@@ -7858,7 +7858,7 @@ static void LoadFontGlyph(ByteReader *buf)
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9892,32 +9892,6 @@ static void DecodeSpecialSprite(byte *buf, uint num, GrfLoadingStage stage)
|
||||
}
|
||||
|
||||
|
||||
/** 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.
|
||||
@@ -9952,17 +9926,14 @@ void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage, S
|
||||
return;
|
||||
}
|
||||
|
||||
config->full_filename.clear();
|
||||
FioOpenFile(file_index, filename, subdir, &(config->full_filename));
|
||||
_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);
|
||||
config->full_filename = _cur.file->GetFilename();
|
||||
_cur.grfconfig = config;
|
||||
|
||||
DEBUG(grf, 2, "LoadNewGRFFile: Reading NewGRF-file '%s'", config->GetDisplayPath());
|
||||
|
||||
_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;
|
||||
}
|
||||
@@ -9970,13 +9941,13 @@ void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage, S
|
||||
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 (grf_container_version >= 2) FioReadDword();
|
||||
}
|
||||
|
||||
if (_cur.grf_container_ver >= 2) {
|
||||
if (grf_container_version >= 2) {
|
||||
/* Read compression value. */
|
||||
byte compression = FioReadByte();
|
||||
if (compression != 0) {
|
||||
@@ -9988,7 +9959,7 @@ void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage, S
|
||||
/* 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 {
|
||||
@@ -10000,7 +9971,7 @@ void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage, S
|
||||
|
||||
ReusableBuffer<byte> 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++;
|
||||
|
||||
@@ -10022,12 +9993,12 @@ void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage, S
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user