[Skill Parity] 火墙 (Fire Wall) 施法后地面火焰视觉效果完全缺失 (isBlocked 坐标索引错误导致生成 0 个火墙粒子 & 动画 SubLoop 缺失) #439
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题描述 (Bug Description)
法师在施展技能 火墙 (Fire Wall, 技能 ID 51) 时,角色正常播放施法动作与手部施法特效 (
fire_cast_2),法力值正常扣除,冷却时间(35 帧 / 1.4 秒)也正常进入倒计时,但在目标地面区域完全没有任何火墙的视觉效果和火焰实体生成。缺陷代码定位与根因分析 (Root Cause Analysis)
1. 致命缺陷:碰撞网格索引计算错误导致火墙全部被判定为“在障碍物内”,生成 0 个火墙 Patch
在
src/scene/act-scene.ts(第 1612-1623 行):cellOf(runtime.grid, x, y)计算出的是主瓦片坐标 (Tile/Cell Coordinates, 0..cellsX / 0..cellsY);runtime.grid.gridWidth是子瓦片网格宽度 (Sub-tile Width, 等于 cellsX * 5),runtime.grid.blocked是一维的子瓦片数组(总大小为(cellsX * 5) * (cellsY * 5));c.y * runtime.grid.gridWidth + c.x错误地将主瓦片坐标当成子瓦片坐标进行行偏移寻址,导致计算出的索引实际映射到了地图极左上角(前\\frac{1}{25}区域)的子瓦片!blocked !== 0);isBlocked对计算出的所有 15 个火墙 Patch 一律返回了true(被阻挡);calculateFireWallPatches将所有点全部跳过(continue),返回空数组patches = [];engine.projectiles.push实际上从未被执行,地面上没有产生任何一个firewall投射物实体,造成“火墙视觉效果完全没有”!2. 动画缺失 SubLoop 机制 (起火 0..11 帧,循环 12..36 帧)
在
src/scene/act-scene.ts(第 4328-4343 行):Missiles.txt(Row 69,firewall) 中:CelFile: groundFireBigAnimLen: 37,SubLoop: 1,SubStart: 12,SubStop: 36firewall与meteorfire拥有完全一致的动画生命周期:前 12 帧(0..11)为火焰从地底升腾窜出的升起动画;后续 25 帧(12..36)为火焰熊熊燃烧的持续循环。firewall走的是else分支的% frameCount(直接对 37 取模),一旦生成,火���会在燃烧过程中每隔 37 帧重新“熄灭并重新从小火花升起一次”,破坏了连贯的烈焰之墙视觉效果。3. 静态数据表定义与素材定义不一致
src/game/skills.ts第 1019-1039 行中,firewall的静态定义为celFile: 'FireWall', animLen: 15, id: 83;Missiles.txt中,火墙为Id: 69, CelFile: groundFireBig, AnimLen: 37,且在src/render/missiles-meta.ts中已正确定义了FIREWALL_META(celFile: 'groundFireBig', framesPerDirection: 37);getMissileTxtData('firewall')与FIREWALL_META之间存在字段不一致,需予以对齐统一。修复建议 (Proposed Fix)
在
src/scene/act-scene.ts中,将手写的错误索引替换为现成的标准化判定方法:groundFireBig/firewall的 SubLoop 动画:在
drawMissileProjectile中,将firewall与meteorfire一起纳入 37 帧(0..11 升起,12..36 循环)的标准火焰循环渲染管线中。将
skills.ts中firewall的id(修正为 69)、celFile(修正为groundFireBig)与animLen(修正为 37)对齐。