3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 3625|回复: 0
打印 上一主题 下一主题

[资料] 植物大战僵尸pak文件打、解包代码 (看到有人求,就发出来了)

[复制链接]

0

主题

94

帖子

185

积分

中级玩家

Rank: 3Rank: 3

贡献度
17
金元
1174
积分
185
精华
0
注册时间
2008-7-22
QQ
跳转到指定楼层
主题
发表于 2010-3-27 21:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//pak打包
BOOL CFilePak:opPak(const char* szPakFile, const char* szSrcDir)
{
        if(!GetFileList(szSrcDir))
                return FALSE;
        
        CFile f;
        if(!f.Open(szPakFile,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
                return FALSE;

        DWORD dwMagic = 0xBAC04AC0;
        DWORD dwVersion = 0x0;

        Write(&f,&dwMagic,sizeof(dwMagic));
        Write(&f,&dwVersion,sizeof(dwVersion));

        int abc = m_FileList.size();
        for(int i=0;i<m_FileList.size();i++)
        {
                BYTE     uFlags;                //0x0代表正常 0x80(FILEFLAGS_END)代表文件尾
                BYTE     uNameWidth;        //文件名长度
                char*    Name;                        //文件名
                int      SrcSize;                //文件大小
                FILETIME ftFileTime;        //文件时间

                uFlags = 0x0;
                uNameWidth = strlen(m_FileList.szFileName) - strlen(szSrcDir) - 1;
                SrcSize = m_FileList.dwFileSize;
                Name = m_FileList.szFileName;
                Name += strlen(szSrcDir)+1;
                memcpy(&ftFileTime,&m_FileList.ftFileTime,sizeof(ftFileTime));

                Write(&f,&uFlags,sizeof(uFlags));
                Write(&f,&uNameWidth,sizeof(uNameWidth));
                Write(&f,Name,strlen(Name));
                Write(&f,&SrcSize,sizeof(SrcSize));
                Write(&f,&ftFileTime,sizeof(ftFileTime));
        }
        BYTE uFlags = 0x80;                        //FILEFLAGS_END  代表数据结构结尾后边跟的就都是正常的文件数据
        Write(&f,&uFlags,sizeof(uFlags));

        UINT  dwReaded = 0;
        BYTE* pData = new BYTE[102400];
        if(pData == NULL)
        {
                f.Close();
                return FALSE;
        }
        
        for(int j=0;j<m_FileList.size();j++)
        {
                CFile fr;
                if(!fr.Open(m_FileList[j].szFileName,CFile::modeRead|CFile::typeBinary))
                        continue;
               
                while(dwReaded = fr.Read(pData,102400))
                {
                        Write(&f,pData,dwReaded);
                }
                fr.Close();
        }
        delete pData;
        f.Close();

        return TRUE;
}

//pak解包
BOOL CFilePak:opUnPak(const char* szPakFile, const char* szDestDir)
{
        if(!gPakInterface->AddPakFile(szPakFile))
        {
                return FALSE;
        }
        
        std::string aDestDir = szDestDir;
        if(aDestDir[aDestDir.size()] != '')
                aDestDir += "";

        if(aDestDir != "")
                MkDir(aDestDir);
        
        PakRecordMap::iterator map_itr = gPakInterface->mPakRecordMap.begin();
        for( ; map_itr != gPakInterface->mPakRecordMap.end(); map_itr++)
        {
                if(Upper(map_itr->second.mFileName) == Upper(szPakFile))
                        continue;
               
                std::string aFileDest = aDestDir + map_itr->second.mFileName;
                MkDir(GetFileDir(aFileDest,false));
               
                FILE* anOutputFile = fopen(aFileDest.c_str(), "wb");
                if(anOutputFile)
                {
                        PFILE aPFP;
                        aPFP.mRecord = &map_itr->second;
                        aPFP.mPos = 0;
                        aPFP.mFP = NULL;
                        
                        BYTE aReadByte;
                        while(aPFP.mPos < map_itr->second.mSize && gPakInterface->FRead(&aReadByte, 1,1, &aPFP))
                        {
                                fwrite(&aReadByte, 1, 1, anOutputFile);
                        }
                        
                        fclose(anOutputFile);
                }
        }

        return TRUE;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|3DMGAME ( 京ICP备14006952号-1  沪公网安备 31011202006753号

GMT+8, 2026-5-20 07:52 , Processed in 0.032743 second(s), 15 queries , Memcached On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表