星际2技能系统分析(三)Ability(Effect)
技能施放的阶段
技能被分为了7个阶段
Approach:接近
Wait:等待
Prep:准备
Cast:施放
Channel:引导
Finish:结束
Bail:保释
AbilEffect
效果技能基类
属性
好吧。。太多了
Arc:施法范围,若目标不在范围内,单位会自动调整至目标进入施法范围
Cost:技能消耗
AutoCast:自动释放技能的属性
Effect:技能应用的效果,默认值为##id##,既Id相同的CEffect
EffctRange : 效果范围
然后就是一堆技能各个阶段的配置:比如哪个阶段可以被强行中断,哪个阶段可以返回Cost, 哪个阶段取消特效等
XML定义
<CAbilEffect default="1">
<!--目标离开施法者距离1米远后,施法取消-->
<RangeSlop value="1"/>
<!--目标离开施法弧形11.25角度后,施法取消-->
<ArcSlop value="11.25"/>
<!--自动施法,主动攻击-->
<AutoCastAcquireLevel value="Offensive"/>
<!--自动施法对象, 可见的;玩家;同盟-->
<AutoCastFilters value="Visible;Player,Ally"/>
<!--联盟变换后中止-->
<Flags index="AbortOnAllianceChange" value="1"/>
<!--最小引导-->
<Flags index="ChannelingMinimum" value="1"/>
<!--使用施法者半径范围-->
<Flags index="RangeUseCasterRadius" value="1"/>
<!--再次接近-->
<Flags index="ReApproachable" value="1"/>
<!--目标在视野范围内-->
<Flags index="RequireTargetVision" value="1"/>
<!--等级改变时更新充电-->
<Flags index="UpdateChargesOnLevelChange" value="1"/>
<!--等待耗尽-->
<Flags index="WaitToSpend" value="1"/>
<!--找到相同ID的Effect-->
<Effect value="##id##"/>
<!--效果距离0 - 500 -->
<EffectRange value="0,500"/>
<AINotifyEffect value="##id##"/>
<!--接近阶段可以退还消耗-->
<RefundArray index="Approach" value="1"/>
<!--准备阶段可以退还消耗-->
<RefundArray index="Prep" value="1"/>
<!--施放阶段可以退还消耗-->
<RefundArray index="Cast" value="1"/>
<!--退还的消耗系数-->
<RefundFraction>
<!--水晶矿-->
<Resource index="Minerals" value="-1"/>
<!--气矿-->
<Resource index="Vespene" value="-1"/>
<!--人口-->
<Resource index="Terrazine" value="-1"/>
<!--自定义-->
<Resource index="Custom" value="-1"/>
<!--充能-->
<Charge value="-1"/>
<!--CD-->
<Cooldown value="-1"/>
</RefundFraction>
<UseMarkerArray index="Approach" value="1"/>
<UseMarkerArray index="Prep" value="1"/>
<UseMarkerArray index="Cast" value="1"/>
<UseMarkerArray index="Channel" value="1"/>
<PauseableArray index="Approach" value="1"/>
<PauseableArray index="Prep" value="1"/>
<PauseableArray index="Cast" value="1"/>
<PauseableArray index="Channel" value="1"/>
<PauseableArray index="Finish" value="1"/>
<PreemptableArray index="Approach" value="1"/>
<PreemptableArray index="Prep" value="1"/>
<PreemptableArray index="Channel" value="1"/>
<DefaultError value="MustTargetUnit"/>
<AcquirePriority value="3"/>
<SetLastTarget value="Unknown"/>
</CAbilEffect>
AbilEffectInstant
立即生效的效果技能基类
属性
XML定义
<CAbilEffectInstant default="1">
<CmdButtonArray index="Execute">
<Flags index="ShowInGlossary" value="1"/>
</CmdButtonArray>
</CAbilEffectInstant>
实体类
人族机枪兵兴奋剂技能,首先需要花费10点生命值
下图强化剂挂载的模组
使用兴奋剂的逻辑猜测
1. 玩家点兴奋剂按钮
2. 如果技能不处于冷却状态,则UseStimpack为真
3. 启用Simpack技能
4. 从挂载的效果模组中找到EffectID = ‘Simpack’的Effect
<CEffectApplyBehavior id="Stimpack">
<EditorCategories value="Race:Terran"/>
</CEffectApplyBehavior>
CEffectApplyBehavior是增加行为的效果,括号内的文字是编辑器里取的别名与ID无关
5. 执行兴奋剂的逻辑处理
6. 兴奋剂效果又挂载了一个行为模组
7. 执行兴奋剂的行为逻辑
CBehaviorBuff是Buff行为
AbilEffectTarget
目标效果技能基类,选择目标后触发效果
属性
FinishCommand:单位完成技能后使用的命令
XML定义
<CAbilEffectTarget default="1">
<CmdButtonArray index="Execute">
<Flags index="ShowInGlossary" value="1"/>
</CmdButtonArray>
<Flags index="BestUnit" value="1"/>
<FollowRange value="5"/>
</CAbilEffectTarget>
实体类
机枪兵的搭档的医疗兵治疗技能
<CAbilEffectTarget id="MedivacHeal">
<OrderArray index="0" DisplayType="Confirm" Model="Assets\UI\Cursors\WayPointAttack_Void\WayPointAttack_Void.m3"/>
</CAbilEffectTarget>
貌似不是医疗兵,是医疗运输机- -
表示还没玩过星际2,哈哈哈,建了个图实验了下
让机枪兵自相残杀,医疗运输机自动加血
治疗技能无CD
治疗逻辑猜测
1.治疗技能是自动施放
2.首先执行验证器
healCasterMinEnergy:治疗运输机是否有足够的能量
healSmartTargetFilters :筛选需要治疗的对象
NotWrapingIn : 没有被缠绕
3. 验证通过后施放技能
4. 执行MedivacHeal效果
<CEffectCreateHealer id="MedivacHeal">
<ValidatorArray value="IsBiological"/>
</CEffectCreateHealer>
发现没有挂载治疗相关的逻辑部分,然后看CEffectCreateHealer
定义了消耗能量和修复比例,但是米有指定修复哪种属性,然后看默认值
目标被治疗的活力类型为Life