diff --git a/assets/cn/raid/HUANCHANG_OCR_PT.png b/assets/cn/raid/HUANCHANG_OCR_PT.png new file mode 100644 index 000000000..c324e0666 Binary files /dev/null and b/assets/cn/raid/HUANCHANG_OCR_PT.png differ diff --git a/assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png b/assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png new file mode 100644 index 000000000..f3a413492 Binary files /dev/null and b/assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png differ diff --git a/assets/cn/raid/HUANCHANG_OCR_REMAIN_EX.png b/assets/cn/raid/HUANCHANG_OCR_REMAIN_EX.png new file mode 100644 index 000000000..5b5f303df Binary files /dev/null and b/assets/cn/raid/HUANCHANG_OCR_REMAIN_EX.png differ diff --git a/assets/cn/raid/HUANCHANG_OCR_REMAIN_HARD.png b/assets/cn/raid/HUANCHANG_OCR_REMAIN_HARD.png new file mode 100644 index 000000000..c831817b5 Binary files /dev/null and b/assets/cn/raid/HUANCHANG_OCR_REMAIN_HARD.png differ diff --git a/assets/cn/raid/HUANCHANG_OCR_REMAIN_NORMAL.png b/assets/cn/raid/HUANCHANG_OCR_REMAIN_NORMAL.png new file mode 100644 index 000000000..e2b4993ff Binary files /dev/null and b/assets/cn/raid/HUANCHANG_OCR_REMAIN_NORMAL.png differ diff --git a/assets/cn/raid/HUANCHANG_RAID_EASY.png b/assets/cn/raid/HUANCHANG_RAID_EASY.png new file mode 100644 index 000000000..b9518ea7b Binary files /dev/null and b/assets/cn/raid/HUANCHANG_RAID_EASY.png differ diff --git a/assets/cn/raid/HUANCHANG_RAID_EX.png b/assets/cn/raid/HUANCHANG_RAID_EX.png new file mode 100644 index 000000000..447a6cdf8 Binary files /dev/null and b/assets/cn/raid/HUANCHANG_RAID_EX.png differ diff --git a/assets/cn/raid/HUANCHANG_RAID_HARD.png b/assets/cn/raid/HUANCHANG_RAID_HARD.png new file mode 100644 index 000000000..50d88ba99 Binary files /dev/null and b/assets/cn/raid/HUANCHANG_RAID_HARD.png differ diff --git a/assets/cn/raid/HUANCHANG_RAID_NORMAL.png b/assets/cn/raid/HUANCHANG_RAID_NORMAL.png new file mode 100644 index 000000000..c08f986f2 Binary files /dev/null and b/assets/cn/raid/HUANCHANG_RAID_NORMAL.png differ diff --git a/assets/cn/ui/RAID_CHECK.png b/assets/cn/ui/RAID_CHECK.png index 669f8d7b5..cd042ece2 100644 Binary files a/assets/cn/ui/RAID_CHECK.png and b/assets/cn/ui/RAID_CHECK.png differ diff --git a/assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png b/assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png new file mode 100644 index 000000000..363ae7106 Binary files /dev/null and b/assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png differ diff --git a/assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png b/assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png new file mode 100644 index 000000000..277834964 Binary files /dev/null and b/assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png differ diff --git a/assets/en/raid/HUANCHANG_OCR_PT.png b/assets/en/raid/HUANCHANG_OCR_PT.png new file mode 100644 index 000000000..c324e0666 Binary files /dev/null and b/assets/en/raid/HUANCHANG_OCR_PT.png differ diff --git a/assets/en/raid/HUANCHANG_OCR_REMAIN_EASY.png b/assets/en/raid/HUANCHANG_OCR_REMAIN_EASY.png new file mode 100644 index 000000000..f3a413492 Binary files /dev/null and b/assets/en/raid/HUANCHANG_OCR_REMAIN_EASY.png differ diff --git a/assets/en/raid/HUANCHANG_OCR_REMAIN_EX.png b/assets/en/raid/HUANCHANG_OCR_REMAIN_EX.png new file mode 100644 index 000000000..5b5f303df Binary files /dev/null and b/assets/en/raid/HUANCHANG_OCR_REMAIN_EX.png differ diff --git a/assets/en/raid/HUANCHANG_OCR_REMAIN_HARD.png b/assets/en/raid/HUANCHANG_OCR_REMAIN_HARD.png new file mode 100644 index 000000000..c831817b5 Binary files /dev/null and b/assets/en/raid/HUANCHANG_OCR_REMAIN_HARD.png differ diff --git a/assets/en/raid/HUANCHANG_OCR_REMAIN_NORMAL.png b/assets/en/raid/HUANCHANG_OCR_REMAIN_NORMAL.png new file mode 100644 index 000000000..e2b4993ff Binary files /dev/null and b/assets/en/raid/HUANCHANG_OCR_REMAIN_NORMAL.png differ diff --git a/assets/en/raid/HUANCHANG_RAID_EASY.png b/assets/en/raid/HUANCHANG_RAID_EASY.png new file mode 100644 index 000000000..1670be12b Binary files /dev/null and b/assets/en/raid/HUANCHANG_RAID_EASY.png differ diff --git a/assets/en/raid/HUANCHANG_RAID_EX.png b/assets/en/raid/HUANCHANG_RAID_EX.png new file mode 100644 index 000000000..25c40d405 Binary files /dev/null and b/assets/en/raid/HUANCHANG_RAID_EX.png differ diff --git a/assets/en/raid/HUANCHANG_RAID_HARD.png b/assets/en/raid/HUANCHANG_RAID_HARD.png new file mode 100644 index 000000000..24c47cca6 Binary files /dev/null and b/assets/en/raid/HUANCHANG_RAID_HARD.png differ diff --git a/assets/en/raid/HUANCHANG_RAID_NORMAL.png b/assets/en/raid/HUANCHANG_RAID_NORMAL.png new file mode 100644 index 000000000..9b5084cf1 Binary files /dev/null and b/assets/en/raid/HUANCHANG_RAID_NORMAL.png differ diff --git a/assets/en/ui/ACADEMY_CHECK.png b/assets/en/ui/ACADEMY_CHECK.png index 7e00c6d3b..9ecfd530a 100644 Binary files a/assets/en/ui/ACADEMY_CHECK.png and b/assets/en/ui/ACADEMY_CHECK.png differ diff --git a/assets/en/ui/RAID_CHECK.png b/assets/en/ui/RAID_CHECK.png index 2c45aa1fd..51ead1cd6 100644 Binary files a/assets/en/ui/RAID_CHECK.png and b/assets/en/ui/RAID_CHECK.png differ diff --git a/assets/jp/raid/HUANCHANG_OCR_PT.png b/assets/jp/raid/HUANCHANG_OCR_PT.png new file mode 100644 index 000000000..c324e0666 Binary files /dev/null and b/assets/jp/raid/HUANCHANG_OCR_PT.png differ diff --git a/assets/jp/raid/HUANCHANG_OCR_REMAIN_EASY.png b/assets/jp/raid/HUANCHANG_OCR_REMAIN_EASY.png new file mode 100644 index 000000000..8c5dbbdcf Binary files /dev/null and b/assets/jp/raid/HUANCHANG_OCR_REMAIN_EASY.png differ diff --git a/assets/jp/raid/HUANCHANG_OCR_REMAIN_EX.png b/assets/jp/raid/HUANCHANG_OCR_REMAIN_EX.png new file mode 100644 index 000000000..5b5f303df Binary files /dev/null and b/assets/jp/raid/HUANCHANG_OCR_REMAIN_EX.png differ diff --git a/assets/jp/raid/HUANCHANG_OCR_REMAIN_HARD.png b/assets/jp/raid/HUANCHANG_OCR_REMAIN_HARD.png new file mode 100644 index 000000000..5f21091f5 Binary files /dev/null and b/assets/jp/raid/HUANCHANG_OCR_REMAIN_HARD.png differ diff --git a/assets/jp/raid/HUANCHANG_OCR_REMAIN_NORMAL.png b/assets/jp/raid/HUANCHANG_OCR_REMAIN_NORMAL.png new file mode 100644 index 000000000..ed98d808c Binary files /dev/null and b/assets/jp/raid/HUANCHANG_OCR_REMAIN_NORMAL.png differ diff --git a/assets/jp/raid/HUANCHANG_RAID_EASY.png b/assets/jp/raid/HUANCHANG_RAID_EASY.png new file mode 100644 index 000000000..ef4719266 Binary files /dev/null and b/assets/jp/raid/HUANCHANG_RAID_EASY.png differ diff --git a/assets/jp/raid/HUANCHANG_RAID_EX.png b/assets/jp/raid/HUANCHANG_RAID_EX.png new file mode 100644 index 000000000..8f142d4ce Binary files /dev/null and b/assets/jp/raid/HUANCHANG_RAID_EX.png differ diff --git a/assets/jp/raid/HUANCHANG_RAID_HARD.png b/assets/jp/raid/HUANCHANG_RAID_HARD.png new file mode 100644 index 000000000..e92e8097e Binary files /dev/null and b/assets/jp/raid/HUANCHANG_RAID_HARD.png differ diff --git a/assets/jp/raid/HUANCHANG_RAID_NORMAL.png b/assets/jp/raid/HUANCHANG_RAID_NORMAL.png new file mode 100644 index 000000000..3dc1c4045 Binary files /dev/null and b/assets/jp/raid/HUANCHANG_RAID_NORMAL.png differ diff --git a/assets/jp/ui/RAID_CHECK.png b/assets/jp/ui/RAID_CHECK.png index 041f2cd84..2df3ee5a7 100644 Binary files a/assets/jp/ui/RAID_CHECK.png and b/assets/jp/ui/RAID_CHECK.png differ diff --git a/campaign/Readme.md b/campaign/Readme.md index 4adb53c05..6a20987bb 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -37,6 +37,8 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20230420 | war archives 20220210 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | 北境序曲 | | 20230511 | war archives 20220414 cn | Aurora Noctis | 永夜幻光 | Aurora Noctis | 極夜照らす幻光 | 永夜幻光 | | 20230831 | war archives 20201229 cn | Inverted Orthant | 负象限作战 | Inverted Orthant | 虚畳なりし限象 | - | +| 20240118 | war archives 20200917 cn | Dreamwaker's Butterfly | 蝶海梦花 | Dreamwaker's Butterfly | 刹那觀る胡蝶の夢 | - | +| 20240118 | war archives 20210527 cn | Mirror Involution | 镜位螺旋 | Mirror Involution | 照らす螺旋の鏡海 | - | | 20200227 | event 20200227 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | - | | 20200312 | event 20200312 cn | The Solomon Ranger | 复刻斯图尔特的硝烟 | The Solomon Ranger Rerun | 南洋に靡く硝煙(復刻) | - | | 20200326 | event 20200326 cn | Microlayer Medley | 微层混合 | Microlayer Medley | 闇靄払う銀翼 | - | @@ -172,4 +174,6 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20231221 | event 20231221 cn | Light-Chasing Sea of Stars | 星海逐光 | Light-Chasing Sea of Stars | 光追う星の海 | - | | 20240104 | event 20210225 cn | Khorovod of Dawn's Rime | - | - | - | 復刻破曉冰華 | | 20240111 | event 20211229 cn | Tower of Transcendence Rerun | 复刻逆转彩虹之塔 | Tower of Transcendence Rerun | 遡望せし虹彩の塔(復刻)    | - | -| 20240111 | event 20230803 cn | Anthem of Remembrance | - | - | - | 奏響鳶尾之歌 | \ No newline at end of file +| 20240111 | event 20230803 cn | Anthem of Remembrance | - | - | - | 奏響鳶尾之歌 | +| 20240125 | event 20210527 cn | Mirror Involution Rerun | - | - | - | 復刻鏡位螺旋 | +| 20240130 | raid 20240130 | Spring Festive Fiasco | 寰昌宇定家事忙 | Spring Festive Fiasco | 新春宴会狂騒曲 | - | \ No newline at end of file diff --git a/campaign/campaign_main/campaign_15_1.py b/campaign/campaign_main/campaign_15_1.py new file mode 100644 index 000000000..d08a2ea3d --- /dev/null +++ b/campaign/campaign_main/campaign_15_1.py @@ -0,0 +1,81 @@ +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('15-1') +MAP.shape = 'H7' +MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + Me ME ME ++ ME MB ++ ++ + ME ME ME ME Me ME MB ++ + ++ ME ME ME Me ME ME MB + ++ ME ME ME ME __ Me ME + ME ME ME ME ME Me ME ME + ME ME ME ME ++ ME ME ME + ME SP SP 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'mystery': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['0'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = False + MAP_HAS_MOVABLE_ENEMY = False + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + MAP_HAS_MYSTERY = True + # ===== End of generated config ===== + + +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/campaign_main/campaign_15_2.py b/campaign/campaign_main/campaign_15_2.py new file mode 100644 index 000000000..14da35ce9 --- /dev/null +++ b/campaign/campaign_main/campaign_15_2.py @@ -0,0 +1,85 @@ +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('15-2') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ME ME ME ME Me ME ++ ++ ++ + ME ME ME ++ ME ME ME SP SP + ME ME ME Me ME ME ME ME ME + ME ME ME ME ME ME ME Me ME + ME ME ++ ME Me ME ME ME ME + Me ME ME __ ME ++ ++ ++ ME + ++ MB ME ME ME ++ ME MB ME + ++ MB 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': 3, 'mystery': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6, '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 = ['0'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = False + MAP_HAS_MOVABLE_ENEMY = False + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + MAP_HAS_MYSTERY = True + # ===== End of generated config ===== + + +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/campaign_main/campaign_15_3.py b/campaign/campaign_main/campaign_15_3.py new file mode 100644 index 000000000..155e5495e --- /dev/null +++ b/campaign/campaign_main/campaign_15_3.py @@ -0,0 +1,85 @@ +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('15-3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6'] +MAP.map_data = """ + ME ME ++ ME ME ME ME ME ME ME + ME ME ++ Me ME Me ME Me ME ME + ME ME ME ME Me ME ++ ME ME ME + ++ ME ME ME ME Me ++ ++ __ ME + Me ME ME ++ Me ME ME ME ME Me + ME ME ME ME ME ME ME ME ME ME + Me ME __ ME ME ME ME 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': 3, 'mystery': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4}, + {'battle': 5}, + {'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: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['0'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = False + MAP_HAS_MOVABLE_ENEMY = False + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + MAP_HAS_MYSTERY = True + # ===== End of generated config ===== + + +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/campaign_main/campaign_15_4.py b/campaign/campaign_main/campaign_15_4.py new file mode 100644 index 000000000..574a06150 --- /dev/null +++ b/campaign/campaign_main/campaign_15_4.py @@ -0,0 +1,89 @@ +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('15-4') +MAP.shape = 'K9' +MAP.camera_data = ['D2', 'D6', 'D7', 'H2', 'H6', 'H7'] +MAP.camera_data_spawn_point = ['H2'] +MAP.map_data = """ + ME ME ME ME Me ME ME ++ ++ ME ME + ME ME ME ME ME ME ME ++ ++ ME ME + ++ ME ME ME ME ME ME SP SP ME Me + ++ ME ME ++ ++ ME ME ME ME ME ME + ME Me ME MA ++ ME ME ME ME ME ME + ME ME ME ME ME ME ME ++ ME ME Me + ME ME __ ME ME ME ME ME ME ME ++ + ME ME ++ ME Me ME ME ME ME ME 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 50 50 50 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': 5, 'mystery': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6}, + {'battle': 7, '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: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['0'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = False + MAP_HAS_MOVABLE_ENEMY = False + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + MAP_HAS_MYSTERY = True + # ===== End of generated config ===== + + +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=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/campaign/event_20211229_cn/a1.py b/campaign/event_20211229_cn/a1.py index c0e51cf14..7273d10d8 100644 --- a/campaign/event_20211229_cn/a1.py +++ b/campaign/event_20211229_cn/a1.py @@ -54,17 +54,18 @@ class Config: # ===== End of generated config ===== INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (80, 255 - 40), + 'height': (80, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 } + HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_SWIPE_MULTIPLY = (1.141, 1.162) MAP_SWIPE_MULTIPLY_MINITOUCH = (1.103, 1.123) MAP_SWIPE_MULTIPLY_MAATOUCH = (1.071, 1.090) diff --git a/campaign/event_20211229_cn/b1.py b/campaign/event_20211229_cn/b1.py index f00413606..e99cc0b57 100644 --- a/campaign/event_20211229_cn/b1.py +++ b/campaign/event_20211229_cn/b1.py @@ -63,18 +63,19 @@ class Config: MOVABLE_NORMAL_ENEMY_TURN = (2,) MAP_SIREN_MOVE_WAIT = 1.0 INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (80, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 } HOMO_EDGE_COLOR_RANGE = (0, 17) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 180 MAP_SWIPE_MULTIPLY = (1.033, 1.053) MAP_SWIPE_MULTIPLY_MINITOUCH = (0.999, 1.018) MAP_SWIPE_MULTIPLY_MAATOUCH = (0.970, 0.988) diff --git a/campaign/event_20211229_cn/bs1.py b/campaign/event_20211229_cn/bs1.py index be4632caf..02b3fd4c5 100644 --- a/campaign/event_20211229_cn/bs1.py +++ b/campaign/event_20211229_cn/bs1.py @@ -54,13 +54,13 @@ class Config: # ===== End of generated config ===== INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (150, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 diff --git a/campaign/event_20211229_cn/c1.py b/campaign/event_20211229_cn/c1.py index c1dc008de..6b37ac2d8 100644 --- a/campaign/event_20211229_cn/c1.py +++ b/campaign/event_20211229_cn/c1.py @@ -54,13 +54,13 @@ class Config: # ===== End of generated config ===== INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (150, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 diff --git a/campaign/event_20211229_cn/d1.py b/campaign/event_20211229_cn/d1.py index f9e7f1cf4..aa9277389 100644 --- a/campaign/event_20211229_cn/d1.py +++ b/campaign/event_20211229_cn/d1.py @@ -63,13 +63,13 @@ class Config: MOVABLE_NORMAL_ENEMY_TURN = (2,) MAP_SIREN_MOVE_WAIT = 1.0 INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (150, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 diff --git a/campaign/event_20211229_cn/ds1.py b/campaign/event_20211229_cn/ds1.py index bb2815cf6..059d6b4ac 100644 --- a/campaign/event_20211229_cn/ds1.py +++ b/campaign/event_20211229_cn/ds1.py @@ -55,13 +55,13 @@ class Config: # ===== End of generated config ===== INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (150, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 diff --git a/campaign/event_20211229_cn/sp.py b/campaign/event_20211229_cn/sp.py index 9aa0384d3..9b5770f4e 100644 --- a/campaign/event_20211229_cn/sp.py +++ b/campaign/event_20211229_cn/sp.py @@ -65,13 +65,13 @@ class Config: # ===== End of generated config ===== INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (150, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 diff --git a/campaign/war_archives_20200917_cn/campaign_base.py b/campaign/war_archives_20200917_cn/campaign_base.py new file mode 100644 index 000000000..97465d2d8 --- /dev/null +++ b/campaign/war_archives_20200917_cn/campaign_base.py @@ -0,0 +1,129 @@ +from module.base.button import Button +from module.base.utils import * +from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_ +from module.exception import CampaignNameError +from module.logger import logger + +# Here manually type coordinates, because the ball appears in event Dreamwaker's Butterfly only. +BALL = Button(area=(571, 283, 696, 387), color=(), button=(597, 274, 671, 343)) + + +class CampaignBase(CampaignBase_): + STAGE_INCREASE = [ + 'TS1 > T1 > T2 > T3 > T4 > TS2 > T5 > T6', + 'HTS1 > HT1 > HT2 > HT3', + 'HT4 > HTS2 > HT5 > HT6', + ] + + def campaign_set_chapter(self, name, mode='normal'): + """ + Args: + name (str): Campaign name, such as '7-2', 'd3', 'sp3'. + mode (str): 'normal' or 'hard'. + """ + chapter, stage = self._campaign_separate_name(name) + name = chapter + stage + + if chapter.isdigit(): + self.ui_goto_campaign() + self.campaign_ensure_mode('normal') + self.campaign_ensure_chapter(index=chapter) + if mode == 'hard': + self.campaign_ensure_mode('hard') + + elif chapter in 'abcd' or chapter == 'ex_sp': + self.ui_goto_event() + if chapter in 'ab': + self.campaign_ensure_mode('normal') + elif chapter in 'cd': + self.campaign_ensure_mode('hard') + elif chapter == 'ex_sp': + self.campaign_ensure_mode('ex') + self.campaign_ensure_chapter(index=chapter) + + elif chapter == 'sp': + self.ui_goto_sp() + self.campaign_ensure_chapter(index=chapter) + + elif chapter in ['t', 'ts', 'ht', 'hts']: + self.ui_goto_event() + # Campaign ball + if stage in ['1', '6']: + self._campaign_ball_set('blue') + else: + self._campaign_ball_set('red') + # Campaign mode + if chapter in ['t', 'ts']: + self.campaign_ensure_mode('normal') + if chapter in ['ht', 'hts']: + self.campaign_ensure_mode('hard') + if chapter == 'ex_sp': + self.campaign_ensure_mode('ex') + # Get stage + self.campaign_ensure_chapter(index=1) + else: + logger.warning(f'Unknown campaign chapter: {name}') + + @staticmethod + def _campaign_get_chapter_index(name): + """ + Args: + name (str, int): + + Returns: + int + """ + if isinstance(name, int): + return name + else: + if name.isdigit(): + return int(name) + elif name in ['a', 'c', 'sp', 'ex_sp', 'ts', 't', 'ht', 'hts']: + return 1 + elif name in ['b', 'd', 'ex_ex']: + return 2 + else: + raise CampaignNameError + + def _campaign_ball_get(self): + """ + Returns: + str: 'blue' or 'red'. + """ + color = get_color(self.device.image, BALL.area) + # Blue: (93, 127, 182), Red: (186, 116, 124) + index = np.argmax(color) + if index == 0: + return 'red' + elif index == 2: + return 'blue' + else: + logger.warning(f'Unknown campaign ball color: {color}') + return 'unknown' + + def _campaign_ball_set(self, status): + """ + Args: + status (str): 'blue' or 'red'. + """ + skip_first_screenshot = True + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + current = self._campaign_ball_get() + logger.attr('Campaign_ball', current) + + if current == status: + break + else: + if self.is_in_stage(): + self.device.click(BALL) + self.device.sleep(3) + # wait until is_in_stage + while 1: + self.device.screenshot() + if self.is_in_stage(): + break diff --git a/campaign/war_archives_20200917_cn/ht1.py b/campaign/war_archives_20200917_cn/ht1.py new file mode 100644 index 000000000..47552a5fb --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht1.py @@ -0,0 +1,89 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase + +MAP = CampaignMap('HT1') +MAP.shape = 'K7' +# MAP.camera_data = ['D2', 'D5', 'H2', 'H5'] +MAP.camera_data = ['D3', 'D5', 'H3', 'H5'] +MAP.camera_data_spawn_point = ['H5', 'D5'] +MAP.map_data = """ + -- -- ++ -- -- MB -- -- ++ -- -- + -- ++ ++ ++ Me -- Me ++ ++ ++ -- + ++ Me -- ++ ++ -- ++ ++ -- Me ++ + ME -- ME ++ ++ -- ++ ++ ME -- ME + -- -- -- ME MS -- MS ME -- -- -- + ME -- MS -- -- __ -- -- MS -- 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 +""" +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, 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, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['blue'] + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_WALK_USE_CURRENT_FLEET = True + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ht2.py b/campaign/war_archives_20200917_cn/ht2.py new file mode 100644 index 000000000..9e49b92a3 --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht2.py @@ -0,0 +1,84 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT2') +MAP.shape = 'H7' +# MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data = ['D3', 'D5', 'E3', 'E5'] +MAP.camera_data_spawn_point = ['E5'] +MAP.portal_data = [('E5', 'E1'), ('E1', 'E5')] +MAP.map_data = """ + -- ++ -- ME -- ME ++ ++ + ME -- Me __ -- -- MB ++ + -- -- -- -- ME -- ++ ME + ++ ME ++ ++ ++ ++ MS -- + -- ++ Me Me -- Me -- ME + MS -- -- -- -- -- -- ++ + -- ME ++ ++ SP SP -- MS +""" +MAP.map_data_loop = """ + -- ++ -- ME -- ME ++ ++ + ME -- Me __ -- -- MB ++ + -- -- -- -- ME -- ++ ME + ++ ME ++ -- -- -- MS -- + -- ++ Me Me -- Me -- ME + MS -- -- -- -- -- -- ++ + -- ME ++ ++ SP SP -- MS +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 10 20 50 50 + 50 50 50 50 50 50 50 50 + 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, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'CAred'] + 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_PORTAL = True + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ht3.py b/campaign/war_archives_20200917_cn/ht3.py new file mode 100644 index 000000000..7963c6e05 --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht3.py @@ -0,0 +1,94 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT3') +MAP.shape = 'I9' +# MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +# MAP.camera_data_spawn_point = ['D7', 'D6'] +MAP.camera_data = ['D3', 'D5', 'D7', 'F3', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['D5'] +MAP.portal_data = [('I2', 'A1'), ('A1', 'I2'), ('I9', 'H1'), ('H1', 'I9')] +MAP.map_data = """ + -- -- -- ++ ME -- ME -- ++ + -- -- MB ++ -- -- -- -- -- + ++ ++ ++ ++ -- ++ ++ -- ME + -- MS -- Me -- Me ++ -- -- + ME -- ++ -- __ -- -- -- ME + -- -- SP -- -- Me ++ ++ ++ + Me -- -- SP ++ -- ++ MB -- + -- MS -- -- -- MS ++ -- -- + ++ -- Me -- ME -- ++ -- -- +""" +MAP.map_data_loop = """ + -- -- -- -- ME -- ME -- ++ + -- -- MB -- -- -- -- -- -- + ++ ++ ++ -- -- ++ ++ -- ME + -- MS -- Me -- Me ++ -- -- + ME -- ++ -- __ -- -- -- ME + -- -- SP -- -- Me -- -- -- + Me -- -- SP ++ -- ++ MB -- + -- MS -- -- -- MS ++ -- -- + ++ -- 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 +""" +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, \ +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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'CAred'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ht4.py b/campaign/war_archives_20200917_cn/ht4.py new file mode 100644 index 000000000..45f874dfb --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht4.py @@ -0,0 +1,111 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT4') +MAP.shape = 'K9' +MAP.camera_data = ['D2', 'D5', 'D7', 'H2', 'H5', 'H7'] +MAP.camera_data_spawn_point = ['D2', 'D7'] +MAP.portal_data = [('I5', 'C5'), ('C5', 'I5'), ('E5', 'E3'), ('E3', 'E5'), ('G5', 'G7'), ('G7', 'G5')] +MAP.map_data = """ + Me -- -- ++ Me -- ME -- ME ++ ++ + -- MS -- ++ -- SP -- __ -- MS -- + -- -- Me ++ -- -- -- ME -- -- -- + ME -- ++ ++ ++ ++ ++ ++ ++ -- ME + -- -- -- ++ -- MB -- ++ -- -- -- + ME -- ++ ++ ++ ++ ++ ++ ++ -- ME + -- -- -- ME -- -- -- ++ Me -- -- + -- MS -- __ -- SP -- ++ -- MS -- + ++ ++ ME -- ME -- Me ++ -- -- Me +""" +MAP.map_data_loop = """ + Me -- -- ++ Me -- ME -- ME ++ ++ + -- MS -- -- -- SP -- __ -- MS -- + -- -- Me ++ -- -- -- ME -- -- -- + ME -- ++ ++ -- ++ -- ++ ++ -- ME + -- -- -- ++ -- MB -- ++ -- -- -- + ME -- ++ ++ -- ++ -- ++ ++ -- ME + -- -- -- ME -- -- -- ++ Me -- -- + -- MS -- __ -- SP -- -- -- MS -- + ++ ++ 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 10 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 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 = ['BB', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.82 + MAP_SWIPE_MULTIPLY = 1.88 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.config.MAP_HAS_MOVABLE_ENEMY: + self.fleet_2_push_forward() + + if self.clear_siren(): + return True + if self.map_is_clear_mode: + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_2(self): + if self.clear_siren(): + return True + if self.map_is_clear_mode: + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ht5.py b/campaign/war_archives_20200917_cn/ht5.py new file mode 100644 index 000000000..c928c2252 --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht5.py @@ -0,0 +1,105 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT5') +MAP.shape = 'I9' +# MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +# MAP.camera_data_spawn_point = ['F7', 'D2'] +MAP.camera_data = ['D3', 'D5', 'D7', 'F3', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D3'] +MAP.portal_data = [('D3', 'F3'), ('G4', 'G6'), ('F7', 'D7'), ('C6', 'C4')] +MAP.map_data = """ + ++ -- -- -- ++ -- MB -- ++ + -- ME -- ME ++ MS -- MS -- + Me -- SP -- ++ -- __ -- -- + -- ME -- Me ++ Me -- ME -- + ++ ++ ++ ++ -- ++ ++ ++ ++ + -- ME -- Me ++ Me -- ME -- + -- -- __ -- ++ -- SP -- Me + -- MS -- MS ++ ME -- ME -- + ++ -- MB -- ++ -- -- -- ++ +""" +MAP.map_data_loop = """ + ++ -- -- -- ++ -- MB -- ++ + -- ME -- ME ++ MS -- MS -- + Me -- SP -- -- -- __ -- -- + -- ME -- Me ++ Me -- ME -- + ++ ++ -- ++ -- ++ -- ++ ++ + -- ME -- Me ++ Me -- ME -- + -- -- __ -- -- -- SP -- Me + -- MS -- MS ++ ME -- ME -- + ++ -- MB -- ++ -- -- -- ++ +""" +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 +""" +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, \ +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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BB', 'CV'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.map_is_clear_mode: + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ht6.py b/campaign/war_archives_20200917_cn/ht6.py new file mode 100644 index 000000000..6e062757f --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht6.py @@ -0,0 +1,109 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT6') +MAP.shape = 'K10' +# MAP.camera_data = ['D2', 'D6', 'D8', 'H2', 'H6', 'H8'] +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D6', 'G6'] +MAP.map_data = """ + -- -- -- ME -- Me -- ME -- -- -- + -- ++ ++ -- MS -- MS -- ++ ++ -- + -- ++ ME -- -- __ -- -- ME ++ -- + Me -- -- ++ ++ -- ++ ++ -- -- Me + ++ ME -- ++ MS -- MS ++ -- ME ++ + ++ ME -- -- -- MB -- -- -- 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 50 50 50 50 50 50 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, '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, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BB', 'CV', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.446 + MAP_SWIPE_MULTIPLY = 1.495 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_2(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/hts1.py b/campaign/war_archives_20200917_cn/hts1.py new file mode 100644 index 000000000..18d0c2144 --- /dev/null +++ b/campaign/war_archives_20200917_cn/hts1.py @@ -0,0 +1,86 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase + +MAP = CampaignMap('HTS1') +MAP.shape = 'H6' +MAP.camera_data = ['D2', 'D4', 'E2', 'E4'] +MAP.camera_data_spawn_point = ['E4'] +MAP.map_data = """ + MB -- ++ ++ ++ ++ -- -- + -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 1}, + {'battle': 1, 'enemy': 1}, + # {'battle': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + # MAP_SIREN_TEMPLATE = ['srzl2'] + # MOVABLE_ENEMY_TURN = (0,) + # MAP_HAS_SIREN = True + # MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['blue'] + FLEET_2 = 0 + MAP_IS_ONE_TIME_STAGE = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/hts2.py b/campaign/war_archives_20200917_cn/hts2.py new file mode 100644 index 000000000..a8dc704ec --- /dev/null +++ b/campaign/war_archives_20200917_cn/hts2.py @@ -0,0 +1,82 @@ +from module.exception import CampaignEnd +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .hts1 import Config as ConfigBase + +MAP = CampaignMap('HTS2') +MAP.shape = 'H8' +MAP.camera_data = ['D2', 'D6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ MM -- -- -- -- -- -- + ++ ++ ++ ++ -- -- -- ++ + -- -- -- -- -- ++ -- ++ + -- -- -- ++ ++ ++ -- ++ + -- ++ -- -- ++ -- -- -- + -- -- ++ -- -- ++ -- ++ + -- -- SP ++ MM ++ -- ++ + MM -- -- ++ ++ ++ -- ++ +""" +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 +""" +MAP.spawn_data = [ + {'battle': 0}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + self.goto(A8, expected='story') + self.goto(E7, expected='story') + self.goto(B1, expected='story') + self.goto(G8, expected='story') + + raise CampaignEnd() diff --git a/campaign/war_archives_20200917_cn/t1.py b/campaign/war_archives_20200917_cn/t1.py new file mode 100644 index 000000000..fbbcd2eee --- /dev/null +++ b/campaign/war_archives_20200917_cn/t1.py @@ -0,0 +1,86 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase + +MAP = CampaignMap('T1') +MAP.shape = 'K7' +# MAP.camera_data = ['D2', 'D5', 'H2', 'H5'] +MAP.camera_data = ['D3', 'D5', 'H3', 'H5'] +MAP.camera_data_spawn_point = ['H5', 'D5'] +MAP.map_data = """ + -- -- ++ -- -- MB -- -- ++ -- -- + -- ++ ++ ++ Me -- Me ++ ++ ++ -- + ++ Me -- ++ ++ -- ++ ++ -- Me ++ + ME -- ME ++ ++ -- ++ ++ ME -- ME + -- -- -- ME MS -- MS ME -- -- -- + ME -- MS -- -- __ -- -- MS -- 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 +""" +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, 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, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['DD', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['blue'] + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_WALK_USE_CURRENT_FLEET = True + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/t2.py b/campaign/war_archives_20200917_cn/t2.py new file mode 100644 index 000000000..adcf86e83 --- /dev/null +++ b/campaign/war_archives_20200917_cn/t2.py @@ -0,0 +1,96 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T2') +MAP.shape = 'H7' +# MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data = ['D3', 'D5', 'E3', 'E5'] +MAP.camera_data_spawn_point = ['E5'] +MAP.portal_data = [('E5', 'E1'), ('E1', 'E5')] +MAP.map_data = """ + -- ++ -- ME -- ME ++ ++ + ME -- Me __ -- -- MB ++ + -- -- -- -- ME -- ++ ME + ++ ME ++ ++ ++ ++ MS -- + -- ++ Me Me -- Me -- ME + MS -- -- -- -- -- -- ++ + -- ME ++ ++ SP SP -- MS +""" +MAP.map_data_loop = """ + -- ++ -- ME -- ME ++ ++ + ME -- Me __ -- -- MB ++ + -- -- -- -- ME -- ++ ME + ++ ME ++ -- -- -- MS -- + -- ++ Me Me -- Me -- ME + MS -- -- -- -- -- -- ++ + -- ME ++ ++ SP SP -- MS +""" +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 +""" +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, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL'] + 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_PORTAL = True + # ===== End of generated config ===== + + 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 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/t3.py b/campaign/war_archives_20200917_cn/t3.py new file mode 100644 index 000000000..81bf22941 --- /dev/null +++ b/campaign/war_archives_20200917_cn/t3.py @@ -0,0 +1,105 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T3') +MAP.shape = 'I9' +# MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +# MAP.camera_data_spawn_point = ['D7', 'D6'] +MAP.camera_data = ['D3', 'D5', 'D7', 'F3', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['D5'] +MAP.portal_data = [('I2', 'A1'), ('A1', 'I2'), ('I9', 'H1'), ('H1', 'I9')] +MAP.map_data = """ + -- -- -- ++ ME -- ME -- ++ + -- -- MB ++ -- -- -- -- -- + ++ ++ ++ ++ -- ++ ++ -- ME + -- MS -- Me -- Me ++ -- -- + ME -- ++ -- __ -- -- -- ME + -- -- SP -- -- Me ++ ++ ++ + Me -- -- SP ++ -- ++ MB -- + -- MS -- -- -- MS ++ -- -- + ++ -- Me -- ME -- ++ -- -- +""" +MAP.map_data_loop = """ + -- -- -- -- ME -- ME -- ++ + -- -- MB -- -- -- -- -- -- + ++ ++ ++ -- -- ++ ++ -- ME + -- MS -- Me -- Me ++ -- -- + ME -- ++ -- __ -- -- -- ME + -- -- SP -- -- Me -- -- -- + Me -- -- SP ++ -- ++ MB -- + -- MS -- -- -- MS ++ -- -- + ++ -- 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 +""" +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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CAred'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + 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 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/t4.py b/campaign/war_archives_20200917_cn/t4.py new file mode 100644 index 000000000..7bed81f24 --- /dev/null +++ b/campaign/war_archives_20200917_cn/t4.py @@ -0,0 +1,109 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T4') +MAP.shape = 'K9' +MAP.camera_data = ['D2', 'D5', 'D7', 'H2', 'H5', 'H7'] +MAP.camera_data_spawn_point = ['D2', 'D7'] +MAP.portal_data = [('I5', 'C5'), ('C5', 'I5'), ('E5', 'E3'), ('E3', 'E5'), ('G5', 'G7'), ('G7', 'G5')] +MAP.map_data = """ + Me -- -- ++ Me -- ME -- ME ++ ++ + -- MS -- ++ -- SP -- __ -- MS -- + -- -- Me ++ -- -- -- ME -- -- -- + ME -- ++ ++ ++ ++ ++ ++ ++ -- ME + -- -- -- ++ -- MB -- ++ -- -- -- + ME -- ++ ++ ++ ++ ++ ++ ++ -- ME + -- -- -- ME -- -- -- ++ Me -- -- + -- MS -- __ -- SP -- ++ -- MS -- + ++ ++ ME -- ME -- Me ++ -- -- Me +""" +MAP.map_data_loop = """ + Me -- -- ++ Me -- ME -- ME ++ ++ + -- MS -- -- -- SP -- __ -- MS -- + -- -- Me ++ -- -- -- ME -- -- -- + ME -- ++ ++ -- ++ -- ++ ++ -- ME + -- -- -- ++ -- MB -- ++ -- -- -- + ME -- ++ ++ -- ++ -- ++ ++ -- ME + -- -- -- ME -- -- -- ++ Me -- -- + -- MS -- __ -- SP -- -- -- MS -- + ++ ++ 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 10 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 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, 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 = ['CL', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + 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 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.82 + MAP_SWIPE_MULTIPLY = 1.88 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.config.MAP_HAS_MOVABLE_ENEMY: + self.fleet_2_push_forward() + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/t5.py b/campaign/war_archives_20200917_cn/t5.py new file mode 100644 index 000000000..682d6de26 --- /dev/null +++ b/campaign/war_archives_20200917_cn/t5.py @@ -0,0 +1,106 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T5') +MAP.shape = 'I9' +# MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +# MAP.camera_data_spawn_point = ['F7', 'D2'] +MAP.camera_data = ['D3', 'D5', 'D7', 'F3', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D3'] +MAP.portal_data = [('D3', 'F3'), ('G4', 'G6'), ('F7', 'D7'), ('C6', 'C4')] +MAP.map_data = """ + ++ -- -- -- ++ -- MB -- ++ + -- ME -- ME ++ MS -- MS -- + Me -- SP -- ++ -- __ -- -- + -- ME -- Me ++ Me -- ME -- + ++ ++ ++ ++ -- ++ ++ ++ ++ + -- ME -- Me ++ Me -- ME -- + -- -- __ -- ++ -- SP -- Me + -- MS -- MS ++ ME -- ME -- + ++ -- MB -- ++ -- -- -- ++ +""" +MAP.map_data_loop = """ + ++ -- -- -- ++ -- MB -- ++ + -- ME -- ME ++ MS -- MS -- + Me -- SP -- -- -- __ -- -- + -- ME -- Me ++ Me -- ME -- + ++ ++ -- ++ -- ++ -- ++ ++ + -- ME -- Me ++ Me -- ME -- + -- -- __ -- -- -- SP -- Me + -- MS -- MS ++ ME -- ME -- + ++ -- MB -- ++ -- -- -- ++ +""" +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 +""" +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, \ +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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'CAred'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + 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 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/t6.py b/campaign/war_archives_20200917_cn/t6.py new file mode 100644 index 000000000..586a2c81f --- /dev/null +++ b/campaign/war_archives_20200917_cn/t6.py @@ -0,0 +1,101 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T6') +MAP.shape = 'K10' +# MAP.camera_data = ['D2', 'D6', 'D8', 'H2', 'H6', 'H8'] +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D6', 'G6'] +MAP.map_data = """ + -- -- -- ME -- Me -- ME -- -- -- + -- ++ ++ -- MS -- MS -- ++ ++ -- + -- ++ ME -- -- __ -- -- ME ++ -- + Me -- -- ++ ++ -- ++ ++ -- -- Me + ++ ME -- ++ MS -- MS ++ -- ME ++ + ++ ME -- -- -- MB -- -- -- 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 50 50 50 50 50 50 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, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CA', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.446 + MAP_SWIPE_MULTIPLY = 1.495 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ts1.py b/campaign/war_archives_20200917_cn/ts1.py new file mode 100644 index 000000000..0cbef5675 --- /dev/null +++ b/campaign/war_archives_20200917_cn/ts1.py @@ -0,0 +1,83 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase + +MAP = CampaignMap('TS1') +MAP.shape = 'H6' +MAP.camera_data = ['D2', 'D4', 'E2', 'E4'] +MAP.camera_data_spawn_point = ['E4'] +MAP.map_data = """ + MB -- ++ ++ ++ ++ -- -- + -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 1}, + {'battle': 1, 'enemy': 1}, + # {'battle': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + # MAP_SIREN_TEMPLATE = ['srzl2'] + # MOVABLE_ENEMY_TURN = (0,) + # MAP_HAS_SIREN = True + # MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['blue'] + FLEET_2 = 0 + MAP_IS_ONE_TIME_STAGE = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ts2.py b/campaign/war_archives_20200917_cn/ts2.py new file mode 100644 index 000000000..7fa487ff5 --- /dev/null +++ b/campaign/war_archives_20200917_cn/ts2.py @@ -0,0 +1,82 @@ +from module.exception import CampaignEnd +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ts1 import Config as ConfigBase + +MAP = CampaignMap('TS2') +MAP.shape = 'H8' +MAP.camera_data = ['D2', 'D6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ MM -- -- -- -- -- -- + ++ ++ ++ ++ -- -- -- ++ + -- -- -- -- -- ++ -- ++ + -- -- -- ++ ++ ++ -- ++ + -- ++ -- -- ++ -- -- -- + -- -- ++ -- -- ++ -- ++ + -- -- SP ++ MM ++ -- ++ + MM -- -- ++ ++ ++ -- ++ +""" +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 +""" +MAP.spawn_data = [ + {'battle': 0}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + self.goto(A8, expected='story') + self.goto(E7, expected='story') + self.goto(B1, expected='story') + self.goto(G8, expected='story') + + raise CampaignEnd() diff --git a/campaign/war_archives_20210527_cn/a1.py b/campaign/war_archives_20210527_cn/a1.py new file mode 100644 index 000000000..f550a6693 --- /dev/null +++ b/campaign/war_archives_20210527_cn/a1.py @@ -0,0 +1,70 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('A1') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ++ ++ -- ME -- Me ++ -- -- + ++ ++ Me -- -- -- -- -- SP + ME -- -- -- ++ MS -- ME SP + -- -- ME -- ++ __ ME -- ++ + MB -- ++ MS -- 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 +""" +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, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Dewey'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.778 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.719 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/a2.py b/campaign/war_archives_20210527_cn/a2.py new file mode 100644 index 000000000..7a4d812ab --- /dev/null +++ b/campaign/war_archives_20210527_cn/a2.py @@ -0,0 +1,75 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'H8' +MAP.camera_data = ['D2', 'D6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['E6', 'D6'] +MAP.map_data = """ + -- ++ ++ ++ -- MB -- ++ + -- ME -- ME -- ME -- -- + ++ -- MS -- ME ++ Me -- + -- Me ++ -- Me -- -- -- + ME -- ++ ME -- __ ME MS + -- MS -- 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 +""" +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, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['DD'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.512 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.462 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/a3.py b/campaign/war_archives_20210527_cn/a3.py new file mode 100644 index 000000000..f639acd8a --- /dev/null +++ b/campaign/war_archives_20210527_cn/a3.py @@ -0,0 +1,75 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + ++ ++ -- ++ ++ -- -- ME ++ ++ + -- -- MB -- ME -- MS -- ++ ++ + -- ME -- ME MS Me -- ME -- -- + -- ++ -- ++ -- __ -- Me -- MS + ME ++ -- ++ ME Me ++ -- ME -- + -- -- -- Me -- -- ME -- -- -- + -- ME -- -- SP ++ -- ++ SP ++ + -- ++ ++ ++ -- 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': 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 = ['CL'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.512 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.462 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/b1.py b/campaign/war_archives_20210527_cn/b1.py new file mode 100644 index 000000000..450ed9faf --- /dev/null +++ b/campaign/war_archives_20210527_cn/b1.py @@ -0,0 +1,79 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('B1') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D2', 'D6'] +MAP.map_data = """ + -- ME -- ME -- -- -- -- ++ ++ + ++ -- MS -- -- Me -- -- MB ++ + ++ -- -- MS Me ++ -- Me -- -- + SP -- ME -- ME -- ME ++ -- ++ + SP -- ++ ++ -- __ -- ++ -- ME + -- -- ++ ++ Me ME -- ME -- -- + ME -- MS -- -- -- Me -- ++ ++ + -- ++ -- ME -- MS -- ++ ++ ++ +""" +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 = ['Hammann', 'CL'] + 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 + # ===== End of generated config ===== + + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/b2.py b/campaign/war_archives_20210527_cn/b2.py new file mode 100644 index 000000000..4e55be47b --- /dev/null +++ b/campaign/war_archives_20210527_cn/b2.py @@ -0,0 +1,76 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6'] +MAP.map_data = """ + ++ ++ -- ME -- -- MS ++ ++ ++ + ++ ++ -- ++ ++ -- -- -- -- ME + -- Me -- -- ME -- Me -- ++ -- + ME ++ MS MB -- -- ME -- ++ -- + -- ++ -- -- ME __ -- MS ++ ME + -- ++ -- Me -- -- Me -- -- -- + ME -- ME -- -- ++ ++ -- -- SP + ++ ++ ++ MS -- ME -- -- 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 = ['Atlanta', 'CL'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.523 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.472 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210527_cn/b3.py b/campaign/war_archives_20210527_cn/b3.py new file mode 100644 index 000000000..0dd6f7a45 --- /dev/null +++ b/campaign/war_archives_20210527_cn/b3.py @@ -0,0 +1,81 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'I9' +MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D7'] +MAP.map_data = """ + ++ -- ME -- -- -- ME -- ++ + ++ ++ ++ -- MB -- ++ ++ ++ + ME -- -- -- ++ -- -- -- ME + -- ME Me -- Me -- Me ME -- + -- ++ ++ -- __ -- ++ ++ -- + MS ++ ++ -- Me -- ++ ++ MS + -- ME MS -- -- -- MS ME -- + 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 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, \ +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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Dewey', 'Northampton', 'CA'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.477 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.428 + INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40 + # EDGE_LINES_HOUGHLINES_THRESHOLD = 40 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210527_cn/c1.py b/campaign/war_archives_20210527_cn/c1.py new file mode 100644 index 000000000..b74817698 --- /dev/null +++ b/campaign/war_archives_20210527_cn/c1.py @@ -0,0 +1,77 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('C1') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ++ ++ -- ME -- Me ++ -- -- + ++ ++ Me -- -- -- -- -- SP + ME -- -- -- ++ MS -- ME SP + -- -- ME -- ++ __ ME -- ++ + MB -- ++ MS -- 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 +""" +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, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Dewey', 'CA'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.778 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.719 + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/c2.py b/campaign/war_archives_20210527_cn/c2.py new file mode 100644 index 000000000..583f5ffb8 --- /dev/null +++ b/campaign/war_archives_20210527_cn/c2.py @@ -0,0 +1,81 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'H8' +MAP.camera_data = ['D2', 'D6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['E6', 'D6'] +MAP.map_data = """ + -- ++ ++ ++ -- MB -- ++ + -- ME -- ME -- ME -- -- + ++ -- MS -- ME ++ Me -- + -- Me ++ -- Me -- -- -- + ME -- ++ ME -- __ ME MS + -- MS -- 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 +""" +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, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Atlanta', 'CA'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.512 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.462 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/c3.py b/campaign/war_archives_20210527_cn/c3.py new file mode 100644 index 000000000..8d7870d0f --- /dev/null +++ b/campaign/war_archives_20210527_cn/c3.py @@ -0,0 +1,82 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + ++ ++ -- ++ ++ -- -- ME ++ ++ + -- -- MB -- ME -- MS -- ++ ++ + -- ME -- ME MS Me -- ME -- -- + -- ++ -- ++ -- __ -- Me -- MS + ME ++ -- ++ ME Me ++ -- ME -- + -- -- -- Me -- -- ME -- -- -- + -- ME -- -- SP ++ -- ++ SP ++ + -- ++ ++ ++ -- 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': 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 = ['Northampton', 'CA', 'BB'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.512 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.462 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210527_cn/d1.py b/campaign/war_archives_20210527_cn/d1.py new file mode 100644 index 000000000..28114906d --- /dev/null +++ b/campaign/war_archives_20210527_cn/d1.py @@ -0,0 +1,85 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('D1') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D2', 'D6'] +MAP.map_data = """ + -- ME -- ME -- -- -- -- ++ ++ + ++ -- MS -- -- Me -- -- MB ++ + ++ -- -- MS Me ++ -- Me -- -- + SP -- ME -- ME -- ME ++ -- ++ + SP -- ++ ++ -- __ -- ++ -- ME + -- -- ++ ++ Me ME -- ME -- -- + ME -- MS -- -- -- Me -- ++ ++ + -- ++ -- ME -- MS -- ++ ++ ++ +""" +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 = ['Hammann', 'Atlanta', 'CA'] + 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 + # ===== End of generated config ===== + + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210527_cn/d2.py b/campaign/war_archives_20210527_cn/d2.py new file mode 100644 index 000000000..5029fd762 --- /dev/null +++ b/campaign/war_archives_20210527_cn/d2.py @@ -0,0 +1,93 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6'] +MAP.map_data = """ + ++ ++ -- ME -- -- MS ++ ++ ++ + ++ ++ -- ++ ++ -- -- -- -- ME + -- Me -- -- ME -- Me -- ++ -- + ME ++ MS MB -- -- ME -- ++ -- + -- ++ -- -- ME __ -- MS ++ ME + -- ++ -- Me -- -- Me -- -- -- + ME -- ME -- -- ++ ++ -- -- SP + ++ ++ ++ MS -- ME -- -- 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': 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 = ['Dewey', 'Northampton', 'BB'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.523 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.472 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210527_cn/d3.py b/campaign/war_archives_20210527_cn/d3.py new file mode 100644 index 000000000..b8c4419c9 --- /dev/null +++ b/campaign/war_archives_20210527_cn/d3.py @@ -0,0 +1,100 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'I9' +MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D7'] +MAP.map_data = """ + ++ -- ME -- -- -- ME -- ++ + ++ ++ ++ -- MB -- ++ ++ ++ + ME -- -- -- ++ -- -- -- ME + -- ME Me -- Me -- Me ME -- + -- ++ ++ -- __ -- ++ ++ -- + MS ++ ++ -- Me -- ++ ++ MS + -- ME MS -- -- -- MS ME -- + 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 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, \ +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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Atlanta', 'Northampton', 'CV'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.477 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.428 + INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40 + # EDGE_LINES_HOUGHLINES_THRESHOLD = 40 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/config/template.json b/config/template.json index cced3c852..daa951d2d 100644 --- a/config/template.json +++ b/config/template.json @@ -2062,7 +2062,7 @@ }, "Campaign": { "Name": "D3", - "Event": "war_archives_20201229_cn", + "Event": "war_archives_20210527_cn", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, @@ -2847,7 +2847,7 @@ "UseGems": false, "Refresh": false, "BuySkinBox": false, - "ConsumeCoins": false, + "ConsumeCoins": 550000, "Filter": "BookRedT3 > BookYellowT3 > BookBlueT3 > BookRedT2\n> Cube\n> FoodT6 > FoodT5" }, "Storage": { diff --git a/deploy/alas.py b/deploy/alas.py new file mode 100644 index 000000000..f5e46f0d4 --- /dev/null +++ b/deploy/alas.py @@ -0,0 +1,94 @@ +import pickle + +from deploy.config import DeployConfig +from deploy.logger import logger +from deploy.utils import * + + +class AlasManager(DeployConfig): + @cached_property + def alas_folder(self): + return [ + self.filepath("PythonExecutable"), + self.root_filepath + ] + + @cached_property + def self_pid(self): + return os.getpid() + + def iter_process_by_name(self, name): + """ + Args: + name (str): process name, such as 'alas.exe' + + Yields: + str, str, str: executable_path, process_name, process_id + """ + for _ in range(2): + try: + from win32com.client import GetObject + except ModuleNotFoundError: + # No module named pywin32 + logger.info('pywin32 not installed, skip') + return False + except (pickle.UnpicklingError, EOFError) as e: + # _pickle.UnpicklingError: invalid load key, '\x00'. + # EOFError: Ran out of input + logger.error(f'{type(e).__name__}: {e}') + import sys + import win32api + # From win32com/client/__init__.py + gen_path = os.path.join(win32api.GetTempPath(), "gen_py", + "%d.%d" % (sys.version_info[0], sys.version_info[1])) + # From win32com/client/gencache.py + file = os.path.join(gen_path, "dicts.dat") + # Try deleting it + file = os.path.abspath(file).replace('\\', '/') + if os.path.exists(file): + logger.info(f'win32com dicts.dat exists, removing: {file}') + os.remove(file) + continue + else: + logger.warning(f'Cannot find win32com dicts.dat') + continue + try: + _ = GetObject + except UnboundLocalError: + logger.warning('Unable to import win32com.client, please fix it manually, ' + 'see https://github.com/LmeSzinc/AzurLaneAutoScript/issues/2382') + exit(1) + + try: + wmi = GetObject('winmgmts:') + processes = wmi.InstancesOf('Win32_Process') + for p in processes: + executable_path = p.Properties_["ExecutablePath"].Value + process_name = p.Properties_("Name").Value + process_id = p.Properties_["ProcessID"].Value + + if executable_path is not None and process_name == name and process_id != self.self_pid: + executable_path = executable_path.replace(r'\\', '/').replace('\\', '/') + for folder in self.alas_folder: + if folder in executable_path: + yield executable_path, process_name, process_id + except Exception as e: + # Possible exception + # pywintypes.com_error: (-2147217392, 'OLE error 0x80041010', None, None) + logger.info(str(e)) + return False + + def kill_by_name(self, name): + """ + Args: + name (str): Process name + """ + logger.hr(f'Kill {name}', 1) + for row in self.iter_process_by_name(name): + logger.info(' '.join(map(str, row))) + self.execute(f'taskkill /f /pid {row[2]}', allow_failure=True, output=False) + + def alas_kill(self): + logger.hr(f'Kill existing Alas', 0) + self.kill_by_name('alas.exe') + self.kill_by_name('python.exe') diff --git a/module/campaign/campaign_event.py b/module/campaign/campaign_event.py index 4465a5e4b..658856db2 100644 --- a/module/campaign/campaign_event.py +++ b/module/campaign/campaign_event.py @@ -29,7 +29,7 @@ class CampaignEvent(CampaignStatus): from module.config.utils import deep_get _gg_on = deep_get(self.config.data, keys='GameManager.GGHandler.Enabled') if _gg_on: - campaign_to_go = '14-1' + campaign_to_go = '15-1' else: campaign_to_go = '2-4' logger.info(f'Reset GemsFarming to {campaign_to_go}') diff --git a/module/campaign/run.py b/module/campaign/run.py index 77c5fdd35..a2ab8566e 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -236,6 +236,7 @@ class CampaignRun(CampaignEvent, ShopStatus): 'event_20200917_cn', 'event_20221124_cn', 'event_20230525_cn', + 'war_archives_20200917_cn', # chapter T 'event_20211125_cn', 'event_20231026_cn', diff --git a/module/commission/commission.py b/module/commission/commission.py index 9518dfbe2..23c898275 100644 --- a/module/commission/commission.py +++ b/module/commission/commission.py @@ -324,13 +324,14 @@ class RewardCommission(UI, InfoHandler): self.daily_choose, self.urgent_choose = self._commission_choose(self.daily, self.urgent) return daily, urgent - def _commission_start_click(self, comm, is_urgent=False): + def _commission_start_click(self, comm, is_urgent=False, skip_first_screenshot=True): """ Start a commission. Args: comm (Commission): is_urgent (bool): + skip_first_screenshot: Returns: bool: If success @@ -345,14 +346,37 @@ class RewardCommission(UI, InfoHandler): comm_timer = Timer(7) count = 0 while 1: - if comm_timer.reached(): - self.device.click(comm.button) - self.device.sleep(0.3) - comm_timer.reset() + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() - if self.handle_popup_confirm('COMMISSION_START'): + # End + if self.info_bar_count(): + break + if count >= 3: + # Restart game and handle commission recommend bug. + # After you click "Recommend", your ships appear and then suddenly disappear. + # At the same time, the icon of commission is flashing. + logger.warning('Triggered commission list flashing bug') + raise GameStuckError('Triggered commission list flashing bug') + + # Click + if self.appear_then_click(COMMISSION_START, offset=(5, 20), interval=7): + self.interval_reset(COMMISSION_ADVICE) comm_timer.reset() - pass + continue + if self.handle_popup_confirm('COMMISSION_START'): + self.interval_reset(COMMISSION_ADVICE) + comm_timer.reset() + continue + # Accidentally entered dock + if self.appear(DOCK_CHECK, offset=(20, 20), interval=3): + logger.info(f'equip_enter {DOCK_CHECK} -> {BACK_ARROW}') + self.device.click(BACK_ARROW) + comm_timer.reset() + continue + # Check if is the right commission if self.appear(COMMISSION_ADVICE, offset=(5, 20), interval=7): area = (0, 0, image_size(self.device.image)[0], COMMISSION_ADVICE.button[1]) current = self.commission_detect(area=area) @@ -369,28 +393,15 @@ class RewardCommission(UI, InfoHandler): logger.warning('No selected commission detected, assuming correct') self.device.click(COMMISSION_ADVICE) count += 1 + self.interval_reset(COMMISSION_ADVICE) + self.interval_clear(COMMISSION_START) comm_timer.reset() - pass - if self.appear_then_click(COMMISSION_START, offset=(5, 20), interval=7): - comm_timer.reset() - pass - # Accidentally entered dock - if self.appear(DOCK_CHECK, offset=(20, 20), interval=3): - logger.info(f'equip_enter {DOCK_CHECK} -> {BACK_ARROW}') - self.device.click(BACK_ARROW) continue - - # End - if self.info_bar_count(): - break - if count >= 3: - # Restart game and handle commission recommend bug. - # After you click "Recommend", your ships appear and then suddenly disappear. - # At the same time, the icon of commission is flashing. - logger.warning('Triggered commission list flashing bug') - raise GameStuckError('Triggered commission list flashing bug') - - self.device.screenshot() + # Enter + if comm_timer.reached(): + self.device.click(comm.button) + self.device.sleep(0.3) + comm_timer.reset() return True diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 74c647bea..1fe657eb3 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -2935,13 +2935,13 @@ ], "display": "hide", "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -5988,13 +5988,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -6281,13 +6281,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -6728,13 +6728,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -7175,13 +7175,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -7622,13 +7622,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -8112,13 +8112,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -8559,13 +8559,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -9006,13 +9006,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -9453,13 +9453,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -9900,13 +9900,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -10347,13 +10347,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -10753,15 +10753,16 @@ "raid_20220630", "raid_20221027", "raid_20230118", - "raid_20230629" + "raid_20230629", + "raid_20240130" ], "option_bold": [ - "raid_20230629", + "raid_20240130", "raid_20221027" ], - "cn": "raid_20230629", - "en": "raid_20230629", - "jp": "raid_20230629", + "cn": "raid_20240130", + "en": "raid_20240130", + "jp": "raid_20240130", "tw": "raid_20221027" }, "Mode": { @@ -11263,9 +11264,11 @@ "war_archives_20200806_cn", "war_archives_20200820_cn", "war_archives_20200903_cn", + "war_archives_20200917_cn", "war_archives_20201029_cn", "war_archives_20201229_cn", "war_archives_20210325_cn", + "war_archives_20210527_cn", "war_archives_20210624_cn", "war_archives_20210819_cn", "war_archives_20211014_cn", @@ -11275,11 +11278,11 @@ ], "option_bold": [ "war_archives_20220414_cn", - "war_archives_20201229_cn" + "war_archives_20210527_cn" ], - "cn": "war_archives_20201229_cn", - "en": "war_archives_20201229_cn", - "jp": "war_archives_20201229_cn", + "cn": "war_archives_20210527_cn", + "en": "war_archives_20210527_cn", + "jp": "war_archives_20210527_cn", "tw": "war_archives_20220414_cn" }, "Mode": { @@ -11732,13 +11735,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -12196,13 +12199,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -12660,13 +12663,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -13124,13 +13127,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -13578,13 +13581,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -13981,15 +13984,16 @@ "raid_20220630", "raid_20221027", "raid_20230118", - "raid_20230629" + "raid_20230629", + "raid_20240130" ], "option_bold": [ - "raid_20230629", + "raid_20240130", "raid_20221027" ], - "cn": "raid_20230629", - "en": "raid_20230629", - "jp": "raid_20230629", + "cn": "raid_20240130", + "en": "raid_20240130", + "jp": "raid_20240130", "tw": "raid_20221027" }, "Mode": { @@ -15373,8 +15377,8 @@ "value": false }, "ConsumeCoins": { - "type": "checkbox", - "value": false + "type": "input", + "value": 550000 }, "Filter": { "type": "textarea", diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 0ab513d0e..d50a1fba6 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -429,7 +429,7 @@ GeneralShop: UseGems: false Refresh: false BuySkinBox: false - ConsumeCoins: false + ConsumeCoins: 550000 Filter: |- BookRedT3 > BookYellowT3 > BookBlueT3 > BookRedT2 > Cube diff --git a/module/config/config_generated.py b/module/config/config_generated.py index ce1ea202e..8f12a56ea 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -255,7 +255,7 @@ class GeneratedConfig: GeneralShop_UseGems = False GeneralShop_Refresh = False GeneralShop_BuySkinBox = False - GeneralShop_ConsumeCoins = False + GeneralShop_ConsumeCoins = 550000 GeneralShop_Filter = 'BookRedT3 > BookYellowT3 > BookBlueT3 > BookRedT2\n> Cube\n> FoodT6 > FoodT5' # Group `GuildShop` diff --git a/module/config/config_updater.py b/module/config/config_updater.py index ddf47bb7b..85729b9b7 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -640,16 +640,17 @@ class ConfigUpdater: deep_default(new, 'Alas.DropRecord.AzurStatsID', random_id()) # Update to latest event server = to_server(deep_get(new, 'Alas.Emulator.PackageName', 'cn')) - # if not is_template: - # for task in EVENTS + RAIDS + COALITIONS: - # deep_set(new, - # keys=f'{task}.Campaign.Event', - # value=deep_get(self.args, f'{task}.Campaign.Event.{server}')) - # for task in ['GemsFarming']: - # if deep_get(new, keys=f'{task}.Campaign.Event', default='campaign_main') != 'campaign_main': - # deep_set(new, - # keys=f'{task}.Campaign.Event', - # value=deep_get(self.args, f'{task}.Campaign.Event.{server}')) + if not is_template: + # for task in EVENTS + RAIDS + COALITIONS: + for task in RAIDS + COALITIONS: + deep_set(new, + keys=f'{task}.Campaign.Event', + value=deep_get(self.args, f'{task}.Campaign.Event.{server}')) + for task in ['GemsFarming']: + if deep_get(new, keys=f'{task}.Campaign.Event', default='campaign_main') != 'campaign_main': + deep_set(new, + keys=f'{task}.Campaign.Event', + value=deep_get(self.args, f'{task}.Campaign.Event.{server}')) # War archive does not allow campaign_main for task in WAR_ARCHIVES: if deep_get(new, keys=f'{task}.Campaign.Event', default='campaign_main') == 'campaign_main': diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 1e9cb2483..fbcad2d38 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -832,6 +832,7 @@ "raid_20221027": "Fight On Royal Maids!(Part 3)", "raid_20230118": "Winter Pathfinder", "raid_20230629": "Reflections of the Oasis", + "raid_20240130": "Spring Festive Fiasco", "war_archives_20180607_cn": "archives Ink Stained Steel Sakura", "war_archives_20180726_cn": "archives Iris of Light and Dark", "war_archives_20181020_en": "archives Strive Wish and Strategize", @@ -846,9 +847,11 @@ "war_archives_20200806_cn": "archives The Enigma and the Shark", "war_archives_20200820_cn": "archives Scherzo of Iron and Blood", "war_archives_20200903_cn": "archives Stars of the Shimmering Fjord", + "war_archives_20200917_cn": "archives Dreamwakers Butterfly", "war_archives_20201029_cn": "archives Universe in Unison", "war_archives_20201229_cn": "archives Inverted Orthant", "war_archives_20210325_cn": "archives Ashen Simulacrum", + "war_archives_20210527_cn": "archives Mirror Involution", "war_archives_20210624_cn": "archives Swirling Cherry Blossoms", "war_archives_20210819_cn": "archives Microlayer Medley", "war_archives_20211014_cn": "archives Crescendo of Polaris", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 34eba3ee5..a7fb17a32 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -832,6 +832,7 @@ "raid_20221027": "戦え!ロイヤルメイド隊3rd", "raid_20230118": "冬の案内人", "raid_20230629": "緑地伽話", + "raid_20240130": "新春宴会狂騒曲", "war_archives_20180607_cn": "檔案 墨染まりし鋼の桜", "war_archives_20180726_cn": "檔案 光と影のアイリス", "war_archives_20181020_en": "檔案 努力希望と計画", @@ -846,9 +847,11 @@ "war_archives_20200806_cn": "檔案 鉄血鮫とエニグマ", "war_archives_20200820_cn": "檔案 黒鉄の楽章 誓いの海", "war_archives_20200903_cn": "檔案 輝ける峡湾の星", + "war_archives_20200917_cn": "檔案 刹那觀る胡蝶の夢", "war_archives_20201029_cn": "檔案 激唱のユニバース", "war_archives_20201229_cn": "檔案 虚畳なりし限象", "war_archives_20210325_cn": "檔案 開かれし紺碧の砂箱", + "war_archives_20210527_cn": "檔案 照らす螺旋の鏡海", "war_archives_20210624_cn": "檔案 翳りし満ちる影の華", "war_archives_20210819_cn": "檔案 闇靄払う銀翼", "war_archives_20211014_cn": "檔案 激奏のポラリス", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 5efdc52da..8b13f09ee 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -832,6 +832,7 @@ "raid_20221027": "战斗!皇家女仆队3rd", "raid_20230118": "冬日的寻路人", "raid_20230629": "绿洲往事", + "raid_20240130": "寰昌宇定家事忙", "war_archives_20180607_cn": "档案 墨染的钢铁之花", "war_archives_20180726_cn": "档案 光与影的鸢尾之华", "war_archives_20181020_en": "档案 努力希望和计划", @@ -846,9 +847,11 @@ "war_archives_20200806_cn": "档案 最重要的宝物", "war_archives_20200820_cn": "档案 铁血音符誓言", "war_archives_20200903_cn": "档案 峡湾间的星辰", + "war_archives_20200917_cn": "档案 蝶海梦花", "war_archives_20201029_cn": "档案 激唱的UNIVERSE", "war_archives_20201229_cn": "档案 负象限作战", "war_archives_20210325_cn": "档案 箱庭疗法", + "war_archives_20210527_cn": "档案 镜位螺旋", "war_archives_20210624_cn": "档案 浮樱影华", "war_archives_20210819_cn": "档案 微层混合", "war_archives_20211014_cn": "档案 激奏的Polaris", @@ -1679,7 +1682,7 @@ }, "ConsumeCoins": { "name": "消耗溢出物资", - "help": "物资超过550000时购买所有消耗物资的物品" + "help": "设置为0则不启用,默认为550000" }, "Filter": { "name": "商店过滤器", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index e82a06706..b1a55c64e 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -791,7 +791,7 @@ "event_20210415_tw": "復刻圍剿施佩伯爵", "event_20210422_cn": "復興的讚美詩", "event_20210429_tw": "復刻墨染的鋼鐵之花", - "event_20210527_cn": "鏡位螺旋", + "event_20210527_cn": "復刻鏡位螺旋", "event_20210527_tw": "微層混合", "event_20210610_tw": "復刻夜幕下的歸途", "event_20210624_cn": "復刻-浮櫻影華", @@ -832,6 +832,7 @@ "raid_20221027": "戰鬥!皇家女僕隊3rd", "raid_20230118": "Winter Pathfinder", "raid_20230629": "Reflections of the Oasis", + "raid_20240130": "Spring Festive Fiasco", "war_archives_20180607_cn": "檔案 墨染的鋼鐵之花", "war_archives_20180726_cn": "檔案 光與影的鳶尾之華", "war_archives_20181020_en": "檔案 努力希望和計劃", @@ -846,9 +847,11 @@ "war_archives_20200806_cn": "archives The Enigma and the Shark", "war_archives_20200820_cn": "archives Scherzo of Iron and Blood", "war_archives_20200903_cn": "archives Stars of the Shimmering Fjord", + "war_archives_20200917_cn": "archives Dreamwakers Butterfly", "war_archives_20201029_cn": "archives Universe in Unison", "war_archives_20201229_cn": "archives Inverted Orthant", "war_archives_20210325_cn": "archives Ashen Simulacrum", + "war_archives_20210527_cn": "archives Mirror Involution", "war_archives_20210624_cn": "archives Swirling Cherry Blossoms", "war_archives_20210819_cn": "archives Microlayer Medley", "war_archives_20211014_cn": "archives Crescendo of Polaris", diff --git a/module/handler/assets.py b/module/handler/assets.py index e2dc0cb29..bff37d587 100644 --- a/module/handler/assets.py +++ b/module/handler/assets.py @@ -11,11 +11,17 @@ AUTO_SEARCH_MENU_EXIT = Button(area={'cn': (419, 609, 475, 637), 'en': (421, 611 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_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'}) +AUTO_SEARCH_SET_BOSS_15 = Button(area={'cn': (635, 161, 653, 180), 'en': (635, 161, 653, 180), 'jp': (635, 161, 653, 180), 'tw': (635, 161, 653, 180)}, color={'cn': (37, 37, 39), 'en': (37, 37, 39), 'jp': (37, 37, 39), 'tw': (37, 37, 39)}, button={'cn': (635, 161, 653, 180), 'en': (635, 161, 653, 180), 'jp': (635, 161, 653, 180), 'tw': (635, 161, 653, 180)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_BOSS_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_BOSS_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_BOSS_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_BOSS_15.png'}) AUTO_SEARCH_SET_MOB = Button(area={'cn': (496, 207, 515, 226), 'en': (477, 208, 496, 226), 'jp': (496, 207, 515, 226), 'tw': (496, 207, 515, 226)}, color={'cn': (69, 96, 51), 'en': (77, 106, 57), 'jp': (73, 100, 52), 'tw': (73, 101, 55)}, button={'cn': (496, 207, 515, 226), 'en': (477, 208, 496, 226), 'jp': (496, 207, 515, 226), 'tw': (496, 207, 515, 226)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_MOB.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_MOB.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_MOB.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_MOB.png'}) +AUTO_SEARCH_SET_MOB_15 = Button(area={'cn': (496, 161, 515, 180), 'en': (496, 161, 515, 180), 'jp': (496, 161, 515, 180), 'tw': (496, 161, 515, 180)}, color={'cn': (39, 39, 40), 'en': (39, 39, 40), 'jp': (39, 39, 40), 'tw': (39, 39, 40)}, button={'cn': (496, 161, 515, 180), 'en': (496, 161, 515, 180), 'jp': (496, 161, 515, 180), 'tw': (496, 161, 515, 180)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_MOB_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_MOB_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_MOB_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_MOB_15.png'}) AUTO_SEARCH_SET_STANDBY = Button(area={'cn': (932, 207, 950, 226), 'en': (813, 322, 832, 340), 'jp': (932, 207, 950, 226), 'tw': (932, 207, 950, 226)}, color={'cn': (30, 30, 37), 'en': (41, 41, 42), 'jp': (37, 36, 37), 'tw': (37, 38, 39)}, button={'cn': (932, 207, 950, 226), 'en': (813, 322, 832, 340), 'jp': (932, 207, 950, 226), 'tw': (932, 207, 950, 226)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_STANDBY.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_STANDBY.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_STANDBY.png'}) +AUTO_SEARCH_SET_STANDBY_15 = Button(area={'cn': (932, 161, 950, 180), 'en': (932, 161, 950, 180), 'jp': (932, 161, 950, 180), 'tw': (932, 161, 950, 180)}, color={'cn': (37, 37, 39), 'en': (37, 37, 39), 'jp': (37, 37, 39), 'tw': (37, 37, 39)}, button={'cn': (932, 161, 950, 180), 'en': (932, 161, 950, 180), 'jp': (932, 161, 950, 180), 'tw': (932, 161, 950, 180)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY_15.png'}) AUTO_SEARCH_SET_SUB_AUTO = Button(area={'cn': (578, 457, 597, 476), 'en': (577, 460, 595, 478), 'jp': (578, 457, 597, 476), 'tw': (578, 457, 597, 476)}, color={'cn': (69, 96, 52), 'en': (41, 39, 41), 'jp': (39, 37, 39), 'tw': (73, 100, 53)}, button={'cn': (578, 457, 597, 476), 'en': (577, 460, 595, 478), 'jp': (578, 457, 597, 476), 'tw': (578, 457, 597, 476)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_SUB_AUTO.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_SUB_AUTO.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_SUB_AUTO.png'}) +AUTO_SEARCH_SET_SUB_AUTO_15 = Button(area={'cn': (578, 389, 597, 408), 'en': (578, 389, 597, 408), 'jp': (578, 389, 597, 408), 'tw': (578, 389, 597, 408)}, color={'cn': (42, 42, 43), 'en': (42, 42, 43), 'jp': (42, 42, 43), 'tw': (42, 42, 43)}, button={'cn': (578, 389, 597, 408), 'en': (578, 389, 597, 408), 'jp': (578, 389, 597, 408), 'tw': (578, 389, 597, 408)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO_15.png'}) AUTO_SEARCH_SET_SUB_STANDBY = Button(area={'cn': (894, 457, 913, 476), 'en': (855, 460, 874, 478), 'jp': (894, 457, 913, 476), 'tw': (894, 457, 913, 476)}, color={'cn': (32, 31, 34), 'en': (75, 104, 54), 'jp': (73, 100, 52), 'tw': (35, 36, 38)}, button={'cn': (894, 457, 913, 476), 'en': (855, 460, 874, 478), 'jp': (894, 457, 913, 476), 'tw': (894, 457, 913, 476)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_SUB_STANDBY.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_SUB_STANDBY.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_SUB_STANDBY.png'}) +AUTO_SEARCH_SET_SUB_STANDBY_15 = Button(area={'cn': (894, 389, 913, 408), 'en': (894, 389, 913, 408), 'jp': (894, 389, 913, 408), 'tw': (894, 389, 913, 408)}, color={'cn': (74, 101, 55), 'en': (74, 101, 55), 'jp': (74, 101, 55), 'tw': (74, 101, 55)}, button={'cn': (894, 389, 913, 408), 'en': (894, 389, 913, 408), 'jp': (894, 389, 913, 408), 'tw': (894, 389, 913, 408)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY_15.png'}) BATTLE_PASS_NOTICE = Button(area={'cn': (554, 483, 726, 540), 'en': (716, 488, 869, 533), 'jp': (554, 483, 726, 540), 'tw': (554, 483, 726, 540)}, color={'cn': (107, 152, 207), 'en': (89, 138, 201), 'jp': (107, 152, 207), 'tw': (107, 152, 207)}, button={'cn': (863, 173, 929, 217), 'en': (863, 173, 929, 217), 'jp': (863, 173, 929, 217), 'tw': (863, 173, 929, 217)}, file={'cn': './assets/cn/handler/BATTLE_PASS_NOTICE.png', 'en': './assets/en/handler/BATTLE_PASS_NOTICE.png', 'jp': './assets/cn/handler/BATTLE_PASS_NOTICE.png', 'tw': './assets/cn/handler/BATTLE_PASS_NOTICE.png'}) BOOK_BOX_AUTO = Button(area={'cn': (737, 614, 756, 631), 'en': (739, 615, 754, 630), 'jp': (808, 614, 825, 631), 'tw': (807, 613, 826, 632)}, color={'cn': (67, 74, 82), 'en': (57, 64, 74), 'jp': (59, 62, 68), 'tw': (62, 66, 71)}, button={'cn': (737, 614, 756, 631), 'en': (739, 615, 754, 630), 'jp': (808, 614, 825, 631), 'tw': (807, 613, 826, 632)}, file={'cn': './assets/cn/handler/BOOK_BOX_AUTO.png', 'en': './assets/en/handler/BOOK_BOX_AUTO.png', 'jp': './assets/jp/handler/BOOK_BOX_AUTO.png', 'tw': './assets/tw/handler/BOOK_BOX_AUTO.png'}) BOOK_BOX_PREP = Button(area={'cn': (922, 600, 940, 617), 'en': (906, 604, 922, 619), 'jp': (921, 602, 939, 621), 'tw': (906, 604, 922, 619)}, color={'cn': (88, 122, 68), 'en': (29, 32, 29), 'jp': (35, 35, 36), 'tw': (29, 32, 29)}, button={'cn': (922, 600, 940, 617), 'en': (906, 604, 922, 619), 'jp': (921, 602, 939, 621), 'tw': (906, 604, 922, 619)}, file={'cn': './assets/cn/handler/BOOK_BOX_PREP.png', 'en': './assets/en/handler/BOOK_BOX_PREP.png', 'jp': './assets/jp/handler/BOOK_BOX_PREP.png', 'tw': './assets/tw/handler/BOOK_BOX_PREP.png'}) diff --git a/module/handler/auto_search.py b/module/handler/auto_search.py index 9f1bed545..5dd35f1bc 100644 --- a/module/handler/auto_search.py +++ b/module/handler/auto_search.py @@ -15,6 +15,14 @@ AUTO_SEARCH_SETTINGS = [ AUTO_SEARCH_SET_SUB_AUTO, AUTO_SEARCH_SET_SUB_STANDBY ] +AUTO_SEARCH_SETTINGS_15 = [ + AUTO_SEARCH_SET_MOB_15, + AUTO_SEARCH_SET_BOSS_15, + AUTO_SEARCH_SET_ALL_15, + AUTO_SEARCH_SET_STANDBY_15, + AUTO_SEARCH_SET_SUB_AUTO_15, + AUTO_SEARCH_SET_SUB_STANDBY_15 +] dic_setting_name_to_index = { 'fleet1_mob_fleet2_boss': 0, 'fleet1_boss_fleet2_mob': 1, @@ -131,8 +139,9 @@ class AutoSearchHandler(EnemySearchingHandler): bool: If selected to the correct option. """ active = [] - - for index, button in enumerate(AUTO_SEARCH_SETTINGS): + self.AUTO_SEARCH_SETTINGS = AUTO_SEARCH_SETTINGS_15 if 'campaign_15' in self.config.campaign_name \ + else AUTO_SEARCH_SETTINGS + for index, button in enumerate(self.AUTO_SEARCH_SETTINGS): if self.image_color_count(button, color=(156, 255, 82), threshold=221, count=20): active.append(index) @@ -150,7 +159,7 @@ class AutoSearchHandler(EnemySearchingHandler): logger.info('Selected to the correct auto search setting') return True else: - self.device.click(AUTO_SEARCH_SETTINGS[target_index]) + self.device.click(self.AUTO_SEARCH_SETTINGS[target_index]) return False def auto_search_setting_ensure(self, setting, skip_first_screenshot=True): diff --git a/module/handler/fast_forward.py b/module/handler/fast_forward.py index bbd7110e1..9678ba690 100644 --- a/module/handler/fast_forward.py +++ b/module/handler/fast_forward.py @@ -99,6 +99,7 @@ class FastForwardHandler(AutoSearchHandler): > 12-1 > 12-2 > 12-3 > 12-4 > 13-1 > 13-2 > 13-3 > 13-4 > 14-1 > 14-2 > 14-3 > 14-4 + > 15-1 > 15-2 """, 'A1 > A2 > A3', 'B1 > B2 > B3', diff --git a/module/map/map_operation.py b/module/map/map_operation.py index ea32bc496..bd4ced82e 100644 --- a/module/map/map_operation.py +++ b/module/map/map_operation.py @@ -223,6 +223,10 @@ class MapOperation(MysteryHandler, FleetPreparation, Retirement, FastForwardHand # End if self.map_is_auto_search: if self.is_auto_search_running(): + logger.info('is_auto_search_running appeared') + break + if hasattr(self, 'is_combat_loading') and self.is_combat_loading(): + logger.warning('Entered map with is_combat_loading appeared') break else: if self.handle_in_map_with_enemy_searching(): diff --git a/module/raid/assets.py b/module/raid/assets.py index 7310a3091..3c813b3ed 100644 --- a/module/raid/assets.py +++ b/module/raid/assets.py @@ -32,6 +32,15 @@ GORIZIA_RAID_EASY = Button(area={'cn': (1071, 515, 1118, 538), 'en': (1071, 520, GORIZIA_RAID_EX = Button(area={'cn': (978, 210, 1050, 242), 'en': (978, 210, 1050, 242), 'jp': (978, 210, 1050, 242), 'tw': (978, 210, 1050, 242)}, color={'cn': (166, 186, 137), 'en': (166, 186, 137), 'jp': (166, 186, 137), 'tw': (166, 186, 137)}, button={'cn': (978, 210, 1050, 242), 'en': (978, 210, 1050, 242), 'jp': (978, 210, 1050, 242), 'tw': (978, 210, 1050, 242)}, file={'cn': './assets/cn/raid/GORIZIA_RAID_EX.png', 'en': './assets/en/raid/GORIZIA_RAID_EX.png', 'jp': './assets/jp/raid/GORIZIA_RAID_EX.png', 'tw': './assets/tw/raid/GORIZIA_RAID_EX.png'}) GORIZIA_RAID_HARD = Button(area={'cn': (1072, 348, 1118, 370), 'en': (1065, 352, 1116, 368), 'jp': (1056, 345, 1126, 371), 'tw': (1072, 348, 1118, 370)}, color={'cn': (169, 172, 162), 'en': (183, 185, 177), 'jp': (215, 217, 212), 'tw': (169, 172, 162)}, button={'cn': (1072, 348, 1118, 370), 'en': (1065, 352, 1116, 368), 'jp': (1056, 345, 1126, 371), 'tw': (1072, 348, 1118, 370)}, file={'cn': './assets/cn/raid/GORIZIA_RAID_HARD.png', 'en': './assets/en/raid/GORIZIA_RAID_HARD.png', 'jp': './assets/jp/raid/GORIZIA_RAID_HARD.png', 'tw': './assets/cn/raid/GORIZIA_RAID_HARD.png'}) GORIZIA_RAID_NORMAL = Button(area={'cn': (1108, 430, 1153, 453), 'en': (1087, 435, 1163, 451), 'jp': (1105, 429, 1157, 454), 'tw': (1108, 430, 1153, 453)}, color={'cn': (177, 179, 171), 'en': (189, 191, 183), 'jp': (196, 198, 192), 'tw': (177, 179, 171)}, button={'cn': (1108, 430, 1153, 453), 'en': (1087, 435, 1163, 451), 'jp': (1105, 429, 1157, 454), 'tw': (1108, 430, 1153, 453)}, file={'cn': './assets/cn/raid/GORIZIA_RAID_NORMAL.png', 'en': './assets/en/raid/GORIZIA_RAID_NORMAL.png', 'jp': './assets/jp/raid/GORIZIA_RAID_NORMAL.png', 'tw': './assets/cn/raid/GORIZIA_RAID_NORMAL.png'}) +HUANCHANG_OCR_PT = Button(area={'cn': (1166, 604, 1279, 635), 'en': (1166, 604, 1279, 635), 'jp': (1166, 604, 1279, 635), 'tw': (1166, 604, 1279, 635)}, color={'cn': (143, 143, 144), 'en': (143, 143, 144), 'jp': (143, 143, 144), 'tw': (143, 143, 144)}, button={'cn': (1166, 604, 1279, 635), 'en': (1166, 604, 1279, 635), 'jp': (1166, 604, 1279, 635), 'tw': (1166, 604, 1279, 635)}, file={'cn': './assets/cn/raid/HUANCHANG_OCR_PT.png', 'en': './assets/en/raid/HUANCHANG_OCR_PT.png', 'jp': './assets/jp/raid/HUANCHANG_OCR_PT.png', 'tw': './assets/cn/raid/HUANCHANG_OCR_PT.png'}) +HUANCHANG_OCR_REMAIN_EASY = Button(area={'cn': (961, 522, 983, 540), 'en': (961, 522, 983, 540), 'jp': (961, 548, 983, 567), 'tw': (961, 522, 983, 540)}, color={'cn': (143, 141, 140), 'en': (143, 141, 140), 'jp': (136, 134, 134), 'tw': (143, 141, 140)}, button={'cn': (961, 522, 983, 540), 'en': (961, 522, 983, 540), 'jp': (961, 548, 983, 567), 'tw': (961, 522, 983, 540)}, file={'cn': './assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png', 'en': './assets/en/raid/HUANCHANG_OCR_REMAIN_EASY.png', 'jp': './assets/jp/raid/HUANCHANG_OCR_REMAIN_EASY.png', 'tw': './assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png'}) +HUANCHANG_OCR_REMAIN_EX = Button(area={'cn': (1082, 16, 1151, 42), 'en': (1082, 16, 1151, 42), 'jp': (1082, 16, 1151, 42), 'tw': (1082, 16, 1151, 42)}, color={'cn': (54, 54, 54), 'en': (54, 54, 54), 'jp': (54, 54, 54), 'tw': (54, 54, 54)}, button={'cn': (1082, 16, 1151, 42), 'en': (1082, 16, 1151, 42), 'jp': (1082, 16, 1151, 42), 'tw': (1082, 16, 1151, 42)}, file={'cn': './assets/cn/raid/HUANCHANG_OCR_REMAIN_EX.png', 'en': './assets/en/raid/HUANCHANG_OCR_REMAIN_EX.png', 'jp': './assets/jp/raid/HUANCHANG_OCR_REMAIN_EX.png', 'tw': './assets/cn/raid/HUANCHANG_OCR_REMAIN_EX.png'}) +HUANCHANG_OCR_REMAIN_HARD = Button(area={'cn': (1145, 522, 1167, 540), 'en': (1145, 522, 1167, 540), 'jp': (1146, 548, 1168, 567), 'tw': (1145, 522, 1167, 540)}, color={'cn': (163, 162, 162), 'en': (163, 162, 162), 'jp': (159, 157, 158), 'tw': (163, 162, 162)}, button={'cn': (1145, 522, 1167, 540), 'en': (1145, 522, 1167, 540), 'jp': (1146, 548, 1168, 567), 'tw': (1145, 522, 1167, 540)}, file={'cn': './assets/cn/raid/HUANCHANG_OCR_REMAIN_HARD.png', 'en': './assets/en/raid/HUANCHANG_OCR_REMAIN_HARD.png', 'jp': './assets/jp/raid/HUANCHANG_OCR_REMAIN_HARD.png', 'tw': './assets/cn/raid/HUANCHANG_OCR_REMAIN_HARD.png'}) +HUANCHANG_OCR_REMAIN_NORMAL = Button(area={'cn': (1054, 522, 1076, 540), 'en': (1054, 522, 1076, 540), 'jp': (1054, 548, 1076, 567), 'tw': (1054, 522, 1076, 540)}, color={'cn': (146, 148, 147), 'en': (146, 148, 147), 'jp': (136, 136, 135), 'tw': (146, 148, 147)}, button={'cn': (1054, 522, 1076, 540), 'en': (1054, 522, 1076, 540), 'jp': (1054, 548, 1076, 567), 'tw': (1054, 522, 1076, 540)}, file={'cn': './assets/cn/raid/HUANCHANG_OCR_REMAIN_NORMAL.png', 'en': './assets/en/raid/HUANCHANG_OCR_REMAIN_NORMAL.png', 'jp': './assets/jp/raid/HUANCHANG_OCR_REMAIN_NORMAL.png', 'tw': './assets/cn/raid/HUANCHANG_OCR_REMAIN_NORMAL.png'}) +HUANCHANG_RAID_EASY = Button(area={'cn': (951, 458, 995, 511), 'en': (950, 456, 993, 516), 'jp': (952, 484, 995, 538), 'tw': (951, 458, 995, 511)}, color={'cn': (104, 104, 104), 'en': (93, 93, 92), 'jp': (98, 97, 97), 'tw': (104, 104, 104)}, button={'cn': (951, 458, 995, 511), 'en': (950, 456, 993, 516), 'jp': (952, 484, 995, 538), 'tw': (951, 458, 995, 511)}, file={'cn': './assets/cn/raid/HUANCHANG_RAID_EASY.png', 'en': './assets/en/raid/HUANCHANG_RAID_EASY.png', 'jp': './assets/jp/raid/HUANCHANG_RAID_EASY.png', 'tw': './assets/cn/raid/HUANCHANG_RAID_EASY.png'}) +HUANCHANG_RAID_EX = Button(area={'cn': (1111, 328, 1170, 357), 'en': (1114, 328, 1173, 357), 'jp': (1111, 352, 1170, 381), 'tw': (1111, 328, 1170, 357)}, color={'cn': (126, 160, 161), 'en': (126, 160, 161), 'jp': (126, 160, 161), 'tw': (126, 160, 161)}, button={'cn': (1111, 328, 1170, 357), 'en': (1114, 328, 1173, 357), 'jp': (1111, 352, 1170, 381), 'tw': (1111, 328, 1170, 357)}, file={'cn': './assets/cn/raid/HUANCHANG_RAID_EX.png', 'en': './assets/en/raid/HUANCHANG_RAID_EX.png', 'jp': './assets/jp/raid/HUANCHANG_RAID_EX.png', 'tw': './assets/cn/raid/HUANCHANG_RAID_EX.png'}) +HUANCHANG_RAID_HARD = Button(area={'cn': (1135, 458, 1179, 511), 'en': (1135, 456, 1179, 516), 'jp': (1135, 484, 1177, 538), 'tw': (1135, 458, 1179, 511)}, color={'cn': (119, 118, 119), 'en': (106, 105, 106), 'jp': (107, 107, 108), 'tw': (119, 118, 119)}, button={'cn': (1135, 458, 1179, 511), 'en': (1135, 456, 1179, 516), 'jp': (1135, 484, 1177, 538), 'tw': (1135, 458, 1179, 511)}, file={'cn': './assets/cn/raid/HUANCHANG_RAID_HARD.png', 'en': './assets/en/raid/HUANCHANG_RAID_HARD.png', 'jp': './assets/jp/raid/HUANCHANG_RAID_HARD.png', 'tw': './assets/cn/raid/HUANCHANG_RAID_HARD.png'}) +HUANCHANG_RAID_NORMAL = Button(area={'cn': (1044, 458, 1088, 511), 'en': (1044, 456, 1088, 516), 'jp': (1044, 484, 1087, 538), 'tw': (1044, 458, 1088, 511)}, color={'cn': (111, 112, 112), 'en': (109, 110, 110), 'jp': (99, 101, 100), 'tw': (111, 112, 112)}, button={'cn': (1044, 458, 1088, 511), 'en': (1044, 456, 1088, 516), 'jp': (1044, 484, 1087, 538), 'tw': (1044, 458, 1088, 511)}, file={'cn': './assets/cn/raid/HUANCHANG_RAID_NORMAL.png', 'en': './assets/en/raid/HUANCHANG_RAID_NORMAL.png', 'jp': './assets/jp/raid/HUANCHANG_RAID_NORMAL.png', 'tw': './assets/cn/raid/HUANCHANG_RAID_NORMAL.png'}) IRIS_OCR_PT = Button(area={'cn': (1140, 607, 1280, 641), 'en': (1140, 607, 1280, 641), 'jp': (1140, 607, 1280, 641), 'tw': (1140, 607, 1280, 641)}, color={'cn': (40, 43, 36), 'en': (40, 43, 36), 'jp': (40, 43, 36), 'tw': (40, 43, 36)}, button={'cn': (1140, 607, 1280, 641), 'en': (1140, 607, 1280, 641), 'jp': (1140, 607, 1280, 641), 'tw': (1140, 607, 1280, 641)}, file={'cn': './assets/cn/raid/IRIS_OCR_PT.png', 'en': './assets/en/raid/IRIS_OCR_PT.png', 'jp': './assets/jp/raid/IRIS_OCR_PT.png', 'tw': './assets/tw/raid/IRIS_OCR_PT.png'}) IRIS_OCR_REMAIN_EASY = Button(area={'cn': (1047, 514, 1103, 534), 'en': (1046, 514, 1106, 534), 'jp': (1048, 515, 1113, 535), 'tw': (1046, 515, 1106, 535)}, color={'cn': (50, 49, 44), 'en': (68, 66, 59), 'jp': (56, 56, 50), 'tw': (53, 49, 48)}, button={'cn': (1047, 514, 1103, 534), 'en': (1046, 514, 1106, 534), 'jp': (1048, 515, 1113, 535), 'tw': (1046, 515, 1106, 535)}, file={'cn': './assets/cn/raid/IRIS_OCR_REMAIN_EASY.png', 'en': './assets/en/raid/IRIS_OCR_REMAIN_EASY.png', 'jp': './assets/jp/raid/IRIS_OCR_REMAIN_EASY.png', 'tw': './assets/tw/raid/IRIS_OCR_REMAIN_EASY.png'}) IRIS_OCR_REMAIN_HARD = Button(area={'cn': (1166, 312, 1221, 332), 'en': (1165, 312, 1225, 332), 'jp': (1167, 313, 1232, 333), 'tw': (1165, 313, 1222, 332)}, color={'cn': (48, 44, 38), 'en': (65, 61, 53), 'jp': (51, 48, 41), 'tw': (50, 46, 45)}, button={'cn': (1166, 312, 1221, 332), 'en': (1165, 312, 1225, 332), 'jp': (1167, 313, 1232, 333), 'tw': (1165, 313, 1222, 332)}, file={'cn': './assets/cn/raid/IRIS_OCR_REMAIN_HARD.png', 'en': './assets/en/raid/IRIS_OCR_REMAIN_HARD.png', 'jp': './assets/jp/raid/IRIS_OCR_REMAIN_HARD.png', 'tw': './assets/tw/raid/IRIS_OCR_REMAIN_HARD.png'}) diff --git a/module/raid/raid.py b/module/raid/raid.py index 01e4180cb..85d4eb070 100644 --- a/module/raid/raid.py +++ b/module/raid/raid.py @@ -25,6 +25,16 @@ class RaidCounter(DigitCounter): return image +class HuanChangCounter(Digit): + """ + The limit on number of raid event "Spring Festive Fiasco" is vertical, + Ocr numbers on the top half. + """ + def ocr(self, image, direct_ocr=False): + result = super().ocr(image, direct_ocr) + return (result, 0, 15) + + def raid_name_shorten(name): """ Args: @@ -47,6 +57,8 @@ def raid_name_shorten(name): return "KUYBYSHEY" elif name == "raid_20230629": return "GORIZIA" + elif name == "raid_20240130": + return "HUANCHANG" else: raise ScriptError(f'Unknown raid name: {name}') @@ -109,6 +121,12 @@ def raid_ocr(raid, mode): return Digit(button, letter=(198, 223, 140), threshold=128) else: return DigitCounter(button, letter=(82, 89, 66), threshold=128) + elif raid == "HUANCHANG": + if mode == 'ex': + return Digit(button, letter=(255, 255, 255), threshold=180) + else: + # Vertical count + return HuanChangCounter(button, letter=(255, 255, 255), threshold=80) except KeyError: raise ScriptError(f'Raid entrance asset not exists: {key}') @@ -133,6 +151,8 @@ def pt_ocr(raid): return Digit(button, letter=(16, 24, 33), threshold=64) elif raid == 'GORIZIA': return Digit(button, letter=(255, 255, 255), threshold=64) + elif raid == "HUANCHANG": + return Digit(button, letter=(23, 20, 6), threshold=128) except KeyError: # raise ScriptError(f'Raid pt ocr asset not exists: {key}') return None diff --git a/module/shop/clerk.py b/module/shop/clerk.py index a8d6a0a50..ed30d1f58 100644 --- a/module/shop/clerk.py +++ b/module/shop/clerk.py @@ -1,3 +1,5 @@ +import re + import cv2 from module.base.timer import Timer @@ -19,6 +21,22 @@ class StockCounter(DigitCounter): return 255 - image + def after_process(self, result): + result = super().after_process(result) + + if re.match(f'^\d\d$', result): + # 55 -> 5/5 + new = f'{result[0]}/{result[1]}' + logger.info(f'StockCounter result {result} is revised to {new}') + result = new + if re.match(f'^\d{4,}$', result): + # 1515 -> 15/15 + new = f'{result[0:2]}/{result[2:4]}' + logger.info(f'StockCounter result {result} is revised to {new}') + result = new + + return result + SHOP_SELECT_PR = [SHOP_SELECT_PR1, SHOP_SELECT_PR2, SHOP_SELECT_PR3] OCR_SHOP_SELECT_STOCK = StockCounter(SHOP_SELECT_STOCK) diff --git a/module/shop/shop_general.py b/module/shop/shop_general.py index 04375290f..f0a7429c6 100644 --- a/module/shop/shop_general.py +++ b/module/shop/shop_general.py @@ -117,7 +117,7 @@ class GeneralShop(ShopClerk, ShopUI, ShopStatus): Returns: bool: whether item is custom """ - if self.config.GeneralShop_ConsumeCoins and self._currency >= 550000: + if self.config.GeneralShop_ConsumeCoins and self._currency >= self.config.GeneralShop_ConsumeCoins: if item.cost == 'Coins': return True diff --git a/module/ui/assets.py b/module/ui/assets.py index 1c1d8562b..cf1ed2bac 100644 --- a/module/ui/assets.py +++ b/module/ui/assets.py @@ -4,7 +4,7 @@ from module.base.template import Template # This file was automatically generated by dev_tools/button_extract.py. # Don't modify it manually. -ACADEMY_CHECK = Button(area={'cn': (121, 14, 175, 39), 'en': (120, 22, 234, 36), 'jp': (121, 14, 174, 40), 'tw': (119, 12, 178, 44)}, color={'cn': (147, 163, 200), 'en': (130, 147, 189), 'jp': (159, 174, 208), 'tw': (125, 139, 176)}, button={'cn': (121, 14, 175, 39), 'en': (120, 22, 234, 36), 'jp': (121, 14, 174, 40), 'tw': (119, 12, 178, 44)}, file={'cn': './assets/cn/ui/ACADEMY_CHECK.png', 'en': './assets/en/ui/ACADEMY_CHECK.png', 'jp': './assets/jp/ui/ACADEMY_CHECK.png', 'tw': './assets/tw/ui/ACADEMY_CHECK.png'}) +ACADEMY_CHECK = Button(area={'cn': (121, 14, 175, 39), 'en': (122, 19, 258, 35), 'jp': (121, 14, 174, 40), 'tw': (119, 12, 178, 44)}, color={'cn': (147, 163, 200), 'en': (132, 149, 191), 'jp': (159, 174, 208), 'tw': (125, 139, 176)}, button={'cn': (121, 14, 175, 39), 'en': (122, 19, 258, 35), 'jp': (121, 14, 174, 40), 'tw': (119, 12, 178, 44)}, file={'cn': './assets/cn/ui/ACADEMY_CHECK.png', 'en': './assets/en/ui/ACADEMY_CHECK.png', 'jp': './assets/jp/ui/ACADEMY_CHECK.png', 'tw': './assets/tw/ui/ACADEMY_CHECK.png'}) ACADEMY_GOTO_GAME_ROOM = Button(area={'cn': (1074, 340, 1103, 374), 'en': (1074, 340, 1103, 374), 'jp': (1074, 340, 1103, 374), 'tw': (1074, 340, 1103, 374)}, color={'cn': (208, 185, 150), 'en': (208, 185, 150), 'jp': (208, 185, 150), 'tw': (208, 185, 150)}, button={'cn': (1074, 340, 1103, 374), 'en': (1074, 340, 1103, 374), 'jp': (1074, 340, 1103, 374), 'tw': (1074, 340, 1103, 374)}, file={'cn': './assets/cn/ui/ACADEMY_GOTO_GAME_ROOM.png', 'en': './assets/en/ui/ACADEMY_GOTO_GAME_ROOM.png', 'jp': './assets/jp/ui/ACADEMY_GOTO_GAME_ROOM.png', 'tw': './assets/tw/ui/ACADEMY_GOTO_GAME_ROOM.png'}) ACADEMY_GOTO_MUNITIONS = Button(area={'cn': (1046, 188, 1137, 210), 'en': (1039, 185, 1145, 209), 'jp': (1057, 188, 1126, 210), 'tw': (1044, 184, 1139, 213)}, color={'cn': (133, 135, 165), 'en': (115, 120, 153), 'jp': (129, 133, 162), 'tw': (113, 119, 149)}, button={'cn': (1046, 188, 1137, 210), 'en': (1039, 185, 1145, 209), 'jp': (1057, 188, 1126, 210), 'tw': (1044, 184, 1139, 213)}, file={'cn': './assets/cn/ui/ACADEMY_GOTO_MUNITIONS.png', 'en': './assets/en/ui/ACADEMY_GOTO_MUNITIONS.png', 'jp': './assets/jp/ui/ACADEMY_GOTO_MUNITIONS.png', 'tw': './assets/tw/ui/ACADEMY_GOTO_MUNITIONS.png'}) BACK_ARROW = Button(area={'cn': (33, 44, 47, 64), 'en': (33, 44, 47, 64), 'jp': (33, 44, 47, 64), 'tw': (33, 44, 47, 64)}, color={'cn': (112, 118, 152), 'en': (112, 118, 152), 'jp': (112, 118, 152), 'tw': (112, 118, 152)}, button={'cn': (33, 31, 81, 78), 'en': (33, 31, 81, 78), 'jp': (33, 31, 81, 78), 'tw': (33, 31, 81, 78)}, file={'cn': './assets/cn/ui/BACK_ARROW.png', 'en': './assets/en/ui/BACK_ARROW.png', 'jp': './assets/jp/ui/BACK_ARROW.png', 'tw': './assets/tw/ui/BACK_ARROW.png'}) @@ -64,7 +64,7 @@ MISSION_CHECK = Button(area={'cn': (120, 15, 173, 40), 'en': (123, 18, 221, 37), MUNITIONS_CHECK = Button(area={'cn': (32, 621, 86, 647), 'en': (25, 622, 85, 644), 'jp': (23, 625, 80, 645), 'tw': (31, 619, 88, 649)}, color={'cn': (151, 147, 147), 'en': (174, 171, 171), 'jp': (99, 91, 91), 'tw': (127, 121, 121)}, button={'cn': (32, 621, 86, 647), 'en': (25, 622, 85, 644), 'jp': (23, 625, 80, 645), 'tw': (31, 619, 88, 649)}, file={'cn': './assets/cn/ui/MUNITIONS_CHECK.png', 'en': './assets/en/ui/MUNITIONS_CHECK.png', 'jp': './assets/jp/ui/MUNITIONS_CHECK.png', 'tw': './assets/tw/ui/MUNITIONS_CHECK.png'}) OS_CHECK = Button(area={'cn': (613, 17, 627, 34), 'en': (613, 17, 627, 34), 'jp': (613, 17, 627, 34), 'tw': (613, 17, 627, 34)}, color={'cn': (58, 117, 146), 'en': (58, 117, 146), 'jp': (58, 117, 146), 'tw': (58, 117, 146)}, button={'cn': (613, 17, 627, 34), 'en': (613, 17, 627, 34), 'jp': (613, 17, 627, 34), 'tw': (613, 17, 627, 34)}, file={'cn': './assets/cn/ui/OS_CHECK.png', 'en': './assets/en/ui/OS_CHECK.png', 'jp': './assets/jp/ui/OS_CHECK.png', 'tw': './assets/tw/ui/OS_CHECK.png'}) PLAYER_CHECK = Button(area={'cn': (28, 668, 139, 688), 'en': (11, 649, 157, 705), 'jp': (26, 668, 139, 689), 'tw': (28, 668, 139, 688)}, color={'cn': (237, 204, 127), 'en': (197, 156, 97), 'jp': (237, 205, 128), 'tw': (237, 204, 127)}, button={'cn': (28, 668, 139, 688), 'en': (11, 649, 157, 705), 'jp': (26, 668, 139, 689), 'tw': (28, 668, 139, 688)}, file={'cn': './assets/cn/ui/PLAYER_CHECK.png', 'en': './assets/en/ui/PLAYER_CHECK.png', 'jp': './assets/jp/ui/PLAYER_CHECK.png', 'tw': './assets/tw/ui/PLAYER_CHECK.png'}) -RAID_CHECK = Button(area={'cn': (117, 13, 226, 39), 'en': (116, 15, 197, 34), 'jp': (113, 10, 229, 41), 'tw': (116, 12, 227, 39)}, color={'cn': (153, 174, 162), 'en': (115, 135, 121), 'jp': (138, 158, 146), 'tw': (143, 122, 101)}, button={'cn': (117, 13, 226, 39), 'en': (116, 15, 197, 34), 'jp': (113, 10, 229, 41), 'tw': (116, 12, 227, 39)}, file={'cn': './assets/cn/ui/RAID_CHECK.png', 'en': './assets/en/ui/RAID_CHECK.png', 'jp': './assets/jp/ui/RAID_CHECK.png', 'tw': './assets/tw/ui/RAID_CHECK.png'}) +RAID_CHECK = Button(area={'cn': (107, 13, 216, 38), 'en': (107, 15, 188, 34), 'jp': (107, 13, 217, 40), 'tw': (116, 12, 227, 39)}, color={'cn': (129, 131, 129), 'en': (85, 87, 85), 'jp': (127, 129, 127), 'tw': (143, 122, 101)}, button={'cn': (107, 13, 216, 38), 'en': (107, 15, 188, 34), 'jp': (107, 13, 217, 40), 'tw': (116, 12, 227, 39)}, file={'cn': './assets/cn/ui/RAID_CHECK.png', 'en': './assets/en/ui/RAID_CHECK.png', 'jp': './assets/jp/ui/RAID_CHECK.png', 'tw': './assets/tw/ui/RAID_CHECK.png'}) RESEARCH_CHECK = Button(area={'cn': (118, 15, 170, 39), 'en': (119, 14, 259, 36), 'jp': (117, 14, 171, 40), 'tw': (117, 13, 172, 40)}, color={'cn': (165, 179, 215), 'en': (118, 133, 174), 'jp': (135, 154, 195), 'tw': (148, 165, 205)}, button={'cn': (118, 15, 170, 39), 'en': (119, 14, 259, 36), 'jp': (117, 14, 171, 40), 'tw': (117, 13, 172, 40)}, file={'cn': './assets/cn/ui/RESEARCH_CHECK.png', 'en': './assets/en/ui/RESEARCH_CHECK.png', 'jp': './assets/jp/ui/RESEARCH_CHECK.png', 'tw': './assets/tw/ui/RESEARCH_CHECK.png'}) RESHMENU_CHECK = Button(area={'cn': (121, 15, 174, 39), 'en': (118, 14, 279, 35), 'jp': (116, 13, 174, 42), 'tw': (121, 14, 175, 40)}, color={'cn': (156, 171, 209), 'en': (100, 113, 152), 'jp': (136, 149, 186), 'tw': (147, 162, 201)}, button={'cn': (121, 15, 174, 39), 'en': (118, 14, 279, 35), 'jp': (116, 13, 174, 42), 'tw': (121, 14, 175, 40)}, file={'cn': './assets/cn/ui/RESHMENU_CHECK.png', 'en': './assets/en/ui/RESHMENU_CHECK.png', 'jp': './assets/jp/ui/RESHMENU_CHECK.png', 'tw': './assets/tw/ui/RESHMENU_CHECK.png'}) RESHMENU_GOTO_META = Button(area={'cn': (1076, 254, 1155, 334), 'en': (1102, 251, 1193, 332), 'jp': (1076, 254, 1155, 334), 'tw': (1076, 254, 1155, 334)}, color={'cn': (144, 156, 183), 'en': (141, 152, 181), 'jp': (144, 156, 183), 'tw': (144, 156, 183)}, button={'cn': (1076, 254, 1155, 334), 'en': (1102, 251, 1193, 332), 'jp': (1076, 254, 1155, 334), 'tw': (1076, 254, 1155, 334)}, file={'cn': './assets/cn/ui/RESHMENU_GOTO_META.png', 'en': './assets/en/ui/RESHMENU_GOTO_META.png', 'jp': './assets/jp/ui/RESHMENU_GOTO_META.png', 'tw': './assets/cn/ui/RESHMENU_GOTO_META.png'}) diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index c0f66a7d2..f86430741 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -10,6 +10,7 @@ TEMPLATE_AURORA_NOCTIS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE TEMPLATE_CRESCENDO_OF_POLARIS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_CRESCENDO_OF_POLARIS.png', 'en': './assets/en/war_archives/TEMPLATE_CRESCENDO_OF_POLARIS.png', 'jp': './assets/jp/war_archives/TEMPLATE_CRESCENDO_OF_POLARIS.png', 'tw': './assets/cn/war_archives/TEMPLATE_CRESCENDO_OF_POLARIS.png'}) TEMPLATE_CRIMSON_ECHOES = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_CRIMSON_ECHOES.png', 'en': './assets/en/war_archives/TEMPLATE_CRIMSON_ECHOES.png', 'jp': './assets/jp/war_archives/TEMPLATE_CRIMSON_ECHOES.png', 'tw': './assets/cn/war_archives/TEMPLATE_CRIMSON_ECHOES.png'}) TEMPLATE_DIVERGENT_CHESSBOARD = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_DIVERGENT_CHESSBOARD.png', 'en': './assets/en/war_archives/TEMPLATE_DIVERGENT_CHESSBOARD.png', 'jp': './assets/jp/war_archives/TEMPLATE_DIVERGENT_CHESSBOARD.png', 'tw': './assets/tw/war_archives/TEMPLATE_DIVERGENT_CHESSBOARD.png'}) +TEMPLATE_DREAMWAKERS_BUTTERFLY = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png', 'en': './assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png', 'jp': './assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png', 'tw': './assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png'}) TEMPLATE_EMPYREAL_TRAGICOMEDY = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_EMPYREAL_TRAGICOMEDY.png', 'en': './assets/en/war_archives/TEMPLATE_EMPYREAL_TRAGICOMEDY.png', 'jp': './assets/cn/war_archives/TEMPLATE_EMPYREAL_TRAGICOMEDY.png', 'tw': './assets/cn/war_archives/TEMPLATE_EMPYREAL_TRAGICOMEDY.png'}) TEMPLATE_ENCIRCLING_GRAF_SPEE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ENCIRCLING_GRAF_SPEE.png', 'en': './assets/en/war_archives/TEMPLATE_ENCIRCLING_GRAF_SPEE.png', 'jp': './assets/jp/war_archives/TEMPLATE_ENCIRCLING_GRAF_SPEE.png', 'tw': './assets/tw/war_archives/TEMPLATE_ENCIRCLING_GRAF_SPEE.png'}) TEMPLATE_FALLEN_WINGS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_FALLEN_WINGS.png', 'en': './assets/en/war_archives/TEMPLATE_FALLEN_WINGS.png', 'jp': './assets/jp/war_archives/TEMPLATE_FALLEN_WINGS.png', 'tw': './assets/tw/war_archives/TEMPLATE_FALLEN_WINGS.png'}) @@ -18,6 +19,7 @@ TEMPLATE_INK_STAINED_STEEL_SAKURA = Template(file={'cn': './assets/cn/war_archiv TEMPLATE_INVERTED_ORTHANT = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png', 'en': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png', 'jp': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png', 'tw': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png'}) TEMPLATE_IRIS_OF_LIGHT_AND_DARK = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png', 'en': './assets/en/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png', 'jp': './assets/jp/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png', 'tw': './assets/cn/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png'}) TEMPLATE_MICROLAYER_MEDLEY = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'en': './assets/en/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'jp': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'tw': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png'}) +TEMPLATE_MIRROR_INVOLUTION = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'en': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'jp': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'tw': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png'}) TEMPLATE_NORTHERN_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'en': './assets/en/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png'}) TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'en': './assets/en/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'jp': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'tw': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png'}) TEMPLATE_SKYBOUND_ORATORIO = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'en': './assets/en/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'jp': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'tw': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png'}) diff --git a/module/war_archives/dictionary.py b/module/war_archives/dictionary.py index e830afeea..54c6ef876 100644 --- a/module/war_archives/dictionary.py +++ b/module/war_archives/dictionary.py @@ -24,4 +24,6 @@ dic_archives_template = { 'war_archives_20220210_cn': TEMPLATE_NORTHERN_OVERTURE, 'war_archives_20220414_cn': TEMPLATE_AURORA_NOCTIS, 'war_archives_20201229_cn': TEMPLATE_INVERTED_ORTHANT, + 'war_archives_20200917_cn': TEMPLATE_DREAMWAKERS_BUTTERFLY, + 'war_archives_20210527_cn': TEMPLATE_MIRROR_INVOLUTION, }