游戏王ygocore吧 关注:130,619贴子:1,720,897

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

只看楼主收藏回复

这篇教程是我自己写的,而我本人也是正在自学写卡。

写这个教程的目的是为了什么?
我也是最近才听说开源项目里英文版的卡片更新速度最快,同时也是听另外一个写卡的网友说在国内参与写卡的加上他和作者还有外加的那几个都不知道有没有10个人……国外的玩家果然比较热情,参与的人多。另外听这个网友说,有些想要写卡的人跑来问他要怎么实现奥蕾哈刚的效果……我瞬间就心疼了……尼玛还有一大堆正规卡还没录入,就惦记着去加这些没头没脑反都反规则的原创卡。

所以我就觉得有必要让真正有意去为YGOCORE做出贡献的人开一个大门。于是就有了这个教程,希望能号召更多人参与YGOCORE的写卡事业。

正如我所说,我也在学习写卡,所以可能教程里面会有很多不足,那就请原谅了。另外,与其说这是教程还不如说这是个学习笔记……都是我在学习写卡的过程中的一些心得。


仙境传说RO,国服不删档测试!重温当年的冒险梦想,初心之约,快来集结! 正统端游,官方预约通道!唤醒沉睡的魔法,寻回内心的信仰之光!
广告
第一章:基础篇1.1 预备
工具
为YGOCORE添加自定义卡片和对应的卡片效果需要用到的工具有:
DataEditor——卡片数据库添加软件
这个软件是用来给card.cdb里登记卡片用的。YGOCORE只加载登记过的卡片,没登记过的卡片游戏中不存在。通常怪兽卡直接用这个软件添加即可在游戏中正常使用。这个软件要放到YGOCORE里的任意子目录中才有效,根目录会出错。
Notepad++——文本编辑软件,编写lua脚本
这个软件是用来编辑卡片lua脚本用的。编辑的时候记得要在格式菜单里面选择【utf-8 无BOM】编码,其他编码的lua脚本无效。
图片编辑软——修改卡图size
YGOCORE的卡图有具体要求:大卡图必须177*254,小卡图必须44*64。超过这个尺寸,游戏中将报错。而各大卡查网站的公用卡图size是160*232,所以不能直接给YGOCORE用。
作者提供的一些帮助文本
作者已经别写了一个比较简略的说明文本讲解了如何添加自定义卡片,但是实在是太简略了,有很多细节没有详细说明。因此我才打算更详细的去写这个教程。虽然有我的教程,但是作者的帮助文本还是很必须的,毕竟我的教程是基于作者的说明来的。Script.txt是作者的说明文本,里面十分简陋而无序的说明了效果编写相关……。其中的function.txt里面记录了作者编写的各种函数的信息,为我们查找提供了方便(但是仍然漏了一些函数没有记录进去……)。

知识
这绝对是必须的,本教程只涉及YGOCORE卡片的添加过程和细节,但是lua脚本,lua语言我是不会讲的。
那么是不是需要去了解lua语法?那是肯定的。但是没有必要精通lua,只要将lua的基本语法搞懂就行了,不会写也要会看会改。当然,最好有编程基础,这样看起代码来要高效得多。



1.2卡片添加流程
第一步:打开DataEditor录入卡片信息,傻瓜式无需讲解太多。右边的描述一定要写,不然你就别想在游戏里搜到你的卡片。不过要注意,卡片的种类(魔/陷/怪)将会决定该卡片在YGOCORE中的基本行为,例如放置的位置。如果你添加的卡本应该是陷阱卡,但是你却设置成了魔法卡,那么在游戏中你可能会看到陷阱卡像魔法卡一样在魔陷区发动的怪事(笑)。
第二步:加入卡图。我们可以直接用卡查的卡图,用图片编辑软件将图片的大小(宽高)转换成YGOCORE能够使用的大小,然后放到YGOCORE的pic文件夹里面。大卡图放到pic\,小卡图放到pic\thumbnali。这时候你已经可以打开YGOCORE,搜索你添加的卡了。如果你这时候测试,会发现这张卡用不了(如果是通常怪兽卡的话就可以直接用了),那是因为这张卡还没有写“效果”——以“c+卡片id”命名的lua脚本。

