跳轉至

下载模板mod

你可以从https://wwk.lanzoub.com/iMEF50u7abdc下载这个模板mod


管理文件

在方便的地方新建一个文件夹,然后把模板Mod解压缩到这里

提示

建议把此后制作mod相关的所有资料和素材也整理到这个文件夹中,可以避免很多因为文件乱丢导致的麻烦

图片

把模板mod的名字改成你自己的mod的名字,然后打开文件夹 里面应该是这样的

图片

(如果你看不到文件的扩展名(比如.sln),则需要在上方的“查看”选项卡中勾选“显示文件扩展名”)

你暂时不需要关注其他的东西,要修改的内容在mod文件夹中

modinfo.json

这个文件定义的是mod的元数据,基本上就是在remix菜单里面显示的内容,你可以直接用记事本打开它(或者说 其实你可以用VS...

现在它的内容是这样的:

{
    "id": "author.slugtemplate",
    "name": "Slugcat Template",
    "version": "0.1.0",
    "authors": "Author",
    "description": "A template for making SlugBase mods.",
    "requirements": [ "slime-cubed.slugbase" ],
    "requirements_names": [ "SlugBase" ]
}

id:  该mod的唯一的字符串标识,确定之后就最好不要再改这个了(会发生非常糟糕的事情.........)建议使用不带空格的小写字符串...另外 其他mod也会使用这个id来引用你的mod

name:mod的标题,会显示在remix菜单里面

version: mod的版本号

authors:mod作者

description:mod的描述内容

requirements:列出这个mod需求的其他mod的id,如果有多个前置mod则应当使用逗号分隔

requirements_names: 和上面差不多,但列出的是前置mod的名字

除此之外还有一条可选的

checksum_override_version:一个bool参数,如果为true则仅当version的值更新时才认为mod需要更新(false或者省略这一条的话,只要mod中任何文件发生变动均会认为需要更新)

提示

在authors和description中插入可以进行换行

thumbnail.png

mod的缩略图,会显示在remix菜单里,在这里建议使用640*360的分辨率(或者其他同等长宽比的图像,但是不能大于1mb)

illustrations文件夹/scenes文件夹

角色的竞技场头像和自定义场景

slugbase文件夹

里面包含角色属性的配置文件(在这个模板中为the_prototype.json,稍后会改掉这个)

另外还有一个描述自定义场景的文件夹,之后将在添加场景的部分加以讲解

处理模板mod

如果直接试着把mod这个文件夹拖进RainWorld_Data\StreamingAssets\mods会出问题 因为你缺少了一个dll文件(用于提供角色配置文件里面的几个自定义属性)

如果希望它能够正常工作,你首先需要完成.....

测试工作

双击SlugTemplate.sln,用VS打开它,你就会见到这个界面.......

图片

(.sln文件是VS的解决方案文件,另外也可以用src文件夹中的.csproj文件打开)

在右上角的“解决方案资源管理器”中选中SlugTemplate,然后在屏幕顶端的工具栏找到“生成(B)”选项,然后在里面找到“生成SlugTemplate”

图片

(按下去吧 不会爆炸的)

如果一切正常,窗口底部应该会提示“生成成功”,mod文件夹里也会多出一个plugins文件夹

提示

如果不正常,那么你大概要回头看看是不是.NET 7 SDK没装好了....

把整个“mod”文件夹复制到SteamLibrary\steamapps\common\Rain World\RainWorld_Data\StreamingAssets\mods里面(你应该会发现雨世界扩展中的几个自带mod也在这里)

打开游戏 如果你能够在Remix菜单里面看到这个 说明编译功能没有问题 可以开始编辑mod了

图片

(芜湖)

重命名

为了避免重名现象发生,你首先需要重命名一些东西....

1.重命名解决方案与项目

右键工程,并且重命名为任何你喜欢的名称(此处以我自己的TheTraveler为例)

图片 图片

2.Plugin.cs

更改命名空间(namespace)、mod名称、id和三个自定义技能的前缀

这些内容没有直接关联 但是最好足够相关 以便你可以分清楚...

id建议写成类似“作者.id”的格式 这样的话就算遇到撞id的情况也可以以作者名区分

自定义技能的前缀写在斜杠前面,对于在这里的三个(以及之后你做的其他自定义技能)都应该保持相同

提示

在这之后最好不要修改命名空间和id....那将会是一场灾难

图片

图片

3.modinfo.json

使id、name和version与你写在Plugin.cs里面的内容相匹配

{
    "id": "seron.thetraveler",
    "name": "The Traveler",
    "version": "0.1.0",
    "authors": "Seron",
    "description": "A unique slugcat with special leaping skills<LINE>Work in progress",
    "requirements": [ "slime-cubed.slugbase" ],
    "requirements_names": [ "SlugBase" ]
}

4.the_prototype.json

也就是之前提到过的角色配置文件 先给它改个名(名字并不重要,the_traveler.json或者travelerslugcat.json啥的都没问题,但是请务必确保自己能够分清)

图片

修改蛞蝓猫角色的id和name(注意并不等同于之前的mod的id与名称)

找到三个自定义技能,把前缀更改为跟Plugin.cs中匹配,另外你还需要修改两个scene的名称

如果你愿意的话 还可以重新写一下描述(description)里面的东西....

图片

5.场景配置文件

修改两个场景的json文件(包括文件名和里面的内容)

图片

飞升后的那个也是一样的格式,这里的id是场景的id,不要与mod的id或者蛞蝓猫角色的id相混淆,以及这里修改了scene_folder的内容后记得去修改相应的文件夹的名称

{
    "id": "Slugcat_Thetraveler",
    "scene_folder": "scenes/slugcat - thetraveler",
    "images": [
        { "name": "Background", "pos": [492, 297], "depth": 3.7, "shader": "Basic" },
        { "name": "Slugcat",    "pos": [605, 427], "depth": 2.8, "shader": "Basic" },
        { "name": "Grass 3",    "pos": [602, 264], "depth": 2.2, "shader": "Basic" },
        { "name": "Grass 2",    "pos": [446, 283], "depth": 2.0, "shader": "Basic" },
        { "name": "Grass 1",    "pos": [515, 265], "depth": 1.8, "shader": "Basic" }
    ],
    "idle_depths": [ 2.8 ],
    "glow_pos": [688, 484],
    "mark_pos": [689, 583],
    "select_menu_pos": [0, 0],
    "slugcat_depth": 2.8
}
图片

提示

其实如果你想要试着做自定义场景的话 这里就可以开始了,试着修改场景文件夹里的内容和场景的json文件里面的一些参数 看看会发生什么....(另外记得备份)

完成这些处理之后再次点击生成,然后把mod文件夹复制到游戏的mod文件路径中(记得先删掉之前那个),如果一切正常的话应该会是这样的:

图片

(当然这些文字应该不同 除非你真的全都照抄示例了...)

那么现在使用这个角色开始游戏 它应该会具有独特的色彩,可以一蹦三尺高,非常容易招惹蜥蜴,而且死的时候会发生爆炸(?

当然 这可能并不是你所期待的效果 接下来的部分将会帮助你修改角色的基本属性和能力

魔改蛞蝓猫

角色的配置文件位于mod/slugbase文件夹中,此前你应该已经修改过它的名称

有关角色属性的设置写在"features"后的括号中

图片

(包括slugbase内置属性和自己编写的自定义属性)

不论是内置属性还是自定义属性均需要按照特定的格式添加,基本格式为

"属性的名称": 属性的参数,
属性的名称可以是内置属性或者写在Plugins.cs中的自定义属性,为一个字符串 属性的参数由具体属性决定,可能为一个或多个不同类型的数据,包括:

-string/字符串:由数字、字母和下划线组成的一串字符,需要包含在引号中

-boolean/布尔值:true或者false

-integer/整数:32 位带符号整数,范围为 -2,147,483,648 到 2,147,483,647

-float/浮点数:含有小数部分的数 暂时无须考虑其范围

-color/颜色:十六进制表示的颜色 实际为一个字符串

-类型[数组内容]:指定类型的 包含在被方括号包围的“数组”中的多个数据,也可以是指定类型的单个数据(指定的类型一般为int/float/string)

你可以参阅内置属性列表来了解每个属性的具体参数


内置属性列表

  • 属性名称后标注的是这个属性使用的参数类型,代码块中为一个示例
  • 如果一个属性没有被指定 默认使用白猫的属性 未指定的自定义能力将不会触发
  • 部分数据类型标注为尖括号,其接受的字符串从一个特定的集合中选取,对于是否开启MSC,集合的内容也会有所不同,具体可参阅文末的枚举内容列表

"color"(color)

"color": "6B12FF"
角色主体和UI元素的默认颜色

"auto_grab_batflies"(boolean)

"auto_grab_batflies": false
在接触时是否会自动抓住蝠蝇

"weight"(float[1..2])

"weight": [0.9, 0.7]
"weight": 1.2
玩家在正常和饥饿状态下的身体质量 如果未指定饥饿状态下的数值,则会自动计算一个合适的数值

"tunnel_speed"(float[1..2])

"tunnel_speed": [0.9, 0.7]
"tunnel_speed": 1.2
玩家在正常和饥饿状态下的管道爬行速度乘数 如果未指定饥饿状态下的数值,则会自动计算一个合适的数值

"climb_speed"(float[1..2])

"climb_speed": [0.9, 0.7]
"climb_speed": 1.2
玩家在正常和饥饿状态下的爬杆速度乘数 如果未指定饥饿状态下的数值,则会自动计算一个合适的数值

"walk_speed"(float[1..2])

"walk_speed": [0.9, 0.7]
"walk_speed": 1.2
玩家在正常和饥饿状态下的行走速度乘数 如果未指定饥饿状态下的数值,则会自动计算一个合适的数值

"crouch_stealth"(float[1..2])

"crouch_stealth": [0.9, 0.7]
"crouch_stealth": 1.2
玩家在正常和饥饿状态下的爬行状态的隐蔽性乘数 如果未指定饥饿状态下的数值,则与正常时相同

"throw_skill"(integer[1..2])

"throw_skill": [2, 1]
 "throw_skill": 2
玩家在正常和饥饿状态下的投掷矛的能力 如果未指定饥饿状态下的数值,则为0

0:0.6到0.9伤害(和僧侣相同)

1:1伤害(和求生者相同)

2:1.25伤害(和猎手相同)

"lung_capacity"(float[1..2])

"lung_capacity": [0.9, 0.7]
"lung_capacity": 1.2
玩家在正常和饥饿状态下的肺活量乘数 如果未指定饥饿状态下的数值,则与正常时相同

"loudness"(float[1..2])

"loudness": [0.9, 0.7]
"loudness": 1.2
玩家在正常和饥饿状态下的引起生物注意的响度乘数 如果未指定饥饿状态下的数值,则与正常时相同

"alignments"

{
  "<CreatureCommunities.CommunityID>": { "like": float, "strength": float = 1.0, "locked": boolean = false },
  ...
}
就是有好感度机制的生物群体组成的集合)
"alignments": {
  "Lizards": { "like": 1.0, "strength": 0.2 },
  "Scavengers": { "like": -0.5, "locked": true }
}
生物群体对玩家的声望属性,like代表基准声望,每次存档后 相应群体的声望会以strength的数值逐渐移向基准值(存疑,原文此处并未讲明strength的具体影响,建议自行测试) locked为true时,声望将永远保持为like的值

like取值范围[-1,1],strength取值范围[0,1]

"diets"

{
  "base": string,
  "corpses": float,
  "meat": float,
  "plants": float,
  "overrides": {
    "<CreatureTemplate.Type>": float,
    "<AbstractPhysicalObject.Type>": float,
    ...
  }
}

"diet": {
  "base": "White",
  "corpses": 0.5,
  "plants": 0.5,
  "overrides": {
    "Scavenger": 1.25,
    "DangleFruit": 0.5
  }
}
食物是否可以食用 及食用提供的饱食度 计算后的饱食度数值会近似到0.25的倍数 0表示不可食用,-1表示尝试进食将会导致被击晕

"corpses"表示玩家食用除蜈蚣外的大型生物尸体的饱食度乘数

"meat"表示玩家食用小型生物尸体、蜈蚣类生物或者肉类物体的饱食度乘数

"plants"表示玩家食用非肉食物体的饱食度乘数

"overrides"为单独的生物(包含在CreatureTemplate.Type中)和物体(包含在AbstractPhysicalObject.Type中)设置饱食度乘数

"base"是可选的 如果使用这个参数 接受的字符串必须包含于SlugcatStats.Name中。如果提供了"base"则其他参数都是可选的,默认为base代表的角色的数值。不指定"base"的情况下则需要指定其他参数

"custom_colors"

[
  { "name": "Body", "story": color, "arena": color[] },
  { "name": "Eyes", "story": color, "arena": color[] },
  { "name": string, "story": color, "arena": color[] },
  ...
]

"custom_colors": [
  { "name": "Body", "story": "10200C" },
  { "name": "Eyes", "story": "FFFFFF", "arena": [ "FFFFFF", "FF8080", "80FF80", "8080FF" ] },
  { "name": "Gills", "story": "454560" }
]
可配置的颜色。颜色由"name"引用,并将在颜色自定义菜单中显示。 在故事模式下默认使用"story"中的颜色,在竞技场模式中则被"arena"中的颜色覆盖

如果在"arena"中指定的颜色数量不足或省略了该属性,则竞技场模式中的某些玩家将使用"story"颜色

"backspear"(boolean)

"back_spear": true
在玩家背上储存一根矛的能力

"can_maul"(boolean)

"can_maul": true
撕咬被击晕的生物并造成伤害的能力

"maul_blacklist"(string[])

"maul_blacklist": [ "Scavenger", "PinkLizard" ]
不可被这个角色撕咬的生物的列表,接受的字符串必须包含于CreatureTemplate.Type中

"maul_damage"(float)

"maul_damage": 1.5
撕咬造成的伤害数值,如不指定则默认为1

"karma"(integer)

"karma": 3
初始的业力等级,范围从0到9(注意0对应的是一级,9是十级)

"karma_cap"(integer)

"karma_cap": 7
初始的业力上限,范围从0到9(同上)

"the_mark"(boolean)

"the_mark": true
玩家是否初始带有交流印记

"the_glow"(boolean)

"the_glow": true
玩家是否初始带有食用神经元后的发光效果

"start_room"(string[])

"start_room": "LF_H01"
"start_room": [ "DS_RIVSTART", "LF_H01" ]
玩家的初始房间id 如果指定多个,则从第一个开始尝试,如果该房间不存在则继续尝试下一个

你可以在这个网站查询到原版和DLC每个房间的id:

https://rain-world-map.github.io/

"guide_overseer"(integer)

"guide_overseer": 1
玩家的引导监视者的颜色,从1到5分别为黄/绿/红/白/紫 如果不指定,则引导监视者不会生成

如果没有开启MSC,除黄色之外的颜色将不能正常运作

"has_dreams"(boolean)

"has_dreams": true
玩家是否拥有梦境(然而这玩意没啥用 默认为白猫梦境)

"cycle_length_min"(float)

"cycle_length_min": 5.5
最短周期时长,单位为分钟

"cycle_length_max"(float)

"cycle_length_max": 8.25
最长周期时长,单位为分钟

"perma_unlock_gates"(boolean)

"perma_unlock_gates": true
玩家通过业力门后 该业力门是否会一直保持开启

"food_min"(integer)

"food_min": 7
雨眠所需的最低饱食度

"food_max"(integer)

"food_max": 10
可以保存的最高饱食度

"select_menu_scene"(string)

"select_menu_scene": "MySlugcatSelect"
在角色选择界面显示的场景的id

"select_menu_scene_ascended"(string)

"select_menu_scene_ascended": "MySlugcatAscended"
飞升结局后角色选择界面显示的场景的id

"sleep_scene"(string)

"sleep_scene": "MySlugcatSleep"
在雨眠界面显示的场景的id

"starve_scene"(string)

"starve_scene": "MySlugcatStarve"
因持续饥饿而在雨眠中死亡时 显示的特殊死亡界面的场景的id

"death_scene"(string)

"death_scene": "MySlugcatDeath"
一般原因导致死亡时 死亡界面的场景的id

"world_state"(string[])

"world_state": "Red"
"world_state": [ "Spear", "Red" ]
玩家的世界状态id,包括了生物生成和房间连接 接受的字符串必须包含于SlugcatStats.Name中

如指定多个,则从第一个开始尝试,如果该角色名称不存在则继续尝试下一个

"timeline_before"(string[])

"timeline_before": "Red"
"timeline_before": [ "Artificer", "Red" ]

"timeline_after"(string[])

"timeline_after": "Yellow"
"timeline_after": [ "Rivulet", "Yellow" ]
用于为角色在时间线上的位置排序,格式同world_state。 timeline_before的优先级更高

集合(枚举)内容列表

  • SlugcatStats.Name

原版: White,Yellow,Red

MSC: Rivulet,Artificer,Saint,Spear,Gourmand,Slugpup,Inv

  • CreatureCommunities.CommunityID

原版: None,All,Scavengers,Lizards,Cicadas,GarbageWorms,Deer,Jetfish

  • CreatureTemplate.Type

原版

StandardGroundCreature, Slugcat, LizardTemplate, PinkLizard, GreenLizard, BlueLizard, YellowLizard, WhiteLizard, RedLizard, BlackLizard, Salamander, CyanLizard, Fly, Leech, SeaLeech, Snail, Vulture, GarbageWorm, LanternMouse, CicadaA, CicadaB, Spider, JetFish, BigEel, Deer, TubeWorm, DaddyLongLegs, BrotherLongLegs, TentaclePlant, PoleMimic,  MirosBird,TempleGuard, Centipede, RedCentipede, Centiwing, SmallCentipede, Scavenger, Overseer, VultureGrub, EggBug,  BigSpider, SpitterSpider, SmallNeedleWorm, BigNeedleWorm, DropBug, KingVulture, Hazer

MSC

MirosVulture, SpitLizard, EelLizard, MotherSpider, TerrorLongLegs, AquaCenti, HunterDaddy, FireBug, StowawayBug,  ScavengerElite, Inspector, Yeek, BigJelly, SlugNPC, JungleLeech, ZoopLizard, ScavengerKing, TrainLizard

  • AbstractPhysicalObject.Type

原版

Creature, Rock, Spear, FlareBomb, VultureMask, PuffBall, DangleFruit, Oracle, PebblesPearl, SLOracleSwarmer,  SSOracleSwarmer, DataPearl, SeedCob, WaterNut, JellyFish, Lantern, KarmaFlower, Mushroom, VoidSpawn, FirecrackerPlant,  SlimeMold, FlyLure, ScavengerBomb, SporePlant, AttachedBee, EggBugEgg, NeedleEgg, DartMaggot, BubbleGrass,  NSHSwarmer, OverseerCarcass, CollisionField, BlinkingFlower,

MSC:

JokeRifle, Bullet, SingularityBomb, Spearmasterpearl, FireEgg, EnergyCell, Germinator, Seed, GooieDuck, LillyPuck,  GlowWeed, MoonCloak, HalcyonPearl, DandelionPeach, HRGuard


基础部分的教程就到此结束啦...

在这一部分的教程中,我们从一个模板mod开始,了解了雨世界mod的基本文件结构和VS的基础功能,学习了数种简单数据类型,并且制作了一个带有基本功能的自定义角色

后续也会考虑更新进阶部分 将会讲解自定义场景的添加、自定义角色贴图以及自定义的角色特殊能力,后续应该也会包含关于fisobs自定义物品、自定义对话、绘制和地图编辑器相关的内容 敬请期待(!

在此也感谢哈维提供的关于教程编写方面的指引...以及 再次感谢SlimeCubed以及他的作品

那么 祝好运啦.....

評論