Skip to content

Commit 2b2f3d2

Browse files
authored
feat: 技能多优先级和技能黑名单 (#128)
* fix(parse.py): 修复了带〇的技能无法被正确识别的问题 * fix(parse.py): 修复了技能模糊识别时,目标技能列表移除错误的问题 * style(parse.py): 将部分变量名标注地更清晰 * style(parse.py): 将部分变量名标注地更清晰 * style(parse.py): 优化了寻找技能优先级的循环 * feat(TaskEditModal.vue): test adding new text boxes * feat(.gitignore): forbid .pyc files * feat(TaskEditModal.vue): 前端允许添加多优先级技能学习, 允许添加技能黑名单 * feat(context.py-task.py-cultivate.py-parse.py-index.html): 后端实现了多技能优先级和技能黑名单功能 * feat(TaskEditModal.vue-index.html): 允许保存和加载预设时包含额外训练权重 * fix(TaskEditModal.vue-index.html): 修复了提交任务是有技能输入框为空导致的问题;修复了输入的技能中存在空格导致的问题 * fix(TaskEditModal.vue-index.html): 修复了赋值错误导致三年的技能额外权重始终相等的问题
1 parent a509e25 commit 2b2f3d2

File tree

10 files changed

+198
-42
lines changed

10 files changed

+198
-42
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
*.pyc
12
venv
23
.idea
34
userdata
45
**/__pycache__
5-
.vscode
6+
.vscode

module/umamusume/context.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,8 @@ class CultivateContextDetail:
144144
follow_support_card_name: str
145145
follow_support_card_level: int
146146
extra_race_list: list[int]
147-
learn_skill_list: list[str]
147+
learn_skill_list: list[list[str]]
148+
learn_skill_blacklist: list[str]
148149
learn_skill_done: bool
149150
learn_skill_selected: bool
150151
cultivate_finish: bool
@@ -165,6 +166,7 @@ def __init__(self):
165166
self.turn_info_history = []
166167
self.extra_race_list = []
167168
self.learn_skill_list = []
169+
self.learn_skill_blacklist = []
168170
self.learn_skill_done = False
169171
self.learn_skill_selected = False
170172
self.cultivate_finish = False
@@ -201,6 +203,7 @@ def build_context(task: UmamusumeTask, ctrl) -> UmamusumeContext:
201203
detail.follow_support_card_level = task.detail.follow_support_card_level
202204
detail.extra_race_list = task.detail.extra_race_list
203205
detail.learn_skill_list = task.detail.learn_skill_list
206+
detail.learn_skill_blacklist = task.detail.learn_skill_blacklist
204207
detail.tactic_list = task.detail.tactic_list
205208
detail.clock_use_limit = task.detail.clock_use_limit
206209
detail.learn_skill_threshold = task.detail.learn_skill_threshold

module/umamusume/script/cultivate_task/cultivate.py

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -344,26 +344,28 @@ def script_cultivate_learn_skill(ctx: UmamusumeContext):
344344
else:
345345
ctx.ctrl.click_by_point(RETURN_TO_CULTIVATE_FINISH)
346346
return
347-
learn_skill_list: list
347+
learn_skill_list: list[list[str]]
348+
learn_skill_blacklist: list[str] = ctx.cultivate_detail.learn_skill_blacklist
348349
if ctx.cultivate_detail.cultivate_finish or not ctx.cultivate_detail.learn_skill_only_user_provided:
349350
if len(ctx.cultivate_detail.learn_skill_list) == 0:
350351
learn_skill_list = SKILL_LEARN_PRIORITY_LIST
351352
else:
352-
learn_skill_list = [ctx.cultivate_detail.learn_skill_list] + SKILL_LEARN_PRIORITY_LIST
353+
#如果用户自定义了技能优先级,那么不再采用预设的优先级
354+
learn_skill_list = ctx.cultivate_detail.learn_skill_list
353355
else:
354356
if len(ctx.cultivate_detail.learn_skill_list) == 0:
355357
ctx.ctrl.click_by_point(RETURN_TO_CULTIVATE_FINISH)
356358
ctx.cultivate_detail.learn_skill_done = True
357359
ctx.cultivate_detail.turn_info.turn_learn_skill_done = True
358360
return
359361
else:
360-
learn_skill_list = [ctx.cultivate_detail.learn_skill_list]
362+
learn_skill_list = ctx.cultivate_detail.learn_skill_list
361363

362364
# 遍历整页, 找出所有可点的技能
363365
skill_list = []
364366
while ctx.task.running():
365367
img = ctx.ctrl.get_screen()
366-
current_screen_skill_list = get_skill_list(img, learn_skill_list)
368+
current_screen_skill_list = get_skill_list(img, learn_skill_list,learn_skill_blacklist)
367369
# 避免重复统计(会出现在页末翻页不完全的情况)
368370
for i in current_screen_skill_list:
369371
if i not in skill_list:
@@ -391,6 +393,7 @@ def script_cultivate_learn_skill(ctx: UmamusumeContext):
391393
else:
392394
total_skill_point = int(total_skill_point_text)
393395
target_skill_list = []
396+
target_skill_list_raw = []
394397
curr_point = 0
395398
for i in range(len(learn_skill_list) + 1):
396399
if (i > 0 and ctx.cultivate_detail.learn_skill_only_user_provided is True and
@@ -402,6 +405,7 @@ def script_cultivate_learn_skill(ctx: UmamusumeContext):
402405
if curr_point + skill_list[j]["skill_cost"] <= total_skill_point:
403406
curr_point += skill_list[j]["skill_cost"]
404407
target_skill_list.append(skill_list[j]["skill_name"])
408+
target_skill_list_raw.append(skill_list[j]["skill_name_raw"])
405409
# 如果点的是金色技能, 就将其绑定的下位技能设置为不可点
406410
if skill_list[j]["gold"] is True and skill_list[j]["subsequent_skill"] != '':
407411
for k in range(len(skill_list)):
@@ -413,12 +417,16 @@ def script_cultivate_learn_skill(ctx: UmamusumeContext):
413417
time.sleep(1)
414418

415419
# 删除已经学会的技能
416-
for skill in target_skill_list:
417-
if ctx.cultivate_detail.learn_skill_list.__contains__(skill):
418-
ctx.cultivate_detail.learn_skill_list.remove(skill)
420+
for skill in target_skill_list_raw:
421+
for prioritylist in ctx.cultivate_detail.learn_skill_list:
422+
if prioritylist.__contains__(skill):
423+
prioritylist.remove(skill)
419424
for skill in skill_list:
420-
if skill['available'] is False and ctx.cultivate_detail.learn_skill_list.__contains__(skill['skill_name']):
421-
ctx.cultivate_detail.learn_skill_list.remove(skill['skill_name'])
425+
for prioritylist in ctx.cultivate_detail.learn_skill_list:
426+
if skill['available'] is False and prioritylist.__contains__(skill['skill_name_raw']):
427+
prioritylist.remove(skill['skill_name_raw'])
428+
#如果一个优先级全为空,则直接将其删除
429+
ctx.cultivate_detail.learn_skill_list = [x for x in ctx.cultivate_detail.learn_skill_list if x != []]
422430

423431
# 点技能
424432
while True:

module/umamusume/script/cultivate_task/parse.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ def find_skill(ctx: UmamusumeContext, img, skill: list[str], learn_any_skill: bo
427427
return find
428428

429429

430-
def get_skill_list(img, skill: list[str]) -> list:
430+
def get_skill_list(img, skill: list[str], skill_blacklist: list[str]) -> list:
431431
origin_img = img
432432
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
433433
res = []
@@ -452,24 +452,35 @@ def get_skill_list(img, skill: list[str]) -> list:
452452
is_gold = True if mask[120, 600] == 255 else False
453453

454454
skill_in_priority_list = False
455+
skill_name_raw = "" #保存原始技能名字, 以防ocr产生偏差
455456
priority = 99
456457
for i in range(len(skill)):
457-
if find_similar_text(text, skill[i], 0.7) != "":
458+
found_similar_blacklist = find_similar_text(text, skill_blacklist, 0.7)
459+
found_similar_prioritylist = find_similar_text(text, skill[i], 0.7)
460+
if found_similar_blacklist != "": # 排除出现在黑名单中的技能
461+
priority = -1
462+
skill_name_raw = found_similar_blacklist
463+
skill_in_priority_list = True
464+
break
465+
elif found_similar_prioritylist != "":
458466
priority = i
467+
skill_name_raw = found_similar_prioritylist
459468
skill_in_priority_list = True
460469
break
461470
if not skill_in_priority_list:
462471
priority = len(skill)
463472

464473
available = not image_match(skill_info_img, REF_SKILL_LEARNED).find_match
465474

466-
res.append({"skill_name": text,
467-
"skill_cost": int(cost),
468-
"priority": priority,
469-
"gold": is_gold,
470-
"subsequent_skill": "",
471-
"available": available,
472-
"y_pos": int(pos_center[1])})
475+
if priority != -1: # 排除出现在黑名单中的技能
476+
res.append({"skill_name": text,
477+
"skill_name_raw": skill_name_raw,
478+
"skill_cost": int(cost),
479+
"priority": priority,
480+
"gold": is_gold,
481+
"subsequent_skill": "",
482+
"available": available,
483+
"y_pos": int(pos_center[1])})
473484
img[match_result.matched_area[0][1]:match_result.matched_area[1][1],
474485
match_result.matched_area[0][0]:match_result.matched_area[1][0]] = 0
475486

@@ -489,6 +500,7 @@ def get_skill_list(img, skill: list[str]) -> list:
489500
skill_name_img = skill_info_img[10: 47, 100: 445]
490501
text = ocr_line(skill_name_img)
491502
res.append({"skill_name": text,
503+
"skill_name_raw": text,
492504
"skill_cost": 0,
493505
"priority": -1,
494506
"gold": is_gold,

module/umamusume/task.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ class TaskDetail:
88
follow_support_card_name: str
99
follow_support_card_level: int
1010
extra_race_list: list[int]
11-
learn_skill_list: list[str]
11+
learn_skill_list: list[list[str]]
12+
learn_skill_blacklist: list[str]
1213
tactic_list: list[int]
1314
clock_use_limit: int
1415
learn_skill_threshold: int
@@ -48,6 +49,7 @@ def build_task(task_execute_mode: TaskExecuteMode, task_type: int,
4849
td.follow_support_card_name = attachment_data['follow_support_card_name']
4950
td.extra_race_list = attachment_data['extra_race_list']
5051
td.learn_skill_list = attachment_data['learn_skill_list']
52+
td.learn_skill_blacklist = attachment_data['learn_skill_blacklist']
5153
td.tactic_list = attachment_data['tactic_list']
5254
td.clock_use_limit = attachment_data['clock_use_limit']
5355
td.learn_skill_threshold = attachment_data['learn_skill_threshold']

public/assets/index.2a72224a.js renamed to public/assets/index.237a5280.js

Lines changed: 11 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/assets/index.f92d0adc.css renamed to public/assets/index.6384f5ff.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
<link href="https://cdn.bootcdn.net/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
1313
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
1414
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
15-
<script type="module" crossorigin src="./assets/index.2a72224a.js"></script>
16-
<link rel="stylesheet" href="./assets/index.f92d0adc.css">
15+
<script type="module" crossorigin src="./assets/index.237a5280.js"></script>
16+
<link rel="stylesheet" href="./assets/index.6384f5ff.css">
1717
</head>
1818
<body>
1919
<div id="app"></div>

run.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
.\venv\Scripts\activate
2-
python main.py
2+
python .\main.py

0 commit comments

Comments
 (0)