Skip to content

Commit 50716f4

Browse files
committed
✨ feat(tasks): refactor skill and movement timing in tasks
- 【通用】添加了 `create_skill_ticker` 函数,用于控制技能释放频率 - 【通用】添加了 `create_jiggle_ticker` 函数,用于在任务中模拟角色轻微移动 - 【优化】移除了各个任务中 `runtime_state` 中不必要的 `skill_time` 和 `random_walk_time` 字段,简化状态管理
1 parent 946155b commit 50716f4

5 files changed

Lines changed: 96 additions & 17 deletions

File tree

src/tasks/AutoDefence.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ def __init__(self, *args, **kwargs):
3737
self.external_movement = _default_movement
3838
self._external_config = None
3939
self._merged_config_cache = None
40+
self.jiggle_tick = self.create_jiggle_ticker(10)
41+
self.skill_tick = self.create_skill_ticker()
4042

4143
@property
4244
def config(self):
@@ -104,7 +106,9 @@ def init_for_next_round(self):
104106
self.init_runtime_state()
105107

106108
def init_runtime_state(self):
107-
self.runtime_state = {"wave_start_time": 0, "wave": -1, "wait_next_wave": False, "skill_time": 0}
109+
self.runtime_state = {"wave_start_time": 0, "wave": -1, "wait_next_wave": False}
110+
self.skill_tick.reset()
111+
self.jiggle_tick.reset()
108112
self.current_wave = -1
109113

110114
def handle_in_mission(self):
@@ -129,7 +133,8 @@ def handle_in_mission(self):
129133

130134
# 如果未超时,则使用技能
131135
if not self.runtime_state["wait_next_wave"]:
132-
self.runtime_state["skill_time"] = self.use_skill(self.runtime_state["skill_time"])
136+
self.skill_tick()
137+
self.jiggle_tick()
133138
else:
134139
if self.runtime_state["wave"] > 0:
135140
self.init_runtime_state()

src/tasks/AutoExcavation.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ def __init__(self, *args, **kwargs):
3838

3939
self.action_timeout = DEFAULT_ACTION_TIMEOUT
4040
self.quick_move_task = QuickMoveTask(self)
41+
self.jiggle_tick = self.create_jiggle_ticker(10)
42+
self.skill_tick = self.create_skill_ticker()
4143

4244
def run(self):
4345
DNAOneTimeTask.run(self)
@@ -88,15 +90,17 @@ def init_for_next_round(self):
8890
self.excavator_count = 0
8991

9092
def init_runtime_state(self):
91-
self.runtime_state = {"start_time": 0, "skill_time": 0}
93+
self.runtime_state = {"start_time": 0}
94+
self.skill_tick.reset()
95+
self.jiggle_tick.reset()
9296

9397
def handle_in_mission(self):
9498
if self.find_target_health_bar():
9599
if self.runtime_state["start_time"] == 0:
96100
self.runtime_state["start_time"] = time.time()
97101
self.quick_move_task.reset()
98-
99-
self.runtime_state["skill_time"] = self.use_skill(self.runtime_state["skill_time"])
102+
self.skill_tick()
103+
self.jiggle_tick()
100104
else:
101105
if self.runtime_state["start_time"] > 0:
102106
self.init_runtime_state()

src/tasks/AutoExploration.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ def __init__(self, *args, **kwargs):
3636
self.quick_move_task = QuickMoveTask(self)
3737
self.external_movement = _default_movement
3838
self._external_config = None
39+
self.jiggle_tick = self.create_jiggle_ticker(10)
40+
self.skill_tick = self.create_skill_ticker()
3941
self._merged_config_cache = None
4042

4143
@property
@@ -104,7 +106,9 @@ def init_for_next_round(self):
104106
self.init_runtime_state()
105107

106108
def init_runtime_state(self):
107-
self.runtime_state = {"start_time": 0, "skill_time": 0, "wait_next_round": False}
109+
self.runtime_state = {"start_time": 0, "wait_next_round": False}
110+
self.skill_tick.reset()
111+
self.jiggle_tick.reset()
108112

109113
def handle_in_mission(self):
110114
if self.find_serum():
@@ -123,7 +127,8 @@ def handle_in_mission(self):
123127
self.runtime_state["wait_next_round"] = True
124128

125129
if not self.runtime_state["wait_next_round"]:
126-
self.runtime_state["skill_time"] = self.use_skill(self.runtime_state["skill_time"])
130+
self.skill_tick()
131+
self.jiggle_tick()
127132
else:
128133
if self.runtime_state["start_time"] > 0:
129134
self.init_runtime_state()

