All checks were successful
ci/woodpecker/push/check_format Pipeline was successful
108 lines
3.4 KiB
Python
108 lines
3.4 KiB
Python
from datetime import datetime
|
|
|
|
from mower.solvers.infra.filter import RIIC_Filter
|
|
from mower.solvers.infra.riic_tag_choose import RIICTagChoose
|
|
from mower.utils import config
|
|
from mower.utils.character_recognize import operator_room_select
|
|
from mower.utils.image import cropimg
|
|
from mower.utils.log import logger
|
|
from mower.utils.scene import Scene
|
|
from mower.utils.solver import BaseSolver
|
|
|
|
|
|
class RIIC_FreeFillSolver(BaseSolver):
|
|
def run(self) -> bool:
|
|
self.agent = None
|
|
self.filterd = False
|
|
self.tap_time = datetime.now() # 临时解决
|
|
super().run()
|
|
|
|
return self.agent
|
|
|
|
def fill_agent(self):
|
|
if (self.tap_time - datetime.now()).total_seconds() > 180:
|
|
raise TimeoutError(f"选择Free干员{self.agent}超时")
|
|
|
|
if pos := self.find("choose_agent/riic/open_profession"):
|
|
self.ctap(pos, max_seconds=1)
|
|
return
|
|
|
|
agents = dict(operator_room_select(config.recog.img))
|
|
|
|
if self.agent is None:
|
|
for i in agents:
|
|
# if i in 黑名单:
|
|
# continue
|
|
pt_0 = agents[i][0][0]
|
|
pt_1 = agents[i][0][1]
|
|
color = cropimg(
|
|
config.recog.gray,
|
|
[
|
|
[pt_0 + 55, pt_1 - 80],
|
|
[pt_0 + 56, pt_1 - 79],
|
|
],
|
|
)[0][0]
|
|
logger.info(
|
|
f"{i} {agents[i]} {color}{color < 200} {pt_0} {pt_1} {self.is_choosed(agents[i])}"
|
|
)
|
|
if color < 200 or self.is_choosed(agents[i]):
|
|
continue
|
|
self.agent = i
|
|
return
|
|
|
|
# 无满足条件
|
|
if (
|
|
list(agents.keys())[-1] == self.tmp_data
|
|
or list(agents.keys())[-1] is None
|
|
):
|
|
raise ValueError(f"选择干员: {self.agent}失败 滑动次数过多")
|
|
|
|
self.swipe_noinertia((1000, 540), (-1900, 0))
|
|
self.tmp_data = list(agents.keys())[-1]
|
|
else:
|
|
if self.is_choosed(agents[self.agent]):
|
|
return True
|
|
|
|
# 左滑一点防止点击失效
|
|
if agents[self.agent][0][0] > 1720:
|
|
self.swipe_noinertia((1000, 540), (-500, 0))
|
|
return
|
|
logger.info(f"干员选择:{self.agent}")
|
|
self.ctap(agents[self.agent], 2)
|
|
return
|
|
|
|
def is_choosed(self, scope) -> bool:
|
|
if (
|
|
cropimg(
|
|
config.recog.img,
|
|
[
|
|
[scope[0][0] + 0, scope[0][1] - 128],
|
|
[scope[0][0] + 1, scope[0][1] - 127],
|
|
],
|
|
)[0][0][0]
|
|
< 50
|
|
) and cropimg(
|
|
config.recog.img,
|
|
[
|
|
[scope[0][0] + 0, scope[1][1] + 212],
|
|
[scope[0][0] + 1, scope[1][1] + 213],
|
|
],
|
|
)[0][0][0] < 50:
|
|
return True
|
|
return False
|
|
|
|
def transition(self) -> bool:
|
|
if (scene := self.scene()) == Scene.RIIC_OPERATOR_SELECT:
|
|
if self.filterd is False:
|
|
if RIIC_Filter().run("心情", ascending=True) and RIICTagChoose().run(
|
|
"ALL"
|
|
):
|
|
self.filterd = True
|
|
|
|
return
|
|
|
|
return self.fill_agent()
|
|
elif scene in self.waiting_scene:
|
|
self.waiting_solver()
|
|
else:
|
|
return True
|