虚零攻略组(May.17)Ygo Pro专题——那些年我们打过的牌 (下)

0
Want create site? Find Free WordPress Themes and plugins.

上一期我们稍微介绍了一下YGO PRO以及制卡用的DataEditorX,这一期开始,我们就要正式开始我们的印卡大业了~

(注意:1、本章篇幅较长,没有耐心看下去的人可以跳过去了;2、之后的操作以YGO Pro 2为基准)

首先我们打开DataEditorX,按照上期的方法打开cdb库,先别点那些卡,我们在卡片密码那里输入一串数值,比如54998762啥的,注意不能含有字母,否则会提示“卡片密码不能为0”,在卡图上方的框框中填入卡片名字,选好卡片类型以及卡片属性(如果要做效果怪的话记得一定要勾选“怪兽”以及“效果”和“效果分类”一栏中你想做的效果,方便之后检索)后点击添加,我们的卡片信息就成功导入进数据库了。

这里以“特殊召唤”为例,下图:

我们点击“脚本”,就可以为卡片创造一个命名格式为“c卡片密码.lua”的lua脚本(在选择打开的数据库所在的目录下,会自动生成一个“script”文件夹,自建脚本就存放在那里),此脚本可以使用Notepade++等工具编写,编写前记得把编码改成“utf-8 无BOM”,否则编出来的脚本是无效的,记得一定要编写之前改,编写完了过后再改已经迟了(某位大大的教训)。在这里我使用的是DataEditorX自带的编写工具,就省掉了改编码的那一步了。

可以看到,最上面那里就是我们的卡名,下面则是正式的代码区。

在这里会调用到YGO Pro自建的函数以及数据类型,下面搬运卡鲁洛斯大大给出的表(虽然很长但是这些都是我们后面要用到的,没耐心的请拖动滚动条OWO):

现在,我们就可以给自己的卡片添加效果了,首先我们在

function c54998762.initial_effect(c)的下面输入:

local e1=Effect.CreateEffect(c)

这段代码就是为卡片创建一个空效果,接下来我们需要设置效果发动的时点(条件)、类型、以及效果分类。

以这张卡从手卡丢弃去墓地时,这张卡在自己场上特殊召唤这个效果为例,我们先来分析效果描述,从中获取有用的信息。

首先我们可以发现,这个效果发动的对象是这张卡本身(EFFECT_TYPE_SINGLE),时点(code)是在从手卡(condition:LOCATION_HAND

)送入墓地(code:EVENT_TO_GRAVE)的时候,这张卡在自己场上表侧表示特殊召唤(operation:这张卡+自己场上+特殊召唤+表侧表示),同时可知:这个效果是属于诱发必发型(不需要玩家选择是否发动),并且效果分类为特殊召唤( category:CATEGORY_SPECIAL_SUMMON)。

那么我们应该怎么写接下来的代码呢?

首先我们要设置这个效果的属性,具体的信息就是通过分析效果描述剥离出来的对应常量,从时点开始依次为:

e1=SetCode(EVENT_TO_GRAVE)–时点

e1=SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_F)–当此卡的卡片状态发生变化时,即时发动此效果

e1=SetCategory(CATEGORY_SPECIAL_SUMMON)–效果类型为特殊召唤型

c:RegisterEffect(e1)–将效果注册给此卡

end

完成后的脚本应该是这样的:

function c54998762.initial_effect(c)

local e1=Effect.CreateEffect(c)

e1=SetCode(EVENT_TO_GRAVE)

e1=SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_F)

e1=SetCategory(CATEGORY_SPECIAL_SUMMON)

c:RegisterEffect(e1)

end

接下来把脚本放入YGO Pro 2根目录下的script文件夹里就可以开心的去测试了~

噫,卡片能够成功召唤没错,但是为什么效果没有发动?

检查脚本,似乎少了些什么?原来是没有写相关的检查以及操作信息,导致无法完成效果的发动。

在这里就需要用到一些固定的参数了,具体如下:

首先,这个效果想要发动,就必须确认这张卡存在于你的手牌上,并且是“之前存在于你的手牌上”(因为效果是从手牌进墓地后发动的),对照信息查查函数,嗯, Card Effect.GetHandler(Effect e)–(这张卡在手卡上)和 integer Card.GetPreviousLocation(Card c)–(获得之前卡片的位置)这两个函数似乎满足我们想要的条件,但是,似乎还有一个函数也是专门用来干这种事的,Card.IsPreviousLocation(Card c, integer loc),该函数用来检查c之前位置是不是loc。那么这里的脚本就是:e:GetHandler():IsPreviousPLocation(LOCATION_HAND)。

