1个不稳定版本

0.1.0 2022年7月18日

#357 in 国际化(i18n)


用于 smallworld

GPL-3.0-or-later

110KB
2.5K SLoC

smallworld

...尽管山脉分隔,海洋辽阔...

smallworld 是一个小工具,可以创建 无区域限制openingTitle.arc 文件,用于 New Super Mario Bros. Wii,无需代码修改,且文件大小增加最小(约0.3%)。它还可以将一个 openingTitle.arc 从一个区域转换为另一个区域。

使用方法

发布页面 下载您操作系统的最新版本。每个版本都包含几个构建;选择与您的系统架构匹配的一个(如果您不确定,x86_64 是最常见的选择)。

命令行界面快速概述

以下命令中的 "smallworld" 应替换为您选择的二进制文件的全名。

就地创建无区域限制的 openingTitle.arc

smallworld openingTitle.arc

openingTitle.arc 转换为特定单个区域(例如,日语)

smallworld --to J openingTitle.arc

保存到不同的文件名而不是覆盖输入文件

smallworld -o modified.arc openingTitle.arc

忽略文件的冲突副本并仅选择EU版本*

smallworld --ignore-conflicts openingTitle.arc

查看完整的使用信息

smallworld --help

*默认情况下。您可以使用 --from 来配置如何解决冲突;有关更多详细信息,请参阅 --help

许可证

GNU GPL v3。有关更多信息,请参阅 "LICENSE" 文件。

常见问题解答

什么是它? openingTitle.arc 是 NSMBW 中包含标题屏幕上显示的标志图像以及相关布局和动画文件的存档文件。其中所有文件名称在不同地区略有不同——例如,布局文件在北美版本中是 openingTitle_US_00.brlyt,在国际(“EU”)版本中是 openingTitle_EU_00.brlyt,在日文版本中是 openingTitle_13.brlyt。这些文件名在代码中是硬编码的;因此,每个 openingTitle.arc 都与一个特定地区相关联,如果用于其他地区将会导致游戏崩溃。

由于 NSMBW 的不同版本总体上非常相似,因此模组通常支持其中几个版本,通常至少是 3 个(美版、欧版、日版)。创建 openingTitle.arc 的传统方法是为每个地区手动创建多个副本,并让游戏在运行时根据找到的游戏地区加载正确的版本(openingTitle.arc 在不同地区也位于不同的路径)。

smallworld 提供了一个更好的解决方案,即低开销、无地区限制的 openingTitle.arc。这是通过向存档的文件名表中添加冗余的文件名来实现的,这些文件名都指向相同的内部文件数据。这样,无论游戏使用哪个文件名,查找总是会成功。

为什么我要使用它? 处理 openingTitle.arc 至关重要。如果您的模组只支持一个地区,将会排除大量潜在玩家。

处理 openingTitle.arc 问题传统方法存在一些缺点

  • 您的模组需要包含多个 openingTitle.arc 的副本,而这些副本有 99% 是相同的。
  • 如果您想再次编辑您的标志,您必须在之后再次手动进行文件重命名过程。
  • 您可能会犯拼写错误或错误(例如,很容易忘记日文文件的名称是“13”而不是“JP_00”),除非您 确实 有每个游戏版本的可用副本来测试(并且愿意真正这样做),否则您将无法发现。
  • 大多数人不会费心包含韩版和台版 openingTitle.arc,因为那些版本的游戏相对较为罕见,制作更多文件副本需要更长的时间。

相反,您可以让 smallworld 为您处理这一切。快速轻松地创建一个单一地区的无地区限制的 openingTitle.arc,将其放入您的模组中,您将永远不需要再手动处理。

为什么不使用代码修改来使文件名一致呢? 如果您更喜欢这样做,请随意。这只是另一种不需要任何代码修改的解决方案。

它是否与较新的 SMBW 兼容? 是的。

