找回密码
 点一下
查看: 2712|回复: 3

[小贴士]法力燃烧 的制作方法及注意事项

[复制链接]
发表于 2011-4-18 19:44:13 | 显示全部楼层 |阅读模式
想制作一个技能,war3中恶魔猎手的法力燃烧:扣除目标至多X点魔法值,并扣除目标与魔法损失量等同的生命值。我们现在假定X为30。


如果简单的以“修改单位”做的话就是这样
[codes=xml]
&#160;&#160;&#160;&#160;<CEffectModifyUnit id="ManaBurn">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ResponseFlags index="Acquire" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ResponseFlags index="Flee" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalArray index="Life" Change="-30"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalArray index="Energy" Change="-30"/>
&#160;&#160;&#160;&#160;</CEffectModifyUnit>
[/codes]
这个效果在目标的魔法值大于等于30的情况下没有问题,如果小于30的话就出现问题了,因为不能保证扣除的生命和魔法值等同,于是改用下面的方法
[codes=xml]
&#160;&#160;&#160;&#160;<CEffectModifyUnit id="ManaBurn">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalArray index="Life" Change="-1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalArray index="Energy" Change="-1"/>
&#160;&#160;&#160;&#160;</CEffectModifyUnit>
&#160;&#160;&#160;&#160;<CEffectCreatePersistent id="XunHuan">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<WhichLocation Value="TargetUnit"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<PeriodCount value="30"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<PeriodicValidator value="hasEnergy"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<PeriodicEffectArray value="ManaBurn"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<PeriodicPeriodArray value="0"/>
&#160;&#160;&#160;&#160;</CEffectCreatePersistent>
[/codes]
要扣多少魔法只要修改PeriodCount就可以了,“hasEnergy”是默认存在的一个验证器。

看起来是不错,但是上面的写法是不能完成任务的,周期性验证器在周期为0时并不能在每个周期效果触发前做出判断,如果此处把周期修改为0.0625,省略去中间的过程,起码结果看起来是对的。所以这里要把验证器写到ManaBurn里面才可以。
[codes=xml]
&#160;&#160;&#160;&#160;<CEffectModifyUnit id="ManaBurn">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray value="hasEnergy"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalArray index="Life" Change="-1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalArray index="Energy" Change="-1"/>
&#160;&#160;&#160;&#160;</CEffectModifyUnit>
&#160;&#160;&#160;&#160;<CEffectCreatePersistent id="XunHuan">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<WhichLocation Value="TargetUnit"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<PeriodCount value="30"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<PeriodicEffectArray value="ManaBurn"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<PeriodicPeriodArray value="0"/>
&#160;&#160;&#160;&#160;</CEffectCreatePersistent>
[/codes]
这在目标的生命值大于30的时候没有问题,如果目标的生命值本来就低于30,那么会造成单位的死亡并且在触发器中找不到凶手。于是只好用下面的方法解决
[codes=xml]
EffectData.xml
&#160;&#160;&#160;&#160;<CEffectSwitch id="FenZhiPanDuan_MP">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<ValidatorArray value="hasEnergy"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CaseArray Validator="HpLE1" Effect="KillUnit"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CaseDefault value="ManaBurn"/>
&#160;&#160;&#160;&#160;</CEffectSwitch>
&#160;&#160;&#160;&#160;<CEffectDamage id="KillUnit">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Flags index="Kill" value="1"/>
&#160;&#160;&#160;&#160;</CEffectDamage>
&#160;&#160;&#160;&#160;<CEffectModifyUnit id="ManaBurn">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalArray index="Life" Change="-1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalArray index="Energy" Change="-1"/>
&#160;&#160;&#160;&#160;</CEffectModifyUnit>
&#160;&#160;&#160;&#160;<CEffectCreatePersistent id="XunHuan">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<WhichLocation Value="TargetUnit"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<PeriodCount value="30"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<PeriodicEffectArray value="FenZhiPanDuan_MP"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<PeriodicPeriodArray value="0"/>
&#160;&#160;&#160;&#160;</CEffectCreatePersistent>


