From 4e7722cc17ff21ddcf899a3ae3d13c264f5ba781 Mon Sep 17 00:00:00 2001 From: W1NDes Date: Tue, 15 Jul 2025 19:11:50 +0800 Subject: [PATCH] =?UTF-8?q?Feat(ResearchCheck):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=A7=91=E7=A0=94=E8=88=B9=E7=BB=8F=E9=AA=8C=E8=BF=9B=E5=BA=A6?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=92=8C=E9=A2=86=E5=8F=96=20From=20OxcC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SHIP_EXPERIENCE_COMMIT_1.png | Bin 0 -> 9127 bytes .../SHIP_EXPERIENCE_COMMIT_2.png | Bin 0 -> 9400 bytes .../SHIP_EXPERIENCE_COMPLETE_1.png | Bin 0 -> 6634 bytes .../SHIP_EXPERIENCE_COMPLETE_2.png | Bin 0 -> 6634 bytes .../SHIP_EXPERIENCE_FINISHED_1.png | Bin 0 -> 5505 bytes .../SHIP_EXPERIENCE_FINISHED_2.png | Bin 0 -> 5507 bytes .../SHIP_EXPERIENCE_PERCENT_1.png | Bin 0 -> 8442 bytes .../SHIP_EXPERIENCE_PERCENT_2.png | Bin 0 -> 8442 bytes config/template.json | 10 ++ module/campaign/run.py | 9 ++ module/config/argument/args.json | 29 +++++ module/config/argument/argument.yaml | 8 ++ module/config/argument/dashboard.yaml | 3 +- module/config/argument/gui.yaml | 1 + module/config/argument/task.yaml | 1 + module/config/config_generated.py | 10 ++ module/config/i18n/en-US.json | 37 ++++++ module/config/i18n/ja-JP.json | 37 ++++++ module/config/i18n/zh-CN.json | 37 ++++++ module/config/i18n/zh-TW.json | 37 ++++++ module/research_farming/assets.py | 14 +++ module/research_farming/check_research.py | 110 ++++++++++++++++++ 22 files changed, 342 insertions(+), 1 deletion(-) create mode 100644 assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_1.png create mode 100644 assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_2.png create mode 100644 assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_1.png create mode 100644 assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_2.png create mode 100644 assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_1.png create mode 100644 assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_2.png create mode 100644 assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_1.png create mode 100644 assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_2.png create mode 100644 module/research_farming/assets.py create mode 100644 module/research_farming/check_research.py diff --git a/assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_1.png b/assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4cfa62304938108eb1578eb8ec554f58b1e273f1 GIT binary patch literal 9127 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 literal 0 HcmV?d00001 diff --git a/assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_2.png b/assets/cn/research_farming/SHIP_EXPERIENCE_COMMIT_2.png new file mode 100644 index 0000000000000000000000000000000000000000..017456c931eac2dbc9d987100d0098ddb3c6d632 GIT binary patch literal 9400 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 literal 0 HcmV?d00001 diff --git a/assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_2.png b/assets/cn/research_farming/SHIP_EXPERIENCE_COMPLETE_2.png new file mode 100644 index 0000000000000000000000000000000000000000..adb76f593b4520b38f07c6bd29d72a48d1f8dcf5 GIT binary patch literal 6634 zcmeHKZBr9x6kT7cR!739qit0}XKbBL1uR=ZG!Sj6)S-n=RS-qeRtbWbFzyfxNra27vPhWr`=xW}>_gjj zF41a_{dD5ziPPCCI6Hn(-B+(zGLe(82qs6}&#L!ztwtKk-HA3~#=xH3^c|7vqDwif z@YKUH_SqTH7=Z5wtq>9YiGnxpWd3iX&UA&rY zqiB|!Rim|*!O~*B*}w69ZX3_ArIpRg1KZ4TGKEHMZNjT7{XJ#qk49;oB2SL(u~;0^ zd`4j#)(k>jbq(DZ{J^}kU*&(YpVK-BwOjcyq>r3nLag-kzB)En}DwlEbN0m7jIlWWGrvPgkeHJC^5I* zR^zqvc@W1cwBJ<)T2mca;>ijF^NOTCL#0k-3EAAR4-^n4S=ai;Q~?S=yTYVI#b1!Rf8=SvlN1gyTRK2GIhIhohEQUi!Clms}pm5^|yUb zX_61n)sgX_>WU>@Izbxs_Zgk&x;~nw-6kIIb-Qqvp$@O+B#oKZfTnsG@p@!wN41Z! zE2^j?5vD0TYJtM`TDJ2%1pOm3Irej8p>J;b-I+?G?vVWEN^C`W44eFTE;M;(I8Eqq zNEm8KhR3kCn^lB`$@C4Yov8@l?=Mf}xP>xa+;eYjiJ4PkmKNZxjzLY46b~l{`nnM^ z6hM5ZE|^8b$~1p(Yg#qVJ3FOQ%1uaQxRIR#nj&}$Y0&%cmL;l)s|AT%$M}PMHu0Pn zcX((oXi9;C+A%2jCtgm=le6xNN(XfA#z82Yl_<5Mp)Vs+qc#~Szz&s)md1MM6#`fq zF&nJ3LPomxww!C2e3Z=`yV7+{=ZB3h6t_PJ)MDzj(0YV% zF6kB}cQ5m7ziKS^HVSO*C^V`n?m(;-DM~~$e`a^7`6Vg2bZbcaumPEKLlR1mzf|mO z|HYLdAiG2@FzV@Ak67WS4)$3~G0*dD8mh3d^TwtwlX-}hg}GdkmA%rj*$NW^aRi=E zVv5M;y1E9~c?$F5w{*`wbL*1}y=URjFtWD^4xO9}(%hD+2<8=4lHH(AawQ0s} zj(u!Yw?ar9c>Rx(7l{JLTTx{+VPN15U}h9Hodf1gZ$FynX_N7im&{1_V?%cXU?1j+Q7iz`JK-e%-CVeqyS>Ha5jJ_0W}6D zAmuQFfdj-%9F-gmgwd2RoU+4>cNds}Ir~BVp6V*g+jVK*vag+q*;i#7o`3J$_4D)7 z&YEq$W>fk9;RR#HzCLaTpwf3Ox!2C*ojr5rWnG%J?cBEyf1YV}-#mBj`JCI0;!HB? zi~C zwxNC}0}Ie4ei6TCZv8L%^IG27qnn=>|NnUO%=g!k_t!l?-uRtSX7%KmJ1xI})8K=$ z9Uu)14F(`985j@b=g tK&@w33w^Xq7%dY<%Y@PFFx<+7-<(|$21RQXkGu!@%+uA+Wt~$(69AmiJZAs^ literal 0 HcmV?d00001 diff --git a/assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_2.png b/assets/cn/research_farming/SHIP_EXPERIENCE_FINISHED_2.png new file mode 100644 index 0000000000000000000000000000000000000000..eda3708674f975d0312083a141a6743e0406df51 GIT binary patch literal 5507 zcmeAS@N?(olHy`uVBq!ia0y~yUoG(Heo!{VJAbR(5B zlWE$&qx>5?%!H1p`8<0(=bP#Fe>>jqojh}=9MB2|g_j2xvV#~5@A?=xKy)IL0*Gqi zYyeRLY79(3%3;Q+7Ofq=iUG~1aU6h!|YUp~Eg zW@*~B)M+yR^}--M3<^FBEI_KkV15IT zDzNz%!+h^dP3`ZrY4621+uZwaS0X9#zzlBw8uN+yH+71Cz4~fXQ)g9NYI*u<|If

