第三章 常用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、 加血类模块。这类模块的通用语句为HealingAmount和HealingDelay,用于控制每次加血量与间隔时间,加血模块可以给本体加血,也可以给本体周围的其他物体加血,使用范围非常广泛,包括广播塔和紧急维修技能也是一种变相的自动加血模块,因此我将它们放到一起来解说。
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种特殊加血模块的所有功能,可以实现任何加血规则和效果,但要特别注意,这个模块里存在相互关联的语句,例如StartsActive为Yes的时候,TriggeredBy将失去意义,即便设置了Upgrade项目也是多余的,还有就是KindOf和ForbiddenKindOf是相互冲突的,其参数不能存在相同标签,胡乱设置的话小心引起逻辑冲突导致加血规则一塌糊涂。顺带说一句,不知道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、 升级切换类模块。这类模块的通用语句包括TriggeredBy和ConflictsWith,前者表示获得了某个Upgrade后开启该模块的功能,后者表示获得了某个Upgrade后关闭该模块的功能,可见二者是相互冲突的,在实际使用时千万要注意参数,否则将把升级功能搞得一塌糊涂。
此外必须要提到的是,TriggeredBy和ConflictsWith的参数可以有多个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。而之前的SonicZap和NormalMissile将暂时不再被使用(除非用邪恶的手段扣掉已经获得的这项升级,如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_NORMAL和SET_NORMAL_UPGRADED两个标签,可见Locomotor也要识别标签来选取对应的运动模式给物体使用。有人认为运动系统的切换方向是单向的,但我认为这种说法并不十分确切,因为摩托车模块已经证明了运动模式可以来回切换,因此事实上只能说,SET_NORMAL和SET_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% 杀死敌人获得的金币为敌人价格的百分之多少,例如杀死一个犀牛,将得到900的5%,即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
点评:特殊能力和超武的最大区别就在于射程,前者可以设置施展距离,若对很远的地方施展该能力,则本体必须先跑过去再施展(有点魔兽的味道),而后者不能设置施展距离,永远可以对全地图任意位置施展。只可惜ZH和CNC3没有好好地强化这个模块,以至于特殊能力模块能实现的功能不远及超武那么丰富,所以要是想用特殊能力来做魔兽里的英雄技能,那简直就是痴心妄想。
Behavior = FireWeaponPower ModuleTag_XX 特殊开火,微观型。施展时本体将用当前一切可发射的武器向目标点开火,需要和WeaponSet语句连用
SpecialPowerTemplate = SpecialPowerBattleshipBombardment
MaxShotsToFire = 3 开火倍数,施展时,一次性发射出正常情况下的多少倍弹药,假如正常攻击是2秒1炮,施展时则变成2秒3炮。
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级,一次性可投3个GI,学完2级就变成一次性投6个,学完3级就变成1次性投9个。需要说明的是,UpgradeOCL语句存在先后次序,你必须把最高级别的一个放在最上面,最低级别的放在最下面,因此上面的例文里是先写3,再写2,最后写1。如果反过来写,则会导致学完进阶技能证书后,超武/技能却没有随之强化,那就等于是白学了。
CreateLocation语句控制着物体刷出位置,总共分为3类,分别为直接刷型(OCL的写法最为简单,直接将OCL里定义的所有物体刷到特定位置)、召唤运载型(OCL的编写比较复杂,在特定地图边界召唤出运载体,将特定的物体运载到目标点,然后投放)、自身运载型(本体就是运载体,因此无需再专门召唤运载体,OCL的写法类似于运载投放型),总共有以下这些参数可选:
CREATE_ABOVE_LOCATION 直接刷型。刷在目标点上空大约600到1000点之间的高度
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里最无聊而且最无能的一个模块,但却往往能引起菜鸟的关注,因为菜鸟肯定会联想起心灵控制。之所以说它无聊,是因为它根本不是真正的心灵控制,但却能吸引菜鸟的关注(主要还是因为菜鸟太菜的缘故),并且它可以不顾一切地控制整个地图上的任何目标,没有任何东西能抵挡它的控制,包括英雄,因此非常容易破坏平衡性,于是被ZH和CNC3作为禁招屏蔽掉了。 之所以说它无能,是因为它一次性只能控制一个单位,总的来说,比TS的心灵控制垃圾得多,根本就找不到任何启用它的理由。在此我奉劝各位MODER,如果不想找抽,最好别启用这个模块。
Behavior = CashHackSpecialPower ModuleTag_XX 凭空洗钱,无须施展,只要点下按钮,就能送你多少个金币,因此这些金币并不是从敌人那里偷来的,而是凭空产生的
SpecialPowerTemplate = SuperweaponCashHack
UpgradeMoneyAmount = SCIENCE_CashHack3 4000 提升到3级时所需要的技能证书,以及洗出来的金币数量
UpgradeMoneyAmount = SCIENCE_CashHack2 2000 提升到2级时所需要的技能证书,以及洗出来的金币数量
MoneyAmount = 1000 初始情况下(1级),洗出来的金币数量
End
点评:这是个比较无耻的模块,但在原版ZH里比起来还不算最无耻,因为最无耻的是美军的补给平台(用时间换金币)、中国的黑客+网络中心(坐在地上就挣钱,而且挣久了还升级),GLA的黑市(简直就是个变相的油井)。使用的时候注意UpgradeMoneyAmount和MoneyAmount的排序,这跟OCLSpecialPower是一样的,高级在上,低级在下
Behavior = OverchargeBehavior ModuleTag_XX 超负荷运转,姑且算个技能,使本体可以在持续自残的情况下超负荷运转,例如电厂可以输出额外的电力
HealthPercentToDrainPerSecond = 3% 每秒钟扣掉自己百分之多少的生命值
NotAllowedWhenHealthBelowPercent = 20% 当生命值低于这个百分比时,将强制恢复正常,并且无法再超负荷
End
7、 功能修正类模块。这类模块通常以Update为后缀,能够定义某个单位的各种细节功能,例如加钱、刷物体、炮塔属性、FX、OCL位置对应的骨骼点等等。但由于其种类过分地繁多,以至于有必要进行二次细分,将这些模块按照用法来分类讲解。
(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,然后将它装进摩托车,然后再把摩托车装进地道,然后立刻再把摩托车从地道里放出来,结果摩托车刚一出洞口就莫名其妙地倒了。这个BUG在AS的IFV上典型地存在着,但在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,直接进入SAGE的MODER,我不得不解释一下什么叫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 组员在距离班组多近的时候不需要再自动跟近,相当于任何组员和班组之间的距离在15到40之间随时调整
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)人工智能修正。这类修正主要是控制单位是否具有矿车能力、是否具有推土机功能、是否自动攻击敌人、各种情况下的炮塔动作,因此往往存在Turrer和AltTurret二级子函数。任何一个人工智能修正最多可以同时拥有Turret和AltTurret,表示单位有两个炮塔(通常只有战列舰才具有双炮塔),它们的语句设置是一样的,我就只举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),部署前的炮塔仅仅是个不能开火的“零件”,部署后那个才是真正的炮塔,而部署过程动画则是在外观模块里利用ShowSubObject和HindSubObject将假炮塔隐藏掉,把真炮塔显示出来产生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、 容器类模块。这类模块的特点是可以容纳别的物体,并含有一定的容积。而这些容积也分为内部式和外部式两类,其中外部式容积比较特殊,它的乘员会受到外部火力的直接伤害,而内部式容积则可以保护乘员免受伤害。在使用中,这些容器模块含有相当多的通用语句,你也可以尝试一下挪用语句,说不定也能搞出点意外的惊喜,例如报错。
此外一定要谨慎,由于有AllowInsideKindOf和ForbidInsideKindOf语句,所以千万不要搞出冲突。
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种可成为本体驾驶员的乘员以及对应的条件标签、武器标签、状态标签、操作界面以及运动系统标签,这些不同的标签使得本体在不同情况下具有不同的外观和功能,就像RA2的IFV一样,放不同的兵,就变出不同的炮塔,同时更换不同的武器。可惜的是,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为默认值,表示下车后站在随机位置上,其他值表示固定值,将关联到本体的骨骼点ExitStart和ExitEnd上
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成功接触,否则A和B是永远无法相撞的。一说到这里,我就不由自主地想起了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 可以控制含有哪些类型标签的B,FK3D特意添加上了INFANTRY,于是超能力部队不光能偷车,还能偷人……
End
点评:这个模块比较特殊,只能是A在被人工或脚本操作的情况下接触到B(即常言道的命令A去渗透B)才能接触成功。如果将A当作射弹体打出去撞B,即便你看到A和B都重合在一起了,也没有任何结果发生。所以当初我妄图让超能力部队将一个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提高2到3个等级),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
尚有一些非常罕见,或者难度过分高的模块我没有例举,如果大家有兴趣可以自己去挖掘。此外,还望大家多给我补充和修正。