2D GAME ENGINE & RUNTIME

用 FCC 脚本构建 2D 世界

FancyBox2D 是面向 2D 游戏与交互式应用的运行时框架:以 Go 实现核心,以 Ebiten 负责图形呈现,并提供类 C 语法的 FCC 脚本开发体验。

CAPABILITIES

为脚本驱动的 2D 应用准备

从对象、脚本到绘制命令,FancyBox2D 将运行时的核心环节组合在一起。

FCC 脚本语言

支持类、继承、函数、宏、条件和循环,让游戏逻辑以熟悉的类 C 语法表达。

对象与方法系统

以 Root 对象树组织窗口、文本、图像、地图与人物,并通过参数和方法组合交互行为。

命令流渲染

对象系统生成设备无关的 DrawCmd 绘制命令,由 Ebiten 后端执行 GPU 呈现。

独立启动器

使用 launcher.exe 直接运行 FCC 脚本,适合快速预览、演示与 Windows 开发流程。

嵌入式运行时

objsys.dll 以 c-shared 产物提供宿主集成入口,与独立启动器共享同一引擎核心。

编辑器扩展

VS Code / Qoder 插件提供 FCC 语法高亮与补全、F5 一键运行、运行时追踪面板,以及 ALE 动画资源预览与编辑(偏移十字线、播放速度、帧内脚本、帧序调整)。

完整学习手册

浏览 FCC 语法、内置函数、对象属性、系统方法与事件参考。

进入手册

WORKFLOW

从脚本到画面

FCC 源文件经过扫描、宏处理和语法解析后由解释器执行;对象树生成绘制命令,Ebiten 在屏幕上完成渲染。

  1. 编写使用 FCC 定义对象、事件和游戏逻辑。
  2. 运行由 launcher.exe 加载脚本并启动运行时。
  3. 呈现对象系统生成命令流,Ebiten 绘制最终画面。

DOCUMENTATION

从 FCC 学习手册开始

现有手册收录 900 余条语法、对象、方法、函数与事件参考,覆盖脚本开发的常用入口。

打开学习手册

RELEASE NOTES

最新更新

按日期罗列各次更新的内容,新的在上、历史的在下。

2026-10-24 · 数据表对象移植(引擎 0.5.58)

  1. 目标与背景数据表(原版 datatable)是语料里使用最广的对象之一:两百多个脚本、八百多处调用依赖它读取道具、技能、NPC 等表格数据。此前的重写版只登记了名字,取记录、按字段查询、枚举等能力全部静默失效;资源库里还有 254 个 .tab 表格文件等待读取。本轮把它完整补齐。
  2. 数据表对象新增数据表对象,支持读取表格文件、按主键取整条记录、按主键查某个字段、新增/覆盖/删除记录、修改非主键字段、按内容查找记录下标,以及遍历全部记录(可带序号)。记录始终按主键降序保存,与原始实现的内部顺序一致,因此按序号取记录的结果也相同。新增时会严格校验字段数量和类型,重复主键不会被覆盖(覆盖需用另一接口)。
  3. 表格文件读写按原版格式读取:首行标记、第二行声明字段名与类型并用星号标出主键、第三行字段名、之后是数据行;读取时会自动按内容加宽列,空行与注释行跳过,重复主键只记日志不中断。保存时按同一格式写回,字段名加引号、每列后带逗号。资源路径同样支持内置资源与磁盘文件。
  4. 显示与交互数据表可以作为可见控件显示:标题行中主键列用亮黄色、其余用浅黄白色,数据自标题下方逐行绘制,列宽按读取时算出的宽度排布。支持视口位置与偏移参数,改动尺寸或视口时会通知脚本更新(仅在实际变化时触发一次)。与原版一致,纵向滚动会在绘制前自动夹紧,横向的夹紧方向与原版的特殊写法保持相同,未作「修正」。
  5. 顺带修复文本取词函数在处理中文等多字节字符时按固定两字节跳步,遇到三字节的中文字符会把后面的逗号一并吞掉,导致个别表格首次读取时字段名报错。现改为按字符实际字节宽度前进,非法序列仍沿用两字节兜底(兼容旧的 GBK 资源)。
  6. 测试验证新增对象测试 15 项(默认值、参数面、文件读写往返、各方法边界、枚举回调、渲染像素、变化通知次数、注册)。语料回归遍历全部 254 个 .tab:248 个标准表格全部读取成功且行列数与源一致、保存后可等价重开,6 个非标准文件按预期拒绝,零失败。全套 Go 测试通过。实机冒烟:读表后记录数、字段数、按主键取值、未命中返回 notfind、按内容查下标、取整条记录(含中文)全部正确;可见模式下正常出图、64 帧无异常、Esc 干净退出。
  7. 已知限制保存时不转义引号,字段名或字符串里含裸引号时重新打开会在引号处截断——这是原版取词规则决定的行为,未作改动。

2026-10-24 · 文字简介对象移植与脚本调用派发修正(引擎 0.5.57)

  1. 目标与背景老游戏「烈火英雄」右上角的简介面板一直空白。这里的简介对象(原版 textdoc)是语料里最后一类缺失的常用对象:它自带多行富文本排版,此前重写版没有对应实现。本轮把排版与对象一起移植,并顺带挖出面板空白的真因——引擎脚本调用派发的一处移植遗漏。
  2. 文字简介对象新增 textdoc 对象,支持文字颜色、行距、字体、最大行数、起始位置与缩进、视口偏移、水平对齐等参数,以及取行数、取视口位置、取行内容、清空/删除行/替换行、读写文件等方法。内容超出可视区域时可用滚轮上下滚动;滚动范围允许为负以实现底对齐,与原始行为一致。
  3. 排版引擎按原版逐条复刻:只按回车换行分行、按可用宽度折行(中文按整字走,不会把双字节字符拆开)、行高与行距累计总高、按纵坐标反查行号;文本中的链接标记与颜色标记也照原样解析。参数改动后整篇重新排版。
  4. 调用派发修复原版表达式里的裸函数名,按「本对象函数表 → 脚本类继承链 → 文件级全局函数」的顺序查找。重写版此前直接查全局函数表,同名函数以最后定义者为准:游戏把简介对象内嵌进外层面板类之后,外层构造函数里调用的同名方法实际跑到了窗口对象上——窗口被误改尺寸,简介始终是零行,面板于是空白。现已改为按执行对象派发,全局只作兜底。
  5. 测试验证新增对象层 9 项、排版层 6 项与引擎级端到端 2 项(逐行颜色与缩进、折行不越界、滚轮步进与上下夹紧;以及复刻游戏嵌套调用场景,断言外层尺寸不被污染、内容正常渲染)。全套 Go 测试通过。实机运行 sgame:简介面板出现黄色中文,点击开始后文本逐帧上滚并循环回开头,全程零运行错误,Esc 干净退出。
  6. 已知限制替换行时重写版会直接重排被替换的行,原版则会留下过期的行高缓存——这是有意的修正偏差。

2026-10-22 · 龙喷火只出第一帧修复(引擎 0.5.56)

  1. 目标与背景用户实机试玩 sgame 时发现,龙喷火只有嘴部一小簇火焰,本应是一道向下延伸到底的火柱。
  2. 根因与修复火焰脚本用「循环播放第 0 帧到最后一帧(framemax - 1)」的方式驱动动画,而重写版 img 对象缺少 framemax 取参:脚本取不到就得到 0,播放范围变成 0 → -1,只显示第一帧便自我销毁。原版规则是无动画时返回 1、有动画时返回实际帧数,现按原版补齐。这一缺口影响 fw2 全部使用同一写法的脚本,属于引擎参数面遗漏而非脚本问题。
  3. 测试验证新增回归三项(无动画返回 1、4 帧返回 4、24 帧返回 24);全套 Go 测试通过。实机连拍 30 张:点击开始后火焰从右侧龙头嘴部逐帧向下延伸至场地底部再收回(约 0.45 秒),随后消失,音效同步播放,Esc 干净退出。

2026-10-22 · 不限帧模式输入无响应修复(引擎 0.5.55)

  1. 目标与背景上一版引入帧率上限配置后,用户实机反馈 sgame 画面持续刷新,但窗口完全不响应鼠标和键盘。
  2. 根因与修复上一版用一个独立步进线程持续向窗口投递「该画下一帧了」的消息。Win32 只有在消息队列为空时才会把鼠标键盘输入送进队列;默认不限帧时帧消息永远排队,输入被彻底饿死。现改为在消息泵内部按截止时间调度:等待「到达下一帧时刻」或「有新输入」,谁先到就处理谁,不再需要帧消息。不限帧时排空消息后立即跑帧,队列空出后系统可正常合成输入;限帧时仍按微秒级截止推进,卡顿后重新锚定,节奏不乱。退出也改由显式标志兜住。
  3. 测试验证限帧 60(53/59/59 帧)、不限帧(179/213/214 帧)、脚本间隔 100 毫秒(稳定 9 帧)三种配置均自然退出;不限帧下注入鼠标移动与 Esc 后立即干净退出;sgame 实机加载 22 秒、渲染 1118 帧,注入鼠标移动、左键与 Esc 后正常退出并打印退出信息。

2026-10-22 · 引擎帧率上限配置与按时间补帧(引擎 0.5.54)

  1. 目标与背景引擎此前固定约 40 帧(25 毫秒定时器),既无法表达 60 帧,也不支持不限帧,动画速度还会随机器性能漂移。
  2. 帧率配置配置文件新增 engine.fps:默认 0 表示不限帧,N 大于 0 表示每秒最多 N 次更新与呈现,负数按 0 处理。启动器在引擎初始化后读取该值。
  3. 调度重写实测本机 Win32 定时器被量化到 15.6 毫秒左右(1 毫秒与 10 毫秒定时器都只有 63–66 次/秒),因此改为按高精度计时器的截止时刻驱动,单帧在途防堆积;长跑按固定周期推进,拖动或卡顿后从当前时刻重新锚定,不会突发补帧。脚本级 updatedelay 仍只在帧率上限之上放慢,不能提速。
  4. 退出与补帧不限帧模式下持续排队的帧消息曾让退出消息浮不出来,现增加显式退出标志并先停调度再退出,Esc、窗口动作 0 与关闭窗口统一走这条路径。普通 img 的自动换帧改为按经过时间补跳帧,播放速度不再随帧率漂移。
  5. 测试验证全套 Go 测试通过。CPU 渲染器实测:限帧 60 得 53/59/59 帧(首个采样窗口含启动开销),不限帧得 200/251/248 帧;GL 呈现约 50 帧,为既有的呈现带宽限制,未变。脚本间隔 100 毫秒时两种模式都约 9–10 帧,确认脚本间隔优先。Esc 与窗口关闭均干净退出。

2026-10-22 · ALE 标签切换播放速度稳定(扩展 0.6.34)

  1. 目标与背景用户反馈同一个 ALE 在标签间来回切换播放时忽快忽慢:标称 15 帧的资源,有时约每秒只推进一帧。
  2. 根因与修复问题出在定时器回调受限,而不是帧脚本或解码耗时。现改用浏览器动画帧回调,按真实经过时间计算该显示第几帧;播放意图与调度句柄分开,面板隐藏时取消调度,返回时重置时钟——不追赶隐藏期间的时间,也不会把用户手动暂停变成自动播放。
  3. 测试验证回归覆盖延迟回调、单循环、暂停恢复、调速、隐藏/返回、单帧与 1/15/60 帧;真实 IDE 五文件连续切换 15 轮稳定在约 14.5–14.9 帧(目标 15),后台不再累积播放帧;真实 IDE 控件 21 项通过,未捕获页面运行错误。
  4. 用户验收用户实测确认「经测试正常了,怎么切换都播放的很流畅了」。

2026-10-22 · 半透明边缘彩点修复(引擎 0.5.53 + 扩展 0.6.33)

  1. 目标与背景用户报告一个技能素材图(AEX 格式)的上边缘与左边缘出现彩色脏点。
  2. 根因与修复该格式由 JPEG 颜色图与 GIF 透明图组合而成。解码时把未预乘的颜色直接写入输出图像,导出 PNG 时反预乘造成颜色溢出——例如原本淡黄、透明度 194 的像素被导出成青色杂点。真 ALE 分支此前已做预乘,此次补齐 AEX:写入帧像素时按透明度缩放颜色,保留透明度、阴影点、裁剪与偏移,不改动原素材。目标四帧共 364 个像素恢复,透明度与不透明像素逐字节不变。
  3. 测试验证新增回归先红后绿;全套 Go 测试与扩展编译通过;PNG 往返与缓存五场景通过;真实预览页 11 项断言通过(四帧切换、边缘像素、播放推进、缩放与 1:1),控制台无错误,仅有无害的性能提示。
  4. 缓存说明扩展会检查源文件与解码器的修改时间,解码器升级后旧缓存会自动重建,无需手动清理。

2026-10-22 · MIDI 声音预览(引擎 0.5.52 + 扩展 0.6.32)

  1. 目标与背景编辑器已能预览 .gsm 与 .adm 音效,用户接着要求 .mid 背景音乐也能双击试听。浏览器原生不支持 MIDI,标准音源库动辄数 MB,与「零外部依赖」相悖,因此改为引擎侧离线合成。
  2. 离线合成器新增纯 Go 的标准 MIDI 文件解析器与简易合成器:支持多轨、变速与跨事件的运行状态;用七类基础音色(钢琴、钟、风琴、拨弦、弦乐、铜管、长笛)加包络合成,通道 10 映射为打击乐;渲染成标准 WAV 后交给扩展既有的播放管线,播放、暂停、停止、循环与拖动进度全部复用上一版能力。解析与合成共新增 6 项测试。
  3. 命令行与扩展解码命令行工具新增 .mid 识别与 WAV 导出,并可处理整包语料;扩展的声音预览新增 .mid 匹配,信息行注明「离线合成器渲染(非 GM 音源)」。
  4. 运行时行为引擎运行时不对 .mid 解码,与原版一致——原版也从不把 MIDI 解成波形播放。脚本对象 FMidPlay 未移植,语料中的 .mid 均由编辑器预览消费。
  5. 测试验证解析与合成测试全部通过;fw2 语料 46 个 .mid 全部渲染成功、零失败;扩展编译通过;无头浏览器自断言 10 项中 9 项通过(播放推进受无头浏览器媒体时钟冻结所限,同一份控件代码在上一版已实机验收)。
  6. 用户验收2026-10-24 用户实测 .mid 双击试听正常,并确认「目前功能测试正常」。
  7. 已知限制合成器为近似音色,并非标准 GM 音源。

2026-10-22 · 编辑器音效预览与 ADM 解码修正(引擎 0.5.51 + 扩展 0.6.31)

  1. 目标与背景用户点单:在 VS Code / Qoder 扩展里双击打开 .gsm 与 .adm 音效文件时,要能播放、循环播放、暂停和停止。落地前冒烟测试发现一处上一版的遗留问题——0.5.49 宣称支持的 ADM(IMA-ADPCM)解码其实从未生效,所有真实 .adm 文件一直在走「当作无头 GSM」的兜底路径,放出来的是错误波形。本轮功能与修正一并交付。
  2. 声音预览编辑器双击 .gsm / .adm 现在直接进入播放页:页头显示容器类型、采样率、样本数与文件字节数;居中四个控件——播放、暂停、停止、循环(循环为开关态,点亮即开启,播完自动从头再来);下方进度条可拖拽定位,时间显示随播放推进;空格键等价于播放/暂停切换;非循环播完自动回到开头。解码由扩展自带的命令行工具完成(新增 snd 子命令,把两种老容器统一转成标准 WAV),结果缓存在系统临时目录——源文件没改过就直接复用,不重复解码。
  3. ADM 识别常量修正根因是容器识别常量的字节序写反了:老游戏 .adm 文件头的四个字节是反序存放的,原版 C++ 引擎用原生小端数值比较恰好命中;重写版照字面直写常量后永不匹配,于是全部落入兜底分支。更隐蔽的是,当初用来生成逐样本比对固件的参照程序带着同一个错误常量——固件本身就是兜底路径的输出,等于测试在自我印证,ADM 解码从未被真正验证过。本轮把引擎与参照程序两侧常量一起修正、重新生成比对固件后,ADM 解码路径首次通过逐样本位精确比对;解码算法本体逐行核对无误,错的一直只是识别开关。
  4. 测试验证GSM/ADM 黄金比对与新增的 WAV 头字段、容器嗅探、命令行往返、用法退出码测试全部通过;扩展编译通过;真实语料冒烟转换正常;另以独立页面逐字复刻播放器脚本做浏览器断言——加载时长正确、播放中时间推进、暂停与停止归零、循环开关生效、进度拖到正中后定位精确落在时长中点。声音本身机器听不到,由用户在编辑器里实测 .gsm 与 .adm 的四组控件,确认「测试正常」。
  5. 已知限制预览页为只读播放,暂无音量与变速控制;音频侧其余限制与 0.5.49 相同(无编码写回、混音直加钳位、设备固定 44.1kHz 立体声)。

