Botty 暗黑2重制版自动化脚本实战教程:从第一次启动到看懂核心机制
Botty 暗黑2重制版自动化脚本实战教程:从第一次启动到看懂核心机制
【免费下载链接】bottyD2R Pixel Bot项目地址: https://gitcode.com/gh_mirrors/bo/botty
Botty 是一个专为《暗黑破坏神2:重制版》开发的像素级自动化脚本:它不用按键宏,靠截图识别操作游戏,替你开图、清怪、捡装备、回城存物,可以连续挂机跑图。这篇教程按“跑起来 → 看懂它 → 调配置 → 验证效果”的顺序,带你第一次让角色自己刷完一张图,并讲清它背后的模板匹配(说白了就是拿一张已知截图去当前画面里找“长得像的”位置)与状态机逻辑。
跑起来:环境、窗口和三个热键
克隆仓库并装好依赖
git clone https://gitcode.com/gh_mirrors/bo/botty cd botty conda env create -f environment.yml conda activate botty python src/main.py这 5 行一步到位完成环境和启动:environment.yml 里打包了 Python 3.10、OpenCV 和 tesseract OCR(OCR 就是文字识别,用来读屏幕上的物品名)。
游戏窗口要满足的3个条件
- 游戏语言必须是英文,否则物品名识别不出
- 720p 窗口,启动后脚本会自动调好游戏图形设置
- HDR、GeForce Experience 这类外部程序别碰画面,会改色值导致识别分数上不去
记住 4 个热键,后文反复出现:
F9 自动调整D2R图形设置 F10 图形调试器,验证识别用 F11 开始/暂停 F12 强制停止启动前把角色停在英雄选择界面,且 config/params.ini 里的difficulty要和你实际要进的游戏难度一致,角色会自动进对应幕。
看懂它:模板匹配和状态机
每个路径节点都是“找到已知截图”的识别结果,依次找到才算进入地图
核心是 src/bot.py 里的状态机:角色按当前截图的识别结果,在“城镇 / 跑图 / 捡物 / 回城存物”几个状态间切换,具体干活外包给各 manager 类——路径规划 src/pather.py、NPC 交互 src/npc_manager.py、职业技能 src/char/。
路径不是“走到 (x, y)”,而是“在画面里找到下一节点截图”:楼梯、入口、每段走廊节点按顺序识别,全部命中才推进。
屏幕上的四套坐标系
- Monitor:第一个显示器左上角
- Screen:当前屏幕左上角
- Absolute:角色脚底,即屏幕中心
- Relative:相对某张已识别到的模板
四套坐标系原点不同,换算正确点击才落在正确位置
用遮罩排除UI干扰
血条、蓝条、技能冷却都是动态内容,会干扰匹配。Botty 用一张遮罩把 HUD 区域挖掉,只对场景内容做识别。
底部血条、蓝条区域被遮住,匹配只在场景区进行
⚙️ 调配置:params.ini 只盯四个区块
配置都在 config/ 下,新手只动下面几处。
路线与难度
difficulty:游戏难度,决定角色开局所在幕order:逗号分隔的路线清单,如run_pindle, run_eldritch_shenkrandomize_runs:设为 1,每次按随机顺序跑
每条路线有独立模板集,识别到对应画面才推进下一步
两条硬性要求:run_diablo仅限锤丁;run_nihlathak、run_arcane要求角色会传送。
职业与药水阈值
type:职业,各系法师、锤丁、野蛮人、陷阱刺客、死灵法师等,每种 build 有对应段落绑定技能热键casting_frames:施法帧数,两次施法之间的帧数,填错会出现“卡在空中读条”take_health_potion/chicken:喝药与撤退的血量阈值
最小可运行配置:
[general] difficulty=hell [routes] order=run_pindle, run_eldritch_shenk先写这段就能起步,跑通后再逐项微调阈值。
升级项目不用搬配置
另建一个custom.ini,只写要覆盖的字段;升级项目时把它拷过去即可,不用逐行搬 params.ini 的改动。
🔍 验证:用图形调试器看识别分数
按 F10 启动 bot,会弹出一个几乎全黑的调试窗口,读图方式:
- 蓝圈 + 数字分数:识别到模板,健康分数远高于 0.9
- 往地上扔几件物品,调试窗口会显示物品名(黑底)
- 应当被捡起的物品会被红圈圈出
蓝圈是识别到的模板,红圈是应当捡起的物品
分数低于 0.9,十有八九是画面颜色问题:按一次 F9 让脚本自动调游戏图形设置,仍不对再手动微调亮度。
捡装备:BNIP 规则文件
地面物品取舍由 src/item/pickit.py 判定,规则写在 BNIP 文件里(BNIP 是 NIP 物品拾取规则的扩展版)。默认使用 config/default.bnip,已含 30 号以上符文、大药、三把 Ubers 钥匙;你往 config/nip/ 放一个自己的.nip,默认文件会自动失效。
[Name] >= Lumrune && [Name] <= Zodrune [Name] == Superhealingpotion [Name] == Fullrejuvenationpotion第一行捡 30 号及以上符文,后两行捡两种大药。
BNIP 独有语法:[allres] == 30捡全抗 30 的物品;[idname] == thestoneofjordan直接按名字捡 SoJ,代价是物品必须先鉴定。
排错:识别不到东西时先查三处
| 症状 | 先查哪里 | 处理办法 |
|---|---|---|
| 按 F11 没反应 | 窗口进程与分辨率 | 确认进程为 D2R.exe、窗口为 720p |
| 模板分数低于 0.9 | 外部图形增强程序 | 关 HDR 等,跑一次 F9,再手动调亮度 |
| 路线开不出来 | 路线前置不满足 | run_diablo 只支持锤丁;尼拉塞克/神秘避难所需要传送 |
| 捡到垃圾 | /nopickup 没开或规则太松 | enable_no_pickup=1,自定义规则放 config/nip/ |
资源索引:
- 职业实现 src/char/:每个职业一个独立模块,加新 build 就是加一个类
- 路线实现 src/run/:与 params.ini 里的 run_xxx 一一对应
- 消息通知 src/messages/:接 Discord Webhook,bot 留下物品时推送
- OCR 识别 src/d2r_image/ocr.py:用 tesseract 读屏幕上的物品名
下一步行动清单
- 跑
conda env create -f environment.yml,再用python src/main.py启动 - 角色停在英雄选择界面,按 F9 调图形设置,按 F10 确认模板分数全部高于 0.9
order只放一条路线,按 F11 观察角色完成“开图 → 击杀 → 回城”一个完整循环- 往 config/nip/ 写一个自己的
.nip,控制捡什么 - 最后再调职业段落和
atk_len_xxx攻击序列长度,按顺序增加路线数量
【免费下载链接】bottyD2R Pixel Bot项目地址: https://gitcode.com/gh_mirrors/bo/botty
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
