[P1][CR-B7/B9] 超大函数与重复代码:按数据表的函数号分发、抽取公共实现 #527
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?
问题描述
核心模拟和渲染逻辑集中在少数几个上千行的函数里,靠一长串字面量
skillId === N分支来分发。另外,同一段逻辑有多份手写副本,而且各份的策略并不一致。这些函数没法单独测试,review 时也看不清一次改动的影响范围。#525 里的多条管线,大部分分支就堆在这些函数中。
证据
1. 超大函数
executeSkillCore113ccastSkillMissileEngine.ticktickProjectilesexecuteSUnitDmgGameEngine.tickrunScenerenderWorldLayers按字面量技能 id 分发的次数:
skills.ts:skillId === N共 197 处;registry.ts:skill.id === N共 117 处;skill-caster.ts:skillId === N共 83 处。2. 重复代码
d2map.ts1 份、rng.ts2 份、lockstep.ts5 份(例如 lockstep.ts:267、lockstep.ts:307)。combat.ts3 份:combat.ts:575、combat.ts:653、combat.ts:731;net-simulation.ts2 份:net-simulation.ts:55、net-simulation.ts:138。'Act 1 H2H A'。3.
any的根源在接口层WorldMapProvider.grid?: any:engine.ts:37。getEquippedItems?: () => (Item | PlacedItem | any)[]:engine.ts:219。equippedWeapon、equippedAmmo、waypointNetwork、openStash都是any:skill-caster.ts:65-70。src中约 620 处any,其中skill-caster.ts占 113 处。很多下游的as any都是因为接口这一层没有写类型。根因
srvstfunc/srvdofunc和 Missiles.txt 的pSrvDoFunc/pSrvHitFunc/pSrvDmgFunc把技能和投射物映射到少量服务端函数;这里却按技能 id 逐个写分支。修复指南
Param*和 calc 列,不在代码里按 id 特判。GameEngine.tick:按阶段拆成applyCommands/tickPlayer/tickMonsters/tickMissiles/resolveDeaths/tickPickups等方法,每个阶段都能单独测试。renderWorldLayers和runScene:runScene的做法见 #526(SceneController);renderWorldLayers按图层拆开,热路径的对象复用见 #531。src/game/hash.ts导出fnv1a32(bytes | string)和一个增量版的Fnv32类,替换 8 份手写实现;monsterInitSeed(seed, index)只保留一份;applySplashDamage(center, radius, damage, filter),命中和撞墙两处共用。grid、getEquippedItems、equippedWeapon、waypointNetwork等写出具体类型,再清理下游的as any。可以配合 #537 的no-explicit-any:先 warn,然后逐个目录收紧。验收标准
skills.ts、registry.ts、skill-caster.ts中按字面量技能 id 分发的分支减少到只剩确有必要的特例,每个特例都注明 1.13c 出处。engine.ts和skill-caster.ts的公开接口中没有any。npm run typecheck0 error;npx vitest run全部通过。相关
runScene→SceneController。no-explicit-any。