2026-10-22 · 接口系统两处移植遗漏修复:信息面板动态计数与积分恢复(引擎 0.5.50)

  1. 目标与背景老游戏右侧信息面板的动态计数与积分在跑通当日报「表达式运行错误」,当时的发布记录判断为「原版即死功能、非引擎问题」。用户指出游戏脚本里明明注册了信息接口,这个判断不对。复核原版源码后确认:接口注册本身一直成功,是引擎移植时漏掉了接口系统的两条查询规则;旧记录的判断已予更正。
  2. 隐式接口前缀原版引擎规定:凡是以固定前缀开头的参数名,一律按「查找同名已注册接口」处理,且这一步发生在任何普通变量查找之前——查不到就直接失败,绝不会拿一个同名的普通变量冒充。重写版漏掉了这条规则,脚本里的接口调用名落进了普通变量查找,自然什么都找不到。现按原版补上:按接口名精确查找、命中即返回接口对象、查不到如实报失败。
  3. 父对象链查询原版查找接口时,本对象没有就沿父对象逐级向上问,直到根。重写版只查本对象一张表,于是挂在窗口里的子对象永远看不到注册在桌面层的接口。现补成本对象命中即返、未命中沿父链向上递归;就近的有效绑定优先,绑定目标已失效时跳过它继续向上,不查无关的兄弟分支。两个显式查询接口(按名查找 / 判断是否实现)走同一条函数,祖先可见性一并恢复。
  4. 测试验证两条对象层回归钉住语义:同名的普通变量不能掩盖缺失的接口;父链逐级查找的优先序与失效跳过。另用真实游戏脚本做集成验证:从根和子窗口两个方向都能解析到同一个信息面板对象;游戏加分时面板积分文字同步刷新;直接调用面板的计数与积分方法输出正确。全套 Go 测试通过。实机跑老游戏:吃到两组金币后计数 0→2→4,面板与底部数码管积分 0→200→400 同步刷新,全程零运行错误、零警告。用户实测确认「sgame测试一切正常」。
  5. 已知限制「文字简介」对象与行内换色转义仍未实现,与上一版相同。

2026-10-22 · 音效播放落地、启动黑屏与文字换行三项修复(引擎 0.5.49)

  1. 目标与背景上一版把 fw2 老游戏「烈火英雄」跑通之后,用户实机反馈三处体验缺陷:整局没有任何声音;从启动到出画面要黑屏几十秒;游戏结束对话框的说明文字里本该换行的地方显示成一个个方框。本轮三项一起修完,用户实测确认「之前的问题测试都正常了」。
  2. 音效解码老游戏的音效不是标准 WAV,而是两种自研压缩容器——GSM(RPE-LTP 语音编码)与 ADM(IMA-ADPCM 自适应差分)。运行时此前只认标准 WAV,遇到这两种一律打印警告后跳过,所以全程无声。本轮把开源 libgsm 1.0.10 的解码路径完整移植成 Go(长时预测滤波、反射系数、网格激励、短时合成滤波,定点运算的截断与舍入位置逐处照抄),并按容器头识别 GSM / ADM / 无头 GSM,统一解出单声道 PCM 与采样率;ADM 部分按原版逐字节、高半字节先行的规则还原。播放链路分三段接通:运行时解码后把 PCM 交给宿主程序,宿主按名字缓存并在缓存时重采样到 44.1kHz 立体声。旧宿主没有这条通路、或解码失败时自动回落到原来的按文件名播放,行为不变。
  3. 播放卡顿与静音卡顿的根因是每播一个音就打开一个音频设备、把整段声音一次性排队,而且开设备与拷贝数据都发生在界面线程上,多路并发时驱动混音器抖动。改成一个设备 + 独立混音线程 + 八块约 46 毫秒的环形缓冲(约 370 毫秒余量):声音在缓存时就完成重采样,混音只做直加与每路音量/声像衰减,界面线程只登记一个很小的声部节点,停止播放在临界区内立即摘链(残留尾音不超过一块)。改完却出现全程静音——新的混音器漏掉了「把缓冲块交给设备预备」这一步,导致每次写入都被设备拒绝、一个样本也没送出去。补上预备步骤后恢复,并加了两道保险:写入失败会打印警告,退出时打印「已写入 / 已回放」的块数统计作为设备级证据。
  4. 启动黑屏脚本里「延时若干毫秒后调用某函数」的延时,此前被当成帧数逐帧递减,500 毫秒变成了 500 帧,于是要等几十秒才进游戏。对照原版语义改为绝对毫秒截止时刻:投递事件时记下「当前引擎毫秒 + 延时」,每帧扫描只触发已到期的事件,未到期的原样留在队列里。
  5. 文字换行脚本字符串里的 \r\n 此前既不换行、又把控制字符画成方框(字体没有对应字形)。本轮按原版逐字符走串的规则移植:遇到回车换行先把当前段画出去、纵坐标下移一行、横坐标回到左缘;量尺寸时宽度取各行最宽、高度为各行之和;空行只占一行高度不画任何字;末尾多写的分隔符不会凭空多出一行。选择字体前先剥掉控制符,方框随之消失。文本对象的自动尺寸与水平/垂直对齐都从同一处量取,因此多行排版自动正确。
  6. 测试验证全套 Go 测试通过。文字换行新增三层测试:尺寸(两行 / 三行 / 末尾分隔符)、像素(首行墨迹不超出自身宽度即无方框、空行带零亮点、第三行落在自己行内)、对象层(自动尺寸与实际绘制逐行断言)。音频解码与开源实现做了逐样本位精确比对——用 libgsm 原版源码另编一个参照程序生成 PCM 固件,再逐样本核对;另有容器头语义、定点边界与坏帧容错测试。实机运行老游戏:秒出画面、整局 36 次播放、零写入失败,正常退出时统计为「写入 605 块、设备回放 597 块」(约 28 秒音频,8 块仍在队列)。复刻缺陷文案的独立夹具截图为三行文字、两处空行间隔、零方框。顺带修好一个既有测试的时间敏感阈值:截图横幅用的是墙钟时间,未改动像素数随时间戳数字在 815–848 之间浮动,旧阈值在凌晨必然误报,已放宽并注明理由(真出现底色条时仍会响亮失败)。
  7. 已知限制音频只支持这两种老容器与标准 WAV,未移植编码(写回);混音为直加钳位,没有压缩或限幅;设备固定 44.1kHz 立体声。文字的行内换色转义(反斜杠 b + 六位十六进制)与「文字简介」对象仍未实现。

2026-10-21 · fw2 老游戏「烈火英雄」单机全程跑通(引擎 0.5.47 + 0.5.48)

  1. 目标与背景把 fw2 语料当作查漏补缺的基准,首个目标是自带完整资源的小游戏「烈火英雄」。此前运行只有黑屏、且不报任何错误,看不出断在哪一环。
  2. 实现两轮引擎修复。①根对象的事件派发:顶层定时器与顶层每帧回调此前落在一个空实现上被静默丢弃,补齐后入口脚本的定时器才能触发。②脚本文件被 Run 载入时,顶层定义的变量应当落到全局作用域(原版按「第 0 层」执行脚本文件、类体与样式体同理),此前沿当前作用域执行,游戏主窗口对象随事件函数返回一起被回收——窗口刚建就消失,于是黑屏。改为把定义写入最底层作用域,并用计数器而非布尔值保证嵌套 Run 正确退栈;函数内部的局部变量不受影响,所有 Run 入口(脚本文件、构造体、样式体、对象上执行、脚本文本)统一受益,与原版各条路径一一对应。
  3. 测试验证三条针对性回归测试钉住整条链路:定时器派发、入口函数解析、Run 文件载入与顶层执行。实机跑完整局:入口脚本 → 载入游戏脚本 → 主窗口与右侧面板渲染 → 点开始 → 金币宝石生成 + 180 秒倒计时 → 点地行走 → 吃到金币加分(数码管 00000000→00000100)→ 撞火死亡(扣分、墓碑、3 秒后原地重生)→ 时间到结束 → 「体验结束」对话框 → 关闭后可重开新局;全程零运行错误(当时 5 条接口访问提示曾误判为「原版死功能」,实为引擎移植遗漏,已在 2026-10-22 的 0.5.50 版修复,见上方条目)。
  4. 已知限制当时的无声、启动黑屏与对话框文字方框三项,已在下一版 0.5.49 全部解决;「文字简介」对象仍缺。

2026-10-21 · 调试器体验四项:状态留存、调试宏、不抢焦点、按需显示输出(扩展 0.6.27→0.6.30 + 引擎 0.5.46)

  1. 目标与背景连续四轮针对脚本调试面板的实用性与焦点问题,均由用户实际操作中反馈。
  2. 实现①切换文件后跟踪记录被清空:面板隐藏时视图连同内容一起被销毁,重新显示时重建出空页面。改为保留视图内容,并在重建时把已有记录与选中项全量回放,换文件、换容器都不再丢。②面板顶部新增一排调试宏复选框(先放 LOC、TEST):勾选后运行脚本先定义同名宏再执行,等同在脚本开头写 #define,不污染脚本即可用条件编译做分支调试;宏在加载启动脚本之前应用,系统脚本不受影响,取消勾选不会残留,重启后仍生效。③运行脚本不再自动跳到输出面板抢焦点,跟踪记录照常写入调试面板。④新增「显示运行输出」命令与标题栏按钮,按需把运行日志提到输出面板,同时把「开始运行 / 已退出 / 启动失败」三条生命周期行镜像进跟踪面板,隐藏输出面板也不丢信息。改动只涉及本扩展自己的输出通道,其他扩展的日志互不干扰。
  3. 测试验证TypeScript 编译通过;模拟宿主与真实浏览器两套断言覆盖状态回放、宏拼装出的运行参数、运行期零焦点抢占、命令与按钮注册等十余项。引擎侧新增宏应用测试(无宏→一个→两个→清空),全套 Go 测试通过;实机分别验证零个 / 一个 / 两个宏以及地图运行按钮的宏透传。四个版本均已安装,需手动重载编辑器窗口生效。
  4. 使用要点编辑器对从未显示过的输出通道不渲染内容,重载后点一次「显示运行输出」选中该通道即可,此后运行实时写入。用户实测确认通过。

2026-10-21 · 动画预览编辑增强:攻击判定点、占地叠加层与帧脚本转码(引擎 0.5.45 + 扩展 0.6.23→0.6.25)

  1. 目标与背景用户点单六项,围绕 .ale 动画的预览与编辑:看不清攻击判定位置与占地范围,帧脚本里的汉字是乱码。
  2. 实现①预览背景默认改为青灰 #428284 并加入背景选单;②帧脚本里带 dx/dy + fight 的攻击判定点用红色小叉标出,位置相对帧偏移原点(即十字线交点);③w/h 占地用黄色阴影线菱形铺出,格子从帧原点起算、相邻格共边贴合;④两个复选框默认勾选,改帧脚本即时重绘;⑤帧脚本里的汉字乱码自动按 GBK 转成 UTF-8——fw2 时代的资源把字符串存成 GBK 字节并带尾部填充空字符,转码必须在运行时一侧完成,因为导出成 JSON 时非法字节已被替换掉,编辑器侧无从挽回;⑥附带处理空字符尾巴、前导分号容错、帧条徽标与叠加层扩界。占地轴向经用户两次实机指正后定稿:w 轴斜向右上、h 轴斜向右下,格心按等轴网格计算,与地图格同构。
  3. 测试验证全套 Go 测试通过(含 GBK 转码与 UTF-8 原样透传两项,并以真实语料复核解码结果)。三份真实语料在浏览器里逐条断言:攻击点徽标的数量与位置、编辑后即时移位、1×3 与 2×2 占地的菱形顶点与共边关系、背景回退、控制台零错误;放大截图目检阴影线与红十字渲染正确。实机运行渲染校验逐位一致、零错误。扩展三个版本已安装,需手动重载窗口生效。
  4. 已知限制攻击判定点语义按真实语料的八方扫帧实证;占地按 48×24 的等距格,与地图编辑器的通行格同构。超大的 w/h 只钳制显示尺寸、不改脚本值。

2026-10-21 · 地图 3×3 / 5×5 笔刷改斜轴足迹(扩展 0.6.26)

  1. 目标与背景用户指正:大笔刷的范围应是斜轴(等轴网格轴)足迹,而不是索引空间的正方形——后者投到屏幕上歪成不与地砖贴合的形状。
  2. 实现笔刷范围定义为世界坐标下的 (2a+1)×(2a+1) 方块,投影到屏幕即为菱形,轴向与动画占地一致(w 斜右上、h 斜右下);由屏幕偏移反解格坐标的映射是单射,因此 5×5 恒为 25 格。悬停描边、落笔与按住轮换三处共用同一套计算,提示与实际修改永远一致;地形过渡的邻格判定仍按世界共边格,不受影响。
  3. 测试验证从编译产物取真实函数在隔离环境运行的校验脚本 485,028 条断言全绿;独立页面在真实浏览器里解析菱形顶点、探针描边像素,并用真实鼠标涂抹后核对足迹恰为路径菱形的并集,控制台零错误。已安装,需手动重载窗口生效。

2026-10-19 · 地图编辑器交互批次:拖动过渡、笔刷提示、新作/清空地形、右键手势与缩放、通行条纹(扩展 0.6.17→0.6.21)

  1. 目标与背景五轮连续的编辑器手感修正,全部由用户实机反馈驱动:拖动绘制后出现尖三角、大笔刷只提示一格、「清空」语义混淆、删除与平移手势冲突、四个通行复选框勾选后毫无反应。
  2. 实现①过渡方向此前读取了并不相接的角,把不相干的地形带进新样式,改为只读邻格面向当前格的那个象限;并在每一笔的焦点开始时清理轮换状态,防止定时器把已画实的格子覆盖回过渡。②3×3 / 5×5 笔刷的悬停提示改为按落笔的同一套索引范围与边界裁剪逐格描边(1 / 9 / 25 格),奇偶行错位与缩放都按格中心计算,不是简单放大一个菱形。③原「清空」改名「新作」(整图重建、走建图向导、保留首次备份),另加「清空地形」:所有格子回到默认编号与标记,保留地图尺寸、覆盖层、物件、资源库、mask 与过渡对;两者都合并成一条撤销记录。④右键在未拖动时用于删除覆盖 / 物件节点,移动超过 4 像素即锁定为平移,拖回原点或在边界外释放都不删;普通滚轮与 Ctrl+滚轮均以鼠标为锚连续缩放(5%–800%,每帧合并一次),顶部百分比只显示已生效的比例。⑤工具栏「行进 / 放置 / 显示 / 通行1」四个复选框现在勾选即时用隔行条纹菱形标出缺少该位的格子(红=不可行进、蓝=不可放置、青=不可显示、橙棕=不可通行1),与运行时同款条纹;条纹按地图像素烘焙到离屏画布,缩放平移零重烘,绘制期间按格增量维护。
  3. 测试验证每轮都有两套验证:从编译产物取真实函数运行的校验脚本(最高 485,664 条断言,覆盖融合、轮换、笔刷、清空、手势阈值、缩放锚点与上下限、条纹烘焙格集与门控),以及真实浏览器独立页(真实点击与鼠标事件、撤销重做对称复原、保存字节比对、控制台零错误)。通行标记修改经真实宿主保存重开:只有目标格的一个字节变化(0x40→0xC1),地形、覆盖层、物件、资源与备份逐字节不变。五个版本均已安装,需手动重载窗口生效。
  4. 已知限制条纹颜色是本项目自定(原版无参考色);浏览器合成事件验证不等同于原生手感验收;超大地图的条纹烘焙会按比例降到浏览器画布尺寸上限内,属一次性成本。

2026-10-19 · 地图运行时右半缺失修复(引擎 0.5.44)

  1. 目标与背景用户实机反馈地图「只有左边图像,缺失右边」,切口是干净的竖直线;测试人物在不可达域测试里表现正常,说明数据没错、错在显示范围。
  2. 核对结果与实现上一版把等距菱形的屏幕包围盒锚到了存储索引坐标上,而对象按这个矩形裁剪子对象,于是实际绘制宽度的一半被整块裁黑。改为按交错网格的真实绘制范围计算矩形(宽 = 格数×48+25、高 = 格数×12+13),推导来自每格中心的屏幕坐标与地砖缓冲以格心为中心贴画的方式。这个矩形是裁剪、命中判定、相机钳制、子对象剔除、小地图与光照拉伸的共同数据源,一处修正全链路生效。行走此前正常,是因为寻路用世界 / 存储坐标、不经渲染矩形。上一版的菱形公式作废;它当时修好的「下半幅不显示」由新公式同样覆盖,而且不再吞掉左侧一列。
  3. 测试验证先写复现测试钉住失败现象,再修正实现;新增回归测试确保经裁剪后仍满幅绘制。全套 Go 测试通过,编辑器校验脚本 485,664 条断言全绿。实机两套夹具做像素断言:行走场景满幅出图;20×40 地图在旧切口右侧的三个采样点均为地砖色。
  4. 已知限制原版固有的裁剪行为(只罩上半)仍是接受的偏离;超大地图的滚动钳制语义随新矩形变化,属上一版已接受的范围。

