《危笑乐园》(Giggleland)全文本深度汉化补丁发布与底层本地化缺陷逆向实录(附全笔记存档与 Telegram 贴纸包)

《危笑乐园》(Giggleland)全文本深度汉化补丁发布与底层本地化缺陷逆向实录(附全笔记存档与 Telegram 贴纸包)

calendar_month 2026年11月11日 03:05:00 person ZGQ Inc. schedule 约 5 分钟阅读

期待了好久的独立恐怖解谜新作 《Giggleland》(危笑乐园) 出正式版快半个月了:

Giggleland on Steam Tolie isn’t allowed to leave the house. One night she wakes up alone in Giggleland, to a voice over the park speakers: her father is waiting for her at the information booth. A ... store.steampowered.com

这个游戏其实是近几年非常火的吉祥物恐怖(Mascot Horror)品类。从《玩具熊的五夜后宫》《Bendy》,到现象级的《波比的游戏时间》《Indigo Park》,以看似充满童真笑脸的卡通吉祥物为表象、实则隐藏着扭曲猎奇与荒诞阴谋的游戏设定一直备受玩家喜爱。而《危笑乐园》凭借其独特的复古手绘卡通风格、诡谲莫测的废弃游乐园场景以及张力拉满的病态角色塑造,在吉祥物恐怖界里可以说是相当亮眼的一部佳作。

我很喜欢游戏的角色设计和背景刻画,特别是核心角色 Eliot(艾略特),无论人设造型还是诡异动态都极其出彩。

不过游戏发售到现在都没出中文,对于这样一款拥有大量文本、场景指示与 19 篇核心日记的作品来说,纯英文确实很影响沉浸感,于是我就想着自己动手做逆向汉化了。

结果把游戏底层资源拆开后,我发现了一个惊天大反转:官方其实早就汉化了 90% 的内容,甚至官方连译名都想好了,叫做《危笑乐园》!

至于为什么官方做完了 90% 却没有在正式版中实装?后续深入逆向后发现,其实是因为游戏底层走的是基于键值的动态本地化检索,但官方场景中大量的硬编码文本与 LocalizationData 不匹配,导致引擎查表未命中时静默回退(Silent Fallback)成了英文。具体原因不明,可能是本地化团队没有跟进关卡更新,这也是导致重置章节的弹窗和任务指示没有成功汉化的根本原因。

我把整个程序和场景数据做了逆向,把这些未匹配的地方全部做了补齐与重定位。在对剩余文本进行润色、查找资料的时候,我发现之前有人已经做过汉化补丁了,但也碰到了我刚刚说的硬编码问题导致有些地方没有成功汉化;而且评论区不少玩家反馈新版本无法使用。我在对比了 2 个版本后发现,是官方重新编译了 GameAssembly.dll,函数地址与偏移量变动所致。所以我最终走的是静态二进制修补路线,后期版本更新可以扫描偏移量与对象、补进常量,方便汉化补丁的长期维护。之前尝试过 version.dll 动态劫持注入,但触发了生命周期冲突和 IL2CPP 内存保护,均以失败告终,所以目前最合理的方案还是静态二进制修补。

不过可能依旧会有一些地方没匹配,个人精力有限,没游玩整个游戏流程进行回归测试。至于 Sprite 素材,个人没有能力汉化,所以场景贴图保持了原貌。顺便我也做了一下全笔记解锁的存档,方便只想看故事的朋友。

今天就借这篇文章,完整公开本次汉化的逆向原理解析、自动化维护脚本、独家全收集存档、Telegram 贴纸包以及配套的单文件绿色补丁!


一、 官方完成了 90% 汉化,为何从未生效?

在对游戏资源包 resources.assets 进行解包并提取出 Unity 本地化核心资产 LocalizationData.asset 时,开发团队留下的中文翻译不仅全量存在,而且官方翻译质量相当优秀,语境贴切。最关键的是,官方早已拟定了官方中文定名——《危笑乐园》。

既然绝大多数文本早就备齐,为什么广大玩家进游戏后看到的依然是全英文,甚至连语言切换选项都没有开放?

