A newer shell is available: v1.0.18. The shell and the repository must be from the same version; with the current
mainplease use v1.0.18.
已有更新的壳:v1.0.18。壳和仓库必须是同一版,配合现在的
main请用 v1.0.18。
English
The shell is now clearly build input — it is a .zip, not something you install — and the app checks itself at launch: an incomplete package or an unsupported device gets a clear message instead of a crash.
| Asset | For |
|---|---|
D2RMobile-shell-build-input.zip
| Build input, not installable. iOS 26 and later |
D2RMobile-shell-ios18-build-input.zip
| Build input, not installable. iOS 18 – 25 |
Make your install package from it with d2rm_pack.py (docs/NO_XCODE.md, step 1), using the source of this same release, and install the package that step writes. Moving to a new release always means redoing step 1; the resource archives already on your phone stay where they are. The rewriter's output generation is unchanged (r44). If you build with Xcode, pull main and rebuild.
No more crashes at launch for the wrong package or device
- Installing the shell itself (or a package assembled from different releases) used to crash right after the resource archives were copied in, with
FATAL open …/main.fixups.tsvin the log (#40). The app now checks the package against the shell's own list at launch; if anything is missing, or the package mixes releases, it shows "This Package Is Not Ready", names what is missing, and points you to step 1. - Devices whose graphics chip does not support Metal 3 — A13 and earlier, including the 2020 iPad Pro (A12Z) — now get "This Device Is Not Supported" at launch instead of crashing later (#41). See the device table below.
- Re-signed packages opened with no resources yet (signed with your own Apple ID or a sideloading tool) no longer crash in Apple's background-assets service; they go straight to the "copy the resources in" page.
- The resource check now runs once, right before the game starts; if the resources were moved in the meantime you are taken back to the resources page instead of crashing.
Smoother heavy scenes
Translating the game's graphics commands for Metal now runs on its own thread, overlapping with the game's logic for the next frame instead of waiting for it. In heavy scenes (many monsters and effects) this drops about a third fewer frames: on our test iPhone 17 Pro Max in the same Greater Rift scene, the median number of dropped frames per 300 frames went from 85 to 56. Heavy scenes still drop frames noticeably, and we are still working on it. Normal play does not drop frames (median 0 per 300).
Other fixes
- Progress is saved when you leave the app with the pause menu open. Before, switching away while paused could not save (the game does not advance while paused), so progress since the last autosave could be lost if iOS closed the app in the background. Now the app briefly lets the game run just long enough to save, then puts the pause back. Quitting the Mac app uses the same path.
- Wide iPhones (15 Pro / 16 Pro / 17 Pro Max and other 2.17:1 screens): with only the inventory open, the item description box now sits in the empty side panel instead of against the screen edge.
- Chronicle "View Rewards" page: tapping empty space between reward cards no longer reaches the list underneath (which used to draw a gold focus frame over the rewards page).
Devices
The README's device table now states the minimum: an A14 / M1 chip or later. The graphics layer needs Metal 3, which Apple supports from A14 / M1 on (Metal support on Apple devices, Metal Feature Set Tables). Thanks to the player in #41, whose disassembly-level report led to this.
How this release was checked
Both shells were built from the public tree in an empty working directory, in a normal Terminal environment (UTF-8 locale, no DOTNET_ROOT set), with the free-account switch on; each was then used, with the same tree and another empty working directory, to write an install package with d2rm_pack.py. The iOS 18 shell reads back a minimum system of 18.0 and contains no Metal 4 symbols. On the same fresh tree: the host build, the unit-test suites and four Mac smoke runs (each into a game through both the player path and the touch path); the older-API Mac App was built and started unattended into a game. The launch self-check (incomplete package, mixed releases, no Metal 3) was checked on an iPhone before it was merged.
中文
壳现在明确是「构建原料」——是 .zip、不能直接装;App 启动时会先自检:安装包不完整、设备不支持,都会给出明确提示,不再闪退。
| 附件 | 给谁 |
|---|---|
D2RMobile-shell-build-input.zip
| 构建原料,不能直接安装。 iOS 26 及以上 |
D2RMobile-shell-ios18-build-input.zip
| 构建原料,不能直接安装。 iOS 18 – 25 |
用 d2rm_pack.py 把它做成安装包(docs/NO_XCODE.zh-CN.md 第一步),源码要用同一个发布版本的,装机装的是这一步写出来的安装包。每次换新版本都要重做第一步;手机上已经放好的资源档案不用动。改写器产物没有换代(仍是 r44)。用 Xcode 构建的,拉取 main 后重新构建。
装错包、设备不支持时不再闪退
- 直接装了壳本身(或用不同版本拼成的包),原先拷完资源档案启动就闪退,日志里是
FATAL open …/main.fixups.tsv(#40)。现在 App 启动时照壳自带的清单核对安装包:缺东西、或者是拼起来的,就弹框「这个安装包还不能玩」,写明缺什么、该回到第一步。 - 图形芯片不支持 Metal 3 的设备(A13 及更早,包括 2020 年的 iPad Pro A12Z)启动时直接提示「这台设备玩不了」,不再走到后面才闪退(#41)。见下面的设备说明。
- 重签过的包在还没放资源时打开(用自己的 Apple ID 或自签工具签的),不再在苹果的后台资源服务里闪退,直接停在「把资源拷进来」的说明页。
- 资源校验改成在游戏启动前只做一次;中途资源被挪走,会回到资源页,不闪退。
重场景更流畅
把游戏的图形命令翻译成 Metal 的工作挪到了单独的线程上,和游戏下一帧的逻辑同时进行,不再互相等。重场景(怪多、特效多)掉帧比上一版少约三分之一:在我们的测试机 iPhone 17 Pro Max 上、同一个大秘境场景里,每 300 帧掉帧的中位数从 85 降到 56。重场景仍会明显掉帧,还在继续优化;普通场景不掉帧(每 300 帧中位 0)。
其他修正
- 暂停菜单开着切出去也能存上盘。 原先暂停时切到后台存不了盘(暂停时游戏不往下走),上次自动存盘以来的进度,App 在后台被系统收掉就会丢。现在会让游戏短暂走一下、存完盘再恢复暂停。Mac 版退出走同一条路。
- 宽屏 iPhone(15 Pro / 16 Pro / 17 Pro Max 等 2.17:1 屏幕): 只开物品栏时,物品说明框停在面板两侧的空板上,不再贴着屏幕边。
- 编年史「查看奖励」页: 点奖励卡片之间的空处,不再穿到下面的列表(原先会在奖励页上画出金色焦点框)。
设备
首页的设备表写明了最低要求:A14 / M1 及以后的芯片。本项目的图形层要用 Metal 3,苹果从 A14 / M1 起才支持(Metal 支持的设备、Metal 功能表)。感谢 #41 的玩家,这条结论是从他反汇编级的报告查出来的。
这一版是怎么验的
两份壳都是在空的工作目录里、按普通终端的环境(UTF-8 区域、不设 DOTNET_ROOT)、开着免费账号档,从公开的代码出的;随后各自配同一份代码和另一个空的工作目录,用 d2rm_pack.py 做了一次包,写出了安装包。iOS 18 的壳读回的最低系统是 18.0,里面没有 Metal 4 的符号。在同一棵全新的代码上跑了宿主构建、单测和 4 局 Mac 冒烟(每局都经玩家路径与触摸路径进到游戏里);老接口版的 Mac App 出包并无人值守地起到进游戏。启动自检(安装包不完整、版本拼凑、不支持 Metal 3)在合入前用 iPhone 验过。