传奇3的WIL文件格式

图像格式有两个文件,WIX索引文件,WIL数据文件

 

 

1、WIX这里有一个条件判断,即第26字节开始取一个Word是否是0xB13A,这是个版本判断,如果不是则文件重定位到第24字节处,否则文件流读了这个Word后位置应该在第28字节处

然后就是依次取图像在数据文件中的位置索引,4个字节一取,DWORD类型,直到WIX文件结束。

 

2、WIL文件信息:根据WIX得到的索引列表在WIL中定位,然后依次取得相应的图像信息

short Width, Height, OffsetX, OffsetY;//图像宽高以及偏移

byte HasShadow;//为1表示有阴影

short ShadowX, ShadowY;//阴影偏移

int Size;//数据包含多少个Word,所以取到的数据要*2

//以上结构共17个字节

 

3、WIL文件图像:描述很难说清楚,还是用代码来说明吧,网上有现成的代码,原版的问题是图像缺行或无法退出,以下是关键过程的修改结果

private byte[][] DecompressWemadeMir3(BinaryReader BReader, short OutputWidth, short OutputHeight, int InputLength)
{
    byte[][] Pixels = new byte[2][];
    Pixels[0] = new byte[OutputWidth * OutputHeight * 2];
    Pixels[1] = new byte[OutputWidth * OutputHeight * 2];
    int n = BReader.ReadInt32();//读取4个字节,并判断是否为0,很关键,没这判断会导致有些图像缺行
    if (n != 0) BReader.BaseStream.Seek(-4, SeekOrigin.Current);
    byte[] FileBytes = BReader.ReadBytes(InputLength * 2);

    int End = 0, OffSet = 0, Start = 0, Count;

    int nX, x = 0;

    for (int Y = OutputHeight - 1; Y >= 0; Y--)
    {
        OffSet = Start * 2;
        End += FileBytes[OffSet+1] << 8 | FileBytes[OffSet];//读取一个Word(原版这里有问题)
        Start++;
        nX = Start;
        OffSet = nX * 2;
        while (nX < End)
        {
            switch (FileBytes[OffSet])
            {
                case 0xC0: //0xC0 No Colour
                    nX += 2;
                    x += FileBytes[OffSet + 3] << 8 | FileBytes[OffSet + 2];
                    OffSet += 4;
                    break;

                case 0xC1:  //Solid Colour
                    nX += 2;
                    Count = FileBytes[OffSet + 3] << 8 | FileBytes[OffSet + 2];
                    OffSet += 4;
                    for (int i = 0; i < Count; i++)
                    {                                    
                        if (x > OutputWidth - 1) continue;
                                                                        
                        Pixels[0][(Y * OutputWidth + x) * 2] = FileBytes[OffSet];
                        Pixels[0][(Y * OutputWidth + x) * 2 + 1] = FileBytes[OffSet + 1];

                        OffSet += 2;
                        x++;
                    }
                    nX += Count;
                    break;

                case 0xC2:  //0xC2 Overlay Colour
                case 0xC3:
                    HasMask = true;
                    nX += 2;
                    Count = FileBytes[OffSet + 3] << 8 | FileBytes[OffSet + 2];
                    OffSet += 4;
                    for (int i = 0; i < Count; i++)
                    {                                    
                        if (x > OutputWidth - 1) continue;
                                                                        
                        for (int j = 0; j < 2; j++)
                        {
                            Pixels[j][(Y * OutputWidth + x) * 2] = FileBytes[OffSet];
                            Pixels[j][(Y * OutputWidth + x) * 2 + 1] = FileBytes[OffSet + 1];                                        
                        }

                        OffSet += 2;
                        x++;
                    }
                    nX += Count;
                    break;
                default:
                    //防止文件格式有误无法退出(正常情况下不会进到这个分支)
                    Y = -2;
                    nX = End;
                    break;
            }
        }
        End++;
        Start = End;
        x = 0;
    }
    return Pixels;
}



原版下载地址https://github.com/WillMcKill/MirRage

你可能感兴趣的:(C#)