第三章  常用Behavior功能模块详解

在上一章里我们通过新建灰熊坦克的单位定义代码了解到了SAGE精华——功能模块的一些用法,但仅以一个灰熊根本难以穷举SAGE所有的功能,因此本章将专门列举所有的功能模块并详细解说它的作用。

首先要说明的是功能模块的书写格式,SAGE规定,功能模块属于二级函数,需要有函数类型(Behavior)、函数名(各种各样的功能模块名称),以及模块编号(%s),格式如下:

Behavior = [函数名称]  %s

其中函数名称是一些平台内码,整个ZH平台一共就提供了这么多种功能,我们只需要调用即可。%s表示随意字符串,通常为ModuleTag_XX目前尚不知道是否有多少个字符的长度限制,不过通常情况下为了保险,我们最好是按照一个统一的习惯,用ModuleTag_前缀加上两位数字来为函数排序。值得注意的是,任何物体代码中的各个模块不能使用相同的编号,否则会导致排序冲突,引起游戏和月光宝盒报错。

 

1、 死亡方式模块。这类模块的通用语句是DeathTypes,默认参数为ALL(随意),并可使用加减号来实现或、非逻辑,这些参数后面会着重列举讲解

Behavior = KeepObjectDie ModuleTag_XX                                         保留废墟式死亡,被杀后该物体已经被平台判死,但会留下该物体的RUBBLE阶段模型永远不消失

  DeathTypes = ALL

End

点评:本模块通常用于中立建筑,如民房、油井等,因为这些房子被毁掉后将留下一片废墟占据着地面。因此切记,如果要使用这种死亡方式,该物体必须含有RUBBLE阶段的模型,否则什么都不会显示出来,但该地皮上却不能重建房子,于是导致了视觉BUG

 

Behavior = DestroyDie ModuleTag_XX                                               消失式死亡,即被杀后将本体的模型删除,安静得什么特效都没有

  DeathTypes = ALL

End

点评:这是一种最基本的死亡方式,如果希望某个单位死亡后悄悄地消失掉,不引起玩家的注意,那么用它是最好的选择

 

  Behavior = FXListDie ModuleTag_XX                                                 FX特效式死亡,即被杀后引发一项FXList来产生诸如爆炸烟雾的特效

    DeathTypes = ALL

    DeathFX = FX_CarCrush                                                                引发哪一个的FXList

  End

点评:这种死亡方式需要专门为之制作一个FX特效,可用这个FX特效来间接调用粒子动画(例如爆炸烟雾、火焰等)、产生闪光、产生爆炸声音或产生屏幕抖动。DeathFX只能调用一个FX特效作参数,如果你需要多个特效组合起来产生效果,你可以考虑编写多个FXListDie模块,每个模块调用一个FX,以达到并列组合效果

 

  Behavior = CreateObjectDie ModuleTag_XX                                      OCL式死亡,即被杀后在原地刷出一系列物体,可以刷碎片甚至另一个活单位

    DeathTypes = ALL                               

    CreationList = OCL_CrusaderTank_CrushEffect                            根据哪个OCL项目的内容来刷物体

    TransferPreviousHealth = Yes                                                        刷出来的物体将继承被杀物体的剩余生命值信息

  End

点评:这种死亡方式需要专门为之制作一个OCL列表,也就是说刷出来的物体可以是一种,也可以是多种,可以是一个,也可以是多个,可以使用碎片,也可以使用活单位(把步兵当作人间大炮打出去),总之OCL非常灵活,是SAGE的精华和强力功能之一,后面会着重讲解OCL的原理和制作方法

 

  Behavior = CreateCrateDie ModuleTag_XX                                        爆箱子式死亡,即被杀后在原地爆出一个垃圾箱,这跟OCL式死亡表现相似,但实际上有区别

    CrateData = SalvageCrateData                                                        根据哪个垃圾箱规律来爆箱

  End

点评:这种死亡方式需要专门为之制作一个CrateDate(垃圾箱逻辑),由于垃圾箱也是一种Object,因此假如你把爆箱子式死亡当成了OCL死亡来用,那简直就是糟蹋了它的实力。不过考虑到垃圾箱逻辑比较复杂,因此会放到后面来重点讲解

 

Behavior = UpgradeDie ModuleTag_XX                                              取消升级式死亡,即被杀后可以将原本已获得的一个升级项目删除掉,所有相关单位会恢复到没有升级之前的性能

   UpgradeToRemove = Upgrade_AmericaHellfireDrone                      取消哪个升级项目,如果该项目并没有被升级过或升级尚未完成则不会有任何影响

  End

点评:这种死亡方式多用作后台处理,例如使某个升级键可以反复地使用多次,由于任何一个升级项目都只能升一次,但是可以通过取消来使之可以再重新升级,因此FK3D里辐射工兵的辐射爆发技能、间谍卫星的开屏技能就是用了取消升级的后台处理以实现可多次使用的目的

                           

  Behavior = RebuildHoleExposeDie ModuleTag_XX                            留地洞式死亡,本体死亡后可留下一个地洞,地洞是个特殊的Object,一定时间后可以自动重建成本体

    HoleName = GLAHoleArmsDealer                                                  本体死亡后留下哪个地洞

    HoleMaxHealth = 500.0                                                                  地洞最大生命值

  End

点评:这是来自GLA建筑的特色能力,其作用属于一种特别的延时重生,和魔兽里血巫的火凤凰是一个原理,如果你仅仅杀死火凤凰,它会留下一个蛋,而蛋在一定时间后自动又孵化成火凤凰,反复无穷地相互转变,看起来似乎永远不会死,但实际上只要把蛋杀掉,就能够阻止它继续重生了

 

  Behavior = SpecialPowerCompletionDie ModuleTag_XX                    超武完结式死亡,当本体死亡后,使对应超武复位,开始新的一轮倒记时

    SpecialPowerTemplate = SupW_SuperweaponNeutronMissile       使哪个超武开始新一轮倒记时,一次只能关联一个

  End

点评:这种死亡方式多用于OCL式超武的射弹体,当射弹体以任何方式死亡(包括引爆)时,将使对应超武复位开始新一轮倒记时。如果不是这个模块的帮助,该超武就只能发射一次

 

  Behavior = EjectPilotDie ModuleTag_XX                                            释放驾驶员式死亡,本体死亡后将释放出一个与自身级别相同的驾驶员,和OCL式死亡很相似,但作用有所提高

    ExemptStatus = HIJACKED                                                             排除状态为被盗取时,即正常状态下才能释放驾驶员,被劫持后是释放劫持犯

    GroundCreationList = OCL_EjectPilotOnGround                            根据哪个OCL列表来刷物体,当然,这里的物体特指驾驶员

    AirCreationList = OCL_EjectPilotViaParachute                                驾驶员可分为地面和空中二种,前者是直接刷,后者是跳伞下来

    VeterancyLevels = ALL –REGULAR                                                当本体的级别不是新兵时,释放出来的驾驶员的级别将与本体相等

  End

点评:这种死亡方式来自美军的绝大多数载具,其功能很相似于OCL式死亡,但比OCL式死亡更厉害的时,刷出来的单位可以与本体级别相等

 

2、 延迟死亡模块。这类模块的通用语句是DestructionDelay,控制死亡延迟的时间。虽然我将之称为延迟死亡,但千万不要误会这个模块可以让单位在变成尸体后还能继续当作骷髅兵使用,事实上当单位的血扣到0时,虽然不会马上死亡,但却已经不能再选中它,自然也就不能再使用它了,它将去做死亡过程动作。

  Behavior = SlowDeathBehavior ModuleTag_XX                                  普通延迟,被杀单位将立刻停止一切动作并不再接受控制,静置原地,延迟一段时间后死亡

    DeathTypes = ALL

    ProbabilityModifier = 25                                                                  引发几率百分比,默认值为100,表示100%,即绝对

    DestructionDelay = 2000                                                                死亡延迟时间,单位为毫秒,2000毫秒=2

    DestructionDelayVariance = 1000                                                   延迟时间的随机偏差为1000毫秒,使得实际的延迟时间从1秒到3秒之间随机出现

OCL = INITIAL   OCL_WorkerFlyingOffBikeDeathStart                 死亡动作开始时刷出什么东西来,INITIAL表示初始,即刚开始的时候

    OCL = FINAL    OCL_MTNKDebris                                              死亡动作完成后刷出什么东西来,FINAL表示最终,即完成之后

FX  = INITIAL   FX_BuggyNewDeathExplosion                           死亡动作开始时引发什么FX特效

    FX  = FINAL    FX_BattleMasterExplosionOneFinal                    死亡动作完成后引发什么FX特效

  End

点评:常用于地面单位的一种死亡动作,用于坦克的话,被消灭的坦克不会像RA2那样立刻爆炸,而是先变成RUBBLE阶段模型,同时不再接受玩家控制、不再显示血格、不能被选中、立刻停止所有动作,静置在原地,延迟一段时间再爆炸,飞出炮塔、炮管残骸。而用于步兵的话,则通常利用这段延迟的时间让步兵做出死亡倒地的动作,逼真感十足。

 

  Behavior = JetSlowDeathBehavior ModuleTag_XX                             俯冲坠落延迟,被杀单位的死亡动作为从空中俯冲下来撞击地面

    DeathTypes = ALL

    DestructionDelay               = 2000

    RollRate                       = 0.0                                          俯冲坠落过程中本体的旋转速度,0表示不旋转

    RollRateDelta                  = 100%                                      调整旋转速度倍率的,100%表示原样速度,大于100%表示加快,反之则减慢

    PitchRate                      = 0                                             俯冲角改变速度,0表示保持恒定的俯冲角下落

    FallHowFast                   = 25.0%                                      坠落速度百分比,100%的速度似乎是自由落体速度,和GameData里设置的重力加速度有关

    FXInitialDeath                  = FX_JetBigDeathInitial             被杀瞬间(刚开始俯冲时)引发的特效

    OCLInitialDeath                 = OCL_AmericaJetCargoDeathStart        刚开始俯冲时刷出来的物体

    DelaySecondaryFromInitialDeath  = 2000                                      俯冲状态持续时间

    OCLSecondary                  = OCL_AmericaJetCargoHulkDeath             撞到地面后刷出来的物体

    FXSecondary                   = FX_BigPlaneDeath                撞到地面后产生的爆炸特效

  End

点评:这是一个逼真度非常高的死亡动作,完美地模拟了攻击机坠毁的全过程

 

  Behavior = NeutronMissileSlowDeathBehavior ModuleTag_XX          弹头爆炸延迟,被“杀”单位的死亡动作为连续释放出9个阶段的冲击波范围伤害

    DeathTypes = ALL                                                                         

    DestructionDelay    = 3501                                                         

    ScorchMarkSize      = 320                                                          弹坑尺寸,由于是弹头爆炸,因此加入弹坑效果以增加逼真感

    FXList              = SupW_FX_Nuke                                       弹头爆炸过程的FX特效,例如核弹爆炸的蘑菇云

    Blast1Enabled       = Yes                                                            启动1阶冲击波

    Blast1Delay         = 580                                                            1阶冲击波产生延迟时间

    Blast1ScorchDelay   = 100                                                            1阶冲击波导致弹坑的延迟时间

    Blast1InnerRadius   = 60.0                                                           1阶冲击波内层伤害半径,凡是处于这个范围内的目标将遭受100%的伤害比率

    Blast1OuterRadius   = 120.0                                                         1阶冲击波外层伤害半径,凡是介于内外层之间的目标遭受的伤害将削弱,不知道是不是按距离线性削弱

    Blast1MaxDamage     = 150.0                                                      1阶冲击波最大伤害值,特别注意冲击波的DamageType默认为EXPLOSION,属于平台内定的,没办法修改和替换

    Blast1MinDamage     = 75.0                                                        1阶冲击波最小伤害值,由最大和最小伤害值来产生一个随机伤害值的效果

    Blast1ToppleSpeed   = 0.5                                                            1阶冲击波气浪扩散速度,冲击波可将树木冲倒

    Blast1PushForce     = 10.0                                                          1阶冲击波气浪推力大小,冲击波可将高塔等死后会倒塌的物体推倒

    ………………………                                                                     2-9阶冲击波的所有设置语句和1阶类似,此处略去。若不需要此阶冲击波,可以不定义

    OCL = MIDPOINT   OCL_NukeRadiationField                              弹头爆炸后在爆心位置刷出什么物体,原版用它来给核弹刷辐射带,当然也可以刷活单位

  End

点评:我不知道这个模块除了用来做核弹还能用来做什么,虽然任何武器的射弹体都能使用,但由于爆炸伤害的DamageType只能是平台内定的EXPLOSION,不能替换成我们想要的类型,因此也很让人郁闷,而要在爆心刷物体,我们不如使用简单的OCLDie,估计它唯一的作用仅仅就是实现一个能将树木和房子推倒的效果

 

  Behavior = HelicopterSlowDeathBehavior ModuleTag_XX                  竖直坠落延迟,被杀单位的死亡动作为竖直向下跌落至地面

    DeathTypes = ALL

    DestructionDelay                = 99999999                             搞不懂为什么竖直坠落的延迟死亡时间要设置这么长,难道是怕单位飞得过于太高,半天落不了地??

    SpiralOrbitTurnRate              = 140.0                                    坠落过程中的公转速度,类似RA2里飞碟那种即以本体中心为圆心自转,还要以体外某个点为圆心公转的坠落动作

    SpiralOrbitForwardSpeed         = 350.0                                    公转轨道前进速度,没搞懂啥意思,难道公转轨道的位置不是固定的?

    SpiralOrbitForwardSpeedDamping  = .9999                                   公转轨道速度阻尼大小,使公转轨道的移动速度不均匀地变动

    MaxBraking                     = 190                                       公转轨道负向加速度,类似于“刹车效果”  

    SoundDeathLoop                = ComancheDamagedLoop     坠落过程中播放的音效

    MinSelfSpin                     = 100                                       最小自转角速度,单位为度每秒

    MaxSelfSpin                     = 300                     最大自转角速度

    SelfSpinUpdateDelay             = 100                                      自转轨迹修正间隔时间

    SelfSpinUpdateAmount           = 10                                         自转轨迹修正量

    FallHowFast                     = 12.0%                                  坠落速度百分比,100%的速度似乎是自由落体速度,和GameData里设置的重力加速度有关

    MinBladeFlyOffDelay             = 750                                      最小碎片爆飞延迟时间,单位为毫秒

    MaxBladeFlyOffDelay             = 1500                                   最大碎片爆飞延迟时间,同上

    AttachParticle                    = SootySmokeTrail                  关联一个粒子系统,用于模拟黑烟效果

    AttachParticleBone               = Propeller02                          关联例子系统的骨骼点,需要对应W3D模型里的模型块/骨骼点名称

    BladeObjectName                = ComancheBlades                 碎片为什么物体,SAGE把碎片也认为是Object,因此可以替换成活单位,又一次邪恶……

    BladeBoneName                 = Propeller01                          关联碎片的骨骼点

    OCLEjectPilot                    = OCL_EjectPilotViaParachute             在半空中刷出一个物体,例如跳伞的飞行员

    FXBlade                         = FX_HelicopterBladeExplosion           爆出碎片时的FX特效

    OCLBlade                        = OCL_HelicopterBladeExplosion       爆出碎片时刷出什么物体,例如其余小残片、飞火等等

    FXHitGround                     = FX_HelicopterHitGround                  坠地时的FX特效

    OCLHitGround                   = OCL_HelicopterHitGround                坠地时刷出什么物体

    FXFinalBlowUp                  = FX_GroundedHelicopterBlowUp        坠地引发气浪的FX特效

    OCLFinalBlowUp                 = OCL_GroundedHelicopterBlowUp    坠地引发气浪时刷出什么物体

    DelayFromGroundToFinalDeath    = 1500                                                  从坠地到最终死亡之间的死亡延迟时间

    FinalRubbleObject               = ComancheRubbleHull                         最终残骸物体,即死亡后地上残留的尸体

  End

点评:这似乎是SAGE里最复杂的延迟死亡模块,常用于直升机,整个坠落过程分得特别详细,事实上有很多语句都是多余的。

 

  Behavior = BattleBusSlowDeathBehavior  ModuleTag_XX                战斗巴士爆炸延迟,不常用的模块,似乎只用于战斗巴士,因此研究不太透彻,若有错误请指出

    DeathTypes = ALL

    ProbabilityModifier = 5                                                                    引发几率百分比

    ModifierBonusPerOverkillPercent = 20%                                        过度伤害值加成几率百分比,正值为增加几率,负值为减少几率

    FXStartUndeath = FX_BattleBusStartUndeath                                 开始死亡过程时引发的FX特效

    OCLStartUndeath = OCL_BattleBusStartUndeath                           开始死亡过程时刷出什么物体

    FXHitGround = FX_BattleBusHitGround                                         死亡过程结束时引发什么FX特效

    OCLHitGround = OCL_BattleBusHitGround                                   死亡过程结束时刷出什么物体

    ThrowForce = 100.0                                                                       爆飞力度,不知道是把自己爆飞还是把敌人爆飞??

    PercentDamageToPassengers = 50%                                             本体死亡时对乘员的伤害,0%表示不伤害乘员,50%表示扣半血,100%表示直接扣死

    EmptyHulkDestructionDelay = 1000                                                空残骸死亡延迟时间,没搞懂什么叫空残骸

    DestructionDelay = 0                                                                      死亡延迟时间,这里的死亡延迟时间相对于空残骸死亡时间来说应该是前一段,设置为0表示不使用

    DestructionDelayVariance = 200                                                     后面这些语句和普通延迟一样,就不多说了

OCL = INITIAL   OCL_WorkerFlyingOffBikeDeathStart                

    OCL = FINAL    OCL_MTNKDebris                                             

FX  = INITIAL   FX_BuggyNewDeathExplosion                          

    FX  = FINAL    FX_BattleMasterExplosionOneFinal                   

  End

点评:我对这个模块从来没有研究过,不知道有什么奥秘,而原版也只在战斗巴士上用过它,看语句似乎可以实现爆炸时一定几率的伤害值加成。有兴趣的MODER可以去研究研究。

 

  Behavior = InstantDeathBehavior DeathModuleTag_XX                     立即死亡(即不延迟),自然也就做不出任何死亡动作,只能产生FX特效和OCL

    DeathTypes = NONE +LASERED

    FX         = FX_GenericMissileDisintegrate

    OCL        = OCL_GenericMissileDisintegrate

  End

 

