Skip to content

Releases

v0.2.2preonline2

Choose a tag to compare

@github-actions github-actions released this 11 Oct 06:12

SeiunEngine v0.2.2 Pre-Online.2 · 更新公告 / Release Notes

中文版

v0.2.2 Pre-Online.2 是 Pre-Online.1 之后的第二个预发布版本。联机服务端改用 SQLite 做持久化(不再是整份覆盖写的明文 JSON),补上凭据与会话安全、结构化日志与健康检查接口,并给出可以脱离 neko 工具链的独立服务端可执行文件;客户端这边则把「在局域网里开服」做成了联机菜单里的一个按钮 —— 像 Minecraft 的开放局域网一样,游戏进程自己就是服务端,朋友把一行房间码粘进 JOIN 就能进来。

同时这一版继续收拾巨型谱面:第二次加载走缓存、选歌不再为预览解析整张谱面、分段谱面的识别放宽到任意起始编号,没有 events 字段的老谱面也能流式加载;Note 数据改为列式存储并换上 Int64 计数器,二十亿级的 Note 不再溢出。底层完成了 Haxe 4.3.7 工具链迁移,新增基于 hxvlc 的视频播放与基于 ffmpeg 的游戏内录制,并对图形管线做了整轮加固。结算界面、Lua / HScript 兼容、选项与本地化、离线构建等一批既有问题也一并修掉。

联机总览:三种开局方式

  • 官方 / 公共服务器:在服务器列表里填地址即可。会落到明文 ws:// 的形态(裸 IP、裸主机名、http://x、ws://x 等)会自动补上默认端口 2567,且只补一次;wss:// / https:// 保持 443 语义,走反向代理的公网服务器不受影响。探测结果现在分 可达 / 超时 / 协议不符 三类,后者表示那个地址不是本引擎的服务端或版本不一致,不再笼统显示「连不上」。
  • 局域网:不知道房主的 IP 就直接搜 —— 服务器列表新增 搜索本网络中的服务器:监听 UDP 2569 广播 4 秒,把听到的服务器列成 Found on This Network 清单(不会自动加入);勾选想要的条目再点 Add Selected Servers 才会写进你的服务器列表,已经在列表里的会标注出来不可勾选,Clear These Results 则直接丢弃本次结果。房主必须是用本版客户端的 LAN HOST 开服,或用本仓库 server/ 源码构建的独立服务端 —— 两边共用同一套启动代码,都会在 UDP 2569 上广播自己;广播分别发往每块网卡的 x.y.z.255,装了 VPN / WSL / Hyper-V 虚拟网卡也不会走错接口。自己开服时,LAN HOST 面板的 LAN Address 行直接给出可复制的地址。Android 已放行明文 ws:// / http://,否则较新的系统会直接拒绝局域网连接。Windows 上开服时会打印现成的防火墙放行命令(2567 / 2568 两个端口)与自检命令。
  • 游戏内开服:联机菜单新增 LAN HOST,把服务端跑在自己的游戏进程里(详见「局域网:在游戏里开服」)。

服务端:SQLite 持久化

  • 存储层换成 SQLite:WAL 模式、单连接 + 唯一的数据库互斥锁、按 user_version 版本化的只增式建表,共 13 张表(账号、会话、成绩、评论、举报、俱乐部、Mod、警告、管理日志、首页消息、每日玩家、公共状态等)。标量字段走类型化列(可索引、可排序),列表型字段(权限 / 好友 / 成员 / 下载项等)仍以 JSON 文本列保存。
  • 旧数据一次性导入:首次启动且库为空时,会自动导入旧的 accounts / leaderboard / clubs / mods / admin / public 这些 JSON,随后把原文件改名为 *.imported-<时间戳>(绝不删除),并在库里记录导入标记与计数;也可以用 --import-legacy-json 显式重跑。
  • 凭据与会话:token 只存 HMAC-SHA256 哈希(外加 8 字符查找前缀),比较走常量时间,支持过期与撤销;登录时明文 token 只返回一次,从库里读出来的账号对象不再携带 token;邮件验证码同样只存哈希。
  • 随机数:优先 /dev/urandom;没有该设备的平台(例如 Windows)走 HMAC-SHA256 DRBG。README 与启动日志都如实写明:这不是硬件 CSPRNG,是自建单进程局域网服务的工程折中。
  • 可观测性:结构化 JSON Lines 日志(按天切分),新增只读 GET /api/health(状态 / 运行时长 / 房间数 / 版本 / 库版本 / 各表行数),新增 --log-dir / --log-level 参数。
  • 独立服务端可执行文件:可以编译出原生的 SeiunServer.exe(零运行时依赖);neko 目标与既有用法完全不变。

服务端:HTTP + WebSocket 接口、账号与控制台

  • 接口行为不变:账号 / 排行榜 / 俱乐部 / Mod 仓库 / 管理控制台等存储换成 SQLite 实现后,对外签名、错误字符串、排序、分页与 id 格式逐字保持,HTTP 面的行为没有变化。
  • 双端口:HTTP 2567 + WebSocket 2568,握手带协议标识与版本校验。
  • 管理控制台网页现在被编译进服务端程序本身,没有 server/web/ 目录也能打开;部署目录里存在该目录时仍以磁盘为准,所以改页面依然是刷新即生效、不用重编译。
  • 配置写入修好:公告原先按 UTF-8 字节截断,长中文 / emoji 会被切在字符中间,写坏 config.toml 并让控制台接口一直报 500。现在按 字符 计数(500 字符,另加 2048 字节上限),磁盘上已损坏的值在加载配置时自动修复,写入失败会返回错误而不是假的 200。
  • 同一类问题在全接口做了排查:简介、俱乐部名、network 聊天、房间聊天、sez、Mod 标题、搜索、封禁 / 警告理由等 12 处用户可见的字数上限现在都按字符计数;上限数值、错误文案与成功响应的结构都不变。

公告

  • 后登录的玩家也能看到:持久化的公告现在会随 GET /api/front 一并返回,不再只有那一次实时推送。
  • 客户端:联机菜单左上角以固定区域渲染公告(最多 100 字符,没有公告就不画),不再压住菜单行、居中的在线人数与底部署名;实时推送改为带标题的提示(NOTIFICATION + 内容),不再只有一个标题。
  • 折行按字符计算:中日韩文本不再按大约三分之一的宽度被折行,ASCII 输出保持不变。

游戏内联机:房间、弹窗与暂停

  • 双方都有各自的评分弹窗:联机时你和对方各有一套评分图标与连击数字,互不覆盖、互不干扰;远端弹窗锚定在该玩家自己的角色一侧(并夹在 5%~95% 屏宽内),找不到绑定的角色时落到对方所在的那一半屏,同侧玩家(coop / 2v2)之间会再横向拉开。本地弹窗(单机与自己的命中)的位置和单机一致。
  • 连击数字仍是引擎原有口径:连击小于 10 不显示数字,10~99 显示三位(例如 010)。
  • 房间设置新增「暂停策略」(房主循环切换,三档):
    1. 仅房主可暂停:房主一按暂停,其他玩家被强制一起暂停;客人按 ESC 只会收到本地提示。
    2. 任一玩家暂停则全体暂停(默认):谁按 ESC 都会让所有人一起停、一起恢复。
    3. 保留原有逻辑:暂停只影响自己,暂停消息双向都不上线,与旧版本行为完全一致。
  • 服务端是唯一仲裁:暂停会回显给房间里的所有人(含发起者)并带上发起者标识 —— 收到自己的标识表示自己持有暂停,收到别人的表示自己只是被强制暂停、无权单独恢复;两人同一时刻按 ESC 时先到服务端的一方持有暂停,另一方从回显里得知并交出所有权。恢复只对暂停持有者生效(仅房主档里房主也可以),被拒绝的一方会收到一条提示。持有者离开 / 掉线 / 被踢、结束歌曲、新一轮重置时,服务端都会自动广播恢复,不会把其他人永久卡在暂停里;迟到进房的玩家也不会继承一个旧暂停。
  • 客户端:ESC 先按策略门控;房间级暂停由暂停菜单发出,其他人收到广播后弹出同一个暂停菜单(带「谁暂停了」的提示);暂停归别人所有时,菜单里的继续会拒绝并提示,通过后由关闭子状态发出恢复,其他人的暂停随之一起解除。
  • 开始闸门:房主点播放(或按 ACCEPT)后全员进入谱面,屏幕正中提示 按 ACCEPT 开始 —— 按 ACCEPT / 手柄 A / 直接点那行提示文字都算「我准备好了」,提示随即变成 等待其他玩家...,等房主那句 start 到达才进倒计时。安卓 / 开了触屏支持的桌面端会同时出现一个 A 虚拟键(右下角),房主开始后自动收起 —— 没有它的话触屏端根本没有按键能发出 ACCEPT。

局域网:在游戏里开服

  • LAN HOST 面板:开 / 停、端口(默认 2567,被占用时向上顺延并真实显示占用情况)、最大人数(1-64)、允许本机玩家加入、公开房间(关闭时只能凭房间码进入)、实时状态行(局域网地址、房间码点击复制、当前人数)、防火墙提示、打开本机网页控制台。
  • 真·内嵌服务端:游戏二进制里就是同一套服务端代码。开服时在游戏进程内绑定 2567(HTTP)+ 2568(WebSocket),房主客户端自动建房并通过本机地址加入;显示的房间码带上主机的局域网 IP,朋友把这一行粘进 JOIN 即可。停止会关闭两个监听口并释放端口,同一局游戏里可以反复「开 → 停 → 开」。
  • 开服期间游戏房与社交 / 网络房都走本机服务端:只在运行期改地址,玩家保存的服务器列表与账号选择完全不受影响。
  • 免账号:客人用房间码加入即可,不需要 token;账号、分数与排行榜只写在游戏自己的存档目录里,不会上传。
  • Android 上同样提供该面板并会尝试开服(尽力而为),无法探测到局域网地址时会给出手动填写提示。
  • 面板排版:状态 / 局域网地址 / 房间码 / 人数这四行固定说明列宽,背景框与高亮框按实测内容重算 —— 长文本不再被硬折成三行,局域网地址不再从 IP 中间断开,「点击复制」也不会掉到框外。
  • 内嵌网页控制台:本机免登录、只读。内嵌开服没有管理员账号,因此只有来自本机(127.0.0.0/8、::1、::ffff:127.0.0.1)的 GET 免登录,服务端返回一个合成的只读账号,页面据此跳过登录墙并显示「本机只读」横幅;写操作(POST / PUT / DELETE)与局域网里其它机器的请求仍走原来的四步校验(401),管理接口本身没有改动。独立服务端默认关闭该模式,需要时用 --console-local-readonly 打开。
  • 内嵌开服会写自己的 config.toml(不带 [smtp] 段),邮件黑名单在内嵌模式下不生效 —— 未配置邮件时无影响。

关于大物量谱面的免责声明

游玩大物量谱面遇到卡顿,这是正常现象,不是 bug。 Note 数量没有上限,而任何设备的算力与显存都有 —— 任何引擎的 Note 优化都只能在这些资源里争取余量,不能凭空造出性能。本引擎的全部优化(Turbo、折叠、缓存、流式加载、各项预算……)都不构成「任何谱面都能流畅运行」的承诺。

大物量谱面请使用为这类内容设计的专用引擎。 向本引擎反馈大物量谱面的卡顿之前,请先确认你已接受这一条。

谱面加载与性能

  • 谱面缓存:第二次加载不再重算。缓存落在可执行文件旁的 chart_cache/,每张谱面两个文件(.skel / .notes);缓存的是 Note 循环的输出(完整数据对象,而不是可变数组的下标),所以命中缓存也不可能指到错的那一条 Note。失效判据是「每个分段文件的大小 + 修改时间 + 调用方配置串(流速、mania、折叠阈值、Turbo 开关…)都不变」,任何一项变了就重写。命中时骨架扫描、逐小节解析、折叠与排序全部跳过,直接回放 Note 列表。记录按列压缩(同一张列表 1.78 GB → 几 MB),读写时内存里最多只持有 1 MB 块。
  • 设置(性能页 → Note 优化):Huge Chart Cache(默认开)、Compress the Chart Cache(默认开,代价约每次读写 +1 秒)、Clear the Chart Cache 按钮(会报告释放了多少 MB);原地改过谱面后建议清一次。
  • 选歌不再为「预览」解析整张谱面:流式尺寸的谱面会先被识别出来并直接跳过预览解析(预览只需要歌名与 needsVoices)。
  • 分段谱面:识别放宽到任意起始编号。目录里所有 <song>-<n>.json 按编号升序合并,起始编号任意(从 0、1、5 或 100 开始都一样);中间缺文件只记录、不再作废(会输出缺了哪些编号),仍按现有文件合并;编号文件少于 2 个仍按单文件处理。同目录存在 <song>.json 时不做分段(那要留给「普通歌 + 数字难度」),.parts.json 清单仍是显式覆盖手段。同一首歌拆成多个文件后可以像一首完整的歌一样游玩。
  • 没有 events 字段的谱面也能流式加载:改用字节级特征判断后,老格式 / 外部工具转换出来的谱面不再退回整份 DOM 解析 —— 那次回退正是这类谱面在选歌界面卡死的原因。
  • Note 数据改列式存储:每个数值字段单独成列,全谱恒定的字段直接提升为标量(不分配列),首次出现分歧才回填 —— 谱面极其重复(stepCrochet、命中 / miss 血量、偏移与所有字符串列通常整张谱只有一个值),提升把每条 Note 约 358 字节的占用压到几十字节;列按倍增扩容,边解析边写入,hxcpp 的块池不再被撑到整张谱的体量。
  • 计数器换 Int64:谱面与命中计数改用 Int64,超过二十亿的 Note(实测 amphotercity 2,064,278,444 taps)不再溢出。
  • Note 材质复用判断免分配:原先池化复用时每条 Note 都要现拼一个材质 key 字符串再比较;改为逐字段比较,重载路径不再产生字符串垃圾。
  • 弹窗 / 溅射 / 物化 / 排水预算按时间计费:这些预算原本是「60 fps 设计速率、按绘制帧重置」,帧率上限越高每秒实际预算越大(360 fps 上限下为设计值的 6 倍);现在按 elapsed×60 累积、按整单位消耗、单帧封顶 —— 60 fps 及以下行为逐位不变,更高帧率每秒付出的速率与设计一致。
  • 评分弹窗免分配化:贴图键(评分 / 数字 / COMBO)构建一次缓存复用,不再每次命中每个精灵现拼字符串;连击数字写入复用缓冲;淡出不再依赖 FlxTween 全局管理器,改为池化记录由 PlayState 逐帧推进(暂停时与移动一致冻结,联机双方各自的弹窗各自推进),稳态零分配。
  • 图形清理重构:purgeUnusedGraphics() 由「每清一个 key 就重扫全部缓存」改为单遍收集 + 批量移除,长会话下原有的周期性主线程冻结消失;被清理图形注册的 Sparrow 图集帧缓存一并逐出,不再留下「僵尸图集」(此前模组动态生成的精灵会渲染成空白并陷入脚本报错循环)。
  • Turbo / Botplay 的 HUD:Turbo 下标签显示 TURBO BOTPLAY(普通自动打谱仍是 BOTPLAY,练习模式仍是 Practice Mode);自动打谱时的分数行为 Notes: <对手命中> + <自己命中> = <合计> | NPS: … | HP: <血量>%,NPS 是 1 秒滑动窗口加快起慢落的弹道(一帧内的爆发会在约 1.47 秒内平滑回零,而不是一帧跳回 0),超长数字自动改用紧凑写法(如 1.03B)保证单行,精确值仍在左侧统计栏。
  • 联机时禁用全部运行期优化:perfMode、bulkSkip、fastSort、scriptArgReuse、limitNotes 上限以及强制自动打谱的 Turbo,在联机进歌时只改本局内存值关闭,退出歌曲按进歌快照恢复,玩家的设置文件零触碰。加载期优化(流式解析、分桶排序、巨谱缓存、分段识别)保留。
  • 联机只承诺单文件谱面:分段谱面在联机下会被明确拒绝并提示(本地弹窗 + 房间内状态),不再因为哈希阶段抛异常而静默卡在等待对方谱面。
  • 联机谱面分析:按每个音符自己的 mania 快照取键数,含 Change Mania 的谱面 FP 计分更准确。

