mirror of https://github.com/OpenTTD/OpenTTD
Codefix: Use correct GRF version during safety and label scans.
During these loading stages the Action 8 is skipped, which would cause the default GRF version to be used instead of that required by the NewGRF.pull/13309/head
parent
5fea35ba07
commit
348e6b7f82
|
@ -101,6 +101,7 @@ public:
|
||||||
/* Global state */
|
/* Global state */
|
||||||
GrfLoadingStage stage; ///< Current loading stage
|
GrfLoadingStage stage; ///< Current loading stage
|
||||||
SpriteID spriteid; ///< First available SpriteID for loading realsprites.
|
SpriteID spriteid; ///< First available SpriteID for loading realsprites.
|
||||||
|
uint8_t grf_version; ///< GRF version
|
||||||
|
|
||||||
/* Local state in the file */
|
/* Local state in the file */
|
||||||
SpriteFile *file; ///< File of currently processed GRF file.
|
SpriteFile *file; ///< File of currently processed GRF file.
|
||||||
|
@ -2099,7 +2100,7 @@ static ChangeInfoResult StationChangeInfo(uint first, uint last, int prop, ByteR
|
||||||
}
|
}
|
||||||
|
|
||||||
case 0x12: // Cargo types for random triggers
|
case 0x12: // Cargo types for random triggers
|
||||||
if (_cur.grffile->grf_version >= 7) {
|
if (_cur.grf_version >= 7) {
|
||||||
statspec->cargo_triggers = TranslateRefitMask(buf.ReadDWord());
|
statspec->cargo_triggers = TranslateRefitMask(buf.ReadDWord());
|
||||||
} else {
|
} else {
|
||||||
statspec->cargo_triggers = (CargoTypes)buf.ReadDWord();
|
statspec->cargo_triggers = (CargoTypes)buf.ReadDWord();
|
||||||
|
@ -2878,7 +2879,7 @@ static ChangeInfoResult GlobalVarChangeInfo(uint first, uint last, int prop, Byt
|
||||||
for (uint j = 0; j < SNOW_LINE_DAYS; j++) {
|
for (uint j = 0; j < SNOW_LINE_DAYS; j++) {
|
||||||
uint8_t &level = snow_line->table[i][j];
|
uint8_t &level = snow_line->table[i][j];
|
||||||
level = buf.ReadByte();
|
level = buf.ReadByte();
|
||||||
if (_cur.grffile->grf_version >= 8) {
|
if (_cur.grf_version >= 8) {
|
||||||
if (level != 0xFF) level = level * (1 + _settings_game.construction.map_height_limit) / 256;
|
if (level != 0xFF) level = level * (1 + _settings_game.construction.map_height_limit) / 256;
|
||||||
} else {
|
} else {
|
||||||
if (level >= 128) {
|
if (level >= 128) {
|
||||||
|
@ -3709,7 +3710,7 @@ static ChangeInfoResult IndustriesChangeInfo(uint first, uint last, int prop, By
|
||||||
* Since GRF version 8 the position is interpreted as pair of independent int8.
|
* Since GRF version 8 the position is interpreted as pair of independent int8.
|
||||||
* For GRF version < 8 we need to emulate the old shifting behaviour.
|
* For GRF version < 8 we need to emulate the old shifting behaviour.
|
||||||
*/
|
*/
|
||||||
if (_cur.grffile->grf_version < 8 && it.ti.x < 0) it.ti.y += 1;
|
if (_cur.grf_version < 8 && it.ti.x < 0) it.ti.y += 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4293,7 +4294,7 @@ static ChangeInfoResult RailTypeChangeInfo(uint first, uint last, int prop, Byte
|
||||||
case 0x09: { // Toolbar caption of railtype (sets name as well for backwards compatibility for grf ver < 8)
|
case 0x09: { // Toolbar caption of railtype (sets name as well for backwards compatibility for grf ver < 8)
|
||||||
GRFStringID str{buf.ReadWord()};
|
GRFStringID str{buf.ReadWord()};
|
||||||
AddStringForMapping(str, &rti->strings.toolbar_caption);
|
AddStringForMapping(str, &rti->strings.toolbar_caption);
|
||||||
if (_cur.grffile->grf_version < 8) {
|
if (_cur.grf_version < 8) {
|
||||||
AddStringForMapping(str, &rti->strings.name);
|
AddStringForMapping(str, &rti->strings.name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -5162,7 +5163,7 @@ static const SpriteGroup *GetCallbackResultGroup(uint16_t value)
|
||||||
{
|
{
|
||||||
/* Old style callback results (only valid for version < 8) have the highest byte 0xFF to signify it is a callback result.
|
/* Old style callback results (only valid for version < 8) have the highest byte 0xFF to signify it is a callback result.
|
||||||
* New style ones only have the highest bit set (allows 15-bit results, instead of just 8) */
|
* New style ones only have the highest bit set (allows 15-bit results, instead of just 8) */
|
||||||
if (_cur.grffile->grf_version < 8 && GB(value, 8, 8) == 0xFF) {
|
if (_cur.grf_version < 8 && GB(value, 8, 8) == 0xFF) {
|
||||||
value &= ~0xFF00;
|
value &= ~0xFF00;
|
||||||
} else {
|
} else {
|
||||||
value &= ~0x8000;
|
value &= ~0x8000;
|
||||||
|
@ -6308,7 +6309,7 @@ static void FeatureNewName(ByteReader &buf)
|
||||||
* S data new texts, each of them zero-terminated, after
|
* S data new texts, each of them zero-terminated, after
|
||||||
* which the next name begins. */
|
* which the next name begins. */
|
||||||
|
|
||||||
bool new_scheme = _cur.grffile->grf_version >= 7;
|
bool new_scheme = _cur.grf_version >= 7;
|
||||||
|
|
||||||
uint8_t feature = buf.ReadByte();
|
uint8_t feature = buf.ReadByte();
|
||||||
if (feature >= GSF_END && feature != 0x48) {
|
if (feature >= GSF_END && feature != 0x48) {
|
||||||
|
@ -7064,6 +7065,8 @@ static void ScanInfo(ByteReader &buf)
|
||||||
Debug(grf, 0, "{}: NewGRF \"{}\" (GRFID {:08X}) uses GRF version {}, which is incompatible with this version of OpenTTD.", _cur.grfconfig->filename, StrMakeValid(name), BSWAP32(grfid), grf_version);
|
Debug(grf, 0, "{}: NewGRF \"{}\" (GRFID {:08X}) uses GRF version {}, which is incompatible with this version of OpenTTD.", _cur.grfconfig->filename, StrMakeValid(name), BSWAP32(grfid), grf_version);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_cur.grf_version = grf_version;
|
||||||
|
|
||||||
/* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */
|
/* GRF IDs starting with 0xFF are reserved for internal TTDPatch use */
|
||||||
if (GB(grfid, 0, 8) == 0xFF) SetBit(_cur.grfconfig->flags, GCF_SYSTEM);
|
if (GB(grfid, 0, 8) == 0xFF) SetBit(_cur.grfconfig->flags, GCF_SYSTEM);
|
||||||
|
|
||||||
|
@ -7078,6 +7081,13 @@ static void ScanInfo(ByteReader &buf)
|
||||||
_cur.skip_sprites = -1;
|
_cur.skip_sprites = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Skip Action 0x08 */
|
||||||
|
static void SkipGRFInfo(ByteReader &buf)
|
||||||
|
{
|
||||||
|
/* Even though we are skipping the Action 8 information, we still need to switch to the correct GRF version. */
|
||||||
|
_cur.grf_version = buf.ReadByte();
|
||||||
|
}
|
||||||
|
|
||||||
/* Action 0x08 */
|
/* Action 0x08 */
|
||||||
static void GRFInfo(ByteReader &buf)
|
static void GRFInfo(ByteReader &buf)
|
||||||
{
|
{
|
||||||
|
@ -7102,6 +7112,7 @@ static void GRFInfo(ByteReader &buf)
|
||||||
_cur.grffile->grfid = grfid;
|
_cur.grffile->grfid = grfid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_cur.grf_version = version;
|
||||||
_cur.grffile->grf_version = version;
|
_cur.grffile->grf_version = version;
|
||||||
_cur.grfconfig->status = _cur.stage < GLS_RESERVE ? GCS_INITIALISED : GCS_ACTIVATED;
|
_cur.grfconfig->status = _cur.stage < GLS_RESERVE ? GCS_INITIALISED : GCS_ACTIVATED;
|
||||||
|
|
||||||
|
@ -7226,7 +7237,7 @@ static void GRFLoadError(ByteReader &buf)
|
||||||
uint8_t message_id = buf.ReadByte();
|
uint8_t message_id = buf.ReadByte();
|
||||||
|
|
||||||
/* Skip the error if it isn't valid for the current language. */
|
/* Skip the error if it isn't valid for the current language. */
|
||||||
if (!CheckGrfLangID(lang, _cur.grffile->grf_version)) return;
|
if (!CheckGrfLangID(lang, _cur.grf_version)) return;
|
||||||
|
|
||||||
/* Skip the error until the activation stage unless bit 7 of the severity
|
/* Skip the error until the activation stage unless bit 7 of the severity
|
||||||
* is set. */
|
* is set. */
|
||||||
|
@ -7822,7 +7833,7 @@ static void FeatureTownName(ByteReader &buf)
|
||||||
if (HasBit(id, 7)) {
|
if (HasBit(id, 7)) {
|
||||||
/* Final definition */
|
/* Final definition */
|
||||||
ClrBit(id, 7);
|
ClrBit(id, 7);
|
||||||
bool new_scheme = _cur.grffile->grf_version >= 7;
|
bool new_scheme = _cur.grf_version >= 7;
|
||||||
|
|
||||||
uint8_t lang = buf.ReadByte();
|
uint8_t lang = buf.ReadByte();
|
||||||
StringID style = STR_UNDEFINED;
|
StringID style = STR_UNDEFINED;
|
||||||
|
@ -8139,7 +8150,7 @@ static void TranslateGRFStrings(ByteReader &buf)
|
||||||
* new_scheme has to be true as well, which will also be implicitly the case for version 8
|
* new_scheme has to be true as well, which will also be implicitly the case for version 8
|
||||||
* and higher. A language id of 0x7F will be overridden by a non-generic id, so this will
|
* and higher. A language id of 0x7F will be overridden by a non-generic id, so this will
|
||||||
* not change anything if a string has been provided specifically for this language. */
|
* not change anything if a string has been provided specifically for this language. */
|
||||||
uint8_t language = _cur.grffile->grf_version >= 8 ? buf.ReadByte() : 0x7F;
|
uint8_t language = _cur.grf_version >= 8 ? buf.ReadByte() : 0x7F;
|
||||||
uint8_t num_strings = buf.ReadByte();
|
uint8_t num_strings = buf.ReadByte();
|
||||||
uint16_t first_id = buf.ReadWord();
|
uint16_t first_id = buf.ReadWord();
|
||||||
|
|
||||||
|
@ -9615,7 +9626,7 @@ static void DecodeSpecialSprite(uint8_t *buf, uint num, GrfLoadingStage stage)
|
||||||
/* 0x05 */ { SkipAct5, SkipAct5, SkipAct5, SkipAct5, SkipAct5, GraphicsNew, },
|
/* 0x05 */ { SkipAct5, SkipAct5, SkipAct5, SkipAct5, SkipAct5, GraphicsNew, },
|
||||||
/* 0x06 */ { nullptr, nullptr, nullptr, CfgApply, CfgApply, CfgApply, },
|
/* 0x06 */ { nullptr, nullptr, nullptr, CfgApply, CfgApply, CfgApply, },
|
||||||
/* 0x07 */ { nullptr, nullptr, nullptr, nullptr, SkipIf, SkipIf, },
|
/* 0x07 */ { nullptr, nullptr, nullptr, nullptr, SkipIf, SkipIf, },
|
||||||
/* 0x08 */ { ScanInfo, nullptr, nullptr, GRFInfo, GRFInfo, GRFInfo, },
|
/* 0x08 */ { ScanInfo, SkipGRFInfo, SkipGRFInfo, GRFInfo, GRFInfo, GRFInfo, },
|
||||||
/* 0x09 */ { nullptr, nullptr, nullptr, SkipIf, SkipIf, SkipIf, },
|
/* 0x09 */ { nullptr, nullptr, nullptr, SkipIf, SkipIf, SkipIf, },
|
||||||
/* 0x0A */ { SkipActA, SkipActA, SkipActA, SkipActA, SkipActA, SpriteReplace, },
|
/* 0x0A */ { SkipActA, SkipActA, SkipActA, SkipActA, SkipActA, SpriteReplace, },
|
||||||
/* 0x0B */ { nullptr, nullptr, nullptr, GRFLoadError, GRFLoadError, GRFLoadError, },
|
/* 0x0B */ { nullptr, nullptr, nullptr, GRFLoadError, GRFLoadError, GRFLoadError, },
|
||||||
|
@ -9679,6 +9690,7 @@ static void LoadNewGRFFileFromFile(GRFConfig *config, GrfLoadingStage stage, Spr
|
||||||
{
|
{
|
||||||
_cur.file = &file;
|
_cur.file = &file;
|
||||||
_cur.grfconfig = config;
|
_cur.grfconfig = config;
|
||||||
|
_cur.grf_version = 2;
|
||||||
|
|
||||||
Debug(grf, 2, "LoadNewGRFFile: Reading NewGRF-file '{}'", config->filename);
|
Debug(grf, 2, "LoadNewGRFFile: Reading NewGRF-file '{}'", config->filename);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue