我们希望把已有的三维模型放进能自选阵容、按原版 H3 规则操作的战场。H3 Battle Lab 继续负责实时显示;战斗已经交给编译后的 VCMI,TypeScript 只保留界面、渲染和事件播放。

VCMI 接入进展(2026-10-03)

此前在 TypeScript 中逐步补了回合、反击、远程和兵种特性。完整对战还涉及英雄、技能、魔法、士气、幸运、双格占位和攻城,继续维护一套前端规则需要不断与引擎核对。我们决定直接封装 VCMI。界面发送移动、攻击或施法的意图,读取引擎给出的合法选项与结果,再播放三维动画。自定义兵种保留统一的配置格式,后续转换为 VCMI 的兵种、bonus 或脚本配置;新机制也在引擎侧实现。

先用 C++ 校验战场坐标,发现原来的奇偶行偏移与 VCMI 不一致。修正后,187 个格子的可用性、165 个可用格的邻接关系,以及全部 34,969 对格子距离均与原生结果一致。两侧各一列保留给英雄,兵种不能占用。这个检查只证明坐标对应,没有证明完整战斗规则一致。代码见坐标校验与迁移方向提交。

随后建立了独立的资源目录。原生核心只读取明确列出的原版 LOD、引擎配置、脚本和必需文件,启用的模块严格限定为 core 与 vcmi。本机的美术包、规则模组和用户设置没有进入测试。独立初始化成功读出了城堡、墓园全部 28 种兵种的数据,包括升级单位;这还没有把 28 种模型接进浏览器。

服务端战斗处理器也已经实际执行了一次对战操作:20 名神射手对 20 名行尸双射,种子固定为 1337。两击伤害分别为 55、54,弹药从 24 降到 22;行尸从 300 HP 降到 191 HP,剩余 13 只,随后获得行动权。伤害、弹药和行动顺序都由 VCMI 计算。我们记录每条引擎消息的前后状态,检查伤亡与生命变化是否一致;独立重跑得到相同结果。测试用内存中的 SoD 场景建立真实游戏状态,没有启动图形客户端。代码和复现命令见独立资源与服务端战斗测试提交。

现在浏览器已连接通用原生接口。双方各可配置最多七队,选择城堡、墓园全部 28 种原版兵种及数量;阵型、双格占位、合法移动和攻击位置、行动队列、伤害、生命、兵力与弹药都由 VCMI 返回。旧的 battle.ts 和前端基础战斗数值表已移除。Three.js 按引擎消息播放移动、攻击和反击,在命中时更新显示的伤亡,不再计算结果。代码见浏览器接入提交。

测试还发现,承载军队的内存地图默认是草地,而战场指定为沙地,导致城堡队伍继承了原生地形加成。现在两处都设为沙地;逐一检查 28 种兵种的战斗速度,均与引擎基础值相同。这项修正只作用于本地复制的测试场景,没有改动原 VCMI 文件,见地形修正提交。上面的 55、54 点伤害是先前独立测试版本的记录。

本轮六项原生集成测试覆盖全部兵种、双格部署、移动、等待、防御、双射、近战反击与追加攻击、过期及非法请求、胜负收尾和重新创建战斗。七项浏览器测试也通过:包括故意不加载美术的真实引擎双射、命中时机、最终显示与原生返回状态一致、防御与重置、七格阵容、完整城镇产量预设及画布切换,以及本地 GLB 的骨骼变化。公开仓库没有游戏资源,因此 CI 检查界面和缺少美术时的运行;真实战斗测试需要本地准备的引擎和资源目录。

双方阵容现在各有七个可点击的队伍格。空格可直接填入兵种和数量,删除后保留空位;进入战斗和重置时也保留格编号。图中蓝方只使用第 1、7 格,原生状态仍返回这两个编号。全局与兵种特写共用同一画布矩形,切回全局恢复所选背景,窗口缩放后也不会换到另一块画布。代码见七格阵容与画布修正提交。

