├── .gitignore ├── LICENSE ├── README.md ├── config.py ├── config ├── default.json ├── i18n │ └── 中文.json └── template.json ├── docs ├── game_setting.png └── guide.png ├── main.py ├── requirements.txt ├── tasks ├── armada.py ├── base │ ├── page.py │ ├── popup.py │ └── switch.py ├── dorm_bonus.py ├── errand.py ├── expedition.py ├── login.py ├── mail.py ├── mission.py ├── sweep.py └── weekly_reward.py └── templates ├── 7DAY_REWARD_CLAIM.png ├── 7DAY_REWARD_CONFIRM.png ├── ABYSS_SETTLE.png ├── ARMADA_CONTRIBUTION_FLAG.png ├── ARMADA_FLAG.png ├── ARMADA_GOTO_COMMISSION.png ├── ARMADA_GOTO_CONTRIBUTION.png ├── ARMADA_REWARD_CLAIM.png ├── ARMADA_REWARD_FLAG.png ├── ARMADA_REWARD_TAB.png ├── BATTLE_ATTACK_TAB.png ├── BATTLE_CHALLENGE_TAB.png ├── BATTLE_EVENT_TAB.png ├── BATTLE_GOTO_LITE.png ├── BATTLE_RECOMMEND_TAB.png ├── BP_CHEST.png ├── BP_CHEST_CLAIM.png ├── BP_CHEST_TEXT.png ├── BP_MISSIONS_TAB.png ├── BP_REWARD.png ├── BP_REWARDS_TAB.png ├── BP_REWARD_CONFIRM.png ├── BP_SHOP_TAB.png ├── BUY_HOMO_CHEST.png ├── CLAIM_STAMINA.png ├── COMMISSION_ACCEPT.png ├── COMMISSION_BUY.png ├── COMMISSION_COUNT.png ├── COMMISSION_FLAG.png ├── COMMISSION_GOTO_REWARD.png ├── COMMISSION_LACK.png ├── COMMISSION_MAX.png ├── COMMISSION_PUT.png ├── COMMISSION_REQUEST.png ├── COMMISSION_REQUEST_FLAG.png ├── COMMISSION_SUBMIT.png ├── COMMISSION_SUBMIT_CONFIRM.png ├── COMMISSION_SUBMIT_LACK.png ├── CONFIRM_BUTTON.png ├── CONTRIBUTION_CLAIMED.png ├── CONTRIBUTION_FULL.png ├── CONTRIBUTION_REWARD.png ├── CURRENT_BP_LEVEL.png ├── DAILY_BP.png ├── DAILY_REWARD_100.png ├── DAILY_REWARD_200.png ├── DAILY_REWARD_300.png ├── DAILY_REWARD_450.png ├── DAILY_REWARD_600.png ├── DORM_GOLD.png ├── DORM_GOTO_ERRANDS.png ├── DORM_GOTO_EXPEDITIONS.png ├── DORM_GOTO_SHOP.png ├── DORM_STAMINA.png ├── DORM_STAMINA_CLOSE.png ├── DORM_STAMINA_SURPLUS.png ├── DOWNLOAD_CONFIRM.png ├── DOWNLOAD_DONE.png ├── ERRANDS_FLAG.png ├── ERRAND_CANCEL.png ├── ERRAND_DISABLE.png ├── ERRAND_REWARD_CLAIM.png ├── ERRAND_REWARD_DONE.png ├── ERRAND_S+_CONFIRM.png ├── EXPEDITION_CANCEL.png ├── EXPEDITION_COMPLETED.png ├── EXPEDITION_DISPATCH.png ├── EXPEDITION_FLAG.png ├── EXPEDITION_FRAG_TAB.png ├── EXPEDITION_MATL_TAB.png ├── EXPEDITION_NOT_AVAILABLE.png ├── FRAG_GOTO_MATL.png ├── GOTO_ATTACK.png ├── GOTO_BP_MISSIONS.png ├── GOTO_BP_REWARD.png ├── GOTO_BP_SHOP.png ├── GOTO_CHALLENGE.png ├── GOTO_EVENT.png ├── GOTO_GIFT.png ├── GOTO_RECOMMEND.png ├── GOTO_SHARE.png ├── GOTO_WEEKLY_GIFT.png ├── HOME_BUTTON.png ├── HOMO_CHEST_CONFIRM.png ├── LITE_BUTTON.png ├── LITE_FLAG.png ├── LOGIN_CLICK.png ├── LOGIN_FLAG.png ├── LOGIN_UPDATE.png ├── MAIL_FLAG.png ├── MAIL_QUICK_CLAIM.png ├── MAIN_FLAG.png ├── MAIN_GOTO_ARMADA.png ├── MAIN_GOTO_BATTLE.png ├── MAIN_GOTO_DORM.png ├── MAIN_GOTO_MAIL.png ├── MAIN_GOTO_MALL.png ├── MAIN_GOTO_MISSIONS.png ├── MATL_GOTO_FRAG.png ├── MONTHLY_CARD_CLAIM.png ├── NEW_HOME_BUTTON.png ├── NEW_ITEM_POPUP.png ├── NOTICE_CLOSE.png ├── NOTICE_FLAG.png ├── NO_MORE_MAIL.png ├── POPUP_BP_CLAIM.png ├── POPUP_BP_FLAG.png ├── POPUP_EVENT_FLAG.png ├── POPUP_MARGIN.png ├── QUICK_CLAIM.png ├── QUICK_DISPATCH.png ├── QUICK_ERRAND.png ├── QUICK_ERRAND_CONFIRM.png ├── QUICK_EXPEDITION.png ├── QUICK_LITE.png ├── RETURN_BUTTON.png ├── REWARD_BP_LEVEL.png ├── SHARE_BUTTON.png ├── SHARE_ITEM.png ├── SHOP_FLAG.png ├── SIGNIN_REWARD_CLAIM.png ├── SIGNIN_REWARD_CONFIRM.png └── WEEKLY_SHARE.png /.gitignore: -------------------------------------------------------------------------------- 1 | ### Python template 2 | # Byte-compiled / optimized / DLL files 3 | __pycache__/ 4 | *.py[cod] 5 | *$py.class 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | cover/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | db.sqlite3-journal 64 | 65 | # Flask stuff: 66 | instance/ 67 | .webassets-cache 68 | 69 | # Scrapy stuff: 70 | .scrapy 71 | 72 | # Sphinx documentation 73 | docs/_build/ 74 | 75 | # PyBuilder 76 | .pybuilder/ 77 | target/ 78 | 79 | # Jupyter Notebook 80 | .ipynb_checkpoints 81 | 82 | # IPython 83 | profile_default/ 84 | ipython_config.py 85 | 86 | # pyenv 87 | # For a library or package, you might want to ignore these files since the code is 88 | # intended to run in multiple environments; otherwise, check them in: 89 | # .python-version 90 | 91 | # pipenv 92 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 93 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 94 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 95 | # install all needed dependencies. 96 | #Pipfile.lock 97 | 98 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 99 | __pypackages__/ 100 | 101 | # Celery stuff 102 | celerybeat-schedule 103 | celerybeat.pid 104 | 105 | # SageMath parsed files 106 | *.sage.py 107 | 108 | # Environments 109 | .env 110 | .venv 111 | env/ 112 | venv/ 113 | ENV/ 114 | env.bak/ 115 | venv.bak/ 116 | 117 | # Spyder project settings 118 | .spyderproject 119 | .spyproject 120 | 121 | # Rope project settings 122 | .ropeproject 123 | 124 | # mkdocs documentation 125 | /site 126 | 127 | # mypy 128 | .mypy_cache/ 129 | .dmypy.json 130 | dmypy.json 131 | 132 | # Pyre type checker 133 | .pyre/ 134 | 135 | # pytype static type analyzer 136 | .pytype/ 137 | 138 | # Cython debug symbols 139 | cython_debug/ 140 | 141 | .idea/ 142 | log/ 143 | test.py 144 | tasks/**/*.png 145 | abyss/ 146 | config/config.json 147 | tools/ 148 | .vscode/ 149 | *.exe -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Aues6uen11Z 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HonkaiHelper 2 | 基于图色识别和OCR的PC端崩坏3自动化脚本,先别退坑,刷刷日常凑登录天数吧~ 3 | 4 | ## 功能 5 | 6 | > 旧版本功能在新版尚未完全实现,会慢慢补充,目前完成每日活跃任务还是够的 7 | 8 | - 挂远征、家园打工 9 | - ~~肝万象虚境锻造材料~~ 10 | - 材料活动一键减负 11 | - 领家园金币、凭证奖励、邮件、每日活跃奖励 12 | - ~~戳老婆~~ 13 | - ~~买商店每天金币碎片~~ 14 | - ~~领每周一次舰团贡献奖励、时序票、吼姆秘宝~~ 15 | - 提交舰团委托、领舰团奖励 16 | 17 | ## 前置准备 18 | 19 | 1. 设置-辅助-显示菜单提示:关 20 | ![](./docs/game_setting.png) 21 | 2. 设置-画质-分辨率:任意16:9的分辨率,但求稳请使用1280×720或2560×1440 22 | 23 | ## 使用方法 24 | 25 | ### 一键包 26 | 27 | 图形化一键包现已发布,无需配置python环境,支持自动更新,欢迎[下载体验](https://github.com/Aues6uen11Z/HonkaiHelper/releases)。所用的图形化界面[DaCapo](https://github.com/Aues6uen11Z/DaCapo)与本项目完全独立,是一个通用脚本管理器,如果你有其他脚本想放上来,可以自行查看README了解用法。 28 | 29 | 解压后点击DaCapo.exe启动程序,进入“总览”修改游戏路径,然后回到主页点击按钮即可开始。 30 | 31 | ![](./docs/guide.png) 32 | 33 | ### 从源码构建 34 | 35 | 1. 克隆本项目或直接下载压缩包并解压 36 | ```shell 37 | git clone https://github.com/Aues6uen11Z/HonkaiHelper.git 38 | ``` 39 | 40 | 2. 准备Python环境,建议使用conda的新虚拟环境 41 | 42 | ```shell 43 | # 安装完anaconda或miniconda后进入shell 44 | # 理论上支持3.6以上任意版本,但目前只测试了3.9-3.11 45 | conda create -n zafkiel python==3.9.18 46 | conda activate zafkiel 47 | ``` 48 | 49 | 3. 在该环境内安装依赖包 50 | 51 | ```shell 52 | pip install -r requirements.txt 53 | ``` 54 | 55 | 4. 到项目根目录下的config/default.json修改游戏启动路径 56 | 5. 在项目根目录运行main.py 57 | 58 | ```shell 59 | cd 你的存储路径/HonkaiHelper 60 | python main.py 61 | ``` 62 | 63 | ## 注意事项 64 | 65 | 1. 项目更新有时会涉及到依赖更新,若从源码运行,使用时请确保你的zafkiel版本与requirements.txt一致。 66 | 67 | ```shell 68 | # 在你的虚拟环境内 69 | pip install --upgrade zafkiel 70 | ``` 71 | 72 | 2. 目前新版本尚未开发完全,不能保证在每一个人的电脑上都完美运行,出现问题可以在issue中提出,记得附上日志(注意**是.log文件,不是log.txt**) 73 | 74 | 3. Gitee仓库仅用作同步,不要在那里开issue 75 | 76 | ## Todo 77 | 78 | - [ ] 常用功能 79 | - [x] 图形化界面 80 | - [ ] 安卓模拟器支持 81 | - [ ] 改进日志和网页报告 82 | 83 | ## 开发 84 | 85 | 新版本使用了[Zafkiel](https://github.com/Aues6uen11Z/Zafkiel)库,结合了[Airtest](https://github.com/AirtestProject/Airtest)和[StarRailCopilot](https://github.com/LmeSzinc/StarRailCopilot)的一些优点,欢迎尝试。 86 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | from typing import Literal, List, Union 4 | 5 | from pydantic import BaseModel, Field 6 | 7 | 8 | class Item(BaseModel): 9 | """ 10 | Minimum setting 11 | """ 12 | type: Literal['input', 'select', 'checkbox', 'folder', 'file', 'priority'] = 'input' 13 | value: Union[str, bool, float] 14 | option: List[str] = [] 15 | hidden: bool = False 16 | help: str = '' 17 | disabled: bool = False 18 | 19 | model_config = { 20 | 'populate_by_name': True, 21 | } 22 | 23 | def __init__(self, value=None, **data): 24 | if value is not None and not isinstance(value, dict): 25 | data['value'] = value 26 | super().__init__(**data) 27 | 28 | 29 | class GroupCustomBase(BaseModel): 30 | """ 31 | Basic settings for every task 32 | """ 33 | # active: Item = Item(type='checkbox', value=True) 34 | priority: Item = Item(type='priority', value=0) 35 | command: Item = Item('') 36 | 37 | 38 | # 以下是实际设置内容 39 | # 任务级别 40 | class TaskGeneral(BaseModel): 41 | class GroupGeneralBase(BaseModel): 42 | """ 43 | General settings for the project 44 | """ 45 | language: Item = Item('中文') 46 | work_dir: Item = Item('./repos/HonkaiHelper', disabled=True) 47 | background: Item = Item(value=False, disabled=True) 48 | config_path: Item = Item('./repos/HonkaiHelper/config/config.json', disabled=True) 49 | log_path: Item = Item('./log', disabled=True) 50 | 51 | class GroupGame(BaseModel): 52 | game_path: Item = Item(type='file', value='') 53 | log_retain: Item = Item(type='select', value='1week', option=['1day', '3days', '1week', '1month']) 54 | 55 | Base: GroupGeneralBase = Field(GroupGeneralBase(), alias='_Base') 56 | Game: GroupGame = GroupGame() 57 | 58 | 59 | class TaskArmada(BaseModel): 60 | Base: GroupCustomBase = Field(GroupCustomBase( 61 | command=Item('py main.py -t armada', disabled=True), priority=Item(4) 62 | ), alias='_Base') 63 | 64 | 65 | class TaskDormBonus(BaseModel): 66 | Base: GroupCustomBase = Field(GroupCustomBase( 67 | command=Item('py main.py -t dorm_bonus', disabled=True), priority=Item(5) 68 | ), alias='_Base') 69 | 70 | 71 | class TaskErrand(BaseModel): 72 | Base: GroupCustomBase = Field(GroupCustomBase( 73 | command=Item('py main.py -t errand', disabled=True), priority=Item(5) 74 | ), alias='_Base') 75 | 76 | 77 | class TaskExpedition(BaseModel): 78 | Base: GroupCustomBase = Field(GroupCustomBase( 79 | command=Item('py main.py -t expedition', disabled=True), priority=Item(5) 80 | ), alias='_Base') 81 | 82 | 83 | class TaskLogin(BaseModel): 84 | class GroupLogin(BaseModel): 85 | confirm_time: Item = Item(type='input', value=3) 86 | 87 | Base: GroupCustomBase = Field(GroupCustomBase( 88 | command=Item('py main.py -t login', disabled=True), priority=Item(value=31, disabled=True) 89 | ), alias='_Base') 90 | Login: GroupLogin = GroupLogin() 91 | 92 | 93 | class TaskLogout(BaseModel): 94 | Base: GroupCustomBase = Field(GroupCustomBase( 95 | command=Item('py main.py -t logout', disabled=True), priority=Item(value=0, disabled=True) 96 | ), alias='_Base') 97 | 98 | 99 | class TaskMail(BaseModel): 100 | Base: GroupCustomBase = Field(GroupCustomBase( 101 | command=Item('py main.py -t mail', disabled=True), priority=Item(value=4) 102 | ), alias='_Base') 103 | 104 | 105 | class TaskMission1(BaseModel): 106 | Base: GroupCustomBase = Field(GroupCustomBase( 107 | command=Item('py main.py -t mission', disabled=True), priority=Item(value=6, disabled=True) 108 | ), alias='_Base') 109 | 110 | 111 | class TaskMission2(BaseModel): 112 | Base: GroupCustomBase = Field(GroupCustomBase( 113 | command=Item('py main.py -t mission', disabled=True), priority=Item(value=2, disabled=True) 114 | ), alias='_Base') 115 | 116 | 117 | class TaskSweep(BaseModel): 118 | Base: GroupCustomBase = Field(GroupCustomBase( 119 | command=Item('py main.py -t sweep', disabled=True), priority=Item(3) 120 | ), alias='_Base') 121 | 122 | 123 | class TaskWeeklyReward(BaseModel): 124 | class GroupWeeklyEvent(BaseModel): 125 | share: Item = Item(type='checkbox', value=True) 126 | share_time: Item = Item(type='input', value=0.0, hidden=True) 127 | 128 | homo_chest: Item = Item(type='checkbox', value=True) 129 | homo_chest_time: Item = Item(type='input', value=0.0, hidden=True) 130 | 131 | bp_chest: Item = Item(type='checkbox', value=True) 132 | bp_chest_time: Item = Item(type='input', value=0.0, hidden=True) 133 | 134 | armada_contribution: Item = Item(type='checkbox', value=True) 135 | armada_contribution_time: Item = Item(type='input', value=0.0, hidden=True) 136 | 137 | Base: GroupCustomBase = Field(GroupCustomBase( 138 | command=Item('py main.py -t weekly_reward', disabled=True), priority=Item(1) 139 | ), alias='_Base') 140 | WeeklyEvent: GroupWeeklyEvent = GroupWeeklyEvent() 141 | 142 | 143 | # 任务组级别 144 | class MenuProject(BaseModel): 145 | General: TaskGeneral = TaskGeneral() 146 | 147 | 148 | class MenuDaily(BaseModel): 149 | Login: TaskLogin = TaskLogin() 150 | Logout: TaskLogout = TaskLogout() 151 | Mission1: TaskMission1 = TaskMission1() 152 | Mission2: TaskMission2 = TaskMission2() 153 | Sweep: TaskSweep = TaskSweep() 154 | Mail: TaskMail = TaskMail() 155 | DormBonus: TaskDormBonus = TaskDormBonus() 156 | Expedition: TaskExpedition = TaskExpedition() 157 | Errand: TaskErrand = TaskErrand() 158 | Armada: TaskArmada = TaskArmada() 159 | 160 | 161 | class MenuWeekly(BaseModel): 162 | WeeklyReward: TaskWeeklyReward = TaskWeeklyReward() 163 | 164 | 165 | # 项目级别 166 | class UIContent(BaseModel): 167 | Project: MenuProject = MenuProject() 168 | Daily: MenuDaily = MenuDaily() 169 | Weekly: MenuWeekly = MenuWeekly() 170 | 171 | 172 | def gen_i18n(lang: str): 173 | import anyconfig 174 | 175 | trans_path = f"./config/i18n/{lang}.json" 176 | template_path = "./config/template.json" 177 | 178 | trans = { 179 | "Project": { 180 | "tasks": { 181 | "General": { 182 | "groups": {} 183 | } 184 | } 185 | } 186 | } 187 | with open(template_path, 'r', encoding='utf-8') as f: 188 | tpl = anyconfig.load(f) 189 | 190 | for menu_name, menu_conf in tpl.items(): 191 | if menu_name == "Project": 192 | if "General" in menu_conf.keys(): 193 | 194 | group_trans = trans["Project"]["tasks"]["General"]["groups"] 195 | for group_name, group_conf in menu_conf["General"].items(): 196 | if group_name == "_Base": 197 | continue 198 | group_trans[group_name] = { 199 | "name": group_name, 200 | "help": group_conf.get("_help", {}).get("value", ""), 201 | "items": {} 202 | } 203 | 204 | item_trans = group_trans[group_name]["items"] 205 | for item_name, item_conf in group_conf.items(): 206 | if item_name == "_help": 207 | continue 208 | item_trans[item_name] = { 209 | "name": item_name, 210 | "help": item_conf.get("help", ""), 211 | } 212 | for option_name in item_conf.get("option", []): 213 | item_trans[item_name].setdefault("options", {})[option_name] = option_name 214 | else: 215 | trans[menu_name] = { 216 | "name": menu_name, 217 | "tasks": {} 218 | } 219 | 220 | task_trans = trans[menu_name]["tasks"] 221 | for task_name, task_conf in menu_conf.items(): 222 | task_trans[task_name] = { 223 | "name": task_name, 224 | "groups": {} 225 | } 226 | 227 | group_trans = task_trans[task_name]["groups"] 228 | for group_name, group_conf in task_conf.items(): 229 | if group_name == "_Base": 230 | continue 231 | group_trans[group_name] = { 232 | "name": group_name, 233 | "help": group_conf.get("_help", {}).get("value", ""), 234 | "items": {} 235 | } 236 | 237 | item_trans = group_trans[group_name]["items"] 238 | for item_name, item_conf in group_conf.items(): 239 | if item_name == "_help": 240 | continue 241 | item_trans[item_name] = { 242 | "name": item_name, 243 | "help": item_conf.get("help", "") 244 | } 245 | for option_name in item_conf.get("option", []): 246 | item_trans[item_name].setdefault("options", {})[option_name] = option_name 247 | 248 | if Path(trans_path).exists(): 249 | with open(trans_path, 'r', encoding='utf-8') as f: 250 | old_trans = anyconfig.load(f) 251 | anyconfig.merge(trans, old_trans) 252 | 253 | with open(trans_path, 'w', encoding='utf-8') as f: 254 | anyconfig.dump(trans, f, ensure_ascii=False, indent=2, allow_unicode=True) 255 | 256 | 257 | 258 | def export() -> None: 259 | args = UIContent() 260 | with open('config/template.json', 'w', encoding='utf-8') as f: 261 | f.write(args.model_dump_json(indent=2, by_alias=True)) 262 | 263 | 264 | class Config: 265 | def __init__(self, config_path): 266 | self.config_path = config_path 267 | with open('config/template.json', 'r', encoding='utf-8') as f: 268 | args = json.load(f) 269 | with open(config_path, 'r', encoding='utf-8') as f: 270 | self.data = json.load(f) 271 | 272 | # 只是为了校验数据 273 | for menu, tasks in args.items(): 274 | for task, groups in tasks.items(): 275 | for group, items in groups.items(): 276 | if group == '_Base': 277 | continue 278 | for item, info in items.items(): 279 | info['value'] = self.data[menu][task][group][item] 280 | UIContent.model_validate(args) 281 | 282 | def update(self, menu, task, group, item, value): 283 | self.data[menu][task][group][item] = value 284 | with open(self.config_path, 'w') as f: 285 | json.dump(self.data, f, ensure_ascii=False, indent=2) 286 | 287 | 288 | if __name__ == '__main__': 289 | export() 290 | gen_i18n('中文') 291 | -------------------------------------------------------------------------------- /config/default.json: -------------------------------------------------------------------------------- 1 | { 2 | "Project": { 3 | "General": { 4 | "Game": { 5 | "game_path": "", 6 | "log_retain": "1week" 7 | } 8 | } 9 | }, 10 | "Daily": { 11 | "Login": { 12 | "Login": { 13 | "confirm_time": "3" 14 | } 15 | } 16 | }, 17 | "Weekly": { 18 | "WeeklyReward": { 19 | "WeeklyEvent": { 20 | "share": true, 21 | "share_time": 0, 22 | "homo_chest": true, 23 | "homo_chest_time": 0, 24 | "bp_chest": true, 25 | "bp_chest_time": 0, 26 | "armada_contribution": true, 27 | "armada_contribution_time": 0 28 | } 29 | } 30 | } 31 | } -------------------------------------------------------------------------------- /config/i18n/中文.json: -------------------------------------------------------------------------------- 1 | { 2 | "Project": { 3 | "tasks": { 4 | "General": { 5 | "groups": { 6 | "Game": { 7 | "name": "游戏设置", 8 | "help": "", 9 | "items": { 10 | "game_path": { 11 | "name": "游戏路径", 12 | "help": "游戏本体而非启动器路径,例如“G:\\Honkai Impact 3\\Games\\BH3.exe”" 13 | }, 14 | "log_retain": { 15 | "name": "日志保留时间", 16 | "help": "", 17 | "options": { 18 | "1day": "1天", 19 | "3days": "3天", 20 | "1week": "1周", 21 | "1month": "1月" 22 | } 23 | } 24 | } 25 | } 26 | } 27 | } 28 | } 29 | }, 30 | "Daily": { 31 | "name": "日常", 32 | "tasks": { 33 | "Login": { 34 | "name": "启动游戏", 35 | "groups": { 36 | "Login": { 37 | "name": "登录", 38 | "help": "", 39 | "items": { 40 | "confirm_time": { 41 | "name": "确认时间", 42 | "help": "主页面出现多久视为登录成功\n网络较差可以适当延长此时间,防止卡在弹窗界面" 43 | } 44 | } 45 | } 46 | } 47 | }, 48 | "Logout": { 49 | "name": "退出游戏", 50 | "groups": {} 51 | }, 52 | "Mission1": { 53 | "name": "活跃奖励1", 54 | "groups": {} 55 | }, 56 | "Mission2": { 57 | "name": "活跃奖励2", 58 | "groups": {} 59 | }, 60 | "Sweep": { 61 | "name": "减负", 62 | "groups": {} 63 | }, 64 | "Mail": { 65 | "name": "邮件", 66 | "groups": {} 67 | }, 68 | "DormBonus": { 69 | "name": "宿舍奖励", 70 | "groups": {} 71 | }, 72 | "Expedition": { 73 | "name": "远征", 74 | "groups": {} 75 | }, 76 | "Errand": { 77 | "name": "打工", 78 | "groups": {} 79 | }, 80 | "Armada": { 81 | "name": "舰团奖励", 82 | "groups": {} 83 | } 84 | } 85 | }, 86 | "Weekly": { 87 | "name": "周常", 88 | "tasks": { 89 | "WeeklyReward": { 90 | "name": "周常奖励", 91 | "groups": { 92 | "WeeklyEvent": { 93 | "name": "奖励事件", 94 | "help": "", 95 | "items": { 96 | "share": { 97 | "name": "每周分享", 98 | "help": "需安排在活跃奖励2之后,否则不会运行" 99 | }, 100 | "share_time": { 101 | "name": "share_time", 102 | "help": "" 103 | }, 104 | "homo_chest": { 105 | "name": "吼姆秘宝", 106 | "help": "" 107 | }, 108 | "homo_chest_time": { 109 | "name": "homo_chest_time", 110 | "help": "" 111 | }, 112 | "bp_chest": { 113 | "name": "历练值宝箱", 114 | "help": "" 115 | }, 116 | "bp_chest_time": { 117 | "name": "bp_chest_time", 118 | "help": "" 119 | }, 120 | "armada_contribution": { 121 | "name": "舰团贡献奖励", 122 | "help": "" 123 | }, 124 | "armada_contribution_time": { 125 | "name": "armada_contribution_time", 126 | "help": "" 127 | } 128 | } 129 | } 130 | } 131 | } 132 | } 133 | } 134 | } -------------------------------------------------------------------------------- /config/template.json: -------------------------------------------------------------------------------- 1 | { 2 | "Project": { 3 | "General": { 4 | "_Base": { 5 | "language": { 6 | "type": "input", 7 | "value": "中文", 8 | "option": [], 9 | "hidden": false, 10 | "help": "", 11 | "disabled": false 12 | }, 13 | "work_dir": { 14 | "type": "input", 15 | "value": "./repos/HonkaiHelper", 16 | "option": [], 17 | "hidden": false, 18 | "help": "", 19 | "disabled": true 20 | }, 21 | "background": { 22 | "type": "input", 23 | "value": false, 24 | "option": [], 25 | "hidden": false, 26 | "help": "", 27 | "disabled": true 28 | }, 29 | "config_path": { 30 | "type": "input", 31 | "value": "./repos/HonkaiHelper/config/config.json", 32 | "option": [], 33 | "hidden": false, 34 | "help": "", 35 | "disabled": true 36 | }, 37 | "log_path": { 38 | "type": "input", 39 | "value": "./log", 40 | "option": [], 41 | "hidden": false, 42 | "help": "", 43 | "disabled": true 44 | } 45 | }, 46 | "Game": { 47 | "game_path": { 48 | "type": "file", 49 | "value": "", 50 | "option": [], 51 | "hidden": false, 52 | "help": "", 53 | "disabled": false 54 | }, 55 | "log_retain": { 56 | "type": "select", 57 | "value": "1week", 58 | "option": [ 59 | "1day", 60 | "3days", 61 | "1week", 62 | "1month" 63 | ], 64 | "hidden": false, 65 | "help": "", 66 | "disabled": false 67 | } 68 | } 69 | } 70 | }, 71 | "Daily": { 72 | "Login": { 73 | "_Base": { 74 | "priority": { 75 | "type": "input", 76 | "value": 31.0, 77 | "option": [], 78 | "hidden": false, 79 | "help": "", 80 | "disabled": true 81 | }, 82 | "command": { 83 | "type": "input", 84 | "value": "py main.py -t login", 85 | "option": [], 86 | "hidden": false, 87 | "help": "", 88 | "disabled": true 89 | } 90 | }, 91 | "Login": { 92 | "confirm_time": { 93 | "type": "input", 94 | "value": 3.0, 95 | "option": [], 96 | "hidden": false, 97 | "help": "", 98 | "disabled": false 99 | } 100 | } 101 | }, 102 | "Logout": { 103 | "_Base": { 104 | "priority": { 105 | "type": "input", 106 | "value": 0.0, 107 | "option": [], 108 | "hidden": false, 109 | "help": "", 110 | "disabled": true 111 | }, 112 | "command": { 113 | "type": "input", 114 | "value": "py main.py -t logout", 115 | "option": [], 116 | "hidden": false, 117 | "help": "", 118 | "disabled": true 119 | } 120 | } 121 | }, 122 | "Mission1": { 123 | "_Base": { 124 | "priority": { 125 | "type": "input", 126 | "value": 6.0, 127 | "option": [], 128 | "hidden": false, 129 | "help": "", 130 | "disabled": true 131 | }, 132 | "command": { 133 | "type": "input", 134 | "value": "py main.py -t mission", 135 | "option": [], 136 | "hidden": false, 137 | "help": "", 138 | "disabled": true 139 | } 140 | } 141 | }, 142 | "Mission2": { 143 | "_Base": { 144 | "priority": { 145 | "type": "input", 146 | "value": 2.0, 147 | "option": [], 148 | "hidden": false, 149 | "help": "", 150 | "disabled": true 151 | }, 152 | "command": { 153 | "type": "input", 154 | "value": "py main.py -t mission", 155 | "option": [], 156 | "hidden": false, 157 | "help": "", 158 | "disabled": true 159 | } 160 | } 161 | }, 162 | "Sweep": { 163 | "_Base": { 164 | "priority": { 165 | "type": "input", 166 | "value": 3.0, 167 | "option": [], 168 | "hidden": false, 169 | "help": "", 170 | "disabled": false 171 | }, 172 | "command": { 173 | "type": "input", 174 | "value": "py main.py -t sweep", 175 | "option": [], 176 | "hidden": false, 177 | "help": "", 178 | "disabled": true 179 | } 180 | } 181 | }, 182 | "Mail": { 183 | "_Base": { 184 | "priority": { 185 | "type": "input", 186 | "value": 4.0, 187 | "option": [], 188 | "hidden": false, 189 | "help": "", 190 | "disabled": false 191 | }, 192 | "command": { 193 | "type": "input", 194 | "value": "py main.py -t mail", 195 | "option": [], 196 | "hidden": false, 197 | "help": "", 198 | "disabled": true 199 | } 200 | } 201 | }, 202 | "DormBonus": { 203 | "_Base": { 204 | "priority": { 205 | "type": "input", 206 | "value": 5.0, 207 | "option": [], 208 | "hidden": false, 209 | "help": "", 210 | "disabled": false 211 | }, 212 | "command": { 213 | "type": "input", 214 | "value": "py main.py -t dorm_bonus", 215 | "option": [], 216 | "hidden": false, 217 | "help": "", 218 | "disabled": true 219 | } 220 | } 221 | }, 222 | "Expedition": { 223 | "_Base": { 224 | "priority": { 225 | "type": "input", 226 | "value": 5.0, 227 | "option": [], 228 | "hidden": false, 229 | "help": "", 230 | "disabled": false 231 | }, 232 | "command": { 233 | "type": "input", 234 | "value": "py main.py -t expedition", 235 | "option": [], 236 | "hidden": false, 237 | "help": "", 238 | "disabled": true 239 | } 240 | } 241 | }, 242 | "Errand": { 243 | "_Base": { 244 | "priority": { 245 | "type": "input", 246 | "value": 5.0, 247 | "option": [], 248 | "hidden": false, 249 | "help": "", 250 | "disabled": false 251 | }, 252 | "command": { 253 | "type": "input", 254 | "value": "py main.py -t errand", 255 | "option": [], 256 | "hidden": false, 257 | "help": "", 258 | "disabled": true 259 | } 260 | } 261 | }, 262 | "Armada": { 263 | "_Base": { 264 | "priority": { 265 | "type": "input", 266 | "value": 4.0, 267 | "option": [], 268 | "hidden": false, 269 | "help": "", 270 | "disabled": false 271 | }, 272 | "command": { 273 | "type": "input", 274 | "value": "py main.py -t armada", 275 | "option": [], 276 | "hidden": false, 277 | "help": "", 278 | "disabled": true 279 | } 280 | } 281 | } 282 | }, 283 | "Weekly": { 284 | "WeeklyReward": { 285 | "_Base": { 286 | "priority": { 287 | "type": "input", 288 | "value": 1.0, 289 | "option": [], 290 | "hidden": false, 291 | "help": "", 292 | "disabled": false 293 | }, 294 | "command": { 295 | "type": "input", 296 | "value": "py main.py -t weekly_reward", 297 | "option": [], 298 | "hidden": false, 299 | "help": "", 300 | "disabled": true 301 | } 302 | }, 303 | "WeeklyEvent": { 304 | "share": { 305 | "type": "checkbox", 306 | "value": true, 307 | "option": [], 308 | "hidden": false, 309 | "help": "", 310 | "disabled": false 311 | }, 312 | "share_time": { 313 | "type": "input", 314 | "value": 0.0, 315 | "option": [], 316 | "hidden": true, 317 | "help": "", 318 | "disabled": false 319 | }, 320 | "homo_chest": { 321 | "type": "checkbox", 322 | "value": true, 323 | "option": [], 324 | "hidden": false, 325 | "help": "", 326 | "disabled": false 327 | }, 328 | "homo_chest_time": { 329 | "type": "input", 330 | "value": 0.0, 331 | "option": [], 332 | "hidden": true, 333 | "help": "", 334 | "disabled": false 335 | }, 336 | "bp_chest": { 337 | "type": "checkbox", 338 | "value": true, 339 | "option": [], 340 | "hidden": false, 341 | "help": "", 342 | "disabled": false 343 | }, 344 | "bp_chest_time": { 345 | "type": "input", 346 | "value": 0.0, 347 | "option": [], 348 | "hidden": true, 349 | "help": "", 350 | "disabled": false 351 | }, 352 | "armada_contribution": { 353 | "type": "checkbox", 354 | "value": true, 355 | "option": [], 356 | "hidden": false, 357 | "help": "", 358 | "disabled": false 359 | }, 360 | "armada_contribution_time": { 361 | "type": "input", 362 | "value": 0.0, 363 | "option": [], 364 | "hidden": true, 365 | "help": "", 366 | "disabled": false 367 | } 368 | } 369 | } 370 | } 371 | } -------------------------------------------------------------------------------- /docs/game_setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/docs/game_setting.png -------------------------------------------------------------------------------- /docs/guide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/docs/guide.png -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import ctypes 3 | import datetime 4 | import sys 5 | from pathlib import Path 6 | 7 | from loguru import logger 8 | from zafkiel import simple_report, auto_setup 9 | from zafkiel.ui import UI 10 | 11 | from config import Config 12 | from tasks.armada import Armada 13 | from tasks.base.popup import popup_list 14 | from tasks.dorm_bonus import DormBonus 15 | from tasks.errand import Errand 16 | from tasks.expedition import Expeditions 17 | from tasks.login import Login 18 | from tasks.mail import Mail 19 | from tasks.mission import Missions 20 | from tasks.sweep import Sweep 21 | from tasks.weekly_reward import WeeklyReward 22 | 23 | logger.remove() 24 | logger.add( 25 | sys.stdout, 26 | level="INFO", 27 | format="{time:HH:mm:ss} | " 28 | "{level: <7} | " 29 | "{message}", 30 | ) 31 | date = datetime.datetime.now().strftime("%Y-%m-%d") 32 | logger.add( 33 | f"./log/{date}/{date}.log", 34 | level="DEBUG", 35 | format="{time:HH:mm:ss} | " 36 | "{level: <7} | " 37 | "{message}", 38 | ) 39 | 40 | 41 | def all_tasks(config): 42 | try: 43 | # 日常 44 | Login(config).app_start() 45 | Missions(config).run() 46 | DormBonus(config).claim_stamina() 47 | DormBonus(config).claim_gold() 48 | Errand(config).run() 49 | Expeditions(config).run() 50 | Armada(config).run() 51 | Sweep(config).run() 52 | Missions(config).run() 53 | Mail(config).run() 54 | WeeklyReward(config).run() 55 | 56 | # 结束游戏进程 57 | Login(config).app_stop() 58 | 59 | except Exception as e: 60 | logger.exception(e) 61 | raise 62 | 63 | finally: 64 | simple_report( 65 | __file__, 66 | log_path=Path(f"./log/{date}/report").resolve(), 67 | output=f"./log/{date}/report.html", 68 | ) 69 | 70 | 71 | def single_task(config, task): 72 | try: 73 | if task != "login": 74 | auto_setup( 75 | str(Path.cwd()), 76 | logdir=f"./log/{date}/report", 77 | devices=[ 78 | "WindowsPlatform:///?title=崩坏3", 79 | ], 80 | ) 81 | UI().get_popup_list(popup_list) 82 | 83 | if task == "armada": 84 | Armada(config).run() 85 | elif task == "dorm_bonus": 86 | DormBonus(config).run() 87 | elif task == "errand": 88 | Errand(config).run() 89 | elif task == "expedition": 90 | Expeditions(config).run() 91 | elif task == "login": 92 | Login(config).app_start() 93 | elif task == "logout": 94 | Login(config).app_stop() 95 | simple_report( 96 | __file__, 97 | log_path=Path(f"./log/{date}/report").resolve(), 98 | output=f"./log/{date}/report.html", 99 | ) 100 | elif task == "mail": 101 | Mail(config).run() 102 | elif task == "mission": 103 | Missions(config).run() 104 | elif task == "sweep": 105 | Sweep(config).run() 106 | elif task == "weekly_reward": 107 | WeeklyReward(config).run() 108 | except Exception as e: 109 | simple_report( 110 | __file__, 111 | log_path=Path(f"./log/{date}/report").resolve(), 112 | output=f"./log/{date}/report.html", 113 | ) 114 | logger.error(e) 115 | raise 116 | 117 | 118 | def main(): 119 | parser = argparse.ArgumentParser() 120 | parser.add_argument( 121 | "--task", 122 | "-t", 123 | choices=[ 124 | "armada", 125 | "dorm_bonus", 126 | "errand", 127 | "expedition", 128 | "login", 129 | "logout", 130 | "mail", 131 | "mission", 132 | "sweep", 133 | "weekly_reward", 134 | ], 135 | help='Task name, one of "armada, dorm_bonus, errand, expedition, login, logout, mail, ' 136 | 'mission, sweep, weekly_reward"', 137 | ) 138 | parser.add_argument("--config_path", "-c", default="./config/config.json") 139 | args = parser.parse_args() 140 | 141 | if args.task: 142 | config_path = Path(args.config_path).resolve() 143 | if not config_path.exists(): 144 | logger.error(f"{config_path} not found") 145 | return 146 | config = Config(config_path) 147 | single_task(config, args.task) 148 | else: 149 | config = Config("./config/default.json") 150 | all_tasks(config) 151 | 152 | 153 | if __name__ == "__main__": 154 | # 以管理员身份运行 155 | if ctypes.windll.shell32.IsUserAnAdmin(): 156 | main() 157 | else: 158 | ctypes.windll.shell32.ShellExecuteW( 159 | None, "runas", sys.executable, __file__, None, 1 160 | ) 161 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | zafkiel==0.2.1 2 | pydantic==2.9.1 3 | numpy==1.26.4 -------------------------------------------------------------------------------- /tasks/armada.py: -------------------------------------------------------------------------------- 1 | from zafkiel import Template, logger, Timer, exists, find_click, touch, screenshot 2 | from zafkiel.decorator import run_until_true 3 | from zafkiel.exception import LoopError 4 | from zafkiel.ocr import DigitCounter, Keyword 5 | from zafkiel.ui import UI 6 | 7 | from config import Config 8 | from tasks.base.page import page_armada, page_commission, page_armada_rewards, TPL_CONFIRM_BUTTON 9 | 10 | 11 | class Armada(UI): 12 | def __init__(self, config: Config = None): 13 | self.config = config 14 | 15 | def claim_rewards(self): 16 | logger.info('Start claiming armada rewards') 17 | self.ui_goto(page_commission) 18 | loop_timer = Timer(0, 10).start() 19 | while True: 20 | if loop_timer.reached(): 21 | raise LoopError('The operation has looped too many times') 22 | 23 | if not exists(Template(r"ARMADA_REWARD_TAB.png", (0.38, -0.128))): 24 | logger.info('Armada reward claim completed') 25 | break 26 | 27 | self.ui_goto(page_armada_rewards) 28 | find_click(Template(r"ARMADA_REWARD_CLAIM.png", (0.212, 0.225), Keyword('领取'))) 29 | find_click(TPL_CONFIRM_BUTTON) 30 | 31 | @staticmethod 32 | def _handel_lack(): 33 | logger.info('Handling lack of commission materials') 34 | loop_timer = Timer(0, 10).start() 35 | while True: 36 | if loop_timer.reached(): 37 | raise LoopError('The operation has looped too many times') 38 | 39 | if exists(Template(r"COMMISSION_SUBMIT.png", (0.237, 0.224), Keyword('提交'), rgb=True)): 40 | break 41 | 42 | if find_click(Template(r"COMMISSION_MAX.png", (0.002, 0.161), Keyword('最大'))): 43 | find_click(Template(r"COMMISSION_BUY.png", (0.275, 0.162), Keyword('购买')), times=2) 44 | continue 45 | 46 | touch(Template(r"COMMISSION_LACK.png", (-0.398, -0.103)), blind=True) 47 | 48 | @run_until_true 49 | def _apply_new(self): 50 | logger.info('Applying for new commission') 51 | ocr = DigitCounter(Template(r"COMMISSION_REQUEST.png", (-0.36, 0.225))) 52 | if ocr.ocr_single_line(screenshot())[0] == 0: 53 | find_click(Template(r"COMMISSION_REQUEST.png", (-0.36, 0.225)), blind=True) 54 | find_click(Template(r"COMMISSION_REQUEST_FLAG.png", (-0.378, -0.18), Keyword('委托申请次数')), 55 | Template(r"COMMISSION_ACCEPT.png", (0.375, -0.079), Keyword('接受')), 56 | times=2) 57 | logger.info('New commission request completed') 58 | return True 59 | return False 60 | 61 | def commission(self): 62 | logger.info('Start commission process') 63 | self.ui_goto(page_commission) 64 | ocr = DigitCounter(Template(r"COMMISSION_COUNT.png", (0.43, 0.242))) 65 | 66 | loop_timer = Timer(0, 30).start() 67 | while True: 68 | if loop_timer.reached(): 69 | raise LoopError('The operation has looped too many times') 70 | 71 | if ocr.ocr_single_line(screenshot())[0] == 0: 72 | logger.info('Commissions submit completed') 73 | break 74 | 75 | if self._apply_new(): 76 | continue 77 | 78 | if find_click(Template(r"COMMISSION_SUBMIT.png", (0.237, 0.224), Keyword('提交'), rgb=True), 79 | timeout=0): 80 | continue 81 | if exists(Template(r"COMMISSION_SUBMIT_LACK.png", (0.237, 0.225), Keyword('提交'), rgb=True)): 82 | logger.info('Insufficient commission materials, suggest to buy in advance to speed up') 83 | self._handel_lack() 84 | find_click(Template(r"COMMISSION_SUBMIT_CONFIRM.png", (0.135, 0.159), Keyword('提交委托')), 85 | timeout=0) 86 | find_click(Template(r"COMMISSION_PUT.png", (0.0, 0.137), Keyword('放入舰团奖励池')), 87 | times=2, timeout=0) 88 | 89 | def run(self): 90 | self.ui_ensure(page_armada) 91 | self.claim_rewards() 92 | self.commission() 93 | -------------------------------------------------------------------------------- /tasks/base/page.py: -------------------------------------------------------------------------------- 1 | from zafkiel import Template 2 | from zafkiel.ocr import Keyword 3 | from zafkiel.ui import Page 4 | 5 | from tasks.base.switch import switch_missions, switch_expeditions, TPL_GOTO_ATTACK, switch_battle 6 | 7 | TPL_RETURN_BUTTON = Template(r"RETURN_BUTTON.png", (-0.444, -0.256), Keyword('返回')) 8 | TPL_HOME_BUTTON = Template(r"HOME_BUTTON.png", (-0.298, -0.257), Keyword('主菜单')) 9 | TPL_CONFIRM_BUTTON = Template(r"CONFIRM_BUTTON.png", (0.0, 0.144), Keyword('确定')) 10 | TPL_NEW_ITEM = Template(r"NEW_ITEM_POPUP.png", (0.289, -0.01)) 11 | 12 | # 主界面 13 | page_main = Page(Template(r"MAIN_FLAG.png", (0.281, 0.043), rgb=True)) 14 | 15 | # 家园界面 16 | page_dorm = Page(Template(r"DORM_STAMINA.png", (-0.34, -0.059))) 17 | page_dorm.link(TPL_RETURN_BUTTON, 18 | destination=page_main) 19 | page_main.link(Template(r"MAIN_GOTO_DORM.png", (0.354, 0.244), Keyword('家园')), 20 | destination=page_dorm) 21 | 22 | # 舰团界面 23 | page_armada = Page(Template(r"ARMADA_FLAG.png", (0.113, 0.076))) 24 | page_armada.link(TPL_RETURN_BUTTON, 25 | destination=page_main) 26 | page_main.link(Template(r"MAIN_GOTO_ARMADA.png", (0.195, 0.244), Keyword('舰团')), 27 | destination=page_armada) 28 | 29 | # 舰团委托界面 30 | page_commission = Page(Template(r"COMMISSION_FLAG.png", (-0.392, -0.183), Keyword('回收委托'))) 31 | page_commission.link(TPL_RETURN_BUTTON, 32 | destination=page_armada) 33 | page_commission.link(TPL_HOME_BUTTON, 34 | destination=page_main) 35 | page_armada.link(Template(r"ARMADA_GOTO_COMMISSION.png", (-0.113, 0.227), Keyword('委托回收')), 36 | destination=page_commission) 37 | 38 | # 舰团奖池界面 39 | page_armada_rewards = Page(Template(r"ARMADA_REWARD_FLAG.png", (-0.394, -0.184), Keyword('舰团奖池'))) 40 | page_armada_rewards.link(TPL_RETURN_BUTTON, 41 | destination=page_armada) 42 | page_armada_rewards.link(TPL_HOME_BUTTON, 43 | destination=page_main) 44 | page_commission.link(Template(r"COMMISSION_GOTO_REWARD.png", (0.439, -0.104), Keyword('舰团奖池')), 45 | destination=page_armada_rewards) 46 | 47 | # 舰团贡献界面 48 | page_armada_contribution = Page(Template(r"ARMADA_CONTRIBUTION_FLAG.png", (-0.395, -0.184), Keyword('舰团贡献'))) 49 | page_armada_contribution.link(TPL_RETURN_BUTTON, 50 | destination=page_armada) 51 | page_armada_contribution.link(TPL_HOME_BUTTON, 52 | destination=page_main) 53 | page_armada.link(Template(r"ARMADA_GOTO_CONTRIBUTION.png", (0.232, 0.23), Keyword('舰团贡献')), 54 | destination=page_armada_contribution) 55 | 56 | # BP任务界面 57 | page_missions = Page(Template(r"GOTO_BP_MISSIONS.png", (-0.417, -0.171), Keyword('作战任务')), 58 | switch=switch_missions) 59 | page_missions.link(TPL_RETURN_BUTTON, 60 | destination=page_main) 61 | page_main.link(Template(r"MAIN_GOTO_MISSIONS.png", (-0.453, -0.186)), 62 | destination=page_missions) 63 | 64 | # 邮件界面 65 | page_mail = Page(Template(r"MAIL_FLAG.png", (-0.456, 0.23), Keyword('邮件数'))) 66 | page_mail.link(TPL_RETURN_BUTTON, 67 | destination=page_main) 68 | page_main.link(Template(r"MAIN_GOTO_MAIL.png", (-0.421, -0.029)), 69 | destination=page_mail) 70 | 71 | # 远征界面 72 | page_expeditions = Page(Template(r"EXPEDITION_FLAG.png", (-0.363, -0.183), Keyword('今日远征可用体力')), 73 | switch=switch_expeditions) 74 | page_expeditions.link(TPL_RETURN_BUTTON, 75 | destination=page_dorm) 76 | page_expeditions.link(TPL_HOME_BUTTON, 77 | destination=page_main) 78 | page_dorm.link(Template(r"DORM_GOTO_EXPEDITIONS.png", (0.155, 0.237), Keyword('远征')), 79 | destination=page_expeditions) 80 | 81 | # 远征派遣界面 82 | page_dispatch = Page(Template(r"QUICK_DISPATCH.png", (0.119, 0.227), Keyword('一键派遣'))) 83 | page_dispatch.link(TPL_RETURN_BUTTON, 84 | destination=page_expeditions) 85 | page_dispatch.link(TPL_HOME_BUTTON, 86 | destination=page_main) 87 | 88 | # 打工界面 89 | page_errands = Page(Template(r"ERRANDS_FLAG.png", (-0.077, -0.258), rgb=True)) 90 | page_errands.link(TPL_RETURN_BUTTON, 91 | destination=page_dorm) 92 | page_dorm.link(Template(r"DORM_GOTO_ERRANDS.png", (0.277, 0.235), Keyword('打工')), 93 | destination=page_errands) 94 | 95 | # 商店界面 96 | page_shop = Page(Template(r"SHOP_FLAG.png", (-0.474, -0.191))) 97 | page_shop.link(TPL_RETURN_BUTTON, 98 | destination=page_dorm) 99 | page_shop.link(TPL_HOME_BUTTON, 100 | destination=page_main) 101 | page_dorm.link(Template(r"DORM_GOTO_SHOP.png", (0.422, 0.237), Keyword('商店')), 102 | destination=page_shop) 103 | 104 | # 出击界面 105 | page_battle = Page(TPL_GOTO_ATTACK, 106 | switch=switch_battle) 107 | page_battle.link(Template(r"NEW_HOME_BUTTON.png", (-0.343, -0.252)), 108 | destination=page_main) 109 | page_main.link(Template(r"MAIN_GOTO_BATTLE.png", (0.421, -0.004), Keyword('出击')), 110 | destination=page_battle) 111 | 112 | # 材料活动界面 113 | page_lite = Page(Template(r"LITE_FLAG.png", (-0.001, -0.195), Keyword('材料活动'))) 114 | page_lite.link(TPL_RETURN_BUTTON, 115 | destination=page_battle) 116 | page_lite.link(TPL_HOME_BUTTON, 117 | destination=page_main) 118 | page_battle.link(Template(r"BATTLE_GOTO_LITE.png", (0.114, 0.147)), 119 | destination=page_lite) 120 | -------------------------------------------------------------------------------- /tasks/base/popup.py: -------------------------------------------------------------------------------- 1 | from zafkiel import Template, find_click, touch, exists, sleep 2 | from zafkiel.decorator import run_until_true 3 | from zafkiel.ocr import Keyword 4 | 5 | from tasks.base.page import TPL_CONFIRM_BUTTON 6 | 7 | 8 | class PopupHandler: 9 | # 凭证奖励弹窗 10 | @run_until_true 11 | def handle_bp_reward(self): 12 | rec_template = Template(r"POPUP_BP_FLAG.png", (-0.137, 0.218), Keyword('升级凭证')) 13 | touch_template = Template(r"POPUP_BP_CLAIM.png", (0.137, 0.218), Keyword('领取奖励')) 14 | if find_click(rec_template, timeout=0, touch_template=touch_template): 15 | return find_click(TPL_CONFIRM_BUTTON) 16 | 17 | # 活动通知弹窗 18 | @staticmethod 19 | def handle_login_event(): 20 | rec_template = Template(r"POPUP_EVENT_FLAG.png", (0.0, 0.24)) 21 | touch_template = Template(r"POPUP_MARGIN.png", (0.467, -0.252)) 22 | return find_click(rec_template, timeout=0, touch_template=touch_template, blind=True) 23 | 24 | # 不定时的七日登录奖励 25 | @run_until_true 26 | def handle_7day_reward(self): 27 | if find_click(Template(r"7DAY_REWARD_CLAIM.png", (0.084, 0.234)), timeout=0): 28 | # if find_click(Template(r"7DAY_REWARD_CONFIRM.png", (-0.001, 0.145)), timeout=3): 29 | if find_click(TPL_CONFIRM_BUTTON, timeout=3): 30 | return True 31 | return False 32 | 33 | # 每日签到奖励 34 | @run_until_true 35 | def handle_signin_reward(self): 36 | if find_click(Template(r"SIGNIN_REWARD_CLAIM.png", (0.083, 0.248)), timeout=0): 37 | if find_click(Template(r"SIGNIN_REWARD_CONFIRM.png", (-0.001, 0.134)), timeout=3): 38 | return True 39 | return False 40 | 41 | # 游戏公告,最近好像不弹了 42 | # @run_until_true 43 | # def handle_notice(self): 44 | # rec_template = Template(r"assets/NOTICE_FLAG.png", record_pos=(-0.391, -0.194), resolution=(1280, 720), 45 | # rgb=True) 46 | # touch_template = Template(r"assets/NOTICE_CLOSE.png", record_pos=(0.431, -0.22), resolution=(1280, 720)) 47 | # return find_click(rec_template, timeout=0.5, touch_template=touch_template) 48 | 49 | # 深渊结算弹窗 50 | @run_until_true 51 | def handle_abyss_settle(self): 52 | if exists(Template(r"ABYSS_SETTLE.png", (0.019, 0.147), Keyword('结算奖励')), ocr_mode=1): 53 | sleep(0.5) 54 | touch(Template(r"POPUP_MARGIN.png", (0.467, -0.252)), blind=True) 55 | return True 56 | return False 57 | 58 | # 月卡奖励 59 | @run_until_true 60 | def handle_monthly_card(self): 61 | if find_click(Template(r"MONTHLY_CARD_CLAIM.png", (0.082, 0.234)), timeout=0): 62 | if find_click(TPL_CONFIRM_BUTTON, timeout=3): 63 | return True 64 | return False 65 | 66 | 67 | popup_handler = PopupHandler() 68 | popup_list = [popup_handler.handle_login_event, popup_handler.handle_7day_reward, popup_handler.handle_signin_reward, 69 | popup_handler.handle_abyss_settle, popup_handler.handle_bp_reward, popup_handler.handle_monthly_card] 70 | -------------------------------------------------------------------------------- /tasks/base/switch.py: -------------------------------------------------------------------------------- 1 | from zafkiel import Template 2 | from zafkiel.ocr import Keyword 3 | from zafkiel.ui import Switch 4 | 5 | # BP任务界面 6 | TPL_BP_MISSIONS_TAB = Template(r"BP_MISSIONS_TAB.png", (-0.227, 0.257)) 7 | TPL_BP_REWARDS_TAB = Template(r"BP_REWARDS_TAB.png", (-0.273, -0.044)) 8 | TPL_BP_SHOP_TAB = Template(r"BP_SHOP_TAB.png", (-0.391, 0.034), Keyword('作战工坊')) 9 | TPL_GOTO_BP_MISSIONS = Template(r"GOTO_BP_MISSIONS.png", (-0.417, -0.171), Keyword('作战任务')) 10 | TPL_GOTO_BP_REWARDS = Template(r"GOTO_BP_REWARD.png", (-0.419, 0.008), Keyword('作战奖励')) 11 | TPL_GOTO_BP_SHOP = Template(r"GOTO_BP_SHOP.png", (-0.418, -0.029), Keyword('作战商店')) 12 | 13 | switch_missions = Switch('switch_missions', is_selector=True) 14 | switch_missions.add_state('BP_MISSIONS_TAB', TPL_BP_MISSIONS_TAB, TPL_GOTO_BP_MISSIONS) 15 | switch_missions.add_state('BP_REWARDS_TAB', TPL_BP_REWARDS_TAB, TPL_GOTO_BP_REWARDS) 16 | switch_missions.add_state('BP_SHOP_TAB', TPL_BP_SHOP_TAB, TPL_GOTO_BP_SHOP) 17 | 18 | 19 | # 远征界面 20 | TPL_EXPEDITION_FRAG_TAB = Template(r"EXPEDITION_FRAG_TAB.png", (0.369, -0.196), rgb=True) 21 | TPL_EXPEDITION_MATL_TAB = Template(r"EXPEDITION_MATL_TAB.png", (0.37, -0.135), rgb=True) 22 | TPL_MATL_GOTO_FRAG = Template(r"MATL_GOTO_FRAG.png", (0.369, -0.197), rgb=True) 23 | TPL_FRAG_GOTO_MATL = Template(r"FRAG_GOTO_MATL.png", (0.369, -0.136), rgb=True) 24 | 25 | switch_expeditions = Switch('switch_expeditions', is_selector=True) 26 | switch_expeditions.add_state('EXPEDITION_FRAG_TAB', TPL_EXPEDITION_FRAG_TAB, TPL_MATL_GOTO_FRAG) 27 | switch_expeditions.add_state('EXPEDITION_MATL_TAB', TPL_EXPEDITION_MATL_TAB, TPL_FRAG_GOTO_MATL) 28 | 29 | 30 | # 作战界面 31 | TPL_BATTLE_RECOMMEND_TAB = Template(r"BATTLE_RECOMMEND_TAB.png", (-0.257, -0.2), rgb=True) 32 | TPL_BATTLE_ATTACK_TAB = Template(r"BATTLE_ATTACK_TAB.png", (-0.12, -0.201), rgb=True) 33 | TPL_BATTLE_CHALLENGE_TAB = Template(r"BATTLE_CHALLENGE_TAB.png", (0.023, -0.2), rgb=True) 34 | TPL_BATTLE_EVENT_TAB = Template(r"BATTLE_EVENT_TAB.png", (0.16, -0.199), rgb=True) 35 | TPL_GOTO_RECOMMEND = Template(r"GOTO_RECOMMEND.png", (-0.192, -0.202), Keyword('推荐')) 36 | TPL_GOTO_ATTACK = Template(r"GOTO_ATTACK.png", (-0.072, -0.202), Keyword('出击')) 37 | TPL_GOTO_CHALLENGE = Template(r"GOTO_CHALLENGE.png", (0.066, -0.202), Keyword('挑战')) 38 | TPL_GOTO_EVENT = Template(r"GOTO_EVENT.png", (0.199, -0.202), Keyword('活动')) 39 | 40 | switch_battle = Switch('switch_battle', is_selector=True) 41 | switch_battle.add_state('BATTLE_RECOMMEND_TAB', TPL_BATTLE_RECOMMEND_TAB, TPL_GOTO_RECOMMEND) 42 | switch_battle.add_state('BATTLE_ATTACK_TAB', TPL_BATTLE_ATTACK_TAB, TPL_GOTO_ATTACK) 43 | switch_battle.add_state('BATTLE_CHALLENGE_TAB', TPL_BATTLE_CHALLENGE_TAB, TPL_GOTO_CHALLENGE) 44 | switch_battle.add_state('BATTLE_EVENT_TAB', TPL_BATTLE_EVENT_TAB, TPL_GOTO_EVENT) 45 | -------------------------------------------------------------------------------- /tasks/dorm_bonus.py: -------------------------------------------------------------------------------- 1 | from zafkiel import Template, logger, find_click, screenshot 2 | from zafkiel.ocr import Digit 3 | from zafkiel.ui import UI 4 | 5 | from config import Config 6 | from tasks.base.page import page_dorm 7 | 8 | 9 | class DormBonus(UI): 10 | def __init__(self, config: Config = None): 11 | self.config = config 12 | 13 | def claim_stamina(self): 14 | logger.info('Start claiming dorm stamina') 15 | self.ui_ensure(page_dorm) 16 | if find_click(Template(r"DORM_STAMINA.png", (-0.34, -0.059))): 17 | # 取存储的体力 18 | ocr = Digit(Template(r"DORM_STAMINA_SURPLUS.png", (-0.025, 0.077))) 19 | if ocr.ocr_single_line(screenshot()) > 0: 20 | find_click(Template(r"CLAIM_STAMINA.png", (0.092, 0.156)), times=2) 21 | logger.info('Dorm stamina claim completed') 22 | return 23 | find_click(Template(r"DORM_STAMINA_CLOSE.png", (0.349, -0.181))) 24 | 25 | def claim_gold(self): 26 | logger.info('Start claiming dorm gold') 27 | self.ui_ensure(page_dorm) 28 | if find_click(Template(r"DORM_GOLD.png", (-0.216, -0.071)), times=2): 29 | logger.info('Dorm gold claim completed') 30 | 31 | def run(self): 32 | self.claim_gold() 33 | self.claim_stamina() 34 | -------------------------------------------------------------------------------- /tasks/errand.py: -------------------------------------------------------------------------------- 1 | from zafkiel import Template, logger, Timer, find_click, exists 2 | from zafkiel.exception import LoopError 3 | from zafkiel.ocr import Keyword 4 | from zafkiel.ui import UI 5 | 6 | from config import Config 7 | from tasks.base.page import TPL_RETURN_BUTTON, page_errands, TPL_CONFIRM_BUTTON 8 | 9 | 10 | class Errand(UI): 11 | def __init__(self, config: Config = None): 12 | self.config = config 13 | 14 | @staticmethod 15 | def dispatch(): 16 | loop_timer = Timer(0, 10).start() 17 | while True: 18 | if loop_timer.reached(): 19 | raise LoopError('The operation has looped too many times') 20 | 21 | find_click(Template(r"QUICK_ERRAND.png", (0.283, 0.251), Keyword('一键打工'))) 22 | 23 | if find_click(Template(r"QUICK_ERRAND_CONFIRM.png", (0.141, 0.204), Keyword('一键打工'), rgb=True)): 24 | if not find_click(Template(r"ERRAND_S+_CONFIRM.png", (0.136, 0.117), Keyword('确定')), times=2): 25 | find_click(TPL_RETURN_BUTTON) 26 | logger.info('Errand dispatch completed') 27 | break 28 | if exists(Template(r"ERRAND_DISABLE.png", (0.141, 0.203), rgb=True)): 29 | find_click(Template(r"ERRAND_CANCEL.png", (-0.141, 0.204), Keyword('取消'))) 30 | logger.info('No place available for dispatch') 31 | break 32 | 33 | @staticmethod 34 | def claim_rewards(): 35 | loop_timer = Timer(0, 10).start() 36 | while True: 37 | if exists(Template(r"ERRAND_REWARD_DONE.png", (0.42, 0.249), rgb=True)): 38 | logger.info('Errand rewards claim completed') 39 | break 40 | 41 | if loop_timer.reached(): 42 | raise LoopError('The operation has looped too many times') 43 | 44 | find_click(Template(r"ERRAND_REWARD_CLAIM.png", (0.419, 0.25), Keyword('领取奖励'), rgb=True)) 45 | find_click(TPL_CONFIRM_BUTTON) 46 | 47 | def run(self): 48 | self.ui_ensure(page_errands) 49 | self.claim_rewards() 50 | self.dispatch() 51 | 52 | -------------------------------------------------------------------------------- /tasks/expedition.py: -------------------------------------------------------------------------------- 1 | from zafkiel import Template, Timer, logger, find_click, exists 2 | from zafkiel.exception import LoopError 3 | from zafkiel.ocr import Ocr, Keyword 4 | from zafkiel.ui import UI 5 | 6 | from config import Config 7 | from tasks.base.page import page_expeditions, TPL_CONFIRM_BUTTON 8 | from tasks.base.switch import TPL_EXPEDITION_MATL_TAB, TPL_EXPEDITION_FRAG_TAB 9 | 10 | 11 | class Expeditions(UI): 12 | def __init__(self, config: Config = None): 13 | self.config = config 14 | 15 | # 远征派遣 16 | @staticmethod 17 | def dispatch(): 18 | loop_timer = Timer(0, 10).start() 19 | while True: 20 | if loop_timer.reached(): 21 | raise LoopError('The operation has looped too many times') 22 | 23 | find_click(Template(r"QUICK_EXPEDITION.png", (0.409, 0.237), Keyword('一键远征'))) 24 | if exists(Template(r"EXPEDITION_NOT_AVAILABLE.png", (0.209, -0.045), Keyword('次数不足')), ocr_mode=1): 25 | find_click(Template(r"EXPEDITION_CANCEL.png", (-0.141, 0.205), Keyword('取消派遣'))) 26 | break 27 | if find_click(Template(r"EXPEDITION_DISPATCH.png", (0.14, 0.205), Keyword('远征派遣')), times=2): 28 | if find_click(Template(r"CLAIM_STAMINA.png", (0.092, 0.156), Keyword('取出体力')), times=2): 29 | find_click(Template(r"EXPEDITION_DISPATCH.png", (0.14, 0.205), Keyword('远征派遣')), times=2) 30 | logger.info('Expedition dispatch completed') 31 | break 32 | 33 | # 领前一天远征奖励 TODO: 记录远征类型 34 | def claim_rewards(self): 35 | TPL_EXPEDITION_COMPLETED = Template(r"EXPEDITION_COMPLETED.png", (0.237, -0.09), Keyword('完成远征')) 36 | if not exists(TPL_EXPEDITION_COMPLETED, timeout=1): 37 | current_state = self.ui_get_current_state(self.ui_get_current_page().switch) 38 | another_state = TPL_EXPEDITION_MATL_TAB if current_state == TPL_EXPEDITION_FRAG_TAB.name \ 39 | else TPL_EXPEDITION_FRAG_TAB 40 | self.ui_goto(page_expeditions, another_state) 41 | if find_click(TPL_EXPEDITION_COMPLETED): 42 | find_click(TPL_CONFIRM_BUTTON) 43 | logger.info('Expedition rewards claim completed') 44 | 45 | def run(self): 46 | self.ui_ensure(page_expeditions) 47 | self.claim_rewards() 48 | self.dispatch() 49 | -------------------------------------------------------------------------------- /tasks/login.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import shutil 3 | import time 4 | from pathlib import Path 5 | import subprocess 6 | 7 | from zafkiel import ( 8 | Template, 9 | logger, 10 | wait, 11 | touch, 12 | stop_app, 13 | auto_setup, 14 | sleep, 15 | exists, 16 | find_click, 17 | ) 18 | from zafkiel.ocr import Keyword 19 | from zafkiel.ui import UI 20 | 21 | from config import Config 22 | from tasks.base.popup import popup_list, popup_handler 23 | from tasks.base.page import page_main 24 | 25 | 26 | class Login(UI): 27 | def __init__(self, config: Config): 28 | self.config = config 29 | 30 | def manage_log(self): 31 | log_retain_map = { 32 | "1day": 1, 33 | "3days": 3, 34 | "1week": 7, 35 | "1month": 30, 36 | } 37 | retain_days = log_retain_map.get( 38 | self.config.data["Project"]["General"]["Game"]["log_retain"], 7 39 | ) 40 | 41 | current_time = time.time() 42 | log_path = Path("./log") 43 | 44 | for log_dir in log_path.iterdir(): 45 | create_time = log_dir.stat().st_ctime 46 | age_in_days = (current_time - create_time) / (24 * 3600) 47 | 48 | if age_in_days > retain_days: 49 | try: 50 | logger.info(f"Deleting old log directory: {log_dir}") 51 | shutil.rmtree(log_dir) 52 | except Exception as e: 53 | logger.error(f"Failed to delete {log_dir}: {e}") 54 | 55 | def handle_app_login(self): 56 | wait( 57 | Template(r"LOGIN_FLAG.png", (0.406, 0.233), rgb=True), 58 | timeout=1200, 59 | interval=3, 60 | interval_func=self.check_update, 61 | ) 62 | touch(Template(r"LOGIN_CLICK.png", (-0.002, -0.031)), times=2, blind=True) 63 | 64 | try: 65 | confirm_time = float( 66 | self.config.data["Daily"]["Login"]["Login"]["confirm_time"] 67 | ) 68 | if confirm_time < 3.0: 69 | confirm_time = 3.0 70 | logger.warning( 71 | "Confirm time was less than 3.0, setting to minimum value of 3.0" 72 | ) 73 | except: 74 | confirm_time = 3.0 75 | logger.warning("Invalid confirm_time in config, using default value of 3.0") 76 | 77 | while True: 78 | if self.ui_additional(): 79 | continue 80 | if popup_handler.handle_abyss_settle(): 81 | continue 82 | if self.ui_page_appear(page_main): 83 | sleep(confirm_time) 84 | if not self.ui_ensure(page_main): 85 | logger.info("Game login successful") 86 | break 87 | 88 | return True 89 | 90 | def app_stop(self): 91 | stop_app() 92 | 93 | def app_start(self): 94 | subprocess.Popen([self.config.data["Project"]["General"]["Game"]["game_path"]]) 95 | date = datetime.datetime.now().strftime("%Y-%m-%d") 96 | auto_setup( 97 | str(Path.cwd()), 98 | logdir=f"./log/{date}/report", 99 | devices=[ 100 | "WindowsPlatform:///?title=崩坏3", 101 | ], 102 | ) 103 | self.manage_log() 104 | self.get_popup_list(popup_list) 105 | 106 | sleep(15) 107 | self.handle_app_login() 108 | 109 | def app_restart(self): 110 | self.app_stop() 111 | self.app_start() 112 | self.handle_app_login() 113 | 114 | @staticmethod 115 | def check_update(): 116 | if exists(Template(r"LOGIN_UPDATE.png", (0.002, -0.129))): 117 | find_click(Template(r"DOWNLOAD_CONFIRM.png", (0.0, 0.116))) 118 | logger.info("Game updating") 119 | if find_click( 120 | Template(r"DOWNLOAD_DONE.png", (0.0, 0.048), Keyword("确定")), 121 | timeout=1200, 122 | ): 123 | logger.info("Game update completed") 124 | -------------------------------------------------------------------------------- /tasks/mail.py: -------------------------------------------------------------------------------- 1 | from zafkiel import Template, logger, Timer, exists, find_click 2 | from zafkiel.exception import LoopError 3 | from zafkiel.ocr import Keyword 4 | from zafkiel.ui import UI 5 | 6 | from config import Config 7 | from tasks.base.page import page_mail, TPL_CONFIRM_BUTTON 8 | 9 | 10 | class Mail(UI): 11 | def __init__(self, config: Config = None): 12 | self.config = config 13 | 14 | def run(self): 15 | self.ui_ensure(page_mail) 16 | 17 | loop_timer = Timer(0, 10).start() 18 | while True: 19 | if loop_timer.reached(): 20 | raise LoopError('The operation has looped too many times') 21 | 22 | if exists(Template(r"NO_MORE_MAIL.png", (-0.449, -0.154), Keyword('已读'))): 23 | logger.info('Mail claim completed') 24 | break 25 | 26 | if find_click(Template(r"MAIL_QUICK_CLAIM.png", (0.42, 0.245), Keyword('一键领取'), rgb=True)): 27 | continue 28 | if find_click(TPL_CONFIRM_BUTTON): 29 | continue 30 | 31 | -------------------------------------------------------------------------------- /tasks/mission.py: -------------------------------------------------------------------------------- 1 | from zafkiel import Template, logger, screenshot, touch, find_click 2 | from zafkiel.ocr import Digit, Keyword 3 | from zafkiel.ui import UI 4 | 5 | from config import Config 6 | from tasks.base.page import page_missions, TPL_CONFIRM_BUTTON, TPL_NEW_ITEM 7 | from tasks.base.popup import popup_list, popup_handler 8 | from tasks.base.switch import TPL_BP_MISSIONS_TAB, TPL_BP_REWARDS_TAB 9 | 10 | 11 | class Missions(UI): 12 | def __init__(self, config: Config = None): 13 | self.config = config 14 | 15 | def claim_bp_rewards(self): 16 | self.ui_goto(page_missions, TPL_BP_REWARDS_TAB) 17 | 18 | # 领凭证奖励 19 | screen = screenshot() 20 | ocr_current_level = Digit(Template(r"CURRENT_BP_LEVEL.png", (-0.29, -0.178))) 21 | current_level = ocr_current_level.ocr_single_line(screen) 22 | logger.info(f'Current BP level: {current_level}') 23 | 24 | ocr_reward_level = Digit(Template(r"REWARD_BP_LEVEL.png", (-0.182, -0.13))) 25 | reward_level = ocr_reward_level.ocr_single_line(screen) 26 | logger.info(f'BP reward level: {reward_level}') 27 | 28 | # TODO:65级以后右端顶到头,领取位置变了 29 | if current_level >= reward_level: 30 | if touch(Template(r"BP_REWARD.png", (-0.179, -0.054)), blind=True): 31 | popup_handler.handle_bp_reward() 32 | find_click(Template(r"BP_REWARD_CONFIRM.png", (0.141, 0.173))) 33 | logger.info('BP rewards claim completed') 34 | 35 | def claim_daily_rewards(self): 36 | self.ui_goto(page_missions, TPL_BP_MISSIONS_TAB) 37 | if find_click(Template(r"QUICK_CLAIM.png", (0.418, -0.187), Keyword('一键领取'), rgb=True), ocr_mode=1): 38 | find_click(TPL_CONFIRM_BUTTON) 39 | logger.info('Daily rewards claim completed') 40 | 41 | ocr = Digit(Template(r"DAILY_BP.png", (-0.273, 0.231))) 42 | daily_bp = ocr.ocr_single_line(screenshot()) 43 | logger.info(f'Daily BP: {daily_bp}') 44 | click = False 45 | if daily_bp >= 600: 46 | click = find_click(Template(r"DAILY_REWARD_600.png", (0.449, 0.241))) 47 | elif daily_bp >= 450: 48 | click = find_click(Template(r"DAILY_REWARD_450.png", (0.312, 0.241))) 49 | elif daily_bp >= 300: 50 | click = find_click(Template(r"DAILY_REWARD_300.png", (0.175, 0.241))) 51 | elif daily_bp >= 200: 52 | click = find_click(Template(r"DAILY_REWARD_200.png", (0.037, 0.241))) 53 | elif daily_bp >= 100: 54 | click = find_click(Template(r"DAILY_REWARD_100.png", (-0.1, 0.241))) 55 | if click: 56 | find_click(TPL_CONFIRM_BUTTON) 57 | 58 | def run(self): 59 | # self.get_popup_list(popup_list) 60 | self.ui_ensure(page_missions) 61 | self.claim_daily_rewards() 62 | self.claim_bp_rewards() 63 | -------------------------------------------------------------------------------- /tasks/sweep.py: -------------------------------------------------------------------------------- 1 | from zafkiel import Template, logger, Timer, find_click, exists 2 | from zafkiel.exception import LoopError 3 | from zafkiel.ocr import Keyword 4 | from zafkiel.ui import UI 5 | 6 | from config import Config 7 | from tasks.base.page import page_battle, page_lite, TPL_CONFIRM_BUTTON 8 | from tasks.base.switch import TPL_BATTLE_ATTACK_TAB 9 | 10 | 11 | class Sweep(UI): 12 | def __init__(self, config: Config = None): 13 | self.config = config 14 | 15 | def run(self): 16 | self.ui_ensure(page_battle, TPL_BATTLE_ATTACK_TAB) 17 | self.ui_goto(page_lite) 18 | 19 | if not exists(Template(r"QUICK_LITE.png", (0.41, 0.241), Keyword('一键减负'))): 20 | logger.info('Material sweep already completed') 21 | return 22 | 23 | loop_timer = Timer(0, 10).start() 24 | while True: 25 | if loop_timer.reached(): 26 | raise LoopError('The operation has looped too many times') 27 | 28 | find_click(Template(r"QUICK_LITE.png", (0.41, 0.241), Keyword('一键减负'))) 29 | find_click(Template(r"LITE_BUTTON.png", (0.0, 0.133), Keyword('减负'))) 30 | if find_click(TPL_CONFIRM_BUTTON): 31 | logger.info('Material sweep completed') 32 | break 33 | 34 | -------------------------------------------------------------------------------- /tasks/weekly_reward.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import time 3 | 4 | from zafkiel import Template, exists, find_click, touch, logger 5 | from zafkiel.ocr import Keyword 6 | from zafkiel.ui import UI 7 | 8 | from config import Config 9 | from tasks.base.page import ( 10 | TPL_RETURN_BUTTON, 11 | page_missions, 12 | TPL_CONFIRM_BUTTON, 13 | page_main, 14 | TPL_NEW_ITEM, 15 | page_armada_contribution, 16 | ) 17 | from tasks.base.popup import popup_handler 18 | from tasks.base.switch import TPL_BP_MISSIONS_TAB, TPL_BP_REWARDS_TAB 19 | 20 | 21 | class WeeklyReward(UI): 22 | def __init__(self, config: Config): 23 | self.config = config 24 | 25 | now = datetime.datetime.now() 26 | monday = now - datetime.timedelta(days=now.weekday()) 27 | self.monday_4am = monday.replace( 28 | hour=4, minute=0, second=0, microsecond=0 29 | ).timestamp() 30 | 31 | def share(self): 32 | if not self.config.data["Weekly"]["WeeklyReward"]["WeeklyEvent"]["share"]: 33 | return 34 | 35 | if ( 36 | self.config.data["Weekly"]["WeeklyReward"]["WeeklyEvent"]["share_time"] 37 | > self.monday_4am 38 | ): 39 | logger.info("Weekly sharing already completed") 40 | return 41 | 42 | self.ui_ensure(page_missions, TPL_BP_MISSIONS_TAB) 43 | if exists(Template(r"WEEKLY_SHARE.png", (-0.196, -0.134), Keyword("每周分享"))): 44 | find_click(Template(r"GOTO_SHARE.png", (0.013, -0.083), Keyword("前往"))) 45 | touch(Template(r"SHARE_ITEM.png", (-0.199, -0.095)), blind=True) 46 | find_click(Template(r"SHARE_BUTTON.png", (-0.35, 0.222)), times=2) 47 | find_click(TPL_RETURN_BUTTON) 48 | logger.info("Weekly sharing completed") 49 | else: 50 | # 若已经手动完成 51 | logger.info("Weekly sharing already completed") 52 | self.config.update( 53 | "Weekly", "WeeklyReward", "WeeklyEvent", "share_time", time.time() 54 | ) 55 | 56 | def homo_chest(self): 57 | if not self.config.data["Weekly"]["WeeklyReward"]["WeeklyEvent"]["homo_chest"]: 58 | return 59 | 60 | if ( 61 | self.config.data["Weekly"]["WeeklyReward"]["WeeklyEvent"]["homo_chest_time"] 62 | > self.monday_4am 63 | ): 64 | logger.info("Weekly homo chest already claimed") 65 | return 66 | 67 | self.ui_ensure(page_main) 68 | find_click(Template(r"MAIN_GOTO_MALL.png", (-0.423, 0.076))) 69 | find_click(Template(r"GOTO_GIFT.png", (-0.355, -0.123), Keyword("礼包"))) 70 | find_click(Template(r"GOTO_WEEKLY_GIFT.png", (-0.355, -0.005), Keyword("周期"))) 71 | if find_click( 72 | Template(r"BUY_HOMO_CHEST.png", (-0.207, 0.041), Keyword("免费")) 73 | ): 74 | find_click( 75 | Template(r"HOMO_CHEST_CONFIRM.png", (-0.002, 0.18), Keyword("免费")) 76 | ) 77 | find_click(TPL_CONFIRM_BUTTON) 78 | logger.info("Weekly homo chest claim completed") 79 | else: 80 | logger.info("Weekly homo chest already claimed") 81 | self.config.update( 82 | "Weekly", "WeeklyReward", "WeeklyEvent", "homo_chest_time", time.time() 83 | ) 84 | find_click(TPL_RETURN_BUTTON) 85 | 86 | def bp_chest(self): 87 | if not self.config.data["Weekly"]["WeeklyReward"]["WeeklyEvent"]["bp_chest"]: 88 | return 89 | 90 | if ( 91 | self.config.data["Weekly"]["WeeklyReward"]["WeeklyEvent"]["bp_chest_time"] 92 | > self.monday_4am 93 | ): 94 | logger.info("Weekly bp chest already claimed") 95 | return 96 | 97 | self.ui_ensure(page_missions, TPL_BP_REWARDS_TAB) 98 | if find_click( 99 | Template(r"BP_CHEST_TEXT.png", (0.411, 0.197), Keyword("作战历练箱")), 100 | Template(r"BP_CHEST.png", (0.334, 0.203)), 101 | blind=True, 102 | ): 103 | find_click(TPL_NEW_ITEM, timeout=2) 104 | find_click(TPL_CONFIRM_BUTTON) 105 | popup_handler.handle_bp_reward() 106 | logger.info("Weekly bp chest claim completed") 107 | else: 108 | logger.info("Weekly bp chest already claimed") 109 | self.config.update( 110 | "Weekly", "WeeklyReward", "WeeklyEvent", "bp_chest_time", time.time() 111 | ) 112 | 113 | def armada_contribution_reward(self): 114 | if not self.config.data["Weekly"]["WeeklyReward"]["WeeklyEvent"][ 115 | "armada_contribution" 116 | ]: 117 | return 118 | 119 | if ( 120 | self.config.data["Weekly"]["WeeklyReward"]["WeeklyEvent"][ 121 | "armada_contribution_time" 122 | ] 123 | > self.monday_4am 124 | ): 125 | logger.info("Armada contribution reward already claimed") 126 | return 127 | 128 | self.ui_ensure(page_armada_contribution) 129 | if exists(Template(r"CONTRIBUTION_FULL.png", (-0.325, -0.123))): 130 | find_click(Template(r"CONTRIBUTION_REWARD.png", (-0.442, -0.122))) 131 | find_click(TPL_CONFIRM_BUTTON) 132 | self.config.update( 133 | "Weekly", 134 | "WeeklyReward", 135 | "WeeklyEvent", 136 | "armada_contribution_time", 137 | time.time(), 138 | ) 139 | logger.info("Armada contribution reward claim completed") 140 | elif exists(Template(r"CONTRIBUTION_CLAIMED.png", (-0.324, -0.122))): 141 | self.config.update( 142 | "Weekly", 143 | "WeeklyReward", 144 | "WeeklyEvent", 145 | "armada_contribution_time", 146 | time.time(), 147 | ) 148 | logger.info("Armada contribution reward already claimed") 149 | else: 150 | logger.info("Armada contribution reward not available") 151 | 152 | def run(self): 153 | self.share() 154 | self.homo_chest() 155 | self.bp_chest() 156 | self.armada_contribution_reward() 157 | -------------------------------------------------------------------------------- /templates/7DAY_REWARD_CLAIM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/7DAY_REWARD_CLAIM.png -------------------------------------------------------------------------------- /templates/7DAY_REWARD_CONFIRM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/7DAY_REWARD_CONFIRM.png -------------------------------------------------------------------------------- /templates/ABYSS_SETTLE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ABYSS_SETTLE.png -------------------------------------------------------------------------------- /templates/ARMADA_CONTRIBUTION_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ARMADA_CONTRIBUTION_FLAG.png -------------------------------------------------------------------------------- /templates/ARMADA_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ARMADA_FLAG.png -------------------------------------------------------------------------------- /templates/ARMADA_GOTO_COMMISSION.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ARMADA_GOTO_COMMISSION.png -------------------------------------------------------------------------------- /templates/ARMADA_GOTO_CONTRIBUTION.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ARMADA_GOTO_CONTRIBUTION.png -------------------------------------------------------------------------------- /templates/ARMADA_REWARD_CLAIM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ARMADA_REWARD_CLAIM.png -------------------------------------------------------------------------------- /templates/ARMADA_REWARD_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ARMADA_REWARD_FLAG.png -------------------------------------------------------------------------------- /templates/ARMADA_REWARD_TAB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ARMADA_REWARD_TAB.png -------------------------------------------------------------------------------- /templates/BATTLE_ATTACK_TAB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BATTLE_ATTACK_TAB.png -------------------------------------------------------------------------------- /templates/BATTLE_CHALLENGE_TAB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BATTLE_CHALLENGE_TAB.png -------------------------------------------------------------------------------- /templates/BATTLE_EVENT_TAB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BATTLE_EVENT_TAB.png -------------------------------------------------------------------------------- /templates/BATTLE_GOTO_LITE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BATTLE_GOTO_LITE.png -------------------------------------------------------------------------------- /templates/BATTLE_RECOMMEND_TAB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BATTLE_RECOMMEND_TAB.png -------------------------------------------------------------------------------- /templates/BP_CHEST.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BP_CHEST.png -------------------------------------------------------------------------------- /templates/BP_CHEST_CLAIM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BP_CHEST_CLAIM.png -------------------------------------------------------------------------------- /templates/BP_CHEST_TEXT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BP_CHEST_TEXT.png -------------------------------------------------------------------------------- /templates/BP_MISSIONS_TAB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BP_MISSIONS_TAB.png -------------------------------------------------------------------------------- /templates/BP_REWARD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BP_REWARD.png -------------------------------------------------------------------------------- /templates/BP_REWARDS_TAB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BP_REWARDS_TAB.png -------------------------------------------------------------------------------- /templates/BP_REWARD_CONFIRM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BP_REWARD_CONFIRM.png -------------------------------------------------------------------------------- /templates/BP_SHOP_TAB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BP_SHOP_TAB.png -------------------------------------------------------------------------------- /templates/BUY_HOMO_CHEST.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/BUY_HOMO_CHEST.png -------------------------------------------------------------------------------- /templates/CLAIM_STAMINA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/CLAIM_STAMINA.png -------------------------------------------------------------------------------- /templates/COMMISSION_ACCEPT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_ACCEPT.png -------------------------------------------------------------------------------- /templates/COMMISSION_BUY.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_BUY.png -------------------------------------------------------------------------------- /templates/COMMISSION_COUNT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_COUNT.png -------------------------------------------------------------------------------- /templates/COMMISSION_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_FLAG.png -------------------------------------------------------------------------------- /templates/COMMISSION_GOTO_REWARD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_GOTO_REWARD.png -------------------------------------------------------------------------------- /templates/COMMISSION_LACK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_LACK.png -------------------------------------------------------------------------------- /templates/COMMISSION_MAX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_MAX.png -------------------------------------------------------------------------------- /templates/COMMISSION_PUT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_PUT.png -------------------------------------------------------------------------------- /templates/COMMISSION_REQUEST.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_REQUEST.png -------------------------------------------------------------------------------- /templates/COMMISSION_REQUEST_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_REQUEST_FLAG.png -------------------------------------------------------------------------------- /templates/COMMISSION_SUBMIT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_SUBMIT.png -------------------------------------------------------------------------------- /templates/COMMISSION_SUBMIT_CONFIRM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_SUBMIT_CONFIRM.png -------------------------------------------------------------------------------- /templates/COMMISSION_SUBMIT_LACK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/COMMISSION_SUBMIT_LACK.png -------------------------------------------------------------------------------- /templates/CONFIRM_BUTTON.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/CONFIRM_BUTTON.png -------------------------------------------------------------------------------- /templates/CONTRIBUTION_CLAIMED.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/CONTRIBUTION_CLAIMED.png -------------------------------------------------------------------------------- /templates/CONTRIBUTION_FULL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/CONTRIBUTION_FULL.png -------------------------------------------------------------------------------- /templates/CONTRIBUTION_REWARD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/CONTRIBUTION_REWARD.png -------------------------------------------------------------------------------- /templates/CURRENT_BP_LEVEL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/CURRENT_BP_LEVEL.png -------------------------------------------------------------------------------- /templates/DAILY_BP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DAILY_BP.png -------------------------------------------------------------------------------- /templates/DAILY_REWARD_100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DAILY_REWARD_100.png -------------------------------------------------------------------------------- /templates/DAILY_REWARD_200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DAILY_REWARD_200.png -------------------------------------------------------------------------------- /templates/DAILY_REWARD_300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DAILY_REWARD_300.png -------------------------------------------------------------------------------- /templates/DAILY_REWARD_450.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DAILY_REWARD_450.png -------------------------------------------------------------------------------- /templates/DAILY_REWARD_600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DAILY_REWARD_600.png -------------------------------------------------------------------------------- /templates/DORM_GOLD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DORM_GOLD.png -------------------------------------------------------------------------------- /templates/DORM_GOTO_ERRANDS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DORM_GOTO_ERRANDS.png -------------------------------------------------------------------------------- /templates/DORM_GOTO_EXPEDITIONS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DORM_GOTO_EXPEDITIONS.png -------------------------------------------------------------------------------- /templates/DORM_GOTO_SHOP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DORM_GOTO_SHOP.png -------------------------------------------------------------------------------- /templates/DORM_STAMINA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DORM_STAMINA.png -------------------------------------------------------------------------------- /templates/DORM_STAMINA_CLOSE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DORM_STAMINA_CLOSE.png -------------------------------------------------------------------------------- /templates/DORM_STAMINA_SURPLUS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DORM_STAMINA_SURPLUS.png -------------------------------------------------------------------------------- /templates/DOWNLOAD_CONFIRM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DOWNLOAD_CONFIRM.png -------------------------------------------------------------------------------- /templates/DOWNLOAD_DONE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/DOWNLOAD_DONE.png -------------------------------------------------------------------------------- /templates/ERRANDS_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ERRANDS_FLAG.png -------------------------------------------------------------------------------- /templates/ERRAND_CANCEL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ERRAND_CANCEL.png -------------------------------------------------------------------------------- /templates/ERRAND_DISABLE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ERRAND_DISABLE.png -------------------------------------------------------------------------------- /templates/ERRAND_REWARD_CLAIM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ERRAND_REWARD_CLAIM.png -------------------------------------------------------------------------------- /templates/ERRAND_REWARD_DONE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ERRAND_REWARD_DONE.png -------------------------------------------------------------------------------- /templates/ERRAND_S+_CONFIRM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/ERRAND_S+_CONFIRM.png -------------------------------------------------------------------------------- /templates/EXPEDITION_CANCEL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/EXPEDITION_CANCEL.png -------------------------------------------------------------------------------- /templates/EXPEDITION_COMPLETED.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/EXPEDITION_COMPLETED.png -------------------------------------------------------------------------------- /templates/EXPEDITION_DISPATCH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/EXPEDITION_DISPATCH.png -------------------------------------------------------------------------------- /templates/EXPEDITION_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/EXPEDITION_FLAG.png -------------------------------------------------------------------------------- /templates/EXPEDITION_FRAG_TAB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/EXPEDITION_FRAG_TAB.png -------------------------------------------------------------------------------- /templates/EXPEDITION_MATL_TAB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/EXPEDITION_MATL_TAB.png -------------------------------------------------------------------------------- /templates/EXPEDITION_NOT_AVAILABLE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/EXPEDITION_NOT_AVAILABLE.png -------------------------------------------------------------------------------- /templates/FRAG_GOTO_MATL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/FRAG_GOTO_MATL.png -------------------------------------------------------------------------------- /templates/GOTO_ATTACK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/GOTO_ATTACK.png -------------------------------------------------------------------------------- /templates/GOTO_BP_MISSIONS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/GOTO_BP_MISSIONS.png -------------------------------------------------------------------------------- /templates/GOTO_BP_REWARD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/GOTO_BP_REWARD.png -------------------------------------------------------------------------------- /templates/GOTO_BP_SHOP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/GOTO_BP_SHOP.png -------------------------------------------------------------------------------- /templates/GOTO_CHALLENGE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/GOTO_CHALLENGE.png -------------------------------------------------------------------------------- /templates/GOTO_EVENT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/GOTO_EVENT.png -------------------------------------------------------------------------------- /templates/GOTO_GIFT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/GOTO_GIFT.png -------------------------------------------------------------------------------- /templates/GOTO_RECOMMEND.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/GOTO_RECOMMEND.png -------------------------------------------------------------------------------- /templates/GOTO_SHARE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/GOTO_SHARE.png -------------------------------------------------------------------------------- /templates/GOTO_WEEKLY_GIFT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/GOTO_WEEKLY_GIFT.png -------------------------------------------------------------------------------- /templates/HOME_BUTTON.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/HOME_BUTTON.png -------------------------------------------------------------------------------- /templates/HOMO_CHEST_CONFIRM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/HOMO_CHEST_CONFIRM.png -------------------------------------------------------------------------------- /templates/LITE_BUTTON.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/LITE_BUTTON.png -------------------------------------------------------------------------------- /templates/LITE_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/LITE_FLAG.png -------------------------------------------------------------------------------- /templates/LOGIN_CLICK.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/LOGIN_CLICK.png -------------------------------------------------------------------------------- /templates/LOGIN_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/LOGIN_FLAG.png -------------------------------------------------------------------------------- /templates/LOGIN_UPDATE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/LOGIN_UPDATE.png -------------------------------------------------------------------------------- /templates/MAIL_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MAIL_FLAG.png -------------------------------------------------------------------------------- /templates/MAIL_QUICK_CLAIM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MAIL_QUICK_CLAIM.png -------------------------------------------------------------------------------- /templates/MAIN_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MAIN_FLAG.png -------------------------------------------------------------------------------- /templates/MAIN_GOTO_ARMADA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MAIN_GOTO_ARMADA.png -------------------------------------------------------------------------------- /templates/MAIN_GOTO_BATTLE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MAIN_GOTO_BATTLE.png -------------------------------------------------------------------------------- /templates/MAIN_GOTO_DORM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MAIN_GOTO_DORM.png -------------------------------------------------------------------------------- /templates/MAIN_GOTO_MAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MAIN_GOTO_MAIL.png -------------------------------------------------------------------------------- /templates/MAIN_GOTO_MALL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MAIN_GOTO_MALL.png -------------------------------------------------------------------------------- /templates/MAIN_GOTO_MISSIONS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MAIN_GOTO_MISSIONS.png -------------------------------------------------------------------------------- /templates/MATL_GOTO_FRAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MATL_GOTO_FRAG.png -------------------------------------------------------------------------------- /templates/MONTHLY_CARD_CLAIM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/MONTHLY_CARD_CLAIM.png -------------------------------------------------------------------------------- /templates/NEW_HOME_BUTTON.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/NEW_HOME_BUTTON.png -------------------------------------------------------------------------------- /templates/NEW_ITEM_POPUP.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/NEW_ITEM_POPUP.png -------------------------------------------------------------------------------- /templates/NOTICE_CLOSE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/NOTICE_CLOSE.png -------------------------------------------------------------------------------- /templates/NOTICE_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/NOTICE_FLAG.png -------------------------------------------------------------------------------- /templates/NO_MORE_MAIL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/NO_MORE_MAIL.png -------------------------------------------------------------------------------- /templates/POPUP_BP_CLAIM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/POPUP_BP_CLAIM.png -------------------------------------------------------------------------------- /templates/POPUP_BP_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/POPUP_BP_FLAG.png -------------------------------------------------------------------------------- /templates/POPUP_EVENT_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/POPUP_EVENT_FLAG.png -------------------------------------------------------------------------------- /templates/POPUP_MARGIN.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/POPUP_MARGIN.png -------------------------------------------------------------------------------- /templates/QUICK_CLAIM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/QUICK_CLAIM.png -------------------------------------------------------------------------------- /templates/QUICK_DISPATCH.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/QUICK_DISPATCH.png -------------------------------------------------------------------------------- /templates/QUICK_ERRAND.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/QUICK_ERRAND.png -------------------------------------------------------------------------------- /templates/QUICK_ERRAND_CONFIRM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/QUICK_ERRAND_CONFIRM.png -------------------------------------------------------------------------------- /templates/QUICK_EXPEDITION.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/QUICK_EXPEDITION.png -------------------------------------------------------------------------------- /templates/QUICK_LITE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/QUICK_LITE.png -------------------------------------------------------------------------------- /templates/RETURN_BUTTON.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/RETURN_BUTTON.png -------------------------------------------------------------------------------- /templates/REWARD_BP_LEVEL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/REWARD_BP_LEVEL.png -------------------------------------------------------------------------------- /templates/SHARE_BUTTON.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/SHARE_BUTTON.png -------------------------------------------------------------------------------- /templates/SHARE_ITEM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/SHARE_ITEM.png -------------------------------------------------------------------------------- /templates/SHOP_FLAG.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/SHOP_FLAG.png -------------------------------------------------------------------------------- /templates/SIGNIN_REWARD_CLAIM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/SIGNIN_REWARD_CLAIM.png -------------------------------------------------------------------------------- /templates/SIGNIN_REWARD_CONFIRM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/SIGNIN_REWARD_CONFIRM.png -------------------------------------------------------------------------------- /templates/WEEKLY_SHARE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aues6uen11Z/HonkaiHelper/6e79cece4bf5eb29a6d2f9127fe3d3d5304a1420/templates/WEEKLY_SHARE.png --------------------------------------------------------------------------------