diff --git a/assets/cn/handler/AUTO_SEARCH_OFF.png b/assets/cn/handler/AUTO_SEARCH_OFF.png index 673346bd6..d37067c86 100644 Binary files a/assets/cn/handler/AUTO_SEARCH_OFF.png and b/assets/cn/handler/AUTO_SEARCH_OFF.png differ diff --git a/assets/en/handler/AUTO_SEARCH_OFF.png b/assets/cn/handler/AUTO_SEARCH_OFF2.png similarity index 85% rename from assets/en/handler/AUTO_SEARCH_OFF.png rename to assets/cn/handler/AUTO_SEARCH_OFF2.png index 87fd9e9d9..7b46a14f2 100644 Binary files a/assets/en/handler/AUTO_SEARCH_OFF.png and b/assets/cn/handler/AUTO_SEARCH_OFF2.png differ diff --git a/assets/en/handler/AUTO_SEARCH_ON.png b/assets/cn/handler/AUTO_SEARCH_OFF3.png similarity index 82% rename from assets/en/handler/AUTO_SEARCH_ON.png rename to assets/cn/handler/AUTO_SEARCH_OFF3.png index 5800256f3..2ca3bf763 100644 Binary files a/assets/en/handler/AUTO_SEARCH_ON.png and b/assets/cn/handler/AUTO_SEARCH_OFF3.png differ diff --git a/assets/cn/handler/AUTO_SEARCH_OFF4.png b/assets/cn/handler/AUTO_SEARCH_OFF4.png new file mode 100644 index 000000000..da7c2ad2c Binary files /dev/null and b/assets/cn/handler/AUTO_SEARCH_OFF4.png differ diff --git a/assets/cn/handler/AUTO_SEARCH_ON.png b/assets/cn/handler/AUTO_SEARCH_ON.png index 08dffe05d..44c023193 100644 Binary files a/assets/cn/handler/AUTO_SEARCH_ON.png and b/assets/cn/handler/AUTO_SEARCH_ON.png differ diff --git a/assets/cn/handler/AUTO_SEARCH_ON2.png b/assets/cn/handler/AUTO_SEARCH_ON2.png new file mode 100644 index 000000000..87338d550 Binary files /dev/null and b/assets/cn/handler/AUTO_SEARCH_ON2.png differ diff --git a/assets/cn/handler/AUTO_SEARCH_ON3.png b/assets/cn/handler/AUTO_SEARCH_ON3.png new file mode 100644 index 000000000..3d9390659 Binary files /dev/null and b/assets/cn/handler/AUTO_SEARCH_ON3.png differ diff --git a/assets/cn/handler/AUTO_SEARCH_ON4.png b/assets/cn/handler/AUTO_SEARCH_ON4.png new file mode 100644 index 000000000..a56df01a1 Binary files /dev/null and b/assets/cn/handler/AUTO_SEARCH_ON4.png differ diff --git a/assets/cn/handler/MAP_GREEN.png b/assets/cn/handler/MAP_GREEN.png index 895153034..a8b0847e9 100644 Binary files a/assets/cn/handler/MAP_GREEN.png and b/assets/cn/handler/MAP_GREEN.png differ diff --git a/assets/cn/handler/MAP_STAR_1.png b/assets/cn/handler/MAP_STAR_1.png index 5510e61e6..5695b2145 100644 Binary files a/assets/cn/handler/MAP_STAR_1.png and b/assets/cn/handler/MAP_STAR_1.png differ diff --git a/assets/cn/handler/MAP_STAR_2.png b/assets/cn/handler/MAP_STAR_2.png index 12d0e3c25..367ef9a46 100644 Binary files a/assets/cn/handler/MAP_STAR_2.png and b/assets/cn/handler/MAP_STAR_2.png differ diff --git a/assets/cn/handler/MAP_STAR_3.png b/assets/cn/handler/MAP_STAR_3.png index cf6168a83..181435cae 100644 Binary files a/assets/cn/handler/MAP_STAR_3.png and b/assets/cn/handler/MAP_STAR_3.png differ diff --git a/assets/cn/map/MAP_MODE_SWITCH_HARD.png b/assets/cn/map/MAP_MODE_SWITCH_HARD.png index fcff54fe9..ec4144cc6 100644 Binary files a/assets/cn/map/MAP_MODE_SWITCH_HARD.png and b/assets/cn/map/MAP_MODE_SWITCH_HARD.png differ diff --git a/assets/cn/map/MAP_MODE_SWITCH_HARD2.png b/assets/cn/map/MAP_MODE_SWITCH_HARD2.png new file mode 100644 index 000000000..313f91cc1 Binary files /dev/null and b/assets/cn/map/MAP_MODE_SWITCH_HARD2.png differ diff --git a/assets/cn/map/MAP_MODE_SWITCH_HARD3.png b/assets/cn/map/MAP_MODE_SWITCH_HARD3.png new file mode 100644 index 000000000..05e191dd8 Binary files /dev/null and b/assets/cn/map/MAP_MODE_SWITCH_HARD3.png differ diff --git a/assets/cn/map/MAP_MODE_SWITCH_HARD4.png b/assets/cn/map/MAP_MODE_SWITCH_HARD4.png new file mode 100644 index 000000000..a2da8c1f3 Binary files /dev/null and b/assets/cn/map/MAP_MODE_SWITCH_HARD4.png differ diff --git a/assets/cn/map/MAP_MODE_SWITCH_HARD5.png b/assets/cn/map/MAP_MODE_SWITCH_HARD5.png new file mode 100644 index 000000000..83d24f037 Binary files /dev/null and b/assets/cn/map/MAP_MODE_SWITCH_HARD5.png differ diff --git a/assets/cn/map/MAP_MODE_SWITCH_HARD6.png b/assets/cn/map/MAP_MODE_SWITCH_HARD6.png new file mode 100644 index 000000000..5a3d34487 Binary files /dev/null and b/assets/cn/map/MAP_MODE_SWITCH_HARD6.png differ diff --git a/assets/cn/map/MAP_MODE_SWITCH_NORMAL.png b/assets/cn/map/MAP_MODE_SWITCH_NORMAL.png index b1b75976e..85d8c204a 100644 Binary files a/assets/cn/map/MAP_MODE_SWITCH_NORMAL.png and b/assets/cn/map/MAP_MODE_SWITCH_NORMAL.png differ diff --git a/assets/cn/template/TEMPLATE_SIREN_BlackDragonBoss01.gif b/assets/cn/template/TEMPLATE_SIREN_BlackDragonBoss01.gif new file mode 100644 index 000000000..eb9520036 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_BlackDragonBoss01.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_BlackDragonBoss02.gif b/assets/cn/template/TEMPLATE_SIREN_BlackDragonBoss02.gif new file mode 100644 index 000000000..e7768c8e2 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_BlackDragonBoss02.gif differ diff --git a/assets/en/handler/MAP_GREEN.png b/assets/en/handler/MAP_GREEN.png index ba4474713..00e10d3ec 100644 Binary files a/assets/en/handler/MAP_GREEN.png and b/assets/en/handler/MAP_GREEN.png differ diff --git a/assets/en/handler/MAP_STAR_1.png b/assets/en/handler/MAP_STAR_1.png index d8159a6e7..e23701041 100644 Binary files a/assets/en/handler/MAP_STAR_1.png and b/assets/en/handler/MAP_STAR_1.png differ diff --git a/assets/en/handler/MAP_STAR_2.png b/assets/en/handler/MAP_STAR_2.png index 0178fe416..1cf97915b 100644 Binary files a/assets/en/handler/MAP_STAR_2.png and b/assets/en/handler/MAP_STAR_2.png differ diff --git a/assets/en/handler/MAP_STAR_3.png b/assets/en/handler/MAP_STAR_3.png index a81b7b46b..e43ffdabb 100644 Binary files a/assets/en/handler/MAP_STAR_3.png and b/assets/en/handler/MAP_STAR_3.png differ diff --git a/assets/en/map/MAP_MODE_SWITCH_HARD.png b/assets/en/map/MAP_MODE_SWITCH_HARD.png deleted file mode 100644 index fcff54fe9..000000000 Binary files a/assets/en/map/MAP_MODE_SWITCH_HARD.png and /dev/null differ diff --git a/assets/en/map/MAP_MODE_SWITCH_NORMAL.png b/assets/en/map/MAP_MODE_SWITCH_NORMAL.png deleted file mode 100644 index b1b75976e..000000000 Binary files a/assets/en/map/MAP_MODE_SWITCH_NORMAL.png and /dev/null differ diff --git a/assets/en/template/TEMPLATE_SIREN_BlackDragonBoss01.gif b/assets/en/template/TEMPLATE_SIREN_BlackDragonBoss01.gif new file mode 100644 index 000000000..eb9520036 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_BlackDragonBoss01.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_BlackDragonBoss02.gif b/assets/en/template/TEMPLATE_SIREN_BlackDragonBoss02.gif new file mode 100644 index 000000000..e7768c8e2 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_BlackDragonBoss02.gif differ diff --git a/assets/jp/handler/AUTO_SEARCH_ON.png b/assets/jp/handler/AUTO_SEARCH_ON.png deleted file mode 100644 index 35132aeda..000000000 Binary files a/assets/jp/handler/AUTO_SEARCH_ON.png and /dev/null differ diff --git a/assets/jp/handler/MAP_STAR_1.png b/assets/jp/handler/MAP_STAR_1.png deleted file mode 100644 index 5510e61e6..000000000 Binary files a/assets/jp/handler/MAP_STAR_1.png and /dev/null differ diff --git a/assets/jp/handler/MAP_STAR_2.png b/assets/jp/handler/MAP_STAR_2.png deleted file mode 100644 index 12d0e3c25..000000000 Binary files a/assets/jp/handler/MAP_STAR_2.png and /dev/null differ diff --git a/assets/jp/handler/MAP_STAR_3.png b/assets/jp/handler/MAP_STAR_3.png deleted file mode 100644 index cf6168a83..000000000 Binary files a/assets/jp/handler/MAP_STAR_3.png and /dev/null differ diff --git a/assets/jp/map/MAP_MODE_SWITCH_HARD.png b/assets/jp/map/MAP_MODE_SWITCH_HARD.png deleted file mode 100644 index fcff54fe9..000000000 Binary files a/assets/jp/map/MAP_MODE_SWITCH_HARD.png and /dev/null differ diff --git a/assets/jp/map/MAP_MODE_SWITCH_NORMAL.png b/assets/jp/map/MAP_MODE_SWITCH_NORMAL.png deleted file mode 100644 index b1b75976e..000000000 Binary files a/assets/jp/map/MAP_MODE_SWITCH_NORMAL.png and /dev/null differ diff --git a/assets/jp/shop/SHOP_REFRESH.png b/assets/jp/shop/SHOP_REFRESH.png index 8f7521f48..86634e817 100644 Binary files a/assets/jp/shop/SHOP_REFRESH.png and b/assets/jp/shop/SHOP_REFRESH.png differ diff --git a/assets/jp/template/TEMPLATE_SIREN_BlackDragonBoss01.gif b/assets/jp/template/TEMPLATE_SIREN_BlackDragonBoss01.gif new file mode 100644 index 000000000..eb9520036 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_BlackDragonBoss01.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_BlackDragonBoss02.gif b/assets/jp/template/TEMPLATE_SIREN_BlackDragonBoss02.gif new file mode 100644 index 000000000..e7768c8e2 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_BlackDragonBoss02.gif differ diff --git a/assets/shop/core/Array_3.png b/assets/shop/core/Array_3.png new file mode 100644 index 000000000..a23d84aaf Binary files /dev/null and b/assets/shop/core/Array_3.png differ diff --git a/assets/shop/guild/BookT2_5.png b/assets/shop/guild/BookT2_5.png new file mode 100644 index 000000000..d74b88074 Binary files /dev/null and b/assets/shop/guild/BookT2_5.png differ diff --git a/assets/shop/medal/BookRedT2_3.png b/assets/shop/medal/BookRedT2_3.png new file mode 100644 index 000000000..d6749c804 Binary files /dev/null and b/assets/shop/medal/BookRedT2_3.png differ diff --git a/assets/shop/medal/BookRedT3_3.png b/assets/shop/medal/BookRedT3_3.png new file mode 100644 index 000000000..82097600f Binary files /dev/null and b/assets/shop/medal/BookRedT3_3.png differ diff --git a/assets/shop/medal/BookT2_5.png b/assets/shop/medal/BookT2_5.png new file mode 100644 index 000000000..d74b88074 Binary files /dev/null and b/assets/shop/medal/BookT2_5.png differ diff --git a/assets/shop/medal/PlateAntiAirT2_3.png b/assets/shop/medal/PlateAntiAirT2_3.png new file mode 100644 index 000000000..d49376b98 Binary files /dev/null and b/assets/shop/medal/PlateAntiAirT2_3.png differ diff --git a/assets/shop/medal/PlateGeneralT2_3.png b/assets/shop/medal/PlateGeneralT2_3.png new file mode 100644 index 000000000..b81714536 Binary files /dev/null and b/assets/shop/medal/PlateGeneralT2_3.png differ diff --git a/assets/shop/medal/PlateGunT2_3.png b/assets/shop/medal/PlateGunT2_3.png new file mode 100644 index 000000000..0f608ab6a Binary files /dev/null and b/assets/shop/medal/PlateGunT2_3.png differ diff --git a/assets/shop/medal/PlateGunT3_3.png b/assets/shop/medal/PlateGunT3_3.png new file mode 100644 index 000000000..6f57f76bd Binary files /dev/null and b/assets/shop/medal/PlateGunT3_3.png differ diff --git a/assets/shop/medal/PlatePlaneT3_3.png b/assets/shop/medal/PlatePlaneT3_3.png new file mode 100644 index 000000000..4887ce0aa Binary files /dev/null and b/assets/shop/medal/PlatePlaneT3_3.png differ diff --git a/assets/shop/medal/PlateTorpedoT3_3.png b/assets/shop/medal/PlateTorpedoT3_3.png new file mode 100644 index 000000000..6579a76ba Binary files /dev/null and b/assets/shop/medal/PlateTorpedoT3_3.png differ diff --git a/assets/shop/medal/SpecializedCore_2.png b/assets/shop/medal/SpecializedCore_2.png new file mode 100644 index 000000000..d56ce67cf Binary files /dev/null and b/assets/shop/medal/SpecializedCore_2.png differ diff --git a/assets/shop/merit/BoxT1_5.png b/assets/shop/merit/BoxT1_5.png new file mode 100644 index 000000000..2ba4bc88c Binary files /dev/null and b/assets/shop/merit/BoxT1_5.png differ diff --git a/assets/shop/merit/BoxT1_6.png b/assets/shop/merit/BoxT1_6.png new file mode 100644 index 000000000..3cf13b3ce Binary files /dev/null and b/assets/shop/merit/BoxT1_6.png differ diff --git a/assets/tw/handler/AUTO_SEARCH_ON.png b/assets/tw/handler/AUTO_SEARCH_ON.png deleted file mode 100644 index 08dffe05d..000000000 Binary files a/assets/tw/handler/AUTO_SEARCH_ON.png and /dev/null differ diff --git a/assets/tw/handler/MAP_GREEN.png b/assets/tw/handler/MAP_GREEN.png index 895153034..a8b0847e9 100644 Binary files a/assets/tw/handler/MAP_GREEN.png and b/assets/tw/handler/MAP_GREEN.png differ diff --git a/assets/tw/handler/MAP_STAR_1.png b/assets/tw/handler/MAP_STAR_1.png deleted file mode 100644 index 5510e61e6..000000000 Binary files a/assets/tw/handler/MAP_STAR_1.png and /dev/null differ diff --git a/assets/tw/handler/MAP_STAR_2.png b/assets/tw/handler/MAP_STAR_2.png deleted file mode 100644 index 12d0e3c25..000000000 Binary files a/assets/tw/handler/MAP_STAR_2.png and /dev/null differ diff --git a/assets/tw/handler/MAP_STAR_3.png b/assets/tw/handler/MAP_STAR_3.png deleted file mode 100644 index cf6168a83..000000000 Binary files a/assets/tw/handler/MAP_STAR_3.png and /dev/null differ diff --git a/assets/tw/map/MAP_MODE_SWITCH_HARD.png b/assets/tw/map/MAP_MODE_SWITCH_HARD.png deleted file mode 100644 index fcff54fe9..000000000 Binary files a/assets/tw/map/MAP_MODE_SWITCH_HARD.png and /dev/null differ diff --git a/assets/tw/map/MAP_MODE_SWITCH_NORMAL.png b/assets/tw/map/MAP_MODE_SWITCH_NORMAL.png deleted file mode 100644 index b1b75976e..000000000 Binary files a/assets/tw/map/MAP_MODE_SWITCH_NORMAL.png and /dev/null differ diff --git a/assets/tw/template/TEMPLATE_SIREN_BlackDragonBoss01.gif b/assets/tw/template/TEMPLATE_SIREN_BlackDragonBoss01.gif new file mode 100644 index 000000000..eb9520036 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_BlackDragonBoss01.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_BlackDragonBoss02.gif b/assets/tw/template/TEMPLATE_SIREN_BlackDragonBoss02.gif new file mode 100644 index 000000000..e7768c8e2 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_BlackDragonBoss02.gif differ diff --git a/campaign/Readme.md b/campaign/Readme.md index 57e1137d1..3bb9c67cf 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -257,3 +257,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250814 | event 20250814 cn | Secrets of the Abyss | 奇渊下的秘密 | Secrets of the Abyss | 淵層界の秘密 | - | | 20250821 | event 20220224 cn | Abyssal Refrain | - | - | - | 復刻深度回音 | | 20250828 | event 20250814 cn | Secrets of the Abyss | - | - | - | 奇淵下的秘密 | +| 20250912 | event 20250912 cn | A Dance for Amahara Above | 起舞于天原之上 | A Dance for Amahara Above | アマハラに舞い奉れ | - | diff --git a/campaign/event_20250912_cn/a1.py b/campaign/event_20250912_cn/a1.py new file mode 100644 index 000000000..a129f3968 --- /dev/null +++ b/campaign/event_20250912_cn/a1.py @@ -0,0 +1,95 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('A1') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- ++ -- SP -- SP ++ ++ ++ + -- ++ Me -- __ -- Me -- Me + -- Me -- -- MS -- -- ME -- + -- -- -- MS -- MS -- -- -- + ME ME -- ++ ++ ++ ++ -- ++ + ++ ++ -- -- ME ++ ME -- ME + ++ ++ -- -- -- -- -- MB -- + -- -- ME -- ME ++ ME -- ME +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1, 'boss': 1}, + {'battle': 4, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + MAP_SIREN_HAS_BOSS_ICON_SMALL = True + MAP_SWIPE_MULTIPLY = (1.212, 1.235) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.172, 1.194) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.138, 1.158) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/event_20250912_cn/a2.py b/campaign/event_20250912_cn/a2.py new file mode 100644 index 000000000..bef257fb3 --- /dev/null +++ b/campaign/event_20250912_cn/a2.py @@ -0,0 +1,79 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'F2', 'E6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP ++ -- ME -- ME ++ -- + SP -- -- MS -- -- -- ME -- + ++ -- MS -- ++ ++ ME -- ME + -- MS -- __ MB ++ ++ -- ++ + -- Me -- Me -- ME -- -- ME + -- ++ -- -- Me -- -- ME -- + -- ++ Me -- -- -- ME ++ -- + -- -- -- -- ME -- -- ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.224, 1.247) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.184, 1.206) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.149, 1.170) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20250912_cn/a3.py b/campaign/event_20250912_cn/a3.py new file mode 100644 index 000000000..0954bc47b --- /dev/null +++ b/campaign/event_20250912_cn/a3.py @@ -0,0 +1,79 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D4'] +MAP.map_data = """ + -- -- ++ ++ ++ ME -- ME -- -- + -- Me -- Me -- ME -- ++ ++ -- + -- -- MS -- -- -- -- MB ++ ME + SP -- -- MS ++ Me __ -- ME -- + SP -- -- MS ++ ME -- -- -- -- + -- -- MS -- -- -- -- ME -- ME + -- Me ++ ++ Me -- ++ -- ++ -- + -- -- ++ ++ -- -- ME -- ME -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.127, 1.148) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.090, 1.110) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.058, 1.077) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20250912_cn/b1.py b/campaign/event_20250912_cn/b1.py new file mode 100644 index 000000000..74a38f96f --- /dev/null +++ b/campaign/event_20250912_cn/b1.py @@ -0,0 +1,97 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('B1') +MAP.shape = 'J8' +MAP.camera_data = ['E3', 'E6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- -- ++ ++ ++ Me -- ++ -- -- + -- MB -- -- Me -- -- -- ME -- + ++ ++ -- Me -- -- -- ME -- -- + ++ ++ -- ++ ME __ ME ++ ++ -- + -- -- MS -- MS -- -- ME ++ ME + -- Me -- MS -- Me -- -- -- -- + -- ++ -- -- -- ++ ME -- ME -- + -- ++ SP -- SP ++ -- ME ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2, 'boss': 1}, + {'battle': 5, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BlackDragonBoss02'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.078, 1.099) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.043, 1.062) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.013, 1.031) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20250912_cn/b2.py b/campaign/event_20250912_cn/b2.py new file mode 100644 index 000000000..43612be43 --- /dev/null +++ b/campaign/event_20250912_cn/b2.py @@ -0,0 +1,80 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'J8' +MAP.camera_data = ['E2', 'E6', 'G4'] +MAP.camera_data_spawn_point = ['G6'] +MAP.map_data = """ + ++ -- ME ++ -- ++ ++ ++ -- -- + -- ++ -- -- ME -- MB -- -- -- + -- ME -- ME ++ ME -- ME ++ ++ + -- ME -- -- Me -- __ -- ME ++ + ++ ++ ME -- -- MS -- MS -- Me + ++ ++ -- -- Me -- MS -- Me -- + -- ME -- Me ++ -- -- -- ++ -- + -- -- ME -- ++ SP -- SP ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BlackDragonBoss02'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.086, 1.106) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.050, 1.069) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.019, 1.038) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20250912_cn/b3.py b/campaign/event_20250912_cn/b3.py new file mode 100644 index 000000000..a3a8e46b2 --- /dev/null +++ b/campaign/event_20250912_cn/b3.py @@ -0,0 +1,84 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'K9' +MAP.camera_data = ['F2', 'F5', 'F7', 'D5'] +MAP.camera_data_spawn_point = ['I5'] +MAP.map_data = """ + -- -- ++ -- -- ME -- ME -- ++ -- + -- ++ ++ ME -- ++ ++ ++ -- -- ++ + ++ ++ ++ ME -- -- Me -- MS -- ++ + -- -- ME -- -- Me ++ MS -- -- SP + MB -- -- -- -- -- -- -- -- __ -- + -- -- ME -- -- Me ++ MS -- -- SP + ++ ++ ++ ME -- -- Me -- MS -- ++ + -- ++ ++ ME -- ++ ++ ++ -- -- ++ + -- -- ++ -- -- ME -- ME -- ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BlackDragonBoss02'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) + MAP_SWIPE_MULTIPLY = (1.109, 1.130) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.073, 1.093) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.042, 1.060) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20250912_cn/c1.py b/campaign/event_20250912_cn/c1.py new file mode 100644 index 000000000..06b74ec94 --- /dev/null +++ b/campaign/event_20250912_cn/c1.py @@ -0,0 +1,95 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('C1') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- ++ -- SP -- SP ++ ++ ++ + -- ++ Me -- __ -- Me -- Me + -- Me -- -- MS -- -- ME -- + -- -- -- MS -- MS -- -- -- + ME ME -- ++ ++ ++ ++ -- ++ + ++ ++ -- -- ME ++ ME -- ME + ++ ++ -- -- -- -- -- MB -- + -- -- ME -- ME ++ ME -- ME +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + MAP_SIREN_HAS_BOSS_ICON_SMALL = True + MAP_SWIPE_MULTIPLY = (1.212, 1.235) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.172, 1.194) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.138, 1.158) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20250912_cn/c2.py b/campaign/event_20250912_cn/c2.py new file mode 100644 index 000000000..3ea39c671 --- /dev/null +++ b/campaign/event_20250912_cn/c2.py @@ -0,0 +1,79 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'F2', 'E6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP ++ -- ME -- ME ++ -- + SP -- -- MS -- -- -- ME -- + ++ -- MS -- ++ ++ ME -- ME + -- MS -- __ MB ++ ++ -- ++ + -- Me -- Me -- ME -- -- ME + -- ++ -- -- Me -- -- ME -- + -- ++ Me -- -- -- ME ++ -- + -- -- -- -- ME -- -- ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.224, 1.247) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.184, 1.206) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.149, 1.170) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20250912_cn/c3.py b/campaign/event_20250912_cn/c3.py new file mode 100644 index 000000000..937129bd4 --- /dev/null +++ b/campaign/event_20250912_cn/c3.py @@ -0,0 +1,80 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D4'] +MAP.map_data = """ + -- -- ++ ++ ++ ME -- ME -- -- + -- Me -- Me -- ME -- ++ ++ -- + -- -- MS -- -- -- -- MB ++ ME + SP -- -- MS ++ Me __ -- ME -- + SP -- -- MS ++ ME -- -- -- -- + -- -- MS -- -- -- -- ME -- ME + -- Me ++ ++ Me -- ++ -- ++ -- + -- -- ++ ++ -- -- ME -- ME -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.127, 1.148) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.090, 1.110) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.058, 1.077) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20250912_cn/campaign_base.py b/campaign/event_20250912_cn/campaign_base.py new file mode 100644 index 000000000..e1522a3f5 --- /dev/null +++ b/campaign/event_20250912_cn/campaign_base.py @@ -0,0 +1,11 @@ +from module.ui.page import page_event +from module.campaign.campaign_base import CampaignBase as CampaignBase_ + + +class CampaignBase(CampaignBase_): + + def handle_exp_info(self): + # Random background hits EXP_INFO_B + if self.ui_page_appear(page_event): + return False + return super().handle_exp_info() diff --git a/campaign/event_20250912_cn/d1.py b/campaign/event_20250912_cn/d1.py new file mode 100644 index 000000000..069bb596b --- /dev/null +++ b/campaign/event_20250912_cn/d1.py @@ -0,0 +1,97 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('D1') +MAP.shape = 'J8' +MAP.camera_data = ['E3', 'E6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- -- ++ ++ ++ Me -- ++ -- -- + -- MB -- -- Me -- -- -- ME -- + ++ ++ -- Me -- -- -- ME -- -- + ++ ++ -- ++ ME __ ME ++ ++ -- + -- -- MS -- MS -- -- ME ++ ME + -- Me -- MS -- Me -- -- -- -- + -- ++ -- -- -- ++ ME -- ME -- + -- ++ SP -- SP ++ -- ME ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BlackDragonBoss02'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.078, 1.099) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.043, 1.062) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.013, 1.031) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20250912_cn/d2.py b/campaign/event_20250912_cn/d2.py new file mode 100644 index 000000000..b50c04bcc --- /dev/null +++ b/campaign/event_20250912_cn/d2.py @@ -0,0 +1,89 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'J8' +MAP.camera_data = ['E2', 'E6', 'G4'] +MAP.camera_data_spawn_point = ['G6'] +MAP.map_data = """ + ++ -- ME ++ -- ++ ++ ++ -- -- + -- ++ -- -- ME -- MB -- -- -- + -- ME -- ME ++ ME -- ME ++ ++ + -- ME -- -- Me -- __ -- ME ++ + ++ ++ ME -- -- MS -- MS -- Me + ++ ++ -- -- Me -- MS -- Me -- + -- ME -- Me ++ -- -- -- ++ -- + -- -- ME -- ++ SP -- SP ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 20 50 10 10 10 50 50 + 50 50 50 20 10 10 10 10 10 50 + 50 50 20 20 10 10 10 10 10 20 + 50 50 50 20 10 10 05 10 10 20 + 50 50 50 20 50 10 10 10 50 50 + 50 50 50 50 50 10 10 10 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BlackDragonBoss02'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.086, 1.106) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.050, 1.069) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.019, 1.038) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20250912_cn/d3.py b/campaign/event_20250912_cn/d3.py new file mode 100644 index 000000000..66fb11dc6 --- /dev/null +++ b/campaign/event_20250912_cn/d3.py @@ -0,0 +1,93 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'K9' +MAP.camera_data = ['F2', 'F5', 'F7', 'D5'] +MAP.camera_data_spawn_point = ['I5'] +MAP.map_data = """ + -- -- ++ -- -- ME -- ME -- ++ -- + -- ++ ++ ME -- ++ ++ ++ -- -- ++ + ++ ++ ++ ME -- -- Me -- MS -- ++ + -- -- ME -- -- Me ++ MS -- -- SP + MB -- -- -- -- -- -- -- -- __ -- + -- -- ME -- -- Me ++ MS -- -- SP + ++ ++ ++ ME -- -- Me -- MS -- ++ + -- ++ ++ ME -- ++ ++ ++ -- -- ++ + -- -- ++ -- -- ME -- ME -- ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 10 10 10 10 10 10 + 50 50 50 50 50 10 10 10 10 10 10 + 50 50 50 50 50 10 10 10 10 10 10 + 50 50 50 50 50 10 10 10 10 10 10 + 50 50 50 50 50 10 10 10 10 10 10 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BlackDragonBoss02'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) + MAP_SWIPE_MULTIPLY = (1.109, 1.130) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.073, 1.093) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.042, 1.060) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20250912_cn/sp.py b/campaign/event_20250912_cn/sp.py new file mode 100644 index 000000000..77d4ce91b --- /dev/null +++ b/campaign/event_20250912_cn/sp.py @@ -0,0 +1,127 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('SP') +MAP.shape = 'I8' +MAP.camera_data = ['D4', 'F4'] +MAP.camera_data_spawn_point = ['F4'] +MAP.map_data = """ + -- -- ++ ++ -- ++ ++ -- -- + -- -- ++ ++ MB ++ ++ -- -- + -- -- ME MS -- MS ME -- -- + ++ ME -- -- MS -- -- ME ++ + ++ ME -- -- __ -- -- ME ++ + -- -- ME SP -- SP ME -- -- + -- -- ++ ++ ++ ++ ++ -- -- + -- -- ++ ++ -- ++ ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 10 10 10 50 50 50 + 50 50 50 10 10 10 50 50 50 + 50 50 50 10 10 10 50 50 50 + 50 50 50 50 50 10 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 8, 'siren': 3}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6}, + {'battle': 7, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BlackDragonBoss01', 'BlackDragonBoss02'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + STAGE_INCREASE_AB = True + MAP_IS_ONE_TIME_STAGE = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.096, 1.117) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.060, 1.080) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.029, 1.048) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def map_data_init(self, map_): + super().map_data_init(map_) + # enemy + B4.is_enemy = True + B5.is_enemy = True + C3.is_enemy = True + C6.is_enemy = True + G3.is_enemy = True + G6.is_enemy = True + H4.is_enemy = True + H5.is_enemy = True + # siren + D3.is_siren = True + E4.is_siren = True + F3.is_siren = True + + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=2): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_7(self): + return self.fleet_boss.clear_boss() diff --git a/config/deploy.template-AidLux-cn.yaml b/config/deploy.template-AidLux-cn.yaml index c92dbc68b..67537770e 100644 --- a/config/deploy.template-AidLux-cn.yaml +++ b/config/deploy.template-AidLux-cn.yaml @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe` diff --git a/config/deploy.template-AidLux.yaml b/config/deploy.template-AidLux.yaml index 68a19e145..89b626f48 100644 --- a/config/deploy.template-AidLux.yaml +++ b/config/deploy.template-AidLux.yaml @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe` diff --git a/config/deploy.template-cn.yaml b/config/deploy.template-cn.yaml index b7687a408..91ee2e102 100644 --- a/config/deploy.template-cn.yaml +++ b/config/deploy.template-cn.yaml @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe` diff --git a/config/deploy.template-docker-cn.yaml b/config/deploy.template-docker-cn.yaml index a792896d3..7bb6456ab 100644 --- a/config/deploy.template-docker-cn.yaml +++ b/config/deploy.template-docker-cn.yaml @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe` diff --git a/config/deploy.template-docker.yaml b/config/deploy.template-docker.yaml index 1dc8421ec..200c63231 100644 --- a/config/deploy.template-docker.yaml +++ b/config/deploy.template-docker.yaml @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe` diff --git a/config/deploy.template-linux-cn.yaml b/config/deploy.template-linux-cn.yaml index bf266f8f9..11aa91f88 100644 --- a/config/deploy.template-linux-cn.yaml +++ b/config/deploy.template-linux-cn.yaml @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe` diff --git a/config/deploy.template-linux.yaml b/config/deploy.template-linux.yaml index a1abe262f..621fff6c0 100644 --- a/config/deploy.template-linux.yaml +++ b/config/deploy.template-linux.yaml @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe` diff --git a/config/deploy.template.yaml b/config/deploy.template.yaml index 5453b9c6f..5f2027e78 100644 --- a/config/deploy.template.yaml +++ b/config/deploy.template.yaml @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe` diff --git a/deploy/Windows/config.py b/deploy/Windows/config.py index db41aaa1a..fc62725a2 100644 --- a/deploy/Windows/config.py +++ b/deploy/Windows/config.py @@ -20,7 +20,6 @@ class ConfigModel: GitProxy: Optional[str] = None SSLVerify: bool = False AutoUpdate: bool = True - KeepLocalChanges: bool = False # Python PythonExecutable: str = "./toolkit/python.exe" diff --git a/deploy/Windows/git.py b/deploy/Windows/git.py index c873f6b35..acc4db4a4 100644 --- a/deploy/Windows/git.py +++ b/deploy/Windows/git.py @@ -52,8 +52,7 @@ class GitManager(DeployConfig): return conf def git_repository_init( - self, repo, source='origin', branch='master', - proxy='', ssl_verify=True, keep_changes=False + self, repo, source='origin', branch='master', proxy='', ssl_verify=True ): logger.hr('Git Init', 1) if not self.execute(f'"{self.git}" init', allow_failure=True): @@ -104,25 +103,12 @@ class GitManager(DeployConfig): if os.path.exists(lock_file): logger.info(f'Lock file {lock_file} exists, removing') os.remove(lock_file) - if keep_changes: - if self.execute(f'"{self.git}" stash', allow_failure=True): - self.execute(f'"{self.git}" pull --ff-only {source} {branch}') - if self.execute(f'"{self.git}" stash pop', allow_failure=True): - pass - else: - # No local changes to existing files, untracked files not included - logger.info('Stash pop failed, there seems to be no local changes, skip instead') - else: - logger.info('Stash failed, this may be the first installation, drop changes instead') - self.execute(f'"{self.git}" reset --hard {source}/{branch}') - self.execute(f'"{self.git}" pull --ff-only {source} {branch}') - else: - self.execute(f'"{self.git}" reset --hard {source}/{branch}') - Progress.GitReset() - # Since `git fetch` is already called, checkout is faster - if not self.execute(f'"{self.git}" checkout {branch}', allow_failure=True): - self.execute(f'"{self.git}" pull --ff-only {source} {branch}') - Progress.GitCheckout() + self.execute(f'"{self.git}" reset --hard {source}/{branch}') + Progress.GitReset() + # Since `git fetch` is already called, checkout is faster + if not self.execute(f'"{self.git}" checkout {branch}', allow_failure=True): + self.execute(f'"{self.git}" pull --ff-only {source} {branch}') + Progress.GitCheckout() logger.hr('Show Version', 1) self.execute(f'"{self.git}" --no-pager log --no-merges -1') @@ -149,7 +135,7 @@ class GitManager(DeployConfig): return if self.GitOverCdn: - if self.goc_client.update(keep_changes=self.KeepLocalChanges): + if self.goc_client.update(): return self.git_repository_init( @@ -158,5 +144,4 @@ class GitManager(DeployConfig): branch=self.Branch, proxy=self.GitProxy, ssl_verify=self.SSLVerify, - keep_changes=self.KeepLocalChanges, ) diff --git a/deploy/Windows/template.yaml b/deploy/Windows/template.yaml index aa173f1ac..c24a6c7d1 100644 --- a/deploy/Windows/template.yaml +++ b/deploy/Windows/template.yaml @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe` diff --git a/deploy/config.py b/deploy/config.py index e63128169..ea56c2299 100644 --- a/deploy/config.py +++ b/deploy/config.py @@ -17,7 +17,6 @@ class ConfigModel: GitProxy: Optional[str] = None SSLVerify: bool = False AutoUpdate: bool = True - KeepLocalChanges: bool = False # Python PythonExecutable: str = "./toolkit/python.exe" diff --git a/deploy/git.py b/deploy/git.py index 0ec4ba854..669870a7c 100644 --- a/deploy/git.py +++ b/deploy/git.py @@ -23,8 +23,7 @@ class GitManager(DeployConfig): logger.info(f'File not found: {file}') def git_repository_init( - self, repo, source='origin', branch='master', - proxy='', ssl_verify=True, keep_changes=False + self, repo, source='origin', branch='master', proxy='', ssl_verify=True ): logger.hr('Git Init', 1) if not self.execute(f'"{self.git}" init', allow_failure=True): @@ -63,21 +62,8 @@ class GitManager(DeployConfig): if os.path.exists(lock_file): logger.info(f'Lock file {lock_file} exists, removing') os.remove(lock_file) - if keep_changes: - if self.execute(f'"{self.git}" stash', allow_failure=True): - self.execute(f'"{self.git}" pull --ff-only {source} {branch}') - if self.execute(f'"{self.git}" stash pop', allow_failure=True): - pass - else: - # No local changes to existing files, untracked files not included - logger.info('Stash pop failed, there seems to be no local changes, skip instead') - else: - logger.info('Stash failed, this may be the first installation, drop changes instead') - self.execute(f'"{self.git}" reset --hard {source}/{branch}') - self.execute(f'"{self.git}" pull --ff-only {source} {branch}') - else: - self.execute(f'"{self.git}" reset --hard {source}/{branch}') - self.execute(f'"{self.git}" pull --ff-only {source} {branch}') + self.execute(f'"{self.git}" reset --hard {source}/{branch}') + self.execute(f'"{self.git}" pull --ff-only {source} {branch}') logger.hr('Show Version', 1) self.execute(f'"{self.git}" --no-pager log --no-merges -1') @@ -102,7 +88,7 @@ class GitManager(DeployConfig): return if self.GitOverCdn: - if self.goc_client.update(keep_changes=self.KeepLocalChanges): + if self.goc_client.update(): return self.git_repository_init( @@ -111,7 +97,6 @@ class GitManager(DeployConfig): branch=self.Branch, proxy=self.GitProxy, ssl_verify=self.SSLVerify, - keep_changes=self.KeepLocalChanges, ) diff --git a/deploy/git_over_cdn/client.py b/deploy/git_over_cdn/client.py index cbb634994..a8fb5b5d2 100644 --- a/deploy/git_over_cdn/client.py +++ b/deploy/git_over_cdn/client.py @@ -204,7 +204,7 @@ class GitOverCdnClient: self.logger.warning(f'TimeoutExpired when calling {cmd}, stdout={stdout}, stderr={stderr}') return stdout.decode() - def git_reset(self, keep_changes=False): + def git_reset(self): """ git reset --hard """ @@ -217,12 +217,7 @@ class GitOverCdnClient: if os.path.exists(lock_file): self.logger.info(f'Lock file {lock_file} exists, removing') os.remove(lock_file) - if keep_changes: - self.git_command('stash') - self.git_command('reset', '--hard', f'{self.source}/{self.branch}') - self.git_command('stash', 'pop') - else: - self.git_command('reset', '--hard', f'{self.source}/{self.branch}') + self.git_command('reset', '--hard', f'{self.source}/{self.branch}') def get_status(self): """ @@ -245,11 +240,8 @@ class GitOverCdnClient: self.logger.info('Current repo is behind remote') return 'behind' - def update(self, keep_changes=False): + def update(self): """ - Args: - keep_changes: - Returns: bool: If repo is up-to-date """ @@ -263,13 +255,13 @@ class GitOverCdnClient: return False if self.current_commit == self.latest_commit: self.logger.info('Already up to date') - self.git_reset(keep_changes=keep_changes) + self.git_reset() return True if not self.download_pack(): return False if not self.update_refs(): return False - self.git_reset(keep_changes=keep_changes) + self.git_reset() self.logger.info('Update success') return True diff --git a/deploy/template b/deploy/template index e13b046e4..a724703e3 100644 --- a/deploy/template +++ b/deploy/template @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe` diff --git a/module/campaign/campaign_ui.py b/module/campaign/campaign_ui.py index f639baf1b..f2d2bf4e4 100644 --- a/module/campaign/campaign_ui.py +++ b/module/campaign/campaign_ui.py @@ -34,6 +34,9 @@ ASIDE_SWITCH_20241219.add_state('part1', CHAPTER_20241219_PART1) ASIDE_SWITCH_20241219.add_state('part2', CHAPTER_20241219_PART2) ASIDE_SWITCH_20241219.add_state('sp', CHAPTER_20241219_SP) ASIDE_SWITCH_20241219.add_state('ex', CHAPTER_20241219_EX) +# shorten unknown_timer for faster hanlding +# because of game bug that aside indicator will be missing after campaign retreat or finish +ASIDE_SWITCH_20241219.set_unknown_timer = Timer(0.6, count=2) def is_digit_chapter(chapter): diff --git a/module/campaign/run.py b/module/campaign/run.py index 287e712da..54f5fc688 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -337,7 +337,16 @@ class CampaignRun(CampaignEvent, ShopStatus): # Convert campaign_main to campaign hard if mode is hard and file exists if mode == 'hard' and folder == 'campaign_main' and name in map_files('campaign_hard'): folder = 'campaign_hard' - + # event_20240912_cn does not have "Threat: Safe" indicator, fallback MapAchievement + if folder == 'event_20240912_cn': + if self.config.StopCondition_MapAchievement == 'threat_safe': + logger.info( + 'In event_20240912_cn, MapAchievement=threat_safe fallback to map_3_stars') + self.config.override(StopCondition_MapAchievement='map_3_stars') + if self.config.StopCondition_MapAchievement == 'threat_safe_without_3_stars': + logger.info( + 'In event_20240912_cn, MapAchievement=threat_safe_without_3_stars fallback to 100_percent_clear') + self.config.override(StopCondition_MapAchievement='100_percent_clear') return name, folder def can_use_auto_search_continue(self): diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 8bf706ece..6ba33ee51 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3780,10 +3780,12 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "display": "hide", "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -3849,6 +3851,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -3918,6 +3921,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -4127,7 +4131,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -7273,9 +7278,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -7341,6 +7348,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -7410,6 +7418,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -7619,7 +7628,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -8077,9 +8087,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -8145,6 +8157,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -8214,6 +8227,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -8423,7 +8437,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -8881,9 +8896,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -8949,6 +8966,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -9018,6 +9036,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -9227,7 +9246,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -9685,9 +9705,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -9753,6 +9775,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -9822,6 +9845,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -10031,7 +10055,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -10489,9 +10514,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -10557,6 +10584,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -10626,6 +10654,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -10835,7 +10864,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -11293,9 +11323,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -11361,6 +11393,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -11430,6 +11463,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -11639,7 +11673,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -13309,9 +13344,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -13377,6 +13414,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -13446,6 +13484,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -13655,7 +13694,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -14130,9 +14170,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -14198,6 +14240,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -14267,6 +14310,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -14476,7 +14520,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -14951,9 +14996,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -15019,6 +15066,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -15088,6 +15136,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -15297,7 +15346,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -15772,9 +15822,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -15840,6 +15892,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -15909,6 +15962,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -16118,7 +16172,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { @@ -16583,9 +16638,11 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ], "option_cn": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -16651,6 +16708,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -16720,6 +16778,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20250912_cn", "event_20250814_cn", "event_20221124_cn", "event_20250724_cn", @@ -16929,7 +16988,8 @@ "event_20250424_cn", "event_20250520_cn", "event_20250724_cn", - "event_20250814_cn" + "event_20250814_cn", + "event_20250912_cn" ] }, "Mode": { diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 39f1a7b8d..904362f1a 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -1132,6 +1132,7 @@ "event_20250520_cn": "A Rose on the High Tower", "event_20250724_cn": "The Alchemist and the Tower of Horizons", "event_20250814_cn": "Secrets of the Abyss", + "event_20250912_cn": "A Dance for Amahara Above", "raid_20200624": "Air Raid Drills with Essex Rerun", "raid_20210708": "Cross Wave rerun", "raid_20220127": "Mystery Investigation", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 45c1b945c..13cd9b79d 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -1132,6 +1132,7 @@ "event_20250520_cn": "高い塔の薔薇", "event_20250724_cn": "錬金術士と天空邂逅の塔", "event_20250814_cn": "淵層界の秘密", + "event_20250912_cn": "アマハラに舞い奉れ", "raid_20200624": "特別演習超空強襲波(復刻)", "raid_20210708": "交錯する新たな波 (復刻)", "raid_20220127": "秘密事件調査", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 0b081f179..f5c1bf583 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -1132,6 +1132,7 @@ "event_20250520_cn": "高塔上的蔷薇", "event_20250724_cn": "优米雅的炼金工房", "event_20250814_cn": "奇渊下的秘密", + "event_20250912_cn": "起舞于天原之上", "raid_20200624": "复刻特别演习埃塞克斯级", "raid_20210708": "复刻穿越彼方的水线", "raid_20220127": "演习神秘事件调查", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 7ad743a5b..f53fdd911 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -1132,6 +1132,7 @@ "event_20250520_cn": "高塔上的薔薇", "event_20250724_cn": "鍊金術士與天際交會之塔", "event_20250814_cn": "奇淵下的秘密", + "event_20250912_cn": "A Dance for Amahara Above", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", diff --git a/module/device/connection.py b/module/device/connection.py index e032f15d4..e5ba0b8af 100644 --- a/module/device/connection.py +++ b/module/device/connection.py @@ -318,7 +318,8 @@ class Connection(ConnectionAttr): # BlueStacks Air is the Mac version of BlueStacks if not IS_MACINTOSH: return False - if not self.is_ldplayer_bluestacks_family: + # 127.0.0.1:5555 + 10*n, assume 32 instances at max + if not (5555 <= self.port <= 5875): return False # [bst.installed_images]: [Tiramisu64] # [bst.instance]: [Tiramisu64] diff --git a/module/device/connection_attr.py b/module/device/connection_attr.py index 2be4d9ad5..c8b215c0a 100644 --- a/module/device/connection_attr.py +++ b/module/device/connection_attr.py @@ -78,9 +78,9 @@ class ConnectionAttr: # 127.0.0.1.5555 serial = serial.replace('127.0.0.1.', '127.0.0.1:') # Mumu12 5.0 shows double serials, some people may just copy-paste it - # 5555,16384 - if ',' in serial: - left, _, right = serial.partition(',') + # 5555,16384 -> replaced to 5555.16384 + if '.' in serial: + left, _, right = serial.partition('.') if left.startswith('55') and right.startswith('16'): serial = right # 16384 @@ -165,7 +165,7 @@ class ConnectionAttr: @cached_property def is_mumu12_family(self): - # 127.0.0.1:16XXX + # 127.0.0.1:16384 + 32*n, assume 32 instances at max return 16384 <= self.port <= 17408 @cached_property @@ -177,7 +177,8 @@ class ConnectionAttr: @cached_property def is_ldplayer_bluestacks_family(self): # Note that LDPlayer and BlueStacks have the same serial range - return self.serial.startswith('emulator-') or 5555 <= self.port <= 5587 + # 127.0.0.1:5555 + 2*n, assume 32 instances at max + return self.serial.startswith('emulator-') or 5555 <= self.port <= 5619 @cached_property def is_nox_family(self): diff --git a/module/handler/assets.py b/module/handler/assets.py index bcab10446..2d8bba661 100644 --- a/module/handler/assets.py +++ b/module/handler/assets.py @@ -9,8 +9,14 @@ AUTO_SEARCH_MAP_OPTION_OFF = Button(area={'cn': (1205, 549, 1275, 566), 'en': (1 AUTO_SEARCH_MAP_OPTION_ON = Button(area={'cn': (1205, 549, 1275, 566), 'en': (1203, 552, 1277, 564), 'jp': (1203, 547, 1276, 568), 'tw': (1204, 546, 1276, 567)}, color={'cn': (149, 176, 193), 'en': (113, 135, 157), 'jp': (132, 158, 177), 'tw': (110, 133, 156)}, button={'cn': (1205, 549, 1275, 566), 'en': (1203, 552, 1277, 564), 'jp': (1203, 547, 1276, 568), 'tw': (1204, 546, 1276, 567)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_MAP_OPTION_ON.png', 'en': './assets/en/handler/AUTO_SEARCH_MAP_OPTION_ON.png', 'jp': './assets/jp/handler/AUTO_SEARCH_MAP_OPTION_ON.png', 'tw': './assets/tw/handler/AUTO_SEARCH_MAP_OPTION_ON.png'}) AUTO_SEARCH_MENU_CONTINUE = Button(area={'cn': (789, 610, 903, 638), 'en': (781, 612, 910, 634), 'jp': (859, 610, 973, 638), 'tw': (790, 610, 903, 638)}, color={'cn': (147, 182, 224), 'en': (159, 187, 224), 'jp': (139, 173, 218), 'tw': (148, 181, 222)}, button={'cn': (773, 598, 919, 646), 'en': (773, 598, 919, 647), 'jp': (845, 597, 990, 646), 'tw': (776, 601, 919, 645)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_MENU_CONTINUE.png', 'en': './assets/en/handler/AUTO_SEARCH_MENU_CONTINUE.png', 'jp': './assets/jp/handler/AUTO_SEARCH_MENU_CONTINUE.png', 'tw': './assets/tw/handler/AUTO_SEARCH_MENU_CONTINUE.png'}) AUTO_SEARCH_MENU_EXIT = Button(area={'cn': (419, 609, 475, 637), 'en': (421, 611, 472, 633), 'jp': (348, 609, 401, 636), 'tw': (414, 609, 477, 637)}, color={'cn': (198, 199, 201), 'en': (210, 210, 212), 'jp': (184, 184, 187), 'tw': (204, 204, 206)}, button={'cn': (373, 598, 520, 647), 'en': (373, 598, 520, 647), 'jp': (305, 597, 451, 645), 'tw': (393, 604, 498, 644)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_MENU_EXIT.png', 'en': './assets/en/handler/AUTO_SEARCH_MENU_EXIT.png', 'jp': './assets/jp/handler/AUTO_SEARCH_MENU_EXIT.png', 'tw': './assets/tw/handler/AUTO_SEARCH_MENU_EXIT.png'}) -AUTO_SEARCH_OFF = Button(area={'cn': (867, 588, 883, 604), 'en': (830, 588, 846, 604), 'jp': (849, 588, 865, 604), 'tw': (867, 588, 883, 604)}, color={'cn': (94, 92, 94), 'en': (90, 89, 92), 'jp': (99, 99, 109), 'tw': (94, 92, 94)}, button={'cn': (867, 588, 883, 604), 'en': (830, 588, 846, 604), 'jp': (849, 588, 865, 604), 'tw': (867, 588, 883, 604)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_OFF.png', 'en': './assets/en/handler/AUTO_SEARCH_OFF.png', 'jp': './assets/jp/handler/AUTO_SEARCH_OFF.png', 'tw': './assets/tw/handler/AUTO_SEARCH_OFF.png'}) -AUTO_SEARCH_ON = Button(area={'cn': (867, 588, 883, 604), 'en': (830, 588, 846, 604), 'jp': (849, 588, 865, 604), 'tw': (867, 588, 883, 604)}, color={'cn': (140, 167, 120), 'en': (139, 168, 112), 'jp': (140, 167, 122), 'tw': (140, 167, 120)}, button={'cn': (867, 588, 883, 604), 'en': (830, 588, 846, 604), 'jp': (849, 588, 865, 604), 'tw': (867, 588, 883, 604)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_ON.png', 'en': './assets/en/handler/AUTO_SEARCH_ON.png', 'jp': './assets/jp/handler/AUTO_SEARCH_ON.png', 'tw': './assets/tw/handler/AUTO_SEARCH_ON.png'}) +AUTO_SEARCH_OFF = Button(area={'cn': (867, 588, 883, 604), 'en': (867, 588, 883, 604), 'jp': (849, 588, 865, 604), 'tw': (867, 588, 883, 604)}, color={'cn': (94, 92, 94), 'en': (94, 92, 94), 'jp': (99, 99, 109), 'tw': (94, 92, 94)}, button={'cn': (867, 588, 883, 604), 'en': (867, 588, 883, 604), 'jp': (849, 588, 865, 604), 'tw': (867, 588, 883, 604)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_OFF.png', 'en': './assets/cn/handler/AUTO_SEARCH_OFF.png', 'jp': './assets/jp/handler/AUTO_SEARCH_OFF.png', 'tw': './assets/tw/handler/AUTO_SEARCH_OFF.png'}) +AUTO_SEARCH_OFF2 = Button(area={'cn': (867, 588, 883, 604), 'en': (867, 588, 883, 604), 'jp': (867, 588, 883, 604), 'tw': (867, 588, 883, 604)}, color={'cn': (90, 89, 92), 'en': (90, 89, 92), 'jp': (90, 89, 92), 'tw': (90, 89, 92)}, button={'cn': (867, 588, 883, 604), 'en': (867, 588, 883, 604), 'jp': (867, 588, 883, 604), 'tw': (867, 588, 883, 604)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_OFF2.png', 'en': './assets/cn/handler/AUTO_SEARCH_OFF2.png', 'jp': './assets/cn/handler/AUTO_SEARCH_OFF2.png', 'tw': './assets/cn/handler/AUTO_SEARCH_OFF2.png'}) +AUTO_SEARCH_OFF3 = Button(area={'cn': (865, 587, 881, 603), 'en': (865, 587, 881, 603), 'jp': (865, 587, 881, 603), 'tw': (865, 587, 881, 603)}, color={'cn': (108, 112, 115), 'en': (108, 112, 115), 'jp': (108, 112, 115), 'tw': (108, 112, 115)}, button={'cn': (865, 587, 881, 603), 'en': (865, 587, 881, 603), 'jp': (865, 587, 881, 603), 'tw': (865, 587, 881, 603)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_OFF3.png', 'en': './assets/cn/handler/AUTO_SEARCH_OFF3.png', 'jp': './assets/cn/handler/AUTO_SEARCH_OFF3.png', 'tw': './assets/cn/handler/AUTO_SEARCH_OFF3.png'}) +AUTO_SEARCH_OFF4 = Button(area={'cn': (865, 587, 881, 603), 'en': (865, 587, 881, 603), 'jp': (865, 587, 881, 603), 'tw': (865, 587, 881, 603)}, color={'cn': (105, 110, 114), 'en': (105, 110, 114), 'jp': (105, 110, 114), 'tw': (105, 110, 114)}, button={'cn': (865, 587, 881, 603), 'en': (865, 587, 881, 603), 'jp': (865, 587, 881, 603), 'tw': (865, 587, 881, 603)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_OFF4.png', 'en': './assets/cn/handler/AUTO_SEARCH_OFF4.png', 'jp': './assets/cn/handler/AUTO_SEARCH_OFF4.png', 'tw': './assets/cn/handler/AUTO_SEARCH_OFF4.png'}) +AUTO_SEARCH_ON = Button(area={'cn': (867, 588, 883, 604), 'en': (867, 588, 883, 604), 'jp': (867, 588, 883, 604), 'tw': (867, 588, 883, 604)}, color={'cn': (140, 167, 120), 'en': (140, 167, 120), 'jp': (140, 167, 120), 'tw': (140, 167, 120)}, button={'cn': (867, 588, 883, 604), 'en': (867, 588, 883, 604), 'jp': (867, 588, 883, 604), 'tw': (867, 588, 883, 604)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_ON.png', 'en': './assets/cn/handler/AUTO_SEARCH_ON.png', 'jp': './assets/cn/handler/AUTO_SEARCH_ON.png', 'tw': './assets/cn/handler/AUTO_SEARCH_ON.png'}) +AUTO_SEARCH_ON2 = Button(area={'cn': (867, 588, 883, 604), 'en': (867, 588, 883, 604), 'jp': (867, 588, 883, 604), 'tw': (867, 588, 883, 604)}, color={'cn': (139, 168, 112), 'en': (139, 168, 112), 'jp': (139, 168, 112), 'tw': (139, 168, 112)}, button={'cn': (867, 588, 883, 604), 'en': (867, 588, 883, 604), 'jp': (867, 588, 883, 604), 'tw': (867, 588, 883, 604)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_ON2.png', 'en': './assets/cn/handler/AUTO_SEARCH_ON2.png', 'jp': './assets/cn/handler/AUTO_SEARCH_ON2.png', 'tw': './assets/cn/handler/AUTO_SEARCH_ON2.png'}) +AUTO_SEARCH_ON3 = Button(area={'cn': (865, 587, 881, 603), 'en': (865, 587, 881, 603), 'jp': (865, 587, 881, 603), 'tw': (865, 587, 881, 603)}, color={'cn': (141, 168, 125), 'en': (141, 168, 125), 'jp': (141, 168, 125), 'tw': (141, 168, 125)}, button={'cn': (865, 587, 881, 603), 'en': (865, 587, 881, 603), 'jp': (865, 587, 881, 603), 'tw': (865, 587, 881, 603)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_ON3.png', 'en': './assets/cn/handler/AUTO_SEARCH_ON3.png', 'jp': './assets/cn/handler/AUTO_SEARCH_ON3.png', 'tw': './assets/cn/handler/AUTO_SEARCH_ON3.png'}) +AUTO_SEARCH_ON4 = Button(area={'cn': (867, 588, 883, 604), 'en': (867, 588, 883, 604), 'jp': (867, 588, 883, 604), 'tw': (867, 588, 883, 604)}, color={'cn': (138, 166, 123), 'en': (138, 166, 123), 'jp': (138, 166, 123), 'tw': (138, 166, 123)}, button={'cn': (867, 588, 883, 604), 'en': (867, 588, 883, 604), 'jp': (867, 588, 883, 604), 'tw': (867, 588, 883, 604)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_ON4.png', 'en': './assets/cn/handler/AUTO_SEARCH_ON4.png', 'jp': './assets/cn/handler/AUTO_SEARCH_ON4.png', 'tw': './assets/cn/handler/AUTO_SEARCH_ON4.png'}) AUTO_SEARCH_SET_ALL = Button(area={'cn': (832, 207, 851, 226), 'en': (940, 322, 959, 340), 'jp': (832, 207, 851, 226), 'tw': (832, 207, 851, 226)}, color={'cn': (32, 32, 38), 'en': (39, 40, 41), 'jp': (38, 37, 38), 'tw': (39, 41, 41)}, button={'cn': (832, 207, 851, 226), 'en': (940, 322, 959, 340), 'jp': (832, 207, 851, 226), 'tw': (832, 207, 851, 226)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_ALL.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_ALL.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_ALL.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_ALL.png'}) AUTO_SEARCH_SET_ALL_15 = Button(area={'cn': (832, 161, 851, 180), 'en': (832, 161, 851, 180), 'jp': (832, 161, 851, 180), 'tw': (832, 161, 851, 180)}, color={'cn': (74, 101, 55), 'en': (74, 101, 55), 'jp': (74, 101, 55), 'tw': (74, 101, 55)}, button={'cn': (832, 161, 851, 180), 'en': (832, 161, 851, 180), 'jp': (832, 161, 851, 180), 'tw': (832, 161, 851, 180)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_ALL_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_ALL_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_ALL_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_ALL_15.png'}) AUTO_SEARCH_SET_BOSS = Button(area={'cn': (635, 207, 653, 226), 'en': (616, 208, 634, 226), 'jp': (635, 207, 653, 226), 'tw': (635, 207, 653, 226)}, color={'cn': (30, 30, 33), 'en': (42, 40, 43), 'jp': (37, 36, 37), 'tw': (37, 39, 39)}, button={'cn': (635, 207, 653, 226), 'en': (616, 208, 634, 226), 'jp': (635, 207, 653, 226), 'tw': (635, 207, 653, 226)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_BOSS.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_BOSS.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_BOSS.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_BOSS.png'}) @@ -68,10 +74,10 @@ MAP_AMBUSH_EVADE = Button(area={'cn': (1029, 457, 1101, 487), 'en': (1021, 459, MAP_BUFF = Button(area={'cn': (145, 115, 437, 159), 'en': (145, 115, 437, 159), 'jp': (145, 115, 437, 159), 'tw': (145, 115, 437, 159)}, color={'cn': (103, 118, 118), 'en': (103, 118, 118), 'jp': (103, 118, 118), 'tw': (103, 118, 118)}, button={'cn': (145, 115, 437, 159), 'en': (145, 115, 437, 159), 'jp': (145, 115, 437, 159), 'tw': (145, 115, 437, 159)}, file={'cn': './assets/cn/handler/MAP_BUFF.png', 'en': './assets/en/handler/MAP_BUFF.png', 'jp': './assets/jp/handler/MAP_BUFF.png', 'tw': './assets/tw/handler/MAP_BUFF.png'}) MAP_CLEAR_PERCENTAGE = Button(area={'cn': (626, 185, 970, 190), 'en': (626, 185, 970, 190), 'jp': (626, 185, 970, 190), 'tw': (626, 185, 970, 190)}, color={'cn': (245, 213, 88), 'en': (245, 213, 88), 'jp': (245, 213, 88), 'tw': (245, 213, 88)}, button={'cn': (626, 185, 970, 190), 'en': (626, 185, 970, 190), 'jp': (626, 185, 970, 190), 'tw': (626, 185, 970, 190)}, file={'cn': './assets/cn/handler/MAP_CLEAR_PERCENTAGE.png', 'en': './assets/en/handler/MAP_CLEAR_PERCENTAGE.png', 'jp': './assets/jp/handler/MAP_CLEAR_PERCENTAGE.png', 'tw': './assets/tw/handler/MAP_CLEAR_PERCENTAGE.png'}) MAP_ENEMY_SEARCHING = Button(area={'cn': (617, 359, 651, 373), 'en': (589, 348, 602, 358), 'jp': (678, 358, 719, 368), 'tw': (678, 358, 719, 368)}, color={'cn': (237, 163, 159), 'en': (187, 130, 116), 'jp': (245, 172, 171), 'tw': (245, 172, 171)}, button={'cn': (617, 359, 651, 373), 'en': (589, 348, 602, 358), 'jp': (678, 358, 719, 368), 'tw': (678, 358, 719, 368)}, file={'cn': './assets/cn/handler/MAP_ENEMY_SEARCHING.png', 'en': './assets/en/handler/MAP_ENEMY_SEARCHING.png', 'jp': './assets/jp/handler/MAP_ENEMY_SEARCHING.png', 'tw': './assets/tw/handler/MAP_ENEMY_SEARCHING.png'}) -MAP_GREEN = Button(area={'cn': (195, 260, 349, 292), 'en': (201, 259, 341, 290), 'jp': (242, 265, 323, 287), 'tw': (195, 260, 349, 292)}, color={'cn': (125, 190, 84), 'en': (104, 207, 104), 'jp': (143, 196, 109), 'tw': (125, 190, 84)}, button={'cn': (195, 260, 349, 292), 'en': (201, 259, 341, 290), 'jp': (242, 265, 323, 287), 'tw': (195, 260, 349, 292)}, file={'cn': './assets/cn/handler/MAP_GREEN.png', 'en': './assets/en/handler/MAP_GREEN.png', 'jp': './assets/jp/handler/MAP_GREEN.png', 'tw': './assets/tw/handler/MAP_GREEN.png'}) -MAP_STAR_1 = Button(area={'cn': (245, 377, 254, 384), 'en': (232, 381, 240, 389), 'jp': (245, 377, 254, 384), 'tw': (245, 377, 254, 384)}, color={'cn': (251, 233, 143), 'en': (252, 234, 146), 'jp': (251, 233, 143), 'tw': (251, 233, 143)}, button={'cn': (245, 377, 254, 384), 'en': (232, 381, 240, 389), 'jp': (245, 377, 254, 384), 'tw': (245, 377, 254, 384)}, file={'cn': './assets/cn/handler/MAP_STAR_1.png', 'en': './assets/en/handler/MAP_STAR_1.png', 'jp': './assets/jp/handler/MAP_STAR_1.png', 'tw': './assets/tw/handler/MAP_STAR_1.png'}) -MAP_STAR_2 = Button(area={'cn': (532, 377, 540, 384), 'en': (518, 382, 526, 389), 'jp': (532, 377, 540, 384), 'tw': (532, 377, 540, 384)}, color={'cn': (251, 233, 144), 'en': (252, 234, 144), 'jp': (251, 233, 144), 'tw': (251, 233, 144)}, button={'cn': (532, 377, 540, 384), 'en': (518, 382, 526, 389), 'jp': (532, 377, 540, 384), 'tw': (532, 377, 540, 384)}, file={'cn': './assets/cn/handler/MAP_STAR_2.png', 'en': './assets/en/handler/MAP_STAR_2.png', 'jp': './assets/jp/handler/MAP_STAR_2.png', 'tw': './assets/tw/handler/MAP_STAR_2.png'}) -MAP_STAR_3 = Button(area={'cn': (818, 377, 827, 384), 'en': (804, 382, 812, 389), 'jp': (818, 377, 827, 384), 'tw': (818, 377, 827, 384)}, color={'cn': (251, 233, 143), 'en': (252, 234, 144), 'jp': (251, 233, 143), 'tw': (251, 233, 143)}, button={'cn': (818, 377, 827, 384), 'en': (804, 382, 812, 389), 'jp': (818, 377, 827, 384), 'tw': (818, 377, 827, 384)}, file={'cn': './assets/cn/handler/MAP_STAR_3.png', 'en': './assets/en/handler/MAP_STAR_3.png', 'jp': './assets/jp/handler/MAP_STAR_3.png', 'tw': './assets/tw/handler/MAP_STAR_3.png'}) +MAP_GREEN = Button(area={'cn': (242, 268, 321, 286), 'en': (222, 268, 319, 281), 'jp': (242, 265, 323, 287), 'tw': (242, 268, 321, 286)}, color={'cn': (171, 209, 145), 'en': (149, 220, 149), 'jp': (143, 196, 109), 'tw': (171, 209, 145)}, button={'cn': (242, 268, 321, 286), 'en': (222, 268, 319, 281), 'jp': (242, 265, 323, 287), 'tw': (242, 268, 321, 286)}, file={'cn': './assets/cn/handler/MAP_GREEN.png', 'en': './assets/en/handler/MAP_GREEN.png', 'jp': './assets/jp/handler/MAP_GREEN.png', 'tw': './assets/tw/handler/MAP_GREEN.png'}) +MAP_STAR_1 = Button(area={'cn': (234, 365, 265, 394), 'en': (219, 369, 250, 397), 'jp': (234, 365, 265, 394), 'tw': (234, 365, 265, 394)}, color={'cn': (80, 69, 45), 'en': (88, 77, 52), 'jp': (80, 69, 45), 'tw': (80, 69, 45)}, button={'cn': (234, 365, 265, 394), 'en': (219, 369, 250, 397), 'jp': (234, 365, 265, 394), 'tw': (234, 365, 265, 394)}, file={'cn': './assets/cn/handler/MAP_STAR_1.png', 'en': './assets/en/handler/MAP_STAR_1.png', 'jp': './assets/cn/handler/MAP_STAR_1.png', 'tw': './assets/cn/handler/MAP_STAR_1.png'}) +MAP_STAR_2 = Button(area={'cn': (521, 365, 551, 394), 'en': (506, 369, 535, 396), 'jp': (521, 365, 551, 394), 'tw': (521, 365, 551, 394)}, color={'cn': (81, 69, 44), 'en': (98, 84, 55), 'jp': (81, 69, 44), 'tw': (81, 69, 44)}, button={'cn': (521, 365, 551, 394), 'en': (506, 369, 535, 396), 'jp': (521, 365, 551, 394), 'tw': (521, 365, 551, 394)}, file={'cn': './assets/cn/handler/MAP_STAR_2.png', 'en': './assets/en/handler/MAP_STAR_2.png', 'jp': './assets/cn/handler/MAP_STAR_2.png', 'tw': './assets/cn/handler/MAP_STAR_2.png'}) +MAP_STAR_3 = Button(area={'cn': (807, 365, 838, 394), 'en': (792, 368, 821, 397), 'jp': (807, 365, 838, 394), 'tw': (807, 365, 838, 394)}, color={'cn': (80, 68, 46), 'en': (93, 80, 53), 'jp': (80, 68, 46), 'tw': (80, 68, 46)}, button={'cn': (807, 365, 838, 394), 'en': (792, 368, 821, 397), 'jp': (807, 365, 838, 394), 'tw': (807, 365, 838, 394)}, file={'cn': './assets/cn/handler/MAP_STAR_3.png', 'en': './assets/en/handler/MAP_STAR_3.png', 'jp': './assets/cn/handler/MAP_STAR_3.png', 'tw': './assets/cn/handler/MAP_STAR_3.png'}) MAP_WALK_OUT_OF_STEP = Button(area={'cn': (654, 312, 704, 335), 'en': (454, 314, 698, 338), 'jp': (736, 312, 783, 336), 'tw': (653, 309, 705, 334)}, color={'cn': (109, 113, 120), 'en': (108, 109, 116), 'jp': (137, 135, 143), 'tw': (118, 124, 132)}, button={'cn': (654, 312, 704, 335), 'en': (454, 314, 698, 338), 'jp': (736, 312, 783, 336), 'tw': (653, 309, 705, 334)}, file={'cn': './assets/cn/handler/MAP_WALK_OUT_OF_STEP.png', 'en': './assets/en/handler/MAP_WALK_OUT_OF_STEP.png', 'jp': './assets/jp/handler/MAP_WALK_OUT_OF_STEP.png', 'tw': './assets/tw/handler/MAP_WALK_OUT_OF_STEP.png'}) MAP_WALK_SPEEDUP = Button(area={'cn': (1025, 406, 1055, 436), 'en': (1025, 406, 1055, 436), 'jp': (1025, 406, 1055, 436), 'tw': (1025, 406, 1055, 436)}, color={'cn': (62, 97, 72), 'en': (62, 97, 72), 'jp': (62, 97, 72), 'tw': (62, 97, 72)}, button={'cn': (1025, 406, 1055, 436), 'en': (1025, 406, 1055, 436), 'jp': (1025, 406, 1055, 436), 'tw': (1025, 406, 1055, 436)}, file={'cn': './assets/cn/handler/MAP_WALK_SPEEDUP.png', 'en': './assets/en/handler/MAP_WALK_SPEEDUP.png', 'jp': './assets/jp/handler/MAP_WALK_SPEEDUP.png', 'tw': './assets/tw/handler/MAP_WALK_SPEEDUP.png'}) MISSION_POPUP_ACK = Button(area={'cn': (432, 493, 543, 533), 'en': (413, 489, 566, 532), 'jp': (410, 482, 574, 539), 'tw': (441, 491, 536, 522)}, color={'cn': (181, 182, 184), 'en': (169, 170, 172), 'jp': (162, 164, 167), 'tw': (195, 195, 197)}, button={'cn': (432, 493, 543, 533), 'en': (413, 489, 566, 532), 'jp': (410, 482, 574, 539), 'tw': (441, 491, 536, 522)}, file={'cn': './assets/cn/handler/MISSION_POPUP_ACK.png', 'en': './assets/en/handler/MISSION_POPUP_ACK.png', 'jp': './assets/jp/handler/MISSION_POPUP_ACK.png', 'tw': './assets/tw/handler/MISSION_POPUP_ACK.png'}) diff --git a/module/handler/fast_forward.py b/module/handler/fast_forward.py index b234ee33c..f81a80160 100644 --- a/module/handler/fast_forward.py +++ b/module/handler/fast_forward.py @@ -8,15 +8,21 @@ from module.handler.auto_search import AutoSearchHandler from module.logger import logger from module.ui.switch import Switch -FAST_FORWARD = Switch('Fast_Forward') +FAST_FORWARD = Switch('Fast_Forward', offset=(5, 5)) FAST_FORWARD.add_state('on', check_button=FAST_FORWARD_ON) FAST_FORWARD.add_state('off', check_button=FAST_FORWARD_OFF) FLEET_LOCK = Switch('Fleet_Lock', offset=(5, 20)) FLEET_LOCK.add_state('on', check_button=FLEET_LOCKED) FLEET_LOCK.add_state('off', check_button=FLEET_UNLOCKED) -AUTO_SEARCH = Switch('Auto_Search', offset=(20, 20)) +AUTO_SEARCH = Switch('Auto_Search', offset=(60, 20)) AUTO_SEARCH.add_state('on', check_button=AUTO_SEARCH_ON) +AUTO_SEARCH.add_state('on', check_button=AUTO_SEARCH_ON2) +AUTO_SEARCH.add_state('on', check_button=AUTO_SEARCH_ON3) +AUTO_SEARCH.add_state('on', check_button=AUTO_SEARCH_ON4) AUTO_SEARCH.add_state('off', check_button=AUTO_SEARCH_OFF) +AUTO_SEARCH.add_state('off', check_button=AUTO_SEARCH_OFF2) +AUTO_SEARCH.add_state('off', check_button=AUTO_SEARCH_OFF3) +AUTO_SEARCH.add_state('off', check_button=AUTO_SEARCH_OFF4) def map_files(event): @@ -133,12 +139,12 @@ class FastForwardHandler(AutoSearchHandler): | INFO | [Map_info] 98%, star_1, star_2, star_3, clear, 3_star, green, fast_forward """ self.map_clear_percentage = self.get_map_clear_percentage() - self.map_achieved_star_1 = self.appear(MAP_STAR_1) - self.map_achieved_star_2 = self.appear(MAP_STAR_2) - self.map_achieved_star_3 = self.appear(MAP_STAR_3) + self.map_achieved_star_1 = self._is_map_star_active(MAP_STAR_1) + self.map_achieved_star_2 = self._is_map_star_active(MAP_STAR_2) + self.map_achieved_star_3 = self._is_map_star_active(MAP_STAR_3) self.map_is_100_percent_clear = self.map_clear_percentage > 0.95 self.map_is_3_stars = self.map_achieved_star_1 and self.map_achieved_star_2 and self.map_achieved_star_3 - self.map_is_threat_safe = self.appear(MAP_GREEN) + self.map_is_threat_safe = self.appear(MAP_GREEN, offset=(20, 20)) if self.config.Campaign_Name.lower() == 'sp': # Minor issue here # Using auto_search option because clear mode cannot be detected whether on SP @@ -209,6 +215,9 @@ class FastForwardHandler(AutoSearchHandler): self.map_wait_auto_search() return changed + def _is_map_star_active(self, button): + return self.image_color_count(button, color=(250, 232, 140), threshold=180, count=35) + def handle_map_fleet_lock(self, enable=None): """ Args: diff --git a/module/handler/info_handler.py b/module/handler/info_handler.py index f29506e63..5d886df5f 100644 --- a/module/handler/info_handler.py +++ b/module/handler/info_handler.py @@ -245,6 +245,7 @@ class InfoHandler(ModuleBase): """ Guild popup info """ + def handle_guild_popup_confirm(self): if self.appear(GUILD_POPUP_CANCEL, offset=self._popup_offset) \ and self.appear(GUILD_POPUP_CONFIRM, offset=self._popup_offset, interval=2): @@ -264,6 +265,7 @@ class InfoHandler(ModuleBase): """ Mission popup info """ + def handle_mission_popup_go(self): if self.appear(MISSION_POPUP_ACK, offset=self._popup_offset) \ and self.appear(MISSION_POPUP_GO, offset=self._popup_offset, interval=2): @@ -447,9 +449,6 @@ class InfoHandler(ModuleBase): self.interval_clear(STORY_SKIP_3) else: self._story_confirm.reset() - if self.appear_then_click(GAME_TIPS, offset=(20, 20), interval=2): - self.story_popup_timeout.reset() - return True if self.appear_then_click(STORY_CLOSE, offset=(10, 10), interval=2): self.story_popup_timeout.reset() return True @@ -494,18 +493,22 @@ class InfoHandler(ModuleBase): """ Game tips """ + def handle_game_tips(self): """ Returns: bool: If handled """ - if self.appear(GAME_TIPS, offset=(20, 20), interval=2): + if self.appear(GAME_TIPS, offset=(20, 20), interval=2) and self.image_color_count( + GAME_TIPS.button, color=(40, 40, 40), threshold=240, count=50): self.device.click(GAME_TIPS) return True - if self.appear(GAME_TIPS3, offset=(20, 20), interval=2): + if self.appear(GAME_TIPS3, offset=(20, 20), interval=2) and self.image_color_count( + GAME_TIPS3.button, color=(40, 40, 40), threshold=240, count=50): self.device.click(GAME_TIPS) return True - if self.appear(GAME_TIPS4, offset=(20, 20), interval=2): + if self.appear(GAME_TIPS4, offset=(20, 20), interval=2) and self.image_color_count( + GAME_TIPS4.button, color=(40, 40, 40), threshold=240, count=50): self.device.click(GAME_TIPS) return True @@ -514,6 +517,7 @@ class InfoHandler(ModuleBase): """ Manjuu loading """ + def manjuu_count(self): """ detect manjuu count by template matching @@ -535,7 +539,7 @@ class InfoHandler(ModuleBase): self.device.screenshot() if not self.manjuu_count(): break - + def handle_manjuu(self): """ Handle manjuu loading. diff --git a/module/map/assets.py b/module/map/assets.py index dabb17867..ef4ab335c 100644 --- a/module/map/assets.py +++ b/module/map/assets.py @@ -30,8 +30,13 @@ FLEET_PREPARATION = Button(area={'cn': (1013, 558, 1141, 588), 'en': (1048, 569, FLEET_PREPARATION_CHECK = Button(area={'cn': (1146, 107, 1174, 136), 'en': (1129, 111, 1158, 140), 'jp': (1146, 107, 1174, 136), 'tw': (1145, 106, 1175, 136)}, color={'cn': (180, 98, 111), 'en': (189, 105, 109), 'jp': (180, 98, 111), 'tw': (180, 90, 92)}, button={'cn': (1146, 107, 1174, 136), 'en': (1129, 111, 1158, 140), 'jp': (1146, 107, 1174, 136), 'tw': (1145, 106, 1175, 136)}, file={'cn': './assets/cn/map/FLEET_PREPARATION_CHECK.png', 'en': './assets/en/map/FLEET_PREPARATION_CHECK.png', 'jp': './assets/jp/map/FLEET_PREPARATION_CHECK.png', 'tw': './assets/tw/map/FLEET_PREPARATION_CHECK.png'}) MAP_CAT_ATTACK = Button(area={'cn': (1237, 103, 1252, 153), 'en': (1237, 103, 1252, 153), 'jp': (1237, 103, 1252, 153), 'tw': (1237, 103, 1252, 153)}, color={'cn': (43, 45, 52), 'en': (43, 45, 52), 'jp': (43, 45, 52), 'tw': (43, 45, 52)}, button={'cn': (1148, 653, 1262, 705), 'en': (1147, 651, 1263, 701), 'jp': (1149, 653, 1261, 704), 'tw': (1148, 653, 1262, 705)}, file={'cn': './assets/cn/map/MAP_CAT_ATTACK.png', 'en': './assets/en/map/MAP_CAT_ATTACK.png', 'jp': './assets/jp/map/MAP_CAT_ATTACK.png', 'tw': './assets/tw/map/MAP_CAT_ATTACK.png'}) MAP_CAT_ATTACK_MIRROR = Button(area={'cn': (147, 145, 187, 157), 'en': (147, 145, 187, 157), 'jp': (147, 145, 187, 157), 'tw': (147, 145, 187, 157)}, color={'cn': (214, 191, 99), 'en': (214, 191, 99), 'jp': (214, 191, 99), 'tw': (214, 191, 99)}, button={'cn': (147, 145, 187, 157), 'en': (147, 145, 187, 157), 'jp': (147, 145, 187, 157), 'tw': (147, 145, 187, 157)}, file={'cn': './assets/cn/map/MAP_CAT_ATTACK_MIRROR.png', 'en': './assets/en/map/MAP_CAT_ATTACK_MIRROR.png', 'jp': './assets/jp/map/MAP_CAT_ATTACK_MIRROR.png', 'tw': './assets/tw/map/MAP_CAT_ATTACK_MIRROR.png'}) -MAP_MODE_SWITCH_HARD = Button(area={'cn': (341, 580, 374, 617), 'en': (341, 580, 374, 617), 'jp': (341, 580, 374, 617), 'tw': (341, 580, 374, 617)}, color={'cn': (234, 179, 179), 'en': (234, 179, 179), 'jp': (234, 179, 179), 'tw': (234, 179, 179)}, button={'cn': (341, 580, 374, 617), 'en': (341, 580, 374, 617), 'jp': (341, 580, 374, 617), 'tw': (341, 580, 374, 617)}, file={'cn': './assets/cn/map/MAP_MODE_SWITCH_HARD.png', 'en': './assets/en/map/MAP_MODE_SWITCH_HARD.png', 'jp': './assets/jp/map/MAP_MODE_SWITCH_HARD.png', 'tw': './assets/tw/map/MAP_MODE_SWITCH_HARD.png'}) -MAP_MODE_SWITCH_NORMAL = Button(area={'cn': (214, 584, 255, 615), 'en': (214, 584, 255, 615), 'jp': (214, 584, 255, 615), 'tw': (214, 584, 255, 615)}, color={'cn': (185, 201, 236), 'en': (185, 201, 236), 'jp': (185, 201, 236), 'tw': (185, 201, 236)}, button={'cn': (214, 584, 255, 615), 'en': (214, 584, 255, 615), 'jp': (214, 584, 255, 615), 'tw': (214, 584, 255, 615)}, file={'cn': './assets/cn/map/MAP_MODE_SWITCH_NORMAL.png', 'en': './assets/en/map/MAP_MODE_SWITCH_NORMAL.png', 'jp': './assets/jp/map/MAP_MODE_SWITCH_NORMAL.png', 'tw': './assets/tw/map/MAP_MODE_SWITCH_NORMAL.png'}) +MAP_MODE_SWITCH_HARD = Button(area={'cn': (341, 580, 374, 617), 'en': (341, 580, 374, 617), 'jp': (341, 580, 374, 617), 'tw': (341, 580, 374, 617)}, color={'cn': (234, 179, 179), 'en': (234, 179, 179), 'jp': (234, 179, 179), 'tw': (234, 179, 179)}, button={'cn': (341, 580, 374, 617), 'en': (341, 580, 374, 617), 'jp': (341, 580, 374, 617), 'tw': (341, 580, 374, 617)}, file={'cn': './assets/cn/map/MAP_MODE_SWITCH_HARD.png', 'en': './assets/cn/map/MAP_MODE_SWITCH_HARD.png', 'jp': './assets/cn/map/MAP_MODE_SWITCH_HARD.png', 'tw': './assets/cn/map/MAP_MODE_SWITCH_HARD.png'}) +MAP_MODE_SWITCH_HARD2 = Button(area={'cn': (340, 579, 372, 615), 'en': (340, 579, 372, 615), 'jp': (340, 579, 372, 615), 'tw': (340, 579, 372, 615)}, color={'cn': (255, 174, 85), 'en': (255, 174, 85), 'jp': (255, 174, 85), 'tw': (255, 174, 85)}, button={'cn': (340, 579, 372, 615), 'en': (340, 579, 372, 615), 'jp': (340, 579, 372, 615), 'tw': (340, 579, 372, 615)}, file={'cn': './assets/cn/map/MAP_MODE_SWITCH_HARD2.png', 'en': './assets/cn/map/MAP_MODE_SWITCH_HARD2.png', 'jp': './assets/cn/map/MAP_MODE_SWITCH_HARD2.png', 'tw': './assets/cn/map/MAP_MODE_SWITCH_HARD2.png'}) +MAP_MODE_SWITCH_HARD3 = Button(area={'cn': (340, 579, 372, 615), 'en': (340, 579, 372, 615), 'jp': (340, 579, 372, 615), 'tw': (340, 579, 372, 615)}, color={'cn': (254, 169, 89), 'en': (254, 169, 89), 'jp': (254, 169, 89), 'tw': (254, 169, 89)}, button={'cn': (340, 579, 372, 615), 'en': (340, 579, 372, 615), 'jp': (340, 579, 372, 615), 'tw': (340, 579, 372, 615)}, file={'cn': './assets/cn/map/MAP_MODE_SWITCH_HARD3.png', 'en': './assets/cn/map/MAP_MODE_SWITCH_HARD3.png', 'jp': './assets/cn/map/MAP_MODE_SWITCH_HARD3.png', 'tw': './assets/cn/map/MAP_MODE_SWITCH_HARD3.png'}) +MAP_MODE_SWITCH_HARD4 = Button(area={'cn': (340, 579, 372, 615), 'en': (340, 579, 372, 615), 'jp': (340, 579, 372, 615), 'tw': (340, 579, 372, 615)}, color={'cn': (252, 159, 98), 'en': (252, 159, 98), 'jp': (252, 159, 98), 'tw': (252, 159, 98)}, button={'cn': (340, 579, 372, 615), 'en': (340, 579, 372, 615), 'jp': (340, 579, 372, 615), 'tw': (340, 579, 372, 615)}, file={'cn': './assets/cn/map/MAP_MODE_SWITCH_HARD4.png', 'en': './assets/cn/map/MAP_MODE_SWITCH_HARD4.png', 'jp': './assets/cn/map/MAP_MODE_SWITCH_HARD4.png', 'tw': './assets/cn/map/MAP_MODE_SWITCH_HARD4.png'}) +MAP_MODE_SWITCH_HARD5 = Button(area={'cn': (340, 579, 372, 615), 'en': (340, 579, 372, 615), 'jp': (340, 579, 372, 615), 'tw': (340, 579, 372, 615)}, color={'cn': (249, 168, 106), 'en': (249, 168, 106), 'jp': (249, 168, 106), 'tw': (249, 168, 106)}, button={'cn': (340, 579, 372, 615), 'en': (340, 579, 372, 615), 'jp': (340, 579, 372, 615), 'tw': (340, 579, 372, 615)}, file={'cn': './assets/cn/map/MAP_MODE_SWITCH_HARD5.png', 'en': './assets/cn/map/MAP_MODE_SWITCH_HARD5.png', 'jp': './assets/cn/map/MAP_MODE_SWITCH_HARD5.png', 'tw': './assets/cn/map/MAP_MODE_SWITCH_HARD5.png'}) +MAP_MODE_SWITCH_HARD6 = Button(area={'cn': (340, 579, 372, 615), 'en': (340, 579, 372, 615), 'jp': (340, 579, 372, 615), 'tw': (340, 579, 372, 615)}, color={'cn': (253, 176, 90), 'en': (253, 176, 90), 'jp': (253, 176, 90), 'tw': (253, 176, 90)}, button={'cn': (340, 579, 372, 615), 'en': (340, 579, 372, 615), 'jp': (340, 579, 372, 615), 'tw': (340, 579, 372, 615)}, file={'cn': './assets/cn/map/MAP_MODE_SWITCH_HARD6.png', 'en': './assets/cn/map/MAP_MODE_SWITCH_HARD6.png', 'jp': './assets/cn/map/MAP_MODE_SWITCH_HARD6.png', 'tw': './assets/cn/map/MAP_MODE_SWITCH_HARD6.png'}) +MAP_MODE_SWITCH_NORMAL = Button(area={'cn': (214, 584, 255, 615), 'en': (214, 584, 255, 615), 'jp': (214, 584, 255, 615), 'tw': (214, 584, 255, 615)}, color={'cn': (185, 201, 236), 'en': (185, 201, 236), 'jp': (185, 201, 236), 'tw': (185, 201, 236)}, button={'cn': (214, 584, 255, 615), 'en': (214, 584, 255, 615), 'jp': (214, 584, 255, 615), 'tw': (214, 584, 255, 615)}, file={'cn': './assets/cn/map/MAP_MODE_SWITCH_NORMAL.png', 'en': './assets/cn/map/MAP_MODE_SWITCH_NORMAL.png', 'jp': './assets/cn/map/MAP_MODE_SWITCH_NORMAL.png', 'tw': './assets/cn/map/MAP_MODE_SWITCH_NORMAL.png'}) MAP_OFFENSIVE = Button(area={'cn': (1148, 653, 1262, 705), 'en': (1147, 652, 1263, 701), 'jp': (1147, 652, 1263, 706), 'tw': (1148, 653, 1262, 705)}, color={'cn': (234, 180, 108), 'en': (234, 183, 108), 'jp': (233, 184, 105), 'tw': (243, 199, 104)}, button={'cn': (1148, 653, 1262, 705), 'en': (1147, 652, 1263, 701), 'jp': (1147, 652, 1263, 706), 'tw': (1148, 653, 1262, 705)}, file={'cn': './assets/cn/map/MAP_OFFENSIVE.png', 'en': './assets/en/map/MAP_OFFENSIVE.png', 'jp': './assets/jp/map/MAP_OFFENSIVE.png', 'tw': './assets/tw/map/MAP_OFFENSIVE.png'}) MAP_PREPARATION = Button(area={'cn': (854, 488, 1052, 548), 'en': (852, 489, 1054, 553), 'jp': (850, 485, 1051, 548), 'tw': (854, 488, 1052, 548)}, color={'cn': (236, 186, 115), 'en': (234, 179, 93), 'jp': (232, 181, 101), 'tw': (236, 186, 115)}, button={'cn': (854, 488, 1052, 548), 'en': (852, 489, 1054, 553), 'jp': (850, 485, 1051, 548), 'tw': (854, 488, 1052, 548)}, file={'cn': './assets/cn/map/MAP_PREPARATION.png', 'en': './assets/en/map/MAP_PREPARATION.png', 'jp': './assets/jp/map/MAP_PREPARATION.png', 'tw': './assets/tw/map/MAP_PREPARATION.png'}) MAP_PREPARATION_CANCEL = Button(area={'cn': (234, 12, 278, 47), 'en': (234, 12, 278, 47), 'jp': (234, 12, 278, 47), 'tw': (234, 12, 278, 47)}, color={'cn': (45, 46, 69), 'en': (45, 46, 69), 'jp': (45, 46, 69), 'tw': (45, 46, 69)}, button={'cn': (234, 12, 278, 47), 'en': (234, 12, 278, 47), 'jp': (234, 12, 278, 47), 'tw': (234, 12, 278, 47)}, file={'cn': './assets/cn/map/MAP_PREPARATION_CANCEL.png', 'en': './assets/en/map/MAP_PREPARATION_CANCEL.png', 'jp': './assets/jp/map/MAP_PREPARATION_CANCEL.png', 'tw': './assets/tw/map/MAP_PREPARATION_CANCEL.png'}) diff --git a/module/map/map_fleet_preparation.py b/module/map/map_fleet_preparation.py index c2c373cb1..b2ae8955f 100644 --- a/module/map/map_fleet_preparation.py +++ b/module/map/map_fleet_preparation.py @@ -145,14 +145,16 @@ class FleetOperator: if self.main.handle_popup_confirm(str(self._clear)): continue - # End - if not self.in_use(): - break + # check CLEAR button to avoid early stopped at popup showing animation + if self.allow(): + # End + if not self.in_use(): + break - # Click - if click_timer.reached(): - main.device.click(self._clear) - click_timer.reset() + # Click + if click_timer.reached(): + main.device.click(self._clear) + click_timer.reset() def recommend(self, skip_first_screenshot=True): """ diff --git a/module/map/map_operation.py b/module/map/map_operation.py index 78d35c572..ea9c89d24 100644 --- a/module/map/map_operation.py +++ b/module/map/map_operation.py @@ -1,3 +1,5 @@ +import cv2 + from module.base.timer import Timer from module.exception import CampaignEnd, RequestHumanTakeover, ScriptEnd from module.handler.fast_forward import FastForwardHandler @@ -274,27 +276,58 @@ class MapOperation(MysteryHandler, FleetPreparation, Retirement, FastForwardHand if self.match_template_color(MAP_MODE_SWITCH_NORMAL, offset=(20, 20)): logger.attr('MAP_MODE_SWITCH', 'normal') return True - elif self.appear(MAP_MODE_SWITCH_HARD, offset=(20, 20), interval=2): + if self._is_mod_switch_hard_appear(active=False, interval=2): logger.attr('MAP_MODE_SWITCH', 'hard') MAP_MODE_SWITCH_NORMAL.clear_offset() self.device.click(MAP_MODE_SWITCH_NORMAL) - return False - else: - return False + self.interval_reset(MAP_MODE_SWITCH_HARD) + return False elif mode == 'hard': - if self.match_template_color(MAP_MODE_SWITCH_HARD, offset=(20, 20)): + if self._is_mod_switch_hard_appear(active=True): logger.attr('MAP_MODE_SWITCH', 'hard') return True - if self.appear(MAP_MODE_SWITCH_NORMAL, offset=(20, 20), interval=2): + if self.match_template_color(MAP_MODE_SWITCH_NORMAL, offset=(20, 20), interval=2): logger.attr('MAP_MODE_SWITCH', 'normal') MAP_MODE_SWITCH_HARD.clear_offset() self.device.click(MAP_MODE_SWITCH_HARD) return False - else: - return False - else: - logger.error(f'handle_map_mode_switch: Unknown mode={mode}') return False + else: + logger.attr('MAP_MODE_SWITCH', 'unknown') + return False + + def _is_mod_switch_hard_appear(self, active=True, interval=0): + if interval: + interval = self.get_interval_timer(MAP_MODE_SWITCH_HARD, interval=interval) + if not interval.reached(): + return False + + for button in [ + MAP_MODE_SWITCH_HARD, + MAP_MODE_SWITCH_HARD2, + MAP_MODE_SWITCH_HARD3, + MAP_MODE_SWITCH_HARD4, + MAP_MODE_SWITCH_HARD5, + MAP_MODE_SWITCH_HARD6, + ]: + if self.appear(button, offset=(20, 20), threshold=0.7): + if active: + return self._is_mod_switch_hard_active(button) + else: + return True + return False + + def _is_mod_switch_hard_active(self, button): + image = self.image_crop(button.button) + # rgbmax + r, g, b = cv2.split(image) + cv2.max(r, g, dst=r) + cv2.max(r, b, dst=r) + # active button has white icon, check if count any color > 235 + cv2.inRange(r, 235, 255, dst=r) + sum_ = cv2.countNonZero(r) + total = r.shape[0] * r.shape[1] + return sum_ / total > 0.5 def handle_map_preparation(self): """ diff --git a/module/os/map.py b/module/os/map.py index ba1924532..c6afe0e01 100644 --- a/module/os/map.py +++ b/module/os/map.py @@ -1,5 +1,4 @@ import time -from sys import maxsize import inflection @@ -434,7 +433,7 @@ class OSMap(OSFleet, Map, GlobeCamera, StrategicSearchHandler): return 3000 else: logger.info('Not close to OpSi reset') - return maxsize + return 2000 def handle_after_auto_search(self): logger.hr('After auto search', level=2) diff --git a/module/os/map_operation.py b/module/os/map_operation.py index 433465afa..6a876dd05 100644 --- a/module/os/map_operation.py +++ b/module/os/map_operation.py @@ -95,6 +95,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle name = name.replace('一', 'ー').replace('力', 'カ').replace('卜', 'ト').replace('ぺ', 'ペ') name = name.replace('ジブフルタル', 'ジブラルタル') name = name.replace('タント', 'タラント').replace('タフント', 'タラント') + name = name.replace('N海域', 'NA海域') return name @Config.when(SERVER='tw') diff --git a/module/os/operation_siren.py b/module/os/operation_siren.py index 64ff6ff5b..40e823107 100644 --- a/module/os/operation_siren.py +++ b/module/os/operation_siren.py @@ -218,6 +218,7 @@ class OperationSiren(OSMap): logger.hr(f'OS meowfficer farming, hazard_level=3', level=1) self.config.override( OpsiGeneral_DoRandomMapEvent=True, + OpsiGeneral_BuyActionPointLimit=0, HOMO_EDGE_DETECT=True, STORY_OPTION=-2, # Meowfficer farming diff --git a/module/os_combat/combat.py b/module/os_combat/combat.py index 7ef511ede..17cd95c29 100644 --- a/module/os_combat/combat.py +++ b/module/os_combat/combat.py @@ -119,6 +119,8 @@ class Combat(Combat_, MapEventHandler): Returns: bool: """ + if getattr(self, '_disable_handle_get_items', False): + return False if self.appear(GET_ITEMS_1, offset=5, interval=self.battle_status_click_interval): if drop: drop.handle_add(self, before=2) @@ -160,7 +162,12 @@ class Combat(Combat_, MapEventHandler): self.__os_combat_drop = drop if expected_end is None: expected_end = self._os_combat_expected_end - super().combat_status(drop=drop, expected_end=expected_end) + # disable handle_get_items and use only handle_map_get_items + self._disable_handle_get_items = True + try: + super().combat_status(drop=drop, expected_end=expected_end) + finally: + self._disable_handle_get_items = False def combat(self, *args, save_get_items=False, **kwargs): """ diff --git a/module/shop/assets.py b/module/shop/assets.py index 3e82a68fa..8972215bd 100644 --- a/module/shop/assets.py +++ b/module/shop/assets.py @@ -32,7 +32,7 @@ SHOP_OCR_BALANCE = Button(area={'cn': (903, 164, 983, 189), 'en': (903, 164, 983 SHOP_OCR_OIL = Button(area={'cn': (700, 23, 785, 47), 'en': (863, 24, 955, 46), 'jp': (700, 23, 785, 47), 'tw': (700, 23, 785, 47)}, color={'cn': (150, 185, 194), 'en': (150, 183, 189), 'jp': (150, 185, 194), 'tw': (150, 185, 194)}, button={'cn': (700, 23, 785, 47), 'en': (863, 24, 955, 46), 'jp': (700, 23, 785, 47), 'tw': (700, 23, 785, 47)}, file={'cn': './assets/cn/shop/SHOP_OCR_OIL.png', 'en': './assets/en/shop/SHOP_OCR_OIL.png', 'jp': './assets/cn/shop/SHOP_OCR_OIL.png', 'tw': './assets/cn/shop/SHOP_OCR_OIL.png'}) SHOP_OCR_OIL_CHECK = Button(area={'cn': (666, 30, 682, 43), 'en': (834, 25, 854, 45), 'jp': (666, 30, 682, 43), 'tw': (666, 30, 682, 43)}, color={'cn': (73, 73, 73), 'en': (71, 75, 75), 'jp': (73, 73, 73), 'tw': (73, 73, 73)}, button={'cn': (666, 30, 682, 43), 'en': (834, 25, 854, 45), 'jp': (666, 30, 682, 43), 'tw': (666, 30, 682, 43)}, file={'cn': './assets/cn/shop/SHOP_OCR_OIL_CHECK.png', 'en': './assets/en/shop/SHOP_OCR_OIL_CHECK.png', 'jp': './assets/cn/shop/SHOP_OCR_OIL_CHECK.png', 'tw': './assets/cn/shop/SHOP_OCR_OIL_CHECK.png'}) SHOP_PROTOTYPE_SWIPE_END = Button(area={'cn': (1135, 660, 1215, 678), 'en': (1101, 658, 1215, 676), 'jp': (1097, 660, 1199, 678), 'tw': (1135, 660, 1215, 678)}, color={'cn': (136, 137, 139), 'en': (111, 112, 115), 'jp': (86, 87, 91), 'tw': (136, 137, 139)}, button={'cn': (1135, 660, 1215, 678), 'en': (1101, 658, 1215, 676), 'jp': (1097, 660, 1199, 678), 'tw': (1135, 660, 1215, 678)}, file={'cn': './assets/cn/shop/SHOP_PROTOTYPE_SWIPE_END.png', 'en': './assets/en/shop/SHOP_PROTOTYPE_SWIPE_END.png', 'jp': './assets/jp/shop/SHOP_PROTOTYPE_SWIPE_END.png', 'tw': './assets/cn/shop/SHOP_PROTOTYPE_SWIPE_END.png'}) -SHOP_REFRESH = Button(area={'cn': (950, 660, 1003, 684), 'en': (950, 660, 1003, 684), 'jp': (1161, 162, 1270, 206), 'tw': (1161, 162, 1270, 206)}, color={'cn': (73, 164, 221), 'en': (73, 164, 221), 'jp': (178, 142, 84), 'tw': (179, 143, 88)}, button={'cn': (950, 660, 1003, 684), 'en': (950, 660, 1003, 684), 'jp': (1161, 162, 1270, 206), 'tw': (1161, 162, 1270, 206)}, file={'cn': './assets/cn/shop/SHOP_REFRESH.png', 'en': './assets/en/shop/SHOP_REFRESH.png', 'jp': './assets/jp/shop/SHOP_REFRESH.png', 'tw': './assets/tw/shop/SHOP_REFRESH.png'}) +SHOP_REFRESH = Button(area={'cn': (950, 660, 1003, 684), 'en': (950, 660, 1003, 684), 'jp': (950, 660, 1003, 684), 'tw': (1161, 162, 1270, 206)}, color={'cn': (73, 164, 221), 'en': (73, 164, 221), 'jp': (73, 164, 221), 'tw': (179, 143, 88)}, button={'cn': (950, 660, 1003, 684), 'en': (950, 660, 1003, 684), 'jp': (950, 660, 1003, 684), 'tw': (1161, 162, 1270, 206)}, file={'cn': './assets/cn/shop/SHOP_REFRESH.png', 'en': './assets/en/shop/SHOP_REFRESH.png', 'jp': './assets/jp/shop/SHOP_REFRESH.png', 'tw': './assets/tw/shop/SHOP_REFRESH.png'}) SHOP_SELECT_PR1 = Button(area={'cn': (182, 212, 308, 339), 'en': (182, 212, 308, 339), 'jp': (182, 212, 308, 339), 'tw': (182, 212, 308, 339)}, color={'cn': (157, 158, 143), 'en': (157, 158, 143), 'jp': (157, 158, 143), 'tw': (157, 158, 143)}, button={'cn': (182, 212, 308, 339), 'en': (182, 212, 308, 339), 'jp': (182, 212, 308, 339), 'tw': (182, 212, 308, 339)}, file={'cn': './assets/cn/shop/SHOP_SELECT_PR1.png', 'en': './assets/en/shop/SHOP_SELECT_PR1.png', 'jp': './assets/jp/shop/SHOP_SELECT_PR1.png', 'tw': './assets/tw/shop/SHOP_SELECT_PR1.png'}) SHOP_SELECT_PR2 = Button(area={'cn': (182, 212, 310, 340), 'en': (182, 212, 310, 340), 'jp': (182, 212, 310, 340), 'tw': (182, 212, 310, 340)}, color={'cn': (160, 159, 145), 'en': (160, 159, 145), 'jp': (160, 159, 145), 'tw': (160, 159, 145)}, button={'cn': (182, 212, 310, 340), 'en': (182, 212, 310, 340), 'jp': (182, 212, 310, 340), 'tw': (182, 212, 310, 340)}, file={'cn': './assets/cn/shop/SHOP_SELECT_PR2.png', 'en': './assets/en/shop/SHOP_SELECT_PR2.png', 'jp': './assets/jp/shop/SHOP_SELECT_PR2.png', 'tw': './assets/tw/shop/SHOP_SELECT_PR2.png'}) SHOP_SELECT_PR3 = Button(area={'cn': (180, 212, 309, 340), 'en': (180, 212, 309, 340), 'jp': (180, 212, 309, 340), 'tw': (180, 212, 309, 340)}, color={'cn': (156, 156, 142), 'en': (156, 156, 142), 'jp': (156, 156, 142), 'tw': (156, 156, 142)}, button={'cn': (180, 212, 309, 340), 'en': (180, 212, 309, 340), 'jp': (180, 212, 309, 340), 'tw': (180, 212, 309, 340)}, file={'cn': './assets/cn/shop/SHOP_SELECT_PR3.png', 'en': './assets/en/shop/SHOP_SELECT_PR3.png', 'jp': './assets/jp/shop/SHOP_SELECT_PR3.png', 'tw': './assets/tw/shop/SHOP_SELECT_PR3.png'}) diff --git a/module/shop/shop_medal.py b/module/shop/shop_medal.py index 2fdd81d32..fae857f40 100644 --- a/module/shop/shop_medal.py +++ b/module/shop/shop_medal.py @@ -51,7 +51,8 @@ MEDAL_SHOP_SCROLL_250814 = ShopAdaptiveScroll( name="MEDAL_SHOP_SCROLL_250814" ) MEDAL_SHOP_SCROLL_250814.drag_threshold = 0.1 -MEDAL_SHOP_SCROLL_250814.edge_threshold = 0.1 +# A little bit larger than 0.1 to handle bottom +MEDAL_SHOP_SCROLL_250814.edge_threshold = 0.12 class ShopPriceOcr(DigitYuv): diff --git a/module/template/assets.py b/module/template/assets.py index 18639e868..59b6b26bd 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -65,6 +65,8 @@ TEMPLATE_SIREN_BBpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SI TEMPLATE_SIREN_BBred = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BBred.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BBred.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BBred.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BBred.gif'}) TEMPLATE_SIREN_BaltimoreIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BaltimoreIdol.gif'}) TEMPLATE_SIREN_Bellona = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Bellona.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Bellona.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Bellona.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Bellona.gif'}) +TEMPLATE_SIREN_BlackDragonBoss01 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BlackDragonBoss01.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BlackDragonBoss01.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BlackDragonBoss01.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BlackDragonBoss01.gif'}) +TEMPLATE_SIREN_BlackDragonBoss02 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BlackDragonBoss02.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BlackDragonBoss02.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BlackDragonBoss02.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BlackDragonBoss02.gif'}) TEMPLATE_SIREN_BolzanoAlter = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BolzanoAlter.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BolzanoAlter.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BolzanoAlter.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BolzanoAlter.gif'}) TEMPLATE_SIREN_CA = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CA.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CA.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CA.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CA.gif'}) TEMPLATE_SIREN_CAalchemist = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CAalchemist.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CAalchemist.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CAalchemist.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CAalchemist.gif'}) diff --git a/module/ui/switch.py b/module/ui/switch.py index 7c7eb1a22..1ce601ae4 100644 --- a/module/ui/switch.py +++ b/module/ui/switch.py @@ -31,6 +31,9 @@ class Switch: self.is_selector = is_selector self.offset = offset self.state_list = [] + self.set_unknown_timer = Timer(5, count=10) + self.set_click_timer = Timer(1, count=2) + self.wait_timeout = Timer(2, count=4) def add_state(self, state, check_button, click_button=None, offset=0): """ @@ -124,8 +127,8 @@ class Switch: changed = False has_unknown = False - unknown_timer = Timer(5, count=10).start() - click_timer = Timer(1, count=3) + unknown_timer = self.set_unknown_timer.reset() + click_timer = self.set_click_timer.clear() while 1: if skip_first_screenshot: skip_first_screenshot = False @@ -193,7 +196,7 @@ class Switch: Returns: bool: If success """ - timeout = Timer(2, count=6).start() + timeout = self.wait_timeout.reset() while 1: if skip_first_screenshot: skip_first_screenshot = False diff --git a/webapp/packages/main/public/deploy.yaml.tpl b/webapp/packages/main/public/deploy.yaml.tpl index 61d8d726f..c2bdfa5a0 100644 --- a/webapp/packages/main/public/deploy.yaml.tpl +++ b/webapp/packages/main/public/deploy.yaml.tpl @@ -23,11 +23,6 @@ Deploy: # Update Alas at startup # [In most cases] Use true AutoUpdate: true - # Whether to keep local changes during update - # User settings, logs and screenshots will be kept, no mather this is true or false - # [Developer] Use true, if you modified the code - # [Other] Use false - KeepLocalChanges: false Python: # Filepath of python executable `python.exe`