UndertaleModTool中UML编译器对非脚本函数的支持问题分析

UndertaleModTool中UML编译器对非脚本函数的支持问题分析

UndertaleModTool The most complete tool for modding, decompiling and unpacking Undertale (and other Game Maker: Studio games!) UndertaleModTool 项目地址: https://gitcode.com/gh_mirrors/und/UndertaleModTool

问题概述

在UndertaleModTool项目中,用户报告了一个关于UML编译器在处理GameMaker Language(GML)代码时的问题。当尝试在游戏对象的创建事件中编译包含匿名函数的代码时,编译器会抛出"System.ArgumentException: An item with the same key has already been added"异常。

技术背景

UndertaleModTool是一个用于修改和反编译Undertale游戏数据的工具,它包含一个能够处理GameMaker Studio 2(GMS2)项目代码的编译器。在GML中,函数可以定义在脚本资源中,也可以直接定义在对象事件中。然而,UML编译器在处理后者时出现了问题。

问题重现

用户提供的示例代码展示了问题的典型场景:

anon_func = function()
{
    show_debug_message("ANON FUNC");
};

anon_func();

这段代码定义了一个匿名函数并将其赋值给变量anon_func,然后立即调用它。在GMS2中,这种写法是完全合法的,但在UndertaleModTool的UML编译器处理时会导致异常。

异常分析

异常堆栈显示问题出在Disassembler.Disassemble方法中,具体是在尝试向字典添加项时发生了键冲突。这表明编译器在处理代码块时,可能错误地为相同的键生成了多个条目,或者未能正确处理函数定义的作用域。

技术影响

这个问题影响了以下功能:

  1. 在对象事件中定义和使用匿名函数
  2. 可能影响其他非脚本作用域的函数定义
  3. 限制了代码重构和模块化的灵活性

解决方案

根据项目维护者的回复,这个问题已经在最新的开发版本中得到修复。修复可能涉及以下方面的改进:

  1. 改进了编译器对函数作用域的处理逻辑
  2. 修正了字典键生成算法
  3. 增强了代码块的解析能力

最佳实践建议

虽然问题已经修复,但在使用UndertaleModTool时仍建议:

  1. 尽量将函数定义在脚本资源中而非对象事件内
  2. 定期更新工具到最新版本
  3. 对于复杂代码结构,先在GMS2中测试通过后再导入

结论

这个bug的发现和修复过程展示了开源项目持续改进的价值。对于使用UndertaleModTool进行游戏修改的开发者来说,了解这类编译器限制有助于编写更健壮的代码,并在遇到问题时能够快速定位原因。随着工具的不断更新,其GML支持能力将会越来越完善。

UndertaleModTool The most complete tool for modding, decompiling and unpacking Undertale (and other Game Maker: Studio games!) UndertaleModTool 项目地址: https://gitcode.com/gh_mirrors/und/UndertaleModTool

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

齐辉肠Grayson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值