「十周城镇产出」按钮一次配置双方十四队,默认选择升级兵种,也能取消勾选改为未升级单位。完整城镇包括城堡和本城增产建筑,不含圣杯、野外巢穴、英雄/宝物及随机周奖励。引擎通过 CGTownInstance::getGrowthInfo 计算每级周产量,再返回十周数量;界面直接读取,不另写产量公式。按 1~7 级,城堡为 280、180、170、80、60、40、20,墓园为 300、160、140、80、60、40、20。预设后仍可逐格修改,开始战斗后锁定配置,重置保留阵容。原生和浏览器测试均验证了十四队的创建与重置,见十周完整城镇预设提交。

现在也能把蓝方、红方分别交给 VCMI 战斗 AI,或点击「VCMI AI 行动一次」逐步观察。原生桥接直接调用编译出的 BattleEvaluator::selectStackAction,用两轮模拟选择当前兵种的行动,再交回同一个服务端战斗处理器执行。TypeScript 负责发请求和播放结果。原生测试验证了 AI 射击并结束战斗,浏览器测试验证了单步和双方自动行动。当前是兵种行动接口,尚未接英雄施法、逃跑和投降决策。(2026-10-03 更新:已接入同一个编译后 AI 的英雄施法选择;逃跑和投降仍待接入。)

鼠标悬停在场上模型或七格队伍栏,会显示攻防、伤害、速度、生命、数量与弹药。开战前读取引擎兵种定义(2026-10-03 更新:开战前读取原生部署预览,包含地形与英雄加成),战斗中读取当前单位状态;防御后卡片会显示引擎返回的防御值。阵容预览也改为向引擎请求部署,十四队预设在开战前后保持相同格子,六角网格默认开启并提高了可见度。见VCMI AI、悬停属性与部署修正提交。

七格队伍栏与真实原生战斗状态;实际浏览器截图,模型和场景均为程序生成的替身

每个浏览器会话有自己的原生进程和可写目录,只共享准备好的游戏数据。没有配置引擎时仍能查看模型、编辑阵容,对战按钮不可用。目前接口随本地 Vite 开发服务器运行,静态站点和预览服务器不提供引擎。已有模型继续按需加载,缺少的使用几何替身;28 种可选兵种不代表全部美术已经接入。(2026-10-03 更新:本地城堡与墓园 28 种模型现已全部接入,逐种通过实际浏览器加载与骨骼动画变化检查;升级兵种的十周十四队预设也全部加载了模型。公开仓库仍用程序生成的替身。)

模型导出还修复了动作间更换骨架的情况,例如吸血鬼变为蝙蝠,以及骑兵死亡时使用不同场景根节点。不同场景保留各自的模型、骨架和变换,由动画切换可见形态;计算模型尺寸时跳过未启用的零缩放场景,避免 Three.js 得到无效的骨架包围盒。现有 Blender 源文件没有覆盖。接入和动画检查不代表外观已经验收,见多骨架模型加载修复。

英雄和战斗魔法(2026-10-03)

双方可以分别启用自定义英雄,设置攻击、防御、法强、知识,选择最多八项原版次级技能及其等级,再指定已学魔法。英雄没有特长和战斗宝物。(2026-10-03 更新:自定义英雄仍没有特长;具名英雄保留原生特长,战斗装备已接入。)属性加成、技能效果、魔法等级、魔力上限和耗魔由 VCMI 处理,界面不计算这些规则。

战斗魔法菜单读取引擎给出的 60 种原版战斗魔法、当前耗魔、可施放状态和合法目标。选择魔法和目标后确认施放;单目标也能直接点击场上的单位或格子,传送等双目标魔法使用有顺序的目标列表。引擎限制每方英雄每回合施法一次,施法通常不结束当前兵种的行动。魔法免疫、群体效果、复活、召唤和催眠后的控制权也来自原生状态。召唤和镜像增加的单位会进入三维战场;没有对应美术的召唤物使用示意模型。

13 项原生集成测试和 11 项浏览器测试通过。本次原生验证包括魔法神箭伤害与耗魔、每回合施法限制、高级气系群体加速、双目标传送、镜像、水元素召唤、转世重生、聚灵奇术、催眠后的操作权和 AI 施法。浏览器实际操作了魔法书,并核对伤害、魔力和召唤物显示。列出 60 种魔法还不代表全部逐一验证过;当前没有攻城场景,地动山摇也不可用。代码见原生英雄、技能和施法接入提交。

模型现在后台加载,配置阵容、十周城镇预设和重置立即生效,加载期间先显示示意模型;失败也能保留所选兵种继续操作。骑兵初次加载测试曾耗时约 55 秒。多场景导出会重复携带几何数据和贴图,现在复用完全相同的二进制内容及贴图来源,保留各场景的骨骼与动作。骑兵 GLB 从约 178 MiB 降到 37 MiB,本次加载与动画测试约 5 秒。这次时间记录来自同一台本机浏览器,不能当作所有设备的性能保证。原始 Blender 场景未改动,先前导出包也保留了备份。代码见多场景资源去重提交。

VCMI 封装和适配代码放在本仓库,原 VCMI 源码保持原状。后续规则适配优先使用 mod/plugin;确实需要源码修改时,在本仓库保存可审阅的补丁和复现构建步骤。

原版英雄与特长(2026-10-03)

英雄配置现在列出城堡和墓园的 32 个原版英雄,名称、职业和特长说明读取原生定义。选择英雄与等级后,VCMI 根据经验表初始化并自动分配升级属性和技能,预览显示实际生成的结果;相同配置和种子开战时会重现这些结果。这里使用引擎的自动升级选择,没有模拟玩家在冒险地图中逐级挑选技能的过程。

勾选「自定义属性、技能与魔法」后,可以明确指定对战数值、技能及已学魔法,所选英雄仍保留原生特长;选择「自定义英雄」则使用没有特长的配置。英雄等级、属性、技能、魔力和施法结果都来自原生状态,前端不计算特长公式。

新增测试初始化了全部 32 个英雄,检查 20 级及接口允许的最高等级、预览与开战一致、非法配置失败后保留对战,以及双方使用同一英雄类型。战斗测试将特长英雄与相同属性、技能的无特长英雄比较:瓦莱斯卡和格兰切尔的对应兵种获得原生攻防与速度加成,欧灵的箭术提高实际射击伤害,山德鲁的魔法伤害特长也生效。浏览器选择了 20 级格兰切尔,检查悬停属性、重置保留英雄,并通过自定义魔法书施放魔法神箭。

累计 27 项原生集成测试、15 项浏览器测试通过。这些例子还不能证明每项特长都与原版一致;理财、航海、战后招魂等冒险效果,以及战斗宝物和战争机器仍待接入。(2026-10-03 后续更新:装备与战争机器已接入,见下节。)代码见原版英雄、特长与原生升级提交。

装备、战争机器与显示修正(2026-10-03)

英雄装备面板读取原生宝物及其允许槽位。组合宝物的占位、卷轴授予的魔法、属性加成和装备后的魔力上限均由 VCMI 处理;界面分别显示基础属性和装备后的总属性,避免编辑时把加成重复算进去。可以保留具名英雄的初始装备,也可以明确移除它。

弩车、弹药车和急救帐篷使用原生额外位置,不占七个阵容格。弩车的两次射击、弹药车保留射手弹药、急救帐篷恢复受伤末只的生命都已实际执行。治疗目标由原生接口筛选,AI 的帐篷行动调用上游编译后的 CBattleAI::useHealingTent;普通兵种仍调用 BattleEvaluator。本轮累计 33 项原生集成测试、21 项浏览器测试通过。宝物目录里也有冒险用途的物品,目录可见不代表冒险效果已经实现;围城、战术阶段和完整原版一致性验证仍待完成。

骑兵与骑士的模型朝负 X 轴,原先播放移动按正 Z 轴对齐,因此出现侧移。现在统一模型前向,再按原生路径朝移动方向转身。人形兵种的缩放改用头部与足部骨架标记,不再把长枪或翅膀算进身体高度;实际截图核对了枪兵和弓箭手的身体比例。单双格底座来自 VCMI 的 footprint,双格模型放在两个格子的中点,行动仍使用引擎的前格。十字军更新了头盔与表面候选,几何传播到其他动作后重新导出;狮鹫更新了后续飞行、死亡场景。原文件和旧导出均保留,新 GLB 地址带内容哈希以刷新缓存。代码见装备、战争机器与显示修正提交。

