def get_name(screen=None): get_valid_screen(screen) data = self._load_data_cache() at = (483, 119, 760, 141) ori_out = self.ocr_center(*at, screen) while True: if make_it_as_zhuangbei_as_possible(ori_out) in getattr( data, "EQU_ID") or "?" in ori_out.replace("?", "?"): # 是装备! self.click(782, 76, post_delay=0.5) screen = self.getscreen() ori_out = self.ocr_center(*at, screen) else: break out = make_it_as_juese_as_possible(ori_out) out = self._check_img_in_list_or_dir(out, (482, 114, 750, 261), "ocrfix/juese", "C_ID", screen) if out == "公主宝珠": for _ in range(5): self.click(121, 172) time.sleep(1) return get_name() return out
def kucunshibie(self, scan_zb=True, scan_sp=True, var: Optional[dict] = None): mv = movevar(var) self.lock_home() title_at = (613, 85, 909, 112) self.lock_img(ZHUCAIDAN_BTN["bangzhu"], elseclick=[(871, 513)]) # 锁定帮助 # 去道具 self.lock_no_img(ZHUCAIDAN_BTN["daoju"], elseclick=[(536, 159)]) self.lock_img(ZHUCAIDAN_BTN["daojuyilan"], elseclick=[(536, 159)]) # 锁定道具一览 LAST_PAGE = False def get_equ_at(r, c): EQU_X = [97, 203, 315, 421, 535] EQU_Y = [126, 228, 336] if LAST_PAGE: EQU_Y = [198, 305, 412] return EQU_X[c], EQU_Y[r] DIR = "" LAST_SCREEN = None def dao_ju_kuang(screen=None): at = (616, 78, 924, 227) # 道具框 djk = screen if screen is not None else self.getscreen() djk = UIMatcher.img_cut(djk, at) return djk def check_last_screen(): # 防止同一屏幕重复出现 nonlocal LAST_SCREEN if LAST_SCREEN is None: LAST_SCREEN = dao_ju_kuang(self.last_screen) return True else: NOW_SCREEN = dao_ju_kuang(self.last_screen) if self.img_equal(NOW_SCREEN, LAST_SCREEN) > 0.98: return False else: LAST_SCREEN = NOW_SCREEN return True def output_dict(d): path = os.path.join("outputs", DIR) if not os.path.isdir(path): os.makedirs(path) sd = sorted(d) with open(os.path.join(path, self.account + ".txt"), "w", encoding="utf-8") as f: f.write("%s\t%s\t%s\t%s\n" % ("名称", "数量", "更新时间", "备注")) for k in sd: f.write("%s\t%s\t%s\t%s\n" % (k, d[k][0], get_time_str(d[k][1]), d[k][2])) def output_warning_pic(title, value): path = os.path.join("outputs", DIR, "warning", self.account) if not os.path.isdir(path): os.makedirs(path) target = os.path.join(path, title + ".bmp") djk = dao_ju_kuang() cv2.imwrite(target, djk) self.log.write_log("warning", f"在识别{title}时读到了不可识别的{value},图片已保存至{target}") def getrecord(): kucun = self.AR.get(DIR, {}) return kucun def addrecord(d, nam, val, bz=""): d[nam] = (val, time.time(), bz) def saverecord(d): self.AR.set(DIR, d) def get_number_by_sale(): sc = self.getscreen() if self.is_exists(ZHUCAIDAN_BTN["sale_short"], screen=sc): self.click_btn(ZHUCAIDAN_BTN["sale_short"], until_appear=ZHUCAIDAN_BTN["chushouqueren"]) elif self.is_exists(ZHUCAIDAN_BTN["sale_long"], screen=sc): self.click(ZHUCAIDAN_BTN["sale_long"], until_appear=ZHUCAIDAN_BTN["chushouqueren"]) else: return None sc = self.last_screen for _ in range(6): self.click(1, 1) at = (492, 266, 566, 286) out = self.ocr_center(*at, screen_shot=sc) new_out = make_it_as_number_as_possible(out) try: the_int = int(new_out) return the_int except: return None def dragdown(): obj = self.d.touch.down(55, 445) time.sleep(0.5) obj.move(55, 130) time.sleep(0.8) sc = self.getscreen() r1c0 = UIMatcher.img_cut(sc, at=(56, 354, 140, 441)) r1c0.std() flag = False if r1c0.std() < 15: # 拖到底了 flag = True obj.up(55, 130) time.sleep(1) return flag if scan_zb and mv.notflag("zb_scanned"): # 扫描装备 DIR = "zhuangbei_kucun" rec = getrecord() self.lock_img(ZHUCAIDAN_BTN["sortico"], elseclick=ZHUCAIDAN_BTN["zhuangbei"]) mv.regflag("zb_r", 0) # 行数 mv.regflag("zb_c", 0) # 列数 mv.regflag("zb_p", 0) # 页数 LAST_PAGE = mv.flag("zb_last_page") for _ in range(var["zb_p"]): dragdown() # 回到上次页数 while True: while var["zb_r"] < 3: count = 0 while var["zb_c"] < 5: if count >= 25 or (count >= 5 and not fast_screencut ) or (count >= 10 and mv.flag("zb_last_page")): self.log.write_log("warning", "不反映了,可能结束了。") var["zb_c"] = 999 var["zb_r"] = 999 break x, y = get_equ_at(var["zb_r"], var["zb_c"]) self.click(x, y, post_delay=0.5 * (count == 0) + 0.1 + 5 * (count % 10 == 9)) sc = self.getscreen() if not check_last_screen(): count += 1 continue title = self.ocr_center(*title_at, screen_shot=sc) if title == -1: count += 1 continue title = make_it_as_zhuangbei_as_possible(title) title = self._check_img_in_list_or_dir( title, (616, 76, 884, 194), "ocrfix/zb", "EQU_ID", sc) out, original_out = self.get_daoju_number(sc, True) comment = "" if out is None: out = get_number_by_sale() if out is None: # 没救了 out = original_out output_warning_pic(title, out) comment = "存疑" addrecord(rec, title, out, comment) saverecord(rec) var["zb_c"] += 1 mv.save() if var["zb_c"] == 999: break var["zb_c"] = 0 var["zb_r"] += 1 mv.save() if var["zb_r"] == 999: mv.setflag("zb_scanned") break flag = dragdown() if flag: if mv.notflag("zb_last_page"): mv.setflag("zb_last_page") LAST_PAGE = True else: mv.setflag("zb_scanned") break time.sleep(1) LAST_SCREEN = dao_ju_kuang() var["zb_r"] = 0 var["zb_p"] += 1 mv.save() # Output output_dict(rec) mv.clearflags() self.lock_home()