这是一个纯静态的浏览器运行壳,用来加载玩家自己拥有的《Devil Connection》游戏 app.asar。
在线体验:https://lateralcircle83.github.io/DevilConnection-ModLoader-Web/
项目不包含游戏本体,也不会把游戏归档上传到服务器。浏览器只在当前页面中读取归档,并将需要的文件临时转换成浏览器可以使用的资源。
问题请QQ群:469524683 或issus,绝大部分代码为vibe coding产物,低参考价值
- 直接读取原版
app.asar,不向磁盘解包或修改归档 - 在浏览器中运行 TyranoScript 游戏
- 载入本地 DCML 模组 ASAR,并调整启用状态和覆盖顺序
- 浏览项目维护者验证过的推荐模组,并直接下载到本地
- 显示游戏必要兼容转换的检查结果及实际资源来源
- 在支持本地文件句柄的浏览器中记住核心与模组选择
- 兼容游戏需要的部分 Electron 接口
- 使用 IndexedDB 保存游戏存档
- 在管理器中查看存档,并通过原版兼容的 ZIP/SAV 导入、导出和清空游戏进度
- 提供浮动游戏面板、虚拟键盘、重新载入和退出会话
- 可选启用游戏内调试控制台(默认关闭):在“启动”页开启后在游戏菜单中显示,可注入脚本、按严重程度筛选并导出日志
- 提供独立的媒体兼容、触摸推进、APNG 媒体与 ASAR 解密打包诊断页面
- 桌面与移动浏览器自适应界面
核心归档和模组都只在内存中建立只读索引,原文件不会被修改或解包到磁盘。
你需要:
- 一份通过正规渠道购买并安装的《Devil Connection》
- 游戏安装目录中的
app.asar,通常位于resources\app.asar - 可选的 DCML 模组
.asar文件 - 较新的 Chrome、Edge 或其他 Chromium 系浏览器
- Node.js,仅在使用附带的临时静态服务器时需要
推荐使用项目附带的零依赖临时静态服务器。在 Windows、macOS 或 Linux 的项目目录中运行:
npm start该命令不需要先执行 npm install。保持终端开启,并在浏览器访问命令显示的 Local 地址;同一局域网内的设备可访问显示的 LAN 地址。Windows 用户也可以直接双击 start_server.bat,两种入口使用同一个安全白名单服务器。
如需指定其他端口:
npm start -- 8080随后点击“载入核心 ASAR”,选择自己游戏目录中的归档;按需添加、启用或排序模组,在“兼容性”页面查看转换状态,然后回到“启动”页面开始游戏。
部分浏览器允许直接打开 index.html,但使用本地 HTTP 地址通常具有更稳定的资源加载行为。
服务器仅监听当前电脑的网络接口,并只提供网页文件与推荐目录中明确列出的模组;根目录 app.asar、未列出的 ASAR、Git 数据和目录列表均不会对外提供。首次允许局域网访问时,Windows 防火墙可能询问是否允许 Node.js 通信,请仅对可信的专用网络放行。通过另一台设备打开网页时,游戏 ASAR 仍需由那台设备的浏览器自行选择,不会从服务器电脑自动传输。
游戏运行后,左上角按钮可以打开自适应浮动面板,查看当前归档信息、使用包含 Esc、F1–F12、QWERTY、修饰键、导航区和方向键的紧凑 TKL 虚拟键盘,并可重新载入或退出当前会话。虚拟键只能触发游戏页面接受的合成键盘事件,不能代替真实用户操作调用浏览器的全屏、开发者工具等受保护功能。
在“启动”页开启“启用调试控制台”后,浮动面板会额外显示合并的控制台:默认捕获游戏页面的错误、警告(开启后还包括普通信息与调试输出),可在游戏页面中直接输入脚本并查看返回值,按全部/错误/警告/信息筛选,并复制或导出日志(JSON)。错误、警告与信息各保留最近 30 条;该开关默认关闭且需在未运行游戏时调整,开启后才会增加信息级日志的采样开销。
本项目以本地保存的 DevilConnection ModLoader (Rebuild) 模组开发规范 作为 DCML 模组包格式的上游参考。模组作者应以该文档了解完整的 .asar 目录、mods.json 和桌面加载器约定;本项目只实现适合纯浏览器环境的兼容子集。
Web 版识别单个 .asar 根目录中的 mods.json、可选 hook.js、可选 config.schema.json 与 data/ 资源覆盖。mods.json 的 id、name、description、version 和 displayVersion 用于显示和稳定标识;缺少清单时仍可按文件名载入。配置沿用 plugins/config/<bareName>.json 契约,但实际保存在当前网站的 localStorage 中。
模组列表由上到下依次载入,越靠后的启用模组覆盖优先级越高;开始游戏后,本次会话的顺序固定,调整前需先退出。hook.js 是可信代码,Web 版会在游戏 iframe 的 DOMContentLoaded 后按列表顺序执行,因此模组不能依赖抢在页面脚本之前运行。同步文件兼容仅覆盖模组文本读取和配置读写,不提供通用文件系统。
桌面 Rebuild 的插件目录扫描、重命名启停、版本与依赖阻断、自动更新、远程工坊和任意磁盘写入目前不属于 Web 兼容范围。window.DCML 工坊入口须由相应模组提供,hook 应先检测接口是否存在。
“推荐模组”页面提供项目维护者确认可用的下载项,文件可能由本项目或模组作者的 GitHub 页面提供。下载不会自动载入或启用模组;下载完成后仍由用户通过“添加模组”选择本地 .asar。版本、作者和文件大小等已有信息会一并显示。
在支持 File System Access API 的 Chrome、Edge 等浏览器中,页面会记住核心归档、模组顺序和启用状态。刷新后若读取权限仍有效会自动恢复;浏览器要求重新确认权限时,点击“恢复上次选择”即可。项目只保存浏览器提供的本地文件句柄,不会把 ASAR 内容复制到 IndexedDB。移动或删除原文件、清除站点数据、更换地址或使用不支持该接口的浏览器后,需要重新选择文件。
请只载入可信来源的模组;“推荐”只表示对应版本经过验证,不会把 hook 变成沙箱。存档不会记录使用过的模组组合。
载入核心或改变模组列表后,管理器会针对最终生效的资源检查浏览器运行所必需的转换。“兼容性”页面会列出转换目标、实际来源和处理结果;若同一路径已被模组覆盖,来源会显示对应模组。
这些转换只发生在当前页面的内存中,不会写回核心或模组 ASAR,也不能在页面中关闭。当前兼容补丁无法安全应用时会保留原资源、显示警告并允许尝试启动;只有游戏身份校验、会话构建或明确声明为中止的错误才会阻止启动。“导出诊断”只包含游戏版本、已启用模组标识和转换状态,不包含本地文件路径、文件句柄、归档内容或游戏源码。
Web 壳会在 Tyrano 执行异步 jump 时暂时阻止新的剧情推进,并在引擎原有跳转回调开始时自动恢复。这样可避免触屏环境把一次物理操作送达为连续推进后,意外执行跳转标签下方的剧情;它不合并普通点击,也不改变场景文件或模组内容。
Web 壳还会保证 [bg] 背景切换和角色表情/姿态按剧本顺序落地:并发预加载即使先完成,过期请求也不会覆盖最新的背景或立绘,避免移动端黑屏闪烁后背景停留在黑底、或角色表情短暂错乱。
Web 壳还会保证一次触摸只推进一次剧情,并保持游戏自带点击特效在对话推进时正常显示;游戏画面外的点击区域照常可推进,按钮、选项与热区不受影响。
安卓 Firefox(Gecko)不会把触摸事件直接分发给 <img usemap> 热区上的 <area>,主菜单的存档/读档/设置等按钮此前只能显示选中状态而无法进入;Web 壳会把落在热区图上的触摸映射回对应功能项,再走游戏原有的点击逻辑,Chromium 与桌面行为不变。
Firefox Android 的 PointerEvent.movementX/Y 存在上游缺陷(Bugzilla 1719915,数值异常且不随拖动方向变号),照片贴图页面的贴纸拖动会因此瞬移出画面,该页面在 Firefox Android 上支持性差;桌面 Firefox 与 Chromium 系浏览器不受影响。
移动端打开存档或读取界面时,Web 壳会隐藏游戏自带、但在网页环境中没有实际滚动效果的箭头按钮;回看界面不受影响。
移动端播放前景电影([movie_with_bg] 与 Tyrano 内置 [movie])时,Web 壳会在标签开始到视频结束之间锁定剧情推进,阻止就绪前的点击提前跳过视频;跳过或自然结束都只推进一次,后台电影([bgmovie])保持原有时序。
针对 Safari 与 iOS 浏览器,Web 壳会关闭旧版 Tyrano 按浏览器标识把 .ogg 改写为 .m4a 的逻辑,直接使用归档中实际存在的 OGG 音频;现代 Safari/iOS 可直接播放 Vorbis。
Firefox 的 MSE 不支持 audio/mpeg 时,标题循环自动降级:视频保持无缝循环,标题配音改用普通音频元素播放(主段播完切循环段),音量跟随游戏设置中的 BGM 滑条并随退场淡出;退出时先断开视频元素再关闭 MediaSource,避免 Firefox 的媒体解码报错。
Firefox 桌面对键盘激活(Enter/Space)会合成无触摸信息的 mousedown,游戏自带 tap_effect 波纹的坐标读取已做防御:优先鼠标坐标、其次触摸坐标、最后回退 0,任何事件类型都不会再报 e.targetTouches is undefined。
iOS/WebKit 下,游戏的多路 WebAudio(BGM 无缝循环播放器、音效、Howler)各自持有独立的 AudioContext,脱离用户手势创建的上下文会保持挂起;Web 壳会跟踪全部 AudioContext,并在游戏内首次触摸/按键等真实手势中统一恢复,避免标题与游戏内 BGM/音效无声。
WebKit/Safari 下,标题循环视频使用 MSE segments 模式并按首帧时间戳偏移把时间轴对齐到 0(本体标题视频首帧 PTS 为 83ms,Safari 拒绝播放不以 0ms 起播的 MSE 内容,是循环视频黑屏的原因),MP3 音频保持 sequence 无间隙拼接;每次循环追加后主动回收已播放的缓冲段,避免停留标题界面时 MSE 配额耗尽导致黑屏。
WebKitGTK/WPE 等未配置 MSE 大配额的嵌入式环境(SourceBuffer 上限约 15MB,装不下 18MB 主段)会自动降级为渐进式播放:复用原视频元素,主段播完切循环段并 loop,音频走普通音频元素;退出时统一清理。
浏览器不允许带声音自动播放时(如 iOS/WebKit 的严格策略),入场与前景电影会先以静音开始播放画面,首次触摸或按键后恢复声音;游戏本身要求静音的电影保持静音。
存档默认保存在浏览器的 IndexedDB 中;如果 IndexedDB 不可用,程序会尝试使用 localStorage。页面会申请浏览器的持久存储,避免数据在磁盘紧张时被自动清理,并按 navigator.storage.estimate() 监控配额:存档页用量超过 80% 时会附加提示,超过 95% 的导入或写入会在落盘前被拒绝并说明原因,不会静默丢失。
管理器的“存档”页面会列出识别到的手动存档与自动存档,并显示完整存储条目。导出文件是 ZIP 压缩包,其中每个原版游戏存储键对应一个 .sav 文件,可用于在网页版与原版 Electron 游戏之间迁移存档。导入会覆盖压缩包中的同名存档,并保留压缩包未包含的现有数据;写入前会检查 ZIP、文件名和存档内容,并将旧式编码规范化为原版兼容格式。
可交换内容限于原版使用的 DevilConnection_* 存储键和独立的 NEO 进度键,包括手动存档、自动存档、系统变量及原版使用同一前缀写入的照片数据。网页兼容层的 file:* 虚拟文件会显示在完整明细中,但不会导出、导入或随“清空存档”删除;模组配置与本地 ASAR 文件选择同样不包含在存档包中。导入和清空前建议先导出现有存档。
浏览器会按照“协议 + 地址 + 端口”隔离数据。因此,127.0.0.1:4173、localhost:4173 和其他端口拥有不同的存档空间。建议始终使用同一个访问地址,并避免清除该站点的浏览器数据。
保存前,程序会把临时 Blob URL 还原成游戏归档中的稳定路径,所以刷新页面后仍能重新解析存档中的图片和其他资源。
模组资源也使用同一套还原规则:存档只记录 data/... 等逻辑路径,不记录会失效的 Blob URL 或模组层编号。再次读取时,该路径会按照当次启用的模组顺序重新解析。存档不会自动恢复原来的模组组合,因此更换模组后读取旧存档仍可能产生内容差异。
app.asar只由当前浏览器页面在本地读取。- 选择持久化只保存浏览器授予的文件句柄引用,不保存或上传归档内容。
- 项目没有上传接口,也不需要远程后端。
- 游戏文件不会被提取到项目目录。
- 关闭游戏会话后,页面会释放创建过的临时资源地址。
- Git 会忽略游戏本体、解包目录以及已改用外部下载的推荐包;少量经维护者确认且没有上游发行包的推荐模组会随项目提供。
请只使用自己合法拥有的游戏文件,不要分发游戏归档或解包后的资源。
本项目是非官方兼容工具,与游戏开发者、发行商及相关平台没有隶属或授权关系。游戏名称及游戏内容的权利归其各自权利人所有。
- 当前只支持《Devil Connection》原版游戏归档。
- 本地 ASAR 选择恢复依赖 File System Access API;不支持该接口的浏览器仍需在刷新后重新选择文件。
- 模组配置会保留在当前浏览器来源中,更换地址、端口或浏览器后不会自动迁移。
- 存档不会绑定或校验创建它时使用的模组组合。
- Steam 成就、原生窗口控制和 Electron 文件系统等桌面能力无法在普通网页中完整提供。
- 浏览器兼容补丁针对目前验证过的游戏结构;游戏发行版发生较大变化后,可能需要更新适配层。
安装 Node.js 并确保 node.exe 已加入 PATH,然后重新运行 start_server.bat。
确认选择的是游戏安装目录 resources 文件夹中的原版 app.asar,而不是模组 ASAR 或其他 Electron 程序的归档。
回到之前使用的主机名和端口。例如之前使用 http://127.0.0.1:4173/,就不要改用 http://localhost:4173/。
如果挂载阶段失败,页面会自动展开“加载详情”。如果游戏已经启动后停住,请在浏览器开发者工具的控制台中确认具体错误。
除另有说明,本项目原创代码以 GNU Affero General Public License v3.0(AGPL-3.0-only)发布。第三方代码与上游规范继续适用各自的许可,详见 THIRD_PARTY_NOTICES.md;游戏内容及独立发布的模组包不因收录、兼容或链接而改用本项目许可证。
维护约束与验证命令见 AGENTS.md,未完成事项见 TODO.md,已完成变更见 HISTORY.md,上游模组规范见 ModsUsage.md,第三方来源与许可证见 THIRD_PARTY_NOTICES.md。