levy-street/world-of-claudecraft
GitHub: levy-street/world-of-claudecraft
一款可自建服务端的经典旧世魔兽风格微型 MMO 游戏,支持在线多人游玩和离线单人模式,共享同一套确定性模拟核心。
Stars: 770 | Forks: 211
# World of Claudecraft —— 一款 WoW 经典风格的 MMO

一款带有经典旧世 WoW 风味、你可以自己搭建并游玩的微型 MMO:
1. **在线游玩** —— 真正的客户端/服务端游戏,包含账号系统、Postgres
中的持久化角色,以及在世界中与你共存的其他玩家。
2. **离线游玩**,在你的浏览器中直接进入世界。
两者运行**相同的确定性模拟核心** (`src/sim/`),因此
离线世界的行为表现与权威多人服务端
为所有在线玩家运行的完全一致。
## 游戏截图

| | |
|:---:|:---:|
| 
*东溪镇篝火旁的黄昏* | 
*火把照明下幽暗地窟中的精英怪拉扯* | | 
*废墟礼拜堂中的亡魂* | 
*盗匪营地中的人数劣势之战* | | 
*稀有刷新怪灰颚在北境道路被击杀* | 
*在铁匠哈德伦处整装待发 —— 鼠标提示、背包、金币* |  ## 搭建服务端(一条命令) ``` cp .env.example .env # 编辑 .env 并设置一个长随机 POSTGRES_PASSWORD docker compose up -d --build # postgres + game server, fully built # 打开 http://localhost:8787 — 账户、角色、整个世界 ``` 对于**远程托管**:将 compose stack 部署在任何 VPS 上,在环境中设置真实的 `POSTGRES_PASSWORD`,并通过 TLS 反向代理(使用 Caddy 只需两行配置 —— `your.domain { reverse_proxy localhost:8787 }`)代理 8787 端口;WebSockets 会自动代理,并且客户端 在 https 页面上会自动选择 `wss://`。认证端点基于 IP 进行速率限制; 密码使用 scrypt 哈希处理;token 7 天后过期。切勿在生产环境中设置 `ALLOW_DEV_COMMANDS=1`(它会启用测试机器人使用的等级/传送作弊功能)。 ## 在线开发(热重载) ``` npm install cp .env.example .env # 编辑 .env 并将 POSTGRES_PASSWORD 和 DATABASE_URL 设置为相同的密码 npm run db:up # postgres 16 in docker (port 5433, volume-persisted) npm run server # authoritative game server on :8787 (REST + WebSocket) npm run dev # client dev server on :5173 (proxies /api and /ws) ``` 打开 http://localhost:5173 → **Play Online** → 创建账号 → 创建 角色 → 进入世界。打开第二个浏览器/标签页并再次登录 —— 你们会 在镇上看到彼此。按 `Enter` 键打开聊天。 - **账号**:scrypt 哈希密码,7 天有效期的 bearer token (`auth_tokens`)。 - **角色**:每个账号最多 10 个;等级/装备/背包/任务/位置/金币 以 JSONB 格式持久化在 Postgres 中 —— 每 30 秒、登出时以及服务器 关闭时保存。名字全局唯一,仅限字母,经典风格。 - **服务端是权威的**:客户端以 20 Hz 的频率发送移动意图 + 指令; 服务端运行世界(一个共享的 `Sim`)并发送 基于兴趣范围的快照(约 120 码)以及按玩家路由的事件。所有 战斗计算、掉落判定、任务归属和商人交易都在 服务端进行;客户端只负责渲染。 - **小队**(最多 5 人):右键点击一名玩家 → *邀请组队*。左侧显示小队 框架,成员共享怪物的归属权(Tap 权)、击杀任务归属,并根据原版真实的组队奖励机制(3/4/5 人分别为 1.166/1.3/1.43 倍)均分经验 (XP)。使用 `/p 消息` 进行小队 聊天。小队成员在小地图上显示为蓝色光点。 - **交易**:右键点击一名玩家 → *交易*。双方暂存物品 + 金币, 双方都必须接受,并且交换是原子操作且经过服务端验证(任务物品 无法交易)。走开则取消交易。 - **决斗**:右键点击 → *决斗请求*。3 秒倒计时,战斗 直到一方血量降至 1 hp —— 没人会死,获胜者将在全区域广播。 跑离 60 码外视为放弃。 - **多人游戏规则**:经典的归属权(Tap)机制(第一个对怪物造成伤害的玩家拥有 其掉落/经验/任务归属 —— 其他人会收到“你没有权限拾取该物品。”), 当怪物的目标死亡时,它会重新锁定下一个攻击者(不会免费 重置),加入/离开公告,以及 `/say` 风格的聊天。 ## The Hollow Crypt —— 5 人精英副本 兄弟阿尔德里克的故事线在 *The Restless Dead* 之后继续:**Whispers Below**(在废墟礼拜堂找到 Gravecaller 的印记) → **The Binding Rite**(从狗头人挖掘地收集受祝福的油脂,从亡魂身上收集幽冥精华) → **Into the Hollow**(*建议玩家数:5*)—— 在礼拜堂下方的 地窟底部杀死 Morthen the Gravecaller。 - Fallen Chapel 的地窟大门会将你的**小队传送到其专属的 私人副本实例中**(6 个位置;副本在清空 5 分钟后重置)。 - 副本内部:火把照明的走廊,成对出现的**精英**垃圾怪(原版精英 缩放比例:约 2.3 倍血量,约 1.5 倍伤害,双倍经验),小头目 Sexton Marrow,以及 Morthen —— 一个 10 级精英首领,每 10 秒释放一次 **Shadow Pulse** AoE。副本内的垃圾怪在副本重置之前不会刷新。 - 奖励:根据各职业模型分配的稀有(蓝色)武器,1 枚金币,1500 点经验。 - 这确实是专为 5 人设计的:我们的自动化 5 机器人团队(战士、圣骑士、 牧师、法师、猎人,带有集火 + 治疗者 AI)可以在约 5 分钟内通关, 死亡约 10 次(`node scripts/crypt_raid.mjs`,需要 ALLOW_DEV_COMMANDS=1)。 ``` docker compose ps # eastbrook-db (postgres:16-alpine, healthcheck) node scripts/mp_integration.mjs # 26-check API/WS/persistence suite node scripts/mp_browser.mjs # two real browser clients see each other ``` ## The Sunken Bastion 与 Gravewyrm Sanctum 阴谋并未随着 Morthen 而结束。**The Sunken Bastion**(5 人, 约 13 级,位于 Mirefen 东南部)盘踞着 Vael the Mistcaller —— 他会在血量降至 60% 和 30% 时召唤一波又一波的 Drowned Thralls。终局之战是 **Gravewyrm Sanctum**(5 人,20 级,位于 Thornpeak 下方):包含三个房间的精英骨卫和龙人、 Korgath the Bound(血量低于 30% 时会激怒)、大死灵法师 Velkhar(会召唤更多的小怪波次),以及 **Korzul the Gravewyrm** —— 这里会掉落史诗 武器,而且前置任务链可以单刷完成,因此没人会被 故事线拒之门外。 ## 离线游玩 ``` npm run dev # open http://localhost:5173 -> Play Offline ``` 命名你的角色,选择九大职业中的任意一个,你就会进入 **Eastbrook Vale**(1-7 级):一个市场小镇,周围环绕着六个枢纽 —— 北边有狼群出没,东边是野猪草地, 西边是 Webwood,西北方是 Mirror Lake,西南方是狗头人的铜矿挖掘场, 东北方是有亡魂游荡的废墟礼拜堂,东南方则是 Gorrak 的盗匪 营地。向北的道路穿过山间隘口爬升,进入 **Mirefen Marsh**(6-13 级,枢纽:Fenbridge),并一路向上通往 **Thornpeak Heights**(13-20 级, 枢纽:Highwatch)—— 三个区域,约 60 个任务,以及一条故事线:Gravecaller 阴谋,从东溪镇外最初的不安骨骸,一直到山峰下方 **Korzul the Gravewyrm**。每个枢纽都有商人(包括出售实打实的白字装备的武器锻造师和护甲锻造师)、 墓地、专属背景音乐以及一张区域地图。 ### 操作(经典布局) | 输入 | 动作 | |---|---| | `W`/`S` | 奔跑 / 后退 —— `A`/`D` 转向(按住鼠标右键时为侧移),`Q`/`E` 侧移 | | 鼠标右键拖拽 / 左键拖拽 | 视角旋转 / 环绕视角 · 滚轮缩放 · `Space` 跳跃 | | `Tab` | 循环切换最近的敌人 · 左键点击选定目标 · 右键点击攻击/拾取/交谈 | | `1`–`9`, `0`, `-`, `=` | 动作条 | | `F` | 交互(拾取尸体 / 拾取物体 / 交谈) | | `C` `P` `L` `M` `B` | 角色面板 · 法术书 · 任务日志 · 世界地图 · 背包 | | `V` / `R` / `Esc` | 姓名牌 · 自动奔跑 · 关闭窗口 / 清除目标 | ### 经典还原度核对清单 **公式(原版真实公式)** - 怒气转换公式 `c = 0.0091L² + 3.23L + 4.27`;造成伤害时获得 `7.5·d/c`,受到伤害时获得 `2.5·d/c` - 带有 +3 等级断崖(96/95/94/83%)的法术命中表;基于等级的近战未命中/躲闪 - 护甲减伤公式 `armor/(armor + 85·AttackerLevel + 400)` - HP/法力值属性规则:前 20 点耐力 → 每点 1 HP,之后 → 每点 10 HP;前 20 点智力 → 每点 1 法力值,之后 → 每点 15 法力值 - 升至 20 级的经验值曲线为 400/900/1400/…;怪物经验 `45 + 5·L`,带有真实的零经验差灰名区间 - 1.5 秒的 GCD(潜行者为 1.0 秒),武器挥动计时器,5 秒法力值规则 **全部九个原版职业(学习原版的技能等级和阶数,1–20 级 —— 法术会随着你升级而获得更高阶:闪电箭 R2 在 8 级,R3 在 14 级,R4 在 20 级, 外加如斩杀、肾击、快速治疗、 风暴打击和星火术等新的高等级技能)** - *战士*:怒气,英雄打击(下一次挥击触发,不计入 GCD),战斗怒吼, 冲锋,断筋,雷霆一击, hamstring,血性狂暴,压制(躲闪触发) - *圣骑士*:正义圣印(武器附魔)通过**审判**释放, 圣光术,虔诚光环,力量祝福,神圣保护(吸收), 制裁之锤(眩晕),圣疗术 - *猎人*:**远程自动射击**(8–35 码,带有经典死区), 猛禽一击,雄鹰守护,毒蛇钉刺,奥术射击,震荡 射击,猫鼬撕咬(躲闪触发),摔绊 - *潜行者*:能量 + **连击点数**,邪恶攻击,刺骨,背刺 (需在目标身后 + 匕首),凿击,闪避,切割,疾跑 - *牧师*:惩击,次级治疗术,真言术:韧,暗言术:痛, **真言术:盾**(吸收),**恢复**(HoT),心灵震爆 - *萨满祭司*:闪电箭,**石化武器**(附魔),治疗波, 地震术,**闪电之盾**(荆棘伤害),烈焰震击 - *法师*:火球术,冰霜护甲,奥术智慧,寒冰箭,召唤水, 火焰冲击,奥术飞弹(引导),**变形术**,冰霜新星 - *术士*:暗影箭,恶魔之皮,献祭,腐蚀术,**生命分流**, 痛苦诅咒,**生命汲取**(引导式生命窃取) - *德鲁伊*:愤怒,治疗之触,野性印记,月火术,回春术, 荆棘术,纠缠根须,**熊形态**(10 级时可切换的变形) - 治术可以指定小队成员为目标(点击一个小队框架,然后进行治疗);增益魔法可以 施放给友方玩家;治疗可以暴击;吸收护盾在扣除生命值之前 吸收伤害。 **世界与系统** - 进食/饮水:坐下,在 18 秒内恢复,受到伤害或起身后中断 —— 是的,你可以同时进食和饮水 - 商人:购买食物/水,出售你的灰色物品;金币以金/银/铜 (g/s/c) 显示 - 地面任务物品带有闪光效果(夺回盗匪的补给箱) - 怪物 AI:游荡,根据等级差异产生近距离仇恨,连锁引怪(鱼人 拉怪距离更远 —— 叫上朋友一起),追击,脱战范围重置,尸体拾取, 刷新;稀有精英(Old Greyjaw)具有较长的刷新计时器 - 死亡 → 释放灵魂 → 墓地;坠落伤害;游泳会减慢你的速度 - 带有放弃功能的任务日志,包含问候语的闲聊对话,各职业专属奖励 **表现力** - 程序化生成一切:木框架房屋、瓦片屋顶、礼拜堂、市场 摊位、帐篷、闪烁着火光的篝火、矿洞入口、废墟石柱、 钓鱼码头、鱼人泥屋、绘制在地形上的道路、草丛、 松树 + 橡树、带有动态水面的湖泊、飘动的云彩、实时阴影 - 12 种绑定了骨骼的生物类别(狼/野猪/蜘蛛/鱼人/狗头人/骷髅/ 人形生物/巨魔/食人魔/元素/龙类/羊)带有行走/攻击/施法/坐下/ 死亡动画 - 为每个法术、物品和增益效果绘制的程序化图标 —— 在运行时使用 canvas 绘制, 无需任何资源文件 - 经典 UI:头像单位框架、带有持续时间的增益/减益效果条、 带有冷却扫描 + 距离/资源颜色显示的动作条、施法/引导条、 法术书、角色纸娃娃模型、任务日志、世界地图、商人 + 拾取窗口、 带有金色边框的鼠标提示、浮动战斗文本、战斗日志、分段式经验条、 带有点位标记的小地图和完整的区域地图 - 程序化的 WebAudio 音效:近战/法术打击音效、升级号角声、任务 提示音、金币掉落声、死亡音效 —— 没有音频文件 ## 开发说明 ``` npm test # vitest suite: formulas, combat, AI, quests, all 9 classes, # parties, duels, trades, elites, the crypt npm run build # production web build node scripts/smoke_browser.mjs # warrior E2E (needs `npm run dev` running) node scripts/smoke_mage.mjs # mage: casting, polymorph, conjure+drink, death/release node scripts/smoke_rogue.mjs # rogue: combo points, eviscerate, vendor, eating node scripts/visual_tour.mjs # screenshot tour of the zone + UI into tmp/ node scripts/mp_integration.mjs # 26-check API/WS/persistence suite (server running) node scripts/social_e2e.mjs # trade + duel over the wire (ALLOW_DEV_COMMANDS=1) node scripts/crypt_raid.mjs # five bots clear the Hollow Crypt (ALLOW_DEV_COMMANDS=1) ``` 项目布局: ``` src/sim/ deterministic N-player game core (no DOM imports) — shared by all targets src/render/ Three.js renderer: models.ts (rigs), props.ts, textures.ts (procedural) src/game/ input + camera + WebAudio synth src/ui/ classic HUD: frames, windows, tooltips, map, FCT src/net/ online client: REST auth + WebSocket world mirror (ClientWorld) src/world_api.ts the IWorld interface both Sim and ClientWorld satisfy server/ game server: main.ts (HTTP+WS), game.ts (world loop), db.ts, auth.ts docker-compose.yml postgres:16-alpine tests/ vitest suite scripts/ browser E2E + screenshot tour + multiplayer integration tests ``` 名称、任务和区域均为原创;公式和机制遵循 原版设计。世界种子固定在 `src/main.ts` 中,因此每次访问的 都是同一个世界。 ## License 代码基于 [MIT 许可协议](LICENSE) —— 尽情 fork 它,混搭它,搭建你自己的世界。 内置的第三方美术资源(模型、纹理、HDRI)保留其 各自的许可协议 —— 除了 MIT 水面法线贴图外,全部为 CC0 公共领域, 具体说明记录在每个包的 [CREDITS.md](CREDITS.md) 中。
*东溪镇篝火旁的黄昏* | 
*火把照明下幽暗地窟中的精英怪拉扯* | | 
*废墟礼拜堂中的亡魂* | 
*盗匪营地中的人数劣势之战* | | 
*稀有刷新怪灰颚在北境道路被击杀* | 
*在铁匠哈德伦处整装待发 —— 鼠标提示、背包、金币* |  ## 搭建服务端(一条命令) ``` cp .env.example .env # 编辑 .env 并设置一个长随机 POSTGRES_PASSWORD docker compose up -d --build # postgres + game server, fully built # 打开 http://localhost:8787 — 账户、角色、整个世界 ``` 对于**远程托管**:将 compose stack 部署在任何 VPS 上,在环境中设置真实的 `POSTGRES_PASSWORD`,并通过 TLS 反向代理(使用 Caddy 只需两行配置 —— `your.domain { reverse_proxy localhost:8787 }`)代理 8787 端口;WebSockets 会自动代理,并且客户端 在 https 页面上会自动选择 `wss://`。认证端点基于 IP 进行速率限制; 密码使用 scrypt 哈希处理;token 7 天后过期。切勿在生产环境中设置 `ALLOW_DEV_COMMANDS=1`(它会启用测试机器人使用的等级/传送作弊功能)。 ## 在线开发(热重载) ``` npm install cp .env.example .env # 编辑 .env 并将 POSTGRES_PASSWORD 和 DATABASE_URL 设置为相同的密码 npm run db:up # postgres 16 in docker (port 5433, volume-persisted) npm run server # authoritative game server on :8787 (REST + WebSocket) npm run dev # client dev server on :5173 (proxies /api and /ws) ``` 打开 http://localhost:5173 → **Play Online** → 创建账号 → 创建 角色 → 进入世界。打开第二个浏览器/标签页并再次登录 —— 你们会 在镇上看到彼此。按 `Enter` 键打开聊天。 - **账号**:scrypt 哈希密码,7 天有效期的 bearer token (`auth_tokens`)。 - **角色**:每个账号最多 10 个;等级/装备/背包/任务/位置/金币 以 JSONB 格式持久化在 Postgres 中 —— 每 30 秒、登出时以及服务器 关闭时保存。名字全局唯一,仅限字母,经典风格。 - **服务端是权威的**:客户端以 20 Hz 的频率发送移动意图 + 指令; 服务端运行世界(一个共享的 `Sim`)并发送 基于兴趣范围的快照(约 120 码)以及按玩家路由的事件。所有 战斗计算、掉落判定、任务归属和商人交易都在 服务端进行;客户端只负责渲染。 - **小队**(最多 5 人):右键点击一名玩家 → *邀请组队*。左侧显示小队 框架,成员共享怪物的归属权(Tap 权)、击杀任务归属,并根据原版真实的组队奖励机制(3/4/5 人分别为 1.166/1.3/1.43 倍)均分经验 (XP)。使用 `/p 消息` 进行小队 聊天。小队成员在小地图上显示为蓝色光点。 - **交易**:右键点击一名玩家 → *交易*。双方暂存物品 + 金币, 双方都必须接受,并且交换是原子操作且经过服务端验证(任务物品 无法交易)。走开则取消交易。 - **决斗**:右键点击 → *决斗请求*。3 秒倒计时,战斗 直到一方血量降至 1 hp —— 没人会死,获胜者将在全区域广播。 跑离 60 码外视为放弃。 - **多人游戏规则**:经典的归属权(Tap)机制(第一个对怪物造成伤害的玩家拥有 其掉落/经验/任务归属 —— 其他人会收到“你没有权限拾取该物品。”), 当怪物的目标死亡时,它会重新锁定下一个攻击者(不会免费 重置),加入/离开公告,以及 `/say` 风格的聊天。 ## The Hollow Crypt —— 5 人精英副本 兄弟阿尔德里克的故事线在 *The Restless Dead* 之后继续:**Whispers Below**(在废墟礼拜堂找到 Gravecaller 的印记) → **The Binding Rite**(从狗头人挖掘地收集受祝福的油脂,从亡魂身上收集幽冥精华) → **Into the Hollow**(*建议玩家数:5*)—— 在礼拜堂下方的 地窟底部杀死 Morthen the Gravecaller。 - Fallen Chapel 的地窟大门会将你的**小队传送到其专属的 私人副本实例中**(6 个位置;副本在清空 5 分钟后重置)。 - 副本内部:火把照明的走廊,成对出现的**精英**垃圾怪(原版精英 缩放比例:约 2.3 倍血量,约 1.5 倍伤害,双倍经验),小头目 Sexton Marrow,以及 Morthen —— 一个 10 级精英首领,每 10 秒释放一次 **Shadow Pulse** AoE。副本内的垃圾怪在副本重置之前不会刷新。 - 奖励:根据各职业模型分配的稀有(蓝色)武器,1 枚金币,1500 点经验。 - 这确实是专为 5 人设计的:我们的自动化 5 机器人团队(战士、圣骑士、 牧师、法师、猎人,带有集火 + 治疗者 AI)可以在约 5 分钟内通关, 死亡约 10 次(`node scripts/crypt_raid.mjs`,需要 ALLOW_DEV_COMMANDS=1)。 ``` docker compose ps # eastbrook-db (postgres:16-alpine, healthcheck) node scripts/mp_integration.mjs # 26-check API/WS/persistence suite node scripts/mp_browser.mjs # two real browser clients see each other ``` ## The Sunken Bastion 与 Gravewyrm Sanctum 阴谋并未随着 Morthen 而结束。**The Sunken Bastion**(5 人, 约 13 级,位于 Mirefen 东南部)盘踞着 Vael the Mistcaller —— 他会在血量降至 60% 和 30% 时召唤一波又一波的 Drowned Thralls。终局之战是 **Gravewyrm Sanctum**(5 人,20 级,位于 Thornpeak 下方):包含三个房间的精英骨卫和龙人、 Korgath the Bound(血量低于 30% 时会激怒)、大死灵法师 Velkhar(会召唤更多的小怪波次),以及 **Korzul the Gravewyrm** —— 这里会掉落史诗 武器,而且前置任务链可以单刷完成,因此没人会被 故事线拒之门外。 ## 离线游玩 ``` npm run dev # open http://localhost:5173 -> Play Offline ``` 命名你的角色,选择九大职业中的任意一个,你就会进入 **Eastbrook Vale**(1-7 级):一个市场小镇,周围环绕着六个枢纽 —— 北边有狼群出没,东边是野猪草地, 西边是 Webwood,西北方是 Mirror Lake,西南方是狗头人的铜矿挖掘场, 东北方是有亡魂游荡的废墟礼拜堂,东南方则是 Gorrak 的盗匪 营地。向北的道路穿过山间隘口爬升,进入 **Mirefen Marsh**(6-13 级,枢纽:Fenbridge),并一路向上通往 **Thornpeak Heights**(13-20 级, 枢纽:Highwatch)—— 三个区域,约 60 个任务,以及一条故事线:Gravecaller 阴谋,从东溪镇外最初的不安骨骸,一直到山峰下方 **Korzul the Gravewyrm**。每个枢纽都有商人(包括出售实打实的白字装备的武器锻造师和护甲锻造师)、 墓地、专属背景音乐以及一张区域地图。 ### 操作(经典布局) | 输入 | 动作 | |---|---| | `W`/`S` | 奔跑 / 后退 —— `A`/`D` 转向(按住鼠标右键时为侧移),`Q`/`E` 侧移 | | 鼠标右键拖拽 / 左键拖拽 | 视角旋转 / 环绕视角 · 滚轮缩放 · `Space` 跳跃 | | `Tab` | 循环切换最近的敌人 · 左键点击选定目标 · 右键点击攻击/拾取/交谈 | | `1`–`9`, `0`, `-`, `=` | 动作条 | | `F` | 交互(拾取尸体 / 拾取物体 / 交谈) | | `C` `P` `L` `M` `B` | 角色面板 · 法术书 · 任务日志 · 世界地图 · 背包 | | `V` / `R` / `Esc` | 姓名牌 · 自动奔跑 · 关闭窗口 / 清除目标 | ### 经典还原度核对清单 **公式(原版真实公式)** - 怒气转换公式 `c = 0.0091L² + 3.23L + 4.27`;造成伤害时获得 `7.5·d/c`,受到伤害时获得 `2.5·d/c` - 带有 +3 等级断崖(96/95/94/83%)的法术命中表;基于等级的近战未命中/躲闪 - 护甲减伤公式 `armor/(armor + 85·AttackerLevel + 400)` - HP/法力值属性规则:前 20 点耐力 → 每点 1 HP,之后 → 每点 10 HP;前 20 点智力 → 每点 1 法力值,之后 → 每点 15 法力值 - 升至 20 级的经验值曲线为 400/900/1400/…;怪物经验 `45 + 5·L`,带有真实的零经验差灰名区间 - 1.5 秒的 GCD(潜行者为 1.0 秒),武器挥动计时器,5 秒法力值规则 **全部九个原版职业(学习原版的技能等级和阶数,1–20 级 —— 法术会随着你升级而获得更高阶:闪电箭 R2 在 8 级,R3 在 14 级,R4 在 20 级, 外加如斩杀、肾击、快速治疗、 风暴打击和星火术等新的高等级技能)** - *战士*:怒气,英雄打击(下一次挥击触发,不计入 GCD),战斗怒吼, 冲锋,断筋,雷霆一击, hamstring,血性狂暴,压制(躲闪触发) - *圣骑士*:正义圣印(武器附魔)通过**审判**释放, 圣光术,虔诚光环,力量祝福,神圣保护(吸收), 制裁之锤(眩晕),圣疗术 - *猎人*:**远程自动射击**(8–35 码,带有经典死区), 猛禽一击,雄鹰守护,毒蛇钉刺,奥术射击,震荡 射击,猫鼬撕咬(躲闪触发),摔绊 - *潜行者*:能量 + **连击点数**,邪恶攻击,刺骨,背刺 (需在目标身后 + 匕首),凿击,闪避,切割,疾跑 - *牧师*:惩击,次级治疗术,真言术:韧,暗言术:痛, **真言术:盾**(吸收),**恢复**(HoT),心灵震爆 - *萨满祭司*:闪电箭,**石化武器**(附魔),治疗波, 地震术,**闪电之盾**(荆棘伤害),烈焰震击 - *法师*:火球术,冰霜护甲,奥术智慧,寒冰箭,召唤水, 火焰冲击,奥术飞弹(引导),**变形术**,冰霜新星 - *术士*:暗影箭,恶魔之皮,献祭,腐蚀术,**生命分流**, 痛苦诅咒,**生命汲取**(引导式生命窃取) - *德鲁伊*:愤怒,治疗之触,野性印记,月火术,回春术, 荆棘术,纠缠根须,**熊形态**(10 级时可切换的变形) - 治术可以指定小队成员为目标(点击一个小队框架,然后进行治疗);增益魔法可以 施放给友方玩家;治疗可以暴击;吸收护盾在扣除生命值之前 吸收伤害。 **世界与系统** - 进食/饮水:坐下,在 18 秒内恢复,受到伤害或起身后中断 —— 是的,你可以同时进食和饮水 - 商人:购买食物/水,出售你的灰色物品;金币以金/银/铜 (g/s/c) 显示 - 地面任务物品带有闪光效果(夺回盗匪的补给箱) - 怪物 AI:游荡,根据等级差异产生近距离仇恨,连锁引怪(鱼人 拉怪距离更远 —— 叫上朋友一起),追击,脱战范围重置,尸体拾取, 刷新;稀有精英(Old Greyjaw)具有较长的刷新计时器 - 死亡 → 释放灵魂 → 墓地;坠落伤害;游泳会减慢你的速度 - 带有放弃功能的任务日志,包含问候语的闲聊对话,各职业专属奖励 **表现力** - 程序化生成一切:木框架房屋、瓦片屋顶、礼拜堂、市场 摊位、帐篷、闪烁着火光的篝火、矿洞入口、废墟石柱、 钓鱼码头、鱼人泥屋、绘制在地形上的道路、草丛、 松树 + 橡树、带有动态水面的湖泊、飘动的云彩、实时阴影 - 12 种绑定了骨骼的生物类别(狼/野猪/蜘蛛/鱼人/狗头人/骷髅/ 人形生物/巨魔/食人魔/元素/龙类/羊)带有行走/攻击/施法/坐下/ 死亡动画 - 为每个法术、物品和增益效果绘制的程序化图标 —— 在运行时使用 canvas 绘制, 无需任何资源文件 - 经典 UI:头像单位框架、带有持续时间的增益/减益效果条、 带有冷却扫描 + 距离/资源颜色显示的动作条、施法/引导条、 法术书、角色纸娃娃模型、任务日志、世界地图、商人 + 拾取窗口、 带有金色边框的鼠标提示、浮动战斗文本、战斗日志、分段式经验条、 带有点位标记的小地图和完整的区域地图 - 程序化的 WebAudio 音效:近战/法术打击音效、升级号角声、任务 提示音、金币掉落声、死亡音效 —— 没有音频文件 ## 开发说明 ``` npm test # vitest suite: formulas, combat, AI, quests, all 9 classes, # parties, duels, trades, elites, the crypt npm run build # production web build node scripts/smoke_browser.mjs # warrior E2E (needs `npm run dev` running) node scripts/smoke_mage.mjs # mage: casting, polymorph, conjure+drink, death/release node scripts/smoke_rogue.mjs # rogue: combo points, eviscerate, vendor, eating node scripts/visual_tour.mjs # screenshot tour of the zone + UI into tmp/ node scripts/mp_integration.mjs # 26-check API/WS/persistence suite (server running) node scripts/social_e2e.mjs # trade + duel over the wire (ALLOW_DEV_COMMANDS=1) node scripts/crypt_raid.mjs # five bots clear the Hollow Crypt (ALLOW_DEV_COMMANDS=1) ``` 项目布局: ``` src/sim/ deterministic N-player game core (no DOM imports) — shared by all targets src/render/ Three.js renderer: models.ts (rigs), props.ts, textures.ts (procedural) src/game/ input + camera + WebAudio synth src/ui/ classic HUD: frames, windows, tooltips, map, FCT src/net/ online client: REST auth + WebSocket world mirror (ClientWorld) src/world_api.ts the IWorld interface both Sim and ClientWorld satisfy server/ game server: main.ts (HTTP+WS), game.ts (world loop), db.ts, auth.ts docker-compose.yml postgres:16-alpine tests/ vitest suite scripts/ browser E2E + screenshot tour + multiplayer integration tests ``` 名称、任务和区域均为原创;公式和机制遵循 原版设计。世界种子固定在 `src/main.ts` 中,因此每次访问的 都是同一个世界。 ## License 代码基于 [MIT 许可协议](LICENSE) —— 尽情 fork 它,混搭它,搭建你自己的世界。 内置的第三方美术资源(模型、纹理、HDRI)保留其 各自的许可协议 —— 除了 MIT 水面法线贴图外,全部为 CC0 公共领域, 具体说明记录在每个包的 [CREDITS.md](CREDITS.md) 中。
标签:Docker, MITM代理, MMO游戏, PostgreSQL, Web游戏, 安全防御评估, 暗色界面, 游戏服务端, 版权保护, 自动化攻击, 请求拦截