那么位置判定解决以后,我们再来写发动效果的原因,由于是将卡片送入墓地后发动,那么原因就是卡从手牌放入墓地啦,那么脚本就是:r==REASON_DISCARD。但是似乎感觉有些地方怪怪的?再看一眼常量表,原来REASON_DISCARD要和REASON_EFFECT、REASON_COST等常量连用才有意义,改动之后的脚本应该是:r==REASON_EFFECT+REASON_DISCARD才对。两个常量之间用加号相连。

接下来我们来设置操作信息,这里要用duel里的SetOperationInfo函数,这类函数的格式是:

Duel.SetOperationInfo(integer chainc, integer category, Card|Group targets, integer count, integer target_player, integer target_param)

此操作信息包含了效果处理中确定要处理的效果分类。比如潜行狙击手需要设置CATEGORY_DICE,但是不能设置CATEGORY_DESTROY,因为不确定。对于破坏效果,targets需要设置成发动时可能成为连锁的影响对象的卡,并设置count为发动时确定的要处理的卡的数量。比如黑洞发动时,targets需要设定为场上的所有怪物,count设置成场上的怪的数量。对于CATEGORY_SPECIAL_SUMMON,CATEGORY_TOHAND,CATEGORY_TODECK等分类,如果取对象则设置targets为对象,count为对象的数量;如果不取对象则设置targets为nil,count为预计要处理的卡的数量,并设置target_param为预计要处理的卡的位置。例如增援:SetOperationInfo(0,CATEGORY_TOHAND,nil,1,0,LOCATION_DECK)。操作信息用于很多效果的发动的检测,例如星渣(星尘龙),印卡的时候必定会用到。

然后就是确认这个效果是由这张卡发出的(也就是这个效果和这张卡有联系),而boolean Card.IsRelateToEffect(Card c, Effect e)这个函数就可以用来检查c是否和效果e有联系。那么我们可以这么写:e:GetHandler():IsRelateToEffect(e)

建立联系后我们就可以开始写召唤的代码了~这里要用到duel的SpecialSummon函数了:

integer Duel.SpecialSummon(Card|Group targets, integer sumtype, integer sumplayer, integer target_player, boolean nocheck, boolean nolimit, integer pos)

这串代码的意思是 :让玩家player以sumtype方式,pos表示形式把targets特殊召唤到target_player场上。如果nocheck为true则无视卡的召唤条件。如果nolimit为true则无视卡的苏生限制。返回值是特殊召唤成功的卡的数量。里面有一个参数是sumtype,是个intege,这是个常量标识,我们到YGO Pro2根目录下的scrip文件夹中的constant.lua中找找,发现真的有SUMMON_TYPE常量。同理pos的常量也发现了 POS_。我们需要的是SUMMON_TYPE_SPECIAL(特殊召唤)和POS_FACEUP(表侧表示)这两个。我们可以这样写:
Duel.SpecialSummon(e:GetHandler(),SUMMON_TYPE_SPECIAL,tp,tp,false,false,POS_FACEUP)

如果上面这些都完成了的话,我们就可以完善脚本了~

在原脚本的下面接着写:

然后在效果初始化那里Set上这些函数,保存。

现在再去测试一下,是不是就成了呢?咦?怎么还没反应?再去检查一下代码,似乎没有什么地方有问题。但是不知道有没有人注意到REASON_DISCARD其实是要要求将所有能够令卡丢弃的原因给列出来,那么问题来了,这样的组合有很多个,总不能一个个的用加号连起来吧?这个时候我们就需要用到过滤操作了,我们用 bit.band(r,REASON_DISCARD) 抽出r跟REASON_DISCARD 里面相同的部分!如果r里面包含有REASON_DISCARD的话那么就会返回REASON_DISCARD。我们的代码就可以改写成这样:

bit.band(r,REASON_DISCARD)~=0

经过修改后的脚本:

 

开机测试!

现在这张卡无论什么原因被丢弃到墓地都会引发效果,注意必须是要丢弃(效果或cost),“送入墓地”是不算的。

那么今天就先到这里,下一期我们就先讲解怎么做融合怪吧,后面同调、超量、灵摆都还等着呢~我们下期再见~

PS:事实上这篇文章里是有一个错误的,不过这个错误的原因是因为RT没有好好看效果造成的,是我的锅,想要自己制作卡片的同学在制作卡片的时候一定要明确自己想要达成的效果再动手哦。

Did you find apk for android? You can find new Free Android Games and apps.

关于作者

3366RT

前54df论坛最后一任游民部落版主

发表评论