src/tasks/AutoExpulsion.py

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ def __init__(self, *args, **kwargs):
4343

4444
self.default_config.pop("启用自动穿引共鸣", None)
4545
self.action_timeout = 10
46+
47+
self.skill_tick = self.create_skill_ticker()
48+
self.random_walk_tick = self.create_random_walk_ticker()
4649

4750
def run(self):
4851
DNAOneTimeTask.run(self)
@@ -85,7 +88,9 @@ def init_for_next_round(self):
8588
self.init_runtime_state()
8689

8790
def init_runtime_state(self):
88-
self.runtime_state = {"start_time": 0, "skill_time": 0, "random_walk_time": 0}
91+
self.runtime_state = {"start_time": 0}
92+
self.skill_tick.reset()
93+
self.random_walk_tick.reset()
8994

9095
def handle_in_mission(self):
9196
if self.runtime_state["start_time"] == 0:
@@ -98,8 +103,8 @@ def handle_in_mission(self):
98103
self.give_up_mission()
99104
self.wait_until(lambda: not self.in_team(), time_out=30, settle_time=1)
100105

101-
self.runtime_state["skill_time"] = self.use_skill(self.runtime_state["skill_time"])
102-
self.runtime_state["random_walk_time"] = self.random_walk(self.runtime_state["random_walk_time"])
106+
self.skill_tick()
107+
self.random_walk_tick()
103108

104109
def handle_mission_start(self):
105110
if self.count >= self.config.get("刷几次", 999):
@@ -123,12 +128,26 @@ def move_on_begin(self):
123128
if (walk_sec := self.config.get("开局向前走", 0)) > 0:
124129
self.send_key("w", down_time=walk_sec)
125130

126-
def random_walk(self, last_time):
127-
duration = 1
128-
interval = 3
129-
if self.config.get("随机游走", False):
130-
if time.time() - last_time >= interval:
131+
def create_random_walk_ticker(self):
132+
"""创建一个随机游走的计时器函数。"""
133+
last_time = 0
134+
135+
def tick():
136+
nonlocal last_time
137+
if not self.config.get("随机游走", False):
138+
return
139+
140+
interval = 3
141+
duration = 1
142+
now = time.perf_counter()
143+
if now - last_time >= interval:
144+
last_time = now
131145
direction = random.choice(["w", "a", "s", "d"])
132146
self.send_key(direction, down_time=duration)
133-
return time.time()
134-
return last_time
147+
148+
def reset():
149+
nonlocal last_time
150+
last_time = 0
151+
152+
tick.reset = reset
153+
return tick

src/tasks/CommissionsTask.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,52 @@ def use_skill(self, skill_time):
286286
elif self.config.get("使用技能") == "魔灵支援":
287287
self.get_current_char().send_geniemon_key()
288288
return skill_time
289+
290+
def create_skill_ticker(self):
291+
last_time = 0
292+
293+
def tick():
294+
nonlocal last_time
295+
if self.config.get("使用技能", "不使用") == "不使用":
296+
return
297+
now = time.perf_counter()
298+
if now - last_time >= self.config.get("技能释放频率", 5):
299+
last_time = now
300+
if self.config.get("使用技能") == "战技":
301+
self.get_current_char().send_combat_key()
302+
elif self.config.get("使用技能") == "终结技":
303+
self.get_current_char().send_ultimate_key()
304+
elif self.config.get("使用技能") == "魔灵支援":
305+
self.get_current_char().send_geniemon_key()
306+
307+
def reset():
308+
nonlocal last_time
309+
last_time = 0
310+
311+
tick.reset = reset
312+
return tick
313+
314+
def create_jiggle_ticker(self, interval=1.0):
315+
last_time = 0
316+
317+
def tick():
318+
nonlocal last_time
319+
now = time.perf_counter()
320+
if now - last_time >= interval:
321+
last_time = now
322+
self.sleep(1)
323+
for _ in range(2):
324+
self.send_key("s")
325+
self.sleep(0.4)
326+
self.send_key("w")
327+
self.sleep(0.4)
328+
329+
def reset():
330+
nonlocal last_time
331+
last_time = 0
332+
333+
tick.reset = reset
334+
return tick
289335

290336
def get_round_info(self):
291337
"""获取并更新当前轮次信息。"""

0 commit comments

Comments
 (0)