diablo2-web/src/server/README.md

4.8 KiB
Raw Blame History

src/server — 1.13c 权威游戏模拟引擎 (D2Game.dll)

src/server 是 Diablo II: Lord of Destruction (v1.13c) 的确定性服务端权威逻辑实现,1:1 复刻原版 D2Game.dll 的 25fps (40ms/tick) 帧循环、战斗管线、221 个技能、怪物 AI、掉落表(TreasureClass)与存档系统。

1. 模块职责与架构边界

  • 对应原版 DLL:D2Game.dll。
  • TypeScript 工程约束(tsconfig.server.json):
    • lib: ["ES2022", "WebWorker"], types: [] —— 严禁使用任何浏览器 DOM API 或 Node.js API。
    • 纯确定性模拟(Deterministic Simulation):模块内严禁调用 Math.random、Date.now 或 performance.now;所有随机性必须由种子的 D2Rng 驱动,所有时间推进必须由 25fps 离散帧号(tickCount)驱动。
    • 仅允许依赖 src/common 与 src/netproto(门面入口),严禁导入 src/client 或 src/baker。

2. 目录结构

src/server/
├── engine/          # 25fps 核心模拟引擎 (GameEngine, combat-pipeline, missile-engine, aura-scanner, summon-manager, stat-list)
├── ai/              # 怪物 AI 决策树、仇恨/索敌、视野碰撞与动态房间流式加载 (room-streamer)
├── skills/          # 七大职业共 221 个技能与通用技能服务端执行器 (Amazon, Sorceress, Necromancer, Paladin, Barbarian, Druid, Assassin)
├── items/           # 1.13c 掉落管线 (TC NoDrop/Quality/Affix)、符文之语、宝石镶嵌、赫拉迪克方块合成与 NPC 商店服务
├── world/           # 场景交互物体 (神殿/宝箱/传送门/小站)、任务状态机 (Quests)、NPC 对话与治疗/赌博交易
├── save/            # 原版 1.13c .d2s 二进制角色存档读写器 (Checksum, Attributes, Skills, QuestData, Waypoints, ItemList)
├── scene/           # 服务端关卡实例生命周期与跨幕切换管理
└── adapter/         # LocalLoopbackAdapter:将 GameEngine 封装为标准 GameServerAdapter 契约接口

3. 核心子系统详解

3.1 25fps 核心引擎与战斗管线 (engine/)

  • GameEngine (engine/game-engine.ts):维护权威世界状态,按 40ms 固定步长推进:
    1. 玩家输入指令队列消费(移动、普通攻击、技能施放、拾取/穿戴/药水、NPC 交互)。
    2. 状态持续时间衰减(中毒、冰冻、诅咒、战吼、神殿 Buff)与生命/法力自然回复。
    3. 光环扫描器 (aura-scanner.ts) 周期性范围索敌与属性挂载。
    4. 投射物引擎 (missile-engine.ts) 步进碰撞检测与子投射物分裂。
    5. 怪物与召唤物 (summon-manager.ts) AI 决策与动作帧推进。
    6. 状态总线 (state-bus.ts) 收集本帧脏状态并生成增量事件。
  • 战斗伤害管线 (combat-pipeline.ts):严格遵循 1.13c 命中率公式(AR vs DR + 等级差修正)、盾牌格挡判定、物理/魔法/元素(火/电/冰/毒)六系伤害结算、抗性穿透/上限、碾压性打击 (Crushing Blow)、致命一击 (Deadly Strike / Critical Strike) 与撕开伤口 (Open Wounds)。

3.2 全职业技能系统 (skills/)

  • skill-table.ts & 各职业模块:基于 Skills.txt 的 srvdofunc / srvstfunc 分发机制,完整实现亚马逊、法师、死灵法师、圣骑士、野蛮人、德鲁伊、刺客七大职业共 221 个技能(含协同加成公式、施法延迟 Cooldown、法力消耗、多段投射物生成与尸体交互)。

3.3 怪物 AI 与房间流式激活 (ai/)

  • monster-ai.ts:基于 MonStats.txt 的 AI 参数(aidel, aip1..aip8)驱动沉沦魔复活、巫师远程风筝、冥河娃娃自爆、精英怪暗金词缀(闪电强化、特别快速、狂热灵气、免疫计算)及 Act Boss 专属 AI。
  • room-streamer.ts:围绕玩家所在子格坐标按九宫格动态激活/休眠 DRLG 房间并按 MonDen 与 SuperUniques.txt 刷怪。

3.4 1.13c 物品掉落与存档系统 (items/, save/)

  • 掉落管线 (items/drop-pipeline.ts):完整复刻 TreasureClassEx.txt 递归寻路、多人难度 NoDrop 指数衰减、MF (Magic Find) 边际递减有效值转换(Unique / Set / Rare / Magic 四级判定)以及 MagicPrefix.txt / MagicSuffix.txt 词缀池权重抽样。
  • .d2s 存档兼容 (save/d2s-reader.ts, save/d2s-writer.ts):支持直接导入或导出与原版 Diablo II v1.13c 二进制逐字节兼容的 .d2s 角色存档(含 0xAA55AA55 文件头、循环移位累加校验和、gf 属性比特流、if 技能表与 JM 物品列表)。

4. 常用验证命令

# 单独对 src/server 进行类型检查(验证零 DOM / 零 Node 依赖)
npx tsc -p tsconfig.server.json --noEmit

# 运行服务端战斗、技能、掉落与存档单元测试
npx vitest run tests/server/ tests/skills/ tests/items/