MPQ 文件系统完成

基于StormLib, 参考N3的ZipFileSystem实现了一个MpqFileSystem

有一点要注意, 文件路径里不能用'/', 都要用'//' @_@

mpq文件包里的文件是不保存文件名(或目录名)的, 也就是说打包后的文件是不可逆的. 但是在每个文件包的根目录下都有一个(listfile)文件, 里面包含了文件包中的文件名列表

(为什么listfile文件最后有一段空字符串呢???)

没有去实现写入的功能, 虽然StormLib可以添加文件, 不过对于游戏只需要读就可以了

mpq有一点比zip有优势, 那就是可以进行Seek...这样就支持流式的文件加载了.

而且对于wav可以采用特殊的压缩算法来增大压缩率. 不过我对wav没好印象的说...

用XACT可以播放xWMA, 用DirectShow可以播放WMV(我晕, 我怎么又跟着M$混了. 没办法啊, 谁叫fmod之类的商用收费来着)

嗯...写完记得要测试.....(BOSS说这才是专业的一种表现-_-)

//------------------------------------------------------------------------------  
/** 
*/ 
void 
MpqFileSystemTest::Run()  
{  
    Ptr<IoServer> ioServer = IoServer::Create();  
    Ptr<MpqFileSystem> mpqFileSystem = MpqFileSystem::Create();  
    Ptr<MpqArchive> patch2 = mpqFileSystem->Mount("file:///e:/World of Warcraft/Data/patch-2.MPQ");  
    n_assert(patch2.isvalid());  
 const Array<String>& fileList = patch2->GetFileList();  
    n_assert(!fileList.IsEmpty());  
 for (IndexT i = 0; i < fileList.Size(); ++i)  
    {  
        n_printf("%s/n", fileList[i].AsCharPtr());  
    }  
    n_assert(patch2->IsFileExsit("Creature/Ogre/Ogre.M2"));  
    Array<String> spellFiles = patch2->ListFiles("Spells", "*.*");  
 for (IndexT i = 0; i < spellFiles.Size(); ++i)  
    {  
        n_printf("%s/n", spellFiles[i].AsCharPtr());  
    }  
    Array<String> creatureDirs = patch2->ListDirectories("Creature", "*");  
 for (IndexT i = 0; i < creatureDirs.Size(); ++i)  
    {  
        n_printf("%s/n", creatureDirs[i].AsCharPtr());  
    }  
    URI uri = "file:///e:/World of Warcraft/Data/Shaders/Vertex/snowpoint.bls";  
    Ptr<MpqArchive> archive = mpqFileSystem->FindMpqArchiveWithFile(uri);  
    n_assert(archive == patch2);  
    Ptr<MpqFileStream> snowpoint = MpqFileStream::Create();  
    uri = "mpq:///e:/World of Warcraft/Data/patch-2.MPQ?file=Shaders/Vertex/snowpoint.bls";  
    snowpoint->SetURI(uri);  
    snowpoint->Open();  
    Array<char> buffer(snowpoint->GetSize(), 0, 0);  
    snowpoint->Read(&buffer.Front(), snowpoint->GetSize());  
    snowpoint->Close();  
}  

嗯, 为了比较方便, 把文件名都转换成小写了....不过linux下不是大小写区分的么, 那linux程序员写的打包程序会不会也区别文件名的大小写, HOHO~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏生信技能树

rMATS这款差异可变剪切分析软件的使用体验

rMATS最近刚现在出了rMATS 4.0.1版,相比之间的rMATS 3.2.5版,其用C,Python,Cython重写了该软件,运算速度提升了100倍,并...

8194
来自专栏轮子工厂

教你用翻译软件快速阅读大量英文文献

对于一些引用的英文文献,我们需要快速地了解整篇文献讲了什么内容,来判断是否可以作为“国内外研究现状”来进行详细分析。

1664
来自专栏SDNLAB

码农学ODL之Toaster代码解析

Toaster(烤面包机)是OpenDaylight的一个例子,该例子的目的不是让你如何烤面包,而是借这个例子学习OpenDaylight的特性。在Toaste...

3966
来自专栏calmound

知识点提纲

操作系统: 1. 进程的有哪几种状态,状态转换图,及导致转换的事件。 2. 进程与线程的区别。 3. 进程通信的几种方式。 4. 线程同步几种方式。(一定要会写...

3538
来自专栏SDNLAB

SDN实战团分享(七):YANG模型与OpenDaylight南北向接口

YANG模型是什么? YANG模型是一种数据建模语言,用来建模由NETCONF协议、NETCONF远端过程调用(RPCs)、和NETCONF通知(notific...

5178
来自专栏好好学习吧

vim简单使用教程

vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的。下面的文章翻译自《L...

1363
来自专栏吉浦迅科技

在cuda的核函数中可以按地址调用普通变量么?

请问在cuda的核函数中可以按地址调用普通变量么? GPU世界论坛 bbs.gpuworld.cn Hi, 楼主, 完全无问题,从Fermi起引入卡内统...

3737
来自专栏Hongten

在 Excel 工作簿中定义决策表(Oracle Policy Modeling-Define decision tables in Excel workbooks)

要在 Excel 中编写规则,您只需在表中编写规则,并使用 Oracle Policy Modeling 样式标识单元格中的信息类型,

1033
来自专栏游戏杂谈

TexturePacker压缩png的命令

压缩png效果最好的当然是TinyPNG这种神器了,不过一般情况下TexturePacker压缩出来的也基本上能达到效果。

1802
来自专栏吉浦迅科技

DAY20:阅读Surface Memory

2042

扫码关注云+社区