游戏王ygocore吧 关注:242,721贴子:2,885,677

YGOCORE 游戏王CORE的卡片添加教程

取消只看楼主收藏回复

这篇教程是我自己写的,而我本人也是正在自学写卡。
写这个教程的目的是为了什么?
我也是最近才听说开源项目里英文版的卡片更新速度最快,同时也是听另外一个写卡的网友说在国内参与写卡的加上他和作者还有外加的那几个都不知道有没有10个人……国外的玩家果然比较热情,参与的人多。另外听这个网友说,有些想要写卡的人跑来问他要怎么实现奥蕾哈刚的效果……我瞬间就心疼了……尼玛还有一大堆正规卡还没录入,就惦记着去加这些没头没脑反都反规则的原创卡。
所以我就觉得有必要让真正有意去为YGOCORE做出贡献的人开一个大门。于是就有了这个教程,希望能号召更多人参与YGOCORE的写卡事业。
正如我所说,我也在学习写卡,所以可能教程里面会有很多不足,那就请原谅了。另外,与其说这是教程还不如说这是个学习笔记……都是我在学习写卡的过程中的一些心得。


1楼2012-04-06 22:33回复
    ……吧主请把2楼删掉,度娘傲娇了。


    4楼2012-04-06 22:42
    回复
      事实上我已经写了1万七千字的教程文档……(吓死人),然而却只了解到YGOCORE的冰山一角。所以写卡之路是无比的漫长啊,趟这趟浑水可要有必死的决心。


      6楼2012-04-06 22:56
      收起回复
        不过事实上呢DIY的卡不会被作者认同并打包进他的官方版里的。再说如果两个YGOCORE的数据库不统一的话,你有那张卡,他没有那张卡,游戏里只会报错。所以大可不必担心。
        我担心的是……国内想去写卡都尼玛的只想着满足自己加这种毫无意义的卡片,真正踏踏实实为了造福大家而写卡的人加起来却五个手指都数的清,那么YGOCORE的卡库又怎么能丰裕起来?那么不成都指望英文版、日文版那边替你更新么?
        所以我希望有意去提供卡片效果脚本的人能够入门参与到这一事业中。之后平时自己DIY卡娱乐一下,也没什么不可。只是别总是先惦记着这事。


        9楼2012-04-06 23:53
        回复

          第一章续
          原本我是在第一章的第二节了里面准备了YGOCORE程序内部结构这一个内容的(这可是我辛辛苦苦看源码分析出来的),但是经过我深思熟虑我发现这内容除了我以外对于其他人没有任何意义……囧,所以就不贴出来了,只粗略的讲一讲YGOCORE里面会用到的自定义类型(其实就是面向对象里的类,这个不懂无所谓)
          2.1 自定义类型
          YGOCORE有三大自定义类型(就是YGOCORE自己定义出来的类型,面向对象里直接就是类的意思)YGOCORE里面各种处理的都基于这些类型的变量的。
          Card ——卡片类
          Group ——卡片组类
          Effect ——效果类
          这些类型都有成员变量(属性)和成员函数(行为)
          在lua里面调用这些类型的成员函数的方式如下
          卡片对象 : 对象成员函数
          C#######:GetXXXXXX()
          ※注意中间的冒号操作符,lua里面调用对象的成员函数都要这样做。而函数库里的函数调用就用点,例如Duel.Destroy()破坏某张卡。
          其实这不是严格上的解释,但是为了让大家快速入门,关于lua的语法特性我就能忽略就忽略。直接简单明了的说明。
          这三个类型里面最重要的是effect类,因为我们的效果就是effect类。我们写卡最有学问,最复杂,最耗时间,最头疼的就是写effect类的具体功能。所以我会详细的讲effect类。
          2.1.1 Card类是什么?
          Card类就是卡片类,YGOCORE在游戏开始的时候会从卡组deck文件里面读取 c+ID,然后以这个c+ID为名创建一个卡片对象,其实可以看做是card类型的变量吧。这个卡片对象有属于这个卡片的各种行为和属性。而我们YGOCORE的决斗系统Duel就是把弄这些卡片对象,将他们解放、破坏弄来弄去。Card类有什么属性(成员变量)有什么行为(成员函数),就到作者提供的function.txt里面查询(Set函数都是设置属性,Get函数都是获取属性)。
          由于Card对象不需要我们去创建和定义,所以我们根本就没要在意它需要设定什么值。只需要“拿来”就行了,用Get开头的成员函数获取一个现有的卡片的信息,然后对信息进行处理(主要是判断)。
          2.1.2 Group类是什么?
          Group类是卡片组类,不是卡组啊,是卡片组,卡组是Deck。卡片组是一堆卡片的**,有些操作需要涉及到一组卡片例如卡片检索,需要将卡组里面符合条件的卡放到一起呈现在你面前让你选。这时候放到一起就放到了卡片组里面去了。这个类型跟card一样,我们不许要去设置,都是“拿来”(Get)。
          2.1.3 Effect类!高潮来了。
          这是最重要的类,我们的卡片的效果就是通过我们编写脚本来创建和定义这个类来实现具体的效果操作的。同时effect类也跟Card和Group一样可以“拿来”(Get)。
          以下是effect类的基本属性

          红色的属性conditioncost target operation就是效果的具体功能,他们都是函数需要我们自己去写实现代码,或者留空不设置。还记得我们的hello card么?hello card里面就没有设置这四个,但是依然可以用,可以发动效果。
          


          12楼2012-04-07 10:53
          回复

            2.3 两大基本效果类型
            YGOCORE里面有两大基本效果类型,对应于现实世界的游戏王其实就是按效果开不开连锁分类的:
            开连锁的效果——触发型效果(带有发动行为)
            不开连锁的效果——永续型效果(没有发动行为)他们之间还有个更加直观的区别。

            在YGOCORE里面,开连锁的效果都会在屏幕上显示放大了的自己的卡图,还有闪烁。
            而不开连锁的效果则没有。
            ※永续型效果不等于永续魔法陷阱卡的效果,其实“永续型”这个称呼有点混扰视听,我本人不是很赞同这个称呼,如果要我改个名的话,我会叫它作用/影响型效果。
            两大基本效果代码能发动起作用的最基本要求有:
            触发性效果:
            必须要有Type和Code。
            Type必须为EFFECT_TYPE_ACTIONS下方的任意一个类型。回想起我们的hello card,你就知道我们的hello card是触发型的效果。而e1第一个效果的Type就是发动型的意思。
            Code必须是EVENT_常量,是时点/事件的意思。永续型效果:
            必须要Type,Code、Range和Target Range。
            Type属性只能是EFFECT_TYPE_SINGLE(单体影响),EFFECT_TYPE_FIELD(群体影响)以及EFFECT_TYPE_EQUIP(被装备者影响)中的一个,不能与其他效果组合。Code是EFFECT_常量。Range是生效区域LOCATION值,TargetRange是作用区域也是LOCATION值。有一种奇葩的永续型效果是不需要range的,那就是全局效果,这个是实际写效果的时候会用到的技巧,不是基本效果之一。
            ※单体影响型效果的解释:设定了这个类型的卡,只会被这张卡引发的事件/时点触发效果。


            14楼2012-04-07 11:06
            回复



              15楼2012-04-07 11:10
              回复

                EFFECT_TYPE_常量

                最开始的那三个紫色的TYPE是永续型的TYPE,永续型效果的TYPE只能是这三个中的其中一个。绿色的那几个TYPE是触发型的TYPE,触发型TYPE里面只有TRIGGER(诱发)必须跟TYPE_SINGLE或TYPE_FIELD连用。
                触发型的property(附加性质)

                永续型的property值
                


                16楼2012-04-07 11:11
                回复
                  ※为什么TYPE_TRIGGER(诱发型效果)需要跟TYPE_SINGLE/FIELD连用?
                  这是因为诱发这个效果的卡片可能是别的卡又可能只是这张卡自身。
                  里如果
                  效果e1
                  类型 诱发必发型 EFFECT_TYPE_TRIGGER_F
                  Code 进入墓地时 EVENT_TO_GRAVE
                  这是什么意思?是拥有效果的这张卡进入墓地时诱发效果还是别的什么卡进入墓地时诱发效果?
                  这就有个歧意。所以在类型TYPE里面TYPE_TRIGGER要跟TYPE_SINGLE/FIELD连用,以限定这个诱发效果是针对自身还是针对其他卡片。


                  17楼2012-04-07 11:16
                  回复

                    Hello Card 2.0!
                    现在我们为当初写的那个HelloCard 添加一个最基本的永续型效果。做法跟上次一样,不过这次为了让卡片留场,我们要修改卡库里面Hello Card的卡种,改成永续+魔法。
                    然后往lua脚本里面这样写
                    --hello card
                    function c19903192.initial_effect(c)
                    --Activate
                    local e1=Effect.CreateEffect(c)
                    e1:SetType(EFFECT_TYPE_ACTIVATE)
                    e1:SetCode(EVENT_FREE_CHAIN)
                    e1:SetOperation(c19903192.op) –调试用
                    c:RegisterEffect(e1)
                    --effect
                    local e2=Effect.CreateEffect(c)
                    e2:SetType(EFFECT_TYPE_FIELD)
                    e2:SetCode(EFFECT_CANNOT_ATTACK)
                    e2:SetRange(LOCATION_SZONE)
                    e2:SetTargetRange(LOACATION_MZONE,LOCATION_MZONE)
                    c:RegisterEffect(e2)
                    end
                    function c19903192.op(e,tp,eg,ep,ev,re,r,rp)
                    Duel.SelectYesNo(tp,1)
                    end
                    e1就是触发型效果的最基本代码,e2就是永续型效果的最基本代码。
                    以后我们写效果都是用这两种类型的效果不断细化组合出更具体的效果。
                    现在去测试一下,恩?发动效果的时候弹窗了!然后怪兽攻击阶段无法攻击了……
                    第一个效果是发动时弹窗,第二个永续型效果是无法攻击。
                    是否注意到这次的hello card里我为我们第一次写的效果e1加了一段代码? e1:SetOperation(c19903192.op)
                    效果初始化函数下面还有个function c19903192.op(……) 函数的定义
                    回到【2.1.3Effect类】那一节回顾一下operation是什么属性,没错,operation就是卡片效果处理操作,是一个函数,而我在这里定义的c19903192.op函数就是效果的效果处理函数,负责处理效果的操作。
                    这次这个函数里面只调用了Duel.SelectYesNo(tp,1),作用就是效果处理的时候弹出选一个是/否对话框,供玩家选择。

                    它在这里的实际用处是用来检查operation函数有没有被执行,换句话就是这个效果有没有真正的发动和处理。但是在正式的效果脚本里,这个函数是用来跟玩家交互的,也就是获取玩家的选择。
                    测试你的hello card,你会发现hallo card发动的时候弹出了这个对话框,证明效果发动并且真的处理操作了。
                    但是永续型效果却无法用这种方式调试,因为永续型效果一般不带operation,不会弹出什么东西。这就惨了,我怎么知道自己写的永续型效果有没有起作用?这就要慢慢来了。一般是先用容易检测到的永续型效果来测试基本代码是否无误,然后再修改成更具体的代码,这里涉及到效果脚本的调试请看2.4效果脚本的调试。
                    ※再提供多一段代码给你,将这段代码添加到hallo card里看看。
                    local e3=Effect.CreateEffect(c)
                    e3:SetType(EFFECT_TYPE_TRIGGER_F+EFFECT_TYPE_FIELD)
                    e3:SetCode(EVENT_TO_GRAVE)
                    e3:SetRange(LOCATION_SZONE)
                    e3:SetOperation(c19903192.op)
                    c:RegisterEffect(e3)
                    在测试之前你能不能看懂这个效果什么意思?


                    18楼2012-04-07 11:32
                    收起回复
                      谢谢路飞的提醒,我本来也不知道YGOCORE的debug怎么开启。
                      这样就可以通过游戏目录的error.log文件查看到卡片里面出现了什么语法错误了。

                      我把hallo card的operation里面的调试用函数故意写错成SelectYsNo,游戏里测试卡片没有引发效果,然后打开error.log就可以从中就看到了了c19903192的调试信息,发现有个函数写错了。接着就回到lua脚本里面修改。
                      


                      22楼2012-04-07 14:12
                      回复
                        改卡效率固然高,但是有时候有些卡片的效果没有先例。例如虫洞的最后一个效果。
                        虫洞
                        选自己场上的1只怪兽,在自己的下次的准备阶段之前除外。除外的时候,被选择的怪兽的怪兽区的位置不能使用。
                        “被选择的怪兽区的位置不能使用。”这个效果我翻遍了各种效果的脚本没有找到先例。于是乎我爱钻牛角尖的性格趋势之下,把YGOCORE的表面里面实现都翻了一遍,最后终于成功的写出了这个效果。这要用到奇葩的全局效果+区域的二进制标识。太他妈奇葩了,要不是我有编程础我还看不懂那一段干什么用。这个我会另外开一个贴讲我写虫洞这张卡的经历。


                        23楼2012-04-07 14:34
                        回复

                          2.4效果脚本的调试
                          这是很重要的环节,虽然我们还没有详细的讲解到condition target cost operation函数的具体细节,但是以目前学到的知识,各位其实都已经可以去设计没有实际操作但是又可以发动的效果effect了,例如我们写的hello card。通过不断的尝试各种各样的效果组合来了解各种效果的运作特点在正式编写效果脚本前是很有意义的。
                          由于路飞君的提点,重新修正了脚本调试的方法。
                          有一点要注意
                          在上面我选了Duel.SelectYesNo作为调试用函数,来测试operation函数有没有被执行。但是这个函数允许在Cost,Target和operation这三个函数里面使用,condition是不能加这个函数检测的。
                          人非圣人孰能无过,尤其是像我们没有专用编译器帮你差错,直接在文本编辑器上面码代码,很容就写错字,弄错标点什么的,效果不能发动或者发动了不起作用。这时候就要靠YGOCORE去帮你找出脚本中哪一行出错。
                          开启YGOCORE的Debug模式(调试模式)
                          给YGOCORE创建一个快捷方式的目标文件那里添加–Debug 这几个字

                          这样YGOCORE的调试模式就开启了。
                          测试卡片的时候,脚本的错误都会记录在YGOCORE根目录的error.log文件里面。
                          现在我们试一下将SetOperation函数里面的c19903192.op删掉,保存然后测试卡片。

                          这时候打开error.log,找到自己的lua脚本。这两句就是调试信息,写明了是什么错误。
                          [Script error:][string “c######.lua”]:行号错误原因
                          重要的是行号和错误原因,我们直接根据行号查看自己lua所在那行代码,然后根据错误原因去检查哪里出错。
                          Error.log里面说我的lua脚本第8行缺少了个function参数。打开一看,第八行SetOperation还真的少了个operation函数参数(废话……不久刚才自己弄得么)
                          拼写错误的话error.log是怎么提示的?


                          信息显示第5行 SetTpe 呼叫失败。看到这个难道还不明白么。
                          如果我们将符号常量写错了会怎么样?
                          我将SetType的EFFECT_TYPE_ACTIVATE写成了EFFEC_TYPE_ACTIVATE。测试一下。


                          没有产生新的调试信息,我写错了符号常量但是YGOCORE却没有检测出则个错误。
                          看来YGOCORE是不会检查符号常量的拼写错误的。这里就要注意了,这种错误要靠自己去排查检查。不过一般代码没写错,那么就肯定是符号常量有错。
                          脚本编写与调试步骤(各个阶段都要配合error.log调试信息)
                          第一步:先将效果的最基本代码写出来。其实就是hello card的那种,只把能发动效果的最低限度的代码写出来。然后测试,看能不能够发动。
                          第二步:为添加调试用operation函数,调试函数就用duel.SelectYesNo()来充当。然后再测试,看看效果发动后有没有进入处理。target,cost也用这种方法。
                          第三步:通过error.log调试condition。
                          第四步:代码的具体实现阶段。condition target cost operation这四个函数畅通无阻后,就开始往里面编写具体的处理代码。这时候的调试就主要依靠error.log调试信息了。当然在target cost operation这三个函数里面,我们也可以使用调试函数来按步跟踪。
                          按照以上的步骤我们就将代码debug分成了四个阶段,再配合YGOCORE提供的error.log调试信息,消除bug也就更准确方便了。到时候,只要对应哪个阶段去检查该阶段的代码即可。
                          要养成经常检查error.log的习惯。


                          25楼2012-04-07 17:09
                          回复
                            我记得是需要.NET FRAMEWORK (多少版本号来着)才能运行DataEditor这个软件


                            29楼2012-04-08 12:10
                            回复
                              由于教程的文字和图片量实在是太多啦!!在一个帖子里面更新有诸多的不便,第一我无法修正已有的错误,第二没有各种粗体颜色字体标出来看起来很吃力。所以我现在打算先在我的百度空间里面将教程更完。
                              下面是教程的博文,目前已经更新到了第三章前奏,看完目前的内容就已经基本可以无压力地写各种触发型效果了!
                              http://hi.baidu.com/303359166/blog/category/Ygocore
                              声明:我不是为了自己空间的人气,百度空间我都不知道荒废了多少年没碰了。


                              31楼2012-04-08 18:29
                              收起回复