图形与渲染

  • Haxe 4.3.7 工具链迁移:编译器与 API 层(430)整体升级,hxcpp 使用本引擎维护的 haxe-4.3 分支,CI 与发布构建对齐新工具链;引擎代码已适配 4.3.7 的 API 变化。
  • 图集重打包加固:所有像素写入统一走带边界检查的 blit()(目标必须完全落在打包画布内、源必须完全落在源图内,越界即跳过并计数告警);打包画布按请求尺寸校验(平台钳制分配时放弃重打包、保留原图);CPU 副本已释放的源图不再参与 copyPixels(整体放弃重打包,绝不产出透明图集);跨线程结果发布由主线程持有。这一轮加固关掉了「堆被写坏、几秒后在 GC 线程里崩溃」的一整类隐患。
  • 异步图片加载移除:AsyncGfxLoader 与「异步图片加载」设置整体删除,位图解码统一在主线程按帧小批量完成 —— GC 线程崩溃的排查最终指向跨线程发布位图的堆损坏路径,宁可放弃异步收益,也不再保留这条风险。
  • 分离 update / draw 与空闲帧跳过重绘:开启「分离更新与绘制」后,没有跑逻辑步的绘制帧会直接重新呈现已录制的绘制命令,不再整帧重建,空闲画面(例如暂停的谱面)GPU 负担明显下降;直接写 camera.canvas.graphics 的代码请调用 FlxGame.invalidateDrawCache()。
  • 窗口模式统一:新增 backend.WindowMode,windowed / fullscreen(真实 SDL 显示模式切换)/ borderless(去装饰 + 贴满 + 顶置)三种模式由同一条路径处理,启动流程(Main / TitleState)与设置页共用同一实现。
  • 回放录制的输入检测 O(1):录制时改用单调事件计数器判断「有没有键变化」,不再每帧遍历全部 95 个键位探询(实测每帧 1547 ns → 0.9 ns)。
  • 侧边 HUD 在 perfMode 下固定宽度 + 节流:Botplay / Turbo 下计数每帧变化、按值跳过永不命中,比例字体的 autoSize 每次重排都会新分配一张位图与 GPU 纹理;现在侧边计数使用固定 fieldWidth(单行、永久复用同一位图),perfMode 开启且未强制原版重写时读数按 20 Hz 节流(perfMode 关闭或开启 Stock HUD Text Rewrite 时保持逐值精确刷新)。

视频:播放与游戏内录制

  • 过场视频播放:接入 hxvlc 2.3.1(libVLC 3.0.23),并移除了树内的影子副本。开场 / 中途视频过场照常播放,startVideo 支持 1.0.4 的完整参数(canSkip / forMidSong / shouldLoop / playOnLoad);引擎保留 hxcodec 风格的 FlxVideo / FlxVideoSprite / VideoSprite 包装层与视频预加载器,模组按老习惯调用即可。
  • 游戏内录制(桌面端):歌曲中按 F9(或打开「开歌自动录制」)即可把游戏画面连同 Inst / Voices 混音送进 ffmpeg 管道,输出到游戏旁的 render_video/ 目录。
    • 编码器任选:H.264(x264 / NVENC / AMF / QSV)、HEVC(x265 / NVENC)、VP9 / VP8(VP8 / VP9 输出 .webm,其余 .mp4);码控支持 CRF/CQP(恒定质量)、VBR(目标码率)与 CBR(固定码率)。
    • 1 帧 = 1/fps 秒的歌时:帧号从 Conductor 时钟推导,暂停 / seek / 变速自动对齐;录制期间游戏帧率被钉到设定值并打开固定步长,机器跟不上也不会改变视频时长(环形缓冲满时等待编码器,而不是丢帧)。
    • 预览渲染:跑一遍完整流程(固定步长 + 逐帧采集)但不写文件,用来先校对时序。
    • 录制期间屏幕角落有 RenderIndicator 状态角标;每次渲染在输出旁写一个 .log(设定、帧数、速度与 ffmpeg 自己的 stderr)。
    • 新增「渲染」设置页(三语):自动录制、预览、帧率(15-480)、混音、编码器、码控、质量、码率、缓冲帧数(缓冲即内存上限)。

Note 长条几何(模组皮肤)

  • 修复自定义 arrowSkin 的裁剪帧(trimmed Sparrow)图集长条断裂 / 尾帽错位 /「BPM 越高越偏」:长条高度归一化改按图集可见区域高(新增 Note.sustainContentHeight() 把四处公式统一到同一个皮肤自适应系数),下落模式长条锚点的裁剪帧补偿符号修正,裁剪上沿改用 Note.contentTopInFrame()。默认与内置皮肤逐位不变;实测某模组材质长条近端落点收敛到与 BPM / 速度无关的常量,尾帽与相邻段恢复正常搭接。

结算界面

  • 评分图标不再错成 FALSE:统计音符总数时漏了「超完美」这一桶,Turbo + 自动打谱下每个命中都判成超完美、其它桶全为 0,于是总数 0、直接落到 FALSE 兜底图。现在把超完美计入总数,并按准确率选图标。
  • 图标尺寸:评级图是 150×150,兜底的 false.png 是 660×256,原来只按宽度缩放会把整张卡片压住;现在统一装进 240×90 的框(150×150 仍是 90×90,观感不变)。
  • 统计图例不再换行、不再有黑块:图例行原本给了固定的列宽,而 Flixel 一旦拿到正数就打开自动换行,长数字被折成两行 —— 折出来的那一行还会把自己的文字域画成一整块纯黑,并把尾巴压到下一行。现在改用「永不换行」的写法,数字过长时分级收缩。
  • 残留 HUD 统一隐藏:结算界面原先只关了 camHUD,side HUD 与 BOTPLAY / REPLAY / ms / 判定文字挂在另一个相机上,会直接画在结算面板...
Read more

v0.2.2preonline1

Choose a tag to compare

@github-actions github-actions released this 27 Sep 00:59

SeiunEngine v0.2.2 Pre-Online.1 · 更新公告 / Release Notes


中文版

这是 SeiunEngine 的 v0.2.2 Pre-Online.1。本次把引擎带进「联机时代」,重做了谱面加载与低流速 Note 的性能模型,修好了连击 / 评分弹窗的显示与开销问题,把设置里的文字取值接入多语言,并让崩溃报告重新变得可读。

同一张一千多万 Note 的谱面,过去光是把 JSON 解析成 DOM 就要约 4.8 GB,2 GB 级的谱面根本载不入;现在只解析当前消费的小节、用完即丢,不再逐节建 DOM,排序与扫描也换成了更快的数据结构。

联机

来源署名 / Credit:联机部分的菜单 UI、房间与协议模型、服务端房间语义移植 / 参照自 Funkin-Psych-Online 及其配套的 Funkin-Online-Server(作者 Snirozu,Apache License 2.0)。本引擎内的联机实现是自研 Haxe 代码,不包含上述仓库的 TypeScript / Node 源码。完整署名见仓库根目录的 NOTICE,游戏内「鸣谢名单」的 Online UI / Protocol Reference 一节也已列出。

  • 联机对战:房间列表、大厅、共享血条、逐玩家评分、聊天与私聊、房间设置、断线重连。
  • 账号与服务端:注册 / 登录 / 改邮箱 / 删号(真实邮件验证码)、排行榜、俱乐部、Mod 仓库、通知与好友;服务端为 Haxe 重写,不依赖 Node / colyseus。
  • 游戏内下载器:GameBanana / PE 搜索、下载进度、下载完成后再确认安装;取消安装时保留已下载的文件;重定向最多跟随 3 跳。
  • 多语言:引擎菜单与整个联机界面的文案支持简体中文 / 繁体中文 / 英文。

谱面加载

  • 不再整份解析:大于 64 MB 的谱面走字节流式加载 —— 只把当前小节解析出来、用完立刻丢弃,整份 DOM 不常驻内存。≤64 MB 的谱面行为完全不变。
  • 字节级解析:逐条按字节产出数据,不再为每一节建一次 JSON DOM;单节峰值从约 52 MB 降到约 6 MB,也不再复制那一节的 JSON 字符串。
  • 排序:上千万条 Note 改用计数分桶排序。A 谱面(1183 万 Note)的排序耗时由 2.8 s 降到 1.6 s。
  • 扫描:定位小节边界的扫描器换成缓冲区内的紧循环。同一张谱面的扫描耗时由 2.06 s 降到 0.62 s(与游戏同一后端实测)。

Note 性能(Turbo)

  • 低流速 Note 性能修复:引擎只有一条渲染路径 —— 真实 Note 精灵,所以「性能不够」永远等价于「同时存活的精灵太多了」。低流速下这个问题最严重:屏幕像素带是固定的,而它换算成的可视频段为 1400 / (0.45 × 流速) 毫秒,流速 1.0 时约 3.1 秒、流速 0.5 时约 6.2 秒。几千万 Note 的谱面在这个窗口里能塞进六位数条 Note,全部物化就是纯浪费 —— 这正是「高流速顶得住、低流速直接拉胯」的原因。
    修复改为按屏幕像素间距(而不是时间间距)折叠:同轨道、同侧、同 multSpeed、间距不足 4 像素的 tap 合并成一条代表 Note,折叠数量记入 noteDensity,因此判定与计分口径与原来完全一致。判据与流速自洽,流速越低合并越多,物化量因此恒定,不再随谱面密度爆炸。
    实测(floccinaucinihilipilificatiophobia,327,942 条,8K):同时存活精灵数的峰值由 1788 / 3344 / 5200 / 5200 / 4160 降到 450 / 896 / 1392 / 1401 / 1372(对应流速 0.5 / 1 / 2 / 4 / 10);miragist(3,382,148 条,4K)由 1121 / 1121 / 1743 / 1743 / 1394 降到 371 / 639 / 873 / 449 / 459(同样对应流速 0.5 / 1 / 2 / 4 / 10)。
  • 移除 turbo_cache 侧车缓存:它缓存的是 Note 列表的下标区间 —— 谱面或折叠规则一变就整体错位,而算错的区间不会报错,只会静默算错;它的指纹也不稳定,同一首歌会被反复生成新缓存。去掉后每次进歌只多一次 O(n) 扫描,换来的是结果稳定,划算。
  • 物化地平线对齐真实像素带:生成窗口不再固定按 2000ms 铺开,而是按屏幕几何推导(上限仍为原版 spawnTime)。初值同时降到 250ms,避免倒计时前按 2 秒窗口一次性物化成千上万条 Note。
  • 运行时像素级归属闸门:与加载期折叠同一判据,但用当前流速计算;即使运行中 songSpeed 被事件或缓动改写,物化量依然有界。被挡下的音符就地走数据层结算,不会卡住结算游标。
  • 批量结算路径统一:fastSkipPastNotes 与新物化路径共用同一个结算函数与帧内累加器,保证「游标只前进、绝不提前消费却不推进」,同一像素带内的音符同时结算,不会把 combo 拆成好几段。
  • Turbo 下对手命中计入连击:对手命中的 Note 现在也计入玩家连击与侧边 HUD 的总击中数(仅 Turbo)。
  • 联机时静默关闭 Turbo:Turbo 会强制自动打谱,与共享血条 / 逐玩家评分冲突;联机进入时它静默失效,退出联机后按用户设置照常生效。

连击弹窗与设置

  • 连击 / 评分弹窗修复与提速:修复开启「连击堆叠」后新生成的连击图标会被旧图标压住的问题 —— 现在后生成的图标始终绘制在最上层,不再沉底、不再重影。同时修掉弹窗对象池从不释放容器槽位、导致每帧绘制循环越走越长的问题,这正是高密度谱面下「帧数随歌曲进行持续下降」的根因。
  • 连击数字完整显示:连击数不再被截断,打到多少就显示多少。同时 rating / 数字 / COMBO 贴图改为缓存复用、弹窗取用改为 O(1),十万级 NPS 下每次命中的弹窗开销明显下降。
  • 设置项取值本地化:语言、显示模式(窗口化 / 全屏 / 无边框)、时间条类型、Note 样式、引擎兼容模式、判定预设 Custom、触控按键位置等字符串选项的取值现在跟随界面语言显示(例如语言项由 ChineseSimplified 显示为「简体中文」)。自定义或未翻译的取值仍按原样显示。

