什么是自动化测试脚本化

→ 星际争霸2技术:单位脚本提取成功 大众化修改让游戏未来无限可能
星际争霸2技术:单位脚本提取成功 大众化修改让游戏未来无限可能
日期:2010年3月23日 编辑:
先自我介绍一下,我是来自于www.Ra3.cn命令与征服战略中心的CYC,现在担任模组工作室版主,在C&am CMOD界也算是小有名气,专职于红色警戒3模组&am 地图制作。 近期喜闻SC2终于BETA测试,作为一名星际争霸的老爱好者,我便兴致勃勃地研究了一下星际争霸2beta的内部文件。 惊喜地发现星际争霸2没有大量的加密措施,整个游戏的设定都是开放式的,但是目前本人还没有获得BetaKey,所以只能在以下文件中找到一些蛛丝马迹。 脚本语言&am 风格概述: 不能说星际争霸2完全放弃了魔兽3的c语言编译模式,毕竟暴雪还保留了一些类似java的语言。 也许是因为现任星际争霸2首席设计师Dustin早年参与开发过EA旗下的命令与征服:红色警戒2以及命令与征服:将军,还有魔戒中土大战系列。即使Dustin口称没有把一点点西木和EA的风格带入星际争霸的,但是无论从星际争霸2的模型、理念以及地图设计,乃至代码的语言及编写风格都和Sage引擎游戏颇为相似(Sage,Strategy Action Game Engine,战略动作游戏引擎,为西木开发,现为EA使用)。 xml语言以及单位代码集成在一个文件里的编写习惯使编写过将军mod和红色警戒3mod的modder们不免感到一丝亲切。 接下来让我们从代码粗略地了解一下星际争霸2的游戏架构: 1.单位代码段 所有的单位代码都集中在Unit.xml中,每段单位代码都有严谨的排列。 我们举最熟悉的单位马林(陆战队)来一睹星际2代码的风采。(代码略) 评价: 也许普通玩家看到之后会不寒而栗,但是我想职业的modder们一定认为这不算什么。 与命令与征服3的单位代码相比较,暴雪将逻辑性的代码集中在一起,包括建造时间,生命值,人口等,而将单位模型、动作集中到另一个xml中(待会会解析)。与C&am C3的将逻辑和单位技能以及单位模型绘制代码集成到一个文件中的繁琐度相比,暴雪的代码也许更加人性化,然而还有一个缺点,不如将每一个单位以独立的文件存在,而不是统统在一个文件里。 分析: LifeStart value=45/这里是指初始生命值? LifeMax value=45/这里是指最大生命值? LifeArmorName value=Unit/LifeArmorName/TerranInfantryArmor/这里定义了陆战队的装甲。 Speed value=2.25/这里定义了速度...... 然而最令人兴奋的是,星际2可能还有魔兽争霸中经验值升级的功能: KillXP value=10/可能意味着在某张正式版的地图中,杀死一个陆战队你将获得10点经验值! 2.武器&am 装甲以及升级&am 技能 武器定义在WeaponData.xml文件中,其他可以以此类推 我们可以列举一段SCV的焊人武器 CWeaponLegacy id=SCV EditorCategories value=Race:Terra quot;/ Icon value=A ets\Textures\btn-upgrade-terran-infantryweapo level1.dd quot;/ TargetFilters value=Ground,Visible;Mi ile,Stasis,Dead,Hidden,Invulnerable/ Range value=0.1/ Period value=1.5/ Optio index=Melee value=1/ /CWeaponLegacy 可以看到,SC2的武器定义还是很简单的,也就是说,还有很大的扩展空间,我们可以试着在正式版中进行修改,创建自己的武器。 3.模型绘制代码&am 特效 我们知道,为了使星际2成为一款大众化的竞技游戏,暴雪不惜牺牲了这款游戏的画质,我们究竟是要理解暴雪还是谩骂暴雪跳票半年出品的居然是这么一款画质平平的游戏? 我想我们应该给予理解。 模型代码都集中在Model.xml中,特效都集中在Effectdata.xml中 我们还是来看看陆战队的绘制部分吧。(代码略) 首先映入眼帘的并不是马林的主要绘图部分,而是马林的全部四种死亡动画,分别为普通死亡,腐蚀死亡,爆炸死亡以及燃烧死亡,由此可见暴雪在死亡动画上做的还是比较细致的,作为同类游戏的C&am C3以及Ra3的步兵死亡动画仅仅是以骨骼动画的扭动来完成。而在SC2中,我们相比已经看到血腥真实的死亡动画(光电会不会河蟹呢?) 抱歉,貌似我还漏了两种--触目惊心!被吃掉死亡?!还有剔骨死亡!!? 看来暴雪真是改不了从暗黑、星际1开始的重口味。(战锤40K内牛满面) 来看看正文部分。(代码略) 似乎整个模型以及动作都集中在一个m3格式的模型文件中,与C&am C繁多的步兵皮肤模型&am 骨骼动画大不相同,详细信息还是要等正式版发布才能知道。 粒子效果 从红警3的xml来看,EA在粒子效果上的功夫下得很深,这同时也带来了高画质游戏的低普及,然而暴雪用简洁的粒子效果来告诉我们什么是为竞技而生的游戏。(代码略) 不要被这些长段子蒙蔽了双眼,这个是战斗巡洋舰死亡模型,伴随的粒子效果都是通用的人族粒子效果,也就是说是粒子效果的组合,而游戏中的表现也显得不是那么震撼,冲击波的光环也只是一根圆线......
我只能希望暴雪能做得再好一点。 4.水面效果 相信很多玩家都为红色警戒3的水面而惊奇诧异,纵使整个ra3充满玩具,它的水面仍然是2008年最出彩的RTS游戏的水面。
与此同时,暴雪的SC2又招来了失望的声音。 今天我特地拜访了一下Water.xml,结果令我出乎意料。红色警戒3的水面的修改自由度很低,只能通过修改一些屈指可数的贴图来换取一些变化不大的效果, 而星际争霸2则能够自由的设置反射度,颜色,亮度,乃至高光程度,所以我们完全可以设置一个游泳池甚至岩浆,仅仅依靠修改代码。 总结: 一个游戏的生命力不在于它的竞技性,而在于它的扩展性,它的修改自由度。 星际争霸现在的火热程度远不如有着强大编辑器功能以及上千地图的魔兽争霸3,红色警戒3英雄连等高画质而加密度较高的游戏的模组制作门槛太高,致使其成为冷门作品。 而当我们吐槽星际2的画面时,我们有没有想过,这不仅意味着游戏的大众化,更意味着修改的大众化,DIY的大众化...... 有人说星际2会失败,而我却相信星际2会有一个无限的未来!。
(出处:)
[快来发表你的感想] 相关新闻推荐
2010-11-18 下午 03:28:55
2010-11-17 上午 11:36:13
2010-11-15 上午 11:35:43
2010-11-9 下午 03:58:00
2010-11-9 下午 03:06:44
相关资源推荐
大小:2109 MB/网评:9.1分/人气:123744次
大小:7352 MB/网评:8.9分/人气:4254次
大小:2240 MB/网评:9.1分/人气:6863次
大小:24 MB/网评:4.4分/人气:1992次
大小:2 MB/网评:6.7分/人气:1614次
百度搜索推广 :
图文资讯
精彩图片 本周热
CopyRight2004年-2010年
YXdown.Com 游迅网
All Rights Reserved
备案编号:湘ICP备05007895号您好,欢迎您 或者
> 5. 初始化脚本 运行级别 rc-update的工作 配置服务 书写初始化脚本
5. 初始化脚本 运行级别 rc-update的工作 配置服务 书写初始化脚本
[更新时间]2008-03-05 17:19:22 [字数]10049
Gentoo使用一种特殊的初始化脚本格式,这种格式允许依赖性检查和虚拟初始化。这个章节解释了所有的这些方面,并解释了怎样处理这些脚本。
5. 初始化脚本
运行级别
启动你的系统 当你启动你的系统时,你会发现有很多的文字信息输出。如果你仔细观察的话,你会发现这些文字信息每次启动时都一样。这些动作的顺序称作为
启动顺序
,并且差不多是固定的。 首先,你的启动程序会加载你在启动程序配置文件中定义的内核镜像到内存中,当然这是在CPU运行内核之后。当内核加载和运行后,它初始化所有内核相关的相关工作,并开始进程
。 这个进程然后确认所有的文件系统(在
/etc/fstab
)中定义的)已经挂载准备使用了。然后它会执行在
/etc/init.d
里几个脚本,这些脚本按照顺序启动了你需要的一些服务,使得系统成功启动。 最后,所有的脚本执行后,
激活终端(绝大多数情况下是一些虚拟终端,可以用
等激活)并附加了一个叫做
的特殊进程。这个进程将确保你可以通过运行
来从这些终端登录。
初始化脚本 现在
不会随机的执行
/etc/init.d
里的脚本,甚至不会执行
/etc/init.d
里的所有脚本。它只执行那些让它执行的脚本。这些是由
/etc/runlevels
来决定要执行的脚本。 首先,
运行所有
/etc/init.d
里链接到
/etc/runlevels/boot
的脚本。通常情况下,它会***字母顺序执行这些脚本,但是有些脚本有依赖性,它们会告诉系统另外的一个脚本必须在它们之前运行。 当所有
/etc/runlevels/boot
所指向的脚本已经运行,
继续运行和
/etc/runlevels/default
有符号链接的脚本。同样,它会按照字母顺序执行这些脚本,除非一个脚本有依赖性并提供了一个准确的启动顺序。
Init是怎样工作的? 当然
不会自己决定一切,它需要一个给它指定行为的配置文件,这个配置文件就是
/etc/inittab
。 如果你还记得我们前面刚解释的启动顺序,你会记得
首先要做的是挂载所有的文件系统。这个是由
/etc/inittab
里的下面一行定义的:
代码 1: /etc/inittab里的系统初始化行
si::sysinit:/ in/rc sysinit 这一行告诉
必须去执行
/ in/rc
sysinit
来初始化系统。
/ in/rc
脚本是用来负责初始化的,因此你可能认为
并没有什么可做的,实际上它只不过将初始化系统的任务交付给了另外一个进程。 其次,
执行所有和
/etc/runlevels/boot
有符号链接的脚本,这个是由下面一行定义的:
代码 2: 系统初始化,继续
rc::bootwait:/ in/rc boot 同样,脚本
来执行必要的工作。注意到给
的参数(
)就是
/etc/runlevels
中要使用到的子文件夹。 然后
继续检查它的配置文件,看看还有什么需要
runlevel
来运行的。要决定这个,它将会读入
/etc/inittab
里的下面一行:
代码 3: initdefault行
id:3:initdefault: 在这种情况下(绝大部分Gentoo用户将使用的),
runlevel
的级别为3。根据这个信息,
会查看启动
runlevel
需要运行哪些程序:
代码 4: 运行级别的定义
l0:0:wait:/ in/rc shutdown
l1:S1:wait:/ in/rc single
l2:2:wait:/ in/rc nonetwork
l3:3:wait:/ in/rc default
l4:4:wait:/ in/rc default
l5:5:wait:/ in/rc default
l6:6:wait:/ in/rc reboot 定义了级别3的行再一次掉用了
脚本来开始这些服务(现在使用参数
default
)。同样我们也注意到
使用的参数是
/etc/runlevels
里我们要用到的子文件夹。 当
完成后,
将会决定要激活什么虚拟终端和对每个终端运行什么程序:
代码 5: 虚拟终端的定义
c1:12345:re awn:/ in/agetty 38400 tty1 linux
c2:12345:re awn:/ in/agetty 38400 tty2 linux
c3:12345:re awn:/ in/agetty 38400 tty3 linux
c4:12345:re awn:/ in/agetty 38400 tty4 linux
c5:12345:re awn:/ in/agetty 38400 tty5 linux
c6:12345:re awn:/ in/agetty 38400 tty6 linux
什么是运行级别? 你应该注意到
使用一种数字策略来决定要激活的
运行级别
。一个
运行级别
是一种你系统运行的状态,包含了你进入和退出这个运行级别要执行的一系列的脚本(运行级别脚本或者
initscripts
)。 在Gentoo里定义了7个运行级别:3个内部运行级别和四个供用户定义的运行级别。这些内部运行级别分别叫做
sysinit
shutdown
,所做的就同它们名字一样:初始化系统、关机和重启机器。 用户定义的运行级别都在
/etc/runlevels
中有个附带的子文件夹:
default
nonetwork
。运行级别
启动所有其他运行级别要使用的系统服务。其余的三个运行级别主要不同在它们要启动的服务:
default
是用作日常工作的,
nonetwork
是在网络不需要的情况下使用,还有
是用来给你修复系统的。
初始化脚本的工作 进程
启动的脚本都叫做
初始化脚本
/etc/init.d
里的每个脚本都可以执行时带上参数
restart
needsme
。 要启动、停止或者重启一个服务(和所有的独立的服务),应该是用到参数
restart
代码 6: 启动Postfix
/etc/init.d/postfix start
注释:
只要这个给定服务所需要的服务会停止或这重启,其他的独立的服务(那些
这个服务,但并不需要它的)将不会改变。 如果你要停止一个服务,但不停止那些依赖于它的服务,你可以使用参数
代码 7: 停止Postfix,但是保持依赖于它的服务继续运行
/etc/init.d/postfix pause 如果你要查看一个服务的状态(启动,停止,暂停……),你可以使用参数
代码 8: postfix的状态信息
/etc/init.d/postfix status 如果状态信息告诉你服务正在运行,但是你知道实际上不是,然后你可以使用参数
刷新状态信息为“sto ed”:
代码 9: 刷新postfix的状态信息
/etc/init.d/postfix zap 要询问这个服务的依赖性,你可以使用参数
。使用
你可以查看这个服务正常工作真正所需要的服务,而
将会显示这个服务要使用到的服务,但并不是为正常工作所必须的。
代码 10: 询问Postfix所必须依赖的服务列表
/etc/init.d/postfix ineed 同样,你可以询问哪些服务需要这个服务(
)或者哪些服务可以用到这个服务(
代码 11: 询问需要Postfix的服务列表
/etc/init.d/postfix needsme 最后,你可以询问这个服务所需要的但又缺失的依赖性:
代码 12: 询问Postfix所缺失的依赖性
/etc/init.d/postfix broken
rc-update的工作
什么是rc-update? Gentoo的初始化系统使用依赖树(dependency-tree)来决定什么服务会首先启动。因为这是个很沉闷的工作,我们不会让我们的用户去手动来作,我们创建了简化运行级别和初始化脚本的管理的工具。 使用
rc-update
你可以从一个运行级别中添加或删除初始化脚本。工具
rc-update
然后会自动要求
de can.sh
脚本来重新创建依赖树。
添加和删除服务 在Gentoo的***过程中你已经添加启动脚本到“default”运行级别。那个时候你可能还不清楚“default”是用作什么的,但是现在你应该知道了。脚本
rc-update
需要由第二个参数来决定其行为:
。 要添加或删除一个初始化脚本,只需要给
rc-update
,并随后附上初始化脚本和运行级别。比如:
代码 13: 将Postfix从默认运行级别中删除
rc-update del postfix default 命令
rc-update show
将会显示所有已有的初始化脚本,并列出它们在哪个运行级别中运行:
代码 14: 获得初始化脚本的信息
rc-update show
配置服务
为什么需要额外的配置? 初始化脚本有时候很复杂。因此让用户自己编辑初始化脚本没有什么意思,这样会让脚本错误百出。因此很重要的一点就是可以配置这样的一个服务。比如说,你可能想给这个服务更多的选项。 在初始化脚本之外配置的另一个原因也可以是不用担心你的配置在更新初始化脚本时被覆盖。
文件夹/etc/conf.d Gentoo提供了一个简单的方法来配置这样的一个服务:每一个可以配置的初始化脚本在
/etc/conf.d
里有一个文件。比如说,apache2的初始化脚本(叫做
/etc/init.d/apache2
)有一个配置文件叫
/etc/conf.d/apache2
,它包含了Apache 2服务起启动时你要给它的选项:
代码 15: /etc/conf.d/apache2中定义的变量
APACHE2_OPTS="-D PHP4" 这样的一个配置文件包含了变量并且只有变量(就同
/etc/make.conf
一样),使得配置服务非常简便。它还允许我们提供更多有关这个变量的信息(以注释形式)。
书写初始化脚本
我必须如此吗? 当然不是。自己书写一个脚本通常情况下不是必须的,因为Gentoo给所有提供的服务提供了一个可以使用的初始化脚本。但是,你可能没有通过Portage来***一个服务,这种情况下你将需要创建一个初始化脚本。 如果服务提供的脚本不是特定写给Gentoo的,不要使用:Gentoo的初始化脚本和其他发行版的初始化脚本不兼容!
布局 一个初始化脚本的基本布局如下。
代码 16: 一个初始化脚本的基本布局
#!/ in/ru cript
depend() {
(依赖性信息)
start() {
(启动服务所需的命令)
stop() {
(停止服务所需的命令)
restart() {
(重启服务所需的命令)
} 每个初始化脚本都
定义函数
start()
,其他所有的函数都是可选的。
依赖性 这里有两种依赖性你可以定义:
。我们前面提过,依赖性
要严格的多。根据依赖性的类型,你需要输入你要依赖的服务或者
依赖性。 虚拟
依赖性是由一个服务提供的依赖性,但不仅仅只由那个服务提供。你的初始化脚本可以依赖于一个系统日志服务,但是我们有很多系统日志程序(metalogd、syslog-ng、sysklogd……)。因为你不能同时
它们中的每一个(没有一个系统会同时***和运行这些系统日志程序),但我们确认所有的这些服务
一个虚拟依赖性。 让我们来看看postfix服务的依赖性信息。
代码 17: Postfix的依赖性信息
depend() {
need net
use logger d provide mta
} 就同你看到的,postfix服务:
需要(虚拟)依赖性
(比如由
/etc/init.d/net.eth0
提供)
使用(虚拟)依赖性
(比如由
/etc/init.d/syslog-ng
提供)
使用(虚拟)依赖性
d (比如由
/etc/init.d/named
提供)
提供(虚拟)依赖性
(这点和所有的mail服务器一样)
控制顺序 在一些情况下你可能并不需要一个服务,但是需要你的服务在另一个在系统中存在的服务(注意条件,这里再也没有别的依赖性)前面(或者后面)启动过,并且这两个服务同时在相同的运行级别中(注意条件,只有在同一运行级别的服务才包括)。你可以使用
设置来提供这个信息。 作为一个例子,我们来看看服务Portmap的设置:
代码 18: The depend() function in the Portmap service
depend() {
need net
before inetd
before xinetd
} 你也可以使用“*”来代替相同运行级别的所有服务,但是这个不是推荐使用。
代码 19: 在运行级别中第一个运行的初始化脚本
depend() {
before *
标准函数 紧随函数
,你也需要定义函数
。这个包含了所有初始化这个服务所需要的命令。我们推荐使用函数
来告诉用户所发生的事情:
代码 20: 函数start()样例
start() {
ebegin "Starting my_service"
start-stop-daemon --start --quiet --exec /path/to/my_service
eend $?
} 如果你需要有关函数
start()
的更多例子,请阅读在你的文件夹
/etc/init.d
里已有的初始化脚本。对于
start-stop-daemon
,如果你需要更多的信息,这里提供了一个非常好的手册:
代码 21: 获得start-stop-daemon的手册
man start-stop-daemon 其他你可以定义的函数有
restart
。你不是必须要定义这些函数!如果你使用
start-stop-daemon
,我们的初始化系统有足够的能力来自动完成这些函数。
添加自定义的选项 如果你想你的初始化脚本支持更多的选项,而不仅仅是我们已经遇到过的那些,你可以添加这些选项到变量
,并且创建一个和这个选项同名的函数。比如,要支持一个名为
restartdelay
的选项:
代码 22: 支持选项restartdelay
opts="${opts} restartdelay"
restartdelay() {
sleep 3
# 在再次启动前等候三秒钟
start()
服务配置中的变量 对于支持
/etc/conf.d
里的配置文件,你不需要作任何事情:如果你的初始化脚本执行,下面的文件将会自动读取(比如可以使用的变量):
/etc/conf.d/你的初始化脚本
/etc/conf.d/basic
/etc/rc.conf 还有,如果你的初始化脚本提供了一个虚拟依赖性(如
),和这个依赖性相关的文件(如
/etc/conf.d/net
也会被读取。
改变运行级别的行为
谁将得益于此? 许多笔记本用户了解这个情况:在家时你需要启动
net.eth0
,而在路上你就不需要启动
net.eth0
(因为没有网络可用)。对于Gentoo,你可以根据你的意愿来改变运行级别的行为。 比如,你可以创建另一个“default”运行级别,联系有其他的初始化脚本。然后在启动时你可以选择你要使用哪个default运行级别。
使用SOFTLEVEL 首先,给你的另一个“default”运行级别创建文件夹,作为一个例子我们创建
offline
运行级别:
代码 23: 创建一个运行级别文件夹
mkdir /etc/runlevels/offline 给新建的运行级别添加必须的初始化脚本。比如,如果你需要一个同你当前的
default
运行级别一模一样的设置,只是没有
net.eth0
代码 24: 添加必须的初始化脚本
ls /etc/runlevels/default
domai ame
net.eth0
netmount
postfix
syslog-ng
vixie-cron
rc-update add acpid offline
rc-update add domai ame offline
rc-update add local offline
rc-update add syslog-ng offline
rc-update add vixie-cron offline 现在编辑你的系统启动程序配置文件,并为
offline
运行级别添加一个新的记录。比如,在
/boot/grub/grub.conf
代码 25: 给offline运行级别添加一条记录
title Gentoo Linux Offline Usage
root (hd0,0)
kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3
softlevel=offline 现在所有的都设置好了。如果你启动你的系统并在启动时选择新添的记录,将会使用运行级别
offline
而不是
default
使用BOOTLEVEL 使用
bootlevel
softlevel
几乎完全相似。唯一的不同是你定义一个新的“boot”运行级别而不是新的“default”运行级别。 本页地址:http://zonghe.17xie.com/book/10565341/32238.html
上一页 返回本书首页 下一页 ← →键盘左右键前后翻页,回车[enter]返回本书首页
[编辑力荐图书]
类别:
作者:
类别:
作者:
类别:
作者:
类别:
作者:
类别:
作者:
手机阅读版权合作
[随机出现的图书]
支持本书:
Copyright2007 17xie.com 互动写作和阅读平台 京ICP备08002671号

参考资料

 

随机推荐