2026-10-19 · 地图运行时完整显示、可通行区域判定修复与四种占地标记说明(引擎 0.5.43 + 扩展 0.6.22)

  1. 目标与背景用户用测试地图实机验收时反馈两个现象:同一张地图在编辑器里显示完整,运行时却只渲染出上半截;测试人物能直接走进编辑器里标红的「不可走」区域。另要求说明工具栏「行进 / 放置 / 显示 / 通行1」四种占地标记的定义:地图为每个格子用四个二进制位分别记录——0x80 行进(能否走进该格)、0x40 放置(能否把东西放在上面)、0x10 显示(格子内容是否显示)、0x01 通行1(附加通行档);编辑器里勾选后出现的彩色条纹,标出的恰恰是缺少对应位的格子——红色=不可行进、蓝色=不可放置、青色=不可显示、土黄色=不可通行1,勾选某框无反应即表示全图都不缺该位。
  2. 实现引擎侧修正 bktile 地图的世界矩形:旧矩形按对象矩形裁剪子对象的逻辑只罩住等距菱形的上半部分,超出部分整块丢失,改为覆盖整张菱形(宽 (X+Y)×24+1、高 (X+Y)×12+1,经确认有意偏离旧版行为)。新建地图的默认格子标记对齐旧版编辑器内存默认 0x51(行进+放置+通行1)——此前新格写成 0xD0,运行时寻路把整张地图判为不可走,人物退回无视墙体的直线行走,红色禁区形同虚设;建图向导模板同时补上 pathfinder:=astar() 语句启用 astar 寻路。扩展 0.6.22 配套重建内置 mapdump.exe,编辑器其余行为不变。
  3. 测试验证桌面实机运行 0.5.43 引擎三项验证全部通过:寻路测试地图中人物按 astar 路线绕行、十点像素采样与基线逐点一致;用户测试地图的两座教堂完整渲染、不再齐切上半;41×560 大地图 CPU/GPU 渲染校验逐位一致、无诊断错误。命令行转换工具冒烟通过(新建 12 格地图默认标记全为 0x51),扩展 0.6.22 已安装(重载编辑器窗口生效)。
  4. 已知限制早期用地形刷刷过的格子在磁盘上仍是 fw2 历史约定的 0xD0/0x40 标记,编辑器「显示 / 通行1」条纹会继续点亮这些格子,属数据约定差异而非缺陷;寻路测试桩缺少 Break 事件时不会上报中途坐标,与旧版行为一致。

2026-10-18 · 地形过渡融合回到四共边格,并修复覆盖层缺帧时地图打不开(扩展 0.6.16)

  1. 目标与背景用户验收上一版后带截图反馈:单独画一块菱形地块时,四条边的融合很自然,但菱形对着的四个角显得很突兀。本轮先回到原版编辑器源码核对「单独一个格子时这四个角到底有没有过渡、方向怎样」,再据实修正。
  2. 核对结果原版画下一格地形后只调整与它共用一条边的四个格子——四次调用、四个方向,没有任何针对共顶点(对角)格子的处理;源码里另有一段形状相同的调用,整段躺在注释里,是废弃代码。原因在于每块地砖的四个角各自只描述「跨过某一条边的邻格是什么地形」,14 种过渡样式全部由西/东/北/南四邻查表得出,对角方向根本不存在过渡图案。上一版按等距几何推理硬写对角格,拿到的样式与该方向无关,屏幕上就是一个指向虚空的硬菱形,正是截图里那四个突兀的角。
  3. 实现融合范围收回四个共边邻格,与原版逐次调用对齐。拖拽语义随之回到原版:焦点格移走后,先前那格已是纯色的新地形、四个角里没有旧地形可匹配,天然保持固定,因此一笔之内参与随机轮换的是当前格加它的三个邻格。过渡地砖仍在所属样式的四个变体里按每秒 15 帧轮换,松开鼠标或焦点移开即定稿。
  4. 顺带修复另修一个真实缺陷:当地图的覆盖层动画一帧都读不出来时,转换工具把帧列表导成空值,预览页面直接崩溃,整张地图退化成「地图渲染失败」的错误页;更麻烦的是保存后的预览刷新会静默失效,旧画面留在屏上,看起来像没保存成功。现在空帧列表按零帧覆盖层正常渲染,只有元数据的退化帧不再取图。
  5. 测试验证专用校验脚本重写为四格模型,从编译产物里取出真实融合函数在隔离环境运行,537 条断言全部通过:单独画一格恰好产生四个过渡格、样式依次为 12/6/10/13,四个对角格逐字节未变;拖一格后原格编号固定、只新增三格;同地形零写入;第三种地形不覆盖既有编号;无过渡对时零写入;并用真实语料的角表核对 5 组过渡、每组 14 种样式的位模式与变体形状。独立页面用真实鼠标事件复现:在均质地形区画上一对过渡关系里的第二种地形,四个共边格实测样式为 1/7/3/0,正是直接方样式 12/6/10/13 的镜像(原版「镜像方取 13 减样式」的规则在真页面上复现);对角格保持纯地形;松开鼠标后整幅地图零字节变化;1 倍、4 倍、8 倍放大截图确认四条边融合自然、无硬菱形角。测试脚本自身也做了加固:清掉按路径命名的转储缓存后,同一套端到端测试可反复运行而不再报「源文件已被外部修改」,并新增断言防止错误页被当成正常页面通过——上面那个覆盖层缺陷正是这样暴露出来的。扩展升级至 0.6.16(已安装,重载编辑器窗口生效);引擎与转换工具本轮未改动。
  6. 已知限制对角方向在原版就没有过渡图案,菱形的四个尖角由相邻格子的边方向融合间接收口;若要真正支持对角融合,需要先扩展角信息的语义与地砖库布局,属于格式变更。融合仍是单遍处理,不级联回改更早画好的格子。

2026-10-17 · 地形过渡融合扩到八邻格(扩展 0.6.15,已被 0.6.16 回退)

  1. 本条已作废八邻格模型是几何推理跑在原版源码前面的结果:对角方向并不存在过渡图案,硬写反而在菱形尖角留下突兀的硬角(用户截图实证)。下文保留作过程记录,「八格 / 七格 / 共边先算共顶点后算」等结论一律不再成立,现状见上条 0.6.16。
  2. 目标与背景上一版过渡只处理被画格子共边的四个邻格,实测单独画一块时对角方向仍留硬角。等距菱形地图里每个顶点由四块地砖共用,只刷共边四格等于漏掉了只在顶点相接的四个格子。本轮按用户验收意见把融合范围扩到八个邻格:单独画一块时周围八格全部换成过渡地砖;往旁边拖一格后只有七格参与,先前画好的那格保持固定。
  3. 实现每块地砖的四个角对应四个象限,每个象限显示跨过那条边的邻格地形,因此过渡方向可以逐格精确判定。融合顺序是先算共边四格、再算共顶点四格——后者要读前者刚写好的角信息才能看见新地形,顺序颠倒会什么都刷不出来。过渡地砖与笔刷地砖一样,在所属样式的四个变体里按每秒十五帧随机切换,直到焦点格移开或松开鼠标才定稿;同一样式的四个变体形状完全相同,随机切换不会改变融合轮廓。
  4. 测试验证新增专用校验脚本,从编译产物里取出真实融合函数在隔离环境跑合成地砖库,五百四十四条断言全部通过:单独绘制八格且每格过渡方向与期望象限完全一致、拖拽后七格且原格地砖编号不变、同地形零写入、第三种地形不被覆盖、无过渡对时零写入,并用真实语料的角表核对每组过渡十四种样式的变体形状与位模式。独立页面用真实鼠标事件复现整条交互:按下八格、拖动七格且原格冻结、按住期间过渡格持续翻动而样式不漂移、松开后整幅地图零字节变化;放大八倍截图确认融合边平滑无硬角。桌面实机运行引擎,地图正常启动、渲染校验逐位一致。扩展升级至 0.6.15(已安装,重载编辑器窗口生效);引擎与转换工具本轮未改动。
  5. 已知限制融合仍是单遍处理、不级联回改更早画好的格子:先画一片再回头补边时,早先的过渡不会自动更新。因资源被移除而显示为纯黑的格子仍会参与过渡配对。

2026-10-17 · 地形过渡融合:mask 图可选、过渡对可管理(扩展 0.6.14 + 引擎 0.5.42)

  1. 目标与背景此前在地图上刷地形,格子之间是硬拼的:草地旁边直接接泥土,边界一条直线,看上去像贴图而不像地形。原版编辑器用一张 mask 过渡图把两种地形在边界处互相咬合,本轮把这套机制完整搬进地图编辑器——画上的地形如果和邻格不同、且两者登记为一对过渡关系,周围四个格子会自动换成融合地砖。同时修掉两个手感问题:新加地形资源后列表图例多半是黑的,以及按住鼠标拖拽时已经离开笔刷的格子还在闪。
  2. 实现地图转换工具按地砖编号导出每块地砖四个角所属的地形,以及每组过渡关系在地砖库中的位置与前后顺序;预览页面据此复刻原版的融合规则:按「西/东/北/南是否与目标地形同类」四种组合查出一共 14 种过渡样式,镜像方向取反,再从该样式的 4 个随机变体里挑一块换上。相同地形只替换自身,不会波及邻格;因资源被移除而显示为纯黑的格子按「无地形」处理,不会把过渡拉进空洞。地形库的「编辑」面板新增两处:一是 mask 图下拉,自动扫描地形资源目录与地图目录下所有以 mask 命名的图片,首项为「不使用过渡」,选中后写回脚本;硬边 mask 只用两种地形原色、过渡锐利,柔边 mask 会生成中间色、过渡自然。二是过渡对列表,两列下拉选择地形后增删,按顺序写回脚本——顺序决定每组占用的地砖槽位,前者为直接方、后者为镜像方;重复对、同地形对、缺一侧、未选 mask 都会就地报错而不改动文件。
  3. 测试验证引擎与转换工具全套 Go 测试通过,扩展编译通过。模拟编辑器环境的端到端测试做了三轮往返:基线地图带 5 组过渡与一张柔边 mask;第一轮换成硬边 mask 并把最后一对过渡的前后地形调换,写回后新组的位置与角信息符合预期,地砖图集随之改变;第二轮还原,角表与图集与基线逐字节相同;第三轮清空 mask 与全部过渡对,地砖数从 756 降到 476,导出清单不再声明过渡信息,残留的角表文件被删除。另做资源编辑回归,覆盖移除地形标黑、覆盖层与物件语句删除、备份保留与只读属性处理。像素级探针确认每组过渡的 56 块地砖全部同时含两种地形色,换 mask 时基础地形砖完全不变、过渡砖全部改变,中间色数量在柔边 mask 下为 8 种、硬边 mask 下为 0 种。桌面实机运行 0.5.42 引擎,地图正常启动,CPU/GPU 渲染校验逐帧逐位一致。扩展升级至 0.6.14(已安装,重载编辑器窗口生效)。
  4. 已知限制过渡对按位置绑定地砖槽位,删掉中间一组会使其后各组前移,需要整体重建地砖库(编辑器确认后自动重新转储)。本版一次绘制只融合被画格子周围共边的四格,与原版一致(0.6.15 曾试扩为八邻格,因对角方向没有过渡图案、实机留下硬角,0.6.16 已回退,见上两条);不会级联回改更早画好的格子,所以先画一片再回头补边时,早先的过渡不会自动更新。mask 图候选按文件名前缀 mask 匹配,其他命名的过渡图不会出现在下拉里。

2026-10-17 · 地形图集按行展开、真实地砖绘制与按住轮换(扩展 0.6.13 + 引擎 0.5.41)

  1. 目标与背景地图编辑器此前的笔刷一次只使用地形图里的第一个 48×25 小块,且画过的格子会盖着一层橙色标记,看不到实际地形;新加入的地形图如果横向排了多个变体,也不会出现在地形列表中。本轮让一张地形图按 25 像素高的每条横带自动生成一个地形条目(每条最多 4 个变体),绘制时按住鼠标期间整条笔画在地形变体之间以 15fps 随机切换,松开才定稿;画过的格子直接显示真实地砖。
  2. 实现资源写回工具按图片实际宽高计算每条横带的变体数与行数,为每个缺失的行补一条地形定义(名称自动递增去重),重复应用只补缺行;旧版本写入的单变体定义会把末尾数量改成图集列数,其余字节不动。地图转换工具新增全量地砖图集导出(按地砖编号排列,含全部变体),预览页面据此按编号取图。编辑时不再绘制橙色待保存标记和悬停填充,悬停只留菱形描边且在按住时隐藏;按住左键起笔后,每个触及的格子先随机取一个变体,随后每 67 毫秒重新随机整条笔画的所有格子,松开、失焦或取消时停止并保留最终结果,整条笔画仍只产生一条撤销记录。
  3. 测试验证引擎与转换工具全套 Go 测试通过,扩展编译通过。命令行往返验证:重设地形资源后按行生成 14 条新定义并使原有首行扩为 4 变体,转储得到 16 个地形条目、64 块地砖与 784×100 的全量图集;页面交互验证连续绘制 5 格时地砖编号在多次采样间持续变化,松开后编号冻结、撤销记录为 1 条,保存写回后的地砖编号与定稿完全一致。桌面实机运行 0.5.41 引擎,示例脚本与地图均正常启动,CPU/GPU 渲染校验逐帧逐位一致。扩展升级至 0.6.13(已安装,重载编辑器窗口生效)。
  4. 已知限制地形列表缩略图固定取每行第一个变体,以保证重新转储后封面稳定;按住时的轮换由 67 毫秒定时器驱动,与显示器刷新率无关;资源移除仍保留地形定义槽位,对应图块显示为纯黑。

2026-10-17 · 地图编辑器:资源库路径编辑、清空重建、文本切换(扩展 0.6.12 + 引擎 0.5.40)

  1. 目标与背景地图里引用的地形库、覆盖帧和物件精灵过去只能通过手改脚本调整。本轮把资源管理搬进编辑器面板:三个资源库各自可以查看并增删路径;另加「清空」回到空文件建图向导,以及「文本 / 编辑」在脚本与地图界面之间一键切换。
  2. 实现地形库、覆盖帧、物件库面板右上角新增「编辑」,弹出路径列表:逐条移除,或输入新路径添加(自动去空白、去重,覆盖帧限制一条来源)。确认后作为资源补丁随保存写回——地形移除保留原 addkind 槽位(地砖编号按位置绑定),预览中该地形填黑、图例以红框标注「已移除」;覆盖帧移除会删掉整层来源与节点数据;物件路径移除会删除所有引用该精灵的放置语句。所有改动以文件末尾的元数据注释记录,保存仍走哈希守卫、自动备份与临时文件事务。「清空」确认后先备份原文件,再把源文件截断为零字节并清除转储缓存,回到建图向导;截断与重新建图都会临时解除并恢复只读属性,兼容语料中常见的只读地图。「文本」按钮切到文本编辑器,文本编辑器标题栏的「编辑地图」命令切回地图界面,有未保存编辑时先确认。
  3. 测试验证引擎与转换工具全套 Go 测试通过,扩展编译通过。模拟编辑器环境的端到端测试覆盖:文本方式打开、三层资源移除与地形恢复、清空后按原格数重建、只读属性保留、原文件备份内容、末尾元数据;页面交互测试覆盖三个对话框的增删去重、脏状态确认、被移除地形的黑格与红色图例。桌面实机冒烟日志版本 0.5.40,CPU/GPU 渲染校验逐帧逐位一致。扩展升级至 0.6.12(已安装,重载编辑器窗口生效)。
  4. 已知限制地形移除不删除 addkind 定义,只从生效列表摘除并标黑;覆盖层最多一个来源;移除物件路径会删掉该精灵的全部放置语句;清空只保留首次原文件的备份。

