GMS-data.win文件汉化过程

逆向工程 实用技术
29
Willowziye

半个月前下载这游戏第一次发现有这种格式的文件,就想看看这游戏汉化是怎么个事,前前后后花了一天也是成功翻译了,相比gal汉化来说简单的太多了。

当然这个只适合未加密的情况下,加密后的哈哈我也不知道,使用这种引擎的游戏应该也不是很多。

另外就是这种玩法的游戏我记得十多年前比较流行,很多都不需要联网渣机都能玩,应该叫文字冒险类,现在确实太少见了。

image.png

一、解包

首先需要UndertaleModTool对data.win文件进行解包

https://github.com/UnderminersTeam/UndertaleModTool

下载最新版后打开工具的文件夹,找到"Sripts\Resource Importers\ImportFonts.csx"打开,将int textureSize改为4096,目的是为了容纳更多的中文字体;

屏幕截图 2026-10-04 135945.png打开exe程序,在File/open中选择文件进行解包;

然后选择ExportAllStrings.csx或者StringsJSON.csx导出,Strings导出为txt格式,Json则为json文件,用LinguaGacha翻译的话选择前者txt格式,json格式会分析不了。

屏幕截图 2026-10-04 132847.png

二、翻译文本

  1. 使用LinguaGacha进行翻译(这部分要是写的话又要写不少,详细教学直接b站搜就能看到了),然后将翻译好的文本放回去。选择ImportAllStringsJSON.csx导入翻译好的文本。
  2. 或者采用在线ai网站,不过不是很建议,只适用于文本不太长的文件;当然也可以用具有本地文件读写能力的 AI 编程代理,例如Claude,VS Code+ai插件这种,就不怕文本数量的问题了。

屏幕截图 2026-10-04 134536.png导入文本后去String一栏发现成功后,点击Fonts一栏,看到用的是思源黑体,尝试直接封包看看可不可以。

屏幕截图 2026-10-04 140309.png一进来就发现问题了,有框框存在,进入游戏后发现框框也有,所以需要替换字体。这也很正常,因为虽然使用的是思源黑体但是原本就是用于日文字体的。

屏幕截图 2026-10-04 140646.png

三、制作字体

1.使用gamemaker制作字体

(1)制作字体

https://gamemaker.io/zh-CN

下载后新建项目:

屏幕截图 2026-10-04 142003.png

进去后到工作区右键创建字体;

屏幕截图 2026-10-04 142025.png字体名称换成上面Fonts一栏的名称,然后点击“添加”,选择从文件中获取,将翻译好的文件导入进去,然后点击增加范围。点击左下角的重新生成获得字体,这个时候字体会保存到你创建的项目的目录下Fonts文件夹里,需要注意生成的字体要在一张图里面。

屏幕截图 2026-10-04 144735.png然后点击窗口右上方游戏预览,看看是否正确显示字体,以此类推把另外两个字体也生成了,保持字体大小一致(最好还是新建字体,共用一个窗口会比较麻烦)。

屏幕截图 2026-10-04 151454.png

(2)导入字体

在UndertaleModTool中选择ImportGMS2FontData.csx,导入之前保存的yy后缀文件,三个都替换。然后在File/save生成新的data.win文件。

屏幕截图 2026-10-04 144243.png发现游戏翻译成功:

屏幕截图 2026-10-04 152618.png

2.使用BMFont和BMFontToGMFont制作字体

使用这个方法会稍微复杂一点,但是相比gamemaker可调节的选项会多一些。

(1)BMFont

BMFont下载地址:https://angelcode.com/products/bmfont/

选择下面的64位,下载后打开bmfont64.exe。

屏幕截图 2026-10-04 153415.png点击Options/Font settings调节字体格式,下面的注释是ai参考:

  • 屏幕截图 2026-10-04 153932.pngCharset (字符集):必须选择 Unicode。这是生成中文字库的核心前提,若误选 OEM 或 ANSI,所有中文文本在读取时都会变成乱码。
  • Size (大小):该数值决定字体的基础分辨率,需尽量贴合游戏原版设定的尺寸。设置过小会导致游戏内文字模糊发虚,过大则会呈指数级消耗贴图空间,导致生成多张贴图或直接报错。

  • Bold/Italic:粗体/斜体

  • Match char height:在制作中英文混排的字体时,通常建议勾选该选项。它能强制统一所有字符的行高包围盒,有效防止游戏内出现标点符号或英文字母上下跳动、对齐错位的现象。

  • Render from TrueType outline:相比于依赖系统的字体渲染,直接从 TrueType 轮廓渲染能提供更干净、锐利的像素边缘,避免在透明通道中产生难以察觉的杂色噪点。

  • Font smoothing / ClearType:这两项用于开启字体的平滑抗锯齿,通常应保持开启。但如果目标游戏是复古像素风(Pixel Art),或者采用了SDF(有符号距离场)着色器渲染,则必须关闭这些平滑选项以保持边缘绝对锐利。



