Skip to content

Commit 5c9420a

Browse files
authored
feat: 支持富士奇石的表演秀模式 (#173)
1 parent 3a9fa1c commit 5c9420a

File tree

20 files changed

+127
-788
lines changed

20 files changed

+127
-788
lines changed

module/umamusume/asset/template.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
UMAMUSUME_BTN_TEMPLATE_PATH = "/umamusume/btn"
55
UMAMUSUME_REF_TEMPLATE_PATH = "/umamusume/ref"
66
UMAMUSUME_UMA_ICON_TEMPLATE_PATH = "/umamusume/uma_icon"
7+
# 限时: 富士奇石的表演秀
8+
UMAMUSUME_UI_FUJIKISEKI_SHOW_TEMPLATE_PATH = "/umamusume/ui/fujikiseki_show"
79

810
UI_INFO = Template("INFO", UMAMUSUME_UI_TEMPLATE_PATH)
911
UI_MAIN_MENU = Template("MAIN_MENU", UMAMUSUME_UI_TEMPLATE_PATH)
@@ -124,4 +126,12 @@
124126
UMA_ICON_URA_NPC_2 = Template("URA_NPC_2", UMAMUSUME_UMA_ICON_TEMPLATE_PATH)
125127
UMA_ICON_FRIEND_1 = Template("FRIEND_1", UMAMUSUME_UMA_ICON_TEMPLATE_PATH)
126128

127-
129+
# 限时: 富士奇石的表演秀
130+
FUJIKISEKI_SHOW_DIFFICULTY_LOCKED = Template("DIFFICULTY_LOCKED", UMAMUSUME_UI_FUJIKISEKI_SHOW_TEMPLATE_PATH)
131+
FUJIKISEKI_SHOW_DIFFICULTY = [Template("DIFFICULTY_1", UMAMUSUME_UI_FUJIKISEKI_SHOW_TEMPLATE_PATH),
132+
Template("DIFFICULTY_2", UMAMUSUME_UI_FUJIKISEKI_SHOW_TEMPLATE_PATH),
133+
Template("DIFFICULTY_3", UMAMUSUME_UI_FUJIKISEKI_SHOW_TEMPLATE_PATH),
134+
Template("DIFFICULTY_4", UMAMUSUME_UI_FUJIKISEKI_SHOW_TEMPLATE_PATH),
135+
Template("DIFFICULTY_5", UMAMUSUME_UI_FUJIKISEKI_SHOW_TEMPLATE_PATH)]
136+
UI_FUJIKISEKI_SHOW_MODE_RESULT_1 = Template("SHOW_MODE_RESULT_1", UMAMUSUME_UI_FUJIKISEKI_SHOW_TEMPLATE_PATH)
137+
UI_FUJIKISEKI_SHOW_MODE_RESULT_2 = Template("SHOW_MODE_RESULT_2", UMAMUSUME_UI_FUJIKISEKI_SHOW_TEMPLATE_PATH)

module/umamusume/asset/ui.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@
5858
ACTIVITY_RESULT = UI("ACTIVITY_RESULT", [template.UI_ACTIVITY_RESULT], [])
5959
ACTIVITY_REWARD = UI("ACTIVITY_REWARD", [template.UI_ACTIVITY_REWARD], [])
6060

61+
# 限时: 富士奇石的表演秀
62+
FUJIKISEKI_SHOW_MODE_RESULT_1 = UI("FUJIKISEKI_SHOW_MODE_RESULT_1", [template.UI_FUJIKISEKI_SHOW_MODE_RESULT_1], [])
63+
FUJIKISEKI_SHOW_MODE_RESULT_2 = UI("FUJIKISEKI_SHOW_MODE_RESULT_2", [template.UI_FUJIKISEKI_SHOW_MODE_RESULT_2], [])
64+
6165
scan_ui_list = [MAIN_MENU,
6266
CULTIVATE_SCENARIO_SELECT, CULTIVATE_UMAMUSUME_SELECT, CULTIVATE_EXTEND_UMAMUSUME_SELECT,
6367
CULTIVATE_SUPPORT_CARD_SELECT, CULTIVATE_FOLLOW_SUPPORT_CARD_SELECT, CULTIVATE_FINAL_CHECK, INFO,
@@ -70,4 +74,4 @@
7074
GOAL_ACHIEVED, NEXT_GOAL, ALL_GOAL_ACHIEVED, CULTIVATE_FINISH, GOAL_FAILED,
7175
FACTOR_RECEIVE, HISTORICAL_RATING_UPDATE, SCENARIO_RATING_UPDATE,
7276
CULTIVATE_EVENT_UMAMUSUME, CULTIVATE_EVENT_SUPPORT_CARD, CULTIVATE_EVENT_SCENARIO, ACTIVITY_RESULT,
73-
ACTIVITY_REWARD]
77+
ACTIVITY_REWARD, FUJIKISEKI_SHOW_MODE_RESULT_1, FUJIKISEKI_SHOW_MODE_RESULT_2]