2026-10-17 · 空地图文件可从零建图:wholemap / tilemap 向导(扩展 0.6.11)

  1. 目标与背景此前打开一张空的 .fcm 只会得到「不是受支持的地图」提示,想单独测试地图功能必须手写脚本或复制旧地图再改。本轮让空文件直接进入建图向导:选择整图族(wholemap)或瓦片族(tilemap),设定尺寸、格子大小与可选资源路径,一键生成结构完整、可预览可运行的地图,便于从零搭建和单独针对地图做测试。
  2. 实现转换工具新增建图命令:瓦片族按格数生成地图类体,写入地砖尺寸、黑色地形变体、建库清单与压缩后的逐格索引,并生成每格 3 字节的地砖数据文件;整图族按总宽高、格宽高与可选逐格图片格式生成 init 声明。由于系统脚本里的地图基类会在生成类体之后再次赋值整图资源,生成器还会在地图实例体中补一次资源绑定,确保最终生效。资源路径留空时优先复用地图目录下已有的纯黑贴图,没有才自动生成一张并引用;目标文件非空时拒绝覆盖。空文件探测新增「empty」标记,编辑器据此渲染向导弹窗,参数在页面与服务端各校验一次,创建成功后自动重新载入并切换到正常编辑界面。
  3. 测试验证转换工具单元测试与全套回归通过。模拟编辑器环境的端到端测试覆盖:向导页渲染、非法参数拒绝、两种地图族生成后的类体与数据文件、BOM/纯空白文件识别、空 .fcm 正确打开为地图编辑器、非空文件拒绝覆盖。用户提供的空测试地图在两种模式下均生成成功,测试后已恢复为空文件。桌面实机分别运行两张生成图:整图族 48 万像素中 475709 点为纯黑,瓦片族 474403 点为纯黑,中心与采样点全部为 (0,0,0),运行日志零错误。扩展升级至 0.6.11(已安装,重载编辑器窗口生效)。
  4. 已知限制整图族的格网按总宽高除以格宽高向下取整,尺寸不能整除时余量不参与格网;空文件判定只覆盖零字节与纯空白/BOM,含注释但没有地图类体的文件仍按不支持处理。

2026-10-17 · 修复协作阴影 ALE 预览的一圈黑影(扩展 0.6.10 + 引擎 0.5.39)

  1. 问题与背景地图素材 coop_shadows.ale 在 ALE 预览里,阴影块边缘出现一圈明显的深色描边,与中间平滑的半透明渐变对不上。
  2. 实现该文件实际是 AEX 容器(alphatrue,33 帧)。原引擎加载时会识别「半透明且足够暗」的像素,把它们标记为自动阴影点,渲染时对背景做精确 50% 变暗;旧解码器把这个标记当成普通透明度输出,结果在渐变里挖出一圈近乎透明的缝隙。现在解码器直接把阴影点烘焙成 50% 黑(纯黑、alpha 128),并忽略源像素颜色——与桌面引擎的渲染结果逐像素等价。
  3. 测试验证新增解码单元测试覆盖阴影点重映射,全套 Go 测试通过。重新导出 33 帧后黑圈消失,4 倍棋盘格合成显示平滑阴影。桌面实机把测试地图的覆盖层换成该文件直跑:日志零错误、渲染校验逐位一致,截图中的协作阴影为连续灰块,无深色描边圈。
  4. 已知限制ALE 预览与运行时共用同一解码器,因此该修复同时作用于预览和地图覆盖层;已安装扩展的用户需重载编辑器窗口后生效。

2026-10-17 · 地图编辑器支持整图族地图:预览与物件编辑全链路(扩展 0.6.9 + 引擎 0.5.38)

  1. 目标与背景上一轮让整图族(wholemap)地图在桌面引擎里跑通,但编辑器对它仍然「不认」:转换阶段直接报不支持。本轮把这类地图接入地图编辑器——能生成完整整图预览,也能像普通地图一样移动、删除、新增装饰物件并写回脚本,使整图族地图获得与瓦片地图同等的编辑能力。
  2. 实现转换工具按地图类的直接基类判定族别:瓦片地图走原有瓦片管线,整图族走新管线。整图族的探测会严格校验 init 声明(总宽高、格宽高、图片命名格式串、格网至少一格),校验规则与引擎运行时同源——探测通过即引擎也能加载。预览按声明的像素尺寸渲染整张地砖层(整图切片 + 逐格房间图片),大图按整数比例降采样、分条带渲染以控制内存。装饰物件按整图族的参数顺序(x、y 在前,后接图源、层号、播放间隔、类名、扩展脚本)解析成可编辑节点:移动只改坐标两个数字、其余字符原样保留;删除折掉整行;新增按整图族格式追加在物件区末尾(没有数据块时锚定到最后一条地图参数语句),写完重新扫描自检,不符即不落盘。转换清单格式升级到第 5 版并新增「地图族」字段:整图族不再输出瓦片库、逐格数据与覆盖层,物件层照常导出;写回时明确拒绝整图族的地砖与覆盖层补丁,物件补丁照常生效,源文件哈希守卫与自动备份不变。
  3. 测试验证引擎与转换工具新增 13 项测试全绿(整图族 init 解析、族判定、离线构建、预览渲染、物件投影、移动写回、无数据块插入锚点、真实语料投影与写回;转换工具的整图族探测、转换、物件写回、拒绝地砖/覆盖补丁),全套回归通过。三张真实语料地图转换成功,预览均为 1:1(832×640、2432×1808、3600×2000)。自动化浏览器加载独立测试页:元信息正确显示整图族与格网尺寸,鼠标悬停按矩形格命中并显示「整图族格(无逐格 ID)」,命中框四角有描边(证明是矩形而非瓦片地图的菱形),铅笔、橡皮、地形、通行、吸管、覆盖六个工具与两个面板开关被正确禁用,物件库列出 4 个精灵、6 个物件且物件画笔可用。桌面实机直接运行三张地图:运行日志零错误、渲染校验逐位一致;截图与离线预览做偏移搜索与点探针——家具店在最佳偏移处 8 个区块平均绝对差为 0,6 个采样点中 5 个逐像素相等(另 1 个为动态元素);两张对战地图在最佳偏移处 8 个区块与 6 个采样点全部逐像素相等。引擎升级至 0.5.38,转换工具同步重建并与扩展内置副本一致;扩展升级至 0.6.9(已安装,重载编辑器窗口生效)。
  4. 已知限制整图族地图没有逐格地砖 ID 与覆盖层,编辑器对它只开放「选择」与「物件」两支工具,地形/通行/覆盖编辑不适用。预览只含地砖层,水面与动画、物件层均由编辑器页面另行叠加或暂不显示。整图族每格的遮挡图与画刷图仍未移植(沿用上一轮边界)。

2026-10-17 · 整图族(wholemap)地图现在能正常运行:补齐 init / src 参数与逐格背景图(引擎 0.5.37)

  1. 目标与背景用真实语料的整图族地图(家具店 furnitureshop.fcm)做实测时发现:这类地图在 Go 重写版里只渲染出一帧纯黑画面。整图族地图不用瓦片库铺地,而是在脚本里声明整张地图的像素尺寸、每格尺寸与一套「逐格图片」命名规则,引擎按格加载对应的房间图片拼出整个场景;同时可以给一张整图作为底图。Go 版此前没有实现这两个参数,地图格数停留在 0,绘制直接提前返回,于是全黑。旧测试脚本用的是另一条自带默认格网的基类路径,恰好掩盖了这个缺陷。
  2. 实现按 2004 年 C++ 原版语义补齐地图对象的两个参数:init 接收「总宽、总高、格宽、格高、图片命名格式串」五项(数组元素个数与类型校验对齐原版的格式扫描规则——数值槽接受整数或小数并向下取整、格式串必须是字符串,缺项或类型不符即报错;格宽高小于 1 一并挡下),src 接收整张底图路径。绘制时逐格物化背景:先按整图比例切出该格对应的区域,再查找该格自己的图片(命名规则按「行优先、序号从 1 开始」展开)并以 1:1 贴到格内左上角,图片比格子小则只覆盖对应部分、其余保留底图切片;两者都没有的格子画统一的占位色而不是留黑。每格的图片数据与显存纹理各自缓存,缺失的文件只探测一次,重复绘制不再读盘。
  3. 测试验证新增 6 项单元测试全绿:init 正例(格网尺寸、格宽高、地图矩形、命名格式、遮挡与通行数据一并核对)、六条非法 init 拒绝路径与小数截断、src 参数、逐格图片加载(钉死「行优先、从 1 开始」的文件名展开顺序,并覆盖整图切片被格图全覆盖、缓存命中不重复加载、格图小于瓦片时的裁剪贴合、缺格图时保留底图切片、整图与格图都缺时返回空且只探测一次、换 src 后按新命名规则取图)、绘制层逐格出图与越界行为,以及「只有 init、没有任何图片时画占位色」这条黑屏回归护栏。另有一条端到端测试:临时目录写入三张真实 JPEG(第四格故意缺)后用整图族脚本类跑完整管线,断言三个格子的画面像素贴近各自的 JPEG 颜色、缺图格子的画面与整图对应区域逐像素相等。全套回归通过。引擎升级至 0.5.37,桌面实机直接运行语料的家具店地图:黑帧变为完整的店内场景,运行日志零错误、渲染校验逐位一致;把该地图 130 张逐格图片合成为一张 832×640 的参照底图后与截图做视口偏移搜索比对,最佳偏移处 9126 个非黑采样点中 8394 个逐像素吻合(92%),其余差异来自人物、NPC 与光晕;再用点探针与「去掉全部装饰物件」的对照运行确认物件层与人物确实绘制在场景之上。
  4. 已知限制整图族每格还可以配一张同名的遮挡图(让物件走到家具后面时被遮住),本轮未移植;画刷图(brushimg)同样未移植。加载策略与原版有偏差:原版用后台线程分阶段异步加载,Go 版改为同步加载加缓存,最终状态一致,代价是首次进入大地图时可能有一帧卡顿。地图编辑器暂不支持整图族地图的转换与编辑(探测阶段即报错),留作后续轮次。语料中该家具店的房间图片本身已把家具画进背景,装饰物件重画一遍在视觉上看不出差别,属语料特性。

2026-10-17 · 地图编辑器物件层工具:放置 / 拖动 / 删除装饰物件(扩展 0.6.8 + 引擎 0.5.36)

  1. 目标与背景地图编辑器第三支画笔。bktile 地图的装饰物件(房屋、路灯、招牌等)是地图脚本类体里一行一条的 AddImg / AddImgEx 语句:每条记录精灵文件、地图坐标、层号、播放间隔、可选类名与提示文本,引擎在加载地图时逐条创建对象并按「层号+坐标」公式排定前后遮挡。此前编辑器只能整体预览这些物件、改一个位置就得手工编辑脚本文本。本轮语义对齐 2004 年 C++ MapEdit 的 OBJ_EDIT:命中判定用精灵首帧矩形加不透明像素探针(透明区域不挡点击),并按遮挡顺序令最上层者先命中。
  2. 实现地图编辑器新增「物件」画笔与右侧「物件库」面板:面板列出该地图已用到的全部精灵(缩略图 + 尺寸 + 使用次数),点选后左键在地图上放置物件(新语句的层号、播放间隔、类名、提示文本自动沿用该精灵在本地图的首次用法)、按住拖动移动(带抓取偏移)、右键删除命中的物件;「显示物件」开关可整层隐藏以便查看地砖,悬停显示物件信息。物件不烘进预览底图,而由编辑器页面在独立图层上自行绘制,因此拖动即时可见、无需等待重新转换。保存时按「移动 / 删除 / 新增」三种操作逐条写回脚本:移动只改坐标数字本身,未触及的语句逐字节保留原有格式与字段;删除折掉整行;新增按编辑器格式追加到物件区末尾;写完重新扫描自检,结果与请求不符即报错不落盘,沿用源文件哈希冲突守卫与自动备份。物件笔画与地砖、覆盖层编辑共用同一撤销/重做栈与保存门控。
  3. 测试验证引擎侧新增 8 项测试全绿(语句投影、移动、删除+新增、空补丁、地图无物件时的插入位置、四类非法补丁拒绝、真实语料地图的投影与写回),全套回归通过。自动化浏览器实操独立测试页:命中与悬停、拖动偏移、右键删除、放置继承默认参数、撤销/重做逐笔回放、保存请求在「有物件改动」时携带操作表而「无改动」时不触碰该层、转换失败时整层丢弃并禁用工具(防止按过期序号误拖)。命令行写回工具对真实语料地图(360 个物件)同批应用「移动一个 + 删除一个 + 新增一个」:回读逐字节比对——恰好三行变化、其余全部字节(含地砖数据块)完全未动,重新转换往返一致;源文件哈希冲突、坐标越界、序号越界、自相矛盾的操作四条失败路径下源文件分毫未动。引擎升级至 0.5.36(DLL 与命令行转换工具同步重建),桌面实机直接运行编辑后的地图:脚本正常启动、渲染逐位一致、截图确认物件层出图。扩展升级至 0.6.8(已安装,重载编辑器窗口生效)。
  4. 已知限制物件库目前只列出该地图已用到的精灵,尚未提供从地图资源库全量浏览选取——因此一张没有物件的地图还无法凭空放下第一个物件(后续轮次候选)。整图族(wholemap)地图的 AddImg 物件参数顺序不同,本轮只列出、不参与编辑(原样保留)。对齐 C++ 原版的取舍沿用覆盖层一轮:右键删除命中节点(C++ 是删除当前激活节点,右键更直接)。

2026-10-17 · wholemap 族地图 AddImg 运行时补齐(引擎 0.5.35)

  1. 目标与背景fw2 语料的 wholemap 族地图(整图背图模式)在类体和实例上调用 AddImg(x,y,src,层,播放间隔,类名,扩展脚本) 往地图上铺装饰物件;Go 重写版此前只有 bktile 族的同名方法(参数顺序与坐标含义都不同),wholemap 族调用全部落空。这是上一轮已预告的「物件层编辑器工具」的前置补账:先把运行时补齐,编辑器工具才有对象可画。
  2. 实现C++ 参考实现里这是两个同名方法:bktile 族 src 在前、按块内坐标、自动层序;wholemap 族 x,y 在前、按地图绝对坐标、层序由「层号+坐标」公式算出(无自动层序)。Go 版按接收者类型在同名入口内分派,两族语义各自完整移植:整图族含 7 参数签名与缺省值(多余参数忽略、在场类型错误报错)、整调重入门控、类名创建(脚本类优先、失败兜底内建 img 类)、位置/图源/层序/播放间隔写入、扩展脚本迷你解析(赋值语句与函数调用两种形态,含引号内逗号、花括号嵌套等取词规则);编辑器专用的 modi 分支(强制物件类)一并移植。
  3. 测试验证新增 12 项单元/集成测试全绿(全参数/缺省/门控/错误参数/参数面往返/脚本类创建与兜底/扩展脚本三种形态/非字面量值的 C++ 级联行为/分派器双向),全套回归通过。引擎版本号升级至 0.5.35,DLL 重建后桌面实机跑 wholemap 族脚本:日志零错误,截图逐像素复核——两张纯色夹具图在地图坐标 (64,64) 与 (300,200) 处的显示位置、尺寸与颜色完全吻合(其中一张经脚本类 + 扩展脚本路径创建,证明类解析与扩展脚本赋值在真管线上同样生效)。
  4. 已知限制本轮只补运行时,不含编辑器工具——物件层(AddImg)的地图编辑器工具是后续轮次。fw2 语料中没有任何脚本使用编辑器专用的 modi 分支,该分支按 C++ 原样移植但仅单测覆盖。

2026-10-17 · 地图编辑器覆盖层工具:放置 / 拖动 / 删除覆盖节点(扩展 0.6.7)

  1. 目标与背景继续完善 bktile 地图编辑器,本轮做覆盖层(Sur)工具——对齐 2004 年 C++ MapEdit 的 SUR_EDIT 语义。覆盖层是地图上一组「精灵引用节点」:每个节点记录坐标(x, y)与动画帧号(no),指向 oversrc 指定的 ALE 动画里的一帧,由引擎叠加绘制在地砖与地形之上(树、石像、火把等摆件多在此层)。磁盘格式为 5 字节定长记录(两个 int16 坐标 + 一个 byte 帧号),此前编辑器只能整体预览、不能改。
  2. 实现地图编辑器新增「覆盖」画笔与右侧「覆盖帧」面板:列出 oversrc 动画的全部帧(合成缩略图 + 尺寸 @ 锚点偏移),点选帧后左键在地图上放置节点、按住拖动移动节点、右键删除命中的节点(最后绘制的节点优先命中,与 C++ 拾取顺序一致);编辑中的节点以半透明精灵加青色锚点直接画在预览上,被移动/删除节点的旧影保留到保存后重转——与地砖编辑的橙色标记同一套「先本地、保存生效」契约。覆盖层笔画与地砖编辑共用同一撤销/重做栈与保存门控;保存时整组节点一次性写回地图文件的 overdata 语句(空数组=删除该层、原本没有则在数据末尾插入),沿用源文件哈希冲突守卫与自动备份。
  3. 测试验证自动化浏览器实操独立测试页 26 项断言全部通过:17 帧面板齐全、点选切覆盖工具、放置节点坐标精确(±1 像素内)、拖动 +100 显示像素后坐标精确平移、右键删除、撤销/重做逐笔回放、保存请求在「有覆盖改动」时携带整组节点、「全部撤销后」正确回归不改动。命令行写回工具对真实语料地图应用「移动一个节点」补丁:回读逐字节比对——恰好一个字节变化(该节点 x 坐标 260→267)、地砖数据完全未动、备份正确。桌面实机直接运行编辑后的地图文件:脚本正常启动、零错误、渲染逐位一致。扩展升级至 0.6.7(已安装,重载编辑器窗口生效);引擎本次零改动(版本保持 0.5.34)。
  4. 已知限制对齐 C++ 原版的取舍:右键删除命中节点(C++ 是删除当前激活节点,右键更直接);覆盖帧面板不显示帧动画播放(缩略图足够选型,需要看动画可用 ALE 预览)。后续轮次计划做物件层(AddImg)工具——需要先把引擎的 wholemap 族 map::AddImg 运行时补齐。

