Changeset - r25976:4cb7d4539ceb
[Not reviewed]
master
0 1 0
PeterN - 3 years ago 2021-09-19 20:52:08
peter1138@openttd.org
Fix #9562: Handle case of invalid action2 with zero results. (#9564)
1 file changed with 5 insertions and 0 deletions:
0 comments (0 inline, 0 general)
src/newgrf.cpp
Show inline comments
 
@@ -5147,48 +5147,53 @@ static void NewSpriteGroup(ByteReader *b
 
			switch (feature) {
 
				case GSF_TRAINS:
 
				case GSF_ROADVEHICLES:
 
				case GSF_SHIPS:
 
				case GSF_AIRCRAFT:
 
				case GSF_STATIONS:
 
				case GSF_CANALS:
 
				case GSF_CARGOES:
 
				case GSF_AIRPORTS:
 
				case GSF_RAILTYPES:
 
				case GSF_ROADTYPES:
 
				case GSF_TRAMTYPES:
 
				{
 
					byte num_loaded  = type;
 
					byte num_loading = buf->ReadByte();
 

	
 
					if (!_cur.HasValidSpriteSets(feature)) {
 
						grfmsg(0, "NewSpriteGroup: No sprite set to work on! Skipping");
 
						return;
 
					}
 

	
 
					grfmsg(6, "NewSpriteGroup: New SpriteGroup 0x%02X, %u loaded, %u loading",
 
							setid, num_loaded, num_loading);
 

	
 
					if (num_loaded + num_loading == 0) {
 
						grfmsg(1, "NewSpriteGroup: no result, skipping invalid RealSpriteGroup");
 
						break;
 
					}
 

	
 
					if (num_loaded + num_loading == 1) {
 
						/* Avoid creating 'Real' sprite group if only one option. */
 
						uint16 spriteid = buf->ReadWord();
 
						act_group = CreateGroupFromGroupID(feature, setid, type, spriteid);
 
						grfmsg(8, "NewSpriteGroup: one result, skipping RealSpriteGroup = subset %u", spriteid);
 
						break;
 
					}
 

	
 
					std::vector<uint16> loaded;
 
					std::vector<uint16> loading;
 

	
 
					for (uint i = 0; i < num_loaded; i++) {
 
						loaded.push_back(buf->ReadWord());
 
						grfmsg(8, "NewSpriteGroup: + rg->loaded[%i]  = subset %u", i, loaded[i]);
 
					}
 

	
 
					for (uint i = 0; i < num_loading; i++) {
 
						loading.push_back(buf->ReadWord());
 
						grfmsg(8, "NewSpriteGroup: + rg->loading[%i] = subset %u", i, loading[i]);
 
					}
 

	
 
					if (std::adjacent_find(loaded.begin(),  loaded.end(),  std::not_equal_to<>()) == loaded.end() &&
 
						std::adjacent_find(loading.begin(), loading.end(), std::not_equal_to<>()) == loading.end() &&
 
						loaded[0] == loading[0])
0 comments (0 inline, 0 general)