module/umamusume/manifest.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@
5656
CULTIVATE_URA_RACE_2: script_cultivate_goal_race,
5757
CULTIVATE_URA_RACE_3: script_cultivate_goal_race,
5858
ACTIVITY_RESULT: script_cultivate_result,
59-
ACTIVITY_REWARD: script_cultivate_result
59+
ACTIVITY_REWARD: script_cultivate_result,
60+
FUJIKISEKI_SHOW_MODE_RESULT_1: script_fujikiseki_show_result_1,
61+
FUJIKISEKI_SHOW_MODE_RESULT_2: script_fujikiseki_show_result_2
6062
}
6163
}
6264

module/umamusume/script/cultivate_task/cultivate.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import json
22
import time
3+
import threading
34

45
import numpy as np
56

@@ -107,6 +108,14 @@ def script_cultivate_training_select(ctx: UmamusumeContext):
107108
parse_training_result(ctx, img, train_type)
108109
parse_training_support_card(ctx, img, train_type)
109110
viewed = train_type.value
111+
112+
def _parse_training_in_thread(ctx, img, train_type):
113+
"""Helper function to run parsing in a separate thread."""
114+
parse_training_result(ctx, img, train_type)
115+
parse_training_support_card(ctx, img, train_type)
116+
117+
threads :list[threading.Thread] = []
118+
110119
for i in range(5):
111120
if i != (viewed - 1):
112121
retry = 0
@@ -121,8 +130,15 @@ def script_cultivate_training_select(ctx: UmamusumeContext):
121130
retry += 1
122131
if retry == max_retry:
123132
return
124-
parse_training_result(ctx, img, TrainingType(i + 1))
125-
parse_training_support_card(ctx, img, TrainingType(i + 1))
133+
134+
thread = threading.Thread(target=_parse_training_in_thread,
135+
args=(ctx, img, TrainingType(i + 1)))
136+
threads.append(thread)
137+
thread.start()
138+
139+
for thread in threads:
140+
thread.join()
141+
126142
ctx.cultivate_detail.turn_info.parse_train_info_finish = True
127143
if not ctx.cultivate_detail.turn_info.parse_main_menu_finish:
128144
ctx.ctrl.click_by_point(RETURN_TO_CULTIVATE_MAIN_MENU)
@@ -319,6 +335,12 @@ def script_cultivate_extend(ctx: UmamusumeContext):
319335
def script_cultivate_result(ctx: UmamusumeContext):
320336
ctx.ctrl.click_by_point(CULTIVATE_RESULT_CONFIRM)
321337

338+
# 限时: 富士奇石的表演秀
339+
def script_fujikiseki_show_result_1(ctx: UmamusumeContext):
340+
ctx.ctrl.click(360, 1180, "确认富士奇石表演秀模式结果")
341+
342+
def script_fujikiseki_show_result_2(ctx: UmamusumeContext):
343+
ctx.ctrl.click(360, 1120, "确认富士奇石表演秀模式结果")
322344

323345
# 1.878s 2s 0.649s
324346
def script_cultivate_catch_doll(ctx: UmamusumeContext):

module/umamusume/script/cultivate_task/info.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import time
2+
from datetime import datetime
3+
import pytz
24

35
import cv2
46

