这份文档面向文本 Mod 作者,说明 mod.ini 的字段含义、分组
.txt 的写法、文本 dump 的使用方式,以及剧情、语音文案与档案文本的替换规则。
实际制作时,通常只需要先 dump、再修改 dump 出来的文件、最后配好对应的 mod.ini 即可。
Ctrl+T 开启文本 dump,再打开对应界面,让程序自动把文本分组导出来。text_type,不要把剧情、语音、档案混在同一个 mod.ini 里。text_root 和 [map] 都使用相对路径。.txt 分组文件。src 既是参考原文,也可在开启源文本校验时参与匹配验证。建议把不同类型的文本拆成独立 Mod 目录,每个目录只保留一个 mod.ini 和一种 text_type。直接基于 dump 结果制作时,最省事的做法就是把 dump 出来的子目录和文件名一并保留下来。
mods/
├─ StoryText_Grani/
│ ├─ mod.ini
│ └─ text/
│ └─ story/
│ └─ activities_a001_level_a001_01_beg.txt
├─ VoiceText_Amiya/
│ ├─ mod.ini
│ └─ text/
│ └─ voice/
│ └─ char_002_amiya.txt
└─ ArchiveText_Amiya/
├─ mod.ini
└─ text/
└─ archive/
└─ char_002_amiya.txt
mod.ini 只能声明一个 text_type。如果同时需要做剧情、语音和档案文本,请拆成多个文本 Mod 目录。
三种文本类型的基础字段是一致的,核心区别主要在 text_type。建议每种类型单独建立一个文本 Mod。
[mod]
type = text
text_type = story
text_root = text
auto_map_by_stem = true
priority = 0
如果剧情文件名和故事分组名不一致,也可以显式写 [map]:
[mod]
type = text
text_type = story
text_root = text
auto_map_by_stem = false
priority = 10
[map]
activities_a001_level_a001_01_beg = 自定义剧情文本.txt
剧情文本这样写是可以的:左边使用 dump 文件主名
activities_a001_level_a001_01_beg,右边指向你自己的文本文件。
只要文本文件里保留 dump 头部的 # group = activities/a001/level_a001_01_beg,
程序就会按文件头里的真实剧情分组去匹配。
[mod]
type = text
text_type = voice
text_root = text
auto_map_by_stem = true
priority = 0
如果你想手动指定某个文本文件,也可以这样写:
[mod]
type = text
text_type = voice
text_root = text
auto_map_by_stem = false
priority = 0
[map]
char_002_amiya = 自定义语音文本.txt
语音文本也推荐这样写:左边使用 dump 文件主名
char_002_amiya,右边指向你自己的文本文件。
实际命中仍然看文件里的 char_word_id,所以最稳妥的方式仍然是直接从 dump 文件改起。
voice 类型,[map] 左边的名字更像“文件分组标签”。
实际命中仍然由文件内的 char_word_id 决定,所以请以 dump 结果中的
char_word_id 为准。
[mod]
type = text
text_type = archive
text_root = text
auto_map_by_stem = true
priority = 0
如果档案文件名和档案分组名不一致,可以这样手动映射:
[mod]
type = text
text_type = archive
text_root = text
auto_map_by_stem = false
priority = 5
[map]
char_002_amiya = 自定义档案文本.txt
档案文本同样推荐这样写:左边使用 dump 文件主名
char_002_amiya,右边写你自己的文本文件名。
只要文件里保留 dump 生成的 bar、entry、role 等字段,就能正常匹配。
mod.ini,然后修改文件里的 text 内容即可开始制作文本 Mod。
typetext,表示这是文本替换配置。text_typedirect_match。它不依赖剧情命令、语音 id 或档案条目身份,而是在最终显示阶段按文本内容直接匹配替换。story、voice、archive、direct_match。
其中 voice 实际覆盖的是首页看板与预览相关的语音文案文本,direct_match 用于最终显示文本的直接匹配替换。
text_roottext,表示扫描当前 Mod 目录下的
text 文件夹。也兼容写作 scan_root。
auto_map_by_stemtext_root 下所有
.txt 文件,并使用文件名主干作为默认分组 key。
prioritymatch_modetext_type = direct_match 生效。支持 strict 和 contains。strict 要求整段文本与 src 完全一致;contains 会把当前显示文本里命中的 src 子串替换为 text。[map]direct_match 来说,[map] 左侧 key 只作为文件标签,真正参与匹配的是文件里的 src 与 match_mode。story,如果文件头里保留了 dump 的 # group,程序会按文件头里的真实剧情组匹配;
对于 voice,实际匹配仍以文件内的 char_word_id 为准;
对于 archive,则依赖文件里的 bar、entry、role 等字段。
文本替换文件使用分组 .txt 格式,每个文件可包含一个或多个 [entry]。
# Arknight Mod grouped text dump
# bucket = story
# group = activities/a001/level_a001_01_beg
[entry]
cmd = dialog@18[content]
src <<<
这女人,还不肯说吗?
>>>
text <<<
这女人,还不肯说吗?
>>>
[entry]
cmd = dialog@18[name]
src <<<
赏金猎人
>>>
text <<<
赏金猎人
>>>
通用字段说明如下:
[entry]:一条替换记录的开始。src:原始文本块,通常直接保留 dump 出来的原文。text:实际替换后的文本块。cmd、char_word_id、bar 等。# group = activities/a001/level_a001_01_beg 这类分组信息。最稳妥的做法是直接沿用 dump 生成的文件名和头部字段,只改 text 块里的内容,不要手工改出新的 group 规则。
text_type = story 主要用于 AVG / 剧情对白替换。关键身份字段是 cmd。下面示例来自 dump\text\story\activities_a001_level_a001_01_beg.txt。
[mod]
type = text
text_type = story
text_root = text
auto_map_by_stem = true
priority = 0
# bucket = story
# group = activities/a001/level_a001_01_beg
[entry]
cmd = dialog@109[content]
src <<<
好了,他们一时半会还醒不过来,我们赶紧离开这里。
>>>
text <<<
好了,他们暂时醒不过来,我们先离开这里。
>>>
[entry]
cmd = dialog@158[name]
src <<<
格拉尼
>>>
text <<<
格拉尼
>>>
[entry]
cmd = dialog@158[content]
src <<<
嘿~!
>>>
text <<<
嘿,走吧!
>>>
剧情文本通常会在下一次文本触发时使用最新内容。热刷新后不会倒回已经播完的当前句。
text_type = voice 用于首页语音文案和部分预览文本。实际匹配的核心字段是 char_word_id。下面示例来自 dump\text\voice\char_002_amiya.txt。
[mod]
type = text
text_type = voice
text_root = text
auto_map_by_stem = true
priority = 0
# bucket = voice
# group = char_002_amiya
[entry]
char_word_id = char_002_amiya_CN_001
voice_id = CN_001
word_key = char_002_amiya
char_id = char_002_amiya
src <<<
博士,您工作辛苦了。
>>>
text <<<
博士,您辛苦了。
>>>
[entry]
char_word_id = char_002_amiya_CN_042
voice_id = CN_042
word_key = char_002_amiya
char_id = char_002_amiya
src <<<
欢迎回家,博士!
>>>
text <<<
欢迎回来,博士!
>>>
voice_id、word_key、char_id 更像是辅助参考信息。
当前文本匹配的主键仍然是 char_word_id,所以做首页文本时请以 dump 结果里的
char_word_id 为准。
text_type = archive 用于档案页面文本。关键字段通常包括 bar、entry、role。下面示例来自 dump\text\archive\char_002_amiya.txt。
[mod]
type = text
text_type = archive
text_root = text
auto_map_by_stem = true
priority = 0
# bucket = archive
# group = char_002_amiya
[entry]
bar = 0
entry = 0
role = title
entry_title = 基础档案
src <<<
基础档案
>>>
text <<<
基础档案
>>>
[entry]
bar = 0
entry = 0
role = detail
entry_title = 基础档案
src <<<
【代号】阿米娅
【性别】女
【战斗经验】三年
【出身地】雷姆必拓
【生日】12月23日
【种族】卡特斯/奇美拉
【身高】142cm
【矿石病感染情况】
体表有源石结晶分布,参照医学检测报告,确认为感染者。
>>>
text <<<
【代号】阿米娅
【性别】女
【战斗经验】三年
【出身地】雷姆必拓
【生日】12月23日
【种族】卡特斯/奇美拉
【身高】142cm
【矿石病感染情况】
体表有源石结晶分布,参照医学检测报告,确认为感染者。
>>>
文本 Mod 的推荐工作流是:
文本 dump 默认写入 config.ini 中 dump_dir 对应的目录下。
例如配置里你设置了 mod 目录为 mod_base_dir = C:\Users\xxx\game\Arknight\mod,
dump_dir = dump,因此文本 dump 的默认实际目录就是
C:\Users\xxx\game\Arknight\mod\dump\text。
C:\Users\xxx\game\Arknight\mod
└─ dump
└─ text
├─ archive
│ └─ char_002_amiya.txt
├─ story
│ └─ activities_a001_level_a001_01_beg.txt
└─ voice
└─ char_002_amiya.txt
config.ini 中 text_replace_enabled = true。Ctrl+T 开启文本 dump。<dump_dir>\text\story、<dump_dir>\text\voice、<dump_dir>\text\archive。[entry] 里的 text 块内容。
Ctrl+T 后,游戏内会出现类似上图的提示。看到提示后,直接打开对应界面即可自动开始 dump 当前命中的文本,默认会写进配置的 dump_dir 下的 text 目录。
char_word_id、bar、entry 很容易写错。对作者来说,最省事的流程就是“Ctrl+T 开启 dump -> 打开对应界面 -> 修改 dump 文件 -> 配好 mod.ini”。
text_type = direct_match 适合做最终显示文本的直接替换。它走的是最终显示入口,不依赖剧情/语音/档案上下文,因此更适合零散 UI 文案、按钮文本、提示文本等。
[mod]
type = text
text_type = direct_match
text_root = text
auto_map_by_stem = true
priority = 0
[entry]
match_mode = strict
src <<<
公开招募
>>>
text <<<
公开招募·改
>>>
[entry]
match_mode = contains
src <<<
理智
>>>
text <<<
Sanity
>>>
strict 表示整段文本必须完全一致才替换;contains 表示只要当前显示文本里包含 src,就会把命中的子串替换成 text。为了避免误伤,推荐优先使用 strict。
text 目录后没有生效?A:先检查 mod.ini 里的 type = text 和 text_type 是否写对,再确认文件扩展名是 .txt,并且条目身份字段来自实际 dump 结果。
src 和 text 有什么区别?A:text 才是最终替换文本;src 是原文参考。若全局开启 text_source_validation = true,程序还会用 src 去校验当前原文是否匹配。
A:不推荐。当前一个 mod.ini 只对应一个 text_type,最好拆成多个文本 Mod 目录分别维护。
auto_map_by_stem = false 时会怎样?A:不会再按文件名自动建组,只有 [map] 中显式列出的文件会被读取。
A:优先级更高的 priority 会优先生效。若优先级相同,通常建议避免不同 Mod 对同一 key 重复覆盖。