外观
要添加自定义对话(Dialogue)内容,务必遵循正确的模组结构。 此外,每当你添加或移动对话文件时,务必重启游戏(不过编辑其内容应该会立即生效)。
说明
如果你使用 Notepad++,可以导入自定义用户定义语言 🔗来处理 Celeste 对话 .txt 文件。
感谢 Celeste Discord 服务器上的 iSkLz 创建并发布了这个文件!
Celeste_Dialogs.xml 🔗
如果你使用 Visual Studio Code,可以安装 Celeste Dialog Highlighter 🔗 扩展来为 Celeste 对话 .txt 文件启用语法高亮。
目录
设置对话文件
在你的模组根文件夹中创建一个名为 Dialog 的文件夹。例如:Celeste/Mods/MyExampleMap/Dialog
现在你可以在该文件夹中创建一个新的 .txt 文件。这个文件的命名取决于你想为哪种语言添加自定义对话。原版 Celeste 中已有的语言对应的文件:
Brazilian Portuguese.txtEnglish.txtFrench.txtGerman.txtItalian.txtJapanese.txtKorean.txtRussian.txtSimplified Chinese.txtSpanish.txt
如果你没有启用"显示文件扩展名",建议启用它,以确保你的语言文件以 .txt 结尾,而不是 .txt.txt。
如果调用的是当前所选语言的某个对话 ID,但该语言没有给出对应的特定 ID 或完整文件,Everest 会默认使用 English.txt 中的文本来显示对话。
自定义语言的实现方式相同,但请务必确认具体对话文件需要如何命名。
原版对话文件位于 Celeste/Content/Dialog
创建对话字符串和 ID
在对话文件中,你为对话设置字符串和 ID。游戏使用这些 ID 来查找应该在例如消息框(Message Box)中显示什么内容。
来自原版 English.txt 的一个字符串及对应对话 ID 的示例:
CH2_THEO_B=
[THEO left normal]
Sorry about that.
Don't worry, I won't post that one.在这个例子中,CH2_THEO_B 就是 ID,它应该唯一命名,以免与原版对话或其他模组的自定义对话冲突。
例如:用 MAPAUTHOR_MAPNAME_JUMPDIALOG_1 而不是 Jump1
[THEO left normal] 用于确定应该使用哪种对话立绘(Dialogue Portrait)和对话框(Dialogue Box)。
在这个例子中,THEO 表示文本将显示 Theo 的对话框和对话立绘。这自然可以更改以使用不同角色的素材。要添加自定义立绘,请参见此处
left 是对话立绘的方向,在这个例子中,立绘会出现在对话框的左侧。
normal 是对话立绘应使用的表情。某个角色有哪些可用表情,可以在调试模式控制台中使用 portraits 命令在游戏内查看。
这些属性可以完全省略,例如当某个实体(entity)只显示文本而不显示对话框时,这很有用。
对话的其余部分是当 ID 被调用时实际出现在游戏中的文本行。这里也可以使用文本命令。要查看一些可用于修改游戏内文本显示的命令及其具体作用的列表,请查看原版 English.txt 的顶部。游戏中还会用到其他命令,但并没有文档说明,比如 * 会让显示的文本抖动。trigger 命令在原版对话中是硬编码的,但在代码模组中可以通过 Textbox.Say 方法使用(下文会进一步说明)。如果你迫切需要更高级的过场动画,可以查看 Cruor 的 Lua Cutscenes 模组 🔗 或创建自定义事件页面。
如果你想把自己的文本翻译成另一种语言,请在对应语言的对话文件中创建相同的 ID。显示什么文本取决于当前选择的语言。
使用自动生成的 ID
某些对话 ID 是由游戏根据文件夹结构和文件名自动生成并使用的。这些 ID 用于章节名、检查点名称、水晶之心诗篇等。要让这些 ID 显示你想要的文本,只需把游戏给你的 ID 复制到你的对话文件中,并将其设置为想要的文本。 章节名示例:
Map .bin file location: Celeste/Mods/MyExampleMap/Maps/ExampleLevelset/ExampleMapFolder/ExampleMap.bin
Autogenerated ID: ExampleLevelset_ExampleMapFolder_ExampleMap
Filled out String with Text: ExampleLevelset_ExampleMapFolder_ExampleMap= My Desired Name在游戏中显示自定义对话
对于自动生成的 ID,这一步不是必需的,因为游戏已经会调用它们来显示。
然而在地图中,不同的实体(entity)和触发器(trigger)也可以使用自定义对话 ID 来显示文本。 示例包括:
- 迷你文本框触发器(Minitextbox Trigger)
- Everest 对话过场(Everest Dialog Cutscene)
- Everest 自定义 NPC(Everest Custom NPC)
要让某个对象使用指定的对话 ID,请在 Lönn 中右键单击它,打开实体属性菜单。 在这里你很可能看到 Dialog ID 或类似性质的字段。把你的 ID 复制到该字段中,点击更新,保存你的地图,你的改动现在就应该会在游戏中生效了。
代码模组还可以设置允许使用自定义对话 ID 的自定义对象。 如果你想在自己的代码模组中使用自定义对话,请查看此页面。
花式文本
你的对话文件中的文本可以拥有特殊属性。以下是一些示例:
彩色文本:
{#F94A4A}Red Text{#}。十六进制颜色代码写在第一个{#}中。波浪文本:
{~}Wavy text{/~}。抖动文本:
{*}Shaky text{/*}。醉酒文本:
{%}Drunk text{/%}。冲击文本:
{!}Impact text{/!}。更大的文本:
{big}Big text{/big}。变速文本:
{>> 0.5}Speed text{>>}。这段文本会以半速播放。替换文本:
{+DIALOG_ID}。带有对话 ID "DIALOG_ID" 的文本会出现(它可以包含其他属性,所以如果你经常使用带有特定颜色等的短字符串,这会很有用。{+MADELINE}会使用存档文件中选择的名字。移动文本框:
{anchor top}、{anchor middle}和{anchor bottom}允许文本框出现在不同的垂直位置。请记住,如果在句子中间使用,这会关闭文本框并重新打开它。换行:
New{n}line。它会在同一个文本框中创建新的一行,而不进入新的一页(分页)。停顿:
Pause{0.5} between {0.5} words。这个句子会在每个词之间停顿 0.5 秒。触发器:
{trigger #}。这会在对话中途播放一个协程(coroutine)(例如让某个角色做一些事、触发某件事等),其中#是从 0 开始的编号索引,用于指定要播放哪个协程。 这可以通过Textbox.Say方法在代码模组中使用,该方法接收对话 ID,以及(可选地)一个或多个额外参数,每个参数包含一个要与trigger一起播放的协程。 可选地,你可以在数字后面附带一些文本(例如{trigger 0 Maddy walks to the right})。这些文本不会被解析,因此只是作为描述协程作用的注释(可以理解为舞台指示)。{silent_trigger #}的用法相同,但它可以在角色说话途中使用,而无需关闭文本框。
如果你安装了 Bits And Bolts Helper,还可以使用:
- 不同大小的文本:
{^ 1.5}将文本大小设置为正常大小的 150%。{/^}将文本大小重置为正常大小(1.0)
自定义表情
表情(Emote)是你在游戏中任何通常显示对话的地方都可以使用的小图片。要添加表情,请将图片放入模组根文件夹中的 Graphics/Atlases/Gui/emoji/yourusername/yourmodname/。然后要开始使用你的新表情,只需在 English.txt 中写下 :yourusername/yourmodname/emote_name:,其中 emote_name 指你的表情文件名(不含扩展名)。
如果你希望表情根据文本颜色改变颜色,可以将其设为_单色(monochrome)_。这可以通过在图片名称末尾、扩展名之前添加 .m 来实现,例如 emote_name.m.png。后缀 .m 不被视为表情名称的一部分。你可以像使用普通表情一样,在 English.txt 中输入 :yourusername/yourmodname/emote_name: 来使用它。
自定义字体加载
如果你的对话特别涉及日语、中文或韩语,你可能会发现在游戏中查看对话时缺少一些字符。这是因为 Celeste 只附带部分字体。这种情况下,下面的内容会对你有所帮助。
使用在线工具
为了简化这个过程,你可以使用这个在线工具 🔗 来生成自定义字体,或者获取缺失的日语、中文或韩语字符。
如果生成的字体无法正常工作,欢迎在 Celeste Discord 🔗 上 @ 一下 maddie480。
手动使用 BMFont
首先,确保你的对话文件使用 UTF-8-BOM 编码保存。你可以在记事本的"另存为"对话框中指定编码。
向游戏字体添加字符
为了向游戏提供额外的字符,你需要生成这些字符的图片以及一个描述它们的 fnt 文件:
- 下载 BMFont 🔗。
- 使用 Options > Load configuration(加载配置)加载与游戏期望相符的配置 🔗。
- 选择 Options > Font settings(字体设置),然后选择与你语言匹配的字体(你可能需要先下载并安装它们,Noto 字体可在此处获取 🔗):
- 中文:Noto Sans CJK SC Medium
- 日语:Noto Sans CJK JP Medium
- 韩语:Noto Sans CJK KR Medium
- 俄语:Noto Sans Med
- 其他语言:Renogare
- 选择 Edit > Clear all chars from font(从字体中清除所有字符),然后选择 Edit > Select chars from file(从文件中选择字符),再选择你的对话文件。这将确保你的对话文件中用到的所有字符(且只有这些字符)被导出。
- 选择 Options > Save bitmap font as(将位图字体另存为),然后用一个唯一的名称保存你的文件(
mynickname_mymodname.fnt)。结果你应该会得到一个 fnt 文件和几个 png 文件(mynickname_mymodname_0.png、mynickname_mymodname_1.png……) - 将 fnt 文件重命名(取决于语言):
- chinese.fnt
- japanese.fnt
- korean.fnt
- russian.fnt
- renogare64.fnt
- 将 fnt 和 png 文件放入
Mods/yourmod/Dialog/Fonts
当游戏启动时,你应该会在控制台或 log.txt 中看到类似下面的内容,告诉你缺失的字符已成功添加到游戏字体中:
[PixelFont] Loading font: D:\SteamLibrary\steamapps\common\Celeste\Content\Dialog\Fonts\korean.fnt
[PixelFont] => vanilla font file
[PixelFont] => mod font file from ExtendedVariantMode
[PixelFont] ==> Imported 15 new characters为游戏添加全新的自定义字体
如果你想要一个"自定义字体"语言,或者想把 Celeste 翻译成使用不同字母系统的语言,你可能会对这一节感兴趣。这个过程与上一节非常相似:
- 下载 BMFont 🔗。
- 使用 Options > Load configuration(加载配置)加载与游戏期望相符的配置 🔗。
- 选择 Options > Font settings(字体设置),然后选择你想要的字体。
- 选择 Edit > Clear all chars from font(从字体中清除所有字符),然后选择 Edit > Select chars from file(从文件中选择字符),再选择你的对话文件。这将确保你的对话文件中用到的所有字符(且只有这些字符)被导出。
- 选择 Options > Save bitmap font as(将位图字体另存为),然后用一个唯一的名称保存你的文件(
mynickname_mymodname.fnt)。结果你应该会得到一个 fnt 文件和几个 png 文件(mynickname_mymodname_0.png、mynickname_mymodname_1.png……) - 将 fnt 和 png 文件放入
Mods/yourmod/Dialog/Fonts - 在你的对话文件中,编辑这一行,并将 "Renogare" 替换为你的实际字体名称(不是你给 fnt 文件起的名字)。
FONT=Renogare,64当游戏启动时,你应该会在控制台或 log.txt 中看到类似下面的内容,告诉你字体已加载:
[PixelFont] Loading font: D:\SteamLibrary\steamapps\common\Celeste\Content\Dialog\Fonts\comic_sans.fnt
[PixelFont] => mod font file from CelesteInComicSans想要查看一个带自定义字体的可运行语言模组示例,请查看这个示例模组 🔗。它为你提供了使用 Comic Sans 字体的 Celeste。是的,我知道。
使用 Font Generator 网站向英文字体添加字符
使用Font Generator 🔗 向英文字体添加字符是可行的,但这需要一些小技巧,因为原版英文字体(Renogare)里缺少的字符其实并不多(大部分字符原版字体里都已经有了)……所以该网站通常会告诉你 "All characters are missing from the font"(所有字符都缺失)。
你可以通过 "Custom Font"(自定义字体)选项实现这一点。
- 打开 Font Generator 页面 🔗 并按以下内容填写:
- Font(字体): Custom Font
- Font name(字体名称):
renogare64 - Font file(字体文件): Noto Sans Medium 🔗(这是原版在俄语、中文等语言中使用的字体)
- Dialog file(对话文件): 提供一个
.txt文件,包含你想添加的所有字符(且只包含这些字符)
下载生成的 zip 文件,并解压到你的模组文件夹中的
Dialog/Fonts用文本编辑器打开
renogare64.fnt,将Noto Sans Medium替换为Renogare: