summaryrefslogtreecommitdiff
path: root/src/newgrf.cpp
diff options
context:
space:
mode:
authorRubidium <rubidium@openttd.org>2021-04-14 17:20:39 +0200
committerrubidium42 <rubidium42@users.noreply.github.com>2021-05-08 12:39:34 +0200
commitfdc11a9f943bcbd674b8b69a2bb0895414928028 (patch)
treeccd04bb045ed1aeebbff2b88224f9c52988ddc92 /src/newgrf.cpp
parent0dd339ecd8fab0ae3a4901e0ad185798e04cccf3 (diff)
downloadopenttd-fdc11a9f943bcbd674b8b69a2bb0895414928028.tar.xz
Codechange: introduce SpriteFile to be used by the sprite loader instead of the global FIO slot functionality
Diffstat (limited to 'src/newgrf.cpp')
-rw-r--r--src/newgrf.cpp95
1 files changed, 33 insertions, 62 deletions
diff --git a/src/newgrf.cpp b/src/newgrf.cpp
index b51a18b43..aadd1a3a9 100644
--- 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 *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. */
@@ -7553,9 +7552,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();
}
}
@@ -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 *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);
}
}
}
@@ -9269,32 +9269,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.
@@ -9329,16 +9303,13 @@ void LoadNewGRFFile(GRFConfig *config, uint file_index, GrfLoadingStage stage, S
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, 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) {
@@ -9364,7 +9335,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 {
@@ -9376,7 +9347,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++;
@@ -9398,12 +9369,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);
}
}