模组

语言

模组可以对游戏进行各种修改,例如更改界面、添加角色服装、加入新角色,或修改游戏中已有的场景。

官方模组可以直接在游戏中找到。在主菜单顶部打开 Mods 标签页。

模组源#

默认情况下有三个模组源:Local ModsPatron ModsOfficial

  • Local Mods:已经安装的模组。
  • Patron Mods:仅向 Patron 开放的官方模组源。
  • Official:所有人都可以使用的官方模组源。

模组源列表#

如何创建自己的模组源

安装与管理#

安装官方模组#

  1. 启动游戏。
  2. 打开顶部的 Mods 标签页。
  3. 选择模组源,例如 Official
  4. 选择模组。
  5. 点击 Install
  6. 重新启动游戏。

安装第三方模组#

将模组压缩包解压到模组文件夹中。

模组保存位置#

默认路径为 Kunoichi Trainer/mods。如果 mods 文件夹不存在,请手动创建。

你也可以在游戏设置页面的最下方指定其他模组文件夹路径。

禁用模组#

  1. 打开主菜单。
  2. 打开 Mods 标签页。
  3. 选择 Local Mods
  4. 选择模组。
  5. 点击 Disable

模组结构#

每个模组都应该放在独立文件夹中,文件夹名称应与模组的 id 相同。

模组文件夹中必须有 manifest.json。它应包含模组源中的相同信息,但不需要 file_name 字段。

示例#

{
  "id": "mod-id",
  "name": "模组名称",
  "version": "1.0",
  "description": "模组说明",
  "game_version": "0.16"
}

脚本#

代码文件必须使用 .rpym.rpymc 格式,它们分别对应 .rpy.rpyc。更多信息请参阅 Ren’Py 文档

模组代码写在 .rpym 中,游戏启动时会编译为 .rpymc

文件既可以直接放在模组文件夹中,也可以打包到 .rpa 文件中。

替换游戏中的图片#

manifest.json 中加入 merge_folders 参数。它是一个文件夹名称数组,这些文件夹中的文件会像游戏原始文件一样被加载。

要替换图片,需要知道原始图片的路径,并在 merge_folders 指定的文件夹中按相同路径放入新图片。

示例#

原始图片路径:

images/bg/beginning_room.webp

模组目录结构:

mods
└───mod-id
│   │   manifest.json
│   └───my_folder
│       └───images
│           └───bg
│               └───beginning_room.webp

mod-id/my_folder/images/bg/beginning_room.webp 就是用于替换原图的新文件。

manifest.json

{
  "id": "mod-id",
  "name": "模组名称",
  "version": "1.0",
  "description": "模组说明",
  "game_version": "0.16",
  "merge_folders": ["my_folder"]
}

响应游戏事件#

.rpym 文件中创建继承 Module 的类,并订阅需要的事件。参见事件列表

init python:
  class DemoModule(Module):
      id="demo"
      subscribe_on_events=["time_update", "change_location"]
      def on_event(self, event):
          if event.type == "time_update":
              if event.is_morning:
                  renpy.notify("Morning has come")
              elif event.is_evening:
                  renpy.notify("Evening came")
          elif event.type == "change_location":
              renpy.notify("New location: " + event.new_location.id)

向商店添加物品#

普通物品使用 Item 类,服装使用 Outfit 类。

  • 建议变量名以 item_ 开头。
  • 物品名称必须唯一。

普通物品#

init python:
item_pen = Item(
  name=__("钢笔"),
  cost=5,
  icon="my_mod_folder/pen.webp",
  descr=__("带墨水的钢笔。"),
  shop="tenten",
)

服装#

init python:
item_ino_my_new_costume = Outfit(
  name=__("井野的新服装"),
  cost=100,
  descr=__("物品说明"),
  char="Ino",
  lust=10,
  layer="costume",
  val="my_new_costume",
  shop="tenten",
  ptr=False,
  icon=KTCharInventoryPreview(
    char_name="ino",
    layers=ino_preview_layers + [("costume", "my_new_costume")],
    crop=ino_costume_inv_preview
  ),
)

示例目录结构:

mods
└───mod-id
│   │   manifest.json
│   │   item.rpym
│   └───merge_folder
│       └───images
│           └───characters
│               └───ino
│                   └───costume
│                       └───my_new_costume.webp

这种方式只会在新游戏中把物品加入商店。若要在读取已有存档时添加物品,请使用 Modulegame_loaded 事件。

def on_event(self, event):
    if event.type == "game_loaded" and not inv_shop.has_item(item_my_item):
        inv_shop.add(item_my_item)

游戏变量#

时间段#

if game.time.is_morning:
  "现在是白天"
elif game.time.is_evening:
  "现在是晚上"
$ game.time.set_morning()
"切换到白天"
$ game.time.set_evening()
"切换到晚上"
$ game.time.next_cycle()
"切换到下一个时间段"
$ game.time.next_day()
"前进到下一天"
$ game.time.skip_days(10)
"前进 10 天"
更新时间: Kunoichi Trainer Wiki