Skip to content

yuanninesuns/AutoHS

Repository files navigation

AutoHS(欢迎star)

  • 动机:网上的炉石传说脚本都是付费的,像我这样的白嫖党很难受,所以希望有一个免费的脚本,哪怕简陋,但晒可以跑,做做任务刷刷金币即可
  • 致谢:本代码参考Yiyuan-DongFallAbyss,修改了一些小bug,制作了一个很简易的经典模式脚本
  • 注意:这个脚本是pc版基于页面的脚本,也就是完全模拟你手动的点击,需要一台win机器,并且装有炉石

如何运行

  1. 安装Python3

  2. 安装所需依赖:

pip install -r requirements.txt
  1. constants/constants里有一些参数可以设置,其中有两项必须修改:
    • 名为YOUR_NAME的变量需要改成你的炉石用户名,形如为所欲为、异灵术#54321。如果不在文件里修改,每次启动脚本时系统都会提示你手动输入用户名。
    • 名为HEARTHSTONE_POWER_LOG_PATH的变量必须修改成你的电脑上的炉石传说日志Power.log的路径,Power.log在炉石安装路径下的Logs/文件夹中。

Power.log中记录了对战过程中每一个对象(Entity)的每一项属性(tag)的变化。 这个对象包括玩家、英雄、英雄技能、卡牌(无论在牌库里、手牌中、战场上还是坟地里)等。

Power.log会在进入炉石后第一次对战开始时创建,在退出炉石后会被重命名为Power_bk.log,在再一次进入炉石时被删除。

如果你在Logs/目录下没有找到Power.log(指对战开始后),那稍微有一些麻烦。你需要到C:\Users\YOURUSER\AppData\Local\Blizzard\Hearthstone目录下新建一个叫log.config的文件(如果已经有就不用新建了),然后把下面这段代码放进去(如果已经有[Power]相关则更改相关设置):

[Power]
LogLevel=1
FilePrinting=True
ConsolePrinting=False
ScreenPrinting=False
Verbose=True

关于炉石log的更多信息可以查看这个 Reddit帖子

  1. 可以先跑一跑demo/下的一些文件。

  2. 若要启动脚本,将当前目录切换到AutoHS/下(重要),运行python main.py即可。注意以下几点:

    • 显示分辨率(在桌面右击的显示设置里调整)以及炉石分辨率1920 * 1080
    • 项目大小缩放比例为100%(同样在显示设置里调整)。
    • 炉石全屏且语言为简体中文繁体中文英文
    • 炉石放在最前台
    • 你可以把战网客户端最小化到任务栏,或是放在炉石应用下面,但请不要关闭战网客户端。有时炉石会意外关闭,这时程序会试图重新打开炉石。

我目前用的挂机卡组

经典模式-动物园的亲爹

  • 2x (1) 精灵弓箭手
  • 2x (1) 银色侍从
  • 2x (2) 战利品贮藏者
  • 2x (2) 末日预言者
  • 1x (2) 血法师萨尔诺斯
  • 2x (2) 雷铸战斧
  • 2x (3) 大地之环先知
  • 1x (3) 妖术
  • 2x (3) 精神控制技师
  • 2x (3) 苦痛侍僧
  • 1x (3) 血骑士
  • 2x (3) 闪电风暴
  • 1x (4) 冰风雪人
  • 2x (4) 森金持盾卫士
  • 2x (5) 土元素
  • 2x (5) 狂奔科多兽
  • 2x (6) 烈日行者

神秘代码:

AAEDAfWfAwSwlgTnlgS1oQSWowQNr5YEs5YE+qAEsaEEsqEEvqEE0KEE1aEEiKIEi6IEjqIExaME0qMEAA==

在广大动物园脚本的鼎力支持下,原作者Yiyuan-Dong已于2021年8月14日上传说。上传说时排名6785,上传说前29场对战战绩为20-9。

没必要特意去合卡,所有卡牌都可以替换成任意非战吼随从,或是card/classic_card.py中已经写过逻辑的卡牌。比如卡组中血法师萨尔诺斯这张牌据我观察毫无作用,只是鉴于第一次上传说的纪念意义予以保留。

如果想加入新的卡牌

