rimworld吧 关注:220,479贴子:3,724,582

Rimworld 修改默认配方

只看楼主收藏回复

这可能是一系列配方教程的第一篇,也可能是一系列教程的最后一篇,一切都取决于楼主沉迷于BLAZEBLUE的程度。
那么首先说明,这并不是一篇教你如何做一个成品mod的文章,这篇文章的写作目的是告诉大家如何去修改游戏数据来获取自己想要的游戏效果,比如修改配方来做出【只用蔬菜就能制作的“应急食品”】,【可以从草药中提取的“中性胺“】。说来巧合,以上两者刚好涵盖了Rimworld Core文件中最常用的两种“配方定义形式”,接下来,我会尽力对两种形式的配方给出简明扼要的解释,力图大家看完文章,可以自行对Core的【配方】进行修改。


IP属地:广东1楼2019-05-05 14:30回复
    但在此之前,首先要插入一些XML的内容,关注过Rimworld Mod的各位想必一定会注意到绝大多数MOD的主体都是XXX.XML的配置文件,少量的mod会有属于自己的DLL文件。游戏本体Core同样由大量的xml配置文件组成,那么要对他们进行修改,xml的基础知识还是多多少少需要有一些的。


    IP属地:广东2楼2019-05-05 14:30
    回复
      首先,XML的全称是”可扩展标记语言“,eXtensible Markup Language,这种语言他本身并没有任何作用,他什么都不会做,xml被设计来用一种结构化的方式储存和传递信息,与其说这是一种编程语言,不如说它本身是一种行文”规范“,通过这种规范,你可以把要储存的信息用【互相嵌套】的方式组织起来,来更好的让软件或是其他什么东西”使用“信息本身。


      IP属地:广东3楼2019-05-05 14:31
      回复
        <note>
        <to>Tove</to>
        <from>Jani</from>
        <heading>Reminder</heading>
        <body>Don't forget me this weekend!</body>
        </note>
        以这段代码为例,这段代码包含两层结构,共计4个信息。首先是最外面的大结构【note】,内部包含【to】【from】【heading】【body】四个小结构,四个小结构内包含的信息依次为Tove,Jani,Reminder,Don't forget me this weekend!。这段XML代码确立了一种【结构】,即一个note包含四个小结构。从另一个角度看,这段文本告诉了我们,有这样一个note,这个note的标题是Reminder,发给Tove,由Jani发送,主体信息是”Don't forget me this weekend!“。Rimworld也是用类似的方式来对待Core和其他mod的,它快速的检视xml文件的设定,【APB-粒子炮】的【射程】是80,【伤害】是35,【伤害类型】是点燃,【市场价格】是1400。很明显,射程等等都是APB-粒子炮”里面”的属性,不难做出猜想,某种东西的【配方】也是这个【东西】的属性之一。


        IP属地:广东4楼2019-05-05 14:31
        回复
          关于第一种配方【Costlist】&【Recipemaker】
          让我们来看【RimWorld\Mods\Core\Defs\ThingDefs_Items】文件夹中,Item_Resouce_Manufactured.xml中是如何定义【医药】(部分魔改)的合成配方的。
          <ThingDef ParentName="MedicineBase">
          <defName>MedicineIndustrial</defName>
          <label>medicine</label>
          <statBases>
          <WorkToMake>700</WorkToMake>
          </statBases>
          <costList>
          <MedicineHerbal>1</MedicineHerbal>
          <Neutroamine>1</Neutroamine>
          </costList>
          <recipeMaker>
          <workSpeedStat>DrugSynthesisSpeed</workSpeedStat>
          <workSkill>Cooking</workSkill>
          <recipeUsers>
          <li>DrugLab</li>
          </recipeUsers>
          <researchPrerequisite>MedicineProduction</researchPrerequisite>
          <skillRequirements>
          <Crafting>4</Crafting>
          </skillRequirements>
          </recipeMaker>
          </ThingDef>


          IP属地:广东5楼2019-05-05 14:32
          回复
            上面的代码删去了和【配方】无关的部分,完整代码的阅读请参考Core源文件。考虑到这篇这篇文章不想像教科书一样逐行讲解代码,而是想给大家介绍Core中定义配方的两种结构,所以我们从【costlist】这一行开始。
            costlist正如其字面意思,指的是生产一份产品所需要的原料,在这里我们生产【医药】的原料(已经被修改成了)一份【MedicineHerbal】(草药)和一份【Neutroamine】(中性胺),如果我们在【costlist】中间加上下面一行:
            <Sliver>5</Slivers>
            生产医药就会需要额外5块白银。
            在【costlist】上方我们可以找到属于【statBases】的【worktomake】,这一元素规定的是制造这一物品所需要的工作量,但并不是游戏中的术语【工作量】,具体的换算方式我没有仔细观察,印象里700约等于25【工作量】。这里的如果没有进行定义的话,工作量就默认成为游戏中的【工作量】1.
            在【recipemaker】里,Rimworld更加详细的规范了制作这一物品的流程。
            【workspeedstate】规定了物品制作的速度,【医药】的制作速度为DrugSynthesisSpeed,类似的不同的制作有不同的速度,这些速度都可以在游戏的源代码找到定义。
            【workskill】指的是影响生产的技能类型,比如这里,影响医药生产的是【烹饪】技能,相关技能越高,生产过程得到的加成也就越多。
            【recipeusers】指的是可以进行这一生产的“装置”,对于【医药】而言,是【药物实验台】。注意,代码中的【li】是rimworld中常见的【分割标签】,如果要让【屠宰台】也可以生产医药,就必须要添加:
            <li>TableButcher</li>
            才行。
            至于【researchPrerequisite】指的是可以进行这一生产的技术要求,药物实验台一开始就可以生产大麻烟,而必须在完成【医药生产】科技研究之后才可以正式生产医药,就是利用这一属性加以限制,如果不进行设定,就默认为对科技没有要求,随时可以生产。
            【skillRequirements】顾名思义,指的是这一生产过程所需要的【技能】限制,同样用上面的例子,医药的技能要求是【烹饪】4点以上,否则没法完成这份清单。


            IP属地:广东6楼2019-05-05 14:33
            回复


              IP属地:北京来自iPhone客户端7楼2019-05-05 16:10
              回复
                学习下,正在想办法自己添加动物装备。泰懒的动物装备里没有大象的,只有象轿,没什么卵用,又不能骑。


                IP属地:四川8楼2019-05-05 16:15
                收起回复
                  遇到这种帖子必须好、顶、赞。


                  IP属地:北京9楼2019-05-05 17:13
                  回复
                    在这个吧里发布关于直接Core的mod容易被干掉~所以我选择换个说法,把代码复制出来放到一个空的mod里,这样就不算直接修改Core了(据说不准发布直接修改Core是因为当初有不少人改出了bug结果说没有mod搞得一群人以为是官方的毛病


                    IP属地:福建11楼2019-05-06 20:04
                    收起回复
                      有点想打保龄球。。下午写一下第二种配方


                      IP属地:广东12楼2019-05-07 10:06
                      回复
                        第二种配方 RecipeDefs
                        那么对于第二种配方,让我们把目光移向【E:\RIMworld代码和CORE\Mods\Core\Defs\RecipeDefs】文件夹中,从文件夹的名字可以看出来,这个文件夹就是用来放各种配方的。上文提到过在ThingDefs文件中,使用costlist和recipemaker制作配方的方法,然而绝大多数的配方都是在RecipeDefs文件夹中定义的。这种方式定义的配方更强大,灵活性更强,也更符合C#面向对象的编程思想。
                        那么,让我们来看看制作【奢侈的食物】的配方。


                        IP属地:广东13楼2019-05-07 14:08
                        回复
                          在具体讨论代码内容之前,请让我们看看第一行
                          <RecipeDef ParentName="CookMealBase">
                          这一段代码最外面的结构体是RecipeDef,是Rimworld在源代码中定义过的,特指【配方】的结构。那么,ParentName=“CookMealBase”是什么意思呢?
                          这里我们必须提及“继承”这一概念,所谓继承,就是在一个结构体中,保留某一个结构体的内部结构。让我们还用【APB-粒子炮】的例子,加入我们想做一个【超银河APB-粒子炮】,这把武器可以同时发射50发炮弹,【射速】是原来的两倍,【冷却】为0,我们当然可以直接复制【APB-粒子炮】的代码,然后修改其中我们想要改的部分。但是我们以可以创建一个新的【超银河粒子炮】,将原版粒子炮的内部结构【继承过来】,在【继承】的基础上修改想要修改的部分。
                          但这并不是一个好主意,假设我们要修改原版粒子炮的某一个参数,那么这个参数也会因为【继承】的关系,在【超银河粒子炮】里同样发生变化,如果这就是你想要的那无话可说,可反之这就不是一个好的策略。所以绝大多数情况下,设定为【被继承者】的,都是每一个物件通用的,很少被更改的模块,至于【射程】这类需要经常变化的参数,则不应该被放入【被继承者】当中。
                          在第一行代码,结构RecipeDef的ParentName的作用,就是告诉游戏本体,这个结构继承了一个Name是“CookMealBase”的结构。
                          Rimworld的游戏本体对【继承】有良好的支持,各位可以通过在一个结构体上添加Name=”名字“或ParentName=“名字”来安排继承关系。


                          IP属地:广东15楼2019-05-07 14:09
                          回复
                            刚刚试了一下,补充,如果新的结构体里有和【被继承结构】中一样的属性,则以新结构的属性优先。


                            IP属地:广东16楼2019-05-07 14:11
                            回复
                              代码被删了。。
                              <RecipeDef ParentName="CookMealBase">
                              <defName>CookMealLavish</defName>
                              <label>cook lavish meal</label>
                              <description>Cook a very complex meal from a combination of meat and plant ingredients. Much of the ingredients are wasted.</description>
                              <jobString>Cooking lavish meal.</jobString>
                              <workSpeedStat>CookSpeed</workSpeedStat>
                              <effectWorking>Cook</effectWorking>
                              <soundWorking>Recipe_CookMeal</soundWorking>
                              <allowMixingIngredients>true</allowMixingIngredients>
                              <ingredientValueGetterClass>IngredientValueGetter_Nutrition</ingredientValueGetterClass>
                              <ingredients>
                              <li>
                              <filter>
                              <categories>
                              <li>MeatRaw</li>
                              <li>AnimalProductRaw</li>
                              </categories>
                              </filter>
                              <count>0.5</count>
                              </li>
                              <li>
                              <filter>
                              <categories>
                              <li>PlantFoodRaw</li>
                              </categories>
                              </filter>
                              <count>0.5</count>
                              </li>
                              </ingredients>
                              <products>
                              <MealLavish>1</MealLavish>
                              </products>
                              <skillRequirements>
                              <Cooking>8</Cooking>
                              </skillRequirements>
                              </RecipeDef>


                              IP属地:广东17楼2019-05-07 14:13
                              回复