flowchart TD
    subgraph Bug ["官方本地化未生效成因 (Official Silent Fallback)"]
        A["游戏启动 / 关卡场景载入"] --> B["ObjectiveControl / 场景硬编码字符串"]
        B --> C{"查询 LocalizationData 字典"}
        C -- "键值未命中 / 标点格式不匹配" --> D["静默回退至英文 (Silent Fallback)"]
        C -- "命中" --> E["显示官方中文 (仅占极少数基础 UI)"]
    end

    subgraph Solution ["ZGQ Inc. 二进制补丁重定位链"]
        F["Giggleland_Chinese_Patcher.exe"] --> G["特征码修补 GameAssembly.dll"]
        G --> G1["NOP 强制英文指令 (27 + 7 字节)"]
        G --> G2["重定向启动与回退语言至 zh-CN"]
        F --> H["重定位 resources.assets"]
        H --> H1["更新大端序总长 (offset 28..31)"]
        H --> H2["更新 PID 19787 尺寸为 1,031,728 字节"]
        H --> H3["后续对象 byte_start 平移 DELTA_SHIFT"]
        H --> H4["原位流式注入 2,597 条全量全集词条"]
        H4 --> I["全场景任务、弹窗与日记 100% 汉化命中"]
    end

1. 场景硬编码文本与字典脱节

《危笑乐园》底层采用基于键值的动态本地化检索机制:文本组件在初始化时,会以自身的源文本作为 Key,向 LocalizationData 字典查询对应的翻译 Value。

然而,在游戏全部 14 个关卡场景(level0 到 level14)中,官方场景里存在大量的硬编码自然语言:

  • 关卡任务指示(ObjectiveControl 组件);
  • 章节重置确认弹窗(“Reset Chapter Confirmation”);
  • 场景中动态触发的对话、广播提示。

2. 标点错位导致引擎静默回退(Silent Fallback)

在 LocalizationData 字典中,翻译团队收录的 Key 与场景关卡实际写在场景组件里的文本存在大量不匹配:

  • 标点符号差异:场景中使用了英文直单引号 ',字典中却录入了弯单引号 ’;
  • 末尾句号差异:关卡任务目标有的带句号 .,字典中却没有;
  • 大小写与词句调整:关卡版本迭代微调了场景文字,导致字典键值彻底脱节。

Unity 本地化查找机制存在一个致命特性:当引擎在字典中查表未命中时,完全不会报错,而是静默回退(Silent Fallback)——直接将原场景硬编码的英文原样渲染!

这正是导致重置章节的弹窗和任务指示没有成功汉化的根本原因。本地化团队很可能在翻译完第一批表格后就未再跟进关卡改动,导致大量场景硬编码文本始终处于英文回退状态。

我把整个程序和场景数据做了深度逆向,将全部 14 个场景、90 处 ObjectiveControl 的所有硬编码文本和标点变体全部提取并补齐了字典匹配。


二、 为什么旧补丁失效?动态劫持折戟与静态二进制修补路线

在对剩余文本进行润色、查找资料的时候,我发现有人已经做过汉化补丁了。但深入研究后发现,先前的补丁也碰到了上述的硬编码问题,导致不少任务与弹窗依旧是英文;更严重的是,评论区许多玩家提到游戏更新后补丁就彻底无法使用。

1. 为什么版本更新会导致补丁报废?

对比了更新前后的两个版本后,我发现官方重新编译了核心动态库 GameAssembly.dll:

  • 本作采用 Unity 64-bit IL2CPP;
  • IL2CPP 在 AOT(Ahead-Of-Time)静态编译时,会根据全局代码结构重新优化内联函数与虚表。
  • 只要官方代码稍微改动一行,所有的函数入口地址、虚方法表(VMT)以及类结构体偏移量就会全线改变!依赖硬编码内存地址的补丁在重新编译的代码面前瞬间暴毙。

2. version.dll 动态劫持为什么行不通?

在此之前,我也尝试过走通用的 version.dll 动态劫持注入路线,试图在运行时内存中 Hook 语言分发函数。但测试均以失败告终:

  • 生命周期冲突:version.dll 劫持加载发生在极早期,此时 Unity 引擎底层的 Mono/IL2CPP Runtime Domain 与资源反序列化流水线均未就绪,极易引发启动死锁或空指针崩溃;
  • IL2CPP 内存保护:新版 Unity 运行时对代码段施加了严格的只读与执行保护(PAGE_EXECUTE_READ),强行修改内存页易触发访问冲突(Access Violation)。

3. 最优解:静态二进制修补路线

