Feat(ResearchCheck): 添加科研船经验进度检查和领取 From OxcC

This commit is contained in:
W1NDes 2025-07-15 19:11:50 +08:00
parent 512068cdbf
commit 4e7722cc17
22 changed files with 342 additions and 1 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

@ -68,6 +68,11 @@
"Color": "^AFAAAA",
"Record": "2020-01-01 00:00:00"
},
"ResearchPercent": {
"Value": 0,
"Color": "^0000FF",
"Record": "2020-01-01 00:00:00"
},
"Storage": {
"Storage": {}
}
@ -262,6 +267,11 @@
"GetNewShip": false,
"ReachLevel": 0
},
"ResearchSetting": {
"CurrentCampaignTimes": 0,
"CheckInterval": 5,
"OnepushNotify": false
},
"Fleet": {
"Fleet1": 1,
"Fleet1Formation": "double_line",

View File

@ -478,6 +478,15 @@ class CampaignRun(CampaignEvent, ShopStatus):
self.device.click_record_clear()
try:
self.campaign.run()
if self.config.task.command in ['Main2']:
CurrentTimes = self.config.ResearchSetting_CurrentCampaignTimes + 1
CheckInterval = self.config.ResearchSetting_CheckInterval
self.config.modified["Main2.ResearchSetting.CurrentCampaignTimes"] = CurrentTimes
logger.info(f"Main2:CurrentTimes: {CurrentTimes}, CheckInterval: {CheckInterval}")
if CurrentTimes % CheckInterval == 0:
from module.research_farming.check_research import ResearchFarming
ResearchFarming(config=self.config, device=self.device).CheckResearchShipExperience()
self.config.update()
except ScriptEnd as e:
logger.hr('Script end')
logger.info(str(e))

View File

@ -207,6 +207,21 @@
"validate": "datetime"
}
},
"ResearchPercent": {
"Value": {
"type": "input",
"value": 0
},
"Color": {
"type": "input",
"value": "^0000FF"
},
"Record": {
"type": "datetime",
"value": "2020-01-01 00:00:00",
"validate": "datetime"
}
},
"Storage": {
"Storage": {
"type": "storage",
@ -1179,6 +1194,20 @@
"value": 0
}
},
"ResearchSetting": {
"CurrentCampaignTimes": {
"type": "input",
"value": 0
},
"CheckInterval": {
"type": "input",
"value": 5
},
"OnepushNotify": {
"type": "checkbox",
"value": false
}
},
"Fleet": {
"Fleet1": {
"type": "select",

View File

@ -58,6 +58,10 @@ SevenDayStatus:
Value: 0
Color: ^AFAAAA
Record: 2020-01-01 00:00:00
ResearchPercent:
Value: 0
Color: ^0000FF
Record: 2020-01-01 00:00:00
# ==================== Alas ====================
Scheduler:
@ -242,6 +246,10 @@ StopCondition:
StageIncrease: false
GetNewShip: false
ReachLevel: 0
ResearchSetting:
CurrentCampaignTimes: 0
CheckInterval: 5
OnepushNotify: false
EventPt:
EventPtSwitch: false
Event2MapName:

View File

@ -16,4 +16,5 @@ Dashboard:
- Medal
- Merit
- GuildCoin
- SevenDayStatus
- SevenDayStatus
- ResearchPercent

View File

@ -69,6 +69,7 @@ Overview:
Core:
GuildCoin:
SevenDayStatus:
ResearchPercent:
Log:
Running:
Pending:

View File

@ -42,6 +42,7 @@ Farm:
- Scheduler
- Campaign
- StopCondition
- ResearchSetting
- Fleet
- Submarine
- Emotion

View File

@ -77,6 +77,11 @@ class GeneratedConfig:
SevenDayStatus_Color = '^AFAAAA'
SevenDayStatus_Record = datetime.datetime(2020, 1, 1, 0, 0)
# Group `ResearchPercent`
ResearchPercent_Value = 0
ResearchPercent_Color = '^0000FF'
ResearchPercent_Record = datetime.datetime(2020, 1, 1, 0, 0)
# Group `Scheduler`
Scheduler_Enable = False # True, False
Scheduler_NextRun = datetime.datetime(2020, 1, 1, 0, 0)
@ -164,6 +169,11 @@ class GeneratedConfig:
StopCondition_GetNewShip = False
StopCondition_ReachLevel = 0
# Group `ResearchSetting`
ResearchSetting_CurrentCampaignTimes = 0
ResearchSetting_CheckInterval = 5
ResearchSetting_OnepushNotify = False
# Group `EventPt`
EventPt_EventPtSwitch = False
EventPt_Event2MapName = 'D3'

View File

@ -541,6 +541,24 @@
"help": "SevenDayStatus.Record.help"
}
},
"ResearchPercent": {
"_info": {
"name": "ResearchPercent._info.name",
"help": "ResearchPercent._info.help"
},
"Value": {
"name": "ResearchPercent.Value.name",
"help": "ResearchPercent.Value.help"
},
"Color": {
"name": "ResearchPercent.Color.name",
"help": "ResearchPercent.Color.help"
},
"Record": {
"name": "ResearchPercent.Record.name",
"help": "ResearchPercent.Record.help"
}
},
"Scheduler": {
"_info": {
"name": "Scheduler",
@ -1162,6 +1180,24 @@
"help": "Stop current task if any ship under level X has reached level X; saving as 0 implies no limit to the level."
}
},
"ResearchSetting": {
"_info": {
"name": "ResearchSetting._info.name",
"help": "ResearchSetting._info.help"
},
"CurrentCampaignTimes": {
"name": "ResearchSetting.CurrentCampaignTimes.name",
"help": "ResearchSetting.CurrentCampaignTimes.help"
},
"CheckInterval": {
"name": "ResearchSetting.CheckInterval.name",
"help": "ResearchSetting.CheckInterval.help"
},
"OnepushNotify": {
"name": "ResearchSetting.OnepushNotify.name",
"help": "ResearchSetting.OnepushNotify.help"
}
},
"EventPt": {
"_info": {
"name": "EventPt._info.name",
@ -3162,6 +3198,7 @@
"Core": "Core Data",
"GuildCoin": "Guild Coin",
"SevenDayStatus": "Gui.Overview.SevenDayStatus",
"ResearchPercent": "Gui.Overview.ResearchPercent",
"Log": "Log",
"Running": "Running",
"Pending": "Pending",

View File

@ -541,6 +541,24 @@
"help": "SevenDayStatus.Record.help"
}
},
"ResearchPercent": {
"_info": {
"name": "ResearchPercent._info.name",
"help": "ResearchPercent._info.help"
},
"Value": {
"name": "ResearchPercent.Value.name",
"help": "ResearchPercent.Value.help"
},
"Color": {
"name": "ResearchPercent.Color.name",
"help": "ResearchPercent.Color.help"
},
"Record": {
"name": "ResearchPercent.Record.name",
"help": "ResearchPercent.Record.help"
}
},
"Scheduler": {
"_info": {
"name": "Scheduler._info.name",
@ -1162,6 +1180,24 @@
"help": "StopCondition.ReachLevel.help"
}
},
"ResearchSetting": {
"_info": {
"name": "ResearchSetting._info.name",
"help": "ResearchSetting._info.help"
},
"CurrentCampaignTimes": {
"name": "ResearchSetting.CurrentCampaignTimes.name",
"help": "ResearchSetting.CurrentCampaignTimes.help"
},
"CheckInterval": {
"name": "ResearchSetting.CheckInterval.name",
"help": "ResearchSetting.CheckInterval.help"
},
"OnepushNotify": {
"name": "ResearchSetting.OnepushNotify.name",
"help": "ResearchSetting.OnepushNotify.help"
}
},
"EventPt": {
"_info": {
"name": "EventPt._info.name",
@ -3162,6 +3198,7 @@
"Core": "Gui.Overview.Core",
"GuildCoin": "Gui.Overview.GuildCoin",
"SevenDayStatus": "Gui.Overview.SevenDayStatus",
"ResearchPercent": "Gui.Overview.ResearchPercent",
"Log": "ログ",
"Running": "実行中",
"Pending": "隊列中",

View File

@ -541,6 +541,24 @@
"help": "SevenDayStatus.Record.help"
}
},
"ResearchPercent": {
"_info": {
"name": "ResearchPercent._info.name",
"help": "ResearchPercent._info.help"
},
"Value": {
"name": "ResearchPercent.Value.name",
"help": "ResearchPercent.Value.help"
},
"Color": {
"name": "ResearchPercent.Color.name",
"help": "ResearchPercent.Color.help"
},
"Record": {
"name": "ResearchPercent.Record.name",
"help": "ResearchPercent.Record.help"
}
},
"Scheduler": {
"_info": {
"name": "任务设置",
@ -1162,6 +1180,24 @@
"help": "任意等级低于 X 的舰船升级至 X 级后停止\n0 表示不限制等级"
}
},
"ResearchSetting": {
"_info": {
"name": "研究经验设置",
"help": ""
},
"CheckInterval": {
"name": "每刷 X 次检查",
"help": ""
},
"CurrentCampaignTimes": {
"name": "当前已刷 X 次",
"help": "清空后立即检查是否刷完"
},
"OnepushNotify": {
"name": "刷完后通知",
"help": "推荐开启"
}
},
"EventPt": {
"_info": {
"name": "活动捞PT设置",
@ -3162,6 +3198,7 @@
"Core": "核心数据",
"GuildCoin": "舰队币",
"SevenDayStatus": "7日小任务",
"ResearchPercent": "科研船进度",
"Log": "日志",
"Running": "运行中",
"Pending": "队列中",

View File

@ -541,6 +541,24 @@
"help": "SevenDayStatus.Record.help"
}
},
"ResearchPercent": {
"_info": {
"name": "ResearchPercent._info.name",
"help": "ResearchPercent._info.help"
},
"Value": {
"name": "ResearchPercent.Value.name",
"help": "ResearchPercent.Value.help"
},
"Color": {
"name": "ResearchPercent.Color.name",
"help": "ResearchPercent.Color.help"
},
"Record": {
"name": "ResearchPercent.Record.name",
"help": "ResearchPercent.Record.help"
}
},
"Scheduler": {
"_info": {
"name": "任務設定",
@ -1162,6 +1180,24 @@
"help": "任意等級低於 X 的艦船升級至 X 級後停止\n0 表示不限制等級"
}
},
"ResearchSetting": {
"_info": {
"name": "ResearchSetting._info.name",
"help": "ResearchSetting._info.help"
},
"CurrentCampaignTimes": {
"name": "ResearchSetting.CurrentCampaignTimes.name",
"help": "ResearchSetting.CurrentCampaignTimes.help"
},
"CheckInterval": {
"name": "ResearchSetting.CheckInterval.name",
"help": "ResearchSetting.CheckInterval.help"
},
"OnepushNotify": {
"name": "ResearchSetting.OnepushNotify.name",
"help": "ResearchSetting.OnepushNotify.help"
}
},
"EventPt": {
"_info": {
"name": "EventPt._info.name",
@ -3162,6 +3198,7 @@
"Core": "覈心數據",
"GuildCoin": "艦隊幣",
"SevenDayStatus": "Gui.Overview.SevenDayStatus",
"ResearchPercent": "Gui.Overview.ResearchPercent",
"Log": "日誌",
"Running": "執行中",
"Pending": "佇列中",

View File

@ -0,0 +1,14 @@
from module.base.button import Button
from module.base.template import Template
# This file was automatically generated by dev_tools/button_extract.py.
# Don't modify it manually.
SHIP_EXPERIENCE_COMMIT_1 = Button(area={'cn': (1131, 474, 1191, 506), 'en': (1131, 474, 1191, 506), 'jp': (1131, 474, 1191, 506), 'tw': (1131, 474, 1191, 506)}, color={'cn': (111, 116, 125), 'en': (111, 116, 125), 'jp': (111, 116, 125), 'tw': (111, 116, 125)}, button={'cn': (1131, 474, 1191, 506), 'en': (1131, 474, 1191, 506), 'jp': (1131, 474, 1191, 506), 'tw': (1131, 474, 1191, 506)}, file={'cn': './assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_1.png', 'en': './assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_1.png', 'jp': './assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_1.png', 'tw': './assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_1.png'})
SHIP_EXPERIENCE_COMMIT_2 = Button(area={'cn': (1132, 500, 1192, 534), 'en': (1132, 500, 1192, 534), 'jp': (1132, 500, 1192, 534), 'tw': (1132, 500, 1192, 534)}, color={'cn': (112, 116, 125), 'en': (112, 116, 125), 'jp': (112, 116, 125), 'tw': (112, 116, 125)}, button={'cn': (1132, 500, 1192, 534), 'en': (1132, 500, 1192, 534), 'jp': (1132, 500, 1192, 534), 'tw': (1132, 500, 1192, 534)}, file={'cn': './assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_2.png', 'en': './assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_2.png', 'jp': './assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_2.png', 'tw': './assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_2.png'})
SHIP_EXPERIENCE_COMPLETE_1 = Button(area={'cn': (1067, 181, 1154, 186), 'en': (1067, 181, 1154, 186), 'jp': (1067, 181, 1154, 186), 'tw': (1067, 181, 1154, 186)}, color={'cn': (179, 165, 92), 'en': (179, 165, 92), 'jp': (179, 165, 92), 'tw': (179, 165, 92)}, button={'cn': (1067, 181, 1154, 186), 'en': (1067, 181, 1154, 186), 'jp': (1067, 181, 1154, 186), 'tw': (1067, 181, 1154, 186)}, file={'cn': './assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_1.png', 'en': './assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_1.png', 'jp': './assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_1.png', 'tw': './assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_1.png'})
SHIP_EXPERIENCE_COMPLETE_2 = Button(area={'cn': (1067, 371, 1154, 376), 'en': (1067, 371, 1154, 376), 'jp': (1067, 371, 1154, 376), 'tw': (1067, 371, 1154, 376)}, color={'cn': (179, 165, 92), 'en': (179, 165, 92), 'jp': (179, 165, 92), 'tw': (179, 165, 92)}, button={'cn': (1067, 371, 1154, 376), 'en': (1067, 371, 1154, 376), 'jp': (1067, 371, 1154, 376), 'tw': (1067, 371, 1154, 376)}, file={'cn': './assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_2.png', 'en': './assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_2.png', 'jp': './assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_2.png', 'tw': './assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_2.png'})
SHIP_EXPERIENCE_FINISHED_1 = Button(area={'cn': (944, 141, 953, 148), 'en': (944, 141, 953, 148), 'jp': (944, 141, 953, 148), 'tw': (944, 141, 953, 148)}, color={'cn': (190, 105, 96), 'en': (190, 105, 96), 'jp': (190, 105, 96), 'tw': (190, 105, 96)}, button={'cn': (944, 141, 953, 148), 'en': (944, 141, 953, 148), 'jp': (944, 141, 953, 148), 'tw': (944, 141, 953, 148)}, file={'cn': './assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_1.png', 'en': './assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_1.png', 'jp': './assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_1.png', 'tw': './assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_1.png'})
SHIP_EXPERIENCE_FINISHED_2 = Button(area={'cn': (944, 331, 953, 338), 'en': (944, 331, 953, 338), 'jp': (944, 331, 953, 338), 'tw': (944, 331, 953, 338)}, color={'cn': (191, 104, 96), 'en': (191, 104, 96), 'jp': (191, 104, 96), 'tw': (191, 104, 96)}, button={'cn': (944, 331, 953, 338), 'en': (944, 331, 953, 338), 'jp': (944, 331, 953, 338), 'tw': (944, 331, 953, 338)}, file={'cn': './assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_2.png', 'en': './assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_2.png', 'jp': './assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_2.png', 'tw': './assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_2.png'})
SHIP_EXPERIENCE_PERCENT_1 = Button(area={'cn': (949, 182, 1271, 190), 'en': (949, 182, 1271, 190), 'jp': (949, 182, 1271, 190), 'tw': (949, 182, 1271, 190)}, color={'cn': (165, 158, 89), 'en': (165, 158, 89), 'jp': (165, 158, 89), 'tw': (165, 158, 89)}, button={'cn': (949, 182, 1271, 190), 'en': (949, 182, 1271, 190), 'jp': (949, 182, 1271, 190), 'tw': (949, 182, 1271, 190)}, file={'cn': './assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_1.png', 'en': './assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_1.png', 'jp': './assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_1.png', 'tw': './assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_1.png'})
SHIP_EXPERIENCE_PERCENT_2 = Button(area={'cn': (949, 372, 1271, 380), 'en': (949, 372, 1271, 380), 'jp': (949, 372, 1271, 380), 'tw': (949, 372, 1271, 380)}, color={'cn': (165, 158, 89), 'en': (165, 158, 89), 'jp': (165, 158, 89), 'tw': (165, 158, 89)}, button={'cn': (949, 372, 1271, 380), 'en': (949, 372, 1271, 380), 'jp': (949, 372, 1271, 380), 'tw': (949, 372, 1271, 380)}, file={'cn': './assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_2.png', 'en': './assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_2.png', 'jp': './assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_2.png', 'tw': './assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_2.png'})

View File

@ -0,0 +1,110 @@
from module.base.utils import color_bar_percentage
from module.config.deep import deep_get
from module.logger import logger
from module.base.base import ModuleBase
from module.ui.ui import UI
from module.ui.page import page_shipyard
from module.shipyard.shipyard_reward import RewardShipyard
from module.research_farming.assets import (SHIP_EXPERIENCE_PERCENT_1, SHIP_EXPERIENCE_PERCENT_2,
SHIP_EXPERIENCE_FINISHED_1, SHIP_EXPERIENCE_FINISHED_2,
SHIP_EXPERIENCE_COMPLETE_1, SHIP_EXPERIENCE_COMPLETE_2,
SHIP_EXPERIENCE_COMMIT_1, SHIP_EXPERIENCE_COMMIT_2)
from datetime import datetime
class ExpHasFinished(Exception):
...
class ExpFinished(Exception):
...
class ExpNotFinished(Exception):
...
class ResearchFarming(UI, ModuleBase):
# def _DisableAllResearchFarmTask(self):
# for i in range(1, 7):
# self.config.modified[f"{self._GetResearchFarmTaskName(i)}.Scheduler.Enable"] = False
# self.config.modified["ResearchFarmingSetting.OpsiHazard1ResearchFarming.Enable"] = False
# self.config.save(self.config.config_name)
def _Override(self, Index):
if Index == 1:
self.SHIP_EXPERIENCE_PERCENT = SHIP_EXPERIENCE_PERCENT_1
self.SHIP_EXPERIENCE_FINISHED = SHIP_EXPERIENCE_FINISHED_1
self.SHIP_EXPERIENCE_COMPLETE = SHIP_EXPERIENCE_COMPLETE_1
self.SHIP_EXPERIENCE_COMMIT = SHIP_EXPERIENCE_COMMIT_1
elif Index == 2:
self.SHIP_EXPERIENCE_PERCENT = SHIP_EXPERIENCE_PERCENT_2
self.SHIP_EXPERIENCE_FINISHED = SHIP_EXPERIENCE_FINISHED_2
self.SHIP_EXPERIENCE_COMPLETE = SHIP_EXPERIENCE_COMPLETE_2
self.SHIP_EXPERIENCE_COMMIT = SHIP_EXPERIENCE_COMMIT_2
def _UiGotoTargetShip(self):
self.ui_goto(page_shipyard)
# Series = deep_get(self.config.data, "ResearchFarmingSetting.ResearchFarmingSetting.ResearchSeries")
# Index = deep_get(self.config.data, "ResearchFarmingSetting.ResearchFarmingSetting.ShipIndex")
# RewardShipyard(config=self.config, device=self.device).shipyard_set_focus(series=Series, index=Index)
def _IsSingleFinished(self, Index):
self._Override(Index)
if self.appear(self.SHIP_EXPERIENCE_COMPLETE,offset=(10,15)):
logger.info(f"ship's exp {Index} has completed")
raise ExpHasFinished
CurrentPercent = color_bar_percentage(self.device.image, self.SHIP_EXPERIENCE_PERCENT.area, prev_color=(255, 239, 82))
if CurrentPercent > 0.99 and self.appear(self.SHIP_EXPERIENCE_FINISHED,offset=(15,15)):
logger.info(f"commit ship's exp {Index}")
self.ui_click(self.SHIP_EXPERIENCE_FINISHED, check_button=self.SHIP_EXPERIENCE_COMMIT)
self.device.sleep(0.5)
self.device.click(self.SHIP_EXPERIENCE_COMMIT)
logger.info(f"ship's exp {Index} has completed")
raise ExpFinished
self.config.modified["Dashboard.ResearchPercent.Value"] = int((Index-1+CurrentPercent) * 100)
self.config.modified["Dashboard.ResearchPercent.Record"] = datetime.now().replace(microsecond=0)
logger.info(f"ship's exp {Index} not finished,now {(Index-1+CurrentPercent)*100:.2f}%")
raise ExpNotFinished
def _Notify(self, Index):
IsPush = deep_get(self.config.data, "Main2.ResearchSetting.OnepushNotify")
if IsPush:
from module.notify import handle_notify
handle_notify(self.config.Error_OnePushConfig,
title=f"Alas <{self.config.config_name}>: Research ship's experience finished",
content=f"Ship's experience {Index} has finished")
def CheckResearchShipExperience(self):
self.device.screenshot()
self._UiGotoTargetShip()
try:
self._IsSingleFinished(1)
except ExpHasFinished:
pass
except ExpFinished:
self._Notify(1)
return
except ExpNotFinished:
return
try:
self._IsSingleFinished(2)
except (ExpHasFinished, ExpFinished):
# self._DisableAllResearchFarmTask()
self._Notify(2)
except ExpNotFinished:
return
def run(self):
self.config.task_stop()
if __name__ == "__main__":
self = ResearchFarming('zTTT')
self.CheckResearchShipExperience()