Skip to content

要添加自定义对话(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.txt
  • English.txt
  • French.txt
  • German.txt
  • Italian.txt
  • Japanese.txt
  • Korean.txt
  • Russian.txt
  • Simplified Chinese.txt
  • Spanish.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"(自定义字体)选项实现这一点。

  1. 打开 Font Generator 页面 🔗 并按以下内容填写:
  • Font(字体): Custom Font
  • Font name(字体名称): renogare64
  • Font file(字体文件): Noto Sans Medium 🔗(这是原版在俄语、中文等语言中使用的字体)
  • Dialog file(对话文件): 提供一个 .txt 文件,包含你想添加的所有字符(且只包含这些字符)
  1. 下载生成的 zip 文件,并解压到你的模组文件夹中的 Dialog/Fonts

  2. 用文本编辑器打开 renogare64.fnt,将 Noto Sans Medium 替换为 Renogare:

    截图中高亮显示的要替换的文本