Quake3不一样的修改——PAK文件深入研究 一个提着火箭炮的书生 Atrax 2000年 第47期   id Software公司的Quake系列是世界上公认的扩展性、自由性、开放性最强的游戏。其实在我看来,Quake早已超越了一个游戏的范畴,应该说它有点像一个3D游戏竞技的标准平台,一个游戏操作系统。你可以在上面开发任何你能想到的3D游戏(有人居然用Quake3引擎开发赛车游戏),而pak文件就是实现这种可能性的重要手段之一。 #1 清楚认识pak文件   pak文件是Quake系列游戏所采用的一种特殊压缩包格式,以利于游戏的开发。由于是针对游戏的设计和使用而采用的文件结构,所以与一般的压缩文件有所不同,它的特点如下:   1.声音,地图,3D模型,材质贴图等文件是按着保留目录路径结构的方式压入pak文件的。   2.pak文件的后缀名在Quake 2里是pak,在Quake 3是pk3。pak包里的文件一般都是零压缩率,不过Quake3中的扩充包是可以含压缩率的。   3.命名有规定,其名字决定其优先级。   使用pak这种文件格式对于游戏的开发者和玩家都有着无与伦比的方便性和可塑性(或者说自定义性)。具体如何实现的,等一下我将举例说明。使用pak包这种形式有几点好处:   1.对于程序开发人员来说资源调用方便,易于管理;   2.由于结构特殊,对初学者有屏蔽作用避免被乱改,对高手却很容易修改,比较方便;   3.所有模式都是利用这个特点做的;   4.pak包被Quake的引擎视为一个目录,能利用外置pak文件的形式进行升级而无需删除原有文件。利于增加效果包,新地图,改进界面,增加model等扩展内容;   5.修改还原便利,文件之间互不影响。   实际上稍有一点软件基础和对操作系统懂一点的人就知道,目录和文件从簇的序列即物理角度观察,唯一的区别是文件的每个簇所包含的指针指向自己文件的下一个簇,而目录簇所包含的指针则指向它里面的文件在硬盘上的地址。像zipmagic就是利用这个原理,可以嵌入到资源管理器里直接把ZIP文件当目录处理。当我用Winzip打开和压缩Quake3的pk3文件,看到里面的文件几乎全是压缩率为零而且含路径信息时,就想到这可能就是一个大的目录,只不过Windows把它识别为一个超大文件,而Quake3的执行程序可以把它识别为一个目录。Quake3好像是一个对用户透明的资源管理器。这与zipmagic直接把ZIP文件当目录处理是一个道理,只不过Quake的pak文件与ZIP文件在格式上稍有不同而已。现在来说说前面提到的零压缩率在这里的作用。如果是零压缩率,那么pk3文件就相当于一个普通的文件夹,Quake3从中读取要调用的文件时只要寻找相应的路径而无须对其解压;如果是非零压缩率,那么还要经过解压缩包这一步骤。但程序把调用文件解出后,应该是放在一个临时文件夹里,所以只是进入游戏时慢了一点,在游戏中并不影响运行速度。 #1 轻松修改pak0.pk3   pk3文件可以用Winzip 8.0打开进行修改,只要最后的修改文件以pk3为后缀名就可以使Quake3正确识别了。由于Winzip是最常用的解压缩工具,下面就以Winzip为例讲一下我改造Quake3里的pak0.pk3文件的过程。   首先,用Winzip8.0找到pak0.pk3里的动画文件,那是几个后缀名为RoQ的巨无霸,当然还有id公司的Logo(我总等不及每次进Quake3时还要看“当当,当,当,当!only you……” 啊,对不起!唱顺嘴儿了^^)。这些文件是以动画文件的形式出现的,所以都以RoQ为后缀名。接着就轮到音乐,都是wav文件,全部删掉。如果你有专用的pak文件浏览器Pakscape,就直接将pak0.pk3里的Music和Video目录删去即可(见^47060302a^1)。因为Winzip是以文件为主体,所以删文件会稍微有些麻烦。可以通过按Size按钮让它以文件大小排序,再寻找大文件(见^47060302b^2)。按目录寻找在这里效率并不高,因为pak0.pk3里有上千个文件,找起来很麻烦。   说到这里有必要介绍一下pak0.pk3里每个目录的内容是什么,以便于大家进行取舍:   1.botfiles机器人的文件,设定机器人的AI,对枪的喜好,聊天的内容等。   2.demos Quake3的录像文件,建议留下,可以测系统速度。   3.env 地图里用的环境图片,主要是太空里的,但怎么看怎么都是Quake2里直接拿过来用的,id真懒。   4.gfx主要是准星、数字、血花、武器的弹药的材质等图片。   5.icons 各种武器的图标等。   6.levelshots地图的图片,在建立游戏时的地图选单里用来预览的。   7.maps地图以及bot的导航文件。   8.menu主界面里的按钮和菜单的图片。   9.models bot的3D模型文件。   10.music音乐。   11.scripts游戏的参数文件,如地图的列表和机器人的属性描写文件。各种特效的描述文件。   12.sound声音。   13.sprites不知道为什么要在这里放上五张图片:(   14.textures 材质图片,就是我们看到的墙壁、天花板/跳板等等一大堆贴图。   15.video Quake3里的动画。   16.vm定义Quake3的界面,比较深奥。   值得删除的有地图文件。在maps下的bsp文件就是地图文件,这与Quake2的地图文件是一样的,可惜不能通用(多新鲜呐!)。还有很多与bsp文件一一对应的.aas文件,好熟悉是不是?Quake2里有个著名的机器人程序gladiator,它的作者Mr.Exclusive被id Software专门请去做Quake3的bots。所以在他的gladiator和Quake3里都有aas文件,这是bots的导航文件,指导bot在地图里应该如何走。删掉q3dm0-q3dm3,q3tourney1这些地图。   大手术结束后,pak0.pk3从457MB变为172MB!删除那些地图是因为它们太烂,我是不会去打的,在它们上也不会有好demo,留着没用。本来我只想保留q3t2,q3dm6,q3dm13,q3t4这四张地图的(我的Quake2就只有q3dm1,q3dm3,q3dm6,ztndm2,ztndm3,pstrip六张地图),不过考虑到网上有许多Quake3服务器还用其它地图,所以就不敢删得太多了。   有一点大家千万注意,就是用Winzip修改pk3时,是将文件全部先解压放在其工作目录后,再根据你的要求删除,然后把剩下的文件打包,再覆盖原有文件。所以你的工作目录一定要有300多兆的剩余空间用来做虚拟内存。   可以看出,合理的删减pak0.pk3文件可以节约将近300MB空间,且完全不影响游戏。 #1  自己动手做效果包,补充包   Quake3的pk3文件由于是用Winzip打开,故创建自己的pk3文件与修改pak文件不同。由于pk3文件内的文件都要求有自己的目录结构,故打包时需要带相对路径。一般我是按目录结构先放置好我的一批文件,全部选取后再用右键点击它们,在弹出的快捷菜单中选择add to zip选项即可。加入某个已有的pk3包也不失为一个好办法。   会做pk3包后就要开始做自己的扩充包了,举几个例子,权当抛砖引玉。   例一,Quake大赛推出了q3dm13,q3dm6的修改版(也叫tmp版),还有日趋流行的ZTNDM1、pro mode下的q3jdm8a等地图,它们平时都是零乱地以cpldm6.pk3,cpldm13.pk3,ztn3dm1.pk3等形式单独地放在baseq3目录下,随着各种效果包、补充地图的增多,管理起来很不方便。于是我就将他们从各自的pk3文件里取出,解压到同一目录里,再打成一个名为maps.pk3的包,看起来清爽多了。这属于地图补充包。   例二,每次调用最常玩的dm13、dm6、t2、t4很麻烦,要选半天。在pak0.pk3里有一个scripts目录,里面有一个arenas.txt文件。它记载了每张地图是哪种模式,缺省的bots是谁,在地图选单里的出现顺序是怎样。修改它就可以解决这个问题。下面我以其中的一段t4的描述字段为例介绍一下:   {//以大括号为起始   map “q3tourney4” //地图名,即必须有q3tourney4.bsp文件在maps/下   bots “anarki” //用这张地图时缺省加入机器人,要加其他的bot写他的名字即可,用空格隔开   longname “Vertical Vengeance” //地图的名字,这个可以随便乱取   timelimit 10 //   fraglimit 0 //   type“single ffa tourney”//地图支持的游戏模式,你可以把q3dm17加到tourney模式里,专练railgun   }   你只要将常用地图的描述字段放到该文件的前面,每次进地图选单时它们就会出现在最前面了。如果要做一张地图,以pk3形式给别人用,那么在pk3文件里的scripts目录下就要建立一个XXX.arena文件——XXX为地图文件名。它是一个文本文件,里面写入这个文件的描述字段。如果有多张地图的话,可以不止一段。以后再进游戏,在第一级选单里就可选地图了。   例三,用例二可加入一些原来在地图选单里看不见的地图,但是有些地图包只给了地图文件和描述文件,在地图选单里却没有可以预览的图片。解决这个问题就要回顾一下前面提到的levelshots目录了。在英语里,往往不用“map”而用“level”来代表地图,levelshots/下都是各张地图的预览图片。它们都是128×128 16M色也称为24bit色的jpg图片。但根据我的实验,发现只要是jpg图片,不管多大都可以用。   要做一张预览图片,首先要用Ultraedit打开q3config.cfg文件(因为它是Unix下的文本,只有用Ultraedit才能正常打开),将一个键设定为抓图键,如bind F12“"screenshot”。进入游戏后在地图里,以旁观者模式选一个好角度,按F12即可抓一张图。 #1  抓图时要注意:   1.在抓图前,把所有的图像参数设置设为最高,这样抓出来的图片才好看;   2.在Console里用“cg_draw2d 0”命令清除屏幕上的多余显示,如果你是在游戏模式下还要用“cg_drawgun 0”来消除枪的显示。当然也可以在q3config.cfg里用bind F5“toggle cg_drawgun”和bind F6“toggle cg_draw2d”来简化这些操作。toggle的意思是在只有0,1两值时切换到另一值,按一下是1,再按一下是0。   3.当用“screenshot”连续抓图时,图片以shot0000.TGA,shot0001.TGA……的形式存放在游戏时所用mod的目录screenshots下,如在pro mode下抓图则在Quake3 arena/pro/screenshots/下。   4.当前Quake3的图像设置决定抓出的图片格式,也就是说如果是在32bit色,1024×768下抓的图则所得图片也是这个格式。   另外,大家特别要注意的是,千万不要用Photoshop的save as a copy命令将TGA图转为jpg格式,而必须用Acdsee在浏览器模式下的tools→convert来转换为jpg图。得到所需的正确格式的jpg图片后,将其更名为你所希望代表的地图的名字。只要将其放到pk3文件的levelshots/目录下即可。(见^47060302c^3)   四张最常用地图已经存在tournament的第一面;地图预览图片加上了“我爱QⅢ”的字样;如果是像我那样修改已有的预览图片的话,由于修改图片后,Photoshop会自动加一个layer(层)以记载改动的结果,所以在存盘前一定要将原有的layer和后来Photoshop加上这个layer合并才可存为其它所需的格式。用菜单中的layer→merge layers或“Ctrl+E”完成合并步骤;准星在“Ⅲ”之上。   例四,改Console里的背景。方法同上,改pak0.pk3里的/gfx/misc/console01.tga即可。   例五,自己做准星。准星是在pak0.pk3文件里的/gfx/2d/目录下的crosshaira.TGA——crosshairj.TGA。它们是32×32的32bit即16M+色的TGA格式的图片。它们的大小其实并没有限制,只要准星在正中即可。TGA图片分为两种,一种是前面的普通的TGA图片,只有RGB三个8bit色彩通道,即24bit色;另一种就是准星的TGA,有三个8位色彩通道和一个8位alpha通道,共32bit。在pak0.pk3里有很多图片如icons/目录下的就是后一种格式的TGA图片。Quake3就是利用那个多出来的alpha通道来确定准星形状。如果直接用Acdsee来看则都是一个个白色的方块,因为它无法将alpha通道单独显示出来。   先以改造为例。任取一个准星文件如crosshaira.TGA,用Photoshop打开。选取菜单中的windows→show layers到show actions里任意一项,唤出一个子窗口,暂称为channel窗口。选择其上的channel标签,即可看到RGB和alpha通道了。要显示alpha通道里的图形,只要在alpha通道前的小方格内点击一下即可,此时会在方格内出现一只眼睛的图案,而图片底色变为浅红,白色准星图案显出。但这只是显示,只有点击alpha通道使之变为蓝底后,才可编辑alpha通道里的图形。RGB通道决定颜色,alpha通道决定形状。现在你可以发挥你的想象力,做出你自己喜欢的准星啦!   如果已有TGA图片,可是缺乏alpha通道,则只要在channel窗口里点击最下面的一个像折了一角的书的按钮就可以添加一个alpha通道了(它的右边是一个垃圾箱样的图标)。   完成的图片应为TGA格式,如果做了修改后Photoshop不允许存为原有的TGA格式而是要求存为PSD格式,则是由于修改导致了一个新layer的产生,解决方法见例三里最后四个条款里的第三条。将最终图片放回pk3文件里的/gfx/2d/下即可,我建议还是做一个新的pk3,这样可以避免每次修改试用准星还要把pak0.pk3重新打一次包。   准星颜色我推荐用亮绿色,在周围景物中很明显,效果不错。