崩溃排查与诊断

  • 崩溃报告现在能直接看懂:堆栈自带源码位置(形如 [src/File.cpp:123]),不再是一串 <sprintf>+0x... 的假地址;报告头还会写明它是哪一次构建、符号是否可信。
  • 修掉三个具体的崩溃原因:SDL3 迁移后 SDL_GetBasePath() 被错误释放(退出时 double free);窗口关闭后渲染循环仍在调用 native 接口造成的空指针解引用;strum 组重建期间越界取成员(release 构建下 hxcpp 返回 null 而不报错,紧接着解引用直接崩溃)。
  • 调试符号单独发布:符号包挂在 Release 上,不会混进玩家下载的游戏包,游戏包内容不变。
  • F8 诊断:卡顿时按一次 F8,会把最近 600 帧的分段耗时(整帧 / 批量结算 / Note 更新 / 排序 / 弹窗 / 分数文字)写到 crash/hitprobe.txt,把文件发回来就能定位是哪一段拖慢的。只读诊断,不影响判定与上报。
  • 顺带澄清:多线程渲染早已移除(RenderThread 是空壳),渲染一直在单线程主循环里 —— 它不是崩溃的原因。

其他修复

  • 修掉打开玩家排行榜时的闪退(服务端分页 20 与客户端 15 行不一致导致越界)。
  • 修掉下载器缩略图下载的闪退,以及断网 / 联网时的下载器崩溃。
  • 修掉 network 房间断线重连的闪退(NetworkClient.client 静态字段从未被赋值)。
  • 修掉联机房间内角色被事件替换后远端不播动作、评分图标两玩家共用一套的问题。

English Version

This is SeiunEngine v0.2.2 Pre-Online.1. It brings the engine into its online era, reworks chart loading and the low-scroll-speed note performance model, fixes the combo / rating popup's display and cost, moves the string setting values into the localization system, and makes crash reports readable again.

A chart with over ten million notes used to need roughly 4.8 GB just for the parsed JSON DOM — charts in the two-gigabyte range would not load at all. Only the section being consumed is parsed now and dropped immediately, no per-section DOM is built, and both sorting and scanning moved to faster algorithms.

Online

Credit: the online slice's menu UI, room/protocol model and server-side room semantics are ported from / modelled after Funkin-Psych-Online and its companion Funkin-Online-Server by Snirozu (Apache License 2.0). The online code bundled in this engine is this project's own Haxe implementation and contains no TypeScript or Node source from those repositories. Full attribution: the NOTICE file in the repository root and the Online UI / Protocol Reference section of the in-game credits screen.

  • Online multiplayer: room list, lobby, shared health, per-player scoring, chat and DMs, room settings, reconnect.
  • Accounts and server: register / login / change email / delete account (real email verification codes), leaderboards, clubs, mod repository, notifications and friends. The server is a Haxe rewrite with no Node / colyseus dependency.
  • In-game downloader: GameBanana / PE search, download progress, install confirmation after the download finishes, downloaded files kept when installation is declined, redirects followed up to 3 hops.
  • Localization: engine menus and the entire online UI ship in Simplified Chinese, Traditional Chinese and English.

Chart loading

  • No more whole-file parse: charts above 64 MB are loaded as a byte stream — only the section currently being consumed is parsed and dropped immediately, so the full DOM never stays resident. Charts at or under 64 MB behave exactly as before.
  • Byte-level parsing: notes are produced straight from the bytes instead of building a JSON DOM per section; the per-section peak drops from roughly 52 MB to about 6 MB, and that section's JSON string is no longer copied either.
  • Sorting: millions of notes now use a counting bucket sort. Chart A (11.8M notes) sorts in 1.6 s instead of 2.8 s.
  • Scanning: section boundaries are located with a tight loop over the read buffer. Scanning the same chart drops from 2.06 s to 0.62 s (measured on the same backend as the game).

Note performance (Turbo)

  • Low-scroll-speed note performance fix: the engine has exactly one rendering path — real Note sprites — so "not fast enough" always means "too many sprites alive at once". Low scroll speed is where this hurts most: the screen's pixel band is fixed, and the time window it maps to is 1400 / (0.45 × speed) ms — about 3.1 s at speed 1.0 and 6.2 s at speed 0.5. A chart with tens of millions of notes can fit six figures of notes inside that window, and materialising all of them is pure waste. That is exactly why high scroll speeds hold up while low ones collapse.
    The fix coalesces by on-screen pixel spacing instead of time spacing: taps in the same lane, same side, same multSpeed, less than 4 px apart, merge into one representative note, with the folded count stored in noteDensity. Judgement and scoring semantics are therefore unchanged. Because the criterion scales with scroll speed, lower speeds fold more and the materialised count stays constant instead of exploding with chart density.
    Measured (floccinaucinihilipilificatiophobia, 327,942 notes, 8K): peak simultaneously-alive sprites drop from 1788 / 3344 / 5200 / 5200 / 4160 to 450 / 896 / 1392 / 1401 / 1372 (speeds 0.5 / 1 / 2 / 4 / 10). miragist (3,382,148 notes, 4K) drops from 1121 / 1121 / 1743 / 1743 / 1394 to 371 / 639 / 873 / 449 / 459 (same speeds).
  • Removed the turbo_cache sidecar cache: it cached index ranges into the note list — any change to the chart or to the folding rule shifts them wholesale, and a wrong range does not crash; it silently computes the wrong notes. Its fingerprint was unstable too, so the same song kept minting new cache files. Dropping it costs one extra O(n) scan per song load and buys stable results — a good trade.
  • Spawn horizon aligned to the real pixel band: the spawn window is no longer a flat 2000 ms; it is derived from screen geometry, capped at the original spawnTime. Its initial value also drops to 250 ms so the pre-countdown frames cannot materialise thousands of notes on a 2-second window.
  • Runtime pixel-level admission gate: the same criterion as the load-time fold, but evaluated against the current scroll speed, so materialisation stays bounded even if songSpeed is changed at runtime by an event or a tween. Rejected notes are settled in the data layer on the spot, without stalling the settlement cursor.
  • Unified bulk settlement path: fastSkipPastNotes and the materialisation path now share one settlement function and one per-frame accumulator, guaranteeing the cursor only ever moves forward and never consumes a note without advancing. Notes inside the same pixel band settle together, so combo is never split into fragments.
  • Opponent hits count towards combo in Turbo: opponent notes now add to the player's combo and to the side HUD's total hit count (Turbo only).
  • Turbo is silently disabled online: Turbo forces autoplay and conflicts with the shared health bar and per-player scoring; it is switched off inside online rooms and behaves as configured outside them.

Combo popup and settings

  • Combo / rating popup fixed and made cheaper: with combo stacking enabled, a newly spawned combo icon used to be drawn underneath the older ones — the newest popup now always draws on top, with no sinking and no ghosting. The popup pool also never released its container slots, so the per-frame draw loop grew with every hit; that was the root cause of the frame rate decaying over the course of a dense chart.
  • Full combo number: the combo count is no longer truncated — whatever you hit is what is shown. Rating / digit / COMBO graphics are now cache...
Read more

v0.2.1hotfix

Choose a tag to compare

@github-actions github-actions released this 06 Sep 06:25

SeiunEngine v0.2.1 Hotfix

0.2.1 的热修复版本,主要更新如下:

  • Turbo 模式(新增,默认关闭):粪谱终极开关——开启后强制 Botplay,高密度段落走预计算聚合 + ghost note 合并 + 数据级批量结算,不再物化几万个 sprite;百万级谱面内存能省几百 MB。
  • 图形缓存重构:解码/打包回到主线程并按帧小批量处理,加载界面不再一顿一顿;缓存淘汰不再误杀仍在使用的贴图。
  • GitHub 更新检查重做:改为查询 GitHub Releases(新增 prerelease 选项,是否接受预发布版),新增 GitHubAPI 封装;主菜单会提示"有新版本"。
  • 联机小更新:spectate(观战)、角色 skin 替换 + 头顶 nameplate、start gate,服务端与联机资源同步更新。⚠ 提前说明:目前的联机我压根没想编译进游戏(ONLINE_ALLOWED 还是注释掉的),因为它真的太一坨了,别期待。
  • 安卓权限弹窗本地化:All files access、悬浮窗(overlay)弹窗改为语言加载后用引擎自带的多语言对话框,新增 Android.json 语言文件。
  • 其他修复:PsychUIDropDownMenu 定位问题、性能模式关闭时的原版行为回归、崩溃报告补模块基址/偏移等。

完整 Changelog 见 CHANGELOG_SeiunEngine.md。


Build Info

Automated release from commit de03be5.

Artifacts:

  • Linux x64
  • Windows x64
  • macOS x64
  • macOS arm64 (experimental)
  • Android (APK, armv7 + arm64)
  • iOS Device (IPA)

Checksums are included in SHA256SUMS.txt.

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 28 Aug 13:08

SeiunEngine 更新日志 · Changelog

完整记录 2026年6月19日 至 8月27日 的所有改进、修复与突破
A comprehensive record of every improvement, fix, and breakthrough from June 19 to August 27, 2026.


中文版


2026年6月19日

  • 修复进入 Senpai 歌曲时前段 Note 消失的问题。
  • 修复部分安卓设备在回放历史界面与游戏结束界面闪退的故障。
  • 完全重构 Replay(回放)系统。
  • 更新 Lua 库版本。
  • 重构暂停界面,增加轻微 3D 视觉效果。
  • 新增 Trace 控制台功能。
  • 新增设置备份与恢复机制。

2026年7月18日(阶段性大更新)

脚本与模组系统

  • HScript 脚本已完善至可独立编写模组的程度,支持自定义图标等资源。
  • Lua 兼容性进一步加强,API 处于早期阶段,允许修改(sub)state(未全覆盖测试,可能影响部分模组)。
  • 提供两套 FPS 显示方案,可在模组配置中切换。
  • 健康条(Health Bar)不再使用映射方式,改用 073 Bar.hx 原生创建,彻底修复显示异常。
  • Lua 与 HScript 均可修改(sub)state(早期阶段)。

编辑器与谱面

  • 谱面编辑器支持导入/导出 Codename Engine(CNE)格式,保存功能整合为单一 Prompt 窗口。
  • 修复编辑器内 Prompt 窗口在手机端缺少关闭按钮(X)的问题。
  • 修复新版谱面编辑器中 Note 跑到对方判定区的问题。
  • 修复旧版谱面编辑器中“保存并试玩”会强制写入谱面的问题(改为仅试玩不保存)。
  • 重构新旧两个 ChartingState 的未保存警告逻辑,统一为退出/重载/试玩/预览前均弹窗确认,不再自动保存。
  • 新增“谱面自动保存”设置(默认关闭),开启后定时自动备份。
  • 修复谱面 0.6.3 转换时的兼容性问题(7.20 另有专项修复)。

性能与渲染

  • 优化大批量 Note(数万至数十万)的帧率与内存占用(图集帧缓存,提升加载速度)。
  • 进一步优化同场景下大量 Note 的加载效率(缓存帧扫描结果,避免重复开销)。
  • 清理 Note 构造时的自指环隐患(prevNote 不再自指)。
  • 底层渲染微优化。
  • 删除多线程更新(因 BUG 过多)。
  • 修复 Note 从超慢速变超快速时长条异常变长的问题。

界面与交互

  • 重写设置界面(简化为单个类),支持模组通过 JSON + HScript + Lua 自定义菜单及动画。
  • 重构模组加载流程:FreePlay 不再一股脑显示所有模组歌曲,改为 Tab 切换;主页面增加模组切换子状态(独立于 FreePlay)。
  • 将 Combo 等图像生成优化,降低内存占用,避免粪谱卡顿。
  • 暂停界面保留旧版(OldPauseSubState),可选用。
  • 移植 PsychCamera 等 0.7.3 / 1.0.4 特有类。
  • 修复 mustHitSection 影响玩家动作播放的问题。
  • 修复练习模式准确率显示错误(仅为显示问题)。
  • 修复 Replay 未记录手机端虚拟控件输入的问题。
  • 修复只有一个模组时无法打开菜单的漏洞。

兼容性与其他

  • MusicBeat(sub)State 在电脑端增加手机虚拟按键空实现,便于 PC 支持触屏。
  • 修复新版 Replay 记录缺失手机控件数据的问题。
  • 修复安卓设备相关兼容性问题。

2026年7月19日

  • 修复 Sparrow XML 帧中 rotated="true" 未正确应用角度旋转的问题。
  • 增加全局模组列表选项。
  • 安卓设置支持用户自定义文件存放类型,适配高版本 Android 的 data 目录限制。
  • 修复人物无法正常翻转的问题。
  • 优化歌曲进入速度。
  • 代码清理(含移除冗余日志、恢复 CO 兼容性等)。

2026年7月20日

  • 修复谱面 0.6.3 转换问题(独立修复)。

2026年7月21日

  • 移除安卓激进优化设置。
  • 修复所有场景均会加载 stage 图片的冗余问题。
  • 修复兼容模式下 timeBar 的 cameras 为 null 导致崩溃的问题。

2026年7月31日(大量修复与改进)

脚本与判定

  • 修复 Botplay 下命中 Hurt / ignoreNote 音符无法触发 Lua / HScript 事件的问题。
  • 修复未选择模组却错误加载其他模组 Main.hx 的渗透问题。
  • 修复 pack.json 缺少 restart 字段导致崩溃的问题。
  • 修复倒计时未结束歌曲提前开始的问题。
  • 修复倒计时期间 Note 判定 ms 异常(现与正曲一致)。
  • 新增“忽略循环报错脚本”设置(默认开启),并配套“脚本报错上限”(默认 50 次),持续报错的脚本将静默停用,避免刷屏。
  • HScript 默认走错误上限逻辑,不再首次报错就弹窗关闭。

编辑器与谱面

  • 修复 MasterEditorMenu 选择模组后首次进入编辑器仍加载原版资源的问题。
  • 彻底统一新旧编辑器的保存警告逻辑,不再自动保存。
  • 新增“谱面自动保存”选项(默认关闭)。

性能与 UI

  • 再度优化大批量 Note 加载速度(缓存帧扫描、单次纹理加载)。
  • KeyboardDisplay 全面软编码化(支持自定义键大小、间距、字体、颜色、透明度等),并提供 fullyCustom 开关及按压/释放/更新钩子。
  • 游戏结束结算界面(Results)与回放历史界面(ScoreHistory)UI 现代化,采用弹性进场动画、鼠标悬停反馈、动态排版,修复文字重叠、截断等问题。
  • 暂停界面提高透明度(黑底、亚克力、玻璃卡片均更透),参数可调。
  • 优化回放系统(Replay)。