因此,目前最合理的方案依然是静态二进制修补(Static Binary In-Place Relocation)。 通过编写自动化扫描脚本扫描新版本的偏移量与对象表,将动态计算的常量补入 C 语言补丁程序中,使得后期即使游戏频繁更新,也能在几分钟内快速重构出可用补丁,维护成本极低且运行极其稳定。


三、 补丁实现细节:汇编特征码与资源流式重定位

我们编写的原生 C 补丁程序 Giggleland_Chinese_Patcher.exe 仅约 800KB,内嵌 1,031,728 字节的纯净增量本地化包(loc_data.bin),在本地实现毫秒级原位流式修改。

1. GameAssembly.dll 6 处汇编特征码精准修复

补丁通过扫描特征码,精准解除游戏逻辑中的英文锁死:

1
2
3
4
5
6
7
8
9
DllPatch patches[] = {
    {"Awake.force_en (解除启动英文锁定)",   p1_orig, sizeof(p1_orig), p1_patch, sizeof(p1_patch)},
    {"SetLanguage.force_en (解除切换语言锁死)", p2_orig, sizeof(p2_orig), p2_patch, sizeof(p2_patch)},
    {"Awake.fallback (启动回退设为中文)",     p3_orig, sizeof(p3_orig), p3_patch, sizeof(p3_patch)},
    {"SetLanguage.fallback (切换回退设为中文)", p4_orig, sizeof(p4_orig), p4_patch, sizeof(p4_patch)},
    {"ctor.currentLanguage (默认语言设为中文)", p5_orig, sizeof(p5_orig), p5_patch, sizeof(p5_patch)},
    {"GetDefaults.language (新设置默认中文)",   p6_orig, sizeof(p6_orig), p6_patch, sizeof(p6_patch)},
    {NULL, NULL, 0, NULL, 0}
};
  • 将 Awake 与 SetLanguage 中强行将语言设为英文的代码分别填充 27 字节与 7 字节的 NOP(0x90);
  • 将默认语言及未命中回退指针重定向至中文分支。

2. resources.assets 原位无损重定位

新数据包体积从 541,852 字节扩增至 1,031,728 字节(净增 DELTA_SHIFT = 489,872 字节):

  1. 修正文件头大端序总长:在文件头偏移 0x1C(Offset 28..31)处,以 Big-Endian 写入扩展后的总长度 0x0ACF8AFC(181,373,692 字节);
  2. 更新对象表 Entry 19786(PID 19787):将对象尺寸修正为 1,031,728;
  3. 动态对齐与全局平移:对后续所有资产条目的 byte_start 偏移统一增加 DELTA_SHIFT,并维持 8 字节边界对齐;
  4. 4MB 流式分块读写:杜绝大内存占用,秒级完成重构并自动生成 .bak 备份,随时支持一键卸载还原。

四、 文本精修、译名规范与日记“双模态”攻坚

1. 全角色统一规范中文译名

  • Ella → 艾拉
  • Eliot → 艾略特(人设魅力极高,反差萌拉满!)
  • Tolie → 托利
  • Simon → 西蒙(经典关卡“西蒙说”)
  • Teri / Terry → 泰瑞(“泰瑞农夫” / “泰瑞的家”)
  • Rory → 挠挠(“挠挠闹翻天”)
  • Debbie → 黛比
  • Laura → 劳拉
  • Abby → 艾比
  • Abel → 亚伯
  • Isaac → 艾萨克

2. 攻克 19 篇泰瑞日记的“双模态”断层

游戏内收集的 19 篇关键日记具有双模态阅读特性:

  • 手写体(Handwriting Mode):包含大量富文本划线删除标签(<s>...</s>)、笔迹涂抹草稿;
  • 抄录易读体(Transcribed Mode):外层包裹英文双引号 "",游戏中按下 I 键 可切换为整洁的打印排版。

先前补丁在切换易读模式时因 Key 未匹配会直接跌回英文。我们对全部 19 篇笔记的手写标签与抄录体文本分别进行了双向匹配与精校,按 I 键切换绝不掉回英文。

3. 关于 Sprite 素材与测试说明

  • 关于 Sprite 素材:至于 Sprite 素材,个人没有能力汉化。场景海报、警示牌等属于纹理贴图,若要汉化需进行大量美术重绘且会导致补丁体积膨胀数百兆,因此全部保持了官方原汁原味的手绘英文质感。
  • 关于回归测试:由于个人精力有限,没游玩整个游戏流程进行完整回归测试。文本虽然全集覆盖了 2,597 条词条,但若个别分支偶现未匹配的英文,欢迎在群内交流指正!

