传奇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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值