@@ -44,6 +46,8 @@
4446
"回复训练值",
4547
"选择养成难度",
4648
"确定因子确认",
49+
# 限时: 富士奇石的表演秀
50+
"解锁新难度"
4751
]
4852

4953

@@ -143,7 +147,39 @@ def script_info(ctx: UmamusumeContext):
143147
ctx.ctrl.click_by_point(USE_TP_DRINK_CONFIRM)
144148
elif image_match(ctx.ctrl.get_screen(to_gray=True), REF_RECOVER_TP_3).find_match:
145149
ctx.ctrl.click_by_point(USE_TP_DRINK_RESULT_CLOSE)
150+
if title_text == TITLE[28]:
151+
# 限时: 富士奇石的表演秀
152+
# 目前似乎只有这里用到了 "选择养成难度,如果以后有别的的话需要调整代码结构"
153+
beijing_tz = pytz.timezone('Asia/Shanghai')
154+
cutoff_time = beijing_tz.localize(datetime(2025, 7, 13, 11, 59))
155+
current_time_beijing = datetime.now(beijing_tz)
156+
157+
if current_time_beijing <= cutoff_time:
158+
if ctx.task.detail.fujikiseki_show_mode == False:
159+
ctx.ctrl.click(360, 300, "选择普通模式")
160+
else :
161+
ctx.ctrl.click(360, 500, "选择富士奇石的表演秀模式")
162+
match = False
163+
for i in range(5):
164+
screen = ctx.ctrl.get_screen(to_gray=True)
165+
if ((not image_match(screen, FUJIKISEKI_SHOW_DIFFICULTY_LOCKED).find_match)
166+
and image_match(screen, FUJIKISEKI_SHOW_DIFFICULTY[ctx.task.detail.fujikiseki_show_difficulty-1]).find_match):
167+
log.info(f"选择难度{ctx.task.detail.fujikiseki_show_difficulty}")
168+
match = True
169+
break
170+
ctx.ctrl.click(675, 800, "切换至下一个难度")
171+
time.sleep(1)
172+
if not match:
173+
log.error(f"选择的难度{ctx.task.detail.fujikiseki_show_difficulty}尚未解锁, 请先游玩低难度模式!")
174+
ctx.task.end_task(TaskStatus.TASK_STATUS_FAILED, UEndTaskReason.DIFFICULTY_LOCKED)
175+
return
176+
177+
ctx.ctrl.click(520, 1180, "")
178+
146179
if title_text == TITLE[29]:
147180
ctx.ctrl.click_by_point(CULTIVATE_RESULT_DIVISOR_CONFIRM)
181+
if title_text == TITLE[30]:
182+
# 限时: 富士奇石的表演秀
183+
ctx.ctrl.click(360, 850, "确认解锁新难度")
148184
time.sleep(1)
149185

module/umamusume/task.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@ class TaskDetail:
1717
allow_recover_tp: bool
1818
cultivate_progress_info: dict
1919
extra_weight: list
20+
# 限时: 富士奇石的表演秀
21+
fujikiseki_show_mode: bool
22+
fujikiseki_show_difficulty: int
2023

2124

2225
class EndTaskReason(Enum):
2326
TP_NOT_ENOUGH = "训练值不足"
27+
DIFFICULTY_LOCKED = "难度未解锁"
2428

2529

2630
class UmamusumeTask(Task):
@@ -58,6 +62,9 @@ def build_task(task_execute_mode: TaskExecuteMode, task_type: int,
5862
td.extra_weight = attachment_data['extra_weight']
5963
td.cultivate_result = {}
6064
# td.scenario_name = attachment_data['scenario_name']
65+
# 限时: 富士奇石的表演秀
66+
td.fujikiseki_show_mode = attachment_data['fujikiseki_show_mode']
67+
td.fujikiseki_show_difficulty = attachment_data['fujikiseki_show_difficulty']
6168
ut.detail = td
6269
return ut
6370

public/assets/index.2f898a16.js

Lines changed: 0 additions & 766 deletions
This file was deleted.

public/assets/index.dddbed6f.js renamed to public/assets/index.341185cc.js

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

public/assets/index.7a4bcb75.css renamed to public/assets/index.4ca79ef8.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/assets/index.dec52c8e.css

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)