├── .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 | 
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 | 
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
--------------------------------------------------------------------------------