跳到正文

Brawlore

纯 JavaScript 写的《暗黑破坏神 2》致敬作——无限地牢、十套套装、两级分叉的技能树——全程不读一行代码做出来,并且以自己的名字上线。

Screenshot of Brawlore
编辑截图, 28 Sep 2026Brawlore ↗

这是什么

一个面向浏览器的动作角色扮演游戏,仿《暗黑破坏神 2》,用原生 JavaScript 写在 canvas 上。随机的无限地牢、九种怪物与六个 Boss、每项技能分叉两次的技能树、十套各六件的套装、十个章节任务、网格背包与仓库、赌博、洗点、成就,以及自动战斗。存档用 IndexedDB,不需要构建。它也是本档案里「作者不读代码」这一做法规模最大的实例——他写的不是代码,而是一套指令文件和三个项目技能,告诉 agent 东西在哪里、什么不能弄坏。

谁做的常驻宁波,账号资料里的公司是易哈佛。他的主页写着自己「到了可以随心玩的阶段,做了 AgentClaw 等很多好玩的」,五十个仓库也确实如此:一个 271 星的 Rust Markdown 预览与编辑器、一个 33 星的 agent 托管平台、一个荒野生存射击游戏、一个 Godot 摩托格斗游戏。他有三个仓库是游戏,这在本档案里不常见——多数建造者是从工具走向游戏,他是反过来。

制作过程

