模组可以对游戏进行各种修改,例如更改界面、添加角色服装、加入新角色,或修改游戏中已有的场景。
官方模组可以直接在游戏中找到。在主菜单顶部打开 Mods 标签页。
模组源#
默认情况下有三个模组源:Local Mods、Patron Mods 和 Official。
- Local Mods:已经安装的模组。
- Patron Mods:仅向 Patron 开放的官方模组源。
- Official:所有人都可以使用的官方模组源。
模组源列表#
- 官方模组:http://mods.kunoichi-trainer.ninja/official/manifest.json
- 游戏翻译:http://mods.kunoichi-trainer.ninja/translations/manifest.json
- 模组开发者资源:https://bitbucket.org/dinaki/dev-mods/raw/master/manifest.json
安装与管理#
安装官方模组#
- 启动游戏。
- 打开顶部的 Mods 标签页。
- 选择模组源,例如 Official。
- 选择模组。
- 点击 Install。
- 重新启动游戏。
安装第三方模组#
将模组压缩包解压到模组文件夹中。
模组保存位置#
默认路径为 Kunoichi Trainer/mods。如果 mods 文件夹不存在,请手动创建。
你也可以在游戏设置页面的最下方指定其他模组文件夹路径。
禁用模组#
- 打开主菜单。
- 打开 Mods 标签页。
- 选择 Local Mods。
- 选择模组。
- 点击 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_开头。 - 物品名称必须唯一。
普通物品#
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
这种方式只会在新游戏中把物品加入商店。若要在读取已有存档时添加物品,请使用 Module 和 game_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 天"