第三步:编写“卡片效果”——lua脚本。原则上lua的脚本可以用任何文字编辑软件写,但是lua却要求其编码格式必须是【utf-8 无BOM】,而windows自带记事本的utf-8编码是有BOM的(关于这个BOM是什么意思不必理会)。所以记事本写的lua脚本文件YGOCORE无法使用。所以我们就要用Notepad++来写,以【utf-8 无BOM】编码来写(不要写完才改编码,不然你会感动到哭的),最后以“c+卡片ID”命名,保存成后缀为lua的文件。然后将这个文件放到YGOCORE的Script\ 中。
※以后“卡片ID“一律简称为“ID”

卡片的添加就结束了。这三步里面最简单的是前两步,很傻瓜很简单。最有学问的是第三步,编写lua脚本。
这也是我这篇教程里面着重讲解的内容——YGOCORE脚本编写。



Hello Card!
没想到写卡也可以来个“Hellocard!”……世界变了
好吧,跟着我做第一张自创的卡片。
首先将卡片登记进YGOCORE的数据库,卡密千万别跟已经存在的卡撞车,尽量取奇葩一点的密码。
我们这次做的hello card是一张魔法卡。
第一步打开DateEditor


照着上图设置,设置完后新增记录录入数据。效果分类可以不选,不过能选就尽量选。

第二步、用Notepad++新建一个文档
格式那里选择【utf-8无BOM格式】
写入如下代码
--hello card
function c19903192.initial_effect(c)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_FREE_CHAIN)
c:RegisterEffect(e1)
end


上面这几条代码是一个效果能够发动的最基本代码,必须要有Type和Code。Type是类型,Code是事件又或者说是时点。这个以后的学习中会慢慢了解到的。

第三步、将这个文档以c+卡片ID为文件名保存成lua格式文件。放到YGOCORE的script目录里面。


打开游戏,编辑卡组搜索“你好卡片”,然后就发现我们的卡了。




接着就去测试这个卡片,将卡片放到卡组的最前面

这样做是有原因的,如果你想要开局就抽到你想要测试的卡,那么最好放到最前,然后主机的时候选择开局不洗牌,这样开局就上手了,哈哈。



这就是我们的卡,能发动哦!
发动看看吧!什么都没发生……那是肯定的,因为我们还没为效果写具体的功能。
※有没有人注意到我的卡片里面有虫洞这张卡?