新增 WASD 按当前镜头朝向沿地面移动视角,镜头位置和观察目标同时平移,兵种位置保持原生部署。编辑输入框时快捷键不触发,窗口失焦会清除按键状态。实际浏览器验证了移动、输入框焦点和失焦后停止。

检查 28 种导出后,发现骷髅兵、骷髅勇士、升级僵尸、黑骑士和恐怖骑士的程序颜色图没有被 glTF 保留,颜色渐变节点变成了无贴图的白色材质。新增本地烘焙工具,在每个动作的场景副本中按原节点计算颜色,用自发光烘焙排除光照影响。实际 Three.js 截图里恢复了黑钢、橡木和皮革颜色,五种模型的动画仍然正常。十字军另有源材质问题:混合着色器导出后留下浅色非金属盔甲,象牙白衣袍也缺少织物细节。已在导出副本里改为明确的钢甲材质,加入烘焙的织物法线,保留象牙白衣袍。副本中的高密度头盔做了简化,GLB 从约 252 MB 降到 85 MB。六种修正模型均通过实际 Three.js 加载和行走姿态变化检查,并包含五个动作。烘焙工具也改为检查当前启用的表面,避免处理未启用的旧节点,新增 3 项回归测试。原始 Blender 文件均保留。

烘焙丢失的材质颜色后,黑骑士的实际 Three.js 浏览器截图

修正钢甲与织物法线后,十字军的实际 Three.js 浏览器截图

素材版本与后续材质检查(2026-10-03)

用户继续指出狮鹫翅膀、十字军胸口偏白,祭司在 Three.js 里也不如 VCMI 的画面。之前能加载、能播放动画的检查没有覆盖这些外观问题。随后逐种检查了 28 种兵种的原始材质节点,并对照当前安装素材包的来源。

大天使已重新接入城堡素材包 0.27.41 的翅膀与动作来源。黑骑士、恐怖骑士、幽灵、阴魂、骨龙和幽灵龙更新到墓园 0.12.6 的对应场景;幽灵只替换更新的攻击场景,龙保留已交付的飞行动作。七种模型都通过实际浏览器加载、行走姿态变化与版本标记检查。其余兵种仍需逐项核对,不能把整个阵容都称为最新版。界面现在显示实际成功加载的素材版本,加载失败时显示程序示意模型。

狮鹫的贴图文件虽然存在,但源材质还把贴图与顶点颜色相乘,这段颜色图没有完整进入 glTF。重新按原图烘焙后,普通狮鹫的覆羽恢复棕金色,长羽恢复深灰色;皇家狮鹫也重新烘焙,保留源材质的银灰配色。弓箭手、枪兵、神射手、骑士和冠军另有程序颜色图,也已逐动作重导出。两种狮鹫和这五种兵分别通过浏览器加载与动画检查。

普通狮鹫修正前,翅膀颜色图丢失;实际浏览器截图

按源材质烘焙后的普通狮鹫;实际浏览器截图

祭司的 native632 身体与当前安装包里的身体相同,不能仅凭源文件名称判断它过时。这里发现的是发光遮罩丢失:源材质用强度节点限制面部发光,导出后衣袍贴图整体参与发光。烘焙工具现在同时计算发光颜色与强度,并用 glTF 发光强度保存超出普通颜色范围的亮度。重新导出后,实际浏览器画面里的衣袍恢复深蓝,发光集中在面部;六个动作仍然可用。这修正了材质导出,造型和整体观感还需要继续对照 VCMI。

修正发光遮罩后的祭司;实际 Three.js 浏览器截图

上节十字军的织物法线修正之后,用户仍指出胸口像白面。后续在保留的导出副本中加入 Poly Haven 扫描亚麻布的颜色、法线和粗糙度,衣料保持浅色,钢甲与五个动作保留。模型通过浏览器加载和行走检查,但当前近景里织物细节仍偏弱,褶皱和与 VCMI 的外观对照尚未完成。

加入扫描布料材质后的十字军;织物细节仍需调整

