当前位置: 首页 > news >正文

GMS 1.4 YYC编译的游戏,如何安全地修改里面的文字和图片?(附UndertaleModTool实战)

GMS 1.4 YYC编译游戏修改实战:从文字替换到图片资源修改

在独立游戏开发领域,Gamemaker Studio(GMS)因其易用性和灵活性广受欢迎。许多经典独立游戏如《Undertale》等均采用GMS 1.4开发,并通过YYC(YoYo Compiler)编译发布。对于游戏爱好者或模组制作者而言,了解如何安全修改这些游戏中的文字和图片资源,不仅能实现本地化汉化,还能进行个性化定制。本文将深入探讨这一过程的核心技术与实操细节。

1. 理解GMS 1.4 YYC编译的游戏结构

GMS 1.4 YYC编译后的游戏与标准编译版本存在显著差异。YYC编译的核心特点是将游戏资源嵌入单一可执行文件(.exe),而非传统的data.win文件。这种设计虽然提升了安全性,但也为资源修改带来了挑战。

1.1 YYC编译的游戏文件组成

通过十六进制编辑器分析,YYC编译的.exe文件通常包含三个关键部分:

  1. 解释器部分:文件起始至FORM标记(十六进制46 4F 52 4D)。这部分负责解释游戏数据结构,由于采用C语言编译,难以直接反编译。
  2. 数据包部分:从FORM标记到AUDO标记(41 55 44 4F)。若该部分未加密,FORM后通常跟随GEN8标记(47 45 4E 38),表明资源可提取。
  3. 代码部分AUDO标记至文件末尾。这部分包含实际游戏代码,任何直接修改都可能导致程序崩溃。

表:YYC编译游戏文件结构关键标记

部分名称起始标记(十六进制)结束标记可修改性
解释器文件起始FORM (46 4F 52 4D)不可修改
数据包FORMAUDO (41 55 44 4F)可提取资源
代码AUDO文件末尾极难修改

1.2 资源嵌入方式与安全修改原则

YYC编译将游戏资源(图片、音效等)直接嵌入可执行文件,这种设计带来两个重要影响:

  • 资源访问效率提升:减少外部文件依赖
  • 修改难度增加:需要特殊工具和技巧才能安全修改

黄金法则:任何修改都必须保持原始文件大小不变,否则极易导致程序崩溃。对于字符串修改,必须严格遵循等长替换或使用空字节(00)占位。

2. 准备工作:工具与环境配置

2.1 必备工具清单

要进行安全的游戏资源修改,需要以下工具组合:

  1. 十六进制编辑器

    • HxD(Windows平台推荐)
    • 010 Editor(高级功能更丰富)
  2. 专用修改工具

    • UndertaleModTool(支持GMS游戏资源查看与编辑)
    • GMS Resource Explorer(辅助资源提取)
  3. 辅助工具

    • Resource Hacker(查看基础资源结构)
    • Cheat Engine(动态调试可选)

2.2 UndertaleModTool的安装与配置

UndertaleModTool是修改GMS游戏的核心工具,安装步骤如下:

# 通过GitHub获取最新版本 git clone https://github.com/krzys-h/UndertaleModTool.git cd UndertaleModTool # 安装依赖(Windows下可直接使用预编译版本) dotnet build

提示:使用前确保安装.NET 6.0或更高版本运行环境。对于复杂修改,建议备份原始游戏文件。

3. 安全提取游戏资源

