所有的出站邮件都已被管理员全局禁用。任何类型的邮件通知都不会被发出。

使用的萌卡平台: <Mac版>

使用的YGOPro:

使用的服务器: N/A

第几回合: N/A

进行的操作: 卡组编辑器右侧的卡片列表使用鼠标滚轮或触控板向下滚动后,会出现列表又反向向上滚动的情况。

已确认的代码缺陷
macOS 的 Irrlicht 后端把 NSEvent.deltaY 转为 Wheel 并发送滚轮事件,没有过滤纵向位移为零的事件。
卡片列表原逻辑为“Wheel < 0 时向下,否则向上”,因此 Wheel 为 +0.0 或 -0.0 时也会错误向上移动一行。
这条零值事件到错误向上滚动的代码路径已经确认;未捕获用户出现问题时的原始硬件事件,所以不能认定其每次反向滚动都一定由零值事件触发。

修复内容
忽略卡片列表的零值滚轮输入,保留正常向上、向下滚动及列表边界行为。没有修改系统的自然滚动或惯性设置。

源码对照(仅示意卡片列表的方向分支)
原逻辑:
if (Wheel < 0) { 向下移动一行; }
else { 向上移动一行; }
修复后等价逻辑:
if (Wheel < 0) { 向下移动一行; }
else if (Wheel != 0) { 向上移动一行; }

本地二进制补丁仅替换 ARM64 切片的一条四字节指令:
地址:0x1000340f4
原指令:cmp w20, #1
新指令:ccmp w20, #1, #8, ne
原字节:9f 06 00 71
新字节:88 1a 41 7a
该替换利用前面的浮点比较结果,使正零、负零跳过列表移动;非零输入保留原有处理。

源码参考
卡片列表处理:gframe/deck_con.cpp,EMIE_MOUSE_WHEEL 分支。


macOS 滚轮事件:source/Irrlicht/CIrrDeviceOSX.mm,NSScrollWheel 分支。

验证结果

  1. 源逻辑离线回归:9 组场景、5,610 个输入/位置/边界组合全部通过,覆盖连续下滚或上滚后接零值、正负零、小数和边界。
  2. 原生 ARM64 指令回归:11,220 个组合全部通过,覆盖正负零、正负小数、次正规数、边界、无穷值和 NaN;确认零值不再移动,非零行为保持一致。
  3. 界面滚动验证:连续向下 6 次、向上 6 次,列表按预期方向滚动。
    离线测试验证逻辑和 CPU 指令;界面测试验证应用中的滚动表现。它们均不等同于捕获用户原始硬件事件。

我个人用ChatGPT跑的补丁,环境为- KoishiPro 1.036.2 Mesmerizer,Apple Silicon / ARM64 原生运行,目前来说已经解决了问题

— a/gframe/deck_con.cpp
+++ b/gframe/deck_con.cpp
@@ -1304,7 +1304,7 @@
if(event.MouseInput.Wheel < 0) {
if(mainGame->scrFilter->getPos() < mainGame->scrFilter->getMax())
mainGame->scrFilter->setPos(mainGame->scrFilter->getPos() + 1);

  •   	} else {
    
  •   	} else if(event.MouseInput.Wheel != 0.0f) {
      		if(mainGame->scrFilter->getPos() > 0)
      			mainGame->scrFilter->setPos(mainGame->scrFilter->getPos() - 1);
      	}

还有一个Mac版Koshipro的问题

已定位:MyCard 的“编辑”入口触发了当前 KoishiPro 内核的启动顺序缺陷。

你的 YGOPro 项目实际运行的是 KoishiPro Mesmerizer。点击“编辑”后:

  1. 程序先进入编辑器,保存禁限表的内存引用。
  2. 随后加载扩展禁限表,导致原引用失效。
  3. 绘制卡片禁限标志时访问失效内存,于是闪退。这个顺序可在启动源码禁限表加载源码中对应到。

本机 22:08 的崩溃记录恰好发生在这处查询,报错为 EXC_BAD_ACCESS / SIGSEGV。实际退出的是游戏进程,MyCard 本身仍在运行。

临时绕过方法:先单独打开 KoishiPro,再从游戏主菜单进入卡组编辑。 我已确认当前独立启动的编辑器能正常显示卡组和禁限图标;程序尚未修改。

