Skip to content

Commit d732c81

Browse files
committed
♻️ refactor(tasks): 改进任务技能和状态管理
- 引入`skill_ticker`机制,统一管理技能冷却和释放 - 将任务运行时变量整合至`runtime_state`字典,提高状态管理清晰度 - 统一任务初始化方法`init_all`,并细化回合和运行时状态重置
1 parent 83efdfc commit d732c81

3 files changed

Lines changed: 78 additions & 26 deletions

File tree

src/tasks/AutoSkill.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def __init__(self, *args, **kwargs):
3232
'超时时间': '超时后将发出提示',
3333
})
3434

35+
self.skill_tick = self.create_skill_ticker()
3536
self.action_timeout = 10
3637

3738
def run(self):
@@ -46,11 +47,11 @@ def run(self):
4647

4748
def do_run(self):
4849
self.load_char()
49-
_skill_time = 0
50+
self.init_all()
5051
self.wait_until(self.in_team, time_out=30)
5152
while True:
5253
if self.in_team():
53-
_skill_time = self.use_skill(_skill_time)
54+
self.skill_tick()
5455
else:
5556
if self.config.get('主画面侦测', False):
5657
self.log_info_notify('任务完成')
@@ -61,3 +62,6 @@ def do_run(self):
6162
self.soundBeep()
6263
return
6364
self.sleep(0.2)
65+
66+
def init_all(self):
67+
self.skill_tick.reset()

src/tasks/BaseDNATask.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import time
2-
from typing import Union, Callable
2+
from typing import Protocol, Callable, Union
33
import numpy as np
44
import cv2
55
import winsound
@@ -17,6 +17,51 @@
1717
'b': (0, 20) # Blue range
1818
}
1919

20+
class Ticker(Protocol):
21+
"""
22+
技能循环计时器接口。
23+
24+
这是一个可调用的对象(类似函数),用于控制动作的执行频率,
25+
并提供了额外的方法来手动干预计时器的状态。
26+
"""
27+
28+
def __call__(self) -> None:
29+
"""
30+
尝试执行动作(Tick)。
31+
32+
如果距离上次执行的时间超过了设定的间隔(Interval),
33+
则执行绑定的 Action,并更新最后执行时间。
34+
"""
35+
...
36+
37+
def reset(self) -> None:
38+
"""
39+
重置计时器状态。
40+
41+
将“上次执行时间”归零。这意味着下一次调用 tick() 时,
42+
几乎肯定会立即触发动作(视为初次运行)。
43+
"""
44+
...
45+
46+
def touch(self) -> None:
47+
"""
48+
刷新计时器(将最后执行时间设为当前时间)。
49+
50+
用于“欺骗”计时器刚刚执行过动作。
51+
效果:强制动作进入冷却,直到经过一个完整的 interval 周期。
52+
"""
53+
...
54+
55+
def start_next_tick(self) -> None:
56+
"""
57+
重置下一帧的计时起点(同步延迟)。
58+
59+
标记计时器。下一次调用 tick() 时,不会检查间隔,也不会执行动作,
60+
而是直接将“上次执行时间”对齐到那一刻的时间。
61+
62+
用途:通常用于在手动释放技能后,告诉计时器从下一帧开始重新倒计时。
63+
"""
64+
...
2065

2166
class BaseDNATask(BaseTask):
2267

@@ -269,7 +314,7 @@ def rel_move_if_in_win(self, x=0.5, y=0.5, box=None):
269314
win32api.SetCursorPos(abs_pos)
270315
return True
271316

272-
def create_ticker(self, action: Callable, interval: Union[float, int, Callable] = 1.0) -> Callable:
317+
def create_ticker(self, action: Callable, interval: Union[float, int, Callable] = 1.0) -> Ticker:
273318
last_time = 0
274319
armed = False
275320

src/tasks/fullauto/ImportTask.py

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def __init__(self, *args, **kwargs):
7070
# '使用内建解密': '使用ok内建解密功能',
7171
})
7272

73+
self.skill_tick = self.create_skill_ticker()
7374
self.action_timeout = 10
7475
self.quick_move_task = QuickMoveTask(self)
7576

@@ -99,58 +100,60 @@ def run(self):
99100
raise
100101

101102
def do_run(self):
102-
self.init_param()
103+
self.init_all()
103104
self.load_char()
104-
_wave = -1
105-
_wave_start = 0
106-
_delay_task_start = 0
107105
if self.in_team():
108106
self.open_in_mission_menu()
109107
self.sleep(0.5)
110108
while True:
111109
if self.in_team():
112110
self.get_wave_info()
113111
if self.current_wave != -1:
114-
if self.current_wave != _wave:
115-
_wave = self.current_wave
116-
self.skill_time = self.use_skill(self.skill_time)
117-
if time.time() - _wave_start >= self.config.get('超时时间', 180):
112+
if self.current_wave != self.runtime_state["wave"]:
113+
self.runtime_state["wave"] = self.current_wave
114+
self.skill_tick()
115+
if time.time() - self.runtime_state["wave_start_time"] >= self.config.get('超时时间', 180):
118116
self.log_info('任务超时')
119117
self.open_in_mission_menu()
120118
self.sleep(0.5)
121-
if self.delay_index is not None and time.time() > _delay_task_start:
122-
_delay_task_start += 1
119+
if self.delay_index is not None and time.time() > self.runtime_state["delay_task_start"]:
120+
self.runtime_state["delay_task_start"] += 1
123121
if self.match_map(self.delay_index):
124122
self.walk_to_aim(self.delay_index)
125123
_status = self.handle_mission_interface(stop_func=self.stop_func)
126124
if _status == Mission.START or _status == Mission.STOP:
127125
if _status == Mission.STOP:
128126
self.quit_mission()
129127
self.log_info('任务中止')
130-
self.init_param()
128+
self.init_all()
131129
continue
132-
else:
133-
self.log_info('任务完成')
134130
self.wait_until(self.in_team, time_out=30)
135-
self.init_param()
131+
self.log_info('任务开始')
132+
self.init_all()
136133
self.sleep(2)
137134
self.walk_to_aim()
138-
_wave_start = time.time()
139-
_delay_task_start = _wave_start + 1
140-
self.reset_wave_info()
135+
now = time.time()
136+
self.runtime_state.update({"wave_start_time": now, "delay_task_start": now + 1})
141137
elif _status == Mission.CONTINUE:
142138
self.log_info('任务继续')
143139
self.wait_until(self.in_team, time_out=30)
144-
self.reset_wave_info()
145-
_wave_start = time.time()
140+
self.init_for_next_round()
141+
now = time.time()
142+
self.runtime_state.update({"wave_start_time": now, "delay_task_start": now + 1})
146143
self.sleep(0.2)
147144

148-
def init_param(self):
145+
def init_all(self):
146+
self.init_for_next_round()
149147
self.delay_index = None
150-
self.stop_mission = False
148+
self.skill_tick.reset()
151149
self.current_round = 0
150+
151+
def init_for_next_round(self):
152+
self.init_runtime_state()
153+
154+
def init_runtime_state(self):
155+
self.runtime_state = {"wave_start_time": 0, "wave": -1, "delay_task_start": 0}
152156
self.reset_wave_info()
153-
self.skill_time = 0
154157

155158
def stop_func(self):
156159
self.get_round_info()

0 commit comments

Comments
 (0)