2026-10-16 · 地图编辑器地形层绘制工具(扩展 0.6.6)

  1. 目标与背景继续完善 bktile 地图编辑器,本轮先做地形层绘制工具——对齐 2004 年 C++ MapEdit 的 KDF_EDIT 语义:右键刷地形时在 4 连块内随机取变体图、通行标志随地形可行走性整格重写。随机变体现按面板所选 kind(地形种类)自己的变体区间取随机数;通行标志全量写 0xD0(可行走)/ 0x40(阻挡),与磁盘上全部 fw2 语料地图的主导值一致(0x01 由引擎加载时自动补、0x02 仅为旧编辑器内部使用)。
  2. 实现地图编辑器新增「地形」画笔与右侧「地形库」面板:列出地图 .tle 库的全部地形种类(缩略图 + 图块 id 区间 + 可行走性红点/绿点标记),点选即用左键刷地形——每格自动随机该种类的一款变体图,通行标志随种类可行走性整格重写;与铅笔/橡皮一样支持 1×1/3×3/5×5 笔刷、拖动连续笔画、撤销重做与保存写回。配套地图转换工具升级(额外导出地形库元数据与拼图),旧缓存自动失效重转储。顺带:吸管取样到某地形时自动选中该种类、格悬停读数附地形名。
  3. 测试验证自动化浏览器实操独立测试页:7 个地形种类面板齐全、点选即切地形刷(状态栏提示 id 区间与随机变体语义)、画格正确上报编辑、撤销/重做回环、吸管自动选中、悬停显示地形名。命令行转换工具对 9 格(土0 变体 + 可行走标志)写回后字节级回读全对、与原图逐格比对仅该 9 格变化。桌面实机直接运行编辑后的地图文件:资源加载零错误、渲染校验逐位一致、截图正常。扩展升级至 0.6.6(已安装,重载编辑器窗口生效);引擎本次零改动(版本保持 0.5.34)。
  4. 已知限制对齐 C++ 原版:刷地形不自动重算边界过渡块、也不提供矩形/洪泛填充;需要时用 3×3/5×5 笔刷手工铺。后续轮次计划做覆盖层与物件层工具。

2026-10-16 · 真彩 ALE 动画(kind=3)解码支持,修复 blood.ale 打不开(引擎 0.5.34)

  1. 目标与背景用编辑器打开 fw2 语料里的 blood.ale(打雪仗界面受击血光动画)报错打不开。排查发现它属于 ALE 容器里的 kind=3「真彩」族——颜色不做成调色板、而是以 16 位 RGB565 色字内联在压缩数据里;Go 重写版此前只实现了 kind=1(调色板)解码,遇到 kind=3 直接报不支持。语料普查 kind=3 共有 902 个文件(占真 ALE 的 29%),不是孤例。
  2. 实现对照 C++ 参考实现(FDraw_AleRGB.cpp)补齐真彩路径:行/块压缩结构与调色板版相同,literal 块改为读取内联 RGB565 色字;阴影、单点半透明、链式半透明等块类型逐一移植(半透明强度 = 块头低 5 位 × 8)。引擎侧加载该格式的动画资源自动走新路径,渲染层零改动;编辑器预览对真彩文件自动隐藏调色板栏(该格式本就没有调色板),帧网格/播放/帧脚本编辑照常。
  3. 健壮性顺带修复一个隐患:个别 2004 年古旧文件的帧头宽高是负数或零(一个极端样本宽 -123 万),旧逻辑会按此申请内存直接崩溃;现对非法尺寸的帧改用 1×1 全透明占位帧,帧序号不漂移,行为与 C++ 参考实现一致(画不出内容但不受影响)。
  4. 测试验证新增合成样本单测(纯色/阴影/单点半透明/链式半透明全路径,含「565 色不做位复制」的逐通道断言),全套回归 12 包全绿;fw2 全部 3,113 个 ALE 文件扫描零失败(调色板族 2211 + 真彩族 902)。编辑器独立测试页 10 帧全部正常渲染、元信息正确。桌面实机用脚本直接加载 blood.ale:对象尺寸 83×16 与离线导出完全一致,截图像素采样复核——不透明像素与源逐位相等、半透明像素按 alpha 合成桌面底色后的结果与理论值完全一致。引擎版本号升级至 0.5.34。

2026-10-16 · 动画与地图编辑器默认按 1:1 实际像素显示(扩展 0.6.4)

  1. 目标与背景用编辑器打开 .ale 动画或 .fcc/.fcm 地图时,初始显示比例此前一个是默认放大 4 倍、一个默认缩放到适应窗口——想核对单帧像素或地图细部时总要多点一次「1:1」。现按用户要求,两类编辑器打开即按 100% 实际像素显示。
  2. 实现纯编辑器调整、引擎零改动:动画预览初始缩放由 4x 改为 1x;地图编辑器首帧加载由「适应窗口」改为 1:1,且窗口尺寸变化时保持 1:1 不再自动重缩(工具栏「适应窗口」按钮仍可随时一键适配)。缩放加减、1:1 按钮等行为不变。
  3. 测试验证TypeScript 编译通过;真实数据烹饪页面语法检查(动画 56 帧、地图 41×560 格)双双通过;自动化浏览器实操核对——地图编辑器缩放指示 100%、画面尺寸与离线渲染原图逐像素一致(旧行为约缩到 24%),动画首帧显示尺寸等于原始像素 26×40、56 个帧缩略图齐全、页面无任何脚本错误。扩展升级至 0.6.4(已安装,重载编辑器窗口生效)。
  4. 已知限制大地图在 1:1 下超出视口,需用滚动条/拖拽平移查看全貌;缩略概览可按「适应窗口」。

2026-10-16 · 地图动画对象播放提速(引擎 0.5.33)

  1. 目标与背景地图上以 AddImgEx 放置的动画物件(灯柱光晕等)此前播放明显偏慢。脚本里给这些物件设置的播放间隔数值(91/100/121 毫秒)在 C++ 参考实现中是真实毫秒——即原设计约 8~11 帧/秒的呼吸闪烁节奏。
  2. 根因与修复Go 重写版把该间隔误当成「更新次数」来计数——每 25 毫秒才加 1,于是 100 毫秒实际要等约 2.5 秒才播下一帧(0.4 帧/秒),比原设计慢 25 倍。已对照 C++ 参考实现(FObjImg.cpp:347-355)修正为毫秒语义:以真实运行毫秒数为基准,到达间隔即推进帧并回卷。角色动画(Human)走的本就是同款毫秒语义、不受影响;地图覆盖层逐节点画固定帧,本就静态。
  3. 测试验证相关单元测试改写通过(直接操纵运行毫秒数断言 进帧/不进帧/回卷 三态),全套回归全绿。桌面实机连拍 7 张截图比对:每间隔 700 毫秒的一对画面均有上万像素差异,且全部集中在灯柱光晕动画带——相机与其余画面逐像素不动,证实差异纯来自动画按新节奏推进(按旧慢速行为三对连续命中变化的概率仅约 2%)。引擎版本号升级至 0.5.33。
  4. 已知限制同日应用户要求,全部语料地图(525 个 .fcc + 1 个 .fcm,共 26,063 个动画物件)的播放间隔已统一改为 67 毫秒(恰 15 帧/秒,含原慢速氛围效果一并提速),改前原件逐文件备份;引擎自身不做统一改写,新建地图想精确 15 帧/秒仍把脚本播放间隔设为 67 毫秒。

2026-10-16 · 修复地图窗口右上角小地图全红(引擎 0.5.32)

  1. 目标与背景运行地图时右上角的小地图面板此前总是显示成一条红色占位块。按资源约定,每张地图自己的小地图缩略图应放在地图目录的 smap 子目录下(以地图名命名);引擎会优先加载这张专属缩略图,没有时才退回绘制示意草图。
  2. 根因与修复缩略图查找链路本身工作正常,真正的问题出在图像装配环节:无透明通道的纯色缩略图(如 jpg)被误当作「以左上角颜色为透明色」处理,整张图变成全透明,面板于是露出底下的红色占位条。已对照 C++ 参考实现修正——没有显式透明指令时,这类图像按不透明帧装配;仅当图像确实带透明通道时才保留其透明信息。顺带修正了一处被旧行为掩盖的测试用例像素假设(该用例的位图左上角实为蓝色而非白色)。
  3. 测试验证相关单元测试与整链路测试通过,全套 12 个包测试全绿。桌面实机运行真实项目地图 1+1.fcm 并截图核对:小地图区域显示的是 smap 目录里该地图自己的缩略图色调(深色蓝绿),不再是红色占位条;系统冒烟脚本的草图小地图回归正常,未受修复影响。引擎版本号升级至 0.5.32。
  4. 已知限制缩略图绘制在小地图面板左上角而非几何居中——这与 C++ 参考实现的调用顺序一致,属忠实行为。

2026-10-16 · 同名类的后定义覆盖替换 + 编辑器地图「▶ 运行」按钮(引擎 0.5.31 + 扩展 0.6.3)

  1. 目标与背景脚本中后定义的同名类现在会直接覆盖替换之前的定义、不再报重复定义错误(与 C++ 参考实现一致),并在运行时提示里输出一行替换记录。这解决了一个实际困扰:地图文件重定义系统脚本里的地图类后,按地图类实例化出的地图对象此前仍显示系统自带的旧地图,现在会正确显示地图文件自己的画面。
  2. 实现同名类替换静默生效,运行时提示给出「脚本类 X 替换同名内建类」或「class X 被新的同名类替换」一行记录(可点击跳转源码位置)。连同「多跳基类链」解析一起落地:子类先找到链条最底部的基类再逐层执行,实例化时会先执行基类脚本、再执行子类脚本,层级再深也正确(含防环保护)。编辑器地图窗口新增「▶ 运行」按钮——写完地图直接在引擎窗口里跑起来检查行走可达域与遮挡,有未保存编辑时会弹窗提醒。
  3. 测试验证新增单元测试覆盖基类链解析(多跳 / 防环 / 执行顺序)与三个整链路场景:地图文件重定义系统地图类后实例化显示新地图、同名类两次定义只保留最新一次、显式基类兜底。全套测试通过。桌面实机直接运行真实项目地图 1+1.fcm——运行时正确输出「脚本类 usermap 替换同名内建类」一行、无任何错误;截图核对显示的是该地图自己的石砖场景(火把灯柱、石像摆件)而非系统默认地图,逐点采样颜色特征也证实与系统地图完全不同。扩展「▶ 运行」按钮在自动化环境完成整链路验证(消息 → 启动引擎 → 完整运行日志输出)。引擎版本号升级至 0.5.31,扩展升级至 0.6.3(已安装)。
  4. 已知限制扩展升级后需重载编辑器窗口生效。「替换同名内建类」的文字仅在覆盖引擎内建类名时出现;覆盖脚本里其他同名类时显示另一条文案。显式基类写法仅在主名类不存在时兜底,与 C++ 参考实现一致。

2026-10-16 · 地图文件新增 .fcm 扩展名与编辑器「另存为」(扩展 0.6.2)

  1. 目标与背景地图文件此前与普通脚本共用 .fcc 扩展名,只能以文本方式打开,容易混淆。本轮为地图引入专属扩展名 .fcm——在编辑器里把地图「另存为」.fcm 文件后,双击即可直接进入地图编辑器。引擎按文件内容识别格式、不看扩展名,因此这次升级不需要动引擎。
  2. 实现编辑器新增「另存为」(Ctrl+Shift+S):把当前编辑内容完整写到新文件(典型用法:把老地图 .fcc 另存为 .fcm),原文件保持不动;写入前同样经过文件指纹校验与完整重编码自检,且不产生额外备份文件。VS Code 扩展把 .fcm 注册为「默认进入地图编辑器」,.fcc 保持「可选打开方式」不改变现有习惯;.fcm 同时获得语法高亮与脚本运行支持。
  3. 测试验证自动化测试 28 项断言全部通过——覆盖「有编辑另存为」(目标文件与手工写回工具输出逐字节一致、源文件不动、目录不残留临时文件)、「无编辑另存为」字节级一致、「源文件被外部修改时拒绝另存」、原地保存回归;另存出的 .fcm 可被编辑器打开、也可被引擎直接运行。桌面实机冒烟:以 .fcm 为主脚本并加载一张 .fcm 地图运行,画面与既有 .fcc 基线逐像素零差异(467200 像素全等)。已在真实项目地图上实测验收:把地图文件重命名为 .fcm 后双击直接进入地图编辑器;在编辑器中修改并保存后核对——仅被编辑的格子数据发生变化,原内容自动备份为 .bak,其余内容逐字节不变。扩展版本升级至 0.6.2。
  4. 已知限制扩展升级后需重载编辑器窗口生效。.fcm 与 .fcc 在引擎里完全等价,.fcm 仅为「这是地图」的提示约定。

2026-10-16 · 地图编辑器第二步:地砖与通行标志编辑写回(引擎 0.5.30 + 扩展 0.6.1)

  1. 目标与背景上一轮把老地图搬进了 VS Code 可视化预览,本轮把编辑器闭环为「可编辑保存」:直接替换地砖编号、修改通行标志(可走 / 可放 / 可显示 / 归一),保存时写回真实的 .fcc 地图文件——包括其中内嵌压缩的数据块,且只动被编辑的格子,其余字节逐位保留。至此「地图编辑器」大项完成第二轮。
  2. 实现地图工具 mapdump 新增 apply 写回命令:带文件指纹校验(防止覆盖他人修改)、按补丁文件批量应用格子编辑(换图块编号 / 改通行标志位)、用与原版一致的压缩算法重新编码数据块并重扫描自检(格数与尺寸往返一致、非目标块内容全等);所有编辑之外的文件内容(换行、缩进、其他语句)逐位不动。落盘走安全事务:首次保存留下原件备份、临时文件原子替换、只读文件自动处理;若编辑无实际变化则不写文件、不产生备份。扩展编辑器补齐全套编辑工具:选择 / 铅笔 / 橡皮 / 通行刷 / 吸管五种模式、图块编号输入、四个通行标志开关、笔刷尺寸、拖动绘制、撤销重做、未保存格数提示、Ctrl+S 保存,文件被外部改动时给出冲突提示。
  3. 测试验证写回往返测试在 8 张真实语料地图上进行:无改动保存与原文件字节级完全一致且不留备份;单格地砖 + 单格通行编辑只影响目标两格,备份与原件逐字节一致,块外字节前缀后缀全保留。桌面实机三场景截图对比:无改动往返副本与原图逐像素零差异;编辑副本的差异恰好 783 像素、全部集中在两个目标格(新地砖的 48×24 菱形面积 576 像素 + 通行标志清除后出现的红色虚线标记 207 像素),其余画面无任何变化。全套测试通过,引擎版本号升级至 0.5.30,扩展升级至 0.6.1。
  4. 已知限制当前支持地砖编号与四个通行标志位的编辑;覆盖动画层 / 光照层 / 物件层的编辑、旧版 .blk 地图格式、超大地图的 1:1 视口分片为后续轮次内容;含多段地图数据的文件暂固定编辑第一段。扩展升级后需重载编辑器窗口生效。

2026-10-16 · 地图编辑器第一步:老地图在 VS Code 里可视化预览(引擎 0.5.29 + 扩展 0.6.0)

  1. 目标与背景fw2 老项目的地图是「内嵌压缩数据的脚本文件」:地砖索引、覆盖动画、光照遮罩都编码在 .fcc 文本里,过去只能把地图跑起来才知道长什么样。本轮把地图渲染搬进 VS Code——直接打开地图文件即可看到整张地图的离线渲染图,并支持缩放、平移与逐格信息查看,是「地图编辑器」大项的第一轮。
  2. 实现新增地图工具 mapdump(识别 / 离线渲染 / 后续写回)与扩展自带的地图预览编辑器:静态解析脚本中的地图参数并复用引擎渲染管线,按条带渲染整图(峰值内存受控,超大地图自动等比缩小)叠加地砖、覆盖动画与光照三层;预览页支持适应窗口、1:1、缩放平移,鼠标悬停显示所在格的坐标、图块编号与通行标志(可走 / 可放 / 可显示)。编辑器以「可选打开方式」注册,不影响 .fcc 默认按文本编辑。
  3. 测试验证新增单元测试覆盖压缩编码往返、脚本扫描、离线回放与整图渲染;全套测试通过,引擎版本号升级至 0.5.29。预览保真:离线渲染图与桌面实机截图同区域逐点对比——无物件区域色差不超过 1 个色阶,差异全部集中在尚未支持的物件层区域(属本轮范围外,非引擎偏差)。扩展在独立环境完成打开、缩放、平移、悬停取格、重新转换等实操验证;扩展版本号升级至 0.6.0。
  4. 已知限制预览暂不含地图上的家具/装饰物件层(后续轮次补上);本轮为只读预览,地砖与通行的编辑写回为下一轮内容。

2026-10-16 · 等距瓦片地图管线 P6:光照遮罩层 lightmask / lightmaskfull(引擎 0.5.28)

  1. 目标与背景fw2 老图在瓦片层、覆盖动画、物件层之外还有第四层「光照遮罩」:地图脚本指定一张光照图,引擎在其上按网格平铺(lightmask)或整体拉伸(lightmaskfull)以半透明方式叠加,形成整图明暗氛围。这是地图编辑参数链在引擎侧的最后一块拼图。
  2. 实现bktile 新增 lightmask / lightmaskfull 两参数:前者取光照图首帧按帧尺寸与地图网格对齐平铺,后者把首帧拉伸到整张地图尺寸只画一次;两者都以约 49% 透明度叠在瓦片与覆盖层之上,与原版层序一致;光照图纹理按需上传复用,不随帧重建。
  3. 测试验证新增用例覆盖 64×64 网格对齐、半透明混合、右/下边缘忠实缝隙与整图拉伸;全套测试通过,引擎版本号升级至 0.5.28。桌面实机三轮对照(无光照 / 平铺光照 / 整图光照):14 个采样点两轮全部符合「亮图 = 底图 +(255−底图)×125/255」的混合公式,平铺轮可见光照网格对齐痕迹、整图轮无网格痕迹。

2026-10-16 · 等距瓦片地图物件层 AddImg / AddImgEx(引擎 0.5.27)

  1. 目标与背景fw2 老图在瓦片层与覆盖动画之外还有家具、装饰等「物件」:由地图脚本在加载时逐个把图片或脚本类对象摆进地图,按像素位置参与纵深排序。最小样例地图就有 183 处此类调用、全语料 716 张地图在用。本轮把这条物件层移植进引擎,是 fw2 地图大项的第五步。
  2. 实现bktile 新增 AddImg(图片 + 像素坐标或压缩位置串)与 AddImgEx(扩展六、七参形态:自定义类名、层级、动画播放间隔、鼠标提示)两类脚本函数。物件按原版层级公式参与 z 序排序;扩展形态可指定脚本类作为接收者(如老项目的银行人物类),其初始化完成事件在全部属性配置之后才触发,与原版时序一致;位置串沿用原版 5 字符压缩编码。同类调用按「物件等级」门控:等级不足时静默跳过,与原版语义相同。
  3. 测试验证新增八项用例覆盖层级公式、两种坐标形态、扩展参数、脚本类接收者的初始化时序与各类门控/参数错误;全套测试通过,引擎版本号升级至 0.5.27。桌面实机:真实脚本在瓦片地图上同时摆放普通物件、带鼠标提示的扩展物件与压缩位置物件,三个物件全部正确出图、层级正确,日志零错误。

2026-10-15 · 等距瓦片地图管线 P4:无 .tle 资源现场建库(引擎 0.5.26)

  1. 目标与背景老图使用的 .tle 图块库并非必须分发的资源——原版引擎在首次加载时会从 JPG 瓦片条现场重建它并写入缓存,之后每次启动直接读缓存。本轮把这条「建库链」移植进引擎,fw2 语料中 705 张 MapEdit 老图在没有任何 .tle 文件的情况下即可直接渲染,是 fw2 地图大项的第四步。
  2. 实现loadtle 打不开时先查缓存目录(路径折叠为八位十六进制短名),命中即载;未命中则触发脚本类的 OnMakeCmd 事件——类体中的 addkind(瓦片条切块)、link(过渡瓦片生成)、importile(整图导入)逐条进入队列,每帧消费一条建入库中,全部完成后写回缓存。期间修复一处关键缺陷:OnMakeCmd 事件原先用对象层哈希派发,与脚本函数表的字符串表编号不在同一编号空间,事件永远无法命中,现归入系统事件表统一初始化。
  3. 测试验证新增端到端用例覆盖「类体触发器 → OnMakeCmd → 队列逐帧消费 → 库就绪 → 缓存落盘」全链;全套测试通过,引擎版本号升级至 0.5.26。桌面实机:在无任何 .tle 的环境下直接运行真实老图——引擎现场建成 919KB 图块库并渲染出完整的等距石板地图(土块补丁、石板纹路逐像素呈现);重启后缓存复用,画面帧哈希与首次建库逐位一致。

2026-10-15 · 等距瓦片地图管线 P3:通行标志与行走(引擎 0.5.25)

  1. 目标与背景老图的格子除了显示,还要回答「能不能走」。原版以每格一字节通行标志驱动行走与寻路:0x80 可走、0x40 可放置、0x10 可显示、0x01 二级可走,四项全部置位的格子才可通行;加载时引擎会对每格强制补上二级可走位。本轮把通行判定与行走链路移植进引擎,是 fw2 地图大项的第三步。
  2. 实现bktile 新增屏幕像素到存储格的两层坐标变换,以及取点标志、取点区块等查询接口;脚本函数补齐六项通行能力(随机可走点、寻路、二级可走位读写、通行查询、像素吸附格心)。行走方法每步对父地图做通行探测,阻挡时再探测前方短路点后触发中断事件;A* 与直线两种寻路器的代价函数接入同一通行判定。父对象不是地图时按原版语义视作可通行。
  3. 测试验证新增用例从实机脚本的压缩数据出发,验证墙格、可走格的标志位与逐点通行判定;全套测试通过,引擎版本号升级至 0.5.25。桌面实机:40×40 合成地图全屏红海中竖一列透底色的墙,小人从墙左直行目标必穿墙——实际经由 A* 绕行墙侧走廊抵达终点,墙、走廊、小人落点等十个采样像素全部命中,两帧画面完全一致(静止于终点)。

2026-10-15 · 等距瓦片地图管线 P2:oversrc / overdata 覆盖动画层(引擎 0.5.24)

  1. 目标与背景fw2 MapEdit 老图约六成在瓦片层之上另有覆盖动画层:oversrc 指定动画文件(如 1+1.fcc 的 1+1yingzi_over.ale),overdata 以二进制常量存放逐点覆盖节点。本轮把该层移植进引擎,是 fw2 地图大项的第二步(P3 通行与行走随后)。
  2. 实现bktile 新增 oversrc / overdata 参数:节点按原版布局每 5 字节一组(横、纵、帧号),长度不整除即拒收并与原版一致报错;动画文件经统一加载器接入 ALE 动画解码(按文件头自动识别格式,影子行解码为独立阴影层)。渲染层序为瓦片层之后逐节点绘制覆盖动画帧(帧号越界静默跳过),帧坐标带原版帧偏移。
  3. 测试验证新增覆盖节点解析(负坐标往返、坏长度拒收)、动画文件加载、覆盖层渲染像素(含阴影半透明叠加精确值)等用例,全套测试通过,引擎版本号升级至 0.5.24。桌面实机:真实老图 harness 的 76 个覆盖节点正确落位,窗口内阴影叠加像素与理论值误差不超过 ±1,阴影外区域零回归,GPU / CPU 渲染逐帧一致;老图直跑编译运行零错、既有画面零回归。

2026-10-15 · new 类解析修复:脚本类优先于同名内建(引擎 0.5.23)

  1. 问题与根因真实老图 1+1.fcc 首验时发现:脚本定义 class usermap:bktile 后执行 new usermap,实例化的是内建方格地图而非脚本类,类体(loadtle / indexdata 等参数与方法)从不生效。根因是 new 的类解析先查内建注册表、命中即返回,而引擎为早期测试脚本自加的 "usermap" 内建注册(原版引擎并无此注册名)抢跑了同名脚本类。
  2. 修复方案类解析改为脚本类优先:new X 时先查脚本类表,命中则以脚本类声明的基类实例化并执行类体、标记脚本类身份;未命中才走内建注册。与原版引擎对照确认:语料中脚本类与内建注册名同名冲突仅 usermap 一例(usermap 本身就不是内建名),此改动不改变任何原版可观察行为;socketc 等常见路径(无同名脚本类)行为不变。
  3. 测试验证新增回归用例:new usermap 实例化为 bktile 且携带脚本类标记;全套测试通过(含相机演示脚本 class mymap:usermap 等内建基类路径零回归)。桌面实机:老图 harness 改回真名 new usermap 后正确走 bktile 渲染管线(图块库缺失时全屏绿色占位格逐像素精确命中);老图直跑编译运行零错;此前地图管线验收的七点像素基准全部保持通过。引擎版本号升级至 0.5.23。

2026-10-15 · 等距瓦片地图管线 P1:bktile 老图加载与渲染(引擎 0.5.22)

  1. 目标与背景fw2 语料 720 张地图中 705 张为同一族(MapEdit 3.00 生成)的 bktile 等距菱形瓦片地图:loadtle 指定 .tle 图块库、indexdata 以 $PKH 压缩存放逐格图块索引、约六成另有 overdata 覆盖动画层。本轮完成加载与渲染最小闭环,是 fw2 地图大项的第一步(P2 覆盖动画层、P3 通行与行走随后)。
  2. 自研 LZW 与 $PKH 求值逐行移植 2003 版自研 12-bit LZW 压缩(与标准 LZW 不互通);脚本层 $PKH / $HEX 二进制常量在扫描期解码:hex 还原、未压缩长度校验、LZW 解压,直接产物为二进制常量节点。用真实老图 1+1.fcc 做金测,解压字节数与网格规模精确吻合。
  3. .tle 图块库与 bktile 类解析 .tle 图块库格式(种类表 + 图块表,每图块 602 个 RGB565 采样按菱形扫描线还原为 49×25 位图);新增原生 bktile 对象类,支持 loadtle / tilesize / indexdata / showgoflag 参数:按视口裁剪逐格绘制、图块纹理按编号缓存复用、索引越界画绿色占位格、60000 编号跳格。
  4. 测试验证LZW 往返与真实语料金测、.tle 解析(菱形形状与坏输入)、bktile 坐标变换 / 参数链 / 渲染像素 / 通行标志覆盖、$HEX / $PKH 求值全链路等新增用例,全套测试通过,引擎版本号升级至 0.5.22。桌面实机:30×100 合成地图红海无缝铺满全屏,蓝图块、越界绿格、跳格透底色七点逐像素命中。

2026-10-14 · 系统默认文本字号与按钮统一:12px 对齐原版(引擎 0.5.21)

  1. 问题与根因纯文本对象与 MakeImg 画布(按钮文字)的默认字号此前分别为 14px 与 13px,均大于 2003 版原版的 12px(FObjText 构造默认 FontWidth 6 / FontHeight 12,画布默认字体 CreateFont(12,6))。字号偏大导致按原版尺寸固定宽度的旧脚本文字超出边界,如 fw2 语料 Snowfight/server.fcc 的 70px 面板标题压住右边框。
  2. 统一修复文本对象默认字号与画布默认字体(font 参数为 0 时)统一为 12px,逐一对应原版两处默认值;系统内所有默认文本从此与按钮文字一致。显式指定的字号(font= / fontsize=)不受影响。
  3. fontsize 参数补全补齐原版 fontsize 参数的读写:写 int 时字号=该值、字宽=该值的一半;写两元素的数组时按 [高, 宽] 设置;读回的数组宽在前(与原版 "dd" 顺序一致),旧脚本对 fontsize 的赋值与读取(如按字号计算布局宽度)原样可用。
  4. 测试验证新增 4 条回归用例:默认字号为 12 且构造值与原版一致、画布默认与显式 12px 度量相同、Snowfight 面板五个文本全部不超边界、fontsize 读写与非法值拒绝。全套测试通过,引擎版本号升级至 0.5.21。桌面实机:F7 截图前后对比——修复前「雪仗服务器」标题压过面板右边框,修复后收进框内且留有余量。

2026-10-14 · wnd OnSize 事件分发修复:脚本类内 autopos 生效(引擎 0.5.20)

  1. 问题与根因旧脚本在 wnd 子类中写 `void OnSize(int w,int h){ autopos:=vert(3,3,3); }` 后子项不重排(如 fw2 语料 Snowfight/server.fcc 的自动布局面板)。根因是 2003 版引擎每帧绘制前由 FObj::CheckShowStatus 向尺寸变化的对象派发 OnSize 事件,这一机制此前未移植到 Go 引擎,脚本类内的 OnSize 从未被调用。
  2. 修复实现按原版语义补上逐帧 OnSize 分发:对象尺寸发生变化且类内定义了 OnSize 时派发事件、参数为宽高两个整数(对齐原版 "dd" 参数);处理函数不存在时回退为无参调用,仍不成功则停止对其派发;事件为单帧边沿触发,处理完即清除变化标志。根窗口沿用窗口尺寸变化时的即时派发、不参与逐帧分发,避免重复触发。
  3. 测试验证新增 2 条回归用例:脚本类 OnSize 在子窗口尺寸变化时触发且参数正确、autopos 竖排后子项 x 对齐且 y 递增;Snowfight 形状的多面板布局端到端断言。全套测试通过,引擎版本号升级至 0.5.20。桌面实机:用 0.5.20 DLL 跑真实 fw2/Snowfight/server.fcc,F7 截图前后对比——修复前各子项全部重叠在面板左上角,修复后两个面板并排(5,5)与(80,5)落位、行按竖排规则堆叠。

2026-10-14 · FCBOX 标题角标回归:右下角标志与关于对话框并存(引擎 0.5.19)

  1. 右下角 FCBOX 标志窗口标题栏开启时,Root 窗口右下角恢复绘制原版的 32×12 FCBOX 标志位图(对齐 2003 版 m_imgFcFlag 行为:Show 末尾以 w-32-1, h-12-1 贴角、无透明通道原样拷贝),此前该区域为空白;标志随窗口尺寸自适应贴角,标题栏关闭时不绘制。
  2. 热角与关于对话框鼠标点击右下角热区弹出关于对话框的既有行为不变,标志与对话框同时可见;关于对话框的图片纹理缓存改用渲染后端身份判定——切换 CPU / GPU 渲染时不会误释放新后端上复用同纹理编号的角标纹理。
  3. 测试验证新增 3 条像素级回归用例:标志矩形逐像素等于解码后的 fancy.gif、外圈 1 像素边框为纯背景、标题栏关闭时该区域为空、渲染后端切换后稳态仍绘制;6 个既有像素精确测试夹具同步适配;全套测试通过,引擎版本号升级至 0.5.19。桌面实机:F7 截图角标 384 像素逐字节一致,点击热角弹出关于面板落位正确,CPU / GPU 渲染哈希逐帧一致。

2026-10-13 · 网络层:sockets / socketc 对象家族全栈移植(引擎 0.5.18)

  1. 网络对象家族按 2003 年原版 C++ 网络层全栈移植五个对象类:服务端 sockets、客户端 socketc,以及无握手协议族的 socketsd / socketcd / socketuser;自定义子类、组注册、玩家登录回调等原版脚本写法原样可用。
  2. 完整通信链路从 TCP 连接、版本握手、加密协商,到组注册(RegWebGroup)、玩家登录解析、登录回调 OnWebPlayerCreate、对象远程调用(client<< / server<< / tos<< 等目标关键字)与组播,全部按原版协议与语义实现;文本行与二进制块、可选压缩与加密、空闲超时与断线清理一并移植。
  3. 旧脚本零改动2003-2007 年语料的典型写法——`new sockets` 配端口、RegWebGroup 注册组、`class X:socketc{ RegClientGroup(); defcreatewnd=this; ... }` 手工登录——无需修改即可运行。
  4. 测试验证传输层 54 条用例覆盖加密向量、行与二进制帧、空闲超时与真实 TCP 环回;对象层单进程全链路环回测试跑通「握手→登录→建玩家对象→注册镜像→双向远程调用」;桌面版 launcher 实机单进程环回:约 175 毫秒内全条件达成、截图结果窗 36000 像素逐像素纯绿零杂色,GPU 渲染 bit-exact;全套测试通过,引擎版本号升级至 0.5.18。
  5. 已知限制socketsd / socketcd / socketuser 协议族已完成类面与单元测试,暂未做桌面实机演练;组定位(RegWebGroupLoc)走简化路径,完整定位表列为后续计划。