3、 加血类模块。这类模块的通用语句为HealingAmountHealingDelay,用于控制每次加血量与间隔时间,加血模块可以给本体加血,也可以给本体周围的其他物体加血,使用范围非常广泛,包括广播塔和紧急维修技能也是一种变相的自动加血模块,因此我将它们放到一起来解说。

  Behavior = AutoHealBehavior ModuleTag_XX                                    普通治疗

    HealingAmount     = 5                                                                  每次加血量

    HealingDelay       = 1000                                                           加血间隔时间,单位为毫秒

    Radius             = 100.0f                                                        有效作用范围,若超过了自身体积则可以对周围物体加血,后面的“f”不知道有啥含义。默认为0,即只给自己加血

    StartsActive        = Yes                                                              初始时是否激活。Yes表示自动激活,No则需要Upgrade来将其激活(见下面的TriggeredBy语句),默认为Yes

    KindOf            = VEHICLE INFANTRY                                   对含有哪些类型标签的物体有效

    ForbiddenKindOf   = AIRCRAFT                                                  对含有哪些类型标签的物体无效

    SkipSelfForHealing  = Yes                                                             是否忽略自己,Yes表示不给自己加血,No则表示可以给自己加血,默认为No

    TriggeredBy        = Upgrade_GLAJunkRepair                           如果StartsActive = No,则需要这里设置一个Upgrade项目来将之激活才能实现加血功能,否则什么作用都不起

    SingleBurst         = Yes                                                             是否只作用一次,紧急维修里使用的特殊语句,Yes表示只加一次血,No则会按照间隔时间产生多次加血,默认为No

StartHealingDelay   = 15000                                                         本体受伤后延迟多长时间再启动加血功能,单位为毫秒,一般只用于本体自加血的情况

  End

点评:这是最基本的一个加血模块,其功能几乎涵盖了以下3种特殊加血模块的所有功能,可以实现任何加血规则和效果,但要特别注意,这个模块里存在相互关联的语句,例如StartsActiveYes的时候,TriggeredBy将失去意义,即便设置了Upgrade项目也是多余的,还有就是KindOfForbiddenKindOf是相互冲突的,其参数不能存在相同标签,胡乱设置的话小心引起逻辑冲突导致加血规则一塌糊涂。顺带说一句,不知道EA是怎么想的,有AutoHealBehavior还嫌不够,还要额外做那么多功能重复的多余模块。

 

  Behavior = BaseRegenerateUpdate ModuleTag_XX                           基地恢复,这是一个宏观模块,没有参数,关于加血量和加血间隔都由GameData控制,原版里用于美军基地建筑

    ;No data                                                                                          事实上完全可以用AutoHealBehavior来代替

  End

点评:纯属垃圾一个,我讨厌宏观功能。

 

  Behavior = AutoFindHealingUpdate   ModuleTag_XX                       自动搜索加血源,我没仔细研究过这个模块,从字面意思来看似乎能使本体在受伤后自动跑到维修厂或医院去请求加血

    ScanRate    = 1000                                                                      搜索间隔时间,单位为毫秒

    ScanRange  = 300                                                                         搜索范围,难道说只要这个范围内存在加血源,他就要自动跑过去?

    NeverHeal   = 0.85                                                                       当本体的剩余生命值大于多少时就不用去找加血源,0.85表示85%

    AlwaysHeal  = 0.25                                                                        当本体的剩余生命值小于多少时就立刻去搜索加血源

  End

点评:看起来挺有意思,只是我没研究过,不知道会有啥新发现。有兴趣的MODER可以去探索探索。

 

  Behavior = PropagandaTowerBehavior ModuleTag_XX                      广播塔加血,用来加血的话简直糟蹋了这个模块,事实上它还有更加高深的用法,就看你是不是醉翁之意不在酒了

    Radius                  = 150.0                                                 有效作用范围,这个模块只能给周围物体加血(对自己无效),所以这个值必须大于自身体积

    DelayBetweenUpdates    = 2000                                                  脉冲特效间隔时间,单位为毫秒,只控制脉冲FX特效的播放间隔,不控制加血间隔时间

    HealPercentEachSecond  = 2%                                                     每秒钟恢复周围物体百分之多少的生命值,这不是一个固定值,而是用接受治疗物体的生命值上限计算出来的

    PulseFX                 = FX_PropagandaTowerPropagandaPulse         初始时的脉冲FX特效

    UpgradeRequired         = Upgrade_ChinaSubliminalMessaging             需要哪个Upgrade来升级成效果更强烈的加血作用

    UpgradedHealPercentEachSecond = 4%                                                      升级完成后,加血作用更改为每秒百分之多少

    UpgradedPulseFX        = FX_PropagandaTowerSubliminalPulse           升级完成后的脉冲FX特效

  End

点评:之所以说醉翁之意不在酒,就在于广播塔可以利用升级来调用两个FX特效,于是一些怀有邪恶构思的MODER就利用这两个FX特效来做一些特殊效果,比如FK3D里蝰蛇巡航机的ForceField技能效果,以及英雄标志圈等等……感觉好像只有我本人才怀有邪恶的构思一样……

 

4、 升级切换类模块。这类模块的通用语句包括TriggeredByConflictsWith,前者表示获得了某个Upgrade后开启该模块的功能,后者表示获得了某个Upgrade后关闭该模块的功能,可见二者是相互冲突的,在实际使用时千万要注意参数,否则将把升级功能搞得一塌糊涂。

此外必须要提到的是,TriggeredByConflictsWith的参数可以有多个Upgrade,如果仅仅是单纯的并列时,表示或逻辑(即只要获得了其中任意一种Upgrade就开启/关闭模块功能),而TriggeredBy可以利用RequiresAllTriggers = Yes来将并列的几个Upgrade关系变成与逻辑(即必须获得了所有这些Upgrade才能开启模块功能)

  Behavior = MaxHealthUpgrade ModuleTag_XX                                  增加生命上限,启动模块后,该物体的生命上限增加一定数量

    TriggeredBy    = Upgrade_ChinaAircraftArmor

    AddMaxHealth  = 100.0                                                                 生命上限增量,例如原来是600,启动后就变成700

    ChangeType    = ADD_CURRENT_HEALTH_TOO                      同时增加当前生命值,例如生命上限600,但物体受损后生命值还剩余200,启动后,当前生命值就变成300

  End

 

  Behavior = ExperienceScalarUpgrade ModuleTag_XX                       经验值翻倍,启动模块后,该物体杀人所获得的经验值(包括贡献给将军的经验值)增加一定的倍数

    TriggeredBy   = Upgrade_AmericaAdvancedTraining

    AddXPScalar   = 1.0                                                                      1倍,即变成原来的2

  End

 

  Behavior = ObjectCreationUpgrade ModuleTag_XX                           刷物体,启动模块后,该物体将在当前所在位置刷出一系列物体

    UpgradeObject = OCL_AmericanBattleDrone                                 按照哪个OCL来刷物体

    TriggeredBy   = Upgrade_AmericaBattleDrone

    ConflictsWith = Upgrade_AmericaScoutDrone Upgrade_AmericaHellfireDrone          当获得了这两种Upgrade里的任意一种时,该模块关闭,不再发挥作用,也就啥也刷不出来了

  End

 

  Behavior = WeaponSetUpgrade ModuleTag_XX                                切换武器系统,启动模块后,该物体的武器系统的条件标签将更换为PLAYER_UPGRADE

    TriggeredBy = Upgrade_AmericaSentryDroneGun

  End

点评:这个模块单独存在是不起任何作用的,必须要配合该物体代码里的武器系统——WeaponSet代码才能发挥作用,这是由于升级后,该物体的武器系统将自动被游戏平台打上一个PLAYER_UPGRADE的条件标签,这个标签影响了WeaponSet的选取情况,于是导致了切换武器的效果。例如我们这样来设置一个物体的武器系统:

  WeaponSet

    Conditions  = None                                                                    默认武器系统,即升级前使用的武器系统

    Weapon    = PRIMARY      SonicZap

    Weapon    = SECONDARY   NormalMissile

  End

  WeaponSet

    Conditions  = PLAYER_UPGRADE                                            启动了WeaponSetUpgrade模块后使用的武器系统,同时默认武器系统将被屏蔽,暂时不被使用

    Weapon    = PRIMARY     SteadySonicZap

Weapon    = SECONDARY  ExplodeMissile

    Weapon    = TERTIARY     120mmX

  End

那么在升级之前,这个物体将以SonicZap为主武器,NormalMissile为副武器,没有第三武器。升级之后将更换为以SteadySonicZap为主武器,ExplodeMissile为副武器,多出了一个第三武器120mmX。而之前的SonicZapNormalMissile将暂时不再被使用(除非用邪恶的手段扣掉已经获得的这项升级,如UpgradeDie等,使武器系统的条件标签又退回到None,那么之前的武器将再次被使用,而升级后的武器将暂时不再被使用)。

 

  Behavior = ArmorUpgrade ModuleTag_XX                                         切换护甲系统,启动模块后,该物体的护甲系统的条件标签将更换为PLAYER_UPGRADE

    TriggeredBy = Upgrade_AmericaChemicalSuits                              这个模块的原理和WeaponSetUpgrade差不多,也需要配合ArmorSet语句,因此不再多讲,自己去体会它是如何切换的

  End

 

  Behavior = WeaponBonusUpgrade ModuleTag_XX                            武器强化,启动后,该武器的条件标签将更换为PLAYER_UPGRADE

    TriggeredBy = Upgrade_ChinaChainGuns

  End

点评:这个模块单独存在同样不起任何作用,必须要配合武器代码里的WeaponBonus语句才能发挥作用。例如在某个武器里加上这个语句:

WeaponBonus = PLAYER_UPGRADE  DAMAGE  150%

这里同样出现PLAYER_UPGRADE标签,可见WeaponBonus也是要识别标签才能发挥作用的。后面的DAMAGE表示强化伤害值,此外还可以选用RADIUS(伤害范围)、RANGE(射程)、RATE_OF_FIRE(攻速)、PRE_ATTACK(瞄准时间)。最后的150%表示变为原来的1.5倍。需要说明的是,提升攻速,填150%表示开火间隔时间缩短50%,即攻速加快,与TS正好是反的,同样瞄准时间也是如此,150%表示瞄准时间缩短50%,即更快地瞄准目标然后开火,这与TS又是反的,所以千万不要设置错了,否则就不是强化武器,而是弱化武器了。

 

  Behavior = LocomotorSetUpgrade ModuleTag_XX                             切换运动系统,启动模块后,该物体的运动系统的条件标签将更换为SET_NORMAL_UPGRADED

    TriggeredBy = Upgrade_ChinaNuclearTanks

  End

点评:这个模块单独存在同样不起任何作用,必须要配合物体代码里的Locomotor语句才能发挥作用。前面提到过灰熊的运动系统是这样设置的:

  Locomotor = SET_NORMAL              GrizzlyTankLocomotor

  Locomotor = SET_NORMAL_UPGRADED  GrizzlyTankSFLocomotor

这里出现了SET_NORMALSET_NORMAL_UPGRADED两个标签,可见Locomotor也要识别标签来选取对应的运动模式给物体使用。有人认为运动系统的切换方向是单向的,但我认为这种说法并不十分确切,因为摩托车模块已经证明了运动模式可以来回切换,因此事实上只能说,SET_NORMALSET_NORMAL_UPGRADED之间的切换是单向的,即只能是前者切换成后者,后者永远也不能再倒退回前者,哪怕用邪恶手段扣掉已经获得的Upgrade也退不回去。而它们与其他标签之间的切换却是双向的,这个将在今后的进阶案例里讲解。

 

  Behavior = UnpauseSpecialPowerUpgrade ModuleTag_XX                激活超武/技能,启动模块后,对应的超武/技能将恢复倒计时并允许被玩家使用

    SpecialPowerTemplate = SpecialAbilityHelixNapalmBomb                激活哪一个超武/技能。前提是这个超武/技能处于未激活状态,否则这个模块不起任何作用(已经激活了还需要再激活么?)

    TriggeredBy = Upgrade_HelixNapalmBomb

  End

点评:这个模块单独存在同样不起任何作用,必须要配合SpecialAbility模块和SpecialAbilityUpdate模块才能发挥作用,同时还需要在SpecialAbility模块里设置StartsPaused = Yes使这个超武/技能初始不激活,这样才能使用UnpauseSpecialPowerUpgrade模块来将之激活,否则如果这个超武/技能本身就已经活了,你再激一次也是白激。

 

  Behavior = ModelConditionUpgrade ModuleTag_XX                          获取模型条件标签,启动模块后,该物体的模型模块将获得一个特定的条件标签,使其外观形状发生变化

    ConditionFlag = USER_1                                                               

    TriggeredBy = Upgrade_ChinaSatelliteHackOne

  End

点评:这个模块单独存在同样不起任何作用,必须要配合物体代码里的W3DmodelDraw模块才能发挥作用,因为物体的模型也是要判断条件标签来显示对应的外观形状,所以有与没有某个条件标签将导致该物体模型外观发生改变。具体改变的原理将在今后讲解模型模块时专门讲解。

 

  Behavior = PowerPlantUpgrade ModuleTag_XX                                 获取额外电力,启动模块后,该物体可提供出额外的电力,其模型模块也将获得POWER_PLANT_UPGRADED条件标签

    TriggeredBy = Upgrade_AmericaAdvancedControlRods

  End

点评:这个模块单独存在同样不起任何作用,必须要配合物体代码里的EnergyBonus语句才能发挥作用,升级之后,该物体能提供出来的电力将加上EnergyBonus的参数得到最终电力提供量,例如EnergyProduction = 10,即默认提供10点电力,若有EnergyBonus = 5,则启动PowerPlantUpgrade模块后,该物体总共能提供出15点电力。此外由于W3DmodelDraw也获得了POWER_PLANT_UPGRADED条件标签,因此这个模块同样可以改变模型外观。

 

  Behavior = ReplaceObjectUpgrade ModuleTag_XX                            变身,启动模块后,该物体将变成另一个物体,而且没有TS那种变身限制,什么物体都可以相互变

    ReplaceObject = Chem_GLACommandCenter                               变身成什么东西

    TriggeredBy = Upgrade_BecomeRealGLACommandCenter

  End

点评:这个模块看起来蛮吸引人,实际上是个垃圾模块,因为变身前后的两个物体之间没有任何关联,也就是说,变身前的所有状态、经验值、等级、剩余生命值信息将全部丢失,变出来的物体是个新生的物体,不会继承变身前的任何信息。

 

  Behavior = RadarUpgrade ModuleTag_XX                                         开启雷达,启动模块后,将开启雷达屏幕功能

    TriggeredBy   = Upgrade_GLARadar

    DisableProof  = Yes                                                                       是否在停电时照常开启,按照TS的惯例,一般情况下应该设置为No,即停电后雷达关闭,来电了再开启

  End

 

  Behavior = StealthUpgrade ModuleTag_XX                                        启动隐形,启动模块后,该物体将隐形

    TriggeredBy = Upgrade_GLACamouflage

  End

 

  Behavior = SubObjectsUpgrade ModuleTag_XX                                /W3D模型块,启动模块后,该物体W3D模型里特定的模型块将被显示或隐藏

    TriggeredBy    = Upgrade_GLABombTruckBioBomb

    ShowSubObjects = Bombload02                                                    显示哪些模型块

    HideSubObjects = Bombload01 Bombload03 Bombload04             隐藏哪些模型块

  End

点评:这是改变物体外观的一种快速方法,不需要考虑什么条件标签,也不需要设置模型模块的语句

 

  Behavior = PassengersFireUpgrade ModuleTag_XX                          允许乘员对外开火,启动模块后,封闭型载具将变成开放型载具(好比防空履带车变战斗要塞),内部乘员可以对外开火

    TriggeredBy   = Upgrade_ChinaHelixBattleBunker

  End

 

  Behavior = GrantScienceUpgrade ModuleTag_XX                             免费获取技能证书,启动模块后,该玩家将免费获得一项技能证书,不花钱也不花经验点

    GrantScience = SCIENCE_MOAB                                                  取得哪项技能证书

    TriggeredBy = Upgrade_AmericaMOAB

  End

点评:这个模块说明,技能证书并不一定要靠杀敌人升级、积累经验点去学,可以拉关系、走后门非法获取。开个玩笑……

 

  Behavior = CommandSetUpgrade ModuleTag_XX                              切换建造栏/操作界面,启动模块后,该物体的建造栏/操作界面将换成你想要的一个,同时还可以扣掉某些已经获得的Upgrade

    TriggeredBy = Upgrade_SwitchToQ

    RemovesUpgrades = Upgrade_SwitchToW Upgrade_SwitchToQ   扣掉哪些已经获得的Upgrade

    CommandSet = FLMCVCommandSetQ                                          更换为哪个建造栏/操作界面

  End

点评:切换建造栏/操作界面在ZH里最精妙的用法就是制作“翻页键”,所谓翻页键就是指一个物体拥有2套以上建造栏/操作界面,相互之间靠一个键来回切换,就像FK3D里的基地车那样,Q页(基地建筑页)上有一个W键,按下之后翻到W页(防御建筑页),W页上也有一个Q键,按下之后又翻回到Q页。翻页之所以可以反复地来回切换,主要就是靠RemovesUpgrades来扣掉已经获得的Upgrade,使这个Upgrade对应的升级键(W键和Q键)可以反复多次的点击,不至于说点过一次就变灰并且“该升级已经完成”。

 

  Behavior = CostModifierUpgrade ModuleTag_XX                              调整造价,启动模块后,凡是含有对应类型标签的物体的造价将发生改变

    TriggeredBy  = Upgrade_CostReduction

    EffectKindOf = VEHICLE INFANTRY                                              只要含有其中任意一种类型标签的物体都将调整造价

    Percentage   = -25%                                                                     造价降低25%,负数表示降价,正数表示抬价

  End

