Skip to content

Releases: jhaizhou-ops/d2r-mobile

v1.0.18

Choose a tag to compare

@jhaizhou-ops jhaizhou-ops released this 17 Oct 13:11

English

Redesigned touch controls, iPhone native resolution, LiveContainer support, and a batch of community fixes. Thanks to the seven contributors credited below.

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 with d2rm_pack.py (docs/NO_XCODE.md, step 1), using the source of this same release. 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 is unchanged (r44, byte-identical before and after #55). If you build with Xcode, pull main and rebuild.

New

  • Redesigned touch controls (#74, @BossaMelon): dark socket buttons with a metal rim, an arc-shaped skill fan moved slightly toward the lower right, and a brighter rim on empty skill slots so they stay visible on bright ground. The I / II skill-set switch sits next to the portal by default and can be moved above the skills on the Custom settings page; it now switches when you lift your finger, and sliding off cancels. On iPad, control scaling is limited to 1.0–1.15x.
  • iPhone runs at native resolution (#73, @BossaMelon): the app declares a launch screen, so iPhones no longer run it in the old-size compatibility mode.
  • Mac mouse (#65, @BossaMelon): a world click picks on mouse-down instead of on release, and held movement follows the cursor every 30 Hz tick, removing the 300 ms start delay and 200 ms steering interval.
  • LiveContainer (#76, @kaskabayev): Guest.framework/Guest now carries a reserved code-signature area, so LiveContainer's on-device signer can sign it and the game starts.

Fixes

  • Minimap (#64, @dormonbear): no longer disappears after UI rebuilds and input-mode switches.
  • Nintendo controllers (from #58 by @Kamisorara, Issue #57): A/B and X/Y were swapped on Switch Pro and Joy-Con. Face buttons now follow the letter printed on the keycap; Xbox and PlayStation controllers behave as before.
  • Mac apps built in CI (#60): no more solid pink-purple screen. The shader step copied reflection files with a shell glob that overflowed in deep paths; it now copies by directory and fails the build if any library lacks its reflection.
  • Startup on some devices: the guest address reservation steps down from 5120 MiB to 4864 MiB when the device refuses the larger size, instead of exiting.
  • Rendering and loading (#68, #66, @SepheTT): buffer/texture copies honor the image stride the game sets; unresolved weak imports stay null so the game can detect optional functions that are absent.
  • Apple TV (#56, @yinqingyan): the settings divider no longer crosses the next row.

Other

  • The rewriter's x18 scan pre-filters register fields (#55, @n3crosis), so rewriting is faster; the output is byte-identical.
  • A magenta-screen probe (on by default) records full-picture magenta frames under heavy load in the diagnostic log, to help track down that report.
  • README: devices with 4 GB of RAM now start and run, with very tight memory (tested on an iPad mini 6).

How this release was checked

  • Community changes: each pull request was moved into our main branch with its author credited, and for every file the code changes on main were compared with the pull request's own changes after stripping comments: no differences. Host, graphics and iOS unit tests passed.
  • Merges: every merge passed the full host checks (accept --full). Changes to the iOS app were smoke-tested on an iPhone 17 Pro Max (three launches into the game each, plus an in-game and pause-menu run) and on a Mac.
  • Rewriter (#55): all nine rewritten module images (three rule sets × three modules) are byte-identical before and after the change.
  • Guest signature (#76): deterministic output; only the file header and __LINKEDIT change. Apple codesign reads the signature and re-signs Guest to the same size as before. AltStore's signer (ldid from AltSign) signs it ad hoc and with a certificate, and every page hash matches (16,993 pages, SHA-1 and SHA-256). Sideloadly's signer was not tested.
  • Shells: Both shells were built from the public tree in an empty working directory, and each one, used in another fresh working directory, wrote a complete install package (128 MB and 129 MB, 14,343 files). The iOS 18 shell reads back minimum system 18.0 with no Metal 4 symbols; the default shell reads back 26.0.

中文

触控按键重做、iPhone 原生分辨率、支持 LiveContainer,以及一批社区修复。感谢下面署名的七位贡献者。

附件 给谁
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,#55 前后逐字节相同)。用 Xcode 构建的,拉 main 重新构建即可。

新增

  • 触控按键重做(#74,@BossaMelon):按键换成黑灰内槽加金属边,右侧技能区改成弧形、整体往右下挪了一点;空技能槽的细边提亮,在亮的地面上也看得见。「Ⅰ / Ⅱ」换组键缺省放在传送门旁,可以在设置「自定义」页挪到技能区上方;改成松手才换组,手指滑出去就取消。iPad 上控件缩放限制在 1.0–1.15 倍。
  • iPhone 按原生分辨率运行(#73,@BossaMelon):App 声明了启动屏,iPhone 不再以旧尺寸兼容模式运行。
  • Mac 鼠标(#65,@BossaMelon):点世界在按下时就生效,不用等松手;按住移动每 30 Hz 一拍跟着光标走,去掉了起步 300 毫秒、转向 200 毫秒的延迟。
  • LiveContainer(#76,@kaskabayev):Guest.framework/Guest 里预留了代码签名区,LiveContainer 在设备上就能给它签名,游戏能正常启动。

修复

  • 小地图(#64,@dormonbear):界面重建、切换输入方式之后不再消失。
  • 任天堂手柄(思路来自 @Kamisorara 的 #58,Issue #57):Switch Pro 和 Joy-Con 上 A/B、X/Y 是反的。现在面键按键帽上印的字母对应;Xbox、PlayStation 手柄不变。
  • CI 出的 Mac App(#60):不再整屏粉紫。着色器那一步用通配符拷反射文件,路径深时参数超长、一个都没拷上;现在按目录拷,并且缺反射文件的库会让构建直接失败。
  • 部分设备启动: 设备拒绝预留 5120 MiB 地址空间时,自动降到 4864 MiB 再试,不再直接退出。
  • 画面与加载(#68、#66,@SepheTT):缓冲区和贴图互拷按游戏给的图像行距走;没解析到的弱导入保持空指针,游戏能正确判断可选函数不存在。
  • Apple TV(#56,@yinqingyan):设置页的横线不再穿过下一行文字。

其他

  • 改写器的 x18 扫描先按寄存器字段过滤(#55,@n3crosis),改写更快,产物逐字节相同。
  • 紫屏探针(缺省开):重负载下整幅画面变品红时会记进诊断日志,便于定位这类反馈。
  • 首页设备表:4 GB 内存的设备能进游戏了,内存仍很紧(iPad mini 6 实测)。

这一版是怎么验的

  • 社区改动: 每个合并请求都搬进了我们的主干并署上作者;逐个文件剥掉注释后,比对主干上的代码改动与合并请求本身的改动:没有差异。宿主、图形、iOS 单元测试全过。
  • 合入: 每次合入都过了宿主全套检查(accept --full)。动到 iOS App 的改动都在 iPhone 17 Pro Max 上冒烟(每次三局启动进游戏,加一局局内与暂停菜单),也在 Mac 上跑过。
  • 改写器(#55): 改动前后,三套规则 × 三个模块共九个改写后的模块映像逐字节相同。
  • Guest 签名(#76): 生成结果确定;只有文件头和 __LINKEDIT 变化。苹果 codesign 能读出签名,重签后大小与改动前相同。AltStore 用的签名器(AltSign 里的 ldid)不带证书、带证书各签一次,每一页的哈希都对得上(16993 页,SHA-1 与 SHA-256)。Sideloadly 的签名器没有实测。
  • 壳: 两份壳都是在空的工作目录里从公开的代码出的;再各自放到另一个全新的工作目录里做包,都写出了完整的安装包(128 MB、129 MB,14343 个文件)。iOS 18 的壳读回的最低系统是 18.0、没有 Metal 4 符号;缺省的壳读回 26.0。

v1.0.17

Choose a tag to compare

@jhaizhou-ops jhaizhou-ops released this 15 Oct 15:28

A newer shell is available: v1.0.18. The shell and the repository must be from the same version; with the current main please use v1.0.18.

已有更新的壳:v1.0.18。壳和仓库必须是同一版,配合现在的 main 请用 v1.0.18。

English

Hotfix for v1.0.16: items in the personal stash could be lost, and items returned by the iCloud shared-stash merge could be duplicated. Please update.

v1.0.16 has been withdrawn because of these issues. v1.0.17 contains everything in v1.0.16 plus the fixes below.

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 with d2rm_pack.py (docs/NO_XCODE.md, step 1), using the source of this same release. 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.

Fixes

  • Personal stash pages 2–5: after turning a page, the game checks that the save it is about to write was made after the turn before it records the page. If an item from the page you turned away from also existed somewhere else in your saves (for example a copy made by the iCloud merge issue below), this check never passed. Save and Exit, or closing the game, then lost that page. The check now uses only facts about this character's own save. When you turn a page, the game notes exactly which save file is on disk at that moment. A later save that differs from it can only have been made after the turn. If that is not yet known, the game compares the exact items (with their positions) in the stash grid. Copies elsewhere, and changes to the system clock, no longer matter. Every save also records a page turn that is still in progress, so the next start settles it the same way. Killing the game at any moment no longer loses or duplicates a page.
  • Personal stash: when starting a game, an item whose data matched an item elsewhere in your saves was removed from pages 2–5. Two items can legitimately match, so nothing is removed any more.
  • iCloud shared-stash merge (new in v1.0.16): an item returned to your inventory was only marked as done once it was seen in that character's save. If you moved it into the shared stash, personal stash pages 2–5 or the Chronicle vault before the next save, it was returned again every time you entered the game. Now an item counts as returned once it is found in any of your save files, or once the game has saved again after returning it. Items that are already in your saves are skipped when the game starts.

Items already lost or duplicated under v1.0.16 are not changed by this update.

How this release was checked

  • Personal stash, killed at any moment: 29 scripted runs on Mac, each set to kill the game right before one of the first five saves after a page turn (when the turn had already settled before that save, the run simply continued), then restarted; one run per case was repeated on the final build. They covered a full page (90 items) turned to an empty page and back, a copy of every item placed elsewhere in the saves, turning to a full page and taking everything out before the first save, and the system clock set back an hour or forward and back again. Every run came back with no item lost and none duplicated. The same cases also reproduce the original loss on v1.0.16 (90 items → 0).
  • iCloud merge: with items left on the to-do list that were already in the saves, nothing was returned twice (v1.0.16 returned each one again). Killing the game at each of the four steps of returning items and gold, then restarting, left every item exactly once and the gold added once.
  • The full host checks, the unit tests and three Mac smoke runs passed on the merged tree. Both shells were built from the public tree in an empty working directory and each wrote a complete install package (128 MB, 14,342 files); the iOS 18 shell reads back a minimum system of 18.0 and contains no Metal 4 symbols.

中文

v1.0.16 的热修:个人仓库里的物品可能丢失,iCloud 共享仓库并回还进背包的物品可能重复。请更新。

v1.0.16 因为这些问题已撤回。v1.0.17 包含 v1.0.16 的全部内容,外加下面的修复。

附件 给谁
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 后重新构建。

修复

  • 个人仓库第 2–5 页: 翻页后,游戏要先确认即将写入的存档是在翻页之后生成的,才会记下这一页。如果翻走那一页里的某件物品,在存档别处还有同样的一份(例如下面 iCloud 并回问题复制出来的),这一步就一直确认不了。这时保存并退出或关掉游戏,那一页就丢了。现在只看本角色存档自己的事实来确认:翻页那一刻记下磁盘上是哪一份角色存档,之后写出的存档只要和它不同,就一定是翻页后生成的;还确认不了时,再把储藏箱格子里的物品(连同位置)逐件比对。别处有没有复制品、系统时间有没有改过,都不再有影响。每次存档还会连同「还没确认完的翻页」一起记下,下次进游戏按同样的方法落定。任何时刻杀掉游戏,都不会再丢页或重复。
  • 个人仓库: 进游戏时,第 2–5 页里和存档别处数据相同的物品会被删掉。两件物品数据相同是可能的,现在一件都不删。
  • iCloud 共享仓库并回(v1.0.16 新增): 还进背包的物品,只有在该角色的存档里看到才算还完。如果在下一次存盘前把它挪进共享仓库、个人仓库第 2–5 页或编年史仓库,之后每次进游戏都会再还一份。现在只要在任一存档文件里找到它,或还回之后游戏已经重新存过档,就算还完;进游戏时已经在存档里的物品直接跳过。

在 v1.0.16 下已经丢失或重复的物品,这次更新不会改动。

这一版是怎么验的

  • 个人仓库,任何时刻被杀: 在 Mac 上跑了 29 局,每局设定在翻页后前 5 次存档中的某一次之前杀掉游戏(翻页在那次存档之前已经落定的,就照常跑下去),再重新进入;最终版本上每种情况又各跑了一局。覆盖的情况:满页(90 件)翻到空页再翻回;每件物品在存档别处都放一份复制品;翻到满页后、第一次存档之前把东西全拿走;系统时间往回拨 1 小时、往后拨再拨回。每一局都没有丢件,也没有重复。同样的情况在 v1.0.16 上能复现原来的丢失(90 件变 0 件)。
  • iCloud 并回: 清单里留着已经在存档里的物品,不会再还一次(v1.0.16 会每件再还一份)。在还物品、加金币的四个步骤上分别杀掉游戏再进入,每件物品都只有一份,金币只加一次。
  • 合入后的代码上:宿主全套检查、单元测试、3 局 Mac 冒烟全过。两份壳都是在空的工作目录里从公开的代码出的,各自写出了完整的安装包(128 MB,14342 个文件);iOS 18 的壳读回的最低系统是 18.0,里面没有 Metal 4 的符号。

v1.0.16

Choose a tag to compare

@jhaizhou-ops jhaizhou-ops released this 15 Oct 11:00

A newer shell is available: v1.0.18. The shell and the repository must be from the same version; with the current main please use v1.0.18.

已有更新的壳:v1.0.18。壳和仓库必须是同一版,配合现在的 main 请用 v1.0.18。

Withdrawn — please update to v1.0.17. This release has two save defects: a personal stash page (pages 2–5) could be lost, most likely after the iCloud merge had made duplicate items or when the game was closed right after turning a page; and items returned by the iCloud shared-stash merge could come back again on every launch. v1.0.17 fixes both and contains everything in this release.

已撤回,请更新到 v1.0.17。 本版有两处存档缺陷:个人仓库第 2–5 页可能整页丢失(iCloud 并回复制出重复物品之后,或刚翻完页就关掉游戏时最容易遇到);iCloud 共享仓库并回还进背包的物品,之后每次进游戏可能再还一次。v1.0.17 修复了这两处,并包含本版的全部内容。

English

Greater Rifts are lighter and steadier, iPhone no longer freezes after a volume button press, and a new 3D Quality setting lets the game lower the 3D resolution on its own when frames keep dropping.

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 with d2rm_pack.py (docs/NO_XCODE.md, step 1), using the source of this same release. 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.

Greater Rifts

  • Monster density and the number of elite groups are about half of before, to hold 60 fps; the progress needed to clear a Rift is halved to match (250 → 125). Per-level life / damage multipliers, drops and the brawl rules from level 90 are unchanged.
  • Fixed: a Guardian wave could spawn in town while you were there, so the Rift could not continue. While you are in town the next wave now waits and spawns when you return to the Rift level. Thanks to hubeiqiao for PR #45 (#44).
  • Invading bosses only spawn where you can walk, not in a passage behind a wall.

Fixes

  • iPhone: after pressing a volume button the picture could freeze (it looked like a black screen or a crash). When the display refresh stops for more than 0.5 s, the game now presents frames itself and switches back afterwards.
  • Switching between gamepad and touch layout (on Mac: switching key labels or language) while the belt auto-refill was running could crash. Fixed.
  • After dragging the Horadric Cube onto the stash, the panel closed as soon as it opened. Fixed.
  • While talking to an NPC, the bottom bar disappeared and the D-pad slot showed the Chinese word for "Functions" (in English too). Fixed: with a dialogue menu or speech box open, the bottom bar keeps showing life / mana numbers and the experience bar.
  • With the primary skill empty, tapping "+" on the main attack button now opens the skill picker.
  • Notice docking: it never worked on Mac, and on iOS it stopped working after Save and Exit and re-entering. Both fixed; notices also move aside while an item description is open.
  • Graphics: copies recorded in one batch could run out of order. Fixed.

Sound

  • For the report of audio gaps while moving (iPhone 15 Pro Max), the audio buffer-release thread now runs at interactive priority. On our iPhone 17 Pro Max, walking for 240 seconds and alternating the old and new settings (7 segments each), wake-ups later than 2 ms went from 16 to 0. Thanks to dormonbear for PR #52. Our test phones did not reproduce the gaps; if you still hear them, please tell us on GitHub.

Picture and frame rate

  • New setting Custom → 3D Quality:
    • Smoothness first (default): when frames keep dropping, the 3D render scale goes down, and back up once things are stable.
    • Quality first: never lowers it.
  • Mac: the frame rate follows the refresh rate of the screen the window is on — 72 fps on a 144 Hz screen, still 60 fps on 60 / 120 Hz screens.
  • Performance:
    • In heavy scenes the translation work per frame is about 15% lower (iPhone 17 Pro Max, Greater Rift level 75 with a pulled crowd: 16.96 M → 14.40 M cycles per frame, independent of CPU frequency).
    • When the phone is hot and the system limits power, Smoothness first lowers the 3D render scale on its own: on the same phone under the same power limit, dropped frames after warm-up went from 23% to 10%.

Mac

  • The game data folder can be chosen either way: the data root (containing a data folder), or the folder that directly holds the .data files and build_manifest.psv.
  • When the wrong folder is chosen, Chinese folder names now show correctly in the message.
  • When the window is fully covered by another window, no frames are presented; they resume as soon as it is visible. The game keeps running.

iCloud shared stash

  • When the shared stash forked between two devices, merging back is more complete: items and gold that only this device had are returned to your inventory while the stash is open (if they do not fit you are told, and the rest comes next time you open it); extra Chronicle vault items come back too, and Chronicle entries take the union of both sides.

Community contributions

  • hubeiqiao: PR #45 (Guardian wave in town) and PR #51 (minimap / level-change / object-interaction diagnostics, to track down #47 and #49).
  • dormonbear: PR #52 (audio thread priority).
  • yinqingyan: community port to Apple TV 4K (3rd generation, A15), developer preview: it reached the character-selection screen on the author's device. It is in the source and can be built yourself; this release has no Apple TV package.

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. Both wrote a complete install package (129 MB, 14,342 files). The iOS 18 shell reads back a minimum system of 18.0 and contains no Metal 4 symbols. On a fresh tree: the host build, the three unit-test suites and four Mac smoke runs (each into a game through both the player path and the touch path, no red lines); the older-API Mac App was built (minimum macOS 15.0, no Metal 4 symbols, no game-derived files in the bundle) and started unattended into a game with no red lines. The volume-button fix passed a device smoke test on an iPhone 17 Pro Max before it was merged; the performance and audio numbers above come from the same phone.


中文

秘境更轻、更稳;iPhone 按音量键后不再定格;新增「3D 画质」设置,持续掉帧时游戏会自己降 3D 分辨率。

附件 给谁
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 后重新构建。

秘境

  • 怪物密度和精英组数各下调约一半,为了保 60 帧;通关所需进度同步下调一半(250 → 125)。按层的生命 / 伤害倍率、掉落、90 层起的大乱斗规则都不变。
  • 修复:人在城里时秘境守护者会刷进城里、导致秘境没法继续。现在人在城里时下一波先等着,回到本场秘境再刷。感谢 hubeiqiao 的 PR #45(#44)。
  • 闯入首领只会刷在你走得到的地方,不会再刷进墙后另一条通道。

修复

  • iPhone 上按音量键之后画面可能定住,看起来像黑屏或闪退。现在显示刷新停了 0.5 秒以上,就改由游戏自己出图,画面不再定住,之后自动换回系统刷新。
  • 腰带一键补药进行中切换手柄 / 触屏布局(Mac 上换键帽、切语言)会闪退,已修复。
  • 拿着赫拉迪姆方块往储藏箱拖之后,面板一开就被关,已修复。
  • 和 NPC 对话时底栏消失、十字位显示中文「功能」(英文界面也是),已修复:对话菜单 / 说话框开着时,底栏照常显示生命 / 法力数值和经验条。
  • 主技能置空后,点右下主攻击大钮上的「+」能弹出选技能了。
  • 提示框停靠:Mac 上从未生效、iOS 保存并退出再进局后失效,均已修复;物品说明框开着时,提示框会让开。
  • 图形:同一批录制的显存拷贝可能不按顺序执行,已修复。

声音

  • 针对 iPhone 15 Pro Max 移动时断音的反馈,音频缓冲释放线程改为交互级优先级。在我们的 iPhone 17 Pro Max 上推摇杆走动 240 秒、新旧设置交替各 7 段,叫醒延迟超过 2 毫秒的次数从 16 次降到 0 次。感谢 dormonbear 的 PR #52。我们的测试机没有复现断音,如果你还遇到,请在 GitHub 上告诉我们。

画质与帧率

  • 新设置 自定义 → 3D 画质:
    • 流畅优先(缺省):持续掉帧时自动降低 3D 渲染比例,稳定后再升回来;
    • 画质优先:不自动降。
  • Mac:帧率按窗口所在屏幕的刷新率取档,144 Hz 屏为 72 帧,60 / 120 Hz 屏仍为 60 帧。
  • 性能:
    • 重场景每帧的翻译工作量减少约 15%(iPhone 17 Pro Max,秘境 75 层拉怪,每帧翻译周期 16.96M → 14.40M,与 CPU 频率无关)。
    • 手机发热、系统限制功耗时,「流畅优先」会自动降低 3D 渲染比例:同一台机器在同样的功耗限制下,热机后的掉帧率从 23% 降到 10%。

Mac

  • 选资源文件夹两种摆法都认:选资源根(里面有 data 文件夹),或者选直接装着各个 .data 和 build_manifest.psv 的那一层。
  • 选错文件夹时,提示框里的中文文件夹名不再显示为空。
  • 窗口被别的窗口整个盖住时不再出图,露出来照常;游戏照常运行。

iCloud 共享仓库

  • 共享仓库在两台设备之间分叉时,并回更完整:本机那份比云端多出的物品与金币,会在你开着储藏箱时还进背包(放不下会提示,下次开箱接着放);编年史仓库里本机多出的件也一并还回;编年史条目取两边的并集。

社区贡献

  • hubeiqiao:PR #45(秘境守护者回城修复)、PR #51(小地图 / 换图 / 物件交互诊断日志,用于排查 #47 / #49)。
  • dormonbear:PR #52(音频线程优先级)。
  • yinqingyan:Apple TV 4K(第三代 A15)社区移植,开发者预览:已在作者实机上到达职业选择画面,已并入源码,可自行构建(本版不提供 Apple TV 安装包)。

这一版是怎么验的

两份壳都是在空的工作目录里、按普通终端的环境(UTF-8 区域、不设 DOTNET_ROOT)、开着免费账号档,从公开的代码出的;随后各自配同一份代码和另一个空的工作目录,用 d2rm_pack.py 做了一次包,写出了安装包。两份都写出了完整的安装包(129 MB,14342 个文件)。iOS 18 的壳读回的最低系统是 18.0,里面没有 Metal 4 的符号。 在一棵全新的代码上:宿主构建、三套单测、4 局 Mac 冒烟(每局都经玩家路径与触摸路径进到游戏里,没有红行);老接口版的 Mac App 出包(最低系统 macOS 15.0、没有 Metal 4 符号、包里没有从游戏派生的文件)并无人值守起到进游戏,没有红行。音量键那笔修正合入前在 iPhone 17 Pro Max 上过了真机冒烟;上面的性能和声音数字也来自这台机器。

v1.0.15

Choose a tag to compare

@jhaizhou-ops jhaizhou-ops released this 14 Oct 20:32

A newer shell is available: v1.0.18. The shell and the repository must be from the same version; with the current main please 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.tsv in 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 验过。

v1.0.14

Choose a tag to compare

@jhaizhou-ops jhaizhou-ops released this 14 Oct 13:47

A newer shell is available: v1.0.18. The shell and the repository must be from the same version; with the current main please use v1.0.18.

已有更新的壳:v1.0.18。壳和仓库必须是同一版,配合现在的 main 请用 v1.0.18。

English

NPC speech is back on iPhone and iPad, the app holds about 0.5 GB less memory, and the Mac App now plays sound and fills 16:10 screens. This page has two shells — pick the one for your phone's system.

Asset For
D2RMobile-shell.ipa iOS 26 and later
D2RMobile-shell-ios18.ipa iOS 18 – 25

Use the shell from this page — the fixes below live in the app itself, so an older shell does not have them even with the current main. The rewriter's output generation is unchanged (r44). If you build with Xcode, pull main and rebuild.

Sound

  • NPC dialogue can be heard again. The game outputs 5.1 audio with dialogue on the centre channel. We used to hand all six channels to the system without a channel layout, and on stereo output the centre channel was dropped. The app now downmixes 5.1 to stereo itself (standard ITU-R BS.775 coefficients: centre and surrounds folded into left and right at −3 dB, LFE left out, 3 dB of headroom).

Memory

  • About 0.5 GB less memory held on every device. The game creates large graphics memory pools at start; we used to make all of them resident for the GPU, which makes the system load and pin the whole pool — including a 512 MB pool the game never touches. Pools are now made resident only when the GPU first uses them.
  • Devices with 4 GB of RAM are still not supported (see the README's device table): the game itself needs about 2.3 GB, and together with the graphics layer and the system it does not fit. Thanks to the player in #37 whose logs started this work.

Graphics layer

  • Render targets written through a format-changing view are now attached with that view's format (#36). When a game writes an RGBA8 texture through an RGBA8_SRGB view, writes and clears are now sRGB-encoded as on the Switch; presenting from an sRGB swapchain texture samples through a non-sRGB view. D2R itself does not use either path; this matters for other games built on this repository's generic parts. Thanks to seedds, who found and diagnosed it on another port and proposed the fix direction.
  • Bloom and FXAA paths that rewrite a texture slot now mark the bindings dirty. With the current defaults this never changed what is drawn; it makes correctness independent of the game re-binding first.

Mac

  • The Mac App plays sound. It used to run with the silent output meant for command-line tests. If no output device can be opened it keeps running silently instead of quitting. docs/MAC.md now says which two log lines to check when there is no sound.
  • 16:10 screens are filled. On a 16:10 MacBook the game used to stay 16:9 with bars above and below, also in full screen. In game the picture now fills the window or screen at its aspect ratio, with the interface along the bottom (centred while a large panel is open); the main menu and character select stay 16:9. External 16:9 screens are unchanged.

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. The iOS 18 shell and its package read back a minimum system of 18.0 and contain no Metal 4 symbols. On the same fresh tree: the host build, the unit-test suites and the Mac smoke run; the older-API Mac App was built and started unattended into a game.


中文

iPhone / iPad 上的 NPC 对白重新有声音了,App 少占约 0.5 GB 内存,Mac App 有声音了、16:10 屏也能铺满。本页有两份壳,按手机的系统挑一份。

附件 给谁
D2RMobile-shell.ipa iOS 26 及以上
D2RMobile-shell-ios18.ipa iOS 18 – 25

请换上本页的壳——下面的修正在 App 程序本身里,旧壳配现在的 main 也没有这些修正。改写器产物没有换代(仍是 r44)。用 Xcode 构建的,拉取 main 后重新构建。

声音

  • **NPC 对白重新听得到。**游戏输出的是 5.1 声道,对白在中置声道上。原先我们把六个声道原样交给系统、没设声道布局,在双声道输出上中置声道被丢掉了。现在由 App 自己把 5.1 混成双声道(按 ITU-R BS.775 的标准系数:中置和环绕各以 −3 dB 并入左右,低频不并入,整体留 3 dB 余量)。

内存

  • **所有机型少占约 0.5 GB 内存。**游戏开局会建几块很大的显存区;原先我们把它们全部交给 GPU 常驻,系统会把整块读进内存并锁住,连游戏从来没用过的一块 512 MB 也一样。现在只有 GPU 第一次用到某一块时才让它常驻。
  • 4 GB 内存的设备仍然不支持(见首页的设备表):游戏自己就要约 2.3 GB,加上图形层和系统的占用放不下。感谢 #37 的玩家,这项工作是从他的日志开始的。

图形层

  • 经换格式视图写入的渲染目标,现在按视图的格式挂上(#36)。游戏经 RGBA8_SRGB 视图写一张 RGBA8 贴图时,写入和清除现在和 Switch 上一样做 sRGB 编码;呈现 sRGB 格式的交换链贴图时改经非 sRGB 视图采样。D2R 本身走不到这两处,受益的是用本仓库通用部分做的其他游戏移植。感谢 seedds 在另一款游戏的移植中发现并定位了这个问题,并给出了修法方向。
  • 泛光与 FXAA 那几处直接改贴图槽的地方,现在会把绑定标为已变。在现行缺省设置下这从未改变画出来的内容;补上是为了正确性不依赖游戏恰好先重新绑定。

Mac

  • **Mac App 有声音了。**原先它走的是给命令行测试用的静音输出。打不开输出设备时,现在会静音继续运行,不再退出。docs/MAC.zh-CN.md 写明了没声音时看哪两行日志。
  • **16:10 屏铺满。**原先在 16:10 的 MacBook 上,游戏一直是 16:9、上下留黑边,全屏也一样。现在进游戏后按窗口 / 屏幕的比例铺满,界面贴底(开大面板时居中);主菜单、选角等页仍是 16:9。外接 16:9 屏不变。

这一版是怎么验的

两份壳都是在空的工作目录里、按普通终端的环境(UTF-8 区域、不设 DOTNET_ROOT)、开着免费账号档,从公开的代码出的;随后各自配同一份代码和另一个空的工作目录做了一次包,写出了安装包。iOS 18 的壳和用它做出的安装包,读回的最低系统都是 18.0,里面没有 Metal 4 的符号。在同一棵全新的代码上跑了宿主构建、单测和 Mac 冒烟;老接口版的 Mac App 出包并无人值守地起到进游戏。

v1.0.13

Choose a tag to compare

@jhaizhou-ops jhaizhou-ops released this 14 Oct 08:57

A newer shell is available: v1.0.18. The shell and the repository must be from the same version; with the current main please use v1.0.18.

已有更新的壳:v1.0.18。壳和仓库必须是同一版,配合现在的 main 请用 v1.0.18。

English

iCloud save sync no longer gets stuck when two devices played offline; system notices no longer cover the life / mana numbers or the inventory; no preset monsters in the Rift from level 90. This page has two shells — pick the one for your phone's system.

Asset For
D2RMobile-shell.ipa iOS 26 and later
D2RMobile-shell-ios18.ipa iOS 18 – 25

Replace your shell with one from this page and update the repository to this version. This round changes the rewriter's output generation (r43 → r44), so an older shell is refused by the packaging tool with the current main. If you build with Xcode, pull main, run ./setup.sh again (it redoes the program rewrite for r44) and rebuild.

iCloud save sync

iCloud save sync is available in packages signed with a paid developer account (see the README). This version handles devices that played offline:

  • Shared stash on two devices: when the shared stash in the cloud and the one on this device both have contents and differ, sync no longer stops. The cloud copy becomes the current one, and this device's copy is kept in full on the device, waiting to be merged back; you get one notice after entering a game. Merging it back in the game is the next step.
  • A device that has never synced first waits until it can see the list of saves in the cloud (or, with an empty cloud, until the network is reachable) before syncing, so a new device started without network no longer uploads its empty stash over the cloud.
  • Same character name on two devices at a new device's first sync: the cloud copy is used, this device's copy goes into the backup in full, and you get one notice naming the character.
  • iCloud's own conflict versions (two devices wrote the same file): for a character the copy the game wrote last becomes current and the others go into the backup; for the shared stash every version is kept for merging.

Greater Rifts

  • From level 90 the map's own preset monsters are no longer placed (catapults, watchers, preset packs and champions), so the run is made only of special elites, as planned in #26. Super uniques placed by the map, doors, walls, traps and NPCs stay.
  • Between two Guardian waves the top bar keeps showing the wave just finished, and moves on when the next wave appears.

System notices

  • The notice box (such as "Entering Rogue Encampment") slides in higher, above the life / mana numbers over the bottom bar instead of on top of them. With a large panel open (inventory, stash and so on) it docks at the panel's bottom frame instead, so it does not cover the inventory cells.

Mac

The Mac App now also links Apple's Network framework (used by iCloud sync); dm/tools/mac_app.sh picks this up by itself. An App you build yourself still has no iCloud save sync. docs/MAC.md is unchanged in this version.

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. The iOS 18 shell and its package read back a minimum system of 18.0 and contain no Metal 4 symbols. On the same fresh tree: the host build, the unit-test suites (including the iCloud sync cases) and the Mac smoke run; the older-API Mac App was built and started unattended into a game.


中文

两台设备各自离线玩过之后,iCloud 存档同步不再卡住;系统提示框不再压住生命 / 法力数值和背包格;秘境 90 层起不放地图自带的预设怪。本页有两份壳,按手机的系统挑一份。

附件 给谁
D2RMobile-shell.ipa iOS 26 及以上
D2RMobile-shell-ios18.ipa iOS 18 – 25

**请把壳换成本页的,并把仓库更新到这一版。**这一轮改写器的产物换了代(r43 → r44),旧壳配现在的 main 会被做包工具拒绝。用 Xcode 构建的,拉取 main,重新运行一次 ./setup.sh(它会按 r44 重做程序改写),再重新构建。

iCloud 存档同步

iCloud 存档同步只在用付费开发者账号签名的包里有(见首页)。这一版处理离线玩过的设备:

  • 两台设备的共享仓库各有内容:云端和本机的共享仓库都有东西又不一样时,同步不再停住。云端那份成为现行版,本机那份完整保存在这台设备上等待并回,进游戏后提示一次。在游戏里并回是下一步。
  • 从没同步过的设备先等能看到云端的存档列表(云端是空的就等网络通)再同步,新设备断网首启不会再把空仓库传上去盖掉云端。
  • 新设备首次同步遇到同名角色:用云端那份,本机那份完整进备份,进游戏后提示一次并写出角色名。
  • iCloud 自己的冲突版本(两台设备写了同一个文件):角色取游戏最后写的那份当现行版,其余进备份;共享仓库的每个版本都留着等并回。

大秘境

  • 90 层起不再放地图自带的预设怪(投石车、观察者、预设的怪群和冠军),整场只有特殊精英,即 #26 里定的方向。地图自带的超级独特怪、门、墙、陷阱、NPC 照旧。
  • 两波守护者之间,顶部那一条仍显示刚打完的那一波,下一波现身才跳过去。

系统提示框

  • 提示框(如「进入流亡者营地」)滑入的位置上提,停在底栏上方生命 / 法力数值的上面,不再压着数值。开着大面板(物品栏、储藏箱等)时改停在面板底边框那一带,不压背包格子。

Mac

Mac App 现在多链接苹果的 Network 框架(iCloud 同步用),dm/tools/mac_app.sh 会自己带上。自己构建的 App 仍然没有 iCloud 存档同步。docs/MAC.zh-CN.md 这一版没有变化。

这一版是怎么验的

两份壳都是在空的工作目录里、按普通终端的环境(UTF-8 区域、不设 DOTNET_ROOT)、开着免费账号档,从公开的代码出的;随后各自配同一份代码和另一个空的工作目录做了一次包,写出了安装包。iOS 18 的壳和用它做出的安装包,读回的最低系统都是 18.0,里面没有 Metal 4 的符号。在同一棵全新的代码上跑了宿主构建、单测(含 iCloud 同步的用例)和 Mac 冒烟;老接口版的 Mac App 出包并无人值守地起到进游戏。

v1.0.12

Choose a tag to compare

@jhaizhou-ops jhaizhou-ops released this 14 Oct 07:17

A newer shell is available: v1.0.18. The shell and the repository must be from the same version; with the current main please use v1.0.18.

已有更新的壳:v1.0.18。壳和仓库必须是同一版,配合现在的 main 请用 v1.0.18。

English

The main part of the "special elite brawl" above Rift level 75, Guardians in waves from level 95, and a clearer asset download page. This page has two shells — pick the one for your phone's system.

Asset For
D2RMobile-shell.ipa iOS 26 and later
D2RMobile-shell-ios18.ipa iOS 18 – 25

Use the shell from this page together with this version of the repository — the shell and the repository must be from the same version. If you build with Xcode, pull main and rebuild.

Greater Rifts

  • Special elites from level 75 — the direction described in #26. The higher the level, the fewer of the game's ordinary monsters and the more named special elites (super uniques, with their original minions and skills). Drops follow the original tables, nothing added, nothing held back.

    Level Ordinary monsters kept Special elite groups per run Present at once
    75–79 80% up to 2 2
    80–84 55% up to 5 2
    85–89 30% up to 7 2
    90 and up none one after another until the Guardians appear 3

    They come one group at a time as you advance: a new group appears on open ground about 70 tiles ahead of you (off screen) when few enemies are around you. A group left far behind catches up with you. No new groups come once the Guardians appear. The pool is 43 special elites; those tied to quests, fixed places or scripts are left out.

  • Guardians in waves: levels 95–99 — Andariel first, then this run's pair; level 100 — Andariel, then a pair, then the other pair: all five act bosses. The next wave comes a few seconds after the previous one is down, with a message ("Guardian wave 2 of 3"); the top bar shows the wave and how many of it are down.

  • Level 74 and below are unchanged.

Asset download page

For builds that download the resource pack through Apple's hosted assets: after the download reaches 100% the page now says that the system is installing the pack, shows how much space is free and, if it is not enough, how much more is needed, and enters the game as soon as the system reports the pack is available — it no longer waits on a progress text that never moves. If installing takes longer than 5 minutes, or the system pauses or fails the download, the page says so and offers "Share Diagnostics" (and "Download Directly" in builds that have a download address configured; a package built from this repository has none).

Mac

The rift changes above apply on the Mac as well. docs/MAC.md is unchanged in this version.

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. The iOS 18 shell and its package read back a minimum system of 18.0 and contain no Metal 4 symbols. On the same fresh tree: the host build, the unit-test suites and the Mac smoke run; the older-API Mac App was built and started unattended into a game.


中文

75 层以上「特殊精英大乱斗」的主体、95 层起守护者分波,以及资源下载页说得更清楚。本页有两份壳,按手机的系统挑一份。

附件 给谁
D2RMobile-shell.ipa iOS 26 及以上
D2RMobile-shell-ios18.ipa iOS 18 – 25

请用本页的壳配这一版的仓库——壳和仓库必须是同一版。用 Xcode 构建的,拉取 main 后重新构建。

大秘境

  • 75 层起特殊精英——#26 里说的方向。层数越高,游戏原本的怪越少,有名有姓的特殊精英(超级独特怪,带着原版的随从和技能)越多。掉落照原版掉落表,不额外加也不额外扣。

    层 原本的怪留下 每场特殊精英组数 同时在场
    75–79 80% 最多 2 组 2 组
    80–84 55% 最多 5 组 2 组
    85–89 30% 最多 7 组 2 组
    90 及以上 没有 一组接一组,直到守护者现身 3 组

    它们跟着你的推进一组一组来:身边敌人不多时,在你前方约 70 格(屏幕外)的空地出现一组;被你甩在远处的组会追上来;守护者现身后不再来新的。一共 43 位特殊精英轮着出,和任务、固定场地、剧情脚本绑在一起的不在里面。

  • 守护者分波:95–99 层先出安达利尔,再出本场那一对;100 层安达利尔 → 一对 → 另一对,五位幕首领全部登场。上一波倒下几秒后下一波现身,并有提示(「守护者第 2 波现身(共 3 波)」);顶部那一条写第几波、这一波倒下几位。

  • 74 层及以下不变。

资源下载页

用苹果托管资源包下载资源的包:下载到 100% 之后,页面改为说明「系统正在安装资源包」,写出本机可用空间,不够时写清还差多少;系统一报资源包可用就进游戏,不再停在不动的进度字上。安装超过 5 分钟、或系统暂停 / 报错时,页面写明情况并给「分享诊断日志」(配了下载地址的包另给「改用直接下载」;照本仓库出的包没有配)。

Mac

上面的秘境改动在 Mac 上同样生效。docs/MAC.zh-CN.md 这一版没有变化。

这一版是怎么验的

两份壳都是在空的工作目录里、按普通终端的环境(UTF-8 区域、不设 DOTNET_ROOT)、开着免费账号档,从公开的代码出的;随后各自配同一份代码和另一个空的工作目录做了一次包,写出了安装包。iOS 18 的壳和用它做出的安装包,读回的最低系统都是 18.0,里面没有 Metal 4 的符号。在同一棵全新的代码上跑了宿主构建、单测和 Mac 冒烟;老接口版的 Mac App 出包并无人值守地起到进游戏。

v1.0.11

Choose a tag to compare

@jhaizhou-ops jhaizhou-ops released this 14 Oct 05:47

A newer shell is available: v1.0.18. The shell and the repository must be from the same version; with the current main please use v1.0.18.

已有更新的壳:v1.0.18。壳和仓库必须是同一版,配合现在的 main 请用 v1.0.18。

English

The second segment of the content above Rift level 75, and two touch improvements. This page has two shells — pick the one for your phone's system.

Asset For
D2RMobile-shell.ipa iOS 26 and later
D2RMobile-shell-ios18.ipa iOS 18 – 25

Replace your shell with one from this page and update the repository to this version. This round changes the rewriter's output generation (r42 → r43), so an older shell is refused by the packaging tool with the current main. If you build with Xcode, pull main, run ./setup.sh again (it redoes the program rewrite for r43) and rebuild.

Greater Rifts

  • Invading bosses from level 80 — the second segment of the plan in #26. At a random point of progress one of the act bosses (Duriel, Mephisto, Diablo or Baal, possibly the same one as a Guardian of this run) breaks in, about 36 tiles away, with a warning about 3 seconds before. From level 90 there are two per run. Fight it or go around it: killing one gives an extra slice of progress (the progress requirement is raised to match), and it drops loot from its own original table — nothing added, nothing held back. When the Guardians appear, an invading boss still around leaves the field; after that it gives no progress.
  • The top bar counts the Guardians: with two, the second line reads "Slay the Rift Guardians (1/2)"; in overtime it is merged into one sentence with the overtime notice.
  • Units summoned by a boss (Baal's tentacles and clone) keep their original strength above level 75 instead of being scaled with the level, so they no longer pile up into a wall.

Touch

  • The floating left stick no longer starts walking when you touch down near the edge. Direction and speed are now always measured from where your thumb landed, not from the drawn base (which is pushed inwards near the corner only so that it stays on screen).
  • Item descriptions move out of the way: with only the inventory open, a long description (uniques, runewords) is placed in the empty band beside the panel instead of over the belt and the middle of the inventory.

Mac

The rift changes above apply on the Mac as well; they have not yet been through a test-group Mac build. docs/MAC.md is unchanged in this version.

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. The iOS 18 shell and its package read back a minimum system of 18.0 and contain no Metal 4 symbols. On the same fresh tree: the host build, the three unit-test suites and the Mac smoke run; the older-API Mac App was built and started unattended into a game. The same source, as our test-group build, passed a smoke run on a phone. The shells on this page themselves have not been installed on a device by us.


中文

75 层以上新内容的第二段,以及两处触屏改进。本页有两份壳,按手机的系统挑一份。

附件 给谁
D2RMobile-shell.ipa iOS 26 及以上
D2RMobile-shell-ios18.ipa iOS 18 – 25

**请把壳换成本页的,并把仓库更新到这一版。**这一轮改写器的产物换了代(r42 → r43),旧壳配现在的 main 会被做包工具拒绝。用 Xcode 构建的,拉取 main,重新运行一次 ./setup.sh(它会按 r43 重做程序改写),再重新构建。

大秘境

  • 80 层起途中闯入首领——#26 方案的第二段。推进到一个随机的进度点时,一位幕首领(督瑞尔、墨菲斯托、迪亚波罗、巴尔之一,可能和本场的守护者是同一位)会在离你三十多格的地方闯进来,提前约 3 秒有提示;90 层起每场两位。可以打,也可以绕开:打掉另给一截进度(进度需求同步上调),掉落照它自己的原版掉落表,不额外加也不额外扣。守护者现身时还在场的闯入首领会退场,之后不再给进度。
  • 顶部那一条会数守护者:两位时第二行写「击败守护者(1/2)」;超时时和「已超时」合成一句。
  • 首领自己召出来的单位(巴尔的触手和分身)75 层以上保持原版强度,不再按层放大,不会越堆越多变成一堵墙。

触屏

  • **浮动左摇杆贴边落指不再一落下就走。**方向和速度现在一律按「手指相对落下那一点」来算,不再按画出来的底盘圆心算(底盘在角落时只是为了整圈画在屏内往里挪了一点)。
  • 物品说明会让开:只开着物品栏时,长说明(暗金、符文之语)放到面板旁边的空带里,不再盖住腰带和背包中间几列。

Mac

上面那几处秘境改动在 Mac 上同样生效,还没随内测的 Mac 包走过一轮。docs/MAC.zh-CN.md 这一版没有变化。

这一版是怎么验的

两份壳都是在空的工作目录里、按普通终端的环境(UTF-8 区域、不设 DOTNET_ROOT)、开着免费账号档,从公开的代码出的;随后各自配同一份代码和另一个空的工作目录做了一次包,写出了安装包。iOS 18 的壳和用它做出的安装包,读回的最低系统都是 18.0,里面没有 Metal 4 的符号。在同一棵全新的代码上跑了宿主构建、三套单测和 Mac 冒烟;老接口版的 Mac App 出包并无人值守地起到进游戏。同一份源码出的内测包在手机上过了冒烟。本页的两份壳本身我们还没有装到真机上。

v1.0.10

Choose a tag to compare

@jhaizhou-ops jhaizhou-ops released this 14 Oct 02:35

A newer shell is available: v1.0.18. The shell and the repository must be from the same version; with the current main please use v1.0.18.

已有更新的壳:v1.0.18。壳和仓库必须是同一版,配合现在的 main 请用 v1.0.18。

English

The first piece of new content above Rift level 75, two more fixes from player reports, and a batch of mouse work on the Mac. This page has two shells — pick the one for your phone's system.

Asset For
D2RMobile-shell.ipa iOS 26 and later
D2RMobile-shell-ios18.ipa iOS 18 – 25

If you use the no-Xcode route, replace your shell with one from this page and update the repository to this version. If you build with Xcode, pull main and rebuild.

Greater Rifts

  • Two Guardians from level 75 — the first segment of the plan discussed in #26. When progress is full, two different act bosses appear; both must fall for the level to count. Each one's life is scaled so that the fight's total rises smoothly (about 1.16 times the level-74 single Guardian at level 75) and no single boss exceeds the life limit any more. Level 74 and below are unchanged. The numbers are still being tuned.
  • Overtime is now spelled out (#33). When the 15 minutes run out before the Guardian falls, the run continues as before — the Guardian still drops loot, the level just does not count. The top bar now keeps saying "Overtime: drops, no clear" instead of only a red 0:00, and the town entrance menu is titled "Time's Up". Reported with a clear direction by Joe Hu (@hubeiqiao); the public commit credits him as co-author.
  • The rift page has a single close button at the top right: the gold X on touch, the original red frame with gamepad or mouse.
  • One log line per run at completion (kills, life total, damage taken, nearby enemy count) — a measuring tool for the content above level 75; it changes no gameplay.

Touch

  • Item descriptions stay open (#32). Tapping an item used to show its description for about three seconds: we moved the cursor aside after that so it would not cover the tabs, and the description went with it. A plain tap now keeps it up until you tap elsewhere, tap another item, or close the panel. After a drag or a use the cursor is still put away after about three seconds. Tap again to compare, double tap to use, long press and drag are unchanged.

Mac

  • Click a monster to attack: a left click uses whatever is bound to the main attack key on it; hold to keep attacking and chasing.
  • Items take the mouse: click for the description, double click to use / equip / buy, drag to move, equip, stash, buy or sell, with the item right under the pointer.
  • Key caps inside buttons on the rift pages and the character-creation mode page now follow keyboard / gamepad like the rest.
  • Help → Share Log… packs the two logs and a version file into an archive you save where you like; nothing is uploaded and no saves are included.
  • Update check: the program can look for a newer version at launch, but only when the package was built with an address to ask. An App you build from this repository has none, so it does not go online.
  • Still unverified or missing: ranged classes clicking monsters, the trove's auto-placement under mouse drags, the Share Log menu item and save panel operated by a person, right-click skills. docs/MAC.md is updated to match.

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. The iOS 18 shell and its package read back a minimum system of 18.0 and contain no Metal 4 symbols. On the same fresh tree: the host build, the three unit-test suites and the Mac smoke run; the older-API Mac App was built and started unattended into a game. The same source, as our test-group build, passed a launch smoke run on a phone (start, main menu, enter a game). The shells on this page themselves have not been installed on a device by us.


中文

75 层以上新内容的第一段、又两处来自玩家报告的修正,以及 Mac 上一批鼠标相关的改进。本页有两份壳,按手机的系统挑一份。

附件 给谁
D2RMobile-shell.ipa iOS 26 及以上
D2RMobile-shell-ios18.ipa iOS 18 – 25

**走「不用 Xcode」那条路的,请把壳换成本页的,并把仓库更新到这一版。**用 Xcode 构建的,拉取 main 重新构建即可。

大秘境

  • 75 层起两位守护者——#26 里讨论的那份方案的第一段。进度满时出现两位不同的幕首领,两位都倒下才算通关。每位的生命按系数缩放,让守护者战的总量平滑上升(75 层约是 74 层单守护者的 1.16 倍),任何一位都不再超过生命上限。74 层及以下不变。数值还在调。
  • 超时之后写清楚了(#33)。15 分钟到了但守护者还没倒时,这一场和以前一样照常继续——守护者照样掉东西,只是这一层不计通关。现在顶部那一条会一直写着「已超时:打完仍有掉落,不计通关」,不再只剩一个红色的 0:00;城里入口的菜单标题也写「超时未过关」。由 Joe Hu(@hubeiqiao) 报告并给出方向;公开仓库的提交里署了他为共同作者。
  • 秘境页右上角的关闭钮只留一个:触屏是金色的 X,手柄和鼠标是原版的红框。
  • 每场结算时在日志里记一行读数(击杀数、生命总量、承伤、身边敌人数)——给 75 层以上内容用的量具,不改玩法。

触屏

  • 物品说明点开后不再自己消失(#32)。原先点一下装备,说明只显示三秒左右:三秒后我们会把光标挪到一边,免得挡住页签,说明就跟着没了。现在单纯点一下,说明会一直在,直到点别处、点另一件或关掉面板。拖放、使用物品之后,光标仍会在约三秒后收走。再点一下比较、双击使用、长按与拖动都不变。

Mac

  • 点怪就是攻击:左键点怪,用主攻击键上绑的技能打它;按住不放会一直打、追着打。
  • 物品认鼠标:单击看说明,双击使用 / 穿上 / 购买,拖动可以换格、穿戴、进储藏箱、买和卖,物品就在光标下。
  • 按钮里的键帽:秘境页和建角模式页按钮上画的键帽,现在也和别处一样跟着键盘 / 手柄换。
  • 帮助 → 分享日志…:把两份日志和一份版本信息打成压缩包,存到你选的位置;不上传,不带存档。
  • 更新检查:程序可以在启动时看有没有新版本,但只有出包时给了查询地址才会查。从本仓库自己构建的 App 没有这个地址,所以不联网。
  • 还没验或还没有的:远程职业点怪、珍宝匣自动归位在鼠标拖放下、真人操作「分享日志」的菜单与保存面板、右键技能。docs/MAC.zh-CN.md 已同步更新。

这一版是怎么验的

两份壳都是在空的工作目录里、按普通终端的环境(UTF-8 区域、不设 DOTNET_ROOT)、开着免费账号档,从公开的代码出的;随后各自配同一份代码和另一个空的工作目录做了一次包,写出了安装包。iOS 18 的壳和用它做出的安装包,读回的最低系统都是 18.0,里面没有 Metal 4 的符号。在同一棵全新的代码上跑了宿主构建、三套单测和 Mac 冒烟;老接口版的 Mac App 出包并无人值守地起到进游戏。同一份源码出的内测包在手机上过了启动冒烟(启动、主菜单、进游戏)。本页的两份壳本身我们还没有装到真机上。

v1.0.9

Choose a tag to compare

@jhaizhou-ops jhaizhou-ops released this 13 Oct 23:02

A newer shell is available: v1.0.18. The shell and the repository must be from the same version; with the current main please use v1.0.18.

已有更新的壳:v1.0.18。壳和仓库必须是同一版,配合现在的 main 请用 v1.0.18。

English

Greater Rift fixes that came straight out of player reports. This page has two shells — pick the one for your phone's system.

Asset For
D2RMobile-shell.ipa iOS 26 and later
D2RMobile-shell-ios18.ipa iOS 18 – 25

If you use the no-Xcode route, replace your shell with one from this page and update the repository to this version. If you build with Xcode, pull main and rebuild.

Greater Rifts

  • The door to the next level now asks first (#25). After the Guardian falls, touching the door that starts the next run used to start it at once, and anything still on the ground could no longer be reached. It now opens a confirmation page: "Continue" leaves this run; closing the page (the X, gamepad B, or a tap outside) keeps you where you are, with the door and the loot untouched. The town portal is unchanged — go to town, come back through the rift entrance with "Continue", and keep picking up.
  • Getting back to a finished run is more robust (#25): the town entrance decides whether there is a run to return to by the recorded position of that run, not by whether the door object exists; and requests left over from a previous game are cleared when a new game starts. Thanks to the reporter for pointing out both.
  • "Next: Level 103" after clearing level 100 (#29): the bar at the top computed the next level by itself without the cap. It now reads the same capped value as everything else; after a timed clear of level 100 it says "Highest level cleared". Only the text was wrong — the level you actually entered, rewards and records were always capped at 100. Reported and diagnosed by Joe Hu (@hubeiqiao), who also sent a fix along the same lines; the public commit credits him as co-author.
  • Monster life at very high levels: when a monster carries a percentage life bonus, the scaled life is now clamped so that the total stays within the limit, instead of overflowing. Same rule as the minion fix in v1.0.8.
  • One message at completion instead of several, so the message box no longer falls a level behind on consecutive clears.

Mac

  • With a panel open, clicking near the top-right corner no longer switches to the full-screen map (the close X of the rift level-selection page sits inside the minimap's area-name strip).
  • The rift fixes above (minion life from v1.0.8, the confirmation page, the top bar) apply on the Mac as well. One thing to know: on the confirmation and level-selection pages the key cap drawn inside the button is still the gamepad "A" — press J or Space.
  • docs/MAC.md is updated to match.

Docs

  • docs/qa-rift-pet-life.md: a regression checklist for minion life in Greater Rifts, built from the verification matrix proposed by the reporter of #23 (co-authored). It marks which cases have been run and which have not; additions are welcome.

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. The iOS 18 shell and its package read back a minimum system of 18.0 and contain no Metal 4 symbols. On the same fresh tree: the host build, the three unit-test suites and the Mac smoke run; the older-API Mac App was built and started unattended into a game. The confirmation page was exercised on an iOS build running on a Mac in iPhone, iPad and English configurations (touch the door, cancel and pick up an item, touch again and continue), with screenshots reviewed. Neither shell has been installed on a device by us.


中文

这一版是几处直接来自玩家报告的大秘境修正。本页有两份壳,按手机的系统挑一份。

附件 给谁
D2RMobile-shell.ipa iOS 26 及以上
D2RMobile-shell-ios18.ipa iOS 18 – 25

**走「不用 Xcode」那条路的,请把壳换成本页的,并把仓库更新到这一版。**用 Xcode 构建的,拉取 main 重新构建即可。

大秘境

  • 去下一层的门,碰到时先问一句(#25)。守护者倒下后,碰一下开下一场的那扇门,原先会立刻开始,地上没捡的东西就回不去了。现在会先出一个确认页:点「继续」才离开这一场;关掉这一页(右上角 X、手柄 B、点面板外)就留在原地,门和地上的东西都不变。回城门不变——回城后从秘境入口选「继续」,回来接着捡。
  • 回到已通关的那一场更稳了(#25):城里的入口改为按「那一场记下的位置」来判断能不能回去,不再看那扇门在不在;新开一局时,上一局没被取走的请求会清掉。这两处是报告者读代码时点出来的,谢谢。
  • 100 层通关后屏上写「下次第 103 层」(#29):顶部那一条原先自己算下一层、没有封顶。现在它读的是同一个封顶后的值;100 层限时通关后显示「已通关最高层」。错的只是这行字——实际进入的层数、奖励和纪录一直是按 100 封顶的。由 Joe Hu(@hubeiqiao) 报告并定位,他还提交了同一思路的修正;公开仓库的提交里署了他为共同作者。
  • 极高层的怪物生命:怪物带百分比生命加成时,按层放大后的生命现在会截在「合计不超过上限」,不再溢出。和 v1.0.8 里随从那处是同一条规则。
  • 通关时只发一条提示,不再是好几条;连着通关时提示框不会再落后一层。

Mac

  • 面板开着时,点右上角附近不会再切到全屏地图(秘境选层页的关闭 X 正好落在小地图地名条的范围里)。
  • 上面那几处秘境修正(v1.0.8 的随从生命、确认页、顶部条)在 Mac 上同样生效。要知道的一点:确认页和选层页按钮里画的键帽还是手柄的「A」,实际按 J 或空格即可。
  • docs/MAC.zh-CN.md 已同步更新。

说明文档

  • docs/qa-rift-pet-life.zh-CN.md:大秘境随从生命的回归清单,底子是 #23 的报告者提出的验证矩阵(已署共同作者)。里面标了哪些情况跑过、哪些还没人跑,欢迎补。

这一版是怎么验的

两份壳都是在空的工作目录里、按普通终端的环境(UTF-8 区域、不设 DOTNET_ROOT)、开着免费账号档,从公开的代码出的;随后各自配同一份代码和另一个空的工作目录做了一次包,写出了安装包。iOS 18 的壳和用它做出的安装包,读回的最低系统都是 18.0,里面没有 Metal 4 的符号。在同一棵全新的代码上跑了宿主构建、三套单测和 Mac 冒烟;老接口版的 Mac App 出包并无人值守地起到进游戏。确认页是在 Mac 上跑的 iOS 包里按 iPhone、iPad、英文三种配置走的(碰门、取消后捡起一件、再碰门点继续),截图逐张看过。两份壳我们都还没有装到真机上。