文明5mod吧 关注:2,318贴子:6,508
  • 10回复贴,共1

从零开始做MOD(五)

只看楼主收藏回复

上一期:http://tieba.baidu.com/p/3242646468
最近貌似有人表示,做了一个白板的MOD,但不知道怎么改成自己想要的东西
那么这次说一下XML相关的东西


IP属地:浙江1楼2014-10-29 20:30回复
    先简单说一下XML的语法。我们以官方的Traits表为例,也就是这个文件:

    打开后大概是这个意思:

    第一行类似文件声明什么的,我们可以不管它;除去第一行外,整个文件的结构大概是
    <Label>
    <Label1>...</Label1>
    <Label2>...</Label2>
    ...
    </Label>
    这种形式,也就是一系列嵌套的节点。比如这里,你可以认为GameData这个节点是Table这个节点的父节点。
    节点名必须要用尖括号围起来,并且理论上必须是成对出现;当然很多情况下为了方便也可以写成<Label/>,它和<Label></Label>是完全等价的。
    节点必须是这种层级嵌套的结构,否则是违反语法规则的,比如
    <Label>
    <Label1>
    </Label>
    </Label1>
    至于节点名写错就更是语法问题了。出现语法错误,SDK的编辑器会提醒你,稍微看看就行了。
    节点可以有子节点(比如GameData和Table的关系),也可以有属性。比如官方文档的第三行,Table这个节点有个属性name,它的值是Traits。


    IP属地:浙江2楼2014-10-29 20:45
    回复
      XML的语法很简单,当然缺点就是废话太多,经常一个节点名比属性名长了几倍有余,还得写两遍,简直要死。
      C5对XML的处理方法大概有两种(也可能是一种,不清楚它内部怎么弄的)。我们还是以刚才的CIV5Traits.xml这个文件为例。在这个文件中,C5将XML文件会转换成SQL语句,然后插入数据库中。
      这类XML文件的根节点一般是GameData。GameData的子节点如果是Table,那么这个节点(及其子节点)会被翻译为创建表的语句,比如第5行到第100行,大概会翻译为:

      大多数情况下,你不用像这样自己建立一个新表,尤其只是改改XML的话。
      如果GameData的子节点是别的,比如叫Traits

      那么它相当于对Traits表进行什么操作。这种节点的子节点经常是Row,也有Update,Replace,InsertOrAbort。比如这里是Row,它也会翻译成相应的SQL语句,大概是:
      INSERT INTO Tratis(ID,Type,Description,ShortDescription,GreatPeopleRateModifier) VALUES(*TRAIT_PHILOSOPHICAL*,*NULL*,*NULL*,100);
      顺便说一句,C5的数据库管理用的是SQLITE,语法和MySQL之类的有些区别。
      很多MOD洋洋洒洒写了一堆XML语句,所做的工作基本都是往数据库里插入数据。
      C5运行时的数据库在这里:

      我们可以用某个数据库产看软件看看,比如Traits表:

      可以看到第一条数据就是刚才那个XML语句转化过来的


      IP属地:浙江3楼2014-10-29 21:04
      回复
        所以如果你只是想改改XML,实现某个系统已有的效果的话,参考C5的本身的代码就行了。
        比如你想改UA,最简单的作法是直接去刚才那个文件看Traits表的定义:

        虽然没有注释,但看名字也能看出来。从第9行开始,这些属性分别表示升级经验修正、伟人加速修正、大科加速修正、大军加速修正、大军光环修正、送伟人给城邦换多少影响力等等。严格说这只看你的英语水平,或者查字典的水平。
        比如你看中一个CultureFromKills属性,然后望文生义猜出这个属性表示杀敌拿文化,那么你自己的UA相关文件就可以这么写

        另一种常见的作法是,比如你想要阿三的UA的效果,但又不清楚具体属性怎么设定,那么你可以先想办法找到阿三UA的定义:

        然后把CityUnhappinessModifier和下面那个抄过去就是了
        当然你如果再聪明点,可以把人口不满和城市不满都改成一个你觉得很合适的数字


        IP属地:浙江4楼2014-10-29 21:14
        回复
          关于XML的说明大概就这样了。具体属性的解释,比如这个帖子就比较全
          http://www.civclub.net/bbs/viewthread.php?tid=100491&extra=page%3D3
          当然因为版本原因,里面的说明比较老了,大概是GK时代的数据。
          另一种XML的功能和之前的不同,比如CityView.xml这个文件

          和之前的XML相比,最大的区别是顶层节点名是Context,表示这是一个UI文件。
          实际上写网页、android窗体布局之类的东西,和这个是差不多的。这里就不多说了。


          IP属地:浙江6楼2014-10-29 21:30
          回复
            之前提到过,XML语句会先转换成SQL语句,然后操作数据库。当其中遇到问题(比如主键冲突)时,整个XML的所有语句均失效。
            另一个问题是XML的执行顺序,似乎不是严格按MODINFO中的加载顺序执行的,所以有时候会造成很奇怪的问题。而直接写SQL,通常没有这种问题。
            最后,无论是写XML还是写SQL,你能修改的东西实际上比较少,完全取决于官方提供了多少接口。比如,你可以通过修改XML设定一个文明的UA是杀敌得文化,但不可能设定成杀敌得科研。从这个角度讲,你能做的,无非是把游戏已有的一些东西排列组合、加强或者减弱罢了。


            IP属地:浙江8楼2014-10-29 21:39
            回复
              另外,为什么经常说要删cache?因为cache文件夹保存了运行时的数据库文件,这样下次启动游戏时就可以直接加载一个现有的数据库而不是一条一条重建。很可能由于某种原因,c5的运行时的数据库数据乱掉了,而下次启动游戏时多多少少会受那些非法数据的影响,其结果是不可预期的,可能你玩着玩着觉得不对劲,可能你一加载mod就死机,甚至根本进不去游戏。


              IP属地:浙江来自手机贴吧9楼2014-10-29 23:40
              收起回复
                大佬(四)被删了


                IP属地:北京来自iPhone客户端13楼2020-02-04 15:13
                收起回复