五、 顺手制作:全笔记解锁存档

为了方便大家静下心来仔细品味世界观与泰瑞日记的完整故事,我顺便做了一下全笔记解锁的存档(Giggleland_全笔记收集存档.reg)。

Unity 在 Windows 平台将 PlayerPrefs 存储于注册表中,日记进度的路径为: [HKEY_CURRENT_USER\Software\Hooked\Giggleland]

键名为 "TerryNotesProgress_h1806427539",其内容是一个十六进制 ASCII 序列化的 JSON:

1
2
3
4
5
6
{
  "collected": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],
  "transcribed": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],
  "lastRead": 7,
  "version": 2
}

直接双击导入注册表文件,即可在游戏主界面的笔记本中自由查看全部 19 篇笔记的手写与抄录双版本!


六、 游戏的 ARG 解谜与 Demo 移除遗憾

作为一款纯正的吉祥物恐怖(Mascot Horror)游戏,深不见底的背景暗线与 ARG(Alternate Reality Game,侵入式虚拟现实解谜) 向来是这类作品最迷人的灵魂所在,而《危笑乐园》在这方面更是设计得极其惊艳。

在之前的 Demo 阶段我就体验过了:通过关卡中的暗号与密码可以解密出隐藏的 YouTube 视频,视频里面还藏了更多信息!整个解谜链条极其硬核。

可惜官方在正式版上线后,把 Demo 页面的解谜内容给删掉了,很多后来入坑的玩家无法体验到完整的解密流程,我真心希望他们能重新上架 Demo!

想深入了解这套庞大密码学背景的朋友,可以参看官方 Wiki:

https://giggleland.wiki.gg/wiki/Giggleland_ARG giggleland.wiki.gg


七、 社区福利:Telegram 贴纸包、Emoji 与无损源文件

另外,我从游戏解包资源中提取了无损素材,制作了专属的 Telegram 贴纸包和自定义 Emoji 包:

在整理素材时,我还发现之前已经有人拿官方的 Trailer 和周边动画视频做过贴纸包了,质量也非常棒:

这里将我们提取的全套透明背景高清贴纸源文件打包共享,方便大家自由创作:


八、 自动化维护工具链(Source Pipeline)

补丁配套的工程源码位于 source/ 目录,供大家研究与后续跨版本维护:

维护脚本 核心功能与自动化机制
source/scan_offsets.py 自动解析新版 resources.assets 物理偏移与对象表,重算 8 字节动态对齐并同步更新 Giggleland_Patch.c 中的常量。
source/extract_game_texts.py 集成 AssetRipper,秒级扫描反编译源码与全部 14 个关卡场景,提取所有新增任务目标。
source/generate_loc_bin.py 全集策略合并并生成 8 字节对齐的二进制包 loc_data.bin。
source/build.bat 调用 MinGW GCC 毫秒级编译输出单文件绿色补丁。

九、 汉化补丁下载与使用指南

info Note

源码与沟通说明: 压缩包内含完整源码。目前我觉得基本上没问题了;之前我也联系了第一个做汉化的作者,目前还没有收到回复。如果有新进展或新版更新,会第一时间同步。

使用方法

  1. 下载并解压 Giggleland_Chinese_Patcher_v1.1.0.zip;
  2. 将解压出来的 Giggleland_Chinese_Patcher.exe 复制到游戏根目录(与 Giggleland.exe 在同一文件夹);
  3. 运行补丁程序:
    • 输入 1 并回车:自动备份并一秒完成全文本无损汉化;
    • 输入 2 并回车:随时一键彻底卸载,还原官方纯净原版;
    • 支持命令行静默调用:Giggleland_Chinese_Patcher.exe --install。
  4. 【可选】全笔记解锁:
    • 双击运行 Giggleland_全笔记收集存档.reg 导入注册表,即可在游戏中阅读全部 19 篇笔记。

bolt 分享到 Telegram
arrow_back 移动终端预装系统级组件 SystemHelper 深度逆向分析与时空行为监控技术取证白皮书

前往 Telegram 频道参与讨论

在频道帖子下评论

open_in_new 打开

forum 评论区

正在加载评论区...