点击Option/Export Options,调节导出格式;

屏幕截图 2026-10-04 154447.png 1.强制偏移量 (Force offsets to zero)

  • 试过了不勾选后续不能导入成功,勾选才能成功

2. 纹理尺寸 (Texture Width & Height)

  • 如果为中文建议改成4096,但需要注意导出的结果:导出后请务必去文件夹看一眼,是否只生成了一张图片(如 xxxx_0.png)。如果生成了多张(如 0.png, 1.png),说明 4096 依然不够装下您选中的所有汉字。很多简易的导入脚本不支持多页贴图导入,若出现多张图,需要回到上一级的 Font Settings 把字体 Size 调小,或者删减生僻字。

3. 通道设置 (Channels)

  • Alpha 通道为 glyph,R、G、B 通道均为 one。

  • 这种组合会生成“纯白色的字,背景完全透明”的贴图。游戏引擎在渲染文字时,通常需要这种纯白贴图作为基础,以便通过代码任意修改文字颜色(如果这里 RGB 不是 one 而是 glyph,导出的字可能会变成黑色或半透明,导致游戏内无法正常变色)。

4. 字体数据格式 (File -> Font)

  • 当前状态:选择了 Text 格式。

  • 导出的坐标映射数据将是一个纯文本的 .fnt 文件。需要确认您后续使用的导入工具(如 UndertaleModTool 的某段 .csx 脚本)具体支持哪种格式。有些脚本只认 XML 格式,有些只认纯 Text。如果导入时报错“解析失败”,请回这里尝试切换为 XML 并重新导出。

5. 间距 (Spacing)

  • 当前状态:水平(A)和垂直(B)间距均设置为 1 像素。

  • 这决定了贴图上汉字与汉字之间的距离。通常 1 像素是够用的,但如果游戏引擎有缩放操作(比如抗锯齿或分辨率自适应),1 像素的间距可能会导致“边缘粘连”(即某个字显示时,边缘带上了旁边汉字的毛边)。如果游戏中出现这种现象,建议将 Spacing 修改为 2 或 4。


调节好后选择Edit/Select chars from file,导入之前翻译好的文本

屏幕截图 2026-10-04 155131.png然后需要注意文本文件的编码格式:BMFont 对读取的文本文件编码有严格要求。必须保存为带有 BOM 签名的 UTF-8 编码,或者 UTF-16 LE 编码。如果使用默认的 ANSI 或 GBK 编码保存,BMFont 会将其读取为乱码,导致根本无法选中任何中文字符。

可以通过Options/Visualize预览字体纹理,如果觉得不合适可以调整字体格式,字体面积占整个图片超过70%就不会太小;

接着点击Options/Save bitmap font as...导出fnt文件。

(2)使用BmFontToGM将fnt格式转成yy格式

上面的BMFont导出的格式为fnt,需要转成yy格式才能导入回UndertaleModTool;

下载地址:https://github.com/YAL-GameMaker-Tools/BMFontToGMFont

下载后将fnt文件拖拽到BmFontToYY23.exe打开就能生成yy后缀的文件。剩下的两个直接复制fnt文件改名字后拖拽生成即可。 屏幕截图 2026-10-04 162324.png剩下导入字体步骤就和前面一样,选择ImportGMS2FontData.csx,导入之前保存的yy后缀文件,三个都替换。然后在File/save生成新的data.win文件。然后启动游戏成功即可。

屏幕截图 2026-10-04 164309.png

四、总结

总结一下,就是解包文件,提取string文本后翻译放回,然后可通过两种方法制作字体并替换,最后封包结束。

本文版权遵循 CC BY-NC 协议 和 本站版权政策

(。>︿<。) 已经一滴回复都不剩了哦~