2026-10-13 · 数据库层:DBConnection / DBRecordset 换装 MySQL 后端(引擎 0.5.17)

  1. MySQL 后端新增 DBConnection / DBRecordset 两个对象类(按原版 ServerExt 的 C++ 实现全量移植),数据库后端从 ADO / 微软 SQL Server 换成 MySQL:连接、查询、行读写与逐帧遍历全部经 MySQL 驱动完成,单文件发布形态不变。
  2. 旧脚本零改动原版连接串(Data Source=xxx、driver={SQL Server};…)自动转换为 MySQL 连接参数,2003-2007 年脚本语料中的数据库代码无需修改即可改用 MySQL;主机、端口、库名、账号亦可用环境变量分别覆盖,便于部署配置。
  3. 遍历语义对齐游标移动与 EOF 行为按 ADO 钳制语义复刻(越界回钳、空表保护),老脚本 `while(nPos!=EOF)` 式遍历原样可用;Enum 同步回调与 EnumDelay 逐帧延迟回调(含跳过数量、结束回调)全部移植。
  4. 测试验证单元测试覆盖连接串转换与环境变量覆盖;嵌入式假驱动逐条核对生成的 SQL 语句形态;端到端脚本测试跑通「连接→查询→同步枚举→循环遍历→逐帧枚举」全链路;并在隔离 MySQL 实例上完成真库联调——旧连接串+环境变量覆盖、直连连接串两条配置路径均通过,launcher 实机脚本跑通建表、增删改查、同步与逐帧枚举及中文数据往返,负向对照正确报红;全套测试通过,引擎版本号升级至 0.5.17。
  5. 已知限制服务器端索引定位(PutIndex/Seek)在行缓存模型下降级(仅校验状态);删除仅支持当前行;DBBank / dbsocket2 等其余数据库相关对象列为后续计划。

2026-10-13 · 测试地图交互修复:地形开关与点击标记完整帧(引擎 0.5.16)

  1. 地形可行走开关测试地图工具栏的显示地形按钮生效:usermap 新增 gomask(可行走遮罩图,亮像素=可走)与 showgoflag(叠加开关)两个参数;开启后地图上以半透明黄色覆盖层实时标出全部可行走格——河流、湖泊与岩石格保持原样,一眼可辨通路。测试地图自带新绘制的遮罩资源(桥梁缺口、湖岸圆角与零散巨石)。
  2. 布尔运算语义对齐修复脚本 `!`/比较/逻辑与或的取值类型:与 C++ 原版一致落为整数 0/1。此前取反等运算产出布尔值,被 showgoflag 这类整数参数的类型检查拒绝——这正是「按钮点了没效果」的第二层根因;开关取反脚本 `showgoflag=!showgoflag` 现在可以直接工作。
  3. 点击标记完整帧修复点击地图时落点的扩散动画只显示右下角的问题:动画各帧自带负的绘制偏移(帧原点在左上方),此前帧矩形漏算该偏移导致左上象限被视口裁掉;现在动画帧的完整画面(含偏移区域)全部可见。
  4. 实测验证桌面版 launcher 实测:地形开关三张截图逐像素核对(关闭=纯草地零偏差、开启=可走格混合色逐点吻合且水域原样、再关=零偏差);定时点击后截图核对标记覆盖区与动画帧矩形逐像素吻合,标记明显延伸到点击点左上方(修复前不可见);引擎版本号升级至 0.5.16。

2026-10-13 · 测试地图草地:格子贴图与 1:1 原像素平铺(引擎 0.5.15)

  1. 格子贴图管线usermap 新增 wholemap 参数:一张整图作地图背图,每个格子按比例裁取自己的贴图块(忠实复刻 C++ 逐格拉伸语义),无图格保留灰蓝底块;同时修正 2002 年原版资源名笔误 def_glass → def_grass(旧名保留兼容)。
  2. 1:1 原像素平铺用户反馈草地被拉伸、颗粒大而模糊——逐格拉伸把 64 像素小图放大到整格所致。新增预平铺整图资源(小纹理按原像素 1:1 平铺成整图尺寸),测试地图改用它:每格取到的恰好是纹理原像素,画面锐利无拉伸。
  3. 实测验证桌面版 launcher 全屏逐像素核对:相机偏移下屏幕每个像素与预平铺整图对应像素完全相等(两轮均零偏差)——真实渲染管线确为 1:1 无拉伸;引擎版本号升级至 0.5.15。

2026-10-13 · tooltips 提示气泡:背景三段错位修复(引擎 0.5.14)

  1. 问题与根因鼠标悬停出的 ToolTips 提示气泡背景三段错位(最左侧铺成了最右段、中间没有平铺中段)。逐行核对 C++/Go 双方 himgtile 三段绘制代码完全一致,根因不在代码:嵌入资源 ToolTips.ale 曾被一次重打包实验替换,帧矩形表被旋转,同字节数、仅帧序不同,于是三段图块被按新顺序错位分配。
  2. 修复与回归恢复原版资源(md5 与参考源一致),并新增两条回归测试防止复发:帧序测试(3 帧 19×27 / 8×21 / 12×21 加尾尖像素钉死帧表顺序)、段位绘制测试(8 个采样点钉死左帽轮廓/填充/尾尖、中段平铺、右帽各自落位)。
  3. 实测验证桌面版 launcher 实测悬停气泡:17 个采样点与 CPU 预测逐位一致——左帽黑边、圆角、小尾尖、中段平铺填充、右帽、阴影、文字混合全部恢复原版样式;引擎版本号升级至 0.5.14。
  4. 教训重打包/帧序类实验不得拿嵌入资源当试验田:嵌入资源与参考源必须保持 md5 一致。

2026-10-13 · roundhalf 圆角半透明背景:五项脚本功能收官(引擎 0.5.13)

  1. 圆角半透明背景roundhalf 移植原版圆角半透明填充:圆角矩形按半径裁剪、填充与描边做半透明混合;lastW/lastH 负内缩允许框画出对象矩形之外(名牌配方所需的忠实行为)。
  2. alpha 语义对齐填充强度不随对象 alpha 缩放——与 C++ 原版一致(纯色 color 填充从不读对象 alpha,需要 alpha 感知的背景用 colorex);roundbar / round4_3 圆角族同步对齐修复。
  3. 实测验证四窗口对比实测:roundhalf alpha=100 与 alpha=0 同为半混合、纯色 color 两档均不透明、colorex 随 alpha 变化——与 C++ 语义逐点一致;测试地图 demo 零回归;引擎版本号升级至 0.5.13。
  4. 五项收官脚本功能五项顺序 usermap → view 相机 → human → 小地图 → roundhalf 全部完成并通过验收。