3.1 识别并提取数据包部分

  1. 使用十六进制编辑器打开游戏.exe文件
  2. 搜索FORM标记(46 4F 52 4D
  3. 确认后续四个字节是否为GEN847 45 4E 38
  4. 选中从FORMAUDO之间的所有数据
  5. 将选中部分另存为新文件(如extracted_data.win
# 简易Python脚本实现数据包提取 with open('game.exe', 'rb') as f: data = f.read() form_pos = data.find(b'FORM') audo_pos = data.find(b'AUDO') if form_pos != -1 and audo_pos != -1: with open('extracted_data.win', 'wb') as out: out.write(data[form_pos:audo_pos+4])

3.2 使用UndertaleModTool解析资源

  1. 启动UndertaleModTool
  2. 选择"File"→"Open",加载提取的extracted_data.win文件
  3. 浏览左侧资源树,可看到:
    • Sprites(游戏精灵/图片)
    • Sounds(音效)
    • Strings(部分字符串资源)
    • Fonts(字体)
    • Rooms(房间数据)

常见资源类型与修改难度对比

资源类型修改难度风险等级推荐工具
图片UndertaleModTool
音效UndertaleModTool
UI文本十六进制编辑器
游戏对话极高专业工具组合

4. 实战:修改游戏内文字

4.1 定位字符串的精确方法

YYC编译的字符串通常位于代码部分起始处,紧邻SetEndOfFile标记(53 65 74 45 6E 64 4F 66 46 69 6C 65)。定位步骤:

  1. 在十六进制编辑器中搜索SetEndOfFile
  2. 向下滚动,观察可读文本区域
  3. 记录目标字符串的偏移地址和长度

4.2 安全替换字符串的两种策略

策略一:等长替换

  • 新字符串必须与原始字符串完全相同的字节长度
  • 示例:将"CeyaseOver"改为"CeyaseEnda"

策略二:空字节截断

  • 对于需要缩短的字符串,用空字节(00)填充剩余空间
  • 绝对禁止增加字符串长度
# 原始字符串(十六进制表示) 43 65 79 61 73 65 4F 76 65 72 00 # "CeyaseOver" # 安全修改方案 43 65 79 61 73 65 45 6E 64 61 00 # "CeyaseEnda"(等长) 43 65 79 61 73 65 00 00 00 00 00 # "Ceyase"(空字节截断)

警告:字符串修改是最高风险操作,建议每次只修改一处并立即测试游戏稳定性。某些关键字符串(如函数名)修改必然导致崩溃。

5. 替换游戏图片资源

相比文字修改,图片替换相对安全且效果显著。以下是使用UndertaleModTool的标准流程:

5.1 图片资源替换步骤

  1. 在UndertaleModTool中定位目标Sprite
  2. 右键选择"Export"导出原始图片
  3. 使用图像编辑软件修改或替换图片
    • 保持相同尺寸(或等比例缩放)
    • 使用相同格式(通常为PNG)
  4. 返回UndertaleModTool,右键选择"Import"导入新图片
  5. 保存修改到新的data.win文件

5.2 将修改后的资源重新打包

  1. 在十六进制编辑器中打开原始游戏.exe
  2. 用修改后的data.win内容替换原始FORM-AUDO部分
  3. 确保:
    • 新数据不超过原始空间(否则需要高级技术调整)
    • 所有关键标记位置保持不变
  4. 保存为新.exe文件

6. 高级技巧与疑难排解

6.1 处理加密数据包

若FORM后不是GEN8标记,表明数据包已加密。可尝试:

  1. 搜索已知资源名称的加密形式
  2. 尝试通用XOR解密工具
  3. 分析游戏内存获取解密密钥

6.2 修改后游戏崩溃的常见原因

  1. 文件大小变化:任何导致.exe大小改变的操作都极危险
  2. 字符串长度超标:新增字符会覆盖后续关键数据
  3. 资源格式不符:如图片色深、音频采样率改变
  4. 内存校验:部分游戏会验证资源完整性

6.3 性能优化建议

  • 修改前创建多个备份点
  • 使用版本控制工具跟踪修改历史
  • 建立自动化测试流程验证每次修改
  • 优先修改非核心资源(如UI图片)降低风险

在实际项目中,我发现最稳妥的方法是先针对游戏的非关键部分进行试验性修改。例如,替换标题画面图片比修改游戏对话文本安全得多。通过渐进式学习和积累经验,逐步掌握更复杂的修改技术。

http://www.jsqmd.com/news/900490/

相关文章:

  • 告别盲目单步!Keil5调试STM32的5个高效技巧:变量监视、逻辑分析、命令窗口实战
  • Vue项目里用Highcharts+Canvas画频谱瀑布图,30ms刷新也不卡(附完整代码)
  • 修复Windows+Ubuntu双系统引导丢失?EasyUEFI比EasyBCD更管用
  • 别再只看Top-1了!用Python代码实战解析Rank-1与Rank-5正确率,帮你更懂模型真实能力
  • OPC中国是什么?一文读懂智能体来了旗下OPC开源共创社区
  • 海口律师事务所提供高质量离婚和房产法律咨询服务
  • 别再只会ls了!用C语言opendir/readdir遍历目录,实现你的第一个文件管理器
  • UE4玻璃和水面材质实战:从折射率到光照模式,手把手调出真实半透明效果
  • 百度文心助手 LeetCode 2751. 机器人碰撞 C语言实现
  • 力扣HOT100(35)回溯-全排列
  • 基于可靠性的直接Turbo译码器RCODD的FPGA实现与优化
  • 技术笔记 | 解析SQR-PR300管道机器人
  • 2026年零基础适配!新手友好型AI自动化测试工具测评
  • MSP430F5529新手避坑指南:CCS导入driverlib库报错?手把手教你搞定环境搭建
  • 老工控机升级记:Win7 64位下搞定WinCC 7.0 SP3与PC Access SP6通讯(附完整避坑清单)
  • 科创50、科创100与科创200的底层逻辑重构
  • 天龙八部单机版GM工具终极指南:5分钟快速掌握游戏数据管理
  • SPA如何被AI正确引用:从SSR到结构化数据的实战指南
  • Claude Code 替代方案探索,利用聚合平台获取更稳定高效的编程辅助
  • 量子纠错码与ZSZ码的创新应用
  • 从CentOS 8.5 Minimal到开发环境:安装后必做的10件事(配置yum源、SSH、防火墙)
  • 基于三轴加速度计的塑料水管泄漏振动检测技术全解析
  • ANSYS Workbench螺栓连接仿真避坑指南:从Beam连接到预紧力锁死,一个案例讲透
  • 共模干扰和差模干扰,硬件EMC整改的核心根基
  • 2026年哈尔滨消防设施操作员培训推荐榜:消控证/监控维保/中级消防证/消防上岗证深度解析与避坑指南 - 品牌企业推荐师(官方)
  • 观察使用Taotoken的Token Plan套餐后月度账单的变化
  • 千问 LeetCode 2781. 最长合法子字符串的长度 JavaScript实现
  • 别再死记公式了!用Python的NumPy和Pandas实战理解样本均值、方差与中心矩
  • 基于 HarmonyOS 6.0 的日程备忘应用页面构建:深色主题与数据看板设计详解
  • CPT Markets:从账户流程看服务细节与效率