StarRailCopilot/tasks/combat/state.py
2023-06-13 11:36:54 +08:00

81 lines
2.8 KiB
Python

import cv2
from scipy import signal
from module.base.timer import Timer
from module.base.utils import rgb2gray
from tasks.base.ui import UI
from tasks.combat.assets.assets_combat_state import COMBAT_AUTO, COMBAT_PAUSE, COMBAT_SPEED_2X
class CombatState(UI):
_combat_click_interval = Timer(1, count=2)
def is_combat_executing(self) -> bool:
appear = self.appear(COMBAT_PAUSE)
if appear:
if COMBAT_PAUSE.button_offset[0] <= 5:
return True
return False
def is_combat_auto(self) -> bool:
image = rgb2gray(self.image_crop(COMBAT_AUTO))
line = cv2.reduce(image, 1, cv2.REDUCE_AVG).flatten()
# [122 122 122 182 141 127 139 135 130 135 136 141 147 149 149 150 147 145
# 148 150 150 150 150 150 144 138 134 141 136 133 173 183 130 128 127 126]
parameters = {
# Border is about 188-190
'height': 160,
# Background is about 120-122
'prominence': 35,
}
peaks, _ = signal.find_peaks(line, **parameters)
return len(peaks) == 2
def is_combat_speed_2x(self) -> bool:
image = rgb2gray(self.image_crop(COMBAT_SPEED_2X))
line = cv2.reduce(image, 1, cv2.REDUCE_AVG).flatten()
# [122 122 122 182 141 127 139 135 130 135 136 141 147 149 149 150 147 145
# 148 150 150 150 150 150 144 138 134 141 136 133 173 183 130 128 127 126]
parameters = {
# Border is about 188-190
'height': 160,
# Background is about 120-122
'prominence': 35,
}
peaks, _ = signal.find_peaks(line, **parameters)
return len(peaks) == 2
def handle_combat_state(self, auto=True, speed_2x=True):
"""
Set combat auto and 2X speed. Enable both by default.
Returns:
bool: If clicked
"""
if not self.is_combat_executing():
return False
if speed_2x and not self.is_combat_speed_2x():
if self._combat_click_interval.reached():
self.device.click(COMBAT_SPEED_2X)
self._combat_click_interval.reset()
return True
if not speed_2x and self.is_combat_speed_2x():
if self._combat_click_interval.reached():
self.device.click(COMBAT_SPEED_2X)
self._combat_click_interval.reset()
return True
if auto and not self.is_combat_auto():
if self._combat_click_interval.reached():
self.device.click(COMBAT_AUTO)
self._combat_click_interval.reset()
return True
if not auto and self.is_combat_auto():
if self._combat_click_interval.reached():
self.device.click(COMBAT_AUTO)
self._combat_click_interval.reset()
return True
return False