MyCard“编辑”入口导致 KoishiPro 闪退:问题说明与临时处理

问题发生于 2026 年 9 月 6 日。环境为 macOS 26.6.2、Apple Silicon 原生 ARM64,客户端为 MyCard 内安装的 KoishiPro Mesmerizer。

一、现象与复现条件

点击 MyCard 的“编辑”按钮后,KoishiPro 在启动约 2.66 秒后退出。同一份游戏程序通过普通入口启动,再手动进入卡组编辑器,可以正常使用。

MyCard 的 macOS 卡组编辑动作使用“-d”参数直接打开编辑器。本次安装同时存在根目录 lflist.conf 与 expansions/lflist.conf;二者各包含 102 张禁限表,规则内容完全一致,仅扩展副本末尾多一个换行。

可用于定位的原始崩溃记录:ygopro-2026-09-06-220857.ips。记录显示游戏于 22:08:19.365 启动、22:08:22.028 崩溃;退出的是由 MyCard Helper 启动的 ygopro 子进程。主线程异常为 EXC_BAD_ACCESS / SIGSEGV,首帧位于 ygopro 的偏移 0x529a4。已核对安装程序的 ARM64 UUID 与该报告一致。

二、原因定位

崩溃位置是绘制卡片缩略图后、查询该卡禁限数量的步骤。反汇编显示程序读取禁限表哈希桶时使用了无效地址;当时查询的官方卡号为 43096270(紫翠玉龙)。该卡号只是触发当帧查询的数据,没有证据表明这张卡本身有问题。

KoishiPro 官方源码中存在以下启动顺序:

  1. 初始化时先读取根目录禁限表。
  2. 处理“-d”参数时,立即打开编辑器;编辑器保存当前禁限表对象的地址。
  3. 随后进入 MainLoop,才读取扩展目录。
  4. expansions/lflist.conf 中的列表被插入禁限表 vector,先前保存的对象地址因此失效。
  5. RefreshLFList 只刷新下拉框,没有重新绑定编辑器持有的禁限表指针。之后绘制禁限标志时访问旧地址,触发崩溃。

普通启动先完成扩展加载,再由用户进入编辑器,因此取得的是加载完成后的有效地址。这与本次“快捷编辑闪退、普通启动正常”的实际差异一致。

源码依据为官方仓库 purerosefallen/ygopro 的固定提交 a681a2004decfd3e87801c8d7e55d39634966333。相关函数参数和绘制逻辑与本机反汇编匹配;未取得安装包对应的完整构建记录,因此不将该提交宣称为安装包的精确构建源码。

三、本次实际处理与验证

本次采用的是可逆的配置处理:确认两份禁限表仅末尾换行不同后,将重复的 expansions/lflist.conf 移到扩展扫描路径之外,保留根目录 lflist.conf。没有修改游戏二进制,也没有修复或重新编译游戏源码。补丁脚本应默认只检查;两份文件的规则内容不同时拒绝处理,避免移走有效的独立规则。

当时扩展扫描路径中没有其他包含禁限表的 ZIP/YPK 包,默认仅扫描 expansions;配置选择的是第 0 张禁限表,根目录与扩展副本的首表均为 2026.7。移开重复副本后,规则仍由根目录文件提供,并消除了本次启动时再次插入重复列表的触发条件。

处理后已连续两次通过 MyCard 的实际“编辑”按钮成功打开编辑器;原崩溃中出现的紫翠玉龙也已完成正常查卡验证。

四、适用边界与上游修复方向

这是针对当前安装内容的临时处理,尚未消除程序中的启动顺序缺陷。后续自动更新如果重新生成 expansions/lflist.conf,或新增其他扩展路径、包含禁限表的 ZIP/YPK 包,问题仍可能复发。规则内容不相同的扩展禁限表不能直接按此方法移除。

上游修复应让扩展加载先于快捷编辑器初始化,或在禁限表容器发生改变后安全地重新绑定编辑器指针;同时验证“-d”启动、普通启动、多个扩展表以及压缩包内禁限表等入口。恢复本次移开的副本后,原触发条件也会恢复。

公开源码链接:



https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/game.cpp#L1113

谢谢你的提议,这部分用的人和维护的人太少了。请提交一个PR吧