2026年8月18日

  • 进一步优化 Note 性能:针对极限谱面(数十万级 Note)做了额外的加载与渲染加速,帧率更稳定。
  • 修复 Vs slice 模组谱面转换时导致的崩溃问题:解决了该模组特定谱面在转换过程中因数据解析异常引发的程序崩溃。
  • 修复若干已知问题:包括社区反馈的特定模组兼容性、偶发闪退及界面显示异常。
  • 底层升级 SDL3:将原 SDL2 渲染后端迁移至 SDL3,提升跨平台图形性能及输入响应,为后续功能预留接口。
  • 修复 Windows 图标错误:解决了因 Lime 构建图标注入错误导致的 Windows 可执行文件图标显示异常的问题。
  • 补充制作人员名单:在相关界面中补全了参与本项目开发的贡献者信息。

2026年8月19日

  • 修复 Replay 无法正常播放的问题,具体原因如下:
    1. ScoreHistorySubstate.playReplay() 直接调用 Song.loadFromJson() 时,未像 Freeplay 那样先切换至歌曲所属模组目录,导致 Paths.modsJson() 无法定位模组谱面,回退读取 assets/data/ 目录。
    2. 同步增强了 Replay 判定精度。
  • 彻底移除了 GPUTextureManager 及“GPU纹理池化”设置,修复开启该选项后大图或全屏区域出现黑块的问题。
  • 补全新版 Adobe Animate(spritemap1)角色支持。
  • 修复 FlxAnimate 角色动画播放异常的问题。
  • 修复 Lua playAnim 接口在特定场景下无法正确触发角色动画的问题。
  • 修复 StageData 兼容性问题,解决部分模组舞台加载失败或显示错乱的现象。
  • 修复相机缩放(camera zoom)相关逻辑,确保缩放行为与预期一致。
  • 修复 healthBar.scale 读取异常,解决健康条在部分模组中缩放比例不正确的问题。

2026年8月20日 — SeiunEngine 0.7.3 兼容性全量修复

新增 0.7.3 兼容层

  • 新增 backend.Mods 兼容类(source/backend/Mods.hx),提供 0.7.3 模组 HScript 依赖的 Mods API:currentModDirectory、getGlobalMods、pushGlobalMods、getModDirectories、mergeAllTextsNamed、directoriesWithFile、getPack、parseList、updateModList、loadTopMod,全部委托给 Seiun 已有的 Paths 与 CoolUtil,避免重复维护。
  • 修复 Lua 脚本 onCreate 期间无法被其他脚本回调注册的问题(source/script/lua/FunkinLua.hx):现在 call('onCreate') 之前会把当前 Lua 脚本临时加入 PlayState.instance.luaArray,onCreate 结束后再移除。该修复解决了 Pause.lua 的 onCreate 调用 parseJson 时为 nil 的根因,同时修复了 jsonReader.hx 的 createGlobalCallback 注册不到当前脚本的问题。

暂停菜单 / CustomSubstate

  • CustomSubstate 的 Lua 全局改为安全值(source/script/lua/FunkinLua.hx):Lua 侧 customSubstate 不再直接存放 CustomSubstate 实例,改为子状态名字符串(如 "NEW_pause_menu");HScript 侧仍保留真实 CustomSubstate 实例。消除了 "Convert: Haxe value ... not supported" 报错。

版本 / 变量兼容

  • version 全局跟随兼容模式(source/script/lua/FunkinLua.hx、source/script/hscript/HScript.hx):version 现在等于 CompatEngine.current(),0.6.3 / 0.7.3 / 1.0.4 模式会返回对应版本号。
  • opponentVocals 重命名(source/states/PlayState.hx、source/editors/ChartingState.hx):原 vocalsOpponent 全部重命名为 0.7.3 的 opponentVocals。
  • 新增 0.7.3 属性:PlayState.inst 指向 FlxG.sound.music 的 instrumental 别名;PlayState.stageUI 支持 stage json 的 stageUI 字段;PlayState.iconsAnimations 默认 true,供 iconShake 等脚本读取;StageData.StageFile 增加可选 stageUI 字段。
  • noteSkinPostfix / splashSkinPostfix(source/script/lua/FunkinLua.hx)不再硬编码为空,改为读取 Note.getNoteSkinPostfix() 和 NoteSplash.getSplashSkinPostfix()。

缺失回调补全

  • 成就系统完整兼容(source/Achievements.hx):保留旧版 Seiun 成就 API(achievementsStuff、achievementsMap、henchmenDeath、loadAchievements、unlockAchievement、isAchievementUnlocked、getAchievementIndex、AchievementObject、AttachedAchievement);移植 0.7.3 成就系统(Achievement typedef、achievements、variables、achievementsUnlocked、getScore、setScore、addScore、unlock、isUnlocked、startPopup、createAchievement、reloadList、loadAchievementJson);新增 Lua 回调(getAchievementScore、setAchievementScore、addAchievementScore、unlockAchievement、isAchievementUnlocked、achievementExists)。
  • Discord 兼容别名(source/Discord.hx):新增 clientID、_defaultID 静态变量;source/script/lua/FunkinLua.hx 新增 Lua 回调(changeDiscordPresence、changeDiscordClientID)。

调用顺序修复

  • PlayState 的 onCreatePost 顺序对齐 0.7.3(source/states/PlayState.hx):Lua onCreatePost 在 super.create() 之前调用一次;HScript onCreatePost 由 super.create() 内部调用一次;删除原先重复的 callOnScripts('onCreatePost'),避免 HScript 执行两次。

哨兵值兼容

  • Function_Stop 等常量改为 0.7.3 字符串哨兵(source/script/lua/FunkinLua.hx、source/psychlua/LuaUtils.hx、source/editors/EditorLua.hx):Function_Stop、Function_Continue、Function_StopLua、Function_StopHScript、Function_StopAll 全部改为 "##PSYCHLUA_*" 字符串,与 0.7.3 / 1.0.4 一致。

控制器 / 输入兼容

  • keyboardJustPressed 键盘 + 手柄回退(source/script/lua/FunkinLua.hx):ENTER、SPACE、Z 键盘没按时回退到 Controls.ACCEPT;ESCAPE、BACKSPACE 回退到 Controls.BACK;W、UP、S、DOWN、A、LEFT、D、RIGHT 回退到 UI_*_P。keyboardPressed、keyboardReleased 也补了对应的按住/松开回退。
  • keyJustPressed / keyPressed / keyReleased 补 default(source/script/lua/FunkinLua.hx):未匹配的名字会走 controls.justPressed / pressed / justReleased,与 0.7.3 ExtraFunctions 行为一致。

版本显示调整

  • 主菜单 PE 版本显示(source/states/MainMenuState.hx):显示 "Psych Engine v0.6.3+0.7.3+1.0.4 (Active: 当前兼容版本)",所有版本文字改为右对齐,贴住屏幕右边缘,避免长文本溢出。
  • 游戏内左下角 PE 版本显示(source/states/PlayState.hx):左下角版本文字中的 PE 版本改为 CompatEngine.current(),跟随当前激活的兼容模式显示。

2026年8月21日

  • 修复 Replay 若干遗留问题(回放难度锁定、回放数据完整性等)。
  • 移除 OSU 尾判设置选项(gameplay 选项、ClientPrefs 与回放/判定相关代码一并清理)。

2026年8月22日(UI 架构统一重构 + 设置弹窗)

通用 UI 基础(新增 source/backend/UIScreen.hx)

  • 新增 UIScreen 工具类,统一各现代界面的玻璃/亚克力 UI 实现:
    • createScreenCamera():创建独立的静态屏幕空间相机,子状态 UI 不再受 PlayState / Freeplay 相机滚动、缩放与 follow 影响,鼠标命中检测与界面位置稳定。
    • applyBlur() / clearBlur():对底层游戏/菜单相机施加/移除真实 OpenFL 高斯模糊,受 ClientPrefs.data.shaders 开关控制。
    • makeGlassCard():统一样式的半透明圆角玻璃卡片(微 1px 白描边、可自定义填充色)。
  • 原各子状态手动创建的相机(Results / ScoreHistory / Pause / 设置弹窗)全部迁移到 UIScreen.createScreenCamera()。

暂停界面(source/substates/PauseSubState.hx)

  • 改用独立屏幕空间相机 + 背景高斯模糊(半径 8),暂停时背景更柔和。
  • 修复 slideGroup 透视效果下鼠标命中偏移:命中检测现在考虑 scale / origin 变换(之前只补偿 x/y 偏移,缩放后按钮点击区域错位)。
  • 微调 3D 视差参数(偏移 16/10 → 12/8,缩放系数 0.008 → 0.005)。
  • 恢复暂停(resume)与 destroy 时还原背景相机滤镜,避免模糊残留。

设置界面(source/options/OptionsState.hx、新增 source/options/OptionPopupSubState.hx)

  • 新增模态弹窗 OptionPopupSubState:
    • 字符串选项:回车/点击打开下拉列表,方向键或鼠标悬停移动高亮,回车/点击确认,ESC/返回取消。
    • 数值选项:回车/点击打开滑条(Slider),左右键或鼠标拖动改变临时值,回车确认,ESC/返回取消。
    • 弹窗是真正的 FlxSubState,打开期间父设置视图暂停,鼠标与键盘输入不再互相争抢;带首帧输入跳过保护(避免打开弹窗的同一帧回车/点击立即确认或取消)。
    • 玻璃卡片面板 + 弹性进出动画,点击面板外区域可直接取消。
  • 类别预览模式(updateCategoryPreview)暂时禁用并保留接口,等后续重新启用。
  • 鼠标悬停/滚轮逻辑改为仅在未使用键盘时生效(keyboardUsed 判定),修复键鼠混用时选择冲突。

结算界面(source/substates/PlayStateResultsSubstate.hx)

  • 新增顶部“英雄卡”(Hero Card):分数、准确率、评级、最大连击以大字号分区展示,带错峰上浮动画。
  • 结算期间冻结底层 PlayState 更新(persistentUpdate = false)并施加背景模糊(半径 10),阻止结算时游戏相机继续平移/缩放;关闭时完整恢复。
  • 命中条形图支持 Marvelous 评级:开启 magnificent/marvelousRatings 时 Marvelous 作为独立统计组显示(颜色金色、列在最前),Sick/Good/Bad/Shit/Miss 分布条按实际数量动态布局(行数 > 5 时自动压缩行高与间距)。
  • 鼠标命中检测改用 getScreenBounds(考虑缩放与原点),悬停/点击热区不再错位。
  • 面板统一改用 UIScreen.makeGlassCard;评分图标移至英雄卡右侧垂直居中。

回放历史界面(source/substates/ScoreHistorySubstate.hx)

  • 列表行重设计:行高 40 → 58,每行新增副文本(SubText)、判定图标与悬停行背景,悬停即选中,鼠标操作更直观。
  • 双击行播放回放(400ms 内第二次点击同一行);无回放数据时抖动详情卡提示。
  • 删除改为两次 RESET 确认(2.5 秒内第二次按下 RESET 才执行删除,ESC / 超时取消),新增 deleteConfirm 多语言文案。
  • 界面整体使用独立屏幕相机 + 背景模糊(半径 9),开启 shaders 时背景透明度自动降至 0.68。
  • 修复删除条目后列表与选中状态刷新。

Trace 系统(source/mohong/TraceConsole.hx、source/mohong/TraceManager.hx)

  • TraceManager 控制台输出改为默认关闭:Windows 上 Trace Console 为显式开关(启动时不再静默向终端刷屏),其他桌面 sys 目标保留原有 stdout 行为。
  • 新增控制台可用性检测(setConsoleAvailable / isConsoleAvailable,Windows 经 Windows.hasConsole 探测),无输出目标时跳过格式化开销。
  • 新增控制台突发限流(consoleRateLimit 默认 200 条 / consoleRateWindow 0.1 秒),超出部分仍记录环形缓冲但不再刷屏;已有 TraceConsole 监听器时不再重复输出。
  • Main.hx / TitleState.hx:Windows 桌面在偏好加载完成后应用 Trace Console 开关(TraceManager.syncWithPrefs)。

谱面与 Note(source/Note.hx、source/states/PlayState.hx)

  • 0.6.3 自定义 Note 兼容:EventNote / PreloadedChartNote 新增 noteSplashTexture / noteSplashHue / noteSplashSat / noteSplashBrt 字段,Lua 可对单音符设置自定义溅射皮肤与颜色;仅在 Lua 显式设置时覆盖(null 表示未设置),未设置时保持 noteType setter 算出的轨道色溅射,避免普通 Note 被覆盖成全零颜色。写入顺序放在 noteType setter 之后,避免 setter 覆盖自定义溅射颜色。
  • 修复 isGFSide 判定:旧版谱面(isNewVer = false)中 GF 场景音符的 isGF 计算错误(gfSec && rawData < noteAmmo 在 playOpponent 反转后判断失误),改为 isGFSide = gfSec && (gottaHitNote == mustHit)。
  • 修复 0.7.3 / 1.0.4 兼容模式血条图标层级:073/104 的 Bar 是 FlxSpriteGroup,部分角色切换后图标会被血条背景盖住;新增 forceHealthIconsAboveBar(),在构建与角色切换(boyfriendName / dadName 变化)时把图标移到 h...
Read more

Alpha v0.2.1 (build 32952806327)

Pre-release

Choose a tag to compare


Build Info

Automated pre-release from commit d9ecf7f.

Artifacts:

  • Linux x64
  • Windows x64
  • macOS x64
  • macOS arm64 (experimental)
  • Android (APK, armv7 + arm64)
  • iOS Device (IPA)

Checksums are included in SHA256SUMS.txt.

Alpha v0.2.1 (build 32632546430)

Pre-release

Choose a tag to compare

SeiunEngine 更新日志 · Changelog

完整记录 2026年6月19日 至 8月23日 的所有改进、修复与突破
A comprehensive record of every improvement, fix, and breakthrough from June 19 to August 23, 2026.


中文版


2026年6月19日

  • 修复进入 Senpai 歌曲时前段 Note 消失的问题。
  • 修复部分安卓设备在回放历史界面与游戏结束界面闪退的故障。
  • 完全重构 Replay(回放)系统。
  • 更新 Lua 库版本。
  • 重构暂停界面,增加轻微 3D 视觉效果。
  • 新增 Trace 控制台功能。
  • 新增设置备份与恢复机制。

