详尽技术分析SC2方方面面zz
星际争霸2单位脚本提取成功,星际争霸2单位脚本提取成功,详尽技术分析SC2方方面面先自我介绍一下,我是来自于www.Ra3.cn命令与征服战略中心的CYC,现在担任模组工作室版主,在C&CMOD界也算是小有名气,专职于红色警戒3模组&地图制作。
近期喜闻SC2终于BETA测试,作为一名星际争霸的老爱好者,我便兴致勃勃地研究了一下星际争霸2beta的内部文件。
惊喜地发现星际争霸2没有大量的加密措施,整个游戏的设定都是开放式的,但是目前本人还没有获得BetaKey,所以只能在以下文件中找到一些蛛丝马迹。
[::星际争霸核心社区 BBS.SC2.CC::]
脚本语言&风格概述:
不能说星际争霸2完全放弃了魔兽3的c语言编译模式,毕竟暴雪还保留了一些类似java的语言。
也许是因为现任星际争霸2首席设计师Dustin早年参与开发过EA旗下的命令与征服:红色警戒2以及命令与征服:将军,还有魔戒中土大战系列。即使Dustin口称没有把一点点西木和EA的风格带入星际争霸的,但是无论从星际争霸2的模型、理念以及地图设计,乃至代码的语言及编写风格都和Sage引擎游戏颇为相似(Sage,Strategy Action Game Engine,战略动作游戏引擎,为西木开发,现为EA使用)。
xml语言以及单位代码集成在一个文件里的编写习惯使编写过将军mod和红色警戒3mod的modder们不免感到一丝亲切。
http://www.ra3.cn/home/attachment/201002/21/458_1266759034ZnBj.jpg
此网页不属于NGA网站,NGA不保证其安全性
继续访问 取消 不再提示我[ http://www.ra3.cn/home/attachment/201002/21/458_1266759034ZnBj.jpg ]
[ http://www.ra3.cn/home/attachment/201002/21/458_1266759034ZnBj.jpg ]
接下来让我们从代码粗略地了解一下星际争霸2的游戏架构:
1.单位代码段
所有的单位代码都集中在Unit.xml中,每段单位代码都有严谨的排列。
我们举最熟悉的单位马林(陆战队)来一睹星际2代码的风采:
Code:
for (i=0; i<10; i++)
{
print( <CUnit id="Marine">
<DeathRevealRadius value="3"/>
<Race value="Terr"/>
<Mob value="Multiplayer"/>
<LifeStart value="45"/>
<LifeMax value="45"/>
<LifeArmorName value="Unit/LifeArmorName/TerranInfantryArmor"/>
<Speed value="2.25"/>
<Acceleration value="1000"/>
<LateralAcceleration value="46.0625"/>
<StationaryTurningRate value="999.8437"/>
<TurningRate value="999.8437"/>
<Food value="-1"/>
<CostResource index="Minerals" value="50"/>
<RepairTime value="20"/>
<AttackTargetPriority value="20"/>
<DamageDealtXP value="1"/>
<DamageTakenXP value="1"/>
<KillXP value="10"/>
<Radius value="0.375"/>
<SeparationRadius value="0.375"/>
<InnerRadius value="0.375"/>
<CargoSize value="1"/>
<ScoreMake value="50"/>
<ScoreKill value="100"/>
<ScoreResult value="BuildOrder"/>
<SubgroupPriority value="15"/>
<MinimapRadius value="0.375"/>
<FlagArray index="PreventDestroy" value="1"/>
<FlagArray index="UseLineOfSight" value="1"/>
<PlaneArray index="Ground" value="1"/>
<Collide index="Ground" value="1"/>
<Sight value="9"/>
<AbilArray Link="stop"/>
<AbilArray Link="attack"/>
<AbilArray Link="move"/>
<AbilArray Link="StimPack"/>
<BehaviorArray Link="MarineShield"/>
<CardLayouts>
<LayoutButtons Face="Move" Type="AbilCmd" AbilCmd="move,Move" Row="0" Column="0"/>
<LayoutButtons Face="Stop" Type="AbilCmd" AbilCmd="stop,Stop" Row="0" Column="1"/>
<LayoutButtons Face="MoveHoldPosition" Type="AbilCmd" AbilCmd="move,HoldPos" Row="0" Column="2"/>
<LayoutButtons Face="Attack" Type="AbilCmd" AbilCmd="attack,Execute" Row="0" Column="4"/>
<LayoutButtons Face="MovePatrol" Type="AbilCmd" AbilCmd="move,Patrol" Row="0" Column="3"/>
<LayoutButtons Face="Stim" Type="AbilCmd" AbilCmd="StimPack,Execute" Row="2" Column="0"/>
</CardLayouts>
<Attributes index="Light" value="1"/>
<Attributes index="Biological" value="1"/>
<EditorCategories value="ObjectType:Unit,ObjectFamily:Melee"/>
<GlossaryCategory value="Unit/Category/TerranUnits"/>
<GlossaryPriority value="30"/>
<GlossaryStrongArray value="Marauder"/>
<GlossaryStrongArray value="Immortal"/>
<GlossaryStrongArray value="Hydralisk"/>
<GlossaryWeakArray value="SiegeTankSieged"/>
<GlossaryWeakArray value="Colossus"/>
<GlossaryWeakArray value="Lurker"/>
<WeaponArray Link="Marine"/>
<Fidget>
<ChanceArray index="Anim" value="33"/>
<ChanceArray index="Idle" value="33"/>
<ChanceArray index="Turn" value="33"/>
</Fidget>
<TauntDuration index="Cheer" value="5"/>
<TauntDuration index="Dance" value="5"/>
</CUnit>)
}
评价:
也许普通玩家看到之后会不寒而栗,但是我想职业的modder们一定认为这不算什么。
与命令与征服3的单位代码相比较,暴雪将逻辑性的代码集中在一起,包括建造时间,生命值,人口等,而将单位模型、动作集中到另一个xml中(待会会解析)。与C&C3的将逻辑和单位技能以及单位模型绘制代码集成到一个文件中的繁琐度相比,暴雪的代码也许更加人性化,然而还有一个缺点,不如将每一个单位以独立的文件存在,而不是统统在一个文件里。
分析:
<LifeStart value="45"/>这里是指“初始生命值”?
<LifeMax value="45"/>这里是指“最大生命值”?
<LifeArmorName value="Unit/LifeArmorName/TerranInfantryArmor"/>这里定义了陆战队的装甲。
<Speed value="2.25"/>这里定义了速度……
……
然而最令人兴奋的是,星际2可能还有魔兽争霸中经验值升级的功能:
<KillXP value="10"/>可能意味着在某张正式版的地图中,杀死一个陆战队你将获得10点经验值!
2.武器&装甲以及升级&技能
武器定义在WeaponData.xml文件中,其他可以以此类推
我们可以列举一段SCV的焊人武器
<CWeaponLegacy id="SCV">
<EditorCategories value="Race:Terran"/>
<Icon value="Assets\Textures\btn-upgrade-terran-infantryweaponslevel1.dds"/>
<TargetFilters value="Ground,Visible;Missile,Stasis,Dead,Hidden,Invulnerable"/>
<Range value="0.1"/>
<Period value="1.5"/>
<Options index="Melee" value="1"/>
</CWeaponLegacy>
可以看到,SC2的武器定义还是很简单的,也就是说,还有很大的扩展空间,我们可以试着在正式版中进行修改,创建自己的武器。
3.模型绘制代码&特效
我们知道,为了使星际2成为一款大众化的竞技游戏,暴雪不惜牺牲了这款游戏的画质,我们究竟是要理解暴雪还是谩骂暴雪跳票半年出品的居然是这么一款画质平平的游戏?
我想我们应该给予理解。
模型代码都集中在Model.xml中,特效都集中在Effectdata.xml中
我们还是来看看陆战队的绘制部分吧
<CModel id="MarineDeath" parent="UnitDeath" Race="Terran">
<Occlusion value="Show"/>
<LowQualityModel value="TerranSmallUnitDeathLow"/>
</CModel>
<CModel id="MarineDeathAcid" parent="UnitDeath" Race="Terran">
<LowQualityModel value="TerranSmallUnitDeathLow"/>
<Occlusion value="Show"/>
</CModel>
<CModel id="MarineDeathBlast" parent="UnitDeath" Race="Terran">
<Occlusion value="Show"/>
<LowQualityModel value="TerranSmallUnitDeathLow"/>
</CModel>
<CModel id="MarineDeathFire" parent="UnitDeath" Race="Terran">
<Occlusion value="Show"/>
<LowQualityModel value="TerranSmallUnitDeathLow"/>
</CModel>
首先映入眼帘的并不是马林的主要绘图部分,而是马林的全部四种死亡动画,分别为普通死亡,腐蚀死亡,爆炸死亡以及燃烧死亡,由此可见暴雪在死亡动画上做的还是比较细致的,作为同类游戏的C&C3以及Ra3的步兵死亡动画仅仅是以骨骼动画的扭动来完成。而在SC2中,我们相比已经看到血腥真实的死亡动画(光电会不会河蟹呢?)
<CModel id="MarineDeathEat" parent="UnitDeath" Race="Terran">
<Occlusion value="Show"/>
<LowQualityModel value="TerranSmallUnitDeathLow"/>
</CModel>
<CModel id="MarineDeathEviscerate" parent="UnitDeath" Race="Terran">
<Occlusion value="Show"/>
<Variations Number="0" Probability="9"/>
<Variations Number="1"/>
<LowQualityModel value="TerranSmallUnitDeathLow"/>
<VariationCount value="2"/>
</CModel>
抱歉,貌似我还漏了两种——触目惊心!被吃掉死亡?!还有剔骨死亡!!?
看来暴雪真是改不了从暗黑、星际1开始的重口味。(战锤40K内牛满面)
来看看正文部分:
Code:
for (i=0; i<10; i++)
{
print( <CModel id="Marine" parent="Unit" Race="Terran">
<Occlusion value="Show"/>
<SelectionRadius value="0.375"/>
<AttachProps Id="Ref_Target" SquibType="Flesh" RadiusTarget="0.3"/>
<Radius value="0.375000"/>
<TechPurchaseCamera value="Star2CameraMid04"/>
<ShadowRadius value="0.375"/>
<Events>
<Anim value="Stand,Victory,00"/>
<Name value="SquibStart"/>
<Type value="Custom"/>
<Time value="3.200000"/>
</Events>
<Events>
<Anim value="Stand,Victory,00"/>
<Name value="SquibStop"/>
<Type value="Custom"/>
<Time value="4.650000"/>
</Events>
<Events>
<Anim value="Stand,Victory,01"/>
<Name value="SquibStart"/>
<Type value="Custom"/>
<Time value="0.350000"/>
</Events>
<Events>
<Anim value="Stand,Victory,01"/>
<Name value="SquibStop"/>
<Type value="Custom"/>
<Time value="2.350000"/>
</Events>
<!--Events Anim="Attack,01" Type="Sound" Time="0.15"/-->
<!--Events Anim="Walk,00" Type="FootprintLeft" Time="0.15"/-->
<!--Events Anim="Walk,00" Type="FootprintLeft" Time="0.15" Name="Glowoid"/-->
<!--Events Anim="Walk,00" Type="FootprintLeft" Time="0.15" Name="Echoid"/-->
<!--Events Anim="Walk,00" Type="FootprintLeft" Time="0.15" Payload="MarineDeathFire"/-->
<!--Events Anim="Walk,00" Attachment="Ref_Weapon 06" Type="Sound" Time="0.1" Name="Impactoid"/-->
<!--Events Anim="Walk,00" Type="Custom" Time="0.15" Name="Glowoid" ModelQuality="High"/-->
</CModel>)
}
似乎整个模型以及动作都集中在一个m3格式的模型文件中,与C&C繁多的步兵皮肤模型&骨骼动画大不相同,详细信息还是要等正式版发布才能知道。
粒子效果
从红警3的xml来看,EA在粒子效果上的功夫下得很深,这同时也带来了高画质游戏的低普及,然而暴雪用简洁的粒子效果来告诉我们什么是为竞技而生的游戏:
Code:
for (i=0; i<10; i++)
{
print( <CModel id="BattleCruiserDeath" parent="UnitDeath" Race="Terran">
<LowQualityModel value="BattleCruiserDeathLow"/>
<Occlusion value="Show"/>
<VariationCount value="2"/>
<Events>
<Variation value="0"/>
<Anim value="Death,00"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.010000"/>
</Events>
<Events>
<Variation value="0"/>
<Anim value="Death,00"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.233300"/>
</Events>
<Events>
<Variation value="0"/>
<Anim value="Death,00"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.500000"/>
</Events>
<Events>
<Variation value="0"/>
<Anim value="Death,00"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.833300"/>
</Events>
<Events>
<Variation value="0"/>
<Anim value="Death,00"/>
<Name value="TerranExplosionLarge"/>
<Type value="Sound"/>
<Time value="1.500000"/>
</Events>
<Events>
<Variation value="0"/>
<Anim value="Death,01"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.066600"/>
</Events>
<Events>
<Variation value="0"/>
<Anim value="Death,01"/>
<Name value="TerranExplosionLarge"/>
<Type value="Sound"/>
<Time value="0.666600"/>
</Events>
<Events>
<Variation value="0"/>
<Anim value="Death,02"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.066600"/>
</Events>
<Events>
<Variation value="0"/>
<Anim value="Death,02"/>
<Name value="TerranExplosionLarge"/>
<Type value="Sound"/>
<Time value="0.666600"/>
</Events>
<Events>
<Variation value="1"/>
<Anim value="Death,00"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.010000"/>
</Events>
<Events>
<Variation value="1"/>
<Anim value="Death,00"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.233300"/>
</Events>
<Events>
<Variation value="1"/>
<Anim value="Death,00"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.500000"/>
</Events>
<Events>
<Variation value="1"/>
<Anim value="Death,00"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.833300"/>
</Events>
<Events>
<Variation value="1"/>
<Anim value="Death,00"/>
<Name value="TerranExplosionLarge"/>
<Type value="Sound"/>
<Time value="1.500000"/>
</Events>
<Events>
<Variation value="1"/>
<Anim value="Death,01"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.066600"/>
</Events>
<Events>
<Variation value="1"/>
<Anim value="Death,01"/>
<Name value="TerranExplosionLarge"/>
<Type value="Sound"/>
<Time value="0.666600"/>
</Events>
<Events>
<Variation value="1"/>
<Anim value="Death,02"/>
<Name value="TerranPreExplosionSmall"/>
<Type value="Sound"/>
<Time value="0.066600"/>
</Events>
<Events>
<Variation value="1"/>
<Anim value="Death,02"/>
<Name value="TerranExplosionLarge"/>
<Type value="Sound"/>
<Time value="0.666600"/>
</Events>
</CModel>)
}
不要被这些长段子蒙蔽了双眼,这个是战斗巡洋舰死亡模型,伴随的粒子效果都是通用的人族粒子效果,也就是说是粒子效果的组合,而游戏中的表现也显得不是那么震撼,冲击波的光环也只是一根圆线……
我只能希望暴雪能做得再好一点。
4.水面效果
相信很多玩家都为红色警戒3的水面而惊奇诧异,纵使整个ra3充满玩具,它的水面仍然是2008年最出彩的RTS游戏的水面。
与此同时,暴雪的SC2又招来了失望的声音。
今天我特地拜访了一下Water.xml,结果令我出乎意料
<CWater id="MarSara">
<State index="0">
<RefractionDistortion value="0.002500"/>
<ReflectionDistortion value="0.069000"/>
<MeshRoughness value="0.459000"/>
<TextureRoughness value="1.000000"/>
<MinReflection value="0.333000"/>
<SpecularScaler value="0.050000"/>
<ColorFallOff value="1.000000"/>
<UvRate value="0.000292,0.000956,0.000000,0.000000"/>
<Specularity value="10.500000"/>
<Color value="0.000000,0.000000,0.000000,0.382000"/>
</State>
<BeachShoreline value="BelShirBeachShoreline"/>
<CliffShoreline value="BelShirCliffShoreline"/>
</CWater>
红色警戒3的水面的修改自由度很低,只能通过修改一些屈指可数的贴图来换取一些变化不大的效果,
而星际争霸2则能够自由的设置反射度,颜色,亮度,乃至高光程度,所以我们完全可以设置一个游泳池甚至岩浆,仅仅依靠修改代码。
总结:
一个游戏的生命力不在于它的竞技性,而在于它的扩展性,它的修改自由度。
星际争霸现在的火热程度远不如有着强大编辑器功能以及上千地图的魔兽争霸3,红色警戒3英雄连等高画质而加密度较高的游戏的模组制作门槛太高,致使其成为冷门作品。
而当我们吐槽星际2的画面时,我们有没有想过,这不仅意味着游戏的大众化,更意味着修改的大众化,DIY的大众化……
有人说星际2会失败,而我却相信星际2会有一个无限的未来!。
P.S.
目前就理论上来说,提取-修改-打包,依靠这三部我们甚至现在就能制作星际争霸2的模组,但是笔者还没试过,所以请保留此贴,我将在一周之内测试报告。谢谢!
另:我求一个Beta Key = =|||,万谢了!邮箱: RTScritic@163.com QQ:MOD@ra3.cn
想联系我一起研究的也可以!(版主可删这段)
云层老大,是不是贴了两遍啊。
不晓得以后游戏的主流是不是都这样,扩展性比较好。
反正以前玩魔兽争霸的时候,有好多经典的地图,大学里经常打的。
页:
[1]