点评:总感觉这个模块缺了点什么东西,那就是没有非逻辑,难以精确地让某些物体调整价格。例如我要想设置,只让所有坦克降价,飞机不降价,这就做不出来,因为飞机和坦克都含有VEHICLE标签,飞机还多一个AIRCRAFT标签,而这个模块缺少非逻辑,因此没办法将含有AIRCRAFT标签的物体排除出去,于是飞机也只有被迫和坦克一起接受价格调整。

 

  Behavior = ActiveShroudUpgrade ModuleTag_XX                              产生活动黑雾,启动模块后,该物体走在哪里就在哪里产生一团黑雾笼罩敌人的视野,就像RA2的裂缝发生器一样

    TriggeredBy = Upgrade_EnableGap

    NewShroudRange = 240                                                                产生黑雾的范围

  End

点评:这是一个可移动的裂缝发生器

 

  Behavior = StatusBitsUpgrade ModuleTag_XX                                   获取状态标签,启动后,该物体将获得一个特定的状态标签,并可以清除一个自身已经存在的状态标签

    TriggeredBy  = Upgrade_Amphibious

    StatusToSet  = CAN_ATTACK                                                        获得哪个状态标签

StatusToClear = UNSELECTABLE                                                   清除哪个自身已经存在的状态标签

  End

点评:没有被原版使用的模块,似乎可以用作邪恶的构思,因为强制给物体打上某种状态标签后,该物体将反映出相应的属性,因此可以利用升级的方式来改变物体的状态属性以获得特殊效果。关于状态标签的用法将在以后详细讲解。

 

5、 特殊生成类模块。这类模块启动之后都能免费获得某些特别的东西。但这个“东西”的含义有时候仅仅指被游戏视为什么类型的物体。

  Behavior = VeterancyGainCreate ModuleTag_XX                               免费获取等级

    StartingLevel = VETERAN                                                               该单位初始等级为老兵,VETERAN=老兵,ELITE=精英,HERO=王牌

    ScienceRequired = SCIENCE_TechnicalTraining                            需要学到某个技能证书才能启动该模块的功能

  End

点评:从效果上讲,仿佛是靠学习技能证书来切换对应单位的初始等级。

 

  Behavior = GrantUpgradeCreate ModuleTag_XX                               免费获取升级项目

    UpgradeToGrant  = Upgrade_Nationalism                                     获得哪个升级项目

    ExemptStatus = UNDER_CONSTRUCTION                                   当该物体在含有UNDER_CONSTRUCTION这个状态标签时不能获取,反过来说,不含这个标签时才能获取

  End

点评:前面说,技能证书可以靠关系走后门,而这里的升级项目也可以靠关系走后门,无需花费资金和时间去搞自主研发,难怪上汽的自主研发能力非常底下,却因为靠着大众和通用的关系坐在了中国汽车行业的头把交椅上,我彻底服了。

 

  Behavior = SpecialPowerCreate ModuleTag_XX                                 超武/技能关联者

    ;nothing                                                                                          这个模块没有参数,因此是默认自动启动。凡是使用了这个模块的物体将被游戏平台视为超武/技能关联者

  End

点评:这是超武建筑和指挥中心必有的模块,不过这个模块并不起什么实际作用,仅仅是用来让游戏将本体识别为超武/技能关联者,用于地图编辑器里作判断。因此省略掉也不会影响超武/技能的倒记时和发射

 

  Behavior = SupplyWarehouseCreate ModuleTag_XX                         矿地(补给站)

    ;nothing                                                                                          也没有参数,同样是默认自动启动。凡是使用了这个模块的物体将被游戏平台视为补给站,用于地图编辑器里作判断。

  End

 

  Behavior = SupplyCenterCreate ModuleTag_05                                 矿厂(资源采集中心)

    ;nothing                                                                                          也是自动启动(都说烦了)。凡是使用了这个模块的物体将被游戏平台视为资源采集中心,用于地图编辑器里作判断

  End

 

  Behavior = PreorderCreate ModuleTag_XX                                        预定??没搞懂有啥作用

    ;nothing

  End

 

  Behavior = LockWeaponCreate ModuleTag_XX                                 锁定武器,可将同一套武器系统中其中一种武器锁定为默认使用,而没有被锁定的武器暂时不能被使用

    SlotToLock = PRIMARY                                                                  将主武器锁定为默认使用,而副武器和第三武器则暂时不能被使用,除非利用SwitchWeapon(切换武器键)来更换武器

  End

点评:可以参考游骑兵是如何更换武器的。游骑兵的主武器是重机枪,副武器是闪光弹,而默认情况下是锁定在重机枪上的,因此游骑兵一般情况下攻击敌人是开枪,但绝对不会冒失地丢出一个闪光弹。只有当玩家用他操作界面上那两个切换武器键来将副武器锁定为当前使用时,叫他攻击敌人,他就会只丢闪光弹却不开枪了。

 

6、 超武/技能类。这类模块的通用语句是SpecialPowerTemplate,调用一个SpecialPower(以后简称SP)来控制该超武/技能的倒记时和施展时的范围指示圈。同TS类似,这类模块也分宏观和微观两种。宏观型模块可以单独存在并发挥作用。微观型模块则必须和其他很多代码组合起来才能发挥作用。需要注意的是,有些模块使用的SP是有讲究的,不能随便乱用,否则会失去作用。这个问题将在后面详细讲解。

  Behavior = CleanupAreaPower ModuleTag_XX                                  范围清扫,微观型。施展后本体在一定范围内侦察潜在危险(如地雷)并将之清扫,需要和CleanupHazardUpdate模块连用

    SpecialPowerTemplate = SpecialAbilityAmbulanceCleanupArea

    MaxMoveDistanceFromLocation = 300.0                                        最大清扫范围,以目标点为中心向周围延伸的距离,通常和对应SP的范围指示圈一样大

  End

  点评:如果使用这个超武/技能,则必须加上一个CleanupHazardUpdate模块来控制侦察范围、侦察频率以及清扫危险时所使用的“武器”

  Behavior = CleanupHazardUpdate ModuleTag_XX                             清扫危险功能修正模块,将在后面的功能修正类模块中详细讲解

    WeaponSlot            = PRIMARY                                            使用哪个武器来清扫危险,通常使用DamageType = HAZARD_CLEANUP的武器

    ScanRate              = 1000                                                     侦察频率,1000表示每秒侦察1

    ScanRange             = 100.0                                                  侦察距离,通常侦察距离不应该大于清扫武器的射程,否则本体会先侦察到危险,然后跑过去清扫,而不是就地处理

  End

 

  Behavior = CashBountyPower ModuleTag_XX                                   爆金币,宏观型。无需施展,本方任何单位杀死敌人后将获得敌人价格一定比率的金币奖励

    SpecialPowerTemplate = SpecialAbilityCashBounty1                       之所以无须施展,秘诀全在这里,这个SP需要特定的技能证书才能启动,因此只要学到技能证书就能启动该模块

    Bounty              = 5%                                                            杀死敌人获得的金币为敌人价格的百分之多少,例如杀死一个犀牛,将得到9005%,即45个金币

  End

点评:由于该模块的功能是由技能证书来进行切换的,因此可以重复做多个这样的模块,每获得一个更高一级的技能证书,爆出的金币价格比率就高一些,但我不太赞同这种结构,因为是宏观模块,比起PD平台的爆金币功能要拘束得多。

 

  Behavior = SpyVisionSpecialPower SpyTag_XX                                  偷窥基地,微观型。施展后将展示出所有敌人的基地情况,需要和SpyVisionUpdate模块连用

    SpecialPowerTemplate     = SuperweaponCIAIntelligence  

    BaseDuration             = 30000                                              偷窥持续时间,单位为毫秒

    BonusDurationPerCaptured = 10000                                              每施展一次获得的偷窥时间奖励,不知道是不是应该这样解释,我估计的……

    MaxDuration              = 240000                                            最大总偷窥时间

  End

 

  Behavior = SpecialAbility ModuleTag_XX                                            特殊能力,微观型。本体将获得一个可以施展的特殊能力,需要和SpecialAbilityUpdate模块连用

    SpecialPowerTemplate     = SpecialAbilityRedGuardCaptureBuilding

    UpdateModuleStartsAttack  = Yes                                                  开始施展该能力时修正该模块,即开始施展时将该SP暂时封冻,施展完成后放开,然后开始下一轮倒记时

    StartsPaused              = Yes                                                 初始时是否已激活。No表示初始时自动激活,Yes则反之,并需要UnpauseSpecialPowerUpgrade模块来将之激活

    InitiateSound              = RedGuardVoiceCapture                  开始施展该能力时播放的声音

  End

点评:特殊能力和超武的最大区别就在于射程,前者可以设置施展距离,若对很远的地方施展该能力,则本体必须先跑过去再施展(有点魔兽的味道),而后者不能设置施展距离,永远可以对全地图任意位置施展。只可惜ZHCNC3没有好好地强化这个模块,以至于特殊能力模块能实现的功能不远及超武那么丰富,所以要是想用特殊能力来做魔兽里的英雄技能,那简直就是痴心妄想。

 

  Behavior = FireWeaponPower ModuleTag_XX                                   特殊开火,微观型。施展时本体将用当前一切可发射的武器向目标点开火,需要和WeaponSet语句连用

    SpecialPowerTemplate = SpecialPowerBattleshipBombardment

    MaxShotsToFire      = 3                                                              开火倍数,施展时,一次性发射出正常情况下的多少倍弹药,假如正常攻击是21炮,施展时则变成23炮。

  End

点评:不太适用的模块。我没仔细测试过施展该超武/技能的时候,本体会不会把3种武器都以开火倍数那么多弹药一起发射出去,甚至根本不顾其中某个武器是否能攻击目标,如果WeaponSet搭配得不合理的话,很容易引起混乱。

 

  Behavior = OCLSpecialPower ModuleTag_XX                                    刷物体,微观型。施展时,本体将在特殊位置上刷出一系列物体,然后借刷出来的物体执行特定动作以实现超武打击过程

    SpecialPowerTemplate = SuperweaponParadropAmerica

    UpgradeOCL         = SCIENCE_Paradrop3 SUPERWEAPON_Paradrop3     提升到3级时所需要的技能证书,及施展时依据哪个OCL来刷物体(不以OCL_开头的OCL,可别看错)

    UpgradeOCL         = SCIENCE_Paradrop2 SUPERWEAPON_Paradrop2     提升到2级时所需要的技能证书,及施展时依据哪个OCL来刷物体

    OCL                 = SUPERWEAPON_Paradrop1                                       初始情况下(1级),施展时依据哪个OCL来刷物体

    CreateLocation       = CREATE_AT_EDGE_NEAR_SOURCE                         刷物体位置类型,有好几种可选,将在点评里说明

    OCLAdjustPositionToPassable = Yes                                                                   刷出来的物体是否自动调整位置,Yes表示刷出来的物体将自动被调整到可落脚的位置上,好比RA2里的伞兵,

  End                                                                     你若往水里投掷伞兵,GI的落点不会在水面上,而是会自动调整到距离投掷点最近的岸边

点评:这才是SAGE里最强大的超武/技能模块,感觉基本上就是沿袭了TS的微观超武结构和原理,并作了一定的提升,尤其是ZH的特色——同一个超武/技能可以有多个逐步强化的阶段,完美地和ZH的技能表关联了起来,使超武/技能可以通过学习进阶技能证书来强化,例如学伞兵证书,学完1级,一次性可投3GI,学完2级就变成一次性投6个,学完3级就变成1次性投9个。需要说明的是,UpgradeOCL语句存在先后次序,你必须把最高级别的一个放在最上面,最低级别的放在最下面,因此上面的例文里是先写3,再写2,最后写1。如果反过来写,则会导致学完进阶技能证书后,超武/技能却没有随之强化,那就等于是白学了。

CreateLocation语句控制着物体刷出位置,总共分为3类,分别为直接刷型(OCL的写法最为简单,直接将OCL里定义的所有物体刷到特定位置)、召唤运载型(OCL的编写比较复杂,在特定地图边界召唤出运载体,将特定的物体运载到目标点,然后投放)、自身运载型(本体就是运载体,因此无需再专门召唤运载体,OCL的写法类似于运载投放型),总共有以下这些参数可选:

CREATE_ABOVE_LOCATION                                                         直接刷型。刷在目标点上空大约6001000点之间的高度

CREATE_AT_LOCATION                                                                直接刷型。刷在目标点所在的地表面上,也是这个语句的缺省参数

CREATE_AT_EDGE_FARTHEST_FROM_TARGET                        召唤运载型。最远离目标点的地图边界

CREATE_AT_EDGE_NEAR_TARGET                                             召唤运载型。最靠近目标点的地图边界

CREATE_AT_EDGE_FARTHEST_FROM_SOURCE                       召唤运载型。最远离本体的地图边界

CREATE_AT_EDGE_NEAR_SOURCE                                            召唤运载型。最靠近本体的地图边界

USE_OWNER_OBJECT                                                                  自身运载型。必须和ScriptedSpecialPowerOnly = Yes语句连用

对于召唤运载型和自身运载型,由于是需要运载体,因此它们的OCL写法和一般的OCL不太相同,这个将在后面详细讲解。

 

  Behavior = DefectorSpecialPower ModuleTag_XX                             策反,宏观型。施展时,可将任何一个敌方的单位永久性地变成自己的人,有点像NP平台的永久控制

    SpecialPowerTemplate = SpecialPowerDefector

  End

  点评:估计是SAGE里最无聊而且最无能的一个模块,但却往往能引起菜鸟的关注,因为菜鸟肯定会联想起心灵控制。之所以说它无聊,是因为它根本不是真正的心灵控制,但却能吸引菜鸟的关注(主要还是因为菜鸟太菜的缘故),并且它可以不顾一切地控制整个地图上的任何目标,没有任何东西能抵挡它的控制,包括英雄,因此非常容易破坏平衡性,于是被ZHCNC3作为禁招屏蔽掉了。 之所以说它无能,是因为它一次性只能控制一个单位,总的来说,比TS的心灵控制垃圾得多,根本就找不到任何启用它的理由。在此我奉劝各位MODER,如果不想找抽,最好别启用这个模块。

 

  Behavior = CashHackSpecialPower ModuleTag_XX                           凭空洗钱,无须施展,只要点下按钮,就能送你多少个金币,因此这些金币并不是从敌人那里偷来的,而是凭空产生的

    SpecialPowerTemplate   = SuperweaponCashHack                     

    UpgradeMoneyAmount  = SCIENCE_CashHack3 4000                提升到3级时所需要的技能证书,以及洗出来的金币数量

    UpgradeMoneyAmount  = SCIENCE_CashHack2 2000                提升到2级时所需要的技能证书,以及洗出来的金币数量

    MoneyAmount          = 1000                                                    初始情况下(1级),洗出来的金币数量

  End

  点评:这是个比较无耻的模块,但在原版ZH里比起来还不算最无耻,因为最无耻的是美军的补给平台(用时间换金币)、中国的黑客+网络中心(坐在地上就挣钱,而且挣久了还升级),GLA的黑市(简直就是个变相的油井)。使用的时候注意UpgradeMoneyAmountMoneyAmount的排序,这跟OCLSpecialPower是一样的,高级在上,低级在下

 

  Behavior = OverchargeBehavior ModuleTag_XX                                超负荷运转,姑且算个技能,使本体可以在持续自残的情况下超负荷运转,例如电厂可以输出额外的电力

    HealthPercentToDrainPerSecond    = 3%                                    每秒钟扣掉自己百分之多少的生命值

    NotAllowedWhenHealthBelowPercent = 20%                                 当生命值低于这个百分比时,将强制恢复正常,并且无法再超负荷

  End

 

 

7、 功能修正类模块。这类模块通常以Update为后缀,能够定义某个单位的各种细节功能,例如加钱、刷物体、炮塔属性、FXOCL位置对应的骨骼点等等。但由于其种类过分地繁多,以至于有必要进行二次细分,将这些模块按照用法来分类讲解。

   1)一般属性修正。

  Behavior = AutoDepositUpdate ModuleTag_XX                                  送金币,油井的关键模块,可以像每隔一定时间加钱,但只能加正钱(涨钱),不能像TS那样加负钱(扣钱)

    DepositTiming     = 2000                                                             每隔多长时间送一次金币,单位为毫秒

    DepositAmount    = 20                                                                 每次送多少个金币,只能为正值,负值无效,将被视为0处理

    InitialCaptureBonus = 1000                                                             获得该物体后立刻送多少金币,就像占领油井后马上可获得1000现金

    ActualMoney       = No                                                               是否在送金币的时候在该物体头顶上显示送的钱数,似乎No才表示显示,Yes是隐藏

UpgradedBoost    = UpgradeType:Upgrade_AmericaSupplyLines  Boost:20          获得某个Upgrade后,每次多送多少金币

  End

  点评:EA脑壳有包,竟然把我们最期望的扣钱功能给干掉,这下做不出维护费概念了。

 

  Behavior = OCLUpdate ModuleTag_XX                                              自动刷物体,凡是用上该模块的物体,其建造栏/操作界面将丢失,自动更换为刷物体的倒计时进度条

    OCL         = OCL_AmericaSupplyDropZoneCrateDrop             按照哪个OCL来刷物体

    MinDelay     = 120000                                                                 最短需要延迟多长时间才能开始刷物体,单位为毫秒

    MaxDelay     = 120000                                                                最长延迟时间,同上

    CreateAtEdge = Yes                                                                       是否从地图边缘刷出来。Yes表示从地图边缘刷出来(那就需要在OCL里配运载体),No则直接刷在本体身上

  End

  点评:ZH里的美军补给平台就是这样做出来的。事实上我们可以设置CreateAtEdge = No来干一些偷懒的构思,这样可以得到一个不需要手工去按键就能自动刷出物体的东西。AS的房子造房子概念就是用了这个模块实现的。

 

  Behavior = RadiusDecalUpdate ModuleTag_XX                                 范围贴图,没有可设置的语句,尚未测试出它能如何影响物体的贴图

    ; nothing

  End

 

  Behavior = FloatUpdate UpdateTag_XX                                              漂浮属性,使本体能像直升机那样在半空中摇曳摆动(终于遇到有史以来第一个不用ModuleTag_作为前缀的模块编号)

    Enabled = No                                                                                  是否允许悬浮,Yes则本体能飘到半空中去摆动,No则只能在地面(似乎应该说是水面才对)上摇曳

  End

 

  Behavior = LifetimeUpdate ModuleTag_XX                                        生存时间,使本体从诞生起,只能存活多长时间,时间到了自动自杀,这是TS想都不敢想的功能!

    MinLifetime = 3000                                                                         最短生存时间,单位为毫秒

    MaxLifetime = 6000                                                                        最长生存时间,通上

  End

 

  Behavior = DeletionUpdate ModuleTag_XX                                        存留时间,和生存时间的作用有点类似但时间到了不会自杀,而是直接消失掉,同时删除人口空间,等于是不声不响地自杀

    MinLifetime = 125                                                                           控制时间的语句和生存时间一样,就不多说了(结果还是多说了)

    MaxLifetime = 500

  End

  点评:这两个模块作用非常大,大得我根本不知道从哪里来证明,总之,SAGE引擎如果缺了这两个模块将一事无成。但不得不提3个让人忍俊不禁的BUG,这个BUG似乎是从TS流传下来的。