收起回复
举报|3楼2012-04-06 22:41
    ……吧主请把2楼删掉,度娘傲娇了。


    回复
    举报|4楼2012-04-06 22:42
      必须精


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


        收起回复
        举报|6楼2012-04-06 22:56
          开拓者


          回复
          举报|7楼2012-04-06 22:59
            我估计必须先增加一个DIY卡可用的模式了……
            如果DIY卡能加入普通模式玩那就太逆天了点


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


              回复
              举报|9楼2012-04-06 23:53
                原来我多心了?谢谢忠告。


                回复
                举报|10楼2012-04-07 01:20
                  强顶支持,期待全卡全自动的这一天,比K社官方游戏还牛逼!!


                  回复
                  举报|11楼2012-04-07 01:45
                    广告

                    第一章续
                    原本我是在第一章的第二节了里面准备了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.2 常量
                      Effect类这就讲完啦?我还没弄懂呢?不必急,effect是个大学问,不是一两下就能弄懂的。在此之前要补一补另外一个知识——常量。

                      还记得effect属性表里面,属性的中文名下方有些会带有大写字母的单词出现吗?那就是常量,属性的标识值。大部分属性都要用常量来设置。常量都定义在script\constant.lua 文件里面。当我们为自己的effect类Set属性的时候,从function.txt那里就可以看到这个属性应该用什么常量赋值。

                      最常用到的值有effect属性值里的那些,然后就是REASON_了。
                      关于REASON可能大家很陌生,但是如果给它换个说法可能就容易明白了。REASON就是“被xxxx”的意思,是属于card的一个属性,意思是这个卡片“因什么原因”。还记得NDS或者PSP上面的游戏王,如果你打开墓第你会发现卡片上面都有一些图标表示其被送入墓地的原因——有“被战斗破坏”“被无效”“被破坏”的图标标记等等。REASON的值就是这些标记。

                      2.2.1常量的一些操作——这一部分可以先跳过
                      这是附带讲解,常量也有一些操作,但是常量的操作十分的蛋疼……它的操作是二进制位操作。
                      与操作/ +操作
                      在用常量设置属性的时候,有时候需要多个常量组合起来使用,这时候要用“+”操作符。
                      例如,效果类型EFFECT_TYPE_
                      我们有些卡片的类型是“单体效果型+诱发必发型”例如三眼怪,这时候类型的设置就要将两种类型组合起来,那么就用“+”操作符 EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_F
                      ※那两个常量是什么意思可以暂时不用理会,又或者你好奇心旺盛可以直接去查constant.lua。
                      2.2.2位操作
                      这个是最蛋疼的部分……二进制位操作……但是又必须弄明白。如果看请忍痛看完。不看那就别看了。
                      因为YGOCORE里面有一些地方做的实在是很不人性化,没有相关函数,直接用二进制来控制……
                      例如区域,有时候我们需要设置某个区域不可用(不带选择的),但是YGOCORE没有SetDisableField(integerSequence)函数,更是没有区域序号Sequence的常量……所有的操作都要用1010的二进制来表示,这样像虫洞这张卡的最后的那个效果要实现起来就很头疼,实在是很痛苦。虽然最后还是让我给克服了(笑)。
                      关于区域的操作以后会另开讲解。

                      有时候我们需要过滤常量,例如REASON量
                      我们知道有些常量可以互相叠加,REASON量里面REASON_EFFECT+REASON_DISCARD=REASON_EFFECT_DISCARD
                      被效果 + 被丢弃 = 被效果丢弃
                      0x40 + 0x4000 = 0x4040
                      (REASON_EFFECT_DISCARD这个常量没有被定义进constant.lua里,是我自己瞎掰的)
                      因此万一我们要判断卡片的原因reason属性里是否有这个原因,这时候不能直接
                      r== REASON_DISCARD


                      ※r代指卡片的reason属性
                      因为REASON_EFFECT_DISCARD虽然也是DISCARD但是明显它与REASON_DISCARD的数值是不一样的。
                      REASON_EFFECT_DISCARD(0x4040) ≠ REASON_DISCARD(0x4000)
                      但是REASON_EFFECT_DISCARD(0x4040)却包含有REASON_DISCARD(0x4000)

                      有时候我们需要过滤过滤出该卡片的reason是否包含有REASON_DISCARD(0x4000)
                      --最好的例子
                      魔轰神里面被丢卡是指所有的丢卡,包括被代价丢卡,被回合丢卡,被效果丢卡,这时候就要判断参数r(reason)是否包含丢卡成分。
                      我们可以用bit.band函数判断r中是否带有REASON_DISCARD
                      这个函数的作用如下
                      bit.band(A,B) 返回 AB二进制相同的部分 or 0
                      传入A,B两个数值,如果有相同部分就返回他们数值中相同的部分,如果没相同部分返回0。
                      如 bit.band(0x4040,0x4000)=0x4000
                      0x4040 100000001000000 0x4040
                      0x4000 100000000000000 0x4000
                      ————————————————
                      结果 100000000000000 0x4000

                      那么魔轰神判断代码就可以写成下面这样
                      bit.band(r,REASON_DISCARD)==REASON_DISCARD——意思就是 r中是否含有丢卡成分

                      你也可以不用这个办法,直接用组合的方式将所有REASON_DISCARD的组合给写出来
                      如果你这样做的话我会鄙视你的。
                      ※bit是作者写的辅助函数之一,说明在function.txt开头那里,我已经添加了更详细的注释。除了bit.band外还有bit.bor等其他4个位操作。这些bit函数的用法实在是奇葩,主要用于常量和卡片放置区域的运算或者其他什么底层的运算,因为这些量都是二进制数值表示的,要从中得出什么逻辑含义就只能二进制运算。除非是汇编级、整天对着二进制数的程序员,不然就算是那些高级编程语言者也会觉得这些函数很恶心。更别说那些不懂编程的小白了……直接就吐了。
                      ※注意,常量是用16进制赋值的,但是他们对应的二进制值有个规律——那么多位里面只有一个1其余都是0。也正是如此才能利用二进制位运算来抽取数值中的信息。
                      REASON_DESTROY =0x1 1
                      REASON_RELEASE =0x2 10
                      REASON_TEMPORARY =0x4 100
                      REASON_MATERIAL =0x8 1000



                      回复
                      举报|13楼2012-04-07 11:00

                        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
                                  LZ太威武了,我写卡片都是找作者写好的效果相似的改改,根本没有像LZ这样从零开始,我觉得这样写既快速也不容易出错,虽然可能一开始很多不懂什么意思,但是写多了基本上都可以猜出来了。我现在写一张卡片大概要半个小时到一个小时。另外,core自带了调试功能,可以通过-debug参数开启,也可以创建一个快捷方式,然后目标那里加上-debug,这样运行快捷方式测试卡片的时候,如果代码有错误就会把错误信息输出到error.log文件里面,如果是逻辑上的错误那就自己想办法了

                                  最后我也是初学者,lz有兴趣可以加我QQ:350002947



                                  回复
                                  举报|20楼2012-04-07 12:49
                                    求DataEditor的下载地址


                                    回复
                                    举报|21楼2012-04-07 13:38
                                      谢谢路飞的提醒,我本来也不知道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
                                            虽不懂但觉厉


                                            回复
                                            举报|26楼2012-04-07 19:50
                                              怎么卡不器来啊!


                                              回复
                                              举报|27楼2012-04-08 10:51
                                                自己百度一下“应用程序正常化失败”就有解决方法。好像要下载个window补丁


                                                回复
                                                举报|28楼2012-04-08 11:58
                                                  我记得是需要.NET FRAMEWORK (多少版本号来着)才能运行DataEditor这个软件


                                                  回复
                                                  举报|29楼2012-04-08 12:10
                                                    lz好厉害,真心想学


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

                                                      声明:我不是为了自己空间的人气,百度空间我都不知道荒废了多少年没碰了。


                                                      收起回复
                                                      举报|31楼2012-04-08 18:29
                                                        有兴趣加入FH科技部吗?用自己的知识和技术为广大玩家服务,目前FH对战服务器和mycard的游戏服务端就是由FH写出的


                                                        收起回复
                                                        举报|32楼2012-04-10 03:06
                                                          我目前在YGOCORE的作者——圆神力量全开——的群里= =
                                                          MyCard的作者也在里面。
                                                          为YGOCORE做出贡献有很多条路,一条是创造决斗平台给大家,一条是推广宣传YGOCORE,还有一条就是丰富游戏内容。我选择了最后面那条,所以我目前正热衷于将YGOCORE这个引擎像MUGEN那样平民化,吸引更多技术宅进来丰富卡库内容。当然我正在担心会不会因此而导致出现各种原创卡,导致YGOCORE变味。
                                                          再说我自己虽然懂C++和MFC,但是独立开发能力基本为0……也就是干不起来,没足够经验。但是策划设计和提意见倒是一流……(目前,正在学习java中)
                                                          PS:我写这个教程里面也有很多东西没有详细得到原作者的亲自讲解,大部分都是基于自己的理解。——主要是圆神太忙啦!每天除了要维护主程序外还要为大家码新卡。我自己问他东西,他都很少顾得上回答我。没办法,所以大部分都是自己测试代码分析出来的,我也称不上很有技术。





                                                          回复
                                                          举报|33楼2012-04-10 12:54