这轮代码通过 21 项浏览器回归测试、6 项材质图回归测试、6 项导出工具测试,构建通过。浏览器测试包含缺少素材、WASD、七队阵容、原生对战和冠军移动朝向。源代码见发光遮罩与素材版本提交;美术仍保存在本地,博客截图单独发布。测试通过不代表已完成外观验收。

兵力标签与移动范围(2026-10-03)

用户要求点击敌我兵种时显示移动范围,并指出数量标签盖住东西、六角网格偏淡。这轮把数量改为兵种底座附近的 Three.js 标签,限制屏幕尺寸,并启用深度测试。标签会随镜头移动,被前面的模型和障碍物遮挡;侧栏和队伍栏也不会被它覆盖。除了查看实际截图,还加了 WebGL 像素回归:在标签前放红色平面,读到的像素来自平面;关闭标签深度测试后又会读到标签颜色。

点击场上兵种或队伍格都会显示原生移动范围,蓝方用蓝色,红方用橙红色。部署预览和对战中都能查看,敌军无需等到自己的回合。VCMI 计算障碍、当前速度及两格占位,浏览器只把返回格子着色。原生测试确认减速魔法会缩小未行动敌军的范围,障碍和其他兵种的占位不会被当作落点。点击敌军先选择、查看范围,再点「攻击选中目标」执行当前行动兵种的合法射击或近战;移动仍需先选中当前行动兵种。

六角网格提高了浅色线的可见度,并加细暗边,沙地和雪地上的边界更清楚。用户最初反馈 D 键失效,后来确认是 Vimium 拦截了按键。另外复现了关闭的表单控件保留焦点时屏蔽 WASD 的情况,现已让战场点击接管焦点;真正编辑表单时仍不移动镜头。

选中敌军后显示原生移动范围;无素材模式的实际浏览器截图

后续还完成戟兵、剑士、僧侣、行尸、尸巫和尸巫王的行走场景重导出,使用 2026-10-02 已交付的步态来源。每个动作保留自己的场景和材质,不把新动作套进旧场景的层级。六种都通过了实际模型加载和行走姿态变化检查;这不代表外观已获验收。

剑士实际模型、蓝方移动范围与三维兵力标签

这轮 35 项原生集成测试通过;完整 23 项浏览器回归及新增的 1 项像素遮挡回归分别通过,生产构建通过。代码见战场焦点、三维标签和原生范围提交。原版规则的完整一致性、围城、初始战术部署和其余三维战场仍未完成。

三维场景试作(2026-10-03)

用户要求三维战场达到现有二维背景的写实程度。最初用简单山丘、圆锥树和几何岩石搭场景,被用户指出质量不足,已撤掉。随后向 Meshy 提交了岩坡、松林与岩石任务,并用 imagegen 做地表材质;模型可以加载,但实际战场截图里的枝叶很假,岩坡也有拼装和落地问题。这次生成没有达到要求。

当前草地试作换用 Poly Haven 松树、岩石和扫描地表,材质包含颜色、法线与粗糙度。地面、网格、兵种和景物在同一三维场景中,左键拖动旋转、右键平移、滚轮缩放。可战斗区域保持平面,外围地形起伏;场景模型不自行增加规则障碍。实际浏览器已验证场景加载和旋转,树冠密度、构图和光照还在调整。这仍是第一套草地试作,其他背景没有完成三维重建,也没有获得外观验收。美术文件继续只保存在本地。

大天使复活(2026-10-03)

「战斗魔法与兵种能力」现在区分英雄魔法和兵种能力。城堡与墓园的原版兵种中,大天使的复活需要主动选择目标;原生状态返回可用能力、剩余次数和当前可施放状态,目标查询也包含符合条件的阵亡队伍。可以在目标列表或画布上选择,确认后发送 VCMI 的 MONSTER_SPELL 行动。它消耗兵种行动和能力次数,不使用英雄魔力,也不占英雄每回合施法额度。

本次测试让一只大天使复活十名阵亡枪兵,原生状态恢复 10 只、100 HP,剩余次数从 1 降到 0。后续回合没有补回次数;敌方目标、亡灵目标、非施法兵种和再次使用均被拒绝,拒绝后状态不变。浏览器实际操作了能力菜单,显示复活后的队伍和原生战斗记录。累计 19 项原生集成测试、13 项浏览器测试通过。这个场景的结果不能替代全部兵种与魔法规则的验证,施法动画也还需要细化。代码见主动兵种能力接入提交。