2026年7月18日(阶段性大更新)

脚本与模组系统

  • HScript 脚本已完善至可独立编写模组的程度,支持自定义图标等资源。
  • Lua 兼容性进一步加强,API 处于早期阶段,允许修改(sub)state(未全覆盖测试,可能影响部分模组)。
  • 提供两套 FPS 显示方案,可在模组配置中切换。
  • 健康条(Health Bar)不再使用映射方式,改用 073 Bar.hx 原生创建,彻底修复显示异常。
  • Lua 与 HScript 均可修改(sub)state(早期阶段)。

编辑器与谱面

  • 谱面编辑器支持导入/导出 Codename Engine(CNE)格式,保存功能整合为单一 Prompt 窗口。
  • 修复编辑器内 Prompt 窗口在手机端缺少关闭按钮(X)的问题。
  • 修复新版谱面编辑器中 Note 跑到对方判定区的问题。
  • 修复旧版谱面编辑器中“保存并试玩”会强制写入谱面的问题(改为仅试玩不保存)。
  • 重构新旧两个 ChartingState 的未保存警告逻辑,统一为退出/重载/试玩/预览前均弹窗确认,不再自动保存。
  • 新增“谱面自动保存”设置(默认关闭),开启后定时自动备份。
  • 修复谱面 0.6.3 转换时的兼容性问题(7.20 另有专项修复)。

性能与渲染

  • 优化大批量 Note(数万至数十万)的帧率与内存占用(图集帧缓存,提升加载速度)。
  • 进一步优化同场景下大量 Note 的加载效率(缓存帧扫描结果,避免重复开销)。
  • 清理 Note 构造时的自指环隐患(prevNote 不再自指)。
  • 底层渲染微优化。
  • 删除多线程更新(因 BUG 过多)。
  • 修复 Note 从超慢速变超快速时长条异常变长的问题。

界面与交互

  • 重写设置界面(简化为单个类),支持模组通过 JSON + HScript + Lua 自定义菜单及动画。
  • 重构模组加载流程:FreePlay 不再一股脑显示所有模组歌曲,改为 Tab 切换;主页面增加模组切换子状态(独立于 FreePlay)。
  • 将 Combo 等图像生成优化,降低内存占用,避免粪谱卡顿。
  • 暂停界面保留旧版(OldPauseSubState),可选用。
  • 移植 PsychCamera 等 0.7.3 / 1.0.4 特有类。
  • 修复 mustHitSection 影响玩家动作播放的问题。
  • 修复练习模式准确率显示错误(仅为显示问题)。
  • 修复 Replay 未记录手机端虚拟控件输入的问题。
  • 修复只有一个模组时无法打开菜单的漏洞。

兼容性与其他

  • MusicBeat(sub)State 在电脑端增加手机虚拟按键空实现,便于 PC 支持触屏。
  • 修复新版 Replay 记录缺失手机控件数据的问题。
  • 修复安卓设备相关兼容性问题。

2026年7月19日

  • 修复 Sparrow XML 帧中 rotated="true" 未正确应用角度旋转的问题。
  • 增加全局模组列表选项。
  • 安卓设置支持用户自定义文件存放类型,适配高版本 Android 的 data 目录限制。
  • 修复人物无法正常翻转的问题。
  • 优化歌曲进入速度。
  • 代码清理(含移除冗余日志、恢复 CO 兼容性等)。

2026年7月20日

  • 修复谱面 0.6.3 转换问题(独立修复)。

2026年7月21日

  • 移除安卓激进优化设置。
  • 修复所有场景均会加载 stage 图片的冗余问题。
  • 修复兼容模式下 timeBar 的 cameras 为 null 导致崩溃的问题。

2026年7月31日(大量修复与改进)

脚本与判定

  • 修复 Botplay 下命中 Hurt / ignoreNote 音符无法触发 Lua / HScript 事件的问题。
  • 修复未选择模组却错误加载其他模组 Main.hx 的渗透问题。
  • 修复 pack.json 缺少 restart 字段导致崩溃的问题。
  • 修复倒计时未结束歌曲提前开始的问题。
  • 修复倒计时期间 Note 判定 ms 异常(现与正曲一致)。
  • 新增“忽略循环报错脚本”设置(默认开启),并配套“脚本报错上限”(默认 50 次),持续报错的脚本将静默停用,避免刷屏。
  • HScript 默认走错误上限逻辑,不再首次报错就弹窗关闭。

编辑器与谱面

  • 修复 MasterEditorMenu 选择模组后首次进入编辑器仍加载原版资源的问题。
  • 彻底统一新旧编辑器的保存警告逻辑,不再自动保存。
  • 新增“谱面自动保存”选项(默认关闭)。

性能与 UI

  • 再度优化大批量 Note 加载速度(缓存帧扫描、单次纹理加载)。
  • KeyboardDisplay 全面软编码化(支持自定义键大小、间距、字体、颜色、透明度等),并提供 fullyCustom 开关及按压/释放/更新钩子。
  • 游戏结束结算界面(Results)与回放历史界面(ScoreHistory)UI 现代化,采用弹性进场动画、鼠标悬停反馈、动态排版,修复文字重叠、截断等问题。
  • 暂停界面提高透明度(黑底、亚克力、玻璃卡片均更透),参数可调。
  • 优化回放系统(Replay)。

2026年8月18日

  • 进一步优化 Note 性能:针对极限谱面(数十万级 Note)做了额外的加载与渲染加速,帧率更稳定。
  • 修复 Vs slice 模组谱面转换时导致的崩溃问题:解决了该模组特定谱面在转换过程中因数据解析异常引发的程序崩溃。
  • 修复若干已知问题:包括社区反馈的特定模组兼容性、偶发闪退及界面显示异常。
  • 底层升级 SDL3:将原 SDL2 渲染后端迁移至 SDL3,提升跨平台图形性能及输入响应,为后续功能预留接口。
  • 修复 Windows 图标错误:解决了因 Lime 构建图标注入错误导致的 Windows 可执行文件图标显示异常的问题。
  • 补充制作人员名单:在相关界面中补全了参与本项目开发的贡献者信息。

2026年8月19日

  • 修复 Replay 无法正常播放的问题,具体原因如下:
    1. ScoreHistorySubstate.playReplay() 直接调用 Song.loadFromJson() 时,未像 Freeplay 那样先切换至歌曲所属模组目录,导致 Paths.modsJson() 无法定位模组谱面,回退读取 assets/data/ 目录。
    2. 同步增强了 Replay 判定精度。
  • 彻底移除了 GPUTextureManager 及“GPU纹理池化”设置,修复开启该选项后大图或全屏区域出现黑块的问题。
  • 补全新版 Adobe Animate(spritemap1)角色支持。
  • 修复 FlxAnimate 角色动画播放异常的问题。
  • 修复 Lua playAnim 接口在特定场景下无法正确触发角色动画的问题。
  • 修复 StageData 兼容性问题,解决部分模组舞台加载失败或显示错乱的现象。
  • 修复相机缩放(camera zoom)相关逻辑,确保缩放行为与预期一致。
  • 修复 healthBar.scale 读取异常,解决健康条在部分模组中缩放比例不正确的问题。

2026年8月20日 — SeiunEngine 0.7.3 兼容性全量修复

新增 0.7.3 兼容层

  • 新增 backend.Mods 兼容类(source/backend/Mods.hx),提供 0.7.3 模组 HScript 依赖的 Mods API:currentModDirectory、getGlobalMods、pushGlobalMods、getModDirectories、mergeAllTextsNamed、directoriesWithFile、getPack、parseList、updateModList、loadTopMod,全部委托给 Seiun 已有的 Paths 与 CoolUtil,避免重复维护。
  • 修复 Lua 脚本 onCreate 期间无法被其他脚本回调注册的问题(source/script/lua/FunkinLua.hx):现在 call('onCreate') 之前会把当前 Lua 脚本临时加入 PlayState.instance.luaArray,onCreate 结束后再移除。该修复解决了 Pause.lua 的 onCreate 调用 parseJson 时为 nil 的根因,同时修复了 jsonReader.hx 的 createGlobalCallback 注册不到当前脚本的问题。

暂停菜单 / CustomSubstate

  • CustomSubstate 的 Lua 全局改为安全值(source/script/lua/FunkinLua.hx):Lua 侧 customSubstate 不再直接存放 CustomSubstate 实例,改为子状态名字符串(如 "NEW_pause_menu");HScript 侧仍保留真实 CustomSubstate 实例。消除了 "Convert: Haxe value ... not supported" 报错。

版本 / 变量兼容

  • version 全局跟随兼容模式(source/script/lua/FunkinLua.hx、source/script/hscript/HScript.hx):version 现在等于 CompatEngine.current(),0.6.3 / 0.7.3 / 1.0.4 模式会返回对应版本号。
  • opponentVocals 重命名(source/states/PlayState.hx、source/editors/ChartingState.hx):原 vocalsOpponent 全部重命名为 0.7.3 的 opponentVocals。
  • 新增 0.7.3 属性:PlayState.inst 指向 FlxG.sound.music 的 instrumental 别名;PlayState.stageUI 支持 stage json 的 stageUI 字段;PlayState.iconsAnimations 默认 true,供 iconShake 等脚本读取;StageData.StageFile 增加可选 stageUI 字段。
  • noteSkinPostfix / splashSkinPostfix(source/script/lua/FunkinLua.hx)不再硬编码为空,改为读取 Note.getNoteSkinPostfix() 和 NoteSplash.getSplashSkinPostfix()。

缺失回调补全

  • 成就系统完整兼容(source/Achievements.hx):保留旧版 Seiun 成就 API(achievementsStuff、achievementsMap、henchmenDeath、loadAchievements、unlockAchievement、isAchievementUnlocked、getAchievementIndex、AchievementObject、AttachedAchievement);移植 0.7.3 成就系统(Achievement typedef、achievements、variables、achievementsUnlocked、getScore、setScore、addScore、unlock、isUnlocked、startPopup、createAchievement、reloadList、loadAchievementJson);新增 Lua 回调(getAchievementScore、setAchievementScore、addAchievementScore、unlockAchievement、isAchievementUnlocked、achievementExists)。
  • Discord 兼容别名(source/Discord.hx):新增 clientID、_defaultID 静态变量;source/script/lua/FunkinLua.hx 新增 Lua 回调(changeDiscordPresence、changeDiscordClientID)。

调用顺序修复

  • PlayState 的 onCreatePost 顺序对齐 0.7.3(source/states/PlayState.hx):Lua onCreatePost 在 super.create() 之前调用一次;HScript onCreatePost 由 super.create() 内部调用一次;删除原先重复的 callOnScripts('onCreatePost'),避免 HScript 执行两次。

哨兵值兼容

  • Function_Stop 等常量改为 0.7.3 字符串哨兵(source/script/lua/FunkinLua.hx、source/psychlua/LuaUtils.hx、source/editors/EditorLua.hx):Function_Stop、Function_Continue、Function_StopLua、Function_StopHScript、Function_StopAll 全部改为 "##PSYCHLUA_*" 字符串,与 0.7.3 / 1.0.4 一致。

控制器 / 输入兼容

  • keyboardJustPressed 键盘 + 手柄回退(source/script/lua/FunkinLua.hx):ENTER、SPACE、Z 键盘没按时回退到 Controls.ACCEPT;ESCAPE、BACKSPACE 回退到 Controls.BACK;W、UP、S、DOWN、A、LEFT、D、RIGHT 回退到 UI_*_P。keyboardPressed、keyboardReleased 也补了对应的按住/松开回退。
  • keyJustPressed / keyPressed / keyReleased 补 default(source/script/lua/FunkinLua.hx):未匹配的名字会走 controls.justPressed / pressed / justReleased,与 0.7.3 ExtraFunctions 行为一致。

版本显示调整

  • 主菜单 PE 版本显示(source/states/MainMenuState.hx):显示 "Psych Engine v0.6.3+0.7.3+1.0.4 (Active: 当前兼容版本)",所有版本文字改为右对齐,贴住屏幕右边缘,避免长文本溢出。
  • 游戏内左下角 PE 版本显示(source/states/PlayState.hx):左下角版本文字中的 PE 版本改为 CompatEngine.current(),跟随当前激活的兼容模式显示。

2026年8月21日

  • 修复 Replay 若干遗留问题(回放难度锁定、回放数据完整性等)。
  • 移除 OSU 尾判设置选项(gameplay 选项、ClientPrefs 与回放/判定相关代码一并清理)。

2026年8月22日(UI 架构统一重构 + 设置弹窗)

通用 UI 基础(新增 source/backend/UIScreen.hx)

  • 新增 UIScreen 工具类,统一各现代界面的玻璃/亚克力 UI 实现:
    • createScreenCamera():创建独立的静态屏幕空间相机,子状态 UI 不再受 PlayState / Freeplay 相机滚动、缩放与 follow 影响,鼠标命中检测与界面位置稳定。
    • applyBlur() / clearBlur():对底层游戏/菜单相机施加/移除真实 OpenFL 高斯模糊,受 ClientPrefs.data.shaders 开关控制。
    • makeGlassCard():统一样式的半透明圆角玻璃卡片(微 1px 白描边、可自定义填充色)。
  • 原各子状态手动创建的相机(Results / ScoreHistory / Pause / 设置弹窗)全部迁移到 UIScreen.createScreenCamera()。

暂停界面(source/substates/PauseSubState.hx)

  • 改用独立屏幕空间相机 + 背景高斯模糊(半径 8),暂停时背景更柔和。
  • 修复 slideGroup 透视效果下鼠标命中偏移:命中检测现在考虑 scale / origin 变换(之前只补偿 x/y 偏移,缩放后按钮点击区域错位)。
  • 微调 3D 视差参数(偏移 16/10 → 12/8,缩放系数 0.008 → 0.005)。
  • 恢复暂停(resume)与 destroy 时还原背景相机滤镜,避免模糊残留。