%w-RA;9Kf8?OV1=0LN9Q2-=*2<(zk$W literal 0 HcmV?d00001 diff --git a/assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_1.png b/assets/cn/research_farming/SHIP_EXPERIENCE_PERCENT_1.png new file mode 100644 index 0000000000000000000000000000000000000000..11344a7aa1d38974df90cbbbcefef1582f79878d GIT binary patch literal 8442 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 S)?Bwb&+((sBeX;3Z~Pk&Ps-r{ literal 0 HcmV?d00001 diff --git a/config/template.json b/config/template.json index 2789da24e..a701db2b5 100644 --- a/config/template.json +++ b/config/template.json @@ -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", diff --git a/module/campaign/run.py b/module/campaign/run.py index aad1b2e5d..e0dae3280 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -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)) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index d818cf98e..b19a729bd 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -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", diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 2598c47e3..e84113910 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -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: diff --git a/module/config/argument/dashboard.yaml b/module/config/argument/dashboard.yaml index ab9244e55..81535ab7b 100644 --- a/module/config/argument/dashboard.yaml +++ b/module/config/argument/dashboard.yaml @@ -16,4 +16,5 @@ Dashboard: - Medal - Merit - GuildCoin - - SevenDayStatus \ No newline at end of file + - SevenDayStatus + - ResearchPercent \ No newline at end of file diff --git a/module/config/argument/gui.yaml b/module/config/argument/gui.yaml index b5bc614bf..43b1f4a94 100644 --- a/module/config/argument/gui.yaml +++ b/module/config/argument/gui.yaml @@ -69,6 +69,7 @@ Overview: Core: GuildCoin: SevenDayStatus: + ResearchPercent: Log: Running: Pending: diff --git a/module/config/argument/task.yaml b/module/config/argument/task.yaml index 783e80a08..9328fb1d7 100644 --- a/module/config/argument/task.yaml +++ b/module/config/argument/task.yaml @@ -42,6 +42,7 @@ Farm: - Scheduler - Campaign - StopCondition + - ResearchSetting - Fleet - Submarine - Emotion diff --git a/module/config/config_generated.py b/module/config/config_generated.py index 13bf489a6..b82952244 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -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' diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 11706f45e..48c871c62 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -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", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 6df78880d..ce5dc8429 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -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": "隊列中", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 533990ee6..9c63a1f60 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -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": "队列中", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 60df9169e..c7eadf5dc 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -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": "佇列中", diff --git a/module/research_farming/assets.py b/module/research_farming/assets.py new file mode 100644 index 000000000..e4455079b --- /dev/null +++ b/module/research_farming/assets.py @@ -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'}) diff --git a/module/research_farming/check_research.py b/module/research_farming/check_research.py new file mode 100644 index 000000000..7d093b107 --- /dev/null +++ b/module/research_farming/check_research.py @@ -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() \ No newline at end of file