地形与障碍物(2026-10-03)

「战斗场景」现在可以选择八种原版陆地地形、普通战场及特殊地形,并启用 VCMI 生成的初始障碍。部署预览和实际开战共用配置;悬停属性读取原生预览,已经包含地形和英雄加成。默认仍是沙地、无初始障碍。布局编号对应独立测试地图中的格子,VCMI 用它确定障碍布局;「换一个布局」切换编号,战斗随机种子单独保留。

新增原生测试检查了城堡兵在草地、墓园兵在泥地的攻防与速度加成,预览与开战的障碍和部署一致,双格单位寻路避开障碍,以及在障碍格上部署失败后保留原对战。没有学习气系魔法的英雄在魔法平原上能施放高级群体加速;诅咒之地允许魔法神箭、拒绝雷鸣爆弹。这些效果都由编译后的引擎处理,TypeScript 只发送配置与显示结果。

累计 23 项原生集成测试、14 项浏览器测试通过。浏览器验证了属性卡、换布局、开战锁定配置、重置保留布局,以及全局、特写和图片背景下的障碍显示。地面用程序配色,障碍暂时以石块标出原生占位;图片背景单独选择,不会改变战斗地形。船战、攻城、原版障碍建模和完整地形规则核对仍待完成。代码见原生地形与障碍配置提交。

自定义兵种接入(2026-10-03)

通用兵种 JSON 现在可以加入原生战斗。在侧栏「自定义兵种」导入文件后,新兵种出现在阵容选择器中;配置兵力即可上场。字段包括版本、唯一 ID、名称、显示分组、基础数值和机制列表。兵种数据与 GLB 用同一个作者 ID 关联;没有模型时使用示意模型。格式说明、Schema 和示例保留在公开仓库的格式文档。

VCMI 初始化结束后不允许再注册兵种 ID,因此导入流程会先验证整个包,转换为标准 battle-lab-custom mod,建立新的独立资源目录并启动候选引擎。初始化成功才切换当前会话,失败则保留原引擎。后续文件追加到当前页面的兵种包,重复 ID 会被拒绝;重置和重新连接保留已导入定义,重新加载页面回到原版参考模式。自定义模式在界面明确标出,原版兵种 ID 和数值不被覆盖。

当前八种机制映射到原生 bonus:飞行、追加攻击、恢复、反击次数、禁反击、射手、亡灵和死亡之云。追加攻击的近战/远程范围、死亡之云的范围和伤亡、恢复与反击额度都由编译后的 VCMI 执行。转换器只生成配置,TypeScript 也没有机制解释器。faction 暂时用于选择器分组,导入兵种在引擎中属于中立阵营;恢复时机遵循当前 VCMI 的每回合首次行动前处理。这些限制在格式文档中列出,新增行为仍需要对应的原生 bonus 或引擎脚本支持。

本轮 17 项原生集成测试和 12 项浏览器测试通过。新增原生测试检查自定义数值与飞行、近战追加攻击与禁反击、双射、死亡之云对活体友军的溅射及亡灵邻居免疫、恢复受伤末只,以及 0/2 次反击额度。浏览器实际完成了导入、上场、原生 AI 行动、重置、重复导入失败后保留会话、重新连接及再次开战;重新连接也保留英雄设置。转换器另有三个不依赖游戏资源的测试,检查整个包的校验、原版 ID 保护和资源目录隔离。代码见自定义兵种标准 mod 接入提交。

