rimworld吧 关注:236,792贴子:4,186,746

记一次 mod 开发

只看楼主收藏回复

最近玩了很长时间的 rimworld 及其 mod. 本人也起了编写一些 mod 方便游戏过程的想法.
由于中文互联网上 rimworld mod 制作的内容较少,我把我制作 mod 的过程同步记录下来, 方便更多的人参与进来.
同时这也是我第一次制作 rimworld 的 mod,更新可能比较慢,还请见谅.


IP属地:山东1楼2024-01-17 15:14回复
    IP属地:山东2楼2024-01-17 15:14
    收起回复
      mod 编写
      这是我制作的第一个 mod,制作它的原因是囚犯太多,割肾时间比较长,有时就会遇到囚犯突然精神狂暴,然后就被打死了.为了赚点银子容易吗! 我准备让 mod 建造设施使囚犯,在设施影响范围内一直昏迷.


      IP属地:山东3楼2024-01-17 15:15
      回复
        对于熟悉 git 的同学,可以考虑使用使用这个项目 https://github.com/n-fisher/cookiecutter-rimworld-mod-development.git 来生成一个新的 mod 工程(如果我更新完这篇文章,考虑自己写一个模版工程,敬请期待).
        在安装 python3 后,自动安装了 pip 程序.我们打开命令提示符或者终端,运行下面的命令.
        ```
        pip install cookiecutter
        ```
        安装项目生成工具.在使用下面的命令,生成新工程.
        ```
        cookiecutter gh:n-fisher/cookiecutter-rimworld-mod-development
        ```
        如果出现了这种错误 `command not found: cookiecutter`,尝试下面的命令:
        ```
        python -m cookiecutter https://github.com/n-fisher/cookiecutter-rimworld-mod-development.git
        ```
        运行后根据提示内容写入模块名,作者,描述,是否创建空的定义文件(默认 no).


        IP属地:山东4楼2024-01-17 15:17
        回复
          对于不熟悉的同学可以手动创建项目.
          目前用到的项目目录如下:
          ```
          项目名
          About
          Defs
          Textures
          ```


          IP属地:山东5楼2024-01-17 15:18
          回复
            About 目录
            About 目录一共两个文件,About.xml 和 preview.png 两个文件.
            About.xml 描述了项目的唯一id,项目名,作者,依赖 mod,加载顺序等等.
            preview.png 文件就是在游戏 mod 列表中看到的图片.
            我们在 About.xml 文件写入下面的内容
            ```
            <?xml version="1.0" encoding="utf-8"?>
            <ModMetaData>
            <packageId>abliger.prisonermindsuppressor</packageId> <!--项目id-->
            <name>囚犯心灵抑制器 Prisoner Mind Suppressor</name> <!--项目名-->
            <author>abliger</author> <!--作者-->
            <description>囚犯心灵抑制器,强制昏迷</description> <!--描述-->
            <supportedVersions> <!--支持版本-->
            <li>1.4</li>
            </supportedVersions>
            </ModMetaData>
            ```
            为了方便从网络上随便找了一张图,来进行测试


            IP属地:山东6楼2024-01-17 15:19
            回复
              Defs
              Defs 中的文件定义了从物品、植物和动物到派别类型和意识形态选项的一切.一般来说,任何为 RimWorld 添加额外内容的模组都可能会添加一个或多个 Defs.
              - 要注意的是,Defs 中的子文件夹甚至文件名并不重要,所有 xml 文件都从每个单独的 mod 读取到内存中.我们可以使用文件来使 Defs 中的文件更有可读性.(此处我们可以学习 rimworld 的分类方法,在游戏本体 Date 文件夹下)
              我们在 Defs 文件夹下,建立 thingDef.xml 文件.写入下面的内容
              ```
              <?xml version="1.0" encoding="UTF-8"?>
              <Defs>
              <ThingDef ParentName="BuildingBase"> <!-- 建筑-->
              <defName>test</defName> <!-- 建筑名-->
              <label>test</label> <!-- 物品的游戏名称-->
              <description>test test est est estt eseddd</description> <!-- 建筑描述-->
              <thingClass>Building</thingClass>
              <soundInteract>Standard_Pickup</soundInteract> <!-- 声音交互 此为标准拾取-->
              <!-- 事件类型 由于太多 可以在 https://ludeon.com/forums/index.php?topic=21440.0 查找-->
              <graphicData><!-- 图形数据-->
              <texPath>Things/Building/test</texPath> <!-- 建筑贴图位置,在 Textures 目录下寻找-->
              <graphicClass>Graphic_Multi</graphicClass><!-- 图形类别 此处表示多个-->
              <shaderType>CutoutComplex</shaderType><!-- 阴影类型-->
              <drawSize>(3,3)</drawSize><!-- 图形大小-->
              <shadowData><!-- 阴影数据-->
              <volume>(1.95,0.5,1.3)</volume>
              </shadowData>
              <damageData>
              <rect>(0.3,0.1,2.4,1.8)</rect>
              </damageData>
              </graphicData>
              <statBases> <!-- 基本信息-->
              <MarketValue>4500</MarketValue><!-- 市场价值-->
              <Mass>1.6</Mass>
              <DeteriorationRate>0</DeteriorationRate> <!-- 劣化率-->
              <Flammability>0</Flammability><!-- 可燃性-->
              <WorkToBuild>40000</WorkToBuild> <!-- 工作量-->
              <MaxHitPoints>100</MaxHitPoints> <!-- 耐久-->
              <Cleanliness>0</Cleanliness> <!-- 清洁度-->
              <Beauty>2</Beauty> <!-- 美观度-->
              </statBases>
              <size>(2,2)</size><!-- 实际大小-->
              <designationCategory>Misc</designationCategory> <!-- 建筑现实位置,此处为杂项-->
              <fillPercent>1</fillPercent><!-- 填充百分比-->
              <passability>Impassable</passability>
              <!-- 能否穿过
              Impassable 无法通行
              PassThroughOnly 仅通行
              Standable 可站立
              -->
              <hasInteractionCell>false</hasInteractionCell><!-- 是否具有交互单元格-->
              <surfaceType>Item</surfaceType><!-- 建筑上支持放什么物品
              Eat 或 Item -->
              <canOverlapZones>True</canOverlapZones><!-- 能否重叠区域-->
              <terrainAffordanceNeeded>Medium</terrainAffordanceNeeded>
              <!-- 土地需求
              Bridgeable 可在桥上
              Diggable 可挖掘的
              Heavy 重型土地
              Light 轻型
              Medium 中型
              ShallowWater 浅水区-->
              <constructionSkillPrerequisite>13</constructionSkillPrerequisite><!-- 建造需要的技能等级-->
              </ThingDef>
              </Defs>
              ```
              再到 Textures 目录中,创建 Things/Building/ 目录.并在 Building 目录下复制黏贴上面的 previrew.png ,改名为 test.png.
              这样我们得到了一个类似建筑规划-文化选项-仪式举办点类似的东西.下一步我们给它添加建筑材料,需要的科技和一些其他的东西.


              IP属地:山东7楼2024-01-17 15:20
              回复
                添加建筑材料
                ```
                <costList> <!-- 建造花费-->
                <Cloth>100</Cloth> <!-- 布料-->
                <ComponentIndustrial>10</ComponentIndustrial> <!-- 零部件 -->
                <ComponentSpacer>5</ComponentSpacer><!-- 高级零部件-->
                <Gold>100</Gold> <!-- 黄金-->
                <Steel>300</Steel> <!-- 钢铁-->
                <Silver>50</Silver> <!-- 白银-->
                <Plasteel>10</Plasteel><!-- 玻璃钢-->
                </costList>```
                在 Defs 的 ThingDef 标签里添加上述内容.


                IP属地:山东8楼2024-01-17 15:21
                回复
                  添加所需科技
                  在 Defs 文件夹下创建 techDef.xml 文件,写入下面的内容:
                  ```
                  <?xml version="1.0" encoding="UTF-8"?>
                  <Defs>
                  <ResearchProjectDef>
                  <defName>abliger_tech_prisonermindsuppressor</defName>
                  <label>prisonermindsuppressor</label>
                  <description>prisonermindsuppressor</description> <!-- 科技描述-->
                  <baseCost>500</baseCost> <!-- 基础研究花费-->
                  <techLevel>Industrial</techLevel> <!-- 科技等级-->
                  <prerequisites> <!-- 需要科技-->
                  <li>Electricity</li>
                  </prerequisites>
                  <requiredResearchBuilding>HiTechResearchBench</requiredResearchBuilding><!-- 需要高级研究台-->
                  <requiredResearchFacilities>
                  <li>MultiAnalyzer</li>
                  </requiredResearchFacilities><!-- 需要多元分析仪-->
                  <researchViewX>9.00</researchViewX>
                  <researchViewY>4.80</researchViewY><!-- 研究标签位置-->
                  <discoveredLetterTitle>题目</discoveredLetterTitle>
                  <discoveredLetterText>描述</discoveredLetterText><!-- 研究完成后弹出的信息-->
                  </ResearchProjectDef>
                  </Defs>```
                  在 thingDef.xml 文件中的 ThingDef 标签中添加下面内容
                  ```
                  <researchPrerequisites> <!-- 那项科技可以解锁该建筑-->
                  <li>abliger_tech_prisonermindsuppressor</li>
                  </researchPrerequisites>
                  ```


                  IP属地:山东9楼2024-01-17 15:21
                  回复
                    接下来我们让这个建筑通电,雨天短路,破坏后产生爆炸,可以卸载,售卖等.
                    ```
                    <comps>
                    <li Class="CompProperties_Power">
                    <compClass>CompPowerTrader</compClass>
                    <basePowerConsumption>3600</basePowerConsumption><!-- 耗电功率-->
                    <shortCircuitInRain>True</shortCircuitInRain><!-- 雨中是否短路-->
                    </li>
                    <li Class="CompProperties_Explosive">
                    <explosiveDamageType>EMP</explosiveDamageType><!-- 爆炸伤害类型-->
                    <wickTicks>10</wickTicks> <!-- 爆炸持续时长-->
                    <explosiveRadius>9.9</explosiveRadius><!-- 爆炸范围-->
                    <!--<startWickHitPointsPercent>0.7</startWickHitPointsPercent>--><!-- 其爆炸将开始的健康百分比是多少-->
                    </li>
                    <li Class="CompProperties_HeatPusher">
                    <compClass>CompHeatPusherPowered</compClass>
                    <heatPerSecond>3</heatPerSecond><!-- 每秒产生热量-->
                    <heatPushMaxTemperature>44</heatPushMaxTemperature><!-- 最大温度-->
                    </li>
                    <li Class="CompProperties_Flickable"/>
                    <li Class="CompProperties_Breakdownable"/>
                    </comps>
                    <thingCategories>
                    <li>BuildingsMisc</li>
                    </thingCategories><!-- 事物类别-->
                    <altitudeLayer>Building</altitudeLayer><!-- 所处图层
                    Building
                    BuildingOnTop
                    DoorMoveable
                    Filth
                    Floor
                    FloorEmplacement
                    Gas
                    Item
                    LowPlant
                    MetaOverlays
                    MoteLow
                    MoteOverhead
                    Pawn
                    PawnState
                    Projectile
                    Skyfaller -->
                    <minifiedDef>MinifiedThing</minifiedDef> <!-- 可以卸载-->
                    <tradeability>Sellable</tradeability><!-- 可交易性:可售卖-->
                    <rotatable>True</rotatable><!-- 是否可旋转-->
                    <specialDisplayRadius>9.9</specialDisplayRadius> <!-- 特殊半径-->
                    <pathCost>14</pathCost> <!-- 路径花费-->
                    ```


                    IP属地:山东10楼2024-01-17 15:24
                    回复
                      目前的目录结构


                      IP属地:山东11楼2024-01-17 15:25
                      回复
                        目前 ThingDef.xml 文件完成内容
                        <?xml version="1.0" encoding="UTF-8"?>
                        <Defs>
                        <ThingDef ParentName="BuildingBase"> <!-- 建筑-->
                        <defName>abliger_test</defName> <!-- 游戏事物定位id,唯一-->
                        <label>test</label> <!-- 物品的游戏名称-->
                        <description>test test est est estt eseddd</description> <!-- 建筑描述-->
                        <thingClass>Building_Art</thingClass>
                        <soundInteract>Standard_Pickup</soundInteract> <!-- 声音交互 此为标准拾取-->
                        <!-- 事件类型 由于太多 可以在 https://ludeon.com/forums/index.php?topic=21440.0 查找-->
                        <graphicData><!-- 图形数据-->
                        <texPath>Things/Building/test</texPath> <!-- 建筑贴图位置,在 Textures 目录下寻找-->
                        <graphicClass>Graphic_Multi</graphicClass><!-- 图形类别 此处表示多个-->
                        <shaderType>CutoutComplex</shaderType><!-- 阴影类型-->
                        <drawSize>(3,3)</drawSize><!-- 图形大小-->
                        <shadowData><!-- 阴影数据-->
                        <volume>(1.95,0.5,1.3)</volume>
                        </shadowData>
                        <damageData>
                        <rect>(0.3,0.1,2.4,1.8)</rect>
                        </damageData>
                        </graphicData>
                        <statBases> <!-- 基本信息-->
                        <MarketValue>4500</MarketValue><!-- 市场价值-->
                        <Mass>1.6</Mass>
                        <DeteriorationRate>0</DeteriorationRate> <!-- 劣化率-->
                        <Flammability>0</Flammability><!-- 可燃性-->
                        <WorkToBuild>40000</WorkToBuild> <!-- 工作量-->
                        <MaxHitPoints>100</MaxHitPoints> <!-- 耐久-->
                        <Cleanliness>0</Cleanliness> <!-- 清洁度-->
                        <Beauty>2</Beauty> <!-- 美观度-->
                        </statBases>
                        <size>(2,2)</size><!-- 实际大小-->
                        <designationCategory>Misc</designationCategory> <!-- 建筑位于菜单的位置,此处为杂项-->
                        <fillPercent>1</fillPercent><!-- 填充百分比-->
                        <passability>PassThroughOnly</passability>
                        <!-- 能否穿过
                        Impassable 无法通行
                        PassThroughOnly 仅通行
                        Standable 可站立
                        -->
                        <hasInteractionCell>false</hasInteractionCell><!-- 是否具有交互单元格-->
                        <surfaceType>Item</surfaceType><!-- 建筑上支持放什么物品
                        Eat 或 Item -->
                        <canOverlapZones>false</canOverlapZones><!-- 能否重叠区域-->
                        <terrainAffordanceNeeded>Medium</terrainAffordanceNeeded>
                        <!-- 土地需求
                        Bridgeable 可在桥上
                        Diggable 可挖掘的
                        Heavy 重型土地
                        Light 轻型
                        Medium 中型
                        ShallowWater 浅水区-->
                        <constructionSkillPrerequisite>13</constructionSkillPrerequisite><!-- 建造需要的技能等级-->
                        <costList> <!-- 建造花费-->
                        <Cloth>100</Cloth> <!-- 布料-->
                        <ComponentIndustrial>10</ComponentIndustrial> <!-- 零部件 -->
                        <ComponentSpacer>5</ComponentSpacer><!-- 高级零部件-->
                        <Gold>100</Gold> <!-- 黄金-->
                        <Steel>300</Steel> <!-- 钢铁-->
                        <Silver>50</Silver> <!-- 白银-->
                        <Plasteel>10</Plasteel><!-- 玻璃钢-->
                        </costList>
                        <researchPrerequisites> <!-- 那项科技可以解锁该建筑-->
                        <li>abliger_tech_prisonermindsuppressor</li>
                        </researchPrerequisites>
                        <comps>
                        <li Class="CompProperties_Power">
                        <compClass>CompPowerTrader</compClass>
                        <basePowerConsumption>3600</basePowerConsumption><!-- 耗电功率-->
                        <shortCircuitInRain>True</shortCircuitInRain><!-- 雨中是否短路-->
                        </li>
                        <li Class="CompProperties_Explosive">
                        <explosiveDamageType>EMP</explosiveDamageType><!-- 爆炸伤害类型-->
                        <wickTicks>10</wickTicks> <!-- 爆炸持续时长-->
                        <explosiveRadius>9.9</explosiveRadius><!-- 爆炸范围-->
                        <!--<startWickHitPointsPercent>0.7</startWickHitPointsPercent>--><!-- 其爆炸将开始的健康百分比是多少-->
                        </li>
                        <li Class="CompProperties_HeatPusher">
                        <compClass>CompHeatPusherPowered</compClass>
                        <heatPerSecond>3</heatPerSecond><!-- 每秒产生热量-->
                        <heatPushMaxTemperature>44</heatPushMaxTemperature><!-- 最大温度-->
                        </li>
                        <li Class="CompProperties_Flickable"/>
                        <li Class="CompProperties_Breakdownable"/>
                        </comps>
                        <thingCategories>
                        <li>BuildingsMisc</li>
                        </thingCategories><!-- 事物类别
                        AnimalProductRaw
                        Apparel
                        Artifacts
                        BodyPartsArtificial
                        BodyPartsNatural
                        BuildingsArt
                        BuildingsFurniture
                        BuildingsJoy
                        BuildingsMisc
                        BuildingsPower
                        BuildingsProduction
                        BuildingsSecurity
                        BuildingsSpecial
                        BuildingsTemperature
                        Chunks
                        Drugs
                        EggsFertilized
                        EggsUnfertilized
                        FoodMeals
                        Foods
                        Grenades
                        Headgear
                        Items
                        Leathers
                        Manufactured
                        Medicine
                        MortarShells
                        PlantFoodRaw
                        PlantMatter
                        ResourcesRaw
                        StoneBlocks
                        StoneChunks
                        Textiles
                        Unfinished
                        WeaponsMelee
                        WeaponsRanged
                        -->
                        <altitudeLayer>Building</altitudeLayer><!-- 所处图层
                        Building
                        BuildingOnTop
                        DoorMoveable
                        Filth
                        Floor
                        FloorEmplacement
                        Gas
                        Item
                        LowPlant
                        MetaOverlays
                        MoteLow
                        MoteOverhead
                        Pawn
                        PawnState
                        Projectile
                        Skyfaller -->
                        <minifiedDef>MinifiedThing</minifiedDef> <!-- 可以卸载-->
                        <tradeability>Sellable</tradeability><!-- 可交易性:可售卖-->
                        <rotatable>True</rotatable><!-- 是否可旋转-->
                        <specialDisplayRadius>9.9</specialDisplayRadius> <!-- 特殊半径-->
                        <pathCost>14</pathCost> <!-- 路径花费-->
                        </ThingDef>
                        </Defs>


                        IP属地:山东13楼2024-01-17 15:27
                        回复
                          目前就写到这里,下面是让在半径范围内的囚犯昏迷,这应该需要 c# 编程,由于我从昨天开始接触 rimworld mod 制作,没使用过 c#,所以先写到这里,明后天再更新


                          IP属地:山东14楼2024-01-17 15:32
                          收起回复
                            虽然看不懂,但支持国人mod创造者,期待你的mod


                            IP属地:广东来自Android客户端15楼2024-01-17 15:52
                            回复


                              IP属地:上海17楼2024-01-17 16:06
                              回复