第一  你给某个单位加上最短30秒的LifetimeUpdate或者DeletionUpdate,然后将它装进运输单位、碉堡、地道或中立房子,等半个小时回来看,那家伙竟然还在里面呆着没死,也没消失。但你一放它出来,它就马上死或者消失在你面前。

第二  还是给它加上最短30秒的LifetimeUpdate或者DeletionUpdate,然后将它装进运输单位、碉堡、地道或中立房子,然后马上放出来,那家伙竟然立刻死或者消失在你面前,明明30秒还没到,那家伙竟然就慌着见阎王去了……

第三  给某个步兵加上最短30秒的LifetimeUpdate或者DeletionUpdate,然后将它装进摩托车,然后再把摩托车装进地道,然后立刻再把摩托车从地道里放出来,结果摩托车刚一出洞口就莫名其妙地倒了。这个BUGASIFV上典型地存在着,但在FK3D里被修复了。想知道我是怎么修复的吗?等后面讲到摩托车运载模块时再告诉你。

 

  Behavior = StealthUpdate ModuleTag_XX                                          隐形,使本体获得隐形能力,并可设置其隐形能力的属性

    StealthDelay                = 2000                                             延迟多长时间才恢复隐形(通常表示挨打后被揭露多长时间然后恢复隐形),单位为毫秒,0表示立即恢复隐形

    StealthForbiddenConditions  = NONE                                           在具备哪些条件标签的时候显形,NONE表示永远隐形,你也可以自己设置一些标签,例如使之开火时显形

    FriendlyOpacityMin          = 0.0%                                            在盟友眼里的最小半透明程度

    FriendlyOpacityMax          = 0.0%                                            在盟友眼里的最大半透明程度,两个值不同的时候,可以实现闪烁效果

    InnateStealth                = Yes                                              初始是否隐形,用No的话则需要StealthUpgrade模块来开启隐形功能

    OrderIdleEnemiesToAttackMeUponReveal  = No                          当被敌人探测到时,是否会被空闲的敌人部队攻击,一般应该使用Yes比较好

  End

 

  Behavior = StealthDetectorUpdate ModuleTag_XX                             探测隐形,使本体可以在一定范围内探测敌人的隐形物体并将之揭露出来

    DetectionRate           = 500                                                     探测频率,每500毫秒探测一次

    DetectionRange         = 150                                                     探测范围,缺省值为本体的视野范围,即VisionRange语句的参数

    CanDetectWhileContained = Yes                                                    当本体被装在运载体内部时能否继续探测

    ExtraRequiredKindOf     = INFANTRY                                         只能探测含有哪些类型标签的物体

ExtraForbiddenKindOf    = HERO                                                不能探测含有哪些类型标签的物体

  End

  点评:再次遇到用类型标签来区分情况的模块,因此千万注意不要搞出冲突。

 

  Behavior = PowerPlantUpdate ModuleTag_XX                                   电厂修正,对于那些能升级电力的电厂,可以控制升级过程的持续时间,这个时间过了之后才能彻底完成升级

    RodsExtendTime = 600                                                                  完成Upgrade后,外挂部件(例如原版的能量棒,和FK的动力涡轮)在多少毫秒内慢慢地长出来,而不是瞬间刷出来

  End

 

  Behavior = RadarUpdate ModuleTag_XX                                            雷达修正,对于具有雷达功能的物体,可以控制雷达屏幕打开的持续时间,在这段时间里,雷达屏幕将慢慢打开

    RadarExtendTime   = 4000                                                           完成Upgrade后,雷达屏幕将在多少毫秒内慢慢打开,而不是瞬间打开

  End

 

  Behavior = AnimationSteeringUpdate ModuleTag_XX                         动画控制,可以修正3D动画的持续时间,感觉是个垃圾模块,因为需要它修正的动画修正不了,尽修正些不需要修正的

    MinTransitionTime = 300                                                                 最小动画持续时间,单位为毫秒

  End

  点评:这个模块似乎只和摩托车运载模块一起用,一开始我以为它能控制换乘员时摩托车的变形动作,但屡试屡败后才发现,原来这个模块是控制摩托车倒地动作的,也就是说,不加这个模块,摩托车在失去乘员后会瞬间倒地,加上之后才有一个倾翻的过程动作,当时简直有种想砸显示器的冲动……

 

  Behavior = HordeUpdate ModuleTag_XX                                           群聚强化,当一定数量的单位聚集在一定范围内时,这些单位可获得一个临时的WeaponBonus强化标签

    RubOffRadius = 150                                                                       群聚范围,群聚者最大有效范围

    UpdateRate = 1000                                                                         每隔多长时间检测一次群聚情况,单位为毫秒

    Radius = 75                                                                                    有效间距,群聚者彼此相距不超过到这个距离才能被认为是有效群聚

    KindOf = VEHICLE                                                                         允许带有哪些类型标签的群聚者获得强化

    AlliesOnly = Yes                                                                              是否允许盟友加入群聚时获得强化,No则表示只能自己人与自己人群聚时获得强化

    ExactMatch = Yes                                                                           是否要求必须是同一种单位才能获得强化,No则表示只要都带有相同类型标签的群聚者就能获得强化

    Count = 5                                                                                        符合要求的群聚者达到多少数量时才能获得强化

    Action = HORDE                                                                             获得哪一种强化标签,这种标签同时还会在这些群聚者的脚底下产生一定的特殊图像符号,例如星星或圆圈

  End

  点评:这个模块仅仅只能让群聚者获得一个强化标签,真正要实现强化效果,还需要设置GameData.ini里相应的武器强化规则。

 

  Behavior = AssistedTargetingUpdate ModuleTag_XX                         引导开火,自身开火时,可以引导周围一定范围类同类单位跟着它一起向目标开火

    AssistingClipSize = 4                                                     被引导者一次性辅助开火的弹药数量

    AssistingWeaponSlot = SECONDARY                                            被引导者使用哪个武器来进行辅助开火

    LaserFromAssisted = AirF_PatriotBinaryDataStream                       引导者与被引导者之间使用哪个光束来连接

    LaserToTarget     = AirF_PatriotBinaryDataStream                       被引导者与目标之间使用哪个光束来连接

  End

  点评:使用了引导开火模块的物体,同一个WeaponSet里至少必须含有2种以上武器,并且还要确保其主动开火的武器代码里有RequestAssistRange语句来确定引导距离,例如我们把主武器作为主动开火,副武器作用辅助开火,我们就需要在主武器的代码里加上引导距离,假定RequestAssistRange = 240.0。这样一来,只要我们将几个这样的物体放在一堆,彼此之间的距离小于240像素时,只要其中一个物体开火,那么它周围的其他物体就会收到它的引导,并跟随它一起向目标开火。反之,距离开火者大于240像素的同类物体则收不到它的引导,也不会跟随它进行开火。

  另外有必要提的是,使用这个模块后,会将其中一种武器设置成了辅助开火武器(例如上面将副武器设置为辅助开火武器),那么在主动开火时,该物体就不会将这种武器发射出去。同时,当该物体在进行辅助开火的时候,也只将被设置为辅助开火的武器发射出去。

 

  Behavior = HijackerUpdate ModuleTag_XX                                        劫持犯修正,用于含有进入式占领模块的单位,当它占领了敌方飞机后,该飞机在空中被毁时,它将跳伞逃生

    ParachuteName = AmericaParachute                                              劫持犯逃生时使用什么降落伞

  End

 

  Behavior = FireOCLAfterWeaponCooldownUpdate ModuleTag_XX   连续开火刷物体,需要连续开火多少发才能在落点处引发一个持续多长时间的刷物体系统,这个系统将自动刷出物体

    WeaponSlot            = SECONDARY                                      使用哪个武器来产生连续开火刷物体功能

TriggeredBy                     = Upgrade_GLAAnthraxBeta                   拥有了哪个Upgrade后才能启动该模块

    ConflictsWith           = Upgrade_GLAAnthraxGramma             拥有了哪个Upgrade后关闭该模块

    OCL                   = OCL_PoisonFieldMedium                    按照哪个OCL来刷物体

    MinShotsToCreateOCL   = 4                                                         最少需要连续开火4次才能引发出刷物体系统,这个系统将在生存时间之内按照OCL不停的自动刷物体

    OCLLifetimePerSecond  = 10000                                                 刷物体系统每秒种增加多长的生存时间,单位为毫秒

    OCLLifetimeMaxCap     = 180000                                               刷物体系统最长累计生存时间,同上

  End

 

  Behavior = ProductionUpdate ModuleTag_XX                                    工厂修正,定义工厂的成倍生产属性以及厂门属性等