英雄、技能和施法入口、可配置地形与障碍、自定义兵种转换、完整特性验证和 WASM 仍未完成。当前使用固定沙地、无障碍、无参战英雄的场景。(2026-10-03 更新:自定义英雄、技能和施法入口已接入;具名英雄、特长、宝物、可配置地形与障碍、自定义兵种转换、完整规则验证和 WASM 仍待完成。场景仍是固定沙地,没有初始障碍;施法产生的障碍由引擎处理。(2026-10-03 后续更新:具名英雄、特长、可配置地形与初始障碍已接入,见上节。))通用兵种 JSON 可以在侧栏验证,但暂不能加入对战;(2026-10-03 更新:标准 mod 转换及原生对战导入已完成,见上节。)后续机制只在引擎或引擎脚本中实现。原生接口稳定后,再编译实现相同接口的 WASM。当前没有依赖 VCMI-Gym。资源目录严格排除本机规则模组,但 base-reference 仍不代表已经与原版 H3 完全一致,差异要逐项验证并在引擎侧修正。

本轮原生封装与校验代码由 Codex 编写;已有模型与动画继续复用,源文件没有覆盖。代码仓库保持只含代码,完整游戏资源、模型和贴图留在本地。下面保留上一版阵容编辑的图片与记录。

2026-10-03 原生测试阶段记录

目前这仍是单独的原生测试。浏览器还在运行迁移前的 TypeScript 演示,有 12 种基础规则定义;本地弓箭手导出已增加真实射击片段,神射手模型接入仍未完成。下一步是让原生接口接受自选双方阵容,并把逐击、移动、反击、回合和魔法消息接到 Three.js。原生接口跑稳后,再让 WASM 实现相同接口。VCMI-Gym 会作为参考,当前测试没有依赖它。原版 H3 与 VCMI 的差异仍需要逐项验证,并在引擎侧处理。

(2026-10-03 更新:通用阵容接口和浏览器事件接入已完成;英雄、施法、自定义包与 WASM 仍待实现。)

2026-09-21 阵容编辑记录

以下描述与截图对应当时版本,当前引擎接入状态以上面的记录为准。

我们想看看已有三维模型在实时战场里能表现到什么程度,于是开了独立的 H3 Battle Lab。它用 Three.js 显示模型、骨骼动画和实时阴影,可以拉近、旋转镜头,也可以复用之前高清化的战场背景。

自选阵容

本地目前接入六种:墓园的骷髅兵、僵尸、幽灵、阴魂,以及城堡的剑士、十字军。每种都带有待机、行走、攻击、受击和死亡片段。城堡两种仍是美术草稿,选择器里明确标了出来;接入查看器不代表外观已经验收。

左侧「配置双方阵容」选择兵种和蓝/红方,再添加上场,每方最多七队。也能替换或移除选中的单位。顶部菜单可以选择任意一方操作;重置保留本页配置的阵容和部署位置,恢复生命值。刷新页面则回到默认阵容。

六种兵种同场,复用高清草地背景;1800 × 1200 浏览器实际截图

高清背景模式支持 1~3 倍缩放,背景裁切和模型投影同步变化。背景还是一张平面图,没有真实山丘的视差和遮挡。「兵种特写」切换到可以自由观察的三维场景,树木和地面目前使用程序生成的占位环境。

剑士和十字军草稿的实时近景;浏览器实际截图,不是 Blender 离线渲染

模型与动画

Meshy 提供已有的模型和适用的骨架,Astra 编写动作、修模、导出和战场代码。这次复用了现有资产,没有新增 Meshy 生成请求。Blender 动作导出成 GLB,每个兵种把五个片段装进同一文件。相同兵种重复上场会复用下载结果,每个单位有自己的骨架和动画播放器。

模型按需载入,载入失败时保留原阵容。公开仓库只有代码;模型、贴图和完整资源包仍在本地。没有本地美术时,页面会明确提示几何示意模型。本文图片只是展示。

当时的边界

它目前是战场表现与交互原型:支持六角格寻路、八格移动和固定 25 点伤害的近战演示,尚未实现英雄无敌的完整战斗规则,也没有接到 VCMI 的战斗状态。(2026-10-03:移动、伤害与回合演示已更新;原生引擎已连接浏览器,TypeScript 战斗实现已移除,完整原版一致性仍待验证。)模型材质从 Blender 到实时渲染仍需校对,城堡兵种的造型与衣料问题继续在建模文章里维护。

本轮通过构建、三项逻辑测试和五项浏览器测试,覆盖缺少美术、模型载入、实际骨骼变化、阵容增删替换、容量限制、重置和加载失败。代码见阵容编辑提交。