7 个阶段
  1. 01

    它实际包含什么

    这不是一个游戏雏形。CHANGELOG 已经写到 v7.13,而 2026 年 9 月 8 日那一天的记录里就有十八条独立改动。功能清单把这一类型该有的形状都覆盖了:每次深入地牢都重新生成,城镇枢纽里有商人、治疗者和任务 NPC,升级分配属性点,每进新楼层弹出天赋商店,四个系别的技能树——火、雷、射击,以及后来加的护盾——每项技能三个阶段,第二阶段和第三阶段给的是分叉而不是升级。十套各六件的套装,命名仿照原作,掉落率随怪物等级变化。三十格背包、三十六格仓库、快捷药剂腰带、赌博、十个从「邪恶洞窟」到「世界之石要塞」的章节任务、九种普通怪物与六个 Boss,怪物行为包括复活死者、射箭和穿墙。有些是自创而非借用的——一个每五级触发一次的赐福系统,六种类型、每种三个词条、每个词条三种效果。整套东西就是一块 canvas 加一组由 `index.html` 按顺序加载的脚本,没有框架,也没有构建步骤。

  2. 02

    它叫什么,以及它以什么名字上线

    这里同时有三个名字,值得分开说。仓库叫 `diablo-web`,描述说它是用 Vibe Coding 写的暗黑破坏神 2,README 标题是「暗黑破坏神 Web版」。但仓库里的指令文件开头写的是「菠萝战纪 Brawlore」,而 maikami.com 上实际部署的游戏标题同样是 Brawlore,配着自己的 ARPG 宣传文案,全篇不提暴雪。仓库对它致敬的对象毫不含糊;用户真正加载的那个东西则不是。这是一条合理的界线,而且是被有意画出来的——但它意味着这个项目对读代码的人和对玩的人各有一个名字。

  3. 03

    真正的作品是指令文件

    `AGENTS.md` 是项目规则所在之处,而它做的第一件事是纠正读者本来会犯的错误假设:模块由 `index.html` 按顺序加载并共享全局状态,所以不要假定单文件架构,也不要随意调整加载顺序。接着是一张二十来个文件的导航表,每个文件一行职责说明——主循环、常量、敌人与战斗战术、自动战斗、IndexedDB 存档与迁移、物品与套装、技能分支、深渊、每日任务、UI 面板、音频、精灵渲染、三个独立的立体效果模块、在线与市场代码。然后是约束,每一条读起来都像是一个修好过、不能再回来的 bug:改过 JavaScript 或 CSS 之后要更新 `index.html` 里的资源版本号,免得浏览器继续用旧文件;改动玩家存档状态时要处理旧存档缺失的字段,而不是重置用户数据来掩盖兼容问题;不要重新引入怪物受伤瞬移;特效代码里保留对象清理与画质分级;音频要预期到需要用户交互;坐标要区分像素与瓦片索引。`CLAUDE.md` 只有 164 字节,内容只有一件事:导入 `AGENTS.md`,并注明项目约束只在那份文件里维护、不在此复制。一套规则,两个 agent 读。

  4. 04

    三个技能,以及各自被授予的工具权限

    仓库带三个项目技能,分别复制到 `.claude/skills/` 和 `.agents/skills/` 两处,好让两个 agent 工具都能找到。每个技能都声明了可用的工具,而这些额度才是最值得看的部分。`add-game-content` 拿到读取、搜索和写入——它是一本配方书,而且很具体:在哪个文件的哪个位置加怪物、物品、套装、技能或任务,每一种都给填好的模板,该用的稀有度与物品类型常量(而非魔术数字),以及一条提醒:新增套装后必须在识别已装备套装的函数里确认能被认出。`code-review` 只拿到读取和搜索,是一份针对 canvas 游戏而非泛泛代码的清单:用对象池分配而不是在循环里创建;原地过滤数组而不是每帧调用 `.filter()`;比较距离平方而不是开根号;缓存 DOM 引用而不是每帧查询。它还带着项目自己的逻辑完整性检查(附文件与行号),以及一节讲存档数据校验——包括把从存储里读出来的东西上的 `__proto__` 和 `constructor` 删掉,这是这个体量的项目通常根本不会想到的事。

  5. 05

    那个只负责跟你吵的技能

    第三个叫 `game-master`,只有读取和搜索权限——完全没有写权限。它不是代码工具,而是一个人格评审团:模型被要求以一组具名的业界人物组成的委员会来回答设计问题,每人有明确的专长和一句代表性的话。征途的史玉柱负责玩家心理,被描述为关注如何让玩家上瘾「但要有底线」;陈天桥负责运营与游戏生命周期;一位 Jay Wilson 风格的暴雪设计总监负责战斗手感与掉落循环,配着那句「Shut up, PvP guy」;丁磊负责美术方向;宫本茂负责关卡设计与惊喜,带着那句「延迟的游戏最终会变好」;宫崎英高负责死亡与学习曲线。示例里还出现了卡马克,负责把一切折算成代码行数,以及一位 QA 主管,负责问该测什么。示范案例是策划提问「10 层 boss 太难了怎么办」,评审团像评审团那样作答:暴雪总监主张提高攻击间隔而不是降血量,好保住压迫感;史玉柱认为卡关是好事,只要让玩家觉得「差一点就赢了」;宫本茂宁愿教一个新技巧而不是降难度;宫崎英高则问玩家死的时候知不知道原因,如果是不知道,问题在反馈而不在数值。技能以四条具体建议收尾,并附一条不许空谈的规矩:所有建议都要考虑实现成本。

  6. 06

    有一部分指令不在仓库里

    最大的缺失是有意为之,也值得点明。`AGENTS.md` 说自己是项目规则的唯一事实源,紧接着就把手指向项目之外:共享的工程纪律放在作者自己机器上的某个路径下、一个 agent-flow 目录里,而仓库有意不复制它。验证也一样——项目把完整检查交给同一个机器本地目录下的一个 PowerShell 脚本,它跑语法检查、一轮非 live 回归和精灵资源检查,另有一个命令把验证和一道 guard 一起跑。指令文件里有一行提到,其中部分检查需要某个 canvas 库。所以一个克隆了这个仓库的读者拿到的是游戏、关于游戏的规则,以及那些技能——但拿不到用来检查这一切的那条流水线,因为那条流水线不是项目产物,而是作者个人的、跨项目共用的,仓库是建立在「它存在」这个假设之上写的。**用已发布的东西跑不起这个项目自己的验证。**

  7. 07

    数字长什么样

    单一作者的两百一十三次提交,仓库三百三十七个文件、二百三十四 MB,绝大部分是同时以 PNG 和 WebP 两种格式提供的精灵图集。提交分布很不均匀:2025 年 12 月七十八次,1 月八次,4 月十六次,5 月八十六次,6 月三次,2026 年 9 月二十二次,而 2 月、3 月、7 月、8 月一次都没有。其中二十三次带共同作者尾注,十九次署名 Claude Opus 4.5,四次只写 Claude。README 说工作最初用 Gemini 3.0 Pro,后来转到 Claude Code,点名了 Opus 4.5、Sonnet 4.5 和 Kimi k2,并且没有读过一行代码。可见的历史从 2025 年 12 月 6 日开始,第一条提交信息是「Clean project without large video files」,而不是一次初始提交——仓库创建于 11 月 26 日,而它现存的第一条提交是在删东西。pull request 和 issue 几乎是空的:四个 PR,全部由作者本人为自己的功能开设、全部合并;一个未关闭的 issue,全文是「没有 bug 要提交,只是想说一句兄弟你好帅」。一颗星的情况下,这就是全部的外部贡献记录。仓库也没有任何形式的许可——这一点值得直说:源码是公开的,但其中没有任何东西授权任何人复用它。

相关档案

全部档案 →