mower-ng/mower/solvers/infra/riic_free_fill.py
zhbaor c86e7ac651
All checks were successful
ci/woodpecker/push/check_format Pipeline was successful
场景图导航改写为solver
2025-01-30 10:14:54 +08:00

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