2026-10-13 · 小地图面板:地图缩略图、相机框与点击操作(引擎 0.5.12)

  1. 小地图绘制系统脚本「测试地图」右上角的小地图面板从占位变为真实缩略图:地图整体按比例缩到面板内(默认深红底条、贴图底图二选一),黄色角标实时框出当前相机看向的地图区域,相机滚动时同步移动。
  2. 人物标记地图对象可用 mapshowmode/mapshowcolor 声明小地图标记样式(脉动十字、星形、斜十字、斜十字加圆圈等):角色在地图上的位置以品红叉形标记实时跟随,测试人物移动/瞬移后标记同步。
  3. 点击操作左键点击小地图移动相机到点击处(可按住拖拽扫图),右键点击把小地图上的目标点交给脚本处理——测试 demo 中为角色瞬移(再走起带飞行动画),与地图脚本原有语义一致。
  4. 实测验证桌面版 launcher 实测:小地图三截图逐像素核对(底条色 RGB(100,0,0)、角框色 RGB(232,232,0)、标记色 #FF00FF)——左键点击后相机精确跳到地图 (245,181)、右键点击后角色瞬移 (640,480) 且标记精确落在点击位;桌面版引擎版本号升级至 0.5.12。
  5. 已知边界脚本功能五项顺序仅剩 roundhalf(圆角半透明背景)一轮。

2026-10-13 · 行走人物精灵:8 方向图集与地图行走(引擎 0.5.11)

  1. 多方向精灵新增 human 人物对象:一张图集按方向乘帧数切分(如 8 方向 × 每向多帧),行走、转向、站立自动换帧;也可以配置多套图集(multisrc)按 anikind 切换,朝向可用 forward 指定角度或 forwardto 直接指向目标点自动换算。
  2. 行走链路与行为系统打通:gotopos 行走自动朝目标方向、迈步动画循环,抵达后触发 OnStop(demo 中复位站立帧);行走中可被打断切换到传送(多段飞行动画)。
  3. 测试地图联动「测试地图」demo 中的人物可直接行走/转向/站立:左键点击地图走向点击点、右键点击瞬移,名牌跟随人物,小地图标记同步(配合上一轮小地图功能可实时观察)。
  4. 实测验证桌面版 launcher 干净复跑逐阶段验证:行走终点、相机跟随双向夹紧、8 方向帧槽位与图集像素逐位一致(东南向行走帧 740/740 像素全等);桌面版引擎版本号升级至 0.5.11。
  5. 已知边界装备/换装层(FHumanEquip)不在本轮移植范围。

2026-10-12 · 视口相机滚动:view 相机偏移与滚轮联动(引擎 0.5.10)

  1. 相机渲染view 视口对象移植原版相机:把地图按滚动偏移(viewpos/viewx/viewy)平移后绘制,窗口外的地图部分自动裁剪;挂接地图时自动排除其在普通绘制队列中的重复绘制,换绑或释放时恢复,滚动过程画面无重影。
  2. 平滑滚动与跟随滚动目标位置(toviewpos/toviewx/toviewy)与当前滚动位置分离,按 movestep 每帧逼近实现平滑滚动;viewcenterpos 将指定点对准视口中心(自动钳位不出地图边界),viewfollow 跟随目标对象,mousescroll 开启鼠标贴边自动滚动。
  3. 滚轮联动鼠标滚轮在视口上滚动地图:滚轮增量换算为滚动步长,经平滑滚动收敛到目标位置;实测 3 个滚轮刻度精确移动 30 像素、无重影。地图宽高参数 mapwidth/mapheight 改为只读,由所挂地图自动同步。
  4. 实测验证测试地图 demo 画面与上一版逐像素一致(相机接线无回归);新增相机演示脚本(红方块标记随 viewpos 偏移精确落位、滚轮实时滚动),桌面版 GPU 渲染管线全程逐位一致;桌面版引擎版本号升级至 0.5.10。
  5. 已知边界行走人物精灵与精灵多方向图集为下一轮内容;小地图画面绘制再后一轮。

2026-10-12 · 测试地图 demo 落地:usermap 瓦片绘制与脚本解析修复(引擎 0.5.9)

  1. usermap 地图瓦片usermap 地图对象移植原版瓦片绘制:默认 20×15 格、每格 64 像素(1280×960,大于窗口供滚动),空格子以原版同色蓝紫填充,按视口自动剔除屏外格、透明格跳过不画。
  2. 脚本跨行大括号修复<对象> 语句后换行再写 { 代码块 } 时,代码块此前会脱离语句、错误地作用到外层窗口(系统脚本「测试地图」的小地图参数因此泄漏到主视口,画面缩成一条);现与原版一致跨行挂接,style/class 声明同理。
  3. 实测验证测试地图 demo(testmap.fcc)在桌面版 GPU 渲染管线下实测通过:满屏瓦片铺底、左上角 6 个工具条按钮,像素级校验与引擎内测试完全一致;桌面版引擎版本号升级至 0.5.9。
  4. 已知边界本轮为地图底格与小地图布局:小地图画面绘制、行走人物精灵为后续轮次内容。

2026-10-12 · 椭圆轨迹背景(ellipse)实测通过

  1. ellipse 实测通过bk:=ellipse 椭圆轨迹背景在桌面版 GPU 渲染管线下实测通过:两段中心对称的淡出尾迹沿椭圆逆时针旋转,每帧前进 10°;尾迹起点最亮、逐点变暗,像素级采样与原版引擎行为一致。
  2. 内缩与外扩轨迹椭圆的半径参数为正时向内收缩、为负时向外扩出窗口范围,扩出部分仍正常绘制不裁剪;要黑色底衬可在下层叠加一个纯色窗口(同一窗口只保留最后一个背景方法)。
  3. 零构建验证轮本轮为实测验证、无代码改动,桌面版引擎版本保持 0.5.7;已知差异:轨迹起始角度为固定值,原版为随机起始角(仅影响起始位置观感)。

2026-10-12 · dotcolor 格点背景修复(引擎 0.5.7)

  1. dotcolor 棋盘格修复bk:=dotcolor 格点背景修复为与原版一致的 50% 棋盘格点阵:1 像素点隔行交错铺满,此前只有 25% 密度、每隔一行就整行空缺。
  2. 相位锁定格点相位与屏幕坐标对齐:窗口移动、被裁剪或部分遮挡时,点阵花纹不会突然翻转;桌面版引擎版本号升级至 0.5.7。
  3. round4_3 复核圆角矩形背景在 GPU 渲染管线下复核:四个圆角描边连续完整,无通透斜线,显示正常。

2026-10-08 · 脚本支持小数(float)与 Esc 键行为修复

  1. 脚本支持小数FCC 脚本语言新增 float(浮点数)基本类型:现在代码中可直接书写小数字面量,如 3.75、0.5(最多 6 位小数);此前出现小数点会报错,导致含小数参数的调用(如 MixLine(5.5, 8.5))无法运行。
  2. float 变量与成员可声明 float 变量、在类中声明 float 成员变量(约定以 m_f 开头,如 m_fv);与其它基本类型一致,可用 .str 属性取得小数的十进制文本。
  3. Esc 键行为修复版权信息面板打开时按 Esc 现在只关闭面板、不再连带退出程序;脚本注册的 Esc 热键处理按键后事件不再继续传播,不再意外触发程序退出。
  4. 学习手册更新手册「基本类型」章节由七种类型扩为八种,新增 float 浮点数:声明写法、小数字面量规则、成员变量前缀约定(m_f)与可用属性均有说明与示例。
  5. 在线体验页更新体验页引擎升级至 0.5.6,同步支持小数等最新特性;「能力边界」清单补充说明:触摸屏环境下的点击仅被解释为鼠标左键按下。

2026-10-07 · 在线体验页上线(浏览器里跑 FCC)

  1. 浏览器直接运行新增「在线体验」页面:无需安装任何程序,浏览器里直接运行 FCC 脚本。左侧是引擎模拟屏幕、右侧是代码编辑器,内置多个示例可一键切换,点「运行」即刻看到效果,随时「停止」。
  2. 虚拟工作目录与控制台页面自带运行控制台与虚拟工作目录:可上传本机文件供脚本读取、把脚本生成的文件(如 F7 截图)下载回本机;内容只存在浏览器内存中,刷新即清空,代码不会上传服务器。
  3. 能力边界说明页面附「能力边界」清单:浏览器版为软件渲染,没有真实窗口、系统托盘、声音、网络与 DLL 扩展,也不能读写本机文件;要开发完整产品请在桌面使用发布版引擎。
  4. 网站入口调整网站导航改为「学习」(在线体验)与「手册」(脚本参考)双入口,主页按钮同步提供「开始学习 FCC」,从首页一步进入体验页。

2026-10-07 · 扫雷示例完善与页面导航

  1. 扫雷示例升级示例中的扫雷更换为更完整的版本:支持右键标雷并实时显示剩余雷数,右击「新游戏」可设置限时、棋盘格数与雷数。
  2. 显示区域加大扫雷的显示区域扩大到与其它示例一致,棋盘自动居中显示在画面中央。
  3. 设置对话框输入修复右击「新游戏」弹出的设置对话框中,四个输入框不再同时闪烁光标——此前每个输入框都获得了输入焦点、导致没法修改内容;现在点击哪个输入框,哪个才获得光标,可直接键入数值。
  4. 页面导航按钮学习手册首页与手册正文页新增「返回首页」「FancyBox2D 主页」按钮,正文页另有「返回手册」按钮,手册与网站之间往返更顺手。

2026-10-06 · GPU 外部渲染器(render.dll)

  1. GPU 外部渲染器新增 render.dll:程序启动时若发现该文件,自动启用 OpenGL 外部渲染通道,整帧画面经 GPU 纹理上传直接上屏;未放置该文件时照常使用内置渲染,行为完全不变。
  2. 渲染一致性校验运行中自动抽样回读画面、逐位比对 GPU 与内置渲染结果,两者位精确一致(RGB 零差异);图片背景等画面内容在 GPU 通道下正确上屏。

2026-10-06 · 小项修复与下载器补全

  1. view 背景色与背景动画模式view 对象的 bkcolor(背景色)与 anibkmode(动画背景模式)现在真正生效,此前设置被静默丢弃;未连接地图的 view 也会按背景色填满空区域。
  2. new img(x,y,src) 构造参数以坐标与图片路径三个参数创建图像对象时参数正确应用,此前构造实参全部丢失(对象落在原点且无图)。
  3. 键盘消息完整路由宿主键盘消息带真实键码进入完整按键管线:内置快捷键、脚本注册热键与焦点对象的按键事件均正常响应,此前数字键码在入口处被丢弃。
  4. 系统错误状态上报长时间画面卡顿与网络断线现在会真实写入系统错误状态,脚本经 GetSysErr 系列可查询到、恢复后自动清除;此前该状态恒为 0。
  5. 下载器补全新增 DownLoadFile / DownLoadPath / DefFileSwap 三个脚本函数:按远程清单把文件下载并换算为本地目标文件,本地已有匹配文件时直接复用;下载更新链路的消费端由此补齐。

2026-10-06 · 版权信息对话框修正与版本规范

  1. 平台页版式重排开发平台页的 banner 按面板宽度等比缩放、不再出界;各行文本自动选用适配字号并水平居中,行距舒展、不再相互粘连。
  2. 布局与描边访问网址页脚在产品版权页与开发平台页都常驻显示;面板加高 20 像素获得更大呼吸空间;分页标签左右居中;面板四周增加 1px 黑线外框。
  3. 版本号规范版本行改为「版本号 + 8 位构建日期」形式(如「版本: 0.5.2 (20261006)」),不再显示旧的「2.0.0-golang」字样。
  4. 面板外点击不再关闭对话框打开时点击面板之外的区域不再将它关闭,且面板外的画面照常响应鼠标;关闭请用 F1 或 Enter。

2026-10-06 · 插件 0.5.22:编辑器内光标文件预览

  1. 光标文件预览VS Code / Qoder 扩展 0.5.22 新增 .cur 光标文件预览:打开文件即解码并放大显示光标图形(默认 8 倍),右下角实时标注热点坐标,十字线与外框辅助对齐观察。
  2. 预览工具工具条支持缩放(1:1 / ×2 / ÷2 / 适配窗口)、背景切换(棋盘格 / 白 / 黑 / 灰 / 深蓝)与十字线开关;多条目光标文件可用方向键切换显示。

2026-10-06 · 学习手册新增「快捷键」章节

  1. 快捷键章节脚本参考手册新增独立的「快捷键」章节,与 FCC 语法、辅助工具、系统开发、扩展动态库并列:收录 Esc、F1、F2、F3、F5、F7、· 键调试拾取、Ctrl 拾取、右下角版权热区等全部内置快捷键的用途与行为细节。
  2. 脚本热键注册同章节整理脚本自定义热键的注册方法:RegHotKeyDown / Up 等 7 个接口的用法、可用键名全表与 ctrl_ / shift_ 组合键前缀规则。
  3. 手册首页入口学习手册首页新增「快捷键」入口卡片,一键直达新章节。

2026-10-05 · 脚本声明修复与示例修正

  1. 一行声明多个变量int a,b,c; 现在全部正确创建(此前只有第一个名字生效,其余被静默跳过)。
  2. 后缀自增自减真正生效i++ / i-- 不再被静默忽略,依赖计数递增的循环可以正常结束,不再死循环。
  3. 未初始化变量不再跳过构造声明后未赋初值的变量(如 int vol;)参与创建对象时构造函数正常执行、成员正常赋值,不再出现“对象像没创建一样”的情况。
  4. 类内方法互相调用更稳修复脚本中调用同类方法偶发报 “function not found” 的问题(扫雷示例点击空格后自动连锁翻开即受此影响)。
  5. 文字直接写数字正确显示文字对象的 src 直接赋数字(src=数量)现在正确显示为数字文本,不再空白。
  6. 默认文字色调整文字默认颜色调整为奶油色,在浅色背景上清晰可读(此前默认白色在浅青等浅色底上几乎不可见)。
  7. 扫雷示例修正格子数字改为在文字对象自身的方法里设置,数字正确居中显示,不再贴在格子左上角。

2026-10-05 · 宏系统与脚本扩展补全

  1. 宏系统补全补齐 #push/#pop 宏压栈出栈与 #system 系统指令;条件宏 #ifdef/#if 的边界行为与原引擎对齐,写错的宏指令会报出具体位置并继续执行后续脚本;几十层以上的条件宏嵌套不再导致引擎异常退出。
  2. 系统默认宏补齐全部系统默认宏(__FILE__、__PATH__、$、_MAIN、_OBJVER、_CHARSET、_LOC 等),在主文件与被包含文件中按规则自动展开。
  3. #import 引入外部扩展库支持 #import 的 system / userdll / perload 三种形态;引入后可直接以 new 创建 dll_ 开头的扩展类对象,PerUserDll 可按需预载扩展库。

2026-10-04 · 脚本函数大批量补全

  1. 真实点击事件 OnClick修复左键弹起不触发 OnClick 的问题;并补齐原引擎的按键捕获语义——按下时消息若被别的对象消费,弹起仍会送达按下时所在的对象。
  2. 鼠标钩子与滚轮事件hookmouse=1 现在真正生效:OnLBDownHook / OnLBUpHook / OnRBDownHook / OnRBUpHook 及对应 HookEnd 事件会先于普通消息送达,设 0 取消;补齐 OnMouseWheel 滚轮事件。
  3. wnd 函数与属性补全补齐 posex("x,y" 坐标串定位)、pcaller(方法调用者对象)、IsUserFunc、IsMouseOver、Exec(延迟执行,flag=1 时销毁本对象再运行脚本)。
  4. 绘制函数补全补齐 Line / MixLine / FlashLine / LightLine / AlphaLine / Bar / Circle / CircleLight / Sphere 等绘图函数与视区、原点控制共 15 项,绘制目标为 MakeImg / AddFrame 期间正在制作的图像表面。
  5. 异形窗口新增 SetWinMaskFun 与 8 个区域函数(椭圆、圆角矩形、矩形、多边形、图像掩模的加减组合),窗口可按回调中组合出的任意形状显示。
  6. 声音与命令通道新增 PlaySndPos 按屏幕位置自动平衡音量与左右声道播放;新增 SendCommand / GetWndHandle 命令通道与窗口句柄查询;pdesktop.updatedelay 现在真正生效(最小 10 毫秒)。
  7. 系统函数补全补齐 ShellExecute / PostWindowMessage / SimWndEvent / ShowDutyBar / GetHostPath / BinCreateFrom,昵称禁用词三件(DisableNickStr / LoadNickDisableTxt / SaveNickDisableTxt),下载器三件(DefLocMaping / CtrlFilesDir / RegDownLoadProgress)。
  8. 脚本报错更友好语法错误精确定位到行、列;宏指令错误带位置报告后继续执行;写错的语句只吞到行尾,不再连带跳过下一行正确代码;修复若干表达式报错与原引擎不一致的问题。

2026-10-04 · 窗口事件与激活状态

  1. 窗口激活状态实时查询pdesktop.active 读取时实时反映窗口是否处于激活状态:窗口在前台读 1,最小化或切到后台读 0(此前读取恒为 0);赋非零值激活本窗口,赋 0 不做任何操作,与原引擎语义一致。
  2. desktop 窗口事件补全新增 OnActive(窗口获得/失去焦点)、OnCommand(宿主命令消息)、OnUserMessage(用户自定义消息)、OnMiscWM(其他未处理窗口消息)四个事件,desktop 五类窗口事件全部可用。

2026-10-03 · 图标、字体与系统函数补全

  1. 窗口图标与系统托盘pdesktop.SetIcon 设置窗口标题栏/任务栏图标(支持 res: 内置资源与本地图片文件);pdesktop.SetTaskIcon 添加/修改/删除系统托盘图标并可带悬浮提示文字,托盘上的鼠标点击经 OnTaskLBDown / OnTaskLBUp / OnTaskRBDown / OnTaskRBUp / OnTaskDBClick 五个事件回调到脚本。
  2. 进程启动函数补齐 Shell / ShellMin(以普通/最小化方式重启宿主实例)、ShellOpen(用系统默认浏览器打开网址)、RunExe(启动外部程序)。
  3. 字体名真实生效font=名称,宽,高,粗细 中的字体名现在按系统已安装字体解析(如 隶书、Webdings),符号字体自动按符号编码映射;此前名称被静默忽略、一律用默认字体。
  4. 悬浮提示鼠标悬停在带 tooltips 文字的对象上时,自动触发 ToolTipsObj 的 OnShowTips / OnHide 事件,提示内容随悬浮对象自动切换。
  5. 背景图片平铺三模式补齐 himgtile 横向平铺、vimgtile 纵向平铺、imgscale 按原始尺寸贴图三个背景图片模式。
  6. OnEdit 事件修复修复编辑框 OnEdit 事件永不触发的问题,编辑回调现在正常进入脚本。

2026-10-03 · 系统控件修复批次

  1. SysBtn 按钮文字不显示修复 new SysBtn(...) 大尺寸按钮背景、边框正常但文字不显示的问题:按钮内部的尺寸变量被其他控件实例污染,文字被画到按钮表面之外;现已隔离修复,文字正常显示。
  2. SysBtn 字号与居中按钮文字字号固定为与 CmdBtn 一致,不再随按钮尺寸缩放(此前 160×20 的按钮会显示 19px 大字);文字改为水平、垂直双向居中,此前固定绘制在左上角。
  3. SysDlg 标题垂直居中对话框标题文字按对话框最终尺寸精确垂直居中,此前整体偏上 8px。
  4. _T 文字悬停异常修复鼠标划过 _T 文字时文字被加亮加粗的问题,悬停不再误触发其他控件的高亮样式。
  5. SysDlg 悬停背景消失修复鼠标划过 SysDlg 对话框时背景纹理消失、移开后不再恢复的问题,控件间的事件处理不再相互串扰。

2026-10-02 · 拾取操作面板与系统补全

  1. 拾取操作面板调试拾取模式新增画面内操作面板:选父、删除、显示/隐藏、子对象列表、对象树五个按钮,选中对象后可直接在运行画面上查看与操作。
  2. 面板自动退避按住 Ctrl 拾取时手势滑入面板区域,面板自动退避到左上角,不阻挡对右上角对象的拾取;松开 Ctrl 后面板留在原地,拾取位置离开默认区域时自动回位。
  3. 拾取信息自动刷新选中对象的信息每 500ms 自动刷新;脚本删除已选对象后描边与面板信息自动清除,不残留。
  4. 脚本报错可见化脚本运行错误以单行帧输出到插件运行时面板,包含文件、行、列与错误信息;此前被静默吞掉的错误现在可见,重复错误自动去重防刷屏。
  5. 绘制内建补全补齐 Clear / PutPixel / Rectangle / DrawObj 四个绘制内建函数,SysBtn 标题栏小按钮的自绘管线打通,按钮可以正常画出。
  6. 系统函数补全补齐 CenterWindow(对话框屏幕居中)、ptxt.anti 属性与 m_pSysPtText 机制,系统脚本启动不再报「函数/属性未找到」。

2026-10-02 · 对象调试拾取(新功能)

  1. · 键对象调试按 · 键开启/关闭对象调试模式;开启后按住 Ctrl 悬停对象,引擎以白框黑边描出选中对象,插件 RT 面板实时显示其类名、pid、位置、尺寸、显示状态等信息,悬停空白处显示 desktop 本身。
  2. 切换状态提示按 · 切换时 RT 面板显示「· 对象调试已开启 / 已关闭」,关闭时自动擦除描边并清空信息区。
  3. 中文输入法 · 键修复修复中文输入法下按 · 键无法切换调试模式的问题:输入法对 ANSI 窗口经 WM_IME_CHAR 以 GBK 内码提交字符,此前只处理了 WM_CHAR 通道;现在两条通道都会映射为切换键,并去重防双发。
  4. 插件 0.5.21RT 面板新增拾取信息区块与模式提示,trace 列表与拾取信息分区显示。

2026-10-01 · 功能键与 About 对话框

  1. F1 About 对话框F1 呼出关于对话框(此前按了无反应),再按 F1 或 Esc/Enter 关闭;支持 pdesktop.SetAbout / SetAboutImg 自定义文字与图片;caption 模式右下角热区也可呼出。
  2. F2 诊断面板补齐帧率、光标、显示/更新时间、错误数、对象数、方法数、绘制命令数、内存等信息面板;统一 12px 字号竖排「名称:值」,修复前几行文字错位重叠。
  3. F3 显示冻结F3 冻结/恢复画面:冻结时画面停在最后一帧,对象更新照常进行,鼠标消息暂停派发。
  4. F5 重启F5 或脚本 pdesktop.ReStart() 触发进程内重载:销毁全部对象并于下一帧重跑启动脚本,修复此前「按了没重启」的问题。
  5. F7 截图截图格式由 JPEG 改为 PNG,保存到启动脚本目录的 screenshots/ 文件夹;水印改为 FcBox 半透明文字,去掉背景圆角矩形。
  6. 其他修复补齐 pdesktop.SetWindowText() 函数(此前脚本调用静默失败);About 对话框横线左右留白对称。

2026-09-30 · 启动器与运行时修复批次

  1. CmdBtn 系统按钮修复补齐按钮依赖的 10 个绘制内建函数与 frame 三态贴图参数,脚本类成员变量改为每实例独立,new CmdBtn(...) 可正常绘制并响应点击。
  2. 按钮圆角四角透明修复 CmdBtn 圆角处被渐变方块填充的缺陷,圆弧外的区域恢复透明。
  3. 按钮文字垂直居中文本绘制基线对齐 Windows GDI 语义,修复按钮文字整体偏低、不居中的问题。
  4. launcher 窗口行为修复 caption=1 时窗口内容不显示;修复 fixed 属性双向缺陷:fixed=0 恢复可调尺寸,fixed=1 不再丢失边框。
  5. 背景绘制修复roundbar 支持真圆角与可选描边,underline 下划线位置归位,roundhalf 半圆配色修正。
  6. 颜色解析修复RGB() 返回类型与 11 处颜色参数站点重打包,btnup/btndown/dotcolor 颜色不再串色,bk:=color(RGB(..)) 正常绘制。
  7. 热键触发修复增加虚拟键码与键名翻译,脚本按名字注册的热键在 launcher 中可以正常触发。
  8. pdesktop.fps帧率属性统一为小写 fps,旧的大写写法 FPS 仍兼容。

2026-09-19 · 运行时 0.1.0

  1. round4_3 圆角矩形背景bk:=round4_3 按半径绘制圆角矩形:填充色 2/3 强度源覆盖、可选描边、内缩/外扩边距均正常;修复负内缩整体不显示与正内缩四角通透斜线(圆弧描边 alpha 溢出)两个缺陷,已经用户验收。
  2. imgtile 图像平铺bk:=imgtile 按帧尺寸在对象矩形内平铺,9 帧自动九宫格贴图;方法与对象透明度相乘,支持 BMP/PNG/GIF,加载失败用背景色兜底;图片背景已在 Windows 原生 CPU 启动器验证,GPU 图片背景尚未验收,himgtile/vimgtile/imgscale 仍为占位。
  3. _T 文本居中与动画恢复半透明加亮、向上飘出和淡出删除;以整段文本居中,中文缺字时回退到 TTF 字体。
  4. 窗口缩放与运行版本绘制前同步客户区尺寸与布局,缩放不再重建或叠加 _T,已有动画保持进度;launcher 与 objsys 统一使用 0.1.0 三段式版本号并输出启动日志。
  5. colorex 与 glowcolorex 正确使用对象透明度与 RGB 颜色;glow 修复颜色偏差并恢复持续闪烁,flashspeed 表示闪烁速度而非次数。
  6. ellipse 动态尾迹将“椭圆环绕”统一命名为 ellipse,恢复两段对称的渐隐尾迹;支持负边距向外扩展,并遵守父容器裁剪。
  7. rect 双颜色边框上边和左边使用第一色,下边和右边使用第二色;修复 RGB 转换、默认第二色及边距绘制。
  8. dlg 图片背景支持 res$dlgbk.gif 与 res$defbk.gif 内置资源、9/10 图块平铺和顶部居中装饰;方法与对象透明度相乘,透明区域、裁剪及缩放后显示正确,并释放不再使用的纹理。