ValidatorData.xml
&#160;&#160;&#160;&#160;<CValidatorUnitCompareVital id="HpLE1">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Compare value="LE"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Value value="1"/>
&#160;&#160;&#160;&#160;</CValidatorUnitCompareVital>
[/codes]
FenZhiPanDuan_MP的效果用伪代码来写的话就是
if(hasEnergy){
&#160;&#160;&#160;&#160;Case HpLE1 : KillUnit;
&#160;&#160;&#160;&#160;Default ManaBurn;
}
比上个写法就是多了个判断目标的生命然后补刀。




不满足的童鞋咱们继续,执行上面的效果并不能知道本次技能到底造成了多少伤害,有没有直接一些的方法呢?我们来看看下面的方法吧。
[codes=xml]
&#160;&#160;&#160;&#160;<CEffectDamage id="ManaBurn_HP">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Flags index="Notification" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Flags index="NoVitalAbsorbShields" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalBonus index="Energy" value="30"/>
&#160;&#160;&#160;&#160;</CEffectDamage>
&#160;&#160;&#160;&#160;<CEffectModifyUnit id="ManaBurn_MP">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalArray index="Energy" Change="-30"/>
&#160;&#160;&#160;&#160;</CEffectModifyUnit>
&#160;&#160;&#160;&#160;<CEffectSet id="ManaBurn">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<EffectArray value="ManaBurn_HP"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<EffectArray value="ManaBurn_MP"/>
&#160;&#160;&#160;&#160;</CEffectSet>
[/codes]
用这个方法达到的效果和刚才的完全是一样的,CEffectDamage我也没有具体研究,单就这个例子我简单说一点点吧。

Flags里面的两个选项
NoVitalAbsorbLife&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;国服的翻译:不可吸收生命
NoVitalAbsorbShields&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 国服的翻译:不可吸收护盾

这两个选项如果勾选的话,那么这个“伤害”效果就不能对单位的生命值和/或护盾值造成影响。比如想弄一个武器效果,攻击只扣除单位的生命而不影响护盾的话,就把NoVitalAbsorbShields勾选上吧。



VitalFractionCurrent&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;国服的翻译:关键指标当前分数
VitalBonus&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;国服的翻译:关键指标加成
VitalFractionMax&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;国服的翻译:关键指标最大分数

它们的index分别都可以填Life(生命值)、Shields(护盾值)、Energy(魔法值)。

<VitalFractionCurrent index="Energy" value="0.5"/>
VitalFractionCurrent对伤害值的修改为:增加&#160;&#160;目标当前魔法值*value ,亦即当前魔法值的一半。如果index是Life和Shields时,伤害以上述条件累加。
<VitalBonus index="Energy" value="30"/>
VitalBonus对伤害值的修改为:如果目标当前的魔法值小于等于30,那么增加&#160;&#160;目标当前的魔法值&#160;&#160;点伤害;如果大于30,则增加30点伤害。如果index是Life和Shields时,伤害以上述条件累加。
<VitalFractionMax index="Energy" value="0.3"/>
VitalFractionMax对伤害值的修改为:如果目标当前的魔法值与上限的比小于等于30%,那么增加&#160;&#160;目标当前的魔法值&#160;&#160;点伤害;如果大于30%,则增加&#160;&#160;目标魔法上限*30%&#160;&#160;点伤害,因为此处value大于1基本上是没啥意义的。如果index是Life和Shields时,伤害以上述条件累加。



Random&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;国服的翻译:随机
这个翻译没错,就是随机了伤害了。随机伤害的取值范围是[0,n),注意,如果是整数的话,所有的伤害也为整数。



Total&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 国服的翻译:总计
有三个值可选:
Combine(组合)为将VitalFractionCurrent、VitalBonus、VitalFractionMax、Random这四个增加的伤害加起来。
Maximum(最大值)为取最大值。
Minimum(最小值)为取最小值。



根据上面列出的一些内容,很容易看出ManaBurn_HP是如何生效的。那么现在假设恶魔猎手中有个吊车尾,他虽然可以抽取目标30点魔法值,但是造成的伤害只有30%,那么我们应该怎么写他这个技能呢?

