mower-ng/mower/solvers/infra/switch_assistants.py

100 lines
3.7 KiB
Python

from mower.solvers.fight.battle_choose.battle_fill_choose import BattleFillChooseSolver
from mower.solvers.infra.base_mixin import BaseMixin
from mower.utils import config
from mower.utils import typealias as tp
from mower.utils.character_recognize import match_portrait
from mower.utils.email import assistants_template, send_message
from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger
from mower.utils.recognize import Scene
pos_name = ["控制中枢", "B1", "B2", "B3", "B4"]
trust_number_scope = [
((590, 500), (670, 530)),
((230, 950), (310, 980)),
((470, 950), (550, 980)),
((710, 950), (790, 980)),
((950, 950), (1030, 980)),
]
portrait_scope = [
((542, 250), (729, 380)),
((183, 713), (370, 823)),
((423, 713), (610, 823)),
((663, 713), (850, 823)),
((903, 713), (1090, 823)),
]
class SwitchAssistantsSolver(SceneGraphSolver, BaseMixin):
def run(self) -> None:
logger.info("Start:切换高信赖基建副手")
self.limit = config.conf.trust_limit # 设置的信赖值阈值
self.assistants_before = [] # 记录切换前的干员
self.switched_scope = set() # 记录已切换过的位置
self.init = False
self.switched = False
super().run()
assistants_after = self.current_operators if self.switched else []
send_message(
assistants_template.render(
assistants_before=self.assistants_before,
assistants_after=assistants_after,
limit=str(self.limit) + "%",
),
"基建副手汇总通知",
"INFO",
config.recog.img,
)
@property
def current_operators(self) -> list:
result = []
opers = match_portrait(config.recog.gray, segment=portrait_scope)
for i in range(5):
if num := self.number(trust_number_scope[i], 14, 130):
result.append([pos_name[i], opers[i][0], str(num) + "%"])
else:
result.append([pos_name[i], None])
return result
def number(self, scope: tp.Scope, height: int, thres: int) -> int:
"数字识别"
return config.recog.num.number_int("noto", scope, height, thres, rect_ed=-3)
def transition(self) -> bool:
if (scene := self.scene()) == Scene.RIIC_REPORT:
if not self.find("riic/assistants_title"):
self.tap((20, 80))
return
if not self.init:
self.assistants_before = self.current_operators
self.black_list = [
assistant[1] for assistant in self.assistants_before if assistant[1]
] # 记录已在位置和选择过的干员
self.init = True
if pos := self.find("riic/none"):
self.tap(pos)
self.switched = True
return
for pos in trust_number_scope:
if (num := self.number(pos, 14, 130)) >= self.limit:
if pos in self.switched_scope:
return True
logger.debug(f"{pos}, {num}")
self.tap(pos)
self.switched = True
self.switched_scope.add(pos)
return
return True
elif scene == Scene.OPERATOR_AGENT_SELECT:
if name := BattleFillChooseSolver().run("信赖值", 1, self.black_list):
self.black_list.append(name[0])
if self.find("choose_agent/battle_confirm"):
self.tap_element("choose_agent/battle_confirm")
self.sleep(0.5)
else:
self.scene_graph_step(Scene.RIIC_REPORT)