QuantityModifier             = ChinaInfantryRedguard   2        生产某种单位时花一倍的造价可同时产出多少个这样的单位,前提是该工厂能生产这种单位。可多定义几行,每行一种单位

    NumDoorAnimations          = 1                                                 该工厂有多少个活动的门,所谓活动就是指具有3D动画,因此这需要和外观模块的定义以及W3D模型块的命名对应

    DoorOpeningTime            = 2000                                          厂门打开过程持续时间,单位为毫秒

    DoorWaitOpenTime           = 3000                                          厂门保持敞开的持续时间

    DoorCloseTime              = 2000                                           厂门关闭过程持续时间

    ConstructionCompleteDuration = 1500                                           从生产完成到单位产生之间需要间隔多长时间,也就是说,生产完成后,单位不会马上出现,必须过了这段时间才出现

  End

  点评:ConstructionCompleteDuration定义的时间,加上被产单位从诞生点走到厂门所需要的时间的总和不能比DoorOpeningTime定义的开门时间短,否则会出现门还没开完,单位就“破门而出”的尴尬局面。由于一个工厂通常能够生产很多种单位,这些单位速度有快有慢,因此要用最快的单位来计算时间,如果你嫌麻烦,最好是将ConstructionCompleteDuration的参数设置得和DoorOpeningTime一样。

 

  Behavior = ProneUpdate ModuleTag_XX

    DamageToFramesRatio = 5.0 ; I take 20 damage, I go prone for 100.  For this guy, if any of my buds or my building take damage too (I have SlaveUpdate + ProneUpdate) Prone may get cut by itself though

  End

 

  Behavior = MissileLauncherBuildingUpdate ModuleTag_XX               超武/技能发射器修正,定义该物体在发射超武/技能时的EFGH动作(什么叫EFGH动作?看点评)

    SpecialPowerTemplate = SuperweaponNeutronMissile                   对应哪个SP,当该SP处于不同倒计时情况时,该物体产生相应的EFGH动作

    DoorOpenTime         = 8000                                                    开门动作持续时间(F),类似RA2里,核弹井打开,核弹竖立起来的这个动作

    DoorWaitOpenTime     = 2000                                                     就绪等待动作持续时间(G),类似RA2里,核弹攻击已经就绪但尚未发射时,核弹一直竖立在核弹井里的动作

    DoorCloseTime        = 8000                                                      关门动作持续时间(H),类似RA2里,核弹已经发射升空,核弹井就自动关闭,然后开始下一轮倒计时

    DoorOpeningFX        = ChinaNuclearMissileLauncherDoorOpen           开门过程中产生什么样的FX特效,比如心灵控制器在开门的时候会出现剧烈闪光

    DoorWaitingToCloseFX  = ChinaNuclearMissileLauncherLaunch                超武发射升空后,等待关门时产生什么样的FX特效

    DoorClosingFX        = FX_ABPowerPlantExplode                     关门过程中产生什么样的FX特效

    DoorOpenIdleAudio    = BuildingNeutronMissileHiss                   超武已经就绪但未发射的过程中,一直播放的效果音

  End

  点评:对于某些没有做过TSMOD,直接进入SAGEMODER,我不得不解释一下什么叫EFGH动作。这个称呼的来历是RA2将超武建筑的状态分为空闲、开门、就绪、关门,而他们在Art.ini里定义这4个状态对应模型名称时使用后缀E表示空闲,F表示开门,G表示就绪,H表示关门。因此后来就广泛地被MODER们称为EFGH动作。

 

  Behavior = RepairDockUpdate ModuleTag_XX                                   维修厂修正,使本体获得维修单位的能力,并定义修到满血需要花费多长时间以及排队位置

    TimeForFullHeal          = 5000                                                 修复时间,单位为毫秒,这是指从死血修到满血需要花费的时间,因此实际上是以当前生命值按照这个比例来计算时间

    NumberApproachPositions = 5                                                       排队等待位置有多少个点,需要对应W3D里的骨骼点,排队的单位将站在这些点上等待进入

  End

 

  Behavior = DemoTrapUpdate ModuleTag_XX                                     陷阱修正,用于陷阱类物体,控制敌人靠近它时引发它开火的各种方式

    DefaultProximityMode      = Yes                                                 是否使用默认引发模式

    DetonationWeaponSlot     = PRIMARY                                        自动引发时使用哪个武器开火

    ProximityModeWeaponSlot  = SECONDARY                                 敌人靠近时引发它使用哪个武器开火

    ManualModeWeaponSlot    = TERTIARY                                     手动引爆(通过点击界面按钮)时它使用哪个武器开火

    TriggerDetonationRange    = 40.0                                                引发距离。当敌人离它的距离小于这个值时,引发成功

    IgnoreTargetTypes         = PROJECTILE UNATTACKABLE     排除含有哪些类型标签的“敌人”。含有这些类型标签的敌人不会引发它

    AutoDetonationWithFriendsInvolved = Yes                                     当附近盟友遇到麻烦时自动引发,貌似判断盟友的距离也是由TriggerDetonationRange决定的(连盟友都炸么?)

    DetonateWhenKilled        = Yes                                                引发后是否自杀

  End

 

  Behavior = PilotFindVehicleUpdate   ModuleTag_XX                        自动寻找载具,用于驾驶员,它在空闲时能自动扫描身边有没有符合要求的载具,如果有,就自动跑过去

    ScanRate  = 1000                                                                          1秒钟扫描一次

    ScanRange = 300                                                                           扫描范围

    MinHealth  = 0.5                                                                            当扫描到的载具的生命值不足多少时,它就不去,0.5表示50%

  End

  点评:这个模块只能控制本体在空闲状态时的动作(似乎放到人工智能类里比较合适),至于它能否进入被扫描到的载具,还取决于它是否含有接触类模块,例如驾驶员的VeterancyCrateCollide模块。如果没有的话,它顶多跑到载具面前就不动了,因为进不去……。此外我暂时还不知道能不能把这个模块放到劫持犯上去用,使它自动扫描敌人的载具,然后自动跑过去将之捕获。

 

  Behavior = CommandButtonHuntUpdate  ModuleTag_XX                 猎杀修正,用上这个模块的单位将可以利用触发动作来执行满地图寻找敌人来杀的动作脚本

  End

 

  Behavior = CleanupHazardUpdate ModuleTag_XX                             清扫危险功能修正模块,前面讲CleanupAreaPower模块的时候提到过它,因为它才是实际产生作用的模块

    WeaponSlot            = PRIMARY                                            使用哪个武器来清扫危险,通常使用DamageType = HAZARD_CLEANUP的武器

    ScanRate              = 1000                                                     侦察频率,1000表示每秒侦察1

    ScanRange             = 100.0                                                  侦察距离,通常侦察距离不应该大于清扫武器的射程,否则本体会先侦察到危险,然后跑过去清扫,而不是就地处理

  End

 

  Behavior = PointDefenseLaserUpdate ModuleTag_XX                       自动反制修正,使本体时刻扫描周围,当发现符合要求的目标时都能够自动发射特定武器来反制之

    WeaponTemplate      = PaladinPointDefenseLaser                     反制时使用哪个武器,这个武器不需要写在WeaponSet里,也就是说是一种额外的武器

    PrimaryTargetTypes    = BALLISTIC_MISSILE SMALL_MISSILE        遇到含有哪些类型标签的目标时会立刻启动反制

    SecondaryTargetTypes  = INFANTRY                                           遇到含有哪些类型标签的目标时可能会准备启动反制(优先级别比上面一条低)

    ScanRate              = 500                                                       每半秒种扫描一次

    ScanRange             = 120.0                                                  扫描范围

    PredictTargetVelocityFactor = 3.0                                                   预测目标速度的因素,即常言道的“打提前量”

  End

 

  Behavior = FirestormDynamicGeometryInfoUpdate ModuleTag_XX   动力学形体尺寸修正,定义一个尺寸不断变化的物体在各个时刻时的形体参数

    InitialDelay         = 800                                                              初始延迟时间,即初始时刻从哪个时候开始

    InitialHeight        = 10.0                                                             初始高度

    InitialMajorRadius  = 1.0                                                                初始主半径

    FinalHeight        = 10.0                                                             最终高度

    FinalMajorRadius   = 90.0                                                             最终主半径

    TransitionTime     = 3000                                                             过渡过程持续时间

    ReverseAtTransitionTime = Yes                                                      是否反转时间,启动双向过渡,即变过去然后又变回来

    ScorchSize        = 100.0                                                           弹坑尺寸

    ParticleOffsetZ = 0.1                                                                      粒子系统产生点的Z方向偏移量

    ParticleSystem1 = FireStormMain                                                   粒子系统1

    ParticleSystem2 = FireStormMainRing                                            粒子系统2

    FXList          = FX_FireStorm                                                   引发哪个FX特效

    DelayBetweenDamageFrames = 500                                              相邻伤害帧之间的延迟间隔时间

    DamageAmount             = 100.0                                            伤害值大小,尚不知道产生伤害的DamageType是哪个

  End

  点评:从字面上来看好像是用来做一个尺寸不断变化的射弹体或者弹头

 

  Behavior = HeightDieUpdate ModuleTag_XX                                     高度死亡修正,定义一个物体在处于什么高度时自杀

    TargetHeight                 = 15.0                                           引发自杀的高度

    TargetHeightIncludesStructures = Yes                                            当该物体处于建筑头顶上时,是否以建筑的顶面高度作为参考基准

    OnlyWhenMovingDown       = Yes                                             仅当该物体下落到高度低于TargetHeight参数值时引起自杀

    SnapToGroundOnDeath       = Yes                                            引发自杀的瞬间立刻闪到地面上,哪怕中途还存在一定距离,换言之就是说死必须死在地面上,不能死在半空中

    InitialDelay                   = 1000                                          初始延迟时间

  End

 

  Behavior = EnemyNearUpdate ModuleTag_XX                                   靠近敌人修正,暂时不知道有啥作用

    ;nothing

  End

 

  Behavior = FlammableUpdate ModuleTag_XX                                    持续燃烧修正,当遭受DamageType=Fire的武器攻击之后,会使之持续燃烧受损一段时间

    AflameDuration = 5000                                                                   燃烧持续时间

    AflameDamageAmount = 5                                                              每隔一定时间扣掉多少生命值

    AflameDamageDelay = 500                                                             每隔多长时间扣一次生命值

    BurningSoundName = GenericFireMediumLoop                            燃烧时持续播放的效果音

  End

 

  Behavior = FireSpreadUpdate ModuleTag_XX                                    火种扩散修正,使正在燃烧的物体将周围其他物体点燃,使它们也开始持续燃烧

    OCLEmbers       = OCL_BurningEmbers                                   扩散时刷出什么东西,例如,火球、火星

    MinSpreadDelay   = 1000                                                             发生火种扩散时的最短延迟时间

    MaxSpreadDelay   = 2000                                                             发生火种扩散时的最长延迟时间

    SpreadTryRange   = 50                                                                 火种成功扩散的最大距离,超过这个距离的其他物体将无法被点燃

  End

 

  Behavior = FireWeaponUpdate ModuleTag_XX                                  自动开火修正,使本体在没有开火的时候使用不停地发射一个特定的额外武器,通常这个额外武器是个自释放型武器

    Weapon = SneakAttackShockwaveWeaponSmall                            未开火时不停地发射哪个武器

    InitialDelay = 10                                                                              第一次发射时延迟多长时间

  End

  点评:原版的微波坦克就是这样做出能把步兵烤焦的能力的。通常来说,这个自动开火的武器应该是自释放型的武器,即以开火点为中心向四周辐射的范围伤害武器,如果是一般武器的话,我怀疑它会盲无目的地乱打。此外还有一点不得不提,带有自动开火修正的物体,如果被装进了运输船之类的“容器”,那么自动开火将立刻停止,等到你放它出来时,它才会继续开火。后面讲到FK3D如何避免到IFV自爆BUG的时候会用到这个修正。

 

  Behavior = WeaponBonusUpdate ModuleTag_XX                              武器强化修正,使本体不停地释放一个光环效应,周围一定范围内的其他物体在一定时间内获得一个武器强化标签

    RequiredAffectKindOf = CAN_ATTACK                                          含有哪些类型标签的物体能够获得强化标签

    ForbiddenAffectKindOf = STRUCTURE                                         含有哪些类型标签的物体不能获得强化标签

    BonusDuration = 10000                                                                  获得的强化标签能持续有效多长时间

    BonusDelay = 100000                                                                    本体每隔多长时间释放一次光环

    BonusRange = 200                                                                         距离本体多远距离内的物体能够获得强化标签

    BonusConditionType = FRENZY_ONE                                           获得哪种的强化标签

  End

 

  Behavior = EMPUpdate ModuleTag_XX                                             电磁脉冲修正,使靠近本体一定范围的周围单位遭受一定时间的EMP封锁

    DisabledDuration    = 10000                                                        封锁持续时间

    Lifetime            = 500                                                             本体生存时间,即脉冲持续时间,控制着本体外观尺寸的变化情况

    StartFadeTime      = 100                                                             开始淡入的时间

    StartScale          = 0.01                                                            开始时本体的外观尺寸比率

    TargetScaleMin     = 2.00                                                            最终时本体的外观尺寸最小比率

    TargetScaleMax     = 3.00                                                            最终时本体的外观尺寸最大比率

    StartColor          = R:0 G:255 B:255                                         开始时本体的染色情况,RGB分别代表红绿蓝的饱和度,最小0,最大255

    EndColor           = R:0 G:128 B:128                                        最终时本体的染色情况

    EffectRadius        = 60                                                              EMP效应的作用范围

    DisableFXParticleSystem = EMPSparks                                          被封锁的单位身上出现的电火花粒子系统

    DoesNotAffect      = ALLIES                                                       不封锁哪些类型的目标

    DoesNotAffectMyOwnBuildings = Yes                                            不封锁自己人的建筑(仅仅是不封锁建筑,但依然还要封锁自己人的部队)

  End

 

  Behavior = MobMemberSlavedUpdate ModuleTag_XX                      班组修正,控制一个班组里所有组员时刻保持队形

    MustCatchUpRadius      = 40                                                      组员在掉队多远的时候会自动跟近,换言之就是说任何组员不得离开班组多远

    NoNeedToCatchUpRadius = 15                                                      组员在距离班组多近的时候不需要再自动跟近,相当于任何组员和班组之间的距离在1540之间随时调整

    Squirrelliness            = 0.05                                                   松鼠线形?没搞懂是啥意思

    CatchUpCrisisBailTime    = 30                                                      班组在保持距离时的整队时间,也就是说,掉队的组员会在30帧内快速跑回来靠近其他组员

  End

  点评:班组概念在ZH里暂时还是个初次的尝试,因此暴民还存在不少让人忍俊不禁的BUG,因此暂时不提倡在ZH里使用班组,要用最好到CNC3里去用

 

  Behavior = SlavedUpdate ModuleTag_XX                                          从属修正,没有语句,仅仅让游戏平台把本体视为某个主体的Option,使本体从属于它的主体

    ;nothing

  End

 

  Behavior = StructureCollapseUpdate ModuleTag_XX                         崩塌修正,使本体在死亡时发生崩塌,刷出一系列物体、引发一系列FX特效

    MinCollapseDelay        = 500                                                    最小崩塌延迟

    MaxCollapseDelay        = 1000                                                 最大崩塌延迟,即死亡瞬间不会马上崩塌,要延迟一段时间才开始崩塌

    CollapseDamping         = 0.0                                                    崩塌阻尼

    MaxShudder              = 0.6                                                   崩塌时的最大抖动程度

    MinBurstDelay           = 250                                                    最小爆炸延迟

    MaxBurstDelay           = 800                                                   最大爆炸延迟

    BigBurstFrequency       = 4                                                        爆炸产生频率,单位大概是次每秒

    OCL                     = INITIAL   OCL_StructureCollapseInitial               以下是崩塌过程中刷出的物体以及引发的FX特效

    OCL                     = DELAY     OCL_StructureCollapseDelay

    OCL                     = FINAL     OCL_StructureCollapseFinal

    FXList                  = INITIAL   FX_StructureCollapseInitial

    FXList                  = DELAY     FX_StructureCollapseDelay

    FXList                  = BURST     FX_StructureCollapseBurst

    FXList                  = FINAL     FX_StructureCollapseFinal

  End

 

  Behavior = StructureToppleUpdate ModuleTag_XX                            倾倒修正,使本体在死亡时发生整体倾倒,砸到东西可以产生伤害

    MinToppleDelay      = 250                                                           最小倾倒延迟

    MaxToppleDelay      = 500                                                          最大倾倒延迟,同样在死亡瞬间不会马上倾倒,要延迟一段时间才开始倾倒

    MinToppleBurstDelay = 1500                                                          最小爆炸延迟

    MaxToppleBurstDelay = 2500                                                         最大爆炸延迟

    StructuralIntegrity    = 0.75                                                           本体完整程度,1表示100%完整,即从根部断裂,0.75则大约是中部偏下的地方断裂

    StructuralDecay      = 1.0                                                            本体腐朽程度,没搞懂有啥意义,难道是指在倾倒过程中不会散架?

    DamageFXTypes      = ALL WATER                                          被哪些DamageType的武器打死后引发受损FX特效

    ToppleStartFX        = FX_DefaultStructureToppleStart               开始倾倒时引发的FX特效

    ToppleDelayFX        = FX_DefaultStructureToppleDelay           倾倒过程中引发的FX特效

    CrushingFX           = FX_SmallTowerCrushing                        砸到东西时引发的FX特效

    AngleFX              = 20.0 FX_StructureToppleAngle20          倾倒角度以及倒至这个角度时引发的FX特效

    ToppleDoneFX        = FX_DefaultStructureToppleDone            完全倒地时引发的FX特效

    CrushingWeaponName  = ToppledStructureWeapon                     用哪个武器去砸下面的人

  End

 

  Behavior = ToppleUpdate ModuleTag_XX                                          倾倒反弹修正

    ToppleFX = FX_ToppleLampPost                                                    倾倒时引发的FX特效

    BounceFX = FX_LampPostBounce                                                 反弹时引发的FX特效

  End

 

  ClientUpdate = SwayClientUpdate ModuleTag_XX                             摇曳服务修正,使物体能像树木一样摇曳,实际上也就是树木专用的一个模块

    ;nothing

  End

 

  Behavior = CheckpointUpdate ModuleTag_03                                    检查站修正,使本体获得检查站的功能,至今不知道检查站是个啥东西

    ;nothing

  End

 

  Behavior = WaveGuideUpdate ModuleTag_04

    WaveDelay                  = 750    ;(in milliseconds)delay till wave starts moving

    YSize                      = 650.0  ;size in Y

    LinearWaveSpacing          = 15.0   ;linear waves get pushed up at these intervals across

    WaveBendMagnitude          = 500.0  ;shape of wave (larger # = more flat and 0 = straight line)

    WaterVelocity              = 2.7    ;in dist per sec, velocity to "push up" the water

    PreferredHeight            = 37.3   ;water level we want to be after the wave

    ShorelineEffectDistance     = 5.0   ;this far behind the wave we "hit" the shores

    DamageRadius               = 25.0   ;damage things this far from us

    DamageAmount               = 99999  ;do this much damage

    ToppleForce                = 0.25   ;force strength we topple things with

    RandomSplashSound          = WaveRandomSplash

    RandomSplashSoundFrequency = 50     ;every so often a # from 1-100 is chosen, if above this number the sound will play

    BridgeParticle             = WaveHitBridge01 ;particle system when wave hits a bridge

    BridgeParticleAngleFudge   = -95.0  ;angle to offset the bridge particle angle

    LoopingSound               = DamBreakWaveLoop

  End

 

  Behavior = TensileFormationUpdate ModuleTag_XX

    Enabled = No ; Damage condition amt ofhurt to any member of the formation will enable them all

    CrackSound = AvalancheCrack

  End

 

  Behavior = SmartBombTargetHomingUpdate ModuleTag_XX

    CourseCorrectionScalar = 0.99 ; 1=no homing, 0=snapto; 0.99=smooth, 0.95=too-fast

  End

 

   2)位置/骨骼点修正。

  Behavior = SupplyCenterDockUpdate ModuleTag_XX                       资源采集中心修正

    NumberApproachPositions = 9                                                       本体将有多少个卸货位置以对应W3D里的骨骼点

  End

 

  Behavior = SupplyWarehouseDockUpdate ModuleTag_XX                补给站修正

    AllowsPassthrough = No                                                                 是否允许其他单位从本体上面踩过,补给站应该使用No,矿石则可以使用Yes

    NumberApproachPositions = -1                                                      本体将有多少个装货位置以对应W3D里的骨骼点,-1表示无穷大

    StartingBoxes     = 400                                                                初始资源箱数量,乘以箱子单价可以算出一个补给站上的最大资金量是多少

  End

 

  Behavior = RailedTransportDockUpdate ModuleTag_XX                    火车修正

    NumberApproachPositions = 9                                                       本体将有多少个门口以对应W3D里的骨骼点

    PullInsideDuration      = 4500                                                     拉进持续时间?

    PushOutsideDuration   = 4500                                                     推出时序时间?没搞懂什么叫拉进推出,大概是指旅客上下火车需要走这么长时间

    ToleranceDistance      = 400.0                                                    站台距离门口的最大距离

  End

 

  Behavior = BoneFXUpdate ModuleTag_XX                                        FX骨骼修正

    DamageFXTypes     = ALL WATER                                     被什么武器伤害后产生受损FX

    RubbleFXList1       = bone:Smoke02  OnlyOnce:Yes   3000 3000  FXList:FX_DefaultStructureSecondary

                                               骨骼名称        只引发一次        延迟时间             FX特效

    DamageParticleTypes  = ALL WATER                                   被什么武器伤害后产生粒子系统

    RubbleParticleSystem1 = bone:Fire02    OnlyOnce:Yes   3000 3000  PSys:StructureToppleSmokeTrail

                                               骨骼名称        只引发一次        延迟时间             粒子系统

  End

  点评:注意延迟时间的两个值,前面一个是最小值,后面一个是最大值。其含义是在遭受特定DamageType的武器攻击时,需要延迟一定时间,在特定骨骼点引发FX特效或粒子系统,可以通过OnlyOnce:Yes还是No来决定是只引发一次还是不停地引发下去

 

  Behavior = SpawnPointProductionExitUpdate ModuleTag_XX            卵生工厂的产出点修正

    SpawnPointBoneName = SpawnPoint                                             产出点位置对应哪骨骼点

  End

 

  Behavior = DefaultProductionExitUpdate ModuleTag_XX                   一般工厂修正

    UnitCreatePoint   = X:  0.0  Y:  0.0   Z:0.0                              被造单位的诞生点坐标

    NaturalRallyPoint  = X: 55.0  Y:  0.0   Z:0.0                              默认集合点坐标

  End

  点评:不需要关联骨骼点,只需要设置坐标,这里的坐标是指W3D模型里,以世界坐标原点为中心计算出来的相对位置

 

  Behavior = QueueProductionExitUpdate ModuleTag_XX                   量产型工厂修正,比一般工厂多了一个产出延迟,用来使成倍生产的多个单位依次出来,而非重叠着出来

    UnitCreatePoint   = X:  0.0  Y:  -25.0   Z:0.0

    NaturalRallyPoint  = X: 36.0  Y:  -25.0   Z:0.0

    ExitDelay = 300                                                                               产出延迟

  End

  点评:用中国兵营造红卫兵时就知道了,虽然红卫兵是造一次出来两个,但他们不是同时出来的,而是一前一后依次出来的,两者之间出来的时间间隔就是ExitDelay的参数

 

  Behavior = SupplyCenterProductionExitUpdate ModuleTag_11         资源采集中心修正,和一般工厂差不多,但仅仅用于资源采集中心,事实上我怀疑用一般工厂修正也可以

    UnitCreatePoint   = X:  0.0  Y:  0.0   Z:0.0

    NaturalRallyPoint  = X: 52.0  Y:  0.0   Z:0.0

  End

 

  ClientUpdate = AnimatedParticleSysBoneClientUpdate ModuleTag_XX     活动骨骼点服务修正,大概是指引发粒子系统的骨骼点可以自由改变位置(实际上把骨骼点做成3D动画不就得了?)

  End

 

   3)射弹体专用修正。

  Behavior = NeutronMissileUpdate ModuleTag_XX                             核弹弹道修正,使射弹体在发射时先向上飞,然后再转折向前,最后转折落下

    DistanceToTravelBeforeTurning = 500                                            发射时的垂直爬升高度

    MaxTurnRate = 9000                                                                      最大转向速度,控制两次转折时的转向速度,太小会导致转向不足,进而落点发生偏移

    ForwardDamping = 0.1                                                                   正向阻尼

    RelativeSpeed = 2.0                                                                        速度倍率,原样速度为该射弹体的运动系统速度,如果没有配运动系统,则为武器代码里的发射速度

    LaunchFX = FX_NeutronMissileLaunch                                          发射时的炮口FX特效

    IgnitionFX = FX_NeutronMissileIgnition                                          点火时的FX特效,想想火箭是怎么发射的,肯定都是先点火再发射

    TargetFromDirectlyAbove = 500                                                     飞到目标点上空多少高度的时候开始转折落下

    SpecialAccelFactor = 1                                                                    平飞阶段的加速度

    SpecialSpeedTime = 1500                                                               平飞阶段的持续时间,如果为0则没有平飞阶段

    SpecialSpeedHeight = 160                                                              平飞时保持的高度

    SpecialJitterDistance = 0.4                                                              抖动距离比率,至今没看出哪里来的抖动……

    DeliveryDecalRadius = 210                                                             留在地面上的范围指示圈尺寸

    DeliveryDecal                                                                                  范围指示圈定义,二级子函数

      Texture           = SCCNuclearMissile_China                         用哪个TGA贴图来显示范围指示圈

      Style             = SHADOW_ALPHA_DECAL                        贴图风格为半透明贴花

      OpacityMin        = 25%                                                          最小透明度

      OpacityMax        = 50%                                                         最大透明度,若二者不同,则可以形成闪烁效果

      OpacityThrobTime  = 500                                                          闪烁频率,每0.5秒一次

      Color             = R:255 G:0 B:0 A:255                                染色情况,最后的A代表饱和度(一般都把范围指示圈的TGA贴图做成纯白,这样方便染色)

      OnlyVisibleToOwningPlayer = Yes                                               是否只让自己看到范围指示圈

    End

  End

 

  Behavior = DynamicShroudClearingRangeUpdate ModuleTag_XX     侦察范围动态修正,使射弹体获得一个逐渐扩大或缩小的侦察范围

    FinalVision = 250.0                                                                         最终侦察范围

    ChangeInterval = 50                                                                       侦察范围收缩量,即每扩大一次,侦察范围减少多少点

    ShrinkDelay = 2000                                                                        从射弹体诞生起,延迟多长时间后其侦察范围开始缩小

    ShrinkTime = 1000                                                                          侦察范围缩小过程持续多长时间

    GrowDelay = 0                                                                                从射弹体诞生起,延迟多长时间后侦察范围开始增大

    GrowTime = 1000                                                                           侦察范围扩大过程持续多长时间

    GrowInterval = 10                                                                           侦察范围收缩量,即每扩大一次,侦察范围扩大多少点

    GridDecalTemplate                                                                          范围指示删格定义,二级子函数,删格实际上和圈没啥区别,个人认为仅仅就是贴图不同而已

      Texture           = EXGrid

      Style             = SHADOW_ADDITIVE_DECAL

      OpacityMin        = 50%

      OpacityMax        = 100%

      OpacityThrobTime  = 500

      Color             = R:32 G:64 B:128 A:0                                 饱和度为0,似乎并非指不染色,应该理解成最小染色情况,在实际使用中可发现,依然还是有很淡的颜色

    End

  End

 

  Behavior = MissileAIUpdate ModuleTag_XX                                       导弹弹道修正,使用了这个模块的射弹体,需要运动系统的支持,同时武器代码里的一些语句将不再起作用

    TryToFollowTarget = Yes                                                                 是否启动跟踪能力,No的话,这种导弹将打当前点,而不会去跟踪目标

    FuelLifetime = 3000                                                                        续航时间,单位为毫秒,意思是说,这个射弹体只能飞3秒种,时间一到就自动引爆

    IgnitionDelay = 0                                                                             点火延迟时间,也就是说导弹出膛多长时间后喷发尾焰

    IgnitionFX = FX_TomahawkIgnition                                                 点火使用哪个FX特效

    InitialVelocity = 50                                                                           出膛初速度,因此武器代码里的发射速度将不再其作用

    DistanceToTravelBeforeTurning = 80                                              自由飞行距离,即出膛后必须要沿炮口方向自由飞行多远才开始转向去打目标

    DistanceToTargetBeforeDiving = 100                                              距离目标多远的时候开始转折命中,这个参数不可设置得过小,否则很容易因为转折不及时而飞过头

    DistanceToTargetForLock = 10                                                       锁定目标的距离,尚未测试出有啥作用,原文说有这个语句能让导弹的飞行轨迹更平稳

  End

  点评:这个模块用于战斧、V3之类弧线发射的巡航导弹时,有些语句如点火、自由飞行距离、转折距离才有实际价值,而用于直线飞行的小型导弹或火箭炮时,这些语句几乎起不到什么作用。有人觉得ZH里的小型导弹弹道在山上打山下时,落点之前有一个很别扭的转折,我觉得似乎可以通过设置转折距离来避免,因为CNC3里就是完美的弧线

 

  Behavior = ProjectileStreamUpdate ModuleTag_XX                            射弹体尾气流修正,一般我们都在射弹体模型里调用粒子系统来做尾气流,因此这个缺少语句的模块几乎没什么价值

    ;nothing

  End

 

  ClientUpdate = LaserUpdate ModuleTag_XX                                      光束服务修正,可在一条光束首末两端点上产生粒子系统,用于模拟激光效果

    MuzzleParticleSystem = GenericLaserFlare                                    首端点上的粒子系统,通常可理解为炮口闪光

    TargetParticleSystem = GenericLaserFlare                                     末端点上的粒子系统,通常可理解为落点闪光

  End

 

  ClientUpdate = BeaconClientUpdate ModuleTag_XX                          信标服务修正,使物体能像“感叹号信标”那样在雷达上激起闪烁信号,让盟友注意到你的意图

    RadarPulseFrequency = 1000                                                        雷达信号闪烁频率,每1秒闪烁一次

    RadarPulseDuration = 500                                                              每次闪烁后,显亮阶段持续多长时间

  End

 

  Behavior = StickyBombUpdate ModuleTag_XX                                   粘性修正,使本体能够粘贴到目标身上被它带着走

    ; nothing

  End

  点评:需要说明的是,这种带有粘性的射弹体只能通过放置TNT炸弹、圈套、定时炸弹或遥控炸弹等方式粘贴到目标身上,而直接当作炮弹打出去则只会粘贴到地面上,我没有尝试过将它做成带有跟踪能力的导弹发射出去,能否成功粘贴到目标身上,这个值得一试。

 

   4)特殊能力修正。这个模块需要根据不同的SP来对应不同的语句,因此使用非常灵活。我特意用蓝色来表示各种技能的关键语句,其他则是通用语句

  Behavior = SpecialAbilityUpdate ModuleTag_XX                                

    SpecialPowerTemplate  = SpecialAbilityRedGuardCaptureBuilding                     外部占领

    StartAbilityRange       = 5.0                                                        施展技能的“射程”。若施展者距离目标的距离大于这个参数,则施展者会自动跑过去然后再施展

    UnpackTime           = 3000                                                      部署准备时间,会影响施展者的部署动作3D动画播放速度

    PreparationTime        = 20000                                                   施展持续时间,必须要走完着段时间才能算技能施展成功,中途放弃会导致前功尽弃

    PackTime              = 2000                                                     回收撤离时间(即收拾装备的时间),同样会影响施展者的部署动作3D动画播放速度

    DoCaptureFX          = Yes                                                       在施展过程中产生闪光效果

    SpecialObject          = BinaryDataStream                                  施展过程中“发射”出去的特殊物体,只能是不含W3D外观模块的光束类物体,否则会报错

    SpecialObjectAttachToBone = Muzzle01                                         光束的首端点关联到施展者的哪个骨骼点上,只有当特殊物体是光束类物体时才能使用这个语句

    PackSound            = BlackLotusPack                                     回收撤离时播放的音效(可以“误会”为单位的语音)

    UnpackSound          = BlackLotusUnpack                                部署准备时播放的音效

    TriggerSound          = BlackLotusTrigger                                 开始施展时播放的音效(大概是指按下选中了目标时的音效)

    PrepSoundLoop        = BlackLotusPrepLoop                            部署准备过程中持续播放的音效

    AwardXPForTriggering  = 5                                                           成功施展之后,本体获得多少点经验值,同时也贡献给将军多少经验值

    SkillPointsForTriggering = 20                                                   需要消耗多少点“魔法值”才能施展。ZH里有魔法值概念么?似乎有,只不过不是魔兽那种概念

  End

  点评:第一次发觉原来ZH也有魔法值,虽然作用相同,但并不是魔兽里那种魔法值概念。ZH的魔法值实际上应该理解成技能点,Rank.ini里存在一条语句叫SkillPointsNeeded,用于定义将军的技能点积累到多少时可以升到多少级,而每个单位也存在一条未被使用的SkillPointValue语句,用于定义该单位被杀后贡献给敌人多少技能点。但实际上我们知道,将军升级是靠积累经验值,而非积累技能点,那是因为经验值实际上就等价于技能点,所以技能点的概念就成了多余的垃圾,因此我不太提倡使用“魔法值”概念来限制特殊能力的施展。

 

  Behavior = SpecialAbilityUpdate ModuleTag_XX                                

    SpecialPowerTemplate  = SpecialAbilityBlackLotusDisableVehicleHack               封锁载具

    StartAbilityRange       = 150.0

    UnpackTime           = 2000

    PackTime             = 1000

    PreparationTime       = 2000

    EffectDuration         = 15000                                                    封锁效力持续时间

    DisableFXParticleSystem = DisabledEffectBinaryShower0             被封锁的单位头顶上将出现什么样的FX特效(0101010101,让我想起了黑客帝国)

    SpecialObject           = BinaryDataStream                                只能是光束类物体

    SpecialObjectAttachToBone = Muzzle01

    PackSound             = BlackLotusPack

    UnpackSound          = BlackLotusUnpack

    TriggerSound          = BlackLotusTrigger

    PrepSoundLoop        = BlackLotusPrepLoop

    AwardXPForTriggering  = 2

    SkillPointsForTriggering = 20

  End

 

  Behavior = SpecialAbilityUpdate ModuleTag_XX

    SpecialPowerTemplate  = SpecialAbilityBlackLotusStealCashHack                      盗取金币

    StartAbilityRange       = 150.0

    UnpackTime           = 6730

    PackTime              = 5800

    PreparationTime        = 6000

    EffectValue            = 1000                                                     一次成功的盗取能获得多少个金币(同时对方被扣掉多少个金币)

    SpecialObject          = BinaryDataStream                                  只能是光束类物体

    SpecialObjectAttachToBone = Muzzle01

    PackSound            = BlackLotusPack

    UnpackSound          = BlackLotusUnpack

    TriggerSound          = BlackLotusTrigger

    PrepSoundLoop        = BlackLotusPrepLoop

    AwardXPForTriggering  = 20

    SkillPointsForTriggering = 20

  End

  点评:EffectValue实际上是个BUG语句,不管你设置成多少点,在游戏里永远都是1000

 

  Behavior = SpecialAbilityUpdate ModuleTag_XX

    SpecialPowerTemplate = SpecialAbilityHackerDisableBuilding                              关闭建筑,这是个自动反复施展的技能,只要一开始施展,你不叫停它就永远不停

    StartAbilityRange      = 150.0

    UnpackTime          = 7300

    PackTime             = 5133

    PreparationTime       = 3000

    PersistentPrepTime    = 333                                                        连续两次施展之间的间隔时间

    EffectDuration         = 2000                                                      关闭效力持续时间,多次施展不会累积,只会把上次的剩余时间冲掉,然后重新计算时间

    DisableFXParticleSystem = DisabledEffectBinaryShower0             被关闭的建筑头顶上出现什么样的FX特效

    SpecialObject          = BinaryDataStream                                  只能是光束类物体

    SpecialObjectAttachToBone = Muzzle01

    PackSound            = HackerPack

    UnpackSound          = HackerUnpack

    PrepSoundLoop        = HackerPrepLoop

    AwardXPForTriggering  = 1                                                           由于是连续自动施展,所以最好不要获得太多经验值,否则太BT很了

    SkillPointsForTriggering = 20

  End

 

  Behavior = SpecialAbilityUpdate ModuleTag_XX

    SpecialPowerTemplate = SpecialAbilityDisguiseAsVehicle                                    伪装成载具(只能伪装含有VEHICLE类型标签的目标)

    StartAbilityRange = 1000000.0

    ApproachRequiresLOS = No                                                          是否只能选取处于自己视野范围内的目标,Yes的话则和施放者的VisionRange参数有关,No则只要看得到就能作为目标

  End

  点评:要想实现伪装成载具的实际功能,还必须依靠一个特殊的隐形修正,否则仅仅只是形状变了,但会被敌人一眼识破,如下:

  Behavior = StealthUpdate ModuleTag_XX

    StealthDelay                            = 1

    DisguisesAsTeam                       = Yes                        伪装成小队?似乎是表示这个隐形能力必须要通过特殊能力来启动

    RevealDistanceFromTarget               = 100.0f                  距离目标多远时被识破

    OrderIdleEnemiesToAttackMeUponReveal  = Yes

    DisguiseFX                             = FX_BombTruckDisguise                   伪装时的FX特效

    DisguiseRevealFX                       = FX_BombTruckDisguiseReveal        败露时的FX特效

    InnateStealth                            = Yes

    DisguiseTransitionTime                   = 2000                    伪装过程持续时间

    DisguiseRevealTransitionTime             = 1000                   败露过程时序时间

  End

 

  Behavior = SpecialAbilityUpdate ModuleTag_XX

    SpecialPowerTemplate = SpecialAbilityHelixNapalmBomb                                     投掷凝固汽油炸弹

    StartAbilityRange = 3.0

    PreparationTime = 0

    SpecialObject = NapalmBomb                                                         可以是任何物体,并且不需要具备粘性修正模块,可以理解成“炸弹射弹体”

    MaxSpecialObjects = 1

    SpecialObjectsPersistWhenOwnerDies = Yes

    SpecialObjectsPersistent = Yes

    UniqueSpecialObjectTargets = No

    UnpackTime              = 500

    FlipOwnerAfterUnpacking = No                                                      投放成功后还会继续准备投放第二个特殊物体

    FleeRangeAfterCompletion = 0.0                                                   0表示投放成功后投放者不会跑开,换言之就是站在原地等待第二次投放

    UnpackSound             = DragonTankVoiceFireStorm

    LoseStealthOnTrigger      = No                                                   投放过程中不显形,事实上当特殊物体是炸弹时,根本用不着让它隐形,所以也无所谓显形

    ApproachRequiresLOS     = No

    NeedToFaceTarget         = No                                                  是否需要正面朝向目标才能投放,No表示无所谓,尾巴对着目标也能投放,Yes的话则投放者会在投放前自动调整朝向

    PersistentPrepTime        = 100

    PersistenceRequiresRecharge = Yes                                             持续投放,又一个加深申明内容的语句

  End

 

  Behavior = SpecialAbilityUpdate ModuleTag_XX

    SpecialPowerTemplate = SpecialAbilityTankHunterTNTAttack                               埋设TNT炸弹,将一个指定的物体投放到目标头上,如果该物体含有粘性修正模块则会自动粘贴到目标身上

    StartAbilityRange = 5.0

    PreparationTime = 0

    SpecialObject = TNTStickyBomb                                                     投放什么特殊物体,可以是任何物体,当然最好是含有粘性修正模块和生存时间模块

    MaxSpecialObjects = 8                                                                    最大可连续投放的特殊物体数量,若放满了8个,则必须等到其中一个特殊物体死亡后才能继续放

    SpecialObjectsPersistWhenOwnerDies = Yes                                 特殊物体将在投放者死亡的瞬间自动消失(意味着不会再爆炸),No的话还会继续粘贴在目标身上

    SpecialObjectsPersistent = Yes                                                       特殊物体可以通过投放者的界面按钮来引爆或者生存时间到了之后自动自杀

    UniqueSpecialObjectTargets = Yes                                                 已经被粘贴了特殊物体的目标不能再被粘第二个特殊物体,否则的话,可以被粘上无限多个

    FleeRangeAfterCompletion = 100.0                                               投放者成功粘贴了特殊物体之后自动跑开多远距离

  End

 

  Behavior = SpecialAbilityUpdate ModuleTag_XX

    SpecialPowerTemplate = SpecialAbilityBoobyTrap                                                投放圈套,感觉跟TNT炸弹很相似,可能区别只在于特殊物体上

    StartAbilityRange = 5.0

    PreparationTime = 0

    SpecialObject = BoobyTrap

    MaxSpecialObjects = 100

    SpecialObjectsPersistWhenOwnerDies = Yes

    SpecialObjectsPersistent = Yes

