首先非常感谢这个帖子里的 Pegasus 资源:
[url=
https://bbs.tgfcer.com/viewthread.php?tid=835922]
https://bbs.tgfcer.com/viewthread.php?tid=835922[/url]
这个资源是我这一轮折腾安卓掌机系统和模拟器前端的起点。没有这位大佬整理好的资源包,我大概率也不会重新接触安卓上的模拟器生态。上一次认真用安卓设备,还是三星 S7 Tab,主要也只是躺床上看剧。
实际用下来以后发现,这套资源里的 NDS 和 3DS 部分相对不太完整,模拟器版本也偏老。所以我萌生了自己动手补完的想法。最开始切入的是 NDS 模拟器。简单搜了一圈,现在安卓上还比较活跃、体验也不错的 NDS 模拟器基本就是 melonDS 系列:
[url=
https://github.com/rafaelvcaetano/melonDS-android]
https://github.com/rafaelvcaetano/melonDS-android[/url]
所以第一步目标很明确:把原资源里的 Drastic 换成 melonDS。
一、把 R4 金手指库转成 melonDS 可用 XML
一开始我下载的是 melonDS APK 版本,想先试试最近准备玩的《极限脱出 9小时9人9扇门》。结果很快就遇到了问题。
melonDS 并不直接支持常见的 usrcheat.dat / urcheat.dat 这类 R4 二进制金手指库格式,只支持 XML 格式的 cheat 表,而且安卓端界面比较原始,更偏一次性 import,没有很好用的总 cheatlist 编辑功能。
本着“出问题就自己折腾”的原则,我第一步想自己写一个转换器:把 R4 的二进制 dat 金手指读出来,转换成 melonDS 支持的 XML 格式。
刚开始自己写 reader,很快发现中文版本 dat 非常麻烦。R4 早就没人维护了,古早的 r4cce 对现在塞满汉化版游戏金手指的新 cheat 库支持很差,直接内存溢出。后来我发现已有一个现成 Web 转换器项目:
[url=
https://github.com/natereprogle/R4Everyone]
https://github.com/natereprogle/R4Everyone[/url]
实际测试下来,它确实可以在线编辑金手指,但当时不支持 UTF-8 中文编码,而且 Web 版本体验一般,网速不给力时浏览器容易假死。看了一下实现,主要是 C#,门槛不算高,于是我直接 fork 了一版,做了离线版本。
大约 2 小时配合 AI 折腾下来,我加上了 UTF-8 中文兼容,复用了它的 R4CheatReader,然后对照 melonDS 的金手指加载源码,做了 XML 转换器:
[url=
https://github.com/Splaser/R4Everyone/tree/feature/melonds-export]
https://github.com/Splaser/R4Everyone/tree/feature/melonds-export[/url]
顺手还给原项目发了一个 UTF-8 兼容相关 PR。实测可以成功导入 urcheat.dat。
这是我打包过的 exe,直接和 urcheat.dat 放在同一个目录,运行后会自动转换成 XML。然后复制到安卓设备对应目录,走 melonDS APK 导入 XML 金手指即可。
链接:
[url=
https://pan.baidu.com/s/1UTpaA1KsK0yL8H-mPswnGA?pwd=24qj]
https://pan.baidu.com/s/1UTpaA1KsK0yL8H-mPswnGA?pwd=24qj[/url]
提取码:24qj
二、Pegasus 前端改成 RetroArch + melonDS Core
模拟器换了以后,Pegasus 前端配置也要改。
我的 Odin3 已经 root,找启动命令本身就是一两行 adb 的事情。不过 Odin3 的 Android 15 在外部启动比较重的 APK + ROM 时,偶尔会出现 ANR 或假死。所以我最后更倾向于走 RetroArch core,而不是单独调用 melonDS APK。
后来实测发现,melonDS 早就支持 RetroArch 直接 load,只是我一开始没注意。再加上我把 melonDS APK 和 RA 版本的存档位置统一到了一起,后续切换也更方便。
我还顺手看了一下 ES-DE 等几个前端的 SQLite 数据库,发现现在 RA 启动命令其实非常简单,只需要:-e LIBRETRO melonds不用写完整 core 路径,就能启动对应核心。
Pegasus 的 NDS 部分配置可以改成下面这样:collection: Nintendo DS
sort-by: 034
shortname: nds
extensions: dsi, nds
launch: am start
-n com.retroarch.aarch64/com.retroarch.browser.retroactivity.RetroActivityFuture
-e ROM "{file.path}"
-e LIBRETRO melonds
-e CONFIGFILE /storage/emulated/0/Android/data/com.retroarch.aarch64/files/retroarch.cfg
-e IME com.android.inputmethod.latin/.LatinIME
-e DATADIR /data/data/com.retroarch.aarch64
-e APK /data/app/com.retroarch.aarch64-1/base.apk
-e SDCARD /storage/emulated/0
-e EXTERNAL /storage/emulated/0/Android/data/com.retroarch.aarch64/files后续资源部分基本不用动。到这里,NDS 模拟器部分算是折腾完了。
三、从旧 Citra / Lime3DS 换到 Azahar
开头提到的 Pegasus 资源包里,3DS 资源比较少,模拟器也偏老,还是旧 Citra 分支 / Lime3DS 一类方案。
现在安卓上相对活跃、体验也比较好的 3DS 模拟器,我个人更推荐 Azahar:
[url=
https://azahar-emu.org/pages/download/]
https://azahar-emu.org/pages/download/[/url]
Azahar 功能比较完整,支持自定义 GPU 驱动,也支持装字库、打 mod、开高倍分辨率、加载高清纹理包等。对 Odin3 这类安卓掌机来说,整体体验已经比较成熟。
第一步仍然是搞定 Pegasus 的启动命令。不过 3DS 这边没有 RetroArch 那种顺滑方案,基本只能走 Azahar 自己的外部启动:collection: 3DS
sort-by: 035
launch:
am start --user 0
--grant-read-uri-permission
-n org.azahar_emu.azahar/org.citra.citra_emu.activities.EmulationActivity
-a android.intent.action.VIEW
-d "{file.uri}"
--activity-clear-top
extension:
[3ds
cci
cxi]这里我加了强制 SAF 授权,某种程度上属于玄学优化,但实测稳定性还可以。
四、把 CIA 转换成 Pegasus / Azahar 可用的 CXI
启动命令搞定以后,下一步就是资源问题。
我下载了一些自己想玩的 3DS ROM,很快发现 CIA 格式和 Pegasus 前端配合不方便。CIA 更像安装包,而 Pegasus 前端更适合直接展示和启动卡带格式。所以我需要把 CIA 转成前端可直接读取的 CCI / CXI。
CCI 和 CXI 可以粗略理解为:CCI 多一层卡带容器封装,CXI 更接近实际可执行内容。对我的使用场景来说,CXI 更直接,也更适合前端管理。
我最开始参考的是 GBATemp 这个帖子里的工具链:
[url=
https://gbatemp.net/threads/batch-cia-3ds-decryptor-a-simple-batch-file-to-decrypt-cia-3ds.512385/]
https://gbatemp.net/threads/batch-cia-3ds-decryptor-a-simple-batch-file-to-decrypt-cia-3ds.512385/[/url]
但实际测试以后发现,原工具链对中文版、汉化版、改版 ROM,以及升级包 / DLC 的支持非常差。尤其是 DLC 和 UPD 补丁,失败率很高。很多会在 Azahar 里显示加密、不可用、裂开或者无法启动。
所以这一步的核心就变成了:自己改进转换流程,让 Azahar 能尽量无缝加载中文 CXI + CIA 补丁。
经过大约两天折腾,我基于 Windows PowerShell 和原项目工具组,做了一套新的流程:
[url=
https://github.com/Splaser/Batch-CIA-3DS-Decryptor-Redux]
https://github.com/Splaser/Batch-CIA-3DS-Decryptor-Redux[/url]
我的版本会自动把 CIA 本体游戏转换成 CXI,方便 Pegasus 像展示实体卡带一样展示和启动。对于 UPD 和 DLC,则会转换成 loose patch 结构,输出类似下面这样的文件:_cxi_out/loosepatch/title/0004000e/001acb00/content/00000000.app
_cxi_out/loosepatch/title/0004000e/001acb00/content/00000001.app
_cxi_out/loosepatch/title/0004008c/00078a00/content/00000000.app
_cxi_out/loosepatch/title/0004008c/00078a00/content/00000001.app
...然后复制覆盖到 Azahar 的虚拟 SD 目录:<Azahar 配置文件夹,一般位于 Odin3 内部存储区 / Azahar,具体看你自己设定>/
sdmc/
00000000000000000000000000000000/
00000000000000000000000000000000/
title/
0004000e/
XXXXXXXX/
content/
00000000.app
0004008c/
XXXXXXXX/
content/
00000000.app我自己测试了十几个中文汉化 CIA,目前没有出现明显问题,Azahar 可以正常识别和加载。
中文字库部分我参考的是这个项目:
[url=
https://github.com/rcyggdra/Shared-Font]
https://github.com/rcyggdra/Shared-Font[/url]
中文字库 CIA 可以正常走 Azahar 模拟器内安装,然后把字体文件 shared_font.bin 放到内部共享存储空间:Azahar/sysdata/shared_font.bin即可。
到这里,3DS 模拟器主体部分基本也就折腾完了。
五、3DS 金手指、SMT4 和实际体验
模拟器、前端、资源转换都跑通以后,我后面几天主要在折腾 3DS 金手指转换,以及实际游玩《真女神转生4》。
3DS 游戏的金手指生态和 NDS 完全不是一个体系。NDS 时代 R4 / usrcheat.dat 这类方案虽然古早,但资料多、格式相对统一。3DS 这边则混杂了 Gateway、NTR、Luma、模拟器 cheat、CTRPF 等多套方案,不同来源的代码经常需要手动改格式,甚至要结合存档和内存偏移自己验证。
Azahar 整体体验不错,但对部分汉化版、改版 ROM、补丁结构仍然比较挑剔。很多时候并不是游戏真的不能跑,而是资源格式、加密状态、补丁放置路径、字体资源、title id 映射这些细节里有一个环节不对,就会表现为无法启动或内容不完整。
这也是我这轮折腾里最明显的感受:安卓掌机 + 模拟器 + 前端并不是简单“装个 App 丢 ROM”就结束了。真正想把体验做顺,要同时处理启动命令、包名、Activity、SAF 授权、ROM 格式、CIA / CXI / CCI 转换、Update / DLC 目录结构、字库、金手指、存档路径,以及安卓 15 权限等问题。
这一套东西看起来很杂,但折腾通以后体验确实很舒服。尤其是 Odin3 性能足够,3DS 开高分辨率以后观感比原机好很多,SMT4 这类游戏在掌机上玩也很合适。
这几天折腾下来,最大的感受是:现在安卓掌机的硬件已经很成熟,但软件生态仍然很“拼装”。
Odin3 这类设备性能确实足够强,NDS、3DS、PSP、PS2、GC、Wii 甚至部分 Switch 模拟都能做到不错的体验。但真正决定体验的,并不只是模拟器本身,而是整套链路。
我一开始只是想“换个 NDS 模拟器”,最后却一路折腾到了 R4 金手指库转换、Pegasus 启动命令、RetroArch core、Azahar 外部启动、CIA 转 CXI、Update / DLC loose patch、中文字库、3DS 金手指、Odin3 风扇 root 模块。
最后再次感谢无私奉献 Pegasus 整理资源的 iffox 大佬。
PS:本文有走 AI 润色,本人文笔太差,见谅。
[
本帖最后由 gggbdm 于 2026-5-13 15:22 编辑 ]