在这里我不得不抱怨了,Random的存在直接导致了Total的值Minimum完全没用了,假设没有Random这个属性的话,我应该会这样写伤害
[codes=xml]
&#160;&#160;&#160;&#160;<CEffectDamage id="ManaBurn_HP">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Flags index="Notification" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Flags index="NoVitalAbsorbShields" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalFractionCurrent index="Energy" value="0.3"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalBonus index="Energy" value="9"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalFractionMax index="Energy" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Total value="Minimum"/>
&#160;&#160;&#160;&#160;</CEffectDamage>
[/codes]
虽然用法很不规范,但是至少可以达到要求,但是现在的情况是有Random,因此在Total为Minimum时,伤害附加值始终为0。当然Random的值不为0的话,依然无法达到要求。如果Random可以设置上下限,那么倒是不错,如果能得话,我还是建议将Random从Total的范围中剔除出去,毕竟内容根本就没相关嘛。

或者应该将VitalBonus和VitalFractionMax中再添加一个属性,就是可以设置伤害比例,而之前的value来控制响应上限,那么可以看出VitalFractionCurrent就是一个修改后的特例化的VitalFractionMax,不知道这个建议行不行,又或者我哪弄得不对。

所以到最后,我们还得这样做
[codes=xml]
&#160;&#160;&#160;&#160;<CEffectDamage id="ManaBurn_HP_1">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Flags index="Notification" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Flags index="NoVitalAbsorbShields" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalFractionCurrent index="Energy" value="0.3"/>
&#160;&#160;&#160;&#160;</CEffectDamage>
&#160;&#160;&#160;&#160;<CEffectDamage id="ManaBurn_HP_2">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Flags index="Notification" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Flags index="NoVitalAbsorbShields" value="1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Amount value="9"/>
&#160;&#160;&#160;&#160;</CEffectDamage>
&#160;&#160;&#160;&#160;<CEffectSwitch id="FenZhiPanDuan_HP">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CaseArray Validator="MpLE30" Effect="ManaBurn_HP_1"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<CaseDefault value="ManaBurn_HP_2"/>
&#160;&#160;&#160;&#160;</CEffectSwitch>
&#160;&#160;&#160;&#160;<CEffectModifyUnit id="ManaBurn_MP">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<VitalArray index="Energy" Change="-30"/>
&#160;&#160;&#160;&#160;</CEffectModifyUnit>
&#160;&#160;&#160;&#160;<CEffectSet id="ManaBurn">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<EffectArray value="ManaBurn_HP"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<EffectArray value="ManaBurn_MP"/>
&#160;&#160;&#160;&#160;</CEffectSet>


ValidatorData.xml
&#160;&#160;&#160;&#160;<CValidatorUnitCompareVital id="MpLE30">
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Compare value="LE"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Vital value="Energy"/>
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<Value value="30"/>
&#160;&#160;&#160;&#160;</CValidatorUnitCompareVital>
[/codes]



小贴士:

“修改单位”效果可以杀死单位,但是不会在“单位死亡”事件中提供“进行击杀的单位”;“修改单位”效果不能触发“单位受到伤害”事件。

“创建持续性效果”中的周期性验证器在周期为0时并不能在每个周期效果触发前做出判断,亦即无法及时的销毁该持续效果。

有关于“伤害”效果的些些内容,可以参照上面的内容。
补充一点的是,如果NoVitalAbsorbLife和NoVitalAbsorbShields都勾选的话,该效果就不能造成伤害了,但是LeechFraction依然可以正常生效。
发表于 2011-4-19 20:08:45 | 显示全部楼层
问下楼主,CEffectModifyUnit里的VitalArray_Change的值为何不能用catalogfieldvalueset去去修改?是path填的不对吗?
回复

使用道具 举报

发表于 2011-8-4 14:29:44 | 显示全部楼层
不好意思挖坟了= =
但是想问一下数据怎么做自己有多少魔法值就对目标造成多少伤害的技能?
求思路~
回复

使用道具 举报

发表于 2011-8-25 13:44:46 | 显示全部楼层
楼主太有才了···厉害··
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-8-7 23:24 , Processed in 0.071001 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表