对于所有的非战吼随从,如果没有具体实现它,脚本会根据它的费用猜测它的价值(费用越高越厉害)。而脚本不会使用未识别的战吼随从、法术、武器。如果想要让脚本识别并合理运用一张卡牌,你需要干两件事:

  1. card/classic_card.py中写下它的使用规则,比如使用它的期望值、使用它时鼠标要点哪里等。
  2. card/id2card.py中加入一个它的id与其卡牌实现类的键值对。

关于id,在炉石中每一个Entity都有其对应的id,比如各种各样的吉安娜有各种各样的id

  • HERO_08 吉安娜·普罗德摩尔
  • HERO_08c 火法师吉安娜
  • HERO_08f 学生吉安娜
  • HERO_08g 奥术师吉安娜
  • HERO_08h 学徒吉安娜
  • HERO_08i 大法师吉安娜
  • HERO_08j 库尔提拉斯的吉安娜
  • HERO_08k 灵风吉安娜

英雄技能各有id,一个同样的技能会有好多id,并随着皮肤的切换改变id

  • HERO_07bp 生命分流
  • HERO_07dbp 生命分流
  • HERO_07ebp 生命分流
  • VAN_HERO_07bp 生命分流
  • CS2_056_H1 生命分流
  • CS2_056_H2 生命分流
  • CS2_056_H3 生命分流
  • HERO_07bp2 灵魂分流(生命分流的升级技能)

卡牌,连带着它的衍生牌、增益效果、抉择选项,各有各的id

  • SW_091 恶魔之种
  • SW_091t 建立连接
  • SW_091t3 完成仪式
  • SW_091t4 枯萎化身塔姆辛
  • SW_091t5 枯萎化身

如果想获取卡牌的id,可以直接运行json_op.py,它会在脚本根目录下生成一个名为id-name.txt的文件,包含了炉石中每一个对象的id与中文名的对应关系。

文件说明

  • demo/catch_screen_demo.py: 运行此文件会获取炉石传说进程的整个截屏(无论是在前台还是后台),并画上一些坐标基准线,方便判断想实现的操作的坐标值。
  • demo/game_state_snapshot_demo.py: 在控制台显示目前的炉石战局情况,包括显示手牌情况,英雄情况,随从情况等; 还会在demo/目录下创建一个名为game_state_sanpshot.txt的文件,记录log分析情况。 需要在Power.log存在,即进入对战模式后调用。
  • demo/get_window_name.py: 显示当前所有窗口的名称和编号,可以用来看炉石传说叫什么名字……
  • demo/mouse_control_demo.py: 一个样例程序,展示了如何控制鼠标。
  • click.py: 包含了与鼠标控制相关的代码。
  • FSM_action.py: 包含了脚本在炉石运行中的不同状态(比如选英雄界面、对战时、对扎结束后)应该采取什么行为以及何时进入下一站状态的代码。
  • lop_op.py: 包含了与读取Power.log相关的代码,比如针对不同日志行的正则表达式。
  • json_op.py: 包含了从网络上下载炉石数据JSON文件,并将其初步处理的代码。直接运行可以生成id-name.txt,一个包含了炉石所有对象id与中文名对应关系的文件。
  • log_state.py: 读取log.py提取的日志信息,并把他们转化成字典的列表的形式。每一个字典是一个 EntityEntity 由不同的 tag 及其对应值构成。
  • strategy.py: 读取log_state.py提取的信息,并从中提取出手牌信息,战场信息,墓地信息等,再根据这些具体信息思考行动策略。
  • card/: 用于存放针对某些特殊卡牌的具体逻辑。

补充

  • 如果怕被封号,建议每天只玩几个小时,别大半夜的还在刷脚本,这部分在FSM_action.py/def AutoHS_automata()中有设置,我基本是每天玩到晚上11点就停了,因为实验室是9点下班,所以基本在下班前开启脚本,9-11点刷脚本,各位大佬不要跟我撞时间了(滑稽)
  • 另外我还在原来的基础上设置了一些随机数,防止每个操作都间隔一样的时间,被系统发现脚本
  • 新的策略可以在阅读源码的基础上做出自己的修改,各位大佬加油,可以给我提pr

About

炉石传说脚本(经典模式)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages