diff --git a/assets/cn/os/TEMPLATE_ExplorationContainer.png b/assets/cn/os/TEMPLATE_ExplorationContainer.png new file mode 100644 index 000000000..eba07ba51 Binary files /dev/null and b/assets/cn/os/TEMPLATE_ExplorationContainer.png differ diff --git a/assets/en/os/TEMPLATE_ExplorationContainer.png b/assets/en/os/TEMPLATE_ExplorationContainer.png new file mode 100644 index 000000000..eba07ba51 Binary files /dev/null and b/assets/en/os/TEMPLATE_ExplorationContainer.png differ diff --git a/assets/jp/os/TEMPLATE_ExplorationContainer.png b/assets/jp/os/TEMPLATE_ExplorationContainer.png new file mode 100644 index 000000000..eba07ba51 Binary files /dev/null and b/assets/jp/os/TEMPLATE_ExplorationContainer.png differ diff --git a/assets/shop/os/LoggerAbyssalT4.png b/assets/shop/os/LoggerAbyssalT4.png index 7d18eb77d..68322be4c 100644 Binary files a/assets/shop/os/LoggerAbyssalT4.png and b/assets/shop/os/LoggerAbyssalT4.png differ diff --git a/assets/shop/os/LoggerAbyssalT3.png b/assets/shop/os/LoggerObscureT2.png similarity index 100% rename from assets/shop/os/LoggerAbyssalT3.png rename to assets/shop/os/LoggerObscureT2.png diff --git a/assets/shop/os/LoggerAbyssalT3_2.png b/assets/shop/os/LoggerObscureT2_2.png similarity index 100% rename from assets/shop/os/LoggerAbyssalT3_2.png rename to assets/shop/os/LoggerObscureT2_2.png diff --git a/assets/shop/os/LoggerAbyssalT3_3.png b/assets/shop/os/LoggerObscureT2_3.png similarity index 100% rename from assets/shop/os/LoggerAbyssalT3_3.png rename to assets/shop/os/LoggerObscureT2_3.png diff --git a/assets/shop/os/LoggerObscureT3.png b/assets/shop/os/LoggerObscureT3.png new file mode 100644 index 000000000..d8b8cdd05 Binary files /dev/null and b/assets/shop/os/LoggerObscureT3.png differ diff --git a/assets/shop/os/LoggerObscureT4.png b/assets/shop/os/LoggerObscureT4.png new file mode 100644 index 000000000..7d18eb77d Binary files /dev/null and b/assets/shop/os/LoggerObscureT4.png differ diff --git a/assets/shop/os/LoggerAbyssalT4_0.png b/assets/shop/os/LoggerObscureT4_0.png similarity index 100% rename from assets/shop/os/LoggerAbyssalT4_0.png rename to assets/shop/os/LoggerObscureT4_0.png diff --git a/assets/shop/os/LoggerAbyssalT4_1.png b/assets/shop/os/LoggerObscureT4_1.png similarity index 100% rename from assets/shop/os/LoggerAbyssalT4_1.png rename to assets/shop/os/LoggerObscureT4_1.png diff --git a/assets/tw/coalition/HORROR_COALITION_CHECK.png b/assets/tw/coalition/HORROR_COALITION_CHECK.png new file mode 100644 index 000000000..b758551d2 Binary files /dev/null and b/assets/tw/coalition/HORROR_COALITION_CHECK.png differ diff --git a/assets/tw/coalition/HORROR_MODE_STORY.png b/assets/tw/coalition/HORROR_MODE_STORY.png new file mode 100644 index 000000000..b40147329 Binary files /dev/null and b/assets/tw/coalition/HORROR_MODE_STORY.png differ diff --git a/assets/tw/coalition/HORROR_SWITCH_MULTI.png b/assets/tw/coalition/HORROR_SWITCH_MULTI.png new file mode 100644 index 000000000..1c333eae0 Binary files /dev/null and b/assets/tw/coalition/HORROR_SWITCH_MULTI.png differ diff --git a/assets/tw/coalition/HORROR_SWITCH_SINGLE.png b/assets/tw/coalition/HORROR_SWITCH_SINGLE.png new file mode 100644 index 000000000..c432a956a Binary files /dev/null and b/assets/tw/coalition/HORROR_SWITCH_SINGLE.png differ diff --git a/assets/tw/os/TEMPLATE_ExplorationContainer.png b/assets/tw/os/TEMPLATE_ExplorationContainer.png new file mode 100644 index 000000000..eba07ba51 Binary files /dev/null and b/assets/tw/os/TEMPLATE_ExplorationContainer.png differ diff --git a/campaign/Readme.md b/campaign/Readme.md index 76874c9ed..a458be540 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -307,3 +307,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20260703 | coalition 20230323 | Frostfall | - | - | - | 極地風暴 | | 20260709 | event 20260625 cn | Miracle by Midnight | - | - | - | 美夢巡演奇秒夜 | | 20260723 | coalition 20260723 | Authentic Horror Story | 怪谈纪实 | Authentic Horror Story | 怪談実録 | - | +| 20260806 | coalition 20260723 | Authentic Horror Story | - | - | - | 怪談紀實 | diff --git a/config/template.json b/config/template.json index a876a6b15..e623d10f8 100644 --- a/config/template.json +++ b/config/template.json @@ -2205,7 +2205,7 @@ }, "OpsiShop": { "PresetFilter": "max_benefit_meta", - "CustomFilter": "LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerObscure > LoggerAbyssalT4 > ActionPoint > PurpleCoins\n> GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart\n> OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1\n> METARedBook > CrystallizedHeatResistantSteel > NanoceramicAlloy > NeuroplasticProstheticArm > SupercavitationGenerator", + "CustomFilter": "LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerAbyssalT4 > LoggerObscureT6 > LoggerObscureT5 > LoggerObscureT4 > LoggerObscureT3 > ActionPoint > PurpleCoins\n> GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart\n> OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1\n> METARedBook > CrystallizedHeatResistantSteel > NanoceramicAlloy > NeuroplasticProstheticArm > SupercavitationGenerator", "DisableBeforeDate": 0 }, "Storage": { diff --git a/module/coalition/assets.py b/module/coalition/assets.py index 21702250a..6934be5e4 100644 --- a/module/coalition/assets.py +++ b/module/coalition/assets.py @@ -60,18 +60,18 @@ FROSTFALL_SWITCH_SINGLE = Button(area={'cn': (968, 449, 1098, 478), 'en': (968, FROSTFALL_TC1 = Button(area={'cn': (304, 320, 330, 332), 'en': (304, 320, 330, 332), 'jp': (304, 320, 330, 332), 'tw': (304, 320, 330, 332)}, color={'cn': (204, 162, 254), 'en': (204, 162, 254), 'jp': (204, 162, 254), 'tw': (188, 137, 254)}, button={'cn': (304, 320, 330, 332), 'en': (304, 320, 330, 332), 'jp': (304, 320, 330, 332), 'tw': (304, 320, 330, 332)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC1.png', 'en': './assets/en/coalition/FROSTFALL_TC1.png', 'jp': './assets/jp/coalition/FROSTFALL_TC1.png', 'tw': './assets/tw/coalition/FROSTFALL_TC1.png'}) FROSTFALL_TC2 = Button(area={'cn': (631, 160, 658, 173), 'en': (631, 160, 658, 173), 'jp': (631, 160, 658, 173), 'tw': (631, 160, 658, 173)}, color={'cn': (186, 136, 252), 'en': (186, 136, 252), 'jp': (186, 136, 252), 'tw': (186, 136, 252)}, button={'cn': (631, 160, 658, 173), 'en': (631, 160, 658, 173), 'jp': (631, 160, 658, 173), 'tw': (631, 160, 658, 173)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC2.png', 'en': './assets/en/coalition/FROSTFALL_TC2.png', 'jp': './assets/jp/coalition/FROSTFALL_TC2.png', 'tw': './assets/tw/coalition/FROSTFALL_TC2.png'}) FROSTFALL_TC3 = Button(area={'cn': (810, 362, 835, 373), 'en': (810, 362, 835, 373), 'jp': (810, 362, 835, 373), 'tw': (810, 362, 835, 373)}, color={'cn': (197, 153, 255), 'en': (197, 153, 255), 'jp': (197, 153, 255), 'tw': (197, 153, 255)}, button={'cn': (810, 362, 835, 373), 'en': (810, 362, 835, 373), 'jp': (810, 362, 835, 373), 'tw': (810, 362, 835, 373)}, file={'cn': './assets/cn/coalition/FROSTFALL_TC3.png', 'en': './assets/en/coalition/FROSTFALL_TC3.png', 'jp': './assets/jp/coalition/FROSTFALL_TC3.png', 'tw': './assets/tw/coalition/FROSTFALL_TC3.png'}) -HORROR_COALITION_CHECK = Button(area={'cn': (204, 49, 250, 70), 'en': (182, 40, 238, 65), 'jp': (204, 50, 250, 67), 'tw': (204, 49, 250, 70)}, color={'cn': (142, 142, 164), 'en': (161, 158, 163), 'jp': (136, 137, 159), 'tw': (142, 142, 164)}, button={'cn': (204, 49, 250, 70), 'en': (182, 40, 238, 65), 'jp': (204, 50, 250, 67), 'tw': (204, 49, 250, 70)}, file={'cn': './assets/cn/coalition/HORROR_COALITION_CHECK.png', 'en': './assets/en/coalition/HORROR_COALITION_CHECK.png', 'jp': './assets/jp/coalition/HORROR_COALITION_CHECK.png', 'tw': './assets/cn/coalition/HORROR_COALITION_CHECK.png'}) +HORROR_COALITION_CHECK = Button(area={'cn': (204, 49, 250, 70), 'en': (182, 40, 238, 65), 'jp': (204, 50, 250, 67), 'tw': (186, 24, 223, 57)}, color={'cn': (142, 142, 164), 'en': (161, 158, 163), 'jp': (136, 137, 159), 'tw': (146, 146, 157)}, button={'cn': (204, 49, 250, 70), 'en': (182, 40, 238, 65), 'jp': (204, 50, 250, 67), 'tw': (186, 24, 223, 57)}, file={'cn': './assets/cn/coalition/HORROR_COALITION_CHECK.png', 'en': './assets/en/coalition/HORROR_COALITION_CHECK.png', 'jp': './assets/jp/coalition/HORROR_COALITION_CHECK.png', 'tw': './assets/tw/coalition/HORROR_COALITION_CHECK.png'}) HORROR_EASY = Button(area={'cn': (863, 425, 890, 464), 'en': (863, 425, 890, 464), 'jp': (863, 425, 890, 464), 'tw': (863, 425, 890, 464)}, color={'cn': (76, 76, 96), 'en': (76, 76, 96), 'jp': (76, 76, 96), 'tw': (76, 76, 96)}, button={'cn': (863, 425, 890, 464), 'en': (863, 425, 890, 464), 'jp': (863, 425, 890, 464), 'tw': (863, 425, 890, 464)}, file={'cn': './assets/cn/coalition/HORROR_EASY.png', 'en': './assets/cn/coalition/HORROR_EASY.png', 'jp': './assets/cn/coalition/HORROR_EASY.png', 'tw': './assets/cn/coalition/HORROR_EASY.png'}) HORROR_EX = Button(area={'cn': (172, 410, 200, 448), 'en': (172, 410, 200, 448), 'jp': (172, 410, 200, 448), 'tw': (172, 410, 200, 448)}, color={'cn': (150, 101, 105), 'en': (150, 101, 105), 'jp': (150, 101, 105), 'tw': (150, 101, 105)}, button={'cn': (172, 410, 200, 448), 'en': (172, 410, 200, 448), 'jp': (172, 410, 200, 448), 'tw': (172, 410, 200, 448)}, file={'cn': './assets/cn/coalition/HORROR_EX.png', 'en': './assets/cn/coalition/HORROR_EX.png', 'jp': './assets/cn/coalition/HORROR_EX.png', 'tw': './assets/cn/coalition/HORROR_EX.png'}) HORROR_FLEET_PREPARATION = Button(area={'cn': (1026, 514, 1139, 542), 'en': (1039, 516, 1125, 538), 'jp': (1042, 514, 1124, 542), 'tw': (1026, 514, 1139, 542)}, color={'cn': (146, 132, 183), 'en': (158, 149, 194), 'jp': (135, 117, 173), 'tw': (146, 132, 183)}, button={'cn': (1026, 514, 1139, 542), 'en': (1039, 516, 1125, 538), 'jp': (1042, 514, 1124, 542), 'tw': (1026, 514, 1139, 542)}, file={'cn': './assets/cn/coalition/HORROR_FLEET_PREPARATION.png', 'en': './assets/en/coalition/HORROR_FLEET_PREPARATION.png', 'jp': './assets/jp/coalition/HORROR_FLEET_PREPARATION.png', 'tw': './assets/cn/coalition/HORROR_FLEET_PREPARATION.png'}) HORROR_HARD = Button(area={'cn': (659, 343, 687, 382), 'en': (659, 343, 687, 382), 'jp': (659, 344, 688, 382), 'tw': (659, 343, 687, 382)}, color={'cn': (73, 74, 94), 'en': (73, 74, 94), 'jp': (80, 82, 100), 'tw': (73, 74, 94)}, button={'cn': (659, 343, 687, 382), 'en': (659, 343, 687, 382), 'jp': (659, 344, 688, 382), 'tw': (659, 343, 687, 382)}, file={'cn': './assets/cn/coalition/HORROR_HARD.png', 'en': './assets/cn/coalition/HORROR_HARD.png', 'jp': './assets/jp/coalition/HORROR_HARD.png', 'tw': './assets/cn/coalition/HORROR_HARD.png'}) HORROR_MODE_BATTLE = Button(area={'cn': (76, 625, 115, 664), 'en': (45, 637, 107, 662), 'jp': (76, 625, 114, 663), 'tw': (76, 625, 115, 664)}, color={'cn': (146, 140, 156), 'en': (154, 162, 171), 'jp': (143, 138, 168), 'tw': (146, 140, 156)}, button={'cn': (76, 625, 115, 664), 'en': (45, 637, 107, 662), 'jp': (76, 625, 114, 663), 'tw': (76, 625, 115, 664)}, file={'cn': './assets/cn/coalition/HORROR_MODE_BATTLE.png', 'en': './assets/en/coalition/HORROR_MODE_BATTLE.png', 'jp': './assets/jp/coalition/HORROR_MODE_BATTLE.png', 'tw': './assets/cn/coalition/HORROR_MODE_BATTLE.png'}) -HORROR_MODE_STORY = Button(area={'cn': (292, 626, 329, 665), 'en': (262, 631, 301, 662), 'jp': (291, 626, 329, 663), 'tw': (292, 626, 329, 665)}, color={'cn': (165, 155, 167), 'en': (160, 128, 173), 'jp': (150, 137, 166), 'tw': (165, 155, 167)}, button={'cn': (292, 626, 329, 665), 'en': (262, 631, 301, 662), 'jp': (291, 626, 329, 663), 'tw': (292, 626, 329, 665)}, file={'cn': './assets/cn/coalition/HORROR_MODE_STORY.png', 'en': './assets/en/coalition/HORROR_MODE_STORY.png', 'jp': './assets/jp/coalition/HORROR_MODE_STORY.png', 'tw': './assets/cn/coalition/HORROR_MODE_STORY.png'}) +HORROR_MODE_STORY = Button(area={'cn': (292, 626, 329, 665), 'en': (262, 631, 301, 662), 'jp': (291, 626, 329, 663), 'tw': (336, 625, 370, 664)}, color={'cn': (165, 155, 167), 'en': (160, 128, 173), 'jp': (150, 137, 166), 'tw': (158, 143, 150)}, button={'cn': (292, 626, 329, 665), 'en': (262, 631, 301, 662), 'jp': (291, 626, 329, 663), 'tw': (336, 625, 370, 664)}, file={'cn': './assets/cn/coalition/HORROR_MODE_STORY.png', 'en': './assets/en/coalition/HORROR_MODE_STORY.png', 'jp': './assets/jp/coalition/HORROR_MODE_STORY.png', 'tw': './assets/tw/coalition/HORROR_MODE_STORY.png'}) HORROR_NORMAL = Button(area={'cn': (765, 127, 793, 166), 'en': (765, 127, 793, 166), 'jp': (765, 127, 793, 166), 'tw': (765, 127, 793, 166)}, color={'cn': (75, 75, 92), 'en': (75, 75, 92), 'jp': (75, 75, 92), 'tw': (75, 75, 92)}, button={'cn': (765, 127, 793, 166), 'en': (765, 127, 793, 166), 'jp': (765, 127, 793, 166), 'tw': (765, 127, 793, 166)}, file={'cn': './assets/cn/coalition/HORROR_NORMAL.png', 'en': './assets/cn/coalition/HORROR_NORMAL.png', 'jp': './assets/cn/coalition/HORROR_NORMAL.png', 'tw': './assets/cn/coalition/HORROR_NORMAL.png'}) HORROR_PT_OCR = Button(area={'cn': (1196, 339, 1276, 357), 'en': (1205, 342, 1275, 360), 'jp': (1196, 339, 1276, 357), 'tw': (1196, 339, 1276, 357)}, color={'cn': (62, 52, 54), 'en': (78, 69, 72), 'jp': (62, 52, 54), 'tw': (62, 52, 54)}, button={'cn': (1196, 339, 1276, 357), 'en': (1205, 342, 1275, 360), 'jp': (1196, 339, 1276, 357), 'tw': (1196, 339, 1276, 357)}, file={'cn': './assets/cn/coalition/HORROR_PT_OCR.png', 'en': './assets/en/coalition/HORROR_PT_OCR.png', 'jp': './assets/cn/coalition/HORROR_PT_OCR.png', 'tw': './assets/cn/coalition/HORROR_PT_OCR.png'}) HORROR_SP = Button(area={'cn': (430, 130, 458, 168), 'en': (430, 130, 458, 168), 'jp': (430, 130, 458, 168), 'tw': (430, 130, 458, 168)}, color={'cn': (161, 110, 112), 'en': (161, 110, 112), 'jp': (161, 110, 112), 'tw': (161, 110, 112)}, button={'cn': (430, 130, 458, 168), 'en': (430, 130, 458, 168), 'jp': (430, 130, 458, 168), 'tw': (430, 130, 458, 168)}, file={'cn': './assets/cn/coalition/HORROR_SP.png', 'en': './assets/cn/coalition/HORROR_SP.png', 'jp': './assets/cn/coalition/HORROR_SP.png', 'tw': './assets/cn/coalition/HORROR_SP.png'}) -HORROR_SWITCH_MULTI = Button(area={'cn': (1078, 458, 1208, 487), 'en': (1078, 458, 1208, 487), 'jp': (1078, 458, 1208, 487), 'tw': (1078, 458, 1208, 487)}, color={'cn': (229, 173, 59), 'en': (195, 147, 51), 'jp': (222, 168, 57), 'tw': (229, 173, 59)}, button={'cn': (1078, 458, 1208, 487), 'en': (1078, 458, 1208, 487), 'jp': (1078, 458, 1208, 487), 'tw': (1078, 458, 1208, 487)}, file={'cn': './assets/cn/coalition/HORROR_SWITCH_MULTI.png', 'en': './assets/en/coalition/HORROR_SWITCH_MULTI.png', 'jp': './assets/jp/coalition/HORROR_SWITCH_MULTI.png', 'tw': './assets/cn/coalition/HORROR_SWITCH_MULTI.png'}) -HORROR_SWITCH_SINGLE = Button(area={'cn': (939, 458, 1070, 487), 'en': (939, 458, 1070, 487), 'jp': (939, 458, 1069, 487), 'tw': (939, 458, 1070, 487)}, color={'cn': (227, 171, 59), 'en': (197, 149, 51), 'jp': (222, 168, 57), 'tw': (227, 171, 59)}, button={'cn': (939, 458, 1070, 487), 'en': (939, 458, 1070, 487), 'jp': (939, 458, 1069, 487), 'tw': (939, 458, 1070, 487)}, file={'cn': './assets/cn/coalition/HORROR_SWITCH_SINGLE.png', 'en': './assets/en/coalition/HORROR_SWITCH_SINGLE.png', 'jp': './assets/jp/coalition/HORROR_SWITCH_SINGLE.png', 'tw': './assets/cn/coalition/HORROR_SWITCH_SINGLE.png'}) +HORROR_SWITCH_MULTI = Button(area={'cn': (1078, 458, 1208, 487), 'en': (1078, 458, 1208, 487), 'jp': (1078, 458, 1208, 487), 'tw': (1078, 458, 1208, 487)}, color={'cn': (229, 173, 59), 'en': (195, 147, 51), 'jp': (222, 168, 57), 'tw': (226, 170, 58)}, button={'cn': (1078, 458, 1208, 487), 'en': (1078, 458, 1208, 487), 'jp': (1078, 458, 1208, 487), 'tw': (1078, 458, 1208, 487)}, file={'cn': './assets/cn/coalition/HORROR_SWITCH_MULTI.png', 'en': './assets/en/coalition/HORROR_SWITCH_MULTI.png', 'jp': './assets/jp/coalition/HORROR_SWITCH_MULTI.png', 'tw': './assets/tw/coalition/HORROR_SWITCH_MULTI.png'}) +HORROR_SWITCH_SINGLE = Button(area={'cn': (939, 458, 1070, 487), 'en': (939, 458, 1070, 487), 'jp': (939, 458, 1069, 487), 'tw': (939, 458, 1070, 487)}, color={'cn': (227, 171, 59), 'en': (197, 149, 51), 'jp': (222, 168, 57), 'tw': (221, 166, 57)}, button={'cn': (939, 458, 1070, 487), 'en': (939, 458, 1070, 487), 'jp': (939, 458, 1069, 487), 'tw': (939, 458, 1070, 487)}, file={'cn': './assets/cn/coalition/HORROR_SWITCH_SINGLE.png', 'en': './assets/en/coalition/HORROR_SWITCH_SINGLE.png', 'jp': './assets/jp/coalition/HORROR_SWITCH_SINGLE.png', 'tw': './assets/tw/coalition/HORROR_SWITCH_SINGLE.png'}) NEONCITY_COALITION_CHECK = Button(area={'cn': (230, 36, 276, 82), 'en': (179, 30, 276, 68), 'jp': (122, 30, 250, 86), 'tw': (230, 36, 276, 82)}, color={'cn': (136, 139, 142), 'en': (95, 98, 101), 'jp': (71, 86, 101), 'tw': (136, 139, 142)}, button={'cn': (230, 36, 276, 82), 'en': (179, 30, 276, 68), 'jp': (122, 30, 250, 86), 'tw': (230, 36, 276, 82)}, file={'cn': './assets/cn/coalition/NEONCITY_COALITION_CHECK.png', 'en': './assets/en/coalition/NEONCITY_COALITION_CHECK.png', 'jp': './assets/jp/coalition/NEONCITY_COALITION_CHECK.png', 'tw': './assets/cn/coalition/NEONCITY_COALITION_CHECK.png'}) NEONCITY_EASY = Button(area={'cn': (255, 252, 308, 270), 'en': (306, 208, 349, 229), 'jp': (245, 250, 320, 273), 'tw': (304, 207, 350, 228)}, color={'cn': (131, 132, 135), 'en': (115, 124, 154), 'jp': (130, 130, 134), 'tw': (118, 128, 158)}, button={'cn': (255, 252, 308, 270), 'en': (306, 208, 349, 229), 'jp': (245, 250, 320, 273), 'tw': (304, 207, 350, 228)}, file={'cn': './assets/cn/coalition/NEONCITY_EASY.png', 'en': './assets/en/coalition/NEONCITY_EASY.png', 'jp': './assets/jp/coalition/NEONCITY_EASY.png', 'tw': './assets/tw/coalition/NEONCITY_EASY.png'}) NEONCITY_EX = Button(area={'cn': (655, 353, 708, 370), 'en': (714, 308, 741, 328), 'jp': (643, 350, 720, 373), 'tw': (709, 308, 746, 328)}, color={'cn': (151, 150, 151), 'en': (162, 100, 99), 'jp': (137, 136, 137), 'tw': (157, 92, 93)}, button={'cn': (655, 353, 708, 370), 'en': (714, 308, 741, 328), 'jp': (643, 350, 720, 373), 'tw': (709, 308, 746, 328)}, file={'cn': './assets/cn/coalition/NEONCITY_EX.png', 'en': './assets/en/coalition/NEONCITY_EX.png', 'jp': './assets/jp/coalition/NEONCITY_EX.png', 'tw': './assets/tw/coalition/NEONCITY_EX.png'}) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 5dd286a87..a96e39e7c 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -2491,7 +2491,6 @@ "type": "state", "value": "campaign_main", "option": [ - "coalition_20230323", "coalition_20260723" ], "option_cn": [ @@ -2504,10 +2503,9 @@ "coalition_20260723" ], "option_tw": [ - "coalition_20230323" + "coalition_20260723" ], "option_bold": [ - "coalition_20230323", "coalition_20260723" ] }, @@ -4311,7 +4309,6 @@ "type": "select", "value": "campaign_main", "option": [ - "coalition_20230323", "coalition_20260723" ], "option_cn": [ @@ -4324,10 +4321,9 @@ "coalition_20260723" ], "option_tw": [ - "coalition_20230323" + "coalition_20260723" ], "option_bold": [ - "coalition_20230323", "coalition_20260723" ] }, @@ -5411,7 +5407,6 @@ "type": "select", "value": "campaign_main", "option": [ - "coalition_20230323", "coalition_20260723" ], "option_cn": [ @@ -5424,10 +5419,9 @@ "coalition_20260723" ], "option_tw": [ - "coalition_20230323" + "coalition_20260723" ], "option_bold": [ - "coalition_20230323", "coalition_20260723" ] }, @@ -13848,7 +13842,7 @@ }, "CustomFilter": { "type": "textarea", - "value": "LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerObscure > LoggerAbyssalT4 > ActionPoint > PurpleCoins\n> GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart\n> OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1\n> METARedBook > CrystallizedHeatResistantSteel > NanoceramicAlloy > NeuroplasticProstheticArm > SupercavitationGenerator" + "value": "LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerAbyssalT4 > LoggerObscureT6 > LoggerObscureT5 > LoggerObscureT4 > LoggerObscureT3 > ActionPoint > PurpleCoins\n> GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart\n> OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1\n> METARedBook > CrystallizedHeatResistantSteel > NanoceramicAlloy > NeuroplasticProstheticArm > SupercavitationGenerator" }, "DisableBeforeDate": { "type": "input", diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 4404e21a1..d2ae44c98 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -360,8 +360,6 @@ HospitalEvent: Stage: value: T1 option: [ T1, T2, T3, T4, ESP ] -MaritimeEscort: - Enable: true Scuttle: Sacrifice: value: vanguard @@ -1011,7 +1009,7 @@ OpsiShop: - all - custom CustomFilter: |- - LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerObscure > LoggerAbyssalT4 > ActionPoint > PurpleCoins + LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerAbyssalT4 > LoggerObscureT6 > LoggerObscureT5 > LoggerObscureT4 > LoggerObscureT3 > ActionPoint > PurpleCoins > GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart > OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1 > METARedBook > CrystallizedHeatResistantSteel > NanoceramicAlloy > NeuroplasticProstheticArm > SupercavitationGenerator diff --git a/module/config/argument/override.yaml b/module/config/argument/override.yaml index 639755c9d..624019e77 100644 --- a/module/config/argument/override.yaml +++ b/module/config/argument/override.yaml @@ -260,11 +260,6 @@ RaidDaily: Fleet2Recover: not_in_dormitory Fleet2Oath: false Fleet2Onsen: False -# MaritimeEscort: -# Scheduler: -# SuccessInterval: 30 -# FailureInterval: 30 -# ServerUpdate: 00:00 Coalition: Scheduler: SuccessInterval: 30 diff --git a/module/config/config_generated.py b/module/config/config_generated.py index ea568c995..92ee0d912 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -210,9 +210,6 @@ class GeneratedConfig: HospitalEvent_Mode = 'hard' # easy, normal, hard HospitalEvent_Stage = 'T1' # T1, T2, T3, T4, ESP - # Group `MaritimeEscort` - MaritimeEscort_Enable = True - # Group `Scuttle` Scuttle_Sacrifice = 'vanguard' # vanguard, flagship @@ -626,7 +623,7 @@ class GeneratedConfig: # Group `OpsiShop` OpsiShop_PresetFilter = 'max_benefit_meta' # max_benefit, max_benefit_meta, no_meta, all, custom - OpsiShop_CustomFilter = 'LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerObscure > LoggerAbyssalT4 > ActionPoint > PurpleCoins\n> GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart\n> OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1\n> METARedBook > CrystallizedHeatResistantSteel > NanoceramicAlloy > NeuroplasticProstheticArm > SupercavitationGenerator' + OpsiShop_CustomFilter = 'LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerAbyssalT4 > LoggerObscureT6 > LoggerObscureT5 > LoggerObscureT4 > LoggerObscureT3 > ActionPoint > PurpleCoins\n> GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart\n> OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1\n> METARedBook > CrystallizedHeatResistantSteel > NanoceramicAlloy > NeuroplasticProstheticArm > SupercavitationGenerator' OpsiShop_DisableBeforeDate = 0 # Group `OpsiVoucher` diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 6804fe741..71b6b93b7 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -1487,16 +1487,6 @@ "ESP": "ESP" } }, - "MaritimeEscort": { - "_info": { - "name": "Maritime Escort", - "help": "Enter then retreat, get about 70% of maximum rewards" - }, - "Enable": { - "name": "Enable maritime Escort", - "help": "" - } - }, "Scuttle": { "_info": { "name": "Scuttle Settings", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index d026f070c..4d8da0347 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -1487,16 +1487,6 @@ "ESP": "ESP" } }, - "MaritimeEscort": { - "_info": { - "name": "MaritimeEscort._info.name", - "help": "MaritimeEscort._info.help" - }, - "Enable": { - "name": "MaritimeEscort.Enable.name", - "help": "MaritimeEscort.Enable.help" - } - }, "Scuttle": { "_info": { "name": "Scuttle._info.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 00e8be214..b1b3070bc 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -1487,16 +1487,6 @@ "ESP": "ESP" } }, - "MaritimeEscort": { - "_info": { - "name": "商船护航", - "help": "进一下就撤退,能拿约70%的奖励" - }, - "Enable": { - "name": "启用商船护航", - "help": "" - } - }, "Scuttle": { "_info": { "name": "沉船设置", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 6ecbe8682..b351d7407 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -765,7 +765,7 @@ "coalition_20250626": "迷彩都市的尋蹤者", "coalition_20251120": "DATE A LANE", "coalition_20260122": "光影風尚-拍攝進行時", - "coalition_20260723": "Authentic Horror Story", + "coalition_20260723": "怪談紀實", "event_20200227_cn": "Northern Overture", "event_20200312_cn": "斯圖爾特的硝煙", "event_20200326_cn": "Microlayer Medley", @@ -1487,16 +1487,6 @@ "ESP": "ESP" } }, - "MaritimeEscort": { - "_info": { - "name": "商船護航", - "help": "進一下就撤退,能拿約70%的獎勵" - }, - "Enable": { - "name": "啟用商船護航", - "help": "" - } - }, "Scuttle": { "_info": { "name": "鑿船設定", diff --git a/module/map_detection/os_grid.py b/module/map_detection/os_grid.py index 494b17cae..5f1a6112f 100644 --- a/module/map_detection/os_grid.py +++ b/module/map_detection/os_grid.py @@ -19,6 +19,7 @@ class OSGridInfo(GridInfo): is_scanning_device = False is_logging_tower = False is_exploration_reward = False + is_exploration_container = False is_fleet_mechanism = False is_fleet = False @@ -37,6 +38,7 @@ class OSGridInfo(GridInfo): 'SD': 'is_scanning_device', 'LT': 'is_logging_tower', 'ER': 'is_exploration_reward', + 'EC': 'is_exploration_container', 'FM': 'is_fleet_mechanism', } for key, value in dic.items(): @@ -93,6 +95,9 @@ class OSGridInfo(GridInfo): if info.is_exploration_reward: self.is_exploration_reward = True return True + if info.is_exploration_container: + self.is_exploration_container = True + return True if info.is_fleet_mechanism: self.is_fleet_mechanism = True return True @@ -137,6 +142,7 @@ class OSGridInfo(GridInfo): self.is_scanning_device = False self.is_logging_tower = False self.is_exploration_reward = False + self.is_exploration_container = False self.is_fleet_mechanism = False def reset(self): @@ -161,6 +167,7 @@ class OSGridPredictor(GridPredictor): self.is_scanning_device = self.enemy_genre == 'ScanningDevice' self.is_logging_tower = self.enemy_genre == 'LoggingTower' self.is_exploration_reward = self.enemy_genre == 'ExplorationReward' + self.is_exploration_container = self.enemy_genre == 'ExplorationContainer' self.is_current_fleet = self.predict_current_fleet() self.is_fleet = self.is_current_fleet self.is_fleet_mechanism = self.predict_fleet_mechanism() @@ -210,6 +217,7 @@ class OSGridPredictor(GridPredictor): 'ScanningDevice': TEMPLATE_ScanningDevice, 'LoggingTower': TEMPLATE_LoggingTower, 'ExplorationReward': TEMPLATE_ExplorationReward, + 'ExplorationContainer': TEMPLATE_ExplorationContainer, } _os_template_enemy_upper = { 'ScanningDevice': TEMPLATE_ScanningDeviceUpper, diff --git a/module/meowfficer/buy.py b/module/meowfficer/buy.py index 49e59b585..3b506ba16 100644 --- a/module/meowfficer/buy.py +++ b/module/meowfficer/buy.py @@ -116,6 +116,7 @@ class MeowfficerBuy(MeowfficerBase): Args: count (int): 1 to BUY_MAX. """ + logger.hr('Meow buy choose', level=2) self.meow_enter(MEOWFFICER_BUY_ENTER, check_button=MEOWFFICER_BUY) # info_bar may covers OCR_MEOWFFICER_CHOOSE, @@ -133,7 +134,7 @@ class MeowfficerBuy(MeowfficerBase): out: page_meowfficer """ # Here uses a simple click, to avoid clicking MEOWFFICER_BUY multiple times. - logger.hr('Meow confirm') + logger.hr('Meow buy confirm', level=2) executed = False with self.stat.new( genre="meowfficer_buy", @@ -186,10 +187,11 @@ class MeowfficerBuy(MeowfficerBase): buy_amount = max(min(buy_amount, 15), 1) overflow_th = self.config.Meowfficer_OverflowCoins - count = self.meow_get_buy_count(buy_amount, overflow_th) - if count <= 0: - return - self.meow_choose(count) - self.meow_confirm() + for _ in range(3): + count = self.meow_get_buy_count(buy_amount, overflow_th) + if count <= 0: + return + self.meow_choose(count) + self.meow_confirm() logger.warning('Too many trial in meowfficer buy, stopped.') diff --git a/module/os/assets.py b/module/os/assets.py index 550dd2522..c5bf7cbec 100644 --- a/module/os/assets.py +++ b/module/os/assets.py @@ -26,6 +26,7 @@ SELECT_SAFE = Button(area={'cn': (89, 251, 167, 269), 'en': (92, 253, 164, 268), SELECT_STRONGHOLD = Button(area={'cn': (89, 251, 166, 269), 'en': (81, 252, 175, 272), 'jp': (89, 251, 167, 269), 'tw': (88, 250, 167, 270)}, color={'cn': (113, 114, 118), 'en': (81, 83, 87), 'jp': (115, 116, 119), 'tw': (103, 105, 108)}, button={'cn': (89, 251, 166, 269), 'en': (81, 252, 175, 272), 'jp': (89, 251, 167, 269), 'tw': (88, 250, 167, 270)}, file={'cn': './assets/cn/os/SELECT_STRONGHOLD.png', 'en': './assets/en/os/SELECT_STRONGHOLD.png', 'jp': './assets/jp/os/SELECT_STRONGHOLD.png', 'tw': './assets/tw/os/SELECT_STRONGHOLD.png'}) STRONGHOLD_PERCENTAGE = Button(area={'cn': (293, 125, 340, 143), 'en': (293, 125, 340, 143), 'jp': (293, 125, 340, 143), 'tw': (293, 125, 340, 143)}, color={'cn': (132, 135, 146), 'en': (132, 135, 146), 'jp': (132, 135, 146), 'tw': (132, 135, 146)}, button={'cn': (293, 125, 340, 143), 'en': (293, 125, 340, 143), 'jp': (293, 125, 340, 143), 'tw': (293, 125, 340, 143)}, file={'cn': './assets/cn/os/STRONGHOLD_PERCENTAGE.png', 'en': './assets/en/os/STRONGHOLD_PERCENTAGE.png', 'jp': './assets/jp/os/STRONGHOLD_PERCENTAGE.png', 'tw': './assets/tw/os/STRONGHOLD_PERCENTAGE.png'}) TEMPLATE_EMPTY_HP = Template(file={'cn': './assets/cn/os/TEMPLATE_EMPTY_HP.png', 'en': './assets/en/os/TEMPLATE_EMPTY_HP.png', 'jp': './assets/jp/os/TEMPLATE_EMPTY_HP.png', 'tw': './assets/tw/os/TEMPLATE_EMPTY_HP.png'}) +TEMPLATE_ExplorationContainer = Template(file={'cn': './assets/cn/os/TEMPLATE_ExplorationContainer.png', 'en': './assets/en/os/TEMPLATE_ExplorationContainer.png', 'jp': './assets/jp/os/TEMPLATE_ExplorationContainer.png', 'tw': './assets/tw/os/TEMPLATE_ExplorationContainer.png'}) TEMPLATE_ExplorationReward = Template(file={'cn': './assets/cn/os/TEMPLATE_ExplorationReward.png', 'en': './assets/en/os/TEMPLATE_ExplorationReward.png', 'jp': './assets/jp/os/TEMPLATE_ExplorationReward.png', 'tw': './assets/tw/os/TEMPLATE_ExplorationReward.png'}) TEMPLATE_FleetMechanism = Template(file={'cn': './assets/cn/os/TEMPLATE_FleetMechanism.png', 'en': './assets/en/os/TEMPLATE_FleetMechanism.png', 'jp': './assets/jp/os/TEMPLATE_FleetMechanism.png', 'tw': './assets/tw/os/TEMPLATE_FleetMechanism.png'}) TEMPLATE_LoggingTower = Template(file={'cn': './assets/cn/os/TEMPLATE_LoggingTower.png', 'en': './assets/en/os/TEMPLATE_LoggingTower.png', 'jp': './assets/jp/os/TEMPLATE_LoggingTower.png', 'tw': './assets/tw/os/TEMPLATE_LoggingTower.png'}) diff --git a/module/os/map.py b/module/os/map.py index 3665d88cd..6d53378af 100644 --- a/module/os/map.py +++ b/module/os/map.py @@ -1022,10 +1022,26 @@ class OSMap(OSFleet, Map, GlobeCamera, StorageHandler, StrategicSearchHandler): Returns: bool: If solved a map random event """ + grids = self.view.select(is_exploration_container=True) + if 'is_exploration_container' not in self._solved_map_event \ + and grids and grids[0].is_exploration_container: + grid = grids[0] + logger.info(f'Found exploration container on {grid}') + self.device.click(grid) + with self.config.temporary(STORY_ALLOW_SKIP=False, STORY_OPTION=1): + result = self.wait_until_walk_stable( + drop=drop, walk_out_of_step=False, confirm_timer=Timer(1.5, count=4)) + if 'event' in result: + self._solved_map_event.add('is_exploration_container') + return True + else: + return False + grids = self.view.select(is_exploration_reward=True) if 'is_exploration_reward' not in self._solved_map_event and grids and grids[0].is_exploration_reward: grid = grids[0] logger.info(f'Found exploration reward on {grid}') + self.device.click(grid) result = self.wait_until_walk_stable(drop=drop, walk_out_of_step=False, confirm_timer=Timer(1.5, count=4)) if 'event' in result: self._solved_map_event.add('is_exploration_reward') diff --git a/module/os/tasks/explore.py b/module/os/tasks/explore.py index 33a532d19..1b5fb31d0 100644 --- a/module/os/tasks/explore.py +++ b/module/os/tasks/explore.py @@ -88,8 +88,11 @@ class OpsiExplore(OSMap): self.config.OpsiExplore_LastZone = zone logger.info(f'Zone cleared: {self.name_to_zone(zone)}') if finished_combat == 0: - logger.warning('Zone cleared but did not finish any combat') - self._os_explore_failed_zone.append(zone) + if 'is_exploration_container' in self._solved_map_event: + logger.info('Zone cleared by exploration container') + else: + logger.warning('Zone cleared but did not finish any combat') + self._os_explore_failed_zone.append(zone) self.handle_after_auto_search() self.config.check_task_switch() diff --git a/module/os_shop/item.py b/module/os_shop/item.py index 771f1b2e2..22f3582f5 100644 --- a/module/os_shop/item.py +++ b/module/os_shop/item.py @@ -132,7 +132,7 @@ class OSShopItem(Item): class OSShopItemGrid(ItemGrid): item_class = OSShopItem - def __init__(self, grids, templates, template_area=(40, 21, 89, 70), amount_area=(60, 71, 91, 92), + def __init__(self, grids, templates, template_area=(25, 16, 89, 70), amount_area=(60, 71, 91, 92), cost_area=(6, 123, 84, 166), price_area=(52, 132, 132, 156), tag_area=(81, 4, 91, 8), counter_area=(85, 170, 134, 186)): super().__init__(grids, templates, template_area, amount_area, cost_area, price_area, tag_area) diff --git a/module/os_shop/preset.py b/module/os_shop/preset.py index 6c52de8e4..cd3312c1a 100644 --- a/module/os_shop/preset.py +++ b/module/os_shop/preset.py @@ -7,27 +7,27 @@ OS_SHOP = { # 5: Rubbish 'max_benefit': """ - LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerObscure > LoggerAbyssalT4 > ActionPoint > PurpleCoins > + LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerAbyssalT4 > LoggerObscureT6 > LoggerObscureT5 > LoggerObscureT4 > LoggerObscureT3 > ActionPoint > PurpleCoins > GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart > OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1 """, 'max_benefit_meta': """ - LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerObscure > LoggerAbyssalT4 > ActionPoint > PurpleCoins > + LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerAbyssalT4 > LoggerObscureT6 > LoggerObscureT5 > LoggerObscureT4 > LoggerObscureT3 > ActionPoint > PurpleCoins > GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart > OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1 > METARedBook > CrystallizedHeatResistantSteel > NanoceramicAlloy > NeuroplasticProstheticArm > SupercavitationGenerator """, 'no_meta': """ - LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerObscure > LoggerAbyssalT4 > ActionPoint > PurpleCoins > + LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerAbyssalT4 > LoggerObscureT6 > LoggerObscureT5 > LoggerObscureT4 > LoggerObscureT3 > ActionPoint > PurpleCoins > GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart > OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1 > - LoggerAbyssalT3 > DevelopmentMaterialT1 > TuningT2 > TuningSample > EnergyStorageDevice > RepairPack + LoggerObscureT2 > DevelopmentMaterialT1 > TuningT2 > TuningSample > EnergyStorageDevice > RepairPack """, 'all': """ - LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerObscure > LoggerAbyssalT4 > ActionPoint > PurpleCoins > + LoggerAbyssalT6 > LoggerAbyssalT5 > LoggerAbyssalT4 > LoggerObscureT6 > LoggerObscureT5 > LoggerObscureT4 > LoggerObscureT3 > ActionPoint > PurpleCoins > GearDesignPlanT3 > PlateRandomT4 > DevelopmentMaterialT3 > GearDesignPlanT2 > GearPart > OrdnanceTestingReportT3 > OrdnanceTestingReportT2 > DevelopmentMaterialT2 > OrdnanceTestingReportT1 > METARedBook > CrystallizedHeatResistantSteel > NanoceramicAlloy > NeuroplasticProstheticArm > SupercavitationGenerator > - LoggerAbyssalT3 > DevelopmentMaterialT1 > TuningT2 > TuningSample > EnergyStorageDevice > RepairPack + LoggerObscureT2 > DevelopmentMaterialT1 > TuningT2 > TuningSample > EnergyStorageDevice > RepairPack """ } diff --git a/module/shop/shop_medal.py b/module/shop/shop_medal.py index 71bba4964..e4d6ae41d 100644 --- a/module/shop/shop_medal.py +++ b/module/shop/shop_medal.py @@ -14,36 +14,35 @@ from module.shop.assets import * from module.shop.base import ShopItemGrid_250814 from module.shop.clerk import ShopClerk from module.shop.shop_status import ShopStatus -from module.ui.scroll import AdaptiveScroll +from module.ui.scroll import Scroll -class ShopAdaptiveScroll(AdaptiveScroll): +class ShopScroll(Scroll): def match_color(self, main): - area = (self.area[0] - self.background, self.area[1], self.area[2] + self.background, self.area[3]) - image = main.image_crop(area, copy=False) - - image = rgb2gray(image) - cv2.bitwise_not(image, dst=image) - image = image.flatten() - wlen = area[2] - area[0] - parameters = { - 'height': (100, 200), - 'prominence': 35, - 'width': 1 - } - parameters.update(self.parameters) - peaks, _ = signal.find_peaks(image, **parameters) - peaks = peaks[15: 123] - peaks //= wlen - self.length = 123 - mask = np.zeros((self.total,), dtype=np.bool_) - mask[peaks] = 1 + background_transparency = 0.2 + button_transparency = 0.5 + delta_x = 3 + area = ( + self.area[0] - delta_x, + self.area[1], + self.area[2] + delta_x, + self.area[3] + ) + image = main.image_crop(area, copy=False).astype(np.float32) + baseline_color = np.mean(image[:, [0, -1], :], axis=1) + masked_color = image[:, image.shape[1] // 2, :] + background_mask = background_transparency * np.array(self.color) + (1 - background_transparency) * baseline_color + button_mask = button_transparency * np.array(self.color) + (1 - button_transparency) * baseline_color + err_background = np.sum((masked_color - background_mask) ** 2, axis=1) + err_button = np.sum((masked_color - button_mask) ** 2, axis=1) + mask = err_button < err_background + self.length = np.sum(mask) return mask -MEDAL_SHOP_SCROLL_250814 = ShopAdaptiveScroll( +MEDAL_SHOP_SCROLL_250814 = ShopScroll( MEDAL_SHOP_SCROLL_AREA_250814.button, - background=3, + color=(44, 48, 56), name="MEDAL_SHOP_SCROLL_250814" ) # A little bit larger than edge_threshold