UniqueSpecialObjectTargets = Yes

  End

 

  Behavior = SpecialAbilityUpdate ModuleTag_XX

    SpecialPowerTemplate = SpecialAbilityColonelBurtonRemoteCharges                 埋设遥控炸弹,和TNT炸弹的语句差不多,仅仅是该炸弹可以通过投放者的界面按钮来引爆

    StartAbilityRange = 0.0

    PreparationTime = 0

    SpecialObject = RemoteC4Charge

    MaxSpecialObjects = 8

    SpecialObjectsPersistWhenOwnerDies = No

    AlwaysValidateSpecialObjects = Yes                                                特殊物体将永远保持有效,当上一句的参数为No时使用,属于再次强调说明特殊物体不会因为投放者身亡而失效

    SpecialObjectsPersistent = Yes                                                       上面的TNT炸弹不能用按键来引爆,但这里的遥控炸弹则可以,这是由于SP的特殊性造成的

    UniqueSpecialObjectTargets = Yes

    UnpackTime              = 5500

    PackTime                = 0

    SkipPackingWithNoTarget = Yes                                                     没有放置任何特殊物体时引爆无效,应该为Yes,否则会导致空引爆,也引不出来啥东西

    FlipOwnerAfterUnpacking = Yes                                                     埋设成功后埋设者自动停止施展能力,否则会继续投放第二个特殊物体(还粘得起第二个的话)

    FleeRangeAfterCompletion = 100.0

    UnpackSound             = ColonelBurtonPlantCharge

    LoseStealthOnTrigger      = Yes                                                  埋设过程中,特殊物体将处于显形状态,前提是特殊物体具有隐形能力

  End

 

  Behavior = SpecialAbilityUpdate ModuleTag_XX

    SpecialPowerTemplate = SpecialAbilityColonelBurtonTimedCharges                    埋设定时炸弹,和遥控炸弹基本相似,但特殊物体的外观上有倒计时显示给投放者

    StartAbilityRange = 0.0

    PreparationTime = 0

    SpecialObject = TimedC4Charge                                                    这个特殊物体必须含有生存时间模块,否则就成了只计时不爆炸的“玩具炸弹”,其生存时间参数决定了外观上的倒记时数字

    MaxSpecialObjects = 10

    SpecialObjectsPersistWhenOwnerDies = Yes

    SpecialObjectsPersistent = Yes

    UniqueSpecialObjectTargets = Yes

    UnpackTime              = 5500

    FlipOwnerAfterUnpacking = Yes

    FleeRangeAfterCompletion = 100.0

    UnpackSound             = ColonelBurtonPlantCharge

    LoseStealthOnTrigger      = Yes

  End

 

  Behavior = SpecialAbilityUpdate ModuleTag_XX

    SpecialPowerTemplate = SpecialAbilityMissileDefenderLaserGuidedMissiles      激光制导

    StartAbilityRange = 200.0

    AbilityAbortRange = 250.0                                                              取消施展距离,当目标逃出这个距离时,施展者自动取消施展技能的动作

    PreparationTime = 1000

    PersistentPrepTime = 500

    SpecialObject = LaserBeam                                                            只能是光束类物体

    SpecialObjectAttachToBone = Muzzle01

  End

 

   6)人工智能修正。这类修正主要是控制单位是否具有矿车能力、是否具有推土机功能、是否自动攻击敌人、各种情况下的炮塔动作,因此往往存在TurrerAltTurret二级子函数。任何一个人工智能修正最多可以同时拥有TurretAltTurret,表示单位有两个炮塔(通常只有战列舰才具有双炮塔),它们的语句设置是一样的,我就只举Turret的例子来说明。

               这些修正含有很多通用语句,例如直升机也可以具有矿车的智能(美军支奴干直升机)。所以大家可以尝试将这些语句交错使用,说不定能弄出些意外的惊喜。(当然这些惊喜包括报错信息框)

  Behavior = AIUpdateInterface ModuleTag_XX                                    一般修正,常用于坦克、步兵和防御塔

    Turret

      ControlledWeaponSlots = PRIMARY SECONDARY                    哪些武器被绑定在这个炮塔上

      TurretTurnRate      = 180                                                        炮塔水平转动速度

      AllowsPitch         = Yes                                                         是否允许炮塔垂直转动

      TurretPitchRate     = 180                                                         炮塔垂直转动速度(俯仰动作),若AllowsPitch = No,则这句无作用

      NaturalTurretPitch   = 45                                                           空闲时炮塔垂直方向倾角,以W3D炮塔模型块的绘制角度为0度来计算,若AllowsPitch = No,则本句无作用

      MinPhysicalPitch    = -20                                                          最小倾角,负数表示向地面倾斜,仅当AllowsPitch = Yes时有作用,缺省值为0,即W3D里的绘制角度

      TurretFireAngleSweep = PRIMARY 25                                       开火时水平摆动角度,像火龙坦克那样摆动开火

      FiresWhileTurning   = Yes                                                         可在炮塔转动时开火,用于坦克则可产生边走边打的效果(当然前提是该坦克能自动攻击敌人)

      MinIdleScanInterval  = 250                                                        空闲时转动炮塔以巡视周围的最小间隔时间

      MaxIdleScanInterval  = 250                                                        空闲时转动炮塔以巡视周围的最大间隔时间

      MinIdleScanAngle    = 0                                                           空闲时转动炮塔以巡视周围的最小转动距离

      MaxIdleScanAngle    = 360                                                       空闲时转动炮塔以巡视周围的最小转动距离

    End

    AutoAcquireEnemiesWhenIdle = Yes                                              允许自动攻击进入视野范围内的敌人

    MoodAttackCheckRate        = 250                                            士气检测频率,每隔0.25秒检测一次开火者的情绪,听说ZH里有士气概念,能影响单位的战斗积极性

  End

 

  Behavior = JetAIUpdate ModuleTag_XX                                             战斗机修正,专用于机场型战斗机

    OutOfAmmoDamagePerSecond  = 10%                                        弹药放完后每秒钟扣掉百分之多少的生命值

    TakeoffDistForMaxLift      = 0%                                                  爬升-平飞比,即要爬升到正常飞行高度,需要平飞多远距离,0%表示直接进入正常飞行高度(但看着有点别扭)

    TakeoffPause              = 500                                                起飞暂停时间,即点火弹射时间,用于模拟点火弹射动作(因为机场很短……)

    MinHeight                 = 5                                                    最低飞行高度,大概是指着陆时离地面的高度

    ReturnToBaseIdleTime      = 10000                                            空闲多长时间后自动返航,只要没有执行任何任务(移动、攻击、领空守卫等),那么只在外面旋多长时间就得自动飞回来

                                                                                                              哪怕并没有开一炮,弹药也是满的,也必须回来

  End

  点评:非常可怜的战斗机,感觉它在开火的时候把油箱也丢下去了,所以才会急切地要求返航(似乎弹药放完之后跑得跟鬼撵似的),万一遇到机场堵塞,它就只能在空中等着扣血扣死,然后掉下来。看样子EA是打算但这种概念来模拟油量,但这样做有个很别扭的BUG,那就是让它执行领空守卫,它可以在空中转半天不扣一点点血,莫非这家伙开了作弊器,无限油量么?

 