如果文件在不同地区有不同的路径,如何在模组中共享单个文件? 这可以通过 Riivolution XML(您正在使用 Riivolution,对吧?)来实现。为每个地区的 openingTitle.arc 文件添加一个条目,并将它们都指向模组中的一个共享文件。

例如,如果您将您的 openingTitle.arc 放在 Lang/Layout/openingTitle/openingTitle.arc

<file external="Lang/Layout/openingTitle/openingTitle.arc" disc="/EU/Layout/openingTitle/openingTitle.arc" />
<file external="Lang/Layout/openingTitle/openingTitle.arc" disc="/US/Layout/openingTitle/openingTitle.arc" />
<file external="Lang/Layout/openingTitle/openingTitle.arc" disc="/JP/Layout/openingTitle/openingTitle.arc" />
<file external="Lang/Layout/openingTitle/openingTitle.arc" disc="/KR/Layout/openingTitle/openingTitle.arc" />
<file external="Lang/Layout/openingTitle/openingTitle.arc" disc="/TW/Layout/openingTitle/openingTitle.arc" />
<file external="Lang/Layout/openingTitle/openingTitle.arc" disc="/CN/Layout/openingTitle/openingTitle.arc" />

如何编辑一个无区域限制的 openingTitle.arc 文件?里面有很多重复的文件!你有两个选项

  • 三步流程:使用 --to 选项在 smallworld 中运行它以转换为单一区域(选择任何一个),像往常一样编辑文件,最后再次使用 smallworld 使其成为无区域限制。
  • 两步流程,如果不小心的话稍微有些风险:编辑 "EU" 文件,然后再次通过 smallworld 运行 arc 文件并带上 "--ignore-conflicts" 标志以重新应用文件去重。通常情况下,如果每个区域的文件都有所不同,smallworld 会为了安全起见失败并显示错误消息。--ignore-conflicts 会使它忽略这一点,如果存在,则只选择 EU 版本(默认情况下——更多信息请参阅 "--from" 在 "--help" 输出中),所以如果你这样做,你必须专门编辑 "EU" 文件,否则它将选择你的文件的老版本并丢弃新版本!

我在另一个应用程序中编辑了我的无区域限制的 openingTitle.arc 文件,当我保存时,它突然变大了 6 倍!救命! smallworld 使得冗余的文件名指向 arc 文件中的确切相同的数据。其他应用程序不会这样做,所以在重新保存时,它们将为每个文件名创建数据的不同副本,从而使整体文件大小膨胀。要修复它,首先确保你的编辑是在文件的 "EU" 版本上进行的,然后再次使用 "--ignore-conflicts" 标志通过 smallworld 运行文件。(也请参阅前一个问题。)

为什么它没有重命名 TPL 文件? openingTitle.arc 包含 BRLAN 文件(动画),一个 BRLYT 文件(布局),以及一个 TPL 文件(图像)。所有这些在每个区域中都有不同的文件名。那么为什么 smallworld 完全没有触及 TPL 呢?

BRLAN 和 BRLYT 文件名在游戏代码中由硬编码的字符串引用,因此需要为每个区域重命名。另一方面,TPL 文件名仅由 BRLYT 文件数据引用。因此,不仅不需要重命名它,而且实际上它是危险的,因为它会破坏这个引用,除非 BRLYT 文件也更新以匹配新的文件名。

这也需要为每个区域存储单独的 BRLYT 文件而不是使用一个共享的文件,smallworld 还需要合并用于编辑 BRLYTs 的代码。仅仅不改变 TPL 文件名就更容易了,而且这样也可以正常工作。

*除了 US 和 EU 区域,它们恰好使用相同的 TPL 名称。

你为什么要用 Rust 写这个? 我想练习 Rust,这似乎是一个尝试它的好项目。


lib.rs:

为 smallworld 提供动力的库。处理除了读取 CLI 参数之外的所有事情。

依赖项

~1.2–1.9MB
~38K SLoC