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 000000000..96e06b2c8 Binary files /dev/null and b/assets/cn/oilkeep/MAIL_OIL.png differ diff --git a/assets/cn/oilkeep/MAIL_OIL_ADD.png b/assets/cn/oilkeep/MAIL_OIL_ADD.png new file mode 100644 index 000000000..06929edf4 Binary files /dev/null and b/assets/cn/oilkeep/MAIL_OIL_ADD.png differ diff --git a/assets/cn/oilkeep/MAIL_OIL_GET.png b/assets/cn/oilkeep/MAIL_OIL_GET.png new file mode 100644 index 000000000..87bc29164 Binary files /dev/null and b/assets/cn/oilkeep/MAIL_OIL_GET.png differ 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 000000000..c47c2441a Binary files /dev/null and b/assets/cn/oilkeep/MAIL_OIL_GET_ENSURE.png differ 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