changeset 19458:5d518ba60a40 draft

(svn r24361) -Fix [FS#5227] (r22926): Apparently ext. A1 did not work at all. (Hirundo)
author frosch <frosch@openttd.org>
date Fri, 29 Jun 2012 15:38:41 +0000
parents 4091ba731d80
children 8f8d8ebde9c1
files src/newgrf.cpp
diffstat 1 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -4367,11 +4367,13 @@
 /* Action 0x01 */
 static void NewSpriteSet(ByteReader *buf)
 {
-	/* <01> <feature> <num-sets> <num-ent>
+	/* Basic format:    <01> <feature> <num-sets> <num-ent>
+	 * Extended format: <01> <feature> 00 <first-set> <num-sets> <num-ent>
 	 *
 	 * B feature       feature to define sprites for
 	 *                 0, 1, 2, 3: veh-type, 4: train stations
-	 * B num-sets      number of sprite sets
+	 * E first-set     first sprite set to define
+	 * B num-sets      number of sprite sets (extended byte in extended format)
 	 * E num-ent       how many entries per sprite set
 	 *                 For vehicles, this is the number of different
 	 *                         vehicle directions in each sprite set
@@ -4379,11 +4381,11 @@
 	 *                         In that case, use num-dirs=4.
 	 */
 
-	uint8 feature   = buf->ReadByte();
-	uint8 num_sets  = buf->ReadByte();
+	uint8  feature   = buf->ReadByte();
+	uint16 num_sets  = buf->ReadByte();
 	uint16 first_set = 0;
 
-	if (num_sets == 0 && buf->HasData(2)) {
+	if (num_sets == 0 && buf->HasData(3)) {
 		/* Extended Action1 format.
 		 * Some GRFs define zero sets of zero sprites, though there is actually no use in that. Ignore them. */
 		first_set = buf->ReadExtendedByte();
@@ -4407,7 +4409,15 @@
 static void SkipAct1(ByteReader *buf)
 {
 	buf->ReadByte();
-	uint8 num_sets  = buf->ReadByte();
+	uint16 num_sets  = buf->ReadByte();
+	uint16 first_set = 0;
+
+	if (num_sets == 0 && buf->HasData(3)) {
+		/* Extended Action1 format.
+		 * Some GRFs define zero sets of zero sprites, though there is actually no use in that. Ignore them. */
+		first_set = buf->ReadExtendedByte();
+		num_sets = buf->ReadExtendedByte();
+	}
 	uint16 num_ents = buf->ReadExtendedByte();
 
 	_cur.skip_sprites = num_sets * num_ents;