Feat(SmallEvent): 新增忍者之城相关功能,包括任务处理和奖励领取逻辑

This commit is contained in:
W1NDes 2025-09-19 23:43:20 +08:00
parent e6a53318f8
commit 6ec2d88c4d
9 changed files with 76 additions and 1 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -18,6 +18,13 @@ EVENT_PREPARE_ENTRY_3 = Button(area={'cn': (967, 165, 1036, 185), 'en': (967, 16
EVENT_PREPARE_PAGE = Button(area={'cn': (92, 18, 213, 48), 'en': (92, 18, 213, 48), 'jp': (92, 18, 213, 48), 'tw': (92, 18, 213, 48)}, color={'cn': (100, 105, 116), 'en': (100, 105, 116), 'jp': (100, 105, 116), 'tw': (100, 105, 116)}, button={'cn': (92, 18, 213, 48), 'en': (92, 18, 213, 48), 'jp': (92, 18, 213, 48), 'tw': (92, 18, 213, 48)}, file={'cn': './assets/cn/smallevent/EVENT_PREPARE_PAGE.png', 'en': './assets/cn/smallevent/EVENT_PREPARE_PAGE.png', 'jp': './assets/cn/smallevent/EVENT_PREPARE_PAGE.png', 'tw': './assets/cn/smallevent/EVENT_PREPARE_PAGE.png'})
EVENT_PREPARE_PAGE_2 = Button(area={'cn': (92, 18, 213, 48), 'en': (92, 18, 213, 48), 'jp': (92, 18, 213, 48), 'tw': (92, 18, 213, 48)}, color={'cn': (97, 102, 111), 'en': (97, 102, 111), 'jp': (97, 102, 111), 'tw': (97, 102, 111)}, button={'cn': (92, 18, 213, 48), 'en': (92, 18, 213, 48), 'jp': (92, 18, 213, 48), 'tw': (92, 18, 213, 48)}, file={'cn': './assets/cn/smallevent/EVENT_PREPARE_PAGE_2.png', 'en': './assets/cn/smallevent/EVENT_PREPARE_PAGE_2.png', 'jp': './assets/cn/smallevent/EVENT_PREPARE_PAGE_2.png', 'tw': './assets/cn/smallevent/EVENT_PREPARE_PAGE_2.png'})
EVENT_PREPARE_PAGE_3 = Button(area={'cn': (96, 21, 221, 58), 'en': (96, 21, 221, 58), 'jp': (96, 21, 221, 58), 'tw': (96, 21, 221, 58)}, color={'cn': (79, 85, 96), 'en': (79, 85, 96), 'jp': (79, 85, 96), 'tw': (79, 85, 96)}, button={'cn': (96, 21, 221, 58), 'en': (96, 21, 221, 58), 'jp': (96, 21, 221, 58), 'tw': (96, 21, 221, 58)}, file={'cn': './assets/cn/smallevent/EVENT_PREPARE_PAGE_3.png', 'en': './assets/cn/smallevent/EVENT_PREPARE_PAGE_3.png', 'jp': './assets/cn/smallevent/EVENT_PREPARE_PAGE_3.png', 'tw': './assets/cn/smallevent/EVENT_PREPARE_PAGE_3.png'})
NINJA_BATTLE_ENTRY = Button(area={'cn': (1102, 545, 1213, 667), 'en': (1102, 545, 1213, 667), 'jp': (1102, 545, 1213, 667), 'tw': (1102, 545, 1213, 667)}, color={'cn': (71, 79, 77), 'en': (71, 79, 77), 'jp': (71, 79, 77), 'tw': (71, 79, 77)}, button={'cn': (1102, 545, 1213, 667), 'en': (1102, 545, 1213, 667), 'jp': (1102, 545, 1213, 667), 'tw': (1102, 545, 1213, 667)}, file={'cn': './assets/cn/smallevent/NINJA_BATTLE_ENTRY.png', 'en': './assets/cn/smallevent/NINJA_BATTLE_ENTRY.png', 'jp': './assets/cn/smallevent/NINJA_BATTLE_ENTRY.png', 'tw': './assets/cn/smallevent/NINJA_BATTLE_ENTRY.png'})
NINJA_BATTLE_GOHOME = Button(area={'cn': (1197, 49, 1238, 79), 'en': (1197, 49, 1238, 79), 'jp': (1197, 49, 1238, 79), 'tw': (1197, 49, 1238, 79)}, color={'cn': (65, 101, 101), 'en': (65, 101, 101), 'jp': (65, 101, 101), 'tw': (65, 101, 101)}, button={'cn': (1197, 49, 1238, 79), 'en': (1197, 49, 1238, 79), 'jp': (1197, 49, 1238, 79), 'tw': (1197, 49, 1238, 79)}, file={'cn': './assets/cn/smallevent/NINJA_BATTLE_GOHOME.png', 'en': './assets/cn/smallevent/NINJA_BATTLE_GOHOME.png', 'jp': './assets/cn/smallevent/NINJA_BATTLE_GOHOME.png', 'tw': './assets/cn/smallevent/NINJA_BATTLE_GOHOME.png'})
NINJA_BATTLE_PICKUP = Button(area={'cn': (970, 514, 1030, 546), 'en': (970, 514, 1030, 546), 'jp': (970, 514, 1030, 546), 'tw': (970, 514, 1030, 546)}, color={'cn': (59, 102, 102), 'en': (59, 102, 102), 'jp': (59, 102, 102), 'tw': (59, 102, 102)}, button={'cn': (970, 514, 1030, 546), 'en': (970, 514, 1030, 546), 'jp': (970, 514, 1030, 546), 'tw': (970, 514, 1030, 546)}, file={'cn': './assets/cn/smallevent/NINJA_BATTLE_PICKUP.png', 'en': './assets/cn/smallevent/NINJA_BATTLE_PICKUP.png', 'jp': './assets/cn/smallevent/NINJA_BATTLE_PICKUP.png', 'tw': './assets/cn/smallevent/NINJA_BATTLE_PICKUP.png'})
NINJA_BATTLE_TASK = Button(area={'cn': (808, 645, 876, 660), 'en': (808, 645, 876, 660), 'jp': (808, 645, 876, 660), 'tw': (808, 645, 876, 660)}, color={'cn': (121, 120, 120), 'en': (121, 120, 120), 'jp': (121, 120, 120), 'tw': (121, 120, 120)}, button={'cn': (808, 645, 876, 660), 'en': (808, 645, 876, 660), 'jp': (808, 645, 876, 660), 'tw': (808, 645, 876, 660)}, file={'cn': './assets/cn/smallevent/NINJA_BATTLE_TASK.png', 'en': './assets/cn/smallevent/NINJA_BATTLE_TASK.png', 'jp': './assets/cn/smallevent/NINJA_BATTLE_TASK.png', 'tw': './assets/cn/smallevent/NINJA_BATTLE_TASK.png'})
NINJA_CITY_ENTRY = Button(area={'cn': (1090, 595, 1259, 665), 'en': (1090, 595, 1259, 665), 'jp': (1090, 595, 1259, 665), 'tw': (1090, 595, 1259, 665)}, color={'cn': (151, 158, 159), 'en': (151, 158, 159), 'jp': (151, 158, 159), 'tw': (151, 158, 159)}, button={'cn': (1090, 595, 1259, 665), 'en': (1090, 595, 1259, 665), 'jp': (1090, 595, 1259, 665), 'tw': (1090, 595, 1259, 665)}, file={'cn': './assets/cn/smallevent/NINJA_CITY_ENTRY.png', 'en': './assets/cn/smallevent/NINJA_CITY_ENTRY.png', 'jp': './assets/cn/smallevent/NINJA_CITY_ENTRY.png', 'tw': './assets/cn/smallevent/NINJA_CITY_ENTRY.png'})
NINJA_TASK_REWARD = Button(area={'cn': (949, 94, 1059, 130), 'en': (949, 94, 1059, 130), 'jp': (949, 94, 1059, 130), 'tw': (949, 94, 1059, 130)}, color={'cn': (111, 113, 114), 'en': (111, 113, 114), 'jp': (111, 113, 114), 'tw': (111, 113, 114)}, button={'cn': (949, 94, 1059, 130), 'en': (949, 94, 1059, 130), 'jp': (949, 94, 1059, 130), 'tw': (949, 94, 1059, 130)}, file={'cn': './assets/cn/smallevent/NINJA_TASK_REWARD.png', 'en': './assets/cn/smallevent/NINJA_TASK_REWARD.png', 'jp': './assets/cn/smallevent/NINJA_TASK_REWARD.png', 'tw': './assets/cn/smallevent/NINJA_TASK_REWARD.png'})
NINJA_TASK_REWARD_EMPTY = Button(area={'cn': (1004, 169, 1057, 211), 'en': (1004, 169, 1057, 211), 'jp': (1004, 169, 1057, 211), 'tw': (1004, 169, 1057, 211)}, color={'cn': (190, 199, 205), 'en': (190, 199, 205), 'jp': (190, 199, 205), 'tw': (190, 199, 205)}, button={'cn': (1004, 169, 1057, 211), 'en': (1004, 169, 1057, 211), 'jp': (1004, 169, 1057, 211), 'tw': (1004, 169, 1057, 211)}, file={'cn': './assets/cn/smallevent/NINJA_TASK_REWARD_EMPTY.png', 'en': './assets/cn/smallevent/NINJA_TASK_REWARD_EMPTY.png', 'jp': './assets/cn/smallevent/NINJA_TASK_REWARD_EMPTY.png', 'tw': './assets/cn/smallevent/NINJA_TASK_REWARD_EMPTY.png'})
SEVEND_TASK_20250320 = Button(area={'cn': (323, 103, 823, 271), 'en': (323, 103, 823, 271), 'jp': (323, 103, 823, 271), 'tw': (323, 103, 823, 271)}, color={'cn': (215, 164, 151), 'en': (215, 164, 151), 'jp': (215, 164, 151), 'tw': (215, 164, 151)}, button={'cn': (323, 103, 823, 271), 'en': (323, 103, 823, 271), 'jp': (323, 103, 823, 271), 'tw': (323, 103, 823, 271)}, file={'cn': './assets/cn/smallevent/SEVEND_TASK_20250320.png', 'en': './assets/cn/smallevent/SEVEND_TASK_20250320.png', 'jp': './assets/cn/smallevent/SEVEND_TASK_20250320.png', 'tw': './assets/cn/smallevent/SEVEND_TASK_20250320.png'})
SEVEND_TASK_FINISH_20250320 = Button(area={'cn': (322, 293, 373, 341), 'en': (322, 293, 373, 341), 'jp': (322, 293, 373, 341), 'tw': (322, 293, 373, 341)}, color={'cn': (219, 214, 211), 'en': (219, 214, 211), 'jp': (219, 214, 211), 'tw': (219, 214, 211)}, button={'cn': (322, 293, 373, 341), 'en': (322, 293, 373, 341), 'jp': (322, 293, 373, 341), 'tw': (322, 293, 373, 341)}, file={'cn': './assets/cn/smallevent/SEVEND_TASK_FINISH_20250320.png', 'en': './assets/cn/smallevent/SEVEND_TASK_FINISH_20250320.png', 'jp': './assets/cn/smallevent/SEVEND_TASK_FINISH_20250320.png', 'tw': './assets/cn/smallevent/SEVEND_TASK_FINISH_20250320.png'})
SEVEND_TASK_GET1_20250320 = Button(area={'cn': (704, 381, 866, 425), 'en': (704, 381, 866, 425), 'jp': (704, 381, 866, 425), 'tw': (704, 381, 866, 425)}, color={'cn': (157, 86, 79), 'en': (157, 86, 79), 'jp': (157, 86, 79), 'tw': (157, 86, 79)}, button={'cn': (704, 381, 866, 425), 'en': (704, 381, 866, 425), 'jp': (704, 381, 866, 425), 'tw': (704, 381, 866, 425)}, file={'cn': './assets/cn/smallevent/SEVEND_TASK_GET1_20250320.png', 'en': './assets/cn/smallevent/SEVEND_TASK_GET1_20250320.png', 'jp': './assets/cn/smallevent/SEVEND_TASK_GET1_20250320.png', 'tw': './assets/cn/smallevent/SEVEND_TASK_GET1_20250320.png'})

View File

@ -3,7 +3,6 @@ import sys
import re
from datetime import datetime, timedelta
sys.path.append(r'C:/Users/W1NDe/Documents/GitHub/M-AzurLaneAutoScript')
from module.base.button import ButtonGrid
from module.ui.ui import UI
from module.ui.page import page_main
@ -490,6 +489,70 @@ class SmallEvent(UI):
break
return False,None
def ninja_city(self,skip_first_screenshot=True):
self.ui_ensure(page_main)
NINJA_GET_REWARD = 0
NOCLICK_COUNT = 0
NOCLICK_TIMER =Timer(3,count=10)
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if self.appear_then_click(EVENT_PREPARE_ENTRY_3, offset=(5, 5), interval=3):
continue
if self.appear_then_click(NINJA_CITY_ENTRY, offset=(5, 5), interval=3):
continue
if self.appear_then_click(NINJA_BATTLE_ENTRY, offset=(5, 5), interval=3):
continue
if NINJA_GET_REWARD >= 4:
break
if self.appear_then_click(GET_ITEMS_1,offset=(10, 10), interval=3):
NINJA_GET_REWARD += 1
continue
if self.appear_then_click_nocheck(NINJA_BATTLE_PICKUP, offset=(5, 5)):
self.device.sleep(3)
continue
if self.story_skip():
continue
NOCLICK_TIMER.start()
if NOCLICK_TIMER.reached():
NOCLICK_COUNT += 1
NOCLICK_TIMER.reset()
if NOCLICK_COUNT >= 5:
logger.warning("ninja_city loop 1 No click TIMER REACHED")
return False
NOCLICK_COUNT = 0
NOCLICK_TIMER =Timer(3,count=10)
while 1:
self.device.screenshot()
if self.appear_then_click(NINJA_BATTLE_TASK, offset=(5, 5), interval=3):
continue
if self.appear_then_click(NINJA_TASK_REWARD, offset=(5, 5), interval=3):
continue
if self.appear_then_click(GET_ITEMS_1,offset=(10, 10), interval=3):
continue
if self.appear(NINJA_TASK_REWARD_EMPTY, offset=(5, 5), interval=3):
self.device.click(NINJA_BATTLE_GOHOME)
break
if self.story_skip():
continue
NOCLICK_TIMER.start()
if NOCLICK_TIMER.reached():
NOCLICK_COUNT += 1
NOCLICK_TIMER.reset()
if NOCLICK_COUNT >= 5:
logger.warning("ninja_city loop 2 No click TIMER REACHED")
return False
NOCLICK_COUNT = 0
NOCLICK_TIMER =Timer(3,count=10)
while 1:
self.device.screenshot()
if self.appear_then_click(NINJA_BATTLE_GOHOME, offset=(5, 5), interval=3):
continue
self.ui_ensure(page_main)
return True
def ocr_api_init(self):
if self.config.Smallevent_OcrModel == "baidu":
if self.config.DropRecord_BaiduAPIKey != "null" and self.config.DropRecord_BaiduAPISecret != "null":
@ -531,6 +594,11 @@ class SmallEvent(UI):
def run(self):
if datetime.now() < datetime(2025, 9, 25, 12, 0, 0):#eventSet
ninja_city_result = self.ninja_city()
if ninja_city_result:
logger.info("ninja_city success")
else:
logger.warning("ninja_city failed")
ORC_API = self.ocr_api_init()
if ORC_API:
page_area = (281, 79, 1254, 560)