YGOCORE 游戏王CORE的自定义卡片教程(4)——第二章·进阶篇(下)
为什么触发型和永续型的condition等函数的参数会有所不同?
这是因为触发型和永续型他们所涉及的事件信息不一样。
触发型的效果涉及的事件信息有:
作用了哪个卡片组event group、作用了哪个玩家event player、事件的参数值value、因哪个效果reason effect、因什么原因reason、因哪个玩家reason player。
就是蓝色的那几个参数。
举例来说:
玩家1发动某效果e1对玩家2造成了500的效果伤害,那么这时候就会产生事件信息。
eg:空——没有作用于哪个卡片组
ep:1 (1=玩家2)——作用于玩家2
ev:500 ——事件有500的数值
re: e1 ——因效果e1
r: REASON_EFFECT(效果伤害)——因效果伤害
rp: 0 (=玩家1)——因玩家1
触发性效果的那几个函数就是将这几个值传入函数。
而永续型效果由于只有影响作用所以它涉及的事件信息只有:
作用的卡片card、作用的卡片组group、作用的卡片组数目group count、作用的效果effect或card、这个效果的玩家this player。
※tp(this player)不是指该回合的玩家,而是指那个开了连锁的效果所属的玩家。例如在自己回合对方发动了陷阱卡,那么就开了个连锁,这时候事件信息里面的tp就是对方。
※要注意,无论触发型还是永续型,operation的参数都是一样的。
函数样板


※有chk参数的函数都第一条语句都先判断chk,chk默认为0,意思是不可行,这个是用来设置门槛防止效果空发的。在target函数里,例如一个效果要选择场上一张卡破坏,那么场上就必须有卡,而且那卡是可破坏的,这时候我们才可以发动效果。在这里目标对象就是场上的一张卡,要是目标不存在的话就不发动。在target里Chk就是负责检查可操作对象是否存在。在cost函数里则是负责检查能否支付代价。他们的共同点就是检查可行性。例如我们只剩下1000LP这时候总不可能还能发动神警吧,难不成透支代价而死么?所以这里就有了这样一段语句:
if chk == 0 return Duel.CheckLPCost(tp,2000)
这位玩家能否支付2000LP作为cost。
永续效果型的cost里面没有chk参数,所以不需要判断chk,但是永续型效果的cost有bool值,也就是说要 return条件 end 给他返回一个真假值。
※如果触发型效果的operation带有某种类别如破坏会引发相应的事件、除外等等,那么target函数要为operation函数设定操作信息,调用函数Duel.SetOperationInfo(),其中一个参数是“操作的类别”,而cost函数不需要SetOperationInfo。
=====================================================================
好了,知道了这5个函数的相关知识后,我们可以拿魔轰神兽了来练练手。怎么练?那就是自己分析魔轰神兽那张卡的效果然后写出伪代码(中文意思的代码),最后再去对比一下自己的代码跟原效果代码。
以下是我们之前从效果说明中抽离出来的信息
Code时点:进墓地时
Type类型:只针对这张卡SINGLE+触发必发型TRIGGER_F
Condition:进墓地前在手卡+被丢弃
operation:发动效果的这张卡+表侧表示+特殊召唤+自己场上
Target:好像没有
试一下一伪代码的形式将上面的信息写成condition等函数的具体实现。
Function condition(e,tp,eg,ep,ev,re,r,rp)
return这张卡之前在手卡上and 事件原因是被丢弃
end
function Target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk ==0 return true end ——我们目标对象就是这张卡,所以无论如何都可行。
※设置operation的信息:宣言特殊召唤,这张卡,1张……——这一句可暂时不用理解
end
function operation(e,tp,eg,ep,ev,re,r,rp)
if 发动效果的是这张卡then 表侧表示特殊召唤到自己场上end
end
上面就把伪代码写好了,接着只要根据伪代码去function.txt找对应的函数替换掉中文部分就行了。其实正式的代码跟伪代码已经相差不大,不信你自己看。
function c82888408.spcon(e,tp,eg,ep,ev,re,r,rp)
return e:GetHandler():IsPreviousLocation(LOCATION_HAND) and bit.band(r,REASON_DISCARD)==REASON_DISCARD
end
function c82888408.sptg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
Duel.SetOperationInfo(0,CATEGORY_SPECIAL_SUMMON,e:GetHandler(),1,0,0)
end
function c82888408.spop(e,tp,eg,ep,ev,re,r,rp)
if e:GetHandler():IsRelateToEffect(e) then
Duel.SpecialSummon(e:GetHandler(),0,tp,tp,false,false,POS_FACEUP)
end
end