设置界面(source/options/OptionsState.hx、新增 source/options/OptionPopupSubState.hx)

  • 新增模态弹窗 OptionPopupSubState:
    • 字符串选项:回车/点击打开下拉列表,方向键或鼠标悬停移动高亮,回车/点击确认,ESC/返回取消。
    • 数值选项:回车/点击打开滑条(Slider),左右键或鼠标拖动改变临时值,回车确认,ESC/返回取消。
    • 弹窗是真正的 FlxSubState,打开期间父设置视图暂停,鼠标与键盘输入不再互相争抢;带首帧输入跳过保护(避免打开弹窗的同一帧回车/点击立即确认或取消)。
    • 玻璃卡片面板 + 弹性进出动画,点击面板外区域可直接取消。
  • 类别预览模式(updateCategoryPreview)暂时禁用并保留接口,等后续重新启用。
  • 鼠标悬停/滚轮逻辑改为仅在未使用键盘时生效(keyboardUsed 判定),修复键鼠混用时选择冲突。

结算界面(source/substates/PlayStateResultsSubstate.hx)

  • 新增顶部“英雄卡”(Hero Card):分数、准确率、评级、最大连击以大字号分区展示,带错峰上浮动画。
  • 结算期间冻结底层 PlayState 更新(persistentUpdate = false)并施加背景模糊(半径 10),阻止结算时游戏相机继续平移/缩放;关闭时完整恢复。
  • 命中条形图支持 Marvelous 评级:开启 magnificent/marvelousRatings 时 Marvelous 作为独立统计组显示(颜色金色、列在最前),Sick/Good/Bad/Shit/Miss 分布条按实际数量动态布局(行数 > 5 时自动压缩行高与间距)。
  • 鼠标命中检测改用 getScreenBounds(考虑缩放与原点),悬停/点击热区不再错位。
  • 面板统一改用 UIScreen.makeGlassCard;评分图标移至英雄卡右侧垂直居中。

回放历史界面(source/substates/ScoreHistorySubstate.hx)

  • 列表行重设计:行高 40 → 58,每行新增副文本(SubText)、判定图标与悬停行背景,悬停即选中,鼠标操作更直观。
  • 双击行播放回放(400ms 内第二次点击同一行);无回放数据时抖动详情卡提示。
  • 删除改为两次 RESET 确认(2.5 秒内第二次按下 RESET 才执行删除,ESC / 超时取消),新增 deleteConfirm 多语言文案。
  • 界面整体使用独立屏幕相机 + 背景模糊(半径 9),开启 shaders 时背景透明度自动降至 0.68。
  • 修复删除条目后列表与选中状态刷新。

Trace 系统(source/mohong/TraceConsole.hx、source/mohong/TraceManager.hx)

  • TraceManager 控制台输出改为默认关闭:Windows 上 Trace Console 为显式开关(启动时不再静默向终端刷屏),其他桌面 sys 目标保留原有 stdout 行为。
  • 新增控制台可用性检测(setConsoleAvailable / isConsoleAvailable,Windows 经 Windows.hasConsole 探测),无输出目标时跳过格式化开销。
  • 新增控制台突发限流(consoleRateLimit 默认 200 条 / consoleRateWindow 0.1 秒),超出部分仍记录环形缓冲但不再刷屏;已有 TraceConsole 监听器时不再重复输出。
  • Main.hx / TitleState.hx:Windows 桌面在偏好加载完成后应用 Trace Console 开关(TraceManager.syncWithPrefs)。

谱面与 Note(source/Note.hx、source/states/PlayState.hx)

  • 0.6.3 自定义 Note 兼容:EventNote / PreloadedChartNote 新增 noteSplashTexture / noteSplashHue / noteSplashSat / noteSplashBrt 字段,Lua 可对单音符设置自定义溅射皮肤与颜色;仅在 Lua 显式设置时覆盖(null 表示未设置),未设置时保持 noteType setter 算出的轨道色溅射,避免普通 Note 被覆盖成全零颜色。写入顺序放在 noteType setter 之后,避免 setter 覆盖自定义溅射颜色。
  • 修复 isGFSide 判定:旧版谱面(isNewVer = false)中 GF 场景音符的 isGF 计算错误(gfSec && rawData < noteAmmo 在 playOpponent 反转后判断失误),改为 isGFSide = gfSec && (gottaHitNote == mustHit)。
  • 修复 0.7.3 / 1.0.4 兼容模式血条图标层级:073/104 的 Bar 是 FlxSpriteGroup,部分角色切换后图标会被血条背景盖住;新增 forceHealthIconsAboveBar(),在构建与角色切换(boyfriendName / dadName 变化)时把图标移到 h...
Read more

Alpha v0.2.1 (build 32609230523)

Pre-release

Choose a tag to compare

SeiunEngine 更新日志 · Changelog

完整记录 2026年6月19日 至 8月23日 的所有改进、修复与突破
A comprehensive record of every improvement, fix, and breakthrough from June 19 to August 23, 2026.


中文版


2026年6月19日

  • 修复进入 Senpai 歌曲时前段 Note 消失的问题。
  • 修复部分安卓设备在回放历史界面与游戏结束界面闪退的故障。
  • 完全重构 Replay(回放)系统。
  • 更新 Lua 库版本。
  • 重构暂停界面,增加轻微 3D 视觉效果。
  • 新增 Trace 控制台功能。
  • 新增设置备份与恢复机制。

2026年7月18日(阶段性大更新)

脚本与模组系统

  • HScript 脚本已完善至可独立编写模组的程度,支持自定义图标等资源。
  • Lua 兼容性进一步加强,API 处于早期阶段,允许修改(sub)state(未全覆盖测试,可能影响部分模组)。
  • 提供两套 FPS 显示方案,可在模组配置中切换。
  • 健康条(Health Bar)不再使用映射方式,改用 073 Bar.hx 原生创建,彻底修复显示异常。
  • Lua 与 HScript 均可修改(sub)state(早期阶段)。

编辑器与谱面

  • 谱面编辑器支持导入/导出 Codename Engine(CNE)格式,保存功能整合为单一 Prompt 窗口。
  • 修复编辑器内 Prompt 窗口在手机端缺少关闭按钮(X)的问题。
  • 修复新版谱面编辑器中 Note 跑到对方判定区的问题。
  • 修复旧版谱面编辑器中“保存并试玩”会强制写入谱面的问题(改为仅试玩不保存)。
  • 重构新旧两个 ChartingState 的未保存警告逻辑,统一为退出/重载/试玩/预览前均弹窗确认,不再自动保存。
  • 新增“谱面自动保存”设置(默认关闭),开启后定时自动备份。
  • 修复谱面 0.6.3 转换时的兼容性问题(7.20 另有专项修复)。

性能与渲染

  • 优化大批量 Note(数万至数十万)的帧率与内存占用(图集帧缓存,提升加载速度)。
  • 进一步优化同场景下大量 Note 的加载效率(缓存帧扫描结果,避免重复开销)。
  • 清理 Note 构造时的自指环隐患(prevNote 不再自指)。
  • 底层渲染微优化。
  • 删除多线程更新(因 BUG 过多)。
  • 修复 Note 从超慢速变超快速时长条异常变长的问题。

界面与交互

  • 重写设置界面(简化为单个类),支持模组通过 JSON + HScript + Lua 自定义菜单及动画。
  • 重构模组加载流程:FreePlay 不再一股脑显示所有模组歌曲,改为 Tab 切换;主页面增加模组切换子状态(独立于 FreePlay)。
  • 将 Combo 等图像生成优化,降低内存占用,避免粪谱卡顿。
  • 暂停界面保留旧版(OldPauseSubState),可选用。
  • 移植 PsychCamera 等 0.7.3 / 1.0.4 特有类。
  • 修复 mustHitSection 影响玩家动作播放的问题。
  • 修复练习模式准确率显示错误(仅为显示问题)。
  • 修复 Replay 未记录手机端虚拟控件输入的问题。
  • 修复只有一个模组时无法打开菜单的漏洞。

兼容性与其他

  • MusicBeat(sub)State 在电脑端增加手机虚拟按键空实现,便于 PC 支持触屏。
  • 修复新版 Replay 记录缺失手机控件数据的问题。
  • 修复安卓设备相关兼容性问题。

2026年7月19日

  • 修复 Sparrow XML 帧中 rotated="true" 未正确应用角度旋转的问题。
  • 增加全局模组列表选项。
  • 安卓设置支持用户自定义文件存放类型,适配高版本 Android 的 data 目录限制。
  • 修复人物无法正常翻转的问题。
  • 优化歌曲进入速度。
  • 代码清理(含移除冗余日志、恢复 CO 兼容性等)。

2026年7月20日

  • 修复谱面 0.6.3 转换问题(独立修复)。

2026年7月21日

  • 移除安卓激进优化设置。
  • 修复所有场景均会加载 stage 图片的冗余问题。
  • 修复兼容模式下 timeBar 的 cameras 为 null 导致崩溃的问题。

2026年7月31日(大量修复与改进)

脚本与判定

  • 修复 Botplay 下命中 Hurt / ignoreNote 音符无法触发 Lua / HScript 事件的问题。
  • 修复未选择模组却错误加载其他模组 Main.hx 的渗透问题。
  • 修复 pack.json 缺少 restart 字段导致崩溃的问题。
  • 修复倒计时未结束歌曲提前开始的问题。
  • 修复倒计时期间 Note 判定 ms 异常(现与正曲一致)。
  • 新增“忽略循环报错脚本”设置(默认开启),并配套“脚本报错上限”(默认 50 次),持续报错的脚本将静默停用,避免刷屏。
  • HScript 默认走错误上限逻辑,不再首次报错就弹窗关闭。

编辑器与谱面

  • 修复 MasterEditorMenu 选择模组后首次进入编辑器仍加载原版资源的问题。
  • 彻底统一新旧编辑器的保存警告逻辑,不再自动保存。
  • 新增“谱面自动保存”选项(默认关闭)。

性能与 UI

  • 再度优化大批量 Note 加载速度(缓存帧扫描、单次纹理加载)。
  • KeyboardDisplay 全面软编码化(支持自定义键大小、间距、字体、颜色、透明度等),并提供 fullyCustom 开关及按压/释放/更新钩子。
  • 游戏结束结算界面(Results)与回放历史界面(ScoreHistory)UI 现代化,采用弹性进场动画、鼠标悬停反馈、动态排版,修复文字重叠、截断等问题。
  • 暂停界面提高透明度(黑底、亚克力、玻璃卡片均更透),参数可调。
  • 优化回放系统(Replay)。

2026年8月18日

  • 进一步优化 Note 性能:针对极限谱面(数十万级 Note)做了额外的加载与渲染加速,帧率更稳定。
  • 修复 Vs slice 模组谱面转换时导致的崩溃问题:解决了该模组特定谱面在转换过程中因数据解析异常引发的程序崩溃。
  • 修复若干已知问题:包括社区反馈的特定模组兼容性、偶发闪退及界面显示异常。
  • 底层升级 SDL3:将原 SDL2 渲染后端迁移至 SDL3,提升跨平台图形性能及输入响应,为后续功能预留接口。
  • 修复 Windows 图标错误:解决了因 Lime 构建图标注入错误导致的 Windows 可执行文件图标显示异常的问题。
  • 补充制作人员名单:在相关界面中补全了参与本项目开发的贡献者信息。

2026年8月19日

  • 修复 Replay 无法正常播放的问题,具体原因如下:
    1. ScoreHistorySubstate.playReplay() 直接调用 Song.loadFromJson() 时,未像 Freeplay 那样先切换至歌曲所属模组目录,导致 Paths.modsJson() 无法定位模组谱面,回退读取 assets/data/ 目录。
    2. 同步增强了 Replay 判定精度。
  • 彻底移除了 GPUTextureManager 及“GPU纹理池化”设置,修复开启该选项后大图或全屏区域出现黑块的问题。
  • 补全新版 Adobe Animate(spritemap1)角色支持。
  • 修复 FlxAnimate 角色动画播放异常的问题。
  • 修复 Lua playAnim 接口在特定场景下无法正确触发角色动画的问题。
  • 修复 StageData 兼容性问题,解决部分模组舞台加载失败或显示错乱的现象。
  • 修复相机缩放(camera zoom)相关逻辑,确保缩放行为与预期一致。
  • 修复 healthBar.scale 读取异常,解决健康条在部分模组中缩放比例不正确的问题。

2026年8月20日 — SeiunEngine 0.7.3 兼容性全量修复

新增 0.7.3 兼容层

  • 新增 backend.Mods 兼容类(source/backend/Mods.hx),提供 0.7.3 模组 HScript 依赖的 Mods API:currentModDirectory、getGlobalMods、pushGlobalMods、getModDirectories、mergeAllTextsNamed、directoriesWithFile、getPack、parseList、updateModList、loadTopMod,全部委托给 Seiun 已有的 Paths 与 CoolUtil,避免重复维护。
  • 修复 Lua 脚本 onCreate 期间无法被其他脚本回调注册的问题(source/script/lua/FunkinLua.hx):现在 call('onCreate') 之前会把当前 Lua 脚本临时加入 PlayState.instance.luaArray,onCreate 结束后再移除。该修复解决了 Pause.lua 的 onCreate 调用 parseJson 时为 nil 的根因,同时修复了 jsonReader.hx 的 createGlobalCallback 注册不到当前脚本的问题。

暂停菜单 / CustomSubstate

  • CustomSubstate 的 Lua 全局改为安全值(source/script/lua/FunkinLua.hx):Lua 侧 customSubstate 不再直接存放 CustomSubstate 实例,改为子状态名字符串(如 "NEW_pause_menu");HScript 侧仍保留真实 CustomSubstate 实例。消除了 "Convert: Haxe value ... not supported" 报错。

版本 / 变量兼容

  • version 全局跟随兼容模式(source/script/lua/FunkinLua.hx、source/script/hscript/HScript.hx):version 现在等于 CompatEngine.current(),0.6.3 / 0.7.3 / 1.0.4 模式会返回对应版本号。
  • opponentVocals 重命名(source/states/PlayState.hx、source/editors/ChartingState.hx):原 vocalsOpponent 全部重命名为 0.7.3 的 opponentVocals。
  • 新增 0.7.3 属性:PlayState.inst 指向 FlxG.sound.music 的 instrumental 别名;PlayState.stageUI 支持 stage json 的 stageUI 字段;PlayState.iconsAnimations 默认 true,供 iconShake 等脚本读取;StageData.StageFile 增加可选 stageUI 字段。
  • noteSkinPostfix / splashSkinPostfix(source/script/lua/FunkinLua.hx)不再硬编码为空,改为读取 Note.getNoteSkinPostfix() 和 NoteSplash.getSplashSkinPostfix()。

