From 628814c4b6f67f209b3a5f541b29d10d9de2d497 Mon Sep 17 00:00:00 2001 From: POLAR me Date: Thu, 26 Dec 2024 04:23:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(Oilkeep):=20=E6=B7=BB=E5=8A=A0=E7=9F=B3?= =?UTF-8?q?=E6=B2=B9=E5=B9=B3=E8=A1=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实现每日领取储藏室石油的功能 --- alas.py | 6 +- assets/cn/oilkeep/MAIL_OIL.png | Bin 0 -> 7630 bytes assets/cn/oilkeep/MAIL_OIL_ADD.png | Bin 0 -> 4973 bytes assets/cn/oilkeep/MAIL_OIL_GET.png | Bin 0 -> 7057 bytes assets/cn/oilkeep/MAIL_OIL_GET_ENSURE.png | Bin 0 -> 5761 bytes config/template.json | 16 ++ module/campaign/assets.py | 2 +- module/config/argument/args.json | 51 ++++++ module/config/argument/argument.yaml | 3 + module/config/argument/menu.json | 3 +- module/config/argument/task.yaml | 3 + module/config/config_generated.py | 5 +- module/config/config_manual.py | 2 +- module/config/i18n/zh-CN.json | 14 ++ module/handler/assets.py | 4 +- module/oilkeep/assets.py | 10 ++ module/oilkeep/oilkeep.py | 187 ++++++++++++++++++++++ 17 files changed, 299 insertions(+), 7 deletions(-) create mode 100644 assets/cn/oilkeep/MAIL_OIL.png create mode 100644 assets/cn/oilkeep/MAIL_OIL_ADD.png create mode 100644 assets/cn/oilkeep/MAIL_OIL_GET.png create mode 100644 assets/cn/oilkeep/MAIL_OIL_GET_ENSURE.png create mode 100644 module/oilkeep/assets.py create mode 100644 module/oilkeep/oilkeep.py diff --git a/alas.py b/alas.py index 495349c8f..1aee1d2f2 100644 --- a/alas.py +++ b/alas.py @@ -297,7 +297,11 @@ class AzurLaneAutoScript: def reward(self): from module.reward.reward import Reward Reward(config=self.config, device=self.device).run() - + + def oilkeep(self): + from module.oilkeep.oilkeep import Oilkeep + Oilkeep(config=self.config, device=self.device).run() + def shop_frequent(self): from module.shop.shop_reward import RewardShop RewardShop(config=self.config, device=self.device).run_frequent() diff --git a/assets/cn/oilkeep/MAIL_OIL.png b/assets/cn/oilkeep/MAIL_OIL.png new file mode 100644 index 0000000000000000000000000000000000000000..96e06b2c8c5876cd3da065a0c25b2be58b1642d2 GIT binary patch literal 7630 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 PDiZKV2}eo}oxJcr^gSrY literal 0 HcmV?d00001 diff --git a/assets/cn/oilkeep/MAIL_OIL_GET_ENSURE.png b/assets/cn/oilkeep/MAIL_OIL_GET_ENSURE.png new file mode 100644 index 0000000000000000000000000000000000000000..c47c2441a6c62a5ec496644b25bf3bbf6aedff84 GIT binary patch literal 5761 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 literal 0 HcmV?d00001 diff --git a/config/template.json b/config/template.json index 27394b6e1..661f6f20e 100644 --- a/config/template.json +++ b/config/template.json @@ -1687,6 +1687,22 @@ "Storage": {} } }, + "Oilkeep": { + "Scheduler": { + "Enable": false, + "NextRun": "2020-01-01 00:00:00", + "Command": "Oilkeep", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00, 6:00, 12:00, 18:00" + }, + "Oilkeep": { + "OilkeepLevel": "8000" + }, + "Storage": { + "Storage": {} + } + }, "Minigame": { "Scheduler": { "Enable": false, diff --git a/module/campaign/assets.py b/module/campaign/assets.py index 8af783a68..21dc9336f 100644 --- a/module/campaign/assets.py +++ b/module/campaign/assets.py @@ -17,8 +17,8 @@ OCR_COIN_LIMIT = Button(area={'cn': (807, 0, 944, 19), 'en': (807, 0, 944, 19), OCR_EVENT_PT = Button(area={'cn': (1196, 109, 1280, 131), 'en': (1190, 109, 1280, 129), 'jp': (1196, 109, 1280, 131), 'tw': (1196, 109, 1280, 131)}, color={'cn': (121, 110, 59), 'en': (88, 78, 51), 'jp': (121, 110, 59), 'tw': (121, 110, 59)}, button={'cn': (1196, 109, 1280, 131), 'en': (1190, 109, 1280, 129), 'jp': (1196, 109, 1280, 131), 'tw': (1196, 109, 1280, 131)}, file={'cn': './assets/cn/campaign/OCR_EVENT_PT.png', 'en': './assets/en/campaign/OCR_EVENT_PT.png', 'jp': './assets/jp/campaign/OCR_EVENT_PT.png', 'tw': './assets/tw/campaign/OCR_EVENT_PT.png'}) OCR_GEM = Button(area={'cn': (1024, 23, 1137, 51), 'en': (1024, 23, 1137, 51), 'jp': (1024, 23, 1137, 51), 'tw': (1024, 23, 1137, 51)}, color={'cn': (102, 102, 100), 'en': (102, 102, 100), 'jp': (102, 102, 100), 'tw': (102, 102, 100)}, button={'cn': (1024, 23, 1137, 51), 'en': (1024, 23, 1137, 51), 'jp': (1024, 23, 1137, 51), 'tw': (1024, 23, 1137, 51)}, file={'cn': './assets/cn/campaign/OCR_GEM.png', 'en': './assets/cn/campaign/OCR_GEM.png', 'jp': './assets/cn/campaign/OCR_GEM.png', 'tw': './assets/cn/campaign/OCR_GEM.png'}) OCR_OIL = Button(area={'cn': (614, 23, 714, 51), 'en': (614, 23, 714, 51), 'jp': (614, 23, 714, 51), 'tw': (614, 23, 714, 51)}, color={'cn': (64, 65, 79), 'en': (64, 65, 79), 'jp': (64, 65, 79), 'tw': (64, 65, 79)}, button={'cn': (614, 23, 714, 51), 'en': (614, 23, 714, 51), 'jp': (614, 23, 714, 51), 'tw': (614, 23, 714, 51)}, file={'cn': './assets/cn/campaign/OCR_OIL.png', 'en': './assets/en/campaign/OCR_OIL.png', 'jp': './assets/jp/campaign/OCR_OIL.png', 'tw': './assets/tw/campaign/OCR_OIL.png'}) -OCR_OIL_LIMIT = Button(area={'cn': (608, 0, 736, 19), 'en': (608, 0, 736, 19), 'jp': (608, 0, 736, 19), 'tw': (608, 0, 736, 19)}, color={'cn': (202, 202, 202), 'en': (202, 202, 202), 'jp': (202, 202, 202), 'tw': (202, 202, 202)}, button={'cn': (608, 0, 736, 19), 'en': (608, 0, 736, 19), 'jp': (608, 0, 736, 19), 'tw': (608, 0, 736, 19)}, file={'cn': './assets/cn/campaign/OCR_OIL_LIMIT.png', 'en': './assets/en/campaign/OCR_OIL_LIMIT.png', 'jp': './assets/jp/campaign/OCR_OIL_LIMIT.png', 'tw': './assets/tw/campaign/OCR_OIL_LIMIT.png'}) OCR_OIL_CHECK = Button(area={'cn': (573, 30, 592, 49), 'en': (573, 30, 592, 49), 'jp': (573, 30, 592, 49), 'tw': (573, 30, 592, 49)}, color={'cn': (82, 82, 82), 'en': (82, 82, 82), 'jp': (82, 82, 82), 'tw': (82, 82, 82)}, button={'cn': (573, 30, 592, 49), 'en': (573, 30, 592, 49), 'jp': (573, 30, 592, 49), 'tw': (573, 30, 592, 49)}, file={'cn': './assets/cn/campaign/OCR_OIL_CHECK.png', 'en': './assets/en/campaign/OCR_OIL_CHECK.png', 'jp': './assets/jp/campaign/OCR_OIL_CHECK.png', 'tw': './assets/tw/campaign/OCR_OIL_CHECK.png'}) +OCR_OIL_LIMIT = Button(area={'cn': (608, 0, 736, 19), 'en': (608, 0, 736, 19), 'jp': (608, 0, 736, 19), 'tw': (608, 0, 736, 19)}, color={'cn': (202, 202, 202), 'en': (202, 202, 202), 'jp': (202, 202, 202), 'tw': (202, 202, 202)}, button={'cn': (608, 0, 736, 19), 'en': (608, 0, 736, 19), 'jp': (608, 0, 736, 19), 'tw': (608, 0, 736, 19)}, file={'cn': './assets/cn/campaign/OCR_OIL_LIMIT.png', 'en': './assets/en/campaign/OCR_OIL_LIMIT.png', 'jp': './assets/jp/campaign/OCR_OIL_LIMIT.png', 'tw': './assets/tw/campaign/OCR_OIL_LIMIT.png'}) SWITCH_1_HARD = Button(area={'cn': (82, 641, 148, 675), 'en': (87, 642, 148, 676), 'jp': (24, 645, 150, 697), 'tw': (82, 641, 148, 675)}, color={'cn': (233, 141, 128), 'en': (234, 139, 124), 'jp': (219, 116, 106), 'tw': (236, 159, 148)}, button={'cn': (82, 641, 148, 675), 'en': (87, 642, 148, 676), 'jp': (24, 645, 150, 697), 'tw': (82, 641, 148, 675)}, file={'cn': './assets/cn/campaign/SWITCH_1_HARD.png', 'en': './assets/en/campaign/SWITCH_1_HARD.png', 'jp': './assets/jp/campaign/SWITCH_1_HARD.png', 'tw': './assets/tw/campaign/SWITCH_1_HARD.png'}) SWITCH_1_NORMAL = Button(area={'cn': (80, 641, 148, 675), 'en': (79, 638, 147, 675), 'jp': (24, 644, 150, 697), 'tw': (79, 641, 148, 675)}, color={'cn': (157, 180, 227), 'en': (157, 180, 227), 'jp': (143, 169, 222), 'tw': (156, 179, 227)}, button={'cn': (80, 641, 148, 675), 'en': (79, 638, 147, 675), 'jp': (24, 644, 150, 697), 'tw': (79, 641, 148, 675)}, file={'cn': './assets/cn/campaign/SWITCH_1_NORMAL.png', 'en': './assets/en/campaign/SWITCH_1_NORMAL.png', 'jp': './assets/jp/campaign/SWITCH_1_NORMAL.png', 'tw': './assets/tw/campaign/SWITCH_1_NORMAL.png'}) SWITCH_20241219_COMBAT = Button(area={'cn': (39, 659, 71, 691), 'en': (39, 659, 71, 691), 'jp': (39, 659, 71, 691), 'tw': (39, 659, 71, 691)}, color={'cn': (133, 96, 49), 'en': (133, 96, 49), 'jp': (133, 96, 49), 'tw': (133, 96, 49)}, button={'cn': (39, 659, 71, 691), 'en': (39, 659, 71, 691), 'jp': (39, 659, 71, 691), 'tw': (39, 659, 71, 691)}, file={'cn': './assets/cn/campaign/SWITCH_20241219_COMBAT.png', 'en': './assets/cn/campaign/SWITCH_20241219_COMBAT.png', 'jp': './assets/cn/campaign/SWITCH_20241219_COMBAT.png', 'tw': './assets/cn/campaign/SWITCH_20241219_COMBAT.png'}) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index e2b06710e..867498c63 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -8877,6 +8877,57 @@ } } }, + "Oilkeep": { + "Scheduler": { + "Enable": { + "type": "checkbox", + "value": false, + "option": [ + true, + false + ] + }, + "NextRun": { + "type": "datetime", + "value": "2020-01-01 00:00:00", + "validate": "datetime" + }, + "Command": { + "type": "input", + "value": "Oilkeep", + "display": "hide" + }, + "SuccessInterval": { + "type": "input", + "value": 30, + "display": "hide" + }, + "FailureInterval": { + "type": "input", + "value": 30, + "display": "hide" + }, + "ServerUpdate": { + "type": "input", + "value": "00:00, 6:00, 12:00, 18:00", + "display": "hide" + } + }, + "Oilkeep": { + "OilkeepLevel": { + "type": "input", + "value": "8000" + } + }, + "Storage": { + "Storage": { + "type": "storage", + "value": {}, + "valuetype": "ignore", + "display": "disabled" + } + } + }, "Minigame": { "Scheduler": { "Enable": { diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 8a8196c0c..b0ad0eec8 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -628,6 +628,9 @@ SupplyPack: option: [ 0, 1, 2, 3, 4, 5, 6 ] Minigame: Collect: false + +Oilkeep: + OilkeepLevel: 8000 # ==================== Daily ==================== Daily: diff --git a/module/config/argument/menu.json b/module/config/argument/menu.json index 041e0189b..fa557ffc2 100644 --- a/module/config/argument/menu.json +++ b/module/config/argument/menu.json @@ -55,7 +55,8 @@ "Dorm", "Meowfficer", "Guild", - "Reward" + "Reward", + "Oilkeep" ] }, "DailyMission": { diff --git a/module/config/argument/task.yaml b/module/config/argument/task.yaml index b826b5736..c8ac27532 100644 --- a/module/config/argument/task.yaml +++ b/module/config/argument/task.yaml @@ -226,6 +226,9 @@ Reward: Reward: - Scheduler - Reward + Oilkeep: + - Scheduler + - Oilkeep # ==================== DailyMission ==================== diff --git a/module/config/config_generated.py b/module/config/config_generated.py index 0ec5f5773..a026b86eb 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -387,7 +387,10 @@ class GeneratedConfig: # Group `SupplyPack` SupplyPack_Collect = True SupplyPack_DayOfWeek = 0 # 0, 1, 2, 3, 4, 5, 6 - + + # Group `Oilkeep` + Oilkeep_OilkeepLevel = 8000 + # Group `Minigame` Minigame_Collect = False diff --git a/module/config/config_manual.py b/module/config/config_manual.py index 1fa4e8398..b3bbd2102 100644 --- a/module/config/config_manual.py +++ b/module/config/config_manual.py @@ -15,7 +15,7 @@ class ManualConfig: > Exercise > Dorm > Meowfficer > Guild > Gacha > Reward - > ShopFrequent > ShopOnce > Shipyard > Freebies > Minigame + > ShopFrequent > ShopOnce > Shipyard > Freebies > Oilkeep > Minigame > OpsiExplore > OpsiAshBeacon > OpsiDaily > OpsiShop > OpsiVoucher diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index cc75881e8..161c724f2 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -154,6 +154,10 @@ "name": "每日任务", "help": "" }, + "Oilkeep": { + "name": "石油平衡", + "help": "" + }, "Hard": { "name": "困难图", "help": "" @@ -2349,6 +2353,16 @@ "6": "6" } }, + "Oilkeep": { + "_info": { + "name": "石油平衡", + "help": "每天领取4次储藏室的石油以稳定石油量" + }, + "OilkeepLevel": { + "name": "石油平衡值", + "help": "默认为8000,即石油量小于7900的时候会领取石油至7900" + } + }, "Hard": { "_info": { "name": "困难图", diff --git a/module/handler/assets.py b/module/handler/assets.py index 877fca970..ed6e25c54 100644 --- a/module/handler/assets.py +++ b/module/handler/assets.py @@ -45,7 +45,7 @@ INFO_BAR_AREA = Button(area={'cn': (200, 173, 1080, 348), 'en': (200, 173, 1080, INFO_BAR_DETECT = Button(area={'cn': (194, 299, 1086, 348), 'en': (194, 299, 1086, 348), 'jp': (194, 299, 1086, 348), 'tw': (194, 299, 1086, 348)}, color={'cn': (48, 53, 65), 'en': (48, 53, 65), 'jp': (48, 53, 65), 'tw': (48, 53, 65)}, button={'cn': (194, 299, 1086, 348), 'en': (194, 299, 1086, 348), 'jp': (194, 299, 1086, 348), 'tw': (194, 299, 1086, 348)}, file={'cn': './assets/cn/handler/INFO_BAR_DETECT.png', 'en': './assets/en/handler/INFO_BAR_DETECT.png', 'jp': './assets/jp/handler/INFO_BAR_DETECT.png', 'tw': './assets/tw/handler/INFO_BAR_DETECT.png'}) IN_MAP = Button(area={'cn': (749, 654, 921, 707), 'en': (757, 654, 917, 699), 'jp': (748, 653, 919, 705), 'tw': (749, 654, 921, 707)}, color={'cn': (213, 124, 124), 'en': (215, 132, 132), 'jp': (212, 124, 124), 'tw': (213, 124, 124)}, button={'cn': (749, 654, 921, 707), 'en': (757, 654, 917, 699), 'jp': (748, 653, 919, 705), 'tw': (749, 654, 921, 707)}, file={'cn': './assets/cn/handler/IN_MAP.png', 'en': './assets/en/handler/IN_MAP.png', 'jp': './assets/jp/handler/IN_MAP.png', 'tw': './assets/tw/handler/IN_MAP.png'}) IN_STAGE = Button(area={'cn': (122, 16, 172, 39), 'en': (120, 18, 208, 40), 'jp': (121, 15, 174, 40), 'tw': (122, 16, 172, 39)}, color={'cn': (149, 167, 207), 'en': (104, 118, 157), 'jp': (151, 167, 205), 'tw': (149, 167, 207)}, button={'cn': (122, 16, 172, 39), 'en': (120, 18, 208, 40), 'jp': (121, 15, 174, 40), 'tw': (122, 16, 172, 39)}, file={'cn': './assets/cn/handler/IN_STAGE.png', 'en': './assets/en/handler/IN_STAGE.png', 'jp': './assets/jp/handler/IN_STAGE.png', 'tw': './assets/tw/handler/IN_STAGE.png'}) -LOGIN_ANNOUNCE = Button(area={'cn': (1160, 45, 1227, 90), 'en': (1159, 44, 1228, 91), 'jp': (1160, 46, 1224, 86), 'tw': (1160, 45, 1227, 90)}, color={'cn': (174, 61, 56), 'en': (193, 79, 73), 'jp': (191, 79, 74), 'tw': (174, 61, 56)}, button={'cn': (1160, 61, 1190, 90), 'en': (1160, 61, 1190, 90), 'jp': (1160, 61, 1190, 90), 'tw': (1160, 61, 1190, 90)}, file={'cn': './assets/cn/handler/LOGIN_ANNOUNCE.png', 'en': './assets/en/handler/LOGIN_ANNOUNCE.png', 'jp': './assets/jp/handler/LOGIN_ANNOUNCE.png', 'tw': './assets/tw/handler/LOGIN_ANNOUNCE.png'}) +LOGIN_ANNOUNCE = Button(area={'cn': (1192, 81, 1224, 113), 'en': (1159, 44, 1228, 91), 'jp': (1160, 46, 1224, 86), 'tw': (1160, 45, 1227, 90)}, color={'cn': (182, 196, 199), 'en': (193, 79, 73), 'jp': (191, 79, 74), 'tw': (174, 61, 56)}, button={'cn': (1192, 81, 1224, 113), 'en': (1160, 61, 1190, 90), 'jp': (1160, 61, 1190, 90), 'tw': (1160, 61, 1190, 90)}, file={'cn': './assets/cn/handler/LOGIN_ANNOUNCE.png', 'en': './assets/en/handler/LOGIN_ANNOUNCE.png', 'jp': './assets/jp/handler/LOGIN_ANNOUNCE.png', 'tw': './assets/tw/handler/LOGIN_ANNOUNCE.png'}) LOGIN_ANNOUNCE_2 = Button(area={'cn': (1193, 83, 1215, 105), 'en': (1193, 83, 1215, 105), 'jp': (1193, 83, 1215, 105), 'tw': (1193, 83, 1215, 105)}, color={'cn': (158, 170, 175), 'en': (158, 170, 175), 'jp': (158, 170, 175), 'tw': (158, 170, 175)}, button={'cn': (1171, 83, 1193, 105), 'en': (1171, 83, 1193, 105), 'jp': (1171, 83, 1193, 105), 'tw': (1171, 83, 1193, 105)}, file={'cn': './assets/cn/handler/LOGIN_ANNOUNCE_2.png', 'en': './assets/en/handler/LOGIN_ANNOUNCE_2.png', 'jp': './assets/jp/handler/LOGIN_ANNOUNCE_2.png', 'tw': './assets/tw/handler/LOGIN_ANNOUNCE_2.png'}) LOGIN_CHECK = Button(area={'cn': (1214, 653, 1268, 709), 'en': (1214, 653, 1268, 709), 'jp': (1214, 653, 1268, 709), 'tw': (1214, 653, 1268, 709)}, color={'cn': (203, 215, 230), 'en': (203, 215, 230), 'jp': (203, 215, 230), 'tw': (203, 215, 230)}, button={'cn': (416, 294, 534, 400), 'en': (1078, 591, 1168, 635), 'jp': (416, 294, 534, 400), 'tw': (416, 294, 534, 400)}, file={'cn': './assets/cn/handler/LOGIN_CHECK.png', 'en': './assets/en/handler/LOGIN_CHECK.png', 'jp': './assets/jp/handler/LOGIN_CHECK.png', 'tw': './assets/tw/handler/LOGIN_CHECK.png'}) LOGIN_GAME_UPDATE = Button(area={'cn': (700, 471, 873, 529), 'en': (726, 474, 850, 519), 'jp': (704, 475, 867, 525), 'tw': (706, 477, 866, 528)}, color={'cn': (238, 170, 78), 'en': (241, 169, 73), 'jp': (234, 167, 77), 'tw': (235, 169, 80)}, button={'cn': (700, 471, 873, 529), 'en': (726, 474, 850, 519), 'jp': (704, 475, 867, 525), 'tw': (706, 477, 866, 528)}, file={'cn': './assets/cn/handler/LOGIN_GAME_UPDATE.png', 'en': './assets/en/handler/LOGIN_GAME_UPDATE.png', 'jp': './assets/jp/handler/LOGIN_GAME_UPDATE.png', 'tw': './assets/tw/handler/LOGIN_GAME_UPDATE.png'}) @@ -71,7 +71,6 @@ MOB_MOVE_CANCEL = Button(area={'cn': (1162, 646, 1220, 674), 'en': (1112, 646, 1 MOB_MOVE_ENTER = Button(area={'cn': (1102, 504, 1157, 578), 'en': (1102, 504, 1157, 578), 'jp': (1102, 504, 1157, 578), 'tw': (1102, 504, 1157, 578)}, color={'cn': (122, 124, 131), 'en': (122, 124, 131), 'jp': (122, 124, 131), 'tw': (122, 124, 131)}, button={'cn': (1102, 504, 1157, 578), 'en': (1102, 504, 1157, 578), 'jp': (1102, 504, 1157, 578), 'tw': (1102, 504, 1157, 578)}, file={'cn': './assets/cn/handler/MOB_MOVE_ENTER.png', 'en': './assets/en/handler/MOB_MOVE_ENTER.png', 'jp': './assets/jp/handler/MOB_MOVE_ENTER.png', 'tw': './assets/tw/handler/MOB_MOVE_ENTER.png'}) MONTHLY_PASS_NOTICE = Button(area={'cn': (554, 505, 726, 561), 'en': (716, 488, 869, 533), 'jp': (554, 505, 726, 561), 'tw': (554, 505, 726, 561)}, color={'cn': (109, 153, 208), 'en': (89, 138, 201), 'jp': (109, 153, 208), 'tw': (109, 153, 208)}, button={'cn': (872, 152, 939, 196), 'en': (863, 173, 929, 217), 'jp': (872, 152, 939, 196), 'tw': (872, 152, 939, 196)}, file={'cn': './assets/cn/handler/MONTHLY_PASS_NOTICE.png', 'en': './assets/en/handler/MONTHLY_PASS_NOTICE.png', 'jp': './assets/cn/handler/MONTHLY_PASS_NOTICE.png', 'tw': './assets/cn/handler/MONTHLY_PASS_NOTICE.png'}) MYSTERY_ITEM = Button(area={'cn': (589, 294, 691, 427), 'en': (589, 294, 691, 427), 'jp': (589, 294, 691, 427), 'tw': (589, 294, 691, 427)}, color={'cn': (144, 127, 83), 'en': (144, 127, 83), 'jp': (144, 127, 83), 'tw': (144, 127, 83)}, button={'cn': (588, 478, 698, 496), 'en': (588, 478, 698, 496), 'jp': (588, 478, 698, 496), 'tw': (588, 478, 698, 496)}, file={'cn': './assets/cn/handler/MYSTERY_ITEM.png', 'en': './assets/en/handler/MYSTERY_ITEM.png', 'jp': './assets/jp/handler/MYSTERY_ITEM.png', 'tw': './assets/tw/handler/MYSTERY_ITEM.png'}) -otherlogin = Button(area={'cn': (568, 333, 715, 356), 'en': (370, 340, 905, 354), 'jp': (472, 334, 640, 357), 'tw': (568, 333, 715, 356)}, color={'cn': (144, 149, 154), 'en': (180, 183, 186), 'jp': (151, 155, 159), 'tw': (144, 149, 154)}, button={'cn': (568, 333, 715, 356), 'en': (370, 340, 905, 354), 'jp': (472, 334, 640, 357), 'tw': (568, 333, 715, 356)}, file={'cn': './assets/cn/handler/otherlogin.png', 'en': './assets/en/handler/otherlogin.png', 'jp': './assets/jp/handler/otherlogin.png', 'tw': './assets/cn/handler/otherlogin.png'}) POPUP_CANCEL = Button(area={'cn': (453, 506, 525, 536), 'en': (407, 485, 574, 535), 'jp': (455, 515, 521, 546), 'tw': (454, 495, 525, 526)}, color={'cn': (196, 198, 199), 'en': (168, 169, 171), 'jp': (181, 183, 184), 'tw': (195, 196, 197)}, button={'cn': (453, 506, 525, 536), 'en': (407, 485, 574, 535), 'jp': (455, 515, 521, 546), 'tw': (454, 495, 525, 526)}, file={'cn': './assets/cn/handler/POPUP_CANCEL.png', 'en': './assets/en/handler/POPUP_CANCEL.gif', 'jp': './assets/jp/handler/POPUP_CANCEL.png', 'tw': './assets/tw/handler/POPUP_CANCEL.png'}) POPUP_CONFIRM = Button(area={'cn': (754, 502, 825, 532), 'en': (707, 487, 874, 537), 'jp': (754, 518, 826, 547), 'tw': (754, 495, 825, 525)}, color={'cn': (153, 183, 222), 'en': (105, 151, 207), 'jp': (139, 172, 215), 'tw': (147, 178, 218)}, button={'cn': (754, 502, 825, 532), 'en': (707, 487, 874, 537), 'jp': (754, 518, 826, 547), 'tw': (754, 495, 825, 525)}, file={'cn': './assets/cn/handler/POPUP_CONFIRM.png', 'en': './assets/en/handler/POPUP_CONFIRM.gif', 'jp': './assets/jp/handler/POPUP_CONFIRM.png', 'tw': './assets/tw/handler/POPUP_CONFIRM.png'}) STORY_CLOSE = Button(area={'cn': (1227, 28, 1252, 53), 'en': (1227, 28, 1252, 53), 'jp': (1227, 28, 1252, 53), 'tw': (1227, 28, 1252, 53)}, color={'cn': (87, 90, 104), 'en': (87, 90, 104), 'jp': (87, 90, 104), 'tw': (87, 90, 104)}, button={'cn': (1227, 28, 1252, 53), 'en': (1227, 28, 1252, 53), 'jp': (1227, 28, 1252, 53), 'tw': (1227, 28, 1252, 53)}, file={'cn': './assets/cn/handler/STORY_CLOSE.png', 'en': './assets/en/handler/STORY_CLOSE.png', 'jp': './assets/jp/handler/STORY_CLOSE.png', 'tw': './assets/tw/handler/STORY_CLOSE.png'}) @@ -93,3 +92,4 @@ USER_AGREEMENT_CONFIRM = Button(area={'cn': (709, 526, 742, 542), 'en': (709, 52 USE_DATA_KEY = Button(area={'cn': (688, 316, 781, 338), 'en': (759, 323, 889, 342), 'jp': (627, 300, 743, 321), 'tw': (688, 316, 782, 338)}, color={'cn': (165, 154, 99), 'en': (170, 160, 94), 'jp': (127, 128, 116), 'tw': (159, 150, 97)}, button={'cn': (688, 316, 781, 338), 'en': (759, 323, 889, 342), 'jp': (627, 300, 743, 321), 'tw': (688, 316, 782, 338)}, file={'cn': './assets/cn/handler/USE_DATA_KEY.png', 'en': './assets/en/handler/USE_DATA_KEY.png', 'jp': './assets/jp/handler/USE_DATA_KEY.png', 'tw': './assets/tw/handler/USE_DATA_KEY.png'}) USE_DATA_KEY_NOTIFIED = Button(area={'cn': (770, 434, 793, 456), 'en': (820, 440, 837, 456), 'jp': (686, 430, 709, 456), 'tw': (782, 440, 799, 456)}, color={'cn': (41, 44, 49), 'en': (33, 40, 41), 'jp': (33, 44, 49), 'tw': (34, 40, 48)}, button={'cn': (770, 434, 793, 456), 'en': (820, 440, 837, 456), 'jp': (686, 430, 709, 456), 'tw': (782, 440, 799, 456)}, file={'cn': './assets/cn/handler/USE_DATA_KEY_NOTIFIED.png', 'en': './assets/en/handler/USE_DATA_KEY_NOTIFIED.png', 'jp': './assets/jp/handler/USE_DATA_KEY_NOTIFIED.png', 'tw': './assets/tw/handler/USE_DATA_KEY_NOTIFIED.png'}) VOTE_CANCEL = Button(area={'cn': (404, 483, 576, 539), 'en': (413, 489, 566, 532), 'jp': (407, 483, 577, 538), 'tw': (404, 483, 576, 539)}, color={'cn': (167, 169, 171), 'en': (169, 170, 172), 'jp': (163, 164, 166), 'tw': (167, 169, 171)}, button={'cn': (404, 483, 576, 539), 'en': (413, 489, 566, 532), 'jp': (407, 483, 577, 538), 'tw': (404, 483, 576, 539)}, file={'cn': './assets/cn/handler/VOTE_CANCEL.png', 'en': './assets/en/handler/VOTE_CANCEL.png', 'jp': './assets/jp/handler/VOTE_CANCEL.png', 'tw': './assets/cn/handler/VOTE_CANCEL.png'}) +otherlogin = Button(area={'cn': (568, 333, 715, 356), 'en': (370, 340, 905, 354), 'jp': (472, 334, 640, 357), 'tw': (568, 333, 715, 356)}, color={'cn': (144, 149, 154), 'en': (180, 183, 186), 'jp': (151, 155, 159), 'tw': (144, 149, 154)}, button={'cn': (568, 333, 715, 356), 'en': (370, 340, 905, 354), 'jp': (472, 334, 640, 357), 'tw': (568, 333, 715, 356)}, file={'cn': './assets/cn/handler/otherlogin.png', 'en': './assets/en/handler/otherlogin.png', 'jp': './assets/jp/handler/otherlogin.png', 'tw': './assets/cn/handler/otherlogin.png'}) diff --git a/module/oilkeep/assets.py b/module/oilkeep/assets.py new file mode 100644 index 000000000..56e7b76fe --- /dev/null +++ b/module/oilkeep/assets.py @@ -0,0 +1,10 @@ +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. + +MAIL_OIL = Button(area={'cn': (21, 231, 112, 261), 'en': (21, 231, 112, 261), 'jp': (21, 231, 112, 261), 'tw': (21, 231, 112, 261)}, color={'cn': (77, 82, 99), 'en': (77, 82, 99), 'jp': (77, 82, 99), 'tw': (77, 82, 99)}, button={'cn': (21, 231, 112, 261), 'en': (21, 231, 112, 261), 'jp': (21, 231, 112, 261), 'tw': (21, 231, 112, 261)}, file={'cn': './assets/cn/oilkeep/MAIL_OIL.png', 'en': './assets/cn/oilkeep/MAIL_OIL.png', 'jp': './assets/cn/oilkeep/MAIL_OIL.png', 'tw': './assets/cn/oilkeep/MAIL_OIL.png'}) +MAIL_OIL_ADD = Button(area={'cn': (542, 452, 591, 496), 'en': (542, 452, 591, 496), 'jp': (542, 452, 591, 496), 'tw': (542, 452, 591, 496)}, color={'cn': (68, 154, 196), 'en': (68, 154, 196), 'jp': (68, 154, 196), 'tw': (68, 154, 196)}, button={'cn': (542, 452, 591, 496), 'en': (542, 452, 591, 496), 'jp': (542, 452, 591, 496), 'tw': (542, 452, 591, 496)}, file={'cn': './assets/cn/oilkeep/MAIL_OIL_ADD.png', 'en': './assets/cn/oilkeep/MAIL_OIL_ADD.png', 'jp': './assets/cn/oilkeep/MAIL_OIL_ADD.png', 'tw': './assets/cn/oilkeep/MAIL_OIL_ADD.png'}) +MAIL_OIL_GET = Button(area={'cn': (1029, 591, 1158, 652), 'en': (1029, 591, 1158, 652), 'jp': (1029, 591, 1158, 652), 'tw': (1029, 591, 1158, 652)}, color={'cn': (66, 171, 222), 'en': (66, 171, 222), 'jp': (66, 171, 222), 'tw': (66, 171, 222)}, button={'cn': (1029, 591, 1158, 652), 'en': (1029, 591, 1158, 652), 'jp': (1029, 591, 1158, 652), 'tw': (1029, 591, 1158, 652)}, file={'cn': './assets/cn/oilkeep/MAIL_OIL_GET.png', 'en': './assets/cn/oilkeep/MAIL_OIL_GET.png', 'jp': './assets/cn/oilkeep/MAIL_OIL_GET.png', 'tw': './assets/cn/oilkeep/MAIL_OIL_GET.png'}) +MAIL_OIL_GET_ENSURE = Button(area={'cn': (732, 464, 800, 537), 'en': (732, 464, 800, 537), 'jp': (732, 464, 800, 537), 'tw': (732, 464, 800, 537)}, color={'cn': (108, 204, 251), 'en': (108, 204, 251), 'jp': (108, 204, 251), 'tw': (108, 204, 251)}, button={'cn': (732, 464, 800, 537), 'en': (732, 464, 800, 537), 'jp': (732, 464, 800, 537), 'tw': (732, 464, 800, 537)}, file={'cn': './assets/cn/oilkeep/MAIL_OIL_GET_ENSURE.png', 'en': './assets/cn/oilkeep/MAIL_OIL_GET_ENSURE.png', 'jp': './assets/cn/oilkeep/MAIL_OIL_GET_ENSURE.png', 'tw': './assets/cn/oilkeep/MAIL_OIL_GET_ENSURE.png'}) diff --git a/module/oilkeep/oilkeep.py b/module/oilkeep/oilkeep.py new file mode 100644 index 000000000..84d2db4ef --- /dev/null +++ b/module/oilkeep/oilkeep.py @@ -0,0 +1,187 @@ + +from module.logger import logger +from module.oilkeep.assets import * +from module.ui.ui import UI +from module.base.timer import Timer +from module.combat.assets import GET_ITEMS_1, GET_ITEMS_2 +from module.freebies.assets import * +from module.logger import logger +from module.ui.page import GOTO_MAIN_WHITE, MAIN_GOTO_CAMPAIGN_WHITE, page_mail, page_main, page_main_white +from module.ui.ui import UI +from module.campaign.assets import OCR_OIL, OCR_OIL_LIMIT, OCR_OIL_CHECK +from module.log_res.log_res import LogRes +from module.base.utils import color_similar, get_color +from module.ocr.ocr import Digit +class Oilkeep(UI): + def _mail_enter_and_get_oil(self,oilLine,nowOil, skip_first_screenshot=True): + """ + Returns: + int: If having mails + + Page: + in: page_main_white or MAIL_MANAGE + out: MAIL_BATCH_CLAIM + """ + logger.info('Mail enter') + self.interval_clear([ + MAIL_MANAGE + ]) + timeout = Timer(0.6, count=1) + has_mail = False + mail_oil_add_count = 0 + oil_add_need = 0 + if nowOil < oilLine: + oil_add_need = (oilLine - nowOil) // 100 + logger.info(f'Need oil add count: {oil_add_need} ') + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # End + if self.appear(MAIL_BATCH_CLAIM, offset=(20, 20)): + logger.info('Mail entered') + return True + # if self.appear(MAIL_WHITE_EMPTY, offset=(20, 20)): + # logger.info('Mail empty') + # return False + # if not has_mail and self.appear(GOTO_MAIN_WHITE, offset=(20, 20)): + # timeout.start() + # if timeout.reached(): + # logger.info('Mail empty, wait GOTO_MAIN_WHITE timeout') + # return False + + # Click + if self.appear_then_click(MAIL_OIL, offset=(30, 30), interval=3): + logger.info('MAIL_OIL entered') + continue + if mail_oil_add_count <= oil_add_need-1 and self.appear_then_click(MAIL_OIL_ADD, offset=(30, 30), interval=3): + mail_oil_add_count += 1 + logger.info('MAIL_OIL_ADD') + continue + if mail_oil_add_count >= oil_add_need: + if self.appear_then_click(MAIL_OIL_GET, offset=(30, 30), interval=3): + logger.info('MAIL_OIL_GET') + + if self.appear_then_click(MAIL_OIL_GET_ENSURE, offset=(30, 30), interval=3): + logger.info('MAIL_OIL_GET_ENSURE') + break + if self.ui_main_appear_then_click(page_mail, offset=(30, 30), interval=3): + continue + return False + + def _mail_quit(self, skip_first_screenshot=True): + """ + Page: + in: Any page in page_mail + out: page_main_white + """ + logger.info('Mail quit') + self.interval_clear([ + MAIL_BATCH_CLAIM, + GOTO_MAIN_WHITE, + GET_ITEMS_1, + GET_ITEMS_2, + ]) + self.popup_interval_clear() + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # End + if self.ui_page_appear(page_main): + logger.info('Mail quit to page_main') + break + + # Click + if self.handle_popup_confirm('MAIL_QUIT'): + continue + if self.appear(MAIL_BATCH_CLAIM, offset=(30, 30), interval=3): + logger.info(f'{MAIL_BATCH_CLAIM} -> {MAIL_MANAGE}') + self.device.click(MAIL_MANAGE) + continue + if self.appear_then_click(GOTO_MAIN_WHITE, offset=(30, 30), interval=3): + continue + + def _get_num(self, _button, name): + # Update offset + _ = self.appear(OCR_OIL_CHECK) + + color = get_color(self.device.image, OCR_OIL_CHECK.button) + if color_similar(color, OCR_OIL_CHECK.color): + # Original color + ocr = Digit(_button, name=name, letter=(247, 247, 247), threshold=128) + elif color_similar(color, (59, 59, 64)): + # With black overlay + ocr = Digit(_button, name=name, letter=(165, 165, 165), threshold=128) + else: + logger.warning(f'Unexpected OCR_OIL_CHECK color') + ocr = Digit(_button, name=name, letter=(247, 247, 247), threshold=128) + + return ocr.ocr(self.device.image) + + def get_oil(self, skip_first_screenshot=True, update=False): + """ + Returns: + int: Oil amount + """ + _oil = {} + timeout = Timer(1, count=2).start() + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + if not self.appear(OCR_OIL_CHECK, offset=(10, 2)): + logger.info('No oil icon') + self.device.sleep(2) + + if timeout.reached(): + logger.warning('Get oil timeout') + break + + _oil = { + 'Value': self._get_num(OCR_OIL, 'OCR_OIL'), + 'Limit': self._get_num(OCR_OIL_LIMIT, 'OCR_OIL_LIMIT') + } + if _oil['Value'] >= 100: + break + LogRes(self.config).Oil = _oil + if update: + self.config.update() + + return _oil['Value'] + def update_oil(self): + self.ui_ensure(page_main) + if self.appear_then_click(MAIN_GOTO_CAMPAIGN_WHITE, offset=(30, 30), interval=3): + logger.info('MAIN_GOTO_CAMPAIGN_WHITE') + oilOcr = self.get_oil() + logger.info(f'Oil now: {oilOcr}') + self.ui_ensure(page_main) + return oilOcr + + def pageCheck(self): + self.ui_ensure(page_main) + if self.appear(page_main_white.check_button, offset=(30, 30)): + logger.info('pageCheck: At page_main_white') + return True + elif self.appear(page_main.check_button, offset=(5, 5)): + logger.warning('At page_main, cannot enter mail page from old UI') + return False + else: + logger.warning('Unknown page_main, cannot enter mail page') + return False + + def run(self): + logger.hr('Oil Keep', level=1) + OilkeepLine = self.config.Oilkeep_OilkeepLevel + oilOcrNow = self.update_oil() + if self.pageCheck() is True and oilOcrNow != 0 and oilOcrNow < OilkeepLine -100: + self._mail_enter_and_get_oil(OilkeepLine, oilOcrNow) + self._mail_quit() + self.update_oil() + self.config.task_delay(server_update=True) \ No newline at end of file