Behavior = SupplyTruckAIUpdate ModuleTag_XX                              矿车修正,专用于资源采集单位

    MaxBoxes = 4                                                                                 一次性最多可以搬运多少个箱子

    SupplyCenterActionDelay = 400                                                     在补给中心(矿厂)卸载完所有箱子需要花费的时间

    SupplyWarehouseActionDelay = 1000                                            在补给站(矿区)装载满一车箱子需要花费的时间

    SupplyWarehouseScanDistance = 700                                           探测身边一定范围内有没有可搬的箱子,如果有就去搬,如果没有就跑回矿厂偷懒(不怕挨将军骂么?)

    UpgradedSupplyBoost         = 60                                             获得Upgrade_AmericaSupplyLines后,每个箱子能多产生多少金币

    SuppliesDepletedVoice = SupplyTruckVoiceSuppliesDepleted       探测到可搬的箱子后播放什么音效(OMG!那是箱子!大家快上)

  End

 

  Behavior = DeployStyleAIUpdate ModuleTag_XX                               部署型单位修正,专用于必须先部署才能开火的单位,例如核子加农炮

    Turret

      TurretTurnRate        = 80

      TurretPitchRate       = 80

      FirePitch             = 0                                                          开火时炮塔的倾角,以W3D里绘制的方向为0度开始计算(哪怕你把它画斜了,游戏就认为斜着才是0度)

      AllowsPitch           = Yes                                                     

      RecenterTime          = 5000                                                 空闲时等待多长时间才让炮塔归正,只有这种修正才用这个语句,而缺省值为0,即空闲后立刻归正

      ControlledWeaponSlots = PRIMARY SECONDARY

      NaturalTurretAngle    = 0

      InitiallyDisabled     = Yes                                                          未部署时无效

    End

    AutoAcquireEnemiesWhenIdle = No

    PackTime = 3333                                                                            回收过程持续时间

    UnpackTime = 3333                                                                        部署过程持续时间

    TurretsFunctionOnlyWhenDeployed = Yes                                     仅当部署后炮塔才起作用,对应上面那句InitiallyDisabled = Yes

    TurretsMustCenterBeforePacking = Yes                                         回收前炮塔将自动归正,归正完毕才开始回收

    ManualDeployAnimations = Yes                                                      使用手动部署动画?

  End

  点评:不得不提的是,核子加农炮部署前后的炮塔不是同一个炮塔(废话,因为模型都不是同一个W3D),部署前的炮塔仅仅是个不能开火的“零件”,部署后那个才是真正的炮塔,而部署过程动画则是在外观模块里利用ShowSubObjectHindSubObject将假炮塔隐藏掉,把真炮塔显示出来产生3D动画。回收过程则正好相反,真炮塔播放完3D动画后被隐藏掉,然后假炮塔被显示出来。

 

  Behavior = ChinookAIUpdate ModuleTag_XX                                     直升机修正,直升机即可以是矿车,还可以具有空降绳功能

    MaxBoxes                = 8

    SupplyCenterActionDelay = 3000

    SupplyWarehouseActionDelay = 1250

    SupplyWarehouseScanDistance = 700

    SuppliesDepletedVoice = ChinookVoiceSuppliesDepleted

    NumRopes                = 4                                                     最大空降绳数量,因为一根绳子上只能供一个人降落,在这个人成功落地前,就必须换根绳子来空降下一个人

    PerRopeDelayMin         = 900                                                  投放绳子的最小准备时间

    PerRopeDelayMax         = 1500                                               投放绳子的最大准备时间

    RopeWidth               = 0.5                                                   绳子的粗细,注意,绳子可不是什么Object,因此没有W3D模型

    RopeColor               = R:0 G:0 B:0                                      绳子颜色

    RopeWobbleLen           = 10                                                  绳子摇摆角度

    RopeWobbleAmplitude     = 0.25                                                绳子摇摆幅度比

    RopeWobbleRate          = 180                                                 绳子摇摆频率

    RopeFinalHeight          = 10                                                    绳子底部距离地面多高

    RappelSpeed             = 30                                                    乘员在绳子上的下滑速度

    MinDropHeight           = 40                                                     投放绳子时,本体距离正下方最近平面的高度,这个最近的平面,可能是地面,也可能是房顶

  End

 

  Behavior = TransportAIUpdate ModuleTag_XX                                   一般运载体修正,很大程度上和一般修正基本相同,仅仅只多了一个自动迎接乘员的动作(如直升机会先落地等待乘员登机)

    Turret

      TurretTurnRate = 60

      ControlledWeaponSlots = PRIMARY

    End

    AutoAcquireEnemiesWhenIdle = Yes

  End

 

  Behavior = AssaultTransportAIUpdate ModuleTag_XX                        救护车修正,和普通运载体基本相同,多了一个让乘员在里面恢复生命的功能

    MembersGetHealedAtLifeRatio = 0.5                                             当乘员生命值低于50%时,进去可以获得治疗

  End

 

  Behavior = RailedTransportAIUpdate ModuleTag_XX                         火车修正,定义上客点对应哪个骨骼点

    PathPrefixName    = Ferry                                                           上客点对应以Ferry为前缀的骨骼点,即Ferry%02d

  End

 

  Behavior = DozerAIUpdate ModuleTag_XX                                        推土机修正,使本体获得建造房子和修复房子的能力

    RepairHealthPercentPerSecond = 2%                                            每秒钟修复目标建筑百分之多少的生命值

    BoredRange                  = 150                                           闲置时自动找活干的探测范围,当闲置时,会探测周围这个范围内有没有可干的活,例如破房子、未完工的地基

    BoredTime                    = 5000                                        偷懒时间,探测到有活可干的时候,先偷懒多长时间再跑过去干

  End

 

  Behavior = WorkerAIUpdate ModuleTag_XX                                      工人修正,工人比推土机更全能,还能搬箱子,所以是推土机的语句+矿车的语句

    RepairHealthPercentPerSecond  = 2%

    BoredTime                     = 5000

    BoredRange                    = 150

    MaxBoxes                      = 1

    UpgradedSupplyBoost           = 8

    SupplyCenterActionDelay        = 150

    SupplyWarehouseActionDelay    = 150

    SupplyWarehouseScanDistance   = 700

    SuppliesDepletedVoice = WorkerVoiceSuppliesDepleted

    AutoAcquireEnemiesWhenIdle    = Yes

  End

 

  Behavior = DeliverPayloadAIUpdate ModuleTag_XX                          递交型运载体修正,递交型运载体通常被OCL调用,将需要刷的物体从地图边界上运载到目的地,然后投放

    DoorDelay = 500                                                                             开门延迟时间,即投放前的准备时间

    MaxAttempts = 4                                                                             最大投放尝试次数,如果连续这么多次都投放不成功就撤退不投了

    DropOffset = X:0 Y:0 Z:-10                                                             投放点,以运载体自身W3D模型的中心为原点来计算

    DropDelay = 300                                                                             相邻物体之间的投放间隔时间

    PutInContainer = AmericaParachute                                                将被投放的物体放进一个“特别”的容器里,例如降落伞

    DeliveryDistance = 150                                                                   投放距离,距目的地在这个范围内时才能投放

  End

  点评:为了使投放尽可能成功,递交型运载体的线-角速度之比不能太大,否则会导致在开门延迟时间内来不及转向调整,就又飞出投放距离了,反复几次如果都无法调整得好,它就会飞走,这样一来你啥都得不到。

 

  Behavior = HackInternetAIUpdate ModuleTag_XX                              黑客刷钱修正,使本体能够坐在地上就来钱,刷不了多长时间还升级,升级之后刷得更多

    UnpackTime          = 7300                                                       开始刷钱部时的署准备动作时间

    PackTime            = 5133                                                        停止刷钱后的回收动作时间

    PackUnpackVariationFactor = 0.5                                                    开始和停止时随机增减百分之多少的动作时间

    CashUpdateDelay     = 2000                                                       在空地上每隔多长时间刷一次钱

    CashUpdateDelayFast = 1800                                                        在网络中心里每隔多长时间刷一次钱

    RegularCashAmount   = 5                                                             新兵级每次刷出多少金币

    VeteranCashAmount   = 6                                                             老兵级每次刷出多少金币

    EliteCashAmount     = 8                                                               精英级每次刷出多少金币

    HeroicCashAmount    = 10                                                           王牌级每次刷出多少金币

    XpPerCashUpdate     = 1                                                            每刷一次,自己获得多少经验值(这个经验值是不送给将军的)

  End

 

  Behavior = WanderAIUpdate ModuleTag_XX                                      乱跑修正,使本体不停地到处乱跑,需要使用一个特别的运动系统才能控制好乱跑时的动作    

  End

 

8、 容器类模块。这类模块的特点是可以容纳别的物体,并含有一定的容积。而这些容积也分为内部式和外部式两类,其中外部式容积比较特殊,它的乘员会受到外部火力的直接伤害,而内部式容积则可以保护乘员免受伤害。在使用中,这些容器模块含有相当多的通用语句,你也可以尝试一下挪用语句,说不定也能搞出点意外的惊喜,例如报错。