缺失回调补全

  • 成就系统完整兼容(source/Achievements.hx):保留旧版 Seiun 成就 API(achievementsStuff、achievementsMap、henchmenDeath、loadAchievements、unlockAchievement、isAchievementUnlocked、getAchievementIndex、AchievementObject、AttachedAchievement);移植 0.7.3 成就系统(Achievement typedef、achievements、variables、achievementsUnlocked、getScore、setScore、addScore、unlock、isUnlocked、startPopup、createAchievement、reloadList、loadAchievementJson);新增 Lua 回调(getAchievementScore、setAchievementScore、addAchievementScore、unlockAchievement、isAchievementUnlocked、achievementExists)。
  • Discord 兼容别名(source/Discord.hx):新增 clientID、_defaultID 静态变量;source/script/lua/FunkinLua.hx 新增 Lua 回调(changeDiscordPresence、changeDiscordClientID)。

调用顺序修复

  • PlayState 的 onCreatePost 顺序对齐 0.7.3(source/states/PlayState.hx):Lua onCreatePost 在 super.create() 之前调用一次;HScript onCreatePost 由 super.create() 内部调用一次;删除原先重复的 callOnScripts('onCreatePost'),避免 HScript 执行两次。

哨兵值兼容

  • Function_Stop 等常量改为 0.7.3 字符串哨兵(source/script/lua/FunkinLua.hx、source/psychlua/LuaUtils.hx、source/editors/EditorLua.hx):Function_Stop、Function_Continue、Function_StopLua、Function_StopHScript、Function_StopAll 全部改为 "##PSYCHLUA_*" 字符串,与 0.7.3 / 1.0.4 一致。

控制器 / 输入兼容

  • keyboardJustPressed 键盘 + 手柄回退(source/script/lua/FunkinLua.hx):ENTER、SPACE、Z 键盘没按时回退到 Controls.ACCEPT;ESCAPE、BACKSPACE 回退到 Controls.BACK;W、UP、S、DOWN、A、LEFT、D、RIGHT 回退到 UI_*_P。keyboardPressed、keyboardReleased 也补了对应的按住/松开回退。
  • keyJustPressed / keyPressed / keyReleased 补 default(source/script/lua/FunkinLua.hx):未匹配的名字会走 controls.justPressed / pressed / justReleased,与 0.7.3 ExtraFunctions 行为一致。

版本显示调整

  • 主菜单 PE 版本显示(source/states/MainMenuState.hx):显示 "Psych Engine v0.6.3+0.7.3+1.0.4 (Active: 当前兼容版本)",所有版本文字改为右对齐,贴住屏幕右边缘,避免长文本溢出。
  • 游戏内左下角 PE 版本显示(source/states/PlayState.hx):左下角版本文字中的 PE 版本改为 CompatEngine.current(),跟随当前激活的兼容模式显示。

2026年8月21日

  • 修复 Replay 若干遗留问题(回放难度锁定、回放数据完整性等)。
  • 移除 OSU 尾判设置选项(gameplay 选项、ClientPrefs 与回放/判定相关代码一并清理)。

2026年8月22日(UI 架构统一重构 + 设置弹窗)

通用 UI 基础(新增 source/backend/UIScreen.hx)

  • 新增 UIScreen 工具类,统一各现代界面的玻璃/亚克力 UI 实现:
    • createScreenCamera():创建独立的静态屏幕空间相机,子状态 UI 不再受 PlayState / Freeplay 相机滚动、缩放与 follow 影响,鼠标命中检测与界面位置稳定。
    • applyBlur() / clearBlur():对底层游戏/菜单相机施加/移除真实 OpenFL 高斯模糊,受 ClientPrefs.data.shaders 开关控制。
    • makeGlassCard():统一样式的半透明圆角玻璃卡片(微 1px 白描边、可自定义填充色)。
  • 原各子状态手动创建的相机(Results / ScoreHistory / Pause / 设置弹窗)全部迁移到 UIScreen.createScreenCamera()。

暂停界面(source/substates/PauseSubState.hx)

  • 改用独立屏幕空间相机 + 背景高斯模糊(半径 8),暂停时背景更柔和。
  • 修复 slideGroup 透视效果下鼠标命中偏移:命中检测现在考虑 scale / origin 变换(之前只补偿 x/y 偏移,缩放后按钮点击区域错位)。
  • 微调 3D 视差参数(偏移 16/10 → 12/8,缩放系数 0.008 → 0.005)。
  • 恢复暂停(resume)与 destroy 时还原背景相机滤镜,避免模糊残留。

设置界面(source/options/OptionsState.hx、新增 source/options/OptionPopupSubState.hx)

  • 新增模态弹窗 OptionPopupSubState:
    • 字符串选项:回车/点击打开下拉列表,方向键或鼠标悬停移动高亮,回车/点击确认,ESC/返回取消。
    • 数值选项:回车/点击打开滑条(Slider),左右键或鼠标拖动改变临时值,回车确认,ESC/返回取消。
    • 弹窗是真正的 FlxSubState,打开期间父设置视图暂停,鼠标与键盘输入不再互相争抢;带首帧输入跳过保护(避免打开弹窗的同一帧回车/点击立即确认或取消)。
    • 玻璃卡片面板 + 弹性进出动画,点击面板外区域可直接取消。
  • 类别预览模式(updateCategoryPreview)暂时禁用并保留接口,等后续重新启用。
  • 鼠标悬停/滚轮逻辑改为仅在未使用键盘时生效(keyboardUsed 判定),修复键鼠混用时选择冲突。

结算界面(source/substates/PlayStateResultsSubstate.hx)

  • 新增顶部“英雄卡”(Hero Card):分数、准确率、评级、最大连击以大字号分区展示,带错峰上浮动画。
  • 结算期间冻结底层 PlayState 更新(persistentUpdate = false)并施加背景模糊(半径 10),阻止结算时游戏相机继续平移/缩放;关闭时完整恢复。
  • 命中条形图支持 Marvelous 评级:开启 magnificent/marvelousRatings 时 Marvelous 作为独立统计组显示(颜色金色、列在最前),Sick/Good/Bad/Shit/Miss 分布条按实际数量动态布局(行数 > 5 时自动压缩行高与间距)。
  • 鼠标命中检测改用 getScreenBounds(考虑缩放与原点),悬停/点击热区不再错位。
  • 面板统一改用 UIScreen.makeGlassCard;评分图标移至英雄卡右侧垂直居中。

回放历史界面(source/substates/ScoreHistorySubstate.hx)

  • 列表行重设计:行高 40 → 58,每行新增副文本(SubText)、判定图标与悬停行背景,悬停即选中,鼠标操作更直观。
  • 双击行播放回放(400ms 内第二次点击同一行);无回放数据时抖动详情卡提示。
  • 删除改为两次 RESET 确认(2.5 秒内第二次按下 RESET 才执行删除,ESC / 超时取消),新增 deleteConfirm 多语言文案。
  • 界面整体使用独立屏幕相机 + 背景模糊(半径 9),开启 shaders 时背景透明度自动降至 0.68。
  • 修复删除条目后列表与选中状态刷新。

Trace 系统(source/mohong/TraceConsole.hx、source/mohong/TraceManager.hx)

  • TraceManager 控制台输出改为默认关闭:Windows 上 Trace Console 为显式开关(启动时不再静默向终端刷屏),其他桌面 sys 目标保留原有 stdout 行为。
  • 新增控制台可用性检测(setConsoleAvailable / isConsoleAvailable,Windows 经 Windows.hasConsole 探测),无输出目标时跳过格式化开销。
  • 新增控制台突发限流(consoleRateLimit 默认 200 条 / consoleRateWindow 0.1 秒),超出部分仍记录环形缓冲但不再刷屏;已有 TraceConsole 监听器时不再重复输出。
  • Main.hx / TitleState.hx:Windows 桌面在偏好加载完成后应用 Trace Console 开关(TraceManager.syncWithPrefs)。

谱面与 Note(source/Note.hx、source/states/PlayState.hx)

  • 0.6.3 自定义 Note 兼容:EventNote / PreloadedChartNote 新增 noteSplashTexture / noteSplashHue / noteSplashSat / noteSplashBrt 字段,Lua 可对单音符设置自定义溅射皮肤与颜色;仅在 Lua 显式设置时覆盖(null 表示未设置),未设置时保持 noteType setter 算出的轨道色溅射,避免普通 Note 被覆盖成全零颜色。写入顺序放在 noteType setter 之后,避免 setter 覆盖自定义溅射颜色。
  • 修复 isGFSide 判定:旧版谱面(isNewVer = false)中 GF 场景音符的 isGF 计算错误(gfSec && rawData < noteAmmo 在 playOpponent 反转后判断失误),改为 isGFSide = gfSec && (gottaHitNote == mustHit)。
  • 修复 0.7.3 / 1.0.4 兼容模式血条图标层级:073/104 的 Bar 是 FlxSpriteGroup,部分角色切换后图标会被血条背景盖住;新增 forceHealthIconsAboveBar(),在构建与角色切换(boyfriendName / dadName 变化)时把图标移到 h...
Read more

Alpha v0.2.1 (build 32576985966)

Pre-release

Choose a tag to compare

SeiunEngine 更新日志 · Changelog

完整记录 2026年6月19日 至 8月22日 的所有改进、修复与突破
A comprehensive record of every improvement, fix, and breakthrough from June 19 to August 22, 2026.


中文版


2026年6月19日

  • 修复进入 Senpai 歌曲时前段 Note 消失的问题。
  • 修复部分安卓设备在回放历史界面与游戏结束界面闪退的故障。
  • 完全重构 Replay(回放)系统。
  • 更新 Lua 库版本。
  • 重构暂停界面,增加轻微 3D 视觉效果。
  • 新增 Trace 控制台功能。
  • 新增设置备份与恢复机制。

2026年7月18日(阶段性大更新)

脚本与模组系统

  • HScript 脚本已完善至可独立编写模组的程度,支持自定义图标等资源。
  • Lua 兼容性进一步加强,API 处于早期阶段,允许修改(sub)state(未全覆盖测试,可能影响部分模组)。
  • 提供两套 FPS 显示方案,可在模组配置中切换。
  • 健康条(Health Bar)不再使用映射方式,改用 073 Bar.hx 原生创建,彻底修复显示异常。
  • Lua 与 HScript 均可修改(sub)state(早期阶段)。

编辑器与谱面

  • 谱面编辑器支持导入/导出 Codename Engine(CNE)格式,保存功能整合为单一 Prompt 窗口。
  • 修复编辑器内 Prompt 窗口在手机端缺少关闭按钮(X)的问题。
  • 修复新版谱面编辑器中 Note 跑到对方判定区的问题。
  • 修复旧版谱面编辑器中“保存并试玩”会强制写入谱面的问题(改为仅试玩不保存)。
  • 重构新旧两个 ChartingState 的未保存警告逻辑,统一为退出/重载/试玩/预览前均弹窗确认,不再自动保存。
  • 新增“谱面自动保存”设置(默认关闭),开启后定时自动备份。
  • 修复谱面 0.6.3 转换时的兼容性问题(7.20 另有专项修复)。

性能与渲染

  • 优化大批量 Note(数万至数十万)的帧率与内存占用(图集帧缓存,提升加载速度)。
  • 进一步优化同场景下大量 Note 的加载效率(缓存帧扫描结果,避免重复开销)。
  • 清理 Note 构造时的自指环隐患(prevNote 不再自指)。
  • 底层渲染微优化。
  • 删除多线程更新(因 BUG 过多)。
  • 修复 Note 从超慢速变超快速时长条异常变长的问题。

界面与交互

  • 重写设置界面(简化为单个类),支持模组通过 JSON + HScript + Lua 自定义菜单及动画。
  • 重构模组加载流程:FreePlay 不再一股脑显示所有模组歌曲,改为 Tab 切换;主页面增加模组切换子状态(独立于 FreePlay)。
  • 将 Combo 等图像生成优化,降低内存占用,避免粪谱卡顿。
  • 暂停界面保留旧版(OldPauseSubState),可选用。
  • 移植 PsychCamera 等 0.7.3 / 1.0.4 特有类。
  • 修复 mustHitSection 影响玩家动作播放的问题。
  • 修复练习模式准确率显示错误(仅为显示问题)。
  • 修复 Replay 未记录手机端虚拟控件输入的问题。
  • 修复只有一个模组时无法打开菜单的漏洞。

兼容性与其他

  • MusicBeat(sub)State 在电脑端增加手机虚拟按键空实现,便于 PC 支持触屏。
  • 修复新版 Replay 记录缺失手机控件数据的问题。
  • 修复安卓设备相关兼容性问题。

2026年7月19日

  • 修复 Sparrow XML 帧中 rotated="true" 未正确应用角度旋转的问题。
  • 增加全局模组列表选项。
  • 安卓设置支持用户自定义文件存放类型,适配高版本 Android 的 data 目录限制。
  • 修复人物无法正常翻转的问题。
  • 优化歌曲进入速度。
  • 代码清理(含移除冗余日志、恢复 CO 兼容性等)。

2026年7月20日

  • 修复谱面 0.6.3 转换问题(独立修复)。

2026年7月21日

  • 移除安卓激进优化设置。
  • 修复所有场景均会加载 stage 图片的冗余问题。
  • 修复兼容模式下 timeBar 的 cameras 为 null 导致崩溃的问题。

2026年7月31日(大量修复与改进)

脚本与判定

  • 修复 Botplay 下命中 Hurt / ignoreNote 音符无法触发 Lua / HScript 事件的问题。
  • 修复未选择模组却错误加载其他模组 Main.hx 的渗透问题。
  • 修复 pack.json 缺少 restart 字段导致崩溃的问题。
  • 修复倒计时未结束歌曲提前开始的问题。
  • 修复倒计时期间 Note 判定 ms 异常(现与正曲一致)。
  • 新增“忽略循环报错脚本”设置(默认开启),并配套“脚本报错上限”(默认 50 次),持续报错的脚本将静默停用,避免刷屏。
  • HScript 默认走错误上限逻辑,不再首次报错就弹窗关闭。

编辑器与谱面

  • 修复 MasterEditorMenu 选择模组后首次进入编辑器仍加载原版资源的问题。
  • 彻底统一新旧编辑器的保存警告逻辑,不再自动保存。
  • 新增“谱面自动保存”选项(默认关闭)。

