浏览代码

Fixed https://bugs.vcmi.eu/view.php?id=2928

AlexVinS 7 年之前
父节点
当前提交
cac83379f5
共有 1 个文件被更改,包括 31 次插入18 次删除
  1. 31 18
      client/gui/CAnimation.cpp

+ 31 - 18
client/gui/CAnimation.cpp

@@ -423,18 +423,31 @@ void CDefFile::loadFrame(size_t frame, size_t group, ImageLoader &loader) const
 	sprite.topMargin = read_le_u32(&sd.topMargin);
 
 	ui32 currentOffset = sizeof(SSpriteDef);
-	ui32 BaseOffset =    sizeof(SSpriteDef);
+
+	//special case for some "old" format defs (SGTWMTA.DEF and SGTWMTB.DEF)
+
+	if(sprite.format == 1 && sprite.width > sprite.fullWidth && sprite.height > sprite.fullHeight)
+	{
+		sprite.leftMargin = 0;
+		sprite.topMargin = 0;
+		sprite.width = sprite.fullWidth;
+		sprite.height = sprite.fullHeight;
+
+		currentOffset -= 16;
+	}
+
+	const ui32 BaseOffset = currentOffset;
 
 	loader.init(Point(sprite.width, sprite.height),
 	            Point(sprite.leftMargin, sprite.topMargin),
 	            Point(sprite.fullWidth, sprite.fullHeight), palette.get());
 
-	switch (sprite.format)
+	switch(sprite.format)
 	{
 	case 0:
 		{
 			//pixel data is not compressed, copy data to surface
-			for (ui32 i=0; i<sprite.height; i++)
+			for(ui32 i=0; i<sprite.height; i++)
 			{
 				loader.Load(sprite.width, FDef + currentOffset);
 				currentOffset += sprite.width;
@@ -448,25 +461,25 @@ void CDefFile::loadFrame(size_t frame, size_t group, ImageLoader &loader) const
 			const ui32 * RWEntriesLoc = reinterpret_cast<const ui32 *>(FDef+currentOffset);
 			currentOffset += sizeof(ui32) * sprite.height;
 
-			for (ui32 i=0; i<sprite.height; i++)
+			for(ui32 i=0; i<sprite.height; i++)
 			{
 				//get position of the line
 				currentOffset=BaseOffset + read_le_u32(RWEntriesLoc + i);
 				ui32 TotalRowLength = 0;
 
-				while (TotalRowLength<sprite.width)
+				while(TotalRowLength<sprite.width)
 				{
-					ui8 type=FDef[currentOffset++];
-					ui32 length=FDef[currentOffset++] + 1;
+					ui8 segmentType = FDef[currentOffset++];
+					ui32 length = FDef[currentOffset++] + 1;
 
-					if (type==0xFF)//Raw data
+					if(segmentType==0xFF)//Raw data
 					{
 						loader.Load(length, FDef + currentOffset);
 						currentOffset+=length;
 					}
 					else// RLE
 					{
-						loader.Load(length, type);
+						loader.Load(length, segmentType);
 					}
 					TotalRowLength += length;
 				}
@@ -479,17 +492,17 @@ void CDefFile::loadFrame(size_t frame, size_t group, ImageLoader &loader) const
 		{
 			currentOffset = BaseOffset + read_le_u16(FDef + BaseOffset);
 
-			for (ui32 i=0; i<sprite.height; i++)
+			for(ui32 i=0; i<sprite.height; i++)
 			{
 				ui32 TotalRowLength=0;
 
-				while (TotalRowLength<sprite.width)
+				while(TotalRowLength<sprite.width)
 				{
-					ui8 SegmentType=FDef[currentOffset++];
-					ui8 code = SegmentType / 32;
-					ui8 length = (SegmentType & 31) + 1;
+					ui8 segment=FDef[currentOffset++];
+					ui8 code = segment / 32;
+					ui8 length = (segment & 31) + 1;
 
-					if (code==7)//Raw data
+					if(code==7)//Raw data
 					{
 						loader.Load(length, FDef + currentOffset);
 						currentOffset += length;
@@ -506,18 +519,18 @@ void CDefFile::loadFrame(size_t frame, size_t group, ImageLoader &loader) const
 		}
 	case 3:
 		{
-			for (ui32 i=0; i<sprite.height; i++)
+			for(ui32 i=0; i<sprite.height; i++)
 			{
 				currentOffset = BaseOffset + read_le_u16(FDef + BaseOffset+i*2*(sprite.width/32));
 				ui32 TotalRowLength=0;
 
-				while (TotalRowLength<sprite.width)
+				while(TotalRowLength<sprite.width)
 				{
 					ui8 segment = FDef[currentOffset++];
 					ui8 code = segment / 32;
 					ui8 length = (segment & 31) + 1;
 
-					if (code==7)//Raw data
+					if(code==7)//Raw data
 					{
 						loader.Load(length, FDef + currentOffset);
 						currentOffset += length;