此外一定要谨慎,由于有AllowInsideKindOfForbidInsideKindOf语句,所以千万不要搞出冲突。

  Behavior = ParachuteContain ModuleTag_XX                                    降落伞容器,外部式,它把乘员吊在它下面

    PitchRateMax = 60                                                                          最大摇晃速度,单位为度每秒

    RollRateMax = 60                                                                           最大滚动速度,同上

    LowAltitudeDamping  = 0.2                                                            高度衰减比率,越靠近地面,摇晃越小

    ParachuteOpenDist   = 25.0                                                         从投放开始到降落伞完全打开,需要降落多少高度

    AllowInsideKindOf   = INFANTRY VEHICLE PARACHUTABLE     允许含有哪些类型标签的乘员进来

    ParachuteOpenSound  = ParachuteOpen                                     开伞时播放的音效

  End

 

  Behavior = OverlordContain ModuleTag_XX                                      炎黄容器,外部式,它把乘员顶在自己头顶上

    Slots                 = 1                                                             容积,缺省值似乎就是1

    DamagePercentToUnits = 100%                                                     当自己挂掉时,乘员将遭受百分之多少的伤害,100%表示乘员会跟着它一起挂

    AllowInsideKindOf     = PORTABLE_STRUCTURE

    PassengersAllowedToFire = Yes                                                     直接允许乘员对外开火,否则的话需要配PassengersFireUpgrade模块,通过获得Upgrade来激活

    PayloadTemplateName = AmericaTankAvengerLaserTurret             初始时免费塞入一个乘员,和InitialPayload作用相同

    ExperienceSinkForRider = Yes                                                       乘员杀了敌人,经验值将传递给容器来获取(我的乘员帮我打经验值)

  End

 

  Behavior = HelixContain ModuleTag_XX                                            蜗牛容器,内部式,感觉是炎黄容器的简化版,仅仅是把乘员装在内部,而非放在头顶上

    Slots                     = 1

    DamagePercentToUnits    = 100%

    AllowInsideKindOf         = PORTABLE_STRUCTURE

    PassengersAllowedToFire  = Yes

    ShouldDrawPips           = No                                                   是否显示容积格子信息,似乎外部式容器默认不显示容积信息,内部式则默认要显示

  End

 

  Behavior = TunnelContain ModuleTag_XX                                         地道容器,内部式,一种特殊的“时空门”容器,当有多个这种容器时,将乘员从这头放进去,可以马上从另一头放出来

    TimeForFullHeal     = 5000                                                          进入容积的乘员可以在多长时间内恢复满血

  End

 

  Behavior = RailedTransportContain ModuleTag_XX                           火车容积,内部式,似乎没觉得有啥特殊

    Slots               = 10

    AllowInsideKindOf   = INFANTRY VEHICLE BOAT

    DoorOpenTime      = 2000                                                          开门时间

    ScatterNearbyOnExit = No                                                              乘员出来后是否自动分散,No表示不分散

  End

 

  Behavior = RiderChangeContain ModuleTag_XX                               摩托车容器,半外不内式(因为有BUG),放进不同的乘员充当驾驶员,可以使本体的外观和功能发生一定的变化

    Rider1 = GLAInfantryWorker         RIDER1 WEAPON_RIDER1 STATUS_RIDER1 GLAVehicleCombatBikeDefaultCommandSet SET_NORMAL

    Rider2 = GLAInfantryRebel          RIDER2 WEAPON_RIDER2 STATUS_RIDER2 GLAVehicleCombatBikeDefaultCommandSet SET_NORMAL

    Rider3 = GLAInfantryTunnelDefender RIDER3 WEAPON_RIDER3 STATUS_RIDER3 GLAVehicleCombatBikeDefaultCommandSet SET_NORMAL

    Rider4 = GLAInfantryJarmenKell     RIDER4 WEAPON_RIDER4 STATUS_RIDER4 GLAVehicleCombatBikeJarmenKellCommandSet SET_NORMAL

    Rider5 = GLAInfantryTerrorist      RIDER5 WEAPON_RIDER5 STATUS_RIDER5 GLAVehicleCombatBikeDefaultCommandSet SET_SLUGGISH

    Rider6 = GLAInfantryHijacker       RIDER6 WEAPON_RIDER6 STATUS_RIDER6 GLAVehicleCombatBikeDefaultCommandSet SET_NORMAL

    Rider7 = GLAInfantrySaboteur       RIDER7 WEAPON_RIDER7 STATUS_RIDER7 GLAVehicleCombatBikeDefaultCommandSet SET_NORMAL

    以上这些语句分别定义了7种可成为本体驾驶员的乘员以及对应的条件标签、武器标签、状态标签、操作界面以及运动系统标签,这些不同的标签使得本体在不同情况下具有不同的外观和功能,就像RA2IFV一样,放不同的兵,就变出不同的炮塔,同时更换不同的武器。可惜的是,IFV可以有无限种情况,但摩托车只有最多8种。

    ScuttleDelay         = 1500               倾翻延迟时间,当乘员丢弃本体,使本体成为缺少驾驶员的空容积时会导致本体自杀(非常LG而且是毒瘤一样的功能,EA脑壳有包)

    ScuttleStatus         = TOPPLED      倾翻时本体获得状态标签(用于播放倾翻动作)

    Slots                = 1

    InitialPayload         = GLAInfantryTerrorist 1                             初始时送一个乘员,如果不送的话,一诞生就会自杀,因为没有驾驶员(可恶的EA

    ScatterNearbyOnExit   = No                                                          乘员下车后自动散开,即跑开一定距离

    HealthRegen%PerSec  = 0                                                            每秒给乘员加血的数量

    DamagePercentToUnits  = 100%

    BurnedDeathToUnits    = No                                                        驾驶员直接消失,而不是被烧死

    AllowInsideKindOf     = INFANTRY

    ExitDelay             = 250                                                         下车延迟时间

    NumberOfExitPaths = 1                                                                  下车路径值,1为默认值,表示下车后站在随机位置上,其他值表示固定值,将关联到本体的骨骼点ExitStartExitEnd

    GoAggressiveOnExit = Yes                                                             若下车前处于攻击状态,那么下车之后继续追杀刚才打的哪个目标(或位置)

    DoorOpenTime = 0

  End

  点评:前面讲生存时间模块时提到摩托车容器的巨大BUG,实际上主要是因为EA脑壳有包,强迫要求摩托车在缺少驾驶员时必须自杀,他们要是不限制这个规则,就不会有这个BUG了:

给某个步兵加上最短30秒的LifetimeUpdate或者DeletionUpdate,然后将它装进摩托车,然后再把摩托车装进地道,然后立刻再把摩托车从地道里放出来,结果摩托车刚一出洞口就莫名其妙地倒了。这是为什么呢?现在我就来解释一下原因。上面说摩托车容器是一种半外不内式,BUG就在于此。首先我们要回顾一下生存时间模块的第一条BUG

给某个单位加上30秒的Lifetime,然后将它装进任何一种容器,等半个小时回来看,那家伙竟然还在里面呆着。但你一放它出来,它就马上死或者消失在你面前。

这个现象表明,只在当本体处于容积外部时才开始计算生存时间,而当本体被装进容器后,计时将暂停,因此放在容器里的单位是不到放出来时坚决不死的(脸皮还真TM厚)。再看第二条:

还是给它加上30秒的Lifetime,然后将它装进任何一种容器,然后马上放出来,那家伙竟然立刻死或者消失在你面前,明明30秒还没到,那家伙竟然就慌着见阎王去了……

这个现象表明,生存时间和消失时间模块的计时在暂停后无法正确恢复,基本上可以理解为暂停后计时立刻变成0秒,按道理来说这家伙该死了吧,可是它在容器里,是“暂时无敌”的,所以只有放它出来时,它才会死,而且是马上死。明白了这两个BUG的原理之后,我们再来看摩托车容积的BUG又是怎么回事:

将一个反抗军派上摩托车,然后将摩托车装进地道,再立刻将摩托车从地道里放出来,没看到什么奇怪的现象吗?那就反复这样进去、出来、再进去、再出来,偶尔会发现,当摩托车出地道后,会莫名其妙地出现一个“多余”的反抗军从车上跑下来(车上明明还坐着一个,那这家伙是从哪里来的呢),或许你觉得好奇,去点选、框选这个多余的反抗军,但是弄死都选不中,然而当你命令摩托车移动一步的话,这个多余的反抗军就会立刻消失掉。这便是摩托车容器“半外不内”的BUG所在了,也就是说,正常情况下,进入摩托车容器A的乘员将被包含在A内部(若乘员有生存时间模块的话,将停止记时),反之,当装有乘员的A进入另一个容器B中时,这个乘员将存在一定几率被A“漏”给B,也就是说,乘员将有可能和A以平等的地位被装在B里,但由于乘员在本质上依然受到A的牵扯,将会随A的移动而一起移动,因此当A被放出B之后,乘员也会跟着A一起被放出B,如果正好处于“漏”的几率时,你就能看到乘员和A一起跑出来(由于乘员站在里A外面,若乘员有生存时间模块的话,则记时恢复)。之所以乘员不能被选取,那是因为它依然还受A的牵连,属于一个不能自主行动,也不接受直接指挥的从属单位,而当你命令A移动的时候,乘员就会自动回到A的内部(由于是瞬移进去的,所以你会看到反抗军突然消失),如果在乘员的生存时间归0之前,你不让A移动,那么这个乘员就会因生存时间结束而死亡,因此A就会因为缺少乘员而自杀。

于是乎,AS的作者没有注意到这个BUG,草率地将IFV的虚拟驾驶员做成了一个带有生存时间模块的虚拟步兵(所谓虚拟,即无图像),因此才发生了IFV从运输船里出来时自爆的怪现象。FK3D为了避免这个BUG,舍弃了用生存时间方式来删除虚拟驾驶员,而是改用自杀武器的方式,给虚拟驾驶员添加一个自动开火修正,调用一个只能对本体产生秒杀级伤害的武器。前面讲自动开火修正时已经提过,当本体进入容器内时,将停止自动开火,出来后继续开火,因此用自动开火修正可以代替生存时间修正,不仅如此,它们二者还有一个很大的区别:当乘员被漏给B,而同时还被A牵扯时,生存时间将恢复记时,但自动开火却不会恢复,因此在使用自动开火修正的情况下,即便虚拟驾驶员偶尔“跑”出了IFV,它也不会自动开火,所以就不会杀死自己让IFV自爆。

 

  Behavior = TransportContain ModuleTag_XX                                     普通运输容器,内部式,常用于运输车、飞机或船舰,可以设置是否允许盟友、中立者以及敌人进入

    Slots               = 3

    HealthRegen%PerSec  = 25

    DamagePercentToUnits = 10%

    AllowInsideKindOf   = INFANTRY

    AllowAlliesInside   = Yes                                                               是否允许盟友进入

    AllowNeutralInside  = No                                                               是否允许中立者进入

    AllowEnemiesInside  = No                                                             是否允许敌人进去,听着咋这么别扭?

    ExitDelay = 250

    NumberOfExitPaths = 3

    GoAggressiveOnExit = Yes

  End

 

  Behavior = InternetHackContain ModuleTag_XX                                网络中心容器,内部式,可以让进入的乘员不停地刷钱,前提是这个乘员必须是带有黑客刷钱修正

    PassengersAllowedToFire = No

    Slots                 = 8

    ScatterNearbyOnExit   = No

    HealthRegen%PerSec  = 10

    DamagePercentToUnits = 50%

    AllowInsideKindOf     = MONEY_HACKER

    ExitDelay             = 500

    NumberOfExitPaths = 1

    GoAggressiveOnExit = No

  End

 

  Behavior = GarrisonContain ModuleTag_XX                                       驻守容器,内部式,切记不能用于可移动物体,否则容器跑开了,乘员却还留在空空如也的“原地”

    ContainMax                   = 4                                              最大驻守格数,和界面按钮关联,不是按照体积来计算的,也就是说,进去一个步兵扣一格,进去一个坦克还是只扣一格

    EnterSound                   = GarrisonEnter                          驻守者进入时播放的音效

    ExitSound                     = GarrisonExit                            驻守者撤离时播放的音效

    ImmuneToClearBuildingAttacks  = Yes                                           是否对清除驻守型武器免疫,所谓清除驻守型武器,比如火龙坦克的火焰、游骑兵的闪光弹和毒素坦克的毒液

    DamagePercentToUnits         = 100%

    IsEnclosingContainer           = No                                           是否是封闭型容器,默认为Yes,没搞懂什么叫封闭型。原版里只有炮兵阵地才这个语句。

  End

 

  Behavior = HealContain ModuleTag_XX                                             治疗容器,内部式,使进入的单位在一定时间内恢复满血,然后自动跑出来

    ContainMax         = 10                                                              最大进入者数量,和驻守类似,进什么东西都只占1格,只是不和界面按钮关联,因为进入者在康复之后会自动跑出来

    TimeForFullHeal     = 2000                                                          从死血加到满血所需要的时间,有点类似于维修厂修正

    AllowInsideKindOf   = INFANTRY

    AllowAlliesInside     = Yes

    AllowNeutralInside   = No

    AllowEnemiesInside  = No

  End

 

9、 接触类模块。这类模块的作用是让本体A与其他物体B接触,可以是A主动去接触B,也可以是A被动地遭到B的接触,只要接触成功,就会对B产生一定的效果,例如使B恢复满血、送给B一个免费物体、使B所属参战方地图全黑、将B转换成什么东西等。接触成功之后,A将自动消失并被游戏平台消除人口空间,可以理解为A已经死亡。一些模块还可以设置接触条件,B必须满足接触条件,才能和A成功接触,否则AB是永远无法相撞的。一说到这里,我就不由自主地想起了RA2的箱子……事实上接触类模块远不只是RA2的箱子那么简单。你还可以做点邪恶的构思,将带有接触模块的物体当作射弹体打出去撞别人,给对手造成点恶意的效果,嘿嘿嘿……

  Behavior = SalvageCrateCollide ModuleTag_XX                                 垃圾箱。可以给含有特定类型标签的B提供对应类型的效果,各种效果各占一定的几率

    ForbiddenKindOf = PROJECTILE                                                  B含有这些标签,则不能与A成功接触

    PickupScience = SCIENCE_GLA                                                    B所属参战方必须学会了某个技能才能与A成功接触

    ExecuteFX = FX_CratePickup                                                        接触成功后引发的FX特效

    WeaponChance = 100%                                                                 使B获得武器升级的几率,前提是B有捡垃圾升级武器的功能,且尚未获得过武器升级,否则此几率自动被屏蔽

    LevelChance = 25%                                                                        使B加一等级,前提是B不是王牌级别且可以通过训练升级,否则此几率自动被屏蔽

    MoneyChance = 75%                                                            使B所属参战方获得随机金币的几率,注意加级的几率和得金币的几率之和必须为100%

    MinMoney = 25                                                                               得到的最少金币(如果效果是得金币的话)

    MaxMoney = 75                                                                              得到的最多金币

  End

  点评:这个模块除了用于垃圾箱外,我不知道它到底还能有啥价值。

 

  Behavior = SabotagePowerPlantCrateCollide SabotageTag_XX         整体断电。B所属参战方整体断电一定时间,前提是B必须含有FS_POWER类型标签

    BuildingPickup = Yes                                                                      是否只能与建筑接触

    SabotagePowerDuration = 30000                                                   B所属参战方整体断电时间,单位为毫秒

  End

 

  Behavior = SabotageSupplyDropzoneCrateCollide SabotageTag_XX        偷补给平台。B所属参战方将分一定数量的金币给A,前提是B必须含有FS_SUPPLY_DROPZONE类型标签

    BuildingPickup  = Yes

    StealCashAmount = 800                                                                  B所属参战方将分多少个金币给A

  End

 

  Behavior = SabotageSuperweaponCrateCollide SabotageTag_XX     复位超武。B所关联的所有超武将重新计时,前提是B必须含有FS_SUPERWEAPON标签,且自身关联得有至少一种超武

    BuildingPickup = Yes

  End

 

  Behavior = SabotageCommandCenterCrateCollide SabotageTag_XX        一直没测试出渗透指挥中心能带来啥结果,难道和复位超武一样,将指挥中心所关联的所有技能全部复位?

    BuildingPickup = Yes

  End

 

  Behavior = SabotageSupplyCenterCrateCollide SabotageTag_XX      偷补给中心。B所属参战方将分一定数量的金币给A,前提是B必须含有CASH_GENERATOR类型标签

    BuildingPickup  = Yes

    StealCashAmount = 1000                                                                效果和偷补给平台一样

  End

 

  Behavior = SabotageMilitaryFactoryCrateCollide SabotageTag_XX    关闭工厂。B将在一段时间内无法生产单位。前提是B必须含有FS_FACTORY标签且带有生产单位的界面按钮

    BuildingPickup = Yes

    SabotageDuration = 30000                                                             B无法生产单位的持续时间

  End

 

  Behavior = ConvertToHijackedVehicleCrateCollide ModuleTag_XX    永久控制。B将被A所属参战方永久控制,这才是ZH里最让人满意的心灵控制

    RequiredKindOf = VEHICLE                                                           可以控制含有哪些类型标签的BFK3D特意添加上了INFANTRY,于是超能力部队不光能偷车,还能偷人……

  End

  点评:这个模块比较特殊,只能是A在被人工或脚本操作的情况下接触到B(即常言道的命令A去渗透B)才能接触成功。如果将A当作射弹体打出去撞B,即便你看到AB都重合在一起了,也没有任何结果发生。所以当初我妄图让超能力部队将一个A打到敌人身上去控制敌人,结果失败了……

 

  Behavior = ConvertToCarBombCrateCollide ModuleTag_XX              能力合体。B将与A合二为一,使B能够使用A武器,例如恐怖分子的自杀炸弹,不知道是否还有别的能力被合体

    RequiredKindOf    = VEHICLE

    ForbiddenKindOf  = TRANSPORT DOZER                                   不能与含有哪些类型标签的B合体

    FXList            = FX_MakeCarBombSuccess                          合体成功后引发什么FX特效

  End

  点评:严重怀疑CNC3的天神机甲是不是用了这个模块,使之可以将别人的武器拆下来装到自己手臂上使用。含有这个模块的A同样不能当作射弹体用,真是郁闷……

 

  Behavior = VeterancyCrateCollide ModuleTag_XX                             等级提升。B将增加一定等级,前提是B不是王牌级别,且可以通过训练来升级

    RequiredKindOf = VEHICLE

    ForbiddenKindOf = DOZER

    EffectRange = 0                                                                             作用范围,0表示只对B产生作用,如果再大一点,就会影响到B周围的其他物体

    AddsOwnerVeterancy = Yes                                                           是否将A自身的等级全部送给B(即有可能一口气让B提高23个等级),No的话则无论如何只给B提高1个等级

    IsPilot = Yes                                                                                    A是否必须是驾驶员?不对吧,我没找到PILOT这个类型标签啊?

  End

 

  Behavior = UnitCrateCollide ModuleTag_XX                                       免费物体。B所属参战方将在A消失的位置上得到一些特定的免费物体

    RequiredKindOf = WAVEGUIDE                                                     仅当B含有这些类型标签时才能和A接触

    ForbiddenKindOf = PROJECTILE

    ExecuteFX = FX_CratePickup

    UnitName = AmericaTankCrusader                                                  B所属参战方将得到什么样的免费物体

    UnitCount = 2                                                                                 免费物体数量

  End

  点评:让我想起了RA2里捡箱子捡出另一种基地车的喜悦……

 

  Behavior = ShroudCrateCollide ModuleTag_XX                                 地图全黑。B所属参战方将遭受地图全黑的厄运,将A打到敌人身上去让对手变瞎子吧,很邪恶的哦

    ForbiddenKindOf = PROJECTILE

    ExecuteFX = FX_CratePickup

  End

 

  Behavior = MoneyCrateCollide ModuleTag_XX                                  爆金币。B所属参战方将凭空获得固定数量的金币。

    ForbiddenKindOf = PROJECTILE

    MoneyProvided = 1000                                                                  得到的金币数量

    ExecuteFX = FX_CratePickup

    ExecuteAnimation       = MoneyPickUp                                      接触成功后引发的2D动画,即那个永远如此诱人的美元符号

    ExecuteAnimationTime   = 4.0                                                      2D动画持续时间

    ExecuteAnimationZRise  = 15.0                                                    2D动画上升距离

    ExecuteAnimationFades  = Yes                                                     2D动画是否在末尾时淡化直到消失

  End

 

  Behavior = HealCrateCollide ModuleTag_XX                                      免费治疗。B将瞬间恢复满血。似乎SAGE里没有像RA2那样让B所属参战方全体加满血的效果,所以只能影响一个B

    ForbiddenKindOf = PROJECTILE                                                  可以尝试一下用EffectRange语句,看看是否能多影响一些B周边的物体

    ExecuteFX = FX_CratePickup

  End

 

  Behavior = SquishCollide ModuleTag_XX                                           无效果。B不会得到任何效果,但A会被游戏平台判死,并立刻执行死亡方式模块或延迟死亡模块的功能。

    ;nothing

  End

  点评:一般用于步兵,当他们在遭受车辆接触时将被撞死,而撞击他们的车辆将不会得到任何效果。

 

  Behavior = FireWeaponCollide ModuleTag_XX                                  触发开火。A将在与B接触的瞬间发射一个武器,似乎只有这个模块在接触成功后A不会消失。

    CollideWeapon  = TreeFireDealDamageWeapon                           A将发射哪个武器

FireOnce = Yes                                                                               是否只发射一次就自动停手。No的话则会按照武器代码的设置反复不断地持续开火

    RequiredStatus = AFLAME                                                             A必须带有这些状态标签时才能接触成功。

  End

 

10、 特效武器类模块。这类模块一般具有一定的特殊作用

  Behavior = GenerateMinefieldBehavior ModuleTag_XX                     雷区发生器模块。可以产生出一片雷区,并控制对应雷区的重生。

    MineName             = ChinaClusterMine                                 关联哪种雷区

    DistanceAroundObject  = 80                                                         雷区将被布置在距离本题中心本体多远的圆周上

    GenerateOnlyOnDeath  = Yes                                                       只在死亡的时候产生雷区?那不相当于说只产生一次?

    SmartBorder           = Yes                                                       精确边界?没搞懂有啥意义

    SmartBorderSkipInterior = No                                                         是否是环形雷区,Yes则只有边界上有一圈地雷,中央地带是空的,反之则整个范围上充满了地雷,

    AlwaysCircular         = Yes                                                        边界是否形成正圆形

    GenerationFX         = WeaponFX_ClusterMineImpact              产生地雷时引发的FX特效

  End

 

  Behavior = MinefieldBehavior     ModuleTag_XX                            雷区模块。可以被一定类型的目标引爆,然后发射某个武器。需要被雷区发生器关联

    DetonationWeapon            = ClusterMineWeapon                 引爆时发射哪个武器

    DetonatedBy                 = ENEMIES NEUTRAL                 可以被哪些目标引爆

    ScootFromStartingPointTime  = 1000                                            迅速从起始点跑开的时间?啥意思?

    RepeatDetonateMoveThresh    = 5.0                                           每隔多长时间检查一次是否有合适的目标来将它引爆

    NumVirtualMines             = 8                                                 闪光点数量,需要对应外观模块里定义的粒子系统骨骼点

    Regenerates                 = Yes                                            引爆后是否还能重生,即爆炸一次之后过一段时间还能否自动长出来

DegenPercentPerSecondAfterCreatorDies = 3.33%                       当对应的雷区发生器丢失之后,只能再多存活多长时间

StopsRegenAfterCreatorDies  = Yes                                             当对应的雷区发生器丢失之后将不能再重生

  End

 

  Behavior = NeutronBlastBehavior ModuleTag_XX                              中子冲击模块。可以杀死一定范围内的所有驾驶员,那这和杀死驾驶员的DamageType有啥区别?

    BlastRadius = 20                                                                             有效冲击范围

    AffectAirborne = No                                                                        是否影响空中单位

    AffectAllies = No                                                                             是否影响自己人和盟友的单位

  End

 

尚有一些非常罕见,或者难度过分高的模块我没有例举,如果大家有兴趣可以自己去挖掘。此外,还望大家多给我补充和修正。