性能与 UI

  • 再度优化大批量 Note 加载速度(缓存帧扫描、单次纹理加载)。
  • KeyboardDisplay 全面软编码化(支持自定义键大小、间距、字体、颜色、透明度等),并提供 fullyCustom 开关及按压/释放/更新钩子。
  • 游戏结束结算界面(Results)与回放历史界面(ScoreHistory)UI 现代化,采用弹性进场动画、鼠标悬停反馈、动态排版,修复文字重叠、截断等问题。
  • 暂停界面提高透明度(黑底、亚克力、玻璃卡片均更透),参数可调。
  • 优化回放系统(Replay)。

2026年8月18日

  • 进一步优化 Note 性能:针对极限谱面(数十万级 Note)做了额外的加载与渲染加速,帧率更稳定。
  • 修复 Vs slice 模组谱面转换时导致的崩溃问题:解决了该模组特定谱面在转换过程中因数据解析异常引发的程序崩溃。
  • 修复若干已知问题:包括社区反馈的特定模组兼容性、偶发闪退及界面显示异常。
  • 底层升级 SDL3:将原 SDL2 渲染后端迁移至 SDL3,提升跨平台图形性能及输入响应,为后续功能预留接口。
  • 修复 Windows 图标错误:解决了因 Lime 构建图标注入错误导致的 Windows 可执行文件图标显示异常的问题。
  • 补充制作人员名单:在相关界面中补全了参与本项目开发的贡献者信息。

2026年8月19日

  • 修复 Replay 无法正常播放的问题,具体原因如下:
    1. ScoreHistorySubstate.playReplay() 直接调用 Song.loadFromJson() 时,未像 Freeplay 那样先切换至歌曲所属模组目录,导致 Paths.modsJson() 无法定位模组谱面,回退读取 assets/data/ 目录。
    2. 同步增强了 Replay 判定精度。
  • 彻底移除了 GPUTextureManager 及“GPU纹理池化”设置,修复开启该选项后大图或全屏区域出现黑块的问题。
  • 补全新版 Adobe Animate(spritemap1)角色支持。
  • 修复 FlxAnimate 角色动画播放异常的问题。
  • 修复 Lua playAnim 接口在特定场景下无法正确触发角色动画的问题。
  • 修复 StageData 兼容性问题,解决部分模组舞台加载失败或显示错乱的现象。
  • 修复相机缩放(camera zoom)相关逻辑,确保缩放行为与预期一致。
  • 修复 healthBar.scale 读取异常,解决健康条在部分模组中缩放比例不正确的问题。

2026年8月20日 — SeiunEngine 0.7.3 兼容性全量修复

新增 0.7.3 兼容层

  • 新增 backend.Mods 兼容类(source/backend/Mods.hx),提供 0.7.3 模组 HScript 依赖的 Mods API:currentModDirectory、getGlobalMods、pushGlobalMods、getModDirectories、mergeAllTextsNamed、directoriesWithFile、getPack、parseList、updateModList、loadTopMod,全部委托给 Seiun 已有的 Paths 与 CoolUtil,避免重复维护。
  • 修复 Lua 脚本 onCreate 期间无法被其他脚本回调注册的问题(source/script/lua/FunkinLua.hx):现在 call('onCreate') 之前会把当前 Lua 脚本临时加入 PlayState.instance.luaArray,onCreate 结束后再移除。该修复解决了 Pause.lua 的 onCreate 调用 parseJson 时为 nil 的根因,同时修复了 jsonReader.hx 的 createGlobalCallback 注册不到当前脚本的问题。

暂停菜单 / CustomSubstate

  • CustomSubstate 的 Lua 全局改为安全值(source/script/lua/FunkinLua.hx):Lua 侧 customSubstate 不再直接存放 CustomSubstate 实例,改为子状态名字符串(如 "NEW_pause_menu");HScript 侧仍保留真实 CustomSubstate 实例。消除了 "Convert: Haxe value ... not supported" 报错。

版本 / 变量兼容

  • version 全局跟随兼容模式(source/script/lua/FunkinLua.hx、source/script/hscript/HScript.hx):version 现在等于 CompatEngine.current(),0.6.3 / 0.7.3 / 1.0.4 模式会返回对应版本号。
  • opponentVocals 重命名(source/states/PlayState.hx、source/editors/ChartingState.hx):原 vocalsOpponent 全部重命名为 0.7.3 的 opponentVocals。
  • 新增 0.7.3 属性:PlayState.inst 指向 FlxG.sound.music 的 instrumental 别名;PlayState.stageUI 支持 stage json 的 stageUI 字段;PlayState.iconsAnimations 默认 true,供 iconShake 等脚本读取;StageData.StageFile 增加可选 stageUI 字段。
  • noteSkinPostfix / splashSkinPostfix(source/script/lua/FunkinLua.hx)不再硬编码为空,改为读取 Note.getNoteSkinPostfix() 和 NoteSplash.getSplashSkinPostfix()。

缺失回调补全

  • 成就系统完整兼容(source/Achievements.hx):保留旧版 Seiun 成就 API(achievementsStuff、achievementsMap、henchmenDeath、loadAchievements、unlockAchievement、isAchievementUnlocked、getAchievementIndex、AchievementObject、AttachedAchievement);移植 0.7.3 成就系统(Achievement typedef、achievements、variables、achievementsUnlocked、getScore、setScore、addScore、unlock、isUnlocked、startPopup、createAchievement、reloadList、loadAchievementJson);新增 Lua 回调(getAchievementScore、setAchievementScore、addAchievementScore、unlockAchievement、isAchievementUnlocked、achievementExists)。
  • Discord 兼容别名(source/Discord.hx):新增 clientID、_defaultID 静态变量;source/script/lua/FunkinLua.hx 新增 Lua 回调(changeDiscordPresence、changeDiscordClientID)。

调用顺序修复

  • PlayState 的 onCreatePost 顺序对齐 0.7.3(source/states/PlayState.hx):Lua onCreatePost 在 super.create() 之前调用一次;HScript onCreatePost 由 super.create() 内部调用一次;删除原先重复的 callOnScripts('onCreatePost'),避免 HScript 执行两次。

哨兵值兼容

  • Function_Stop 等常量改为 0.7.3 字符串哨兵(source/script/lua/FunkinLua.hx、source/psychlua/LuaUtils.hx、source/editors/EditorLua.hx):Function_Stop、Function_Continue、Function_StopLua、Function_StopHScript、Function_StopAll 全部改为 "##PSYCHLUA_*" 字符串,与 0.7.3 / 1.0.4 一致。

控制器 / 输入兼容

  • keyboardJustPressed 键盘 + 手柄回退(source/script/lua/FunkinLua.hx):ENTER、SPACE、Z 键盘没按时回退到 Controls.ACCEPT;ESCAPE、BACKSPACE 回退到 Controls.BACK;W、UP、S、DOWN、A、LEFT、D、RIGHT 回退到 UI_*_P。keyboardPressed、keyboardReleased 也补了对应的按住/松开回退。
  • keyJustPressed / keyPressed / keyReleased 补 default(source/script/lua/FunkinLua.hx):未匹配的名字会走 controls.justPressed / pressed / justReleased,与 0.7.3 ExtraFunctions 行为一致。

版本显示调整

  • 主菜单 PE 版本显示(source/states/MainMenuState.hx):显示 "Psych Engine v0.6.3+0.7.3+1.0.4 (Active: 当前兼容版本)",所有版本文字改为右对齐,贴住屏幕右边缘,避免长文本溢出。
  • 游戏内左下角 PE 版本显示(source/states/PlayState.hx):左下角版本文字中的 PE 版本改为 CompatEngine.current(),跟随当前激活的兼容模式显示。

2026年8月21日

  • 修复 Replay 若干遗留问题(回放难度锁定、回放数据完整性等)。
  • 移除 OSU 尾判设置选项(gameplay 选项、ClientPrefs 与回放/判定相关代码一并清理)。

2026年8月22日(UI 架构统一重构 + 设置弹窗)

通用 UI 基础(新增 source/backend/UIScreen.hx)

  • 新增 UIScreen 工具类,统一各现代界面的玻璃/亚克力 UI 实现:
    • createScreenCamera():创建独立的静态屏幕空间相机,子状态 UI 不再受 PlayState / Freeplay 相机滚动、缩放与 follow 影响,鼠标命中检测与界面位置稳定。
    • applyBlur() / clearBlur():对底层游戏/菜单相机施加/移除真实 OpenFL 高斯模糊,受 ClientPrefs.data.shaders 开关控制。
    • makeGlassCard():统一样式的半透明圆角玻璃卡片(微 1px 白描边、可自定义填充色)。
  • 原各子状态手动创建的相机(Results / ScoreHistory / Pause / 设置弹窗)全部迁移到 UIScreen.createScreenCamera()。

暂停界面(source/substates/PauseSubState.hx)

  • 改用独立屏幕空间相机 + 背景高斯模糊(半径 8),暂停时背景更柔和。
  • 修复 slideGroup 透视效果下鼠标命中偏移:命中检测现在考虑 scale / origin 变换(之前只补偿 x/y 偏移,缩放后按钮点击区域错位)。
  • 微调 3D 视差参数(偏移 16/10 → 12/8,缩放系数 0.008 → 0.005)。
  • 恢复暂停(resume)与 destroy 时还原背景相机滤镜,避免模糊残留。

设置界面(source/options/OptionsState.hx、新增 source/options/OptionPopupSubState.hx)

  • 新增模态弹窗 OptionPopupSubState:
    • 字符串选项:回车/点击打开下拉列表,方向键或鼠标悬停移动高亮,回车/点击确认,ESC/返回取消。
    • 数值选项:回车/点击打开滑条(Slider),左右键或鼠标拖动改变临时值,回车确认,ESC/返回取消。
    • 弹窗是真正的 FlxSubState,打开期间父设置视图暂停,鼠标与键盘输入不再互相争抢;带首帧输入跳过保护(避免打开弹窗的同一帧回车/点击立即确认或取消)。
    • 玻璃卡片面板 + 弹性进出动画,点击面板外区域可直接取消。
  • 类别预览模式(updateCategoryPreview)暂时禁用并保留接口,等后续重新启用。
  • 鼠标悬停/滚轮逻辑改为仅在未使用键盘时生效(keyboardUsed 判定),修复键鼠混用时选择冲突。

结算界面(source/substates/PlayStateResultsSubstate.hx)

  • 新增顶部“英雄卡”(Hero Card):分数、准确率、评级、最大连击以大字号分区展示,带错峰上浮动画。
  • 结算期间冻结底层 PlayState 更新(persistentUpdate = false)并施加背景模糊(半径 10),阻止结算时游戏相机继续平移/缩放;关闭时完整恢复。
  • 命中条形图支持 Marvelous 评级:开启 magnificent/marvelousRatings 时 Marvelous 作为独立统计组显示(颜色金色、列在最前),Sick/Good/Bad/Shit/Miss 分布条按实际数量动态布局(行数 > 5 时自动压缩行高与间距)。
  • 鼠标命中检测改用 getScreenBounds(考虑缩放与原点),悬停/点击热区不再错位。
  • 面板统一改用 UIScreen.makeGlassCard;评分图标移至英雄卡右侧垂直居中。

回放历史界面(source/substates/ScoreHistorySubstate.hx)

  • 列表行重设计:行高 40 → 58,每行新增副文本(SubText)、判定图标与悬停行背景,悬停即选中,鼠标操作更直观。
  • 双击行播放回放(400ms 内第二次点击同一行);无回放数据时抖动详情卡提示。
  • 删除改为两次 RESET 确认(2.5 秒内第二次按下 RESET 才执行删除,ESC / 超时取消),新增 deleteConfirm 多语言文案。
  • 界面整体使用独立屏幕相机 + 背景模糊(半径 9),开启 shaders 时背景透明度自动降至 0.68。
  • 修复删除条目后列表与选中状态刷新。

Trace 系统(source/mohong/TraceConsole.hx、source/mohong/TraceManager.hx)

  • TraceManager 控制台输出改为默认关闭:Windows 上 Trace Console 为显式开关(启动时不再静默向终端刷屏),其他桌面 sys 目标保留原有 stdout 行为。
  • 新增控制台可用性检测(setConsoleAvailable / isConsoleAvailable,Windows 经 Windows.hasConsole 探测),无输出目标时跳过格式化开销。
  • 新增控制台突发限流(consoleRateLimit 默认 200 条 / consoleRateWindow 0.1 秒),超出部分仍记录环形缓冲但不再刷屏;已有 TraceConsole 监听器时不再重复输出。
  • Main.hx / TitleState.hx:Windows 桌面在偏好加载完成后应用 Trace Console 开关(TraceManager.syncWithPrefs)。

谱面与 Note(source/Note.hx、source/states/PlayState.hx)

  • 0.6.3 自定义 Note 兼容:EventNote / PreloadedChartNote 新增 noteSplashTexture / noteSplashHue / noteSplashSat / noteSplashBrt 字段,Lua 可对单音符设置自定义溅射皮肤与颜色;仅在 Lua 显式设置时覆盖(null 表示未设置),未设置时保持 noteType setter 算出的轨道色溅射,避免普通 Note 被覆盖成全零颜色。写入顺序放在 noteType setter 之后,避免 setter 覆盖自定义溅射颜色。
  • 修复 isGFSide 判定:旧版谱面(isNewVer = false)中 GF 场景音符的 isGF 计算错误(gfSec && rawData < noteAmmo 在 playOpponent 反转后判断失误),改为 isGFSide = gfSec && (gottaHitNote == mustHit)。
  • 修复 0.7.3 / 1.0.4 兼容模式血条图标层级:073/104 的 Bar 是 FlxSpriteGroup,部分角色切换后图标会被血条背景盖住;新增 forceHealthIconsAboveBar(),在构建与角色切换(boyfriendName / dadName 变化)时把图标移到 h...
Read more

Alpha v0.2.1 (build 31664752379)

Pre-release

Choose a tag to compare

自动构建的 alpha 预发布版,极不稳定,谨慎使用。
产物来自 Build workflow 的 run:31664752379

Alpha v0.2.1 (build 31460561235)

Pre-release

Choose a tag to compare

自动构建的 alpha 预发布版,极不稳定,谨慎使用。
产物来自 Build workflow 的 run:31460561235